动吧用户行为日志模块的简单实现

一、页面的加载

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

 

posted @ 2020-07-13 19:31  罗晓峥  阅读(790)  评论(0编辑  收藏  举报