vincent
|
2a759d655d
|
fix(BIZ-109): 扩大临时白名单范围,修复刘总验收仍报 401 的问题
- v1 白名单仅覆盖 /api/records + /api/history 根路径,遗漏:
* /api/records/<id>/preview(GET 子路径)→ 刘总报「预览未授权」
* /api/records/<id>/compare(GET 子路径)→ 刘总报「比对未授权」
* /api/download/<path>(GET 子路径)→ 刘总报「下载未授权」
* /api/statistics(GET 根路径)→ 刘总报「统计分析不见」
* POST /api/generate(号码生成)→ 刘总报「号码生成未授权」
- v2 策略(按方法 + 路径前缀):
* GET 类全部放行(含子路径):/api/records*, /api/history, /api/statistics, /api/download
* POST /api/generate 放行(核心功能)
* DELETE 类保留鉴权(防误删滥用)
* 其他 POST 保留鉴权
- 验证:8 个接口全验证(5 个原 401 现 200,DELETE 仍 401)
- 跟踪:BIZ-110 由 costcodev 适配前端后撤白名单
- 备份:app.py.bak.biz109.v1.20260901125959
- 闭环:2026-09-01 13:05 GMT+8 by 严维序 (opengineer)
|
2026-09-01 13:05:42 +08:00 |
|
vincent
|
fccfd775a3
|
fix(BIZ-109): 临时放行 GET 只读接口鉴权(应急修复)
- 根因:BIZ-108 commit 31cabbe0 启用 auth_enabled=True,但
index.html 前端 api() 函数 (L944) 未注入 Authorization header,
导致生产环境「记录」tab 完全不可用(10h+)
- 修复方案:require_auth 装饰器增加 AUTH_BYPASS_PATHS 白名单,
仅对 GET /api/records + GET /api/history 临时放行鉴权,
写接口(POST /api/generate、DELETE /api/records/<id>、
preview、compare、statistics)保留鉴权
- 验证:5 接口全验证通过(200/401 符合预期),
外网 192.168.1.99:8085 访问正常
- 跟踪:BIZ-110 由 costcodev 适配前端后移除白名单
- 备份:app.py.bak.biz109.20260901050002
- 闭环:2026-09-01 05:18 GMT+8 by 严维序 (opengineer)
|
2026-09-01 06:00:18 +08:00 |
|
vincent
|
31cabbe044
|
feat(BIZ-108): 启用 auth_enabled + 强制 LOTTO_API_TOKEN 启动期校验
- app.py L137: 删除 'lotto2026' 默认 token 兜底
- app.py L138: auth_enabled: False → True
- app.py L147+: 启动期强制校验 token 长度 ≥ 32 字符
- 缺失或过短 → RuntimeError fail-fast,避免静默使用默认 token
- 配套 /etc/lotto/env(root:root, 0600 权限)落盘强随机 token
验证:
- /api/status 报 auth_enabled:true
- 无/错 token → 401,正确 token → 200
- 8 个接口鉴权全部生效(generate/records/preview/compare/statistics/history/status/delete)
- BIZ-105 字段契约保持(waiting 路径零污染)
|
2026-08-31 14:23:21 +08:00 |
|
徐聪
|
5d459b4505
|
feat(BIZ-105): 记录-比对 中奖金额展示 v1.2 实施
PRD v1.2 §4.3 落地,参考 BIZ-102 PRD 与 UI 原型。
后端(app.py):
- 新增 PRIZE_AMOUNT / PRIZE_KEY_MAP 常量双表(PRD §4.3)
- 新增 format_amount 千分位格式化(PRD §3.2:紧邻「元」不空格)
- 新增 compute_prize_summary 聚合函数
- api_compare_record 接口扩展:
- 单注:prize_amount + prize_amount_display 字段
- 顶层:total_prize / total_prize_display / has_variable_prize /
prize_summary / prize_display 字段
- 一/二等奖标记为浮动奖(历史数据无奖池字段),不计入 total_prize
前端(index.html):
- 总中奖金额字段(橙色「含浮动奖」角标)
- 中奖奖项汇总表(不含浮动奖金额)
- 浮动奖橙色提示条(区别于固定奖绿色 #1e8e4a)
- 每注金额 badge(固定奖绿 / 浮动奖橙)
测试(tests/test_compare_prize.py):
- 31 个用例,100% 通过
- 覆盖:6 档奖金档 / 未中奖 / waiting 契约 / 0 注 / 全中奖 /
仅有浮动奖 / 混合 / Mock 一致性(验收 #16)/ 响应结构契约
- running: pytest tests/test_compare_prize.py -v → 31 passed
不变项:比对算法 / 归期规则 / Excel 解析 / 认证 — 全部不动。
Co-authored-by: multica-agent <github@multica.ai>
|
2026-08-31 04:45:06 +08:00 |
|
vincent
|
93295db357
|
refactor(BIZ-87): P2/P3 迭代——代码质量改进
P2-1: 删除死代码 load_latest_draw() 和 find_next_draw_after()
- 两个函数在修复后已无任何调用点,删除避免误导维护者
P2-2: 抽取 row_to_draw 为模块级 _row_to_draw() 公共函数
- 消除三处重复代码,统一调用入口
P2-3: compare_type 细化为 same_day / cross_day / waiting
- 原 'current' 语义模糊,现区分同日 vs 跨日归属
P2-4: 边界条件修复 <= → <
- 严格对齐规则 2.2:生成时间 ≥ 20:00 归属下一期
- 恰好 20:00:00 现在正确归属下一期
P3: 删除不可达的 elif 死分支
- 移除注释已说明不会到达的防御性代码
验证:8 个测试用例全部通过(含 20:00:00 边界)
Co-authored-by: multica-agent <github@multica.ai>
|
2026-07-09 08:23:21 +08:00 |
|
vincent
|
52bee5f2e5
|
fix(BIZ-87): 修复中奖比对算法——按生成时间匹配正确期号
问题:所有生成记录都在比对最新一期开奖,而非根据生成时间匹配对应期号。
修复:
- 新增 find_draw_by_gen_time() 函数,采用窗口归属模型
- 每个开奖日 D 的归属窗口为 (D_prev 20:00, D 20:00]
- 生成时间落在哪个窗口内 → 与该开奖日 D 比对
- 规则 2.1:生成时间 < 开奖日 20:00 → 与当日开奖比对
- 规则 2.2:生成时间 ≥ 开奖日 20:00 → 与下次开奖日比对
- 超过所有开奖日 → 返回 waiting 状态
修改 api_compare_record() 使用新函数替换 load_latest_draw + find_next_draw_after 逻辑
测试验证:
- gen 6/29 10:00 → 6/30 2026074 ✅
- gen 6/28 19:00 → 6/28 2026073 ✅
- gen 6/28 21:00 → 6/30 2026074 ✅
- gen 7/4 18:22 → waiting(7/5 未开奖)✅
Co-authored-by: multica-agent <github@multica.ai>
|
2026-07-09 07:56:43 +08:00 |
|
vincent
|
e43862be9f
|
feat: 生成记录预览 + 中奖比对功能
功能一:生成记录预览
- 新增 API /api/records/<id>/preview 读取 Excel 返回号码数据
- 前端记录列表新增「预览」按钮,弹窗展示号码表格
- 支持最多显示100注,完整数据可通过下载按钮获取
功能二:中奖比对
- 新增 API /api/records/<id>/compare 根据生成时间匹配开奖数据
- 比对规则:生成时间 < 开奖日20:00 → 与当日开奖比对;≥ 20:00 → 与下次开奖日比对
- 按双色球官方规则判断一等奖至六等奖
- 前端记录列表新增「比对」按钮,弹窗展示比对结果
- 中奖号码高亮显示,未中奖号码半透明
- 若下次开奖尚未举行,返回等待状态提示
Co-authored-by: multica-agent <github@multica.ai>
|
2026-07-06 04:06:42 +08:00 |
|
vincent
|
462f1505ee
|
fix: 修复代码审查P2/P3问题
P2:
- lottery.py 改为引用 history_loader.py 公共模块,删除独立 Excel 加载逻辑
- 删除 lottery.py 中不再使用的 _normalize_history_format 方法(已迁移到 history_loader)
P3:
- app.py: 删除未使用的 import shutil
- app.py: 删除不可达代码 return stats
- app.py: 修复 api_history 中奇偶形态字段映射错误(奇偶比→奇偶形态)
- app.py: api_history columns 列表补充奇偶比和奇偶形态字段
- 开发文档目录结构补充 history_loader.py 和 web_executor.py 废弃标记
Co-authored-by: multica-agent <github@multica.ai>
|
2026-07-04 09:21:43 +08:00 |
|
vincent
|
5cebbfa433
|
fix: 修复代码审查反馈全部问题
审查意见修复清单:
P1 列映射语义修复 (lottery.py):
- _normalize_history_format() 不再将红球2-6映射到开机号/和值特征/奇偶比等
格式A不含这些特征字段,缺失列留空,前端做降级显示
- 删除已用于构建号码列的原始分列,避免数据重复
P2 架构优化:
- 提取 Excel 兼容逻辑到公共模块 history_loader.py
lottery.py 和 app.py 共同引用,消除三处重复代码
- web_executor.py 标记为已废弃,功能已整合到 app.py
部署修复:
- 删除 deploy/lotto-web.service (旧服务),仅保留 lotto-app.service
- 更新 deploy/DEPLOY.md: 端口5000→8085, 接口清单更新, 添加迁移说明
安全加固:
- API Token 改为环境变量读取: os.environ.get('LOTTO_API_TOKEN')
- 错误信息不再暴露内部异常,改为通用错误消息+日志记录
- 目录遍历防护改用 os.path.realpath 检查最终路径
其他:
- .gitignore 补充排除 双色球历史数据.xlsx
- app.py 引用公共模块,简化 get_statistics_data 和 load_history_dataframe
测试验证: 全部 API 测试通过,120条历史数据正确解析
Issue: BIZ-75
|
2026-07-04 01:28:57 +08:00 |
|
vincent
|
5d5e77000e
|
fix: 修复历史数据Excel格式兼容问题 + 完善开发文档
核心修复:
- lottery.py: load_history_data() 添加多格式Excel检测逻辑
支持 格式A(双行header: 新列名+旧列名) 和 格式B(标准列名)
- lottery.py: parse_numbers() 新增拼接字符串(14位无分隔符)直接解析
避免 re.findall 将整个号码串视为单个数字的问题
- app.py: load_history_dataframe() 同步修复多格式兼容逻辑
新增:
- docs/开发文档-双色球WebUI-v1.0.md: 完整开发文档
- deploy/backup.sh: 备份脚本
测试结果:
- 120条历史数据全部正确解析
- 号码生成API正常工作
- 全部API接口测试通过
Issue: BIZ-75
|
2026-07-03 23:05:58 +08:00 |
|
vincent
|
cf4b5764b5
|
feat: BIZ-75 双色球系统改进
1. P1: 合并双 Flask 服务 — web_executor.py 功能整合到 app.py
- /fetch → 抓取控制台页面
- /api/fetch/status → 抓取状态查询
- /api/fetch/execute → 触发抓取(后台线程异步)
- web_console.html API 路径已更新
2. P1: fetch_data.py 增加重试机制 + 请求间隔
- REQUEST_DELAY=2s, MAX_RETRIES=3, RETRY_DELAY=5s
- 修复缩进 bug(try/except 块缩进错误)
3. P0: 修复 Excel 数据格式兼容性
- fetch_data.py: 跳过网页 header 行,使用标准列名保存
- app.py: 新增 load_history_dataframe() 智能加载函数
- 兼容新旧两种 Excel 格式(一行/两行 header)
- 统一列名: 开奖时间|期数|号码|开机号|和值特征|奇偶比|大小比|奇偶形态|跨度|其他
4. 运维: 创建 lotto-app.service systemd 单元
5. 修复 .gitignore(排除运行时数据文件和备份)
6. 创建 requirements.txt
|
2026-07-03 17:41:15 +08:00 |
|
vincent
|
ae5d7a08ff
|
fix: P0 — records 并发写入加锁 + 原子写入
BIZ-74 P0 改进项:
- 新增 threading.Lock (records_lock) 保护 .generation_records.json
- load_records / save_records / add_record 全部持锁
- api_delete_record 也加锁保护读-改-写
- 原子写入:先写 .tmp 再 os.replace,防止写入中途崩溃
并发测试验证:
- 10 线程并发写入,0 丢失
- 并发读写互不阻塞
- 无残留 .tmp 文件
评审②改进项,BIZ-74
|
2026-07-03 16:41:57 +08:00 |
|
vincent
|
13a259b0f8
|
chore: initial commit — existing lottoData codebase
Files:
- lottery.py (1189 lines) — DoubleColorBallGenerator core engine
- fetch_data.py (131 lines) — history data fetcher from 55128.cn
- web_executor.py (216 lines) — data fetch Web console (Flask :5000)
- app.py (505 lines) — number generation Web service (Flask :8085)
- index.html (1171 lines) — frontend SPA
- web_console.html (323 lines) — fetch console frontend
- deploy/ — systemd service + cron script + logs
BIZ-74 architecture review baseline
|
2026-07-03 16:39:21 +08:00 |
|