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

12 KiB
Raw Blame History

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

无移除的需求。