新增职务权限管理与聊天室管理权限控制

This commit is contained in:
2026-04-21 16:43:17 +08:00
parent cfdbf387af
commit 281315d1cf
19 changed files with 1243 additions and 87 deletions
+77 -12
View File
@@ -16,6 +16,7 @@
showForm: false,
editing: null,
selectedIds: [],
selectedPermissions: [],
form: {
department_id: '',
name: '',
@@ -32,12 +33,14 @@
openCreate() {
this.editing = null;
this.selectedIds = [];
this.selectedPermissions = [];
this.form = { department_id: '', name: '', icon: '🎖️', rank: 50, level: 60, max_persons: 1, max_reward: '', daily_reward_limit: '', recipient_daily_limit: '', sort_order: 0 };
this.showForm = true;
},
openEdit(pos, appointableIds) {
openEdit(pos, appointableIds, permissions) {
this.editing = pos;
this.selectedIds = appointableIds;
this.selectedPermissions = permissions;
this.form = {
department_id: pos.department_id,
name: pos.name,
@@ -61,6 +64,16 @@
},
isSelected(id) {
return this.selectedIds.includes(id);
},
togglePermission(code) {
if (this.selectedPermissions.includes(code)) {
this.selectedPermissions = this.selectedPermissions.filter(item => item !== code);
} else {
this.selectedPermissions.push(code);
}
},
isPermissionSelected(code) {
return this.selectedPermissions.includes(code);
}
}">
@@ -92,15 +105,6 @@
</div>
</div>
@if (session('success'))
<div class="mb-4 px-4 py-3 bg-green-50 border border-green-200 text-green-700 rounded-lg text-sm">
{{ session('success') }}</div>
@endif
@if (session('error'))
<div class="mb-4 px-4 py-3 bg-red-50 border border-red-200 text-red-700 rounded-lg text-sm">
{{ session('error') }}</div>
@endif
{{-- 全局奖励接收上限配置卡片(失焦/回车自动保存) --}}
<div class="mb-6 bg-amber-50 border border-amber-200 rounded-xl p-5" x-data="{
val: {{ $globalRecipientDailyMax }},
@@ -181,6 +185,7 @@
<th class="px-4 py-3 text-center">单次上限</th>
<th class="px-4 py-3 text-center">单日上限</th>
<th class="px-4 py-3 text-center">任命权</th>
<th class="px-4 py-3 text-center">聊天室权限</th>
@php $superLvl = (int) \App\Models\Sysparam::getValue('superlevel', '100'); @endphp
@if (Auth::user()->user_level >= $superLvl)
<th class="px-4 py-3 text-right">操作</th>
@@ -249,6 +254,34 @@
<span class="text-xs text-gray-400"></span>
@endif
</td>
<td class="px-4 py-3">
@if (! empty($pos->permissions))
@php
$permissionSummaryLabels = collect($pos->permissions)
->map(fn ($permissionCode) => $permissionLabels[$permissionCode] ?? $permissionCode)
->values();
$permissionPreview = $permissionSummaryLabels->take(2)->implode('、');
$permissionTitle = $permissionSummaryLabels->implode(' / ');
@endphp
<div class="mx-auto max-w-[220px] rounded-xl border border-amber-100 bg-gradient-to-br from-amber-50 via-white to-orange-50 px-3 py-2 shadow-sm"
title="{{ $permissionTitle }}">
<div class="flex items-center justify-between gap-3">
<span class="text-[11px] font-semibold tracking-[0.08em] text-amber-700">已开通</span>
<span class="rounded-full bg-amber-100 px-2 py-0.5 text-[11px] font-bold text-amber-700">
{{ $permissionSummaryLabels->count() }}
</span>
</div>
<div class="mt-1 text-xs leading-5 text-slate-600">
{{ $permissionPreview }}
@if ($permissionSummaryLabels->count() > 2)
<span class="text-amber-600"> {{ $permissionSummaryLabels->count() }} </span>
@endif
</div>
</div>
@else
<div class="text-center text-xs text-gray-400"></div>
@endif
</td>
<td class="px-4 py-3 text-right space-x-1">
@php $superLvl = (int) \App\Models\Sysparam::getValue('superlevel', '100'); @endphp
@if (Auth::user()->user_level >= $superLvl)
@@ -266,7 +299,7 @@
recipient_daily_limit: {{ $pos->recipient_daily_limit ?? 'null' }},
sort_order: {{ $pos->sort_order }},
requestUrl: '{{ route('admin.positions.update', $pos->id) }}'
}, {{ json_encode($appointableIds) }})"
}, {{ json_encode($appointableIds) }}, {{ json_encode($pos->permissions ?? []) }})"
class="text-xs bg-indigo-50 text-indigo-600 font-bold px-2 py-1 rounded hover:bg-indigo-600 hover:text-white transition">
编辑
</button>
@@ -286,7 +319,8 @@
</tr>
@empty
<tr>
<td colspan="9" class="px-4 py-6 text-center text-gray-400">该部门暂无职务</td>
<td colspan="{{ Auth::user()->user_level >= $superLvl ? 11 : 10 }}"
class="px-4 py-6 text-center text-gray-400">该部门暂无职务</td>
</tr>
@endforelse
</tbody>
@@ -391,6 +425,37 @@
</div>
</div>
{{-- 聊天室权限多选 --}}
<div class="border rounded-lg p-4 bg-amber-50 mt-4">
<h4 class="text-xs font-bold text-amber-800 mb-2">
权限管理
<span class="font-normal text-amber-700 ml-1">(控制聊天室输入框上方「管理」菜单中可见的功能按钮)</span>
</h4>
<div class="space-y-4">
@foreach ($positionPermissions as $groupName => $permissions)
<div>
<div class="text-xs font-bold text-amber-700 mb-2">{{ $groupName }}</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-2">
@foreach ($permissions as $permissionCode => $permissionMeta)
<label
class="flex items-start gap-2 cursor-pointer rounded-lg border border-amber-200 bg-white px-3 py-2 text-sm"
:class="isPermissionSelected('{{ $permissionCode }}') ? 'ring-2 ring-amber-300 border-amber-300' : ''">
<input type="checkbox" name="permissions[]" value="{{ $permissionCode }}"
:checked="isPermissionSelected('{{ $permissionCode }}')"
@change="togglePermission('{{ $permissionCode }}')"
class="mt-0.5 rounded text-amber-600">
<span class="min-w-0">
<span class="block font-bold text-gray-700">{{ $permissionMeta['label'] }}</span>
<span class="block text-xs text-gray-500">{{ $permissionMeta['description'] }}</span>
</span>
</label>
@endforeach
</div>
</div>
@endforeach
</div>
</div>
<div class="flex justify-end space-x-3 pt-4 mt-4 border-t">
<button type="button" @click="showForm = false"
class="px-4 py-2 border rounded font-medium text-gray-600 hover:bg-gray-50">取消</button>