功能:字体颜色持久化、等级体系升级至99级、钓鱼小游戏、补充系统参数

- 字体颜色:s_color 改为 varchar,发消息时保存颜色,进入聊天室自动恢复
- 等级体系:maxlevel 15→99,superlevel 16→100,99级经验阶梯(幂次曲线)
- 管理权限等级按比例调整:禁言50、踢人60、设公告60、封号80、封IP90
- 钓鱼小游戏:FishingController(抛竿扣金币+收竿随机结果+广播)
- 补充6个缺失的 sysparam 参数 + 4个钓鱼参数
- 用户列表点击用户名后自动聚焦输入框
- Pint 格式化
This commit is contained in:
2026-02-26 21:10:34 +08:00
parent d884853968
commit ea06328885
652 changed files with 5013 additions and 1274 deletions
@@ -0,0 +1,97 @@
<?php
/**
* 文件功能:自动事件管理控制器
* 管理员可在后台增删改随机事件(好运/坏运/经验/金币奖惩等)
* 复刻原版 ASP 聊天室的 autoact 管理功能
*
* @author ChatRoom Laravel
*
* @version 1.0.0
*/
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Autoact;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
class AutoactController extends Controller
{
/**
* 显示所有自动事件列表
*/
public function index(): View
{
$events = Autoact::orderByDesc('id')->get();
return view('admin.autoact.index', compact('events'));
}
/**
* 保存新事件
*/
public function store(Request $request): RedirectResponse
{
$data = $request->validate([
'text_body' => 'required|string|max:500',
'event_type' => 'required|in:good,bad,neutral',
'exp_change' => 'required|integer',
'jjb_change' => 'required|integer',
]);
$data['enabled'] = true;
Autoact::create($data);
return redirect()->route('admin.autoact.index')->with('success', '事件添加成功!');
}
/**
* 更新事件
*/
public function update(Request $request, int $id): RedirectResponse
{
$event = Autoact::findOrFail($id);
$data = $request->validate([
'text_body' => 'required|string|max:500',
'event_type' => 'required|in:good,bad,neutral',
'exp_change' => 'required|integer',
'jjb_change' => 'required|integer',
]);
$event->update($data);
return redirect()->route('admin.autoact.index')->with('success', '事件修改成功!');
}
/**
* 切换事件启用/禁用状态
*/
public function toggle(int $id): JsonResponse
{
$event = Autoact::findOrFail($id);
$event->enabled = ! $event->enabled;
$event->save();
return response()->json([
'status' => 'success',
'enabled' => $event->enabled,
'message' => $event->enabled ? '已启用' : '已禁用',
]);
}
/**
* 删除事件
*/
public function destroy(int $id): RedirectResponse
{
Autoact::findOrFail($id)->delete();
return redirect()->route('admin.autoact.index')->with('success', '事件已删除!');
}
}
@@ -0,0 +1,68 @@
<?php
/**
* 文件功能:后台房间管理控制器
* 管理员可查看、编辑房间信息(名称、介绍、公告等)
*
* @author ChatRoom Laravel
*
* @version 1.0.0
*/
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Room;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
class RoomManagerController extends Controller
{
/**
* 显示所有房间列表
*/
public function index(): View
{
$rooms = Room::orderBy('id')->get();
return view('admin.rooms.index', compact('rooms'));
}
/**
* 更新房间信息
*/
public function update(Request $request, int $id): RedirectResponse
{
$room = Room::findOrFail($id);
$data = $request->validate([
'room_name' => 'required|string|max:100',
'room_des' => 'nullable|string|max:500',
'announcement' => 'nullable|string|max:500',
'room_owner' => 'nullable|string|max:50',
'permit_level' => 'required|integer|min:0|max:15',
'door_open' => 'required|boolean',
]);
$room->update($data);
return redirect()->route('admin.rooms.index')->with('success', "房间 [{$room->room_name}] 信息已更新!");
}
/**
* 删除房间(非系统房间)
*/
public function destroy(int $id): RedirectResponse
{
$room = Room::findOrFail($id);
if ($room->room_keep) {
return redirect()->route('admin.rooms.index')->with('error', '系统房间不允许删除!');
}
$room->delete();
return redirect()->route('admin.rooms.index')->with('success', "房间 [{$room->room_name}] 已删除!");
}
}
@@ -1,76 +0,0 @@
<?php
/**
* 文件功能:后台 SQL 探针
* (替代原版 SQL.ASP,严格限制为只读模式)
*
* @author ChatRoom Laravel
*
* @version 1.0.0
*/
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\View\View;
class SqlController extends Controller
{
/**
* 显示 SQL 执行沙盒界面
*/
public function index(): View
{
return view('admin.sql.index', ['results' => null, 'query' => '', 'columns' => []]);
}
/**
* 极度受限地执行 SQL (仅限 SELECT)
*/
public function execute(Request $request): View
{
$request->validate([
'query' => 'required|string|min:6',
]);
$sql = trim($request->input('query'));
// 安全拦截:绝不允许含有 update/delete/insert/truncate/drop 等破坏性指令
// 我们只允许查询,所以要求必须以 SELECT 起手,或者 EXPLAIN/SHOW
if (! preg_match('/^(SELECT|EXPLAIN|SHOW|DESCRIBE)\s/i', $sql)) {
return view('admin.sql.index', [
'results' => null,
'columns' => [],
'query' => $sql,
'error' => '安全保护触发:本探针只允许执行 SELECT / SHOW 等只读查询!',
]);
}
try {
$results = DB::select($sql);
// 提取表头
$columns = [];
if (! empty($results)) {
$firstRow = (array) $results[0];
$columns = array_keys($firstRow);
}
return view('admin.sql.index', [
'results' => $results,
'columns' => $columns,
'query' => $sql,
'error' => null,
]);
} catch (\Exception $e) {
return view('admin.sql.index', [
'results' => null,
'columns' => [],
'query' => $sql,
'error' => 'SQL 执行发生异常: '.$e->getMessage(),
]);
}
}
}
@@ -53,6 +53,9 @@ class SystemController extends Controller
// 写入 Cache 保证极速读取
$this->chatState->setSysParam($alias, $body);
// 同时清除 Sysparam 模型的内部缓存
SysParam::clearCache($alias);
}
return redirect()->route('admin.system.edit')->with('success', '系统参数已成功更新并生效!');
@@ -52,17 +52,23 @@ class UserManagerController extends Controller
return response()->json(['status' => 'error', 'message' => '权限不足:您无法修改同级或高级管理人员资料。'], 403);
}
// 管理员级别 = 最高等级 + 1,后台编辑最高可设到管理员级别
$adminLevel = (int) \App\Models\Sysparam::getValue('maxlevel', '15') + 1;
$validated = $request->validate([
'sex' => 'sometimes|in:男,女,保密',
'user_level' => 'sometimes|integer|min:0',
'sex' => 'sometimes|integer|in:0,1,2',
'user_level' => "sometimes|integer|min:0|max:{$adminLevel}",
'exp_num' => 'sometimes|integer|min:0',
'jjb' => 'sometimes|integer|min:0',
'meili' => 'sometimes|integer|min:0',
'qianming' => 'sometimes|nullable|string|max:255',
'headface' => 'sometimes|string|max:50',
'sign' => 'sometimes|string|max:255',
'password' => 'nullable|string|min:6',
]);
// 如果传了且没超权,直接赋予
if (isset($validated['user_level'])) {
// 不能把自己或别人提权到超过自己的等级
// 不能把别人提权到超过自己的等级
if ($validated['user_level'] > $currentUser->user_level && $currentUser->id !== $targetUser->id) {
return response()->json(['status' => 'error', 'message' => '您不能将别人提升至超过您的等级!'], 403);
}
@@ -72,12 +78,21 @@ class UserManagerController extends Controller
if (isset($validated['sex'])) {
$targetUser->sex = $validated['sex'];
}
if (isset($validated['exp_num'])) {
$targetUser->exp_num = $validated['exp_num'];
}
if (isset($validated['jjb'])) {
$targetUser->jjb = $validated['jjb'];
}
if (isset($validated['meili'])) {
$targetUser->meili = $validated['meili'];
}
if (array_key_exists('qianming', $validated)) {
$targetUser->qianming = $validated['qianming'];
}
if (isset($validated['headface'])) {
$targetUser->headface = $validated['headface'];
}
if (isset($validated['sign'])) {
$targetUser->sign = $validated['sign'];
}
if (! empty($validated['password'])) {
$targetUser->password = Hash::make($validated['password']);