一、页面的加载
0.业务分析
1.点击日志管理呈现日志列表页面
1)注册点击事件
2)定义事件处理函数
3)在事件处理函数中发送异步请求,加载页面并进行数据呈现
2.呈现日志列表页面的位置为mainContentId
3.将log_list.html(位置/templates/pages/sys)显示到mainContentId中
4.log_list.html页面加载完成后,需加载page.html页面和数据
页面跳转:点击日志管理异步加载log_list.html页面,log_list.html页面异步加载page.html页面
1. 数据库表结构设计
日志管理模块业务:需要记录用户在什么时间什么地点做了什么事情
所以日志模块的字段需要有:用户的登陆名,用户所做的操作(执行了什么方法,请求了什么参数),所用的时间(什么时间执行的操作,执行操作所用的时长)
1 CREATE TABLE `sys_logs` ( 2 `id` bigint(20) NOT NULL AUTO_INCREMENT, 3 `username` varchar(50) DEFAULT NULL COMMENT '登陆用户名', 4 `operation` varchar(50) DEFAULT NULL COMMENT '用户操作', 5 `method` varchar(200) DEFAULT NULL COMMENT '请求方法', 6 `params` varchar(5000) DEFAULT NULL COMMENT '请求参数', 7 `time` bigint(20) NOT NULL COMMENT '执行时长(毫秒)', 8 `ip` varchar(64) DEFAULT NULL COMMENT 'IP地址', 9 `createdTime` datetime DEFAULT NULL COMMENT '日志记录时间', 10 PRIMARY KEY (`id`) 11 ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='系统日志';
2. 页面跳转处理 PageController.java
项目中的所有页面处理,都放在PageController中(com.cy.pj.sys.controller)
日志模块的页面跳转:1.首先显示首页样式
2.显示日志管理模块的列表页面
3.显示日志模块列表页面下面的分页页面
1 @Controller 2 @RequestMapping("/") 3 public class PageController { 4 //localhost:80/doIndexUI 5 @RequestMapping("doIndexUI") 6 public String doIndexUI() { 7 return "starter";//首页页面 8 } 9 /**基于此方法返回日志列表页面(记住此页面并不是完整页面)*/ 10 @RequestMapping("log/log_list") 11 public String doLogUI() { 12 return "sys/log_list"; 13 } 14 /**基于此方法返回分页页面元素 15 * @throws InterruptedException */ 16 @RequestMapping("doPageUI") 17 public String doPageUI(){ 18 //Thread.sleep(5000); 19 return "common/page"; 20 } 21 }
首先访问首页页面starter.html,通过localhost:80/doIndexUI网址访问首页页面
然后点击日志管理时,需要显示日志页面,日志页面包括日志列表页面和日志分页页面两部分
sys/log_list为日志列表页面,common/page为分页页面
3. starter.html(首页)加载日志列表页面
点击日志管理,显示相应的日志列表页面,需要进行局部刷新,所以要是用异步加载
1 <script type="text/javascript"> 2 //此函数是在页面加载完成以后执行 3 (function(){ 4 doLoadUI("load-log-id","log/log_list"); 5 })() 6 //基于不同对象的点击事件执行资源加载操作 7 function doLoadUI(id,url){ 8 $("#"+id).click(function(){//click事件处理函数 9 //jquery中的load函数为一个异步加载的ajax函数。 10 //此函数用于在指定位置异步加载资源(并将返回的资源填充到这个指定位置) 11 $("#mainContentId").load(url); 12 }) 13 } 14 </script>
(function(){})()函数是在页面加载完成之后执行和$(function(){})函数功能一致
日志管理的id值为load-log-id,对日志管理进行点击事件处理,然后异步加载资源
load函数为jQuery中的一个异步加载的ajax函数,此函数用于在制定位置异步加载资源,并将返回的资源填充到指定的位置(mainContentId)中
$("#load-log-id").click(function(){
$("#mainContentId").load("log/log_list");
})
其中log/log_list为页面跳转中的地址
4. log_list.html加载分页列表页面
1 $(function(){ 2 $("#pageId").load("doPageUI"); 3 });
在pageId的位置加载分页列表页面,代码写在日志列表页面中,有首页加载log_list页面,log_list页面加载分页页面。
二、数据的加载
0. 业务分析
1.显示日志数据(在数据库中的数据)
2.显示总记录数,总页数的值,显示当前页显示的数据为第几页
3.点击首页进入第一页,点击尾页进入最后一页,点击上一页查看当前页的上一页数据,点击下一页查看当前页的下一页数据
4.点击全选按钮后,下面的复选框也全被选中。当所有的复选框都被选中后,取消其中一个复选框的选中效果,全选的复选框被取消
1. 日志列表数据呈现
1.1 构建实体对象 Sys_Log
1 /** 2 * 此对象主要用于封装数据库提取的数据或者向数据库写入的数据 3 * 此对象中的属性建议和表中字段有对应的映射关系(名字,类型) 4 * 建议:所有用于封装数据的对象都建议实现序列化接口(Serializable) 5 * 1)序列化:将对象转换为字节的过程称之为对象序列化 6 * 2)反序列化:将字节转换为对象的过程称之为反序列化 7 * 3)应用场景:对对象进行缓存,将对象进行钝化(写入文件),将对象通过网络进行传输 8 */ 9 @Data 10 public class SysLog implements Serializable{ 11 //对象在序列化和反序列化时会基于此id进行数据处理。 12 //将对象序列化时会将这个id作为版本写入到字节中。 13 //将字节反序列化会从字节中提取这个版本id然后和类中的版本id进行比对,一致则进行反序列化。 14 private static final long serialVersionUID = -1592163223057343412L; 15 private Integer id; 16 //用户名 17 private String username; 18 //用户操作 19 private String operation; 20 //请求方法 21 private String method; 22 //请求参数 23 private String params; 24 //执行时长(毫秒) 25 private Long time; 26 //IP地址 27 private String ip; 28 //创建时间 29 private Date createdTime; 30 31 }
pojo类用于封装数据库提取的数据或者向数据库中写入数据
pojo类与数据库中的字段名,类型都一一对应
所有用于封装的对象都建议使用实现序列化接口(Serializable)
1.2 分页字段的封装 PageObject
1 /** 2 * 基于此对象封装业务执行结果 3 * 在Java语言,可以简单将内存中的对象分为两大类: 4 * 1)存储数据的对象(设计的关键在属性上)-典型的POJO对象(VO,BO,DO) 5 * 2)执行业务的对象(设计的关键在方法上)-典型的controller,service,dao 6 */ 7 @Data 8 @NoArgsConstructor 9 @AllArgsConstructor 10 public class PageObject<T> implements Serializable{//pojo中的bo对象,new PageObject<SysLog> 11 private static final long serialVersionUID = -3130527491950235344L; 12 /**总记录数(从数据库查询出来的)*/ 13 private Integer rowCount; 14 /**总页数(基于rowCount和页面大小计算出来的)*/ 15 private Integer pageCount; 16 /**页面大小(每页最多可以呈现的记录总数)*/ 17 private Integer pageSize; 18 /**当前页码值(客户端传递)*/ 19 private Integer pageCurrent; 20 /**当前页记录,list集合中的T由PageObject类上定义的泛型决定*/ 21 private List<T> records; 22 public PageObject(Integer rowCount, Integer pageSize, Integer pageCurrent, List<T> records) { 23 super(); 24 this.rowCount = rowCount; 25 this.pageSize = pageSize; 26 this.pageCurrent = pageCurrent; 27 this.records = records; 28 //计算总页数的方法一: 29 //this.pageCount=this.rowCount/this.pageSize; 30 //if(this.rowCount%this.pageSize!=0)pageCount++; 31 //计算总页数的方法二: 32 this.pageCount=(rowCount-1)/pageSize+1; 33 } 34 }
PageObject用于封装分页操作,因为不光是日志管理模块要用上分页操作,所有的模块都要用,所以要使分页集合要具有通用性,PageObject,records要使用
注意区分存储数据的对象(pojo),执行业务的对象(service,controller,dao)
1.3 数据层接口对象 Dao SysLogDao
1 /** 2 * 基于条件查询用户行为日志记录总数 3 * @param username 查询条件 4 * @return 查询到的记录总数 5 */ 6 int getRowCount(String username); 7 /** 8 * 基于条件查询当前页记录 9 * @param username 查询条件 10 * @param startIndex 当前页数据的起始位置(用于limit 子句) 11 * @param pageSize 当前页面大小(每页最多显示多少条记录) 12 * @return 查询到的记录 13 */ 14 List<SysLog> findPageObjects(String username, 15 Integer startIndex,Integer pageSize); 16 }
日志管理模块查询日志记录总数时需要判断输入框中是否有
查询当前页面数据的功能,查询当前页面数据需要使用几个条件:1.输入框中是否填写了用户名
2.从那一页开始展示数据
3.当前页显示多少条数据
1.4 基于Dao接口创建映射文件
1.5
1.6
1.7