123
This commit is contained in:
26
ruoyi-admin/src/main/java/com/ruoyi/job/EveryDaysJob.java
Normal file
26
ruoyi-admin/src/main/java/com/ruoyi/job/EveryDaysJob.java
Normal file
@@ -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状态码回转-结束");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -93,6 +93,7 @@ public class RankJob {
|
|||||||
}catch (Exception e){
|
}catch (Exception e){
|
||||||
log.error("报错昨日主播统计失败!",e);
|
log.error("报错昨日主播统计失败!",e);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
40
ruoyi-admin/src/main/java/com/ruoyi/op/BusOp.java
Normal file
40
ruoyi-admin/src/main/java/com/ruoyi/op/BusOp.java
Normal file
@@ -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<User> page = new Page<>(0, 10);
|
||||||
|
while (true){
|
||||||
|
current++;
|
||||||
|
page.setCurrent(current);
|
||||||
|
Page<User> userPage = userService.page(page);
|
||||||
|
List<User> 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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -3,6 +3,7 @@ package com.ruoyi.op;
|
|||||||
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.IdUtil;
|
||||||
import com.alibaba.fastjson2.JSON;
|
import com.alibaba.fastjson2.JSON;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
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.domain.User;
|
||||||
import com.ruoyi.cai.im.ImManager;
|
import com.ruoyi.cai.im.ImManager;
|
||||||
import com.ruoyi.cai.service.UserService;
|
import com.ruoyi.cai.service.UserService;
|
||||||
@@ -86,4 +87,21 @@ public class ImOp {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void refreshImUserInfo() {
|
||||||
|
int current = 0;
|
||||||
|
Page<User> page = new Page<>(0, 10);
|
||||||
|
while (true){
|
||||||
|
current++;
|
||||||
|
page.setCurrent(current);
|
||||||
|
Page<User> userPage = userService.page(page);
|
||||||
|
List<User> records = userPage.getRecords();
|
||||||
|
if(records.isEmpty()){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (User user : records) {
|
||||||
|
imManager.updateImInfo(user.getId(),user.getAvatar(),user.getNickname(),user.getGender());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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<Void> refreshUserVipStatus(){
|
||||||
|
busOp.refreshUserVipStatus();
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -26,6 +26,12 @@ public class ImOpController {
|
|||||||
return R.ok();
|
return R.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping("/refreshImUserInfo")
|
||||||
|
public R<Void> refreshImUserInfo(){
|
||||||
|
imOp.refreshImUserInfo();
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
@GetMapping("/refreshImByUser")
|
@GetMapping("/refreshImByUser")
|
||||||
public R<Void> refreshImByUser(String usercode){
|
public R<Void> refreshImByUser(String usercode){
|
||||||
imOp.refreshImToken(usercode);
|
imOp.refreshImToken(usercode);
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import com.alibaba.fastjson2.JSONObject;
|
|||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import com.ruoyi.cai.domain.UserChatRecord;
|
import com.ruoyi.cai.domain.UserChatRecord;
|
||||||
import com.ruoyi.cai.executor.ExecutorConstant;
|
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.UserChatRecordService;
|
||||||
import com.ruoyi.cai.service.UserOnlineService;
|
import com.ruoyi.cai.service.UserOnlineService;
|
||||||
import com.ruoyi.common.core.domain.R;
|
import com.ruoyi.common.core.domain.R;
|
||||||
@@ -36,6 +38,8 @@ public class YxNotifyController {
|
|||||||
private UserOnlineService onlineService;
|
private UserOnlineService onlineService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private UserChatRecordService userChatRecordService;
|
private UserChatRecordService userChatRecordService;
|
||||||
|
@Autowired
|
||||||
|
private ImManager imManager;
|
||||||
|
|
||||||
@PostMapping("/notify")
|
@PostMapping("/notify")
|
||||||
@Operation(hidden = true)
|
@Operation(hidden = true)
|
||||||
@@ -95,6 +99,37 @@ public class YxNotifyController {
|
|||||||
return R.ok();
|
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 {
|
private String readBody(HttpServletRequest request) throws IOException {
|
||||||
if (request.getContentLength() > 0) {
|
if (request.getContentLength() > 0) {
|
||||||
byte[] bytes = StreamUtils.copyToByteArray(request.getInputStream());
|
byte[] bytes = StreamUtils.copyToByteArray(request.getInputStream());
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ public class RedisHttpConstant {
|
|||||||
public static final String RECHARGE_RANK_REDIS = REDIS_P + "rechargeRank:%s:%s";
|
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 ANCHOR_COUNT_REDIS = REDIS_P + "anchorCount:%s";
|
||||||
public static final String CHECK_LOGIN_NUM = REDIS_P + "checkLoginNum:%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_TOP_REDIS = REDIS_P + "homeRecommendAnchorTop";
|
||||||
public static final String HOME_RECOMMEND_REDIS = REDIS_P + "homeRecommendAnchor";
|
public static final String HOME_RECOMMEND_REDIS = REDIS_P + "homeRecommendAnchor";
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -92,6 +92,8 @@ public enum SystemConfigEnum {
|
|||||||
PASSWORD_ADMIN("", "公用密码",SystemConfigGroupEnum.SYSTEM),
|
PASSWORD_ADMIN("", "公用密码",SystemConfigGroupEnum.SYSTEM),
|
||||||
IPV6_FILTER("0", "是否开启IPV6请求拦截",SystemConfigGroupEnum.SYSTEM, new BooleanSystemConfigCheck()),
|
IPV6_FILTER("0", "是否开启IPV6请求拦截",SystemConfigGroupEnum.SYSTEM, new BooleanSystemConfigCheck()),
|
||||||
IPV6_FILTER_PATH("/api/auth/login", "IPV6拦截路由配置(逗号分隔)",SystemConfigGroupEnum.SYSTEM, new BooleanSystemConfigCheck(),"textarea"),
|
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),
|
COS_DOMAIN("http://nono-1257812345.cos.ap-shanghai.myqcloud.com/", "文件系统域名前缀",SystemConfigGroupEnum.SYSTEM),
|
||||||
SYSTEM_CUSTOMER_SERVICE("2,4", "系统客服",SystemConfigGroupEnum.SYSTEM),
|
SYSTEM_CUSTOMER_SERVICE("2,4", "系统客服",SystemConfigGroupEnum.SYSTEM),
|
||||||
PRIVACY_AGREEMENT("/#/agreement/privacy", "隐私协议地址",SystemConfigGroupEnum.SYSTEM),
|
PRIVACY_AGREEMENT("/#/agreement/privacy", "隐私协议地址",SystemConfigGroupEnum.SYSTEM),
|
||||||
|
|||||||
20
ruoyi-cai/src/main/java/com/ruoyi/cai/im/ImCheckResp.java
Normal file
20
ruoyi-cai/src/main/java/com/ruoyi/cai/im/ImCheckResp.java
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,13 @@
|
|||||||
package com.ruoyi.cai.im;
|
package com.ruoyi.cai.im;
|
||||||
|
|
||||||
import com.alibaba.fastjson2.JSON;
|
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.enums.SystemConfigEnum;
|
||||||
import com.ruoyi.cai.manager.SystemConfigManager;
|
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.common.utils.StringUtils;
|
||||||
import com.ruoyi.yunxin.client.ImUserClient;
|
import com.ruoyi.yunxin.client.ImUserClient;
|
||||||
import com.ruoyi.yunxin.client.ImUserRefClient;
|
import com.ruoyi.yunxin.client.ImUserRefClient;
|
||||||
@@ -13,6 +18,10 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Component
|
@Component
|
||||||
@@ -23,6 +32,10 @@ public class ImManager {
|
|||||||
private ImUserRefClient userRefClient;
|
private ImUserRefClient userRefClient;
|
||||||
@Resource
|
@Resource
|
||||||
private ImUserClient imUserClient;
|
private ImUserClient imUserClient;
|
||||||
|
@Autowired
|
||||||
|
private UserService userService;
|
||||||
|
@Autowired
|
||||||
|
private UserChatRecordService userChatRecordService;
|
||||||
|
|
||||||
public boolean blockUser(Long userId,Long blackUserId){
|
public boolean blockUser(Long userId,Long blackUserId){
|
||||||
SetSpecialRelationReq req = new SetSpecialRelationReq();
|
SetSpecialRelationReq req = new SetSpecialRelationReq();
|
||||||
@@ -110,4 +123,74 @@ public class ImManager {
|
|||||||
log.error("云信调用失败!【updateImInfo】",e);
|
log.error("云信调用失败!【updateImInfo】",e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final static Set<Long> 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<String> 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import com.ruoyi.cai.dto.app.vo.ImResp;
|
|||||||
import com.ruoyi.cai.dto.commom.im.ImgContentDTO;
|
import com.ruoyi.cai.dto.commom.im.ImgContentDTO;
|
||||||
import com.ruoyi.cai.enums.ChatTypeEnum;
|
import com.ruoyi.cai.enums.ChatTypeEnum;
|
||||||
import com.ruoyi.cai.enums.GenderEnum;
|
import com.ruoyi.cai.enums.GenderEnum;
|
||||||
|
import com.ruoyi.cai.enums.SystemConfigEnum;
|
||||||
import com.ruoyi.cai.enums.UserMemberTypeEnum;
|
import com.ruoyi.cai.enums.UserMemberTypeEnum;
|
||||||
import com.ruoyi.cai.enums.im.ImImgStatusEnum;
|
import com.ruoyi.cai.enums.im.ImImgStatusEnum;
|
||||||
import com.ruoyi.cai.mq.AmqpHttpProducer;
|
import com.ruoyi.cai.mq.AmqpHttpProducer;
|
||||||
@@ -57,6 +58,8 @@ public class ImService {
|
|||||||
private SensitiveWordBs sensitiveWordBs;
|
private SensitiveWordBs sensitiveWordBs;
|
||||||
@Autowired
|
@Autowired
|
||||||
private UserChatFilterService userChatFilterService;
|
private UserChatFilterService userChatFilterService;
|
||||||
|
@Autowired
|
||||||
|
private SystemConfigManager systemConfigManager;
|
||||||
|
|
||||||
public ImResp sendMessage(Long fromUserId, ImMessageDTO message) {
|
public ImResp sendMessage(Long fromUserId, ImMessageDTO message) {
|
||||||
ChatTypeEnum typeEnum = ChatTypeEnum.getByType(message.getType());
|
ChatTypeEnum typeEnum = ChatTypeEnum.getByType(message.getType());
|
||||||
@@ -96,13 +99,6 @@ public class ImService {
|
|||||||
resp.setContent(message.getContent());
|
resp.setContent(message.getContent());
|
||||||
return resp;
|
return resp;
|
||||||
}
|
}
|
||||||
boolean fileType = typeEnum.isFileType();
|
|
||||||
if(fileType){
|
|
||||||
boolean star = userFollowService.checkStar(toUserId, fromUserId);
|
|
||||||
if(!star){
|
|
||||||
throw new ServiceException("对方关注你才能发送图片|语音|视频");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(fromUserId.equals(toUserId)){
|
if(fromUserId.equals(toUserId)){
|
||||||
throw new ServiceException("不能给自己发送哦!");
|
throw new ServiceException("不能给自己发送哦!");
|
||||||
}
|
}
|
||||||
@@ -134,6 +130,26 @@ public class ImService {
|
|||||||
if (fromUser.getIsAnchor().equals(0) && toUser.getIsAnchor().equals(0)) {
|
if (fromUser.getIsAnchor().equals(0) && toUser.getIsAnchor().equals(0)) {
|
||||||
throw new ServiceException("目前只能和女神私信!");
|
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;
|
int filter = 0;
|
||||||
String content = message.getContent();
|
String content = message.getContent();
|
||||||
// 正则判断违规数据替换
|
// 正则判断违规数据替换
|
||||||
|
|||||||
@@ -120,6 +120,15 @@ public class SystemConfigManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Set<String> getSystemConfigOfSet(SystemConfigEnum systemConfig) {
|
||||||
|
String value = getSystemConfig(systemConfig);
|
||||||
|
if(StringUtils.isBlank(value)){
|
||||||
|
value = systemConfig.getDefaultValue();
|
||||||
|
}
|
||||||
|
return Stream.of(value.split(",")).collect(Collectors.toSet());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取所有配置
|
* 获取所有配置
|
||||||
* @return
|
* @return
|
||||||
@@ -147,4 +156,5 @@ public class SystemConfigManager {
|
|||||||
}
|
}
|
||||||
redisTemplate.opsForHash().put(RedisHttpConstant.SYSTEM_CONFIG, key,value);
|
redisTemplate.opsForHash().put(RedisHttpConstant.SYSTEM_CONFIG, key,value);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.UserMapperQuery;
|
||||||
import com.ruoyi.cai.dto.app.query.index.UserQuery;
|
import com.ruoyi.cai.dto.app.query.index.UserQuery;
|
||||||
import com.ruoyi.cai.dto.app.vo.user.UserListVo;
|
import com.ruoyi.cai.dto.app.vo.user.UserListVo;
|
||||||
|
import com.ruoyi.cai.dto.commom.user.MinUser;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -25,4 +26,6 @@ public interface UserMapper extends BaseMapper<User> {
|
|||||||
Page<UserListVo> greetPageApp(@Param("build") Page<Object> build, @Param("query") GreetQuery query);
|
Page<UserListVo> greetPageApp(@Param("build") Page<Object> build, @Param("query") GreetQuery query);
|
||||||
|
|
||||||
List<Long> getGreetNumId(@Param("userId") Long userId);
|
List<Long> getGreetNumId(@Param("userId") Long userId);
|
||||||
|
|
||||||
|
MinUser getMinUserById(@Param("userId") Long userId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ import com.ruoyi.cai.dto.app.query.im.ImMessageDTO;
|
|||||||
*/
|
*/
|
||||||
public interface UserChatRecordService extends IService<UserChatRecord> {
|
public interface UserChatRecordService extends IService<UserChatRecord> {
|
||||||
|
|
||||||
|
UserChatRecord getByCache(String recordId);
|
||||||
|
|
||||||
UserChatRecord saveRecord(User fromUser, User toUser, Long traceId, ImMessageDTO message);
|
UserChatRecord saveRecord(User fromUser, User toUser, Long traceId, ImMessageDTO message);
|
||||||
|
|
||||||
void clearChatRecord(Integer hours);
|
void clearChatRecord(Integer hours);
|
||||||
|
|||||||
@@ -37,6 +37,8 @@ public interface UserMemberService extends IService<UserMember> {
|
|||||||
|
|
||||||
void relieveMember(Long id);
|
void relieveMember(Long id);
|
||||||
|
|
||||||
|
void checkAndUpdateUser(Long userId);
|
||||||
|
|
||||||
MemberInfoVo memberApp(Long userId, Integer type);
|
MemberInfoVo memberApp(Long userId, Integer type);
|
||||||
|
|
||||||
void updateRankHide(UpdateRankHideReq updateRankHideReq);
|
void updateRankHide(UpdateRankHideReq updateRankHideReq);
|
||||||
|
|||||||
@@ -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.UserInfoVo;
|
||||||
import com.ruoyi.cai.dto.app.vo.user.UserListVo;
|
import com.ruoyi.cai.dto.app.vo.user.UserListVo;
|
||||||
import com.ruoyi.cai.dto.app.vo.user.UserMinInfoVo;
|
import com.ruoyi.cai.dto.app.vo.user.UserMinInfoVo;
|
||||||
|
import com.ruoyi.cai.dto.commom.user.MinUser;
|
||||||
import com.ruoyi.common.core.domain.PageQuery;
|
import com.ruoyi.common.core.domain.PageQuery;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -21,6 +22,10 @@ public interface UserService extends IService<User> {
|
|||||||
|
|
||||||
User getByUsername(String username);
|
User getByUsername(String username);
|
||||||
|
|
||||||
|
MinUser getMinUserByIdBomCache(Long userId);
|
||||||
|
|
||||||
|
MinUser getMinUserById(Long userId);
|
||||||
|
|
||||||
Page<UserAdminVo> pageAdmin(PageQuery pageQuery, UserAdminVo query);
|
Page<UserAdminVo> pageAdmin(PageQuery pageQuery, UserAdminVo query);
|
||||||
|
|
||||||
Page<UserListVo> pageApp(PageQuery page, UserQuery query);
|
Page<UserListVo> pageApp(PageQuery page, UserQuery query);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.ruoyi.cai.service.impl;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
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.User;
|
||||||
import com.ruoyi.cai.domain.UserChatRecord;
|
import com.ruoyi.cai.domain.UserChatRecord;
|
||||||
import com.ruoyi.cai.dto.app.query.im.ImMessageDTO;
|
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 com.ruoyi.cai.service.UserChatRecordService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
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 org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -25,6 +30,16 @@ import java.util.stream.Collectors;
|
|||||||
@Service
|
@Service
|
||||||
public class UserChatRecordServiceImpl extends ServiceImpl<UserChatRecordMapper,UserChatRecord> implements UserChatRecordService {
|
public class UserChatRecordServiceImpl extends ServiceImpl<UserChatRecordMapper,UserChatRecord> implements UserChatRecordService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RedissonClient redissonClient;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UserChatRecord getByCache(String recordId){
|
||||||
|
String key = String.format(RedisHttpConstant.CHAT_RECORD_CACHE_REDIS, recordId);
|
||||||
|
RBucket<UserChatRecord> bucket = redissonClient.getBucket(key);
|
||||||
|
return bucket.get();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public UserChatRecord saveRecord(User fromUser, User toUser,Long traceId, ImMessageDTO message) {
|
public UserChatRecord saveRecord(User fromUser, User toUser,Long traceId, ImMessageDTO message) {
|
||||||
UserChatRecord userChatRecord = new UserChatRecord();
|
UserChatRecord userChatRecord = new UserChatRecord();
|
||||||
@@ -37,6 +52,9 @@ public class UserChatRecordServiceImpl extends ServiceImpl<UserChatRecordMapper,
|
|||||||
userChatRecord.setCreateTime(LocalDateTime.now());
|
userChatRecord.setCreateTime(LocalDateTime.now());
|
||||||
userChatRecord.setTraceId(traceId);
|
userChatRecord.setTraceId(traceId);
|
||||||
this.save(userChatRecord);
|
this.save(userChatRecord);
|
||||||
|
String key = String.format(RedisHttpConstant.CHAT_RECORD_CACHE_REDIS, userChatRecord.getId());
|
||||||
|
RBucket<UserChatRecord> bucket = redissonClient.getBucket(key);
|
||||||
|
bucket.set(userChatRecord,10, TimeUnit.MINUTES);
|
||||||
return userChatRecord;
|
return userChatRecord;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -102,6 +102,17 @@ public class UserMemberServiceImpl extends ServiceImpl<UserMemberMapper, UserMem
|
|||||||
.set(UserMember::getMemberStatus, MemberStatusEnum.FAIL.getCode()));
|
.set(UserMember::getMemberStatus, MemberStatusEnum.FAIL.getCode()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void checkAndUpdateUser(Long userId){
|
||||||
|
UserMemberTypeEnum typeEnum = checkUserIsMember(userId);
|
||||||
|
if(typeEnum == null){
|
||||||
|
userService.update(Wrappers.lambdaUpdate(User.class).eq(User::getId, userId)
|
||||||
|
.set(User::getNoGreet, 0)
|
||||||
|
.set(User::getRankHide, 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MemberInfoVo memberApp(Long userId, Integer type) {
|
public MemberInfoVo memberApp(Long userId, Integer type) {
|
||||||
User user = userService.getById(userId);
|
User user = userService.getById(userId);
|
||||||
|
|||||||
@@ -5,12 +5,14 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
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.cai.auth.CaiLoginManager;
|
import com.ruoyi.cai.auth.CaiLoginManager;
|
||||||
|
import com.ruoyi.cai.constant.RedisHttpConstant;
|
||||||
import com.ruoyi.cai.domain.*;
|
import com.ruoyi.cai.domain.*;
|
||||||
import com.ruoyi.cai.dto.admin.vo.UserAdminVo;
|
import com.ruoyi.cai.dto.admin.vo.UserAdminVo;
|
||||||
import com.ruoyi.cai.dto.app.query.index.GreetQuery;
|
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.UserMapperQuery;
|
||||||
import com.ruoyi.cai.dto.app.query.index.UserQuery;
|
import com.ruoyi.cai.dto.app.query.index.UserQuery;
|
||||||
import com.ruoyi.cai.dto.app.vo.user.*;
|
import com.ruoyi.cai.dto.app.vo.user.*;
|
||||||
|
import com.ruoyi.cai.dto.commom.user.MinUser;
|
||||||
import com.ruoyi.cai.enums.GenderEnum;
|
import com.ruoyi.cai.enums.GenderEnum;
|
||||||
import com.ruoyi.cai.im.ImManager;
|
import com.ruoyi.cai.im.ImManager;
|
||||||
import com.ruoyi.cai.mapper.UserMapper;
|
import com.ruoyi.cai.mapper.UserMapper;
|
||||||
@@ -23,12 +25,15 @@ import com.ruoyi.common.exception.ServiceException;
|
|||||||
import com.ruoyi.common.helper.LoginHelper;
|
import com.ruoyi.common.helper.LoginHelper;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.redisson.api.RBucket;
|
||||||
|
import org.redisson.api.RedissonClient;
|
||||||
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 org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户Service业务层处理
|
* 用户Service业务层处理
|
||||||
@@ -81,6 +86,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
|
|||||||
private ImManager imManager;
|
private ImManager imManager;
|
||||||
@Autowired
|
@Autowired
|
||||||
private YunxinHttpService yunxinHttpService;
|
private YunxinHttpService yunxinHttpService;
|
||||||
|
@Autowired
|
||||||
|
private RedissonClient redissonClient;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public User getByUsername(String username) {
|
public User getByUsername(String username) {
|
||||||
@@ -88,6 +95,30 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
|
|||||||
.eq(User::getMobile,username));
|
.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<MinUser> 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
|
@Override
|
||||||
public Page<UserAdminVo> pageAdmin(PageQuery pageQuery, UserAdminVo query) {
|
public Page<UserAdminVo> pageAdmin(PageQuery pageQuery, UserAdminVo query) {
|
||||||
return baseMapper.pageAdmin(pageQuery.build(),query);
|
return baseMapper.pageAdmin(pageQuery.build(),query);
|
||||||
|
|||||||
@@ -88,6 +88,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
order by t1.update_time desc
|
order by t1.update_time desc
|
||||||
limit 20
|
limit 20
|
||||||
</select>
|
</select>
|
||||||
|
<select id="getMinUserById" resultType="com.ruoyi.cai.dto.commom.user.MinUser">
|
||||||
|
select id,gender
|
||||||
|
from cai_user t1
|
||||||
|
where id = #{userId}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|||||||
@@ -1,11 +1,18 @@
|
|||||||
package com.ruoyi.yunxin.manager;
|
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.config.YunxinProperties;
|
||||||
import com.ruoyi.yunxin.util.CheckSumBuilder;
|
import com.ruoyi.yunxin.util.CheckSumBuilder;
|
||||||
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 java.util.Arrays;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class YunxinManager {
|
public class YunxinManager {
|
||||||
|
|||||||
Reference in New Issue
Block a user