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
This commit is contained in:
2026-07-04 01:28:57 +08:00
parent 5d5e77000e
commit 5cebbfa433
7 changed files with 370 additions and 270 deletions
+14 -21
View File
@@ -243,36 +243,29 @@ class DoubleColorBallGenerator:
df = df.copy()
df['号码'] = df.apply(build_number_string, axis=1)
# 重命名列到标准列名(保留原始列)
# 格式A -> 格式B 映射:
# 期号 -> 开奖时间(实存的是日期)
# 开奖日期 -> 期数(实存的是期号数字)
# 红球1 -> 号码(已在上面构建)
# 特别说 -> 跨度
# 其他列按顺序映射
# 重命名列到标准列名 — 仅映射有语义对应关系的列
# 格式A -> 格式B 语义映射:
# 期号 -> 开奖时间(实存的是日期)
# 开奖日期 -> 期数(实存的是期号数字)
# 特别号 -> 跨度
# 红球 1~6 和 蓝球 用于构建"号码"列后不再映射
# 格式A不含开机号/和值特征/奇偶比/大小比/奇偶形态等字段,留空
rename_map = {}
if '期号' in df.columns:
rename_map['期号'] = '开奖时间'
if '开奖日期' in df.columns:
rename_map['开奖日期'] = '期数'
if '蓝球' in df.columns and '特别号' in df.columns:
if '特别号' in df.columns:
rename_map['特别号'] = '跨度'
# 蓝球在格式B中不单独存在,尽量复用
# 但不开机号无直接对应
if '红球 2' in df.columns:
rename_map['红球 2'] = '开机号'
if '红球 3' in df.columns:
rename_map['红球 3'] = '和值特征'
if '红球 4' in df.columns:
rename_map['红球 4'] = '奇偶比'
if '红球 5' in df.columns:
rename_map['红球 5'] = '大小比'
if '红球 6' in df.columns:
rename_map['红球 6'] = '奇偶形态'
df = df.rename(columns=rename_map)
# 确保所有标准列都存在(补缺失列
# 删除已用于构建号码列的原始分列(避免数据重复
for col in [f'红球 {i}' for i in range(1, 7)] + ['蓝球']:
if col in df.columns:
df = df.drop(columns=[col])
# 确保所有标准列都存在(格式A缺失的字段留空)
for col in standard_columns:
if col not in df.columns:
df[col] = ''