Files
2026-08-11 10:56:47 +08:00

7.2 KiB
Raw Permalink Blame History

远楒文档前端

远楒文档协作平台的 Vue 3 单页应用。

技术栈

类别 技术
框架 Vue 3(<script setup> SFC,JavaScript)
构建工具 Vite
UI 组件库 Element Plus
状态管理 Pinia
路由 Vue Router
国际化 vue-i18n(en-US, zh-CN)
后端通信 ConnectRPC(gRPC-Web)
富文本编辑器 TipTap(协作,基于 Yjs)
Markdown 编辑器 EasyMDE、Vditor
代码编辑器 CodeMirror
协作编辑 Yjs + y-websocket
Diff 渲染 diff + diff2html
思维导图 markmap-lib / markmap-view
电子表格 x-data-spreadsheet
CSS 预处理 Less

快速开始

前置要求

  • Node.js 20+
  • npm

安装与运行

npm install
npm run dev

开发服务器默认运行在 80 端口(为 Docker 配置)。本地开发如非 Docker 环境,可能需要调整端口。

环境变量

在 .env 中配置:

变量 默认值 说明
VITE_API_BASE_URL http://localhost:8080 REST/gRPC 基础 URL
VITE_GRPC_WEB_ENDPOINT /grpc gRPC-Web 端点路径

生产构建

npm run build    # 输出到 dist/
npm run preview  # 预览生产构建

生产 Dockerfile(Dockerfile.prod)会在构建前自动执行 protoc 代码生成。详见 Protobuf 代码生成。

项目结构

src/
├── main.js              # 应用入口:创建 Vue 实例,注册插件
├── App.vue              # 根组件
├── assets/              # 静态资源
├── components/          # Vue 组件
│   ├── base/            # 基础/原子组件
│   ├── comment/         # 评论与行内评论
│   ├── document/        # 文档相关组件
│   ├── knowledge-base/  # 知识库组件
│   ├── layout/          # 布局外壳(导航、侧边栏)
│   ├── list/            # 列表/表格组件
│   ├── manage/          # 系统管理组件
│   ├── shared/          # 通用/可复用组件
│   └── template/        # 模板组件
├── composables/         # Composition API 组合式函数
│   ├── actions/
│   ├── document/
│   ├── knowledge-base/
│   ├── layout/
│   ├── list/
│   ├── notification/
│   ├── shell/
│   ├── template/
│   ├── useMentionInput.js
│   └── usePageTitle.js
├── config/
│   └── baseUrl.js       # API_BASE_URL、GRPC_WEB_ENDPOINT、resolveWithApiBase()
├── i18n/
│   ├── index.js
│   └── locales/
│       ├── en-US.js
│       └── zh-CN.js
├── router/
│   └── index.js         # 路由定义、鉴权守卫、页面标题同步
├── services/
│   ├── api.js           # 所有 API 模块的聚合导出
│   ├── api/             # 按领域划分的 API 函数
│   │   ├── shared.js    # unaryCall、messages、映射器辅助
│   │   ├── document.js
│   │   ├── knowledgeBase.js
│   │   ├── template.js
│   │   ├── membership.js
│   │   ├── invitation.js
│   │   ├── setting.js
│   │   ├── notification.js
│   │   └── comment.js
│   ├── auth.js          # 鉴权 API
│   └── grpc_client.js   # ConnectRPC 传输层、客户端实例、buildHeaders()
├── store/
│   └── user.js          # Pinia 用户 store(token、userInfo)
├── styles/
│   ├── variables.css    # CSS 变量(主题)
│   ├── column-resize.css
│   ├── list-cell.css
│   └── mention.css
├── utils/
│   ├── collabUrl.js     # 协作 WebSocket URL 构建
│   ├── documentType.js  # 文档类型枚举辅助
│   ├── fileUrl.js       # 文件 URL 解析
│   └── tableUtils.js    # 电子表格工具函数
└── views/
    ├── auth/            # 登录、注册
    ├── document/        # 编辑器、历史版本、设置、附件
    ├── error/           # 404
    ├── knowledge-base/  # 知识库列表与详情
    ├── manage/          # 系统管理(用户、用户组、组织、安全、邀请)
    ├── template/        # 模板列表与预览
    ├── user/            # 个人资料、设置、通知、邀请
    └── workspace/       # 首页、我的文档、搜索

核心架构说明

路径别名

@ 映射到 src/。所有内部导入使用该别名。

gRPC-Web API 层

所有后端通信通过 ConnectRPC(gRPC-Web):

  1. src/services/grpc_client.js 创建传输层和各服务的客户端实例。
  2. src/services/api/*.js 封装 unaryCall(),负责 protobuf 请求构造与响应映射。
  3. src/services/api/shared.js 提供通用映射器(mapDocument、mapAttachment 等)和 unaryCall 包装器,自动注入鉴权 headers 并处理 401 跳转。
  4. src/config/baseUrl.js 解析 API_BASE_URL 和 GRPC_WEB_ENDPOINT。

所有 gRPC 请求必须包含 buildHeaders() 返回的 headers(Authorization bearer + accept-language)。unaryCall 包装器已自动处理。

鉴权

  • Token 存储在 localStorage,键为 token
  • 用户信息以 JSON 存储在 userInfo
  • 路由守卫(requiresAuth: true meta)将未认证用户重定向到 /login
  • 收到 401(Unauthenticated)响应时,自动清除 token 并跳转登录页

主题

  • 默认深色模式
  • 切换后持久化到 localStorage,键为 darkMode / theme
  • 在 index.html 中尽早应用主题,避免白屏闪烁

Protobuf 代码生成

生成的 protobuf 代码位于 src/gen/(已 gitignore),由父仓库目录下的 proto/yoresee_doc/v1/yoresee_doc.proto 生成。

生产构建时(Dockerfile.prod),protoc 自动执行。本地开发请运行仓库级代码gen脚本:

bash ../deploy/script/gen_proto.sh

生成文件:

  • src/gen/yoresee_doc/v1/yoresee_doc_pb.js — 消息类型
  • src/gen/yoresee_doc/v1/yoresee_doc_connect.js — ConnectRPC 服务定义

国际化

  • 语言:en-US、zh-CN
  • 语言偏好存储在 localStorage,键为 language
  • 路由通过 meta.titleKey(i18n key)或 meta.dynamicTitle 设置页面标题
  • Key 按功能命名空间划分(如 document.settings.title、navigation.home)

功能特性

  • 文档管理:创建、编辑、删除、重命名文档;文件夹组织
  • 多种文档类型:Markdown、富文本(TipTap)、电子表格、幻灯片
  • 实时协作:基于 Yjs CRDT 的多人协作编辑(WebSocket)
  • 版本历史:查看与对比文档版本,支持左右对照 diff
  • 知识库:将文档组织为共享知识库,支持成员权限管控
  • 模板:创建与预览文档模板
  • 评论:行内评论与文档级评论,支持 @提及
  • 附件:上传、预览、下载文件附件
  • 搜索:全文搜索文档
  • 通知:评论、回复、提及、系统通知
  • 系统管理:用户、用户组、组织架构、安全设置、邀请管理
  • 思维导图:通过 markmap 将 Markdown 渲染为思维导图
  • 深色模式:默认深色主题,支持切换