Kimi_Agent_全球资产实时仪表盘(1).ziporigin/mainapps/global-assets/ | 产物:web/terminal/global-assets/主席上传的是一个全栈应用,不是一个网页文件:
| 组成 | 技术 | 上线障碍 |
|---|---|---|
| 前端 | Vite + React 19 + TypeScript + Tailwind + lightweight-charts | 需要编译,不能直接丢上去 |
| 后端 | Hono + tRPC(Node 常驻进程) | Cloudflare Pages 没有常驻 Node 进程,直接部署等于没有后端 |
| 数据库 | drizzle + MySQL | 需要一台数据库 |
| 行情源 | 腾讯 / 新浪 / Gate.io | 浏览器直连被 CORS 挡死,必须有服务端代理 |
所以"把 zip 丢上 Pages"这条路走不通——后端不搬,页面打开就是一片空白。
1. 前端静态化:以 base=/global-assets/ 编译,产物落 web/terminal/global-assets/;
路由 basename 跟随 base,_redirects 加 SPA 回退(防 /global-assets/ticker/AAPL 刷新 404)。
2. 后端搬家(关键一步):把同一套 tRPC 路由用 esbuild 打包成 Cloudflare Pages Function
→ web/terminal/functions/api/global-assets/[[path]].js,对外就是 /api/global-assets/trpc/*。
前端代码一行业务逻辑没改,只是换了运行的地方(Node 进程 → Workers 边缘运行时)。
3. 数据库直接砍掉:原项目 db/schema.ts 是空壳(只有注释示例),行情全部走上游接口实时代理,
不需要数据库 → 零运维、零成本。
4. 一条命令可重建:cd apps/global-assets && bash scripts/build-to-terminal.sh
(前端构建 → 同步产物 → 打包 Function,三步一次做完)。
全部是"实测复现 → 定位 → 修 → 复测"跑出来的,不是看代码猜的:
| # | 问题 | 影响面 | 根因 | 处理 |
|---|---|---|---|---|
| 1 | 商品全线没行情 | 黄金/白银/铜/原油/天然气 5 个全空 | 上游腾讯的代码是 hf_GC(带下划线),项目字典里写的是 hfGC,请求过去什么都不返回 | 请求时做代码映射 + 放宽解析正则 |
| 2 | 加密货币 K 线崩图 | BTC 个股页 + 首页跨资产图整块报错 | Gate.io 返回本已按时间升序,代码又 reverse() 一次变倒序,图表库直接抛 Value is null | 改为显式按时间升序排序,不假设上游顺序 |
| 3 | 首页引用了字典里不存在的代码 | 标普500 卡片、跨资产图、全球指数表全空 | 用了 usSPX / usRUT,字典里其实是 usINX / usIWM | 改回正确代码 |
| 4 | K 线后缀写死错了 | 罗素2000、道指 图全空 | 硬编码 .A / .P,上游实际是 .AM | 去掉错误硬编码,改为运行时解析 |
| 5 | VIX / 日经 / 富时 / DAX / 美元指数 没有历史图 | 5 张图空白 | 这些指数上游只有报价、没有公开 K 线 | 各挂一只对应 ETF 作历史走势代理(VIXY / EWJ / EWU / EWG / UUP) |
| 6 | 一次网络抖动会永久钉死某只股票 | 如 CAT 之类纽交所股票 K 线永远空 | 解析失败时把猜测值 .OQ 写进缓存,再也不重试 | 猜测值不入缓存,下次请求重新解析 |
| 7 | 中文名乱码 | 所有卡片名称 | Workers 的 TextDecoder 只支持 UTF-8,上游是 GBK | 乱码时回退用字典里的中文名 |
| 检查项 | 方法 | 结果 |
|---|---|---|
| 行情覆盖 | 全字典 165 个标的逐个取实时价 | 165/165 有价 |
| 历史 K 线 | 165 个标的逐个取 3M K 线,查空图/乱序/非法值 | 165/165 有数据,0 乱序,0 非法值 |
| 后端接口 | 20 个接口逐个调用(快照/K线/热力图/领涨跌/筛选/搜索/7×24快讯) | 20/20 HTTP 200 |
| 前端运行时 | Playwright 真浏览器跑 6 条路由(首页/全球股指/大类资产/美股筛选/个股 AAPL/个股 BTC) | 0 JS 报错,并已逐页截图人工看过确有数、有图 |
| 线上生产域名 | curl 实测 | 页面 JS 哈希与本地构建完全一致;深链接 /global-assets/ticker/AAPL 200;/api/global-assets/* 返回实时数据 |
线上抽样(2026-08-01 20:56 北京时间取):
苹果 308.91(−7.35%)· 标普500 7,489.72(+0.70%)· 纽约黄金 4,096.38(−1.54%)·
比特币 63,101(−1.02%)· 日经 44,946.64(−0.90%)· 上证 3,832.26(+0.72%)· 恒生 25,884.43(+0.10%)
收盘时段显示的是最后收盘价。做投研参考够用,不能当下单依据。
前端已有兜底——取不到就沿用上一次的值并标 stale,不会白屏;下一轮自动补回。
所以做了日线兜底。开盘时段会正常显示当日分时。
/bloomberg/ 是另一个窗口做的另一份简版页面,本次没动它。两者并存,主席要哪个当"全球资产终端"正主可以随时说,我把首页卡片指过去。
`bash
cd apps/global-assets
npm install # 首次
bash scripts/build-to-terminal.sh # 改完代码,一条命令重出产物
cd ../../web/terminal && CLOUDFLARE_API_TOKEN=... npx wrangler@3 pages deploy . \
--project-name=metazero-terminal --branch=main
`
*证据等级:行情数值 E1(上游接口实测返回,已标时间);上线状态 E1(curl + 真浏览器实测);
延迟说明为公开接口通例,属 E2 常识判断。*