# 切片 02：公共行情、搜索、详情、图表与数据网关

> 基线：`4002f09`（切片 01）  
> 回档标签：`xiaobai-preservation-slice-02-20260731`  
> 结论：源码、API、数据库、真实页面和浏览器回归通过；最终视觉仍等待全站人工验收

## 1. 原实现归位

本切片从原版副本机械移动公共行情纵向链路，没有从 `next/` 取用代码，也没有修改计算逻辑。

| 原位置 | 新的唯一实现位置 | 原位置兼容 |
|---|---|---|
| `app/backend/application.py` 的 30 个总览、搜索、详情、图表方法 | `app/backend/features/market/service.py` | `DashboardService` 继承 `MarketServiceMixin` |
| `app/database.py` 的 11 个行情快照、搜索目录、同步记录方法 | `app/backend/features/market/repository.py` | `ReviewDatabase` 继承 `MarketRepositoryMixin` |
| `app/tushare_client.py` | `app/backend/data/providers/tushare_client.py` | 根模块为同一模块对象的兼容别名 |
| `app/ifind_client.py` | `app/backend/data/providers/ifind_client.py` | 根模块为同一模块对象的兼容别名 |
| `app/realtime_aggregator.py` | `app/backend/data/realtime.py` | 根模块为同一模块对象的兼容别名 |
| `app/chart_data_provider.py` | `app/backend/features/market/charts.py` | 根模块为同一模块对象的兼容别名 |

`app/tools/move_class_methods.py` 使用 Python AST 确定方法及装饰器的源码边界，只移动原文本片段。
该工具会在缺失方法、目标标记不唯一或源码无法解析时停止，供后续切片继续复用。

## 2. 等价证据

- `test_preservation_slice_market.py` 对 30 个业务方法和 11 个 Repository 方法逐项执行无位置信息
  AST 比较，全部与根目录原版 `server.py`、`database.py` 完全相同。
- Tushare、iFinD 和实时观察器文件与原版 SHA-256 完全相同；图表模块全部类和函数 AST 与原版相同，
  仅内部导入改为新规范位置。
- 四个根级兼容模块与新模块共享同一类对象，旧导入和旧 monkeypatch 路径继续有效。
- `config/api.config.json`、API路径、鉴权角色、错误结构和数据库 schema 未修改。
- `app/static/` 未修改；七个核心 HTML/JS/CSS 文件哈希继续与原版相同。
- `app-light-1280x720.png` 为真实 `8785` 服务完成载入后的日间模式截图，SHA-256 为
  `a7ee1b682f68c418d792727dbc4534d7494dae4f4811cdbba208bd86dcf25d10`。

## 3. 真实运行检查

- 迁移副本：`http://127.0.0.1:8785/`，管理员登录成功。
- 总览：返回 2026-07-30 Tushare 已缓存行情，涨停 56 只。
- 搜索：搜索“中国平安”返回 `601318`，点击后打开完整个股详情、日 K、资金流、事件逻辑和复盘笔记。
- 页面：1280px 视口无横向溢出，数据加载状态正常，浏览器控制台 0 个错误。
- 分时：迁移版与原版在当前本机网络环境均返回同一个 `Intraday chart request failed`，因此记录为
  既存外部接口状态，不是本切片差异；没有擅自增加降级或改变来源策略。

## 4. 自动验证

| 验证 | 结果 |
|---|---:|
| `python -m unittest discover -s tests -q` | 241 项通过 |
| `python -m unittest tests.test_preservation_slice_market -q` | 6 项通过 |
| 行情、图表、实时与数据库专项集合 | 61 项通过 |
| `npx playwright test --reporter=dot` | 45 项通过 |
| `python -m compileall -q ...` | 通过 |
| `git diff --check` | 通过 |

## 5. 保留边界

- 情绪计算仍在 `application.py`，切片 03 再归位；行情服务只通过继承调用，没有复制。
- 竞价、题材、人气、龙虎榜和问天对公共行情客户端的调用仍可通过兼容别名工作，待各自切片迁移。
- 根级四个数据模块、`DashboardService` 和 `ReviewDatabase` 的兼容面在所有消费者完成迁移前保留。
- 没有删除待定代码、没有改动根目录正式数据库、没有切换 Docker/NAS。

