/** * 此为系统AOP切面的配置类 * 在spring-context.xml中引入些配置类 * @author Sai * @since 2016-11-15 */@Configuration@EnableAspectJAutoProxy(proxyTargetClass=true)//启用AspectJ自动代理@ComponentScan(basePackages = "com.bld.core.supervisor")//默认扫描与配置类相同的包下的@Component注解下的bean,想自动装配AOP切面,必需加上@Componentpublic class AopConfig { //显示装配切面的bean @Bean public UserAop userAop(){ return new UserAop(); } @Bean public SupervisorEventsAop supervisorEventsAop(){ return new SupervisorEventsAop(); } @Bean public CpsRewardCaculateAop cpsRewardCaculateAop(){ return new CpsRewardCaculateAop();}}在spring-context.xml中配置
<!-- 引入AOP切面配置类 --><bean class = "com.bld.core.sys.config.AopConfig" />
/** * 自定义注解,用来标识方法所处理的业务 * Created by Administrator on 2017/2/22. */@Target({ElementType.FIELD, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface SupervisorEvent { String description() default "no description";//操作信息 String moduleId() default "";//菜单id(from SupervisorAuthorize)}
/** * 管理员事件aop * Created by Administrator on 2017/2/22. */@Aspect@Componentpublic class SupervisorEventsAop { @Autowired private SupervisorEventsMapper supervisorEventsMapper; @Autowired private ModuleMapper moduleMapper; @Autowired private SupervisorMapper supervisorMapper; @Autowired private RoleMapper roleMapper; //没有目标对象的用注解标注进行记录 @After("@annotation(com.bld.common.annotation.SupervisorEvent)") public void addManagerEvents(JoinPoint joinPoint){ String menthodName = joinPoint.getSignature().getName(); Class c = joinPoint.getSignature().getDeclaringType(); Object[] args = joinPoint.getArgs(); Class[] classes = null; if (args!=null) { classes = new Class[args.length]; for (int i = 0; i < args.length; i++) { classes[i] = args[i].getClass(); } } Method method = null; try { method = c.getMethod(menthodName, classes); } catch (NoSuchMethodException e) { throw new BusinessException("记录后台管理员事件失败:"+e.getMessage()); } SupervisorEvent supervisorEvent = method.getAnnotation(SupervisorEvent.class); if (supervisorEvent != null) { String description = supervisorEvent.description(); String moduleInfo = null; if (StringUtil.isNotEmpty(supervisorEvent.moduleId())){ moduleInfo = ""; int moduleId = Integer.parseInt(supervisorEvent.moduleId()); String info = moduleInfo(moduleId,moduleInfo); moduleInfo = info.substring(0,info.length()-2); } Date date = new Date(); String ip = RequestUtil.getIpAddr(); MSupervisorEvents mSupervisorEvents = new MSupervisorEvents(); mSupervisorEvents.setTime(date); mSupervisorEvents.setModuleInfo(moduleInfo); mSupervisorEvents.setDescrption(description); if(null!=ip){ mSupervisorEvents.setIp(ip); } int supervisorId = 1; if(null!=SecurityUtil.getAdminCurrentUser()){ supervisorId = Integer.parseInt(SecurityUtil.getAdminCurrentUser().getUserId()); } mSupervisorEvents.setSupervisorId(supervisorId); int result = supervisorEventsMapper.insertSelective(mSupervisorEvents); if(result!=1){ throw new BusinessException("保存管理员事件失败!"); } } } /** * 系统设置--》管理员管理 */// //添加管理员 @After("execution(* com.bld.core.supervisor.service.impl.SupervisorManageServiceImpl.addSupervisor(..))") public void addManagerEventsForAddSupervisor(JoinPoint joinPoint){ //获取目标方法的参数 Object[] args = joinPoint.getArgs(); BLDAssert.isEmpty(args[0],"添加管理员service方法第一个参数为null"); MSupervisor mSupervisors = (MSupervisor) args[0]; addToDateBase(ADD_SUPERVISOR+"'"+mSupervisors.getName()+"'", SUPERVISOR_LIST, ADD_SUPERVISOR); } //删除管理员 @Before("execution(* com.bld.core.supervisor.service.impl.SupervisorManageServiceImpl.deleteSupervisor(..))") public void addManagerEventsForDeleteSupervisor(JoinPoint joinPoint){ supervisorManagerCommon(joinPoint,DELETE_SUPERVISOR); } //修改管理员 @After("execution(* com.bld.core.supervisor.service.impl.SupervisorManageServiceImpl.editSupervisor(..))") public void addManagerEventsForEditSupervisor(JoinPoint joinPoint){ supervisorManagerCommon(joinPoint,EDIT_SUPERVISOR); } //锁定管理员 @After("execution(* com.bld.core.supervisor.service.impl.SupervisorManageServiceImpl.lockSupervisor(..))") public void addManagerEventsForLockSupervisor(JoinPoint joinPoint){ supervisorManagerCommon(joinPoint,LOCKED_SUPERVISOR); } //解锁管理员 @After("execution(* com.bld.core.supervisor.service.impl.SupervisorManageServiceImpl.unLockSupervisor(..))") public void addManagerEventsForUnLockSupervisor(JoinPoint joinPoint){ supervisorManagerCommon(joinPoint,UNLOCKED_SUPERVISOR); } //重置密码管理员 @After("execution(* com.bld.core.supervisor.service.impl.SupervisorManageServiceImpl.resetPassword(..))") public void addManagerEventsForResetPasswordSupervisor(JoinPoint joinPoint){ supervisorManagerCommon(joinPoint,RESET_PASSWORD); } //管理员删除、修改、锁定、解锁、重置密码相同代码抽取 private void supervisorManagerCommon(JoinPoint joinPoint,String type){ Object[] args = joinPoint.getArgs(); BLDAssert.isEmpty(args[0],type+"service方法第一个参数为null"); int id = (int) args[0]; MSupervisor mSupervisor = supervisorMapper.selectByPrimaryKey(id); addToDateBase(type+"'"+mSupervisor.getName()+"'", SUPERVISOR_LIST, type); } /** * 系统设置--》权限管理 */ //添加角色 @After("execution(* com.bld.core.supervisor.service.impl.RoleManageServiceImpl.addRole(..))") public void addManagerEventsForAddRole(JoinPoint joinPoint){ //获取目标方法的参数 Object[] args = joinPoint.getArgs(); BLDAssert.isEmpty(args[0],"添加角色service方法第一个参数为null"); String name = (String) args[0]; addToDateBase(ADD_ROLE+"'"+name+"'", ROLE_MANAGE, ADD_ROLE); } //删除角色 @Before("execution(* com.bld.core.supervisor.service.impl.RoleManageServiceImpl.deleteRole(..))") public void addManagerEventsForDeleteRole(JoinPoint joinPoint){ roleManagerCommon(joinPoint,DELETE_ROLE); } //修改角色 @After("execution(* com.bld.core.supervisor.service.impl.RoleManageServiceImpl.editRole(..))") public void addManagerEventsForEditRole(JoinPoint joinPoint){ roleManagerCommon(joinPoint,EDIT_ROLE); } //角色删除、修改相同代码抽取 private void roleManagerCommon(JoinPoint joinPoint,String type){ Object[] args = joinPoint.getArgs(); BLDAssert.isEmpty(args[0],type+"service方法第一个参数为null"); int id = (int) args[0]; MRole mRole = roleMapper.selectByPrimaryKey(id); addToDateBase(type+"'"+mRole.getName()+"'", ROLE_MANAGE, type); } /** * 操作日志管理 */ //删除操作日志 @After("execution(* com.bld.core.supervisor.service.impl.OperationRecordServiceImpl.delete(..))") public void addManagerEventsForDeleteRecord(JoinPoint joinPoint){ Object[] args = joinPoint.getArgs(); BLDAssert.isEmpty(args[0],"OperationRecordService方法第一个参数为null"); int code = (int) args[0]; if(code == 0 || code == 1 ||code == 2 ) { String type = ""; switch (code){ case 0: type = "(本周前)"; break; case 1: type = "(本月前)"; break; case 2: type = "(全部)"; break; default: break; } addToDateBase(DELETE_RECORD+type, DELETE_OPERATE_RECORD, DELETE_RECORD); } } //添加管理员事件到数据库 private void addToDateBase(String description, String moduleId, String type) { String info = moduleInfo(Integer.parseInt(moduleId),""); String moduleInfo = info.substring(0,info.length()-2); int supervisorId = 1; if(null!=SecurityUtil.getAdminCurrentUser()){ supervisorId = Integer.parseInt(SecurityUtil.getAdminCurrentUser().getUserId()); } MSupervisorEvents mSupervisorEvents = new MSupervisorEvents(); mSupervisorEvents.setSupervisorId(supervisorId); mSupervisorEvents.setTime(new Date()); mSupervisorEvents.setIp(RequestUtil.getIpAddr()); mSupervisorEvents.setModuleInfo(moduleInfo); mSupervisorEvents.setDescrption(description); int result = supervisorEventsMapper.insertSelective(mSupervisorEvents); if(result!=1){ throw new BusinessException("保存'"+type+"'事件失败!"); } } //递归组合菜单信息 private String moduleInfo(int moduleId,String description){ MModule mModule = moduleMapper.selectByPrimaryKey(moduleId); if (mModule==null){throw new BusinessException("菜单不存在");} description = mModule.getModuleName()+"->"+description; if(mModule.getParentId()!=0){ description = moduleInfo(mModule.getParentId(),description); } return description; }在要记录的方法上加
@Transactional(isolation = Isolation.SERIALIZABLE)@com.bld.common.annotation.SupervisorEvent(description ="描述",moduleId = "菜单id")
来源:https://www.cnblogs.com/sasss/p/7456994.html