功能:后台房间管理新增「创建房间」功能
- RoomManagerController 新增 store() 方法,含房间名唯一校验、默认值设置 - 路由增加 POST /admin/rooms -> admin.rooms.store - 视图增加「+ 新增房间」折叠表单(仅 id=1 超管可见) - 补充 Flash 成功/错误提示展示 - 原有编辑/删除功能保持不变
This commit is contained in:
@@ -2,11 +2,12 @@
|
||||
|
||||
/**
|
||||
* 文件功能:后台房间管理控制器
|
||||
* 管理员可查看、编辑房间信息(名称、介绍、公告等)
|
||||
* 管理员可新增、编辑、删除房间信息(名称、介绍、公告等)
|
||||
* 系统房间(room_keep = true)不允许删除
|
||||
*
|
||||
* @author ChatRoom Laravel
|
||||
*
|
||||
* @version 1.0.0
|
||||
* @version 1.1.0
|
||||
*/
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
@@ -29,6 +30,30 @@ class RoomManagerController extends Controller
|
||||
return view('admin.rooms.index', compact('rooms'));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增房间
|
||||
*/
|
||||
public function store(Request $request): RedirectResponse
|
||||
{
|
||||
$data = $request->validate([
|
||||
'room_name' => 'required|string|max:100|unique:rooms,room_name',
|
||||
'room_des' => 'nullable|string|max:500',
|
||||
'room_owner' => 'nullable|string|max:50',
|
||||
'permit_level' => 'required|integer|min:0|max:15',
|
||||
'door_open' => 'required|boolean',
|
||||
], [
|
||||
'room_name.unique' => '房间名称已存在,请换一个名称。',
|
||||
]);
|
||||
|
||||
// 设置新建房间的默认值
|
||||
$data['room_keep'] = false; // 新建房间均为非系统房间,可删除
|
||||
$data['build_time'] = now();
|
||||
|
||||
$room = Room::create($data);
|
||||
|
||||
return redirect()->route('admin.rooms.index')->with('success', "房间「{$room->room_name}」新建成功!");
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新房间信息
|
||||
*
|
||||
@@ -37,21 +62,21 @@ class RoomManagerController extends Controller
|
||||
public function update(Request $request, Room $room): RedirectResponse
|
||||
{
|
||||
$data = $request->validate([
|
||||
'room_name' => 'required|string|max:100',
|
||||
'room_des' => 'nullable|string|max:500',
|
||||
'room_name' => 'required|string|max:100',
|
||||
'room_des' => 'nullable|string|max:500',
|
||||
'announcement' => 'nullable|string|max:500',
|
||||
'room_owner' => 'nullable|string|max:50',
|
||||
'room_owner' => 'nullable|string|max:50',
|
||||
'permit_level' => 'required|integer|min:0|max:15',
|
||||
'door_open' => 'required|boolean',
|
||||
'door_open' => 'required|boolean',
|
||||
]);
|
||||
|
||||
$room->update($data);
|
||||
|
||||
return redirect()->route('admin.rooms.index')->with('success', "房间 [{$room->room_name}] 信息已更新!");
|
||||
return redirect()->route('admin.rooms.index')->with('success', "房间「{$room->room_name}」信息已更新!");
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除房间(非系统房间)
|
||||
* 删除房间(系统房间不允许删除)
|
||||
*
|
||||
* @param Room $room 路由模型自动注入
|
||||
*/
|
||||
@@ -61,8 +86,9 @@ class RoomManagerController extends Controller
|
||||
return redirect()->route('admin.rooms.index')->with('error', '系统房间不允许删除!');
|
||||
}
|
||||
|
||||
$name = $room->room_name;
|
||||
$room->delete();
|
||||
|
||||
return redirect()->route('admin.rooms.index')->with('success', "房间 [{$room->room_name}] 已删除!");
|
||||
return redirect()->route('admin.rooms.index')->with('success', "房间「{$name}」已删除!");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,8 +9,92 @@
|
||||
<h2 class="text-lg font-bold text-gray-800">房间管理</h2>
|
||||
<p class="text-xs text-gray-500 mt-1">管理聊天室房间的名称、介绍、公告和权限设置。</p>
|
||||
</div>
|
||||
{{-- 新增房间按钮 --}}
|
||||
@if (auth()->id() === 1)
|
||||
<button onclick="document.getElementById('create-room-form').classList.toggle('hidden')"
|
||||
class="px-4 py-2 bg-indigo-600 text-white rounded-md text-sm font-bold hover:bg-indigo-700 transition shadow-sm">
|
||||
+ 新增房间
|
||||
</button>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
{{-- 新增房间表单(默认隐藏) --}}
|
||||
@if (auth()->id() === 1)
|
||||
<div id="create-room-form" class="hidden border-b border-gray-200 bg-indigo-50 p-6">
|
||||
<h3 class="text-sm font-bold text-indigo-800 mb-4">➕ 创建新房间</h3>
|
||||
<form action="{{ route('admin.rooms.store') }}" method="POST">
|
||||
@csrf
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
|
||||
<div>
|
||||
<label class="block text-xs font-bold text-gray-600 mb-1">房间名称 <span
|
||||
class="text-red-500">*</span></label>
|
||||
<input type="text" name="room_name" value="{{ old('room_name') }}" required
|
||||
class="w-full border-gray-300 rounded-md shadow-sm focus:border-indigo-500 focus:ring-indigo-500 p-2 bg-white border text-sm"
|
||||
placeholder="填写房间名称(唯一)">
|
||||
@error('room_name')
|
||||
<p class="text-red-500 text-xs mt-1">{{ $message }}</p>
|
||||
@enderror
|
||||
</div>
|
||||
<div>
|
||||
<label class="block text-xs font-bold text-gray-600 mb-1">房主用户名</label>
|
||||
<input type="text" name="room_owner" value="{{ old('room_owner') }}"
|
||||
class="w-full border-gray-300 rounded-md shadow-sm focus:border-indigo-500 focus:ring-indigo-500 p-2 bg-white border text-sm"
|
||||
placeholder="留空为无房主">
|
||||
</div>
|
||||
<div class="md:col-span-2">
|
||||
<label class="block text-xs font-bold text-gray-600 mb-1">房间介绍</label>
|
||||
<input type="text" name="room_des" value="{{ old('room_des') }}"
|
||||
class="w-full border-gray-300 rounded-md shadow-sm focus:border-indigo-500 focus:ring-indigo-500 p-2 bg-white border text-sm"
|
||||
placeholder="描述这个房间的用途和氛围">
|
||||
</div>
|
||||
<div>
|
||||
<label class="block text-xs font-bold text-gray-600 mb-1">进入等级限制</label>
|
||||
<input type="number" name="permit_level" value="{{ old('permit_level', 0) }}" min="0"
|
||||
max="15"
|
||||
class="w-full border-gray-300 rounded-md shadow-sm focus:border-indigo-500 focus:ring-indigo-500 p-2 bg-white border text-sm">
|
||||
</div>
|
||||
<div>
|
||||
<label class="block text-xs font-bold text-gray-600 mb-1">房间状态</label>
|
||||
<select name="door_open"
|
||||
class="w-full border-gray-300 rounded-md shadow-sm focus:border-indigo-500 focus:ring-indigo-500 p-2 bg-white border text-sm">
|
||||
<option value="1" selected>开放</option>
|
||||
<option value="0">关闭</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-4 flex gap-3">
|
||||
<button type="submit"
|
||||
class="px-5 py-2 bg-indigo-600 text-white rounded-md font-bold hover:bg-indigo-700 shadow-sm transition text-sm">
|
||||
确认创建
|
||||
</button>
|
||||
<button type="button" onclick="document.getElementById('create-room-form').classList.add('hidden')"
|
||||
class="px-4 py-2 bg-gray-200 text-gray-700 rounded-md font-bold hover:bg-gray-300 transition text-sm">
|
||||
取消
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
{{-- Flash 消息 --}}
|
||||
@if (session('success'))
|
||||
<div class="mx-6 mt-4 p-3 bg-green-50 border border-green-200 rounded-lg text-green-700 text-sm">
|
||||
✅ {{ session('success') }}
|
||||
</div>
|
||||
@endif
|
||||
@if (session('error'))
|
||||
<div class="mx-6 mt-4 p-3 bg-red-50 border border-red-200 rounded-lg text-red-700 text-sm">
|
||||
❌ {{ session('error') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
{{-- 新增房间表单展开时自动滚到顶部校验错误 --}}
|
||||
@if ($errors->any())
|
||||
<script>
|
||||
document.getElementById('create-room-form').classList.remove('hidden');
|
||||
</script>
|
||||
@endif
|
||||
|
||||
<div class="p-6">
|
||||
<div class="space-y-4">
|
||||
@foreach ($rooms as $room)
|
||||
@@ -97,7 +181,7 @@
|
||||
@unless ($room->room_keep)
|
||||
<form action="{{ route('admin.rooms.destroy', $room->id) }}" method="POST"
|
||||
class="inline"
|
||||
onsubmit="return confirm('确定要删除房间「{{ $room->room_name }}」吗?此操作不可撑销!')">
|
||||
onsubmit="return confirm('确定要删除房间「{{ $room->room_name }}」吗?此操作不可撤销!')">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit"
|
||||
|
||||
@@ -270,8 +270,9 @@ Route::middleware(['chat.auth', 'chat.has_position'])->prefix('admin')->name('ad
|
||||
Route::get('/system', [\App\Http\Controllers\Admin\SystemController::class, 'edit'])->name('system.edit');
|
||||
Route::put('/system', [\App\Http\Controllers\Admin\SystemController::class, 'update'])->name('system.update');
|
||||
|
||||
// 房间管理(含编辑/删除)
|
||||
// 房间管理(含新增/编辑/删除)
|
||||
Route::get('/rooms', [\App\Http\Controllers\Admin\RoomManagerController::class, 'index'])->name('rooms.index');
|
||||
Route::post('/rooms', [\App\Http\Controllers\Admin\RoomManagerController::class, 'store'])->name('rooms.store');
|
||||
Route::put('/rooms/{room}', [\App\Http\Controllers\Admin\RoomManagerController::class, 'update'])->name('rooms.update');
|
||||
Route::delete('/rooms/{room}', [\App\Http\Controllers\Admin\RoomManagerController::class, 'destroy'])->name('rooms.destroy');
|
||||
|
||||
|
||||
Reference in New Issue
Block a user