Open-Dev-Society/OpenStock View GitHub Homepage for Latest Official Releases
开源的股票市场追踪平台,提供实时价格监控、个性化提醒和详细的公司分析,完全免费且永久开放
AGPL-3.0TypeScriptOpenStockOpen-Dev-Society 5.5k Last Updated: October 24, 2025
OpenStock 项目介绍
项目概述
OpenStock 是一个现代化的开源股票市场应用程序,旨在为所有人提供免费、开放的市场追踪工具。它是昂贵市场平台的开源替代方案,支持实时价格追踪、个性化提醒和详细的公司洞察分析。
核心理念: 知识应该是开放、免费和可访问的,技术应该属于每个人。
主要特性
🔐 身份认证
- 基于 Better Auth + MongoDB 的邮箱/密码认证系统
- 通过 Next.js 中间件保护的路由
- 完整的用户会话管理
🔍 全局搜索
- 快速的股票搜索功能,由 Finnhub API 支持
- 闲置时显示热门股票,支持防抖查询
- Command + K 快捷键调出命令面板
⭐ 自选股列表
- 每个用户的自选股存储在 MongoDB 中
- 每个用户的每个股票代码唯一
- 便捷的添加/移除功能
📊 股票详情
- TradingView 提供的股票符号信息
- K线图/高级图表、基线图、技术指标
- 公司资料和财务数据小部件
📈 市场概览
- 热力图、行情报价和头条新闻
- 使用 TradingView 嵌入式小部件
- 实时市场数据更新
🎯 个性化入门流程
- 收集用户所在国家、投资目标
- 风险承受能力和偏好行业
- 定制化用户体验
📧 邮件与自动化
- AI 个性化欢迎邮件(通过 Inngest 调用 Gemini)
- 每日新闻摘要邮件(定时任务)
- 基于用户自选股的个性化内容
🎨 精致的用户界面
- shadcn/ui 组件 + Radix UI 基础组件
- Tailwind v4 设计系统
- 默认深色主题
- 响应式设计
技术栈
核心技术
- Next.js 15 (App Router)
- React 19
- TypeScript
- Tailwind CSS v4 (通过 @tailwindcss/postcss)
- shadcn/ui + Radix UI 基础组件
- Lucide 图标库
认证与数据
- Better Auth - 邮箱/密码认证,配合 MongoDB 适配器
- MongoDB + Mongoose - 数据持久化
- Finnhub API - 股票代码、公司资料和市场新闻
- TradingView - 可嵌入的图表小部件
自动化与通信
- Inngest - 事件处理、定时任务、AI 推理(Gemini)
- Nodemailer - 邮件发送(Gmail 传输)
- next-themes - 主题切换
- cmdk - 命令面板
- react-hook-form - 表单处理
语言组成
- TypeScript (~93.4%)
- CSS (~6%)
- JavaScript (~0.6%)
项目结构
app/
├── (auth)/ # 认证相关页面
│ ├── layout.tsx
│ ├── sign-in/page.tsx
│ └── sign-up/page.tsx
├── (root)/ # 主要应用页面
│ ├── layout.tsx
│ ├── page.tsx
│ ├── help/page.tsx
│ └── stocks/[symbol]/page.tsx
├── api/inngest/route.ts # Inngest API 端点
├── globals.css
└── layout.tsx
components/
├── ui/ # shadcn/radix 基础组件
├── forms/ # 表单组件
├── Header.tsx
├── Footer.tsx
├── SearchCommand.tsx
└── WatchlistButton.tsx
database/
├── models/watchlist.model.ts
└── mongoose.ts
lib/
├── actions/ # 服务器操作
│ ├── auth
│ ├── finnhub
│ ├── user
│ └── watchlist
├── better-auth/
├── inngest/ # Inngest 客户端和函数
├── nodemailer/ # 邮件发送配置
├── constants.ts
└── utils.ts
scripts/
└── test-db.mjs # 数据库连接测试
types/
└── global.d.ts
public/assets/images/ # Logo 和截图
快速开始
前置要求
- Node.js 20+
- pnpm 或 npm
- MongoDB 连接字符串(MongoDB Atlas 或本地 Docker)
- Finnhub API 密钥
- Gmail 账户(用于发送邮件)
- 可选:Google Gemini API 密钥(用于 AI 生成内容)
安装步骤
- 克隆仓库
git clone https://github.com/Open-Dev-Society/OpenStock.git
cd OpenStock
- 安装依赖
pnpm install
# 或
npm install
- 配置环境变量
创建 .env 文件:
# 核心配置
NODE_ENV=development
# 数据库
MONGODB_URI=your_mongodb_connection_string
# Better Auth
BETTER_AUTH_SECRET=your_better_auth_secret
BETTER_AUTH_URL=http://localhost:3000
# Finnhub
FINNHUB_API_KEY=your_finnhub_key
NEXT_PUBLIC_FINNHUB_API_KEY=
FINNHUB_BASE_URL=https://finnhub.io/api/v1
# Inngest AI (Gemini)
GEMINI_API_KEY=your_gemini_api_key
# 邮件配置
NODEMAILER_EMAIL=youraddress@gmail.com
NODEMAILER_PASSWORD=your_gmail_app_password
- 验证数据库连接
pnpm test:db
- 启动开发服务器
pnpm dev
- 启动 Inngest(用于工作流和定时任务)
npx inngest-cli@latest dev
- 访问应用
打开浏览器访问 http://localhost:3000
Docker 部署
项目提供了 Docker Compose 配置,可以快速启动应用和 MongoDB:
# 启动 MongoDB
docker compose up -d mongodb
# 构建并启动应用
docker compose up -d --build
使用 Docker 时,MongoDB 连接字符串应该是:
MONGODB_URI=mongodb://root:example@mongodb:27017/openstock?authSource=admin
数据与集成
Finnhub API
- 提供股票搜索、公司资料和市场新闻
- 免费版本可能返回延迟行情
- 需要注意速率限制
TradingView
- 提供可嵌入的图表、热力图、行情等小部件
- 外部图片来自
i.ibb.co
Better Auth + MongoDB
- 邮箱/密码认证
- MongoDB 适配器用于会话存储
- 大多数路由受保护,除了登录/注册页面
Inngest 工作流
- 用户创建事件 → AI 个性化欢迎邮件
- 定时任务 (每日中午12点) → 发送新闻摘要邮件
- 本地开发使用
npx inngest-cli@latest dev
邮件发送(Nodemailer)
- 使用 Gmail 作为传输方式
- 提供欢迎邮件和新闻摘要模板
- 建议生产环境使用专业 SMTP 服务
可用脚本
pnpm dev- 启动开发服务器(Turbopack)pnpm build- 生产环境构建pnpm start- 启动生产服务器pnpm lint- 运行 ESLintpnpm test:db- 验证数据库连接
开发者体验
- TypeScript 严格模式
- Tailwind CSS v4(无需单独配置文件)
- shadcn/ui 组件库
- cmdk 命令面板
- next-themes 主题切换
- lucide-react 图标
Open Dev Society 宣言
我们生活在一个知识被付费墙隐藏的世界,工具被锁定在订阅服务中,信息被偏见扭曲,新手被告知他们"不够好"无法构建。
我们的信念:
- 技术应该属于每个人
- 知识应该是开放、免费和可访问的
- 社区应该以信任而非门槛来欢迎新手
我们的使命:
- 构建真正有用的免费开源项目
- 专业人士和学生都可以无障碍使用的工具
- 学习永远免费的知识平台
- 引导而非评判初学者的社区
- 基于信任而非利润运行的资源
我们的承诺:
- 永远不会锁定知识
- 永远不会收取访问费用
- 永远不会用信任换取金钱
- 在透明度、捐赠和社区力量的基础上运行
贡献指南
欢迎所有人贡献!无论你是学生、自学开发者还是资深工程师。
- 通过 Issue 讨论想法和 Bug
- 寻找标记为 "good first issue" 或 "help wanted" 的问题
- 保持 PR 专注,UI 变更请附上截图
- 友善待人,引导初学者,拒绝门槛 - 这就是 ODS 之道
安全性
如果发现安全漏洞:
- 不要公开提交 Issue
- 发送邮件至:opendevsociety@cc.cc
- 我们会协调负责任的披露并快速修补
许可证
OpenStock 采用 AGPL-3.0 许可证。如果你修改、重新分发或部署它(包括作为 Web 服务),你必须在相同许可证下发布你的源代码并注明原作者。
致谢
- Finnhub - 提供可访问的市场数据
- TradingView - 提供可嵌入的市场小部件
- shadcn/ui, Radix UI, Tailwind CSS, Next.js 社区
- Inngest - 可靠的后台任务和工作流
- Better Auth - 简单安全的认证
- 所有让开源工具成为可能的贡献者
特别感谢 Adrian Hajdin (JavaScript Mastery),他出色的股票市场应用教程为 Open Dev Society 构建 OpenStock 提供了重要帮助。
构建于开放,为每个人,永远免费。—— Open Dev Society