aop 使用

 定义注解

@Retention(RetentionPolicy.RUNTIME)//运行时有效
@Target(ElementType.METHOD)//作用于方法
public @interface PermissionLog {
// 方法名
   String openId() default "";

   String tournamentId() default "";

   String applicationType() default "";

   boolean isEntity() default true;

}
定义传实体需要的对象
@Data
@ApiModel(value = "权限管理VO")
public class AopPermissionLogVO<T> {

   @ApiModelProperty(value = "数据实体")
   private T entity;
   @ApiModelProperty(value = "登录人openID")
   private String openId;
   @ApiModelProperty(value = "赛事ID")
   private String tournamentId;


}
定义解析注解的切点
@Aspect
@Component
public class AnnotationAspect {

   @Autowired
   private ICompetitionClient competitionClient;

   @Around(value = "@annotation(around)")
   @ResponseBody
   public Object processAuthority(ProceedingJoinPoint point, PermissionLog around) throws Throwable{
      if (true){return point.proceed();}
      int count =0;
      if (around.isEntity()){
         AopPermissionLogVO arg = (AopPermissionLogVO) point.getArgs()[0];
         count = competitionClient.getPermissionLogCount(arg.getOpenId(),arg.getTournamentId(),around.applicationType());
      }else {
         MethodSignature signature = (MethodSignature) point.getSignature();
         String fieldName;
         Map<String,String> fieldValues = new HashMap(16);
         String[] all = new String[]{around.openId(),around.tournamentId(),around.applicationType()};
         for (String str:all){
            if(!StringUtils.isBlank(fieldName = str)){
               String[] parameterNames = signature.getParameterNames();
               for (int i = 0; i < parameterNames.length; i++) {
                  String parameterName = parameterNames[i];
                  if (fieldName.equals(parameterName)) {
                     fieldValues.put(fieldName, String.valueOf(point.getArgs()[i]));
                  }
               }
            }
         }
         count = competitionClient.getPermissionLogCount(fieldValues.get(around.openId()),fieldValues.get(around.tournamentId()), around.applicationType());
      }
      if (count>0){
         return point.proceed();
      }else {
         return R.fail("没有权限!");
      }

   }
}

 

posted @ 2020-04-29 14:24  ±小马哥  阅读(272)  评论(0编辑  收藏  举报