wealthfolio/wealthfolio

GitHub: wealthfolio/wealthfolio

一款开源、本地优先的隐私个人理财追踪器,支持投资组合、净资产、支出管理和财务模拟。

Stars: 8252 | Forks: 581

Logo

Wealthfolio

开源的、隐私的投资组合追踪器 — 投资、净资产、支出和模拟。
本地优先:您的数据完全保存在您的设备上。

网站 · Discord · Twitter · 发布版本

⬇️  下载 macOS · Windows · Linux 版本  ·  📱 iOS App  ·  🐳 Docker

Featured on Hacker News Wealthfolio - A beautiful, local-first personal finance tracker | Product Hunt wealthfolio%2Fwealthfolio | Trendshift
## 简介 **Wealthfolio** 是一款开源、私密的投资组合追踪器 — 涵盖投资、净资产、支出和模拟。您的所有数据都本地存储在设备上:没有云数据库,无需注册账号,永久免费。 如需自动同步券商账户(支持 30 多家机构,只读)以及加密的多设备同步功能,可以使用 **[Wealthfolio Connect](https://wealthfolio.app/connect?utm_source=github&utm_medium=readme)** — 这是一项可选订阅服务,旨在覆盖券商数据连接的实际成本。本应用绝不强制要求订阅:手动追踪和 CSV 导入永久免费。 请访问我们的网站 [wealthfolio.app](https://wealthfolio.app/?utm_source=github&utm_medium=readme)。 ![截图](https://static.pigsec.cn/wp-content/uploads/repos/cas/e2/e26b2de9626f70fa9c566a8a0d0008dd0f812e1b3b1278c3fa95ae8768b5f018.webp) ### ✨ 核心功能 - **📊 投资组合追踪** - 跨多个账户和资产类型追踪您的投资 - **📈 绩效分析** - 真实的时间加权和资金加权收益率、基准对比以及历史分析 - **💰 活动管理** - 导入并管理您所有的交易活动 - **🎯 目标规划** - 通过资产配置管理来设定和追踪财务目标 - **🔒 本地数据** - 所有数据均存储在本地,不依赖云服务 - **🔄 可选的券商同步** - 通过 [Wealthfolio Connect](https://wealthfolio.app/connect?utm_source=github&utm_medium=readme) 自动同步 30 多家券商(只读,完全可选) - **🧩 可扩展性** - 强大的插件系统,支持自定义功能 - **🌍 多货币** - 支持多种货币及汇率管理 - **📱 跨平台** - 桌面端、iOS 以及自托管的 Docker/Web 版 ### 🧩 插件系统 Wealthfolio 具有一个强大的插件系统,允许开发者扩展应用功能: - **🔌 易于开发** - 提供具备完整类型安全性和热重载功能的 TypeScript SDK - **🔒 安全可靠** - 全面的权限系统,需经用户明确同意 - **⚡ 高性能** - 经过性能优化,开销极小 - **🎨 UI 集成** - 可添加自定义页面、导航项和组件 - **📡 实时事件** - 监听投资组合更新、市场同步和用户操作 - **🗄️ 完整数据访问** - 访问账户、持仓、交易活动和市场数据 - **🔐 密钥管理** - 为 API key 和敏感数据提供安全的存储 **开始构建插件:** 请参阅 [插件文档中心](docs/addons/index.md) 所有活动类型的文档(包括必填的表单字段)可在 [docs/activities/activity-types.md](docs/activities/activity-types.md) 中查看。 ## 路线图 请参阅 [ROADMAP.md](./ROADMAP.md)。 ## 📖 文档 ### 核心应用 - **[活动类型](docs/activities/activity-types.md)** - 所有受支持的活动类型及其必填字段的完整指南 - **[路线图](ROADMAP.md)** - 未来计划和开发路线图 ### 架构 - **[适配器系统](docs/architecture/adapters.md)** - 针对桌面/Web 构建版本的编译时环境检测 ### 插件开发 - **[插件文档中心](docs/addons/index.md)** - 插件开发的主入口 - **[快速上手](docs/addons/addon-getting-started.md)** - 插件开发入门指南 - **[API 参考](docs/addons/addon-api-reference.md)** - 包含示例的完整 API 文档 - **[架构设计](docs/addons/addon-architecture.md)** - 设计模式和架构指南 ### 快速链接 - 💡 **官方插件** - 在 [官方插件仓库](https://github.com/wealthfolio/wealthfolio-addons/tree/main/official)中浏览维护的插件示例 - 🧩 **社区插件** - 在 [社区插件目录](https://github.com/wealthfolio/wealthfolio-addons/tree/main/community)中浏览由社区分享的插件 - 🛠️ **[开发工具](packages/addon-dev-tools/)** - 用于插件开发的 CLI 工具 ## 快速开始 ### 前置条件 请确保您的计算机上已安装以下内容: - [Node.js](https://nodejs.org/) - [pnpm](https://pnpm.io/) - [Rust](https://www.rust-lang.org/) - [Tauri](https://tauri.app/) ### 从源码构建 1. **克隆代码仓库**: git clone https://github.com/wealthfolio/wealthfolio.git cd wealthfolio 2. **使用 pnpm 安装依赖**: pnpm install 3. **配置环境变量**: 复制环境模板并根据您的配置进行修改: cp .env.example .env 根据需要更新 `.env` 文件中的数据库路径及其他配置: # 数据库位置 DATABASE_URL=../db/wealthfolio.db 4. **在开发模式下运行**: 使用 Tauri 构建并运行桌面应用程序: ``` pnpm tauri dev ``` #### 插件开发模式 插件热重载服务器现在仅会在您明确选择开启时才会启动。 **使用 Tauri 进行桌面端开发:** ``` VITE_ENABLE_ADDON_DEV_MODE=true pnpm tauri dev ``` **仅用于浏览器开发(仅限 Vite,无 Tauri):** ``` pnpm dev:addons ``` 您也可以在 `.env` 文件中设置 `VITE_ENABLE_ADDON_DEV_MODE=true` 以保留该设置。 5. **为生产环境构建**: 构建用于生产环境的应用程序: ``` pnpm tauri build ``` ### Web 模式(浏览器 + REST API 服务器) 只需一条命令即可通过本地 Axum 服务器运行 Web UI。 #### 快速开始 1. **环境设置**(可选但推荐): 复制示例环境文件并根据您的配置进行修改: cp .env.web.example .env.web 按需修改 `.env.web`,以配置数据库路径、端口和其他设置。 2. **同时启动后端和 Vite 开发服务器**: pnpm run dev:web Vite 开发服务器运行在 `http://localhost:1420`,并将 API 调用代理到 Axum 后端服务器。 #### 配置 所有配置均通过 `.env.web` 中的环境变量完成。 **服务器配置(WF\_\* 变量)**: - `WF_LISTEN_ADDR` - 服务器绑定地址(默认:`0.0.0.0:8088`) - `WF_DB_PATH` - SQLite 数据库路径或目录(默认:`./db/app.db`) - 如果提供的是目录,则会在其中使用 `app.db` - `WF_CORS_ALLOW_ORIGINS` - 允许的 CORS 来源的逗号分隔列表 (默认:`*`)。**启用身份验证时必填** — 通配符 `*` 会被拒绝。 - 示例:`https://wealthfolio.example.com` - `WF_REQUEST_TIMEOUT_MS` - 请求超时时间(以毫秒为单位,默认:`30000`) - `WF_STATIC_DIR` - 提供前端静态资源的目录(默认: `dist`) - `WF_SECRET_KEY` - **必填** 32 字节密钥,用于密钥加密和 JWT 签名 - 可使用以下命令生成:`openssl rand -base64 32` - `WF_AUTH_PASSWORD_HASH` - Argon2id PHC 字符串,为 Web 模式启用仅密码身份验证 - `WF_AUTH_TOKEN_TTL_MINUTES` - 可选,JWT 访问令牌过期时间(以分钟为单位) (默认 `60`) - `WF_AUTH_REQUIRED` - 设置为 `false` 可允许在没有身份验证的情况下在非环回 地址上启动(例如,当反向代理处理身份验证时) - OIDC / SSO(可选)- 通过任何 OpenID Connect 提供商(Authentik, PocketID,Authelia,Keycloak,……)登录。可与 `WF_AUTH_PASSWORD_HASH` 并用或取而代之; 成功的 SSO 登录会生成相同的会话 cookie。 当同时设置了 `WF_OIDC_ISSUER_URL` 和 `WF_OIDC_CLIENT_ID` 时即启用此功能。 - `WF_OIDC_ISSUER_URL` - 提供商基础 URL(发现请求会访问 `/.well-known/openid-configuration`) - `WF_OIDC_CLIENT_ID` - 在 IdP 处注册的客户端 ID - `WF_OIDC_CLIENT_SECRET` - **可选** 客户端密钥(将始终使用 PKCE) - `WF_OIDC_REDIRECT_URL` - 启用 OIDC 时**必填**;必须在 IdP 中注册,例如 `https://your.host/api/v1/auth/oidc/callback` - `WF_OIDC_SCOPES` - **可选** 空格分隔的作用域(默认 `openid email profile`) - `WF_OIDC_ALLOWED_EMAILS` / `WF_OIDC_ALLOWED_SUBS` - 以逗号分隔的 允许名单,与 ID token 中的 `email` / `sub` 声明进行匹配。如果 两者均未设置,服务器将**拒绝启动**,除非同时设置了 `WF_OIDC_ALLOW_ANY=true` — 缺失允许名单绝不能默认让所有 IdP 用户获得访问权限。只有当 IdP 声明 `email_verified=true` 时,`email` 才会被接受;`WF_OIDC_ALLOWED_SUBS` 是更严格的 控制手段(稳定且限定于发行方范围),建议在共享/多租户 IdP 上使用。 - `WF_OIDC_ALLOW_ANY` - **可选**,默认 `false`。设置为 `true` 可在未配置允许名单的情况下,允许 IdP 身份验证的**任何**用户访问。仅在专用的单用户 IdP 上安全;在共享/多租户 IdP 上这会授予所有人访问权限。启用后会在启动时记录一条警告。 - `WF_OIDC_POST_LOGOUT_REDIRECT_URL` - **可选**。当 IdP 提供 `end_session_endpoint` 时,登出也会结束 IdP 会话(RP-Initiated Logout);否则仅为本地登出。设置此项可在登出后返回应用 — 它必须在 IdP 中**注册**(例如 Keycloak 的 "Valid post logout redirect URIs")。如果未设置,IdP 将显示其自己的已登出页面。 - `WF_OIDC_RP_LOGOUT` - **可选**,默认 `true`。设置为 `false` 可强制执行 仅本地登出,即使 IdP 支持 RP-Initiated Logout 也是如此。 - `WF_COOKIE_SECURE` - 控制会话 cookie 上的 `Secure` 属性 (默认:`auto`) - `auto` - 仅当存在 `X-Forwarded-Proto: https` 时设置 `Secure` (推荐用于大多数反向代理设置) - `true` - 始终设置 `Secure`(在保证 TLS 但缺少该 header 时使用) - `false` - 永不设置 `Secure`(不带反向代理的纯 HTTP) - `WF_SECRET_FILE` - **可选** 密钥存储文件的路径(默认: `/secrets.json`) - `WF_ADDONS_DIR` - **可选** 插件目录路径(默认:从数据库路径派生) **Vite 配置**: - `VITE_API_TARGET` - 用于 Vite 代理的后端 API URL(默认: `http://127.0.0.1:8088`) #### 身份验证(Web 模式) - 将 `WF_AUTH_PASSWORD_HASH` 设置为 Argon2id PHC 字符串,以要求在访问 Web App 之前输入密码。 您可以使用在线工具(例如 [argon2.online](https://argon2.online))或 CLI(`argon2-utils` 包)生成该哈希值: printf 'your-password' | argon2 yoursalt16chars! -id -e 将完整的输出(以argon2id$...` 开头)复制到 `.env.web` 中。 **美元符号(`$`)转义速查表** — Argon2 哈希包含 `$` 字符, shell 和 Compose 会将其解释为变量引用: | 上下文 | 语法 | 备注 | | ---------------------------------- | --------------------------------------- | ------------------------------------------------ | | `.env.web` / 应用加载的 dotenv | `WF_AUTH_PASSWORD_HASH=$argon2id$...` | 由应用加载;无 Compose 插值 | | Docker Compose `.env`/`--env-file` | `WF_AUTH_PASSWORD_HASH='$argon2id$...'` | 单引号防止 Compose 插值 | | Docker Compose `.env`/`--env-file` | `WF_AUTH_PASSWORD_HASH=$$argon2id$$...` | 替代方案:将所有 `$` 双写 | | Docker Compose YAML 内联 | `HASH: '$$argon2id$$v=19$$...'` | 将所有 `$` 双写以避免 Compose 插值 | | `docker run`(单引号) | `-e HASH='$argon2id$...'` | 单引号防止 shell 扩展 | | `docker run`(双引号) | `-e HASH="\$argon2id\$..."` | 反斜杠转义每个 `$` | - 会话基于 cookie(`HttpOnly`,`SameSite=Lax`,`Path=/api`)。登录 endpoint 会自动设置会话 cookie — 客户端 JavaScript 无法获取 token。默认情况下,会话有效期为 60 分钟(参见 `WF_AUTH_TOKEN_TTL_MINUTES`)。 - **反向代理 (HTTPS):** 如果您的反向代理终止了 TLS,请确保它 转发 `X-Forwarded-Proto: https`,以便服务器正确设置 `Secure` cookie 属性。或者,将 `WF_COOKIE_SECURE=true` 设置为始终启用 `Secure`。请参见上文的 `WF_COOKIE_SECURE`。 #### 注意事项 - 服务器在启动时会记录实际生效的数据库路径 - `dev:web` 脚本会自动加载 `.env.web` 中的 环境变量 - 使用 Ctrl+C 停止,以优雅地关闭这两个进程 ### 仅服务器 仅运行 HTTP 服务器而不运行 Vite 开发服务器(从代码库根目录): ``` cargo run --manifest-path apps/server/Cargo.toml ``` 该服务器接受上文 [Web 模式配置](#configuration) 部分中记录的相同 `WF_*` 环境变量。您可以直接内联设置它们 或通过 `.env.web` 设置: ``` WF_LISTEN_ADDR=127.0.0.1:8088 WF_DB_PATH=./db/app.db cargo run --manifest-path apps/server/Cargo.toml ``` 请参见 [Web 模式配置](#configuration) 以获取受支持环境变量的完整列表。 ## Docker 您可以拉取官方 Docker 镜像,也可以在本地自行构建。 ### 使用预构建镜像 最新的服务器构建版本已发布到 Docker Hub。 ``` docker pull wealthfolio/wealthfolio:latest ``` 拉取后,在下面的运行命令中使用 `wealthfolio/wealthfolio:latest`。 如果您在本地构建了镜像,请将镜像名称替换回 `wealthfolio`。 ### 构建镜像 直接从源码构建 Docker 镜像(无需预构建): ``` docker build -t wealthfolio . ``` 构建过程: 1. 从源码构建前端资源(`pnpm install` + `pnpm vite build`) 2. 从源码编译 Rust 后端(`cargo build --release`) 3. 创建仅包含运行时产物的最小化 Alpine 镜像 最终镜像包含: - 位于 `/app/dist` 中的已编译前端资源 - 位于 `/usr/local/bin/wealthfolio-server` 的 `wealthfolio-server` 二进制文件 - Alpine Linux 基础镜像(占用空间小) ### 配置 您可以通过以下任一方式配置容器: 1. **环境变量**(使用 `-e` 标志内联指定) 2. **环境文件**(使用 `--env-file` 标志指定) **选项 1:创建 Docker Compose 环境文件**(推荐用于生产环境): ``` SECRET=$(openssl rand -base64 32) HASH=$(printf 'your-password' | argon2 yoursalt16chars! -id -e) cat > .env.docker << EOF WF_LISTEN_ADDR=0.0.0.0:8088 WF_DB_PATH=/data/wealthfolio.db WF_SECRET_KEY='${SECRET}' WF_AUTH_PASSWORD_HASH='${HASH}' WF_CORS_ALLOW_ORIGINS=http://localhost:8088 WF_REQUEST_TIMEOUT_MS=30000 WF_STATIC_DIR=dist EOF ``` 将 `WF_CORS_ALLOW_ORIGINS` 设置为您将在浏览器中使用的确切 URL,例如 `http://192.168.1.10:8088` 或 `https://wealthfolio.example.com`。 **选项 2:使用内联环境变量**(便于测试): 有关内联配置,请参见下面的示例。 ### 运行容器 以下所有示例均使用已发布的镜像 (`wealthfolio/wealthfolio:latest`)。 如果您在本地构建,请替换为您的本地标签(例如 `wealthfolio`)。 **Docker Compose**(推荐): ``` docker compose --env-file .env.docker up -d ``` 这默认将应用发布在 `http://localhost:8088`。设置 `WF_PORT` 可更改映射端口: ``` WF_PORT=8090 docker compose --env-file .env.docker up -d ``` **位于反向代理后的 Docker Compose**: ``` docker compose --env-file .env.docker -f compose.yml -f compose.proxy.yml up -d ``` 当代理运行在同一个 Docker 网络上并将流量转发到 `http://wealthfolio:8088` 时使用此方法。 **使用 Docker CLI 环境文件**: Docker CLI 的 `--env-file` 会原样保留 `$` 字符,因此请使用原始值,无需进行 Compose 转义: ``` SECRET=$(openssl rand -base64 32) HASH=$(printf 'your-password' | argon2 yoursalt16chars! -id -e) cat > .env.docker-run << EOF WF_LISTEN_ADDR=0.0.0.0:8088 WF_DB_PATH=/data/wealthfolio.db WF_SECRET_KEY=${SECRET} WF_AUTH_PASSWORD_HASH=${HASH} WF_CORS_ALLOW_ORIGINS=http://localhost:8088 WF_REQUEST_TIMEOUT_MS=30000 WF_STATIC_DIR=dist EOF ``` ``` docker run --rm -d \ --name wealthfolio \ --env-file .env.docker-run \ -p 8088:8088 \ -v wealthfolio-data:/data \ wealthfolio/wealthfolio:latest ``` **基本用法**(内联环境变量,仅用于测试): ``` docker run --rm -d \ --name wealthfolio \ -e WF_LISTEN_ADDR=0.0.0.0:8088 \ -e WF_DB_PATH=/data/wealthfolio.db \ -e WF_SECRET_KEY="$(openssl rand -base64 32)" \ -e WF_AUTH_REQUIRED=false \ -p 8088:8088 \ -v wealthfolio-data:/data \ wealthfolio/wealthfolio:latest ``` **开发模式**(为本地 Vite 开发服务器设置 CORS,无内置身份验证): ``` docker run --rm -it \ --name wealthfolio \ -e WF_LISTEN_ADDR=0.0.0.0:8088 \ -e WF_DB_PATH=/data/wealthfolio.db \ -e WF_CORS_ALLOW_ORIGINS=http://localhost:1420 \ -e WF_SECRET_KEY="$(openssl rand -base64 32)" \ -e WF_AUTH_REQUIRED=false \ -p 8088:8088 \ -v wealthfolio-data:/data \ wealthfolio/wealthfolio:latest ``` **带有加密的生产环境**(推荐): ``` docker run --rm -d \ --name wealthfolio \ -e WF_LISTEN_ADDR=0.0.0.0:8088 \ -e WF_DB_PATH=/data/wealthfolio.db \ -e WF_SECRET_KEY="$(openssl rand -base64 32)" \ -e WF_AUTH_PASSWORD_HASH="$(printf 'your-password' | argon2 yoursalt16chars! -id -e)" \ -e WF_CORS_ALLOW_ORIGINS=https://wealthfolio.example.com \ -p 8088:8088 \ -v wealthfolio-data:/data \ wealthfolio/wealthfolio:latest ``` ### 环境变量 容器支持 [Web 模式配置](#configuration) 部分中记录的所有 `WF_*` 环境变量。关键变量: - `WF_LISTEN_ADDR` - 绑定地址(**Docker 必须使用 `0.0.0.0:PORT`**,而不是 `127.0.0.1`) - `WF_DB_PATH` - 数据库路径(通常为 `/data/wealthfolio.db`) - `WF_CORS_ALLOW_ORIGINS` - CORS 来源(为开发/前端访问进行设置) - `WF_SECRET_KEY` - 必填的 32 字节密钥,用于加密和 JWT 签名 ### 卷 - `/data` - 用于数据库和机密的持久化存储 - 数据库:`/data/wealthfolio.db` - 机密:`/data/secrets.json`(使用 `WF_SECRET_KEY` 加密) ### 端口 - `8088` - HTTP 服务器(同时提供 API 和静态前端服务) 启动容器后,请访问 `http://localhost:8088` 以使用应用程序。 **重要提示:** 服务器在容器内必须绑定到 `0.0.0.0`(所有接口)才能从您的主机访问。如果绑定到 `127.0.0.1`,将导致该应用只能从容器内部访问。 ### 使用 DevContainer 进行开发 为了在所有平台上获得一致的开发环境,您可以使用 提供的 DevContainer 配置。这种方法需要的步骤更少,并且能提供一个包含所有必要依赖项的隔离环境。 #### 前置条件 - [Docker](https://www.docker.com/) - [Visual Studio Code](https://code.visualstudio.com/) - [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) VS Code 扩展 #### 功能特点 - 预配置的 Tauri 开发环境 - 带有 VNC 访问权限(端口 5900)的 X11 虚拟显示器 - 完整的 Rust 开发环境配置 - 支持 GPU(通过 Docker 的 --gpus=all 标志) - 持久化的数据和构建缓存 - 预装了必要的 VS Code 扩展 #### 使用 DevContainer 开始开发 1. **克隆代码仓库**(如果您尚未克隆): git clone https://github.com/wealthfolio/wealthfolio.git cd wealthfolio 2. **在 VS Code 中打开**: - 打开 VS Code - 进入 文件 > 打开文件夹 - 选择 wealthfolio 目录 3. **启动 DevContainer**: - 按 `F1` 或 `Ctrl+Shift+P` - 输入 “Remote-Containers: Reopen in Container” - 按回车键 4. **等待容器构建**: - VS Code 将构建并配置开发容器 - 首次运行可能需要几分钟 5. **开始开发**: - 容器准备就绪后,您就可以开始开发了 - 所有必要的工具和依赖项都将可以使用 ## 插件开发 Wealthfolio 支持强大的插件生态系统,允许开发者通过自定义功能扩展应用。 ### 插件快速上手 1. **创建新插件**: npx @wealthfolio/addon-dev-tools create my-addon cd my-addon npm install 2. **启动开发服务器**: npm run dev:server 3. **以插件开发模式启动 Wealthfolio**(在另一个终端中): VITE_ENABLE_ADDON_DEV_MODE=true pnpm tauri dev 您的插件将被自动发现并加载,同时支持热重载! ### 插件特性 - **🎨 UI 集成**:添加自定义页面和导航项 - **📊 数据访问**:完全访问投资组合、账户和市场数据 - **📡 实时事件**:对投资组合更新和用户操作做出响应 - **🔐 安全存储**:安全地存储 API key 和敏感数据 - **⚡ 热重载**:无缝的开发体验 - **🔒 权限系统**:通过用户授权实现透明的安全机制 ### 官方插件 请查看 [官方插件仓库](https://github.com/wealthfolio/wealthfolio-addons/tree/main/official) 以获取受维护的插件示例,包括: - **目标进度追踪器**:具有类似日历界面的可视化目标追踪 - **投资费用追踪器**:追踪并分析投资费用 - **Swingfolio**:追踪波段交易表现和未平仓位 ### 资源 - **[快速上手指南](docs/addons/addon-getting-started.md)** - 了解开始构建插件所需的一切信息 - **[API 参考](docs/addons/addon-api-reference.md)** - 完整的 API 文档 - **[架构指南](docs/addons/addon-architecture.md)** - 设计模式和最佳实践 ## 使用的技术 ### 前端 - **React**:用于构建用户界面的 JavaScript 库。 - **React Router**:React 的声明式路由。 - **Tailwind CSS**:实用优先的 CSS 样式框架。 - **Radix UI/Shadcn**:无障碍 UI 组件。 - **Recharts**:使用 React 构建的图表库。 - **React Query**:用于 React 的数据获取库。 - **Zod**:TypeScript 优先的模式声明和验证库。 ### 后端 - **Tauri**:用于构建小巧、安全且快速的桌面应用程序的框架。 - **Rust**:用于核心后端功能的系统编程语言。 - **SQLite**:用于本地数据存储的嵌入式数据库。 - **Diesel**:Rust 的安全、可扩展的 ORM 和查询构建器。 ### 插件系统 - **@wealthfolio/addon-sdk**:具备完整类型安全性的插件开发 TypeScript SDK。 - **@wealthfolio/addon-dev-tools**:用于热重载的 CLI 工具和开发服务器。 - **@wealthfolio/ui**:用于保持样式一致的共享 UI 组件库。 ### 开发工具 - **Vite**:下一代前端工具。 - **TypeScript**:类型化的 JavaScript 超集。 - **ESLint**:可插拔的 JavaScript 和 JSX linting 工具。 - **Prettier**:代码格式化工具。 - **pnpm**:快速、节省磁盘空间的包管理器。 - **Turborepo**:适用于 JavaScript 和 TypeScript 代码库的高性能构建系统。 ## 目录结构 ``` wealthfolio/ ├── apps/ # Application packages │ ├── frontend/ # React frontend application │ │ ├── src/ # Source code │ │ │ ├── adapters/ # Environment adapters (Tauri/Web) │ │ │ ├── addons/ # Addon system runtime │ │ │ ├── components/ # React components │ │ │ ├── features/ # Feature modules (self-contained) │ │ │ ├── pages/ # Application pages and routes │ │ │ ├── hooks/ # Custom React hooks │ │ │ └── lib/ # Utility libraries and helpers │ │ ├── public/ # Static assets │ │ ├── index.html # HTML entry point │ │ └── vite.config.ts # Vite build config │ ├── tauri/ # Tauri desktop/mobile app (Rust IPC commands) │ └── server/ # Axum HTTP server for web mode ├── crates/ # Rust crates (shared backend logic) │ ├── core/ # Core business logic, services, models │ ├── storage-sqlite/ # SQLite storage layer (Diesel ORM) │ ├── market-data/ # Market data providers │ ├── connect/ # External service integrations │ └── device-sync/ # Device sync functionality ├── packages/ # Shared TypeScript packages │ ├── addon-sdk/ # Addon SDK for developers │ ├── addon-dev-tools/ # CLI and dev server for addons │ └── ui/ # Shared UI components (@wealthfolio/ui) ├── docs/ # Documentation │ ├── addons/ # Addon development docs │ ├── activities/ # Activity types docs │ └── architecture/ # Architecture docs ├── e2e/ # End-to-end tests ├── scripts/ # Build and dev scripts ├── Cargo.toml # Rust workspace config ├── package.json # Node.js dependencies ├── pnpm-workspace.yaml # pnpm workspace config └── tsconfig.json # TypeScript config ``` 官方和社区插件的源码位于单独的 [wealthfolio-addons](https://github.com/wealthfolio/wealthfolio-addons) 仓库中。 ### 安全与数据存储 #### 本地数据存储 您的所有财务数据均使用 SQLite 数据库进行本地存储,不依赖任何云服务: - 投资组合持仓和表现数据 - 交易活动和交易历史 - 账户信息和设置 - 目标和缴款限额 #### API 密钥与机密 API 凭证通过 `keyring` crate 安全地存储在操作系统的密钥环中: - **核心应用**:使用 `set_secret` 和 `get_secret` 命令处理外部服务 - **插件**:使用 Secrets API (`ctx.api.secrets`) 处理特定于插件的敏感数据 - **不写入磁盘**:密钥绝不写入磁盘或配置文件中 #### 权限系统 插件在全面的权限系统下运行: - 安装期间进行自动代码分析 - 访问数据需要用户同意 - 基于风险的安全警告 - 透明的权限声明 ## 贡献 欢迎您的贡献!请遵循以下步骤: 1. Fork 该代码仓库。 2. 创建一个新分支 (`git checkout -b feature-branch`)。 3. 进行修改。 4. 提交您的更改 (`git commit -m 'Add some feature'`)。 5. 推送到该分支 (`git push origin feature-branch`)6. 发起一个 Pull Request。 ## 许可证 本项目基于 AGPL-3.0 许可证授权。有关详细信息,请参阅 `LICENSE` 文件。 `assets/brand/` 中的品牌资产均为商标;请参见 [TRADEMARKS.md](TRADEMARKS.md)。 Wealthfolio 和 Wealthfolio 徽标是 Teymz Inc. 的商标。代码基于 AGPL-3.0 授权;商标不在该许可证授权范围内。 ## 🌟 Star 历史 ## [![Star History Chart](https://api.star-history.com/svg?repos=wealthfolio/wealthfolio&type=Timeline)](https://star-history.com/#wealthfolio/wealthfolio&Date) 享受使用 **Wealthfolio** 管理您的财富吧!🚀
标签:Docker, HTTP 参数枚举, iOS, 个人理财, 可视化界面, 安全防御评估, 投资追踪, 本地优先, 桌面应用, 请求拦截, 通知系统