基于vue+springboot+websocket的多人聊天室

目录

1.介绍:

2.部分代码:


1.介绍

本项目是基于vue+springboot+websocket的多人聊天室,包括登陆注册,群聊通信,文件图片上传,创建群聊,加入退出群聊,个人信息展示和修改。

2.部分代码:
前端:

websocket通信(包括文件上传、图片上传):

<template>
  <div class="rightSide">
    <!-- chatbox -->
    <div class="chat-box">
      <header>
        <span class="head_span">{
  { roomName }}</span></header>
      <div class="msg-box" ref="msg-box">
        <div v-if="list.length > 0">
          <div v-for="(i, index) in list" :key="index" class="msg" :style="i.userId === userId ? 'flex-direction: row-reverse' : ''">
            <div class="user-head">
              <img :src="i.avatar" height="30" width="30" :title="i.username" />
            </div>
            <div class="user-msg">
              <span :style="i.userId === userId ? 'float: right;' : ''" :class="i.userId === userId ? 'right' : 'left'">
               <!-- 判断内容是图片还是文件类型 -->
               <div v-if="i.fileUrl">
                  <template v-if="isImage(i.fileType)">
                    <img :src="i.fileUrl" alt="image" class="message-img" />
                      </template>
                        <template v-else>
                          <a :href="i.fileUrl" target="_blank">{
  { i.fileName }}</a>
                      </template>
               </div>
               <div v-else>{
  { i.content }}</div>
            </span>
            </div>
          </div>
        </div>
        <div v-else>
          <p>当前没有消息</p>
        </div>
      </div>
      <div class="input-box">
        <i class="el-icon-picture" @click="triggerImageUpload"></i>
        <i class="el-icon-files" @click="triggerFileUpload"></i>
        <input type="text" ref="sendMsg" v-model="contentText" @keyup.enter="sendText()" />
        <div class="btn" :class="{['btn-active']: contentText}" @click="sendText()">发送</div>
      </div>
    </div>

    <!-- 图片上传组件 -->
    <el-upload
        ref="imageUpload"
        action="http://localhost:8082/file/upload"
        :show-file-list="false"
        :accept="'image/jpeg, image/png'"
        :before-upload="beforeImageUpload"
        :on-change="handleImageChange"
        :auto-upload="false"
    ></el-upload>

    <!-- 文件上传组件 -->
    <el-upload
        ref="fileUpload"
        action="http://localhost:8082/file/upload"
        :show-file-list="false"
        :accept="'*/*'"
        :before-upload="beforeFileUpload"
        :on-change="handleFileChange"
        :auto-upload="false"
    ></el-upload>
  </div>
</template>

<script>
import chatGroup from "@/views/chat/chatGroup.vue";
import { Message } from "element-ui";
import {eventBus} from "@/utils/eventBus";

let socket;

export default {
  name: "chatSpace",
  components: {
    chatGroup,
  },
  data() {
    return {
      roomId: sessionStorage.getItem("roomId"),
      roomName: '默认聊天室',
      ws: null,
      count: 0,
      userId: Number(sessionStorage.getItem("userId")), // 当前用户ID
      username: sessionStorage.getItem("userName"), // 当前用户昵称
      avatar:sessionStorage.getItem('watchStorage'),
      list: [], // 聊天记录的数组
      contentText: "", // input输入的值
      uploadData: {
        fileUrl: '',
        fileType: '',
        fileName: '',
        userId: sessionStorage.getItem("userId"),
        roomId: sessionStorage.getItem("roomId"),
      },
      chatRooms:[],
    };
  },
  mounted() {
    this.initWebSocket();
    this.loadHistoryMessages();  // 加载历史消息
  },
  destroyed() {
    // 离开页面时关闭websocket连接
    this.ws.onclose(undefined);
    // 清除事件监听器
    window.removeEventListener('setItem', this.handleStorageChange);
  },
  created() {
    // 监听 roomId 变化
    this.$watch('roomId', (newRoomId, oldRoomId) => {
      if (newRoomId !== oldRoomId) {
        // console.log(`房间 ID 发生变化:从 ${oldRoomId} 变为 ${newRoomId}`);
        // 如果 roomId 改变,关闭当前 WebSocket 连接并重新连接
        this.initWebSocket();  // 重新初始化 WebSocket 连接
        this.loadRoomData();    // 重新加载房间数据
      }
    });
    // 监听 'changeRoom' 事件,获取传递的 index
    eventBus.$on('changeRoom', (data) => {
      this.roomId = data;
      sessionStorage.setItem("roomId", data);  // 确保 sessionStorage 中的值也更新
      this.loadRoomData();  // 每次房间切换时加载相应的房间数据
    });
    this.loadRoomData();  // 每次房间切换时加载相应的房间数据
    // 监听 StorageEvent 事件
    window.addEventListener('setItem', this.handleStorageChange);
    // 获取初始的头像数据
    this.avatar = sessionStorage.getItem('watchStorage') || '';
  },
  methods: {
    // 根据 roomId 加载房间数据
    loadRoomData() {
      this.getRequest('/chatroom/searchrooms', {}, {params: {roomId: this.roomId}}).then(resp => {
        if (resp.code === "200") {
          this.roomName = resp.data[0][1] || '默认聊天室';  // 更新房间名称
          this.list = [];  // 清空当前历史记录
          this.loadHistoryMessages();  // 加载该房间的历史消息
          if(resp.data.length==0){
            Message.error("聊天室不存在")
          }
        } else {
          this.roomName = '未知聊天室';  // 如果房间数据加载失败,显示默认名称
          this.$message.error('加载房间数据失败');
        }
      });
    },
    // 进入页面创建websocket连接
    initWebSocket() {
      // 如果已有 WebSocket 连接,先关闭
      if (this.ws) {
        this.ws.close();
        // console.log("WebSocket 连接已关闭");
      }
      let _this = this;
      if (window.WebSocket) {
        const serverHost = window.location.hostname;
        const roomId = this.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值