注解中包括配置方法所在模块名称,以及功能名称,当然我们在注解里可以自定义。
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.PARAMETER})
public @interface LogInfoAnnotation {
//模块名
String moduleName();
//操作内容
String desc();
}
二、建切面类
切面类里面定义好切点配置,以及所有的需要实现的通知方法。
@Aspect
@Component
public class LogAfterOperationAdvice {
private static Logger logger = LoggerFactory.getLogger(LogAfterOperationAdvice.class);
@Autowired
private SysLogService sysLogService;
@Pointcut("@annotation(com.xuebei.tec.common.annotation.LogInfoAnnotation)")
private void loginfoAnnotation() {
}//定义一个切入点
@Pointcut("execution(* com.xuebei.tec.controller.admin.*.*(..))")
private void controller() {
}//定义一个切入点
// @Before(value = "loginfoAnnotation()" )
// public void doBefore(JoinPoint jp) {
// String strLog = " "
// + jp.getTarget().getClass().getName() + "."
// + jp.getSignature().getName();
// System.out.print(strLog);
// }
@Around(value = "loginfoAnnotation()&&controller()&& @annotation(annotation) &&args(object,..) ")
public Object doAround(ProceedingJoinPoint pjp, LogInfoAnnotation annotation, Object object) throws Throwable {
SysLogPojo sysLog = new SysLogPojo();
sysLog.setModuleName(annotation.moduleName());
sysLog.setModuleDesc(annotation.desc());
//构造登陆用户的信息
buildSysLog(sysLog);
Object[] args = pjp.getArgs();
StringBuffer param = new StringBuffer();
//获取参数详细信息
for (Object temp : args) {
if (null == temp) {
continue;
}
if (!temp.getClass().isArray()) {
Class> tempClass = temp.getClass();
String packageName = tempClass.getPackage().getName();
if (temp != null && isRecordPackage(packageName)) {
param.append(temp.toString()).append("|");
}
}
}
sysLog.setParams(param.toString());
sysLog.setOperateMethod(pjp.getSignature().getDeclaringTypeName() + "." + pjp.getSignature().getName());
Object retVal = pjp.proceed();
if (retVal != null) {
String result = retVal.toString();
sysLog.setResult(result);
}
try {
sysLogService.insertSysLogPojo(sysLog);
} catch (Exception e) {
logger.error("插入日志异常", e);
}
return retVal;
}
private boolean isRecordPackage(String p) {
String[] pack = {"java.lang", "java.util", "com.xuebei.tec"};
for (String s : pack) {
if (p.startsWith(s)) {
return true;
}
}
return false;
}
private void buildSysLog(SysLogPojo sysLog) {
Subject subject = SecurityUtils.getSubject();
sysLog.setRemoteAddr(IpUtils.getIpAddr(WebUtils.getCurrentRequest()));
sysLog.setRequestUrl(WebUtils.getCurrentRequest().getRequestURI());
SysUserPojo sysUser = null;
if (subject != null && subject.isAuthenticated()) {
sysUser = WebUtils.getCurrentSysUser();
sysLog.setOperateName(sysUser.getName());
sysLog.setOperateId(sysUser.getId());
sysLog.setOperateTime(DateTools.getCurrentDateTime());
}
}
}
三、测试Controller
public class CmsBannerController {
@Autowired
private CmsBannerService cmsBannerService;
@ApiOperation(value = "新增活动", notes = "对应权限:cmsBanner:new ")
@RequestMapping(value = "/create", method = RequestMethod.POST)
@RequiresPermissions("cmsBanner:new")
@ResponseBody
@LogInfoAnnotation(moduleName = "活动管理", desc = "新增活动")
public ResultDo> create(
@Valid @RequestBody CmsBannerPojo cmsBannerPojo) throws ParseException {
ResultDo> resultDo = ResultDo.build();
if (null == cmsBannerPojo.getPcView()) {
cmsBannerPojo.setPcView(false);
}
if (cmsBannerPojo.getHref() == null) {
cmsBannerPojo.setHref("");
}
if (cmsBannerPojo.getBannerType() == null) {
cmsBannerPojo.setBannerType(false);
}
if (cmsBannerPojo.getShareFlag() == null) {
cmsBannerPojo.setShareFlag(false);
}
if (cmsBannerPojo.getSpecial() == null) {
cmsBannerPojo.setSpecial(false);
}
if (cmsBannerPojo.getSpecial()) {
Timestamp ts = new Timestamp(System.currentTimeMillis());
cmsBannerPojo.setStartTime(ts);
cmsBannerPojo.setEndTime(null);
}
cmsBannerPojo.setStatus(CmsBannerStatus.saved);
cmsBannerService.insertCmsBannerPojo(cmsBannerPojo);
return resultDo;
}



