共同编辑文档功能实现(websocket)

news/2024/7/24 12:46:33 标签: websocket, vue.js, 网络协议

目录

前言

websocket%E5%B0%81%E8%A3%85-toc" style="margin-left:0px;">websocket封装

wangeditor下载

共同编辑文档代码实现

HTML样式部分

JS部分

css部分


前言

功能:实现文档共同编辑功能,可以实时接收到其他人的信息 

思路:先调用接口获取相应的数据进行渲染,然后通过webSocket建立链接,实时进行数据的接收和修改。

技术栈:pinia,vue3,websocket,wangeditor

websocket%E5%B0%81%E8%A3%85">websocket封装

        参考文章:在vue项目中webSocket封装(传token)-CSDN博客

这里就不在做赘述了。

wangeditor下载

        wangeditor是一个富文本容器,在本次共享文档中,我们通过它当输入框(原因:它能够保存输入的格式)

        官网:安装 | wangEditor

本项目中我们只需要进行简单的安装就行

yarn add @wangeditor/editor
# 或者 npm install @wangeditor/editor --save

yarn add @wangeditor/editor-for-vue@next
# 或者 npm install @wangeditor/editor-for-vue@next --save

在安装完成后,一定要在相应的vue文件中引入css样式

<style src="@wangeditor/editor/dist/css/style.css"></style>

 选中文字后会出现样式的更改的功能,如果不喜欢可以直接去上面css源码里把其中的样式更改掉

共同编辑文档代码实现

HTML样式部分

<template>
  <div class="all">
      <el-table :data="tableData" :border="true" style="padding-left: 1px">
        <el-table-column prop="name" width="80">
          <template #="scoped">
            <div style="padding-left: 10px">{{ scoped.row.name }}</div>
          </template>
        </el-table-column>

        <el-table-column
          v-for="(item, index) in loading"
          :key="index"
          width="300"
        >
         <template #="scoped">
            <div v-if="scoped.row.Record[index]">
              <Editor
                v-model="scoped.row.Record[index].content"
                mode="default"
                @onBlur="handleBlur(scoped.row.Record[index])"
              />
            </div>
          </template>
        </el-table-column>
      </el-table>
  </div>
</template>

JS部分

<script setup>

import {
  InterviewRecord,
} from "@/apis/home.js";

import {
  sendWebsocket,
  closeWebsocket,
  websocketSend,
} from "@/utils/websocket.js";

import { ref, onMounted, onBeforeUnmount } from "vue";
import { Editor } from "@wangeditor/editor-for-vue";


// 展示数据
const tableData = ref([]);

// 评论人的数量(渲染几个富文本框)
const loading = ref(0);

//场id
const arrangeId = ref(0);

// 请求数据接口方法
const showData = (id) => {
  InterviewRecord(id).then((res) => {
    localStorage.setItem("arrangeId", res.data.id);
    arrangeId.value = res.data.id;
    tableData.value = res.data.Students;
    loading.value = res.data.Students[0].Record.length;
  });
};

onMounted(() => {
//获取初始数据,进入行页面渲染
  showData(arrangeId);
//链接websocket后面的所有通信全部依靠他来实现
  sendWebsocket(wsMessage, wsError);
});

//富文本框失去焦点
const handleBlur = (e) => {
  // 发起ws数据
  websocketSend(e);
};

// 监听服务器传来的变化
const wsMessage = (data) => {
  const dataJson = data;
  // 这里写拿到数据后的业务代码
  if (tableData.value.length !== 0) {
    console.log(tableData.value);
    tableData.value
      .flatMap((innerArray) => innerArray)
      .forEach((element) => {
        element.Record.forEach((a) => {
          console.log(dataJson.arrange_id, a.arrange_id);
          if (
            dataJson.arrange_id == a.arrange_id &&
            dataJson.content_id == a.content_id &&
            dataJson.student_id == a.student_id
          ) {
            //将后台返回的数据进行,更改
            a.content = dataJson.content;
          }
        });
      });
  }
};

const wsError = () => {
  // 比如取消页面的loading
  console.log("ws连接错误的回调函数");
};

// 页面销毁时关闭ws。因为有可能ws连接接收数据尚未完成,用户就跳转了页面
// 在需要主动关闭ws的地方都可以调用该方法
onBeforeUnmount(() => {
  closeWebsocket();
});
</script>

在 // 监听服务器传来的变化时

因为第一次请求所有数据时,后台返回的数据嵌套的比较深,所有我进行了三层循环,进行定位,用来查找相匹配的数据,进行文本的更改

arrange_id: 207,         场id

student_id: 1,              学生id(行id)

content_id: 0,              列id

content: '<p>看看看看米尔</p>     内容

css部分

//最后别忘了因为富文本框的css

<style src="@wangeditor/editor/dist/css/style.css"></style>

至此所有的功能就都实现了,如果大家有什么不懂的可以在评论区里留言。


http://www.niftyadmin.cn/n/5267246.html

相关文章

MySQL 是什么?

MySQL官方网站&#xff08;http://www.mysql.com/&#xff09;提供关于MySQL软件的最新信息。 MySQL是一个数据库管理系统。 数据库是一种结构化的数据集合。它可以是从简单的购物清单到图片库&#xff0c;再到企业网络中的大量信息等任何形式。要添加、访问和处理存储在计算…

4、APScheduler: 详解Scheduler种类用法、常见错误与解决方法【Python3测试任务管理总结】

调度器(Scheduler)是将其他组件绑在一起的关键。通常在应用程序中只运行一个调度器。应用程序开发者通常不直接处理作业存储(job stores)、执行器(executors)或触发器(triggers)。相反,调度器提供了适当的接口来处理所有这些。通过调度器配置作业存储和执行器,以及添…

(2021|ICCV,DINO,ViT,自监督学习,知识蒸馏)自监督视觉 Transformer 的新特性

Emerging Properties in Self-Supervised Vision Transformers 公纵号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 相关工作 3. 方法 3.1. 自监督学习与知识蒸馏 …

vue-实现高德地图-省级行政区地块显示+悬浮显示+标签显示

<template><div><div id"container" /><div click"showFn">显示</div><div click"removeFn">移除</div></div> </template><script> import AMapLoader from amap/amap-jsapi-load…

DevEco Studio快捷键指南

DevEco Studio是一款用于开发嵌入式应用的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它提供了许多快捷键&#xff0c;可以帮助开发者更高效地编写代码。本文将介绍DevEco Studio中的一些常用快捷键&#xff0c;帮助你更好地利用这个工具。 一、常用快捷键 快速打开…

关于“Python”的核心知识点整理大全22

目录 ​编辑 9.4.2 在一个模块中存储多个类 虽然同一个模块中的类之间应存在某种相关性&#xff0c;但可根据需要在一个模块中存储任意数量的 类。类Battery和ElectricCar都可帮助模拟汽车&#xff0c;因此下面将它们都加入模块car.py中&#xff1a; car.py my_electric_car…

<软考高项备考>《论文专题 - 12 绩效域(二)》

4 团队绩效域 团队绩效域涉及项目团队人员有关的活动和职能。在项目整个生命周期过程中&#xff0c; 有效执行本绩效域可以实现预期目标&#xff0c;主要包含&#xff1a; ①共享责任&#xff1b; ②建立高绩效团队&#xff1b; ③所有团队成员都展现出相应的领导力和人际关系…

西南科技大学数字电子技术实验五(用计数器设计简单秒表)FPGA部分

一、实验目的 1.进一步理解用中规模集成计数器构成任意进制计数器的原理。 2.了解计数器的简单应用。 3.进一步学习与非门和译码显示器的使用方法。 4.学会用FPGA实现本实验内容。 二、实验原理 简单秒表 可暂停、复位秒表 三、程序清单(每条语句必须包括注释或在开发…