feat: 猜成语游戏 - 完整题库、管理后台、答题弹窗

- 创建 idioms 表(102条谜语式成语题库)和 idiom_game_rounds 表
- 后台成语管理页面:增删改题目 + 游戏参数(金币/经验/间隔)内联设置 + 出题按钮
- IdiomQuizController:出题/答题/当前回合查询,Redis 防并发抢答
- IdiomGameStarted / IdiomGameAnswered 广播事件
- 前端答题弹窗模块:聊天消息带【答题】按钮,点击弹出输入框
- GameConfig 注册 idiom 游戏,由 admin.game-configs 统一管理开关
This commit is contained in:
pllx
2026-04-28 23:42:48 +08:00
parent 461c6a6f56
commit 4ff62e29bd
20 changed files with 1497 additions and 1 deletions
+18
View File
@@ -274,6 +274,7 @@ Route::middleware(['chat.auth'])->group(function () {
'fishing' => \App\Models\GameConfig::isEnabled('fishing'),
'lottery' => \App\Models\GameConfig::isEnabled('lottery'),
'gomoku' => \App\Models\GameConfig::isEnabled('gomoku'),
'idiom' => \App\Models\GameConfig::isEnabled('idiom'),
]);
})->name('games.enabled');
@@ -291,6 +292,13 @@ Route::middleware(['chat.auth'])->group(function () {
->middleware('throttle:chat-send')
->name('chat.pat');
// 猜成语游戏
Route::prefix('idiom-quiz')->name('idiom-quiz.')->group(function () {
Route::post('/start', [\App\Http\Controllers\IdiomQuizController::class, 'start'])->name('start');
Route::post('/answer', [\App\Http\Controllers\IdiomQuizController::class, 'answer'])->name('answer');
Route::get('/current', [\App\Http\Controllers\IdiomQuizController::class, 'current'])->name('current');
});
// 挂机心跳存点 (限制每分钟最多调用 6 次防止挂机脚本滥用)
Route::post('/room/{id}/heartbeat', [ChatController::class, 'heartbeat'])
->middleware('throttle:6,1')
@@ -581,6 +589,16 @@ Route::middleware(['chat.auth', 'chat.has_position'])->prefix('admin')->name('ad
Route::post('/{fishing}/toggle', [\App\Http\Controllers\Admin\FishingEventController::class, 'toggle'])->name('toggle');
Route::delete('/{fishing}', [\App\Http\Controllers\Admin\FishingEventController::class, 'destroy'])->name('destroy');
});
// ── 猜成语题库 ──
Route::prefix('idioms')->name('idioms.')->group(function () {
Route::get('/', [\App\Http\Controllers\Admin\IdiomController::class, 'index'])->name('index');
Route::post('/', [\App\Http\Controllers\Admin\IdiomController::class, 'store'])->name('store');
Route::put('/{idiom}', [\App\Http\Controllers\Admin\IdiomController::class, 'update'])->name('update');
Route::post('/{idiom}/toggle', [\App\Http\Controllers\Admin\IdiomController::class, 'toggle'])->name('toggle');
Route::delete('/{idiom}', [\App\Http\Controllers\Admin\IdiomController::class, 'destroy'])->name('destroy');
Route::post('/settings', [\App\Http\Controllers\Admin\IdiomController::class, 'saveSettings'])->name('settings.save');
});
});
// ──────────────────────────────────────────────────────────────