From 00c8bb9c50d5d85ade1b6030150c06a24a3299ed Mon Sep 17 00:00:00 2001 From: "HESU\\HESU" <1696136552@qq.com> Date: Wed, 9 Apr 2025 16:26:44 +0800 Subject: [PATCH] 1 --- app/admin/controller/RoleController.php | 40 ++++++++++++++++++++++++ app/admin/controller/UserController.php | 40 ++++++++++++++++++++++++ app/admin/controller/menus.php | 24 ++++++++++++++ app/admin/middleware/PermissionCheck.php | 30 ++++++++++++++++++ app/admin/model/Menu.php | 15 +++++++++ app/admin/model/Permission.php | 15 +++++++++ app/admin/model/Role.php | 20 ++++++++++++ app/admin/model/User.php | 29 +++++++++++++++++ 8 files changed, 213 insertions(+) create mode 100644 app/admin/controller/RoleController.php create mode 100644 app/admin/controller/UserController.php create mode 100644 app/admin/controller/menus.php create mode 100644 app/admin/middleware/PermissionCheck.php create mode 100644 app/admin/model/Menu.php create mode 100644 app/admin/model/Permission.php create mode 100644 app/admin/model/Role.php create mode 100644 app/admin/model/User.php diff --git a/app/admin/controller/RoleController.php b/app/admin/controller/RoleController.php new file mode 100644 index 0000000..b0c1091 --- /dev/null +++ b/app/admin/controller/RoleController.php @@ -0,0 +1,40 @@ +findOrFail($id); + $allPermissions = Permission::all(); + + return json([ + 'code' => 0, + 'data' => [ + 'role' => $role, + 'all_permissions' => $allPermissions, + 'assigned_permissions' => $role->permissions->pluck('id')->toArray() + ] + ]); + } + + // 更新角色权限 + public function updatePermissions(Request $request, $id) + { + $request->validate([ + 'permissions' => 'required|array', + 'permissions.*' => 'exists:permissions,id' + ]); + + $role = Role::findOrFail($id); + $role->permissions()->sync($request->input('permissions')); + + return json(['code' => 0, 'msg' => '权限更新成功']); + } +} \ No newline at end of file diff --git a/app/admin/controller/UserController.php b/app/admin/controller/UserController.php new file mode 100644 index 0000000..a70b8a8 --- /dev/null +++ b/app/admin/controller/UserController.php @@ -0,0 +1,40 @@ +findOrFail($id); + $allRoles = Role::all(); + + return json([ + 'code' => 0, + 'data' => [ + 'user' => $user, + 'all_roles' => $allRoles, + 'assigned_roles' => $user->roles->pluck('id')->toArray() + ] + ]); + } + + // 更新用户角色 + public function updateRoles(Request $request, $id) + { + $request->validate([ + 'roles' => 'required|array', + 'roles.*' => 'exists:roles,id' + ]); + + $user = User::findOrFail($id); + $user->roles()->sync($request->input('roles')); + + return json(['code' => 0, 'msg' => '角色更新成功']); + } +} \ No newline at end of file diff --git a/app/admin/controller/menus.php b/app/admin/controller/menus.php new file mode 100644 index 0000000..2c4269a --- /dev/null +++ b/app/admin/controller/menus.php @@ -0,0 +1,24 @@ +user(); + $menus = Menu::with('children') + ->where('parent_id', 0) + ->where('status', 1) + ->orderBy('sort') + ->get() + ->filter(function($menu) use ($user) { + if (empty($menu->permission_slug)) { + return true; + } + return $user->hasPermission($menu->permission_slug); + }); + + return json($menus); + } +} \ No newline at end of file diff --git a/app/admin/middleware/PermissionCheck.php b/app/admin/middleware/PermissionCheck.php new file mode 100644 index 0000000..667f392 --- /dev/null +++ b/app/admin/middleware/PermissionCheck.php @@ -0,0 +1,30 @@ +user(); + $route = $request->route; + + // 检查角色 + $roles = $route->param('roles'); + if ($roles && !$user->roles()->whereIn('name', (array)$roles)->exists()) { + return json(['code' => 403, 'msg' => '需要特定角色才能访问']); + } + + // 检查权限 + $permission = $route->param('permission'); + if ($permission && !$user->hasPermission($permission)) { + return json(['code' => 403, 'msg' => '无权访问']); + } + + return $handler($request); + } +} \ No newline at end of file diff --git a/app/admin/model/Menu.php b/app/admin/model/Menu.php new file mode 100644 index 0000000..b04c418 --- /dev/null +++ b/app/admin/model/Menu.php @@ -0,0 +1,15 @@ +hasMany(Menu::class, 'parent_id')->orderBy('sort'); + } +} \ No newline at end of file diff --git a/app/admin/model/Permission.php b/app/admin/model/Permission.php new file mode 100644 index 0000000..19cbdb0 --- /dev/null +++ b/app/admin/model/Permission.php @@ -0,0 +1,15 @@ +belongsToMany(Role::class, 'role_permissions', 'permission_id', 'role_id'); + } +} \ No newline at end of file diff --git a/app/admin/model/Role.php b/app/admin/model/Role.php new file mode 100644 index 0000000..f917a19 --- /dev/null +++ b/app/admin/model/Role.php @@ -0,0 +1,20 @@ +belongsToMany(User::class, 'user_roles', 'role_id', 'user_id'); + } + + public function permissions() + { + return $this->belongsToMany(Permission::class, 'role_permissions', 'role_id', 'permission_id'); + } +} \ No newline at end of file diff --git a/app/admin/model/User.php b/app/admin/model/User.php new file mode 100644 index 0000000..f314ce4 --- /dev/null +++ b/app/admin/model/User.php @@ -0,0 +1,29 @@ +belongsToMany(Role::class, 'user_roles', 'user_id', 'role_id'); + } + + public function hasRole($role) + { + return $this->roles()->where('name', $role)->exists(); + } + + public function hasPermission($permission) + { + return $this->roles() + ->whereHas('permissions', function($query) use ($permission) { + $query->where('slug', $permission); + }) + ->exists(); + } +} \ No newline at end of file