[fix]修改用户角色

This commit is contained in:
wangqx 2025-09-09 18:57:07 +08:00
parent df6e2fe083
commit 8e3403e708
23 changed files with 312 additions and 184 deletions

View File

@ -14,6 +14,10 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.dromara.common.mq.domain.MQMessage;
import org.dromara.common.mq.enums.MQMessageType;
import org.dromara.common.mq.enums.MessageActionEnum;
import org.dromara.common.mq.utils.MqUtil;
import org.dromara.common.redis.redis.RedisCache;
import org.dromara.common.satoken.utils.LoginHelper;
import org.springframework.beans.factory.annotation.Autowired;
@ -29,12 +33,6 @@ import java.util.Map;
public class AppCommentController {
@Autowired
private CommentService commentService;
@Autowired
private RedisOperator redis;
@Autowired
private MsgService msgService;
@Autowired
private RedisCache redisCache;
@ApiOperation("查询视频评论列表")
@PostMapping("/page")
@ -54,40 +52,7 @@ public class AppCommentController {
@PostMapping("/publish")
public R<Void> publishComment(@RequestBody CommentBO bo) {
try {
// 鉴权评论人从登录上下文获取覆盖入参
Long loginUserId = LoginHelper.getUserId();
if (loginUserId == null) {
return R.fail("未登录或登录已过期");
}
bo.setCommentUserId(String.valueOf(loginUserId));
// 父评论为空时按根评论处理约定使用"0"作为无父评论标记
if (bo.getFatherCommentId() == null || bo.getFatherCommentId().isEmpty()) {
bo.setFatherCommentId("0");
}
// 1) 创建评论
commentService.createComment(bo);
// 2) 短视频评论总数 +1Redis 优先
redisCache.zSetIncrement(BaseInfoProperties.REDIS_VLOG_COMMENT_COUNTS , bo.getVlogId(), 1);
// 3) 发送站内消息根评论 -> 通知视频作者回复评论 -> 通知被回复用户
if ("0".equals(bo.getFatherCommentId())) {
// 评论视频通知视频作者
if (bo.getVlogerId() != null && !bo.getVlogerId().isEmpty()
&& !String.valueOf(loginUserId).equals(bo.getVlogerId())) {
msgService.createMsg(String.valueOf(loginUserId), bo.getVlogerId(), MessageEnum.COMMENT_VLOG.type, null);
}
} else {
// 回复评论通知父评论作者
Comment father = commentService.getCommentDetail(bo.getFatherCommentId());
if (father != null && father.getCommentUserId() != null
&& !String.valueOf(loginUserId).equals(father.getCommentUserId())) {
msgService.createMsg(String.valueOf(loginUserId), father.getCommentUserId(), MessageEnum.REPLY_YOU.type, null);
}
}
commentService.publishComment(bo);
return R.ok();
} catch (Exception e) {
log.error("发布评论失败", e);

View File

@ -39,7 +39,6 @@ import org.springframework.stereotype.Service;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.function.Supplier;
@ -67,7 +66,7 @@ public class SysLoginService {
private final ISysDeptService deptService;
private final ISysPostService postService;
private final SysUserMapper userMapper;
private final ISysOssService ossService;
/**
* 绑定第三方用户
@ -161,6 +160,12 @@ public class SysLoginService {
loginUser.setUserId(userId);
loginUser.setDeptId(user.getDeptId());
loginUser.setUsername(user.getUserName());
if(user.getAvatar()!=null){
SysOssVo oss=ossService.getById(user.getAvatar());
if(oss!=null){
loginUser.setAvatar(ossService.getById(user.getAvatar()).getUrl());
}
}
loginUser.setNickname(user.getNickName());
loginUser.setUserType(user.getUserType());
loginUser.setMenuPermission(permissionService.getMenuPermission(userId));
@ -185,6 +190,7 @@ public class SysLoginService {
LoginUser loginUser = new LoginUser();
Long userId = member.getId();
loginUser.setUserId(userId);
loginUser.setAvatar(member.getAvatar());
loginUser.setUsername(member.getUserName());
loginUser.setNickname(member.getNickname());
loginUser.setUserType(UserType.APP_USER.getUserType());

View File

@ -388,4 +388,7 @@ http:
connect-timeout: 10s
read-timeout: 30s
vlog:
storage-path: /data/vlogdata/
prefix: vlog_
suffix: .mp4

View File

@ -138,6 +138,11 @@ public class LoginUser implements Serializable {
*/
private String userSig;
/**
* 头像
*/
private String avatar;
/**
* 获取登录id

View File

@ -22,6 +22,16 @@ public enum TenantType {
private final String desc;
public static TenantType valueOf(int type) {
for (TenantType tenantType : TenantType.values()) {
if (tenantType.type == type) {
return tenantType;
}
}
throw new IllegalArgumentException("No enum constant with type " + type);
}
public static boolean allowCreateByType(Integer currentTenantType, Integer newTenantType) {
boolean allow = false;
if(currentTenantType == SUPERADMIN.type){

View File

@ -36,4 +36,6 @@ public class RocketMQConfig {
public static final String VLOG_UPLOAD_TOPIC = "VLOG_UPLOAD_TOPIC";
public static final String VLOG_UPLOAD_GROUP = "VLOG_UPLOAD_GROUP";
public static final String VLOG_UPLOAD_TAG= "upload";
}

View File

@ -1,5 +1,6 @@
package org.dromara.common.mq.utils;
import cn.hutool.json.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.consumer.DefaultLitePullConsumer;
import org.apache.rocketmq.client.consumer.DefaultMQPullConsumer;
@ -9,18 +10,25 @@ import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.mq.config.RocketMQConfig;
import org.dromara.common.mq.domain.MQMessage;
import org.dromara.common.mq.enums.MQMessageType;
import org.dromara.common.mq.enums.MessageActionEnum;
import org.dromara.common.satoken.utils.LoginHelper;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;
import java.lang.reflect.Member;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import static org.dromara.common.mq.enums.MQMessageType.COMMENT;
@Slf4j
@Component
public class MqUtil implements ApplicationContextAware {
@ -124,4 +132,6 @@ public class MqUtil implements ApplicationContextAware {
}
}
}

View File

@ -10,6 +10,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.service.OssService;
import org.dromara.common.core.utils.SpringUtils;
@ -22,6 +23,7 @@ import org.dromara.system.domain.vo.SysOssVo;
import org.dromara.system.service.ISysOssService;
import org.springframework.stereotype.Component;
import java.nio.file.Files;
import java.nio.file.Path;
/**
@ -35,7 +37,7 @@ import java.nio.file.Path;
@RocketMQMessageListener(
topic = RocketMQConfig.VLOG_UPLOAD_TOPIC,
consumerGroup = RocketMQConfig.VLOG_UPLOAD_GROUP,
selectorExpression = "upload"
selectorExpression = RocketMQConfig.VLOG_UPLOAD_TAG
)
public class VlogUploadMessageConsumer implements RocketMQListener<MessageExt> {
private final QcCloud qcCloud;
@ -51,7 +53,7 @@ public class VlogUploadMessageConsumer implements RocketMQListener<MessageExt> {
try {
MQMessage mqMessage = JsonUtils.parseObject(message, MQMessage.class);
if (mqMessage != null&&messageExt.getBody()!=null) {
if (mqMessage != null && messageExt.getBody() != null) {
boolean result = this.handleMessage(mqMessage);
if (result) {
// 消息处理成功手动确认
@ -80,37 +82,39 @@ public class VlogUploadMessageConsumer implements RocketMQListener<MessageExt> {
private boolean handleMessage(MQMessage mqMessage) throws Exception {
//视频上传消息会包含视频的内容
Vlog vlog = vlogService.getById((String)mqMessage.getData());
Vlog vlog = vlogService.getById((String) mqMessage.getData());
//获取文件内容
if(ObjectUtil.isNull(vlog)){
if (ObjectUtil.isNull(vlog)) {
return false;
}
String fileId=vlog.getFileId();
String fileId = vlog.getFileId();
//检查该文件是否为oss文件如果不是说明已经上传过了
if(!vlog.getUrl().contains("#")){
if (!vlog.getUrl().contains("#")) {
return true;
}
//从oss下载文件
String storagePath = "/data/vlogdata";
//从oss下载文件
SysOssVo sysOss =ossService.getById(Long.parseLong(fileId)) ;
SysOssVo sysOss = ossService.getById(Long.parseLong(fileId));
if (ObjectUtil.isNull(sysOss)) {
throw new ServiceException("文件数据不存在!");
}
OssClient ossClient = OssFactory.instance(sysOss.getService());
Path filePath=ossClient.fileDownload(sysOss.getUrl(),sysOss.getOriginalName());
Path filePath = ossClient.fileDownload(sysOss.getUrl(), sysOss.getOriginalName());
//对文件进行重命名
fileId = qcCloud.uploadViaTempFile(filePath);
String[] fileInfo = qcCloud.uploadViaTempFile(filePath);
if (fileInfo == null) {
return false;
}
log.info("视频发布ID:" + fileId);
vlog.setFileId(fileId);
vlog.setFileId(fileInfo[0]);
vlog.setUrl(fileInfo[1]);
vlogService.updateById(vlog);
// 删除minio文件
MinIOUtils.removeFile("wzj",fileId);
log.info("删除minio文件"+fileId);
// 删除minio文件,删除本地文件
Files.deleteIfExists(filePath);
// MinIOUtils.removeFile("wzj", fileId);
log.info("删除minio文件" + fileId);
return true;
}

View File

@ -68,4 +68,11 @@ public interface CommentService {
* 下架评论status=2
*/
void offlineComment(String commentId, String username);
/**
* 发布评论
*/
void publishComment(CommentBO bo);
}

View File

@ -3,6 +3,7 @@ package com.wzj.soopin.content.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wzj.soopin.content.domain.base.BaseInfoProperties;
import com.wzj.soopin.content.domain.bo.CommentBO;
import com.wzj.soopin.content.domain.po.Comment;
@ -23,10 +24,19 @@ import com.wzj.soopin.content.service.MsgService;
import com.wzj.soopin.content.service.VlogService;
import com.wzj.soopin.content.utils.PagedGridResult;
import com.wzj.soopin.content.utils.Sid;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.mq.domain.MQMessage;
import org.dromara.common.mq.enums.MQMessageType;
import org.dromara.common.mq.enums.MessageActionEnum;
import org.dromara.common.mq.utils.MqUtil;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.redis.redis.RedisCache;
import org.dromara.common.satoken.utils.LoginHelper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -42,23 +52,17 @@ import java.util.stream.Collectors;
@Slf4j
@Service
public class CommentServiceImpl extends BaseInfoProperties implements CommentService {
@Autowired
private CommentMapper commentMapper;
@Autowired
private CommentMapperCustom commentMapperCustom;
@Autowired
private VlogService vlogService;
@Autowired
private MsgService msgService;
@Autowired
private Sid sid;
@Autowired
private UsersMapper usersMapper;
@Autowired
private MemberMapper memberMapper;
@Autowired
private VlogMapper vlogMapper;
@AllArgsConstructor
public class CommentServiceImpl extends ServiceImpl<CommentMapper, Comment> implements CommentService {
private final CommentMapper commentMapper;
private final CommentMapperCustom commentMapperCustom;
private final MsgService msgService;
private final Sid sid;
private final MemberMapper memberMapper;
private final VlogMapper vlogMapper;
private final RedisCache redisCache;
@Override
public TableDataInfo<CommentVO> getCommentList(String vlogId, String mobile, PageQuery pageQuery) {
@ -97,7 +101,7 @@ public class CommentServiceImpl extends BaseInfoProperties implements CommentSer
// 构建查询条件
LambdaQueryWrapper<Comment> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Comment::getVlogId, vlogId)
.orderByDesc(Comment::getCreateTime);
.orderByDesc(Comment::getCreateTime);
// 执行分页查询
Page<Comment> commentPage = commentMapper.selectPage(page, queryWrapper);
@ -179,7 +183,7 @@ public class CommentServiceImpl extends BaseInfoProperties implements CommentSer
// 如果是按点赞数排序则调用新的Mapper方法进行聚合排序
LambdaQueryWrapper<Comment> wrapper = bo.toWrapper();
if(bo.getFatherCommentId()==null){
if (bo.getFatherCommentId() == null) {
wrapper.eq(Comment::getFatherCommentId, "0");
}
@ -346,4 +350,68 @@ public class CommentServiceImpl extends BaseInfoProperties implements CommentSer
commentMapper.updateById(childComment);
}
}
@Override
public void publishComment(CommentBO bo) {
// 鉴权评论人从登录上下文获取覆盖入参
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
throw new RuntimeException("未登录或登录已过期");
}
bo.setCommentUserId(String.valueOf(loginUser));
// 父评论为空时按根评论处理约定使用"0"作为无父评论标记
if (bo.getFatherCommentId() == null || bo.getFatherCommentId().isEmpty()) {
bo.setFatherCommentId("0");
}
// 1) 创建评论
this.createComment(bo);
// 2) 短视频评论总数 +1Redis 优先
redisCache.zSetIncrement(BaseInfoProperties.REDIS_VLOG_COMMENT_COUNTS, bo.getVlogId(), 1);
Map<String, Object> params = new HashMap<>();
// 3) 发送站内消息根评论 -> 通知视频作者回复评论 -> 通知被回复用户
// 关注消息
MqUtil.sendIMMessage(buildMessage(bo));
}
private MQMessage buildMessage(CommentBO bo){
Map<String,Object> params=new HashMap<>();
LoginUser loginUser=LoginHelper.getLoginUser();
if ("0".equals(bo.getFatherCommentId())) {
// 评论视频通知视频作者
if (bo.getVlogerId() != null && !bo.getVlogerId().isEmpty()
&& !String.valueOf(loginUser.getUserId()).equals(bo.getVlogerId())) {
params.put("userId", loginUser.getUserId());
params.put("nickName", loginUser.getNickname());
params.put("toUserId", bo.getVlogerId());
params.put("vlogId", bo.getVlogId());
params.put("action", MessageActionEnum.INTERACTION_COMMENT.getAccount());
}
} else {
// 回复评论通知父评论作者
Comment father = baseMapper.selectById(bo.getFatherCommentId());
if (father != null && father.getCommentUserId() != null
&& !String.valueOf(loginUser.getUserId()).equals(father.getCommentUserId())) {
params.put("userId", loginUser.getUserId());
params.put("nickName", loginUser.getNickname());
params.put("toUserId", father.getCommentUserId());
params.put("vlogId", bo.getVlogId());
params.put("commentId",father.getId());
params.put("commentContent",father.getContent());
params.put("action", MessageActionEnum.INTERACTION_REPLY.getAccount());
}
}
MQMessage mqMessage = new MQMessage();
mqMessage.setTag(MessageActionEnum.NEW_FOUCS.getAccount());
mqMessage.setData(params);
return mqMessage;
}
}

View File

@ -1,5 +1,6 @@
package com.wzj.soopin.content.service.impl;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@ -149,13 +150,13 @@ public class VlogServiceImpl extends ServiceImpl<VlogMapper, Vlog> implements Vl
String vid = sid.nextShort();
Vlog vlog = vlogConvert.toPo(vlogBO);
vlog.setId(vid);
vlog.setUrl(vlogBO.getUrl());
vlog.setLikeCounts(0);
vlog.setCommentsCounts(0);
vlog.setStatus(0);
vlog.setIsPrivate(YesOrNo.NO.type);
vlog.setMemberId(loginUser.getUserId()+"");
vlog.setUrl(vlogBO.getUrl()==null?"#":vlogBO.getUrl());
vlogMapper.insert(vlog);
@ -327,21 +328,23 @@ public class VlogServiceImpl extends ServiceImpl<VlogMapper, Vlog> implements Vl
this.flushCounts(vlogId, count.intValue());
}
//发送消息
if (userId != null && vlog.getMemberId() != null && !userId.equals(vlog.getMemberId())) {
// 新版使用模板类型编号和参数
Map<String, Object> params = new HashMap<>();
params.put("userId", userId);
params.put("nickname", LoginHelper.getLoginUser().getNickname());
params.put("action", MessageActionEnum.INTERACTION_LIKE.name());
params.put("toUserId", vlog.getMemberId());
MQMessage message = MQMessage.builder()
.messageType(MQMessageType.IM.name())
.data(params)
.source("member")
.build();
// 关注消息
MqUtil.sendIMMessage(message);
}
MqUtil.sendIMMessage(buildMessage(vlog));
}
private MQMessage buildMessage(Vlog vlog){
Map<String,Object> params=new HashMap<>();
LoginUser loginUser=LoginHelper.getLoginUser();
params.put("userId", loginUser.getUserId());
params.put("nickname", loginUser.getNickname() == null ? "" : loginUser.getNickname());
params.put("faceUrl", loginUser.getAvatar() );
params.put("action", MessageActionEnum.INTERACTION_LIKE.getAccount());
params.put("toUserId",vlog.getMemberId());
MQMessage mqMessage = new MQMessage();
mqMessage.setTag(MessageActionEnum.INTERACTION_LIKE.getAccount());
mqMessage.setData(params);
return mqMessage;
}
@Override

View File

@ -29,7 +29,7 @@ public class QcCloud {
public String uploadViaTempFile(Path filePath) throws Exception {
public String[] uploadViaTempFile(Path filePath) throws Exception {
//确保 vlogdata 目录存在
// 组装完整的文件路径
File sourceFile = new File(filePath.toString());
@ -46,10 +46,9 @@ public class QcCloud {
// 上传文件
VodUploadResponse response = client.upload(getRegion(), request);
// return response;
return response.getFileId();
} finally {
// 删除本地文件
Files.deleteIfExists(filePath);
return new String[]{response.getFileId(), response.getMediaUrl()};
}catch (Exception e){
throw new RuntimeException("腾讯云服务:上传文件失败: " + e.getMessage());
}
}
}

View File

@ -21,7 +21,8 @@ import org.springframework.stereotype.Component;
@RequiredArgsConstructor
@RocketMQMessageListener(
topic = RocketMQConfig.TOPIC_IM_MSG,
consumerGroup = RocketMQConfig.CONSUMER_GROUP_SYS_MSG,
// consumerGroup = RocketMQConfig.CONSUMER_GROUP_SYS_MSG,
consumerGroup = "cosumer",
selectorExpression = "*"
// ackMode = AckMode.MANUAL
)

View File

@ -1,7 +1,6 @@
package com.wzj.soopin.im.service.impl;
import cn.hutool.json.JSONObject;
import com.wzj.soopin.im.consumer.MessageRocketMQConsumer;
import com.wzj.soopin.im.domain.SysMessageTemplate;
import com.wzj.soopin.im.service.IMQMessageHandleService;
import com.wzj.soopin.im.service.ISysMessageTemplateService;
@ -9,7 +8,6 @@ import com.wzj.soopin.im.service.ITencentIMService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.constant.CacheConstants;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.mq.domain.MQMessage;
import org.dromara.common.mq.enums.MessageActionEnum;
@ -21,15 +19,12 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Service
@RequiredArgsConstructor
@Slf4j
public class MQMessageHandleServiceImpl implements IMQMessageHandleService {
// 变量替换的正则表达式模式
private static final Pattern VARIABLE_PATTERN = Pattern.compile("\\$\\{\\w+}");
private final RedisCache redisCache;
private final ISysMessageTemplateService templateService;
private final ITencentIMService tencentIMService;
@ -49,6 +44,10 @@ public class MQMessageHandleServiceImpl implements IMQMessageHandleService {
String action = (String) params.get("action");
//根据action获取消息模板
MessageActionEnum actionEnum = MessageActionEnum.getByAccount(action);
if(actionEnum == null){
log.error("根据action获取消息模板失败action{}", action);
return false;
}
SysMessageTemplate template = templateService.getTemplateByAction(actionEnum.getCode());
@ -162,4 +161,5 @@ public class MQMessageHandleServiceImpl implements IMQMessageHandleService {
}
return content;
}
}

View File

@ -102,6 +102,6 @@ public class Member extends BaseAudit {
private Long userId;
@Schema(description = "角色")
private String role;
private Integer role;
}

View File

@ -1,5 +1,6 @@
package com.wzj.soopin.member.listener;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.wzj.soopin.member.domain.po.Member;
import com.wzj.soopin.member.service.IMemberService;
@ -43,20 +44,37 @@ public class MemberCreateEventListener {
// 提取消息和用户ID
Map<String,Object> userMap = (Map<String,Object>)event.getSource();
//先检查绑定该用户的会员是否存在
if(userMap.get("userId")==null){
return;
}
List<Member> memberList = memberService.list(new LambdaQueryWrapper<Member>()
.eq(Member::getUserId,userMap.get("userId"))
);
if(CollectionUtil.isNotEmpty(memberList)){
Member member = memberList.get(0);
if(!member.getPhoneHidden().equals(userMap.get("phonenumber"))){
//解绑
member.setUserId(0l);
memberService.updateById(member);
}else{
//如果已经绑定过了 则不再更新
// return;
}
}
//根据手机号查询会员
memberList = memberService.list(new LambdaQueryWrapper<Member>()
.eq(Member::getPhoneEncrypted, (String) userMap.get("phonenumber"))
);
//如果存在则绑定
//如果不存在则创建
if (!memberList.isEmpty()&&memberList.get(0).getUserId()!=null) {
return ;
}
if (!memberList.isEmpty()){
if (!memberList.isEmpty() ){
//绑定
Member member = memberList.get(0);
member.setUserId((Long) userMap.get("userId"));
member.setRole(userMap.get("role").toString());
member.setRole(Integer.valueOf(userMap.get("role").toString()));
memberService.updateById(member);
//设置im账号为管理员
tencentIMService.updateMemberRole(member);
@ -68,7 +86,8 @@ public class MemberCreateEventListener {
member.setPhoneHidden((String) userMap.get("phonenumber"));
member.setAvatar((String) userMap.get("avatar"));
member.setGender((Integer) userMap.get("sex"));
member.setRole(userMap.get("role").toString());
member.setRole(Integer.valueOf(userMap.get("role").toString()));
member.setUserId((Long) userMap.get("userId"));
memberService.save(member);
//创建im账号
@ -77,7 +96,6 @@ public class MemberCreateEventListener {
member.setUserSig(userSig);
memberService.saveOrUpdate(member);
//设置im账号为管理员
tencentIMService.updateMemberRole(member);

View File

@ -1,6 +1,7 @@
package com.wzj.soopin.member.service.impl;
import cn.hutool.core.util.IdUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -69,33 +70,34 @@ public class FansServiceImpl extends ServiceImpl<FansMapper, Fans> implements IF
fans.setFriendFlag(YesOrNo.YES.type);
}
baseMapper.insert(fans);
// 推送关注消息
Member follower = memberMapper.selectById(myId);
Member vlogger = memberMapper.selectById(vloggerId);
if (follower != null && vlogger != null && !myId.equals(vloggerId)) {
// 新版使用模板类型编号和参数
Map<String, Object> params = new HashMap<>();
params.put("userId", follower.getId());
params.put("nickname", follower.getNickname() == null ? "" : follower.getNickname());
params.put("faceUrl", vlogger.getAvatar() == null ? "" : vlogger.getAvatar());
params.put("action", MessageActionEnum.NEW_FOUCS.getAccount());
params.put("toUserId",vloggerId);
MQMessage message = MQMessage.builder()
.messageType("follow")
.data(params)
.source("member")
.build();
// 关注消息
MqUtil.sendIMMessage(message);
}
MqUtil.sendIMMessage(buildMessage(fans));
return true;
}
private MQMessage buildMessage(Fans fans) {
// 推送关注消息
Member follower = memberMapper.selectById(fans.getFanId());
Member vlogger = memberMapper.selectById(fans.getVloggerId());
// 新版使用模板类型编号和参数
Map<String, Object> params = new HashMap<>();
params.put("userId", follower.getId());
params.put("nickname", follower.getNickname() == null ? "" : follower.getNickname());
params.put("faceUrl", vlogger.getAvatar() );
params.put("action", MessageActionEnum.NEW_FOUCS.getAccount());
params.put("toUserId", vlogger.getId());
MQMessage message = MQMessage.builder()
.messageType("follow")
.data(params)
.source("member")
.build();
return message;
}
public Fans queryFansRelationship(Long fanId, Long vlogerId) {
LambdaQueryWrapper<Fans> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Fans::getVloggerId, vlogerId)
.eq(Fans::getFanId, fanId);
.eq(Fans::getFanId, fanId);
List<Fans> fansList = baseMapper.selectList(queryWrapper);
if (fansList.isEmpty()) {
@ -139,9 +141,9 @@ public class FansServiceImpl extends ServiceImpl<FansMapper, Fans> implements IF
Map<String, Object> params = new HashMap<>();
params.put("userId", follower.getUserId());
params.put("nickname", follower.getNickname() == null ? "" : follower.getNickname());
params.put("faceUrl", vlogger.getAvatar() == null ? "" : vlogger.getAvatar());
params.put("faceUrl", vlogger.getAvatar() );
params.put("action", MessageActionEnum.NEW_FOUCS.getAccount());
params.put("toUserId",vloggerId);
params.put("toUserId", vloggerId);
MQMessage message = MQMessage.builder()
.messageType("follow")
.data(params)
@ -184,7 +186,7 @@ public class FansServiceImpl extends ServiceImpl<FansMapper, Fans> implements IF
Map<String, Object> map = new HashMap<>();
map.put("myId", myId);
// 查询粉丝列表
Page<FansVO> page=new Page<>();
Page<FansVO> page = new Page<>();
page.setCurrent(pageNo);
page.setSize(pageSize);
for (FansVO f : page.getRecords()) {
@ -200,7 +202,7 @@ public class FansServiceImpl extends ServiceImpl<FansMapper, Fans> implements IF
@Override
public Long countFansByVloggerId(Long vloggerId) {
return baseMapper.selectCount(new LambdaQueryWrapper<Fans>().eq(Fans::getVloggerId, vloggerId));
return baseMapper.selectCount(new LambdaQueryWrapper<Fans>().eq(Fans::getVloggerId, vloggerId));
}
// 拉黑前只删除我关注对方的关系

View File

@ -1,10 +1,12 @@
package com.wzj.soopin.member.service.impl;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.therapi.runtimejavadoc.repack.com.eclipsesource.json.JsonObject;
import com.wzj.soopin.member.convert.FeedbackConvert;
import com.wzj.soopin.member.convert.MemberConvert;
import com.wzj.soopin.member.domain.po.Feedback;
@ -18,11 +20,18 @@ import com.wzj.soopin.member.util.MemberCacheHelper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.mq.domain.MQMessage;
import org.dromara.common.mq.enums.MessageActionEnum;
import org.dromara.common.mq.utils.MqUtil;
import org.dromara.common.redis.redis.RedisCache;
import org.dromara.common.satoken.utils.LoginHelper;
import org.springframework.stereotype.Service;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
/**
* 意见反馈Service业务层处理
@ -92,6 +101,24 @@ public class FeedbackServiceImpl extends ServiceImpl<FeedbackMapper, Feedback> i
.set(Feedback::getResultContent, feedback.getResultContent())
.eq(Feedback::getId, feedback.getId());
baseMapper.update(null, updateWrapper);
MqUtil.sendIMMessage(buildMessage(feedback));
}
private MQMessage buildMessage(Feedback aim){
Map<String,Object> params=new HashMap<>();
LoginUser loginUser= LoginHelper.getLoginUser();
params.put("userId", loginUser.getUserId());
params.put("nickname", loginUser.getNickname() == null ? "" : loginUser.getNickname());
params.put("faceUrl", loginUser.getAvatar() );
params.put("action", MessageActionEnum.INTERACTION_LIKE.getAccount());
params.put("toUserId",aim.getMemberId());
MQMessage mqMessage = new MQMessage();
mqMessage.setTag(MessageActionEnum.INTERACTION_LIKE.getAccount());
mqMessage.setData(params);
return mqMessage;
}
public Integer changeStatus(Feedback dto) {

View File

@ -129,8 +129,8 @@ public class TencentIMServiceImpl implements ITencentIMServicce {
// 创建HTTP客户端
OkHttpClient client = new OkHttpClient().newBuilder().connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
.writeTimeout(15, TimeUnit.SECONDS)
.build();
// 发送请求

View File

@ -103,6 +103,11 @@ public class SysUser extends TenantEntity {
*/
private String remark;
/**
* 同步会员
*/
private String syncMemberFlag;
public SysUser(Long userId) {
this.userId = userId;

View File

@ -116,7 +116,7 @@ public class SysUserBo extends BaseEntity {
/**
* 同步会员
*/
private String syncMemberFlag;
private Integer syncMemberFlag;
public SysUserBo(Long userId) {
this.userId = userId;

View File

@ -140,5 +140,9 @@ public class SysUserVo implements Serializable {
private Long roleId;
private String userSig;
/**
* 同步会员
*/
private Integer syncMemberFlag;
}

View File

@ -15,10 +15,13 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.dromara.common.core.constant.CacheNames;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.domain.dto.UserDTO;
import org.dromara.common.core.enums.TenantType;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.service.OssService;
import org.dromara.common.core.service.UserService;
import org.dromara.common.core.utils.*;
import org.dromara.common.mq.domain.MemberCreateEvent;
@ -63,6 +66,8 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
private final SysUserRoleMapper userRoleMapper;
private final SysUserPostMapper userPostMapper;
private final ApplicationEventPublisher eventPublisher;
private final SysTenantMapper tenantMapper;
private final OssService ossService;
@Override
public TableDataInfo<SysUserVo> selectPageUserList(SysUserBo user, PageQuery pageQuery) {
@ -313,37 +318,40 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
// 新增用户岗位关联
// 新增用户与角色管理
insertUserRole(user, false);
// 新增用户会员关联
if(user.getSyncMemberFlag()!=null&&user.getSyncMemberFlag().equals(SystemConstants.DISABLE)){
Map<String,Object> source=new HashMap<>();
source.put("userId",user.getUserId());
source.put("userName",user.getUserName());
source.put("nickName",user.getNickName());
source.put("email",user.getEmail());
source.put("phonenumber",user.getPhonenumber());
source.put("password",user.getPassword());
source.put("set",user.getSex());
//获取用户角色id
QueryWrapper<SysRole> roleQueryWrapper = new QueryWrapper<SysRole>();
roleQueryWrapper.in("r.role_id",user.getRoleIds());
List<SysRoleVo> roles = roleMapper.selectRoleList(roleQueryWrapper);
if(CollectionUtils.isNotEmpty(roles)){
List<String> roleKeys= roles.stream().map(SysRoleVo::getRoleKey).collect(Collectors.toList());
source.put("roleKeys",String.join(",",roleKeys));
}
eventPublisher.publishEvent(new MemberCreateEvent(source));
}
//同步member
syncMember(baseMapper.selectById(sysUser.getUserId()));
return rows;
}
private void syncMember(SysUser user){
// 新增用户会员关联
if (user.getSyncMemberFlag() != null && user.getSyncMemberFlag().equals(SystemConstants.NORMAL)) {
Map<String, Object> source = new HashMap<>();
source.put("userId", user.getUserId());
source.put("userName", user.getUserName());
source.put("nickName", user.getNickName());
source.put("email", user.getEmail());
source.put("phonenumber", user.getPhonenumber());
source.put("password", user.getPassword());
source.put("set", user.getSex());
//获取用户角色id
if(ObjectUtil.isNotNull(user.getAvatar())){
String url=ossService.selectUrlByIds(user.getUserId()+"");
source.put("avatar", url);
}
SysTenant tenant = tenantMapper.selectByTenantId(user.getTenantId());
source.put("role", tenant.getType());
eventPublisher.publishEvent(new MemberCreateEvent(source));
}
}
/**
* 注册用户信息
*
@ -380,27 +388,8 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
throw new ServiceException("修改用户" + user.getUserName() + "信息失败");
}
syncMember(baseMapper.selectById(user.getUserId()));
// 新增用户会员关联
if(user.getSyncMemberFlag()!=null&&user.getSyncMemberFlag().equals(SystemConstants.DISABLE)){
Map<String,Object> source=new HashMap<>();
source.put("userId",user.getUserId());
source.put("userName",user.getUserName());
source.put("nickName",user.getNickName());
source.put("email",user.getEmail());
source.put("phonenumber",user.getPhonenumber());
source.put("password",user.getPassword());
source.put("set",user.getSex());
//获取用户角色id
QueryWrapper<SysRole> roleQueryWrapper = new QueryWrapper<SysRole>();
roleQueryWrapper.in("r.role_id",user.getRoleIds());
List<SysRoleVo> roles = roleMapper.selectRoleList(roleQueryWrapper);
if(CollectionUtils.isNotEmpty(roles)){
List<String> roleKeys= roles.stream().map(SysRoleVo::getRoleKey).collect(Collectors.toList());
source.put("roleKeys",String.join(",",roleKeys));
}
eventPublisher.publishEvent(new MemberCreateEvent(source));
}
return flag;
}