第一步:自定义注解类
/**
* @author: huangnenghuan
* @create: 2020/09/29
* @description: 操作日志注解
**/
@Order(-2147483648)
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface OperLog {
// 菜单名称,如数据项
String name();
// 功能名称,如分页查询
String desc();
// 操作类型
OperLogEnum action();
// 是否插入请求参数
boolean isAddParam() default true;
/**
* 操作日志类型
*/
public enum OperLogEnum {
add,
update,
delete,
query,
upload,
download
}
}
第二步:编写切面方法
/**
* @author: huangnenghuan
* @create: 2020/09/29
* @description:
**/
@Aspect
@Component
public class OperLogAspect {
private Logger logger = LoggerFactory.getLogger(OperLogAspect.class);
/**
* 定义切入点
*/
@Pointcut("@annotation( com.qualitycheck.hnhqualitycheck.annotation.OperLog )")
public void OperLogs() {
}
@Before(value = "OperLogs()")
public void logBefore(JoinPoint joinPoint){
try {
//获取当前类象
Class<?> clazz = joinPoint.getTarget().getClass();
// 获取当前类的执行的方法
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = clazz.getMethod(signature.getMethod().getName(), signature.getMethod().getParameterTypes());
// 获取注解里的参数
OperLog log = method.getAnnotation(OperLog.class);
// 获取请求参数
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//String param = JSON.toJSON(new PageData(request)).toString();
//获取请求路径
String url = request.getRequestURL().toString();
//获取菜单名称
String name = log.name();
//获取功能名称
String desc = log.desc();
// 获取操作类型
String action = log.action().name();
// 获取是否插入参数
boolean isAddParam = log.isAddParam();
//param = isAddParam ? param : null;
// 获取操作人
SysUser sysUser = getSysUser(request);
System.out.print("aaaaaaaaaaaaaaaaaaaaaaa"+sysUser);
}catch (Exception e){
logger.error("写入操作日志失败!", e.getMessage());
}
}
private SysUser getSysUser(HttpServletRequest request){
SessionVo sessionVo = (SessionVo) request.getSession().getAttribute("SessionVo");
if(CommonUtil.isNotNull(sessionVo.getSysUser())){
return sessionVo.getSysUser();
}else{
return null;
}
}
}
第三步:在controller中加入自定义注解
@ResponseBody
@RequestMapping("/getUsersData")
@OperLog(name = "用户管理", desc = "获取用户数据", action = OperLog.OperLogEnum.query)
public Map<String,Object> getUsersData(HttpServletRequest request, @RequestParam(value = "loginName") String loginName, @RequestParam(value = "deptId") String deptId,
@RequestParam(value = "page") Integer page, @RequestParam(value = "limit") Integer limit){
SessionVo sessionVo = (SessionVo) request.getSession().getAttribute("SessionVo");
Map<String,Object> rsMap = new HashMap<>();
IPage<SysUser> iPage = sysUserService.findByLoginNamePage(sessionVo.getSysUser().getBusinessId(), deptId, loginName, page, limit);
rsMap.put("code", 0);
rsMap.put("count", iPage.getSize());
rsMap.put("data", iPage.getRecords());
return rsMap;
}
注意:如果自定义注解无效,可以查看是否少引入包
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.14</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>