* docs: add desktop project plan * feat(desktop): implement phase 1 tauri client * refactor(client): unify web and desktop release workflow * feat(desktop): implement phase 2 native capabilities * 完善桌面端交互体验与发布检查 * 完善桌面端界面、发布检查与邮箱域名同步 * fix(deploy): 修复数据库初始化复用旧镜像 * fix(deploy): 增加部署更新实时进度 * fix(auth): 支持无邮箱后缀时手动输入 * feat(desktop): 稳定桌面端界面与文件操作反馈 - 重构 DesktopPreferences 为分栏式设置面板,整合连接、外观、通知、更新与诊断信息分区,并补充过渡动效与暗色主题样式 - DesktopLayout 侧边栏导航分组支持展开折叠,调整管理/项目区块顺序并统一图标与标题 - 新增 fileTaskFeedback 工具,统一 pickFiles/saveFile/openFile 的成功/取消提示,替换审计导出、权限日志、附件、文档、线程、项目配置等处的直接调用 - desktopUpdateManager 暴露更新状态快照与状态变更监听,区分检查中、安装中、已推迟、失败等状态 - DesktopServerSettings 增加连接诊断信息(检查时间、健康地址、耗时、HTTP 状态) - unified-page.css 与 ProjectMilestones 引入 CSS 变量以适配暗色主题 - WebLayout 将服务器设置入口改为打开系统偏好面板,管理菜单中邮件服务归入系统设置分组 - ProfileSettings 移除已迁入偏好面板的桌面端专属区块 - 补充 Layout.desktop 布局与偏好面板契约测试 * feat(desktop): 支持桌面端三十天免登录 * 完善桌面端发布稳定化门禁 * 完善桌面端端到端回归收口 * 补齐桌面端附件文件流回归 * 完善桌面端回归与安全边界复审 * 完善桌面体验与系统通知收口 * feat(desktop): 收口桌面工作台视觉与活动反馈 * 优化桌面端界面布局 * style: 优化个人中心和偏好设置弹窗样式,重构工作入口为精致分屏布局并移除首字徽标 * 功能(桌面端):增加在线辅助本地缓存 * 优化桌面端标签导航与后台交互 * ci: 新增 Windows 桌面端内测构建 * fix: 修复桌面检查脚本的 Windows 路径判断 * test: 兼容 Windows 换行的桌面布局断言 * test: 兼容 Windows 换行的路由断言 * ci: 修复 Windows 内测构建配置传参 * ci: 避免 Windows 安装器构建交互等待 * 修复桌面端界面显示与稳定性问题 * feat(网页端): 完善登录后工作台与项目管理体验 * docs(desktop): 精简桌面端约束入口 * feat(admin): 完善审计访问上下文与后台布局 * fix(git): 跟踪原生图标资源 * fix(web): 修正工作台端侧标识 * feat(监控): 完善系统监控、登录状态与访问审计能力 * 修复(权限管理):统一 PM 系统导航与权限校验 * feat(工作台): 优化入口布局与连接安全状态 * feat(桌面与监控): 完善工作台导航和登录活动定位 - 优化桌面标签、上下文标题、前进后退、导航栏隐藏和原生菜单体验 - 补充登录会话 IP 采集、地理位置回退、管理端展示及数据库迁移 - 更新桌面发布检查、运维文档和前后端测试覆盖 * 功能(文档与桌面):完善文件预览下载与客户端构建基线 - 保存文档版本原始文件名,规范下载响应并持久化上传目录\n- 增加 PDF.js 预览、桌面保存打开流程及统一错误反馈\n- 统一 Node.js 22.13 构建基线并收紧临时文件权限门禁\n- 补充迁移、单元测试、发布检查与运维文档 * 功能(文档预览):集成 ONLYOFFICE 安全只读预览与工作台体验 新增 ONLYOFFICE 配置签名、内部内容接口、容器编排与反向代理。 打通网页端和桌面端独立预览工作区,完善文档入口、布局及帮助体验。 补充桌面安全发布门禁、开发脚本、使用文档和前后端测试。 * feat(collaboration): 完善在线文档协作与通知闭环 - 新增协作文件夹、文件、不可变修订、成员、会话、回调回执、编辑申请与分享链接数据模型。 - 补齐新建、导入、复制、下载、回收站、恢复、成员授权、所有权转让及文件级权限接口。 - 接入 ONLYOFFICE 共同编辑、历史版本预览与恢复、修订另存副本、导出下载审计和幂等回调保存。 - 增加编辑权限申请、审批通知、项目提醒聚合、通知 Feed、已读处理及历史待办数据回填。 - 支持公开分享的查看或编辑模式、有效期、密码哈希、失败锁定、短时访问凭证与固定分享地址。 - 增加协作者导出、申请编辑、工作表结构保护和所有权管理策略,并纳入项目接口权限矩阵。 - 新增协作文件库、编辑工作区、公开分享页、下载与另存为对话框,以及导航、路由和权限入口。 - 统一网页端与桌面端通知布局,增加沉浸式工作区和浏览器、Tauri 双端全屏能力。 - 扩展运行时文件下载适配、Tauri 环境识别和原生全屏命令,继续保持业务代码运行时边界。 - 加固 ONLYOFFICE 消息桥的同源下载、签名地址隔离和保存为能力校验,并更新桌面发布检查。 - 增加连续数据库迁移、50MB 上传限制、OnlyOffice 中文文案与开发启动路由校验。 - 补充协作、通知、权限、路由、运行时、布局和 OnlyOffice 相关测试及模块说明文档。 * refactor(frontend): 按需加载页面并清理未使用代码 - 将业务页面路由统一改为动态导入,拆分首屏入口与各功能模块构建产物。 - 将网页端和桌面端布局改为异步组件,避免两套平台布局同时进入初始包。 - 新增 Element Plus 按需安装入口,并通过全局配置组件统一注入中文语言包。 - 提取 API 运行时钩子,在应用启动时注入项目清理、令牌续期和认证失效退出能力。 - 将权限监控面板及地图资源改为延迟加载,补充地图加载状态、失败提示和切换竞态保护。 - 删除已被现有工作流替代的项目成员、接口权限、中心绑定、培训表单及旧项目首页等页面。 - 清理废弃的快捷操作、项目选择、用户选择、FAQ 表单、风险占位组件和旧地图辅助模块。 - 移除未使用的 API 方法、类型、字典、状态机、展示工具、样式和项目详情编辑逻辑。 - 开启 TypeScript 未使用变量与参数检查,并同步收紧相关测试和组件暴露类型。 - 移除未使用的 updater、date-fns 和 Sass 前端依赖,更新锁文件并删除旧 CSS 清洗插件。 - 更新路由、Axios、ETMF、通知、权限监控和桌面布局测试以覆盖重构后的边界。 * fix(审计): 移除共享库审计与预览噪声 * 功能(提醒):统一项目提醒中心与桌面通知链路 增加通用提醒状态、数据库迁移和定时同步,覆盖风险时效、文件回执、项目里程碑、访视窗口与协作申请。 新增网页端和桌面端提醒中心、真实投递诊断与固定隐私通知正文,并补齐登录来源聚合、测试和说明文档。 * feat(deploy): 默认安装 ONLYOFFICE 标准组件 * build(release): 加固 v0.1.0 桌面发布链路 (#3)
13 KiB
CTMS 分支维护与版本更新标准操作规程
一、目的
本规程用于统一 CTMS 网页端和桌面端的代码提交、分支维护、版本晋级、正式发布及生产热修复流程。
CTMS 网页端和桌面端属于同一个产品,必须共用:
- 同一个代码仓库
- 同一套业务核心代码
- 同一条版本晋级链路
- 同一个语义化版本号
- 同一个正式发布标签
- 同一个源代码提交
不得为网页端和桌面端分别建立长期开发、测试或发布分支。
二、长期分支职责
| 分支 | 职责 | 允许进入的内容 | 稳定性要求 |
|---|---|---|---|
dev |
日常开发与集成 | 已评审的功能、修复和重构 | 可持续集成 |
main |
下一正式版本候选 | 从 dev 晋级的完整版本范围、候选版本修复 |
原则上可部署 |
release |
当前生产稳定版本 | 从 main 验收通过的正式版本、生产热修复 |
最高 |
默认晋级方向:
功能分支 -> dev -> main -> release -> 正式版本标签
禁止以下长期分支:
web-dev
desktop-dev
web-release
desktop-release
macos-main
windows-main
桌面端差异必须放在 frontend/src/runtime/ 适配层之后,不通过长期分支保存平台差异。
三、临时分支命名
| 类型 | 命名格式 | 示例 |
|---|---|---|
| 新功能 | feature/<功能名称> |
feature/desktop-file-picker |
| 缺陷修复 | fix/<问题名称> |
fix/session-timeout |
| 生产热修复 | hotfix/<问题名称> |
hotfix/login-loop |
| 文档调整 | docs/<文档名称> |
docs/release-sop |
| 发布准备 | release-prep/<版本号> |
release-prep/v1.2.0 |
| Agent 临时任务 | codex/<任务名称> |
codex/desktop-menu-polish |
分支名称使用小写英文和连字符,不使用个人姓名、日期或模糊名称。
四、日常功能开发流程
1. 从最新 dev 创建分支
git fetch origin
git switch dev
git pull --ff-only origin dev
git switch -c feature/<功能名称>
不得从旧功能分支、main 或 release 创建普通功能分支。
2. 开发过程中同步 dev
短期分支优先使用变基保持提交清晰:
git fetch origin
git rebase origin/dev
已经由多人共同使用的分支,不得擅自强制推送。此时可使用合并:
git fetch origin
git merge origin/dev
3. 提交前检查
前端或桌面端改动至少执行:
cd frontend
npm run version:check
npm run runtime:check
npm run desktop:release:check
npm run ui:contract
npm run type-check
npm run test:unit
npm run build
npm run desktop:build:app
涉及 Tauri、macOS 打包或桌面适配层时,还必须在 macOS 执行:
npm run desktop:build:app
正式桌面发布构建必须从同一正式 tag 分别在 macOS 和 Windows 原生 CI job 执行。两端都必须设置 updater 签名私钥;macOS 设置 Apple 签名/公证变量并以 REQUIRE_DESKTOP_SIGNING=true 执行 readiness 与 Universal 构建,Windows 设置 PFX 证书、密码和 RFC 3161 时间戳变量并以 REQUIRE_WINDOWS_SIGNING=true 执行 readiness、签名 NSIS 构建和 Authenticode 校验。两个平台通过后才能汇总正式 updater feed。
后端改动应补充执行受影响模块的后端测试、迁移检查和接口回归。
4. 创建提交
只暂存本次任务相关文件:
git status
git add <本次任务相关文件>
git diff --cached
git diff --cached --check
git commit -m "<类型>(<范围>): <变更说明>"
推荐提交类型:
| 类型 | 用途 |
|---|---|
feat |
新功能 |
fix |
缺陷修复 |
refactor |
不改变业务行为的重构 |
test |
测试调整 |
docs |
文档调整 |
build |
构建和依赖调整 |
ci |
持续集成调整 |
示例:
feat(desktop): 增加原生文件选择适配器
fix(auth): 修复会话超时后的重复跳转
refactor(client): 统一网页端和桌面端运行时入口
一次提交只处理一个明确目的。不得将无关格式化、个人配置或临时产物混入提交。
5. 推送并创建合并请求
git push -u origin feature/<功能名称>
创建:
feature/<功能名称> -> dev
合并要求:
- 代码评审通过
- 必要测试通过
- 客户端质量门禁通过
- 没有误提交密钥、环境文件或构建产物
- 桌面能力符合第一阶段或第二阶段边界
功能分支进入 dev 可使用合并请求合并或变基合并。提交过于零散时应先整理。
6. 合并后清理
确认改动已经进入远程 dev 后删除临时分支:
git switch dev
git pull --ff-only origin dev
git branch -d feature/<功能名称>
git push origin --delete feature/<功能名称>
工作树正在使用的分支不能直接删除,应先切换分支或移除对应工作树。
五、历史桌面集成分支约束
codex/ctms-desktop 是第一阶段 Tauri 基线使用过的历史临时集成分支,不作为当前桌面端工作线,也不作为长期桌面主线。
当前约束:
- 不得继续向
codex/ctms-desktop提交、变基或推送新的桌面端工作。 - 如本地或远程仍保留该分支,只能用于追溯历史或在确认已合入
dev后删除。 - 后续桌面功能、修复、稳定化和发布准备必须从最新
dev创建短期feature/*、fix/*、docs/*、release-prep/*或codex/*分支。 - Agent 创建分支默认使用
codex/<任务名称>,并在任务合入dev后删除。 - 如果工作区处于 detached HEAD 或包含尚未归属到分支的提交,执行分支切换、提交、推送或变基前必须先确认目标基线和处理方式。
六、从 dev 晋级到 main
当一个版本范围在 dev 完成集成后,创建:
dev -> main
进入 main 前必须确认:
- 本版本范围已经冻结
- 未完成功能已经排除或关闭入口
- 前后端测试通过
- 网页端构建通过
- macOS 桌面端构建通过
- Windows x64 NSIS 兼容性构建通过;正式发布时签名和时间戳验证通过
- 数据库迁移经过验证
- 已知风险和回滚方式已记录
正式创建晋级合并请求前,应按照第七节完成统一版本号更新,并确保版本提交已经进入 dev。
按照当前仓库治理规则,dev 进入 main 使用压缩合并,并使用版本候选级提交说明:
release(main): 准备 v1.2.0 候选版本
不得从功能分支直接跳过 dev 合并到 main。
七、统一更新客户端版本
网页端和桌面端只能使用同一个产品版本号。
从最新 dev 创建发布准备分支:
git fetch origin
git switch dev
git pull --ff-only origin dev
git switch -c release-prep/v1.2.0
统一更新版本并提交:
cd frontend
npm run version:set -- 1.2.0
npm run version:check
cd ..
git add frontend/package.json frontend/package-lock.json frontend/src-tauri/tauri.conf.json
git add frontend/src-tauri/Cargo.toml frontend/src-tauri/Cargo.lock
git commit -m "build(release): 更新客户端版本至 v1.2.0"
git push -u origin release-prep/v1.2.0
创建 release-prep/v1.2.0 -> dev 合并请求。合并后再执行 dev -> main 的版本晋级。
该命令同步更新:
frontend/package.jsonfrontend/package-lock.jsonfrontend/src-tauri/tauri.conf.jsonfrontend/src-tauri/Cargo.tomlfrontend/src-tauri/Cargo.lock
版本号遵循:
| 类型 | 示例 | 使用场景 |
|---|---|---|
| 主版本 | 2.0.0 |
不兼容变更或重大架构调整 |
| 次版本 | 1.3.0 |
向后兼容的新功能 |
| 修订版本 | 1.2.1 |
向后兼容的缺陷修复 |
禁止单独设置桌面端版本号。
八、从 main 发布到 release
候选版本验收通过后,创建:
main -> release
按照当前仓库治理规则,使用普通合并提交,保留候选版本与生产版本之间的关系。
合并前必须确认:
- 回归测试通过
- 数据库迁移和回滚方案确认
- 网页端生产构建通过
- macOS 与 Windows 桌面端生产构建均从候选 tag 通过
- 发布说明完成
- 生产配置和密钥不在仓库中
- 正式版本号已经统一
合并后立即在 release 的准确提交上创建标签:
git switch release
git pull --ff-only origin release
git tag -a v1.2.0 -m "CTMS v1.2.0"
git push origin v1.2.0
网页端、macOS 和 Windows 桌面端必须从同一个 v1.2.0 标签构建。不得从不同分支、不同提交或本地未提交状态构建正式制品。macOS 签名/公证、Windows 代码签名/RFC 3161 时间戳以及两个平台的 updater 签名制品必须全部验证通过后,才能分发安装包并最后原子替换生产 latest.json。
发布记录至少包含:
- 产品版本号
- Git 标签
- 完整提交编号
- 网页端制品编号
- 桌面端制品编号
- 数据库迁移版本
- 发布日期和负责人
九、生产热修复流程
1. 从 release 创建热修复分支
git fetch origin
git switch release
git pull --ff-only origin release
git switch -c hotfix/<问题名称>
热修复只能包含解决生产问题所需的最小改动,不得顺带加入新功能或大规模重构。
2. 更新修订版本
例如从 1.2.0 更新到 1.2.1:
cd frontend
npm run version:set -- 1.2.1
npm run version:check
cd ..
3. 验证并提交
git add <热修复相关文件和版本文件>
git diff --cached --check
git commit -m "fix(<范围>): <生产问题说明>"
git push -u origin hotfix/<问题名称>
创建:
hotfix/<问题名称> -> release
4. 合并并创建标签
热修复合并到 release 并验证后创建 v1.2.1 标签。
5. 强制回合并
生产热修复必须立即回合并:
release -> main -> dev
不得假设 main 或 dev 已经包含相同修复。发生冲突时必须立即解决并在合并请求中记录原因。
十、冲突处理规则
发生冲突时:
- 先确认冲突两侧的业务意图。
- 不使用整文件覆盖方式跳过判断。
- 保留双方仍然有效的修改。
- 重新执行受影响测试。
- 在合并请求中记录冲突文件和处理结果。
禁止使用以下方式处理普通同步冲突:
git reset --hard
git checkout -- <文件>
除非已经明确确认可以丢弃本地修改,否则不得执行破坏性命令。
十一、分支保护建议
release
- 禁止直接推送
- 必须通过合并请求
- 至少一名评审人批准
- 必须通过状态检查
- 正式标签只由发布负责人创建
main
- 禁止直接推送
- 必须通过合并请求
- 必须完成回归和构建检查
- 只接收版本候选内容
dev
- 优先通过合并请求
- 必须通过相关测试
- 禁止提交密钥和本地配置
- 禁止合入明确不可构建的代码
十二、每周分支维护
每周至少执行一次:
git fetch --prune origin
git branch -vv
git log --oneline --decorate --graph --all -30
检查事项:
- 已合并临时分支是否删除
- 是否出现未经批准的长期平台分支
dev、main、release是否符合各自职责- 生产热修复是否已回合并到
main和dev - 版本文件是否一致
- 正式标签是否准确指向
release - 持续集成门禁是否持续通过
十三、禁止事项
- 禁止长期维护网页端和桌面端平行分支
- 禁止通过复制代码维护桌面端业务页面
- 禁止在业务模块中直接使用 Tauri API
- 禁止在不同提交上构建同一版本的网页端和桌面端
- 禁止未经
dev和main直接向release发布普通功能 - 禁止生产热修复只进入
release而不回合并 - 禁止在正式构建中包含未提交文件
- 禁止提交
.env、密钥、证书、令牌和个人配置 - 禁止提交
node_modules、dist、Tauritarget等构建产物
十四、发布前最终检查清单
- 本次发布范围已经冻结
dev集成测试通过main候选版本验收通过- 网页端与桌面端版本一致
npm run version:check通过npm run runtime:check通过npm run desktop:release:check通过npm run ui:contract通过npm run type-check通过npm run test:unit通过npm run build通过npm run desktop:build:app通过- 正式桌面发布构建已使用 updater 签名私钥执行
- 数据库迁移与回滚方案确认
- 发布说明完成
main -> release合并完成- 正式标签创建在准确的
release提交上 - 网页端和桌面端从同一标签构建
- 发布记录包含版本、标签和完整提交编号
十五、流程速查
普通功能:
最新 dev
-> feature/*
-> 开发、测试、评审
-> dev
-> 删除临时分支
正式发布:
dev
-> main
-> 统一版本号
-> 回归与验收
-> release
-> 创建 vX.Y.Z 标签
-> 同一标签构建网页端和桌面端
生产热修复:
release
-> hotfix/*
-> release
-> 创建修订版本标签
-> main
-> dev