|
| 1 | +# Invoice Hub 0.1.5 设置中心与邮箱闭环设计 |
| 2 | + |
| 3 | +## 目标 |
| 4 | + |
| 5 | +把当前分散且尺寸偏小的设置对话框升级为桌面工作型设置中心,使办公人员能够在一个稳定入口中查看、添加、编辑、启停、测试和删除多个邮箱账户,同时不破坏既有账户身份、扫描范围和授权码隐私语义。 |
| 6 | + |
| 7 | +0.1.5 只完成设置中心框架与邮箱接入闭环。AI 配置保留当前可用入口,但完整信息架构和体验升级归入 0.1.6。 |
| 8 | + |
| 9 | +## 设计原则 |
| 10 | + |
| 11 | +1. 延续 0.1.4 的白底、浅灰边框、蓝色主操作和紧凑桌面密度。 |
| 12 | +2. `email_accounts` 是邮箱配置主数据源;legacy `email`、`imap`、`search` 只是兼容投影。 |
| 13 | +3. `mailbox_key` 是已保存账户的稳定身份,不随 provider、邮箱地址或显示名称改变而重新生成。 |
| 14 | +4. 已保存账户与新建草稿是两种状态:已保存账户不得被静默改写,未保存草稿才允许 provider 后缀辅助修正。 |
| 15 | +5. 授权码只进入系统凭据存储,不回显、不写配置、不进入日志或错误摘要。 |
| 16 | +6. Outlook、Hotmail、Live 和 Microsoft 365 继续明确提示需要 OAuth2/XOAUTH2;0.1.5 不伪装成普通 IMAP 可用。 |
| 17 | +7. 删除邮箱配置不删除已经导入的发票、附件、报销组或历史记录。 |
| 18 | + |
| 19 | +## 方案选择 |
| 20 | + |
| 21 | +- 方案 A:邮箱、AI、系统设置分别使用独立弹窗。改动较小,但入口分散且组件重复。 |
| 22 | +- 方案 B:统一设置中心,邮箱和 AI 使用独立页面与向导。信息边界清楚、组件可复用,采用此方案。 |
| 23 | +- 方案 C:把设置全部放进主窗口导航。空间充足,但会打断审核主路径并扩大 0.1.5 范围。 |
| 24 | + |
| 25 | +## 版本边界 |
| 26 | + |
| 27 | +### 包含 |
| 28 | + |
| 29 | +- 统一设置中心工作对话框。 |
| 30 | +- 邮箱账户列表、空状态、启用/禁用、编辑和删除。 |
| 31 | +- 三步邮箱接入向导。 |
| 32 | +- 账户级扫描范围、IMAP 参数、连接测试和保存门禁。 |
| 33 | +- 保存账户与新建草稿的明确状态边界。 |
| 34 | +- 授权码安全状态、错误分类和可恢复操作。 |
| 35 | +- 0.1.4 通用组件在设置场景中的复用和扩展。 |
| 36 | + |
| 37 | +### 不包含 |
| 38 | + |
| 39 | +- Outlook OAuth2/XOAUTH2 实现。 |
| 40 | +- 新邮件协议、云端账户系统或服务器端同步平台。 |
| 41 | +- 定时任务调度器;“同步频率”仅在存在真实调度能力后加入。 |
| 42 | +- 邮件识别规则编辑器。 |
| 43 | +- AI 配置中心重构。 |
| 44 | +- 删除已导入业务数据。 |
| 45 | + |
| 46 | +## 统一设置中心框架 |
| 47 | + |
| 48 | +### 尺寸 |
| 49 | + |
| 50 | +主设计基准仍为 1920×1080,设置中心使用 1120×720 工作型模态对话框: |
| 51 | + |
| 52 | +| 区域 | 尺寸 | |
| 53 | +|---|---:| |
| 54 | +| 标题栏 | 56 px 高 | |
| 55 | +| 左侧设置导航 | 184 px 宽 | |
| 56 | +| 内容区 | 自适应,最小 760 px 宽 | |
| 57 | +| 固定底栏 | 64 px 高 | |
| 58 | +| 内容边距 | 20 px | |
| 59 | +| 列表行 | 64–72 px 高 | |
| 60 | + |
| 61 | +设置中心不是传统小表单。左侧导航、右侧内容和固定底栏同时可见,内容区内部按页面独立滚动,整个对话框不得出现横向滚动。 |
| 62 | + |
| 63 | +### 导航 |
| 64 | + |
| 65 | +0.1.5 只显示真实可用入口: |
| 66 | + |
| 67 | +```text |
| 68 | +邮箱账户 |
| 69 | +AI 配置(保留当前能力,标记“将在 0.1.6 优化”) |
| 70 | +系统设置(保留现有字段) |
| 71 | +数据与备份(仅在现有能力可用时显示) |
| 72 | +关于 |
| 73 | +``` |
| 74 | + |
| 75 | +不得为了视觉完整加入没有内容或没有保存闭环的页面。 |
| 76 | + |
| 77 | +### 固定底栏 |
| 78 | + |
| 79 | +- 左侧:当前页面安全提示或“恢复默认设置”,仅在当前页面有对应能力时显示。 |
| 80 | +- 右侧:取消、保存并关闭。 |
| 81 | +- 页面内部已即时保存的账户操作不重复依赖全局保存;存在未保存向导草稿时,关闭设置中心必须提示保存、放弃或取消。 |
| 82 | + |
| 83 | +## 邮箱账户页 |
| 84 | + |
| 85 | +### 页面结构 |
| 86 | + |
| 87 | +```text |
| 88 | +页面标题 + 说明 新增邮箱账户 |
| 89 | +账户状态摘要:启用 N / 已配置 N / 需要处理 N |
| 90 | +邮箱账户列表 |
| 91 | +安全与隐私说明 |
| 92 | +``` |
| 93 | + |
| 94 | +账户状态摘要只显示数量,不使用营销式大卡片。 |
| 95 | + |
| 96 | +### 账户行 |
| 97 | + |
| 98 | +每个 `ConfigListRow` 显示: |
| 99 | + |
| 100 | +- 账户显示名称与掩码邮箱地址。 |
| 101 | +- provider 徽章。 |
| 102 | +- 启用/禁用状态。 |
| 103 | +- 扫描范围,例如“最近 3 个月”。 |
| 104 | +- 凭据状态:已安全保存、未配置、需要重新验证。 |
| 105 | +- 最近同步时间;没有真实时间时显示“尚未同步”,不伪造成功状态。 |
| 106 | +- 主要动作:编辑。 |
| 107 | +- 次要菜单:启用/禁用、删除。 |
| 108 | + |
| 109 | +列表默认按启用账户优先、最近编辑时间次序排列。账户数量较多时只滚动列表,不分页。 |
| 110 | + |
| 111 | +### 空状态 |
| 112 | + |
| 113 | +无账户时显示支持的 provider、授权码安全说明和“新增邮箱账户”。不显示空表格,也不自动创建占位账户。 |
| 114 | + |
| 115 | +### 启用与禁用 |
| 116 | + |
| 117 | +- 至少保留一个可扫描的启用账户;禁用最后一个启用账户必须阻止并说明原因。 |
| 118 | +- Outlook-like 保存记录不计入“可扫描启用账户”。 |
| 119 | +- 切换成功后立即更新 legacy 投影到第一个可扫描启用账户。 |
| 120 | +- 失败时恢复开关原状态并显示具体原因。 |
| 121 | + |
| 122 | +### 删除 |
| 123 | + |
| 124 | +删除确认必须明确:删除账户配置、系统凭据和扫描状态,但保留已导入发票、附件和报销数据。删除后如果还有启用账户,重新选择第一个可扫描账户作为兼容投影。 |
| 125 | + |
| 126 | +## 三步邮箱接入向导 |
| 127 | + |
| 128 | +向导使用 760×560 `WizardDialog`。步骤头 52 px、主体自适应、底栏 64 px,三步高度保持稳定。 |
| 129 | + |
| 130 | +### 第一步:选择邮箱并填写账户信息 |
| 131 | + |
| 132 | +provider:QQ、163、126、Gmail、Outlook、自定义 IMAP。 |
| 133 | + |
| 134 | +字段: |
| 135 | + |
| 136 | +- 账户显示名称。 |
| 137 | +- 完整邮箱地址。 |
| 138 | +- 扫描范围:最近 1、3、6、12 个月。 |
| 139 | +- 自定义 IMAP 时显示 server、port、SSL。 |
| 140 | + |
| 141 | +交互规则: |
| 142 | + |
| 143 | +- 新建草稿可以根据 provider 辅助改写已输入的已知邮箱后缀。 |
| 144 | +- 一旦加载已保存账户,provider 切换不得静默改写邮箱地址。 |
| 145 | +- 已保存账户始终按 `mailbox_key` 编辑,即使 provider 或地址被用户显式修改。 |
| 146 | +- 已知 provider 与邮箱域不一致时禁止下一步,并建议修改地址或使用自定义 IMAP。 |
| 147 | +- Outlook-like 选择后显示 OAuth2 能力边界,禁用下一步和普通 IMAP 测试。 |
| 148 | + |
| 149 | +### 第二步:授权码与连接测试 |
| 150 | + |
| 151 | +字段和状态: |
| 152 | + |
| 153 | +- `SecureInput`:未配置、已安全保存、重新输入将覆盖。 |
| 154 | +- 授权码帮助入口,说明“不是邮箱登录密码”。 |
| 155 | +- 连接测试结果区。 |
| 156 | + |
| 157 | +连接测试顺序: |
| 158 | + |
| 159 | +1. 校验 provider、邮箱域、自定义服务器和端口。 |
| 160 | +2. 确认新授权码或可用的已保存凭据。 |
| 161 | +3. 建立 IMAP 连接并验证身份。 |
| 162 | +4. 验证目标文件夹可读取。 |
| 163 | +5. 返回成功或可操作错误,不显示原始异常和敏感连接参数。 |
| 164 | + |
| 165 | +地址、provider、server、port 或 SSL 改变后进入 `dirty-sensitive`,之前的测试成功立即失效。只有重新测试成功后才允许保存这些敏感变更。 |
| 166 | + |
| 167 | +### 第三步:复核并保存 |
| 168 | + |
| 169 | +复核内容:账户名称、掩码地址、provider、IMAP 主机、扫描范围、凭据状态和测试时间。 |
| 170 | + |
| 171 | +动作: |
| 172 | + |
| 173 | +- 上一步。 |
| 174 | +- 取消。 |
| 175 | +- 保存账户。 |
| 176 | +- 保存后立即同步,仅在真实同步入口可调用时显示,并默认不勾选。 |
| 177 | + |
| 178 | +保存成功后清空授权码输入,回到账户列表并高亮该 `mailbox_key`。 |
| 179 | + |
| 180 | +## 账户状态机 |
| 181 | + |
| 182 | +| 状态 | 含义 | 允许动作 | |
| 183 | +|---|---|---| |
| 184 | +| `new-draft` | 未绑定已保存账户 | provider 辅助、测试、取消 | |
| 185 | +| `saved-clean` | 已加载且未修改 | 测试、启停、删除 | |
| 186 | +| `saved-dirty-safe` | 只改名称或扫描范围 | 直接保存、取消 | |
| 187 | +| `saved-dirty-sensitive` | 地址、provider 或 IMAP 参数改变 | 重新输入凭据、重新测试、取消 | |
| 188 | +| `testing` | 正在连接 | 取消测试,不允许重复提交 | |
| 189 | +| `tested-ok` | 当前敏感字段测试成功 | 保存 | |
| 190 | +| `test-failed` | 测试失败 | 修改、重试、取消 | |
| 191 | +| `unsupported` | Outlook/OAuth2 边界 | 查看说明、返回 | |
| 192 | + |
| 193 | +测试结果必须绑定字段指纹;字段变化后不得继续复用旧测试成功状态。 |
| 194 | + |
| 195 | +## 错误与反馈 |
| 196 | + |
| 197 | +| 类型 | 文案目标 | 恢复动作 | |
| 198 | +|---|---|---| |
| 199 | +| 域名不一致 | 指明邮箱类型与后缀不一致 | 修改地址 / 选自定义 IMAP | |
| 200 | +| 服务器缺失 | 指明缺少 server 或无效端口 | 聚焦对应字段 | |
| 201 | +| 网络不可达 | 说明无法连接主机 | 检查网络 / 重试 | |
| 202 | +| 认证失败 | 说明授权码或 IMAP 权限可能无效 | 重新输入授权码 / 查看帮助 | |
| 203 | +| OAuth2 必需 | 明确不是普通密码错误 | 返回 / 查看支持说明 | |
| 204 | +| 敏感变更未重测 | 说明哪些字段变化导致测试失效 | 重新测试 | |
| 205 | +| 保存失败 | 保留草稿和输入 | 重试 / 取消 | |
| 206 | + |
| 207 | +Toast 只用于成功和无需决策的短反馈;认证、删除、未保存草稿和不可逆操作使用页面错误或确认对话框。 |
| 208 | + |
| 209 | +## 安全与隐私 |
| 210 | + |
| 211 | +- 已保存授权码永不回填;只显示枚举状态。 |
| 212 | +- Secret 输入禁止复制和剪切,允许粘贴。 |
| 213 | +- 配置保存必须剥离 `auth_code`、`password`、`token` 和 `api_key`。 |
| 214 | +- 错误、日志、测试摘要和剪贴板不得包含 secret。 |
| 215 | +- 账户地址可以掩码展示,但编辑时显示完整地址;绝对路径和系统凭据标识不显示。 |
| 216 | + |
| 217 | +## 通用组件复用 |
| 218 | + |
| 219 | +复用 0.1.4:`DialogShell`、`ActionButton`、`StatusBadge`、`SectionCard`、`StatePanel`、`ToastHost`。 |
| 220 | + |
| 221 | +0.1.5 新增: |
| 222 | + |
| 223 | +| 组件 | 稳定职责 | |
| 224 | +|---|---| |
| 225 | +| `SettingsLayout` | 设置导航、内容区和固定底栏 | |
| 226 | +| `ConfigListRow` | 配置主信息、状态、辅助信息和动作 | |
| 227 | +| `WizardDialog` | 稳定步骤头、主体和底栏 | |
| 228 | +| `SecureInput` | Secret 输入、安全状态和覆盖语义 | |
| 229 | +| `SafetyNotice` | 安全、隐私和不可逆操作说明 | |
| 230 | + |
| 231 | +组件只接收 view state 和发出用户意图,不直接读写配置、凭据或数据库。 |
| 232 | + |
| 233 | +## 键盘与可访问性 |
| 234 | + |
| 235 | +- `Tab` 顺序:设置导航 → 页面标题动作 → 列表 → 页面底栏。 |
| 236 | +- 向导中 `Enter` 只触发当前可用的下一步或测试,不越过校验;`Esc` 先处理未保存草稿。 |
| 237 | +- 状态不能只靠颜色,必须有文字和图标。 |
| 238 | +- 焦点边框清晰,Secret 的安全限制不能阻止键盘粘贴。 |
| 239 | +- 125% 和 150% Windows 缩放下不得裁切字段、按钮或错误说明。 |
| 240 | + |
| 241 | +## 响应式规则 |
| 242 | + |
| 243 | +- 1920×1080:1120×720 完整展开。 |
| 244 | +- 1440×900:对话框最大化到可用区域,左导航可压缩到 160 px。 |
| 245 | +- 1366×768:对话框使用屏幕可用区域,导航折叠为图标加 tooltip,辅助说明可折叠;不得横向滚动。 |
| 246 | +- 小尺寸只压缩间距和辅助说明,不隐藏保存、取消、测试、编辑和删除等关键动作。 |
| 247 | + |
| 248 | +## 验收标准 |
| 249 | + |
| 250 | +1. 多账户按 `mailbox_key` 精确编辑,provider 改变不会产生重复身份。 |
| 251 | +2. 已保存账户不会被 provider 切换静默改写地址;只有新草稿允许后缀辅助。 |
| 252 | +3. 敏感字段改变后必须重新输入可用凭据并测试成功。 |
| 253 | +4. Outlook-like 账户在下一步、测试、保存和同步入口均保持一致阻断。 |
| 254 | +5. 授权码不出现在配置、日志、错误、摘要或剪贴板中。 |
| 255 | +6. 禁用最后一个可扫描账户被阻止;删除账户不影响已导入业务数据。 |
| 256 | +7. 1920×1080、1440×900 和 1366×768 均能完成新增、编辑、测试、启停和删除。 |
| 257 | +8. 设置中心无空壳页面、无横向滚动、无依赖颜色的唯一状态表达。 |
0 commit comments