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

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, '仅超级管理员可操作');
}
}