# 阶段 1 · 基础桌面应用报告(实测记录) > 日期:2026-11-13 · 范围:Tauri 工程、主窗口、标题栏、菜单栏、标签页、侧边栏、编辑器容器、状态栏、基础主题 + 打开/编辑/保存全链路。 ## 1. 本阶段实现内容 - **正式工程**:仓库根目录建工程(`src/` + `src-tauri/`,结构按架构 §6);阶段 0 的 `prototype/` 保留为验证资产,其测试被根工程继续引用执行。 - **Tauri 2 壳**:`decorations: false` 自定义标题栏窗口(1280×820,最小 920×600,居中);identifier `app.newmarkdown.desktop`;打包目标 nsis/msi;图标全套新生成(石板底文档 + M/↓ 字形,未用任何现成品牌图)。 - **Rust 命令层**(`src-tauri/src/commands.rs`):`read_text_file`(UTF-8/BOM/UTF-16/GBK 探测、换行符识别)、`write_text_file`(同目录临时文件 + sync + 原子替换,可保留 BOM)、`list_dir`(文件夹优先排序、只收 md/markdown/txt、跳隐藏项)。前端一切磁盘访问只走 `services/platform.ts`。 - **标题栏**:图标 + 文档名 + 未保存圆点 + 窗口控制(最小化/最大化还原/关闭,走 Tauri window API,能力已在 capabilities 授权)。 - **菜单栏**:文件/编辑/段落/格式/视图/帮助六组,**全部条目为真实动作**。段落与格式直接走 Milkdown 命令(一命令一步撤销);文件组含最近文件(localStorage,阶段 4 迁 SQLite);编辑组粘贴用 execCommand(WebView2 支持,阶段 2 评估换 Clipboard API 时复核)。 - **标签页**:新建/打开/激活/关闭、拖拽排序、右键菜单(关闭/关闭其他/关闭右侧)、未保存圆点、关脏标签弹三选确认(保存/不保存/取消,批量关闭同理)。会话模型为纯 reducer(`stores/tabs.ts`),同路径重复打开只激活不重复建签,dirty 由正文与已保存正文比较得出。 - **侧边栏**:文件/大纲双页签。大纲实时提取(跳过代码块内 `#`)、点击定位(渲染模式滚动到标题、源码模式移动光标);文件树懒加载逐层展开、刷新、当前文件高亮。侧边栏开关与宽度、主题偏好持久化(localStorage)。 - **状态栏**:字数(中文按字/英文按词)/字符/光标行列(由 ProseMirror 选区推导)/总行数/编码/换行符/保存状态/编辑模式/缩放/运行模式。 - **编辑器容器**:阶段 0 工厂产品化(`src/editor/`),切标签卸载前回写序列化文本不丢内容;源码模式整区切换、切回重建模型;缩放 70%–140%。 - **基础主题**:浅色/深色双主题(CSS 变量,深色为深灰非纯黑),视图菜单切换。 - **Web 降级模式**:浏览器打开时打开文件走 file input、保存走下载,状态栏明示「Web 降级模式(调试)」,窗口控制与打开文件夹自动隐藏/禁用,不冒充桌面能力。 ## 2. 构建与测试结果(实跑) | 项 | 结果 | |---|---| | `npm install`(根工程) | ✅ | | 类型检查 `tsc -b` | ✅ 0 错误(过程修 1 处:commandsCtx.call 的 CmdKey 泛型擦除) | | 自动化测试 `vitest run` | ✅ **18/18**(新增 tabs 4 + text 6 + 编辑器回归 2,阶段 0 原型套件 6 一并重跑全绿) | | 生产构建 `npm run build` | ✅(JS 大包警告仍在,阶段 6 分包) | | Vite dev 冒烟 | ✅ HTTP 200,页面与模块正常下发 | | **Rust 逻辑实测** | ✅ 把正式 `commands.rs`(仅剥 tauri 宏行)编入独立校验 crate 实跑断言:BOM/CRLF 识别、GBK 解码、原子写覆盖 + BOM 保留、临时文件不残留、list_dir 过滤与排序——**全部通过** | | `tauri info` | ✅ 配置解析通过,crate 解析到 tauri 2.12.5;仅报 Linux webkit 系统库缺失(见已知问题) | | Tauri 完整构建 | ⚠️ 未在本沙箱完成:沙箱镜像把 libzstd1 钉在定制版上,apt 装不了 GTK/WebKit 开发包(链断在系统层,非工程问题)。Windows 上按官方前置(Rust + VS Build Tools + WebView2)执行 `npm run tauri dev` 即首次真机构建,已列入验收清单。 | ## 3. 已知问题与取舍 1. **Ctrl+0 双义**:需求表把 Ctrl+0 同时给「段落」与「恢复默认缩放」。本实现取「段落」(与 Typora 一致),恢复缩放走视图菜单,快捷键弹窗内有说明。阶段 6 自定义快捷键时可再改派。 2. **最近文件/界面偏好暂存 localStorage**:SQLite 按架构排在阶段 4(文件管理阶段)统一落库,本阶段不提前引入数据库。 3. **粘贴走 execCommand('paste')**:在部分 WebView2 权限策略下可能被拒;若 Windows 实测粘贴菜单不可用,阶段 2 改走 Milkdown clipboard 插件 + Tauri clipboard 权限处理(编辑器内 Ctrl+V 粘贴不受此影响,走浏览器原生粘贴事件)。 4. 阶段 0 人工清单(IME 手感等)仍未销账,与本阶段 Windows 清单合并验证最省事。 ## 4. Windows 验收清单(大王) 前置:装 Rust stable(rustup)、Visual Studio Build Tools(C++ 桌面开发)、WebView2(Win11 自带)。 ```powershell cd new-markdown npm install npm run tauri dev ``` - [ ] 窗口启动,自定义标题栏可拖动、双击最大化、三个窗口按钮可用 - [ ] 打开一个真实 .md(含 GBK 编码的老文件各一),内容正确、状态栏编码/换行符正确 - [ ] 改两笔 → 标题栏与标签出现未保存圆点 → Ctrl+S 保存 → 圆点消失,用外部编辑器确认落盘内容 - [ ] 打开文件夹 → 文件树展开、点开第二个文件成新标签;拖拽标签排序;右键关闭其他 - [ ] 关一个未保存标签 → 弹保存确认,三选都试一遍 - [ ] 视图:深色主题、源码模式切回不丢内容、Ctrl+= 放大 - [ ] 顺带把阶段 0 的 IME 清单一并验了(微软拼音 + 搜狗各一段长句) ## 5. 下一阶段(阶段 2)预告 Markdown 编辑器核心深化:标记显隐装饰(当前节点显示语法标记)、源码模式换 CodeMirror 6 并做双向选区同步、列表/引用/代码块的完整键盘行为、IME 守卫与专项测试、把阶段 0/1 人工清单中发现的问题清零。