本文共 12524 字,大约阅读时间需要 41 分钟。
因为权限操作类型比较多,可以设置根据操作类型来显示记录
public class SearchLogParam { //根据类型来搜索:用户,部门,权限... private Integer type; // LogType //更新前片段 private String beforeSeg; //更新后片段 private String afterSeg; //操作者 private String operator; //fromTime和toTime来限制时间段 private String fromTime;//yyyy-MM-dd HH:mm:ss private String toTime;}
//SearchLogParam需要通过转换后变成查询数据库的参数public class SearchLogDto { private Integer type; // LogType private String beforeSeg; private String afterSeg; private String operator; private Date fromTime;//yyyy-MM-dd HH:mm:ss private Date toTime; //yyyy-MM-dd HH:mm:ss}
1、确定哪些操作需要记录:Type、 TargetId 、OldValue 、NewValue 、Operator、 OperateIp 、OperateTime 、Status
OldValue:把原来的对象信息转化为json数据存储
2、还原操作:先根据TargetId查出当前记录值NewValue 、把之前记录的OldValue替换NewValue
3、根据类型查询记录
@Servicepublic class SysLogService { @Resource private SysLogMapper sysLogMapper; @Resource private SysDeptMapper sysDeptMapper; @Resource private SysUserMapper sysUserMapper; @Resource private SysAclModuleMapper sysAclModuleMapper; @Resource private SysAclMapper sysAclMapper; @Resource private SysRoleMapper sysRoleMapper; @Resource private SysRoleAclService sysRoleAclService; @Resource private SysRoleUserService sysRoleUserService; //确定哪些东西需要记录 public void saveDeptLog(SysDept before, SysDept after) { SysLogWithBLOBs sysLog = new SysLogWithBLOBs(); sysLog.setType(LogType.TYPE_DEPT); sysLog.setTargetId(after == null ? before.getId() : after.getId()); sysLog.setOldValue(before == null ? "" : JsonMapper.obj2String(before)); sysLog.setNewValue(after == null ? "" : JsonMapper.obj2String(after)); sysLog.setOperator(RequestHolder.getCurrentUser().getUsername()); sysLog.setOperateIp(IpUtil.getRemoteIp(RequestHolder.getCurrentRequest())); sysLog.setOperateTime(new Date()); sysLog.setStatus(1); sysLogMapper.insertSelective(sysLog); } public void saveUserLog(SysUser before, SysUser after) { SysLogWithBLOBs sysLog = new SysLogWithBLOBs(); sysLog.setType(LogType.TYPE_USER); sysLog.setTargetId(after == null ? before.getId() : after.getId()); sysLog.setOldValue(before == null ? "" : JsonMapper.obj2String(before)); sysLog.setNewValue(after == null ? "" : JsonMapper.obj2String(after)); sysLog.setOperator(RequestHolder.getCurrentUser().getUsername()); sysLog.setOperateIp(IpUtil.getRemoteIp(RequestHolder.getCurrentRequest())); sysLog.setOperateTime(new Date()); sysLog.setStatus(1); sysLogMapper.insertSelective(sysLog); } public void saveAclModuleLog(SysAclModule before, SysAclModule after) { SysLogWithBLOBs sysLog = new SysLogWithBLOBs(); sysLog.setType(LogType.TYPE_ACL_MODULE); sysLog.setTargetId(after == null ? before.getId() : after.getId()); sysLog.setOldValue(before == null ? "" : JsonMapper.obj2String(before)); sysLog.setNewValue(after == null ? "" : JsonMapper.obj2String(after)); sysLog.setOperator(RequestHolder.getCurrentUser().getUsername()); sysLog.setOperateIp(IpUtil.getRemoteIp(RequestHolder.getCurrentRequest())); sysLog.setOperateTime(new Date()); sysLog.setStatus(1); sysLogMapper.insertSelective(sysLog); } public void saveAclLog(SysAcl before, SysAcl after) { SysLogWithBLOBs sysLog = new SysLogWithBLOBs(); sysLog.setType(LogType.TYPE_ACL); sysLog.setTargetId(after == null ? before.getId() : after.getId()); sysLog.setOldValue(before == null ? "" : JsonMapper.obj2String(before)); sysLog.setNewValue(after == null ? "" : JsonMapper.obj2String(after)); sysLog.setOperator(RequestHolder.getCurrentUser().getUsername()); sysLog.setOperateIp(IpUtil.getRemoteIp(RequestHolder.getCurrentRequest())); sysLog.setOperateTime(new Date()); sysLog.setStatus(1); sysLogMapper.insertSelective(sysLog); } public void saveRoleLog(SysRole before, SysRole after) { SysLogWithBLOBs sysLog = new SysLogWithBLOBs(); sysLog.setType(LogType.TYPE_ROLE); sysLog.setTargetId(after == null ? before.getId() : after.getId()); sysLog.setOldValue(before == null ? "" : JsonMapper.obj2String(before)); sysLog.setNewValue(after == null ? "" : JsonMapper.obj2String(after)); sysLog.setOperator(RequestHolder.getCurrentUser().getUsername()); sysLog.setOperateIp(IpUtil.getRemoteIp(RequestHolder.getCurrentRequest())); sysLog.setOperateTime(new Date()); sysLog.setStatus(1); sysLogMapper.insertSelective(sysLog); } //通过logId日志还原 public void recover(int id) { SysLogWithBLOBs sysLog = sysLogMapper.selectByPrimaryKey(id); Preconditions.checkNotNull(sysLog, "待还原的记录不存在"); switch (sysLog.getType()){ case LogType.TYPE_DEPT: //取出现在部门信息 SysDept beforeDept = sysDeptMapper.selectByPrimaryKey(sysLog.getTargetId()); Preconditions.checkNotNull(beforeDept, "待还原的部门已经不存在了"); if (StringUtils.isBlank(sysLog.getNewValue()) || StringUtils.isBlank(sysLog.getOldValue())) { throw new ParamException("新增和删除操作不做还原"); } //取出更新前部门信息 SysDept afterDept = JsonMapper.string2Obj(sysLog.getOldValue(), new TypeReference() { }); afterDept.setOperator(RequestHolder.getCurrentUser().getUsername()); afterDept.setOperateIp(IpUtil.getRemoteIp(RequestHolder.getCurrentRequest())); afterDept.setOperateTime(new Date()); //跟新部门信息 sysDeptMapper.updateByPrimaryKeySelective(afterDept); //保存日志 saveDeptLog(beforeDept, afterDept); break; case LogType.TYPE_USER: SysUser beforeUser = sysUserMapper.selectByPrimaryKey(sysLog.getTargetId()); Preconditions.checkNotNull(beforeUser, "待还原的用户已经不存在了"); if (StringUtils.isBlank(sysLog.getNewValue()) || StringUtils.isBlank(sysLog.getOldValue())) { throw new ParamException("新增和删除操作不做还原"); } SysUser afterUser = JsonMapper.string2Obj(sysLog.getOldValue(), new TypeReference () { }); afterUser.setOperator(RequestHolder.getCurrentUser().getUsername()); afterUser.setOperateIp(IpUtil.getRemoteIp(RequestHolder.getCurrentRequest())); afterUser.setOperateTime(new Date()); sysUserMapper.updateByPrimaryKeySelective(afterUser); saveUserLog(beforeUser, afterUser); break; case LogType.TYPE_ACL_MODULE: SysAclModule beforeAclModule = sysAclModuleMapper.selectByPrimaryKey(sysLog.getTargetId()); Preconditions.checkNotNull(beforeAclModule, "待还原的权限模块已经不存在了"); if (StringUtils.isBlank(sysLog.getNewValue()) || StringUtils.isBlank(sysLog.getOldValue())) { throw new ParamException("新增和删除操作不做还原"); } SysAclModule afterAclModule = JsonMapper.string2Obj(sysLog.getOldValue(), new TypeReference () { }); afterAclModule.setOperator(RequestHolder.getCurrentUser().getUsername()); afterAclModule.setOperateIp(IpUtil.getRemoteIp(RequestHolder.getCurrentRequest())); afterAclModule.setOperateTime(new Date()); sysAclModuleMapper.updateByPrimaryKeySelective(afterAclModule); saveAclModuleLog(beforeAclModule, afterAclModule); break; case LogType.TYPE_ACL: SysAcl beforeAcl = sysAclMapper.selectByPrimaryKey(sysLog.getTargetId()); Preconditions.checkNotNull(beforeAcl, "待还原的权限点已经不存在了"); if (StringUtils.isBlank(sysLog.getNewValue()) || StringUtils.isBlank(sysLog.getOldValue())) { throw new ParamException("新增和删除操作不做还原"); } SysAcl afterAcl = JsonMapper.string2Obj(sysLog.getOldValue(), new TypeReference () { }); afterAcl.setOperator(RequestHolder.getCurrentUser().getUsername()); afterAcl.setOperateIp(IpUtil.getRemoteIp(RequestHolder.getCurrentRequest())); afterAcl.setOperateTime(new Date()); sysAclMapper.updateByPrimaryKeySelective(afterAcl); saveAclLog(beforeAcl, afterAcl); break; case LogType.TYPE_ROLE: SysRole beforeRole = sysRoleMapper.selectByPrimaryKey(sysLog.getTargetId()); Preconditions.checkNotNull(beforeRole, "待还原的角色已经不存在了"); if (StringUtils.isBlank(sysLog.getNewValue()) || StringUtils.isBlank(sysLog.getOldValue())) { throw new ParamException("新增和删除操作不做还原"); } SysRole afterRole = JsonMapper.string2Obj(sysLog.getOldValue(), new TypeReference () { }); afterRole.setOperator(RequestHolder.getCurrentUser().getUsername()); afterRole.setOperateIp(IpUtil.getRemoteIp(RequestHolder.getCurrentRequest())); afterRole.setOperateTime(new Date()); sysRoleMapper.updateByPrimaryKeySelective(afterRole); saveRoleLog(beforeRole, afterRole); break; case LogType.TYPE_ROLE_ACL: SysRole aclRole = sysRoleMapper.selectByPrimaryKey(sysLog.getTargetId()); Preconditions.checkNotNull(aclRole, "角色已经不存在了"); sysRoleAclService.changeRoleAcls(sysLog.getTargetId(), JsonMapper.string2Obj(sysLog.getOldValue(), new TypeReference
>() { })); break; case LogType.TYPE_ROLE_USER: SysRole userRole = sysRoleMapper.selectByPrimaryKey(sysLog.getTargetId()); Preconditions.checkNotNull(userRole, "角色已经不存在了"); sysRoleUserService.changeRoleUsers(sysLog.getTargetId(), JsonMapper.string2Obj(sysLog.getOldValue(), new TypeReference
>() { })); break; default:; } } //搜索查询列表 public PageResult searchPageList(SearchLogParam param, PageQuery page) { BeanValidator.check(page); //新建dto,把值设置进来 SearchLogDto dto = new SearchLogDto(); dto.setType(param.getType()); //如果有值,加上%拼接 if (StringUtils.isNotBlank(param.getBeforeSeg())) { dto.setBeforeSeg("%" + param.getBeforeSeg() + "%"); } if (StringUtils.isNotBlank(param.getAfterSeg())) { dto.setAfterSeg("%" + param.getAfterSeg() + "%"); } if (StringUtils.isNotBlank(param.getOperator())) { dto.setOperator("%" + param.getOperator() + "%"); } try { // 日期转换 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); if (StringUtils.isNotBlank(param.getFromTime())) { dto.setFromTime(dateFormat.parse(param.getFromTime())); } if (StringUtils.isNotBlank(param.getToTime())) { dto.setToTime(dateFormat.parse(param.getToTime())); } } catch (Exception e) { throw new ParamException("传入的日期格式有问题,正确格式为:yyyy-MM-dd HH:mm:ss"); } //数据库中查询列表是否有值 int count = sysLogMapper.countBySearchDto(dto); if (count > 0){ List logList = sysLogMapper.getPageListBySearchDto(dto, page); return PageResult. builder().total(count).data(logList).build(); } return PageResult. builder().build(); }}
三、Controller
package com.mmall.controller;import com.mmall.beans.PageQuery;import com.mmall.common.JsonData;import com.mmall.param.SearchLogParam;import com.mmall.service.SysLogService;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.servlet.ModelAndView;import javax.annotation.Resource;@Controller@RequestMapping("/sys/log")public class SysLogController { @Resource private SysLogService sysLogService; @RequestMapping("/log.page") public ModelAndView page() { return new ModelAndView("log"); } @RequestMapping("/recover.json") @ResponseBody public JsonData recover(@RequestParam("id") int id) { sysLogService.recover(id); return JsonData.success(); } @RequestMapping("/page.json") @ResponseBody public JsonData searchPage(SearchLogParam param, PageQuery page) { return JsonData.success(sysLogService.searchPageList(param, page)); }}
转载地址:http://ntphn.baihongyu.com/