博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实现自己的权限管理系统(十二):权限操作记录
阅读量:3887 次
发布时间:2019-05-23

本文共 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需要通过转换后变成查询数据库的参数

//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}

三、Service 层

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/

你可能感兴趣的文章
Android NDK开发起步Hello Jni
查看>>
[已解决]AutoCompleteTextView 不显示匹配的内容,因为将空的内容添加进去了
查看>>
object c 归档和解档,其实就是java中的序列化和反序列化
查看>>
object c的浅拷贝(地址拷贝)和深拷贝(对象拷贝)
查看>>
object c son字符串的解析
查看>>
object c 非常强大的类的属性复制kcv键值码赋值
查看>>
Java中普通代码块,构造代码块,静态代码块区别及代码示例
查看>>
iOS 第4课 UILabel
查看>>
[已解决]junit.framework.AssertionFailedError: No tests found in
查看>>
“服务器端跳转”和“客户端跳转”的区别
查看>>
Datatables基本初始化——jQuery表格插件
查看>>
Servlet监听器——实现在线登录人数统计小例子
查看>>
Oracle笔记——简单查询语句 Oracle入门
查看>>
基于Hibernate和Struts2的用户管理系统小案例
查看>>
打开.class文件的方法
查看>>
基于windows平台Git+GitHub+Hexo搭建个人博客(一)
查看>>
基于windows平台Git+GitHub+Hexo搭建个人博客(二)
查看>>
Windows平台下SVN安装配置及使用
查看>>
python简便的编辑工具:jupyter notebook
查看>>
使用pip安装的时候出现 ModuleNotFoundError: No module named ‘pip‘
查看>>