diff --git a/app/Modules/Admin/Entities/Rabc/Admin.php b/app/Modules/Admin/Entities/Rabc/Admin.php index 11f4197daad3f0eba89351e5599c93159d8be223..503c8770fbcc99795006bf3a786ddca042b5a587 100644 --- a/app/Modules/Admin/Entities/Rabc/Admin.php +++ b/app/Modules/Admin/Entities/Rabc/Admin.php @@ -141,4 +141,18 @@ class Admin extends Authenticatable implements JWTSubject $this->attributes['admin_head'] = str_replace(Storage::url('/'), '', $key); } } + + // 获取指定管理员的权限列表 + public static function getRabcByAdmin($admin_id) + { + $roles = Admin::find($admin_id)->roles->toArray(); + if (empty($roles)) return []; + $role_ids = array_column($roles, 'role_id'); + if (empty($role_ids)) return []; + $menu_ids = AdminRoleWithMenu::getInstance()->getMenuIdsByRoles($role_ids); + if (empty($menu_ids)) return []; + $menus = AdminMenu::getInstance()->getMenusByIdsForRabc($menu_ids)->toArray(); + if (empty($menus)) return []; + return $menus; + } } diff --git a/app/Modules/Admin/Http/Controllers/IndexController.php b/app/Modules/Admin/Http/Controllers/IndexController.php index d1da68b2c94fc19b94448cf31df99b07747c078d..8ed6db2400e953afd7a3bc77df3a55d8f0ee7cf4 100644 --- a/app/Modules/Admin/Http/Controllers/IndexController.php +++ b/app/Modules/Admin/Http/Controllers/IndexController.php @@ -3,9 +3,12 @@ namespace App\Modules\Admin\Http\Controllers; use App\Models\MonthModel; +use App\Modules\Admin\Entities\Rabc\Admin; +use App\Modules\Admin\Http\Middleware\CheckRabc; use App\Modules\Admin\Services\IndexService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; class IndexController extends BaseController { @@ -74,4 +77,47 @@ class IndexController extends BaseController { return $this->successJson($this->service->getServerStatus()); } + + protected $guard = 'admin'; + /** + * 检测接口是否有权限 + * + * @param Request $request + * + * @return JsonResponse + */ + public function checkApiPermission(Request $request): JsonResponse + { + $apis = $request->input('apis', []); + $menus = Admin::getRabcByAdmin(Auth::guard($this->guard)->id()); + $result = []; + + $admin_prefix = cnpscy_config('admin_prefix'); + // 验证权限 + foreach ($apis as $api){ + $old_url = $api; + $api = trim($api, '/'); + $full_url = $admin_prefix . '/' . $api; + $result[$api] = [ + 'url' => $api, + 'old_url' => $old_url, + 'full_url' => $full_url, + 'status' => empty($menus) ? false : (isset($menus[$full_url]) ? true : false), + ]; + } + // 验证一次白名单 + $white_lists = CheckRabc::$white_lists; + foreach ($result as &$item){ + if (!$item['status']){ + if (in_array($item['url'], $white_lists)){ + $item['status'] = true; + } + if (in_array($item['full_url'], $white_lists)){ + $item['status'] = true; + } + } + } + + return $this->successJson($result); + } } diff --git a/app/Modules/Admin/Http/Middleware/CheckRabc.php b/app/Modules/Admin/Http/Middleware/CheckRabc.php index 15bf0046c23877bb918895dc98da551551d980d3..d536a02397c2fea1388cb553223aa106ebe47d23 100644 --- a/app/Modules/Admin/Http/Middleware/CheckRabc.php +++ b/app/Modules/Admin/Http/Middleware/CheckRabc.php @@ -16,6 +16,10 @@ class CheckRabc protected $guard; + public static $white_lists = [ + 'check-permission' + ]; + /** * Handle an incoming request. * @@ -40,17 +44,15 @@ class CheckRabc // 超级管理员账户无需验证 if ($admin_id == 1) return true; - $roles = Admin::getInstance()->detail($admin_id)->roles->toArray(); - if (empty($roles)) return false; - $role_ids = array_column($roles, 'role_id'); - if (empty($role_ids)) return false; - $menu_ids = AdminRoleWithMenu::getInstance()->getMenuIdsByRoles($role_ids); - if (empty($menu_ids)) return false; - $menus = AdminMenu::getInstance()->getMenusByIdsForRabc($menu_ids)->toArray(); + $menus = Admin::getRabcByAdmin($admin_id); if (empty($menus)) return false; // 获取当前路由 $route_path = $request->route()->uri(); + // 白名单 + if (in_array($route_path, self::$white_lists)){ + return true; + } // 检测是否存在当前API if (isset($menus[$route_path])){ // 验证请求方式 diff --git a/app/Modules/Admin/Http/Requests/Rabc/AdminRequest.php b/app/Modules/Admin/Http/Requests/Rabc/AdminRequest.php index d912f45f293aaa834fe6fe913d4cfcdc95742079..8ff2e980125e157a4bdd7e41387c028b7cf5287e 100644 --- a/app/Modules/Admin/Http/Requests/Rabc/AdminRequest.php +++ b/app/Modules/Admin/Http/Requests/Rabc/AdminRequest.php @@ -48,6 +48,7 @@ class AdminRequest extends BaseRequest 'admin_name.required' => '请输入管理员账户!', 'admin_name.unique' => '管理员账户已存在!', 'password.confirmed' => '密码确认不匹配!', + 'is_check.required' => '请设置启用状态!', ]; } } diff --git a/app/Modules/Admin/Http/Requests/Rabc/AdminRoleRequest.php b/app/Modules/Admin/Http/Requests/Rabc/AdminRoleRequest.php index c52ba766290b8f4f07b32d5a6a4fe0c610ac4abc..002c72295e38bf55a2b2093b8e36d93efbc035a9 100644 --- a/app/Modules/Admin/Http/Requests/Rabc/AdminRoleRequest.php +++ b/app/Modules/Admin/Http/Requests/Rabc/AdminRoleRequest.php @@ -35,6 +35,7 @@ class AdminRoleRequest extends BaseRequest { return [ 'role_name.required' => '请输入角色名称!', + 'is_check.required' => '请设置启用状态!', ]; } } diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/admins.js b/app/Modules/Admin/Resources/vue-element-admin/api/admins.js index 201bbe3451f0e5874739e9ad5abe3f08b2de6f47..1ed1220910e88438d9ce4895af61af7671c5b0b1 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/api/admins.js +++ b/app/Modules/Admin/Resources/vue-element-admin/api/admins.js @@ -1,16 +1,20 @@ import request from '@/utils/request' -export function getAdminsSelect(params) { +export function getAdminsSelect(params, get_url = false) { + var url = '/admins/getSelectLists'; + if (get_url) return url; return request({ - url: '/admins/getSelectLists', + url: url, method: 'get', params }); } -export function getList(params) { +export function getList(params, get_url = false) { + var url = 'admins'; + if (get_url) return url; return request({ - url: 'admins', + url: url, method: 'get', params }) @@ -24,33 +28,41 @@ export function getList(params) { // }) // } -export function create(data) { +export function create(data, get_url = false) { + var url = '/admins/create'; + if (get_url) return url; return request({ - url: '/admins/create', + url: url, method: 'post', data }) } -export function update(data) { +export function update(data, get_url = false) { + var url = '/admins/update'; + if (get_url) return url; return request({ - url: `/admins/update`, + url: url, method: 'put', data }) } -export function setDel(data) { +export function setDel(data, get_url = false) { + var url = '/admins/delete'; + if (get_url) return url; return request({ - url: `/admins/delete`, + url: url, method: 'delete', data }) } -export function changeFiledStatus(data) { +export function changeFiledStatus(data, get_url = false) { + var url = '/admins/changeFiledStatus'; + if (get_url) return url; return request({ - url: `/admins/changeFiledStatus`, + url: url, method: 'put', data }) diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/common.js b/app/Modules/Admin/Resources/vue-element-admin/api/common.js index 7f287edce0f7eff0f3a14c7a4a4486b256e459d9..7cc61a8938a25971bd2851bd93a47cc582a34426 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/api/common.js +++ b/app/Modules/Admin/Resources/vue-element-admin/api/common.js @@ -14,3 +14,13 @@ export function getMonthLists() { method: 'get' }) } + +export function checkPermission(apis) { + return request({ + url: '/check-permission', + method: 'get', + params:{ + apis + } + }) +} diff --git a/app/Modules/Admin/Resources/vue-element-admin/utils/permission.js b/app/Modules/Admin/Resources/vue-element-admin/utils/permission.js index 8e2bbadad0b3837edc2565b6cf5c323680855a6c..5b3044231f0798496a7fcc152de5a0772e40e71e 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/utils/permission.js +++ b/app/Modules/Admin/Resources/vue-element-admin/utils/permission.js @@ -1,4 +1,5 @@ import store from '@/store' +import {checkPermission as checkPermissionApi} from '@/api/common'; /** * @param {Array} value @@ -19,3 +20,17 @@ export default function checkPermission(value) { return false } } + +// 检测按钮的权限 +export function checkButtonPermission(that, apis){ + checkPermissionApi(apis).then(function (res){ + let result = res.data; + for (let key in result) { + for (let permission in that.permission){ + if (that.permission[permission].url == result[key].old_url){ + that.permission[permission].status = result[key].status; + } + } + } + }); +} diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/admin_roles/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/admin_roles/index.vue index f0924d12ac21db91aefb242c9987c052abcd56df..04fc7e36c451f18d7ef1fbeb60a791a1ca103692 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/admin_roles/index.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/views/admin_roles/index.vue @@ -376,7 +376,8 @@ }, async confirmRole() { // 当前角色选中的菜单栏目列表 - this.role.menu_ids = this.$refs.tree.getCheckedKeys(); + // this.$refs.tree.getHalfCheckedKeys() 返回选中子节点的父节点的key + this.role.menu_ids = this.$refs.tree.getCheckedKeys().concat(this.$refs.tree.getHalfCheckedKeys()); this.$refs['role'].validate(async (valid) => { if (valid) { diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/admins/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/admins/index.vue index 4fd3e0e8b7ecb898f31e97524e6ad0b3197efa1f..13d087a2d93c521760518b8a4c7994215a5025da 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/admins/index.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/views/admins/index.vue @@ -20,10 +20,11 @@ {{ $t('table.search') }} - + {{ $t('table.batchDelete') }} @@ -134,7 +132,8 @@