Initial commit: 投注游戏平台初始化

This commit is contained in:
li
2026-02-25 01:26:58 +08:00
commit 77ca2cc8b3
275 changed files with 237479 additions and 0 deletions
+387
View File
@@ -0,0 +1,387 @@
# 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 表字段)
**状态**: 已完成集成,待测试