项目介绍:“SEED“ 网页聊天室

目录

引言

技术栈

主要功能特点

1. 用户认证和注册

2. 实时聊天

3. 群聊

4. 好友管理

5. 消息通知

结语

展望


引言

随着数字技术的迅猛发展,人们之间的沟通方式也在不断演进。传统的面对面交流已经逐渐被网络聊天所替代,而基于网络的聊天工具也在不断涌现。在这个背景下,我们推出了 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博客

求同存异,与光同尘🏃‍🏃‍

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发呆的百香果子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值