Files
a-share-analysis/docs/superpowers/specs/2026-08-18-market-overview-tdx-direct-design.md

141 lines
6.1 KiB
Markdown

# 市场综合概览 TDX 直连设计
- 功能编号:FEAT-MO-001
- 设计版本:0.2
- 状态:已获用户确认,待实现计划
- 日期:2026-08-18
## 1. 设计目标
首页市场概览直接使用 TDX 行情数据,向用户提供结论优先的综合盘面视图。数据链路不保留离线样本 Provider 或运行时数据源切换,TDX 不可用时明确展示不可用状态,不伪造实时行情。
首屏支持综合、短线和中长线视角,以及规则、AI、混合和对照模式的状态入口;本次 TDX 首屏只提供统一的市场快照和规则事实展示,不在本轮实现付费 AI 结论。
## 2. 系统边界
浏览器不得直接连接 TDX。Nest API 在服务端调用本机 TDX 隧道端点,Vue 通过既有 Axios 封装访问 Nest API。
```text
Vue 市场概览
-> Axios request 封装
-> Nest 市场概览 API
-> TDX HTTP 客户端
-> 127.0.0.1:17710
-> SSH / Tailscale 隧道
-> Windows 127.0.0.1:17709
-> TDX
```
家庭局域网和外出 Tailscale 只改变 SSH 别名和网络路径,业务服务始终访问本机 `127.0.0.1:17710`。真实地址、用户、密钥和控制套接字只保存在开发机,不进入仓库。
## 3. 后端模块设计
后端按市场概览业务模块组织,保持连续可读的职责边界:
```text
server/apps/api/src/market-overview/
├── market-overview.module.ts
├── market-overview.controller.ts
├── market-overview.service.ts
├── market-overview.dto.ts
└── tdx/
├── tdx.client.ts
├── tdx.mapper.ts
└── tdx.types.ts
```
- `controller`:提供按业务模块拆分的只读 HTTP 接口。
- `service`:组织 TDX 数据、统一快照时间并生成规则事实摘要。
- `dto`:定义 HTTP 响应契约,禁止把 TDX 原始字段直接暴露给前端。
- `tdx.client`:只负责请求本机 TDX 端点、超时和协议级错误。
- `tdx.mapper`:把 TDX 原始字段转换为领域字段和展示口径。
- `tdx.types`:描述经过确认的 TDX 原始响应结构。
首版接口:
```text
GET /api/market-overview/summary
GET /api/market-overview/indices
GET /api/market-overview/breadth
GET /api/market-overview/sectors
GET /api/market-overview/funds
```
接口按模块拆分,页面进入时可并行请求;每个接口失败不会使其他模块整体失败。未来详情页可以复用指数和板块的业务边界,不通过新增巨型首页接口解决。
## 4. 前端模块设计
```text
web/src/
├── api/market-overview/index.ts
├── views/market-overview/
│ ├── MarketOverviewPage.vue
│ ├── useMarketOverview.ts
│ └── components/
└── types/market-overview.ts
```
业务请求只能通过 `web/src/api/market-overview/index.ts` 调用 `web/src/utils/request.ts`。页面组件不直接使用 Axios、不拼接 TDX 地址,也不读取服务端环境变量。
首屏顺序:市场结论、驱动与风险、核心指数、涨跌分布与市场宽度、成交量与成交额、板块强弱、资金趋势、更新时间和 TDX 连接状态。指数和板块保留进入未来详情页的可识别入口。
## 5. 响应契约与状态
每个业务接口采用统一外层结构:
```json
{
"snapshotId": "20260818-101500",
"asOf": "2026-08-18T10:15:00+08:00",
"source": "tdx",
"status": "fresh",
"data": {},
"warnings": []
}
```
`status` 取值为 `fresh`、`delayed`、`partial` 或 `unavailable`。`snapshotId` 和 `asOf` 用于让并行接口在同一次市场快照下可对照;数据日期、更新时间和来源状态必须在页面可见。
- TDX 单个模块失败:只显示对应模块错误。
- TDX 返回部分字段:保留可用字段并标记 `partial`。
- TDX 超时或完全不可用:显示连接状态和重试入口,不显示虚假行情。
- 后端日志只记录脱敏错误摘要,不保存完整原始行情载荷。
## 6. 安全策略
- TDX 地址固定来自服务端配置,禁止由 HTTP 请求参数传入任意 URL,避免 SSRF。
- TDX 仅通过本机回环端点访问;Windows TDX 继续只监听 `127.0.0.1:17709`。
- API 只读,不提供交易指令、买卖建议、目标价或仓位建议。
- SSH、Tailscale、TDX 账号、密钥、密码、本地环境文件和生产地址不提交 Git。
- 真实行情只用于只读联调,日志、测试报告和截图不得保存家庭网络信息或完整原始载荷。
## 7. 性能策略
- 页面并行请求各业务接口,避免串行阻塞整页。
- TDX 客户端设置连接超时和读取超时,并记录请求耗时。
- DTO 只返回页面需要字段,不透传完整 TDX 原始响应。
- 首版采用分钟级刷新,不承诺秒级实时;暂不启用 Redis 缓存,待数据口径和刷新频率稳定后评估。
- 前端使用模块级加载、空、部分数据和错误状态,避免一个模块阻断首屏。
## 8. 测试与验证
- TDX 类型转换和展示口径的单元测试。
- 每个接口的成功、超时、空数据、部分字段和不可用测试。
- Nest API 响应契约和错误状态测试。
- Vue API 模块、页面状态和模块级失败降级测试。
- 家庭局域网 SSH 路径和外出 Tailscale SSH 路径的端到端只读联调。
- 桌面与窄屏视觉验证,确认结论、更新时间和错误状态不重叠。
- 开发前和提交前执行 GitNexus 影响分析与变更检测;开发完成执行代码 Review、规范 Review、测试、构建和 `governance:finish`。
## 9. 明确不在本次实现范围
- 离线样本 Provider、运行时数据源切换和自动回退。
- MySQL、Redis、RocketMQ 的正式行情存储或采集链路。
- 付费 AI 请求和 AI 结论生成。
- 用户、邀请、会员、订阅、社区、自选股、笔记、计划和交易功能。
- 指数或板块详情页的完整实现;本次只保留入口和接口边界。
## 10. 回退方案
若 TDX 协议字段无法稳定确认、首屏核心模块无法独立降级或隧道联调影响本地构建,则停止 TDX 直连功能提交,回退到上一个本地标签;不得以样本数据冒充 TDX 实时结果。回退只撤销本功能提交,不删除开发机 SSH、Tailscale 或 TDX 配置。