Skip to content

前端总体架构与运行边界 ​

本章描述 muotai-frontend(管理平台)和 muotai-frontend-neo(用户使用平台)的共同运行模型。两个项目共享墨台后端的认证、网关、AI、文档空间和业务服务,但页面组织和状态边界不同:管理平台以菜单、角色、租户和业务管理为中心,用户平台以工作台、会话、文档空间和 AI 产物为中心。

1. 代码基线与事实等级 ​

项目源码根目录应用形态主要入口
管理平台/Users/xing/workspace/muotai/muotai-frontendVite Web 应用;可选 Tauri 桌面端;可打包聊天库src/main.ts、src/App.vue、src/router/index.ts
用户平台/Users/xing/workspace/muotai/muotai-frontend-neoVite Web 应用;同时可构建 muotai-components npm 包src/main.ts、src/App.vue、src/router.ts
后端/Users/xing/workspace/muotai/muotai-backendSpring Cloud 微服务Gateway、Auth、UPMS、AI、Doc Space 等

文档事实按以下优先级解释:当前 .ts/.vue 源码高于 README,当前 package.json 和 vite.config.ts 高于历史构建脚本,当前后端 Controller/API 契约高于前端注释。若部署配置、镜像端口和源码不一致,应在端口与部署差异中登记为待确认项。

2. 产品边界 ​

text
浏览器 / Tauri / 组件库宿主
              │
              ▼
      管理平台或用户使用平台
              │
              ├── /auth、/admin       Auth / UPMS
              ├── /ai/v1              muotai-ai
              ├── /doc/v1             muotai-doc-space / HMC
              ├── /audit、/standard   审计 / 标准化
              ├── /expert             专家与工单
              ├── /workflow            WFlow / Flowable
              ├── /billing、/pay       计费 / 支付
              └── /growth              增长与邀请

前端负责页面编排、输入校验、请求发起、流式事件展示、文件传输进度和用户可见错误。前端不负责最终租户隔离、角色授权、资源归属、订单状态和 AI 工具安全校验;这些校验必须由 Gateway/业务服务在服务端重新执行。

3. 应用启动链路 ​

3.1 管理平台 ​

text
index.html
  -> src/main.ts
     -> createApp(App)
     -> app.use(router)
     -> app.use(ElementPlus)
     -> initStore / Pinia
     -> 全局指令、样式、图标和插件
  -> src/App.vue
     -> RouterView
  -> src/router/index.ts
     -> staticRoutes
     -> 登录后加载 asyncRoutes
     -> Layout/页面组件

管理平台的布局、标签页、菜单、主题和用户状态在页面切换期间持续存在。静态路由用于登录、异常页、文件预览和少量固定入口;业务菜单可以来自 asyncRoutes.ts 或后端菜单,经 menuToRouter/registerRoutes 转换后注册。

3.2 用户使用平台 ​

text
index.html
  -> src/main.ts
     -> createApp(App)
     -> router
     -> Element Plus
     -> initStore(持久化 Pinia)
     -> requestAuth、反馈诊断、全局指令
  -> src/App.vue
     -> 中文 locale
     -> RouterView
  -> src/router.ts
     -> routeLoaders 懒加载页面
     -> Layout 子路由或独立工具页

用户平台没有管理端那样的后端菜单注册过程。router.ts集中声明业务页面,routeLoaders统一提供动态导入,导航期间由 routeLoading 控制顶部进度条。Assistant 页面在进入时必须有 navigation.currentSession;旧版本 query 参数会在路由守卫中迁移到 sessionStorage 后清理 URL。

4. 路由和页面加载模型 ​

4.1 管理平台路由 ​

管理平台同时存在三类路由:

  1. 静态路由:登录、注册、找回密码、授权回调、异常页、房间文件页、文件预览和部分模块首页。
  2. 异步路由:房间、知识库、AI、文档、工作流、系统设置、专家和运营菜单。
  3. 模块路由:module/audit/router.ts、module/accounting/router.ts、module/specialProject/router.ts,通过 isStatic 和模块元信息加入静态或异步菜单。

路由 meta 中的 keepAlive、isHide、hidden、separatorBar、menuPath 和 module 会影响菜单、标签页和页面缓存。新增页面必须明确是否显示在菜单、是否可直接访问、是否需要登录以及是否保留组件状态。

4.2 用户平台路由 ​

用户平台路由分为 Layout 子路由和独立页面:

类别典型路径说明
Layout 子路由/、/room-document、/assistant、/billing共享侧边栏、顶部栏、会话和传输浮层
独立编辑/工具页/editor、/tender-writer、/contract-reviewer、/rewrite适合全屏编辑或步骤式任务
公开入口/invite/:code、/file-room/invite/:token、/agreements/:type可能在登录前访问,必须单独处理身份和资源校验
回调入口/authredirect第三方登录或 OAuth 回跳

路由跳转的业务参数优先放入 navigation store 或 currentRoute store。不要重新把 Agent、Session、Room 等完整业务上下文拼到 URL;如需兼容旧地址,只保留一次性迁移逻辑。

5. 请求客户端和认证上下文 ​

5.1 基础 URL 与代理 ​

两个项目均以 VITE_API_BASE_URL 作为浏览器请求前缀,以 VITE_API_SERVER_URL 作为开发服务器代理目标。常见开发形态是:

text
浏览器请求 /api/ai/v1/...
  -> Vite proxy 去掉 /api
  -> Gateway :9999 或部署配置的网关地址
  -> /ai/v1/... 业务路由

用户平台 vite.config.ts额外配置 /api/gpt 到外部模型代理;管理平台还保留多个 dev:* 内网环境和 Tauri 合同编辑环境。生产环境应由 Nginx/CDN 或网关提供同源 /api,避免把内部服务地址暴露给浏览器。

5.2 Header 和上下文 ​

Header/字段来源用途
AuthorizationaccessTokenOAuth2 Bearer 身份认证
request-tokensessionStorage 或登录上下文特定前端/请求链路校验
tenant-iduser store 的 tenantId租户上下文透传;服务端仍须从 Token 校验
Trace ID服务端响应或诊断上下文错误定位、反馈和日志关联

管理端统一请求主要在 src/api/interceptor.ts;用户端请求由 src/lib/interceptor.ts 和 src/lib/requestAuth.ts协作完成。请求拦截器注入认证信息,响应拦截器解包业务响应、显示错误并处理认证过期。

5.3 Token 刷新和认证恢复 ​

认证恢复必须满足以下约束:

  • accessToken 过期时优先使用 refreshToken 请求 /auth/oauth2/token,成功后只重试原始请求一次。
  • refresh 请求本身失败时清空用户状态并回到登录流程,不能继续递归刷新。
  • 多个请求同时收到 401/424 时,只允许一次登出和登录弹窗恢复;其他请求等待恢复结果。
  • 登出需要清理 Token、用户信息、工作台签页、当前会话和必要的 sessionStorage,但租户默认值是否保留要遵循项目现有实现。
  • 公开邀请、分享和协议页不能假设已经存在用户 Token;进入后再根据资源状态决定是否唤起登录。

6. 状态管理和持久化 ​

6.1 管理端 Store ​

Store主要职责持久化/生命周期
user登录、用户信息、租户、Token、锁屏和搜索历史Pinia 持久化到 localStorage
menu菜单列表和菜单宽度页面/布局生命周期
setting、config主题、布局和系统配置持久化或配置接口
worktab已打开页面和标签页登录会话;登出时清理
notice通知和未读状态页面/接口刷新
sseAgent 会话的连接、发送消息和回答状态内存;连接关闭即清理
aiDoc起草文档、生成任务和并发池文档任务期间,部分数据持久化
workflow、table工作流页面和表格通用状态页面/模块生命周期

6.2 用户端 Store ​

Store主要职责持久化/生命周期
user用户、租户、Token、登录恢复Pinia persisted state/localStorage
navigation当前 project/room/agent/session 和引用文件sessionStorage;支持旧 URL 迁移
currentRoutequery、params、history.state 和完整路径内存;由路由方法同步
project当前项目 ID页面/会话生命周期
transfer上传/下载任务、进度、状态和失败内存;页面刷新后不保证恢复

6.3 状态边界 ​

组件的临时 UI 状态(弹窗、折叠、当前 tab)应留在组件或 composable;跨页面业务上下文放 Store;后端权威状态通过 API/SSE/轮询重新获取。不要把完整文件内容、Token、模型密钥或未经脱敏的 AI 轨迹写入持久化 Store。

7. 文件、编辑器和实时能力 ​

7.1 文件传输 ​

普通上传适合小文件,分片上传适合大文件或多文件场景。标准链路为:

text
选择文件
  -> 前端校验类型/大小
  -> init(得到 uploadId/batchId)
  -> upload(分片或单文件)
  -> complete(幂等合并)
  -> status/result 轮询
  -> 文件记录可用

用户端 src/api/upload.ts 将上传任务接入 transfer store;管理端以 src/api/upload.ts、FileUpload、UploadFile 和房间组件组合实现。取消上传必须终止 Fetch/XHR、清理定时器和更新 UI,不能只隐藏进度条。

7.2 预览和在线编辑 ​

两个项目都包含 PDF、Office、Excel、文本、Markdown、图片和多媒体预览。用户端把这些能力聚合到 components/npm/FilePreview,管理端则分布在 components/FilePreview、views/rooms 和 views/webOffice。预览前应先确认文件类型、下载地址、权限和版本;无法预览时展示可重试或下载原文件的错误状态。

7.3 SSE 和流式响应 ​

AI 请求通常经历“建立连接 → 发送消息 → 接收 token/结构化事件 → 终态 → 关闭连接”。前端必须区分连接状态、业务运行状态和最终消息状态:SSE 断开并不等于后端任务已经取消,业务取消应调用对应取消接口或发送取消指令。具体事件字段以AI 聊天与智能体执行和文件与流式事件为准。

8. 后端服务映射 ​

前端领域主要路径后端服务前端关注点
登录/用户/权限/auth、/adminmuotai-auth、muotai-upmsToken、租户、菜单、角色、组织
Agent/LLM/RAG/Tool/Skill/ai/v1muotai-aiSession 顺序、SSE、工具权限、引用文件
房间/文件/文档/doc/v1、/ai/v1/filesmuotai-doc-space、muotai-ai文件 ACL、上传、预览、版本和回收
文档起草/doc/v1/ai-draft-record、HMC APImuotai-hmc、muotai-doc-space、muotai-ai任务状态、章节生成、编辑器内容
审计/合规/风险/audit、/expertmuotai-audit、muotai-expert长任务、风险状态、报告和工单
工作流/workflow 或网关映射muotai-wflowFlowable 实例、任务和组织
计费/支付/billing、/paymuotai-billing、muotai-pay订单终态、幂等、二维码和回调
邀请/增长/growthmuotai-growth邀请码、奖励、兑换和统计

后端服务端口、Gateway 路由和前端代理存在过历史差异时,优先检查当前 service-map.md、模块 application.yml 和实际部署配置。

9. 错误、日志和可观测性 ​

前端错误处理分三层:

  1. HTTP 层:网络不可达、超时、503、CORS、连接断开。
  2. 认证层:401/424、Token 刷新失败、租户上下文缺失。
  3. 业务层:统一响应 code/msg/data 中的失败码、资源不存在、状态冲突、限流和依赖失败。

错误提示应包含可行动信息(重试、重新登录、下载原文件、联系管理员),并在诊断/反馈中保留 Trace ID、页面路径、业务 ID 和脱敏请求信息。Token、密码、API Key、下载签名、文件内容和模型密钥不得写入控制台或反馈 payload。

10. 相关源码和文档 ​