用户行为日志管理
日志业务分析及设计
背景分析
在实际项目中,用户操作软件的过程,通常会以日志记录。例如记录用户在什么时间点,执行了什么操作,访问了什么方法,传递了什么参数,执行时长是多少等这些信息要存储到数据库。
业务表的分析及设计
对于用户行为日志表的设计如下:
日志业务原型设计
日志业务核心API设计
日志模块业务核心API设计,如图所示:
SysLog (封装用户行为日志)
SysLogDao(执行日志数据逻辑)
SysLogService&SysLogServiceImpl (执行日志业务逻辑操作)
SysLogController(执行日志的请求、响应控制逻辑操作)
用户行为日志查询并呈现
业务分析与设计业务分析
将用户行为日志从数据库查询出来以后,以统一的JSON格式,将数据响应给客户端
业务数据架构设计
用户日志行为数据查询时,其数据封装及传递架构如下:
业务操作访问时序设计
基于业务描述,进行API访问时序设计,如图所示
页面加载时序设计
第一步:用户点击首页日志管理菜单时向服务端发送异步加载请求
第二步:服务端通过PageController中的方法处理日志页面加载请求
第三步:在日志列表页面加载完成以后,向服务端发起异步数据加载
请求数据访问时序设计
第一步:用户向服务端发送数据查询请求(默认先查询第一页数据)http://localhost/log/doFindPageObjects?pageCurrent=1
第二步:服务端调用SysLogController的doFindPageObjects方法处理查询请求并将响应结果封装到JsonResult,然后响应到客户端。
第三步:在SysLogController的doFindPageObjects方法内部调用SysLogService对象的findPageObjects方法执行分页查询逻辑,并将查询结果封装到PageObject对象,然后返回给控制层。
第四步:在SysLogServiceImpl的findPageObjects方法内部调用SysLogDao的getRowCount方法,findPageObjects方法获取用户日志总记录数以及当前页要呈现的记录。
服务端代码设计及实现
POJO类设计及实现设计
SysLog对象,通过此对象封装查询到用户日志行为信息,关键代码如下
DAO 接口设计及实现
设计SysLogDao,并通过此类型的对象实现分页数据查询逻辑。
第一步:创建SysLogDao接口,关键代码如下:
package com.cy.pj.sys.dao;
@Mapper
public interface SysLogDao{}
第二步:在SysLogDao接口中添加查询日志日志总记录数的方法,关键代码如下:
第三步:在SysLogDao接口中添加当前页日志记录的方法,关键代码如下
第四步:定义SysLogDao中方法对应的SQL映射
在mappers/sys目录中创建SysLogMapper.xml文件,并在文件中定义SQL映射,关键代码如下:
Service对象设计和实现
基于查询条件获取用户日志行为信息并进行计算和封装
第一步:定义SysLogService接口并添加日志查询方法,关键代码如下:
第二步:定义SysLogService接口实现类并重写分页查询方法
Controller 类设计及实现
创建SysLogController类型,通过此类型的对象处理客户端日志请求。
第一步:创建SysLogController类型类型,关键代码如下
第二步:在SysLogController类中添加处理日志查询请求的方法,关键代码如下:
客户端代码设计及实现
Starter页面事件处理
第一步: 定义响应请求页面的方法
在PageController类中,添加响应模块页面请求的方法,关键代码如下
第二步:首页页面日志管理事件注册
starter.html页面加载完成以后,进行click事件注册,并基于请求的url加载页面资源,然后将响应页面呈现在浏览器中。
日志列表页面事件处理
第一步:在PageController中定义响应分页页面方法,关键代码如下:
@GetMapping(“doPageUI”)public String doPageUI(){ return “common/page”;}
第二步:日志列表页面加载完成定义执行分页页面加载,关键代码如下
$(function(){ $("#pageId").load(“doPageUI”);})
第三步:日志分页页面加载完成以后异步加载服务端数据并进行呈现
修改分页页面加载的JS代码逻辑,关键代码如下:
$(function(){ $("#pageId").load(“doPageUI”,doGetObjects);})
定义异步加载日志信息的doGetObjects方法,关键代码如下:
将当前页记录呈现在页面上,关键代码如下
定义处理错误信息的doSetTableBodyErrors方法,关键代码如下:
迭代记录并将其追加到tbody中,关键代码如下
基于每条记录进行"行渲染
Page 页面事件处理
第一步:定义初始化分页数据的方法,关键代码如下:
第二步:在日志列表页面中的处理查询结果的方法内部,调用doSetPagination方法
第三步:注册并处理分页点击事件,关键代码如下:
第四步:修改列表页面的doGetObjects方法内部参数的定义
let pageCurrent=$("#pageId").data(“pageCurrent”);
if(!pageCurrent)pageCurrent=1;
let params={pageCurrent:pageCurrent};//暂时默认指定页码值为1
列表页面查询按钮事件处理
第一步:查询按钮事件注册
日志列表"页面加载完成"以后,添加查询按钮事件注册操作,关键代码如下:
$(".input-group-btn").on(“click”,".btn-search",doQueryObjects);
定义查询按钮事件处理函数
第二步:修改列表页面doGetObjects方法中的参数定义
章节总结(Summary)
重难点分析
日志表的设计(记住有哪些字段)核心API的设计(SysLog,SysLogDao,SysLogService,SysLogController)
日志数据查询结果的封装和传递(SysLog,PageObject,JsonResult)
项目中统一异常处理类的设计(GlobalExceptionHandler)
客户端向服务端传递的参数设计(username,pageCurrent)
FAQ 分析
日志查询是如何分页的?(每次只查询指定页码对应的数据)
日志查询结果是如何封装和传递的?
服务端的业务参数校验,业务结果的校验异常是如何处理的?(抛出)
控制层响应结果转换为JSON字符串的过程是怎样的?(@ResponseBody)
数据呈现过程中用到什么技术?(html,css,js,jquery,bootstrap,adminlte)
你用到了Jquery中的哪些函数?(ajax,prop,data,html,empty,…