CollabEdit 是一个面向团队的协同编辑平台,提供文档管理、实时协作、评论批注、消息中心与视频通话等功能。前端基于 Vue 3 + Vite,后端基于 Spring Boot 3,核心协作通过 WebSocket + OT 算法实现。
- Spring Boot 3.4.1
- Spring Web / WebSocket / Security / Mail
- MyBatis-Plus + MySQL
- Redis
- JWT (jjwt)
- Jackson JSR310 + Fastjson
- Lombok
- Vue 3 + Vite
- Vue Router
- Element Plus
- WangEditor
- Axios
- WebSocket + WebRTC
- 注册与登录:
UserController调用UserServiceImpl,密码使用BCryptPasswordEncoder加密,登录成功返回 JWT。
对应文件:src/main/java/org/example/collabedit/Controller/UserController.java、src/main/java/org/example/collabedit/service/impl/UserServiceImpl.java - 邮箱验证码:
/api/user/sendCode生成验证码写入 Redis(REG_CODE:前缀),并通过MailService发送邮件。
对应文件:src/main/java/org/example/collabedit/service/MailService.java - JWT 鉴权:
JwtUtils生成/解析 Token,JwtAuthenticationTokenFilter在请求链中解析 Token 并设置LoginUser到安全上下文。
对应文件:src/main/java/org/example/collabedit/utils/JwtUtils.java、src/main/java/org/example/collabedit/config/JwtAuthenticationTokenFilter.java - 安全配置:
SecurityConfig放行登录、注册、验证码、健康检查、静态上传与 WebSocket 端点,其余接口要求认证。
对应文件:src/main/java/org/example/collabedit/config/SecurityConfig.java
- 文档树结构:
DocumentServiceImpl.getDocumentTree调用DocumentMapper.selectVisibleDocuments(作者或被分享者可见),然后构建树形结构。
对应文件:src/main/java/org/example/collabedit/service/impl/DocumentServiceImpl.java、src/main/java/org/example/collabedit/mapper/DocumentMapper.java - 文档/文件夹 CRUD、移动、批量删除/移动、搜索、收藏:由
DocumentController提供 REST 接口,服务层实现递归删除、合法性校验等逻辑。
对应文件:src/main/java/org/example/collabedit/Controller/DocumentController.java - 文档分享:
/documents/{id}/share保存document_share记录,并在读取/更新时做权限校验。
对应文件:src/main/java/org/example/collabedit/service/impl/DocumentShareServiceImpl.java - 前端工作台:
DocumentEditor.vue实现目录树、拖拽移动、批量操作、星标等交互。
对应文件:collabedit-frontend/src/views/DocumentEditor.vue
- 后端 OT:
EditorWebSocketHandler接收客户端操作,交给OTDocument+OTTransformer做冲突转换,并广播给其他用户。
对应文件:src/main/java/org/example/collabedit/handler/EditorWebSocketHandler.java、src/main/java/org/example/collabedit/ot/ - 前端 OT 客户端:
useOT.js实现 OT 转换与待确认队列,useCollaborative.js维护版本号与心跳。
对应文件:collabedit-frontend/src/composables/useOT.js、collabedit-frontend/src/composables/useCollaborative.js
- WebSocket 消息类型
CURSOR_MOVE广播协作者光标位置,前端在编辑器画布上渲染远程光标。
对应文件:src/main/java/org/example/collabedit/handler/EditorWebSocketHandler.java、collabedit-frontend/src/views/DocumentEditor.vue
- 评论 REST:
CommentController支持新增、回复、删除、解决/重开、统计与按锚点查询。
对应文件:src/main/java/org/example/collabedit/Controller/CommentController.java - 评论树:
CommentServiceImpl生成树形结构并计算回复数。
对应文件:src/main/java/org/example/collabedit/service/impl/CommentServiceImpl.java - 实时同步:
CommentWebSocketHandler广播评论事件(新增、删除、解决、输入提示、锚点删除等)。
对应文件:src/main/java/org/example/collabedit/handler/CommentWebSocketHandler.java - 前端高亮与侧边栏:
useComments.js负责锚点标记、行内指示器、评论面板与删除锚点联动。
对应文件:collabedit-frontend/src/composables/useComments.js
- 消息拉取:
MessageMapper.selectMessageHistory聚合私聊与通知消息。
对应文件:src/main/java/org/example/collabedit/mapper/MessageMapper.java - 私聊发送:
MessageController.send保存消息并通过NotificationWebSocketHandler推送。
对应文件:src/main/java/org/example/collabedit/Controller/MessageController.java - 前端消息中心:
Communication.vue支持“回复我的 / 收到的评论 / 私聊”三类标签页与未读计数。
对应文件:collabedit-frontend/src/views/Communication.vue - 好友系统:
FriendServiceImpl双向插入好友关系,前端用于发起私聊与视频通话。
对应文件:src/main/java/org/example/collabedit/service/impl/FriendServiceImpl.java
- 信令服务:
VideoCallWebSocketHandler转发 offer/answer/ice-candidate,并维护通话状态。
对应文件:src/main/java/org/example/collabedit/handler/VideoCallWebSocketHandler.java - 前端 WebRTC:
VideoCall.vue建立 PeerConnection,支持视频/音频降级与通话控制。
对应文件:collabedit-frontend/src/components/VideoCall.vue
- 上传接口:
FileController保存文件到磁盘路径,并返回/uploads/**访问地址。
对应文件:src/main/java/org/example/collabedit/Controller/FileController.java - 静态映射:
WebConfig将/uploads/**映射到file.upload-path。
对应文件:src/main/java/org/example/collabedit/config/WebConfig.java
- 健康检查:
/api/health。
对应文件:src/main/java/org/example/collabedit/Controller/HealthController.java - 全局异常处理:
GlobalExceptionHandler统一返回 JSON 错误。
对应文件:src/main/java/org/example/collabedit/handler/GlobalExceptionHandler.java - 通用响应体:
Result<T>统一code/message/data结构。
对应文件:src/main/java/org/example/collabedit/model/common/Result.java
- 用户:
/api/user/register、/api/user/login、/api/user/sendCode、/api/user/info、/api/user/update、/api/user/search - 文档:
/api/documents/tree、/api/documents/list、/api/documents/create、/api/documents/{id}、/api/documents/update、/api/documents/move、/api/documents/batch-delete、/api/documents/batch-move、/api/documents/search、/api/documents/{id}/star、/api/documents/{id}/share - 评论:
/api/comments/add、/api/comments/reply、/api/comments/list/{docId}、/api/comments/{commentId}、/api/comments/{commentId}/resolve、/api/comments/{commentId}/reopen、/api/comments/deleteByAnchorIds - 消息:
/api/messages/list、/api/messages/send、/api/messages/read/{id} - 好友:
/api/friend/add/{friendId}、/api/friend/list - 上传:
/api/file/upload
- 协同编辑:
/ws/editor/{docId}/{userId} - 评论同步:
/ws/comment/{docId}/{userId} - 消息通知:
/ws/notification/{userId} - 视频信令:
/ws/video-call/{userId}
users:用户信息documents:文档与文件夹document_share:文档分享关系t_comment:评论与回复(带锚点)messages:通知/私聊消息friend:好友关系
- 修改配置:
src/main/resources/application.yml中的 MySQL / Redis / 邮箱 / 文件上传路径。 - 启动:
./mvnw spring-boot:run或使用 IDE 运行 CollabEditApplication。
cd collabedit-frontend
npm install
npm run dev默认访问地址:http://localhost:5173
Vite 代理 /api 到 http://localhost:8080。
- 后端:
src/main/java/org/example/collabeditController/:REST 控制器service/、service/impl/:业务逻辑mapper/:MyBatis-Plus Mapper(含注解 SQL)entity/、vo/、model/dto/handler/:WebSocket 与全局异常ot/:OT 算法实现
- 前端:
collabedit-frontend/srcviews/:页面(登录、注册、编辑器、消息中心、个人中心)components/:视频通话、分享弹窗等composables/:协作与评论逻辑utils/:请求封装