docs: UI/UX深度审计 — 视觉设计+功能交互全面评估

- PROJECT_EVALUATION.md: 新增UI/UX审计评分(48/100)
  - 视觉设计65分(配色专业但系统执行不严格)
  - 交互体验40分(alert/prompt泛滥,无Toast)
  - 功能便捷性45分(快捷键仅4个,无终端搜索)
  - 状态处理35分(多组件缺三态)
  - 响应式10分(完全缺失)
  - 12项Critical问题 + 8项Warning问题
  - 功能完成度矩阵 + 竞品对标
  - 3阶段优化路线(48→88分)

- ROADMAP.md: 基于UI/UX审计重写路线图
  - v1.1.0 基础可用(2周): Toast+终端搜索+会话恢复+SFTP修复
  - v1.2.0 体验升级(2周): 快捷键+拖拽+响应式+视觉打磨
  - v1.3.0 测试覆盖(2周): 核心模块50%覆盖率
  - v1.4.0 专业功能(2周): 分屏+i18n+自定义快捷键
  - v1.5.0 安全升级(1周): Electron升级+IPC加密
This commit is contained in:
OpsXShell Dev committed 2026-04-18 13:23:04 +08:00
1 parent 60c3d868c5
commit c5243df040
2 files changed
+428 -560

No files matched your search

+295 -298
View File
@@ -9,47 +9,315 @@
| 日期 | 版本 | 评分 | 主要变更 |
|------|------|------|----------|
| 2026-04-04 | v0.1.0 | 56/100 | 初始骨架 |
| 2026-04-05 | v0.5.0 | 72/100 | SFTP 传输队列优化 |
| 2026-04-06 | v0.10.0 | 78/100 | 核心功能实现发布 |
| 2026-04-18 | v1.0.0-audit | **58/100** | 独立代码审计(本次) |
| 2026-04-18 | 代码审计 | **58/100** | 独立代码质量审计 |
| 2026-04-18 | UI/UX审计 | **48/100** | UI 视觉 + 功能交互深度审计 |
> **评分说明**: 此前评分(95-99)为开发过程自评,缺少客观基准。本次基于 7 维度独立审计重新评估,结果显著低于历史记录。这是正常的——自评往往偏高,独立审计才能暴露真实问题。
> **评分说明**: 代码审计聚焦代码质量/测试/架构/安全;UI/UX 审计聚焦视觉设计、交互体验、功能便捷性。
---
## v1.0.0 独立审计评估 (2026-04-18)
## UI/UX 审计评估 (2026-04-18)
### 整体评分
### 整体评分: **48/100**
| 维度 | 分数 | 权重 | 加权分 | 说明 |
|------|------|------|--------|------|
| **功能完成度** | 82/100 | 25% | 20.5 | SSH/SFTP/端口转发主体完成,SFTP 上传为简化实现 |
| **代码质量** | 45/100 | 20% | 9.0 | 调试日志残留严重,组件过大,Mock 数据残留 |
| **测试覆盖** | 15/100 | 20% | 3.0 | 仅 34 测试用例,核心模块零覆盖 |
| **架构设计** | 72/100 | 15% | 10.8 | IPC 分层合理,Store 有耦合,组件拆分不足 |
| **安全合规** | 55/100 | 10% | 5.5 | 加密实现优秀,但密码明文传输风险、CSP 不严格 |
| **依赖管理** | 50/100 | 5% | 2.5 | Electron v28 过旧,better-sqlite3 严重过时 |
| **构建配置** | 75/100 | 5% | 3.75 | 配置合理,dev 脚本跨平台兼容性差 |
**综合评分: 58/100** — 功能原型阶段,距生产可用尚有差距
### 评分对比
| 维度 | 分数 | 评级 | 说明 |
|------|------|------|------|
| **视觉设计** | 65/100 | 🟡 中等 | 深色主题配色专业,但设计系统执行不严格 |
| **交互体验** | 40/100 | 🔴 差 | 大量半成品功能,反馈系统缺失 |
| **功能便捷性** | 45/100 | 🔴 差 | 快捷键薄弱,核心操作路径长 |
| **状态处理** | 35/100 | 🔴 差 | 多组件缺空状态/加载/错误三态 |
| **响应式设计** | 10/100 | 🔴 极差 | 完全缺失 |
```
功能完成度 ████████████████████░░░░░ 82% 功能基本齐全
代码质量 ██████████░░░░░░░░░░░░░░░ 45% 调试代码残留严重
测试覆盖 ███░░░░░░░░░░░░░░░░░░░░░░ 15% 核心模块零测试
架构设计 █████████████████░░░░░░░░ 72% IPC 分层好,Store 有耦合
安全合规 █████████████░░░░░░░░░░░░ 55% 加密好,传输链路有风险
依赖管理 ████████████░░░░░░░░░░░░░ 50% 多个依赖严重过时
构建配置 ██████████████████░░░░░░░ 75% 基本合理
视觉设计 ████████████████░░░░░░░░░ 65% 配色专业但执行不严格
交互体验 ██████████░░░░░░░░░░░░░░░ 40% alert/prompt泛滥,无Toast
功能便捷性 ███████████░░░░░░░░░░░░░░ 45% 快捷键仅4个,无终端搜索
状态处理 ████████░░░░░░░░░░░░░░░░░ 35% 多组件缺三态
响应式设计 ██░░░░░░░░░░░░░░░░░░░░░░░ 10% 完全缺失
```
### 竞品对标
| 维度 | OpsXShell | Termius | Tabby |
|------|-----------|---------|-------|
| 整体配色 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| 布局结构 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 图标一致性 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 动画/过渡 | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 响应式 | ⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| 状态处理 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 设计系统 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
**OpsXShell 视觉设计达到 Termius 的 70-75% 水平,但交互体验仅 40-50%。**
---
## 代码统计
## 视觉设计详细评估
### 总量
### ✅ 做得好的
| 组件 | 亮点 |
|------|------|
| **WelcomeView** | 全项目最佳 — 2×2快捷操作网格,独立配色,图标容器渐变悬停,`rounded-xl` 统一圆角 |
| **Modal** | `backdrop-blur-sm` 毛玻璃 + `shadow-2xl` 立体感 + ESC关闭 |
| **Button** | 4变体 × 3尺寸 = 12组合,disabled 态完整,loading spinner |
| **TabBar** | 连接状态圆点(黄/绿/红),`min-w/max-w` 宽度限制,悬停显示关闭按钮 |
| **TransferPanel** | 折叠动画 + 进度条 `transition-all duration-300` + 状态标签胶囊 |
| **配色系统** | `dark-900→800→700→600` 四级灰度 + `accent-blue/green/purple` 三色搭配 |
### 🔴 高优先级视觉问题
| # | 文件 | 问题 | 修复方案 |
|---|------|------|----------|
| V-1 | `StatusBar.tsx:33` | `bg-accent-blue` 状态栏过于刺眼 | → `bg-dark-800 border-t border-dark-700` |
| V-2 | `SFTPView.tsx:96-131` | 右键菜单用 emoji `📂📤📥🗑️` | → Lucide 图标组件 |
| V-3 | `FileRow.tsx:27` | 选中色 `cyan-500` 不在设计系统 | → `accent-blue/20` |
| V-4 | `TerminalView.tsx:601` | 恢复按钮 `bg-cyan-600` 不在设计系统 | → `accent-blue` |
| V-5 | `FileRow.tsx:32` | 目录图标 `sky-400` 不在设计系统 | → `accent-blue` |
### 🟡 中优先级视觉问题
| # | 文件 | 问题 |
|---|------|------|
| V-6 | `Breadcrumb.tsx:33` | `text-slate-600` 应统一为 `text-dark-600` |
| V-7 | `TransferItem.tsx:28` | `bg-slate-700` 应统一为 `bg-dark-700` |
| V-8 | `WelcomeView.tsx:26` | `grid-cols-2` 硬编码,应加 `grid-cols-1 sm:grid-cols-2` |
| V-9 | `StatusBar.tsx:36` | `Wifi` 图标语义不当,应用 `CheckCircle` |
| V-10 | `tailwind.config.js` | 缺少 `accent-orange` 定义,`orange-400` 散落 |
---
## 交互体验详细评估
### 🔴 Critical — 严重影响可用性
| # | 文件 | 问题 | 影响 |
|---|------|------|------|
| I-1 | `App.tsx:46,49,128,159,168` | 导入导出全用 `alert()` | 体验极差,与暗色主题不协调 |
| I-2 | `SFTPView.tsx:173` | 新建文件夹用 `prompt()` | 原生弹窗破坏沉浸感 |
| I-3 | `PortForwardView.tsx:150` | 删除用 `confirm()` | 同上 |
| I-4 | `SFTPView.tsx:103` | 本地上传右键菜单 action **空函数** | 功能完全不可用 |
| I-5 | `SFTPView.tsx:129-131` | 远程删除右键菜单 action **空函数** | 功能完全不可用 |
| I-6 | `useSFTP.ts:399` | 上传实现是模拟代码 | SFTP 上传不可用 |
| I-7 | `WelcomeView.tsx:12-16` | 最近连接列表是硬编码假数据 | 显示虚假信息误导用户 |
| I-8 | `SessionDialog.tsx:265-270` | 私钥"浏览"按钮 **无事件** | 点击无反应 |
| I-9 | 全局 | **无 Toast 通知系统** | 用户操作无任何非阻塞反馈 |
| I-10 | 全局 | **无终端搜索** (Ctrl+Shift+F) | 基础功能缺失 |
| I-11 | `tabStore.ts` | 标签页无持久化,重启全部丢失 | 会话恢复名存实亡 |
| I-12 | `StatusBar.tsx:33-56` | 状态栏永远显示"就绪" | 未接入实际连接状态 |
### 🟡 Warning — 显著影响效率
| # | 文件 | 问题 |
|---|------|------|
| I-13 | 快捷键仅 4 个 | 缺 Ctrl+Tab 切标签、Ctrl+1~9、F11 全屏、Ctrl+Shift+F 搜索 |
| I-14 | `WelcomeView.tsx:120` | 提示 Ctrl+T 但 **未注册** |
| I-15 | `TabBar.tsx` | 无标签拖拽排序 |
| I-16 | `QuickConnectDialog.tsx:12-17` | 不支持密钥认证,仅密码 |
| I-17 | `SettingsView.tsx:79` | light 主题选项无效(仅 dark) |
| I-18 | `SettingsView.tsx:96-101` | 语言切换无效(无 i18n) |
| I-19 | `SFTPView.tsx:208` | 左右面板共享 contextMenu 状态可能冲突 |
| I-20 | `Sidebar.tsx` | 会话分组不可折叠/展开 |
---
## 功能便捷性评分
### SSH 连接
| 场景 | 步骤 | 评分 | 竞品对比 |
|------|------|------|----------|
| 已保存会话 | 1步(双击) | 8/10 | ✅ 与 Termius 持平 |
| 快速连接 Ctrl+K | 2-4步 | 7/10 | ⚠️ 不支持 `user@host:port` 单行输入 |
| 密钥认证 | — | 3/10 | ❌ 浏览按钮无效,需手动输入路径 |
### SFTP 文件操作
| 操作 | 步骤 | 评分 | 问题 |
|------|------|------|------|
| 导航目录 | 1步 | 8/10 | ✅ |
| 上传文件 | 3步 | 3/10 | ❌ 不可用(模拟实现) |
| 下载文件 | 2步 | 7/10 | ✅ |
| 新建文件夹 | 2步 | 5/10 | ⚠️ 用 `prompt()` |
| 拖拽上传 | — | 0/10 | ❌ 缺失 |
| 文件预览 | — | 0/10 | ❌ 缺失 |
### 标签页管理
| 操作 | 方式 | 评分 | 竞品差距 |
|------|------|------|----------|
| 创建 | +按钮/Ctrl+N | 8/10 | — |
| 切换 | 点击标签 | 6/10 | ❌ 无 Ctrl+Tab |
| 关闭 | ×/Ctrl+W | 7/10 | — |
| 拖拽排序 | — | 0/10 | ❌ 缺失 |
| 会话恢复 | — | 0/10 | ❌ 重启丢失 |
### 快捷键覆盖
| 类别 | 已有 | 缺失 | 覆盖率 |
|------|------|------|--------|
| 应用级 | 4个 (N/K/Q/R) | F11全屏, Ctrl+Shift+N新标签 | 30% |
| 标签级 | 1个 (Ctrl+W) | Ctrl+Tab, Ctrl+1~9, Ctrl+Shift+T恢复 | 10% |
| 终端级 | 0 | Ctrl+Shift+F搜索, Ctrl+Shift+C/V, Ctrl+/-缩放 | 0% |
| 自定义 | ❌ | 全部 | 0% |
---
## 功能完成度矩阵
| 功能 | 状态 | 完成度 | 备注 |
|------|------|--------|------|
| SSH 密码连接 | ✅ | 90% | |
| SSH 密钥连接 | 🟡 | 60% | 浏览按钮无效 |
| SSH Agent 认证 | ✅ | 80% | |
| XTerm.js 终端 | ✅ | 85% | 无搜索 |
| 终端多主题 | ✅ | 90% | |
| IP 高亮 | ✅ | 95% | |
| SFTP 双栏浏览 | ✅ | 80% | |
| SFTP 上传 | 🔴 | 10% | 模拟实现 |
| SFTP 下载 | ✅ | 75% | |
| SFTP 右键菜单 | 🟡 | 40% | 多个空函数 |
| SFTP 拖拽上传 | ❌ | 0% | |
| SFTP 文件预览 | ❌ | 0% | |
| 端口转发 | ✅ | 85% | |
| 标签页管理 | 🟡 | 60% | 无拖拽/恢复 |
| 会话管理 | ✅ | 75% | |
| 会话恢复 | ❌ | 5% | 设置存在但未实现 |
| 快捷键系统 | 🔴 | 15% | 仅4个,不可自定义 |
| Toast 通知 | ❌ | 0% | |
| 终端搜索 | ❌ | 0% | |
| 设置系统 | 🟡 | 50% | light/i18n 无效 |
| 状态栏 | 🔴 | 10% | 永远"就绪" |
| 欢迎页 | 🟡 | 60% | 假数据 |
---
## SWOT 分析
### Strengths (优势)
- 深色主题四级灰度配色系统专业(基于 Tailwind Slate)
- WelcomeView 快捷操作卡片设计出色
- 基础组件质量高(Button/Modal/Loading/ErrorBoundary)
- 连接池管理 + 终端快照恢复(独有亮点)
- AES-256-GCM 加密实现专业
### Weaknesses (劣势)
- **大量半成品功能**: SFTP 上传/删除/右键菜单为空函数
- **反馈系统缺失**: 无 Toast,大量 alert/prompt/confirm
- **快捷键极弱**: 仅 4 个,无终端搜索、无标签切换
- **调试代码未清理**: `DEBUG=true` + 50+ console.log
- **设计系统执行不严格**: cyan/sky/slate 颜色散落
### Opportunities (机会)
- Toast 通知系统建立后,全局交互体验可跃升
- xterm SearchAddon 可快速集成终端搜索
- 快捷键自定义框架一次建设,长期受益
- 响应式设计补全后可在小屏/平板使用
### Threats (威胁)
- 竞品 Termius/Tabby 功能成熟度远超
- 半成品功能影响用户第一印象
- 无会话恢复 = 重启丢工作,企业用户不可接受
---
## 优化方向与目标
### Phase 1: 基础可用 (v1.1.0) — 2 周
**目标**: 解决所有 Critical 问题,产品具备基础可用性
**评分目标**: UI/UX 48→65
| # | 任务 | 类型 | 预计 | 影响 |
|---|------|------|------|------|
| 1 | **Toast 通知系统** (组件 + 全局 hook) | 新增 | 2天 | 全局交互提升 |
| 2 | **替换所有 alert/prompt/confirm** 为自定义 UI | 修复 | 2天 | 消除原生弹窗 |
| 3 | **SFTP 上传/删除真实实现** | 修复 | 3天 | 核心功能可用 |
| 4 | **终端搜索** (xterm SearchAddon) | 新增 | 1天 | 基础功能补全 |
| 5 | **会话恢复** (标签持久化到 SQLite) | 新增 | 3天 | 重启不丢工作 |
| 6 | **修复私钥浏览按钮** | 修复 | 0.5天 | 密钥认证可用 |
| 7 | **清理生产调试日志** | 修复 | 1天 | 代码质量 |
| 8 | **设计系统统一** (cyan→accent-blue 等) | 修复 | 1天 | 视觉一致性 |
| 9 | **StatusBar 接入实际状态** | 修复 | 0.5天 | 信息准确 |
| 10 | **WelcomeView 真实最近连接** | 修复 | 1天 | 去除假数据 |
### Phase 2: 体验升级 (v1.2.0) — 2 周
**目标**: 快捷键、视觉打磨、交互优化
**评分目标**: UI/UX 65→78
| # | 任务 | 类型 | 预计 |
|---|------|------|------|
| 1 | Ctrl+Tab / Ctrl+1~9 标签切换 | 新增 | 1天 |
| 2 | 标签拖拽排序 | 新增 | 2天 |
| 3 | SFTP 拖拽上传 | 新增 | 2天 |
| 4 | SFTP 右键菜单完善(权限编辑/属性) | 完善 | 1天 |
| 5 | 侧边栏会话分组折叠/展开 | 完善 | 1天 |
| 6 | Sidebar 宽度可拖拽调整 | 新增 | 1天 |
| 7 | 响应式布局基础(窄窗口折叠侧边栏) | 新增 | 2天 |
| 8 | Loading/Skeleton 加载态补全 | 新增 | 1天 |
| 9 | 空状态插画/提示补全 | 新增 | 1天 |
| 10 | 终端组件拆分重构 | 重构 | 3天 |
### Phase 3: 专业功能 (v1.3.0) — 3 周
**目标**: 快捷键自定义、终端分屏、i18n
**评分目标**: UI/UX 78→88
| # | 任务 | 类型 | 预计 |
|---|------|------|------|
| 1 | 快捷键自定义系统 | 新增 | 3天 |
| 2 | 终端分屏(水平/垂直) | 新增 | 5天 |
| 3 | i18n 国际化 | 新增 | 5天 |
| 4 | Light 主题实现 | 新增 | 3天 |
| 5 | Snippets 命令片段库 | 新增 | 3天 |
| 6 | 代理设置 | 新增 | 2天 |
| 7 | 多窗口支持 | 新增 | 5天 |
---
## 里程碑总览
```
v1.1.0 基础可用 (2 周) → UI/UX 48→65 解决所有Critical问题
v1.2.0 体验升级 (2 周) → UI/UX 65→78 快捷键+视觉打磨
v1.3.0 专业功能 (3 周) → UI/UX 78→88 分屏+i18n+自定义快捷键
总计: ~7 周 → UI/UX 综合评分 48→88
```
### 成功指标
| 指标 | v1.0 当前 | v1.3 目标 |
|------|-----------|-----------|
| UI/UX 综合评分 | 48/100 | 88/100 |
| 有效快捷键数 | 4 | 30+ |
| alert/prompt/confirm | 8 处 | 0 处 |
| 半成品功能 | 8 个 | 0 个 |
| Toast 通知覆盖 | 0% | 100% |
| 终端搜索 | ❌ | ✅ |
| 会话恢复 | ❌ | ✅ |
| 响应式 | ❌ | ✅ |
| 快捷键可自定义 | ❌ | ✅ |
---
## 代码质量评估(代码审计结论,保留参考)
### 综合评分: 58/100
| 维度 | 分数 | 说明 |
|------|------|------|
| 功能完成度 | 82/100 | SSH/SFTP/端口转发主体完成 |
| 代码质量 | 45/100 | 50+ console.log, DEBUG=true 残留 |
| 测试覆盖 | 15/100 | 核心模块零测试 |
| 架构设计 | 72/100 | IPC 分层好,Store 有耦合 |
| 安全合规 | 55/100 | 加密优秀,传输链路有风险 |
| 依赖管理 | 50/100 | Electron v28 过旧 |
| 构建配置 | 75/100 | 基本合理 |
### 代码统计
| 目录 | 文件数 | 代码行数 | 占比 |
|------|--------|----------|------|
@@ -58,274 +326,3 @@
| `shared/` | 5 | 441 | 3.9% |
| `test/` | 4 | 475 | 4.2% |
| **总计** | **81** | **11,258** | **100%** |
### 需重点关注的文件
| 文件 | 行数 | 问题 |
|------|------|------|
| `src/components/TerminalView.tsx` | 645 | 🔴 单组件过大,含 30+ console.log |
| `electron/services/ssh-service.ts` | 685 | 🔴 核心服务,20+ console.log |
| `src/hooks/useSFTP.ts` | 510 | 🟡 Mock 数据残留,上传未实现 |
| `src/stores/connection/poolStore.ts` | 402 | 🟡 合理但与 lifecycleStore 耦合 |
---
## SWOT 分析
### Strengths (优势)
- **加密实现专业**: AES-256-GCM + PBKDF2(100K迭代) + 随机 Salt/IV,业界最佳实践
- **IPC 架构清晰**: 8 个模块化 IPC Handler,通道常量统一管理
- **连接管理设计**: 状态机 + 连接池 + LRU 淘汰 + 保活,架构先进
- **错误处理体系**: 统一错误码 + 错误推断 + ErrorBoundary + 高阶包装函数
- **共享类型**: `shared/types/` 主进程/渲染进程共用类型
### Weaknesses (劣势)
- **调试代码残留**: `TerminalView.tsx` 有 `const DEBUG = true`,50+ 处彩色调试函数
- **测试严重不足**: 11,258 行代码仅 34 个测试用例,估算覆盖率 10-15%
- **组件过大**: TerminalView 645 行承担终端初始化、连接、Shell 数据、快照恢复全部逻辑
- **依赖过时**: Electron v28(当前v33+)、better-sqlite3 v9(当前v11)、ESLint v8(已停止维护)
- **SFTP 上传未完成**: `useSFTP.ts:399` 标注 "Actual upload implementation would go here"
### Opportunities (机会)
- **Electron 升级**: v33+ 性能提升 30%+,内存占用更低
- **Zustand v5**: 细粒度订阅,减少不必要的重渲染
- **XTerm.js 插件生态**: Image addon、Web Links addon 可增强终端功能
- **打包优化**: electron-builder + asar 可显著减小安装包体积
### Threats (威胁)
- **安全风险**: 密码可能通过 IPC 明文传输;`sandbox: false` 降低安全性
- **竞品压力**: Electerm、Tabby、Termius 等成熟竞品功能更完善
- **跨平台兼容**: `dev` 脚本用 `&` 后台运行,Windows 不可用
- **依赖锁定**: ssh2、socksv5 版本锁定,存在已知漏洞风险
---
## 关键问题清单
### 🔴 Critical — 必须修复
| ID | 问题 | 位置 | 影响 |
|----|------|------|------|
| C-1 | 生产代码中 `DEBUG = true` + 50+ 调试函数 | `TerminalView.tsx:16` | 控制台信息泄露、性能损耗 |
| C-2 | 核心模块零测试(SSH/加密/IPC) | `electron/services/*` | 重构/修改无安全网 |
| C-3 | SFTP 上传功能为占位实现 | `useSFTP.ts:399` | 核心功能不可用 |
| C-4 | 密码可能明文通过 IPC 传输 | `preload.ts`, `session.types.ts` | 安全漏洞 |
| C-5 | Mock 数据残留生产代码 | `useSFTP.ts:154-161` | 生产环境显示假文件 |
### 🟡 Warning — 建议修复
| ID | 问题 | 位置 | 影响 |
|----|------|------|------|
| W-1 | TerminalView 645 行,职责过多 | `TerminalView.tsx` | 可维护性差 |
| W-2 | Store 间直接耦合 | `lifecycleStore.ts:39` | 改一处动全局 |
| W-3 | Electron v28 严重过时 | `package.json` | 性能和安全更新缺失 |
| W-4 | better-sqlite3 v9 过时 | `package.json` | 功能和性能缺失 |
| W-5 | react-router-dom 未使用 | `package.json` | 无用依赖增大包体积 |
| W-6 | IPC 通道名硬编码 | `preload.ts` | 未引用 IPC_CHANNELS 常量 |
| W-7 | `Math.random()` 生成 ID | `TerminalView.tsx:383` | 非唯一,应用 uuid |
| W-8 | disconnect() 几乎空实现 | `useSFTP.ts:359-373` | 资源不释放 |
| W-9 | CSP 允许 unsafe-inline | `index.html:7` | 削弱 XSS 防护 |
| W-10 | 主进程 tsconfig 无未使用检查 | `electron/tsconfig.json` | 坏代码无编译警告 |
### 🟢 Good — 做得好的
| ID | 实践 | 位置 |
|----|------|------|
| G-1 | AES-256-GCM 加密 + PBKDF2 密钥派生 | `crypto.ts` |
| G-2 | IPC Handler 按领域分 8 个模块 | `electron/ipc/*` |
| G-3 | 共享类型定义 main/renderer 共用 | `shared/types/*` |
| G-4 | contextIsolation: true, nodeIntegration: false | `main.ts` |
| G-5 | 统一错误码系统 + 错误推断 | `error-handler.ts` |
| G-6 | 连接状态机 6 状态 + LRU 淘汰 | `connectionPool.ts` |
---
## 依赖评估
| 依赖 | 当前 | 最新 | 状态 | 风险 |
|------|------|------|------|------|
| `electron` | ^28.3.3 | v33+ | 🔴 严重过时 | 性能、安全、API 兼容 |
| `better-sqlite3` | ^9.4.0 | v11.x | 🟡 过时 | 性能改进 |
| `zustand` | ^4.4.7 | v5.x | 🟡 非最新 | 细粒度订阅改进 |
| `lucide-react` | ^0.294.0 | 0.4xx | 🟡 过时 | 图标缺失 |
| `socksv5` | ^0.0.6 | — | 🟡 不稳定 | 0.0.x 版本 |
| `react-router-dom` | ^6.21.0 | 6.x | 🟢 未使用 | 死依赖 |
| `eslint` | ^8.55.0 | v9.x | 🟡 已停维 | flat config 迁移 |
| `react` / `react-dom` | ^18.2.0 | 18.3.x | 🟢 稳定 | — |
| `@xterm/xterm` | ^5.5.0 | 5.5.x | 🟢 最新 | — |
| `ssh2` | ^1.15.0 | 1.15.x | 🟢 稳定 | — |
---
## 测试评估
### 现状
| 测试文件 | 用例数 | 覆盖模块 |
|----------|--------|----------|
| `test/stores/tabStore.test.ts` | 15 | tabStore(完整) |
| `test/stores/connectionPool.test.ts` | 7 | poolStore(仅接口验证) |
| `test/components/sftp/utils.test.ts` | 12 | sftp/utils.ts(完整) |
| **总计** | **34** | — |
### 未覆盖的关键模块
| 模块 | 代码行数 | 优先级 | 说明 |
|------|----------|--------|------|
| `ssh-service.ts` | 685 | P0 | SSH 连接/Shell/端口转发核心 |
| `crypto.ts` | ~100 | P0 | 加密/解密必须验证正确性 |
| `database-service.ts` | 310 | P1 | 数据持久化 |
| `TerminalView.tsx` | 645 | P1 | 核心终端组件 |
| `useSFTP.ts` | 510 | P1 | SFTP 全部操作 |
| `ipc/*.ts` (8个) | ~600 | P1 | IPC 通道处理 |
| `error-handler.ts` | 330 | P2 | 错误处理工具 |
| `poolStore.ts` | 402 | P2 | 连接池逻辑 |
| `lifecycleStore.ts` | 235 | P2 | 生命周期管理 |
**估算覆盖率: ~10-15%**(vitest.config.ts 设定 50% 阈值,实际远未达到)
---
## 安全评估
### 加密实现 ✅ 优秀
| 评估项 | 状态 | 说明 |
|--------|------|------|
| AES-256-GCM | ✅ | 认证加密,防篡改 |
| PBKDF2 密钥派生 | ✅ | 100,000 迭代 |
| 随机 Salt + IV | ✅ | 每次加密独立 |
| Master Key 文件权限 | ✅ | 0o600 |
| Auth Tag 验证 | ✅ | 解密时校验完整性 |
### 安全隐患 ⚠️
| 问题 | 严重性 | 说明 |
|------|--------|------|
| 密码可能明文通过 IPC | 🔴 | Session 类型含 password 字段,需确认传输时是否加密 |
| SSH 私钥通过 IPC 明文 | 🟡 | `sshConnect(config: any)` 私钥内容明文传递 |
| `sandbox: false` | 🟡 | preload 未启用沙箱 |
| CSP `unsafe-inline` | 🟡 | 削弱 XSS 防护 |
| IPC 无输入验证 | 🟡 | 所有 IPC 调用参数无 schema 验证 |
---
## 性能指标
| 指标 | 当前值 | 目标值 | 达标 |
|------|--------|--------|------|
| 冷启动时间 | ~3s | <2s | ❌ |
| SSH 连接速度 | ~1s | <500ms | ❌ |
| 终端输入延迟 | <16ms | <10ms | ✅ |
| 内存占用(10标签) | ~200MB | <150MB | ❌ |
| 标签切换延迟 | <50ms | <100ms | ✅ |
| 包体积 | ~120MB | <100MB | ❌ |
---
## 优化方向与目标
### v1.1.0 — 代码质量清理 (预计 1 周)
**目标**: 清除生产代码中的调试残留,提升代码质量评分至 70+
| 任务 | 优先级 | 影响文件 | 预计工时 |
|------|--------|----------|----------|
| 移除所有 console.log / 调试函数 | P0 | `TerminalView.tsx`, `useSFTP.ts`, `ssh-service.ts` | 4h |
| 移除 `DEBUG = true` 硬编码 | P0 | `TerminalView.tsx:16` | 0.5h |
| 移除 Mock 数据 | P0 | `useSFTP.ts:154-161` | 1h |
| 补全 SFTP 上传功能 | P0 | `useSFTP.ts` | 4h |
| 补全 disconnect() 资源释放 | P1 | `useSFTP.ts:359-373` | 2h |
| Math.random → uuid | P1 | `TerminalView.tsx` | 1h |
| IPC 通道名引用常量 | P2 | `preload.ts` | 2h |
| 移除未使用依赖 react-router-dom | P2 | `package.json` | 0.5h |
**验收标准**:
- `grep -r "console.log" src/ electron/` 返回 0 结果
- `grep -r "DEBUG = true" src/` 返回 0 结果
- SFTP 上传功能端到端可用
### v1.2.0 — 组件拆分重构 (预计 1.5 周)
**目标**: TerminalView 拆分为可维护的模块,架构评分提升至 80+
| 任务 | 优先级 | 说明 |
|------|--------|------|
| TerminalView → useTerminal Hook | P0 | 提取连接管理、Shell 数据处理 |
| TerminalView → useTerminalSnapshot Hook | P0 | 提取快照保存/恢复逻辑 |
| TerminalView → useZmodem Hook | P1 | 提取 rz/sz 文件传输逻辑 |
| useSFTP → useSFTPNavigation + useSFTPTransfer | P1 | 分离导航和传输职责 |
| App.tsx → 导入/导出逻辑抽到 service | P2 | 分离业务逻辑 |
| Store 解耦 | P2 | lifecycleStore 不直接操作 poolStore |
**验收标准**:
- 单文件不超过 300 行
- Hook 职责单一,可独立测试
### v1.3.0 — 测试覆盖达标 (预计 2 周)
**目标**: 核心模块测试覆盖率 60%+,测试评分提升至 50+
| 阶段 | 目标模块 | 用例目标 |
|------|----------|----------|
| 第一批(P0) | `crypto.ts`, `ssh-service.ts`(mock ssh2) | 30+ |
| 第二批(P1) | `database-service.ts`, `error-handler.ts`, `poolStore.ts` | 40+ |
| 第三批(P1) | `IPC handlers`(8个), `TerminalView`(组件测试) | 50+ |
| 第四批(P2) | `useSFTP`, `lifecycleStore`, `tabStore`补充 | 30+ |
**验收标准**:
- `npm test -- --coverage` 总覆盖率 ≥ 50%
- 核心模块(crypto, ssh-service) 覆盖率 ≥ 80%
### v1.4.0 — 依赖升级 + 安全加固 (预计 1 周)
**目标**: 依赖更新到稳定版本,安全评分提升至 75+
| 任务 | 优先级 | 风险 |
|------|--------|------|
| Electron v28 → v33+ | P0 | Breaking changes 需逐一适配 |
| better-sqlite3 v9 → v11 | P0 | API 有变化 |
| ESLint v8 → v9 flat config | P1 | 配置迁移 |
| Zustand v4 → v5 | P2 | 订阅 API 变化 |
| 启用 sandbox 模式 | P1 | preload 需适配 |
| CSP 移除 unsafe-inline | P1 | Tailwind 需配置 |
| IPC 参数 schema 验证 | P2 | 引入 zod 或类似库 |
### v1.5.0 — 功能补全 + 性能优化 (预计 2 周)
**目标**: 补全缺失功能,性能指标全面达标
| 任务 | 优先级 | 说明 |
|------|--------|------|
| SFTP 拖拽上传/下载 | P1 | 界面就绪,补全事件处理 |
| SFTP 断点续传 | P2 | 大文件传输可靠性 |
| 会话分组树形显示 | P2 | 侧边栏优化 |
| 终端分屏 | P3 | 水平/垂直分屏 |
| 安装包体积优化 | P1 | asar + tree-shaking + 依赖瘦身 |
| 冷启动优化 | P1 | 延迟加载非核心模块 |
---
## 里程碑总览
```
v1.1.0 代码质量清理 (1 周) → 代码质量 45→70
v1.2.0 组件拆分重构 (1.5 周) → 架构 72→85
v1.3.0 测试覆盖达标 (2 周) → 测试 15→50
v1.4.0 依赖升级+安全 (1 周) → 安全 55→75
v1.5.0 功能补全+性能 (2 周) → 功能 82→95
总计: ~7.5 周 → 综合评分 58→80+
```
### 成功指标
| 指标 | v1.0 当前 | v1.5 目标 |
|------|-----------|-----------|
| 综合评分 | 58/100 | 80+/100 |
| 测试覆盖率 | ~10% | ≥50% |
| 代码质量(零console.log) | 50+ 处 | 0 处 |
| 单文件最大行数 | 685 | ≤300 |
| Electron 版本 | v28 | v33+ |
| 安全评分 | 55 | 75+ |
| 包体积 | ~120MB | <100MB |