From 2cfa18a4e368f1d0a71cb19498c018b4f18765d7 Mon Sep 17 00:00:00 2001 From: 77 <77@77.com> Date: Fri, 3 May 2024 21:22:59 +0800 Subject: [PATCH] init --- .../src/main/resources/application.yml | 4 +- .../java/com/ruoyi/test/business/ImTest.java | 19 ++++ .../com/ruoyi/common/helper/LoginHelper.java | 10 +++ .../dto/app/userstar/vo/UserStarListVo.java | 2 +- .../ruoyi/xq/dto/common/sms/SmsCodeReq.java | 3 +- .../src/main/java/com/ruoyi/xq/im/ImOp.java | 89 +++++++++++++++++++ .../java/com/ruoyi/xq/manager/ImManager.java | 45 ++++++++++ .../xq/service/impl/UserStarServiceImpl.java | 16 +++- .../resources/mapper/xq/UserStarMapper.xml | 4 +- 9 files changed, 185 insertions(+), 7 deletions(-) create mode 100644 ruoyi-admin/src/test/java/com/ruoyi/test/business/ImTest.java create mode 100644 ruoyi-xq/src/main/java/com/ruoyi/xq/im/ImOp.java diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index ef070c0..c5e0660 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -256,8 +256,8 @@ management: mail: enabled: false yunxin: - app-key: 748496374b04344194c68b53e411e09c123 - app-secret: 77c09917d2de + app-key: d2de1a747ce5ffdf99517c6f9f16fd4e + app-secret: ef2b67d8cd8e wx: pay: app-id: wxefe4087f9c1e0fd7 diff --git a/ruoyi-admin/src/test/java/com/ruoyi/test/business/ImTest.java b/ruoyi-admin/src/test/java/com/ruoyi/test/business/ImTest.java new file mode 100644 index 0000000..59d5005 --- /dev/null +++ b/ruoyi-admin/src/test/java/com/ruoyi/test/business/ImTest.java @@ -0,0 +1,19 @@ +package com.ruoyi.test.business; + +import com.ruoyi.xq.im.ImOp; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.stereotype.Component; + +@SpringBootTest +@Slf4j +public class ImTest { + @Autowired + private ImOp imOp; + @Test + public void refresh(){ + imOp.refreshIm(); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java b/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java index b2a863e..002eaac 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java @@ -13,6 +13,7 @@ import com.ruoyi.common.enums.DeviceType; import com.ruoyi.common.enums.UserType; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; /** * 登录鉴权助手 @@ -26,6 +27,7 @@ import lombok.NoArgsConstructor; * * @author Lion Li */ +@Slf4j @NoArgsConstructor(access = AccessLevel.PRIVATE) public class LoginHelper { @@ -67,6 +69,14 @@ public class LoginHelper { StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser); } + public static void logoutApp(Long userId){ + try { + StpUtil.logout(UserType.APP_USER.getUserType() + ":" + userId); + }catch (Exception e){ + log.error("强制T人下线失败! userId={}",userId,e); + } + } + /** * 获取用户(多级缓存) */ diff --git a/ruoyi-xq/src/main/java/com/ruoyi/xq/dto/app/userstar/vo/UserStarListVo.java b/ruoyi-xq/src/main/java/com/ruoyi/xq/dto/app/userstar/vo/UserStarListVo.java index c12ef59..3432d37 100644 --- a/ruoyi-xq/src/main/java/com/ruoyi/xq/dto/app/userstar/vo/UserStarListVo.java +++ b/ruoyi-xq/src/main/java/com/ruoyi/xq/dto/app/userstar/vo/UserStarListVo.java @@ -20,7 +20,7 @@ public class UserStarListVo { @Schema(description = "生日-缩减显示") private String birthdayStr; @Schema(description = "居住城市") - private String residenceCity; + private String residenceCityName; @Schema(description = "学历") private Integer education; @Schema(description = "职业") diff --git a/ruoyi-xq/src/main/java/com/ruoyi/xq/dto/common/sms/SmsCodeReq.java b/ruoyi-xq/src/main/java/com/ruoyi/xq/dto/common/sms/SmsCodeReq.java index df8acde..9ec8ee0 100644 --- a/ruoyi-xq/src/main/java/com/ruoyi/xq/dto/common/sms/SmsCodeReq.java +++ b/ruoyi-xq/src/main/java/com/ruoyi/xq/dto/common/sms/SmsCodeReq.java @@ -4,11 +4,12 @@ import com.ruoyi.xq.enums.common.CodeEnum; import lombok.Data; import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; @Data public class SmsCodeReq { - @NotEmpty(message = "参数异常") + @NotNull(message = "参数异常") private CodeEnum smsType; @NotEmpty(message = "手机号不能为空") private String mobile; diff --git a/ruoyi-xq/src/main/java/com/ruoyi/xq/im/ImOp.java b/ruoyi-xq/src/main/java/com/ruoyi/xq/im/ImOp.java new file mode 100644 index 0000000..d45b86d --- /dev/null +++ b/ruoyi-xq/src/main/java/com/ruoyi/xq/im/ImOp.java @@ -0,0 +1,89 @@ +package com.ruoyi.xq.im; + +import cn.hutool.core.util.IdUtil; +import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.helper.LoginHelper; +import com.ruoyi.xq.domain.User; +import com.ruoyi.xq.manager.ImManager; +import com.ruoyi.xq.service.UserService; +import com.ruoyi.yunxin.client.ImUserClient; +import com.ruoyi.yunxin.req.CreateUserReq; +import com.ruoyi.yunxin.req.UpdateTokenReq; +import com.ruoyi.yunxin.resp.YxCommonR; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@Slf4j +public class ImOp { + + @Autowired + private UserService userService; + + @Autowired + private ImUserClient imUserClient; + + @Autowired + private ImManager imManager; + + + public void refreshImToken(String usercode){ + User user = userService.getByUsercode(usercode); + if(user == null){ + throw new ServiceException("用户不存在"); + } + String imToken = IdUtil.simpleUUID(); + userService.update(Wrappers.lambdaUpdate(User.class).eq(User::getId,user.getId()).set(User::getImToken, imToken)); + this.register(user.getId(),imToken,user.getNickname()); + imManager.updateImInfo(user.getId(),user.getAvatar(),user.getNickname(),user.getGender()); + LoginHelper.logoutApp(user.getId()); + } + + public void refreshImNoSaveToken(){ + List list = userService.list(); + for (User user : list) { + this.register(user.getId(),user.getImToken(),user.getNickname()); + imManager.updateImInfo(user.getId(),user.getAvatar(),user.getNickname(),user.getGender()); + } + } + + + public void refreshIm(){ + List list = userService.list(); + for (User user : list) { + String imToken = IdUtil.simpleUUID(); + userService.update(Wrappers.lambdaUpdate(User.class).eq(User::getId,user.getId()).set(User::getImToken, imToken)); + this.register(user.getId(),imToken,user.getNickname()); + imManager.updateImInfo(user.getId(),user.getAvatar(),user.getNickname(),user.getGender()); + LoginHelper.logoutApp(user.getId()); + } + } + + public void register(Long userId,String token,String nickname){ + CreateUserReq req = new CreateUserReq(); + req.setAccid(userId+""); + req.setToken(token); + req.setName(nickname); + YxCommonR r = imUserClient.createUser(req); + if(!r.isSuccess()){ + if(r.getCode() == 414){ + UpdateTokenReq req1 = new UpdateTokenReq(); + req1.setAccid(userId+""); + req1.setToken(token); + YxCommonR commonR = imUserClient.updateToken(req1); + if(!commonR.isSuccess()){ + log.error("刷新云token失败,{}", JSON.toJSONString(commonR)); + throw new ServiceException("注册失败,云信异常"); + } + }else{ + log.error("创建云信账号失败,{}", JSON.toJSONString(r)); + throw new ServiceException("注册失败,云信异常"); + } + } + } +} diff --git a/ruoyi-xq/src/main/java/com/ruoyi/xq/manager/ImManager.java b/ruoyi-xq/src/main/java/com/ruoyi/xq/manager/ImManager.java index dbc6ddb..cdea004 100644 --- a/ruoyi-xq/src/main/java/com/ruoyi/xq/manager/ImManager.java +++ b/ruoyi-xq/src/main/java/com/ruoyi/xq/manager/ImManager.java @@ -1,22 +1,30 @@ package com.ruoyi.xq.manager; +import com.alibaba.fastjson2.JSON; import com.github.houbb.sensitive.word.bs.SensitiveWordBs; import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.xq.domain.User; import com.ruoyi.xq.domain.UserChatRecord; import com.ruoyi.xq.domain.UserVip; import com.ruoyi.xq.dto.app.im.ImMessageDTO; import com.ruoyi.xq.dto.app.im.ImResp; import com.ruoyi.xq.enums.ErrorEnum; +import com.ruoyi.xq.enums.common.SystemConfigEnum; import com.ruoyi.xq.service.UserChatFilterService; import com.ruoyi.xq.service.UserChatRecordService; import com.ruoyi.xq.service.UserService; import com.ruoyi.xq.service.UserVipService; +import com.ruoyi.yunxin.client.ImUserRefClient; import com.ruoyi.yunxin.enums.YxImTypeEnum; +import com.ruoyi.yunxin.req.UpdateUinfoReq; +import com.ruoyi.yunxin.resp.YxCommonR; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import javax.annotation.Resource; + @Component @Slf4j public class ImManager { @@ -31,6 +39,10 @@ public class ImManager { private UserService userService; @Autowired private UserVipService userVipService; + @Autowired + private SystemConfigManager systemConfigManager; + @Resource + private ImUserRefClient userRefClient; public ImResp sendMessage(ImMessageDTO message) { Long fromUserId = message.getFromUserId(); @@ -101,4 +113,37 @@ public class ImManager { } + public void updateImInfo(Long userId, String avatar, String nickname, Integer gender) { + if(userId == null){ + return; + } + if(StringUtils.isBlank(avatar) && StringUtils.isBlank(nickname) && gender == null){ + return; + } + try { + UpdateUinfoReq uinfoReq = new UpdateUinfoReq(); + uinfoReq.setAccid(userId+""); + if(StringUtils.isNotBlank(avatar)){ + String icon = avatar; + if(!avatar.startsWith("http")){ + String cosDomain = systemConfigManager.getSystemConfig(SystemConfigEnum.COS_DOMAIN); + icon = cosDomain + avatar; + } + uinfoReq.setIcon(icon); + } + if(StringUtils.isNotBlank(nickname)){ + uinfoReq.setName(nickname); + } + if(gender != null){ + uinfoReq.setGender(gender+""); + } + YxCommonR r = userRefClient.updateUinfo(uinfoReq); + if(!r.isSuccess()){ + log.error("云信更新失败,【updateImInfo】需要检查!userId={},avatar={},nickname={} data={}", + userId, avatar, nickname, JSON.toJSONString(r)); + } + }catch (Exception e){ + log.error("云信调用失败!【updateImInfo】",e); + } + } } diff --git a/ruoyi-xq/src/main/java/com/ruoyi/xq/service/impl/UserStarServiceImpl.java b/ruoyi-xq/src/main/java/com/ruoyi/xq/service/impl/UserStarServiceImpl.java index 05aca0d..32991e1 100644 --- a/ruoyi-xq/src/main/java/com/ruoyi/xq/service/impl/UserStarServiceImpl.java +++ b/ruoyi-xq/src/main/java/com/ruoyi/xq/service/impl/UserStarServiceImpl.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.xq.domain.User; import com.ruoyi.xq.domain.UserStar; import com.ruoyi.xq.dto.app.userstar.UserStarQuery; @@ -13,9 +14,12 @@ import com.ruoyi.xq.dto.app.userstar.vo.UserStarListVo; import com.ruoyi.xq.mapper.UserStarMapper; import com.ruoyi.xq.service.UserService; import com.ruoyi.xq.service.UserStarService; +import org.apache.commons.lang3.BooleanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; + /** * 用户关注Service业务层处理 * @@ -65,7 +69,17 @@ public class UserStarServiceImpl extends ServiceImpl im if(query.getQueryType() == 1){ return baseMapper.selectMyStar(pageQuery.build(),query); }else if(query.getQueryType() == 2){ - return baseMapper.selectStarMe(pageQuery.build(),query); + Long userId = LoginHelper.getUserId(); + User user = userService.getById(userId); + Page page = baseMapper.selectStarMe(pageQuery.build(), query); + if(user == null || BooleanUtils.isNotTrue(user.getOpenVip())){ + List records = page.getRecords(); + for (UserStarListVo record : records) { + record.setUserId(null); + record.setNickname("***"); + } + } + return page; }else{ throw new ServiceException("参数异常"); } diff --git a/ruoyi-xq/src/main/resources/mapper/xq/UserStarMapper.xml b/ruoyi-xq/src/main/resources/mapper/xq/UserStarMapper.xml index eb57016..3bd4444 100644 --- a/ruoyi-xq/src/main/resources/mapper/xq/UserStarMapper.xml +++ b/ruoyi-xq/src/main/resources/mapper/xq/UserStarMapper.xml @@ -5,14 +5,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"