This commit is contained in:
77
2024-05-03 21:22:59 +08:00
parent 3df973e469
commit 2cfa18a4e3
9 changed files with 185 additions and 7 deletions

View File

@@ -256,8 +256,8 @@ management:
mail: mail:
enabled: false enabled: false
yunxin: yunxin:
app-key: 748496374b04344194c68b53e411e09c123 app-key: d2de1a747ce5ffdf99517c6f9f16fd4e
app-secret: 77c09917d2de app-secret: ef2b67d8cd8e
wx: wx:
pay: pay:
app-id: wxefe4087f9c1e0fd7 app-id: wxefe4087f9c1e0fd7

View File

@@ -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();
}
}

View File

@@ -13,6 +13,7 @@ import com.ruoyi.common.enums.DeviceType;
import com.ruoyi.common.enums.UserType; import com.ruoyi.common.enums.UserType;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/** /**
* 登录鉴权助手 * 登录鉴权助手
@@ -26,6 +27,7 @@ import lombok.NoArgsConstructor;
* *
* @author Lion Li * @author Lion Li
*/ */
@Slf4j
@NoArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE)
public class LoginHelper { public class LoginHelper {
@@ -67,6 +69,14 @@ public class LoginHelper {
StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser); 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);
}
}
/** /**
* 获取用户(多级缓存) * 获取用户(多级缓存)
*/ */

View File

@@ -20,7 +20,7 @@ public class UserStarListVo {
@Schema(description = "生日-缩减显示") @Schema(description = "生日-缩减显示")
private String birthdayStr; private String birthdayStr;
@Schema(description = "居住城市") @Schema(description = "居住城市")
private String residenceCity; private String residenceCityName;
@Schema(description = "学历") @Schema(description = "学历")
private Integer education; private Integer education;
@Schema(description = "职业") @Schema(description = "职业")

View File

@@ -4,11 +4,12 @@ import com.ruoyi.xq.enums.common.CodeEnum;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@Data @Data
public class SmsCodeReq { public class SmsCodeReq {
@NotEmpty(message = "参数异常") @NotNull(message = "参数异常")
private CodeEnum smsType; private CodeEnum smsType;
@NotEmpty(message = "手机号不能为空") @NotEmpty(message = "手机号不能为空")
private String mobile; private String mobile;

View File

@@ -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<User> 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<User> 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("注册失败,云信异常");
}
}
}
}

View File

@@ -1,22 +1,30 @@
package com.ruoyi.xq.manager; package com.ruoyi.xq.manager;
import com.alibaba.fastjson2.JSON;
import com.github.houbb.sensitive.word.bs.SensitiveWordBs; import com.github.houbb.sensitive.word.bs.SensitiveWordBs;
import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.xq.domain.User; import com.ruoyi.xq.domain.User;
import com.ruoyi.xq.domain.UserChatRecord; import com.ruoyi.xq.domain.UserChatRecord;
import com.ruoyi.xq.domain.UserVip; import com.ruoyi.xq.domain.UserVip;
import com.ruoyi.xq.dto.app.im.ImMessageDTO; import com.ruoyi.xq.dto.app.im.ImMessageDTO;
import com.ruoyi.xq.dto.app.im.ImResp; import com.ruoyi.xq.dto.app.im.ImResp;
import com.ruoyi.xq.enums.ErrorEnum; import com.ruoyi.xq.enums.ErrorEnum;
import com.ruoyi.xq.enums.common.SystemConfigEnum;
import com.ruoyi.xq.service.UserChatFilterService; import com.ruoyi.xq.service.UserChatFilterService;
import com.ruoyi.xq.service.UserChatRecordService; import com.ruoyi.xq.service.UserChatRecordService;
import com.ruoyi.xq.service.UserService; import com.ruoyi.xq.service.UserService;
import com.ruoyi.xq.service.UserVipService; import com.ruoyi.xq.service.UserVipService;
import com.ruoyi.yunxin.client.ImUserRefClient;
import com.ruoyi.yunxin.enums.YxImTypeEnum; import com.ruoyi.yunxin.enums.YxImTypeEnum;
import com.ruoyi.yunxin.req.UpdateUinfoReq;
import com.ruoyi.yunxin.resp.YxCommonR;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component @Component
@Slf4j @Slf4j
public class ImManager { public class ImManager {
@@ -31,6 +39,10 @@ public class ImManager {
private UserService userService; private UserService userService;
@Autowired @Autowired
private UserVipService userVipService; private UserVipService userVipService;
@Autowired
private SystemConfigManager systemConfigManager;
@Resource
private ImUserRefClient userRefClient;
public ImResp sendMessage(ImMessageDTO message) { public ImResp sendMessage(ImMessageDTO message) {
Long fromUserId = message.getFromUserId(); 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);
}
}
} }

View File

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.xq.domain.User; import com.ruoyi.xq.domain.User;
import com.ruoyi.xq.domain.UserStar; import com.ruoyi.xq.domain.UserStar;
import com.ruoyi.xq.dto.app.userstar.UserStarQuery; 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.mapper.UserStarMapper;
import com.ruoyi.xq.service.UserService; import com.ruoyi.xq.service.UserService;
import com.ruoyi.xq.service.UserStarService; import com.ruoyi.xq.service.UserStarService;
import org.apache.commons.lang3.BooleanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
/** /**
* 用户关注Service业务层处理 * 用户关注Service业务层处理
* *
@@ -65,7 +69,17 @@ public class UserStarServiceImpl extends ServiceImpl<UserStarMapper,UserStar> im
if(query.getQueryType() == 1){ if(query.getQueryType() == 1){
return baseMapper.selectMyStar(pageQuery.build(),query); return baseMapper.selectMyStar(pageQuery.build(),query);
}else if(query.getQueryType() == 2){ }else if(query.getQueryType() == 2){
return baseMapper.selectStarMe(pageQuery.build(),query); Long userId = LoginHelper.getUserId();
User user = userService.getById(userId);
Page<UserStarListVo> page = baseMapper.selectStarMe(pageQuery.build(), query);
if(user == null || BooleanUtils.isNotTrue(user.getOpenVip())){
List<UserStarListVo> records = page.getRecords();
for (UserStarListVo record : records) {
record.setUserId(null);
record.setNickname("***");
}
}
return page;
}else{ }else{
throw new ServiceException("参数异常"); throw new ServiceException("参数异常");
} }

View File

@@ -5,14 +5,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<mapper namespace="com.ruoyi.xq.mapper.UserStarMapper"> <mapper namespace="com.ruoyi.xq.mapper.UserStarMapper">
<select id="selectMyStar" resultType="com.ruoyi.xq.dto.app.userstar.vo.UserStarListVo"> <select id="selectMyStar" resultType="com.ruoyi.xq.dto.app.userstar.vo.UserStarListVo">
select t2.id as user_id, t2.avatar, t2.gender, t2.nickname, t2.birthday, t2.residence_city, select t2.id as user_id, t2.avatar, t2.gender, t2.nickname, t2.birthday, t2.residence_city_name,
t2.education, t2.profession t2.education, t2.profession
from xq_user_star t1 from xq_user_star t1
join xq_user t2 on t1.star_user_id = t2.id join xq_user t2 on t1.star_user_id = t2.id
where t1.user_id = #{query.userId} where t1.user_id = #{query.userId}
</select> </select>
<select id="selectStarMe" resultType="com.ruoyi.xq.dto.app.userstar.vo.UserStarListVo"> <select id="selectStarMe" resultType="com.ruoyi.xq.dto.app.userstar.vo.UserStarListVo">
select t2.id as user_id, t2.avatar, t2.gender, t2.nickname, t2.birthday, t2.residence_city, select t2.id as user_id, t2.avatar, t2.gender, t2.nickname, t2.birthday, t2.residence_city_name,
t2.education, t2.profession t2.education, t2.profession
from xq_user_star t1 from xq_user_star t1
join xq_user t2 on t1.user_id = t2.id join xq_user t2 on t1.user_id = t2.id