no message
This commit is contained in:
@@ -0,0 +1,399 @@
|
||||
# Sport-Era 体育咨询AI平台 - 产品方案文档
|
||||
|
||||
> 版本:v1.1(Demo版)
|
||||
> 日期: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订阅的真实支付渠道 | 上线前对接 |
|
||||
@@ -0,0 +1,678 @@
|
||||
# Sport-Era 体育咨询AI平台 - 实现流程文档
|
||||
|
||||
> 版本:v1.1(Demo版)
|
||||
> 日期: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路由规划
|
||||
|
||||
### 前台API(app/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 | 优化迭代 | 持续 | 性能优化+数据积累+模型调优 |
|
||||
@@ -0,0 +1,70 @@
|
||||
# Gitea 部署说明
|
||||
|
||||
> 部署时间:2026-07-31
|
||||
>
|
||||
> 当前阶段:安装已完成,服务正常运行。
|
||||
|
||||
## 访问方式
|
||||
|
||||
- 正式访问地址:<https://git.zones.sbnews.net/>
|
||||
- 后端监听:`0.0.0.0:3000`。该端口仍保留用于服务器直连和 Nginx 反向代理,但日常访问应使用 HTTPS 域名。
|
||||
- 协议:HTTPS(Nginx 终止 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)。
|
||||
+1846
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,93 @@
|
||||
# 测试服务器运行环境
|
||||
|
||||
> 采集时间:2026-07-31 15:59(Asia/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 状态、模板标签和工作区改动;不自动执行构建、测试、提交或部署。
|
||||
@@ -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。
|
||||
- 原赔率模板、状态与请求逻辑保留,后续恢复入口时只需调整开关。
|
||||
|
||||
@@ -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 常见问题
|
||||
|
||||
#### 问题1:API请求失败
|
||||
- **原因**:频率限制、IP封禁、API变更
|
||||
- **解决**:调整请求间隔,更换User-Agent,检查API地址
|
||||
|
||||
#### 问题2:数据库连接失败
|
||||
- **原因**:数据库服务未启动、配置错误
|
||||
- **解决**:检查数据库服务状态,验证连接配置
|
||||
|
||||
#### 问题3:Playwright启动失败
|
||||
- **原因**:浏览器未安装、权限问题
|
||||
- **解决**:运行`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` | 测试完整系统 |
|
||||
@@ -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. 原世界杯专题页的赛程、直播、赔率等功能不受影响。
|
||||
Reference in New Issue
Block a user