Files
Lottery/docs/PRD-操作界面系统.md
T
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

22 KiB
Raw Blame History

产品需求文档(PRD):双色球操作界面系统

1. 背景与目标

业务背景

基于已有的 lottery.py 号码生成逻辑,需要开发一个 Web 操作界面系统,让用户可以通过 PC 网页端和手机端方便地操控双色球号码生成、查看历史数据、管理生成记录。系统需支持远程访问,生成的数据可随时读取。

解决的问题

  1. 命令行操作门槛高,普通用户难以使用
  2. 无法随时随地访问和管理数据
  3. 缺少可视化的数据展示和管理界面
  4. 生成的 Excel 文件分散,难以统一管理

成功指标

  • PC 和手机端均可正常访问操作
  • 核心功能(生成号码、查看历史、下载数据)100% 可用
  • 内网环境下远程访问响应时间 < 2 秒
  • 数据导出成功率 100%

2. 用户故事

角色 用户故事 价值
普通用户 作为用户,我希望通过手机浏览器生成双色球号码,以便随时随地选号 移动便利性
数据管理员 作为管理员,我希望查看历史数据和生成记录,以便分析趋势 数据可追溯
分析师 作为分析师,我希望导出 Excel 数据进行深度分析,以便制定策略 数据可复用
运维人员 作为运维,我希望系统监听 0.0.0.0 并避免端口冲突,以便内网多设备访问 部署便利性

3. 功能需求

3.1 核心功能模块

模块一:号码生成

功能点 描述 优先级 验收标准
选择策略 用户可选择"高级策略"或"基础策略" P0 默认选中高级策略,切换无延迟
输入注数 用户输入要生成的注数(1-1000) P0 有输入验证,超出范围提示错误
立即生成 点击按钮后生成号码并在页面展示 P0 生成时间 < 3 秒(100 注内)
展示结果 以表格形式展示生成的号码,包含和值、奇偶比、大小比、跨度 P0 红球以蓝色圆形展示,蓝球以红色圆形展示
保存 Excel 将生成结果保存为 Excel 文件并提供下载 P0 文件格式正确,包含"生成号码"和"统计信息"两个 sheet

模块二:历史数据查看

功能点 描述 优先级 验收标准
热力图展示 展示红球热号/冷号、蓝球热号 P0 用颜色深浅表示频率,支持排序切换
统计面板 显示最常见奇偶比、大小比、和值范围、跨度范围 P1 数据与 lottery.py 计算结果一致
历史期数列表 展示双色球历史开奖数据列表 P1 支持分页,每页 20 条,支持按期号搜索

模块三:生成记录管理

功能点 描述 优先级 验收标准
记录列表 展示所有历史生成记录(时间、策略、注数、文件) P0 按时间倒序排列,支持分页
文件下载 提供历史生成文件的下载链接 P0 点击即可下载,文件名包含日期和注数
记录删除 允许用户删除单条或多条生成记录 P2 删除前有二次确认,删除后同步删除文件

模块四:数据导出 API

功能点 描述 优先级 验收标准
RESTful API 提供 GET /api/latest 接口获取最新生成数据 P1 返回 JSON 格式,包含所有字段
API 认证 简单 Token 认证机制 P1 请求需携带 Authorization header
CORS 支持 允许跨域访问 P1 配置 Access-Control-Allow-Origin

3.2 界面设计要求

PC 网页端

  • 响应式布局,支持主流浏览器(Chrome、Firefox、Edge、Safari)
  • 左侧导航栏:首页(生成)、历史数据、生成记录、系统设置
  • 主内容区自适应宽度
  • 生成号码页面:上方为策略选择和注数输入,中间为结果展示区,下方为操作按钮

手机端

  • 采用移动优先设计,触摸操作友好
  • 底部导航栏:首页、数据、记录
  • 生成号码页面:顶部为策略选择(下拉框),中间为注数输入(数字键盘),下方为生成按钮
  • 结果展示支持横向滑动查看完整信息
  • 字体大小适配移动端,关键信息(号码)字号放大

3.3 非功能需求

性能要求

  • 页面加载时间 < 2 秒(内网环境)
  • 号码生成响应时间 < 3 秒(100 注内)
  • 支持并发用户数:5 个同时操作

兼容性要求

  • PC 端:Chrome 80+、Firefox 75+、Edge 80+、Safari 13+
  • 移动端:iOS Safari 13+、Android Chrome 80+
  • 屏幕适配:PC(1280x720 及以上)、手机(375x667 及以上)

安全要求

  • 内网访问限制:通过防火墙规则限制仅内网 IP 可访问
  • 简单认证:配置文件存储访问 Token,防止未授权访问
  • 文件访问控制:仅允许下载 lottery 目录下的文件,防止目录遍历攻击

部署要求

  • 监听地址:0.0.0.0(支持内网任意设备访问)
  • 端口:提前与运维确认未使用端口(建议 8080-8099 范围内)
  • 服务器:192.168.1.99,路径 ~/Studio/lottoData/
  • 进程保活:使用 systemd 或 supervisor 确保服务异常后自动重启

4. 技术架构

4.1 技术栈选择

层级 技术 理由
后端框架 Flask 轻量级,与现有 lottery.py 兼容性好
前端框架 Vue.js 3 + Element Plus 响应式支持好,组件丰富
移动端适配 Vant UI 移动端组件库,触摸友好
数据存储 本地文件系统 保持现有 Excel 存储方式,无需数据库
API 文档 Swagger/OpenAPI 便于调试和集成

4.2 系统架构图

┌─────────────────────────────────────────────────────────┐
│                    用户设备层                              │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐  │
│  │  PC 浏览器   │    │  手机浏览器  │    │  API 客户端   │  │
│  └──────┬──────┘    └──────┬──────┘    └──────┬──────┘  │
│         │                  │                  │          │
│         └──────────────────┼──────────────────┘          │
│                           │ HTTP/HTTPS                    │
└───────────────────────────┼───────────────────────────────┘
                            │
┌───────────────────────────┼───────────────────────────────┐
│                    应用服务层 (Flask)                      │
│  ┌────────────────────────┴────────────────────────┐     │
│  │                路由控制器                        │     │
│  │  ┌──────────┐  ┌──────────┐  ┌──────────┐      │     │
│  │  │ 号码生成  │  │ 历史数据  │  │ 记录管理  │      │     │
│  │  └──────────┘  └──────────┘  └──────────┘      │     │
│  └─────────────────────────────────────────────────┘     │
│                           │                               │
│  ┌────────────────────────┴────────────────────────┐     │
│  │              业务逻辑层                           │     │
│  │         (集成 lottery.py 核心逻辑)                │     │
│  └─────────────────────────────────────────────────┘     │
│                           │                               │
│  ┌────────────────────────┴────────────────────────┐     │
│  │                数据访问层                         │     │
│  │  ┌──────────┐  ┌──────────┐  ┌──────────┐      │     │
│  │  │ Excel 读写│  │ 文件管理  │  │ 缓存管理  │      │     │
│  │  └──────────┘  └──────────┘  └──────────┘      │     │
│  └─────────────────────────────────────────────────┘     │
└───────────────────────────────────────────────────────────┘
                            │
┌───────────────────────────┼───────────────────────────────┐
│                    数据存储层                              │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐   │
│  │历史数据.xlsx │    │ lottery/   │    │  配置文件   │   │
│  │             │    │ 生成文件    │    │  config.yaml│   │
│  └─────────────┘    └─────────────┘    └─────────────┘   │
└───────────────────────────────────────────────────────────┘

4.3 API 接口设计

4.3.1 号码生成

POST /api/generate
Request:
{
  "num_tickets": 10,
  "strategy": "advanced"  // 或 "basic"
}
Response:
{
  "success": true,
  "data": {
    "tickets": [...],
    "filename": "lottery/双色球模拟号码 -10 注 -20260619-001.xlsx",
    "download_url": "/api/download/lottery/双色球模拟号码 -10 注 -20260619-001.xlsx"
  }
}

4.3.2 获取统计数据

GET /api/statistics
Response:
{
  "success": true,
  "data": {
    "hot_reds": [1, 7, 13, 19, 23, 27, 31, 5, 11, 17],
    "cold_reds": [2, 8, 14, 20, 26, 32, 4, 10, 16, 22],
    "hot_blues": [3, 7, 11, 15, 9],
    "common_odd_even": "3:3",
    "common_size_ratio": "3:3",
    "sum_range": {"min": 73, "max": 148, "mean": 105.5},
    "span_range": {"min": 11, "max": 32, "mean": 23.8}
  }
}

4.3.3 获取生成记录

GET /api/records?page=1&page_size=20
Response:
{
  "success": true,
  "data": {
    "records": [
      {
        "id": "uuid",
        "created_at": "2026-06-19T10:30:00Z",
        "strategy": "advanced",
        "num_tickets": 10,
        "filename": "lottery/双色球模拟号码 -10 注 -20260619-001.xlsx",
        "download_url": "/api/download/..."
      }
    ],
    "total": 150,
    "page": 1,
    "page_size": 20
  }
}

4.3.4 下载文件

GET /api/download/{filepath}
Headers: Authorization: Bearer {token}
Response: 文件流 (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)

4.3.5 获取最新数据(API 客户端用)

GET /api/latest
Headers: Authorization: Bearer {token}
Response:
{
  "success": true,
  "data": {
    "latest_record": {...},
    "statistics": {...}
  }
}

5. 原型与界面设计

5.1 页面流程图

首页
 ├── 选择策略(高级/基础)
 ├── 输入注数
 ├── 点击"生成号码"
 │    └── 加载动画(生成中...)
 │         └── 展示结果表格
 │              ├── 查看前 10 注(默认)
 │              ├── 展开查看全部
 │              ├── 下载 Excel
 │              └── 继续生成
 │
历史数据
 ├── 热力图(红球/蓝球)
 ├── 统计面板
 └── 历史期数列表(分页)
 │
生成记录
 ├── 记录列表(时间倒序)
 ├── 搜索(按期号/日期)
 └── 单条操作:下载 | 删除
 │
系统设置
 ├── 端口配置
 ├── Token 管理
 └── 文件存储路径

5.2 关键界面描述

界面 1:首页 - 号码生成(PC 端)

┌────────────────────────────────────────────────────────┐
│  Logo   双色球号码生成系统          [历史数据] [生成记录]   │
├────────────────────────────────────────────────────────┤
│                                                        │
│  ┌──────────────────────────────────────────────────┐ │
│  │  生成策略:○ 高级策略  ○ 基础策略                  │ │
│  │  生成注数:[____] 注 (1-1000)                     │ │
│  │                                                  │ │
│  │           [   立即生成   ]                        │ │
│  └──────────────────────────────────────────────────┘ │
│                                                        │
│  生成结果                                              │
│  ┌──────────────────────────────────────────────────┐ │
│  │ 序号 │ 红球 1 │ 红球 2 │ ... │ 蓝球 │ 和值 │ 奇偶比│ │
│  │  001 │  05  │  12  │ ... │  09  │  87  │  3:3  │ │
│  │  002 │  08  │  15  │ ... │  14  │  92  │  4:2  │ │
│  │  ... │  ... │  ... │ ... │  ... │  ... │  ...  │ │
│  └──────────────────────────────────────────────────┘ │
│                                                        │
│  [下载 Excel]  [继续生成]                              │
│                                                        │
└────────────────────────────────────────────────────────┘

界面 2:首页 - 号码生成(手机端)

┌─────────────────────────┐
│  双色球号码生成系统      │
├─────────────────────────┤
│                         │
│  策略:[高级策略 ▼]     │
│  注数:[____]           │
│                         │
│    [  立即生成  ]       │
│                         │
│  ┌───────────────────┐ │
│  │ 第 001 注           │ │
│  │ 🔴 05 12 19 23 27 │ │
│  │    31 🔵 09       │ │
│  │ 和值 87 奇偶 3:3   │ │
│  └───────────────────┘ │
│                         │
│  [下载] [继续]          │
│                         │
├─────────────────────────┤
│ 首页 │ 数据 │ 记录      │
└─────────────────────────┘

界面 3:历史数据 - 热力图

┌────────────────────────────────────────────────────────┐
│  红球热力图(出现频次)                                   │
│                                                        │
│  01 [████████] 120 次    17 [██████████] 135 次        │
│  02 [██████]   95 次     18 [████████]   122 次        │
│  03 [████████████] 142 次 19 [██████████]  138 次      │
│  ...                                                 │
│                                                        │
│  蓝球热力图                                            │
│  01 [██████]   88 次     09 [████████]   118 次       │
│  02 [████]     75 次     10 [██████]     92 次        │
│  ...                                                 │
└────────────────────────────────────────────────────────┘

6. 排期建议

开发排期(参考历史估算)

阶段 任务 预估工时 负责人
第一阶段 Flask 后端框架搭建 + 集成 lottery.py 4 小时 徐聪
第二阶段 API 接口开发(生成、查询、下载) 6 小时 徐聪
第三阶段 PC 端前端页面开发(Vue3 + Element Plus) 8 小时 苏锦绘
第四阶段 移动端适配(Vant UI) 6 小时 苏锦绘
第五阶段 部署配置 + 端口协调 + 系统测试 4 小时 严维序
第六阶段 产品验收 + Bug 修复 4 小时 沈路明

总预估工时: 32 小时(约 4 个工作日)

关键依赖

  • 运维需提前确认 192.168.1.99 服务器上的可用端口
  • lottery.py 业务逻辑已审核通过,无需调整
  • 历史数据文件路径:~/Studio/lottoData/双色球历史数据.xlsx

7. 风险与应对

需求风险

风险 概率 影响 应对方案
移动端适配工作量大 中 中 优先保证核心功能,复杂交互在 PC 端使用
用户对 Excel 格式有特殊要求 低 低 保留配置扩展性,支持自定义列

技术风险

风险 概率 影响 应对方案
端口冲突 中 高 提前与运维确认端口表,配置文件中可调整端口
大文件下载超时 低 中 添加进度条,支持断点续传
并发访问性能瓶颈 低 中 限制单 IP 请求频率,添加请求队列

安全风险

风险 概率 影响 应对方案
内网穿透导致外网访问 低 高 防火墙规则限制,仅允许内网网段
Token 泄露 中 中 定期更换 Token,配置文件权限限制

8. 部署与运维

8.1 服务器配置

  • 服务器: 192.168.1.99
  • 路径: ~/Studio/lottoData/
  • 账号: vincent
  • 监听: 0.0.0.0:{PORT}(PORT 由运维分配)
  • 进程管理: systemd 或 supervisor

8.2 端口分配要求

请运维工程师提前维护各服务器端口使用表,本项目需分配一个未使用的端口(建议范围 8080-8099)。

8.3 防火墙规则

# 仅允许内网访问
iptables -A INPUT -p tcp --dport {PORT} -s 192.168.0.0/16 -j ACCEPT
iptables -A INPUT -p tcp --dport {PORT} -j DROP

8.4 服务启动脚本

# systemd 配置示例
[Unit]
Description=Lottery Web Service
After=network.target

[Service]
Type=simple
User=vincent
WorkingDirectory=/home/vincent/Studio/lottoData
ExecStart=/home/vincent/Studio/lottoData/.venv/bin/python app.py
Restart=always

[Install]
WantedBy=multi-user.target

9. 验收标准

功能验收

  • PC 端可正常访问并完成号码生成、查看历史、下载文件
  • 手机端可正常访问并完成核心操作
  • 数据导出 API 可被远程调用
  • 生成的 Excel 文件与 lottery.py 直接运行结果一致

性能验收

  • 页面加载时间 < 2 秒(内网)
  • 100 注号码生成时间 < 3 秒
  • 支持 5 个并发用户同时操作

安全验收

  • 外网无法访问服务(防火墙限制)
  • 未携带 Token 无法调用 API
  • 无法通过路径遍历访问非 lottery 目录文件

10. 版本历史

版本 日期 变更内容 作者
v1.0 2026-06-19 初始版本,基于 lottery.py 业务逻辑 沈路明

11. 附录

11.1 数据字段定义

生成号码表字段:

  • 序号:数字,从 1 开始
  • 红球 1-6:数字 1-33
  • 蓝球:数字 1-16
  • 和值:6 个红球之和
  • 奇偶比:格式 "X:Y",如 "3:3"
  • 大小比:格式 "X:Y",如 "3:3"
  • 跨度:最大红球 - 最小红球

统计信息表字段:

  • 生成时间:DateTime
  • 生成策略:Text ("高级策略" 或 "基础策略")
  • 生成注数:Integer
  • 红球热号:Text (逗号分隔)
  • 红球冷号:Text (逗号分隔)
  • 蓝球热号:Text (逗号分隔)
  • 最常见奇偶比:Text
  • 最常见大小比:Text
  • 和值范围:Text ("最小值 - 最大值")
  • 跨度范围:Text ("最小值 - 最大值")

11.2 配置文件示例 (config.yaml)

server:
  host: 0.0.0.0
  port: 8085  # 运维分配的端口
  
security:
  api_token: "your-secret-token-here"
  allowed_networks:
    - "192.168.0.0/16"
    
storage:
  history_file: "双色球历史数据.xlsx"
  output_dir: "lottery"
  
display:
  default_tickets: 10
  max_tickets: 1000
  tickets_per_page: 20

PRD 完成时间: 2026-06-19
产品经理: 沈路明
状态: 待评审