← 返回列表
需源码安装
一屏纵览全球指数、大宗商品与资金流向
暂不能直接安装(需源码编译或环境不满足):缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装。 · 最近上游提交 2026/8/30 · 已提供中文文档
面向金融与产业研究的一屏式实时行情大屏:A股/港股/美股指数、大宗商品、美债收益率、板块热点、主力资金流、7×24 快讯、产业链自选股、AI 大模型 Token 追踪。A real-time market research cockpit on a single screen: CN/HK/US indices, commodities, treasury yields, sector hotspots, capital flows, 7×24 news, industry-chain watchlists and AI token usage trends.
综合分
62
GitHub 分
62
用户评分
—
★ Stars
171
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add theBigGavin/marketingdashboard缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装,改用 GitHub 源安装
⚠︎ 实装验证未通过(unknown · 2026/9/17) ——可能是 CI 环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
数据截至 2026/9/16(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查需源码安装
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包my-app @ 0.1.0
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明
缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装
验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/17 00:31:02
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动
README
📊 市场研究驾驶舱
面向金融与行业研究的一屏式实时市场仪表盘
A股 / 港股 / 美股 · 大宗商品 · 美国国债收益率 · 板块热力 · 资金流向 · 7×24 新闻快讯 · 产业链自选列表
简体中文
React
Vite
TypeScript
Tailwind CSS
Node.js
GitHub Stars
License
🚀 在线演示:https://mrd.hermes.cc.cd — 无需 API 密钥,无需登录,开箱即用
🛎️ 托管版本:筹备中 — 暂无定价,暂无上线日期。想要托管部署,这样就不必自己运行服务器?告诉我们哪些方面对你重要。开源自托管版本将保持免费且采用 MIT 许可,这一点不会改变。
🏠 由 Gavin's Lab 打造 — 一家由 7 个 AI 智能体在看板上运营的一人公司:公司网站 · 实时透明办公室
市场研究驾驶舱截图
✨ 功能特性
- 🌍 一屏纵览全球市场 — 上交所 / 深交所 / 恒生指数 / 道琼斯 / 纳斯达克 / 标普 500 / VIX / 美元兑人民币,分钟级指数图表并排展示
- 🥇 大宗商品与加密货币 — 纽约金/银、伦敦金、上期所黄金、LME 铜、原油、BTC — 实时价格与日内曲线
- 💵 美国国债监控 — 10Y / 2Y 收益率、2s10s 利差、收益率曲线形态及其可追溯至 2001 年的逐月历史
- 🔥 板块热力雷达 — 行业 / 概念板块排名;点击板块可深入查看成分股、龙头股与资金流向
- 💰 资金流向追踪 — 主力资金净流入个股排行、分钟级板块累计资金流曲线、热门 / 涨幅榜 / 跌幅榜列表
- ⛓️ 产业链全景 — 半导体、AI 算力、电动汽车、机器人、创新药等;上中下游股票代码关联实时行情。股票列表可手动编辑,也可从问财自动获取
- 🤖 AI 驾驶舱 — OpenRouter 每日排名 API,追踪 50+ 全球大模型提供商的 token 消耗趋势(7 天至 1 年区间),按提供商/国家/地区展示堆叠面积份额图,60+ 天长周期历史
- 💹 LLM 价格竞争观察 — 2×3 网格上的四个面板:TTSI 支出指数趋势(加权 / 闭源 / 开源价格线,基于 0 起点坐标轴,来自本地 ttsi.csv CC BY 4.0 归档的多月完整历史,并与每日 RSS 尾部合并)、模型价格表(约 400 个模型,可按智能 / 输入 / 输出 / 任务成本排序)、性价比散点图(智能指数 × 任务成本,对数坐标轴,按厂商着色),以及来自 TrakToken 每日标注的降价 / 份额变动事件流
- 🪟 财报窗口 (/fin) — 财报季宏观视图:披露日历(14 天节奏条 + 今日列表)、财报预测(超预期/不及预期统计条 + 利润区间详情)、行业利润排名(规模 × 动量双重编码)、个股利润排名(按金额 / 增速),以及每家公司 12 个季度的趋势(营收/利润柱状图 + ROE/毛利率/净利率折线图)
- 🏷️ 大宗商品价格页面 (/goods) — 覆盖 6 大类(贵金属 / 有色金属 / 黑色系 / 能源化工 / 农产品 / 国际能源)的主力合约期货每日趋势,支持 30 天至 365 天区间,另有生意社现货报价(每日累计)和现货–期货基差表
- 📰 7×24 新闻快讯 — 滚动展示全球财经新闻,自动高亮宏观关键词和产业链提及
- 🖥️ 可安装桌面应用 — 内置 PWA 支持(Web Manifest + Service Worker);可从浏览器地址栏安装,并在独立窗口中运行
- 🍎 原生 macOS 应用 — Swift WKWebView 轻量外壳,遵循与 Android TV 相同的模式
- 📺 Android TV 应用 — 原生 WebView 外壳(android-tv/),支持方向键空间导航、全屏面板缩放(等比缩放 + 幻灯片播放)、翻页式行情条,针对旧版引擎和弱 GPU 进行了优化
- 📱 iOS Scripting 脚本 — TypeScript/TSX 脚本(scriptable/,镜像至 theBigGavin/mrd-scripting),将驾驶舱封装在 Scripting 应用的 WebView 中:通过 ?tv=1 进入 TV 模式、强制横屏、无安全区域的全屏显示、Liquid Glass 退出按钮、带 mrd 标志的本地启动画面(呼吸动画),以及无白屏过渡进入实时仪表盘
- ⚡ 零依赖数据服务 — 内置 Node 代理聚合公共市场数据端点,并带有内存缓存;大多数端点无需 API 密钥,开箱即用
🏗️ 架构
flowchart LR
subgraph External data sources
A[Tencent Quotes] --> D
B[Sina Finance] --> D
C1[Eastmoney] --> D
C2[Wallstreetcn] --> D
C3[CNBC / Binance] --> D
C4[iwencai] --> D
C5[OpenRouter rankings] --> D
C6[Artificial Analysis API] --> D
C7[TrakToken TTSI RSS] --> D
end
subgraph This project
D["Node data proxyin-memory TTL cache"] -->|"/api/"| E["React 19 frontendpolling refresh"]
E --> F[One-screen cockpit UI]
end
- 前端优先使用内置的 Node 代理;当它不可用时,某些端点(腾讯 / 华尔街见闻)会优雅地回退到浏览器直连
- 统一客户端行情中心:所有面板价格 / 涨跌均来自单一的客户端行情中心(src/lib/market.ts),它每 5 秒批量拉取一次并分发同一份快照——同一个行情标的在任何地方渲染出的都是同一帧;服务端行情按代码缓存(5 秒,与客户端轮询循环对齐),自选集变化时只拉取新增的代码
- 各端点的服务端缓存 TTL(行情为 5 秒,板块成分最高可达 24 小时),容量有界(LRU + 定期清扫),无数据库,无外部存储
- 在高并发用户下对上游友好:按代码的 TTL 缓存 + 进行中请求去重,使并发缓存未命中共享同一次上游拉取;失败退避(5 秒→2 分钟负缓存)避免对已宕机的上游反复冲击;浏览器直连回退按代码限流;/api/stats 暴露请求 / 上游拉取 / 429 计数器
- 现货价格由服务端每 4 小时采集一次并写入本地历史文件——即使前端不在线,历史也会逐日增长
- 单进程生产环境:一个端口同时提供 API 和构建后的前端
🧱 产品边界(红线)
本仓库仅用于 mrd 产品(市场数据驾驶舱)。OPC 透明办公室、公司官网、营销或客户支持相关的代码 / 数据 / 凭证 / 测试绝不能落在这里——它们各自位于自己的仓库中:
| 产品 / 服务 | 仓库 | 公开域名 |
|---|---|---|
| mrd(本仓库) | theBigGavin/marketingdashboard | mrd.hermes.cc.cd |
| OPC 后端(opc-api) | theBigGavin/opc-os · opc-api/(私有) | opc.hermes.cc.cd |
| 公司官网后端 | theBigGavin/company-site-backend | api.hermes.cc.cd |
| 公司官网前端 | theBigGavin/gavin-lab-company | www.hermes.cc.cd |
| knock 排行榜 | theBigGavin/mylauncher · server/ | hermes.cc.cd/api/v1/knock |
规则:
- 新 API 挂载在自己的产品域名下;跨产品调用经由拥有该产品的后端进行——绝不要在这里添加其他产品的路由或反向代理。
- 敏感凭证只存在于所属仓库中被 gitignore 的 server/.env 中。本仓库只保留 mrd 自己的密钥:IWENCAI_BASE_URL / IWENCAI_API_KEY / OPENROUTER_API_KEY / ARTIFICIAL_ANALYSIS_API_KEY。
- 守卫:合并前运行 scripts/check_product_boundary.sh(手动或 CI)——FAIL 表示混入了非 mrd 代码。它将 /api/rank、qq-rank、/api/leads、/api/v1/knock 和 /company/opc/status.json(遗留静态服务,P0-1 已停止更新,为白名单保留)视为 mrd 所有,绝不标记它们。
🚀 快速开始
前置条件
- Node.js 18+
- 系统中有可用的 curl(某些代理端点会用到)
本地开发
npm install # 或 pnpm install
npm run dev
- 前端开发服务器:
- 数据代理:(Vite 会自动将 /api 代理到它)
生产环境
npm run build # 构建到 dist/
可选:配置 API 密钥(AI 面板)
echo 'OPENROUTER_API_KEY=sk-or-v1-xxxx' > server/.env # AI 驾驶舱使用情况面板
echo 'ARTIFICIAL_ANALYSIS_API_KEY=aa_xxxx' >> server/.env # LLM 价格面板
可选:完整 TTSI 历史数据 — 从 traktoken.com 下载 ttsi.csv 并
将其放在 server/data/ttsi.csv(CC BY 4.0)。如果没有它,趋势
面板会自动回退到 60 天的 RSS 尾部数据。
npm start # 单进程,访问 http://localhost:3000
Docker
docker build -t market-cockpit .
docker run -p 3000:3000 market-cockpit
安装为桌面应用(PWA)
在 Chrome / Edge 中打开已部署的页面,然后点击地址栏右侧的安装图标(或菜单 →“安装 Market Research Cockpit”),即可将其作为独立桌面应用运行,并具有离线缓存的静态资源和自己的图标。
注意:市场数据是实时获取的;离线时只有应用外壳可用。
macOS 桌面应用
macos/ 目录包含一个原生 Swift WKWebView 外壳。与 Android TV 采用相同模式——围绕同一 Web UI 的轻量原生窗口。
先决条件:Xcode
open macos/MarketCockpit.xcodeproj # 在 Xcode 中打开,按 ⌘R 构建并运行
默认加载 http://localhost:3000/?desktop=1(请先运行 npm start)。
Android TV 应用
android-tv/ 目录包含一个原生 WebView 外壳(零第三方依赖),可将驾驶舱带到 Android TV 和机顶盒上。Web 应用通过 ?tv=1 进入 TV 模式,并与桌面版本共享同一代码库。
遥控器模型
- 方向键空间导航:面板、导航链接、标签页和滚动区域均可聚焦(青色高亮环),并根据边缘距离 + 轴向重叠进行评分,因此正前方的候选目标总是胜出
- OK:缩放面板 / 激活按钮 / 切换页面
- 缩放 = 全屏覆盖层:面板以暗淡背景覆盖屏幕,其内容按比例放大(CSS zoom,上限为 3 倍),而其他所有面板保持原位——零重排
- 覆盖层内:←/→ 以幻灯片方式切换到相邻面板;↑/↓ 滚动内容(在顶部时,再按一次 ↑ 会跳转到标签栏);标签页、榜单行和成分侧边栏均可访问和操作
- 返回:恢复缩放的面板 → 历史后退 → 退出;菜单:更改服务器 URL
- 翻页式行情条:顶部报价条像出发信息板一样工作——7 张等宽卡片,每隔几秒翻转一张卡片(全宽滚动层对性能较弱的 TV GPU 来说负担过重;翻转只会重绘很小区域)
- 启动画面:呼吸式 logo + 进度指示器,在页面准备就绪后淡出
TV 模式适配(对桌面端无影响)
- 固定 1920 CSS 像素视口,使布局和字体大小在任何电视密度下都完全一致;外壳会根据屏幕的 dp 宽度计算初始缩放比例,以精确适配
- 旧版引擎兼容性(:3000)
iOS Scripting 脚本
scriptable/ 目录包含一个 Scripting 应用(scripting.fun)脚本,可在原生 WebView 中呈现驾驶舱。它同时镜像为一个独立仓库 theBigGavin/mrd-scripting,以便直接导入。
功能
- 加载 https://mrd.hermes.cc.cd/?tv=1 — 电视模式(方向键空间导航、点击缩放面板、触摸滑动切换)
- 强制横屏、无标题栏、无安全区域的全屏(ignoresSafeArea)
- Liquid Glass 退出按钮(buttonStyle="glass",iOS 26)
- 本地启动画面:带呼吸动画的 mrd 标志 + 加载指示器,然后无缝暗色过渡进入仪表盘(无白屏闪烁)
安装(一键)
在 iPhone 上打开导入链接(需要 Scripting 应用,iOS 26+):
https://scripting.fun/import_scripts?urls=%5B%22https%3A%5C%2F%5C%2Fgithub.com%5C%2FtheBigGavin%5C%2Fmrd-scripting%5C%2Ftree%5C%2Fmain%22%5D
或者从 scriptable/ 分享 mrd-dashboard.scripting 文件。如果已存在同名脚本,请在重新导入前将其删除,以避免缓存冲突。
重新打包:.scripting 是一个 zip 文件(STORE 方法,flag_bits=2048 用于 UTF-8 文件名,zip 版本 20,DOS 日期 2020),包含 index.tsx、page.tsx 和 script.json。使用 python3 scriptable/package.py 重新构建。
📡 API 概览
在开发期间,前端通过 /api 与本地代理通信:
| 端点 | 描述 |
| --- | --- |
| /api/quotes?codes=... | 实时指数 / 股票行情 |
| /api/minute?code=... | 日内分钟序列 |
| /api/boards?type=...&dir=...&n=... | 行业 / 概念板块排行 |
| /api/board-stocks?code=...&n=... | 板块成分股 |
| /api/futures?list=... | 商品 / 加密货币行情 |
| /api/future-minute?code=... | 期货日内序列 |
| /api/future-daily?code=...&n=... | 期货日K线(最近约400根;国内 nf_ / 国际 hf_) |
| /api/spot-table | 生意社现货–期货表(现货 / 期货 / 基差;现货历史每日累积) |
| /api/chem-spot?id=...&name=... | 生意社化工现货报价(市场中位价,历史每日累积) |
| /api/rank?sort=...&n=... | 股票排行榜(涨幅 / 换手 / 成交量) |
| /api/moneyflow?n=... | 主力净流入排名靠前的股票 |
| /api/stock-flows?codes=... | 批量个股资金流 |
| /api/board-flow?n=... | 板块资金流曲线 |
| /api/stock-boards?code=... | 股票所属板块(行业 / 地区 / 概念) |
| /api/news?page=...&size=... | 7×24 财经快讯 |
| /api/treasuries | 美国国债实时收益率 |
| /api/treasury-history | 美国国债月度收益率历史(2001年至今;本地存档在 server/treasury-rates/ + 当年实时补齐) |
| /api/mystery-select?query=...&limit=... | 问财选股(按概念 / 行业) |
| /api/finance-main?code=... | 个股财务摘要,最近12期(东方财富 F10:营收 / 利润 / ROE / 利润率…) |
| /api/finance-board?period=... | 业绩宏观汇总(利润前50个股 + 前15行业汇总 + 近期披露日历) |
| /api/finance-forecast?period=... | 业绩预告(利润区间 / 同比 / 类型 + 超预期–不及预期统计) |
| /api/chain-parse | 产业链文本解析(按段落标题自动分配上游 / 中游 / 下游) |
| /api/openrouter-usage | OpenRouter 每日排行(提供商 token 消耗,本地持久化缓存) |
| /api/aa-models | Artificial Analysis 全量模型定价(约600个模型:智能指数、每100万 token 输入/输出价格、任务成本;24小时缓存 + 每日快照累积在 server/data/model-prices.json) |
| /api/spend-index | TrakToken TTSI 支出指数(本地 ttsi.csv 全量历史与每日 RSS 尾部合并,外加降价 / 份额变动事件) |
| /api/stats | 运行时可观测性:请求 / 上游抓取 / 429 计数器、运行时长 |
| /api/stock-search?q=... | 股票搜索(名称 / 拼音首字母 → 代码,新浪建议代理) |
| /api/health | 健康检查 |
注意:/api/mystery-select 和 /api/openrouter-usage 会消耗服务端私有 API 密钥,且仅接受同源页面请求(跨域返回 403);/api/aa-models 需要在 server/.env 中配置 ARTIFICIAL_ANALYSIS_API_KEY,但该端点本身保持公开(24小时缓存)。所有 API 仅向同源页面反射 CORS Origin,并按客户端 IP 限流(公开接口 2400 次/分钟,私有接口 30 次/分钟;超出返回 429;在 Cloudflare Tunnel 后面时,真实客户端 IP 取自 CF-Connecting-IP)。POST 请求体上限为 256KB,未匹配的 /api/ 路由返回 404 JSON。
🤖 MCP 服务器(阶段 1.5)
mrd 内置了一个 MCP 服务器,因此 AI 代理可以直接调用市场数据工具。无需额外依赖——它运行在同一个 Node.js 进程中,复用共享的 cached() 内存缓存。
协议:JSON-RPC 2.0 over Streamable HTTP(服务器→客户端推送使用 SSE,请求使用 POST)。
端点
| 方法 | 路径 | 描述 |
| --- | --- | --- |
| GET | /mcp | 服务器元数据:版本、工具列表、资源列表 |
| POST | /mcp | JSON-RPC 2.0 请求(initialize / tools/list / tools/call / ping …) |
| GET | /mcp/stream | 用于服务器发起通知的 SSE 流 |
认证
公共 MCP 工具无需 API 密钥。私有端点(/api/mystery-select、/api/openrouter-usage)不通过 MCP 暴露,并且需要它们自己的密钥配置。
工具列表(5 个公共工具)
| 工具 | 描述 |
| --- | --- |
| get_quotes | 实时 A 股 / 港股 / 美股 / 外汇行情。输入:逗号分隔的代码,例如 sh000001,sz399001,hkHSI,usNVDA |
| get_boards | 板块热度排名。type:01(A 股行业)/ 02(A 股概念)/ 03(港股行业)/ 05(美股);dir:0 降序 / 1 升序 |
| get_futures | 商品与加密货币期货。默认列表:纽约金、现货金、白银、加元、原油、VIX、国内金、BTC |
| get_money_flow | A 股主力资金净流入排名(东方财富为主,新浪为备用) |
| get_news | 新浪 7×24 财经快讯。page(默认 1)、size(默认 40) |
资源
| URI | 描述 |
| --- | --- |
| mrd://health | 服务器健康状态 |
| mrd://stats | 缓存大小与运行时统计信息 |
快速开始
Start the server
npm start
1. Discover — get server metadata
curl http://localhost:3000/mcp
2. Initialize (required first call)
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}'
3. List tools
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}'
4. Call a tool — get A-share index quotes
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc":"2.0","id":3,"method":"tools/call",
"params":{
"name":"get_quotes",
"arguments":{"codes":"sh000001,sz399001,hkHSI,usNVDA"}
}
}'
5. Get sector rankings
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc":"2.0","id":4,"method":"tools/call",
"params":{
"name":"get_boards",
"arguments":{"type":"01","dir":"0","n":"10"}
}
}'
6. Ping (keep-alive / health check)
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":5,"method":"ping","params":{}}'
与 Claude Desktop 一起使用
将此添加到 ~/.config/claude/desktop.yaml(或等效的配置文件):
mcpServers:
mrd:
command: npx
args:
- -y
- @modelcontextprotocol/server-http
- http://localhost:3000/mcp
重启 Claude Desktop。这 5 个 MRD 工具将自动出现在工具面板中。
缓存
所有工具响应都缓存在服务器的共享内存中:
| 数据 | 缓存 TTL |
| --- | --- |
| 行情报价(get_quotes) | 5 秒 |
| 板块排名(get_boards) | 5 秒 |
| 期货(get_futures) | 15 秒 |
| 资金流向(get_money_flow) | 8 秒 |
| 新闻(get_news) | 8 秒 |
对同一数据的并发请求共享一次上游抓取(进行中请求去重)。上游故障会触发指数退避——缓存会提供过期数据,而不是抛出错误。
DSH / DeepSeek Harness 兼容性
MCP 协议与 agent 框架无关。mrd 可以被 DeepSeek Harness 插件、LangChain 工具或任何 MCP 客户端调用。服务器会通过 User-Agent 请求头自动检测 DSH 兼容客户端,并应用适合 DSH 的缓存 TTL。
在 DeepSeek Harness 中安装(零密钥、远程端点、无需本地服务器):
dsh plugin --profile web add github:theBigGavin/marketingdashboard
dsh.bundle 清单通过内置的 @deepseek-ai/dsh-mcp-client 桥接 https://mrd.hermes.cc.cd/mcp;这 5 个工具会以 mcp__mrd__ 的形式出现。mrd 也列在 DSH 社区目录中(GitHub dsh-plugin 主题、awesome-dsh-plugin 精选注册表)。
🗂️ 项目结构
├── server/
│ ├── dev.cjs # Dev entry: starts Vite and the data proxy together
│ ├── index.cjs # Data proxy + production static file serving
│ └── data/ # Runtime-accumulated data (gitignored): spot-history.json,
│ # model-prices.json, ttsi.csv (optional full TTSI history)
├── macos/ # macOS desktop app (Swift + WKWebView)
│ ├── MarketCockpit.xcodeproj
│ └── MarketCockpit/
├── src/
│ ├── App.tsx # Cockpit layout & routing (/ market cockpit, /ai AI cockpit, /goods commodity prices, /fin earnings window)
│ ├── AiDashboard.tsx # AI cockpit page (2×3 grid: OpenRouter usage spanning two rows + 4 LLM price panels)
│ ├── FinDashboard.tsx # Earnings window page (panels in components/dash/fin/)
│ ├── GoodsDashboard.tsx # Commodity prices page (6-group trend panels + spot/basis panel)
│ ├── components/
│ │ └── dash/ # Cockpit panels + shared UI primitives
│ │ ├── fin/ # Earnings window panels (calendar, forecast, industry rank, stock rank, company, trend, peer comparison)
│ │ │ ├── FinContext.ts # Shared company selection & reporting period state
│ │ │ └── utils.ts # quarterLabel, forecastTone (re-exports from lib/)
│ │ ├── Spark.tsx # Mini sparklines (A-share / 24h continuous / daily session axes)
│ │ ├── SharedUI.tsx # TabBar(分段控件)、AsyncContent(加载/错误/空状态包装器)
│ │ └── ...
│ ├── config/ # 指数、商品、产业链、商品组的静态配置
│ ├── hooks/ # 共享 hooks
│ │ ├── usePolling.ts # 按组件轮询(隐藏标签页暂停、进行中请求保护)
│ │ ├── useSharedPolling.ts # 相同 key 的组件通过 useSyncExternalStore 共享一个定时器
│ │ ├── useElementSize.ts # ResizeObserver → {ref, size},用于 SVG 自动调整尺寸
│ │ ├── useStockSearch.ts # 防抖搜索 + 下拉框 + 键盘导航,用于股票选择器
│ │ └── ...
│ └── lib/ # API 客户端、统一行情中心、共享工具
│ ├── market.ts # MarketHub:引用计数的行情订阅、单一 5 秒轮询循环
│ ├── api.ts # 类型化 fetch 封装(优先服务端,浏览器直连回退)
│ ├── format.ts # fmtPrice、fmtPct、fmtYi、fmtWan、clsChg、hexChg、TNUM…
│ ├── code.ts # normalizeStockCode / toMarketCode — 股票代码前缀规范化
│ └── storage.ts # loadJson / saveJson — 带错误处理的类型化 localStorage
└── docs/ # 截图及其他文档资源
🛠️ 技术栈
- 前端:React 19 · Vite 7 · TypeScript · Tailwind CSS · lucide-react 图标(图表为手写 SVG)
- 后端:Node.js 原生 http(无框架)· curl / fetch
- 数据源:腾讯、新浪、东方财富、华尔街见闻、CNBC、Binance、生意社、OpenRouter、Artificial Analysis、TrakToken 及其他公开市场数据端点
⚠️ 免责声明
本项目仅供学习和研究使用。所有市场数据均来自公开网络端点,可能存在延迟或不准确的情况。此处内容不构成投资建议。
🤝 贡献
欢迎提交 Issue 和 PR:
1. Fork 本仓库
2. 创建 feature/xxx 分支
3. 提交并推送你的更改
4. 发起 Pull Request
📄 许可证
Star 历史
MIT扫码进群