pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/aop/OperationLogAspect.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/constant/UserOperation.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/mapper/OperationLogMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/pojo/OperationLog.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/service/OperationLogService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/util/ActionUtil.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
pom.xml
@@ -133,6 +133,11 @@ <artifactId>commons-codec</artifactId> <version>1.10</version> </dependency> <!--添加aop--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> </dependencies> <build> src/main/java/com/whyc/aop/OperationLogAspect.java
New file @@ -0,0 +1,103 @@ package com.whyc.aop; import com.whyc.constant.UserOperation; import com.whyc.service.OperationLogService; import com.whyc.util.ActionUtil; import org.aspectj.lang.JoinPoint; 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 OperationLogService 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(); //操作类型:目前记录 增删改/登录登出 String methodName = point.getSignature().getName(); Integer operationType = 0; String operationTypeName = null; if(methodName.contains("update")){ 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 fullClassName = point.getSignature().getDeclaringTypeName().toString(); //获取类型 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) point.getSignature()).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()); } String operationMsg = "执行了"+className+"的"+operationTypeName+"操作."; String operationDetail = "具体调用方法为:"+methodName+",具体参数为:"+map.toString(); service.record(uId,operationType,operationTime,terminalIp,operationMsg,operationDetail); } } src/main/java/com/whyc/constant/UserOperation.java
New file @@ -0,0 +1,40 @@ package com.whyc.constant; /**用户操作类型*/ public enum UserOperation { /**操作类型*/ TYPE_LOGIN(1,"登录系统"), TYPE_LOGOUT(2,"登出系统"), TYPE_ADD(3,"新增"), TYPE_UPDATE(4,"修改"), TYPE_DELETE(5,"删除"), /**操作分类 TODO,不确定会使用*/ SORT_LOGIN(1000,"登录"), SORT_COMMON(1001,"常规操作"); private Integer type; private String typeName; UserOperation(Integer type, String typeName) { this.type = type; this.typeName = typeName; } public Integer getType() { return type; } public void setType(Integer type) { this.type = type; } public String getTypeName() { return typeName; } public void setTypeName(String typeName) { this.typeName = typeName; } } src/main/java/com/whyc/mapper/OperationLogMapper.java
New file @@ -0,0 +1,6 @@ package com.whyc.mapper; import com.whyc.pojo.OperationLog; public interface OperationLogMapper extends CustomMapper<OperationLog> { } src/main/java/com/whyc/pojo/OperationLog.java
New file @@ -0,0 +1,95 @@ package com.whyc.pojo; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.ToString; import org.apache.ibatis.type.Alias; import java.util.Date; @Alias("OperationLog") @TableName(value = "tb_user_log") @ToString public class OperationLog { private Long num; @TableField("uId") private Integer uId; @TableField("uOprateType") private Integer operationType; @TableField("uOprateDay") private Date operationTime; @TableField("uTerminalIp") private String terminalIp; @TableField("uOprateMsg") private String operationMsg; private String operationDetail; public OperationLog() { } public OperationLog(Long num, Integer uId, Integer operationType, Date operationTime, String terminalIp, String operationMsg, String operationDetail) { this.num = num; this.uId = uId; this.operationType = operationType; this.operationTime = operationTime; this.terminalIp = terminalIp; this.operationMsg = operationMsg; this.operationDetail = operationDetail; } public Long getNum() { return num; } public void setNum(Long num) { this.num = num; } public Integer getuId() { return uId; } public void setuId(Integer uId) { this.uId = uId; } public Integer getOperationType() { return operationType; } public void setOperationType(Integer operationType) { this.operationType = operationType; } public Date getOperationTime() { return operationTime; } public void setOperationTime(Date operationTime) { this.operationTime = operationTime; } public String getTerminalIp() { return terminalIp; } public void setTerminalIp(String terminalIp) { this.terminalIp = terminalIp; } public String getOperationMsg() { return operationMsg; } public void setOperationMsg(String operationMsg) { this.operationMsg = operationMsg; } public String getOperationDetail() { return operationDetail; } public void setOperationDetail(String operationDetail) { this.operationDetail = operationDetail; } } src/main/java/com/whyc/service/OperationLogService.java
New file @@ -0,0 +1,20 @@ package com.whyc.service; import com.whyc.mapper.OperationLogMapper; import com.whyc.pojo.OperationLog; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Date; @Service public class OperationLogService { @Resource private OperationLogMapper mapper; public void record(Long uId, Integer operationType, Date operationTime, String terminalIp, String operationMsg, String operationDetail) { OperationLog operationLog = new OperationLog(null, uId.intValue(), operationType, operationTime, terminalIp, operationMsg, operationDetail); mapper.insert(operationLog); } } src/main/java/com/whyc/util/ActionUtil.java
@@ -186,7 +186,7 @@ * * @return 获取当前session 中的用户对象 */ public static Object getUser(){ public static UserInf getUser(){ HttpSession session =getSession(); Object obj=session.getAttribute("user"); UserInf userInf = new UserInf();