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
This commit is contained in:
@@ -0,0 +1,396 @@
|
||||
# 产品需求文档(PRD):双色球数据抓取系统
|
||||
|
||||
## 版本历史
|
||||
| 版本 | 日期 | 变更内容 | 作者 |
|
||||
|------|------|----------|------|
|
||||
| v1.0 | 2026-06-19 | 初始版本 | 沈路明 |
|
||||
|
||||
---
|
||||
|
||||
## 1. 背景与目标
|
||||
|
||||
### 1.1 业务背景
|
||||
- 双色球作为中国最受欢迎的彩票类型,用户需要及时了解历史开奖数据进行分析和参考
|
||||
- 目前数据依赖人工查看,效率低且无法进行数据分析
|
||||
- 需要建立自动化数据抓取和展示系统,支持日常数据分析和研究
|
||||
|
||||
### 1.2 解决的问题
|
||||
1. **数据获取效率低**:人工访问网站查看开奖结果耗时且容易遗漏
|
||||
2. **数据难以分析**:网页数据无法直接用于 Excel 或其他分析工具
|
||||
3. **无法实时监控**:无法及时获取最新开奖数据
|
||||
4. **访问不便**:需要在局域网内便捷访问数据和管理工具
|
||||
|
||||
### 1.3 成功指标(可量化)
|
||||
- **数据准确性**:抓取数据与官方网站一致率 100%
|
||||
- **更新及时性**:开奖后 30 分钟内完成数据更新
|
||||
- **系统可用性**:Web 服务月可用性 ≥ 99%
|
||||
- **用户体验**:页面加载时间 < 2 秒(局域网环境)
|
||||
|
||||
---
|
||||
|
||||
## 2. 用户故事
|
||||
|
||||
| 角色 | 用户故事 | 价值 |
|
||||
|------|----------|------|
|
||||
| 数据分析员 | 作为数据分析员,我希望每天自动获取最新的双色球开奖数据,以便进行趋势分析 | 节省手动收集数据的时间,确保数据完整性 |
|
||||
| 普通用户 | 作为普通用户,我希望通过网页界面手动触发数据抓取并实时查看结果,以便确认系统正常运行 | 透明化系统运行状态,增强信任感 |
|
||||
| 系统管理员 | 作为系统管理员,我希望配置定时任务和时间,以便控制数据抓取的频率 | 灵活管理系统负载,避免频繁请求 |
|
||||
| 局域网用户 | 作为局域网用户,我希望能在家中任何设备上访问 Web 界面,以便随时随地查看数据 | 提升访问便利性,支持多设备使用 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 功能需求
|
||||
|
||||
### 3.1 数据抓取模块
|
||||
|
||||
| 功能点 | 描述 | 优先级 | 验收标准 |
|
||||
|--------|------|--------|----------|
|
||||
| 数据源接入 | 从 https://www.55128.cn/kjh/fcssq-history-120.htm 抓取近 120 期双色球开奖数据 | P0 | 能正确解析 HTML 并提取所有开奖数据,无遗漏 |
|
||||
| 增量更新 | 对比本地 Excel 文件,仅添加缺失的期数数据 | P0 | 不产生重复数据,新增数据准确率 100% |
|
||||
| 数据校验 | 抓取后进行数据完整性校验(期数连续性、号码格式等) | P1 | 发现异常数据时记录错误日志并告警 |
|
||||
| 错误重试 | 网络异常时自动重试(最多 3 次,间隔 5 秒) | P1 | 临时网络故障下成功抓取率 ≥ 95% |
|
||||
|
||||
### 3.2 数据存储模块
|
||||
|
||||
| 功能点 | 描述 | 优先级 | 验收标准 |
|
||||
|--------|------|--------|----------|
|
||||
| Excel 存储 | 数据以 Excel 格式存储,文件名为「双色球历史数据.xlsx」 | P0 | 文件格式正确,可用 Excel 正常打开 |
|
||||
| 字段定义 | 包含以下字段(见 4.1) | P0 | 所有字段完整,格式正确 |
|
||||
| 数据导出 | 支持导出为 CSV 格式(可选) | P2 | 导出数据与 Excel 一致,编码为 UTF-8 |
|
||||
|
||||
### 3.3 Web 界面模块
|
||||
|
||||
| 功能点 | 描述 | 优先级 | 验收标准 |
|
||||
|--------|------|--------|----------|
|
||||
| 手动触发抓取 | 提供"立即抓取"按钮,点击后执行抓取脚本 | P0 | 按钮点击后 3 秒内响应,显示执行状态 |
|
||||
| 实时日志展示 | 显示抓取过程的实时日志(包括开始时间、抓取期数、完成时间等) | P0 | 日志自动滚动,支持暂停查看,颜色区分正常/警告/错误 |
|
||||
| 数据概览 | 展示最新一期开奖号码(红球 6 个 + 蓝球 1 个) | P0 | 号码以球状展示,颜色正确(红球红色,蓝球蓝色) |
|
||||
| 历史数据表 | 展示 Excel 中的数据,支持分页和搜索 | P1 | 支持按期数搜索,分页加载(每页 20 条) |
|
||||
| 抓取状态监控 | 显示最近一次抓取时间、下次计划抓取时间、抓取状态(成功/失败) | P1 | 状态更新时间 < 5 秒延迟 |
|
||||
| 定时任务配置 | 提供界面配置定时任务的执行时间 | P0 | 配置后立即生效,无需重启服务 |
|
||||
| 响应式布局 | 支持桌面端和移动端访问 | P1 | 在主流手机浏览器上正常显示和操作 |
|
||||
|
||||
### 3.4 定时任务模块
|
||||
|
||||
| 功能点 | 描述 | 优先级 | 验收标准 |
|
||||
|--------|------|--------|----------|
|
||||
| Cron 定时任务 | 使用 Linux cron 实现每天自动抓取 | P0 | 任务配置正确,日志中可查到执行记录 |
|
||||
| 执行时间配置 | 默认为每天 21:30(开奖后 15 分钟) | P0 | 可通过 Web 界面修改执行时间 |
|
||||
| 任务开关 | 提供启用/禁用定时任务的开关 | P1 | 开关状态立即生效,界面显示当前状态 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 非功能需求
|
||||
|
||||
### 4.1 数据字段定义
|
||||
|
||||
**Excel 文件字段:**
|
||||
|
||||
| 字段名 | 类型 | 说明 | 示例 |
|
||||
|--------|------|------|------|
|
||||
| 开奖日期 | Date | 开奖日期 | 2026-06-18 |
|
||||
| 期数 | String | 双色球期号 | 2026069 |
|
||||
| 红球 1 | Integer | 第 1 个红球号码(1-33) | 12 |
|
||||
| 红球 2 | Integer | 第 2 个红球号码(1-33) | 14 |
|
||||
| 红球 3 | Integer | 第 3 个红球号码(1-33) | 16 |
|
||||
| 红球 4 | Integer | 第 4 个红球号码(1-33) | 17 |
|
||||
| 红球 5 | Integer | 第 5 个红球号码(1-33) | 18 |
|
||||
| 红球 6 | Integer | 第 6 个红球号码(1-33) | 32 |
|
||||
| 蓝球 | Integer | 蓝球号码(1-16) | 08 |
|
||||
| 和值 | Integer | 6 个红球号码之和 | 109 |
|
||||
| 奇偶比 | String | 红球奇偶比例 | 1:5 |
|
||||
| 大小比 | String | 红球大小比例(1-16 为小,17-33 为大) | 3:3 |
|
||||
| 开机号 | String | 开机号(如有) | 07,13,19,24,27,31+05 |
|
||||
| 跨度 | Integer | 红球最大值 - 最小值 | 20 |
|
||||
|
||||
### 4.2 性能要求
|
||||
|
||||
| 指标 | 要求 | 说明 |
|
||||
|------|------|------|
|
||||
| 抓取耗时 | < 30 秒 | 完成 120 期数据抓取和更新的总耗时 |
|
||||
| 页面加载 | < 2 秒 | Web 界面在局域网环境下的加载时间 |
|
||||
| 并发支持 | ≥ 5 个并发用户 | 支持至少 5 个用户同时访问 Web 界面 |
|
||||
| 内存占用 | < 200MB | Python 进程常驻内存占用 |
|
||||
|
||||
### 4.3 兼容性要求
|
||||
|
||||
| 维度 | 要求 |
|
||||
|------|------|
|
||||
| 操作系统 | Ubuntu 20.04+ / macOS 12+ |
|
||||
| Python 版本 | Python 3.8+ |
|
||||
| 浏览器 | Chrome 90+、Firefox 88+、Safari 14+、Edge 90+ |
|
||||
| 移动端 | iOS Safari 14+、Android Chrome 90+ |
|
||||
|
||||
### 4.4 安全要求
|
||||
|
||||
**局域网访问安全:**
|
||||
|
||||
| 安全项 | 方案 | 说明 |
|
||||
|--------|------|------|
|
||||
| 访问控制 | 仅监听 0.0.0.0,通过防火墙限制访问来源 | 只允许内网 IP 段访问(如 192.168.0.0/16) |
|
||||
| 身份验证 | 可选配置基本 HTTP 认证(用户名 + 密码) | 防止未授权访问,密码通过配置文件管理 |
|
||||
| 日志记录 | 所有访问和操作记录日志 | 包含时间、IP、操作类型、结果 |
|
||||
| 命令注入防护 | Web 界面不接受任何命令行输入 | 防止用户通过界面执行任意命令 |
|
||||
|
||||
### 4.5 可靠性要求
|
||||
|
||||
| 指标 | 要求 | 说明 |
|
||||
|------|------|------|
|
||||
| 服务可用性 | ≥ 99% | 月累计不可用时间 < 7.2 小时 |
|
||||
| 数据持久化 | 100% | 已抓取数据不丢失,异常情况自动备份 |
|
||||
| 断电恢复 | 自动恢复服务 | 系统重启后服务自动拉起(通过 systemd) |
|
||||
|
||||
---
|
||||
|
||||
## 5. 系统架构设计
|
||||
|
||||
### 5.1 技术选型
|
||||
|
||||
| 模块 | 技术栈 | 选型理由 |
|
||||
|------|--------|----------|
|
||||
| 数据抓取 | Python + requests + BeautifulSoup4 | 成熟的网页抓取方案,社区支持好 |
|
||||
| 数据存储 | openpyxl | 原生支持 Excel 读写,无需安装 Office |
|
||||
| Web 服务 | Flask | 轻量级,易部署,适合内部工具 |
|
||||
| 定时任务 | Linux Cron | 系统原生支持,稳定可靠 |
|
||||
| 前端 | HTML + CSS + JavaScript (jQuery) | 简单直接,无需构建流程 |
|
||||
| 日志 | Python logging | 标准库支持,灵活配置 |
|
||||
|
||||
### 5.2 目录结构
|
||||
|
||||
```
|
||||
/home/vincent/Studio/lottoData/
|
||||
├── lottery.py # 号码生成器(现有)
|
||||
├── 双色球历史数据.xlsx # 数据存储(现有)
|
||||
├── scraper.py # 数据抓取脚本(新建)
|
||||
├── app.py # Flask Web 应用(新建)
|
||||
├── config.py # 配置文件(新建)
|
||||
├── templates/ # HTML 模板(新建)
|
||||
│ └── index.html
|
||||
├── static/ # 静态资源(新建)
|
||||
│ ├── css/
|
||||
│ └── js/
|
||||
├── logs/ # 日志目录(新建)
|
||||
│ └── lottery.log
|
||||
└── requirements.txt # Python 依赖(新建)
|
||||
```
|
||||
|
||||
### 5.3 定时任务配置
|
||||
|
||||
**Cron 配置示例:**
|
||||
```bash
|
||||
# 每天 21:30 执行数据抓取
|
||||
30 21 * * * cd /home/vincent/Studio/lottoData && /usr/bin/python3 scraper.py >> logs/cron.log 2>&1
|
||||
```
|
||||
|
||||
**Systemd 服务配置(Web 服务):**
|
||||
```ini
|
||||
# /etc/systemd/system/lottery-web.service
|
||||
[Unit]
|
||||
Description=Lottery Data Web Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=vincent
|
||||
WorkingDirectory=/home/vincent/Studio/lottoData
|
||||
ExecStart=/usr/bin/python3 app.py
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
### 5.4 页面流程图
|
||||
|
||||
```
|
||||
用户访问 Web 界面
|
||||
↓
|
||||
加载首页(显示最新开奖数据 + 历史数据)
|
||||
↓
|
||||
┌──────────────┬──────────────┬──────────────┐
|
||||
│ │ │ │
|
||||
▼ ▼ ▼ ▼
|
||||
手动触发抓取 查看历史数据 配置定时任务 监控抓取状态
|
||||
↓ ↓ ↓ ↓
|
||||
显示执行日志 分页/搜索查看 修改执行时间 查看上次抓取结果
|
||||
↓ ↓ ↓ ↓
|
||||
更新数据表 导出数据 保存配置 显示下次执行时间
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. 接口设计
|
||||
|
||||
### 6.1 Web 接口
|
||||
|
||||
| 接口路径 | 方法 | 描述 | 请求参数 | 返回格式 |
|
||||
|----------|------|------|----------|----------|
|
||||
| `/` | GET | 首页 - 数据展示 | 无 | HTML |
|
||||
| `/api/scrape` | POST | 手动触发抓取 | 无 | JSON `{"status": "success", "message": "..."}` |
|
||||
| `/api/status` | GET | 获取系统状态 | 无 | JSON `{last_scrape_time, next_scheduled_time, status}` |
|
||||
| `/api/history` | GET | 获取历史数据 | `page`, `limit`, `search` | JSON `{"data": [...], "total": N}` |
|
||||
| `/api/config` | GET | 获取定时任务配置 | 无 | JSON |
|
||||
| `/api/config` | POST | 更新定时任务配置 | `enabled`, `cron_expr` | JSON `{"status": "success"}` |
|
||||
|
||||
### 6.2 日志格式
|
||||
|
||||
```
|
||||
[2026-06-19 21:30:01 INFO] 开始抓取数据...
|
||||
[2026-06-19 21:30:02 INFO] 成功访问数据源页面
|
||||
[2026-06-19 21:30:05 INFO] 解析到 120 条数据
|
||||
[2026-06-19 21:30:06 INFO] 本地现有数据:118 条
|
||||
[2026-06-19 21:30:06 INFO] 新增数据:2 条 (2026069, 2026068)
|
||||
[2026-06-19 21:30:07 INFO] 数据保存到 Excel 成功
|
||||
[2026-06-19 21:30:07 INFO] 抓取完成,耗时 6.2 秒
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. 排期建议
|
||||
|
||||
### 7.1 开发阶段划分
|
||||
|
||||
| 阶段 | 任务 | 预计耗时 | 依赖 |
|
||||
|------|------|----------|------|
|
||||
| 阶段 1 | 数据抓取脚本开发(scraper.py) | 2 小时 | 无 |
|
||||
| 阶段 2 | Web 服务开发(app.py + templates) | 3 小时 | 阶段 1 完成 |
|
||||
| 阶段 3 | 定时任务配置和系统部署 | 1 小时 | 阶段 2 完成 |
|
||||
| 阶段 4 | 测试和优化 | 2 小时 | 阶段 3 完成 |
|
||||
|
||||
**总预计耗时:8 小时**
|
||||
|
||||
### 7.2 关键依赖
|
||||
|
||||
1. **服务器访问权限**:需要能访问目标网站(55128.cn)
|
||||
2. **Python 环境**:需要安装 Python 3.8+ 和依赖包
|
||||
3. **局域网网络**:确保局域网内设备可以访问服务端口
|
||||
|
||||
---
|
||||
|
||||
## 8. 风险与应对
|
||||
|
||||
### 8.1 需求风险
|
||||
|
||||
| 风险 | 影响 | 概率 | 应对方案 |
|
||||
|------|------|------|----------|
|
||||
| 数据源网站结构变化 | 抓取脚本失效 | 中 | 1. 添加结构变更检测<br>2. 建立告警机制<br>3. 定期维护更新 |
|
||||
| 数据源网站反爬策略 | 被封 IP | 低 | 1. 控制请求频率<br>2. 添加 User-Agent<br>3. 必要时使用代理 |
|
||||
|
||||
### 8.2 技术风险
|
||||
|
||||
| 风险 | 影响 | 概率 | 应对方案 |
|
||||
|------|------|------|----------|
|
||||
| Excel 文件被占用 | 写入失败 | 低 | 1. 写入前检查文件锁<br>2. 使用临时文件 + 原子替换<br>3. 失败后重试 |
|
||||
| 网络不稳定 | 抓取失败 | 中 | 1. 实现重试机制<br>2. 记录失败原因<br>3. 邮件/消息告警 |
|
||||
| 端口冲突 | Web 服务启动失败 | 低 | 1. 启动前检查端口占用<br>2. 支持配置端口<br>3. 日志明确提示 |
|
||||
|
||||
### 8.3 安全风险
|
||||
|
||||
| 风险 | 影响 | 概率 | 应对方案 |
|
||||
|------|------|------|----------|
|
||||
| 未授权访问 | 数据泄露 | 中 | 1. 防火墙限制 IP 范围<br>2. 可选 HTTP 认证<br>3. 访问日志审计 |
|
||||
| 恶意请求 | 服务崩溃 | 低 | 1. 请求频率限制<br>2. 异常输入过滤<br>3. 服务监控 |
|
||||
|
||||
---
|
||||
|
||||
## 9. 验收标准
|
||||
|
||||
### 9.1 功能验收
|
||||
|
||||
- [ ] **数据抓取**:能从 55128.cn 成功抓取近 120 期数据
|
||||
- [ ] **增量更新**:不产生重复数据,仅添加缺失期数
|
||||
- [ ] **Web 界面**:能手动触发抓取并实时查看日志
|
||||
- [ ] **数据展示**:首页展示最新开奖号码和历史数据表
|
||||
- [ ] **定时任务**:配置 cron 后每天自动执行
|
||||
- [ ] **局域网访问**:其他设备能访问 Web 服务
|
||||
|
||||
### 9.2 质量验收
|
||||
|
||||
- [ ] **数据准确性**:与官方网站数据 100% 一致
|
||||
- [ ] **性能达标**:页面加载时间 < 2 秒(局域网)
|
||||
- [ ] **日志完整**:所有关键操作都有日志记录
|
||||
- [ ] **错误处理**:异常情况有明确提示和日志
|
||||
|
||||
### 9.3 文档验收
|
||||
|
||||
- [ ] **README 文档**:包含安装、配置、使用说明
|
||||
- [ ] **依赖清单**:requirements.txt 完整列出 Python 依赖
|
||||
- [ ] **部署文档**:Systemd 服务配置说明
|
||||
|
||||
---
|
||||
|
||||
## 10. 后续优化建议
|
||||
|
||||
### 10.1 短期优化(1 个月内)
|
||||
|
||||
1. **数据可视化**:增加号码分布图、冷热号统计等图表
|
||||
2. **告警通知**:抓取失败时通过邮件/微信通知
|
||||
3. **数据备份**:每天自动备份 Excel 文件到云存储
|
||||
|
||||
### 10.2 中期优化(3 个月内)
|
||||
|
||||
1. **数据库升级**:使用 SQLite/MySQL 替代 Excel,支持更复杂查询
|
||||
2. **API 开放**:提供 REST API 供其他系统调用
|
||||
3. **多彩种支持**:扩展支持大乐透、福彩 3D 等其他彩票
|
||||
|
||||
### 10.3 长期优化(6 个月内)
|
||||
|
||||
1. **数据分析平台**:集成数据分析工具,提供智能预测
|
||||
2. **移动端 App**:开发 iOS/Android 应用
|
||||
3. **多用户系统**:支持多个用户独立配置和使用
|
||||
|
||||
---
|
||||
|
||||
## 附录
|
||||
|
||||
### A. 依赖包清单
|
||||
|
||||
```txt
|
||||
# requirements.txt
|
||||
requests==2.31.0
|
||||
beautifulsoup4==4.12.2
|
||||
openpyxl==3.1.2
|
||||
flask==3.0.0
|
||||
lxml==4.9.3
|
||||
```
|
||||
|
||||
### B. 配置文件示例
|
||||
|
||||
```python
|
||||
# config.py
|
||||
import os
|
||||
|
||||
# 系统配置
|
||||
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
DATA_FILE = os.path.join(BASE_DIR, '双色球历史数据.xlsx')
|
||||
LOG_FILE = os.path.join(BASE_DIR, 'logs', 'lottery.log')
|
||||
|
||||
# 数据源
|
||||
DATA_SOURCE_URL = 'https://www.55128.cn/kjh/fcssq-history-120.htm'
|
||||
|
||||
# Web 服务配置
|
||||
WEB_HOST = '0.0.0.0'
|
||||
WEB_PORT = 5000
|
||||
DEBUG = False
|
||||
|
||||
# 定时任务配置
|
||||
CRON_ENABLED = True
|
||||
CRON_EXPR = '30 21 * * *' # 每天 21:30
|
||||
|
||||
# 安全配置(可选)
|
||||
AUTH_ENABLED = False
|
||||
AUTH_USERNAME = 'admin'
|
||||
AUTH_PASSWORD = 'your_password_here' # 建议通过环境变量设置
|
||||
```
|
||||
|
||||
### C. 数据来源说明
|
||||
|
||||
- **数据源**:彩吧助手 (www.55128.cn)
|
||||
- **数据更新时间**:每周二、四、日 21:15 开奖
|
||||
- **建议抓取时间**:开奖后 15 分钟(21:30)
|
||||
|
||||
---
|
||||
|
||||
**PRD 评审人:** 承哥
|
||||
**PRD 创建日期:** 2026-06-19
|
||||
**下次评审日期:** 开发完成后验收评审
|
||||
@@ -0,0 +1,361 @@
|
||||
# 产品需求文档(PRD):双色球自动化系统 Web UI
|
||||
|
||||
**文档版本**: v1.0
|
||||
**创建日期**: 2026-07-03
|
||||
**产品经理**: 沈路明
|
||||
**状态**: 待评审
|
||||
|
||||
---
|
||||
|
||||
## 1. 背景与目标
|
||||
|
||||
### 1.1 业务背景
|
||||
双色球自动化项目已完成核心功能开发(数据爬取、号码生成、统计分析),但缺乏统一的 Web 界面供用户(刘总及团队成员)便捷访问和使用。现有功能分散在多个 Python 脚本中,需要在网页端整合为一体化服务。
|
||||
|
||||
### 1.2 解决的问题
|
||||
- **访问门槛高**: 用户需要运行 Python 脚本才能生成号码,操作复杂
|
||||
- **数据不可视**: 历史数据、生成记录、统计信息无法直观查看
|
||||
- **无法局域网共享**: 缺少监听 0.0.0.0 的 Web 服务,无法在 PC/手机端跨设备访问
|
||||
- **功能分散**: 数据抓取、号码生成、历史记录查看分散在不同入口
|
||||
|
||||
### 1.3 成功指标(定量)
|
||||
| 指标 | 目标值 | 衡量方式 |
|
||||
|------|--------|----------|
|
||||
| 功能覆盖率 | 100% 核心功能 | PRD 功能清单验收 |
|
||||
| 响应式支持 | PC + 移动端 | 主流设备测试通过 |
|
||||
| 局域网可访问 | 0.0.0.0:8085 | 网络扫描验证 |
|
||||
| API 响应时间 | <2s (P95) | 压力测试 |
|
||||
| 用户满意度 | 刘总验收通过 | 评审会议确认 |
|
||||
|
||||
---
|
||||
|
||||
## 2. 用户故事
|
||||
|
||||
| ID | 用户角色 | 故事 | 价值 |
|
||||
|----|----------|------|------|
|
||||
| US-01 | 刘总(主要用户) | 作为用户,我希望在手机上打开网页就能生成双色球号码,以便随时查看推荐号码 | 便捷性、即时访问 |
|
||||
| US-02 | 刘总 | 作为用户,我希望查看历史开奖数据,以便分析号码趋势 | 数据驱动决策 |
|
||||
| US-03 | 刘总 | 作为用户,我希望查看历史生成记录并下载 Excel,以便存档和分享 | 数据持久化 |
|
||||
| US-04 | 团队成员 | 作为团队成员,我希望在 PC 端大屏查看统计数据,以便进行项目汇报 | 可视化展示 |
|
||||
| US-05 | 团队成员 | 作为运维人员,我希望服务监听局域网,以便多人同时访问 | 资源共享 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 功能需求
|
||||
|
||||
### 3.1 功能清单与优先级
|
||||
|
||||
| 功能模块 | 功能点 | 描述 | 优先级 | 验收标准 |
|
||||
|----------|--------|------|--------|----------|
|
||||
| **号码生成** | GEN-01 | 选择生成注数(1-1000) | P0 | 滑块/输入框可调,范围校验正确 |
|
||||
| | GEN-02 | 选择策略(基础/高级) | P0 | 下拉选择,高级策略调用热冷号分析 |
|
||||
| | GEN-03 | 执行生成并展示结果 | P0 | 点击生成后 3s 内返回结果,展示红球 + 蓝球 |
|
||||
| | GEN-04 | 结果页展示和值、奇偶比、大小比、跨度 | P0 | 每个号码下方显示统计指标 |
|
||||
| | GEN-05 | 下载 Excel 文件 | P0 | 点击下载可获取完整 Excel |
|
||||
| | GEN-06 | 生成记录自动保存 | P0 | 每次生成后记录存入 `.generation_records.json` |
|
||||
| **历史数据** | HIS-01 | 查看历史开奖数据列表 | P0 | 分页展示,每页 20 条,支持翻页 |
|
||||
| | HIS-02 | 搜索历史数据(按期号/日期) | P1 | 搜索框输入后 500ms 防抖查询 |
|
||||
| | HIS-03 | 红球/蓝球高亮显示 | P0 | 红球红色背景,蓝球蓝色背景 |
|
||||
| | HIS-04 | 展示和值、奇偶比、大小比、跨度 | P1 | 列表中包含这些统计字段 |
|
||||
| **生成记录** | REC-01 | 查看历史生成记录列表 | P0 | 分页展示,显示策略、注数、时间、文件大小 |
|
||||
| | REC-02 | 下载生成结果文件 | P0 | 点击下载可获取对应 Excel |
|
||||
| | REC-03 | 删除生成记录 | P1 | 删除后同时删除对应文件,列表刷新 |
|
||||
| **统计数据** | STA-01 | 展示历史开奖期数 | P0 | 数字准确 |
|
||||
| | STA-02 | 红球热号 TOP15 | P0 | 按出现频次降序排列 |
|
||||
| | STA-03 | 红球冷号 TOP15 | P0 | 按出现频次升序排列 |
|
||||
| | STA-04 | 蓝球热号 TOP8 | P0 | 按出现频次降序排列 |
|
||||
| | STA-05 | 最常见奇偶比 | P1 | 显示频次最高的奇偶比形态 |
|
||||
| | STA-06 | 最常见大小比 | P1 | 显示频次最高的 大小比形态 |
|
||||
| | STA-07 | 和值范围统计 | P1 | 显示最小值、最大值、平均值、标准差 |
|
||||
| | STA-08 | 跨度范围统计 | P1 | 显示最小值、最大值、平均值、标准差 |
|
||||
| **系统功能** | SYS-01 | 监听 0.0.0.0:8085 | P0 | `netstat -tlnp` 验证 |
|
||||
| | SYS-02 | PC/移动端响应式布局 | P0 | 视口宽度 320px-1920px 自适应 |
|
||||
| | SYS-03 | 页面导航(4 个 Tab) | P0 | 生成、历史数据、生成记录、统计 |
|
||||
| | SYS-04 | API Token 认证(可选) | P2 | 配置项 `auth_enabled` 控制开关 |
|
||||
| | SYS-05 | 系统状态接口 | P1 | `/api/status` 返回服务状态 |
|
||||
|
||||
### 3.2 核心业务流程
|
||||
|
||||
```
|
||||
用户访问 → 首页(号码生成) → 选择注数/策略 → 点击生成
|
||||
↓
|
||||
后端调用 lottery.py → 分析历史数据 → 生成号码 → 保存 Excel
|
||||
↓
|
||||
返回结果 → 前端展示(红球 + 蓝球 + 统计指标) → 可下载/查看记录
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 非功能需求
|
||||
|
||||
### 4.1 性能要求
|
||||
| 指标 | 要求 | 说明 |
|
||||
|------|------|------|
|
||||
| 页面加载时间 | <3s (P95) | 首次加载,含静态资源 |
|
||||
| API 响应时间 | <2s (P95) | 不含号码生成(含历史数据查询、统计) |
|
||||
| 号码生成时间 | <10s (P95) | 100 注以内,高级策略 |
|
||||
| 并发用户数 | ≥10 | 局域网内同时访问 |
|
||||
|
||||
### 4.2 兼容性要求
|
||||
| 平台 | 浏览器 | 版本要求 |
|
||||
|------|--------|----------|
|
||||
| PC 端 | Chrome | 90+ |
|
||||
| PC 端 | Safari | 14+ |
|
||||
| PC 端 | Edge | 90+ |
|
||||
| 移动端 | iOS Safari | 14+ |
|
||||
| 移动端 | Android Chrome | 90+ |
|
||||
| 移动端 | 微信内置浏览器 | 最新版 |
|
||||
|
||||
### 4.3 安全要求
|
||||
- **API 认证**: 可选 Token 认证(`auth_enabled` 配置项)
|
||||
- **目录遍历防护**: 下载接口校验路径,禁止 `..` 和绝对路径
|
||||
- **HTTPS**: 内网环境暂不强制,外网部署需配置 SSL
|
||||
|
||||
### 4.4 可用性要求
|
||||
- **服务可用性**: ≥99%(工作时段 9:00-22:00)
|
||||
- **数据持久化**: 生成记录永久保存,除非用户主动删除
|
||||
- **错误处理**: 所有 API 失败返回友好提示,不暴露堆栈信息
|
||||
|
||||
---
|
||||
|
||||
## 5. 原型与界面
|
||||
|
||||
### 5.1 页面结构
|
||||
```
|
||||
┌─────────────────────────────────────────┐
|
||||
│ Header(标题 + 副标题) │
|
||||
├─────────────────────────────────────────┤
|
||||
│ Nav Tabs: 生成 | 历史数据 | 记录 | 统计 │
|
||||
├─────────────────────────────────────────┤
|
||||
│ │
|
||||
│ Page Content │
|
||||
│ (根据 Tab 切换内容) │
|
||||
│ │
|
||||
└─────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 5.2 关键界面描述
|
||||
|
||||
#### 5.2.1 号码生成页(首页)
|
||||
- **顶部**: 统计概览(历史期数、常见奇偶比、常见大小比、和值范围、跨度范围、热号预览)
|
||||
- **中部**: 生成参数配置(滑块选择注数 1-1000,下拉选择策略)
|
||||
- **操作区**: 「立即生成」大按钮
|
||||
- **结果区**: 号码卡片列表(每注显示红球 6 个 + 蓝球 1 个,下方显示和值、奇偶比、大小比、跨度)
|
||||
- **底部**: 「下载 Excel」按钮
|
||||
|
||||
#### 5.2.2 历史数据页
|
||||
- **顶部**: 搜索框(按期号/日期搜索,500ms 防抖)
|
||||
- **列表**: 表格展示(期号、开奖日期、红球 6 个、蓝球 1 个、和值、奇偶形态、大小比、跨度)
|
||||
- **底部**: 分页控件(上一页/页码/下一页)
|
||||
|
||||
#### 5.2.3 生成记录页
|
||||
- **列表**: 卡片式展示(策略、注数、生成时间、文件大小)
|
||||
- **操作**: 每条记录含「下载」和「删除」按钮
|
||||
- **底部**: 分页控件
|
||||
|
||||
#### 5.2.4 统计页
|
||||
- **数据卡片**: 历史开奖期数
|
||||
- **热号区**: 红球热号 TOP15(红色球)、蓝球热号 TOP8(蓝色球)
|
||||
- **冷号区**: 红球冷号 TOP15(红色球,透明度降低)
|
||||
- **统计网格**: 最常见奇偶比、最常见大小比、和值范围(min-max-mean-std)、跨度范围(min-max-mean-std)
|
||||
|
||||
### 5.3 设计规范
|
||||
| 元素 | 规范 |
|
||||
|------|------|
|
||||
| 主色调 | 红色 #e74c3c(双色球主题) |
|
||||
| 辅色 | 蓝色 #3498db(蓝球)、紫色 #8e44ad(渐变) |
|
||||
| 字体 | 系统默认(-apple-system, PingFang SC, Microsoft YaHei) |
|
||||
| 卡片圆角 | 12px |
|
||||
| 阴影 | 0 2px 12px rgba(0,0,0,0.08) |
|
||||
| 移动导航 | 底部固定(高度 56px) |
|
||||
| PC 导航 | 顶部 Tab(高度 68px,sticky) |
|
||||
|
||||
---
|
||||
|
||||
## 6. API 接口设计
|
||||
|
||||
### 6.1 接口清单
|
||||
|
||||
| 接口 | 方法 | 描述 | 认证 |
|
||||
|------|------|------|------|
|
||||
| `/api/generate` | POST | 生成号码 | 可选 |
|
||||
| `/api/history` | GET | 获取历史开奖数据 | 可选 |
|
||||
| `/api/records` | GET | 获取生成记录列表 | 可选 |
|
||||
| `/api/records/:id` | DELETE | 删除生成记录 | 可选 |
|
||||
| `/api/statistics` | GET | 获取统计数据 | 可选 |
|
||||
| `/api/download/:filepath` | GET | 下载文件 | 可选 |
|
||||
| `/api/status` | GET | 系统状态 | 无 |
|
||||
| `/api/config` | GET | 前端配置 | 无 |
|
||||
|
||||
### 6.2 关键接口示例
|
||||
|
||||
#### POST /api/generate
|
||||
**请求**:
|
||||
```json
|
||||
{
|
||||
"num_tickets": 10,
|
||||
"strategy": "advanced"
|
||||
}
|
||||
```
|
||||
|
||||
**响应**:
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"tickets": [
|
||||
{
|
||||
"index": 1,
|
||||
"reds": [3, 12, 18, 23, 27, 31],
|
||||
"blue": 9,
|
||||
"sum_value": 114,
|
||||
"odd_even": "3:3",
|
||||
"size_ratio": "4:2",
|
||||
"span": 28
|
||||
}
|
||||
],
|
||||
"total": 10,
|
||||
"filename": "lottery/双色球_20260703_142530_高级策略_10 注.xlsx",
|
||||
"download_url": "/api/download/lottery/双色球_20260703_142530_高级策略_10 注.xlsx",
|
||||
"record": {...},
|
||||
"statistics": {...}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. 技术架构
|
||||
|
||||
### 7.1 技术栈
|
||||
| 层级 | 技术 | 版本 |
|
||||
|------|------|------|
|
||||
| 后端 | Python + Flask | 3.x + 2.x |
|
||||
| 前端 | 原生 HTML/CSS/JS | ES6+ |
|
||||
| 数据存储 | Excel + JSON | openpyxl |
|
||||
| 号码生成 | NumPy + Pandas | 1.x |
|
||||
| 部署 | 直接运行 | `python3 app.py` |
|
||||
|
||||
### 7.2 目录结构
|
||||
```
|
||||
lottoData/
|
||||
├── app.py # Flask 主服务(17KB)
|
||||
├── index.html # 前端 UI(42KB,响应式)
|
||||
├── lottery.py # 号码生成核心逻辑(51KB)
|
||||
├── fetch_data.py # 数据爬取脚本
|
||||
├── web_executor.py # 数据抓取 Web 服务(独立)
|
||||
├── web_console.html # 数据抓取控制台
|
||||
├── 双色球历史数据.xlsx # 历史数据(由 fetch_data.py 更新)
|
||||
├── lottery/ # 号码生成结果目录
|
||||
├── .generation_records.json # 生成记录索引
|
||||
└── .fetch_status.json # 抓取状态(web_executor 用)
|
||||
```
|
||||
|
||||
### 7.3 部署方式
|
||||
```bash
|
||||
# 进入项目目录
|
||||
cd /home/vincent/Studio/lottoData
|
||||
|
||||
# 启动服务
|
||||
python3 app.py
|
||||
|
||||
# 访问地址
|
||||
本地:http://localhost:8085
|
||||
局域网:http://<本机 IP>:8085
|
||||
```
|
||||
|
||||
### 7.4 端口与监听
|
||||
- **默认端口**: 8085
|
||||
- **监听地址**: 0.0.0.0(局域网可访问)
|
||||
- **可配置**: `CONFIG['port']` 和 `CONFIG['host']`
|
||||
|
||||
---
|
||||
|
||||
## 8. 数据埋点与监控
|
||||
|
||||
### 8.1 关键事件埋点建议
|
||||
| 事件 | 触发时机 | 数据字段 |
|
||||
|------|----------|----------|
|
||||
| `page_view` | 页面加载 | page_name, user_agent, timestamp |
|
||||
| `generate_click` | 点击生成按钮 | num_tickets, strategy |
|
||||
| `generate_success` | 生成成功 | num_tickets, strategy, duration_ms |
|
||||
| `generate_failure` | 生成失败 | error_message, strategy |
|
||||
| `download_click` | 点击下载 | file_name, source (生成结果/记录列表) |
|
||||
| `record_delete` | 删除记录 | record_id |
|
||||
|
||||
### 8.2 监控指标
|
||||
- **服务可用性**: 心跳检测(/api/status)
|
||||
- **API 错误率**: 按接口统计 5xx 错误占比
|
||||
- **生成成功率**: 成功次数 / 总请求次数
|
||||
- **平均响应时间**: 各接口 P95延迟
|
||||
|
||||
---
|
||||
|
||||
## 9. 排期建议
|
||||
|
||||
| 阶段 | 工作内容 | 负责人 | 预估工时 |
|
||||
|------|----------|--------|----------|
|
||||
| 评审 | PRD 评审 + 架构评审 | 全员 | 2h |
|
||||
| 开发 | 已有代码,无需开发 | - | 0h |
|
||||
| 测试 | 功能测试 + 兼容性测试 | 测试 | 4h |
|
||||
| 部署 | 服务启动 + 防火墙配置 | 运维 | 1h |
|
||||
| 验收 | 刘总验收 | 刘总 | 待定 |
|
||||
|
||||
**总工时**: 7 小时(主要为测试和验收)
|
||||
|
||||
---
|
||||
|
||||
## 10. 风险与应对
|
||||
|
||||
| 风险 | 影响 | 概率 | 应对措施 |
|
||||
|------|------|------|----------|
|
||||
| 历史数据文件损坏 | 无法生成号码 | 低 | 定期备份 `.xlsx` 文件 |
|
||||
| 局域网网络问题 | 无法访问 | 中 | 检查防火墙,确保 8085 端口开放 |
|
||||
| 并发过高导致服务卡顿 | 体验下降 | 低 | 限制单 IP 请求频率,增加超时控制 |
|
||||
| Excel 文件过大 | 下载缓慢 | 中 | 单个文件限制 1000 注,超过分批下载 |
|
||||
| 移动端适配问题 | 显示错乱 | 低 | 真机测试主流设备 |
|
||||
|
||||
---
|
||||
|
||||
## 11. 版本历史
|
||||
|
||||
| 版本 | 日期 | 修改内容 | 修改人 |
|
||||
|------|------|----------|--------|
|
||||
| v1.0 | 2026-07-03 | 初始版本,基于现有代码逆向整理 PRD | 沈路明 |
|
||||
|
||||
---
|
||||
|
||||
## 12. 附件
|
||||
|
||||
### 12.1 已有代码文件清单
|
||||
1. `app.py` (17KB) - Flask 后端服务
|
||||
2. `index.html` (42KB) - 响应式前端 UI
|
||||
3. `lottery.py` (51KB) - 号码生成核心逻辑
|
||||
4. `fetch_data.py` (3.8KB) - 历史数据抓取
|
||||
5. `web_executor.py` (6.4KB) - 数据抓取 Web 服务
|
||||
6. `web_console.html` (11KB) - 数据抓取控制台
|
||||
7. `双色球历史数据.xlsx` (12KB) - 历史数据文件
|
||||
|
||||
### 12.2 Git 仓库
|
||||
- **仓库地址**: http://192.168.1.99:12299/vincent/Lottery.git
|
||||
- **当前状态**: 代码已完成,待提交至 Git
|
||||
|
||||
### 12.3 访问地址
|
||||
- **本地访问**: http://localhost:8085
|
||||
- **局域网访问**: http://192.168.1.99:8085(示例 IP,以实际为准)
|
||||
|
||||
---
|
||||
|
||||
## 13. 后续优化建议(非本期)
|
||||
|
||||
| 功能 | 描述 | 优先级 |
|
||||
|------|------|--------|
|
||||
| 用户登录系统 | 多用户权限管理 | P2 |
|
||||
| 定时任务调度 | 自动生成 + 推送 | P2 |
|
||||
| 数据可视化图表 | 走势图、分布图 | P2 |
|
||||
| 微信推送 | 生成结果推送至微信 | P3 |
|
||||
| 多彩种支持 | 大乐透、福彩 3D 等 | P3 |
|
||||
|
||||
---
|
||||
|
||||
**PRD 评审准备就绪,邀请架构师(梁思筑)和开发(徐聪)参与评审。**
|
||||
@@ -0,0 +1,512 @@
|
||||
# 产品需求文档(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 防火墙规则
|
||||
```bash
|
||||
# 仅允许内网访问
|
||||
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 服务启动脚本
|
||||
```bash
|
||||
# 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)
|
||||
```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
|
||||
**产品经理**: 沈路明
|
||||
**状态**: 待评审
|
||||
Reference in New Issue
Block a user