Files
pk10/XOCDIA_INTEGRATION_GUIDE.md

388 lines
10 KiB
Markdown
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Xóc Đĩa 游戏集成指南
## 概述
Xóc Đĩa 游戏已成功集成到现有的游戏管理系统中,复用了骰子游戏的核心架构(`games`, `periods`, `bets`, `game_odds`, `transactions` 表),无需创建独立的数据库表和后台管理界面。
---
## 数据库变更
### 1. 扩展 `periods` 表(方案 A
在原有骰子字段(dice1, dice2, dice3)的基础上,新增了硬币字段:
```sql
ALTER TABLE `periods`
ADD COLUMN `coin1` TINYINT DEFAULT NULL COMMENT '硬币11=红,0=白)',
ADD COLUMN `coin2` TINYINT DEFAULT NULL COMMENT '硬币21=红,0=白)',
ADD COLUMN `coin3` TINYINT DEFAULT NULL COMMENT '硬币31=红,0=白)',
ADD COLUMN `coin4` TINYINT DEFAULT NULL COMMENT '硬币41=红,0=白)',
ADD COLUMN `red_count` TINYINT DEFAULT NULL COMMENT '红色硬币数量(0-4';
```
**设计说明**
- 骰子游戏使用:`dice1`, `dice2`, `dice3`, `total`, `result`
- Xóc Đĩa 使用:`coin1`, `coin2`, `coin3`, `coin4`, `red_count`, `result`
- 两种游戏可共存,不会相互干扰
### 2. 在 `games` 表中添加 Xóc Đĩa 游戏
```sql
INSERT INTO `games` (
`name`, `code`, `type`, `tags`, `sort_order`, `status`, `featured`
) VALUES (
'Xóc Đĩa',
'xocdia',
'xocdia',
'越南传统,硬币游戏',
10,
1,
1
);
```
### 3. 配置赔率(`game_odds` 表)
```sql
-- Xóc Đĩa 投注类型及赔率:
INSERT INTO `game_odds` (`game_id`, `type`, `target`, `odds`) VALUES
(@xocdia_game_id, 'even', 'all', 0.97), -- 双(偶数个红色)
(@xocdia_game_id, 'odd', 'all', 0.97), -- 单(奇数个红色)
(@xocdia_game_id, 'four_red', 'all', 8.00), -- 4 红
(@xocdia_game_id, 'four_white', 'all', 8.00),-- 4 白
(@xocdia_game_id, 'three_red', 'all', 1.90), -- 3 红 1 白
(@xocdia_game_id, 'three_white', 'all', 1.90);-- 1 红 3 白
```
---
## 代码变更
### 1. `PeriodController` 扩展
**文件**: `App/Controllers/Admin/PeriodController.php`
**新增方法**
- `drawXocdia($db, $id, $data)` - 处理 Xóc Đĩa 开奖(4 个硬币)
- `checkWinXocdia($bet, $period, $oddsConfig)` - 判断 Xóc Đĩa 中奖
**修改方法**
- `draw()` - 根据游戏类型(`games.type`)分发到 `drawDice()``drawXocdia()`
- `checkWin()` - 根据游戏类型分发到 `checkWinDice()``checkWinXocdia()`
**开奖逻辑**
```php
if ($gameType === 'xocdia') {
// 生成 4 个硬币结果(0=白,1=红)
$coin1 = rand(0, 1);
$coin2 = rand(0, 1);
$coin3 = rand(0, 1);
$coin4 = rand(0, 1);
$redCount = $coin1 + $coin2 + $coin3 + $coin4;
$result = ($redCount % 2 == 0) ? 'even' : 'odd';
}
```
**中奖判断**
```php
switch ($betType) {
case 'even': // 双
if ($redCount % 2 == 0) $isWin = true;
break;
case 'four_red': // 4 红
if ($redCount == 4) $isWin = true;
break;
case 'three_red': // 3 红 1 白
if ($redCount == 3) $isWin = true;
break;
// ...
}
```
### 2. 前台控制器
**文件**: `App/Controllers/Web/XocdiaController.php`
**功能**
- `index()` - 显示所有 Xóc Đĩa 类型的游戏列表
- `room()` - 游戏房间界面
- `placeBet()` - 下注(使用 `bets` 表)
- `getCurrentPeriod()` - 获取当前期号
- `getHistory()` - 获取开奖历史
- `getMyBets()` - 获取用户投注记录
**数据访问**
-`games` 表读取游戏配置(`type='xocdia'`
-`game_odds` 表读取赔率
-`periods` 表读取期号
-`bets` 表记录投注
### 3. 路由配置
**文件**: `routes.php`
**保留前台路由**
```php
// Xóc Đĩa 前台路由
['GET', '/xocdia', '\App\Controllers\Web\XocdiaController@index'],
['GET', '/xocdia/room', '\App\Controllers\Web\XocdiaController@room'],
['GET', '/api/xocdia/periods/current', '\App\Controllers\Web\XocdiaController@getCurrentPeriod'],
['POST', '/api/xocdia/bet', '\App\Controllers\Web\XocdiaController@placeBet'],
['GET', '/api/xocdia/periods/history', '\App\Controllers\Web\XocdiaController@getHistory'],
['GET', '/api/xocdia/my-bets', '\App\Controllers\Web\XocdiaController@getMyBets'],
```
**删除后台路由**
- 不再需要独立的 `/admin/xocdia/*` 路由
- 使用现有的 `/admin/games`, `/admin/periods` 管理
---
## 管理流程
### 1. 创建 Xóc Đĩa 游戏
**后台路径**: `/admin/games`
1. 点击"添加游戏"
2. 填写信息:
- 游戏名称:`Xóc Đĩa`
- 游戏标识:`xocdia`(自动生成)
- 游戏类型:`xocdia`
- 直播流地址:(可选)
3. 点击"保存"
### 2. 配置赔率
**后台路径**: `/admin/games` → 点击游戏 → "配置赔率"
配置以下投注类型:
- `even`: 双(0.97
- `odd`: 单(0.97
- `four_red`: 4 红(8.00
- `four_white`: 4 白(8.00
- `three_red`: 3 红 1 白(1.90
- `three_white`: 1 红 3 白(1.90
### 3. 期号管理
**后台路径**: `/admin/periods`
#### 启动新期号
1. 选择游戏:`Xóc Đĩa`
2. 点击"开始下注"
3. 系统自动生成期号(格式:`G{GameID}{YYYYMMDD}{NNNN}`
#### 开奖
1. 在期号列表中找到"待开奖"的期号
2. 点击"开奖"
3. 选择 4 个硬币的结果:
- 手动选择:每个硬币选择"红"或"白"
- 自动开奖:系统随机生成 4 个硬币结果
4. 系统自动计算红色硬币数量和单双结果
#### 结算
1. 确认开奖结果无误
2. 点击"结算"
3. 系统自动:
- 查询该期所有投注
- 判断输赢
- 更新用户余额(赢的情况)
- 记录交易流水
- 更新投注状态(win/lose
---
## 前台访问
### 用户访问流程
1. **游戏大厅**:访问 `/xocdia`
- 显示所有可用的 Xóc Đĩa 游戏
- 显示当前期号、赔率、限红
2. **进入房间**:点击"进入房间"
- URL`/xocdia/room?room_id={game_id}`
- 实时显示:当前期号、倒计时、开奖结果
- 投注区域:6 种投注类型
3. **下注**
- 选择投注类型(双/单/4红/4白/3红1白/1红3白)
- 输入金额(10 - 10000
- 点击"投注"
4. **查看结果**
- 开奖历史:最近 5 期结果
- 我的投注:当前期号的投注记录
---
## 数据库安装
### 执行 SQL 脚本
```bash
mysql -u 用户名 -p 数据库名 < Db/xocdia_integration.sql
```
**脚本内容**
1. 扩展 `periods` 表(添加硬币字段)
2. 插入 Xóc Đĩa 游戏记录
3. 配置赔率
**验证安装**
```sql
-- 检查 periods 表字段
SHOW COLUMNS FROM periods LIKE 'coin%';
-- 检查游戏是否创建
SELECT * FROM games WHERE type = 'xocdia';
-- 检查赔率配置
SELECT g.name, go.type, go.odds
FROM game_odds go
JOIN games g ON go.game_id = g.id
WHERE g.code = 'xocdia';
```
---
## 投注类型说明
| 投注类型 | bet_type | 条件 | 赔率 |
|---------|---------|------|------|
| 双(Chẵn) | even | 红色硬币数量为 0, 2, 4 | 1:0.97 |
| 单(Lẻ) | odd | 红色硬币数量为 1, 3 | 1:0.97 |
| 4 红 | four_red | 4 个红色硬币 | 1:8.00 |
| 4 白 | four_white | 0 个红色硬币(即 4 白) | 1:8.00 |
| 3 红 1 白 | three_red | 3 个红色硬币 | 1:1.90 |
| 1 红 3 白 | three_white | 1 个红色硬币 | 1:1.90 |
---
## 常见问题
### Q1: 骰子游戏和 Xóc Đĩa 会冲突吗?
**答**:不会。两种游戏使用不同的字段:
- 骰子:`dice1`, `dice2`, `dice3`, `total`
- Xóc Đĩa`coin1`, `coin2`, `coin3`, `coin4`, `red_count`
系统根据 `games.type` 字段区分游戏类型。
### Q2: 如何在后台区分两种游戏的期号?
**答**:在期号列表中,通过"游戏名称"列区分:
- 骰子游戏:`games.type = 'dice'`
- Xóc Đĩa`games.type = 'xocdia'`
开奖时,系统自动根据游戏类型调用不同的逻辑。
### Q3: 如何修改赔率?
**答**
1. 访问 `/admin/games`
2. 找到 Xóc Đĩa 游戏,点击"配置赔率"
3. 修改对应投注类型的赔率值
4. 点击"保存"
**注意**:修改赔率只影响新的投注,已下注的订单使用下注时的赔率。
### Q4: 如何添加新的 Xóc Đĩa 游戏(不同房间)?
**答**
1.`/admin/games` 创建新游戏
2. 游戏类型选择 `xocdia`
3. 配置该游戏的赔率(可以与现有游戏不同)
4. 前台 `/xocdia` 会自动显示所有 Xóc Đĩa 游戏
---
## 技术细节
### 数据流
```
用户下注
验证(余额、期号状态、赔率)
开启事务
扣除余额(users.balance
记录投注(bets 表)
记录流水(transactions 表)
提交事务
```
```
管理员开奖
根据 game.type 判断游戏类型
生成结果(4 个硬币或 3 个骰子)
更新 periods 表(coin1-4 或 dice1-3
管理员结算
查询该期所有投注
遍历判断输赢(checkWinXocdia 或 checkWinDice
更新用户余额(赢的情况)
记录交易流水
更新投注状态
```
### 安全措施
1. **并发控制**:使用数据库事务防止并发扣款
2. **权限检查**:所有后台操作需要管理员权限
3. **参数化查询**:使用 Medoo ORM 防止 SQL 注入
4. **余额验证**:下注前检查用户余额
5. **期号状态验证**:只能在"待开奖"期号下注
---
## 后续优化建议
1. **配置限红**:当前限红(10 - 10000)硬编码在代码中,建议存储到 `games` 表或单独的配置表
2. **抽水功能**:当前未实现抽水逻辑,建议添加抽水率配置
3. **倒计时功能**:前台倒计时当前通过轮询实现,建议使用 WebSocket 推送
4. **实时监控**:建议添加实时投注统计和风控监控页面
5. **历史查询**:添加更丰富的历史查询筛选条件(日期、投注类型等)
---
## 相关文件清单
### 数据库
- `Db/xocdia_integration.sql` - 数据库集成脚本
### 控制器
- `App/Controllers/Admin/PeriodController.php` - 期号管理(已扩展支持 Xóc Đĩa)
- `App/Controllers/Admin/GameController.php` - 游戏管理(复用)
- `App/Controllers/Web/XocdiaController.php` - 前台控制器
### 视图
- `App/Views/Web/xocdia_rooms.php` - 游戏大厅
- `App/Views/Web/xocdia_room.php` - 游戏房间
- `App/Views/Admin/games.php` - 游戏管理(复用)
- `App/Views/Admin/periods.php` - 期号管理(复用)
### 路由
- `routes.php` - 路由配置(包含 Xóc Đĩa 前台路由)
---
**最后更新**: 2026-01-08
**集成方式**: 方案 A(扩展 periods 表字段)
**状态**: 已完成集成,待测试