---
title: 设置页配置快照导入标准
doc_type: feature-spec
domain: settings
keywords:
  - 设置页
  - 配置导入
  - config token
  - stock.assistant.token
  - 配置快照
summary: 定义设置页统一配置快照的聚合边界、标准文件格式和导入导出链路。
when_to_read:
  - 要改设置页的配置导入导出
  - 要新增可迁移配置项并写入标准快照文件
  - 要理解为什么配置真值没有直接物理合并到单表
read_next:
  - ../overview/architecture.md
  - ./settings-workspace-design-guideline.md
---
# 设置页配置快照导入标准

这篇文档解释“设置页快速导入”为什么采用统一配置快照，而不是继续让页面分别读写多套配置来源。

它适合在你要改设置页导入导出、补配置迁移范围或扩展 `stock.assistant.token` 文件时阅读。读完后如果要继续看页面壳层和交互口径，再看 [设置工作台设计规范](./settings-workspace-design-guideline.md)。

## 背景

当前设置页里的正式配置分散在 3 处 SQLite 真值域：

- 数据源配置：SQLite `sys_config.desktop.provider.*` 与 `desktop.market.*`
- LLM 配置：SQLite `sys_llm_*`
- 公告规则：SQLite `sys_config`

这不是页面层设计出来的边界，而是不同阶段按各自职责逐步落地的结果：

- 桌面运行时配置最早需要在数据库以外直接启动，所以先落成 `desktop-market-config.json`；现在已经迁入 SQLite，并只保留“一次性导入 legacy 文件”的过渡能力。
- LLM 配置包含 provider、workflow、并发和重试等结构化业务真值，后来单独落成正式表。
- 公告规则和部分系统级参数沿用了已有的 `sys_config` 键值配置表。

问题不在于“存储介质不同”，而在于过去没有一层统一的配置聚合能力，导致设置页看起来是一套配置，导入导出却没有单一正式入口。

## 这次固定的方案

这次不直接把底层存储物理迁成一个表，而是先固定一个更小、更安全的收口面：

1. 保留现有底层正式真值位置不变。
2. 在 Rust 新增统一配置快照服务。
3. 设置页的配置导出和快速导入只调用这一套聚合能力。
4. 页面层不再自己拼装“市场配置 + LLM 配置 + 公告规则”。

一句话：

`单一真值仍然分层存放，但配置迁移入口收敛成单一契约。`

## 标准文件

统一标准文件名：

- `stock.assistant.token`

统一文件类型标识：

- `fileType = "stock.assistant.token"`
- `schemaVersion = 1`

文件内容是 JSON 文本，但运行时正式识别口径不是“看起来像 JSON 就算”，而是：

- 文件扩展名必须是 `.token`
- `fileType` 必须精确匹配
- `schemaVersion` 必须精确匹配

任何一项不匹配都直接 fail fast。

## 快照覆盖范围

当前标准快照只覆盖“可迁移的正式业务配置”：

- 数据源配置
  - AkShare
  - Tushare
  - iFind
  - CNInfo
  - 多来源日线查询来源偏好
- LLM 配置
  - provider profile
  - workflow policy
- 公告规则
  - 阈值
  - 标题剔除词
  - 放行分类
  - 放行关键词

当前明确不纳入：

- 本地账户
- 任务运行记录
- 日志、通知历史、失败任务
- 主题、图标等纯本机界面偏好

## 调用链

```mermaid
flowchart LR
    UI["/settings/import"] --> API["src/renderer/src/api/client.ts"]
    API --> Bridge["desktop settings bridge"]
    Bridge --> Command["Rust commands"]
    Command --> Snapshot["config_token.rs"]
    Snapshot --> Market["sys_config.desktop.provider.* / desktop.market.*"]
    Snapshot --> LLM["sys_llm_*"]
    Snapshot --> Rules["sys_config / notice rules"]
```

关键边界：

- 页面层只负责选文件、触发导入导出、展示摘要。
- bridge 层只转发 `filePath`。
- Rust 统一负责：
  - 聚合当前快照
  - 写标准文件
  - 解析标准文件
  - 校验文件类型和版本
  - 回写到底层正式真值

## 导入导出规则

### 导出

- 由 Rust 聚合当前正式配置并写文件。
- 导出文件按本机敏感配置文件口径落权限；Unix 下默认写成 `0600`。
- 前端只拿回摘要，不回显明文凭据。

### 导入

- 先校验路径和文件契约，再解析内容。
- 解析通过后，依次回写市场配置、LLM 配置和公告规则。
- 前端导入完成后只刷新设置中心运行态，不自己做字段兼容。

## 后续扩展规则

如果后续要把新的配置项纳入 `stock.assistant.token`，必须同时满足：

1. 它属于正式业务配置，而不是运行记录或临时状态。
2. 它已有明确正式真值位置。
3. Rust 聚合层已经能稳定读写它。
4. 共享契约和标准文件版本已经同步更新。

禁止做法：

- 页面层自己新增一段本地 JSON 拼接
- 只改导出不改导入
- 在 consumer 侧对快照字段做长期兼容双读
