Thymeleaf+layui实现商品和用户的模糊检索及分页

  • Post author:
  • Post category:其他




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">&#xe615;</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">&#xe642;</i></a>
<a title="库存" onclick="xadmin.open('库存','size-list.jsp')" href="javascript:funsaveItem('{{d.gid}}');">
    <i class="layui-icon">&#xe63c;</i></a>
<a title="删除"   href="javascript:;" lay-event="del"> <i class="layui-icon">&#xe640;</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">
        &lt;!&ndash; 这里的checked的状态只是演示 &ndash;&gt;
        <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">&#xe615;</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">&#xe601;</i>
									</a> <a title="编辑"
										onclick="xadmin.open('编辑','customer-edit.jsp',600,400)"
										href="javascript:;" lay-event="edit"> <i class="layui-icon">&#xe642;</i>
									</a> <a
										onclick="xadmin.open('修改密码','member-password.html',600,400)"
										title="修改密码" href="javascript:;"> <i class="layui-icon">&#xe631;</i>
									</a> 
    </script>
<!--<script type="text/html" id="stateTpl">
        &lt;!&ndash; 这里的checked的状态只是演示 &ndash;&gt;
        <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">
        &lt;!&ndash; 这里的checked的状态只是演示 &ndash;&gt;
        <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 版权协议,转载请附上原文出处链接和本声明。