定位现有实现请查 README.md 快速定位表,或 reference/backend/(9 篇逐文件参考,含行号)。
| 目录/文件 | 内容 | 对应 reference 文档 |
|---|---|---|
src-tauri/src/commands/ |
20 个文件、145 处 #[tauri::command] 注解,处理前端 Invoke 请求 |
commands.md |
src-tauri/src/services/ |
15 个服务:account_service(状态中枢)、skland_service(API 客户端)、arknights_service(《明日方舟》数据:player/info、养成、签到)、arknights_gacha_service(《明日方舟》寻访记录:ak-webview 的 cate/history)、game_launcher_service、gacha_service(终末地 ef-webview 抽卡)、char_detail_service、char_wiki_detail_service、config_service、avatar_cache_service、data_query、network_service、secret_registry、secret_store、system_resource_service |
services_account.md、services_skland.md、services_launcher.md、services_others.md |
src-tauri/src/models/ |
8 个文件(含 arknights.rs:《明日方舟》player/info / cultivate / attendance 模型) |
models.md |
src-tauri/src/utils/ |
api_health(API 熔断)、error、crash(panic/崩溃报告)、diagnostics(诊断导出)、hg_crypto、http_client、logger、official_launcher(免启动器启动/提权 helper)、paths、capture |
utils.md |
src-tauri/src/{main,lib,tray}.rs |
进程入口、插件/状态/命令注册、托盘 | bootstrap.md |
src-tauri/{Cargo.toml,tauri.conf.json,capabilities/} |
依赖、窗口与打包配置、权限 | bootstrap.md |
- 错误处理: 统一使用
src-tauri/src/utils/error.rs的AppError,Command 返回Result<T, AppError>(部分历史命令仍返回Result<T, String>,新增时用AppError)。变体与From转换见 utils.md。 - 异步编程: 涉及 I/O 或网络请求的函数必须
async,运行在 tokio(Tauri 默认运行时)。 - 状态管理:
- 全局状态通过 Tauri
State注册(lib.rs的.manage(...)):Arc<Mutex<AccountService>>、Arc<Mutex<ConfigService>>、Arc<GachaService>等。 - 注意:
NetworkService、AvatarCacheService、CharWikiDetailService未单独manage,需通过AccountService持有字段访问(详见 services_others.md)。 - 敏感信息(Token/Cred)严禁硬编码,必须通过
ConfigService或AccountService内存态存取。
- 全局状态通过 Tauri
- 日志记录: 使用
tracing宏(info!/error!/debug!)或utils/logger.rs封装的log_*宏;日志级别由log_level配置控制(关闭开发者模式时 DEBUG 自动屏蔽),前端可通过set_log_level命令运行时调整;禁止裸eprintln!调试残留(应用现为 Windows GUI 子系统,进程可能无控制台,确需写 stderr 时必须用logger::safe_eprintln!,它会在无控制台时静默跳过)。 - 配置读写: 一律走
ConfigService(src-tauri/src/services/config_service.rs),键名用点号路径(如card_settings.{cardId}、account_token_{userId}.user_info)。 - 机密字段: 账户凭据(
cred/token/hytoken/device_token/phone;旧的u8token/role_u8token_*只保留登记用于清理)与代理凭据不落盘 —— 由ConfigService分流到操作系统凭据库(Windows Credential Manager / macOS Keychain / Linux Secret Service)。判定规则见src-tauri/src/services/secret_registry.rs的SECRET_FIELDS常量。新增机密字段必须:① 在SECRET_FIELDS登记;② 更新secure_storage.md§3.1 表格;③ 补单元测试。前端的set_config命令会拒写机密键。⚠️ 机密只能是对象里的子字段(write_secret_fields对非对象值直接跳过):「整个键都是机密」的写法不生效,按实例隔离的机密请用「每个实例一个键 + 固定子字段名」。另:短寿命令牌不必落盘 —— 抽卡 u8token 每次现换,授权只记一个布尔开关。
- 静默/驻守启动:应用入口解析
--silent与--launch-game。仅--silent不启动任何内容;--silent --launch-game创建不可见驻守实例(无窗口/托盘、不计时、不注册单实例插件),启动游戏并驻留到游戏退出;仅--launch-game以正常完整模式启动应用并一并启动游戏。游戏启动必须复用commands::launcher::launch_game,不得另写启动流程。
- 在
src-tauri/src/commands/对应模块新建或扩展文件(无对应模块时新建my_feature.rs并在commands/mod.rs声明) - 编写
#[tauri::command]标注的异步函数,参数用State<'_, ...>+ 显式业务参数(camelCase 自动映射) - 在
src-tauri/src/lib.rs的generate_handler!中注册(清单见 bootstrap.md) - 涉及敏感操作时在
src-tauri/capabilities/default.json/desktop.json声明权限 - 前端在
src/utils/封装调用,并更新 ipc_index.md
- 在
src-tauri/src/services/新建my_service.rs,并在services/mod.rs声明 - 定义结构体与方法;需要跨命令共享时在
lib.rs加.manage(...) - Command 内通过
State<'_, Arc<...>>取用;若服务需访问账户凭证,可挂在AccountService上 - 记录该服务的 HTTP 端点、配置键、emit 事件到对应 reference 文档
- 在
src-tauri/src/models/新建/扩展文件,#[derive(Serialize, Deserialize, Clone, Debug)] - 字段名需与森空岛 API 的 JSON 键一致,否则用
#[serde(rename = "...")]/alias - 注意各文件约定不一致(
game.rs多为 snake_case,其余多为 camelCase),以实际响应为准(见 models.md)
- 路径统一用
src-tauri/src/utils/paths.rs(含平台差异),不要散拼路径 - 图片缓存命名需与
commands/image.rs的extract_filename_from_url规则一致,避免缓存 miss
- 分析 API: 确定森空岛 URL、方法、签名与参数(现有端点总表见 services_skland.md)
- 更新模型: 在
models/定义返回结构体 - 实现服务: 在
services/skland_service.rs新增方法,复用call_skland_api(自动注入cred/sign/timestamp等请求头);自定义请求用utils/http_client.rs - 暴露命令: 在
commands/创建 Command,调用服务层并返回Result<T, AppError> - 前端联调: 在
src/utils/对应服务封装调用,更新 ipc_index.md
| 用途 | 位置 | 说明 |
|---|---|---|
| 森空岛 API 签名 | services/skland_service.rs:396 calculate_sign |
HMAC-SHA256(token, path + body + timestamp + header_json) 后取 MD5;由 call_skland_api(:479)统一注入请求头 |
设备标识 dId |
services/skland_service.rs:72 fetch_new_did |
向数美接口获取设备指纹(原 fetch_new_did_with_retry 无调用方,已删除) |
| AES/RSA/DES 等 | utils/hg_crypto.rs、services/skland_service.rs 内联 |
注意:utils/encrypt.rs(原三个 pub 函数无调用方)已删除,实际逻辑内联在 services/skland_service.rs(详见 services_skland.md) |
| 自更新签名校验 | minisign(见 README「更新系统」) | 前端 src/utils/updateService.ts |
新增/重命名命令、服务、模型,或改动行号较多时,同步更新对应 reference/backend/*.md 与 ipc_index.md(格式见 README.md)。