功能:后台房间管理新增「创建房间」功能

- RoomManagerController 新增 store() 方法,含房间名唯一校验、默认值设置
- 路由增加 POST /admin/rooms -> admin.rooms.store
- 视图增加「+ 新增房间」折叠表单(仅 id=1 超管可见)
- 补充 Flash 成功/错误提示展示
- 原有编辑/删除功能保持不变
This commit is contained in:
2026-03-03 14:36:09 +08:00
parent fdb500c3dd
commit a41e701fed
3 changed files with 122 additions and 11 deletions
+85 -1
View File
@@ -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"