diff --git a/ruoyi-admin/src/main/java/com/ruoyi/job/EveryDaysJob.java b/ruoyi-admin/src/main/java/com/ruoyi/job/EveryDaysJob.java new file mode 100644 index 00000000..fc68243c --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/job/EveryDaysJob.java @@ -0,0 +1,26 @@ +package com.ruoyi.job; + +import com.ruoyi.op.BusOp; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class EveryDaysJob { + @Autowired + private BusOp busOp; + // 凌晨0点3分执行一次 + @Scheduled(cron = "0 3 0 * * ? ") + public void run() { + try { + log.info("执行用户VIP状态码回转-开始"); + busOp.refreshUserVipStatus(); + }catch (Exception e){ + log.error("执行用户VIP状态码回转-失败!",e); + }finally { + log.info("执行用户VIP状态码回转-结束"); + } + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/job/RankJob.java b/ruoyi-admin/src/main/java/com/ruoyi/job/RankJob.java index c86e637c..b723af1b 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/job/RankJob.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/job/RankJob.java @@ -93,6 +93,7 @@ public class RankJob { }catch (Exception e){ log.error("报错昨日主播统计失败!",e); } + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/op/BusOp.java b/ruoyi-admin/src/main/java/com/ruoyi/op/BusOp.java new file mode 100644 index 00000000..2b414992 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/op/BusOp.java @@ -0,0 +1,40 @@ +package com.ruoyi.op; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.cai.domain.User; +import com.ruoyi.cai.service.UserMemberService; +import com.ruoyi.cai.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class BusOp { + @Autowired + private UserService userService; + @Autowired + private UserMemberService userMemberService; + + public void refreshUserVipStatus(){ + int current = 0; + Page page = new Page<>(0, 10); + while (true){ + current++; + page.setCurrent(current); + Page userPage = userService.page(page); + List records = userPage.getRecords(); + if(records.isEmpty()){ + break; + } + for (User user : records) { + if(user.getNoGreet() != null && user.getRankHide() != null){ + if(user.getNoGreet().equals(1) || user.getRankHide().equals(1)){ + userMemberService.checkAndUpdateUser(user.getId()); + } + } + } + } + } + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/op/ImOp.java b/ruoyi-admin/src/main/java/com/ruoyi/op/ImOp.java index 6841c938..bb842372 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/op/ImOp.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/op/ImOp.java @@ -3,6 +3,7 @@ package com.ruoyi.op; import cn.hutool.core.util.IdUtil; import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.cai.domain.User; import com.ruoyi.cai.im.ImManager; import com.ruoyi.cai.service.UserService; @@ -86,4 +87,21 @@ public class ImOp { } } } + + public void refreshImUserInfo() { + int current = 0; + Page page = new Page<>(0, 10); + while (true){ + current++; + page.setCurrent(current); + Page userPage = userService.page(page); + List records = userPage.getRecords(); + if(records.isEmpty()){ + break; + } + for (User user : records) { + imManager.updateImInfo(user.getId(),user.getAvatar(),user.getNickname(),user.getGender()); + } + } + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/admin/op/BusOpController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/admin/op/BusOpController.java new file mode 100644 index 00000000..adcd7c89 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/admin/op/BusOpController.java @@ -0,0 +1,30 @@ +package com.ruoyi.web.controller.cai.admin.op; + + +import com.ruoyi.common.core.domain.R; +import com.ruoyi.op.BusOp; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/cai/op/bus") +@Slf4j +public class BusOpController { + + @Autowired + private BusOp busOp; + + @GetMapping("/refreshUserVipStatus") + public R refreshUserVipStatus(){ + busOp.refreshUserVipStatus(); + return R.ok(); + } + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/admin/op/ImOpController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/admin/op/ImOpController.java index e6e9823d..70b25174 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/admin/op/ImOpController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/admin/op/ImOpController.java @@ -26,6 +26,12 @@ public class ImOpController { return R.ok(); } + @GetMapping("/refreshImUserInfo") + public R refreshImUserInfo(){ + imOp.refreshImUserInfo(); + return R.ok(); + } + @GetMapping("/refreshImByUser") public R refreshImByUser(String usercode){ imOp.refreshImToken(usercode); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/YxNotifyController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/YxNotifyController.java index c94cb5e5..d2ef0a67 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/YxNotifyController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/YxNotifyController.java @@ -6,6 +6,8 @@ import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.cai.domain.UserChatRecord; import com.ruoyi.cai.executor.ExecutorConstant; +import com.ruoyi.cai.im.ImCheckResp; +import com.ruoyi.cai.im.ImManager; import com.ruoyi.cai.service.UserChatRecordService; import com.ruoyi.cai.service.UserOnlineService; import com.ruoyi.common.core.domain.R; @@ -36,6 +38,8 @@ public class YxNotifyController { private UserOnlineService onlineService; @Autowired private UserChatRecordService userChatRecordService; + @Autowired + private ImManager imManager; @PostMapping("/notify") @Operation(hidden = true) @@ -95,6 +99,37 @@ public class YxNotifyController { return R.ok(); } + @PostMapping("/check") + @Operation(hidden = true) + @SaIgnore + public ImCheckResp checkYx(HttpServletRequest request) throws IOException { + try { + String appKey = request.getHeader("AppKey"); + String curTime = request.getHeader("CurTime"); + String md5 = request.getHeader("MD5"); + String checkSum = request.getHeader("CheckSum"); + String requestBody = readBody(request); + boolean check = yunxinManager.checkNotify(requestBody, curTime, checkSum,md5); + if(!check){ + log.info("检验失败!"); + return ImCheckResp.ok(); + } + JSONObject body = JSON.parseObject(requestBody); + if(body == null){ + return ImCheckResp.ok(); + } + boolean message = imManager.filterMessage(body); + if(message){ + return ImCheckResp.ok(); + }else{ + return ImCheckResp.fail(); + } + }catch (Exception e){ + log.error("拦截IM失败!",e); + return ImCheckResp.ok(); + } + } + private String readBody(HttpServletRequest request) throws IOException { if (request.getContentLength() > 0) { byte[] bytes = StreamUtils.copyToByteArray(request.getInputStream()); diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/constant/RedisHttpConstant.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/constant/RedisHttpConstant.java index 3013c4d0..f28a7d23 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/constant/RedisHttpConstant.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/constant/RedisHttpConstant.java @@ -18,6 +18,8 @@ public class RedisHttpConstant { public static final String RECHARGE_RANK_REDIS = REDIS_P + "rechargeRank:%s:%s"; public static final String ANCHOR_COUNT_REDIS = REDIS_P + "anchorCount:%s"; public static final String CHECK_LOGIN_NUM = REDIS_P + "checkLoginNum:%s"; + public static final String MIN_USER_IM_REDIS = REDIS_P + "minUserIm:%s"; + public static final String CHAT_RECORD_CACHE_REDIS = REDIS_P + "chatRecordCache:%s"; public static final String HOME_RECOMMEND_TOP_REDIS = REDIS_P + "homeRecommendAnchorTop"; public static final String HOME_RECOMMEND_REDIS = REDIS_P + "homeRecommendAnchor"; diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/commom/user/MinUser.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/commom/user/MinUser.java new file mode 100644 index 00000000..65968325 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/commom/user/MinUser.java @@ -0,0 +1,13 @@ +package com.ruoyi.cai.dto.commom.user; + +import lombok.Data; + +@Data +public class MinUser { + private Long id; + private Integer gender; + /** + * 隐身模式 0-关闭 1-打开 + */ + private Integer noGreet; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/SystemConfigEnum.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/SystemConfigEnum.java index 57b9b89f..a8f33ff6 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/SystemConfigEnum.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/SystemConfigEnum.java @@ -92,6 +92,8 @@ public enum SystemConfigEnum { PASSWORD_ADMIN("", "公用密码",SystemConfigGroupEnum.SYSTEM), IPV6_FILTER("0", "是否开启IPV6请求拦截",SystemConfigGroupEnum.SYSTEM, new BooleanSystemConfigCheck()), IPV6_FILTER_PATH("/api/auth/login", "IPV6拦截路由配置(逗号分隔)",SystemConfigGroupEnum.SYSTEM, new BooleanSystemConfigCheck(),"textarea"), + VIP_PRIVATE_PLUS("0", "开启VIP隐私模式增强模式",SystemConfigGroupEnum.SYSTEM,new BooleanSystemConfigCheck()), + IM_FILTER_PLUS("4", "IM拦截配置(勿动,开发配置)",SystemConfigGroupEnum.SYSTEM), COS_DOMAIN("http://nono-1257812345.cos.ap-shanghai.myqcloud.com/", "文件系统域名前缀",SystemConfigGroupEnum.SYSTEM), SYSTEM_CUSTOMER_SERVICE("2,4", "系统客服",SystemConfigGroupEnum.SYSTEM), PRIVACY_AGREEMENT("/#/agreement/privacy", "隐私协议地址",SystemConfigGroupEnum.SYSTEM), diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/im/ImCheckResp.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/im/ImCheckResp.java new file mode 100644 index 00000000..0e353c68 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/im/ImCheckResp.java @@ -0,0 +1,20 @@ +package com.ruoyi.cai.im; + +import lombok.Data; + +@Data +public class ImCheckResp { + private int errCode = 0; + private int responseCode; + + public static ImCheckResp ok(){ + return new ImCheckResp(); + } + + public static ImCheckResp fail(){ + ImCheckResp resp = new ImCheckResp(); + resp.setErrCode(1); + resp.setResponseCode(20001); + return resp; + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/im/ImManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/im/ImManager.java index cd692574..6dc13959 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/im/ImManager.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/im/ImManager.java @@ -1,8 +1,13 @@ package com.ruoyi.cai.im; import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.cai.domain.UserChatRecord; +import com.ruoyi.cai.dto.commom.user.MinUser; import com.ruoyi.cai.enums.SystemConfigEnum; import com.ruoyi.cai.manager.SystemConfigManager; +import com.ruoyi.cai.service.UserChatRecordService; +import com.ruoyi.cai.service.UserService; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.yunxin.client.ImUserClient; import com.ruoyi.yunxin.client.ImUserRefClient; @@ -13,6 +18,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.Resource; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; @Slf4j @Component @@ -23,6 +32,10 @@ public class ImManager { private ImUserRefClient userRefClient; @Resource private ImUserClient imUserClient; + @Autowired + private UserService userService; + @Autowired + private UserChatRecordService userChatRecordService; public boolean blockUser(Long userId,Long blackUserId){ SetSpecialRelationReq req = new SetSpecialRelationReq(); @@ -110,4 +123,74 @@ public class ImManager { log.error("云信调用失败!【updateImInfo】",e); } } + + private final static Set INNER_USER_ID = new HashSet<>(); + + static { + INNER_USER_ID.add(2L); + INNER_USER_ID.add(4L); + } + + private final static String RECORD_ID_FILTER = "4"; + private final static String RECORD_ID_PLUS_FILTER = "5"; + private final static String GENDER_FILTER = "6"; + private final static String VIP_PLUS_FILTER = "7"; + + + // 4-recordId拦截 5-recordId加强拦截 6-性别拦截 7-vip加强拦截 + public boolean filterMessage(JSONObject body){ + String eventType = body.getString("eventType"); + String msgType = body.getString("msgType"); + Long fromUserId = body.getLong("fromAccount"); + Long toUserId = body.getLong("to"); + if(INNER_USER_ID.contains(fromUserId) || INNER_USER_ID.contains(toUserId)){ + return true; + } + if(!"1".equals(eventType)){ + return true; + } + if(!"TEXT".equals(msgType) && !"PICTURE".equals(msgType)){ + return true; + } + String filterString = systemConfigManager.getSystemConfig(SystemConfigEnum.IM_FILTER_PLUS); + if(StringUtils.isBlank(filterString)){ + return true; + } + Set filterSet = Arrays.stream(filterString.split(",")).collect(Collectors.toSet()); + if(filterSet.contains(RECORD_ID_FILTER)){ + String ext = body.getString("ext"); + JSONObject extJson = JSON.parseObject(ext); + String recordId = extJson.getString("recordId"); + if(StringUtils.isEmpty(recordId) || "0".equals(recordId)){ + log.error("IM拦截成功! 拦截到用户脚本请求数据={}",body.toJSONString()); + return false; + } + if(filterSet.contains(RECORD_ID_PLUS_FILTER)){ + UserChatRecord userChatRecord = userChatRecordService.getByCache(recordId); + if(userChatRecord == null){ + log.error("IM拦截成功! recordId增强模式 拦截到用户脚本请求数据={}",body.toJSONString()); + return false; + } + } + } + if(filterSet.contains(GENDER_FILTER)){ + MinUser fromUser = userService.getMinUserByIdBomCache(fromUserId); + MinUser toUser = userService.getMinUserByIdBomCache(toUserId); + if(fromUser == null){ + log.error("IM拦截成功! 发送人用户不存在={}",body.toJSONString()); + return false; + } + if(toUser == null){ + log.error("IM拦截成功! 接受人用户不存在={}",body.toJSONString()); + return false; + } + if(fromUser.getGender().equals(toUser.getGender())){ + log.error("IM拦截成功! 同性用户不能发送消息={}",body.toJSONString()); + return false; + } + } + return true; + } + + } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/ImService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/ImService.java index aae8f8e4..6be138d5 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/ImService.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/ImService.java @@ -13,6 +13,7 @@ import com.ruoyi.cai.dto.app.vo.ImResp; import com.ruoyi.cai.dto.commom.im.ImgContentDTO; import com.ruoyi.cai.enums.ChatTypeEnum; import com.ruoyi.cai.enums.GenderEnum; +import com.ruoyi.cai.enums.SystemConfigEnum; import com.ruoyi.cai.enums.UserMemberTypeEnum; import com.ruoyi.cai.enums.im.ImImgStatusEnum; import com.ruoyi.cai.mq.AmqpHttpProducer; @@ -57,6 +58,8 @@ public class ImService { private SensitiveWordBs sensitiveWordBs; @Autowired private UserChatFilterService userChatFilterService; + @Autowired + private SystemConfigManager systemConfigManager; public ImResp sendMessage(Long fromUserId, ImMessageDTO message) { ChatTypeEnum typeEnum = ChatTypeEnum.getByType(message.getType()); @@ -96,13 +99,6 @@ public class ImService { resp.setContent(message.getContent()); return resp; } - boolean fileType = typeEnum.isFileType(); - if(fileType){ - boolean star = userFollowService.checkStar(toUserId, fromUserId); - if(!star){ - throw new ServiceException("对方关注你才能发送图片|语音|视频"); - } - } if(fromUserId.equals(toUserId)){ throw new ServiceException("不能给自己发送哦!"); } @@ -134,6 +130,26 @@ public class ImService { if (fromUser.getIsAnchor().equals(0) && toUser.getIsAnchor().equals(0)) { throw new ServiceException("目前只能和女神私信!"); } + boolean star = false; + boolean starFlag = false; + boolean fileType = typeEnum.isFileType(); + if(fileType){ + star = userFollowService.checkStar(toUserId, fromUserId); + starFlag = true; + if(!star){ + throw new ServiceException("对方关注你才能发送图片|语音|视频"); + } + } + boolean vipPricePlus = systemConfigManager.getSystemConfigOfBool(SystemConfigEnum.VIP_PRIVATE_PLUS); + // 判断隐私模式 + if(vipPricePlus && fromUser.getNoGreet().equals(1)){ + if(!starFlag){ + star = userFollowService.checkStar(toUserId, fromUserId); + } + if(!star){ + throw new ServiceException("对方开启隐私模式,关注你才能发送消息"); + } + } int filter = 0; String content = message.getContent(); // 正则判断违规数据替换 diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/SystemConfigManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/SystemConfigManager.java index de903c11..917cd91e 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/SystemConfigManager.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/SystemConfigManager.java @@ -120,6 +120,15 @@ public class SystemConfigManager { } + public Set getSystemConfigOfSet(SystemConfigEnum systemConfig) { + String value = getSystemConfig(systemConfig); + if(StringUtils.isBlank(value)){ + value = systemConfig.getDefaultValue(); + } + return Stream.of(value.split(",")).collect(Collectors.toSet()); + } + + /** * 获取所有配置 * @return @@ -147,4 +156,5 @@ public class SystemConfigManager { } redisTemplate.opsForHash().put(RedisHttpConstant.SYSTEM_CONFIG, key,value); } + } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/UserMapper.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/UserMapper.java index d95456aa..64c8fea9 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/UserMapper.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/UserMapper.java @@ -8,6 +8,7 @@ import com.ruoyi.cai.dto.app.query.index.GreetQuery; import com.ruoyi.cai.dto.app.query.index.UserMapperQuery; import com.ruoyi.cai.dto.app.query.index.UserQuery; import com.ruoyi.cai.dto.app.vo.user.UserListVo; +import com.ruoyi.cai.dto.commom.user.MinUser; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -25,4 +26,6 @@ public interface UserMapper extends BaseMapper { Page greetPageApp(@Param("build") Page build, @Param("query") GreetQuery query); List getGreetNumId(@Param("userId") Long userId); + + MinUser getMinUserById(@Param("userId") Long userId); } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/UserChatRecordService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/UserChatRecordService.java index ff79f72f..bf920222 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/UserChatRecordService.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/UserChatRecordService.java @@ -13,7 +13,9 @@ import com.ruoyi.cai.dto.app.query.im.ImMessageDTO; */ public interface UserChatRecordService extends IService { - UserChatRecord saveRecord(User fromUser, User toUser,Long traceId, ImMessageDTO message); + UserChatRecord getByCache(String recordId); + + UserChatRecord saveRecord(User fromUser, User toUser, Long traceId, ImMessageDTO message); void clearChatRecord(Integer hours); } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/UserMemberService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/UserMemberService.java index 4ca0b5ba..5b43c4fc 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/UserMemberService.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/UserMemberService.java @@ -37,6 +37,8 @@ public interface UserMemberService extends IService { void relieveMember(Long id); + void checkAndUpdateUser(Long userId); + MemberInfoVo memberApp(Long userId, Integer type); void updateRankHide(UpdateRankHideReq updateRankHideReq); diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/UserService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/UserService.java index a1de393d..52b18fe9 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/UserService.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/UserService.java @@ -9,6 +9,7 @@ import com.ruoyi.cai.dto.app.query.index.UserQuery; import com.ruoyi.cai.dto.app.vo.user.UserInfoVo; import com.ruoyi.cai.dto.app.vo.user.UserListVo; import com.ruoyi.cai.dto.app.vo.user.UserMinInfoVo; +import com.ruoyi.cai.dto.commom.user.MinUser; import com.ruoyi.common.core.domain.PageQuery; /** @@ -21,6 +22,10 @@ public interface UserService extends IService { User getByUsername(String username); + MinUser getMinUserByIdBomCache(Long userId); + + MinUser getMinUserById(Long userId); + Page pageAdmin(PageQuery pageQuery, UserAdminVo query); Page pageApp(PageQuery page, UserQuery query); diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserChatRecordServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserChatRecordServiceImpl.java index c4e561f2..c5affa60 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserChatRecordServiceImpl.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserChatRecordServiceImpl.java @@ -2,6 +2,7 @@ package com.ruoyi.cai.service.impl; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.cai.constant.RedisHttpConstant; import com.ruoyi.cai.domain.User; import com.ruoyi.cai.domain.UserChatRecord; import com.ruoyi.cai.dto.app.query.im.ImMessageDTO; @@ -9,10 +10,14 @@ import com.ruoyi.cai.mapper.UserChatRecordMapper; import com.ruoyi.cai.service.UserChatRecordService; import lombok.RequiredArgsConstructor; import org.apache.commons.collections4.CollectionUtils; +import org.redisson.api.RBucket; +import org.redisson.api.RedissonClient; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.List; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** @@ -25,6 +30,16 @@ import java.util.stream.Collectors; @Service public class UserChatRecordServiceImpl extends ServiceImpl implements UserChatRecordService { + @Autowired + private RedissonClient redissonClient; + + @Override + public UserChatRecord getByCache(String recordId){ + String key = String.format(RedisHttpConstant.CHAT_RECORD_CACHE_REDIS, recordId); + RBucket bucket = redissonClient.getBucket(key); + return bucket.get(); + } + @Override public UserChatRecord saveRecord(User fromUser, User toUser,Long traceId, ImMessageDTO message) { UserChatRecord userChatRecord = new UserChatRecord(); @@ -37,6 +52,9 @@ public class UserChatRecordServiceImpl extends ServiceImpl bucket = redissonClient.getBucket(key); + bucket.set(userChatRecord,10, TimeUnit.MINUTES); return userChatRecord; } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserMemberServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserMemberServiceImpl.java index 32a98d0d..306e8316 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserMemberServiceImpl.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserMemberServiceImpl.java @@ -102,6 +102,17 @@ public class UserMemberServiceImpl extends ServiceImpl implements Us private ImManager imManager; @Autowired private YunxinHttpService yunxinHttpService; + @Autowired + private RedissonClient redissonClient; @Override public User getByUsername(String username) { @@ -88,6 +95,30 @@ public class UserServiceImpl extends ServiceImpl implements Us .eq(User::getMobile,username)); } + @Override + public MinUser getMinUserByIdBomCache(Long userId){ + if(userId == null){ + return null; + } + String redisKey = String.format(RedisHttpConstant.MIN_USER_IM_REDIS, userId); + RBucket bucket = redissonClient.getBucket(redisKey); + MinUser user = bucket.get(); + if(user != null){ + return user; + } + MinUser minUser = this.getMinUserById(userId); + if(minUser == null){ + return null; + } + bucket.set(minUser,3, TimeUnit.HOURS); + return minUser; + } + + @Override + public MinUser getMinUserById(Long userId) { + return baseMapper.getMinUserById(userId); + } + @Override public Page pageAdmin(PageQuery pageQuery, UserAdminVo query) { return baseMapper.pageAdmin(pageQuery.build(),query); diff --git a/ruoyi-cai/src/main/resources/mapper/cai/UserMapper.xml b/ruoyi-cai/src/main/resources/mapper/cai/UserMapper.xml index 7675f717..9130a112 100644 --- a/ruoyi-cai/src/main/resources/mapper/cai/UserMapper.xml +++ b/ruoyi-cai/src/main/resources/mapper/cai/UserMapper.xml @@ -88,6 +88,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" order by t1.update_time desc limit 20 + diff --git a/ruoyi-yunxin/src/main/java/com/ruoyi/yunxin/manager/YunxinManager.java b/ruoyi-yunxin/src/main/java/com/ruoyi/yunxin/manager/YunxinManager.java index 36ffb480..fdb33903 100644 --- a/ruoyi-yunxin/src/main/java/com/ruoyi/yunxin/manager/YunxinManager.java +++ b/ruoyi-yunxin/src/main/java/com/ruoyi/yunxin/manager/YunxinManager.java @@ -1,11 +1,18 @@ package com.ruoyi.yunxin.manager; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.yunxin.config.YunxinProperties; import com.ruoyi.yunxin.util.CheckSumBuilder; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; + @Component @Slf4j public class YunxinManager {