[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-74410":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":15,"forks30d":15,"starsTrendScore":19,"compositeScore":20,"rankGlobal":9,"rankLanguage":9,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":24,"topics":25,"createdAt":9,"pushedAt":9,"updatedAt":26,"readmeContent":27,"aiSummary":28,"trendingCount":15,"starSnapshotCount":15,"syncStatus":29,"lastSyncTime":30,"discoverSource":31},74410,"real-time-fund","hzm0321\u002Freal-time-fund","hzm0321","基金实时估值查看",null,"JavaScript",1349,430,3,18,0,12,46,127,36,20.9,"GNU Affero General Public License v3.0",false,"main",true,[],"2026-06-12 02:03:25","# 实时基金估值 (Real-time Fund Valuation)\n\n一个基于 Next.js 开发的基金估值与重仓股实时追踪工具。采用玻璃拟态设计（Glassmorphism），支持移动端适配。\n预览地址：  \n1. [https:\u002F\u002Fhzm0321.github.io\u002Freal-time-fund\u002F](https:\u002F\u002Fhzm0321.github.io\u002Freal-time-fund\u002F)\n2. [https:\u002F\u002Ffund.cc.cd\u002F](https:\u002F\u002Ffund.cc.cd\u002F) （加速国内访问）\n\n## Star History\n\n\u003Ca href=\"https:\u002F\u002Fwww.star-history.com\u002F?repos=hzm0321%2Freal-time-fund&type=date&legend=top-left\">\n \u003Cpicture>\n   \u003Csource media=\"(prefers-color-scheme: dark)\" srcset=\"https:\u002F\u002Fapi.star-history.com\u002Fimage?repos=hzm0321\u002Freal-time-fund&type=date&theme=dark&legend=top-left\" \u002F>\n   \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"https:\u002F\u002Fapi.star-history.com\u002Fimage?repos=hzm0321\u002Freal-time-fund&type=date&legend=top-left\" \u002F>\n   \u003Cimg alt=\"Star History Chart\" src=\"https:\u002F\u002Fapi.star-history.com\u002Fimage?repos=hzm0321\u002Freal-time-fund&type=date&legend=top-left\" \u002F>\n \u003C\u002Fpicture>\n\u003C\u002Fa>\n\n## ✨ 特性\n\n- **实时估值**：通过输入基金编号，实时获取并展示基金的单位净值、估值净值及实时涨跌幅。\n- **重仓追踪**：自动获取基金前 10 大重仓股票，并实时追踪重仓股的盘中涨跌情况。支持收起\u002F展开展示。\n- **纯前端运行**：采用 JSONP 方案直连东方财富、腾讯财经等公开接口，彻底解决跨域问题，支持在 GitHub Pages 等静态环境直接部署。\n- **本地持久化**：使用 `localStorage` 存储已添加的基金列表、持仓、交易记录、定投计划及配置信息，刷新不丢失。\n- **响应式设计**：完美适配 PC 与移动端。针对移动端优化了文字展示、间距及交互体验。\n- **自选功能**：支持将基金添加至\"自选\"列表，通过 Tab 切换展示全部基金或仅自选基金。自选状态支持持久化及同步清理。\n- **分组管理**：支持创建多个基金分组，方便按用途或类别管理基金。\n- **持仓管理**：记录每只基金的持有份额和成本价，自动计算持仓收益和累计收益。\n- **交易记录**：支持买入\u002F卖出操作，记录交易历史，支持查看单个基金的交易明细。\n- **定投计划**：支持设置自动定投计划，可按日\u002F周\u002F月等周期自动生成买入交易。\n- **云端同步**：通过 Supabase 云端备份数据，支持多设备间数据同步与冲突处理。\n- **自定义排序**：支持多种排序规则（估值涨跌幅、持仓收益、持有金额等），可自由组合和启用\u002F禁用规则。\n- **拖拽排序**：在默认排序模式下可通过拖拽调整基金顺序。\n- **明暗主题**：支持亮色\u002F暗色主题切换，一键换肤。\n- **导入\u002F导出**：支持将配置导出为 JSON 文件备份，或从文件导入恢复。\n- **可自定义频率**：支持设置自动刷新间隔（5秒 - 300秒），并提供手动刷新按钮。\n\n## 🛠 技术栈\n\n- **框架**：[Next.js](https:\u002F\u002Fnextjs.org\u002F) (App Router)\n- **样式**：原生 CSS (Global CSS) + 玻璃拟态设计\n- **数据源**：\n  - 基金估值：天天基金 (JSONP)\n  - 重仓数据：东方财富 (HTML Parsing)\n  - 股票行情：腾讯财经 (Script Tag Injection)\n- **部署**：GitHub Actions + GitHub Pages\n\n## 🚀 快速开始\n\n### 本地开发\n\n1. 克隆仓库：\n   ```bash\n   git clone https:\u002F\u002Fgithub.com\u002Fhzm0321\u002Freal-time-fund.git\n   cd real-time-fund\n   ```\n\n2. 安装依赖：\n   ```bash\n   npm install\n   ```\n\n3. 配置环境变量：\n   ```bash\n   cp env.example .env.local\n   ```\n   按照 `env.example` 填入以下值：\n  - `NEXT_PUBLIC_Supabase_URL`：Supabase 项目 URL\n  - `NEXT_PUBLIC_Supabase_ANON_KEY`：Supabase 匿名公钥\n  - `NEXT_PUBLIC_WEB3FORMS_ACCESS_KEY`：Web3Forms Access Key\n  - `NEXT_PUBLIC_GA_ID`：Google Analytics Measurement ID（如 `G-xxxx`）\n  - `NEXT_PUBLIC_GITHUB_LATEST_RELEASE_URL`：GitHub 最新 Release 接口地址，用于在页面中展示\"发现新版本\"提示（如：`https:\u002F\u002Fapi.github.com\u002Frepos\u002Fhzm0321\u002Freal-time-fund\u002Freleases\u002Flatest`）\n  - `NEXT_PUBLIC_IS_GITHUB_LOGIN`：控制是否开启 GitHub OAuth 登录功能，可选值 `true` \u002F `false`（默认 `false`）\n\n注：如不使用登录、反馈或 GA 统计功能，可不设置对应变量\n\n4. 运行开发服务器：\n   ```bash\n   npm run dev\n   ```\n   访问 [http:\u002F\u002Flocalhost:3000](http:\u002F\u002Flocalhost:3000) 查看效果。\n\n### Supabase 配置说明\n1. NEXT_PUBLIC_Supabase_URL 和 NEXT_PUBLIC_Supabase_ANON_KEY 获取\n\n   NEXT_PUBLIC_Supabase_URL：Supabase控制台 → Project Settings → General → Project ID  \n   NEXT_PUBLIC_Supabase_ANON_KEY： Supabase控制台 → Project Settings → API Keys → Publishable key\n\n   示例：\n   ```\n   NEXT_PUBLIC_SUPABASE_URL=https:\u002F\u002Fabcdefghijklmnop.supabase.co\n   NEXT_PUBLIC_SUPABASE_ANON_KEY=xxxxxx\n   ```\n\n2. 邮件数量修改\n\n    Supabase 免费项目自带每小时2条邮件服务。如果觉得额度不够，可以改成自己的邮箱SMTP。修改路径在 Supabase控制台 → Authentication → Email → SMTP Settings。  \n    之后可在 Rate Limits ，自由修改每小时邮件数量。\n\n3. 修改接收到的邮件为验证码  \n\n    在 Supabase控制台 → Authentication → Email Templates 中，选择 **Magic Link** 模板进行编辑，在邮件正文中使用变量 `{{ .Token }}` 展示验证码。  \n\n4. 修改验证码位数  \n\n    官方验证码位数默认为8位，可自行修改。常见一般为6位。\n   在 Supabase控制台 → Authentication → Sign In \u002F Providers → Auth Providers → email → Minimum password length  和 Email OTP Length 都改为6位。\n\n5. 关闭确认邮件\n\n    在 Supabase控制台 → Authentication → Sign In \u002F Providers → Auth Providers → email 中，关闭 **Confirm email** 选项。这样用户注册后就不需要再去邮箱点击确认链接了，直接使用验证码登录即可。\n\n6. 配置 GitHub 登录（可选）\n\n   如需支持 GitHub OAuth 登录，需完成以下配置：\n\n   **第一步：在 GitHub 创建 OAuth App**\n   - 访问 GitHub → Settings → Developer settings → OAuth Apps → New OAuth App\n   - 填写信息：\n     - Application name：自定义应用名称\n     - Homepage URL：你的应用地址（如 `https:\u002F\u002Fhzm0321.github.io\u002Freal-time-fund\u002F`）\n     - Authorization callback URL：`https:\u002F\u002F\u003Cyour-supabase-project-id>.supabase.co\u002Fauth\u002Fv1\u002Fcallback`\n   - 创建后获取 **Client ID** 和 **Client Secret**\n\n   **第二步：在 Supabase 启用 GitHub Provider**\n   - Supabase控制台 → Authentication → Sign In \u002F Providers → Auth Providers → GitHub\n   - 开启 **GitHub** 开关\n   - 填入 GitHub OAuth App 的 **Client ID** 和 **Client Secret**\n   - 点击 **Save** 保存\n\n   **第三步：配置站点 URL（重要）**\n   - Supabase控制台 → Authentication → URL Configuration\n   - **Site URL**：设置为你的应用主域名（如 `https:\u002F\u002Fhzm0321.github.io\u002F`）\n   - **Redirect URLs**：添加你的应用完整路径（如 `https:\u002F\u002Fhzm0321.github.io\u002Freal-time-fund\u002F`）\n\n   配置完成后，用户即可通过 GitHub 账号一键登录。\n\n7. 执行数据库初始化 SQL\n\n   项目需要创建 `user_configs` 表及相关策略才能使用云端同步功能。SQL 语句位于项目 `\u002Fdoc\u002Fsupabase.sql` 文件。\n\n   **执行步骤：**\n   - Supabase控制台 → SQL Editor → New query\n   - 复制 `\u002Fdoc\u002Fsupabase.sql` 文件中的全部内容，粘贴到编辑器\n   - 点击 **Run** 执行\n\n   SQL 脚本将完成以下操作：\n   - 创建 `user_configs` 表（存储用户配置数据）\n   - 启用行级安全（RLS），确保用户只能访问自己的数据\n   - 创建 SELECT \u002F INSERT \u002F UPDATE 策略\n   - 创建 `update_user_config_partial` 函数（用于增量更新配置）\n   - 创建 `supabase_realtime` Publication（开启对 `user_configs` 表的实时变更监听）\n\n   执行成功后，可在 Table Editor 中看到 `user_configs` 表。\n\n8. 导入关联板块数据（可选）\n\n   项目支持展示基金追踪的关联板块（如指数、行业板块）及其实时涨跌幅。该功能依赖两张数据表：\n   - `fund_related`：基金代码 → 关联板块名称映射\n   - `fund_secid`：关联板块名称 → 东方财富 secid 映射\n\n   这两张表已在 `\u002Fdoc\u002Fsupabase.sql` 中创建，数据源位于 `\u002Fdoc` 目录：\n   - `fund_tracking_targets.csv`：基金追踪目标数据\n   - `related_sector_secid.csv`：关联板块 secid 映射数据\n\n   **导入步骤：**\n   - Supabase控制台 → Table Editor → 选择 `fund_related` 表\n   - 点击右上角 **Insert** → **Import data from CSV**\n   - 上传 `fund_tracking_targets.csv` 文件，确认列映射后点击 **Import**\n   - 同理，向 `fund_secid` 表导入 `related_sector_secid.csv` 文件\n\n   导入成功后，基金卡片将展示其追踪的关联板块及实时涨跌幅。\n\n9. 部署 Supabase Edge Function（可选）\n\n   本项目 OCR 识别基金截图功能依赖第三方模型接口，已封装为 Supabase Edge Function 以隐藏 API Key 并避免跨域问题。大模型服务赞助商为 [AINX](https:\u002F\u002Fapi.ainx.cc\u002F)。\n\n   **配置步骤：**\n   - 需要用户已登录（函数会读取请求头 `Authorization`，并通过 `supabase.auth.getUser()` 校验 JWT）\n   - 进入 **Supabase 控制台** → 选择你的项目\n   - 左侧菜单找到 **Project Settings**（项目设置）\n   - 点击 **Edge Functions** 选项卡\n   - 在 **Functions** 区域点击 **Develop a new function** → **Via Editor**\n   - 输入函数名称 `analyze-fund`和复制 `doc\u002FedgeFunction\u002Fanalyze-fund.ts` 内容到编辑器中，点击 **Create**\n   - 到该函数的 Settings 页，取消 **Verify JWT with legacy secret** 选项\n   - 在 **Secrets** 区域点击 **Add a new secret**\n   - Name 填入 `AINX_API_KEY`，Value 填入你从 [AINX 控制台](https:\u002F\u002Fconsole.ainx.cc\u002Ftoken) 申请的 Key\n   - 点击 **保存** 即可\n\n   **常见排查：**\n   - 401 Unauthorized：说明当前未登录或未携带用户 JWT（先完成 Supabase 登录流程）\n   - 500 \u002F \"模型未返回合法 JSON\"：通常是第三方模型接口返回格式异常或 Key 无效\n\n更多 Supabase 相关内容查阅官方文档。\n\n### 构建与部署\n\n本项目已配置 GitHub Actions。每次推送到 `main` 分支时，会自动执行构建并部署到 GitHub Pages。\n如需使用 GitHub Actions 部署，请在 GitHub 项目 Settings → Secrets and variables → Actions 中创建对应的 Repository secrets（字段名称与 `.env.local` 保持一致）。\n包括：`NEXT_PUBLIC_Supabase_URL`、`NEXT_PUBLIC_Supabase_ANON_KEY`、`NEXT_PUBLIC_WEB3FORMS_ACCESS_KEY`、`NEXT_PUBLIC_GA_ID`、`NEXT_PUBLIC_GITHUB_LATEST_RELEASE_URL`、`NEXT_PUBLIC_IS_GITHUB_LOGIN`。\n\n若要手动构建：\n```bash\nnpm run build\n```\n静态文件将生成在 `out` 目录下。\n\n### Docker运行\n\n镜像支持两种配置方式：\n\n- **构建时写入**：构建时通过 `--build-arg` 或 `.env` 传入 `NEXT_PUBLIC_*`，值会打进镜像，运行时无需再传。\n- **运行时替换**：构建时不传（或使用默认占位符），启动容器时通过 `-e` 或 `--env-file` 传入，入口脚本会在启动 Nginx 前替换静态资源中的占位符。\n\n可复制 `env.example` 为 `.env` 并填入实际值；若不用登录\u002F反馈功能可留空。\n\n1. 构建镜像\n```bash\n# 方式 A：运行时再注入配置（镜像内为占位符）\ndocker build -t real-time-fund .\n\n# 方式 B：构建时写入配置\ndocker build -t real-time-fund --build-arg NEXT_PUBLIC_SUPABASE_URL=xxx --build-arg NEXT_PUBLIC_SUPABASE_ANON_KEY=xxx .\n# 或依赖同目录 .env：docker compose build\n```\n\n2. 启动容器\n```bash\n# 若构建时未写入配置，可在此注入（与 --env-file .env 二选一）\ndocker run -d -p 3000:3000 --name fund --env-file .env real-time-fund\n```\n\n#### docker-compose（会读取同目录 `.env` 作为 build-arg 与运行环境）\n```bash\n# 建议先：cp env.example .env 并编辑 .env\ndocker compose up -d\n```\n\n### Docker Hub\n\n镜像已发布至 Docker Hub，可直接拉取运行，无需本地构建。\n\n1. **拉取镜像**\n   ```bash\n   docker pull hzm0321\u002Freal-time-fund:latest\n   ```\n\n2. **启动容器**  \n   访问 [http:\u002F\u002Flocalhost:3000](http:\u002F\u002Flocalhost:3000) 即可使用。\n   ```bash\n   docker run -d -p 3000:3000 --name real-time-fund --restart always hzm0321\u002Freal-time-fund:latest\n   ```\n\n3. **使用自定义环境变量（运行时替换）**  \n   镜像内已预置占位符，启动时通过环境变量即可覆盖，无需重新构建。例如使用本地 `.env`：\n   ```bash\n   docker run -d -p 3000:3000 --name real-time-fund --restart always --env-file .env hzm0321\u002Freal-time-fund:latest\n   ```\n   或单独指定变量：`-e NEXT_PUBLIC_SUPABASE_URL=xxx -e NEXT_PUBLIC_SUPABASE_ANON_KEY=xxx`。  \n   变量名与本地开发一致：`NEXT_PUBLIC_SUPABASE_URL`、`NEXT_PUBLIC_SUPABASE_ANON_KEY`、`NEXT_PUBLIC_WEB3FORMS_ACCESS_KEY`、`NEXT_PUBLIC_GA_ID`、`NEXT_PUBLIC_GITHUB_LATEST_RELEASE_URL`。\n\n## 📖 使用说明\n\n1. **添加基金**：在顶部输入框输入 6 位基金代码（如 `110022`），点击“添加”。\n2. **查看详情**：卡片将展示实时估值及前 10 重仓股的占比与今日涨跌。\n3. **调整频率**：点击右上角“设置”图标，可调整自动刷新的间隔时间。\n4. **删除基金**：点击卡片右上角的红色删除图标即可移除。\n\n## 💬 开发者交流群\n\n欢迎基金实时开发者加入微信群聊讨论开发与协作：\n\n\u003Cimg src=\".\u002Fdoc\u002FweChatGroupDevelop.jpg\" width=\"300\">\n\n## 📝 免责声明\n\n本项目所有数据均来自公开接口，仅供个人学习及参考使用。数据可能存在延迟，不作为任何投资建议。\n\n## 📄 开源协议 (License)\n\n本项目采用 **[GNU Affero General Public License v3.0](https:\u002F\u002Fwww.gnu.org\u002Flicenses\u002Fagpl-3.0.html)**（AGPL-3.0）开源协议。\n\n- **允许**：自由使用、修改、分发本软件；若你通过网络服务向用户提供基于本项目的修改版本，须向该服务的用户提供对应源代码。\n- **要求**：基于本项目衍生或修改的作品需以相同协议开源，并保留版权声明与协议全文。\n- **无担保**：软件按「原样」提供，不提供任何明示或暗示的担保。\n\n完整协议文本见仓库根目录 [LICENSE](.\u002FLICENSE) 文件，或 [GNU AGPL v3 官方说明](https:\u002F\u002Fwww.gnu.org\u002Flicenses\u002Fagpl-3.0.html)。  \n\n---\n二开或转载需注明出处。  \nMade by [hzm](https:\u002F\u002Fgithub.com\u002Fhzm0321)\n","实时基金估值是一个基于Next.js开发的工具，用于查看基金的实时估值和重仓股追踪。其核心功能包括通过输入基金编号获取并展示基金的单位净值、估值净值及实时涨跌幅，自动追踪前十大重仓股票的盘中涨跌情况，并支持自选列表、分组管理、持仓管理和交易记录等功能。该工具采用纯前端运行方案，利用JSONP技术直连东方财富、腾讯财经等公开接口解决跨域问题，同时使用localStorage实现本地数据持久化，确保刷新不丢失。此外，它还具有响应式设计，完美适配PC与移动端，并支持亮暗主题切换。此项目适用于需要快速便捷地获取基金市场信息的投资人士和个人投资者。",2,"2026-06-11 03:50:04","high_star"]