shy3130
|
00d856191b
|
refactor(stock-analysis): 价位体系重构 — 价量支撑 + 通道拆分 + 右侧标签带
压力支撑语义归位:从 BOLL 波动通道改为 Volume Profile 成交密集区
(价+量驱动,真正的市场结构支撑/压力),原 profile 组并入 sr 组。
通道拆分:原合并的「波动通道」拆为 4 个独立开关 —— 布林带(含中轨
MA20)+ Keltner 短/中/长三档,各自显隐。
图表布局:
- 价位文字改用 line series + endLabel 显示在右侧 grid.right 预留带,
不再压在蜡烛上;预留带加宽至 144px 保证标签完整
- 标题栏改两端布局,当前价右置并加大加粗、带涨跌色
- 价位统计面板恢复至图表下方
默认开启:压力支撑 + 枢轴点 + Keltner短期。
|
2026-06-26 23:34:54 +08:00 |
|
shy3130
|
0724fd3721
|
fix(docker): PyPI 源多级兜底,避免单源同步延迟导致构建失败
修复国内镜像(清华源)同步 uv 包延迟时,USE_CN_MIRROR=1 构建报
"Could not find a version that satisfies the requirement uv" 的问题,
用户此前需手动传 --build-arg PYPI_INDEX 换源才能通过。
- pip install uv 加三重 fallback:主源(清华) → 备用源(阿里云) → 官方源
- uv sync 同时挂双 index(UV_DEFAULT_INDEX + UV_EXTRA_INDEX_URL),
uv 自动在两源查找,任一源缺包时另一源补位
- 新增 PYPI_FALLBACK build arg(默认阿里云),可自定义
正常构建零影响(fallback 首环即成功,--frozen 严格按 lock 安装),
仅在主源故障/同步延迟时自动兜底。
|
2026-06-26 17:39:45 +08:00 |
|
shy3130
|
b8ed0f8177
|
fix(analysis): 新用户无数据时概念/行业分析配置按钮无响应
根因:配置弹窗 <AnimatePresence> 在主 return 内,而无数据的早期
return 分支没有渲染弹窗,导致新用户点按钮 showConfig=true 无组件响应。
- ConceptAnalysis: 早期 return 分支补上弹窗渲染
- IndustryAnalysis: 早期 return 分支补上配置按钮(原来缺失)+弹窗渲染
修复后新用户在两个页面点配置按钮均可正常弹出。
|
2026-06-26 16:26:11 +08:00 |
|
shy3130
|
1e0e9b422b
|
feat(stock-analysis): 添加「点位提醒」按钮占位(开发中)
在 AI 个股分析按钮旁新增点位提醒入口,预留关键价位触发提醒功能。
当前点击提示「开发中」,后续可复用监控引擎实现价格触及通知。
|
2026-06-26 16:16:39 +08:00 |
|
shy3130
|
3948d2555e
|
feat(stock-analysis): 带状指标改为跟随行情漂移的曲线
布林带/Keltner通道/ATR止损从「水平直线(仅最新值)」改为
「跟随时间漂移的曲线(ECharts line series)」,还原通道的真实形态。
后端(stock_analysis.py):
- 新增 _build_series(): 提取 5 组带状指标每日时间序列
· boll(布林带上下轨)
· keltner_s/m/l(短/中/长三档 MA±n×ATR,MA120 现场算)
· atr(close±2ATR 动态止损止盈)
- get_levels 返回新增 dates + series 字段
前端(AnalysisKChart.tsx):
- Props 加 series/seriesDates,数据预处理做日期对齐映射
- buildOption 按开关添加 type:'line' 曲线(复刻 maLine 模式)
- collectPriceLines 过滤布林带/Keltner/ATR 水平线,避免与曲线重复
- Keltner 三档渐变青色系区分档位
- 水平直线(枢轴/前高前低/成交密集/缺口/斐波那契/整数关口)不变
|
2026-06-26 16:02:16 +08:00 |
|
shy3130
|
2015ef0c78
|
feat: 个股分析(Beta) — 专用日K + 9类关键价位 + AI四维分析
新增个股分析页,以行情与关键价位为视觉主体,与财务分析(财务质量评级)定位互补:
后端:
- indicators/levels.py: 9 类关键价位纯函数计算
· 压力支撑(布林带)/ 成交密集区(POC)/ 枢轴点(可配档位)/ 前高前低
· Keltner通道(MA±n×ATR 短/中/长)/ ATR止损(close±nATR)
· 缺口位(未回补跳空)/ 斐波那契回撤 / 整数关口(自适应步长)
- services/stock_analyzer.py: AI 四维(技术/基本面/财务/消息面)流式分析,NDJSON
- services/stock_reports.py: 报告持久化(最多50条),独立 JSON 存储
- api/stock_analysis.py: levels/analyze/reports 端点
前端:
- AnalysisKChart: 专用 ECharts 日K(主图+成交量+滑块),9 类价位开关
- 蓝色胶囊(Bubble/Host/Dialog),与财务分析紫色主题并存
- stockAnalysisStore: useSyncExternalStore 全局存储,后台流式
- useLastStock + LastStockChip: 记忆最近查看个股(财务/个股分析页)
其他优化:
- AI 设置页:一键清空配置(保留UA) + 保存后乐观更新连接状态/菜单
- MarkdownRenderer: 去除 space-y-0 遮蔽,各块间距与分隔线可见性优化
- 个股分析页 Beta 标识(标题 + 菜单)
- 版本号 0.1.45 → 0.1.50
|
2026-06-26 15:36:52 +08:00 |
|
shy3130
|
3bb66f3e81
|
docs(legacy-cpu): 补充镜像体积说明与多 extras 用法
- 标注 legacy-cpu wheel 约 50MB,启用后镜像体积会相应增大
- 补充 BACKEND_EXTRAS 空格分隔可同时启用多个 extras 的用法
|
2026-06-26 11:25:50 +08:00 |
|
shidehai
|
13b4505ad4
|
fix legacy CPU Docker deployment
|
2026-06-26 11:06:59 +08:00 |
|
wshy
|
c878fd4345
|
Update README.md
|
2026-06-25 22:45:20 +08:00 |
|
wshy
|
747dd8f514
|
Merge pull request #13 from shy3130/feat/ai-financial-analysis
feat(financials): AI 财务分析 — 流式生成 + 全局胶囊 + 历史报告
|
2026-06-25 22:40:15 +08:00 |
|
shy3130
|
11a972a980
|
feat(financials): AI 财务分析 — 流式生成 + 全局胶囊 + 历史报告持久化
后端:
- 新增 financial_analyzer 服务(CFA 级九维分析提示词 + LLM 流式调用)
- 新增 ai_reports 持久化存储(保留前 20 条)
- 新增 /analyze 流式接口 + 报告 CRUD 接口
- 同步时间持久化到 preferences.json,重启不丢失
前端:
- 全局 AI 分析对话框(store 驱动,支持最小化/历史模式)
- 全局可拖拽任务胶囊(玻璃拟态,三态配色,60fps 拖拽)
- 历史报告列表面板(财务页底部)
- 轻量 Markdown 渲染器(表格折行/列表/引用)
- 同标的历史二次确认 + 财务菜单改名「财务分析」
同步版本号至 v0.1.45
|
2026-06-25 22:39:34 +08:00 |
|
wshy
|
b53c6fdbf1
|
Add files via upload
|
2026-06-25 22:37:29 +08:00 |
|
wshy
|
059ab16e98
|
Update README.md
|
2026-06-25 17:31:45 +08:00 |
|
shy3130
|
f1b41ca342
|
fix(financials): 全部同步改后台异步,修复点击无反应
根因:sync 路由同步阻塞调用 run_now(),全量同步 4 表 × 5500 标的需 ~2 分钟,
HTTP 请求长时间 pending 被浏览器/代理超时掐断,UI 表现为点击无反应。
后端:
- 抽出 _run_body() 同步逻辑本体;新增 trigger() 在后台线程执行,
并在持锁状态下立即置 _is_syncing=True(消除竞态窗口 + 防重复点击启动多线程)
- sync 路由改调 trigger(),立即返回 {started: bool},前端轮询 /status.syncing 看进度
前端:
- api.ts financialSync 返回类型改为 {started; reason?}
- Financials.tsx 同步状态以 status.syncing 为真值、isPending 兜底乐观态;
收尾时机改为监听 syncing 变 false(不再依赖瞬间触发的 onSettled);
被防并发跳过时弹 toast 提示
|
2026-06-25 15:53:31 +08:00 |
|
shy3130
|
37ebe19f1e
|
refactor(ai): 配置页单列卡片重构 + 移除无用的 Token 预算
- AI 设置页改为单列分卡片布局(Card/Field/Toggle 辅助组件),自定义配置卡
头部标注「Chat Completions」
- 移除从未实际生效的 ai_daily_token_budget(后端 config/api/settings +
前端 Settings 接口与保存参数 + UI)
- 测试结果不再展示 token 消耗,仅显示「连通成功 · 模型: xxx」
|
2026-06-25 15:53:15 +08:00 |
|
wshy
|
76ec644f35
|
chore(ai): 炸鸡中转站预设移至末尾,优惠 tag 改为赞助 (#12)
|
2026-06-25 10:57:02 +08:00 |
|
wshy
|
3380f97b3a
|
fix(ai): 随机 UA 按钮可重复点击 (#11)
之前按钮在文本框有内容时被 disabled + onClick 拦截,导致只能生成
一次。移除禁用逻辑,每次点击都覆盖生成新的 UA,符合随机按钮语义。
|
2026-06-25 10:54:15 +08:00 |
|
wshy
|
7c81a03026
|
feat(ai): 可配置 User-Agent 绕过 Cloudflare 等 CDN 拦截 (fix #8) (#10)
问题(Issue #8): AI API 反代到 Cloudflare 后,OpenAI SDK 默认 UA
(OpenAI/Python) 被 Bot Fight Mode 拦截,报 'Your request was blocked'。
方案: 后端始终发送浏览器风格 UA,默认内置 Chrome UA(开箱即用);
AI 设置页提供开关 + 随机生成/手动粘贴的自定义 UA。
后端(config.py / settings.py / ai_generator.py / strategy.py):
- 新增 ai_user_agent 配置项,默认桌面 Chrome UA
- 两处 OpenAI client 创建均注入 default_headers={User-Agent}
(ai_generator 实际生成 + strategy 测试连通性)
- 空 UA 自动回退内置默认,保证默认状态即绕过拦截
前端(api.ts / AI.tsx):
- 自定义 UA 开关:默认关闭(用内置默认),开启才显示输入框
- 随机生成按钮: 产出近期 Chrome 桌面 UA(Win/Mac/Linux 随机)
- 已有自定义 UA 时开关默认开启
不影响直连官方 OpenAI/DeepSeek 的用户(官方不校验 UA)。
|
2026-06-25 10:49:10 +08:00 |
|
wshy
|
acd30dd728
|
fix(pipeline): free/none 档降级时误调实时行情接口 (#9)
从 expert 切换到 free 档后,本地 kline_daily 仍保留今天实时落盘的数据,
导致 run_now() 中 today_exists=True,误入实时行情覆写分支调
quotes.get_by_universes()。但 free/none 档走 free-api 服务器,无实时行情
端点,调用报错或返回空,当天日K数据可能异常。
根因:分支①只判断「今天有无数据」,未判断「当前档位有无实时行情能力」。
sync_daily_by_quotes 内部也无 capability 守卫。
修复:分支①条件增加 capset.has(Cap.QUOTE_POOL)(starter+ 才有)。
free/none 档降级到 elif latest_daily 分支,用 klines.batch(period='1d')
历史日K接口刷新当天,这是 free 档唯一可用且正确的数据源。
|
2026-06-25 10:16:34 +08:00 |
|
shy3130
|
02be6dede8
|
fix(ci): PyInstaller 产物输出到 backend/dist, 与 tickflow.iss Source 路径一致
修复 Inno Setup 找不到打包产物的错误:
No files found matching ..\backend\dist\TickFlowStockPanel\*
原因: workflow 用 --distpath ../dist 输出到项目根 dist/, 但 .iss 引用的是 backend/dist/
修复: PyInstaller 用默认输出 (backend/dist), DMG/Linux 步骤路径同步调整
|
2026-06-25 00:35:13 +08:00 |
|
shy3130
|
2f02f69668
|
chore: 同步 VERSION 至 v0.1.43
|
2026-06-25 00:28:56 +08:00 |
|
shy3130
|
2d574c17e7
|
Merge feat/financials-sync-progress-and-ai-btn: 财务同步进度三态可视化 + AI分析占位按钮
|
2026-06-25 00:17:42 +08:00 |
|
shy3130
|
48946267f2
|
chore: 同步版本号
|
2026-06-25 00:17:31 +08:00 |
|
shy3130
|
388a929d0a
|
feat(financials): 同步进度三态可视化 + 点击即时反馈 + AI分析占位按钮
后端 (financial_sync.py):
- run_now 全量同步改为逐表执行, 每张完成立即更新 last_sync
(原一次性更新, 前端轮询看不到中间进度; 现在前端能逐步看到 N/4)
- 修复 sync_all 函数缩进被破坏导致的 NameError (上版引入的 bug)
前端 Financials.tsx:
- 点击同步即时反馈: useFinancialSync 加 onMutate 立即刷新 status
+ syncMut.isPending 兜底, 消除请求阻塞期间 UI 无变化
- 同步进度按本次同步算 (记录 syncStartedAt), 不再用 rows>0 判断
(修复已有数据时一开始就显示 4/4)
- 卡片三态可视化:
· 全量同步: 4 张卡片依次 等待(沙漏)→同步中(转圈)→完成(绿勾)
· 单表同步: 只有目标卡片变化, 其他卡片不受影响
- 顶部进度: 全量显示 N/4, 单表显示表名
- 每张卡片底部加最后同步时间
- 完成态用绿色对勾 (不用红色 bull), 卡片保持中性配色
StockFinancialDetail.tsx:
- 头部加 AI 财务分析占位按钮 (紫色 Sparkles), 点击提示开发中
|
2026-06-25 00:17:10 +08:00 |
|
shy3130
|
70cb75c6e6
|
Merge feat/data-clear-and-ui-fixes: 清除数据缓存修复 + UI 优化 + 权限门控 + 同步状态指示
本次合并内容:
- fix(backend): 清除数据彻底清空三层内存缓存 + 监控触发记录 + 版本号统一 + Windows GBK 编码修复
- feat(ui): 看板无数据提示优化 + 数据页无 Key 引导 + 设置页文案
- fix: 权限门控避免 free/starter 报错 + 概念分析数据源失效容错
- feat(sidebar): 数据菜单项同步状态指示器 (转圈/完成闪烁)
|
2026-06-24 23:32:52 +08:00 |
|
shy3130
|
3d74abb1ed
|
chore: 同步版本号至 0.1.42 (VERSION/__init__/pyproject/package.json)
|
2026-06-24 23:25:22 +08:00 |
|
shy3130
|
5e1e1a7529
|
feat(sidebar): 数据菜单项同步状态指示器 (转圈/完成闪烁)
- 轮询 pipelineJobs: 有活跃 job 每 2s, 无活跃每 15s
- 同步中: 数据菜单项右侧显示蓝色转圈 Loader2
- 同步完成: 切换为绿色对勾 CheckCircle2 + pulse 闪烁, 3 秒后消失
(用 ref 检测 isDataSyncing true→false 跳变触发)
|
2026-06-24 23:24:51 +08:00 |
|
shy3130
|
6c0a1bd5e6
|
fix: 权限门控避免 free/starter 报错 + 概念分析数据源失效容错
StockPanel:
- 财务指标请求增加 FINANCIAL 能力判断, 无能力时不请求
(修复 free/starter 点个股弹 'capability not available: financial' 报错)
Indices:
- 指数分时区无 kline.minute.batch (Pro+) 能力时显示锁提示, 不请求接口
ConceptAnalysis:
- 配置的 configId 失效 (扩展数据被删) 时自动回退 pickBestConfig, 避免报错
- 空状态也显示配置按钮, 让用户能重新选择数据源
ExtDimensionAnalysis:
- 顶部数据源/分组字段配置区始终显示 (去掉 !menu 条件)
|
2026-06-24 23:24:38 +08:00 |
|
shy3130
|
00a30597bd
|
feat(ui): 看板无数据提示优化 + 数据页无 Key 引导 + 设置页文案
Dashboard:
- hasNoData 改用 trading_days 判断 (后端 status rows 恒为 0 导致提示无法消除)
- 无数据提示改 warning 黄色风格 + AlertTriangle 图标
- 无数据/无 Key 两提示互斥: 无 Key 优先, 有 Key 无数据才显示同步提示
- API Key 横幅: 邀请码加复制按钮, 文案调整
Data:
- 无 Key 时立即同步按钮置灰禁用 + 显示未配置提示
- 指数数据卡片设置按钮与其它卡片一致 (有数据才显示)
System:
- '清理浏览器缓存' 改名 '刷新前端缓存', 避免误导为清数据
|
2026-06-24 23:24:25 +08:00 |
|
shy3130
|
37f4d61e3a
|
fix(backend): 清除数据彻底清空三层内存缓存 + 监控触发记录 + 修复版本号
修复清除数据后看板/监控仍显示旧数据的根因:
数据缓存清理 (repository/screener/overview):
- repository.py: 新增 clear_cache() 无条件清空全部 Polars 内存缓存;
修复 _refresh_enriched() 磁盘无数据时不清内存导致旧数据残留的 bug
- screener.py: 新增 clear_history_cache() 清进程级 _history_cache (TTL 缓存)
- overview.py: 新增 invalidate_overview_cache() 清看板聚合结果 5s TTL 缓存
清除数据完整性 (data.py):
- clear_data 删除 parquet 后统一调用三层缓存清理
- 新增清除监控运行数据: alert_store.clear() 清 alerts.jsonl + _pending_alerts 内存队列
(原 clear_data 漏删 user_data/alerts.jsonl, 导致触发记录清不掉)
版本号统一:
- /api/data/version 改为优先读 app.__version__ (与 /health 同源),
原 pyproject.toml 路径解析有误读不到, 回退到陈旧的 VERSION 文件
- Windows GBK 编码修复: __init__.py 强制 stdout/stderr UTF-8,
避免 TickFlow SDK 输出含 emoji 的指数名称时崩溃 (gbk codec can't encode)
|
2026-06-24 23:24:04 +08:00 |
|
shy3130
|
2ea2844917
|
build(packaging): macOS 双架构 dmg 打包 + 新增 icns 图标 + README 下载说明
- README: 下载说明区分 macOS Apple Silicon(arm64) / Intel(x64) 两个 dmg
- generate_icon.py: 支持生成 .icns,重构图标生成逻辑
- 新增 packaging/icon.icns (macOS 图标资源)
- 更新 icon.ico (Windows 图标)
- tickflow.spec: 适配 macOS dmg 双架构打包配置
|
2026-06-24 18:31:47 +08:00 |
|
shy3130
|
b28355aacf
|
feat(dashboard): 看板无本地数据时显示提示条 + 跳转数据页同步按钮
- enriched/daily 两表均无数据时,顶部显示蓝色提示条
- 「前往同步」按钮 Link 跳转 /data 页面
- 与 none 档(无 key)黄色横幅区分显示
版本: 0.1.38
|
2026-06-24 18:07:43 +08:00 |
|
shy3130
|
5c492c1825
|
fix(tier): 乱填 key 误判为 free 档 —— 探测改走付费端点验证 key
根因(鸡生蛋蛋生鸡的循环依赖):
保存乱填 key 后 detect_capabilities → get_client() 读旧 capabilities.json
(此时还是 none 档)→ _should_use_free_server() 返回 True → 用
TickFlow.free() 探测 → free 服务器忽略 key, 日K成功 → 误判为 free 档。
修复:
_probe_real 改用探测专用客户端, 强制走付费端点(api.tickflow.org)验证
key 有效性, 不再依赖运行时的 get_client()(受旧缓存档位影响)。
乱填 key 在付费端点全部 AuthenticationError → 正确判定 none 档 + invalid。
版本: 0.1.37
|
2026-06-24 17:58:56 +08:00 |
|
shy3130
|
d4cfa29473
|
chore(ext-data): 放开 data/ext_data 版本控制,纳入 part.parquet 数据文件
- .gitignore: 从「仅 config.json」改为放行整个 data/ext_data 目录
- 提交扩展数据的 parquet 数据文件(gn_ths/hy_ths/kz_ths)
- ext_sxdata_ths 重命名为 ext_kz_ths(config.json)
|
2026-06-24 17:50:03 +08:00 |
|
shy3130
|
5b00cd1a74
|
Merge feat/tier-5level-none: API 检测重构为 5 档(新增「无」档)
|
2026-06-24 17:46:17 +08:00 |
|
shy3130
|
755c114390
|
feat(tier): API 检测重构为 5 档,新增「无」档 + 修复 CapabilityDenied 返回 500
检测逻辑(复权因子分水岭):
- 无 key / 乱填(连单只日K都拿不到) → none 档,不存 key,走 free-api 服务器
- 免费有效 key(有日K无复权) → free 档,存 key,走 free-api 服务器
- 付费 key(有复权) → starter/pro/expert,走 api.tickflow.org
主要改动:
- save_tickflow_key 改为先探后存:无效 key 不持久化,前端提示「Key 无效」
- none/free 档统一走 TickFlow.free(),实时行情开关置灰
- tiers.yaml 新增 none 档,free 档补 kline.daily.batch
- 注册 CapabilityDenied 全局 handler → 403(此前返 500)
- /health mode 三态化,watchlist 无行情能力时提前 return
- 看板页 none 档显示黄色升级提示(含邀请码超链接)
版本: 0.1.36
|
2026-06-24 17:44:58 +08:00 |
|
shy3130
|
c27c6ebda9
|
fix(ci): macOS 图标生成显式安装 Pillow
CI 上 uv sync --no-dev --extra desktop 不装 Pillow (它属于 backtest 的
matplotlib 依赖链, 非 desktop 运行时依赖), 导致 generate_icon.py 报
'No module named PIL'。本地能跑是因 venv 残留历史依赖, 属偶然不可靠。
显式 uv pip install pillow 再生成图标。
|
2026-06-24 15:14:54 +08:00 |
|
shy3130
|
212ddce7e2
|
fix(ci): 修复 macOS 构建两个失败点 (venv 发现 + 缺图标)
macOS 构建在 macos-26 runner 上失败, 两个独立问题, 均已本地验证通过:
1. uv pip install --project backend 报 'No virtual environment found'
macos-26 runner 上 --project 的 venv 自动发现不可靠。改为
working-directory: backend, 与 uv sync 步骤一致。
2. spec 打包时找不到 packaging/icon.icns
icon.ico 已入库 (Windows 用), 但 icon.icns 未入库 (macOS 专用产物)。
release.yml 此前无生成图标步骤, macOS 构建必然缺图标而崩。
新增 '生成 macOS 图标' 步骤 (仅 macos), 用 backend venv 里的 Pillow
(传递依赖) 跑 generate_icon.py 现场生成。
3. 打包步骤改为 backend cwd 执行, 用 --distpath/--workpath 显式指定
产物输出到项目根 dist/, 与后续 DMG 步骤路径保持一致。
本地完整验证 (生成图标 + pyinstaller) 成功产出 dist/TickFlowStockPanel.app。
|
2026-06-24 15:10:10 +08:00 |
|
shy3130
|
5041c6f66d
|
ci(release): macOS 仅构建 ARM64 包, 移除已不可行的 Intel 构建
原因 (经核实, 技术上无法产出可用 Intel 包):
1. GitHub 最后一个原生 Intel runner (macos-13) 已于 2025-12-04 退役;
2. 项目依赖 polars, 而 polars 自 1.33 起移除了 macOS x86_64 原生 wheel
(改 py3-none-any), 在 arm64 runner 上经 Rosetta 无法装出 x64 原生库,
产出的 Intel 包会在 polars 调用处崩溃。
改动:
- 平台矩阵移除 macos x64 项, runner 从 macos-14 升到 macos-26 (2026-02 GA, 免费)
- Release 下载表格删除 'macOS (Intel 芯片)' 行, 仅保留 Apple Silicon
- 注释说明放弃 Intel 的原因, 面向用户文案标注仅支持 Apple Silicon
|
2026-06-24 14:41:35 +08:00 |
|
shy3130
|
aba0deff8b
|
chore: gitignore 补全 macOS 本地构建产物 (.app/.dmg/.zip)
根目录产出的 PyInstaller .app 与 create-dmg .dmg 此前无忽略规则,
补全避免后续误提交 (backend/ 子目录规则已存在, 这次补根目录)。
|
2026-06-24 14:41:35 +08:00 |
|
shy3130
|
7042aca968
|
fix(ext-data): 上传 CSV 时自动转码 GBK/GB18030,修复 invalid utf-8 sequence
国内行情软件(同花顺/东财/通达信)及 Windows 中文 Excel 导出的 CSV 多为
GBK 系编码,而 Polars read_csv 默认按 UTF-8 解析,遇中文即抛
'invalid utf-8 sequence'。
新增 ensure_utf8_csv():先尝试 UTF-8(合法则原样返回,零副作用),
否则依次尝试 gb18030/gbk/gb2312/big5 转成 UTF-8 临时文件再交给 Polars。
覆盖上传(upload_data)与字段探测(detect_fields、parse_upload_file)三处入口,
无需新增依赖(编码均为 Python 标准库内置)。
|
2026-06-24 12:05:04 +08:00 |
|
wshy
|
50db048140
|
Merge pull request #4 from shy3130/fix/docker-build-and-static-mount
fix(docker): 修复国内网络构建失败与前端静态文件 404
|
2026-06-24 11:24:51 +08:00 |
|
shy3130
|
1efcf9d5df
|
fix(docker): 修复国内网络构建失败与前端静态文件 404
两个独立问题:
1. 构建阶段网络失败
- corepack 不读 npm 的 registry 配置, 且环境变量跨 RUN 不保留,
导致国内网络下 corepack 反复从 registry.npmjs.org 拉取 pnpm 失败。
- 改为直接 `npm install -g pnpm@9` (npm 会读取 .npmrc 镜像源) 彻底绕开。
- 新增 USE_CN_MIRROR/NPM_REGISTRY/PYPI_INDEX build-arg,
默认启用 npmmirror + 清华 PyPI, 可 --build-arg USE_CN_MIRROR=0 关闭。
2. 容器启动后 GET / 返回 404
- config.py 的 _PROJECT_ROOT 按开发布局 (<root>/backend/app/) 推导,
Docker 里 backend/app 被拷到 /app/app, 导致其错算到系统根目录 /,
static_dir 解析成不存在的 /frontend/dist, 静态挂载被跳过。
- 用 ENV 显式指定 STATIC_DIR / TIERS_YAML / DATA_DIR 指向容器内正确路径,
无需改动 Python 代码, 桌面版 (PyInstaller frozen) 逻辑不受影响。
|
2026-06-24 11:22:15 +08:00 |
|
shy3130
|
2b84f1a735
|
Merge branch 'pr-3'
|
2026-06-24 10:02:18 +08:00 |
|
shy3130
|
51058800d4
|
Merge remote-tracking branch 'origin/main' into pr-1
# Conflicts:
# packaging/generate_icon.py
# packaging/icon.ico
# packaging/tickflow.iss
|
2026-06-24 10:01:54 +08:00 |
|
shy3130
|
18be47abe8
|
feat: 桌面客户端完善 — 安装包/图标/系统通知/版本对齐
|
2026-06-24 00:18:46 +08:00 |
|
Dallas
|
9a5db87f45
|
fix:container name 空格错误
|
2026-06-23 23:43:14 +08:00 |
|
Dallas
|
d35e339d89
|
fix:docker build时的readme.md错误。
|
2026-06-23 23:06:16 +08:00 |
|
shy3130
|
5fd92b8377
|
feat: Release 说明加下载按钮 (markdown 链接直连附件)
- release.yml body 模板: 下载表格每行加「⬇️ 立即下载」按钮
· 用 $github.repository + 版本号变量拼稳定下载 URL
· CI 自动填充, 无需手动改链接
- v0.1.35 Release 已同步更新 (本地 gh release edit)
- 新增 generate_icon_designs.py (图标设计方案生成, 选定方案后产出最终 ico)
|
2026-06-23 22:33:05 +08:00 |
|
shy3130
|
5721f1fe93
|
feat: Windows 打包改为 Inno Setup 安装包 (Setup.exe)
- 新增 packaging/tickflow.iss: Inno Setup 脚本
· 用户目录安装 (不弹 UAC), 桌面+开始菜单快捷方式
· 卸载时询问是否删除用户数据
· 内置简中语言包 (ChineseSimplified.isl, 官方仓库获取)
- 新增 packaging/generate_icon.py + icon.ico: 应用图标
· 与 favicon.svg/Logo.tsx 一致 (紫色方括号 + K线)
· 用 Pillow 绘制, 多尺寸 (16/32/48/64/128/256)
- spec 加 icon: exe 图标 = 安装包图标 = 快捷方式图标
- release.yml: Windows 步骤改为 choco install innosetup + ISCC 编译
- 本地验证通过: 安装→快捷方式→启动→health 0.1.35 全 OK
|
2026-06-23 22:26:31 +08:00 |
|