Files
chatroom/app/Http/Controllers/Admin/IdiomController.php
T
2026-04-29 10:32:12 +08:00

129 lines
3.9 KiB
PHP

<?php
/**
* 文件功能:猜成语题库后台管理控制器
* 提供成语题目的列表展示、创建、编辑、删除、启用/禁用功能
*
* @author ChatRoom Laravel
*
* @version 1.0.0
*/
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\GameConfig;
use App\Models\Idiom;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
/**
* 类功能:负责猜成语题库与后台参数管理。
*/
class IdiomController extends Controller
{
/**
* 方法功能:显示所有成语题目列表。
*/
public function index(): View
{
$idioms = Idiom::orderBy('sort')->orderBy('id')->get();
return view('admin.idioms.index', compact('idioms'));
}
/**
* 方法功能:创建新的成语题目。
*/
public function store(Request $request): RedirectResponse
{
$data = $request->validate([
'answer' => 'required|string|max:50',
'hint' => 'required|string|max:255',
'sort' => 'required|integer|min:0',
'is_active' => 'boolean',
]);
$data['is_active'] = $request->boolean('is_active', true);
Idiom::create($data);
return redirect()->route('admin.idioms.index')->with('success', '成语题目已添加!');
}
/**
* 方法功能:更新已有成语题目。
*/
public function update(Request $request, Idiom $idiom): RedirectResponse
{
$data = $request->validate([
'answer' => 'required|string|max:50',
'hint' => 'required|string|max:255',
'sort' => 'required|integer|min:0',
'is_active' => 'boolean',
]);
$data['is_active'] = $request->boolean('is_active');
$idiom->update($data);
return redirect()->route('admin.idioms.index')->with('success', "题目「{$idiom->answer}」已更新!");
}
/**
* 方法功能:通过 AJAX 切换题目的启用状态。
*/
public function toggle(Idiom $idiom): JsonResponse
{
$idiom->update(['is_active' => ! $idiom->is_active]);
return response()->json([
'ok' => true,
'is_active' => $idiom->is_active,
'message' => $idiom->is_active ? "{$idiom->answer}」已启用" : "{$idiom->answer}」已禁用",
]);
}
/**
* 方法功能:删除指定成语题目。
*/
public function destroy(Idiom $idiom): RedirectResponse
{
$answer = $idiom->answer;
$idiom->delete();
return redirect()->route('admin.idioms.index')->with('success', "题目「{$answer}」已删除!");
}
/**
* 方法功能:保存猜成语游戏参数而不覆盖其他游戏配置字段。
*/
public function saveSettings(Request $request): RedirectResponse
{
$data = $request->validate([
'reward_gold' => 'required|integer|min:0',
'reward_exp' => 'required|integer|min:0',
'auto_start_interval' => 'required|integer|min:0',
'expire_minutes' => 'required|integer|min:0',
]);
$config = GameConfig::firstOrCreate(
['game_key' => 'idiom'],
['name' => '猜成语', 'icon' => '🧩', 'enabled' => false],
);
// 合并现有 params,只覆盖本次后台提交的字段,避免误删其他游戏参数。
$existingParams = $config->params ?? [];
$config->params = array_merge($existingParams, [
'reward_gold' => (int) $data['reward_gold'],
'reward_exp' => (int) $data['reward_exp'],
'auto_start_interval' => (int) $data['auto_start_interval'],
'expire_minutes' => (int) $data['expire_minutes'],
]);
$config->save();
$config->clearCache();
return redirect()->route('admin.idioms.index')->with('success', '游戏参数已保存!');
}
}