聊天增加拉黑功能

master
15004070936 2 weeks ago
parent 5dd7ee034e
commit 340b83b4e2

@ -1,5 +1,6 @@
package com.ruoyi.web.controller.basic; package com.ruoyi.web.controller.basic;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.ruoyi.RestResponse; import com.ruoyi.RestResponse;
@ -7,6 +8,7 @@ import com.ruoyi.basic.domain.YjAppreciate;
import com.ruoyi.basic.service.impl.YjAppreciateServiceImpl; import com.ruoyi.basic.service.impl.YjAppreciateServiceImpl;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@ -27,15 +29,23 @@ public class AppreciateController {
@Resource @Resource
private YjAppreciateServiceImpl service; private YjAppreciateServiceImpl service;
@Value("${defaultVisitStore}")
private Long defaultVisitStore;
/** /**
* 瑜伽欣赏 列表 * 瑜伽欣赏 列表
* @param visitStore * @param
* @return * @return
*/ */
@ApiOperation("获取瑜伽欣赏 列表") @ApiOperation("获取瑜伽欣赏 列表")
@PostMapping("/getList") @PostMapping("/getList")
public RestResponse getList(@RequestBody Map map){ public RestResponse getList(@RequestBody Map map){
Long visitStore=Long.parseLong(map.get("visitStore").toString()); Long visitStore;
if (ObjectUtil.isNotEmpty(map.get("visitStore"))){
visitStore=Long.parseLong(map.get("visitStore").toString());
}else {
visitStore= defaultVisitStore;
}
List<YjAppreciate> list= service.list(new QueryWrapper<YjAppreciate>() List<YjAppreciate> list= service.list(new QueryWrapper<YjAppreciate>()
.select("id,title,image,read_num,start_time,modify_time") .select("id,title,image,read_num,start_time,modify_time")
.eq("dept_id",visitStore) .eq("dept_id",visitStore)

@ -1,5 +1,6 @@
package com.ruoyi.web.controller.basic; package com.ruoyi.web.controller.basic;
import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.RestResponse; import com.ruoyi.RestResponse;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.course.domain.req.ReqSearchClaTime; import com.ruoyi.course.domain.req.ReqSearchClaTime;
@ -10,6 +11,7 @@ import com.ruoyi.system.service.SysTeacherService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@ -29,6 +31,8 @@ public class ContextAppController extends BaseController {
@Autowired @Autowired
private SysTeacherService staffService; private SysTeacherService staffService;
@Value("${defaultVisitStore}")
private Long defaultVisitStore;
/** /**
* visitStore * visitStore
@ -38,7 +42,13 @@ public class ContextAppController extends BaseController {
@ApiOperation("教练列表") @ApiOperation("教练列表")
@PostMapping(value = "/getList") @PostMapping(value = "/getList")
public RestResponse findList1(@RequestBody Map<String, Object> params) { public RestResponse findList1(@RequestBody Map<String, Object> params) {
List<SysTeacher> list = teacherService.getList(Long.parseLong(params.get("visitStore").toString())); Long visitStore;
if (ObjectUtil.isNotEmpty(params.get("visitStore"))){
visitStore=Long.parseLong(params.get("visitStore").toString());
}else {
visitStore= defaultVisitStore;
}
List<SysTeacher> list = teacherService.getList(visitStore);
return new RestResponse().setSuccess(true).setMessage("成功").setData(list); return new RestResponse().setSuccess(true).setMessage("成功").setData(list);
} }

@ -1,5 +1,6 @@
package com.ruoyi.web.controller.basic; package com.ruoyi.web.controller.basic;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.ruoyi.RestResponse; import com.ruoyi.RestResponse;
@ -7,6 +8,7 @@ import com.ruoyi.basic.domain.YjHealthy;
import com.ruoyi.basic.service.impl.YjHealthyServiceImpl; import com.ruoyi.basic.service.impl.YjHealthyServiceImpl;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@ -28,6 +30,8 @@ public class HealthyController {
@Resource @Resource
private YjHealthyServiceImpl service; private YjHealthyServiceImpl service;
@Value("${defaultVisitStore}")
private Long defaultVisitStore;
/** /**
* 健康饮食 列表 * 健康饮食 列表
* @param visitStore * @param visitStore
@ -36,7 +40,12 @@ public class HealthyController {
@ApiOperation(value = "获取健康饮食列表") @ApiOperation(value = "获取健康饮食列表")
@PostMapping("/getList") @PostMapping("/getList")
public RestResponse getList(@RequestBody Map map){ public RestResponse getList(@RequestBody Map map){
Long visitStore=Long.parseLong(map.get("visitStore").toString()); Long visitStore;
if (ObjectUtil.isNotEmpty(map.get("visitStore"))){
visitStore=Long.parseLong(map.get("visitStore").toString());
}else {
visitStore= defaultVisitStore;
}
List<YjHealthy> list= service.list(new QueryWrapper<YjHealthy>() List<YjHealthy> list= service.list(new QueryWrapper<YjHealthy>()
.select("id,title,image,read_num,start_time,modify_time") .select("id,title,image,read_num,start_time,modify_time")
.eq("dept_id",visitStore) .eq("dept_id",visitStore)

@ -1,5 +1,6 @@
package com.ruoyi.web.controller.basic; package com.ruoyi.web.controller.basic;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.ruoyi.RestResponse; import com.ruoyi.RestResponse;
@ -7,6 +8,7 @@ import com.ruoyi.basic.domain.YjInherit;
import com.ruoyi.basic.service.impl.YjInheritServiceImpl; import com.ruoyi.basic.service.impl.YjInheritServiceImpl;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@ -27,6 +29,8 @@ public class InheritController {
@Resource @Resource
private YjInheritServiceImpl inheritService; private YjInheritServiceImpl inheritService;
@Value("${defaultVisitStore}")
private Long defaultVisitStore;
/** /**
* 瑜伽传承 列表 * 瑜伽传承 列表
* @param visitStore * @param visitStore
@ -35,7 +39,12 @@ public class InheritController {
@ApiOperation(value = "获取瑜伽传承列表") @ApiOperation(value = "获取瑜伽传承列表")
@PostMapping("/getList") @PostMapping("/getList")
public RestResponse getList(@RequestBody Map map){ public RestResponse getList(@RequestBody Map map){
Long visitStore=Long.parseLong(map.get("visitStore").toString()); Long visitStore;
if (ObjectUtil.isNotEmpty(map.get("visitStore"))){
visitStore=Long.parseLong(map.get("visitStore").toString());
}else {
visitStore= defaultVisitStore;
}
List<YjInherit> list= inheritService.list(new QueryWrapper<YjInherit>() List<YjInherit> list= inheritService.list(new QueryWrapper<YjInherit>()
.select("id,title,image,read_num,start_time,modify_time") .select("id,title,image,read_num,start_time,modify_time")
.eq("dept_id",visitStore) .eq("dept_id",visitStore)

@ -1,5 +1,6 @@
package com.ruoyi.web.controller.basic; package com.ruoyi.web.controller.basic;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.ruoyi.RestResponse; import com.ruoyi.RestResponse;
@ -8,6 +9,7 @@ import com.ruoyi.basic.domain.YjPracticeMoments;
import com.ruoyi.basic.service.impl.YjPracticeMomentsServiceImpl; import com.ruoyi.basic.service.impl.YjPracticeMomentsServiceImpl;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@ -28,6 +30,8 @@ public class PracticeMomentsController {
@Resource @Resource
private YjPracticeMomentsServiceImpl momentsService; private YjPracticeMomentsServiceImpl momentsService;
@Value("${defaultVisitStore}")
private Long defaultVisitStore;
/** /**
* 练习瞬间列表 * 练习瞬间列表
* @param visitStore * @param visitStore
@ -36,7 +40,12 @@ public class PracticeMomentsController {
@ApiOperation(value = "获取练习瞬间列表") @ApiOperation(value = "获取练习瞬间列表")
@PostMapping("/getList") @PostMapping("/getList")
public RestResponse getList(@RequestBody Map map){ public RestResponse getList(@RequestBody Map map){
Long visitStore=Long.parseLong(map.get("visitStore").toString()); Long visitStore;
if (ObjectUtil.isNotEmpty(map.get("visitStore"))){
visitStore=Long.parseLong(map.get("visitStore").toString());
}else {
visitStore= defaultVisitStore;
}
List<YjPracticeMoments> list=momentsService.list(new QueryWrapper<YjPracticeMoments>() List<YjPracticeMoments> list=momentsService.list(new QueryWrapper<YjPracticeMoments>()
.select("id,title,image,read_num,start_time,modify_time") .select("id,title,image,read_num,start_time,modify_time")
.eq("dept_id",visitStore) .eq("dept_id",visitStore)

@ -1,5 +1,6 @@
package com.ruoyi.web.controller.basic; package com.ruoyi.web.controller.basic;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.ruoyi.RestResponse; import com.ruoyi.RestResponse;
@ -7,6 +8,7 @@ import com.ruoyi.basic.domain.YjSense;
import com.ruoyi.basic.service.impl.YjSenseServiceImpl; import com.ruoyi.basic.service.impl.YjSenseServiceImpl;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@ -26,6 +28,8 @@ public class SenseController {
@Resource @Resource
private YjSenseServiceImpl service; private YjSenseServiceImpl service;
@Value("${defaultVisitStore}")
private Long defaultVisitStore;
/** /**
* 瑜伽常识 列表 * 瑜伽常识 列表
* @param visitStore * @param visitStore
@ -34,7 +38,12 @@ public class SenseController {
@ApiOperation(value = "获取瑜伽常识列表") @ApiOperation(value = "获取瑜伽常识列表")
@PostMapping("/getList") @PostMapping("/getList")
public RestResponse getList(@RequestBody Map map){ public RestResponse getList(@RequestBody Map map){
Long visitStore=Long.parseLong(map.get("visitStore").toString()); Long visitStore;
if (ObjectUtil.isNotEmpty(map.get("visitStore"))){
visitStore=Long.parseLong(map.get("visitStore").toString());
}else {
visitStore= defaultVisitStore;
}
List<YjSense> list= service.list(new QueryWrapper<YjSense>() List<YjSense> list= service.list(new QueryWrapper<YjSense>()
.select("id,title,image,read_num,start_time,modify_time") .select("id,title,image,read_num,start_time,modify_time")
.eq("dept_id",visitStore) .eq("dept_id",visitStore)

@ -1,5 +1,6 @@
package com.ruoyi.web.controller.basic; package com.ruoyi.web.controller.basic;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.RestResponse; import com.ruoyi.RestResponse;
import com.ruoyi.basic.domain.YjStore; import com.ruoyi.basic.domain.YjStore;
@ -9,6 +10,7 @@ import com.ruoyi.system.domain.SysTeacher;
import com.ruoyi.system.service.SysTeacherService; import com.ruoyi.system.service.SysTeacherService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@ -33,6 +35,9 @@ public class StoreController {
@Resource @Resource
private SysTeacherService teacherService; private SysTeacherService teacherService;
@Value("${defaultVisitStore}")
private Long defaultVisitStore;
/** /**
* 企业简介+门店列表 * 企业简介+门店列表
* @param map * @param map
@ -41,8 +46,14 @@ public class StoreController {
@ApiOperation(value = "创始人+企业简介+门店列表") @ApiOperation(value = "创始人+企业简介+门店列表")
@PostMapping("/getList") @PostMapping("/getList")
public RestResponse getList(@RequestBody Map map){ public RestResponse getList(@RequestBody Map map){
Long visitStore;
if (ObjectUtil.isNotEmpty(map.get("visitStore"))){
visitStore=Long.parseLong(map.get("visitStore").toString());
}else {
visitStore= defaultVisitStore;
}
Map map1=new HashMap(); Map map1=new HashMap();
YjStore store=storeService.getOne(Long.parseLong(map.get("visitStore").toString())); YjStore store=storeService.getOne(visitStore);
String tenantId=store.getTenantId(); String tenantId=store.getTenantId();
List<YjStore> list= storeService.getStoreListByTenantId(tenantId); List<YjStore> list= storeService.getStoreListByTenantId(tenantId);
List<YjStore> list1=new ArrayList<>(); List<YjStore> list1=new ArrayList<>();

@ -0,0 +1,65 @@
package com.ruoyi.web.controller.im;
import com.ruoyi.RestResponse;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.im.service.ImUserBlackService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/api/blacklist")
public class ImUserBlackController {
@Resource
private ImUserBlackService imUserBlackService;
/**
* 拉黑用户
* @param targetUid 被拉黑用户ID
*/
@PostMapping("/add")
public RestResponse black(@RequestParam Long targetUid){
// getUserId() 若依获取当前登录用户
Long loginUserId= SecurityUtils.getAppLoginUser().getAppUser().getId();
boolean ok = imUserBlackService.blackUser(loginUserId, targetUid);
if(ok){
return RestResponse.success("拉黑成功");
}
return RestResponse.failure("拉黑失败");
}
/**
* 取消拉黑
*/
@PostMapping("/cancel")
public RestResponse unBlack(@RequestParam Long targetUid){
Long loginUserId= SecurityUtils.getAppLoginUser().getAppUser().getId();
boolean ok = imUserBlackService.unBlackUser(loginUserId, targetUid);
if(ok){
return RestResponse.success("取消拉黑成功");
}
return RestResponse.failure("取消拉黑失败");
}
/**
* 校验:我是否被对方拉黑 / 我是否拉黑对方(前端聊天页查询状态)
*/
@PostMapping("/check")
public RestResponse checkBlack(@RequestParam Long targetUid){
Long loginUserId= SecurityUtils.getAppLoginUser().getAppUser().getId();
// 对方是否拉黑我 target -> loginUser
boolean targetBlackMe = imUserBlackService.isBlack(targetUid, loginUserId);
// 我是否拉黑对方 loginUser -> target
boolean meBlackTarget = imUserBlackService.isBlack(loginUserId, targetUid);
Map map=new HashMap<>();
map.put("meBlackTarget", meBlackTarget);
map.put("targetBlackMe", targetBlackMe);
return RestResponse.success()
.setData(map);
}
}

@ -146,4 +146,4 @@ xss:
wechat: wechat:
token: runpeng token: runpeng
defaultVisitStore: 101

@ -25,7 +25,8 @@ public enum MessageStatus {
/** /**
* 屏蔽 * 屏蔽
*/ */
BLOCKED(4, "屏蔽"); BLOCKED(4, "屏蔽"),
ISBLACK(5, "消息已被对方拒收。");
private final Integer code; private final Integer code;

@ -33,7 +33,7 @@ public class YjStore implements Serializable {
@TableField(exist = false) @TableField(exist = false)
private Long parentId; private Long parentId;
//租户id //租户id
@TableField(exist = false)
private String tenantId; private String tenantId;
@ApiModelProperty("banner图") @ApiModelProperty("banner图")

@ -0,0 +1,32 @@
package com.ruoyi.im.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
@TableName("im_user_black")
public class ImUserBlack {
@TableId(type = IdType.AUTO)
private Long id;
/** 拉黑人uid */
private Long fromUid;
/** 被拉黑uid */
private Long toUid;
@TableField(value = "create_time")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date createTime;
@TableField(value = "update_time")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date updateTime;
/** 若依逻辑删除 0正常 1删除 */
@TableField(value = "del_flag")
private Integer delFlag;
}

@ -0,0 +1,18 @@
package com.ruoyi.im.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.im.domain.ImUserBlack;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
public interface ImUserBlackMapper extends BaseMapper<ImUserBlack> {
/**
* 判断 receiver 是否拉黑 sender
* @param receiver 接收方A
* @param sender 发送方B
* @return true A拉黑B
*/
@Select("SELECT COUNT(1) FROM im_user_black WHERE from_uid = #{receiver} AND to_uid = #{sender} AND del_flag = 0")
boolean existsBlack(@Param("receiver") Long receiver, @Param("sender") Long sender);
}

@ -0,0 +1,31 @@
package com.ruoyi.im.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.im.domain.ImUserBlack;
public interface ImUserBlackService extends IService<ImUserBlack> {
/**
* 判断 receiver 是否拉黑 sender
* @param receiver 消息接收人
* @param sender 消息发送人
* @return true receiver拉黑sender,消息禁止发送
*/
boolean isBlack(Long receiver, Long sender);
/**
* 拉黑用户
* @param fromUid 操作人(拉黑者)
* @param toUid 被拉黑用户
* @return true成功
*/
boolean blackUser(Long fromUid, Long toUid);
/**
* 取消拉黑
* @param fromUid 操作人
* @param toUid 被拉黑用户
* @return true成功
*/
boolean unBlackUser(Long fromUid, Long toUid);
}

@ -283,4 +283,9 @@ public class FriendServiceImpl extends ServiceImpl<FriendMapper, Friend> impleme
}); });
return vos; return vos;
} }
//拉黑 = 删除好友
} }

@ -38,6 +38,7 @@ import com.ruoyi.im.mapper.GroupMessageMapper;
import com.ruoyi.im.service.GroupMemberService; import com.ruoyi.im.service.GroupMemberService;
import com.ruoyi.im.service.GroupMessageService; import com.ruoyi.im.service.GroupMessageService;
import com.ruoyi.im.service.GroupService; import com.ruoyi.im.service.GroupService;
import com.ruoyi.im.service.ImUserBlackService;
import com.ruoyi.im.util.SensitiveFilterUtil; import com.ruoyi.im.util.SensitiveFilterUtil;
import com.ruoyi.imclient.IMClient; import com.ruoyi.imclient.IMClient;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -64,6 +65,8 @@ public class GroupMessageServiceImpl extends ServiceImpl<GroupMessageMapper, Gro
private final RedisTemplate<String, Object> redisTemplate; private final RedisTemplate<String, Object> redisTemplate;
private final IMClient imClient; private final IMClient imClient;
private final SensitiveFilterUtil sensitiveFilterUtil; private final SensitiveFilterUtil sensitiveFilterUtil;
private final ImUserBlackService imUserBlackService;
private static final ScheduledThreadPoolExecutor EXECUTOR = ThreadPoolExecutorFactory.getThreadPoolExecutor(); private static final ScheduledThreadPoolExecutor EXECUTOR = ThreadPoolExecutorFactory.getThreadPoolExecutor();
@Override @Override
@ -87,6 +90,11 @@ public class GroupMessageServiceImpl extends ServiceImpl<GroupMessageMapper, Gro
} }
// 不用发给自己 // 不用发给自己
userIds = userIds.stream().filter(id -> !session.getId().equals(id)).collect(Collectors.toList()); userIds = userIds.stream().filter(id -> !session.getId().equals(id)).collect(Collectors.toList());
// 过滤:只保留【没有拉黑我的用户】,拉黑我的直接剔除
userIds = userIds.stream()
.filter(userId -> !imUserBlackService.isBlack(userId, session.getId()))
.collect(Collectors.toList());
// 保存消息 // 保存消息
GroupMessage msg = BeanUtils.copyProperties(dto, GroupMessage.class); GroupMessage msg = BeanUtils.copyProperties(dto, GroupMessage.class);
msg.setSendId(session.getId()); msg.setSendId(session.getId());

@ -236,8 +236,10 @@ public class GroupServiceImpl extends ServiceImpl<GroupMapper, Group> implements
List<Long> userIds = members.stream().map(GroupMember::getUserId).collect(Collectors.toList()); List<Long> userIds = members.stream().map(GroupMember::getUserId).collect(Collectors.toList());
List<Long> onlineUserIds = imClient.getOnlineUser(userIds); List<Long> onlineUserIds = imClient.getOnlineUser(userIds);
return members.stream().map(m -> { return members.stream().map(m -> {
AppUser user=userService.getById(m.getUserId());
GroupMemberVO vo = BeanUtils.copyProperties(m, GroupMemberVO.class); GroupMemberVO vo = BeanUtils.copyProperties(m, GroupMemberVO.class);
vo.setShowNickName(m.getShowNickName()); vo.setShowNickName(user.getNickName());
vo.setHeadImage(user.getAvatar());
vo.setShowGroupName(StrUtil.blankToDefault(m.getRemarkGroupName(), group.getName())); vo.setShowGroupName(StrUtil.blankToDefault(m.getRemarkGroupName(), group.getName()));
vo.setOnline(onlineUserIds.contains(m.getUserId())); vo.setOnline(onlineUserIds.contains(m.getUserId()));
return vo; return vo;

@ -0,0 +1,68 @@
package com.ruoyi.im.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.im.domain.ImUserBlack;
import com.ruoyi.im.mapper.ImUserBlackMapper;
import com.ruoyi.im.service.ImUserBlackService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Date;
@Service
public class ImUserBlackServiceImpl extends ServiceImpl<ImUserBlackMapper, ImUserBlack> implements ImUserBlackService {
@Resource
private ImUserBlackMapper imUserBlackMapper;
@Override
public boolean isBlack(Long receiver, Long sender) {
if (receiver == null || sender == null) {
return false;
}
// receiver 是否拉黑 sender
return imUserBlackMapper.existsBlack(receiver, sender);
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean blackUser(Long fromUid, Long toUid) {
if(fromUid == null || toUid == null || fromUid.equals(toUid)){
return false;
}
// 先查是否已有拉黑记录(逻辑删除的旧记录)
LambdaQueryWrapper<ImUserBlack> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ImUserBlack::getFromUid, fromUid);
wrapper.eq(ImUserBlack::getToUid, toUid);
ImUserBlack oldRecord = getOne(wrapper);
if(oldRecord != null){
// 存在记录,恢复(取消逻辑删除)
oldRecord.setDelFlag(0);
oldRecord.setUpdateTime(new Date());
return updateById(oldRecord);
}else{
ImUserBlack black = new ImUserBlack();
black.setFromUid(fromUid);
black.setToUid(toUid);
black.setDelFlag(0);
black.setCreateTime(new Date());
return save(black);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean unBlackUser(Long fromUid, Long toUid) {
LambdaQueryWrapper<ImUserBlack> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ImUserBlack::getFromUid, fromUid);
wrapper.eq(ImUserBlack::getToUid, toUid);
ImUserBlack record = getOne(wrapper);
if(record == null){
return false;
}
// 逻辑删除(若依标准)
return removeById(record.getId());
}
}

@ -30,6 +30,7 @@ import com.ruoyi.im.domain.result.ResultUtils;
import com.ruoyi.im.domain.vo.PrivateMessageVO; import com.ruoyi.im.domain.vo.PrivateMessageVO;
import com.ruoyi.im.mapper.PrivateMessageMapper; import com.ruoyi.im.mapper.PrivateMessageMapper;
import com.ruoyi.im.service.FriendService; import com.ruoyi.im.service.FriendService;
import com.ruoyi.im.service.ImUserBlackService;
import com.ruoyi.im.service.PrivateMessageService; import com.ruoyi.im.service.PrivateMessageService;
import com.ruoyi.im.util.SensitiveFilterUtil; import com.ruoyi.im.util.SensitiveFilterUtil;
import com.ruoyi.imclient.IMClient; import com.ruoyi.imclient.IMClient;
@ -48,6 +49,7 @@ import com.ruoyi.mall.service.impl.OrderItemService;
import com.ruoyi.mall.service.impl.OrderService; import com.ruoyi.mall.service.impl.OrderService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DeadlockLoserDataAccessException; import org.springframework.dao.DeadlockLoserDataAccessException;
import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageImpl;
@ -69,6 +71,7 @@ public class PrivateMessageServiceImpl extends ServiceImpl<PrivateMessageMapper,
private final YjAppUserService appUserService; private final YjAppUserService appUserService;
private final IMClient imClient; private final IMClient imClient;
private final SensitiveFilterUtil sensitiveFilterUtil; private final SensitiveFilterUtil sensitiveFilterUtil;
private final ImUserBlackService imUserBlackService;
private static final ScheduledThreadPoolExecutor EXECUTOR = ThreadPoolExecutorFactory.getThreadPoolExecutor(); private static final ScheduledThreadPoolExecutor EXECUTOR = ThreadPoolExecutorFactory.getThreadPoolExecutor();
@Override @Override
@ -76,24 +79,30 @@ public class PrivateMessageServiceImpl extends ServiceImpl<PrivateMessageMapper,
// AppUser appUser= SecurityUtils.getAppLoginUser().getAppUser(); // AppUser appUser= SecurityUtils.getAppLoginUser().getAppUser();
AppUser appUser =appUserService.getById(SecurityUtils.getAppLoginUser().getAppUserId()); AppUser appUser =appUserService.getById(SecurityUtils.getAppLoginUser().getAppUserId());
if (!appUser.permissionToTalk()){ if (!appUser.permissionToTalk()){
return ResultUtils.error(500,"您已被禁言,无法发送消息"); return ResultUtils.error(20006,"您已被禁言,无法发送消息");
} }
Boolean isBlack = imUserBlackService.isBlack(dto.getRecvId(),appUser.getId());
//无需验证好友 //无需验证好友
Boolean isFriends = friendService.isFriend(appUser.getId(), dto.getRecvId()); Boolean isFriends = friendService.isFriend(appUser.getId(), dto.getRecvId());
if (Boolean.FALSE.equals(isFriends)) { if (Boolean.FALSE.equals(isFriends) && !isBlack) {
friendService.addFriend(dto.getRecvId()); friendService.addFriend(dto.getRecvId());
// throw new GlobalException("您已不是对方好友,无法发送消息"); // throw new GlobalException("您已不是对方好友,无法发送消息");
} }
// 保存消息 // 保存消息
PrivateMessage msg = BeanUtils.copyProperties(dto, PrivateMessage.class); PrivateMessage msg = BeanUtils.copyProperties(dto, PrivateMessage.class);
msg.setSendId(appUser.getId()); msg.setSendId(appUser.getId());
msg.setStatus(MessageStatus.UNSEND.code()); msg.setStatus(isBlack?MessageStatus.ISBLACK.code():MessageStatus.UNSEND.code());
msg.setSendTime(new Date()); msg.setSendTime(new Date());
// 过滤内容中的敏感词 // 过滤内容中的敏感词
if (MessageType.TEXT.code().equals(dto.getType())) { if (MessageType.TEXT.code().equals(dto.getType())) {
msg.setContent(sensitiveFilterUtil.filter(dto.getContent())); msg.setContent(sensitiveFilterUtil.filter(dto.getContent()));
} }
this.save(msg); this.save(msg);
// 推送消息 // 推送消息
PrivateMessageVO msgInfo = BeanUtils.copyProperties(msg, PrivateMessageVO.class); PrivateMessageVO msgInfo = BeanUtils.copyProperties(msg, PrivateMessageVO.class);
IMPrivateMessage<PrivateMessageVO> sendMessage = new IMPrivateMessage<>(); IMPrivateMessage<PrivateMessageVO> sendMessage = new IMPrivateMessage<>();
@ -102,6 +111,11 @@ public class PrivateMessageServiceImpl extends ServiceImpl<PrivateMessageMapper,
sendMessage.setSendToSelf(true); sendMessage.setSendToSelf(true);
sendMessage.setData(msgInfo); sendMessage.setData(msgInfo);
sendMessage.setSendResult(true); sendMessage.setSendResult(true);
if (Boolean.TRUE.equals(isBlack)) {
Result<PrivateMessageVO> result =ResultUtils.error(20007,"消息已被对方拒收。");
result.setData(msgInfo);
return result;
}
imClient.sendPrivateMessage(sendMessage); imClient.sendPrivateMessage(sendMessage);
jpush(appUser.getId(),appUser.getNickName(),msg.getContent(),dto.getRecvId()); jpush(appUser.getId(),appUser.getNickName(),msg.getContent(),dto.getRecvId());
log.info("发送私聊消息,发送id:{},接收id:{},内容:{}", appUser.getId(), dto.getRecvId(), dto.getContent()); log.info("发送私聊消息,发送id:{},接收id:{},内容:{}", appUser.getId(), dto.getRecvId(), dto.getContent());

Loading…
Cancel
Save