Files
SecScore/.trae/specs/migrate-to-tauri/spec.md
T
2026-03-16 20:49:46 +08:00

400 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SecScore Electron 到 Tauri 迁移规格
## Why
将现有的 Electron 项目迁移到 Rust + Tauri 框架,以获得更小的打包体积、更好的性能和更低的资源消耗,同时保持所有现有功能和 UI 逻辑完全一致。
## What Changes
- **BREAKING**: 后端从 Node.js/TypeScript 迁移到 Rust
- **BREAKING**: 框架从 Electron 迁移到 Tauri 2.x
- 前端 React 代码保持不变,仅修改 IPC 通信层
- 数据库层从 TypeORM + better-sqlite3 迁移到 Rust 的 SeaORM + Rusqlite
- 所有后端服务用 Rust 重写,功能实现保持一致
## Impact
- Affected specs: 整个后端架构
- Affected code:
- `src/main/` - 全部重写为 Rust
- `src/preload/` - 替换为 Tauri commands
- `src/renderer/` - 仅修改 API 调用层
- `src/shared/` - 部分逻辑迁移到 Rust
## ADDED Requirements
### Requirement: Tauri 项目初始化
系统 SHALL 在 `SecScore-Rust` 目录下创建 Tauri 2.x 项目结构,包含:
- Rust 后端 (src-tauri/)
- React 前端 (复用现有前端代码)
- Tauri 配置文件
#### Scenario: 项目结构创建
- **WHEN** 初始化 Tauri 项目
- **THEN** 应创建标准 Tauri 2.x 项目结构
- **AND** 前端使用现有的 React + Ant Design 技术栈
### Requirement: 数据库层迁移
系统 SHALL 使用 Rust 实现数据库功能,支持 SQLite 和 PostgreSQL
#### Scenario: SQLite 支持
- **WHEN** 未配置 PostgreSQL 连接字符串
- **THEN** 使用 SQLite 作为默认数据库
- **AND** 数据库文件路径与原项目一致
#### Scenario: PostgreSQL 支持
- **WHEN** 配置了有效的 PostgreSQL 连接字符串
- **THEN** 系统应能连接到 PostgreSQL 数据库
- **AND** 支持连接测试和切换
#### Scenario: 数据库迁移
- **WHEN** 系统启动
- **THEN** 自动运行数据库迁移
- **AND** 表结构与原项目完全一致
### Requirement: 学生管理功能
系统 SHALL 提供完整的学生管理功能:
#### Scenario: 查询学生列表
- **WHEN** 调用查询学生接口
- **THEN** 返回所有学生信息,包含 id、name、score、tags
- **AND** 按 score DESC, name ASC 排序
#### Scenario: 创建学生
- **WHEN** 调用创建学生接口
- **THEN** 创建新学生记录,初始分数为 0
- **AND** 返回新创建的学生 ID
#### Scenario: 更新学生
- **WHEN** 调用更新学生接口
- **THEN** 更新指定学生的信息
- **AND** 自动更新 updated_at 时间戳
#### Scenario: 删除学生
- **WHEN** 调用删除学生接口
- **THEN** 删除学生及其关联的积分记录
- **AND** 使用事务确保数据一致性
#### Scenario: 导入学生名单
- **WHEN** 调用导入学生接口
- **THEN** 批量创建学生记录
- **AND** 跳过已存在的学生
### Requirement: 积分事件管理
系统 SHALL 提供完整的积分事件管理功能:
#### Scenario: 创建积分事件
- **WHEN** 调用创建积分事件接口
- **THEN** 创建积分记录并更新学生分数
- **AND** 使用事务确保数据一致性
- **AND** 自动生成 UUID
#### Scenario: 撤销积分事件
- **WHEN** 调用撤销积分事件接口
- **THEN** 撤销积分记录并回退学生分数
- **AND** 已结算的记录不可撤销
#### Scenario: 查询积分事件
- **WHEN** 调用查询积分事件接口
- **THEN** 返回指定条件的积分记录
- **AND** 支持按学生、时间范围筛选
#### Scenario: 查询排行榜
- **WHEN** 调用查询排行榜接口
- **THEN** 返回指定时间范围的排行榜数据
- **AND** 支持 today、week、month 三种范围
### Requirement: 原因管理功能
系统 SHALL 提供完整的积分原因管理功能:
#### Scenario: 查询原因列表
- **WHEN** 调用查询原因接口
- **THEN** 返回所有积分原因
- **AND** 按 category ASC, content ASC 排序
#### Scenario: 创建原因
- **WHEN** 调用创建原因接口
- **THEN** 创建新的积分原因
- **AND** 默认 is_system 为 0
#### Scenario: 更新原因
- **WHEN** 调用更新原因接口
- **THEN** 更新指定原因的信息
#### Scenario: 删除原因
- **WHEN** 调用删除原因接口
- **THEN** 删除指定原因
### Requirement: 结算功能
系统 SHALL 提供完整的结算功能:
#### Scenario: 查询结算列表
- **WHEN** 调用查询结算接口
- **THEN** 返回所有结算记录
- **AND** 包含每个结算的事件数量
#### Scenario: 创建结算
- **WHEN** 调用创建结算接口
- **THEN** 将所有未结算事件标记为已结算
- **AND** 重置所有学生分数为 0
- **AND** 使用事务确保数据一致性
#### Scenario: 查询结算排行榜
- **WHEN** 调用查询结算排行榜接口
- **THEN** 返回指定结算的排行榜数据
### Requirement: 标签管理功能
系统 SHALL 提供完整的学生标签管理功能:
#### Scenario: 查询所有标签
- **WHEN** 调用查询标签接口
- **THEN** 返回所有标签列表
#### Scenario: 创建标签
- **WHEN** 调用创建标签接口
- **THEN** 创建新标签或返回已存在的标签
#### Scenario: 删除标签
- **WHEN** 调用删除标签接口
- **THEN** 删除指定标签及其关联
#### Scenario: 更新学生标签
- **WHEN** 调用更新学生标签接口
- **THEN** 更新指定学生的标签关联
### Requirement: 设置管理功能
系统 SHALL 提供完整的设置管理功能:
#### Scenario: 获取所有设置
- **WHEN** 调用获取所有设置接口
- **THEN** 返回所有设置项
#### Scenario: 获取单个设置
- **WHEN** 调用获取设置接口
- **THEN** 返回指定设置项的值
#### Scenario: 设置值
- **WHEN** 调用设置值接口
- **THEN** 更新指定设置项
- **AND** 通知所有窗口设置变更
#### Scenario: 设置项定义
- **AND** 支持以下设置项:
- is_wizard_completed: boolean
- log_level: string (debug/info/warn/error)
- window_zoom: number
- themes_custom: json array
- auto_score_enabled: boolean
- auto_score_rules: json array
- current_theme_id: string
- pg_connection_string: string
- pg_connection_status: json object
### Requirement: 认证与安全功能
系统 SHALL 提供完整的认证与安全功能:
#### Scenario: 获取认证状态
- **WHEN** 调用获取认证状态接口
- **THEN** 返回当前权限级别和密码设置状态
#### Scenario: 登录
- **WHEN** 调用登录接口
- **THEN** 验证密码并设置权限级别
- **AND** 支持 admin 和 points 两种密码
#### Scenario: 登出
- **WHEN** 调用登出接口
- **THEN** 重置权限级别为默认值
#### Scenario: 设置密码
- **WHEN** 调用设置密码接口
- **THEN** 加密存储密码
- **AND** 自动生成恢复字符串
#### Scenario: 恢复密码
- **WHEN** 调用恢复密码接口
- **THEN** 使用恢复字符串重置所有密码
#### Scenario: 加密实现
- **WHEN** 存储敏感数据
- **THEN** 使用 AES-256-CBC 加密
- **AND** 使用应用数据目录派生的密钥
### Requirement: 主题管理功能
系统 SHALL 提供完整的主题管理功能:
#### Scenario: 获取主题列表
- **WHEN** 调用获取主题列表接口
- **THEN** 返回内置主题和自定义主题
#### Scenario: 获取当前主题
- **WHEN** 调用获取当前主题接口
- **THEN** 返回当前激活的主题配置
#### Scenario: 设置主题
- **WHEN** 调用设置主题接口
- **THEN** 切换到指定主题
- **AND** 通知所有窗口主题变更
#### Scenario: 保存自定义主题
- **WHEN** 调用保存主题接口
- **THEN** 保存自定义主题配置
- **AND** 不允许覆盖内置主题
#### Scenario: 删除自定义主题
- **WHEN** 调用删除主题接口
- **THEN** 删除指定的自定义主题
- **AND** 不允许删除内置主题
### Requirement: 自动评分功能
系统 SHALL 提供完整的自动评分功能:
#### Scenario: 规则管理
- **WHEN** 管理自动评分规则
- **THEN** 支持添加、更新、删除、排序规则
#### Scenario: 规则执行
- **WHEN** 规则触发条件满足
- **THEN** 自动执行规则动作
- **AND** 记录执行时间
#### Scenario: 触发器类型
- **AND** 支持以下触发器:
- interval_time_passed: 定时触发
- student_has_tag: 学生标签触发
#### Scenario: 动作类型
- **AND** 支持以下动作:
- add_score: 添加积分
- add_tag: 添加标签
### Requirement: 数据导入导出功能
系统 SHALL 提供完整的数据导入导出功能:
#### Scenario: 导出数据
- **WHEN** 调用导出数据接口
- **THEN** 导出所有数据为 JSON 格式
#### Scenario: 导入数据
- **WHEN** 调用导入数据接口
- **THEN** 从 JSON 导入数据
- **AND** 重新加载设置
### Requirement: 日志管理功能
系统 SHALL 提供完整的日志管理功能:
#### Scenario: 查询日志
- **WHEN** 调用查询日志接口
- **THEN** 返回最近的日志记录
#### Scenario: 清除日志
- **WHEN** 调用清除日志接口
- **THEN** 删除所有日志文件
#### Scenario: 设置日志级别
- **WHEN** 调用设置日志级别接口
- **THEN** 更新日志级别
#### Scenario: 日志文件
- **AND** 日志文件按日期滚动
- **AND** 保留最近 30 天的日志
### Requirement: 窗口管理功能
系统 SHALL 提供完整的窗口管理功能:
#### Scenario: 窗口控制
- **WHEN** 调用窗口控制接口
- **THEN** 支持最小化、最大化、关闭操作
#### Scenario: 窗口状态
- **WHEN** 查询窗口状态
- **THEN** 返回窗口最大化状态
#### Scenario: 窗口缩放
- **WHEN** 设置窗口缩放
- **THEN** 应用缩放比例到所有窗口
#### Scenario: 窗口导航
- **WHEN** 调用导航接口
- **THEN** 在窗口中导航到指定路由
### Requirement: 系统托盘功能
系统 SHALL 提供系统托盘功能:
#### Scenario: 托盘初始化
- **WHEN** 应用启动
- **THEN** 创建系统托盘图标
#### Scenario: 托盘菜单
- **WHEN** 右键点击托盘图标
- **THEN** 显示菜单:显示主窗口、重启应用、关闭应用
#### Scenario: 双击托盘
- **WHEN** 双击托盘图标
- **THEN** 显示主窗口
### Requirement: URL 协议功能
系统 SHALL 提供自定义 URL 协议功能:
#### Scenario: 协议注册
- **WHEN** 应用启动(非开发模式)
- **THEN** 注册 secscore:// 协议
#### Scenario: 协议处理
- **WHEN** 收到协议 URL
- **THEN** 解析并导航到对应路由
- **AND** 支持路由:home、students、score、leaderboard、settlements、reasons、settings
### Requirement: 单实例运行
系统 SHALL 确保应用单实例运行:
#### Scenario: 单实例检查
- **WHEN** 启动第二个实例
- **THEN** 激活已有实例并退出
### Requirement: 前端 API 适配
系统 SHALL 保持前端 API 调用接口不变:
#### Scenario: API 兼容
- **WHEN** 前端调用 window.api
- **THEN** 返回与原项目相同格式的响应
- **AND** 所有接口签名保持一致
### Requirement: 文件系统功能
系统 SHALL 提供配置文件管理功能:
#### Scenario: 获取配置目录结构
- **WHEN** 调用获取配置目录结构接口
- **THEN** 返回 automatic 和 script 目录路径
#### Scenario: 读写 JSON 文件
- **WHEN** 调用读写 JSON 接口
- **THEN** 在指定目录读写 JSON 文件
#### Scenario: 读写文本文件
- **WHEN** 调用读写文本接口
- **THEN** 在指定目录读写文本文件
#### Scenario: 文件列表
- **WHEN** 调用文件列表接口
- **THEN** 返回指定目录的文件列表
### Requirement: HTTP 服务器功能
系统 SHALL 提供可选的 HTTP API 服务:
#### Scenario: 启动服务器
- **WHEN** 调用启动服务器接口
- **THEN** 启动 HTTP 服务器
- **AND** 支持自定义端口和 CORS 配置
#### Scenario: 停止服务器
- **WHEN** 调用停止服务器接口
- **THEN** 停止 HTTP 服务器
#### Scenario: 服务器状态
- **WHEN** 调用服务器状态接口
- **THEN** 返回服务器运行状态
## MODIFIED Requirements
无修改的需求,所有功能保持原有实现逻辑。
## REMOVED Requirements
无移除的需求。