Skip to content

Latest commit

 

History

892 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

基估宝-实时基金估值

一个基于 Next.js 开发的基金估值与重仓股实时追踪工具。采用玻璃拟态设计(Glassmorphism),支持移动端适配。

📸 界面预览

PC 端界面

PC 端主界面


PC 端交易与设置


移动端界面

移动端适配界面

Star History

Star History Chart

✨ 特性

  • 实时估值:通过输入基金编号,实时获取并展示基金的单位净值、估值净值及实时涨跌幅。
  • 重仓追踪:自动获取基金前 10 大重仓股票,并实时追踪重仓股的盘中涨跌情况。支持收起/展开展示。
  • 纯前端运行:采用 JSONP 方案直连东方财富、腾讯财经等公开接口,彻底解决跨域问题,支持在 GitHub Pages 等静态环境直接部署。
  • 本地持久化:使用 localStorage 存储已添加的基金列表、持仓、交易记录、定投计划及配置信息,刷新不丢失。
  • 响应式设计:完美适配 PC 与移动端。针对移动端优化了文字展示、间距及交互体验。
  • 自选功能:支持将基金添加至"自选"列表,通过 Tab 切换展示全部基金或仅自选基金。自选状态支持持久化及同步清理。
  • 分组管理:支持创建多个基金分组,方便按用途或类别管理基金。
  • 持仓管理:记录每只基金的持有份额和成本价,自动计算持仓收益和累计收益。
  • 交易记录:支持买入/卖出操作,记录交易历史,支持查看单个基金的交易明细。
  • 定投计划:支持设置自动定投计划,可按日/周/月等周期自动生成买入交易。
  • 云端同步:通过 Supabase 云端备份数据,支持多设备间数据同步与冲突处理。
  • 自定义排序:支持多种排序规则(估值涨跌幅、持仓收益、持有金额等),可自由组合和启用/禁用规则。
  • 拖拽排序:在默认排序模式下可通过拖拽调整基金顺序。
  • 明暗主题:支持亮色/暗色主题切换,一键换肤。
  • 导入/导出:支持将配置导出为 JSON 文件备份,或从文件导入恢复。
  • 可自定义频率:支持设置自动刷新间隔(5秒 - 300秒),并提供手动刷新按钮。

🛠 技术栈

  • 框架Next.js (App Router)
  • 样式:原生 CSS (Global CSS) + 玻璃拟态设计
  • 数据源
    • 基金估值:天天基金 (JSONP)
    • 重仓数据:东方财富 (HTML Parsing)
    • 股票行情:腾讯财经 (Script Tag Injection)
  • 部署:GitHub Actions + GitHub Pages

💻 命令行工具 (@jigubao/cli)

为了方便开发者和终端极客在终端快速查询基金数据、管理云端自选与持仓,项目提供了官方命令行工具 @jigubao/cli

安装

可通过 npm 全局安装:

npm install -g @jigubao/cli

核心功能

  • 安全登录 (jgb login):使用 Supabase Auth 邮箱验证码(Email OTP)无密码登录,安全便捷。
  • 状态查询 (jgb status):快速校验本地登录状态。
  • 基金搜索 (jgb search <keyword>):支持按名称或 6 位代码模糊搜索基金。
  • 实时估值 (jgb price <code>):查询指定基金的实时估值、最新净值及盘中估算涨跌幅。
  • 云端同步 (jgb portfolio list):查询同步保存在云端的自选基金、持仓份额及交易详情。
  • 脚本友好 (支持 --json):除登录/登出外,所有指令均支持 --json 输出,便于与 jq 或其他脚本工具结合。
  • 安全退出 (jgb logout):注销并清理本地及云端的登录会话。

更多关于 CLI 的开发与高级用法,请参阅 基估宝命令行工具说明文档 (jgb-cli/README.md)

🚀 快速开始

本地开发

  1. 克隆仓库:

    git clone https://github.com/hzm0321/real-time-fund.git
    cd real-time-fund
  2. 安装依赖:

    npm install
  3. 配置环境变量:

    cp env.example .env.local

    按照 env.example 填入以下值:

  • NEXT_PUBLIC_Supabase_URL:Supabase 项目 URL
  • NEXT_PUBLIC_Supabase_ANON_KEY:Supabase 匿名公钥
  • NEXT_PUBLIC_WEB3FORMS_ACCESS_KEY:Web3Forms Access Key
  • NEXT_PUBLIC_GA_ID:Google Analytics Measurement ID(如 G-xxxx
  • NEXT_PUBLIC_GITHUB_LATEST_RELEASE_URL:GitHub 最新 Release 接口地址,用于在页面中展示"发现新版本"提示(如:https://api.github.com/repos/hzm0321/real-time-fund/releases/latest
  • NEXT_PUBLIC_IS_GITHUB_LOGIN:控制是否开启 GitHub OAuth 登录功能,可选值 true / false(默认 false

注:如不使用登录、反馈或 GA 统计功能,可不设置对应变量

  1. 运行开发服务器:
    npm run dev
    访问 http://localhost:3000 查看效果。

Supabase 配置说明

  1. NEXT_PUBLIC_Supabase_URL 和 NEXT_PUBLIC_Supabase_ANON_KEY 获取

    NEXT_PUBLIC_Supabase_URL:Supabase控制台 → Project Settings → General → Project ID
    NEXT_PUBLIC_Supabase_ANON_KEY: Supabase控制台 → Project Settings → API Keys → Publishable key

    示例:

    NEXT_PUBLIC_SUPABASE_URL=https://abcdefghijklmnop.supabase.co
    NEXT_PUBLIC_SUPABASE_ANON_KEY=xxxxxx
    
  2. 邮件数量修改

    Supabase 免费项目自带每小时2条邮件服务。如果觉得额度不够,可以改成自己的邮箱SMTP。修改路径在 Supabase控制台 → Authentication → Email → SMTP Settings。
    之后可在 Rate Limits ,自由修改每小时邮件数量。

  3. 修改接收到的邮件为验证码

    在 Supabase控制台 → Authentication → Email Templates 中,选择 Magic Link 模板进行编辑,在邮件正文中使用变量 {{ .Token }} 展示验证码。

  4. 修改验证码位数

    官方验证码位数默认为8位,可自行修改。常见一般为6位。 在 Supabase控制台 → Authentication → Sign In / Providers → Auth Providers → email → Minimum password length 和 Email OTP Length 都改为6位。

  5. 关闭确认邮件

    在 Supabase控制台 → Authentication → Sign In / Providers → Auth Providers → email 中,关闭 Confirm email 选项。这样用户注册后就不需要再去邮箱点击确认链接了,直接使用验证码登录即可。

  6. 配置 GitHub 登录(可选)

    如需支持 GitHub OAuth 登录,需完成以下配置:

    第一步:在 GitHub 创建 OAuth App

    • 访问 GitHub → Settings → Developer settings → OAuth Apps → New OAuth App
    • 填写信息:
      • Application name:自定义应用名称
      • Homepage URL:你的应用地址(如 https://hzm0321.github.io/real-time-fund/
      • Authorization callback URL:https://<your-supabase-project-id>.supabase.co/auth/v1/callback
    • 创建后获取 Client IDClient Secret

    第二步:在 Supabase 启用 GitHub Provider

    • Supabase控制台 → Authentication → Sign In / Providers → Auth Providers → GitHub
    • 开启 GitHub 开关
    • 填入 GitHub OAuth App 的 Client IDClient Secret
    • 点击 Save 保存

    第三步:配置站点 URL(重要)

    • Supabase控制台 → Authentication → URL Configuration
    • Site URL:设置为你的应用主域名(如 https://hzm0321.github.io/
    • Redirect URLs:添加你的应用完整路径(如 https://hzm0321.github.io/real-time-fund/

    配置完成后,用户即可通过 GitHub 账号一键登录。

  7. 执行数据库初始化 SQL

    项目需要创建 user_configs 表及相关策略才能使用云端同步功能。SQL 语句位于项目 /doc/supabase.sql 文件。

    执行步骤:

    • Supabase控制台 → SQL Editor → New query
    • 复制 /doc/supabase.sql 文件中的全部内容,粘贴到编辑器
    • 点击 Run 执行

    SQL 脚本将完成以下操作:

    • 创建 user_configs 表(存储用户配置数据)
    • 启用行级安全(RLS),确保用户只能访问自己的数据
    • 创建 SELECT / INSERT / UPDATE 策略
    • 创建 update_user_config_partial 函数(用于增量更新配置)
    • 创建 supabase_realtime Publication(开启对 user_configs 表的实时变更监听)

    执行成功后,可在 Table Editor 中看到 user_configs 表。

  8. 导入关联板块数据(可选)

    项目支持展示基金追踪的关联板块(如指数、行业板块)及其实时涨跌幅。该功能依赖两张数据表:

    • fund_related:基金代码 → 关联板块名称映射
    • fund_secid:关联板块名称 → 东方财富 secid 映射

    这两张表已在 /doc/supabase.sql 中创建,数据源位于 /doc 目录:

    • fund_tracking_targets.csv:基金追踪目标数据
    • related_sector_secid.csv:关联板块 secid 映射数据

    导入步骤:

    • Supabase控制台 → Table Editor → 选择 fund_related
    • 点击右上角 InsertImport data from CSV
    • 上传 fund_tracking_targets.csv 文件,确认列映射后点击 Import
    • 同理,向 fund_secid 表导入 related_sector_secid.csv 文件

    导入成功后,基金卡片将展示其追踪的关联板块及实时涨跌幅。

  9. 部署 Supabase Edge Function(可选)

    本项目提供了以下两个云端函数(Edge Function),用于隐藏 API Key 并避免浏览器跨域请求限制:

    • analyze-fund:用于 OCR 识别基金截图并提取基金代码。依赖第三方模型接口,大模型服务赞助商为 AINX
    • fund-valuation-ranking:作为天天基金估值排行 API 的代理,解决跨域访问限制问题。

    配置步骤:

    • 需要用户已登录(函数会读取请求头 Authorization,并通过 supabase.auth.getUser() 校验 JWT)
    • 进入 Supabase 控制台 → 选择你的项目
    • 左侧菜单找到 Project Settings(项目设置)
    • 点击 Edge Functions 选项卡
    • 部署 analyze-fund 函数(v2版本新增):
      • Functions 区域点击 Develop a new functionVia Editor
      • 输入函数名称 analyze-fund和复制 doc/edgeFunction/analyze-fund.ts 内容到编辑器中,点击 Create
      • 到该函数的 Settings 页,取消 Verify JWT with legacy secret 选项
      • Secrets 区域点击 Add a new secret
      • Name 填入 AINX_API_KEY,Value 填入你从 AINX 控制台 申请的 Key
      • 点击 保存 即可
    • 部署 fund-valuation-ranking 函数:
      • 返回 Edge Functions 选项卡,在 Functions 区域点击 Develop a new functionVia Editor
      • 输入函数名称 fund-valuation-ranking和复制 doc/edgeFunction/fund-valuation-ranking.ts 内容到编辑器中,点击 Create
      • 到该函数的 Settings 页,取消 Verify JWT with legacy secret 选项

    常见排查:

    • 401 Unauthorized:说明当前未登录或未携带用户 JWT(先完成 Supabase 登录流程)
    • 500 / "模型未返回合法 JSON":通常是第三方模型接口返回格式异常或 Key 无效

更多 Supabase 相关内容查阅官方文档。

构建与部署

本项目已配置 GitHub Actions。每次推送到 main 分支时,会自动执行构建并部署到 GitHub Pages。 如需使用 GitHub Actions 部署,请在 GitHub 项目 Settings → Secrets and variables → Actions 中创建对应的 Repository secrets(字段名称与 .env.local 保持一致)。 包括:NEXT_PUBLIC_Supabase_URLNEXT_PUBLIC_Supabase_ANON_KEYNEXT_PUBLIC_WEB3FORMS_ACCESS_KEYNEXT_PUBLIC_GA_IDNEXT_PUBLIC_GITHUB_LATEST_RELEASE_URLNEXT_PUBLIC_IS_GITHUB_LOGIN

若要手动构建:

npm run build

静态文件将生成在 out 目录下。

Docker运行

镜像支持两种配置方式:

  • 构建时写入:构建时通过 --build-arg.env 传入 NEXT_PUBLIC_*,值会打进镜像,运行时无需再传。
  • 运行时替换:构建时不传(或使用默认占位符),启动容器时通过 -e--env-file 传入,入口脚本会在启动 Nginx 前替换静态资源中的占位符。

可复制 env.example.env 并填入实际值;若不用登录/反馈功能可留空。

  1. 构建镜像
# 方式 A:运行时再注入配置(镜像内为占位符)
docker build -t real-time-fund .

# 方式 B:构建时写入配置
docker build -t real-time-fund --build-arg NEXT_PUBLIC_SUPABASE_URL=xxx --build-arg NEXT_PUBLIC_SUPABASE_ANON_KEY=xxx .
# 或依赖同目录 .env:docker compose build
  1. 启动容器
# 若构建时未写入配置,可在此注入(与 --env-file .env 二选一)
docker run -d -p 3000:3000 --name fund --env-file .env real-time-fund

docker-compose(会读取同目录 .env 作为 build-arg 与运行环境)

# 建议先:cp env.example .env 并编辑 .env
docker compose up -d

Docker Hub

镜像已发布至 Docker Hub,可直接拉取运行,无需本地构建。

  1. 拉取镜像

    docker pull hzm0321/real-time-fund:latest
  2. 启动容器
    访问 http://localhost:3000 即可使用。

    docker run -d -p 3000:3000 --name real-time-fund --restart always hzm0321/real-time-fund:latest
  3. 使用自定义环境变量(运行时替换)
    镜像内已预置占位符,启动时通过环境变量即可覆盖,无需重新构建。例如使用本地 .env

    docker run -d -p 3000:3000 --name real-time-fund --restart always --env-file .env hzm0321/real-time-fund:latest

    或单独指定变量:-e NEXT_PUBLIC_SUPABASE_URL=xxx -e NEXT_PUBLIC_SUPABASE_ANON_KEY=xxx
    变量名与本地开发一致:NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYNEXT_PUBLIC_WEB3FORMS_ACCESS_KEYNEXT_PUBLIC_GA_IDNEXT_PUBLIC_GITHUB_LATEST_RELEASE_URL

📖 使用说明

  1. 添加基金:在顶部输入框输入 6 位基金代码(如 110022),点击“添加”。
  2. 查看详情:卡片将展示实时估值及前 10 重仓股的占比与今日涨跌。
  3. 调整频率:点击右上角“设置”图标,可调整自动刷新的间隔时间。
  4. 删除基金:点击卡片右上角的红色删除图标即可移除。

💬 开发者交流群

欢迎基金实时开发者加入微信群聊讨论开发与协作:

📝 免责声明

本项目所有数据均来自公开接口,仅供个人学习及参考使用。数据可能存在延迟,不作为任何投资建议。

📄 开源协议 (License)

本项目采用 GNU Affero General Public License v3.0(AGPL-3.0)开源协议。

  • 允许:自由使用、修改、分发本软件;若你通过网络服务向用户提供基于本项目的修改版本,须向该服务的用户提供对应源代码。
  • 要求:基于本项目衍生或修改的作品需以相同协议开源,并保留版权声明与协议全文。
  • 无担保:软件按「原样」提供,不提供任何明示或暗示的担保。

完整协议文本见仓库根目录 LICENSE 文件,或 GNU AGPL v3 官方说明


二开或转载需注明出处。
Made by hzm

About

基金实时估值查看

Resources

Stars

1.7k stars

Watchers

6 watching

Forks

Releases

Packages

Contributors

Languages