chatService第一阶段

淩亂°似流年 2024-04-20 22:07 134阅读 0赞

在第一版本中这个项目我实现了好友模块相关功能的实现,有添加,删除,拉黑老友,拒绝申请还有一些查询功能,后来接入了sso,使用到了ThreadLocal来存储登录用户信息,通过Aop实现了操作记录日志的功能.

在这期间遇到了很多的问题.总结以下重点问题.

在第一个添加好友功能里面要实现一连串的验证,并且之后验证还可能增加,需要可拓展性,可拓展性可以使用ioc来实现,但是一连串验证在搜索之后,发现有责任链和规则链.

责任链是每一个验证都会执行,规则链是如果其中一个满足了条件可以终止执行,很明显,在我们添加好友验证中只要一个不满足停止了,所以我们选用规则链.在写规则的时候也出现了一些错误,比如数字判断可以使用NumberUtil.equals,我开始使用了ObjectUtil.

规则链代码:

  1. @Service
  2. public class RuleChain {
  3. @Resource
  4. private ReviewMapper reviewMapper;
  5. @Resource
  6. List<Rule> rules;
  7. public boolean validate(AddFriendDto addFriendDto) {
  8. for (Rule rule : rules) {
  9. if (!rule.validate(addFriendDto)) {
  10. return false;
  11. }
  12. }
  13. ReviewPo reviewPo = ReviewPo.builder()
  14. .fromUserId(addFriendDto.getFromUserId())
  15. .toUserId(addFriendDto.getToUserId())
  16. .greeting(addFriendDto.getGreeting())
  17. .source(addFriendDto.getSource())
  18. .build();
  19. reviewMapper.insert(reviewPo);
  20. CaLoginUser caLoginUser = LoginUserHolder.get();
  21. caLoginUser.setTraceId(reviewPo.getId());
  22. LoginUserHolder.set(caLoginUser);
  23. return true;
  24. }
  25. }
  26. @Component
  27. @Order(1)
  28. public class OneRule extends Rule {
  29. @Resource
  30. private FriendMapper friendMapper;
  31. @Resource
  32. private RedissonClient redissonClient;
  33. @Override
  34. public boolean validate(AddFriendDto addFriendDto) {
  35. FriendPo friendPo = friendMapper.selectOne(new LambdaQueryWrapper<FriendPo>().eq(FriendPo::getUserId, addFriendDto.getFromUserId())
  36. .eq(FriendPo::getFriendId, addFriendDto.getToUserId()));
  37. //没有拉黑和删除
  38. if (ObjectUtil.isNotNull(friendPo)&&NumberUtil.equals(friendPo.getIsBlack(),YesOrNo.NO.getCode())&&NumberUtil.equals(friendPo.getDelFlag(),YesOrNo.NO.getCode())) {
  39. throw new ReviewException("你们已经是好友,无法发起申请");
  40. }
  41. redissonClient.getBucket("friend"+String.valueOf(addFriendDto.getFromUserId() + addFriendDto.getToUserId())).set(friendPo);
  42. return true;
  43. }
  44. }

在规则链条中,我开始每一次都去查询了数据库,但是后来发现有的查询是重复的,最后把相同的第一次查询结果放到了redis里面,这样可以减轻数据库的压力.

在接入sso的时候,也用到了以前没注意的在方法内发起网络请求.

  1. HttpUtil.get(URL,ImmutableMap.<String, Object>of("token",StrUtil.trimToEmpty(token)))

,可以发起get或者post请求,第一个参数是URL,第二个是参数,可以直接使用Map来存.

关于ThreadLocal,因为我们每一次网络请求,都是一个独立的线程,所以用ThreadLocal来存储用户信息,相当于存了一个全局变量,可以在任何位置都得到这个参数,非常方便.

  1. public class LoginUserHolder {
  2. private static final ThreadLocal<CaLoginUser> LONGIN_USER_HOLDER = new ThreadLocal<CaLoginUser>();
  3. /**
  4. * set holder中内容
  5. *
  6. * @author cong.zhen
  7. * @date 2023/01/29
  8. */
  9. public static void set(CaLoginUser abstractLoginUser) {
  10. LONGIN_USER_HOLDER.set(abstractLoginUser);
  11. }
  12. /**
  13. * 获取holder中的值
  14. *
  15. * @author cong.zhen
  16. * @date 2023/01/29
  17. */
  18. public static CaLoginUser get() {
  19. return LONGIN_USER_HOLDER.get();
  20. }
  21. /**
  22. * 得到真实姓名
  23. *
  24. * @author cong.zhen
  25. * @date 2023/01/29
  26. */
  27. public static String getUserName() {
  28. CaLoginUser caLoginUser = LONGIN_USER_HOLDER.get();
  29. if (ObjectUtil.isNull(caLoginUser)) {
  30. return StrUtil.EMPTY;
  31. }
  32. return caLoginUser.getUsername();
  33. }
  34. /**
  35. * 删除保存的用户
  36. *
  37. * @author cong.zhen
  38. * @date 2023/01/29
  39. */
  40. public static void remove() {
  41. LONGIN_USER_HOLDER.remove();
  42. }
  43. }

最后实现了通过Aop来实现操作记录日志的功能,在这个里面也遇到了一些问题,我需要实现将当前操作的数据库相关记录的id存起来,修改和删除的可以直接获取到id,但是插入的需要使用mabatisplus回填主键来实现,通过搜索和尝试发现,使用mybatisplus自带的Insert可以自动实现回填主键,只需要在ID上设置相关的规则,自增或者雪花算法等.其次这个id也应该是一个全局变量,我就把他存储到了用户信息里面来实现这个功能.

  1. reviewMapper.insert(reviewPo);
  2. CaLoginUser caLoginUser = LoginUserHolder.get();
  3. caLoginUser.setTraceId(reviewPo.getId());
  4. LoginUserHolder.set(caLoginUser);

发表评论

表情:
评论列表 (有 0 条评论,134人围观)

还没有评论,来说两句吧...

相关阅读

    相关 chatService第一阶段

    最后实现了通过Aop来实现操作记录日志的功能,在这个里面也遇到了一些问题,我需要实现将当前操作的数据库相关记录的id存起来,修改和删除的可以直接获取到id,但是插入的需要...

    相关 书城项目第一阶段

    一、事件驱动补充 1、取消控件的默认行为 控件默认行为 点超链接会跳转页面 点表单提交按钮会提交表单 本来控件的默认行为是天经地义就该如此的,但是如

    相关 项目第一阶段的总结感想

    在2018年3月27日,正式进入公司工作,这是我第一次正式的工作,对于一个刚毕业半年多的人来说,很是幸运了。找工作是在3月初就开始了,一共有3个星期的时间用来找工作。其中第二个

    相关 第一阶段SCRUM冲刺05

    昨天:照着教程写了一个视频播放的模块。。但没有写完 遇到的问题:实现困难 今天:继续写这个模块。 转载于:https://www.cnblogs.com/10613219

    相关 第一阶段站立会议03

    一、站立会议信息  确定了成员的任务进度,对遇到的问题进行了交流,互相提供学习的经验,在团队内部共享了插件和视频资源。   ![1141684-20170504230542