aop的实现不需要继承什么都不需要就是单纯的接口类和普通类就可以完成

1.登录校验 annotation

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface GlobalInterceptor {
    boolean checkLogin() default false;
}

其中ElementType.TYPE可以不加 因为极少数是一整个类都需要登录校验的 避免在不必要时登录校验 避免在类上添加注解

实现类:
 

@Aspect
@Component
@Slf4j
public class GlobalOperactionAspect {
    @Resource
    private RedisUtils redisUtils;
    @Before("@annotation(com.easylive.web.annotation.GlobalInterceptor)")
    public void interceptoDo(JoinPoint point){
        Method method=((MethodSignature) point.getSignature()).getMethod();
        GlobalInterceptor interceptor = method.getAnnotation(GlobalInterceptor.class);
        if (null==interceptor){
            return;
        }
        if (interceptor.checkLogin()){
            checkLogin();
        }
    }
    private void checkLogin(){
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        String token=request.getHeader(Constants.TOKEN_WEB);
        if (StringTools.isEmpty(token)){
            throw new BusinessException(ResponseCodeEnum.CODE_901);
        }
        TokenUserInfoDto tokenUserInfoDto=(TokenUserInfoDto) redisUtils.get(Constants.REDIS_KEY_TOKEN_WEB+token);
        if (tokenUserInfoDto==null){
            throw new BusinessException(ResponseCodeEnum.CODE_901);
        }
    }
}

登录校验需要的是前置通知Before 使用了注解一般就使用@annotation 若是习惯使用pointcut也可以没有区别 在annotation后写入注解类的地址。定义方法参数为joinpoint 原因是aop是依靠反射获取方法参数的  依靠getSignature拿到标签再用getmethod拿到方法 再用getAnnotation拿到注解中的参数即@GloabalInteraction(checkLogin=true) 剩下checkLogin方法实现简单不做赘述

2.信息发送

注解类型:
 

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface RecordUserMessage {
    MessageTypeEnum messageType();
}

其中MessageTypeEnum枚举类里面自己定义消息类型以下为参考:
 

SYS(1, "系统消息"),
LIKE(2, "点赞"),
COLLECTION(3, "收藏"),
COMMENT(4, "评论");

实现类:
 

@Slf4j
@Aspect
@Component
public class UserMessageOperactionAspect {

    private static final String PARAMETER_VIDEO_ID="videoId";
    private static final String PARAMETER_ACTION_TYPE="actionType";
    private static final String PARAMETER_REPLY_COMMENTID="replyCommentId";
    private static final String PARAMETER_CONTENT="content";
    private static final String PARAMETER_AUDIT_REJECT_REASON="reason";
    @Resource
    private RedisComponent redisComponent;

    @Resource
    private UserMessageService userMessageService;

    @Around("@annotation(com.easylive.annotation.RecordUserMessage)")
    public Object interceptorDo(ProceedingJoinPoint point) throws Throwable {
        ResponseVO responseVO = (ResponseVO) point.proceed();
        Method method = ((MethodSignature) point.getSignature()).getMethod();
        RecordUserMessage recordUserMessage = method.getAnnotation(RecordUserMessage.class);


        if (recordUserMessage!=null){
            saveMessage(recordUserMessage,point.getArgs(),method.getParameters());
        }
        return redisComponent;
    }

    private void saveMessage(RecordUserMessage recordUserMessage, Object[] arguments, Parameter[] parameters) {
        String videoId = null;
        Integer actionType = null;
        Integer replyCommentId = null;
        String content = null;
        for (int i = 0; i < parameters.length; i++) {
            if (PARAMETER_VIDEO_ID.equals(parameters[i].getName())) {
                videoId = (String) arguments[i];
            } else if (PARAMETER_ACTION_TYPE.equals(parameters[i].getName())) {
                actionType = (Integer) arguments[i];
            } else if (PARAMETER_REPLY_COMMENTID.equals(parameters[i].getName())) {
                replyCommentId = (Integer) arguments[i];
            } else if (PARAMETER_CONTENT.equals(parameters[i].getName())) {
                content = (String) arguments[i];
            } else if (PARAMETER_AUDIT_REJECT_REASON.equals(parameters[i].getName())){
                content=(String) arguments[i];
            }
            MessageTypeEnum messageTypeEnum=recordUserMessage.messageType();;
            if (UserActionTypeEnum.VIDEO_COLLECT.getType().equals(actionType)){
                messageTypeEnum=MessageTypeEnum.COLLECTION;
            }
            TokenUserInfoDto tokenUserInfoDto=getTokenUserInfoDto();
            userMessageService.saveUserMessage(videoId,tokenUserInfoDto==null?null:tokenUserInfoDto.getUserId(),messageTypeEnum,content,replyCommentId);

        }
    }

    private TokenUserInfoDto getTokenUserInfoDto(){
        HttpServletRequest request=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        String token = request.getHeader(Constants.TOKEN_WEB);
        return redisComponent.getTokenUserInfo(token);
    }
}

重点解释saveMessage方法其中arguments是方法中实际的传参值即加入user(String userId,String nickName)我传入jf,shuaige argument中的数据就是jf,shuaige 而parameters是方法参数 里面就是userId 与 nickName 其他皆可自己理解含义并不复杂

saveUserMessage方法实现:
 

@Override
@Async
public void saveUserMessage(String videoId, String sendUserId, MessageTypeEnum messageTypeEnum, String content, Integer replyCommentId) {
   VideoInfo videoInfo=videoInfoMapper.selectByVideoId(videoId);
   if (null==videoInfo){
      return;
   }
   UserMessageExtendDto extendDto=new UserMessageExtendDto();
   extendDto.setMessageContent(content);

   String userId=videoInfo.getUserId();
   if (ArrayUtils.contains(new Integer[]{MessageTypeEnum.LIKE.getType(),MessageTypeEnum.COMMENT.getType()},messageTypeEnum.getType())){
      UserMessageQuery userMessageQuery=new UserMessageQuery();
      userMessageQuery.setUserId(userId);
      userMessageQuery.setVideoId(videoId);
      userMessageQuery.setMessageType(messageTypeEnum.getType());
      Integer count=userMessageMapper.selectCount(userMessageQuery);
      if (count>0){
         return;
      }
   }
   UserMessage userMessage=new UserMessage();
   userMessage.setUserId(userId);
   userMessage.setVideoId(videoId);
   userMessage.setReadType(MessageReadTypeEnum.NO_READ.getType());
   userMessage.setCreateTime(new Date());
   userMessage.setMessageType(messageTypeEnum.getType());
   userMessage.setSendUserId(sendUserId);
   if (replyCommentId!=null){
      VideoComment comment=videoCommentMapper.selectByCommentId(replyCommentId);
      if (null!=comment){
         userId=comment.getUserId();
         extendDto.setMessageContentReply(comment.getContent());
      }
   }
   if (userId.equals(sendUserId)){
      return;
   }
   //系统消息特殊处理
   if (MessageTypeEnum.SYS==messageTypeEnum){
      VideoInfoPost videoInfoPost=videoInfoPostMapper.selectByVideoId(videoId);
      extendDto.setAuditStatus(videoInfoPost.getStatus());
   }
   userMessage.setUserId(userId);
   userMessage.setExtendJson(JsonUtils.convertObj2Json(extendDto));
   this.userMessageMapper.insert(userMessage);
}
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐