[fix]修改用户角色
This commit is contained in:
parent
df6e2fe083
commit
8e3403e708
@ -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) 短视频评论总数 +1(Redis 优先)
|
||||
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);
|
||||
|
@ -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());
|
||||
|
@ -388,4 +388,7 @@ http:
|
||||
connect-timeout: 10s
|
||||
read-timeout: 30s
|
||||
|
||||
|
||||
vlog:
|
||||
storage-path: /data/vlogdata/
|
||||
prefix: vlog_
|
||||
suffix: .mp4
|
||||
|
@ -138,6 +138,11 @@ public class LoginUser implements Serializable {
|
||||
*/
|
||||
private String userSig;
|
||||
|
||||
/**
|
||||
* 头像
|
||||
*/
|
||||
private String avatar;
|
||||
|
||||
|
||||
/**
|
||||
* 获取登录id
|
||||
|
@ -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){
|
||||
|
@ -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";
|
||||
}
|
||||
|
@ -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 {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -68,4 +68,11 @@ public interface CommentService {
|
||||
* 下架评论(status=2)
|
||||
*/
|
||||
void offlineComment(String commentId, String username);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 发布评论
|
||||
*/
|
||||
void publishComment(CommentBO bo);
|
||||
}
|
||||
|
@ -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) 短视频评论总数 +1(Redis 优先)
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -102,6 +102,6 @@ public class Member extends BaseAudit {
|
||||
private Long userId;
|
||||
|
||||
@Schema(description = "角色")
|
||||
private String role;
|
||||
private Integer role;
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
// 拉黑前只删除“我关注对方”的关系
|
||||
|
@ -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) {
|
||||
|
@ -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();
|
||||
|
||||
// 发送请求
|
||||
|
@ -103,6 +103,11 @@ public class SysUser extends TenantEntity {
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 同步会员
|
||||
*/
|
||||
private String syncMemberFlag;
|
||||
|
||||
|
||||
public SysUser(Long userId) {
|
||||
this.userId = userId;
|
||||
|
@ -116,7 +116,7 @@ public class SysUserBo extends BaseEntity {
|
||||
/**
|
||||
* 同步会员
|
||||
*/
|
||||
private String syncMemberFlag;
|
||||
private Integer syncMemberFlag;
|
||||
|
||||
public SysUserBo(Long userId) {
|
||||
this.userId = userId;
|
||||
|
@ -140,5 +140,9 @@ public class SysUserVo implements Serializable {
|
||||
private Long roleId;
|
||||
|
||||
private String userSig;
|
||||
/**
|
||||
* 同步会员
|
||||
*/
|
||||
private Integer syncMemberFlag;
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user