no message

This commit is contained in:
hajimi
2026-07-31 16:13:31 +08:00
parent c01bd53ea1
commit 2b2e3197be
22 changed files with 495 additions and 28 deletions
+399
View File
@@ -0,0 +1,399 @@
# Sport-Era 体育咨询AI平台 - 产品方案文档
> 版本:v1.1Demo版)
> 日期:2026-03-14
> 技术栈:ThinkPHP 8 + Vue 3 + UniApp + DeepSeek AI
---
## 〇、当前阶段说明
**当前目标:构建一个无限接近真实的 Demo 版本**
| 维度 | Demo阶段 | 正式上线 |
|------|----------|----------|
| 赛事数据 | 网络爬取真实数据(免费源) | 接入付费第三方API(稳定+实时) |
| 赔率/盘口 | 网络爬取真实赔率数据 | 接入实时赔率API |
| 资讯文章 | 爬取体育新闻 + AI生成分析 | 运营团队 + AI生成 + 聚合 |
| AI分析 | DeepSeek真实接入(Key后台配置) | 同左 |
| 用户/社区 | 种子用户 + AI生成社区内容 + 真实注册流程 | 真实用户 |
| 钱包/提现 | 完整流程(虚拟金额) | 接入真实支付 |
| 分销 | 完整逻辑(虚拟数据验证) | 真实运营 |
**核心原则**:所有功能逻辑、UI交互、API接口与正式版完全一致。赛事/赔率/资讯等数据通过爬取网络真实数据填充,接入付费API后切换数据源即可发布。
---
## 一、平台定位
**数据深度** 为核心竞争力的体育咨询AI平台,通过 AI论坛/赛事评估分析 提供智能化体育资讯服务,采用 **流量共享分润模式** 实现商业化。
**目标用户**:体育爱好者、足球/篮球球迷、体育数据分析爱好者
**平台特色**
- AI驱动的赛事分析与预测
- 社区化的跟单与方案分享
- 可信度模型保障内容质量
- 多端覆盖(iOS / Android / 鸿蒙 / H5
---
## 二、功能模块总览
| 模块 | 核心功能 | AI介入 |
|------|----------|--------|
| 平台首页 | 聚合展示/推荐流 | ✅ 个性化推荐 |
| 足球/篮球模块 | 赛程/比分/盘口/赔率 | ✅ 赛事预测 |
| 头条资讯 | 分类/列表/详情 | ✅ AI导读分析 |
| 社区系统 | 发帖/跟单/标签 | ✅ 可信度分析 |
| AI智能模块 | 预测/摘要/分析 | ✅ 核心模块 |
| 个人中心 | 资料/钱包/分销 | ❌ |
---
## 三、模块详细设计
### 3.1 平台首页
#### 功能清单
- **今日赛事/开奖聚合**:展示当日重要赛事和开奖结果
- **热门推荐**
- 赛事推荐:根据热度和AI分析推荐赛事
- 彩票推荐:AI概率模型推荐
- 新闻资讯推荐:基于用户偏好推荐
- **论坛帖子盈利榜**:展示近期盈利最多的社区推手
- **AI精选分析**:AI自动生成的赛事分析精选
- **风险提示**:平台风险提醒和免责声明
- **个性化推荐流(AI驱动)**:基于用户行为的个性化内容推荐
#### 数据来源
- **Demo阶段**:首页数据通过爬取网络真实数据填充(赛事/资讯/排行榜等)
- **正式上线**:付费数据API + DeepSeek AI推荐算法 + 社区实时统计
---
### 3.2 足球/篮球模块
#### 赛程
| 功能 | 说明 |
|------|------|
| 实时比分 | 赛事进行中实时更新比分 |
| 盘口数据 | 亚盘/欧赔/大小球盘口展示 |
| 赔率变化 | 赔率走势图,记录各时间点赔率变动 |
| 历史交锋 | 两队历史对阵记录和统计 |
#### 主流赛事覆盖
- 足球:英超、西甲、德甲、意甲、法甲、欧冠、中超等
- 篮球:NBA、CBA、欧洲篮球联赛等
#### AI协助分析
| 模型 | 输出 |
|------|------|
| 球队攻防模型 | 球队攻防能力评估图表 |
| 进球期望值模型 | xG(预期进球)分析 |
| 盘口盈亏模型 | 盘口价值分析 |
| 伤停影响模型 | 伤停对比赛结果的影响评估 |
| 胜平负概率 | AI预测胜/平/负概率 |
| 大小球概率 | AI预测大/小球概率 |
| 让球赢盘概率 | AI预测让球盘赢盘概率 |
| 风险等级评估 | 综合风险等级(低/中/高) |
#### 数据来源方案
**Demo阶段(爬取网络真实数据)**
- 爬取公开体育网站的真实赛事数据(联赛/球队/赛程/比分/赔率/历史交锋)
- 数据源:懒球帝、雷速体育、球探网、TheSportsDB等公开页面
- API-Football 免费版(100次/天,补充数据)
- 后端定时任务爬取 → 清洗入库 → 前端读取本地数据
- 覆盖足球(英超/西甲/德甲等)和篮球(NBA/CBA)
**正式上线**
- 切换为付费第三方API(纳米数据 / 雷速体育 / API-Football
- 数据表结构与Demo阶段一致,仅切换数据源适配器即可
---
### 3.3 头条资讯
#### 功能清单
- **资讯分类**:赛事新闻、转会动态、球队资讯、数据分析等
- **热点导读**:编辑精选/AI推荐的热门资讯
- **资讯列表**:分类浏览、搜索
- **资讯详情**:文章阅读
- **AI导读分析**:对资讯内容进行AI智能分析
#### AI导读分析功能
- 自动生成文章摘要
- 重点信息提取
- 风险提示标注
- 反向观点对比
- 情绪倾向分析(正面/中性/负面)
#### 内容来源方案
**Demo阶段**
- 爬取体育新闻网站的真实资讯文章(懒球帝/虎扑/腾讯体育等)
- AI基于爬取的真实赛事数据自动生成分析文章
- 后台可手动发布新文章
- AI导读分析功能接入真实 DeepSeek
**正式上线**
| 来源 | 说明 |
|------|------|
| 后台手动发布 | 运营/编辑发布原创内容 |
| AI生成 | DeepSeek基于赛事数据自动生成赛前/赛后分析 |
| 新闻聚合API | 接入新闻聚合服务获取体育资讯 |
| 社区UGC精选 | 社区优质内容升级为资讯 |
---
### 3.4 社区系统
#### 发帖系统
| 功能 | 说明 |
|------|------|
| 图文发布 | 支持图文混排帖子 |
| 战绩截图上传 | 用户上传投注战绩截图 |
| 推荐方案发布 | 发布赛事推荐方案(关联赛事) |
| 标签系统 | 帖子打标签便于分类和搜索 |
#### 跟单系统
| 功能 | 说明 |
|------|------|
| 一键跟单 | 用户可一键跟随推手方案 |
| 盈利统计 | 跟单盈利汇总展示 |
| 盈亏曲线图 | 可视化盈亏走势 |
#### 用户体系
| 功能 | 说明 |
|------|------|
| 等级体系 | 经验值升级系统 |
| VIP订阅 | 付费会员特权 |
| 专家认证 | 推手资质认证 |
| 信誉评分 | AI驱动的可信度评估 |
---
### 3.5 AI智能模块(DeepSeek接入)
#### 3.5.1 AI资讯阅读助手
| 功能 | 实现方式 |
|------|----------|
| 自动摘要 | 文章全文 → DeepSeek → 结构化摘要(3-5句话) |
| 重点提取 | 提取关键数据点、核心观点 |
| 风险提示 | 识别文章中的风险因素并标注 |
| 反向观点对比 | 自动搜索相反立场的观点对比 |
| 情绪倾向分析 | 分析文章情绪:正面/中性/负面,置信度百分比 |
#### 3.5.2 社区可信度分析模型
| 维度 | 权重 | 说明 |
|------|------|------|
| 历史命中率 | 30% | 历史推荐的准确率 |
| 盈亏波动率 | 15% | 盈亏的稳定程度 |
| 发帖稳定性 | 15% | 发帖频率的稳定性 |
| 预测合理性 | 15% | 推荐理由是否合理(AI判断) |
| 是否事后编辑 | 15% | 检测赛后修改行为 |
| 与赛果偏离度 | 10% | 预测结果与实际结果的差距 |
**输出**:可信度评分(0-100)、风险等级、是否疑似"马后炮"标记
**更新策略**:每日凌晨AI批量计算更新
#### 3.5.3 赛事预测模型
| 输入数据 | 输出结果 |
|----------|----------|
| 历史战绩 | 胜平负概率区间 |
| xG数据 | 大小球概率 |
| 盘口变化 | 让球赢盘概率 |
| 伤停信息 | 盈利期望值 |
| 赔率走势 | 风险等级(低/中/高) |
#### 3.5.4 彩票概率模型
| 功能 | 说明 |
|------|------|
| 统计分布分析 | 历史开奖数据的统计特征分析 |
| 冷热号分析 | 号码出现频率和遗漏值分析 |
| 概率可视化 | 图表展示各号码出现概率 |
| 随机模拟 | 蒙特卡洛模拟生成推荐组合 |
#### AI技术架构
```
用户请求 → PHP后端(AIService) → DeepSeek API
结果缓存(Redis)
存储(MySQL) → 前端展示
```
**AI配置管理(通过后台管理系统)**
- DeepSeek API Key:后台「AI配置」页面录入,存储在 la_ai_config 表
- 模型选择:deepseek-chat / deepseek-reasoner,后台可切换
- 调用参数:temperature、max_tokens 等,后台可调整
- 调用限制:每日API调用上限、单用户调用频次,后台可配置
- 调用日志:所有AI调用记录可在后台查看
**调用策略**
- 缓存优先:相同输入在缓存有效期内直接返回
- 异步处理:大量分析任务通过队列异步执行
- 成本控制:设置每日API调用上限,VIP用户优先
---
### 3.6 个人中心
#### 个人资料
- 头像设置
- 昵称修改
- 手机号注册/绑定
#### 分销管理
| 功能 | 说明 |
|------|------|
| 邀请 | 邀请链接/二维码生成、邀请记录查看 |
| 团队管理 | 团队列表、用户设置 |
| 结算报表 | 佣金统计和结算明细 |
**分销模式**:二级分销
- 一级佣金:被邀请人消费金额的 15%
- 二级佣金:被邀请人的邀请人消费金额的 8%
- 佣金来源:VIP订阅、付费方案购买
- 结算周期:月结(每月1日结算上月佣金)
- **Demo阶段**:完整分销逻辑,使用虚拟金额验证流程
#### 钱包管理
| 功能 | 说明 |
|------|------|
| 钱包统计 | 总收入、可用余额 |
| 账单记录 | 收入记录、提现记录 |
| 钱包地址管理 | USTD钱包地址绑定 |
| 提现 | USTD提现(支持TRC20 |
**提现流程**
1. 用户发起提现申请
2. 系统校验余额和地址
3. 管理员后台审核
4. 审核通过后执行打款
5. 到账通知
**Demo阶段**:完整提现流程UI和逻辑,后台审核页面,但不接入真实支付(审核通过仅更新状态)
#### 关于平台
- 平台协议(用户协议、隐私政策、免责声明)
- 平台版本信息
---
## 四、用户等级体系
### 等级设定
| 等级 | 名称 | 经验值 | 权益 |
|------|------|--------|------|
| Lv1 | 新手 | 0 | 基础浏览、查看资讯 |
| Lv2 | 球迷 | 100 | 发帖、评论、收藏 |
| Lv3 | 达人 | 500 | 查看AI基础分析报告 |
| Lv4 | 专家 | 2000 | 发布推荐方案、申请专家认证 |
| Lv5 | 大师 | 5000 | 查看AI高级分析、历史数据导出 |
### 经验值获取
| 行为 | 经验值 | 每日上限 |
|------|--------|----------|
| 每日签到 | +5 | 1次 |
| 发帖 | +10 | 5次 |
| 评论 | +3 | 10次 |
| 被点赞 | +2 | 无上限 |
| 被跟单 | +5 | 无上限 |
| 推荐命中 | +20 | 无上限 |
| 邀请新用户 | +50 | 无上限 |
---
## 五、VIP订阅
| VIP等级 | 价格 | 权益 |
|---------|------|------|
| 普通用户 | 免费 | 基础浏览、社区发帖 |
| VIP月卡 | ¥28/月 | AI分析报告、跟单提醒、去广告 |
| VIP季卡 | ¥68/季 | 月卡权益 + 专家方案优先查看 |
| VIP年卡 | ¥198/年 | 季卡权益 + 专属客服 + 数据导出 |
**Demo阶段**:VIP订阅页面和权限逻辑完整实现,可通过后台手动设置用户VIP状态
---
## 六、专家认证
### 认证条件
- 近30天发帖 ≥ 10篇
- 推荐方案命中率 ≥ 60%
- 信誉评分 ≥ 80分
- 提交实名认证资料
### 专家权益
- 专属认证标识
- 方案可设置收费查看
- 参与分销分成
- 优先展示在推荐流中
### 认证流程
1. 用户提交认证申请 + 实名资料
2. 系统自动校验数据条件
3. 管理员人工审核
4. 审核通过/拒绝通知
---
## 七、Demo阶段数据采集方案
### 7.1 爬取真实数据(定时任务)
| 数据类型 | 数据源 | 爬取策略 |
|----------|--------|----------|
| 联赛/球队基础数据 | TheSportsDB(API) / 球探网 | 初始化爬取一次,定期更新 |
| 赛程/比分 | 雷速体育 / 懒球帝公开页 | 每日定时爬取当日赛程 |
| 赔率/盘口 | 球探网 / 雷速体育 | 赛前定时爬取赔率变化 |
| 历史交锋 | TheSportsDB(API) / 球探网 | 查询时拉取并缓存 |
| 球员/伤停 | 懒球帝 / 转会市场 | 每日定时爬取 |
| 体育资讯 | 懒球帝 / 虎扑 / 腾讯体育 | 每日定时爬取最新资讯 |
### 7.2 AI生成内容
| 内容类型 | 生成方式 |
|----------|----------|
| 赛事分析文章 | DeepSeek基于爬取的真实赛事数据自动生成 |
| 社区帖子 | AI基于真实赛事生成推荐方案/分析帖 |
| 用户评论 | AI生成多样化的评论内容 |
### 7.3 种子数据(脚本创建)
| 数据类型 | 数量 | 说明 |
|----------|------|------|
| 种子用户 | 20个 | 含普通用户/VIP/专家,各种等级 |
| 跟单方案 | 20个 | 基于真实赛事AI生成,含命中/未命中 |
### 7.4 爬取架构设计
```
后端定时任务 → 爬虫服务(SportCrawlerService)
├── 联赛球队Crawler → la_league / la_team
├── 赛事比分Crawler → la_match / la_match_stats
├── 赔率盘口Crawler → la_match_odds
├── 球员伤停Crawler → la_player / la_player_injury
├── 资讯Crawler → la_article
└── 数据清洗器 → 统一格式入库
```
**架构优势**:爬虫服务和正式上线的第三方API服务共用同一套数据清洗和入库逻辑,切换时仅需替换数据源适配器。
---
## 八、正式上线待对接事项
| # | 事项 | 说明 | 状态 |
|---|------|------|------|
| 1 | 赛事数据API | 纳米数据/雷速体育,替换爬虫数据源 | 上线前对接 |
| 2 | DeepSeek API Key | 后台配置页面已就绪,录入Key即可 | 上线前配置 |
| 3 | USTD提现链路 | TRC20,接入真实链上转账 | 上线前对接 |
| 4 | 短信服务 | 后台已有短信配置,录入服务商Key | 上线前配置 |
| 5 | 支付对接 | VIP订阅的真实支付渠道 | 上线前对接 |
+678
View File
@@ -0,0 +1,678 @@
# Sport-Era 体育咨询AI平台 - 实现流程文档
> 版本:v1.1Demo版)
> 日期:2026-03-14
> 技术栈:ThinkPHP 8 + Vue 3 + UniApp + DeepSeek AI
---
## 一、技术架构总览
```
┌─────────────────────────────────────────────────┐
│ 客户端 │
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ iOS │ │Android│ │ 鸿蒙 │ │ H5 │ │
│ └──┬───┘ └──┬───┘ └──┬───┘ └──┬───┘ │
│ └─────────┴─────────┴─────────┘ │
│ UniApp (Vue 3) │
├─────────────────────────────────────────────────┤
│ 管理后台: Vue 3 + Element Plus │
├─────────────────────────────────────────────────┤
│ API层: ThinkPHP 8 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ adminapi │ │ api │ │ AI Service│ │
│ └──────────┘ └──────────┘ └─────┬────┘ │
├──────────────────────────────────┼──────────────┤
│ 数据层 │ │
│ ┌──────┐ ┌──────┐ ┌──────┐ │ │
│ │MySQL │ │Redis │ │ 队列 │ │ │
│ └──────┘ └──────┘ └──────┘ │ │
├────────────────────────────────┼──────────────┤
│ 外部服务 │ │
│ ┌──────────┐ ┌──────────┐ │ │
│ │体育数据API│ │DeepSeek AI│◄──┘ │
│ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────┘
```
---
## 二、开发阶段规划
### 阶段一:基础架构(预计 2-3 周)
#### 1.1 数据库建表 + 爬虫服务
- 创建所有业务表(约40张新表)
- 执行SQL迁移脚本
- 验证表结构和关联关系
- **开发爬虫服务(SportCrawlerService)**,爬取网络真实数据填充数据库
- 爬虫服务与正式上线API服务共用数据清洗/入库逻辑,切换时仅替换数据源适配器
#### 1.2 用户体系扩展
**后端(server/app/**
```
app/common/model/user/
├── UserProfile.php # 用户扩展资料模型
├── UserLevel.php # 用户等级模型
├── UserVip.php # VIP订阅模型
├── UserExpert.php # 专家认证模型
└── UserCredit.php # 信誉评分模型
app/api/controller/user/
├── UserProfileController.php
├── UserLevelController.php
└── UserVipController.php
app/api/logic/user/
├── UserProfileLogic.php
├── UserLevelLogic.php
└── UserVipLogic.php
```
**前端(uniapp/src/**
```
pages/user/
├── profile/index.vue # 个人资料页
├── level/index.vue # 等级详情页
└── vip/index.vue # VIP订阅页
```
**开发顺序**
1. 创建用户扩展表 → Model → Logic → Controller → API路由
2. 前端个人资料页面
3. 等级经验值计算逻辑
4. VIP订阅流程
#### 1.3 头条资讯模块
**后端开发**
```
app/api/controller/article/
├── ArticleController.php # 复用已有,扩展AI分析接口
└── ArticleCateController.php # 复用已有
app/api/logic/article/
└── ArticleAiLogic.php # 新增 - AI导读分析逻辑
app/common/model/article/
└── ArticleAiAnalysis.php # 新增 - AI分析结果模型
app/adminapi/controller/article/
└── ArticleController.php # 复用已有 - 后台资讯管理
```
**前端开发**
```
uniapp/src/pages/
├── news/
│ ├── index.vue # 资讯列表
│ ├── detail.vue # 资讯详情
│ └── components/
│ ├── NewsCard.vue # 资讯卡片组件
│ └── AiAnalysis.vue # AI导读分析组件
```
**开发顺序**
1. 扩展资讯分类(体育相关分类)
2. 资讯列表/详情前端页面
3. AI导读分析接口(阶段三实现AI逻辑,此处先预留接口)
#### 1.4 赛事基础模块
**后端开发**
```
app/common/model/sport/
├── SportType.php # 运动类型
├── League.php # 联赛
├── Team.php # 球队
├── Match.php # 赛事
├── MatchOdds.php # 赔率
├── MatchStats.php # 赛事统计
├── MatchHistory.php # 历史交锋
├── Player.php # 球员
└── PlayerInjury.php # 伤停
app/api/controller/sport/
├── MatchController.php # 赛事接口
├── LeagueController.php # 联赛接口
└── TeamController.php # 球队接口
app/api/logic/sport/
├── MatchLogic.php
├── LeagueLogic.php
└── TeamLogic.php
app/common/service/sport/
├── SportDataService.php # 数据源统一接口(爬虫/API切换)
├── SportCrawlerService.php # 爬虫服务(Demo阶段主要数据源)
└── DataCleanerService.php # 数据清洗器(爬虫/API共用)
```
**前端开发**
```
uniapp/src/pages/
├── match/
│ ├── index.vue # 赛事列表(按日期)
│ ├── detail.vue # 赛事详情
│ └── components/
│ ├── MatchCard.vue # 赛事卡片
│ ├── OddsPanel.vue # 赔率面板
│ ├── ScoreBoard.vue # 比分板
│ └── HistoryTable.vue # 历史交锋表
├── league/
│ ├── index.vue # 联赛列表
│ └── detail.vue # 联赛详情(排名/赛程)
```
**开发顺序**
1. 运动类型/联赛/球队基础数据表和模型
2. 赛事CRUD接口
3. 爬虫服务开发(SportCrawlerService)爬取网络真实赛事数据
4. 数据清洗器(DataCleanerService)统一入库格式
5. 前端赛事列表/详情页面
6. 赔率/盘口展示
7. SportDataService 统一接口(正式上线时切换数据源适配器)
---
### 阶段二:社区与互动(预计 2-3 周)
#### 2.1 社区发帖系统
**后端开发**
```
app/common/model/community/
├── CommunityPost.php # 帖子
├── CommunityPostImage.php # 帖子图片
├── CommunityComment.php # 评论
├── CommunityLike.php # 点赞
├── CommunityTag.php # 标签
├── CommunityPostTag.php # 帖子标签关联
└── CommunityFollow.php # 关注
app/api/controller/community/
├── PostController.php # 帖子接口
├── CommentController.php # 评论接口
├── FollowController.php # 关注接口
└── TagController.php # 标签接口
app/api/logic/community/
├── PostLogic.php
├── CommentLogic.php
└── FollowLogic.php
```
**前端开发**
```
uniapp/src/pages/
├── community/
│ ├── index.vue # 社区首页(帖子列表)
│ ├── post_detail.vue # 帖子详情
│ ├── publish.vue # 发帖页面
│ └── components/
│ ├── PostCard.vue # 帖子卡片
│ ├── CommentList.vue # 评论列表
│ ├── ImageUpload.vue # 图片上传
│ └── TagSelector.vue # 标签选择器
```
**开发顺序**
1. 帖子CRUD → 评论 → 点赞 → 标签
2. 关注系统
3. 图片上传(战绩截图)
4. 推荐方案发布(关联赛事)
#### 2.2 跟单系统
**后端开发**
```
app/common/model/tipster/
├── TipsterPlan.php # 推荐方案
├── TipsterFollow.php # 跟单记录
├── TipsterStats.php # 推手统计
└── TipsterProfitLog.php # 盈亏日志
app/api/controller/tipster/
├── PlanController.php # 方案接口
├── FollowController.php # 跟单接口
└── StatsController.php # 统计接口
app/api/logic/tipster/
├── PlanLogic.php
├── FollowLogic.php
└── StatsLogic.php
```
**前端开发**
```
uniapp/src/pages/
├── tipster/
│ ├── index.vue # 推手列表/排行榜
│ ├── detail.vue # 推手详情(历史方案/盈亏曲线)
│ ├── plan_detail.vue # 方案详情
│ └── components/
│ ├── TipsterCard.vue # 推手卡片
│ ├── PlanCard.vue # 方案卡片
│ ├── ProfitChart.vue # 盈亏曲线图
│ └── FollowButton.vue # 跟单按钮
```
**开发顺序**
1. 推荐方案发布/展示
2. 跟单功能
3. 盈利统计和排行榜
4. 盈亏曲线图表
#### 2.3 专家认证
**后端**UserExpert 模型 + 认证申请/审核接口
**管理后台**:认证审核页面
**开发顺序**:认证申请接口 → 后台审核页面 → 前端申请页面
---
### 阶段三:AI智能模块(预计 3-4 周)
#### 3.1 AI基础服务层
**后端开发**
```
app/common/service/ai/
├── AiService.php # AI服务基类
├── DeepSeekClient.php # DeepSeek API客户端
├── AiCacheService.php # AI结果缓存服务
└── AiQueueService.php # AI异步队列服务
app/common/enum/
└── AiEnum.php # AI相关枚举(分析类型/状态等)
config/
└── ai.php # AI配置文件(从 la_ai_config 表读取,后台可配置)
```
**核心类设计**
```php
// DeepSeekClient.php - 核心调用类
class DeepSeekClient
{
private string $apiKey; // 从 la_ai_config 表读取,后台可配置
private string $baseUrl; // 从 la_ai_config 表读取
private string $model; // deepseek-chat / deepseek-reasoner,后台可切换
public function chat(string $systemPrompt, string $userMessage): array
public function chatStream(string $systemPrompt, string $userMessage): Generator
}
// AiService.php - 业务封装
class AiService
{
public static function analyzeArticle(int $articleId): array // 资讯AI分析
public static function predictMatch(int $matchId): array // 赛事预测
public static function analyzeCredibility(int $userId): array // 可信度分析
public static function analyzeLottery(array $params): array // 彩票概率分析
}
```
#### 3.2 AI资讯阅读助手
**Prompt设计**
```
系统角色:你是一位专业的体育资讯分析师。
任务:对以下体育资讯文章进行深度分析,输出JSON格式结果:
{
"summary": "3-5句话的摘要",
"key_points": ["重点1", "重点2", ...],
"risk_warnings": ["风险提示1", ...],
"opposite_views": ["反向观点1", ...],
"sentiment": {
"label": "positive/neutral/negative",
"confidence": 0.85
}
}
```
**开发顺序**
1. DeepSeekClient 封装(从 la_ai_config 读取配置)
2. 后台AI配置页面(API Key / 模型选择 / 参数调整 / 调用限制)
3. 资讯分析Prompt设计和调试
4. 结果缓存策略
5. 前端AI分析展示组件
6. 后台AI调用日志查看页面
#### 3.3 社区可信度分析模型
**数据采集**
```
用户ID →
├── 历史推荐方案列表 → 命中率计算
├── 盈亏记录 → 波动率计算
├── 发帖时间序列 → 稳定性计算
├── 帖子编辑记录 → 事后编辑检测
└── 赛果对比 → 偏离程度计算
```
**Prompt设计**
```
系统角色:你是体育社区内容审核AI。
输入数据:用户历史数据摘要(JSON格式)
任务:评估该用户的可信度,输出JSON:
{
"credibility_score": 75,
"risk_level": "medium",
"is_suspicious": false,
"analysis": "分析说明",
"dimension_scores": {
"hit_rate": 80,
"volatility": 70,
"stability": 85,
"rationality": 65,
"edit_integrity": 90,
"deviation": 70
}
}
```
**定时任务**:每日凌晨3点执行批量分析
**开发顺序**
1. 数据采集逻辑
2. Prompt设计和调优
3. 定时任务配置
4. 前端可信度标识展示
#### 3.4 赛事预测模型
**数据输入组装**
```php
// 组装赛事分析数据
$matchData = [
'home_team' => [...], // 主队近期数据
'away_team' => [...], // 客队近期数据
'head_to_head' => [...], // 历史交锋
'odds' => [...], // 当前赔率
'injuries' => [...], // 伤停信息
'xg_data' => [...], // xG数据
];
```
**开发顺序**
1. 赛事数据组装逻辑
2. 预测Prompt设计
3. 预测结果存储和展示
4. 前端预测报告页面
#### 3.5 彩票概率模型
**实现方式**:统计算法为主 + DeepSeek辅助分析
```
历史开奖数据 →
├── PHP统计计算(频率/遗漏值/冷热号)
├── DeepSeek分析趋势和异常模式
└── 蒙特卡洛模拟生成推荐组合
```
#### 3.6 个性化推荐流
**推荐因子**
- 用户浏览历史(赛事/资讯偏好)
- 关注的推手和球队
- AI分析结果质量评分
- 时效性(优先最新内容)
---
### 阶段四:变现与运营(预计 2-3 周)
#### 4.1 钱包管理
**后端开发**
```
app/common/model/wallet/
├── Wallet.php # 钱包
├── WalletLog.php # 钱包流水
├── WalletWithdraw.php # 提现记录
└── WalletAddress.php # 钱包地址
app/api/controller/wallet/
├── WalletController.php # 钱包接口
└── WithdrawController.php # 提现接口
app/api/logic/wallet/
├── WalletLogic.php
└── WithdrawLogic.php
app/adminapi/controller/wallet/
└── WithdrawController.php # 后台提现审核
```
**前端开发**
```
uniapp/src/pages/
├── wallet/
│ ├── index.vue # 钱包首页
│ ├── bill.vue # 账单记录
│ ├── withdraw.vue # 提现页面
│ └── address.vue # 地址管理
```
**开发顺序**
1. 钱包余额管理
2. 流水记录
3. 提现申请和审核流程
4. USTD地址管理
#### 4.2 分销管理
**后端开发**
```
app/common/model/distribution/
├── DistributionConfig.php # 分销配置
├── DistributionInvite.php # 邀请记录
├── DistributionTeam.php # 团队关系
└── DistributionSettlement.php # 结算记录
app/api/controller/distribution/
├── InviteController.php # 邀请接口
├── TeamController.php # 团队接口
└── SettlementController.php # 结算接口
app/api/logic/distribution/
├── InviteLogic.php # 邀请码生成/绑定逻辑
├── TeamLogic.php # 团队树形结构逻辑
└── SettlementLogic.php # 佣金计算/结算逻辑
```
**前端开发**
```
uniapp/src/pages/
├── distribution/
│ ├── index.vue # 分销中心
│ ├── invite.vue # 邀请页面(含二维码)
│ ├── team.vue # 团队列表
│ └── settlement.vue # 结算报表
```
**开发顺序**
1. 邀请码/链接生成
2. 注册绑定上级关系
3. 团队树形管理
4. 佣金计算逻辑
5. 月度自动结算定时任务
#### 4.3 平台首页聚合
**开发顺序**
1. 今日赛事聚合接口
2. 热门推荐接口
3. 盈利排行榜接口
4. AI精选分析展示
5. 首页UI整合
---
## 三、后台管理扩展
### 需要新增的管理后台页面
```
admin/src/views/
├── sport/ # 赛事管理
│ ├── type/index.vue # 运动类型管理
│ ├── league/index.vue # 联赛管理
│ ├── team/index.vue # 球队管理
│ ├── match/index.vue # 赛事管理
│ └── data_sync.vue # 数据同步管理
├── community/ # 社区管理
│ ├── post/index.vue # 帖子管理(审核/删除)
│ ├── comment/index.vue # 评论管理
│ ├── tag/index.vue # 标签管理
│ └── report.vue # 举报处理
├── tipster/ # 跟单管理
│ ├── plan/index.vue # 方案管理
│ ├── expert/index.vue # 专家认证审核
│ └── ranking.vue # 排行榜管理
├── ai/ # AI管理
│ ├── config.vue # AI配置(API Key/参数)
│ ├── analysis_log.vue # 分析日志
│ └── model_config.vue # 模型参数配置
├── wallet/ # 钱包管理
│ ├── withdraw/index.vue # 提现审核
│ └── log.vue # 流水查看
├── distribution/ # 分销管理
│ ├── config.vue # 分销配置
│ ├── team.vue # 团队查看
│ └── settlement.vue # 结算管理
└── user_ext/ # 用户扩展管理
├── level_config.vue # 等级配置
├── vip_config.vue # VIP配置
└── credit.vue # 信誉评分查看
```
---
## 四、API路由规划
### 前台APIapp/api
```
// 赛事模块
Route::group('sport', function () {
Route::get('match/list', 'sport.Match/list');
Route::get('match/detail', 'sport.Match/detail');
Route::get('match/odds', 'sport.Match/odds');
Route::get('match/history', 'sport.Match/history');
Route::get('league/list', 'sport.League/list');
Route::get('team/detail', 'sport.Team/detail');
});
// 社区模块
Route::group('community', function () {
Route::get('post/list', 'community.Post/list');
Route::get('post/detail', 'community.Post/detail');
Route::post('post/publish', 'community.Post/publish');
Route::post('post/like', 'community.Post/like');
Route::post('comment/add', 'community.Comment/add');
Route::post('follow/toggle', 'community.Follow/toggle');
});
// 跟单模块
Route::group('tipster', function () {
Route::get('plan/list', 'tipster.Plan/list');
Route::get('plan/detail', 'tipster.Plan/detail');
Route::post('plan/publish', 'tipster.Plan/publish');
Route::post('plan/follow', 'tipster.Follow/follow');
Route::get('stats/ranking', 'tipster.Stats/ranking');
});
// AI模块
Route::group('ai', function () {
Route::get('article/analysis', 'ai.Article/analysis');
Route::get('match/prediction', 'ai.Match/prediction');
Route::get('user/credibility', 'ai.User/credibility');
Route::get('lottery/analysis', 'ai.Lottery/analysis');
});
// 钱包模块
Route::group('wallet', function () {
Route::get('info', 'wallet.Wallet/info');
Route::get('log/list', 'wallet.Wallet/logList');
Route::post('withdraw/apply', 'wallet.Withdraw/apply');
Route::get('withdraw/list', 'wallet.Withdraw/list');
Route::post('address/save', 'wallet.Wallet/saveAddress');
});
// 分销模块
Route::group('distribution', function () {
Route::get('invite/code', 'distribution.Invite/code');
Route::get('invite/list', 'distribution.Invite/list');
Route::get('team/list', 'distribution.Team/list');
Route::get('settlement/list', 'distribution.Settlement/list');
});
```
---
## 五、定时任务清单
| 任务 | Cron表达式 | Demo阶段 | 说明 |
|------|-----------|----------|------|
| 赛事数据爬取 | */30 * * * * | ✅ 爬虫服务 | 每30分钟爬取赛事数据(Demo用爬虫,正式用API) |
| 赔率数据爬取 | 0 */2 * * * | ✅ 爬虫服务 | 每2小时爬取赔率变化 |
| 赛果更新 | 0 */1 * * * | ✅ 爬虫服务 | 每小时检查并更新赛果 |
| 资讯爬取 | 0 */4 * * * | ✅ 爬虫服务 | 每4小时爬取最新体育资讯 |
| 推荐方案结算 | 0 */1 * * * | ✅ 需要 | 每小时结算已结束赛事的方案 |
| AI可信度计算 | 0 3 * * * | ✅ 需要 | 每日凌晨3点批量计算信誉评分 |
| 用户等级计算 | 0 4 * * * | ✅ 需要 | 每日凌晨4点更新用户等级 |
| 分销佣金结算 | 0 2 1 * * | ✅ 需要 | 每月1日凌晨2点结算上月佣金 |
| AI分析报告生成 | 0 8 * * * | ✅ 需要 | 每日早8点生成当日赛事AI分析 |
| 盈利排行榜更新 | 0 */2 * * * | ✅ 需要 | 每2小时更新盈利排行 |
---
## 六、第三方服务集成
| 服务 | 用途 | Demo阶段 | 正式上线 |
|------|------|----------|----------|
| DeepSeek API | AI分析核心 | ✅ 真实接入(Key后台配置) | 同左 |
| 体育数据API | 赛事/赔率/比分 | ✅ 爬虫爬取真实数据 | 切换为付费API |
| 短信服务 | 注册/登录验证码 | ✅ 通用验证码0000 | 接入短信服务商 |
| 文件存储 | 图片/截图上传 | ✅ likeadmin已集成 | 同左(OSS) |
| 微信SDK | 小程序/公众号登录 | ✅ likeadmin已集成 | 同左 |
| 支付服务 | VIP订阅/方案购买 | ❌ 后台手动设置 | 接入支付渠道 |
| USTD提现 | 钱包提现 | ❌ 仅状态更新 | 接入链上转账 |
---
## 七、部署与同步流程
### 开发流程
```
本地开发(IDE) → Git Push(Gitee) → 服务器 Git Pull → 生效
```
### Git 部署(主要方式)
- 远程仓库:`https://gitee.com/phperbylyh/sport-era-service.git`
- 分支:`develop`
- 服务器更新命令(宝塔定时任务):
```bash
cd /www/wwwroot/sportera.gs-z.cn && chattr -i public/.user.ini 2>/dev/null && git -c safe.directory=/www/wwwroot/sportera.gs-z.cn fetch --all && echo "----- 更新内容 -----" && git -c safe.directory=/www/wwwroot/sportera.gs-z.cn log HEAD..origin/develop --oneline 2>&1 && echo "----- 变更文件 -----" && git -c safe.directory=/www/wwwroot/sportera.gs-z.cn diff --stat HEAD origin/develop 2>&1 && git -c safe.directory=/www/wwwroot/sportera.gs-z.cn reset --hard origin/develop 2>&1 && chattr +i public/.user.ini 2>/dev/null && echo "===== 部署完成: $(date) ====="
```
### SFTP 配置(辅助方式)
- 配置文件:`.winsurf/sftp.json`
- 自动上传:保存即同步
- 忽略文件:.git, .env, runtime, vendor
### 前端构建部署
```bash
# Admin后台
cd admin && npm run build # 输出到 server/public/admin/
# UniApp H5
cd uniapp && npm run build:h5 # 输出到 server/public/mobile/
# UniApp App
cd uniapp && npm run build:app # 生成原生App包
```
---
## 八、里程碑节点
| 里程碑 | 阶段 | 预计完成 | 交付物 |
|--------|------|----------|--------|
| M1 | 基础架构 | 第3周 | 数据库+爬虫服务+用户体系+资讯+赛事基础数据 |
| M2 | 社区上线 | 第6周 | 社区发帖+跟单+专家认证 |
| M3 | AI上线 | 第10周 | AI分析全功能+后台AI配置管理 |
| M4 | 商业闭环 | 第13周 | 钱包+分销+VIP+首页聚合 |
| **Demo交付** | **全部** | **第13周** | **完整功能Demo + 虚拟数据** |
| M5 | 正式上线 | 第15周 | 接入真实数据API+支付+USTD |
| M6 | 优化迭代 | 持续 | 性能优化+数据积累+模型调优 |
+70
View File
@@ -0,0 +1,70 @@
# Gitea 部署说明
> 部署时间:2026-07-31
>
> 当前阶段:安装已完成,服务正常运行。
## 访问方式
- 正式访问地址:<https://git.zones.sbnews.net/>
- 后端监听:`0.0.0.0:3000`。该端口仍保留用于服务器直连和 Nginx 反向代理,但日常访问应使用 HTTPS 域名。
- 协议:HTTPSNginx 终止 TLS,再转发至 Gitea HTTP 3000 端口)
- Git 操作:当前仅启用 HTTP/HTTPS 克隆和推送,未映射 Git SSH 端口,避免与宿主机的 SSH 22 端口冲突。
Nginx 虚拟主机配置位于 `/www/server/panel/vhost/nginx/git.zones.sbnews.net.conf`,反向代理配置位于 `/www/server/panel/vhost/nginx/proxy/git.zones.sbnews.net/`
## 容器配置
| 项目 | 当前配置 |
| --- | --- |
| 容器名 | `gitea` |
| Gitea 版本 | 1.27.1 |
| 镜像摘要 | `sha256:34e3f6b75f5cbb6aebce588037fc5a53c84213e4d4b00da0a8d73e031a558e52` |
| 重启策略 | `unless-stopped` |
| 端口映射 | `0.0.0.0:3000 -> 3000/tcp` |
| 数据库 | SQLite,数据位于持久化卷内 |
| 数据卷 | `gitea-data`,宿主机位置为 `/var/lib/docker/volumes/gitea-data/_data` |
| 应用根地址 | `https://git.zones.sbnews.net/` |
## 首次初始化
1. 在浏览器打开 <https://git.zones.sbnews.net/>。
2. 使用已创建的管理员账号登录。
3. 创建组织与仓库;初期请使用 HTTPS 克隆地址。
> HTTPS 域名已配置完成。后续更换域名或端口时,需同步更新 Gitea 的 `ROOT_URL` 和 Nginx 反向代理的 `Host` 请求头。
## 反向代理跨域校验修复
2026-07-31 曾出现 `cross-origin request detected``Frontend is not initialized` 提示。根因是 Nginx 反代把请求头设置为 `Host: localhost`,而浏览器请求的 `Origin``https://git.zones.sbnews.net`,导致 Gitea 的 CSRF 校验拒绝表单提交。
已将反代请求头改为:
~~~
proxy_set_header Host git.zones.sbnews.net;
proxy_set_header X-Forwarded-Host git.zones.sbnews.net;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
~~~
并将 Gitea 的 `DOMAIN``ROOT_URL` 更新为 `git.zones.sbnews.net``https://git.zones.sbnews.net/`。修改后 Nginx 配置检查、Gitea 健康检查、HTTPS 页面与浏览器静态资源加载均已验证通过。
## 常用运维命令
以下命令均在服务器上执行:
~~~
ssh sbnews
sudo docker ps --filter name=gitea
sudo docker logs --tail 200 gitea
sudo docker restart gitea
sudo docker stop gitea
sudo docker start gitea
sudo docker volume inspect gitea-data
~~~
## 注意事项
- Gitea 数据存放在 Docker 卷中。备份或迁移前先确认容器已停止,或使用 Gitea 官方备份方式,避免只备份容器层。
- 当前镜像已固定到上述摘要,不会随宿主机重启自动升级。升级前应先备份数据,并在测试环境验证目标版本。
- 调整端口、域名、HTTPS 或 Git SSH 后,应同步更新本文档、[服务器运行环境](./服务器运行环境.md) 和 [文档索引](../文档索引.md)。
File diff suppressed because it is too large Load Diff
+93
View File
@@ -0,0 +1,93 @@
# 测试服务器运行环境
> 采集时间:2026-07-31 15:59Asia/Shanghai;包含 Gitea 反向代理配置修复后的状态)
>
> 采集方式:通过 `ssh sbnews` 执行只读检查。本文记录当前快照,不包含账号、密码、环境变量等敏感信息。
## 服务器概况
| 项目 | 当前值 |
| --- | --- |
| 主机名 | `ip-172-31-25-241` |
| 操作系统 | Ubuntu 22.04.5 LTS |
| 已运行时间 | 13 周 6 天 10 小时 |
| 项目运行目录 | `/www/wwwroot/test-server.sbnews.net` |
## 资源使用情况
| 资源 | 总量 | 已使用 | 可用 / 剩余 | 说明 |
| --- | ---: | ---: | ---: | --- |
| 内存 | 7.6 GiB | 3.9 GiB | 3.5 GiB 可用 | `free -h``available` 值,包含可回收缓存 |
| Swap | 0 B | 0 B | 0 B | 未配置交换分区 |
| 根分区 `/` | 124 GB | 64 GB | 61 GB | 使用率 52% |
## 宿主机运行服务
### 项目相关服务
| 服务 | 状态 | 用途 |
| --- | --- | --- |
| `nginx.service` | running | Web 服务与反向代理 |
| `mysqld.service` | running | MySQL 数据库 |
| `docker.service` | running | Docker 容器引擎 |
| `containerd.service` | running | Docker 容器运行时 |
| `cron.service` | running | 宿主机定时任务 |
| `supervisord.service` | running | 进程守护 |
| `mtranserver.service` | running | 本地翻译服务 |
| `site_total.service` | running | 站点统计服务 |
| `pure-ftpd.service` | running | FTP 服务 |
| `ssh.service` | running | SSH 远程访问 |
| `redis-server.service` | inactive | 本机 Redis 服务未运行,且未发现 TCP 6379 监听 |
系统同时运行 chrony、日志、网络、BT 面板等基础服务;完整服务清单可通过 `systemctl list-units --type=service --state=running` 查看。
## Docker 运行状态
- Docker 版本:`29.1.3`
- Compose 项目:`docker`
- Compose 配置:`/www/wwwroot/test-server.sbnews.net/docker/docker-compose.crawler.yml`
- Docker 负责运行 Python 爬虫与容器内 cron;本次确认 Nginx、MySQL 由宿主机服务提供。
- Gitea 以独立 Docker 容器运行,详情见 [Gitea 部署说明](./Gitea部署说明.md)。
### 容器
| 容器 | 镜像 | 状态 | 重启策略 | 挂载 |
| --- | --- | --- | --- | --- |
| `gitea` | `docker.gitea.com/gitea:1.27.1` | 正常运行,Nginx HTTPS 域名反代至 HTTP `3000` | `unless-stopped` | Docker 卷 `gitea-data``/data` |
| `sport-era-crawler` | `sport-era-crawler:latest` | 正常运行,已持续 2 周 | `always` | crawler `logs``/app/logs`crawler `data``/app/data` |
| `sport-era-kb-worker` | `sport-era-crawler:latest` | 已退出,Docker 持续重启 | `always` | 与 crawler 共用 `logs``data` 挂载 |
### Docker 存储占用
| 类别 | 占用 | 可回收 |
| --- | ---: | ---: |
| 镜像 | 13.03 GB | 13.03 GB |
| 容器 | 126.8 MB | 0 B |
| 构建缓存 | 12.04 GB | 9.627 GB |
| 本地卷 | 5.444 kB | 0 B |
> 以上数值来自 `docker system df`。即使 Docker 显示可回收空间,也不得未经确认直接执行清理命令,避免影响正在使用的镜像或后续回滚。
## 待处理风险
- `sport-era-kb-worker` 当前退出码为 `1`,重启次数为 `17`,在 Compose 中显示 `Restarting (1)` 已约 3 周。
- 本机 `redis-server.service` 为 inactive,且未发现 TCP 6379 监听。项目是否改用远程 Redis 或其他缓存连接,需以服务器 `server/.env` 为准后再确认。
- Gitea 已监听 `0.0.0.0:3000`,正式入口为 `https://git.zones.sbnews.net/`。Nginx 反代和 Gitea 的根地址已统一为该域名,浏览器静态资源与健康检查已通过。
- 本次仅记录运行状态,未读取日志、未重启容器、未修改服务器。排查时可优先使用:
~~~
ssh sbnews
sudo docker logs --tail 200 sport-era-kb-worker
sudo docker inspect sport-era-kb-worker
~~~
## 常用只读检查命令
~~~
ssh sbnews
free -h
df -h /
sudo docker ps
sudo docker compose -f /www/wwwroot/test-server.sbnews.net/docker/docker-compose.crawler.yml ps
sudo docker system df
~~~
@@ -0,0 +1,15 @@
# 比赛详情赔率绑定实施计划
**目标:** 隐藏独立赔率入口,并在比赛详情页按比赛双方名称和日期展示多平台盘口。
**实现方式:** 保留现有通用赔率列表代码,通过显示开关隐藏入口;扩展 `/api/match/odds` 的可选文本筛选参数;详情页首次进入赔率 Tab 时请求并展示当前比赛的平台盘口。
## 任务
- [x] 修改 `server/app/api/controller/MatchController.php`:读取 `home_team``away_team``match_date`,在通用赔率查询中增加可选文本筛选和日期格式兼容。
- [x] 修改 `uniapp/src/api/match.ts`:为 `getMatchOdds` 增加三个可选请求参数。
- [x] 修改 `uniapp/src/packages_match/components/MatchCenterTabsPanel.vue`:通过开关隐藏赛事中心赔率 Tab,保留原实现。
- [x] 修改 `uniapp/src/packages_match/components/WorldCupPanel.vue`:通过开关隐藏世界杯赔率 Tab,并避免旧 `tab=odds` 激活隐藏页面。
- [x] 修改 `uniapp/src/pages/match_detail/match_detail.vue`:新增赔率 Tab、平台筛选、懒加载和盘口展示,隐藏比赛数据里的旧简易赔率。
- [x] 更新 `业务进度管理.md`:记录比赛详情赔率绑定方式和独立入口隐藏状态。
- [x] 静态复核请求参数、Tab 状态、模板标签和工作区改动;不自动执行构建、测试、提交或部署。
+28
View File
@@ -0,0 +1,28 @@
# 比赛详情赔率绑定设计
## 目标
- 赛事中心和世界杯专题页不再显示独立赔率 Tab,但保留原赔率功能代码。
- 赔率强绑定到比赛详情页,在详情 Tab 中展示当前比赛的滚球、球探及后续平台盘口。
- 绑定不依赖站内 `match_id`,由比赛双方名称和比赛日期进行文本匹配。
## 交互设计
- 比赛详情 Tab 顺序调整为:文字直播、比赛数据、赔率、阵容、近期战绩、AI分析。
- 进入详情页时不立即请求赔率;首次切换到赔率 Tab 时按需加载。
- 赔率页提供“全部平台 / 滚球 / 球探”平台筛选,不提供联赛或球队搜索。
- 每个平台展示独赢、让球、大小球盘口;没有匹配数据时展示“暂无赔率”。
- 比赛数据 Tab 中原有的简易主胜/平/客胜区域隐藏,避免重复展示。
## 数据绑定
- 用户端调用 `/api/match/odds` 时传入 `home_team``away_team``match_date`
- 后端对主队、客队字段分别进行文本包含匹配。
- `match_date` 统一按 `YYYY-MM-DD` 传递,后端兼容赔率记录中的 `YYYY-MM-DD``MM-DD``YYYY/MM/DD``MM/DD` 日期文本。
- 未传入上述条件时,`/api/match/odds` 保持原通用列表行为,兼容现有调用方。
## 显示开关
- `MatchCenterTabsPanel.vue``WorldCupPanel.vue` 使用本地布尔开关过滤赔率 Tab。
- 原赔率模板、状态与请求逻辑保留,后续恢复入口时只需调整开关。
+320
View File
@@ -0,0 +1,320 @@
# 爬虫任务脚本文档
## 概述
本文档整理了当前系统中的所有爬虫任务脚本,包括懂球帝足球数据爬虫和六合彩信息爬虫两大类。每个脚本都有详细的功能说明和执行方法。
## 一、懂球帝足球数据爬虫系统
### 1.1 核心项目结构
系统有两个主要项目目录:
1. **dongqiudi-crawler** - 基础爬虫系统
2. **dongqiudi-crawler-extended** - 扩展版(支持多联赛)
### 1.2 主要脚本文件
#### 1.2.1 日常定时任务脚本
| 脚本文件 | 功能 | 执行方式 | 说明 |
|---------|------|----------|------|
| `cron_dongqiudi_daily.py` | 每日多联赛数据采集 | `python3 cron_dongqiudi_daily.py` | 每天凌晨2点运行,采集7个联赛数据 |
| `install_dongqiudi_cron.sh` | 安装定时任务 | `bash install_dongqiudi_cron.sh` | 将每日采集任务添加到crontab |
| `collect_multi_league_data.py` | 多联赛数据采集(首次运行) | `python3 collect_multi_league_data.py` | 采集7个联赛的首秀数据 |
#### 1.2.2 实时数据更新脚本
| 脚本文件 | 功能 | 执行方式 | 说明 |
|---------|------|----------|------|
| `live_match_updater_v2.py` | 实时比赛数据更新器 | `python3 live_match_updater_v2.py` | 监听比赛开始时间,获取实时数据 |
| `live_match_updater_backup.py` | 实时更新器备份 | `python3 live_match_updater_backup.py` | 备用版本 |
| `deploy_live_updater.py` | 部署实时更新器 | `python3 deploy_live_updater.py start` | 启动实时更新服务 |
#### 1.2.3 高级爬虫脚本
| 脚本文件 | 功能 | 执行方式 | 说明 |
|---------|------|----------|------|
| `hybrid_crawler.py` | 混合爬虫(API+Playwright | 导入使用 | 集成API请求和浏览器自动化 |
| `playwright_crawler.py` | Playwright浏览器爬虫 | 导入使用 | 使用Playwright进行网页抓取 |
| `dongqiudi_advanced_crawler.py` | 高级懂球帝爬虫 | 导入使用 | 支持指纹伪装和反爬虫规避 |
#### 1.2.4 工具和测试脚本
| 脚本文件 | 功能 | 执行方式 | 说明 |
|---------|------|----------|------|
| `check_league_status.py` | 检查联赛状态 | `python3 check_league_status.py` | 测试赛季ID有效性 |
| `scan_leagues.py` | 扫描联赛 | `python3 scan_leagues.py` | 扫描1-100的赛季ID |
| `get_sports_matches_simple.py` | 简单比赛获取 | `python3 get_sports_matches_simple.py` | 获取今日明日比赛 |
| `get_today_tomorrow_matches.py` | 今日明日比赛 | `python3 get_today_tomorrow_matches.py` | 获取比赛数据 |
| `test_api_direct.py` | API直接测试 | `python3 test_api_direct.py` | 测试API连通性 |
| `debug_api.py` | API调试 | `python3 debug_api.py` | 调试API问题 |
| `test_full_pipeline.py` | 完整管道测试 | `python3 test_full_pipeline.py` | 测试整个数据管道 |
| `test_season.py` | 赛季测试 | `python3 test_season.py` | 测试特定赛季 |
| `fingerprint_test.py` | 指纹测试 | `python3 fingerprint_test.py` | 测试指纹伪装效果 |
| `test_crawl.py` | 爬虫测试 | `python3 test_crawl.py` | 通用爬虫测试 |
#### 1.2.5 分布式系统脚本
| 脚本文件 | 功能 | 执行方式 | 说明 |
|---------|------|----------|------|
| `task_scheduler.py` | 分布式任务调度器 | `python3 task_scheduler.py` | 负责任务创建、调度和监控 |
| `celery_worker.py` | Celery工作节点 | `python3 celery_worker.py` | 启动Celery工作进程 |
| `data_pipeline.py` | 数据管道 | `python3 data_pipeline.py` | 数据处理管道 |
### 1.3 项目目录详细说明
#### 1.3.1 dongqiudi-crawler项目
```
projects/dongqiudi-crawler/
├── src/
│ ├── crawler/ # 爬虫核心模块
│ │ ├── api_client.py # API客户端
│ │ ├── data_parser.py # 数据解析器
│ │ └── playwright_client.py # Playwright客户端
│ ├── fingerprint/ # 指纹管理模块
│ │ ├── manager.py # 指纹管理器
│ │ └── validator.py # 指纹验证器
│ ├── scheduler/ # 调度模块
│ │ ├── task_scheduler.py # 任务调度器
│ │ ├── queue_manager.py # 队列管理器
│ │ └── rate_limiter.py # 频率限制器
│ ├── error_handler/ # 错误处理模块
│ │ ├── detector.py # 错误检测器
│ │ ├── recovery.py # 恢复机制
│ │ └── monitor.py # 监控器
│ └── storage/ # 存储模块
│ ├── database.py # 数据库操作
│ ├── cache.py # 缓存管理
│ └── models.py # 数据模型
└── scripts/ # 脚本目录
```
#### 1.3.2 dongqiudi-crawler-extended项目
扩展版包含相同的模块结构,但增加了多联赛支持:
- `scripts/multi_league_crawler.py` - 多联赛爬虫主脚本
### 1.4 执行示例
#### 1.4.1 运行每日采集
```bash
# 直接运行
python3 cron_dongqiudi_daily.py
# 通过cron定时运行(已配置)
0 2 * * * cd /root/.openclaw/workspace && python3 cron_dongqiudi_daily.py >> logs/daily_cron.log 2>&1
```
#### 1.4.2 运行实时更新器
```bash
# 启动服务
python3 deploy_live_updater.py start
# 停止服务
python3 deploy_live_updater.py stop
# 查看状态
python3 deploy_live_updater.py status
```
#### 1.4.3 测试爬虫功能
```bash
# 测试单个联赛
python3 check_league_status.py
# 测试多联赛
python3 collect_multi_league_data.py
# 测试实时数据
python3 live_match_updater_v2.py --test
```
## 二、六合彩信息爬虫系统
### 2.1 项目结构
```
lottery_crawler/
├── README.md # 项目说明
├── requirements.txt # Python依赖
├── config/ # 配置文件目录
├── src/ # 源代码目录
│ ├── crawler.py # 主爬虫类
│ ├── crawler_real_site.py # 真实站点爬虫
│ ├── crawler_forecast.py # 预测数据爬虫
│ ├── crawler_playwright.py # Playwright爬虫
│ ├── crawler_playwright_proxy.py # 代理版Playwright爬虫
│ ├── crawler_playwright_stealth.py # 隐身版爬虫
│ ├── crawler_playwright_system.py # 系统爬虫
│ ├── crawler_real_system.py # 真实系统爬虫
│ ├── crawler_js.py # JavaScript爬虫
│ └── utils.py # 工具函数
├── data/ # 数据输出目录
├── logs/ # 日志目录
└── scripts/ # 脚本目录
└── run_crawler.py # 运行脚本
```
### 2.2 主要脚本文件
| 脚本文件 | 功能 | 执行方式 | 说明 |
|---------|------|----------|------|
| `src/crawler.py` | 主爬虫类 | 导入使用 | 基础爬虫功能 |
| `src/crawler_real_site.py` | 真实站点爬虫 | `python3 src/crawler_real_site.py` | 爬取真实网站数据 |
| `src/crawler_forecast.py` | 预测数据爬虫 | `python3 src/crawler_forecast.py` | 爬取预测信息 |
| `src/crawler_playwright.py` | Playwright爬虫 | `python3 src/crawler_playwright.py` | 使用Playwright |
| `scripts/run_crawler.py` | 运行脚本 | `python3 scripts/run_crawler.py` | 一键运行爬虫 |
### 2.3 定时任务脚本
| 脚本文件 | 功能 | 执行方式 | 说明 |
|---------|------|----------|------|
| `cron_check_draw.py` | 开奖检查 | `python3 cron_check_draw.py` | 定时检查开奖结果 |
| `cron_check_draw_backup.py` | 开奖检查备份 | `python3 cron_check_draw_backup.py` | 备用版本 |
| `morning_setup.sh` | 早晨设置脚本 | `bash morning_setup.sh` | 每日早晨运行设置 |
### 2.4 数据分析脚本
| 脚本文件 | 功能 | 执行方式 | 说明 |
|---------|------|----------|------|
| `analyze_081.py` | 数据分析 | `python3 analyze_081.py` | 分析081期数据 |
| `analyze_html.py` | HTML分析 | `python3 analyze_html.py` | 分析HTML页面 |
| `analyze_new_data.py` | 新数据分析 | `python3 analyze_new_data.py` | 分析最新数据 |
| `check_forecast.py` | 预测检查 | `python3 check_forecast.py` | 检查预测准确性 |
| `check_result.py` | 结果检查 | `python3 check_result.py` | 检查开奖结果 |
### 2.5 执行示例
#### 2.5.1 运行主爬虫
```bash
# 进入项目目录
cd /root/.openclaw/workspace/lottery_crawler
# 运行主爬虫
python3 src/crawler.py --url "https://rtrtr77.www72517c.com:8443/#dbgg"
# 或使用运行脚本
python3 scripts/run_crawler.py
```
#### 2.5.2 运行定时检查
```bash
# 检查开奖结果
python3 cron_check_draw.py
# 检查预测数据
python3 check_forecast.py
```
#### 2.5.3 数据分析
```bash
# 分析最新数据
python3 analyze_new_data.py
# 生成报告
python3 generate_report.py
```
## 三、其他相关脚本
### 3.1 通用工具脚本
| 脚本文件 | 功能 | 执行方式 | 说明 |
|---------|------|----------|------|
| `fetch_lottery.py` | 彩票数据获取 | `python3 fetch_lottery.py` | 通用彩票数据获取 |
| `crawl_match_types.py` | 比赛类型爬取 | `python3 crawl_match_types.py` | 爬取比赛类型数据 |
### 3.2 代理相关脚本
| 脚本文件 | 功能 | 执行方式 | 说明 |
|---------|------|----------|------|
| `proxy_tester.py` | 代理测试 | `python3 proxy_tester.py` | 测试代理可用性 |
| `proxy_tester_real.py` | 真实代理测试 | `python3 proxy_tester_real.py` | 真实环境代理测试 |
## 四、系统依赖和环境
### 4.1 Python依赖
```bash
# 基础依赖
pip install requests aiohttp playwright pymysql redis celery
# 懂球帝爬虫特定依赖
pip install fake-useragent browser-fingerprint
# 彩票爬虫特定依赖
pip install beautifulsoup4 lxml pandas
```
### 4.2 环境配置
1. **Redis服务器**:用于任务队列和缓存
2. **MySQL数据库**:用于数据存储
3. **Playwright浏览器**:用于浏览器自动化
### 4.3 配置文件
- 数据库配置:`database_config.py`
- Redis配置:`redis_config.py`
- Celery配置:`celery_config.py`
## 五、监控和日志
### 5.1 日志文件位置
- 懂球帝爬虫日志:`logs/dongqiudi_daily.log`
- 实时更新器日志:`live_updater.log`
- 彩票爬虫日志:`lottery_crawler/logs/`
### 5.2 监控指标
1. **采集成功率**API请求成功率
2. **数据完整性**:采集到的数据字段完整性
3. **系统性能**:响应时间、资源使用率
4. **错误率**:各种错误的发生频率
## 六、故障排除
### 6.1 常见问题
#### 问题1API请求失败
- **原因**:频率限制、IP封禁、API变更
- **解决**:调整请求间隔,更换User-Agent,检查API地址
#### 问题2:数据库连接失败
- **原因**:数据库服务未启动、配置错误
- **解决**:检查数据库服务状态,验证连接配置
#### 问题3Playwright启动失败
- **原因**:浏览器未安装、权限问题
- **解决**:运行`playwright install`,检查权限
### 6.2 调试方法
```bash
# 启用详细日志
export LOG_LEVEL=DEBUG
# 测试单个功能
python3 test_api_direct.py
# 检查网络连接
curl -v "https://sport-data.dongqiudi.com/soccer/biz/data/standing?season_id=26322"
```
## 七、下一步优化建议
1. **容器化部署**:使用Docker容器化部署所有爬虫服务
2. **监控告警**:集成Prometheus和Grafana进行监控
3. **自动扩缩容**:根据负载自动调整爬虫实例数量
4. **数据质量监控**:建立数据质量检测和告警机制
5. **文档自动化**:自动生成API文档和执行文档
---
**文档生成时间**2026-03-31
**文档状态**:初稿
**更新频率**:脚本有变更时及时更新
## 附录:脚本快速参考表
| 类别 | 主要脚本 | 执行命令 | 用途 |
|------|----------|----------|------|
| 日常采集 | `cron_dongqiudi_daily.py` | `python3 cron_dongqiudi_daily.py` | 每日多联赛数据 |
| 实时更新 | `deploy_live_updater.py` | `python3 deploy_live_updater.py start` | 启动实时更新服务 |
| 彩票爬虫 | `src/crawler_real_site.py` | `python3 src/crawler_real_site.py` | 爬取彩票网站 |
| 数据分析 | `analyze_new_data.py` | `python3 analyze_new_data.py` | 分析最新数据 |
| 系统测试 | `test_full_pipeline.py` | `python3 test_full_pipeline.py` | 测试完整系统 |
+62
View File
@@ -0,0 +1,62 @@
# 设计稿映射
> 维护设计稿与前端页面/组件的映射关系。新增页面或还原设计稿前必查。
## 设计稿入口
| 平台 | 链接 | 项目 ID / 备注 |
| --- | --- | --- |
| 蓝湖 | 待补充 | 待补充 |
| Figma | 待补充 | 待补充 |
## 状态图例
- ✅ 已完成
- 🚧 部分完成(含具体未完成点)
- ⏳ 待开发
- ⚠️ 仅需求备注(无视觉导出)
---
## 移动端页面映射
| 设计稿名称 | uniapp 页面路径 | 状态 | 备注 |
| --- | --- | --- | --- |
| 赛事中心(含世界杯专题入口) | `uniapp/src/pages/match/match.vue` | ✅ 已完成 | 2026-07-11 赛程、直播、赔率改为在赛事中心当前内容区域切换;运动和联赛分类仅在赛程显示,赔率只保留盘口与联赛/球队搜索,顶部蓝色世界杯专题卡仍进入专题页 |
| 赛事详情页 | `uniapp/src/pages/match_detail/match_detail.vue` | 🚧 部分完成 | 2026-05-29 优化顶部赛事摘要头部,补充联赛、对阵、状态与直播入口信息 |
| 世界杯专题页(排名导航) | `uniapp/src/packages_match/pages/worldcup.vue` | 🚧 部分完成 | 2026-05-20 已按设计稿拆分排名导航、积分榜、球员榜组件,后续可继续细化表格视觉与新闻页样式 |
| 首页 | `uniapp/src/pages/index/index.vue` | 待核对 | 需结合实际设计稿补充 |
| 新闻详情 | `uniapp/src/pages/news_detail/news_detail.vue` | 待核对 | 富文本与图片渲染已存在相关实现 |
| 个人中心 | 待补充 | 待核对 | 需核对实际页面路径 |
| AI 分析 | 待补充 | 待核对 | 需核对实际页面路径 |
| 世博头条 AI 助手 | `uniapp/src/pages/ai_assistant/ai_assistant.vue` | ⚠️ 仅需求备注(无视觉导出) | 2026-06-11 按产品方案新增免费对话助手,入口位于首页与个人中心 |
| 私聊聊天室 | `uniapp/src/pages/private_chat/room.vue` | ⚠️ 仅需求备注(无视觉导出) | 2026-06-11 新增 App 端语音输入面板,语音识别结果填入文字输入框后手动发送 |
---
## 管理后台页面映射
| 设计稿名称 | admin 页面路径 | 状态 | 备注 |
| --- | --- | --- | --- |
| 工作台 | 待补充 | 待核对 | 需核对实际页面路径 |
| 新闻/文章管理 | 待补充 | 待核对 | 需核对实际页面路径 |
| 系统配置 | 待补充 | 待核对 | 需核对实际页面路径 |
---
## PC 前台页面映射
| 设计稿名称 | pc 页面路径 | 状态 | 备注 |
| --- | --- | --- | --- |
| PC 首页 | `pc/pages/index.vue` | 待核对 | 需结合实际设计稿补充 |
| 新闻详情 | 待补充 | 待核对 | 需核对实际页面路径 |
---
## 维护规范
1. **新增设计稿 → 立即在对应表追加条目**,状态置为 ⏳。
2. **页面开发完成 → 更新状态为 ✅**
3. **设计稿变更 → 在备注列写明变更日期与差异点**
4. **需求备注节点不导出视觉**:标 ⚠️,不要在前端开发时寻找视觉资源。
5. **设计稿名称严格使用蓝湖/Figma 节点全称**,避免歧义。
@@ -0,0 +1,6 @@
# 赔率平台皇冠展示名实施计划
- [x] 修改前台 API 的 HG 平台名称映射。
- [x] 修改管理端赔率列表的 HG 平台名称映射。
- [x] 修改用户端赛事中心和比赛详情的默认平台名称。
- [x] 更新业务进度并检查仍需保留的“滚球盘”文案。
@@ -0,0 +1,6 @@
# 赔率平台皇冠展示名设计
- 将 `source_site=hg` 的平台展示名称由“滚球”统一改为“皇冠”。
- 前台接口、管理端赔率列表和用户端默认筛选选项保持一致。
- `platform_key=hg`、数据库历史数据、抓取任务和“滚球盘”盘口类型保持不变。
@@ -0,0 +1,294 @@
# 赛事中心赛程、直播、赔率组件实施计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use `executing-plans` to implement this plan task-by-task. 本项目未授权子代理、自动测试、构建、提交或部署。
**Goal:** 在赛事中心当前页面内用一个通用组件切换赛程、直播和赔率内容,不再因点击三个 Tab 切换到世界杯主题组件。
**Architecture:** `MatchCenterPanel.vue` 只保留赛事中心外壳和世界杯专题入口,新建 `MatchCenterTabsPanel.vue` 管理通用筛选、三个 Tab、数据加载和内容渲染。后端新增通用直播与赔率接口,并复用现有直播地址解析、赔率盘口格式化和赛事匹配逻辑;世界杯专题接口保持兼容。
**Tech Stack:** PHP 8 / ThinkPHP、Vue 3 `<script setup>`、TypeScript、uni-app、SCSS。
---
### Task 1: 通用直播查询
**Files:**
- Modify: `server/app/common/service/match/MatchLiveService.php`
- Modify: `server/app/api/controller/MatchController.php`
- [ ] **Step 1: 将世界杯直播查询抽成可传筛选条件的通用方法**
`MatchLiveService` 增加:
```php
public static function getLiveCards(int $sportType = 0, string $leagueName = ''): array
```
查询必须保留:
```php
->leftJoin('match m', 'm.id = live.match_id')
->where('live.fetch_status', 1)
```
`MatchLive` 模型已启用 `SoftDelete`,查询自动排除已软删除记录,不额外重复拼接 `delete_time` 条件。
条件规则:
```php
if ($sportType > 0) {
$query->where('m.sport_type', $sportType);
}
if ($leagueName !== '') {
$query->where('m.league_name', $leagueName);
}
```
`getWorldCupLiveCards()` 改为调用:
```php
return self::getLiveCards();
```
- [ ] **Step 2: 新增公开接口**
`MatchController::$notNeedLogin` 增加 `liveCards`,新增:
```php
public function liveCards()
{
$sportType = $this->request->get('sport_type/d', 0);
$leagueName = trim($this->request->get('league_name/s', ''));
return $this->data([
'list' => MatchLiveService::getLiveCards($sportType, $leagueName),
]);
}
```
- [ ] **Step 3: 保持世界杯接口响应兼容**
`worldCupLiveCards()` 继续返回 `season_id``list`,不改变专题页字段结构,但不再强制按世界杯赛事过滤。
### Task 2: 通用赔率查询
**Files:**
- Modify: `server/app/api/controller/MatchController.php`
- [ ] **Step 1: 抽取赔率列表构建方法**
新增私有方法:
```php
private function getOddsList(
string $showType,
string $sourceSite,
string $keyword,
int $includeSpecial,
int $limit,
int $sportType = 0,
string $leagueName = '',
bool $worldCupEventOnly = false
): array
```
`sport_type` 映射规则:
```php
private function resolveOddsSportType(int $sportType): string
{
$map = [1 => 'FT'];
return $map[$sportType] ?? '';
}
```
`sportType > 0` 且无法映射时直接返回空数组。`leagueName` 非空时对 `MatchOdds.league_name` 做精确筛选。
- [ ] **Step 2: 将赛事匹配扩展为通用匹配**
`buildWorldCupEventMap()` 改为:
```php
private function buildOddsEventMap(int $sportType = 0, string $leagueName = '', bool $worldCupOnly = false): array
```
通用查询以 `MatchEvent::where('is_show', 1)` 为基础;根据参数增加 `sport_type``league_name` 或世界杯条件,继续按标准化主客队键匹配。
- [ ] **Step 3: 新增通用赔率接口并保持专题接口**
`MatchController::$notNeedLogin` 增加 `odds`
```php
public function odds()
{
return $this->data([
'list' => $this->getOddsList(
$this->request->get('show_type/s', ''),
strtolower(trim($this->request->get('source_site/s', ''))),
trim($this->request->get('keyword/s', '')),
$this->request->get('include_special/d', 0),
min(max($this->request->get('limit/d', 120), 1), 300),
$this->request->get('sport_type/d', 0),
trim($this->request->get('league_name/s', ''))
),
]);
}
```
`worldCupOdds()` 调用同一方法并传 `worldCupEventOnly=true`,继续返回 `season_id`
### Task 3: 前端 API 类型与请求
**Files:**
- Modify: `uniapp/src/api/match.ts`
- [ ] **Step 1: 将专题类型改成可复用类型**
新增别名或通用接口:
```ts
export type MatchLiveCardItem = WorldCupLiveCardItem
export type MatchOddsMatchItem = WorldCupOddsMatchItem
```
- [ ] **Step 2: 增加通用请求方法**
```ts
export function getMatchLiveCards(data?: {
sport_type?: number
league_name?: string
}) {
return request.get({ url: '/match/liveCards', data }, { withToken: false })
}
export function getMatchOdds(data?: {
sport_type?: number
league_name?: string
show_type?: 'live' | 'today' | 'early'
source_site?: string
keyword?: string
include_special?: number
limit?: number
}) {
return request.get({ url: '/match/odds', data }, { withToken: false })
}
```
世界杯请求方法保持不变。
### Task 4: 通用赛事中心 Tab 组件
**Files:**
- Create: `uniapp/src/packages_match/components/MatchCenterTabsPanel.vue`
- Modify: `uniapp/src/packages_match/components/MatchCenterPanel.vue`
- [ ] **Step 1: 创建组件状态**
组件内部定义:
```ts
type MatchCenterTab = 'schedule' | 'live' | 'odds'
type OddsShowType = '' | 'live' | 'today' | 'early'
const activeTab = ref<MatchCenterTab>('schedule')
const currentSport = ref(0)
const currentLeague = ref('')
```
组件统一加载 `getSportTypes()``getMatchLeagues()`,运动和联赛分类只在赛程 Tab 显示并刷新赛程数据。
- [ ] **Step 2: 迁移赛程列表**
`MatchCenterPanel.vue` 迁移:
- `liveList``upcomingList``endedList`
- 已结束赛事分页
- `matchGroups`
- 分组折叠
- `fetchMatchList()``loadMore()``goDetail()`
- 当前运动和联赛筛选
- 现有 `match-card` 列表模板与样式
- [ ] **Step 3: 增加直播内容**
调用:
```ts
getMatchLiveCards()
```
直播卡复用世界杯直播卡现有的地址选择、主播信息、观看/关注人数格式化以及 H5/App 播放兼容逻辑,但不渲染世界杯主题头部。
- [ ] **Step 4: 增加赔率内容和筛选**
赔率请求:
```ts
getMatchOdds({
show_type: oddsShowType.value || undefined,
keyword: oddsKeyword.value || undefined,
include_special: 0,
limit: 300
})
```
保留:
- 全部/滚球盘/今日盘/早盘筛选
- 联赛/球队搜索输入框
- 不显示运动分类和联赛分类条
- 筛选、清空
- 独赢、让球、大小球盘口卡
- 匹配到站内赛事时进入比赛详情
- [ ] **Step 5: 精简赛事中心外壳**
`MatchCenterPanel.vue` 只保留:
```vue
<view class="match-header__title">...</view>
<view class="topic-entry" @tap="openWorldCupCenter">...</view>
<MatchCenterTabsPanel />
```
删除原 `topic-tabs` 的世界杯视图切换事件。蓝色专题卡仍调用:
```ts
emit('open-worldcup', { tab: 'schedule', cid })
```
### Task 5: 文档同步与人工验证建议
**Files:**
- Modify: `业务进度管理.md`
- Modify: `设计稿映射.md`
- [ ] **Step 1: 记录完成内容**
在业务进度中增加:
- 赛事中心三个通用 Tab。
- 通用直播和赔率接口。
- 世界杯专题入口与专题页保持兼容。
- 本次未执行构建、测试和部署。
- [ ] **Step 2: 更新设计稿映射**
将赛事中心备注更新为“赛程/直播/赔率在当前页面内容区切换,世界杯专题卡仍进入专题页”。
- [ ] **Step 3: 建议验证命令,不自动执行**
```powershell
php -l server\app\api\controller\MatchController.php
php -l server\app\common\service\match\MatchLiveService.php
cd uniapp
npm run build:h5
```
建议浏览器人工验证:
1. 赛事中心默认显示赛程。
2. 三个 Tab 切换时 URL 和页面外壳不切换为世界杯主题。
3. 直播不显示运动或联赛分类筛选,并展示全部可用直播。
4. 赔率不显示运动或联赛分类条,盘口和联赛/球队关键词筛选有效。
5. 世界杯专题卡仍能进入专题页。
@@ -0,0 +1,98 @@
# 赛事中心赛程、直播、赔率组件设计
## 目标
赛事中心在当前页面内提供“赛程 / 直播 / 赔率”三个内容 Tab。点击 Tab 只切换赛事列表区域,不再切换到世界杯主题组件。
蓝色世界杯专题卡继续保留,点击专题卡仍可进入原世界杯专题页;本次不删除或改变世界杯专题页原有功能。
## 页面结构
`MatchCenterPanel.vue` 保留赛事中心标题、AI 助手入口和世界杯专题卡。
新增通用赛事中心内容组件 `MatchCenterTabsPanel.vue`,统一负责:
- 赛程、直播、赔率 Tab 状态。
- 赛程 Tab 的运动分类和联赛筛选。
- 三类数据的加载、空状态和错误提示。
- 赛事详情、直播播放等交互。
世界杯专题卡与三个内容 Tab 分离:只有专题卡触发 `open-worldcup`,三个内容 Tab 不再向 `MatchShellPage.vue` 发送世界杯视图切换事件。
## 赛程 Tab
- 默认选中赛程。
- 沿用当前赛事中心的赛事列表样式和分组方式。
- 保留运动分类、联赛筛选、进行中/未开始/已结束分组、折叠状态和已结束赛事分页加载。
- 点击赛事卡继续进入现有比赛详情页。
## 直播 Tab
- 新增通用赛事直播接口,不复用只过滤世界杯的 `worldCupLiveCards`
- 以 `la_match_live` 的有效抓取状态和播放地址为准;赛事关联仅用于补充赛事信息,不作为显示前提。
- 不显示运动分类或联赛分类筛选,直接展示当前可用的全部直播。
- 直播卡保留赛事名称、主播、观看数、关注数、公告、封面和播放地址。
- H5、App 的视频播放和海报模式继续复用现有世界杯直播卡的兼容处理。
## 赔率 Tab
- 新增通用赛事赔率接口,不再依赖世界杯赛事映射。
- 继续读取 `la_match_odds`,保留滚球盘、今日盘、早盘筛选。
- 保留联赛/球队关键词搜索。
- 不显示赛程的运动分类或联赛分类筛选。
- 仅保留盘口类型筛选,以及按联赛名、主队、客队进行关键词搜索。
- 赔率记录与站内普通赛事匹配成功时补充赛事 ID、队徽、比分和状态,允许进入比赛详情;未匹配时只展示赔率。
- 继续过滤没有任何有效盘口值的空赔率记录。
## 后端接口
在现有 `MatchController` 和赛事服务中增加通用接口:
- `GET /api/match/liveCards`
- 参数:`sport_type``league_name`
- 返回通用直播卡列表。
- `GET /api/match/odds`
- 参数:`sport_type``league_name``show_type``source_site``keyword``include_special``limit`
- 返回按比赛聚合的赔率列表。
世界杯原接口继续保留,避免影响世界杯专题页:
- `/api/match/worldCupLiveCards`
- `/api/match/worldCupOdds`
通用与世界杯接口复用服务层的查询、格式化和赛事匹配方法,避免复制赔率盘口组装与直播地址解析逻辑。
世界杯直播接口不再强制按世界杯赛事过滤,和通用直播接口一样展示当前有效直播流。
## 状态与交互
- 切换 Tab 时按需加载对应数据,已加载数据可缓存,筛选条件改变后重新请求。
- 赛程、直播、赔率分别展示独立加载状态和空状态。
- 接口失败时保留当前筛选条件并展示无数据/提示,不影响切回其他 Tab。
- 赔率搜索确认、清除关键词和盘口切换均只刷新赔率数据。
## 改动范围
预计涉及:
- `uniapp/src/packages_match/components/MatchCenterPanel.vue`
- `uniapp/src/packages_match/components/MatchCenterTabsPanel.vue`
- `uniapp/src/api/match.ts`
- `server/app/api/controller/MatchController.php`
- `server/app/common/service/match/MatchLiveService.php`
- 赔率通用查询相关服务或控制器辅助方法
- `业务进度管理.md`
- `设计稿映射.md`
不修改数据库表结构,不新增页面路由。
## 验收标准
1. 赛事中心默认显示赛程内容。
2. 点击赛程、直播、赔率只切换当前页面列表区域。
3. 三个 Tab 切换时不出现世界杯主题头部。
4. 赛程保持现有赛事列表、运动分类、联赛筛选和分页行为。
5. 直播展示通用赛事直播,不局限于世界杯。
6. 赔率保留盘口分类和联赛/球队搜索筛选。
7. 世界杯专题卡仍能进入原世界杯专题页。
8. 原世界杯专题页的赛程、直播、赔率等功能不受影响。