09-15-netty优化,修复完善app版本模块

This commit is contained in:
2025-09-16 16:10:06 +08:00
parent 7ee081c39c
commit 5d6d9020e7
8 changed files with 87 additions and 47 deletions

View File

@ -281,6 +281,8 @@ springdoc:
packages-to-scan: org.dromara.tender packages-to-scan: org.dromara.tender
- group: 25.app版本模块 - group: 25.app版本模块
packages-to-scan: org.dromara.app packages-to-scan: org.dromara.app
- group: 26.netty消息模块
packages-to-scan: org.dromara.websocket
# knife4j的增强配置不需要增强可以不配 # knife4j的增强配置不需要增强可以不配
knife4j: knife4j:
enable: true enable: true

View File

@ -28,10 +28,11 @@ public class SysPackageController {
* 获取最新版本 * 获取最新版本
*/ */
@GetMapping("/getNewVersion") @GetMapping("/getNewVersion")
public R<List<SysPackage>> getNewVersion() { public R<SysPackage> getNewVersion() {
LambdaQueryWrapper<SysPackage> lambdaQueryWrapper =new LambdaQueryWrapper<>(); LambdaQueryWrapper<SysPackage> lambdaQueryWrapper =new LambdaQueryWrapper<>();
lambdaQueryWrapper.orderByDesc(SysPackage::getCreateTime); lambdaQueryWrapper.orderByDesc(SysPackage::getCreateTime);
List<SysPackage> one = sysPackageService.list(lambdaQueryWrapper); lambdaQueryWrapper.last("LIMIT 1");
SysPackage one = sysPackageService.getOne(lambdaQueryWrapper);
return R.ok(one); return R.ok(one);
} }
@ -60,6 +61,21 @@ public class SysPackageController {
} }
/**
* 删除
*/
@Transactional
@GetMapping("/remove")
public R<Void> remove(Long id){
SysPackage byId = sysPackageService.getById(id);
Boolean b1 = sysOssService.deleteWithValidByIds(List.of(byId.getFileId()), false);
boolean b = sysPackageService.removeById(id);
if (b1 && b){
return R.ok();
}
return R.fail("删除文件或记录失败");
}
} }

View File

@ -68,7 +68,8 @@ public class ChatServer {
}); });
log.info("Netty聊天服务器启动端口" + port); log.info("Netty聊天服务器启动端口" + port);
ChannelFuture future = bootstrap.bind(port).sync(); bootstrap.bind(port).sync();
// ChannelFuture future = bootstrap.bind(port).sync();
// future.channel().closeFuture().sync(); // future.channel().closeFuture().sync();
} finally { } finally {
// workerGroup.shutdownGracefully().sync(); // workerGroup.shutdownGracefully().sync();

View File

@ -67,7 +67,7 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
// 使用内存映射替代Redis存储 // 使用内存映射替代Redis存储
private static final ConcurrentHashMap<String, List<ChannelHandlerContext>> userChannelMap = new ConcurrentHashMap<>(); private static final ConcurrentHashMap<String, List<ChannelHandlerContext>> userChannelMap = new ConcurrentHashMap<>();
private static final ConcurrentHashMap<ChannelHandlerContext, String> channelUserMap = new ConcurrentHashMap<>(); private static final ConcurrentHashMap<ChannelHandlerContext, String> channelUserMap = new ConcurrentHashMap<>();
//维护用户房间未读数量的映射表 用户->RoomId RoomId->Count 用户+房间->Count //维护用户房间未读数量的映射表 用户+房间->Count
private static final ConcurrentHashMap<String, Integer> userRoomCountMap = new ConcurrentHashMap<>(); private static final ConcurrentHashMap<String, Integer> userRoomCountMap = new ConcurrentHashMap<>();
//维护一个在线用户列表 //维护一个在线用户列表
private static final List<String> onlineUserList = new ArrayList<>(); private static final List<String> onlineUserList = new ArrayList<>();
@ -313,11 +313,7 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
SysOssVo byId = sysOssService.getById(sysUserVo.getAvatar()); SysOssVo byId = sysOssService.getById(sysUserVo.getAvatar());
if(byId != null){ if(byId != null){
jsonObject.put("avatar", byId.getUrl()); jsonObject.put("avatar", byId.getUrl());
}else {
jsonObject.put("avatar", "http://xny.yj-3d.com:9000/xinnengyuan/2025/09/13/d10d60315d6e41718bfaaab4df53c84e.png");
} }
}else {
jsonObject.put("avatar", "http://xny.yj-3d.com:9000/xinnengyuan/2025/09/13/d10d60315d6e41718bfaaab4df53c84e.png");
} }
log.info("收到客户端消息:{}", jsonObject); log.info("收到客户端消息:{}", jsonObject);
String RoomId = jsonObject.get("roomId").toString(); String RoomId = jsonObject.get("roomId").toString();
@ -343,7 +339,7 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
chatHistory.setIsRead("1"); chatHistory.setIsRead("1");
chatHistory.setMessageType(jsonObject.get("messageType").toString()); chatHistory.setMessageType(jsonObject.get("messageType").toString());
if (!jsonObject.get("messageType").equals("text")){ if (!jsonObject.get("messageType").equals("txt")){
//将携带base64转为文件然后进行存储 赋值url //将携带base64转为文件然后进行存储 赋值url
String base64Data = jsonObject.get("message").toString(); String base64Data = jsonObject.get("message").toString();
@ -460,10 +456,12 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
jsonObject.put("type", "0"); jsonObject.put("type", "0");
jsonObject.put("message", message); jsonObject.put("message", message);
jsonObject.put("messageType", "txt");
//初始化变量 //初始化变量
LambdaQueryWrapper<ChatGroup> lambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<ChatGroup> lambdaQueryWrapper = new LambdaQueryWrapper<>();
ChatGroup groupServiceOne; ChatGroup groupServiceOne = null;
ChatHistory chatHistory = null;
switch (value){ switch (value){
//1:系统消息 //1:系统消息
@ -478,20 +476,20 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
groupServiceOne.setMembers("[99, "+userId+"]"); groupServiceOne.setMembers("[99, "+userId+"]");
groupServiceOne.setLastMessage(message); groupServiceOne.setLastMessage(message);
groupServiceOne.setLastMessageTime(new Date()); groupServiceOne.setLastMessageTime(new Date());
chatGroupService.save(groupServiceOne); // chatGroupService.save(groupServiceOne);
}else { }else {
groupServiceOne.setLastMessage(message); groupServiceOne.setLastMessage(message);
groupServiceOne.setLastMessageTime(new Date()); groupServiceOne.setLastMessageTime(new Date());
chatGroupService.updateById(groupServiceOne); // chatGroupService.updateById(groupServiceOne);
} }
ChatHistory chatHistory = new ChatHistory(); chatHistory = new ChatHistory();
//发送方设置为99 表示系统消息 //发送方设置为99 表示系统消息
chatHistory.setSenderId(99L); chatHistory.setSenderId(99L);
chatHistory.setGeterId(groupServiceOne.getId()); chatHistory.setGeterId(groupServiceOne.getId());
chatHistory.setMessage(jsonObject.toString()); chatHistory.setMessage(jsonObject.toString());
chatHistory.setMessageDate(new Date()); chatHistory.setMessageDate(new Date());
chatHistory.setIsRead("1");//未读 chatHistory.setIsRead("1");//未读
chatHistoryService.save(chatHistory); // chatHistoryService.save(chatHistory);
jsonObject.put("roomId", groupServiceOne.getId()); jsonObject.put("roomId", groupServiceOne.getId());
} }
@ -506,20 +504,20 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
groupServiceOne.setMembers("[100, "+userId+"]"); groupServiceOne.setMembers("[100, "+userId+"]");
groupServiceOne.setLastMessage(message); groupServiceOne.setLastMessage(message);
groupServiceOne.setLastMessageTime(new Date()); groupServiceOne.setLastMessageTime(new Date());
chatGroupService.save(groupServiceOne); // chatGroupService.save(groupServiceOne);
}else { }else {
groupServiceOne.setLastMessage(message); groupServiceOne.setLastMessage(message);
groupServiceOne.setLastMessageTime(new Date()); groupServiceOne.setLastMessageTime(new Date());
chatGroupService.updateById(groupServiceOne); // chatGroupService.updateById(groupServiceOne);
} }
ChatHistory chatHistory = new ChatHistory(); chatHistory = new ChatHistory();
//发送方设置为100 表示系统消息中的考勤消息 //发送方设置为100 表示系统消息中的考勤消息
chatHistory.setSenderId(100L); chatHistory.setSenderId(100L);
chatHistory.setGeterId(groupServiceOne.getId()); chatHistory.setGeterId(groupServiceOne.getId());
chatHistory.setMessage(jsonObject.toString()); chatHistory.setMessage(jsonObject.toString());
chatHistory.setMessageDate(new Date()); chatHistory.setMessageDate(new Date());
chatHistory.setIsRead("1");//未读 chatHistory.setIsRead("1");//未读
chatHistoryService.save(chatHistory); // chatHistoryService.save(chatHistory);
jsonObject.put("roomId", groupServiceOne.getId()); jsonObject.put("roomId", groupServiceOne.getId());
} }
@ -534,20 +532,20 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
groupServiceOne.setMembers("[101, "+userId+"]"); groupServiceOne.setMembers("[101, "+userId+"]");
groupServiceOne.setLastMessage(message); groupServiceOne.setLastMessage(message);
groupServiceOne.setLastMessageTime(new Date()); groupServiceOne.setLastMessageTime(new Date());
chatGroupService.save(groupServiceOne); // chatGroupService.save(groupServiceOne);
}else { }else {
groupServiceOne.setLastMessage(message); groupServiceOne.setLastMessage(message);
groupServiceOne.setLastMessageTime(new Date()); groupServiceOne.setLastMessageTime(new Date());
chatGroupService.updateById(groupServiceOne); // chatGroupService.updateById(groupServiceOne);
} }
ChatHistory chatHistory = new ChatHistory(); chatHistory = new ChatHistory();
//发送方设置为101 表示系统消息中的安全消息 //发送方设置为101 表示系统消息中的安全消息
chatHistory.setSenderId(101L); chatHistory.setSenderId(101L);
chatHistory.setGeterId(groupServiceOne.getId()); chatHistory.setGeterId(groupServiceOne.getId());
chatHistory.setMessage(jsonObject.toString()); chatHistory.setMessage(jsonObject.toString());
chatHistory.setMessageDate(new Date()); chatHistory.setMessageDate(new Date());
chatHistory.setIsRead("1");//未读 chatHistory.setIsRead("1");//未读
chatHistoryService.save(chatHistory); // chatHistoryService.save(chatHistory);
jsonObject.put("roomId", groupServiceOne.getId()); jsonObject.put("roomId", groupServiceOne.getId());
} }
@ -562,28 +560,30 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
groupServiceOne.setMembers("[102, "+userId+"]"); groupServiceOne.setMembers("[102, "+userId+"]");
groupServiceOne.setLastMessage(message); groupServiceOne.setLastMessage(message);
groupServiceOne.setLastMessageTime(new Date()); groupServiceOne.setLastMessageTime(new Date());
chatGroupService.save(groupServiceOne); // chatGroupService.save(groupServiceOne);
}else { }else {
groupServiceOne.setLastMessage(message); groupServiceOne.setLastMessage(message);
groupServiceOne.setLastMessageTime(new Date()); groupServiceOne.setLastMessageTime(new Date());
chatGroupService.updateById(groupServiceOne); // chatGroupService.updateById(groupServiceOne);
} }
ChatHistory chatHistory = new ChatHistory(); chatHistory = new ChatHistory();
//发送方设置为102 表示系统消息中的质量消息 //发送方设置为102 表示系统消息中的质量消息
chatHistory.setSenderId(102L); chatHistory.setSenderId(102L);
chatHistory.setGeterId(groupServiceOne.getId()); chatHistory.setGeterId(groupServiceOne.getId());
chatHistory.setMessage(jsonObject.toString()); chatHistory.setMessage(jsonObject.toString());
chatHistory.setMessageDate(new Date()); chatHistory.setMessageDate(new Date());
chatHistory.setIsRead("1");//未读 chatHistory.setIsRead("1");//未读
chatHistoryService.save(chatHistory);
jsonObject.put("roomId", groupServiceOne.getId()); jsonObject.put("roomId", groupServiceOne.getId());
} }
default -> { default -> {
return; throw new RuntimeException("未知的类型");
} }
} }
chatGroupService.saveOrUpdate(groupServiceOne);
chatHistoryService.save(chatHistory);
//发送消息后 将该房间未读消息数加1 //发送消息后 将该房间未读消息数加1
if (userRoomCountMap.containsKey(userId+"+"+groupServiceOne.getId())){ if (userRoomCountMap.containsKey(userId+"+"+groupServiceOne.getId())){
@ -616,7 +616,6 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
} }
}); });
jsonObject.put("unReadCount", temp); jsonObject.put("unReadCount", temp);
jsonObject.put("messageType", "txt");
} }

View File

@ -132,7 +132,7 @@ public class ChatFriendshipController {
*/ */
// @SaCheckPermission("chatGroup:chatFriendship:getList") // @SaCheckPermission("chatGroup:chatFriendship:getList")
@GetMapping("/getList") @GetMapping("/getList")
public TableDataInfo<SysUserVo> getList(SysUserBo bo, PageQuery pageQuery){ public R<TableDataInfo<SysUserVo>> getList(SysUserBo bo, PageQuery pageQuery){
// Long userId = LoginHelper.getLoginUser().getUserId(); // Long userId = LoginHelper.getLoginUser().getUserId();
// LambdaQueryWrapper<ChatFriendship> lambdaQueryWrapper = new LambdaQueryWrapper<>(); // LambdaQueryWrapper<ChatFriendship> lambdaQueryWrapper = new LambdaQueryWrapper<>();
// lambdaQueryWrapper.eq(ChatFriendship::getOurSide, userId); // lambdaQueryWrapper.eq(ChatFriendship::getOurSide, userId);

View File

@ -25,6 +25,7 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
@RestController @RestController
@RequestMapping("/chatGroup") @RequestMapping("/chatGroup")
@ -106,26 +107,38 @@ public class ChatGroupController {
Long userId = LoginHelper.getLoginUser().getUserId(); Long userId = LoginHelper.getLoginUser().getUserId();
LambdaQueryWrapper<ChatGroup> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<ChatGroup> queryWrapper = new LambdaQueryWrapper<>();
//无论单群聊 群聊 成员都会有自己 //无论单群聊 群聊 成员都会有自己
queryWrapper.like(ChatGroup::getMembers,userId+",").or().like(ChatGroup::getMembers,userId+"]");//.eq(ChatGroup::getOwerId,userId).or() queryWrapper.like(ChatGroup::getMembers,userId+",").or().like(ChatGroup::getMembers,userId+"]");
// queryWrapper.like(searchObject.getName() != null && !searchObject.getName().isEmpty(),ChatGroup::getName,searchObject.getName());
//按最后聊天时间排序 //按最后聊天时间排序
queryWrapper.orderByDesc(ChatGroup::getLastMessageTime); queryWrapper.orderByDesc(ChatGroup::getLastMessageTime);
List<ChatGroup> list = chatGroupService.page(pageQuery.build(),queryWrapper).getRecords(); List<ChatGroup> list = chatGroupService.page(pageQuery.build(),queryWrapper).getRecords();
List<ChatGroup> searchTemp = new ArrayList<>(); // List<ChatGroup> searchTemp = new ArrayList<>();
if (!list.isEmpty()) { if (!list.isEmpty()) {
for (ChatGroup chatGroup : list) { // for (ChatGroup chatGroup : list) {
setValue(chatGroup, userId); // setValue(chatGroup, userId);
//过滤搜索 // //过滤搜索
if (searchObject != null && searchObject.getName() != null && !searchObject.getName().isEmpty()) { // if (searchObject != null && searchObject.getName() != null && !searchObject.getName().isEmpty()) {
if (chatGroup.getName().contains(searchObject.getName())) { // if (chatGroup.getName().contains(searchObject.getName())) {
searchTemp.add(chatGroup); // searchTemp.add(chatGroup);
} // }
} else { // } else {
searchTemp.add(chatGroup); // searchTemp.add(chatGroup);
} // }
// }
for (ChatGroup chatGroup : list){
setValue(chatGroup,userId);
} }
if (searchObject != null && searchObject.getName() != null && !searchObject.getName().isEmpty()){
return R.ok(
list.stream()
.filter(chatGroup -> chatGroup.getName().contains(searchObject.getName()))
.toList());
}else {
return R.ok(list);
}
}else {
return R.fail("没有数据");
} }
return R.ok(searchTemp);
} }
/** /**
@ -168,10 +181,8 @@ public class ChatGroupController {
@GetMapping("/groupChatRecord") @GetMapping("/groupChatRecord")
public TableDataInfo<ChatHistoryVo> groupChatRecord(@RequestParam Long id, PageQuery pageQuery) { public TableDataInfo<ChatHistoryVo> groupChatRecord(@RequestParam Long id, PageQuery pageQuery) {
LambdaQueryWrapper<ChatHistory> lambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<ChatHistory> lambdaQueryWrapper = new LambdaQueryWrapper<>();
// lambdaQueryWrapper.eq(ChatHistory::getGroupId,id).eq(ChatHistory::getType,"1");
lambdaQueryWrapper.eq(ChatHistory::getGeterId, id); lambdaQueryWrapper.eq(ChatHistory::getGeterId, id);
IPage<ChatHistoryVo> chatHistoryVoIPage = chatHistoryService.getBaseMapper().selectVoPage(pageQuery.build(), lambdaQueryWrapper); IPage<ChatHistoryVo> chatHistoryVoIPage = chatHistoryService.getBaseMapper().selectVoPage(pageQuery.build(), lambdaQueryWrapper);
// List<ChatHistory> list = chatHistoryService.list(lambdaQueryWrapper);
for (ChatHistoryVo chatHistory : chatHistoryVoIPage.getRecords()) { for (ChatHistoryVo chatHistory : chatHistoryVoIPage.getRecords()) {
SysUserVo sysUserVo = sysUserService.selectUserById(chatHistory.getSenderId()); SysUserVo sysUserVo = sysUserService.selectUserById(chatHistory.getSenderId());
if (sysUserVo != null){ if (sysUserVo != null){
@ -198,6 +209,7 @@ public class ChatGroupController {
if (sysUserVo != null) { if (sysUserVo != null) {
byId.setName(sysUserVo.getNickName()); byId.setName(sysUserVo.getNickName());
byId.setAvatar(sysUserVo.getAvatar()); byId.setAvatar(sysUserVo.getAvatar());
byId.setSex(sysUserVo.getSex());
} else { } else {
byId.setName("此用户已注销"); byId.setName("此用户已注销");
byId.setAvatar(null); byId.setAvatar(null);

View File

@ -39,6 +39,9 @@ public class ChatGroup implements Serializable {
@Translation(type = TransConstant.OSS_ID_TO_URL) @Translation(type = TransConstant.OSS_ID_TO_URL)
private Long avatar; private Long avatar;
@TableField(exist = false)
private String sex;
/** /**
* 是否显示0显示1隐藏 * 是否显示0显示1隐藏
*/ */

View File

@ -10,10 +10,13 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.domain.SysDept; import org.dromara.system.domain.SysDept;
import org.dromara.system.domain.SysUser; import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.SysUserFile; import org.dromara.system.domain.SysUserFile;
@ -42,7 +45,11 @@ public class ChatFriendshipServiceImpl extends ServiceImpl<ChatFriendshipMapper,
@Autowired @Autowired
private ISysUserFileService userFileService; private ISysUserFileService userFileService;
public TableDataInfo<SysUserVo> getAppUserList(SysUserBo user, PageQuery pageQuery){ public R<TableDataInfo<SysUserVo>> getAppUserList(SysUserBo user, PageQuery pageQuery){
SysUserVo sysUserVo = sysUserMapper.selectVoById(LoginHelper.getLoginUser().getUserId());
if (sysUserVo.getProjectIds() == null || sysUserVo.getProjectIds().isEmpty()){
return R.fail("该账号暂无项目组,请联系管理员尽快分配");
}
Page<SysUserVo> page = sysUserMapper.selectPageUserList(pageQuery.build(), this.buildQueryWrapper(user)); Page<SysUserVo> page = sysUserMapper.selectPageUserList(pageQuery.build(), this.buildQueryWrapper(user));
List<SysUserVo> userVoList = page.getRecords(); List<SysUserVo> userVoList = page.getRecords();
List<Long> userIdList = userVoList.stream().map(SysUserVo::getUserId).toList(); List<Long> userIdList = userVoList.stream().map(SysUserVo::getUserId).toList();
@ -63,7 +70,7 @@ public class ChatFriendshipServiceImpl extends ServiceImpl<ChatFriendshipMapper,
}); });
page.setRecords(userVoList); page.setRecords(userVoList);
} }
return TableDataInfo.build(page); return R.ok(TableDataInfo.build(page));
} }