项目概述

Whiteboard 是一个基于 Node.js 的轻量级协作白板/画板系统,支持多用户实时协作绘图、文字编辑、图片处理等功能。该项目采用现代化的 Web 技术栈,提供直观的用户界面和丰富的交互功能。

核心特性

🎨 绘图功能

  • 多种绘图工具:画笔、直线、矩形、圆形、三角形
  • 实时协作:显示远程用户光标和绘图过程
  • 撤销/重做:支持每个用户的独立操作历史
  • 快捷键支持:完整的键盘快捷键系统

📱 跨平台支持

  • 响应式设计:支持 PC、平板和移动设备
  • 触摸优化:针对触摸屏设备优化交互体验
  • 多浏览器兼容:支持主流浏览器

🔧 高级功能

  • 拖拽上传:支持图片和 PDF 文件拖拽上传
  • 图片处理:缩放、移动、旋转图片
  • 文字编辑:支持文本输入和便签功能
  • 保存导出:支持保存为图片和 JSON 格式
  • WebDAV 集成:支持直接保存到云存储

技术架构

前端技术栈

// 核心依赖
- Socket.io-client: 实时通信
- Canvas API: 绘图功能
- jQuery: DOM操作
- FontAwesome: 图标系统
- Vanilla-picker: 颜色选择器

后端技术栈

// 服务器架构
- Express.js: Web服务器框架
- Socket.io: WebSocket实时通信
- Formidable: 文件上传处理
- DOMPurify: XSS防护
- WebDAV: 云存储集成

重点实现

实时协作核心 – WebSocket 通信

// 前端连接建立
const signaling_socket = io("", { path: subdir + "/ws-api" });signaling_socket.on("connect", function () {console.log("Websocket connected!");// 接收绘图数据signaling_socket.on("drawToWhiteboard", function (content) {whiteboard.handleEventsAndData(content, true);});// 加入白板signaling_socket.emit("joinWhiteboard", {wid: whiteboardId,at: accessToken,windowWidthHeight: { w: $(window).width(), h: $(window).height() },});
});

绘图引擎核心 – Canvas 操作

// 绘图状态管理
const whiteboard = {canvas: null,ctx: null,drawcolor: "black",tool: "mouse",thickness: 4,drawFlag: false,// 绘制路径drawPath: function (coords, color, thickness, lineCap) {this.ctx.strokeStyle = color;this.ctx.lineWidth = thickness;this.ctx.lineCap = lineCap;this.ctx.beginPath();this.ctx.moveTo(coords[0].x, coords[0].y);for (let i = 1; i < coords.length; i++) {this.ctx.lineTo(coords[i].x, coords[i].y);}this.ctx.stroke();},
};

服务器端处理 – 数据广播

// 服务器端Socket处理
io.on("connection", function (socket) {socket.on("joinWhiteboard", function (data) {socket.join(data.wid);socket.whiteboardId = data.wid;socket.username = data.username;// 广播用户加入信息socket.to(data.wid).emit("userJoined", {username: data.username,socketId: socket.id,});});socket.on("drawToWhiteboard", function (data) {// 广播绘图数据给其他用户socket.to(data.wid).emit("drawToWhiteboard", {coords: data.coords,color: data.color,thickness: data.thickness,tool: data.tool,username: socket.username,});});
});

文件上传处理

// 文件上传API
app.post("/api/upload", function (req, res) {const form = new formidable.IncomingForm();form.uploadDir = path.join(__dirname, "..", "public", "uploads");form.parse(req, function (err, fields, files) {if (err) {res.status(500).json({ error: "Upload failed" });return;}// 处理上传的文件const file = files.file;const safePath = getSafeFilePath(file.filepath);res.json({success: true,filepath: "/uploads/" + path.basename(safePath),});});
});

快捷键系统

// 快捷键配置
const keybinds = {"ctrl+z": "undo","ctrl+y": "redo","ctrl+s": "saveImage","ctrl+shift+k": "saveJSON","ctrl+p": "penTool","ctrl+e": "eraserTool","ctrl+l": "lineTool","ctrl+r": "rectangleTool","ctrl+c": "circleTool",
};// 快捷键处理
keymage(keybinds, function (event, handler) {event.preventDefault();shortcutFunctions[handler]();
});

部署方式

# 安装依赖
npm install# 生产环境启动
npm run start:prod# 开发环境启动
npm run start:dev

项目优势

  1. 轻量级:核心代码简洁,依赖少,启动快速
  2. 易扩展:模块化设计,便于功能扩展
  3. 高性能:Canvas 绘图,实时协作流畅
  4. 跨平台:支持多种设备和浏览器
  5. 开源免费:MIT 许可证,可自由使用和修改

应用场景

  • 在线教育:远程教学、课堂互动
  • 团队协作:项目讨论、头脑风暴
  • 设计评审:UI/UX 设计反馈
  • 会议记录:会议笔记、流程图绘制
  • 创意工作:草图绘制、创意表达

技术亮点

  • 实时协作:基于 WebSocket 的低延迟通信
  • 绘图优化:智能路径平滑和性能优化
  • 安全防护:XSS 防护和文件上传安全检查
  • 用户体验:直观的界面设计和流畅的交互
  • 可定制性:丰富的配置选项和主题支持

项目地址: https://github.com/cracker0dks/whiteboard
在线演示: https://cloud13.de/testwhiteboard/

 开源协作白板 - 轻量级多用户实时协作白板系统 - 支持多用户绘图、文字编辑、图片处理 - 高质量源码分享平台-免费下载各类网站源码与模板及前沿技术分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920893.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920893.shtml
英文地址,请注明出处:http://en.pswp.cn/news/920893.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark自定义累加器实现高效WordCount

目录 1. 代码功能概述 2. 代码逐段解析 主程序逻辑 自定义累加器 MyAccumulator 3. Spark累加器原理 累加器的作用 AccumulatorV2 vs AccumulatorV1 累加器执行流程 4. 代码扩展与优化建议 支持多词统计 线程安全优化 使用内置累加器 5. Spark累加器的适用场景 6…

开源 | 推荐一套企业级开源AI人工智能训练推理平台(数算岛):完整代码包含多租户、分布式训练、模型市场、多框架支持、边缘端适配、云边协同协议:

&#x1f525; Github 主仓库&#xff08;优先更新&#xff09;https://github.com/roinli/SSD-GPU-POOL | Gitee 镜像仓库 > 原仓库因故暂停使用&#xff0c;本仓库为镜像项目。开源版本将持续迭代优化&#xff0c;欢迎提交 Issue 或加入社群交流。 GPU 池化平台 | AI 全…

pprint:美观打印数据结构

文章目录一、pprint.pprint()&#xff1a;美观化打印二、pprint.pformat()&#xff1a;格式化成字符串表示三、pprint() 处理包含__repr__() 方法的类四、递归引用&#xff1a;Recursion on {typename} with id{number}五、depth 参数控制 pprint() 方法的输出深度六、width 参…

解决Docker运行hello-world镜像报错问题

解决Docker运行hello-world镜像报错问题当您运行sudo docker run hello-world命令时出现"Unable to find image hello-world locally"和"context deadline exceeded"错误&#xff0c;这通常是由于Docker无法从默认镜像仓库下载镜像导致的。以下是几种解决方…

一体化步进伺服电机在汽车线束焊接设备中的应用案例

在汽车制造领域&#xff0c;线束焊接是确保电气系统可靠性的关键工艺。为解决传统焊接设备限位精度不足、运行稳定性差等问题&#xff0c;采用‌STM42系列一体化步进伺服电机‌&#xff0c;通过位置模式与原点回归功能的优化配置&#xff0c;显著提升了焊接设备的定位精度与抗干…

【Django】首次创建Django项目初始化

1. 创建虚拟环境例如创建虚拟环境为rebortpython3.6 -m venv test/rebort2. 安装Djangosudo -i cd test/rebort/bin/ source ./activate pip install Django如果是在wingows上安装&#xff0c;同时适用默认安装会&#xff0c;会在python的安装目前下生成了两个文件在lib目录下会…

Spark引擎中RDD的性质

RDD&#xff08;Resilient Distributed Dataset&#xff0c;弹性分布式数据集&#xff09;是SparkCore提供的核心抽象。一个RDD在逻辑上抽象地代表了一个HDFS文件或数据库中的表&#xff0c;但RDD是被分区的&#xff0c;每个分区分布在不同的节点上&#xff0c;从而并行执行。 …

人工智能学习:什么是NLP自然语言处理

一、什么是自然语言处理 自然语言处理(Natural Language Processing, 简称NLP)是计算机科学与语言学中关注于计算机与人类语言间转换的领域,主要目标是让机器能够理解和生成自然语言,这样人们可以通过语言与计算机进行更自然的互动。 对于自然语言来说,处理的数据…

【Selenium】UI自动化测试框架设计:从项目结构到Base-Page层的最佳实践

UI自动化测试框架设计&#xff1a;从项目结构到Base-Page层的最佳实践全面解析UI自动化测试项目的架构设计与实现细节&#xff0c;构建可维护的测试框架在现代软件开发中&#xff0c;UI自动化测试已成为确保产品质量的重要环节。一个良好的项目结构和合理的设计模式能够显著提高…

QT项目文件(.pro)指南

概述Qt项目文件&#xff08;.pro文件&#xff09;是Qt开发的核心配置文件&#xff0c;它使用qmake工具来管理项目的构建过程。一个良好组织的.pro文件不仅能确保项目正确编译&#xff0c;还能大大提高代码的可维护性和团队协作效率。本文将深入探讨.pro文件的结构、语法和最佳实…

Scikit-learn Python机器学习 - 机器学习开发流程

锋哥原创的Scikit-learn Python机器学习视频教程&#xff1a; 2026版 Scikit-learn Python机器学习 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 课程介绍 本课程主要讲解基于Scikit-learn的Python机器学习知识&#xff0c;包括机器学习概述&#xff0c;特征工程(数据…

基于Spring Cloud Sleuth与Zipkin的分布式链路追踪实战指南

基于Spring Cloud Sleuth与Zipkin的分布式链路追踪实战指南 随着微服务架构的普及&#xff0c;服务间调用链条变得越来越复杂。在生产环境中&#xff0c;定位跨服务调用的性能瓶颈、故障根因&#xff0c;往往需要分布式链路追踪能力。本文结合Spring Cloud Sleuth与Zipkin&…

Coze源码分析-工作空间-项目开发-后端源码

前言 本文将深入分析Coze Studio项目中用户登录后点击"项目开发"功能的后端实现&#xff0c;通过源码解读来理解整个智能体项目管理系统的架构设计和技术实现。 项目架构概览 整体架构设计 Coze Studio后端采用了经典的分层架构模式&#xff0c;将项目开发功能划分为…

单片机元件学习

DS18B20温度传感器51&#xff08;stc8h8k64u&#xff09;简介ds18B20是使用单总线的元器件代码/*--------------------------------------------------------------------- */ /* ------------------------ For STC8H MCU ----------------------------- */ /* --- Web: www.…

Spring事务管理策略对比与性能优化实践指南

Spring事务管理策略对比与性能优化实践指南 问题背景介绍 在现代企业级应用中&#xff0c;事务管理是保障数据一致性与安全性的核心机制。Spring作为主流的Java企业级开发框架&#xff0c;提供了多种事务管理方案&#xff0c;包括编程式事务、声明式事务以及与第三方分布式事务…

C++“类吸血鬼幸存者”游戏制作的要点学习

古之学者必有师&#xff0c;对于技术的提升&#xff0c;只靠自己的摸索虽然能得到深刻的经验&#xff0c;但往往没有较高的效率。笔者这些天学习了BV1eM4m1S74K“提瓦特幸存者”的C开发&#xff0c;也是实现了该类型游戏的开发。今天&#xff0c;就通过经验总结&#xff0c;亲手…

Python OpenCV图像处理与深度学习:Python OpenCV图像分割入门

图像分割&#xff1a;从基础到实践 学习目标 通过本课程&#xff0c;学员们将了解图像分割的基本概念&#xff0c;掌握使用OpenCV实现图像分割的方法&#xff0c;包括基于阈值的分割和基于区域的分割技术。同时&#xff0c;学员将能够独立完成简单的图像分割任务&#xff0c;并…

MQ使用场景分析

异步解耦‌系统间通过消息队列通信&#xff0c;降低耦合度&#xff08;如订单系统与库存系统&#xff09;典型场景&#xff1a;电商下单后异步通知物流系统‌流量削峰‌应对突发流量&#xff0c;将请求暂存到消息队列逐步处理典型场景&#xff1a;秒杀活动时缓冲高并发请求‌数…

人工智能学习:NLP文本处理的基本方法

一、分词 1、分词介绍 概念 分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符。分词过程就是找到这样分界符的过程…

Vue3 中 Proxy 在组件封装中的妙用

目录 Vue3 中 Proxy 在组件封装中的妙用&#xff1a;让组件交互更优雅 组件封装中的常见痛点 Proxy 是什么&#xff1f; Proxy 在组件封装中的应用 基础组件结构 使用 Proxy 实现方法透传 代码解析 父组件中的使用方式 Proxy 的其他应用场景 1. 权限控制 2. 方法调用…