src/main/java/com/whyc/aop/OperationLogAspect.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/mapper/DocLogMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/mapper/UserLogMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/pojo/DocLog.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/service/DocLogService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/service/UserLogService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/util/CommonUtil.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/mapper/DocLogMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/mapper/UserLogMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/whyc/aop/OperationLogAspect.java
New file @@ -0,0 +1,122 @@ package com.whyc.aop; import com.whyc.constant.UserOperation; import com.whyc.service.DocLogService; import com.whyc.util.ActionUtil; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.Date; import java.util.HashMap; /** * 定义aop,对特定的接口进行内容捕捉,生成操作日志 * 切面为controller * 切点为Point表达式 * 具体连接点为JoinPoint * 处理方式为doAfterReturning */ @Component @Aspect public class OperationLogAspect { @Autowired private DocLogService service; /**定义切点*/ @Pointcut(value = "execution(public * com.whyc..controller.*.add*(..))" + "|| execution(public * com.whyc..controller.*.delete*(..))" + "|| execution(public * com.whyc..controller.*.update*(..))" ) private void operationLogPointcut(){}; /**aop处理类,对捕捉到的切点接口,进行数据处理*/ @AfterReturning(pointcut = "operationLogPointcut()",returning = "resp") public void doAfterReturnOperation(JoinPoint point,Object resp){ //用户id Long uId = ActionUtil.getUser().getUId(); Signature signature = point.getSignature(); String methodSignature = signature.toString(); String methodName = signature.getName(); //执行的类全名 String fullClassName = signature.getDeclaringTypeName(); Integer operationType = 0; String operationTypeName = null; if(methodName.contains("update")){ //提取单项-修改配置 if(fullClassName.contains("pageParam")){ operationTypeName = UserOperation.TYPE_PARAM_CHANGE.getTypeName(); operationType = UserOperation.TYPE_PARAM_CHANGE.getType(); } //提取单项-密码修改 else if(fullClassName.contains("updatePassword")){ operationTypeName = UserOperation.TYPE_PASSWORD_CHANGE.getTypeName(); operationType = UserOperation.TYPE_PASSWORD_CHANGE.getType(); } else { operationTypeName = UserOperation.TYPE_UPDATE.getTypeName(); operationType = UserOperation.TYPE_UPDATE.getType(); } }else if (methodName.contains("add")){ operationTypeName = UserOperation.TYPE_ADD.getTypeName(); operationType = UserOperation.TYPE_ADD.getType(); }else if (methodName.contains("delete")){ operationTypeName = UserOperation.TYPE_DELETE.getTypeName(); operationType = UserOperation.TYPE_DELETE.getType(); }/*else if (methodName.contains("login")){ operationTypeName = UserOperation.TYPE_LOGIN.getTypeName(); operationType = UserOperation.TYPE_LOGIN.getType(); }else if (methodName.contains("logout")){ operationTypeName = UserOperation.TYPE_LOGOUT.getTypeName(); operationType = UserOperation.TYPE_LOGOUT.getType(); }*/ //获取类型 String[] fullClassNameSplit = fullClassName.split("\\."); String className = fullClassNameSplit[fullClassNameSplit.length-1].replace("Controller","模块"); if(fullClassName.contains("app")){ className+="-安卓端"; } //操作时间 Date operationTime = new Date(); //客户端ip HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); String terminalIp = request.getRemoteAddr(); //操作信息 //获取切点方法信息 String[] parameterNames = ((MethodSignature) signature).getParameterNames(); Object[] args = point.getArgs(); HashMap<String, Object> map = new HashMap<>(); for (int i = 0; i < parameterNames.length; i++) { map.put(parameterNames[i],args[i].toString()); } //人脸接口的添加参数是图片的base64字符串,不存储 if(methodSignature.contains("FaceController.add")||methodSignature.contains("FaceController.update")){ map = new HashMap<>(); } String operationMsg = "执行了"+className+"的"+operationTypeName+"操作."; String operationDetail = "具体调用方法为:"+methodName+",具体参数为:"+map.toString(); service.recordOperationLog(uId,operationType,operationTime,terminalIp,operationMsg,operationDetail); } } src/main/java/com/whyc/mapper/DocLogMapper.java
@@ -1,6 +1,10 @@ package com.whyc.mapper; import com.whyc.pojo.DocLog; import com.whyc.pojo.UserLog; import java.util.List; public interface DocLogMapper extends CustomMapper<DocLog>{ List<DocLog> getList(DocLog docLog); } src/main/java/com/whyc/mapper/UserLogMapper.java
File was deleted src/main/java/com/whyc/pojo/DocLog.java
@@ -1,6 +1,7 @@ package com.whyc.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; @@ -34,9 +35,15 @@ private Integer id; @TableField(exist = false) private Integer name; private Integer oprateType; private Date oprateDay; @TableField(exist = false) private Date oprateDay2; private String terminalIp; @@ -48,5 +55,11 @@ @ApiModelProperty(value = "是否已阅读,此功能针对异常信息") private Integer readFlag; @TableField(exist = false) private String operationTypeStr; @TableField(exist = false) private Integer eventType; } src/main/java/com/whyc/service/DocLogService.java
@@ -1,11 +1,100 @@ package com.whyc.service; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.whyc.constant.UserOperation; import com.whyc.mapper.DocLogMapper; import com.whyc.pojo.DocLog; import com.whyc.pojo.UserLog; import com.whyc.util.ActionUtil; import com.whyc.util.DateUtil; import com.whyc.util.ExcelUtil; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Date; import java.util.List; @Service public class DocLogService { @Autowired @Autowired(required = false) private DocLogMapper mapper; public void recordOperationLog(Long uId, Integer operationType, Date operationTime, String terminalIp, String operationMsg, String operationDetail) { DocLog docLog=new DocLog(); docLog.setId(uId.intValue()); docLog.setOprateType(operationType); docLog.setOprateDay(operationTime); docLog.setTerminalIp(terminalIp); docLog.setOprateMsg(operationMsg); docLog.setOperationDetail(operationDetail); mapper.insert(docLog); } public PageInfo<DocLog> getPage(int pageNum, int pageSize, DocLog docLog) { PageHelper.startPage(pageNum,pageSize,true); //这个接口要兼容新老审计日志记录的查询 List<DocLog> userLogList = mapper.getList(docLog); userLogList.stream().forEach(docLog1-> { switch (docLog1.getOprateType()){ case 1: docLog1.setOperationTypeStr(UserOperation.TYPE_LOGIN.getTypeName());break; case 2: docLog1.setOperationTypeStr(UserOperation.TYPE_LOGOUT.getTypeName());break; case 3: docLog1.setOperationTypeStr(UserOperation.TYPE_ADD.getTypeName());break; case 4: docLog1.setOperationTypeStr(UserOperation.TYPE_UPDATE.getTypeName());break; case 5: docLog1.setOperationTypeStr(UserOperation.TYPE_DELETE.getTypeName());break; case 20:docLog1.setOperationTypeStr(UserOperation.TYPE_UNAUTHORIZED_ACCESS.getTypeName());break; case 21:docLog1.setOperationTypeStr(UserOperation.TYPE_EXCEPTION.getTypeName());break; case 31:docLog1.setOperationTypeStr(UserOperation.TYPE_LOGIN_FAIL.getTypeName());break; case 32:docLog1.setOperationTypeStr(UserOperation.TYPE_PARAM_CHANGE.getTypeName());break; case 33:docLog1.setOperationTypeStr(UserOperation.TYPE_PASSWORD_CHANGE.getTypeName());break; case 34:docLog1.setOperationTypeStr(UserOperation.TYPE_LOGIN_TIMEOUT.getTypeName());break; default:docLog1.setOperationTypeStr(UserOperation.TYPE_UNRECOGNIZED.getTypeName()); } }); PageInfo<DocLog> pageInfo = new PageInfo<>(userLogList); return pageInfo; } public void exportExcel(HttpServletResponse response, String[][] value) { String[] columnTitleArr = new String[]{"操作人姓名","操作类型","操作时间","终端IP","操作事件","具体参数"}; String now = DateUtil.YYYY_MM_DD_HH_MM_SS_UNION.format(new Date()); ExcelUtil.exportExcel("UserLog-"+now,"测试sheet1",columnTitleArr,value,new HSSFWorkbook(),response); } public void record(long uId, int operationType, String msg) { DocLog docLog = new DocLog(); docLog.setTerminalIp(ActionUtil.getRequest().getRemoteAddr()); docLog.setOprateDay(new Date()); docLog.setId((int)(uId)); docLog.setOprateType(operationType); docLog.setOprateMsg(msg); mapper.insert(docLog); } public void record(long uId, int operationType, String msg,String msgDetail) { DocLog docLog = new DocLog(); docLog.setTerminalIp(ActionUtil.getRequest().getRemoteAddr()); docLog.setOprateDay(new Date()); docLog.setId((int)(uId)); docLog.setOprateType(operationType); docLog.setOprateMsg(msg); docLog.setOperationDetail(msgDetail); mapper.insert(docLog); } public void record2(HttpServletRequest request, long uId, int operationType, String msg, String msgDetail) { DocLog docLog = new DocLog(); docLog.setTerminalIp(request.getRemoteAddr()); //userLog.setTerminalIp(request.getRemoteAddr()); docLog.setOprateDay(new Date()); docLog.setId((int)(uId)); docLog.setOprateType(operationType); docLog.setOprateMsg(msg); docLog.setOperationDetail(msgDetail); mapper.insert(docLog); } } src/main/java/com/whyc/service/UserLogService.java
File was deleted src/main/java/com/whyc/util/CommonUtil.java
@@ -1,7 +1,7 @@ package com.whyc.util; import com.whyc.pojo.UserInf; import com.whyc.service.UserLogService; import com.whyc.service.DocLogService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.system.ApplicationHome; import org.springframework.stereotype.Component; @@ -15,11 +15,11 @@ @Component public class CommonUtil { private static UserLogService userLogService; private static DocLogService docLogService; @Autowired public void setUserLogService(UserLogService userLogService) { CommonUtil.userLogService = userLogService; public void setUserLogService(DocLogService docLogService) { CommonUtil.docLogService = docLogService; } /**获取当前Session中的属性user*/ @@ -35,15 +35,15 @@ /**手动记录特定日志*/ public static void record(long uId, int operationType, String msg){ userLogService.record(uId,operationType,msg); docLogService.record(uId,operationType,msg); } /**手动记录特定日志*/ public static void record(long uId, int operationType, String msg,String msgDetail){ userLogService.record(uId,operationType,msg,msgDetail); docLogService.record(uId,operationType,msg,msgDetail); } /**手动记录特定日志*/ public static void record2(HttpServletRequest request,long uId, int operationType, String msg,String msgDetail){ userLogService.record2(request,uId,operationType,msg,msgDetail); docLogService.record2(request,uId,operationType,msg,msgDetail); } } src/main/resources/mapper/DocLogMapper.xml
@@ -2,5 +2,94 @@ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.whyc.mapper.DocLogMapper"> <resultMap id="Map_docLog" type="docLog"> <id property="num" column="num"/> <result property="id" column="id"/> <result property="oprateType" column="oprate_type"/> <result property="oprateDay" column="oprate_day"/> <result property="terminalIp" column="terminal_ip"/> <result property="oprateMsg" column="oprate_msg"/> <result property="operationDetail" column="operation_detail"/> <result property="name" column="name"/> </resultMap> <select id="getList" resultMap="Map_docLog"> select l.*,u.name from db_doc.tb_doc_log l,db_doc.tb_doc_user u where l.uId = u.uId and uOprateDay between #{oprateDay} and #{oprateDay2} <if test="id !=null"> and l.id = #{id} </if> <!--条件查询-非全部--> <if test="eventType !=null"> <choose> <!--系统级别(1)--> <when test="eventType ==1"> <choose> <when test="oprateType ==1 or oprateType ==2 or oprateType ==20 or oprateType ==21 "> <choose> <!--登录包括普通登录和临时凭证ID登录--> <when test="oprateType ==1"> and oprate_type in (#{oprateType},35) </when> <otherwise> and oprate_type= #{oprateType} </otherwise> </choose> </when> <when test="oprateType ==31 or oprateType ==32 or oprateType ==33 or oprateType ==34"> and oprate_type= #{oprateType} <choose> <when test="oprateType ==31"> or oprate_msg regexp '登录PC系统失败' </when> <when test="oprateType ==32"> or oprate_msg regexp '配置参数修改|导航配置' </when> <when test="oprateType ==33"> or oprate_msg regexp '密码' and oprate_msg not regexp '更新密码复杂度规则' </when> <otherwise> or oprate_msg regexp 'LoginAction!login|imeout' </otherwise> </choose> </when> <when test="oprateType == 3 or oprateType == 4 or oprateType == 5"> and oprate_type= #{oprateType} and oprate_msg regexp '添加新用户|的用户信息|权限组|审计数据记录容量 |执行了User模块|执行了PermitGroup' </when> </choose> </when> <!--业务级别-机房(2)--> <when test="eventType ==2"> and oprate_type= #{oprateType} and oprate_msg regexp '单体|电池组|组端|设备|Batt|Dev|FBO|Fbs|Ld9|Li9130|Lithium|Station3D' and oprate_msg not regexp '电源|Pwrdev' </when> <!--业务级别-电源(3)--> <when test="eventType ==3"> and oprate_type= #{oprateType} and oprate_msg regexp 'PowerInf|Pwr' </when> <!--业务级别-其他(4)--> <when test="eventType ==4"> and oprate_type= #{oprateType} and oprate_msg not regexp '添加新用户|的用户信息|权限组|审计数据记录容量|配置参数修改|导航配置|密码|单体|电池组|组端|设备|电源| |执行了User模块|执行了PermitGroup| |Batt|Dev|FBO|Fbs|Ld9|Li9130|Lithium|Station3D| |PowerInf|Pwr' </when> </choose> </if> ORDER BY oprate_day DESC </select> </mapper> src/main/resources/mapper/UserLogMapper.xml
File was deleted