目录
引言
随着数字技术的迅猛发展,人们之间的沟通方式也在不断演进。传统的面对面交流已经逐渐被网络聊天所替代,而基于网络的聊天工具也在不断涌现。在这个背景下,我们推出了 SEED 网页聊天室,这是一个基于 Spring Boot、MyBatis 和 WebSocket 技术的项目。本项目旨在提供一个功能强大、用户友好且安全可靠的在线聊天平台,满足各种社交和工作需求。
技术栈
- 后端框架: Spring Boot
- 数据存储: MyBatis
- 实时通信: WebSocket
- 前端界面: HTML、CSS、JavaScript
- 数据库: MySQL
主要功能特点及部分核心代码
1. 用户认证和注册
SEED 聊天室支持用户认证和注册功能。用户可以创建自己的账户,用户还可以上传个人头像来自定义他们的聊天资料。
核心代码:
@PostMapping("/register")
@ResponseBody
// 将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端。
public Object register(String username,String password){
User user=null;
try {
user=new User();
user.setUsername(username);
user.setPassword(password);
int ret=userMapper.insert(user);
System.out.println("注册:"+ret);
user.setPassword("");
} catch (DuplicateKeyException e) {
// 如果用户名已经注册过(重复),注册失败,抛出DuplicateKeyException异常
user=new User();
System.out.println("注册失败!username="+username);
}
return user;
}
核心代码:
@PostMapping("/login")
//@PostMapping注解是@RequestMapping注解的一种特殊形式,
// 用于将HTTP POST请求映射到控制器方法上。例如,@PostMapping("/login")表示将POST请求映射到/login路径上。
@ResponseBody
// 将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端。
// 实现后端登录接口
public Object login(String username,String password,HttpServletRequest req){
// HttpServletRequest req是Java Servlet API中的一个接口,它代表了一个HTTP请求。
// 通过HttpServletRequest对象,我们可以获取客户端发送的数据,并且根据这些数据来进行相应的处理。
// 1.先在数据库查找是否username对应的user对象
User user=userMapper.selectByName(username);
// 查看用户名是否为空或者密码是否匹配
if(user==null||!user.getPassword().equals(password)){
System.out.println("用户名或者密码错误"+user);
return new User();
}
// 2.如果都匹配则登录成功,创建会话
HttpSession session=req.getSession(true);
// 通过设置布尔参数为 true,表示如果不存在 HttpSession 对象,则创建一个新的。
session.setAttribute("user",user);
// 将一个名为 "user" 的属性和对应的值存储到 HttpSession 对象中。
// 在这里,将一个名为 "user" 的属性设置为对象user的值
user.setPassword("");
// 密码不显示
return user;
}
2. 实时聊天
SEED 聊天室提供了实时聊天功能,用户可以轻松地与在线好友进行一对一的聊天。聊天界面简洁清晰,支持文本消息的发送。
部分核心代码:
private void transferMessage(User fromUser, MessageRequest req) throws IOException {
// 1.构造一个待转发的MessageResponse对象
MessageResponse resp = new MessageResponse();
resp.setType("message");
resp.setFromId(fromUser.getUserId());
resp.setFromName(fromUser.getUsername());
resp.setSessionId(req.getSessionId());
resp.setContent(req.getContent());
// 2.根据请求中的sessionId,通过数据库,获取到MessageSession里有哪些用户
List<Friend> friends = messageSessionMapper.getFriendBySessionId(req.getSessionId(), fromUser.getUserId());
// 上述查询是不包括自己的,但是此处希望自己也能收到响应,所以要把自己的信息加入到friends中
Friend myself = new Friend();
myself.setFriendId(fromUser.getUserId());
myself.setFriendName(fromUser.getUsername());
friends.add(myself);
//转发的消息要放在数据库中,即需要往message表中放一条记录,等用户再次上线仍可以看到消息
Message message = new Message();
message.setFromId(fromUser.getUserId());
message.setSessionId(req.getSessionId());
message.setContent(req.getContent());
// 像自增主键, 还有时间这样的属性, 都可以让 SQL 在数据库中生成
messageMapper.add(message);
int messageId = messageMapper.selectMessageId(req.getSessionId(), fromUser.getUserId());
String respJson = "";
// 3.循环遍历上述列表,给列表中的每一个好友都发一份响应
for (Friend friend : friends) {
// 知道了userId通过OnlineUserManager中的getSession即可得到WebSocketSession session
WebSocketSession webSocketSession = onlineUserManager.getSession(friend.getFriendId());
// 如果之前删除过会话,则需要把删除会话置为false,下次登录可以将信息显示
messageSessionMapper.markMessageSessionUserAsRestore(req.getSessionId(),fromUser.getUserId());
messageSessionMapper.markMessageSessionUserAsRestore(req.getSessionId(),friend.getFriendId());
//添加一条消息未读,如果是自己,就添加一条已读消息
if (friend.getFriendId() != fromUser.getUserId()){
messageSessionMapper.addNoReadMessage(messageId,friend.getFriendId());
}else {
messageSessionMapper.addReadMessage(messageId,friend.getFriendId());
}
// 统计未读消息个数
int count=messageSessionMapper.countOfNoRead(req.getSessionId(), friend.getFriendId());
resp.setNoReadCount(count);
if (webSocketSession == null) {
continue;
// 如果用户不在线则不发送,存储在数据库中,等到用户在线,通过触发获取历史消息方法即可看到转发来的消息
}
//将Java对象转为JSON格式字符串
respJson = objectMapper.writeValueAsString(resp);
System.out.println("[transferMessage] respJOSN" + respJson);
webSocketSession.sendMessage(new TextMessage(respJson));
// new TextMessage是一个用于创建文本消息的类。
}
}
3. 群聊
用户可以创建自己的聊天群组,邀请朋友和同事加入,并进行群聊。群组聊天支持多人同时参与,提供了高效的协作环境。
部分核心代码:
@PostMapping("/createGroupChat")
@ResponseBody
public GroupChat createGroupChat(@RequestBody GroupChatRequest request, @SessionAttribute("user") User user) {
List<Integer> friendIds = request.getFriendIds();
String groupName = request.getGroupName();
GroupChat groupChat=new GroupChat();
// 将自己也添加进去
friendIds.add(user.getUserId());
MessageSession messageSession=new MessageSession();
//新增一个会话
messageSessionMapper.addMessageSession(messageSession);
//把friendIds的所有id都插入session_user
for (int userId : friendIds){
addMessageSession(userId,messageSession);
// int count = groupChatMapper.countGroupChatBySessionId(messageSession.getSessionId());
// if (count>0){
// groupChatMapper.deleteGroupUser(messageSession.getSessionId(),userId);
// }
}
groupChat.setCreatedBy(user.getUserId());
groupChat.setSessionId(messageSession.getSessionId());
groupChat.setGroupName(groupName);
try {
groupChatMapper.createGroupChat(groupChat);
return groupChat;
} catch (Exception e) {
return null;
}
}
public void addMessageSession(int userId, MessageSession messageSession){
//给message_session_user表插入记录
MessageSessionUserItem item=new MessageSessionUserItem();
item.setSessionId(messageSession.getSessionId());
item.setUserId(userId);
messageSessionMapper.addMessageSessionUser(item);
}
4. 好友管理
SEED 聊天室允许用户管理自己的好友列表。用户可以添加、删除和查找好友,随时查看好友申请并开始与他们聊天。
部分的核心代码:
@GetMapping("/friends")
public List<Friend> getFriends(int user_id) {
System.out.println(friendMapper.getFriendsByUserId(user_id));
return friendMapper.getFriendsByUserId(user_id);
}
@GetMapping("/getSearchUsers")
public Object getSearchUsers(String username,int userId){
List<SearchUser> users= new ArrayList<>();
// 根据用户名模糊匹配查询获取user_id列表
System.out.println(username);
List<Integer> userIdList = friendMapper.getUserIdsByUsername(username);
for (Integer searchUserId : userIdList) {
if (searchUserId != userId) {
//根据id查找被查找的用户姓名
String searchName=userMapper.selectUsernameById(searchUserId);
//查找用户与本人之间的关系,为false是好友,如果为空,改为true
Boolean isFriend = friendMapper.getFriendshipStatus(userId,searchUserId);
if (isFriend==null){
isFriend=true;
}
// 组装SearchUser对象
SearchUser searchUser = new SearchUser();
searchUser.setUserId(searchUserId);
searchUser.setUsername(searchName);
searchUser.setStatus(isFriend); // true表示非好友,false表示好友关系
//最后把searchUser放到查找用户的集合里面
users.add(searchUser);
}
}
System.out.println(users);
return users;
}
// 获取申请者列表
@GetMapping("/applyList")
public List<FriendshipAndContentDTO> getAppliersList(int userId){
List<FriendshipAndContentDTO> friendshipAndContentDTOS=friendMapper.getAppliersList(userId);
System.out.println(friendshipAndContentDTOS);
return friendshipAndContentDTOS;
}
@PostMapping("/searchApply")
public SearchUser isHaveApply(HttpServletRequest req){
HttpSession session=req.getSession(false);
SearchUser searchUser=new SearchUser();
if (session == null){
System.out.println("[isHaveApply] 获取会话失败!");
return searchUser;
}
User user=(User) session.getAttribute("user");
if (user == null){
System.out.println("[isHaveApply] user==null !");
return searchUser;
}
Boolean result = friendMapper.isHaveApply(user.getUserId());
// 对查询结果进行判断
if (result != null) {
searchUser.setStatus(result);
} else {
// 处理查询结果为 null 的情况
System.out.println("[isHaveApply] 查询结果为null!");
// 设置默认值或做其他处理
}
return searchUser;
}
5. 消息通知
当用户收到新消息,SEED 聊天室会发送通知,确保用户不会错过任何重要信息。
结语
SEED 网页聊天室的开发和推出是一个令人兴奋的时刻。通过整合现代技术,我们成功地打造了一个多功能的聊天平台,使用户能够更轻松地保持联系、分享信息和合作工作。我们希望SEED能够成为用户在数字时代的得力助手,为他们的社交互动、协作和沟通提供便利和快捷。
展望
未来,我们将持续改进和增强SEED网页聊天室。我们计划引入更多有趣的功能,如语音和视频通话、文件共享、聊天机器人等,以进一步提高用户体验。我们也将注重安全性和隐私保护,确保用户的信息得到妥善保护。同时,我们鼓励用户积极参与,提供反馈和建议,以帮助我们不断改进和完善SEED。在数字互联的未来,SEED将继续为用户提供连接和沟通的便利,成为他们不可或缺的工具之一。感谢您的支持和信任,让我们一起迎接未来的挑战和机遇。
本文内容到此结束了,
如有收获欢迎点赞收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误疑问💬欢迎各位指出。
主页:发呆的百香果子_spring,软件测试-CSDN博客求同存异,与光同尘🏃🏃