Thymeleaf和layui搭配实现商品和用户的模糊检索及分页
-
结构分布
1 pom.xml文件加入依赖
2 application.properties加入分页
#数据库连接配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3309/allaiadb?serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
#指定mybatis中配置的映射文件的地址
mybatis.mapper-locations=classpath:/mapper/*.xml
##日志配置
logging.level.com.etc.ssm.demo.dao=DEBUG
logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n
logging.pattern.file=%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n
##thymeleaf配置
spring.thymeleaf.cache=false
spring.thymeleaf.suffix=.html
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.encoding=utf-8
spring.thymeleaf.mode=LEGACYHTML5
spring.thymeleaf.content-type=text/html
#标识是数据库方言
pagehelper.helperDialect=mysql
#启用合理化,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页
pagehelper.reasonable=true
#为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero
pagehelper.params=count=countSql
#支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页
pagehelper.supportMethodsArguments=true
#如果 pageSize=0 就会查询出全部的结果(相当于没有执行分页查询)
pagehelper.page-size-zero=true
3 商品和用户的service层
4 商品和用户的service的实现类
5 商品和用户的控制类
6 页面展示
-
商品
<!DOCTYPE html>
<html class="x-admin-sm" lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>欢迎页面-X-admin2.2</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport"
content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi" />
<link rel="stylesheet" th:href="@{/back/css/font.css}">
<link rel="stylesheet" th:href="@{/back/css/xadmin.css}">
<script th:src="@{/back/lib/layui/layui.js}" charset="utf-8"></script>
<script type="text/javascript" th:src="@{/back/js/xadmin.js}"></script>
<!--[if lt IE 9]>
<script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
<script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div class="x-nav">
<span class="layui-breadcrumb"> <a href="">首页</a> <a href="">演示</a>
<a> <cite>导航元素</cite></a>
</span> <a class="layui-btn layui-btn-small"
style="line-height: 1.6em; margin-top: 3px; float: right"
onclick="location.reload()" title="刷新"> <i
class="layui-icon layui-icon-refresh" style="line-height: 30px"></i>
</a>
</div>
<div class="layui-fluid">
<div class="layui-row layui-col-space15">
<div class="layui-col-md12">
<div class="layui-card">
<div class="layui-card-body ">
<form class="layui-form layui-col-space5">
<div class="layui-inline layui-show-xs-block">
<input type="text" name="gname" placeholder="请输入商品名称关键字"
autocomplete="off" class="layui-input">
</div>
<div class="layui-inline layui-show-xs-block">
<input type="text" name="brands" placeholder="请输入品牌名称关键字"
autocomplete="off" class="layui-input">
</div>
<div class="layui-inline layui-show-xs-block">
<input type="text" name="subname" placeholder="请输入商品类型关键字"
autocomplete="off" class="layui-input">
</div>
<div class="layui-inline layui-show-xs-block">
<button class="layui-btn" lay-submit="" lay-filter="search">
<i class="layui-icon"></i>
</button>
</div>
</form>
</div>
<div class="layui-card-body ">
<!-- url:'./user.json' 替换成我们自己的后端接口的地址,返回一个user.json中的内容"格式" -->
<table class="layui-table"
lay-data="{url:'../api/goods',page:true,toolbar: '#toolbarDemo',id:'test'}"
lay-filter="test">
<thead>
<tr>
<th lay-data="{type:'numbers'}">ID</th>
<th lay-data="{field:'gid', width:110, sort: true}">商品编号</th>
<th
lay-data="{field:'gname', width:150, sort: true, edit: 'text'}">商品名称</th>
<th lay-data="{field:'gprice', edit: 'text', width: 100}">价格</th>
<th lay-data="{field:'gcount', edit: 'text', width: 150}">总库存</th>
<th
lay-data="{field:'gsubid',width:120, sort: true, edit: 'text',templet : {d.sub.subname}}">类型</th>
<th
lay-data="{field:'gbrandid',width:120, sort: true, edit: 'text',templet : {d.brands.bname}}">品牌</th>
<th
lay-data="{field:'gstate', width: 150,templet: '#stateTpl'}">状态</th>
<th lay-data="{field:'gdetail', width:280}">描述</th>
<th lay-data="{field:'gmaterial', width:280}">材质</th>
<th
lay-data="{field:'gcolor',width:120, sort: true, edit: 'text'}">颜色</th>
<th lay-data="{field:'', width:150,templet: '#opTpl'}">操作</th>
</tr>
</thead>
</table>
</div>
</div>
</div>
</div>
</div>
</body>
<script type="text/html" id="opTpl">
<a title="编辑" onclick="xadmin.open('编辑','goods-edit.jsp')" href="javascript:funsaveItem('{{d.gid}}');" lay-event="edit">
<i class="layui-icon"></i></a>
<a title="库存" onclick="xadmin.open('库存','size-list.jsp')" href="javascript:funsaveItem('{{d.gid}}');">
<i class="layui-icon"></i></a>
<a title="删除" href="javascript:;" lay-event="del"> <i class="layui-icon"></i>
</a>
</script>
<!--
<script type="text/html" id="toolbarDemo">
<div class = "layui-btn-container" >
<button class = "layui-btn layui-btn-sm" lay-event = "getCheckData" > 获取选中行数据 </button>
<button class="layui-btn layui-btn-sm" lay-event="getCheckLength">获取选中数目</button >
<button class = "layui-btn layui-btn-sm" lay-event = "isAll" > 验证是否全选</button>
</div >
</script>
-->
<!--<script type="text/html" id="stateTpl">
<!– 这里的checked的状态只是演示 –>
<input type = "checkbox" name = "gstate" value = "{{d.gstate}}" lay-skin = "switch" lay-text = "已上架|已下架" lay-filter = "stateDemo" {{ d.gstate == 1 ? 'checked': ''}} >
</script>-->
<script>
layui.use('laydate', function() {
var laydate = layui.laydate;
//执行一个laydate实例
laydate.render({
elem : '#start' //指定元素
});
//执行一个laydate实例
laydate.render({
elem : '#end' //指定元素
});
});
</script>
<script>
layui.use([ 'table', 'form' ], function() {
var table = layui.table;
var form = layui.form;
//search
form.on('submit(search)', function(data) {
//console.log(data.elem) //被执行事件的元素DOM对象,一般为button对象
//console.log(data.form) //被执行提交的form对象,一般在存在form标签时才会返回
console.log(data.field) //当前容器的全部表单字段,名值对形式:{name: value}
//向servlet提交请求,获取数据并展示在layui table中
//1 原始(jquery) ajax -=>响应的数据我们需要自己处理,并展示在table中
//2 layui ->封装好的ajax请求 ,自动填充layui table
table.reload('test', {
url : '../api/goods',
where : data.field//设定异步数据接口的额外参数
//,height: 300
});
return false; //阻止表单跳转。如果需要表单跳转,去掉这段即可。
});
//监听单元格编辑
table.on('edit(test)', function(obj) {
var value = obj.value //得到修改后的值
, data = obj.data //得到所在行所有键值
, field = obj.field; //得到字段
layer.msg('[ID: ' + data.id + '] ' + field + ' 字段更改为:' + value);
});
//头工具栏事件
table.on('toolbar(test)', function(obj) {
var checkStatus = table.checkStatus(obj.config.id);
switch (obj.event) {
case 'getCheckData':
var data = checkStatus.data;
layer.alert(JSON.stringify(data));
break;
case 'getCheckLength':
var data = checkStatus.data;
layer.msg('选中了:' + data.length + ' 个');
break;
case 'isAll':
layer.msg(checkStatus.isAll ? '全选' : '未全选');
break;
}
;
});
});
</script>
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?b393d153aeb26b46e9431fabaf0f6190";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
<script type="text/javascript">
layui.use([ 'table', 'form' ], function() {
var table = layui.table;
var form = layui.form;
$ = layui.jquery;
//监听工具条事件,删除表格中的一行数据
table.on('tool(test)',function(obj){
var data = obj.data;//获取当前行的数据
var layEvent = obj.event;//获取lay-event对应的值
var tr = obj.tr;//获取当前行tr的DOM对象
if(layEvent == 'del'){
layer.confirm('真的不再考虑一下吗? ', function(index){
layer.closeAll('dialog');
$.ajax({
url:'../api/goods/del',
type:'get',
dataType:'json',
data:{'gid':data.gid},//向服务器端发送要删除的empno对应的员工
success : function(res) {
layer.msg('操作成功!', {
icon : 6
});
},
error:function(res){
layer.msg('操作失败!', {
icon:5
});
}
});
});
}else if (layEvent == 'edit') {
localStorage.setItem("gid",data.gid);
localStorage.setItem("gname",data.gname);
localStorage.setItem("gpeice",data.gpeice);
localStorage.setItem("gdetail",data.gdetail);
localStorage.setItem("gcolor",data.gcolor);
localStorage.setItem("gstate",data.gstate);
console.log(data);
}
});
})
</script>
</html>
-
用户
<!DOCTYPE html>
<html class="x-admin-sm" lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>欢迎页面-X-admin2.2</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport"
content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi" />
<link rel="stylesheet" th:href="@{/back/css/font.css}">
<link rel="stylesheet" th:href="@{/back/css/xadmin.css}">
<script th:src="@{/back/lib/layui/layui.js}" charset="utf-8"></script>
<script type="text/javascript" th:src="@{back/js/xadmin.js}"></script>
<!--[if lt IE 9]>
<script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
<script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div class="x-nav">
<span class="layui-breadcrumb"> <a href="">首页</a> <a href="">演示</a>
<a> <cite>导航元素</cite></a>
</span> <a class="layui-btn layui-btn-small"
style="line-height: 1.6em; margin-top: 3px; float: right"
onclick="location.reload()" title="刷新"> <i
class="layui-icon layui-icon-refresh" style="line-height: 30px"></i>
</a>
</div>
<div class="layui-fluid">
<div class="layui-row layui-col-space15">
<div class="layui-col-md12">
<div class="layui-card">
<div class="layui-card-body ">
<form class="layui-form layui-col-space5">
<div class="layui-inline layui-show-xs-block">
<input type="text" name="keywords" placeholder="请输入昵称关键字"
autocomplete="off" class="layui-input">
</div>
<div class="layui-inline layui-show-xs-block">
<button class="layui-btn" lay-submit="" lay-filter="search">
<i class="layui-icon"></i>
</button>
</div>
</form>
</div>
<div class="layui-card-body ">
<!-- url:'./user.json' 替换成我们自己的后端接口的地址,返回一个user.json中的内容"格式" -->
<table class="layui-table"
lay-data="{url:'../api/customer',page:true,toolbar: '#toolbarDemo',id:'test'}"
lay-filter="test">
<thead>
<tr>
<th lay-data="{type:'id',width:80,type:'numbers'}">序号</th>
<th lay-data="{field:'cid', width:110, sort: true}">用户编号</th>
<th
lay-data="{field:'cname', width:150, sort: true, edit: 'text'}">昵称</th>
<th lay-data="{field:'csex', edit: 'text', width: 80}">性别</th>
<th lay-data="{field:'ctell', width:150}">电话</th>
<th lay-data="{field:'cuser', width:150}">Allaia账号</th>
<th
lay-data="{field:'cstate', width: 140,templet: '#stateTpl'}">账号状态</th>
<th
lay-data="{field:'cidentitystate', width: 140,templet: '#idenstateTpl'}">是否实名</th>
<th lay-data="{field:'', width:120,templet: '#opTpl'}">操作</th>
</tr>
</thead>
</table>
</div>
</div>
</div>
</div>
</div>
</body>
<script type="text/html" id="opTpl">
<a
onclick="member_stop(this,'10001')" href="javascript:;"
title="启用"> <i class="layui-icon"></i>
</a> <a title="编辑"
onclick="xadmin.open('编辑','customer-edit.jsp',600,400)"
href="javascript:;" lay-event="edit"> <i class="layui-icon"></i>
</a> <a
onclick="xadmin.open('修改密码','member-password.html',600,400)"
title="修改密码" href="javascript:;"> <i class="layui-icon"></i>
</a>
</script>
<!--<script type="text/html" id="stateTpl">
<!– 这里的checked的状态只是演示 –>
<input type = "checkbox" name = "cstate" value = "{{d.cstate}}" lay-skin = "switch" lay-text = "启用|禁用" lay-filter = "stateDemo" {{ d.cstate == 1 ? 'checked': ''}} >
</script>
<script type="text/html" id="idenstateTpl">
<!– 这里的checked的状态只是演示 –>
<input type = "checkbox" name = "cidentitystate" value = "{{d.cidentitystate}}" lay-skin = "switch" lay-text = "实名|未实名" lay-filter = "stateDemo" {{ d.cidentitystate == 1 ? 'checked': ''}} >
</script>-->
<script type="text/javascript">
layui.use([ 'table', 'form' ], function() {
var table = layui.table;
var form = layui.form;
//存入session中进行通过编号修改账号状态
table.on('tool(test)',function(obj){
var data = obj.data;//获取当前行的数据
var layEvent = obj.event;//获取lay-event对应的值
var tr = obj.tr;//获取当前行tr的DOM对象
if(layEvent == 'edit'){
localStorage.setItem("cid",data.cid);
localStorage.setItem("cname",data.cname);
localStorage.setItem("csex",data.csex);
localStorage.setItem("cuser",data.cuser);
localStorage.setItem("cstate",data.cstate);
localStorage.setItem("ctell",data.ctell);
console.log(data);
}
});
})
</script>
<script>
layui.use('laydate', function() {
var laydate = layui.laydate;
//执行一个laydate实例
laydate.render({
elem : '#start' //指定元素
});
//执行一个laydate实例
laydate.render({
elem : '#end' //指定元素
});
});
</script>
<script>
layui.use([ 'table', 'form' ], function() {
var table = layui.table;
var form = layui.form;
//search
form.on('submit(search)', function(data) {
//console.log(data.elem) //被执行事件的元素DOM对象,一般为button对象
//console.log(data.form) //被执行提交的form对象,一般在存在form标签时才会返回
console.log(data.field) //当前容器的全部表单字段,名值对形式:{name: value}
//向servlet提交请求,获取数据并展示在layui table中
//1 原始(jquery) ajax -=>响应的数据我们需要自己处理,并展示在table中
//2 layui ->封装好的ajax请求 ,自动填充layui table
table.reload('test', {
url : '../api/customer',
where : data.field//设定异步数据接口的额外参数
//,height: 300
});
return false; //阻止表单跳转。如果需要表单跳转,去掉这段即可。
});
//监听单元格编辑
table.on('edit(test)', function(obj) {
var value = obj.value //得到修改后的值
, data = obj.data //得到所在行所有键值
, field = obj.field; //得到字段
layer.msg('[ID: ' + data.id + '] ' + field + ' 字段更改为:' + value);
});
//头工具栏事件
table.on('toolbar(test)', function(obj) {
var checkStatus = table.checkStatus(obj.config.id);
switch (obj.event) {
case 'getCheckData':
var data = checkStatus.data;
layer.alert(JSON.stringify(data));
break;
case 'getCheckLength':
var data = checkStatus.data;
layer.msg('选中了:' + data.length + ' 个');
break;
case 'isAll':
layer.msg(checkStatus.isAll ? '全选' : '未全选');
break;
}
;
});
});
</script>
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?b393d153aeb26b46e9431fabaf0f6190";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
</html>
版权声明:本文为weixin_47119452原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。