You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.3 KiB
69 lines
2.3 KiB
|
4 days ago
|
<?php
|
||
|
|
|
||
|
|
namespace App\Http\Controllers\Api;
|
||
|
|
|
||
|
|
use App\Http\Controllers\Controller;
|
||
|
|
use App\Models\AdminMenu;
|
||
|
|
use App\Models\RoleMenuPermission;
|
||
|
|
use Illuminate\Http\JsonResponse;
|
||
|
|
use Illuminate\Http\Request;
|
||
|
|
use Illuminate\Support\Facades\DB;
|
||
|
|
|
||
|
|
class RoleMenuPermissionController extends Controller
|
||
|
|
{
|
||
|
|
public function index(Request $request): JsonResponse
|
||
|
|
{
|
||
|
|
$menus = AdminMenu::query()
|
||
|
|
->orderBy('sort')
|
||
|
|
->orderBy('id')
|
||
|
|
->get(['id', 'name', 'path', 'icon', 'parent_id', 'sort', 'is_visible']);
|
||
|
|
|
||
|
|
$roles = ['super_admin', 'venue_admin'];
|
||
|
|
$permissionRows = RoleMenuPermission::query()
|
||
|
|
->whereIn('role', $roles)
|
||
|
|
->get(['role', 'menu_id'])
|
||
|
|
->groupBy('role')
|
||
|
|
->map(fn ($group) => $group->pluck('menu_id')->map(fn ($id) => (int) $id)->values())
|
||
|
|
->toArray();
|
||
|
|
|
||
|
|
return response()->json([
|
||
|
|
'menus' => $menus,
|
||
|
|
'roles' => [
|
||
|
|
['role' => 'super_admin', 'label' => '超级管理员', 'menu_ids' => $permissionRows['super_admin'] ?? []],
|
||
|
|
['role' => 'venue_admin', 'label' => '场馆管理员', 'menu_ids' => $permissionRows['venue_admin'] ?? []],
|
||
|
|
],
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
|
||
|
|
public function update(Request $request, string $role): JsonResponse
|
||
|
|
{
|
||
|
|
$this->ensureSuperAdmin($request);
|
||
|
|
abort_unless(in_array($role, ['super_admin', 'venue_admin'], true), 422, '不支持的角色');
|
||
|
|
|
||
|
|
$data = $request->validate([
|
||
|
|
'menu_ids' => ['required', 'array'],
|
||
|
|
'menu_ids.*' => ['integer', 'exists:admin_menus,id'],
|
||
|
|
]);
|
||
|
|
|
||
|
|
$menuIds = collect($data['menu_ids'])->map(fn ($id) => (int) $id)->unique()->values();
|
||
|
|
|
||
|
|
DB::transaction(function () use ($role, $menuIds) {
|
||
|
|
RoleMenuPermission::query()->where('role', $role)->delete();
|
||
|
|
foreach ($menuIds as $menuId) {
|
||
|
|
RoleMenuPermission::create([
|
||
|
|
'role' => $role,
|
||
|
|
'menu_id' => $menuId,
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
return response()->json(['message' => '角色菜单权限已保存']);
|
||
|
|
}
|
||
|
|
|
||
|
|
private function ensureSuperAdmin(Request $request): void
|
||
|
|
{
|
||
|
|
abort_unless($request->user()?->isSuperAdmin(), 403, '仅超级管理员可操作');
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|