386 lines
9.8 KiB
Markdown
Executable File
386 lines
9.8 KiB
Markdown
Executable File
# Xóc Đĩa 游戏集成完成报告
|
||
|
||
**日期**: 2026-01-08
|
||
**集成方式**: 方案 A(扩展 periods 表字段)
|
||
**状态**: ✅ 代码集成已完成,待数据库初始化
|
||
|
||
---
|
||
|
||
## 一、集成完成清单
|
||
|
||
### ✅ 数据库层
|
||
- [x] 创建数据库迁移脚本 `Db/xocdia_integration.sql`
|
||
- 扩展 periods 表(添加 coin1-4, red_count 字段)
|
||
- 插入 Xóc Đĩa 游戏记录
|
||
- 配置 6 种投注类型赔率
|
||
|
||
### ✅ 控制器层
|
||
- [x] `App/Controllers/Admin/PeriodController.php` - 扩展支持 Xóc Đĩa
|
||
- 新增 `drawXocdia()` 方法(开奖)
|
||
- 新增 `checkWinXocdia()` 方法(中奖判断)
|
||
- 修改 `draw()` 方法(游戏类型分发)
|
||
- 修改 `checkWin()` 方法(游戏类型分发)
|
||
|
||
- [x] `App/Controllers/Web/XocdiaController.php` - 适配使用现有表
|
||
- 修改 `index()` - 查询 games 表
|
||
- 修改 `room()` - 使用 periods 表
|
||
- 修改 `placeBet()` - 使用 bets 和 transactions 表
|
||
- 修改 API 方法 - 使用 periods 表字段
|
||
|
||
### ✅ 路由层
|
||
- [x] 清理 `routes.php`
|
||
- 删除独立后台路由 (`/admin/xocdia/*`)
|
||
- 保留前台路由 (`/xocdia/*`)
|
||
|
||
### ✅ 视图层
|
||
- [x] 删除独立后台视图
|
||
- 删除 `App/Views/Admin/xocdia_rooms.php`
|
||
- 删除 `App/Views/Admin/xocdia_periods.php`
|
||
- 删除后台菜单中的独立菜单项
|
||
|
||
- [x] 保留前台视图
|
||
- `App/Views/Web/xocdia_rooms.php` - 游戏大厅
|
||
- `App/Views/Web/xocdia_room.php` - 游戏房间
|
||
|
||
### ✅ 文档层
|
||
- [x] 创建 `XOCDIA_INTEGRATION_GUIDE.md`
|
||
- 数据库变更说明
|
||
- 代码变更说明
|
||
- 管理流程文档
|
||
- 前台访问流程
|
||
- 常见问题 FAQ
|
||
|
||
### ✅ 清理工作
|
||
- [x] 删除 `App/Controllers/Admin/XocdiaRoomController.php`
|
||
- [x] 删除 `App/Controllers/Admin/XocdiaPeriodController.php`
|
||
- [x] 删除 `Db/xocdia_schema.sql`(旧版独立 schema)
|
||
|
||
---
|
||
|
||
## 二、验证结果
|
||
|
||
### 文件存在性检查
|
||
|
||
```bash
|
||
✅ Db/xocdia_integration.sql (2292 字节)
|
||
✅ App/Controllers/Admin/PeriodController.php (973 行,包含 drawXocdia 和 checkWinXocdia 方法)
|
||
✅ App/Controllers/Web/XocdiaController.php (462 行)
|
||
✅ XOCDIA_INTEGRATION_GUIDE.md (388 行)
|
||
```
|
||
|
||
### 独立后台组件清理检查
|
||
|
||
```bash
|
||
✅ 无独立后台控制器 (App/Controllers/Admin/Xocdia*.php)
|
||
✅ 无独立后台视图 (App/Views/Admin/xocdia_*.php)
|
||
✅ 无旧版 schema (Db/xocdia_schema.sql)
|
||
```
|
||
|
||
### 代码集成检查
|
||
|
||
```bash
|
||
✅ PeriodController.php 包含 drawXocdia 方法 (第 304 行)
|
||
✅ PeriodController.php 包含 checkWinXocdia 方法 (第 900 行)
|
||
✅ PeriodController.php draw() 方法调用 drawXocdia (第 226 行)
|
||
✅ PeriodController.php checkWin() 方法调用 checkWinXocdia (第 752 行)
|
||
```
|
||
|
||
---
|
||
|
||
## 三、下一步操作指引
|
||
|
||
### 步骤 1:执行数据库迁移 ⚠️ 必须执行
|
||
|
||
```bash
|
||
# 备份数据库(重要!)
|
||
mysqldump -u tm68 -p tm68 > backup_$(date +%Y%m%d_%H%M%S).sql
|
||
|
||
# 执行迁移脚本
|
||
mysql -u tm68 -p tm68 < Db/xocdia_integration.sql
|
||
```
|
||
|
||
**预期输出**:
|
||
```
|
||
✅ Xóc Đĩa 游戏集成完成!
|
||
game_id: [新游戏 ID]
|
||
game_code: xocdia
|
||
```
|
||
|
||
### 步骤 2:验证数据库变更
|
||
|
||
```sql
|
||
-- 检查 periods 表新字段
|
||
SHOW COLUMNS FROM periods LIKE 'coin%';
|
||
|
||
-- 预期返回 5 行:coin1, coin2, coin3, coin4, red_count
|
||
|
||
-- 检查 Xóc Đĩa 游戏
|
||
SELECT * FROM games WHERE type = 'xocdia';
|
||
|
||
-- 预期返回 1 行游戏记录
|
||
|
||
-- 检查赔率配置
|
||
SELECT g.name, go.type, go.odds
|
||
FROM game_odds go
|
||
JOIN games g ON go.game_id = g.id
|
||
WHERE g.code = 'xocdia';
|
||
|
||
-- 预期返回 6 行赔率记录
|
||
```
|
||
|
||
### 步骤 3:后台管理测试
|
||
|
||
#### 3.1 创建 Xóc Đĩa 期号
|
||
|
||
1. 访问 `/admin/periods`
|
||
2. 选择游戏:"Xóc Đĩa"
|
||
3. 点击"开始新期号"
|
||
4. 验证期号格式:`G{GameID}{YYYYMMDD}{NNNN}`
|
||
|
||
#### 3.2 开奖测试
|
||
|
||
1. 在期号列表找到"待开奖"的 Xóc Đĩa 期号
|
||
2. 点击"开奖"
|
||
3. 选择开奖方式:
|
||
- **手动开奖**:选择 4 个硬币的颜色(红/白)
|
||
- **自动开奖**:系统随机生成
|
||
4. 验证结果字段:
|
||
- `coin1`, `coin2`, `coin3`, `coin4` = 0 或 1
|
||
- `red_count` = 0-4
|
||
- `result` = "even" 或 "odd"
|
||
|
||
#### 3.3 结算测试
|
||
|
||
1. 确认开奖结果无误
|
||
2. 点击"结算"
|
||
3. 验证:
|
||
- 投注记录状态更新(win/lose)
|
||
- 赢家余额增加
|
||
- 交易流水记录正确
|
||
- 期号状态变为 "settled"
|
||
|
||
### 步骤 4:前台用户测试
|
||
|
||
#### 4.1 游戏大厅
|
||
|
||
1. 访问 `/xocdia`
|
||
2. 验证:
|
||
- 显示 Xóc Đĩa 游戏卡片
|
||
- 显示当前期号
|
||
- 显示赔率信息
|
||
|
||
#### 4.2 游戏房间
|
||
|
||
1. 点击"进入房间"
|
||
2. 验证:
|
||
- 直播流播放(如已配置)
|
||
- 当前期号显示
|
||
- 6 种投注类型可选
|
||
- 赔率显示正确
|
||
|
||
#### 4.3 投注流程
|
||
|
||
1. 选择投注类型(双/单/4红/4白/3红1白/1红3白)
|
||
2. 输入金额(10 - 10000)
|
||
3. 点击"投注"
|
||
4. 验证:
|
||
- 余额实时扣除
|
||
- 投注记录显示
|
||
- 返回成功消息
|
||
|
||
#### 4.4 开奖结果
|
||
|
||
1. 等待开奖
|
||
2. 验证:
|
||
- 显示 4 个硬币结果(红色/白色)
|
||
- 显示红色硬币数量
|
||
- 显示单双结果
|
||
- 中奖投注显示奖金
|
||
|
||
### 步骤 5:边界情况测试
|
||
|
||
#### 测试用例
|
||
- [ ] 期号关闭后投注(应拒绝)
|
||
- [ ] 余额不足投注(应拒绝)
|
||
- [ ] 赔率配置缺失(应报错)
|
||
- [ ] 并发投注(同一用户多次下注)
|
||
- [ ] 骰子游戏和 Xóc Đĩa 共存(互不干扰)
|
||
|
||
---
|
||
|
||
## 四、集成架构说明
|
||
|
||
### 数据库表共享策略
|
||
|
||
| 表名 | 骰子游戏使用字段 | Xóc Đĩa 使用字段 | 共享字段 |
|
||
|------|---------------|---------------|---------|
|
||
| `games` | - | - | id, name, code, type, status |
|
||
| `periods` | dice1, dice2, dice3, total | coin1, coin2, coin3, coin4, red_count | id, game_id, period_number, status, result |
|
||
| `bets` | - | - | 全部字段(通用) |
|
||
| `game_odds` | - | - | 全部字段(通用) |
|
||
| `transactions` | - | - | 全部字段(通用) |
|
||
|
||
### 游戏类型识别
|
||
|
||
```php
|
||
// 通过 games.type 字段区分
|
||
$game = $db->get('games', ['type'], ['id' => $gameId]);
|
||
|
||
if ($game['type'] === 'xocdia') {
|
||
// 使用 coin1-4 字段
|
||
$this->drawXocdia($db, $id, $data);
|
||
} else {
|
||
// 使用 dice1-3 字段
|
||
$this->drawDice($db, $id, $data);
|
||
}
|
||
```
|
||
|
||
### 中奖判断逻辑
|
||
|
||
#### 骰子游戏
|
||
```php
|
||
private function checkWinDice($bet, $period, $oddsConfig) {
|
||
$total = $period['total']; // dice1 + dice2 + dice3
|
||
// 根据 bet_type 判断...
|
||
}
|
||
```
|
||
|
||
#### Xóc Đĩa
|
||
```php
|
||
private function checkWinXocdia($bet, $period, $oddsConfig) {
|
||
$redCount = $period['red_count']; // coin1 + coin2 + coin3 + coin4
|
||
|
||
switch ($bet['bet_type']) {
|
||
case 'even': // 双
|
||
return ($redCount % 2 == 0);
|
||
case 'four_red': // 4 红
|
||
return ($redCount == 4);
|
||
case 'three_red': // 3 红 1 白
|
||
return ($redCount == 3);
|
||
// ...
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 五、Xóc Đĩa 投注类型说明
|
||
|
||
| 投注类型 | bet_type | 中奖条件 | 赔率 | 示例 |
|
||
|---------|---------|---------|------|------|
|
||
| 双(Chẵn) | even | 红色硬币数量为 0, 2, 4 | 1:0.97 | 投 100,赢 97 |
|
||
| 单(Lẻ) | odd | 红色硬币数量为 1, 3 | 1:0.97 | 投 100,赢 97 |
|
||
| 4 红 | four_red | 4 个红色硬币 | 1:8.00 | 投 100,赢 800 |
|
||
| 4 白 | four_white | 0 个红色硬币(即 4 白) | 1:8.00 | 投 100,赢 800 |
|
||
| 3 红 1 白 | three_red | 3 个红色硬币 | 1:1.90 | 投 100,赢 190 |
|
||
| 1 红 3 白 | three_white | 1 个红色硬币 | 1:1.90 | 投 100,赢 190 |
|
||
|
||
---
|
||
|
||
## 六、常见问题解答
|
||
|
||
### Q1: 骰子游戏会受影响吗?
|
||
**答**:不会。两种游戏使用不同的字段,通过 `games.type` 区分,互不干扰。
|
||
|
||
### Q2: 如何修改赔率?
|
||
**答**:
|
||
1. 访问 `/admin/games`
|
||
2. 找到 Xóc Đĩa 游戏,点击"配置赔率"
|
||
3. 修改对应投注类型的赔率值
|
||
4. 保存
|
||
|
||
**注意**:修改赔率只影响新投注,已下注订单使用下注时的赔率(快照机制)。
|
||
|
||
### Q3: 如何添加新的 Xóc Đĩa 游戏房间?
|
||
**答**:
|
||
1. 在 `/admin/games` 创建新游戏
|
||
2. 游戏类型选择 `xocdia`
|
||
3. 配置该游戏的赔率(可以与现有游戏不同)
|
||
4. 前台 `/xocdia` 会自动显示所有 Xóc Đĩa 游戏
|
||
|
||
### Q4: 如何配置直播流?
|
||
**答**:
|
||
1. 在 `/admin/games` 编辑 Xóc Đĩa 游戏
|
||
2. 填写 `stream_url` 字段(支持 HLS/FLV/MPEGTS)
|
||
3. 保存后,前台游戏房间会自动播放
|
||
|
||
---
|
||
|
||
## 七、技术支持
|
||
|
||
### 日志位置
|
||
- 错误日志:`Storage/log/error.log`
|
||
- 数据库查询日志:Medoo 不记录日志,可通过 `$db->medoo->last()` 查看最后执行的 SQL
|
||
|
||
### 调试模式
|
||
在 `index.php` 开启调试:
|
||
```php
|
||
error_reporting(E_ALL);
|
||
ini_set('display_errors', 1);
|
||
```
|
||
|
||
### 数据库工具
|
||
```bash
|
||
# 查看最后执行的 SQL
|
||
$sql = $db->medoo->last();
|
||
echo $sql;
|
||
|
||
# 查看错误信息
|
||
$error = $db->medoo->error();
|
||
print_r($error);
|
||
```
|
||
|
||
---
|
||
|
||
## 八、回滚方案
|
||
|
||
如果需要回滚集成:
|
||
|
||
```sql
|
||
-- 删除 Xóc Đĩa 游戏记录
|
||
DELETE FROM games WHERE code = 'xocdia';
|
||
|
||
-- 删除赔率配置
|
||
DELETE FROM game_odds WHERE game_id = (SELECT id FROM games WHERE code = 'xocdia');
|
||
|
||
-- 删除扩展字段(可选,不影响骰子游戏)
|
||
ALTER TABLE periods
|
||
DROP COLUMN coin1,
|
||
DROP COLUMN coin2,
|
||
DROP COLUMN coin3,
|
||
DROP COLUMN coin4,
|
||
DROP COLUMN red_count;
|
||
```
|
||
|
||
---
|
||
|
||
## 九、性能优化建议
|
||
|
||
### 数据库索引
|
||
```sql
|
||
-- 为常用查询添加索引
|
||
CREATE INDEX idx_periods_game_status ON periods(game_id, status);
|
||
CREATE INDEX idx_bets_period_user ON bets(period_id, user_id);
|
||
```
|
||
|
||
### 缓存策略
|
||
- 游戏列表缓存(Redis)
|
||
- 赔率配置缓存(Redis)
|
||
- 当前期号缓存(Redis,60秒过期)
|
||
|
||
### 前台优化
|
||
- 使用 WebSocket 推送开奖结果(避免轮询)
|
||
- 投注记录分页加载
|
||
- 开奖历史延迟加载
|
||
|
||
---
|
||
|
||
**集成完成日期**: 2026-01-08
|
||
**文档版本**: 1.0.0
|
||
**负责人**: Claude AI
|
||
**状态**: ✅ 代码集成完成,待数据库初始化和测试
|
||
|
||
---
|
||
|
||
**下一步**: 执行数据库迁移脚本,按照"步骤 1"开始验证
|