feat(packaging): v1.19.1 支持 Windows 单 EXE 打包 + 系统托盘 + 自动发版

面向零基础老年用户,easy-tdx 可打包成单一 Windows EXE,双击即用。

新增:
- 后端同源托管前端 dist(app.py 三级探测:env → _MEIPASS → web-ui/dist)
- easy-tdx serve 默认 --open-browser,启动后自动开浏览器
- PyInstaller 打包入口(__main__.py)+ spec 配置(easy_tdx.spec)
- 系统托盘(tray.py):右下角图标,右键"打开浏览器/退出"
  解决老人不会用任务管理器关闭的问题
- GitHub Actions release.yml:打 v* tag 自动构建并发布 EXE 到 Releases
- docs/packaging.md 打包使用文档

修复:
- K 线残缺尾记录导致 500(security_bars.py):通达信服务器偶发
  ret_count 与 body 长度不匹配,改为 try/except 优雅降级丢弃残缺尾,
  返回已解析的完整记录。GetIndexBarsCmd 同改。加 4 个回归测试。
- PyInstaller frozen 模式三个坑:
  1. console=False 下 stdout/stderr 为 None → 重定向到日志文件
  2. multiprocessing spawn 子进程重新 import __main__ → freeze_support + 子进程检测
  3. 系统托盘需主线程消息泵 → uvicorn 挪到后台线程

文档:
- README/手册改为三档分流:EXE(零基础)/ Python(一条命令)/ 源码(打包)
- 删除 npm run dev / 5173 / 两个终端的过时说明
- 手册补虚拟环境配置 + EXE 打包附录 + EXE 排错 FAQ
This commit is contained in:
Justin Gu
2026-07-07 01:48:07 +08:00
parent c901d198ca
commit 0b4ed9af62
13 changed files with 1065 additions and 141 deletions
+19 -12
View File
@@ -446,30 +446,37 @@ easy-tdx portfolio --stocks SZ:000001,SH:600519 \
<img src="./docs/web-ui-page-3.png" alt="Web UI 截图 3" />
不想写命令行?用浏览器。`easy-tdx serve` 启动后端,`web-ui/` 目录跑前端,浏览器打开就是完整的回测可视化界面。
不想写命令行?用浏览器。`easy-tdx serve` 一条命令启动,浏览器自动打开 `http://localhost:8000`就是完整的回测可视化界面。
**前置条件:**
```bash
# 后端需安装 web 可选依赖(FastAPI + Uvicorn
# 需安装 web 可选依赖(FastAPI + Uvicorn
pip install -e ".[web]"
# 前端需 Node.js 18+(首次运行需装依赖)
cd web-ui && npm install
```
**启动(两个终端):**
**启动(一条命令):**
```bash
# 终端 1:启动后端 API 服务(提供行情数据 + 回测计算
easy-tdx serve --port 8000
# 启动后端 + 自动打开浏览器(默认 http://localhost:8000
easy-tdx serve
# 终端 2:启动前端开发服务器(web-ui/ 目录)
cd web-ui && npm run dev
# 浏览器打开 http://localhost:5173
# 自定义端口/不自动开浏览器
easy-tdx serve --port 8080 --no-open-browser
```
> 前端开发服务器通过 Vite proxy 把 `/api` 请求转发到后端 `127.0.0.1:8000`,无需处理跨域。后端行情连接失败时回测路由仍可用(用内联数据),但取行情功能需要后端连通通达信服务器。
> 后端启动后约 1-2 秒会自动弹出浏览器。前端界面已编译进 `web-ui/dist/`,由后端同源托管,无需单独跑前端开发服务器。后端行情连接失败时回测路由仍可用(用内联数据),但取行情功能需要后端连通通达信服务器。
**不想装 Python?下载 EXE 直接用(面向零基础用户):**
Windows 用户可以下载打包好的单一 EXE(约 80-150MB),双击即可使用,无需安装 Python/Node 或任何依赖:
1. 到 [Releases 页面](../../releases) 下载最新的 `easy-tdx-<版本>-windows.exe`
2. 双击运行(首次会被 SmartScreen 拦截,点"更多信息 → 仍要运行")
3. 等待 2-5 秒,浏览器自动打开回测界面
4. 右下角任务栏出现小图标,右键 → "退出" 可关闭
EXE 打包方法见 [`docs/packaging.md`](./docs/packaging.md)。
打开浏览器后,顶部导航栏有五个页面: