From 01081cf1857b2661329a375640f5564f96b04770 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=B0=8F=E4=B8=91=E8=B7=AF=E4=BA=BA?= <2278757482@qq.com>
Date: Mon, 8 Aug 2022 17:57:59 +0800
Subject: [PATCH 1/3] =?UTF-8?q?=E6=A3=80=E6=B5=8B=E6=8E=A5=E5=8F=A3?=
=?UTF-8?q?=E6=98=AF=E5=90=A6=E6=9C=89=E6=9D=83=E9=99=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/Modules/Admin/Entities/Rabc/Admin.php | 14 ++++++
.../Http/Controllers/IndexController.php | 43 +++++++++++++++++++
.../Admin/Http/Middleware/CheckRabc.php | 16 ++++---
app/Modules/Admin/Routes/web.php | 2 +
app/Modules/Admin/Services/AuthService.php | 4 +-
5 files changed, 70 insertions(+), 9 deletions(-)
diff --git a/app/Modules/Admin/Entities/Rabc/Admin.php b/app/Modules/Admin/Entities/Rabc/Admin.php
index 11f4197..503c877 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 d1da68b..47b22d2 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,44 @@ 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){
+ $full_url = $admin_prefix . '/' . $api;
+ $result[] = [
+ 'url' => $api,
+ '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 15bf004..cc85039 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, $this->white_lists)){
+ return true;
+ }
// 检测是否存在当前API
if (isset($menus[$route_path])){
// 验证请求方式
diff --git a/app/Modules/Admin/Routes/web.php b/app/Modules/Admin/Routes/web.php
index cede918..9137c1c 100644
--- a/app/Modules/Admin/Routes/web.php
+++ b/app/Modules/Admin/Routes/web.php
@@ -35,6 +35,8 @@ Route::prefix(cnpscy_config('admin_prefix'))
});
Route::middleware([CheckAuth::class])->group(function () {
+ // 检测登录会员是否拥有指定接口的权限
+ Route::get('check-permission', 'IndexController@checkApiPermission');
// 首页
Route::get('indexs', 'IndexController@index');
// 编辑登录管理员资料
diff --git a/app/Modules/Admin/Services/AuthService.php b/app/Modules/Admin/Services/AuthService.php
index 28634c3..d42a4f8 100644
--- a/app/Modules/Admin/Services/AuthService.php
+++ b/app/Modules/Admin/Services/AuthService.php
@@ -61,7 +61,7 @@ class AuthService extends Service
*
* @throws \App\Exceptions\Admin\AuthTokenException
*/
- public function getRabcList()
+ public function getRabcList($is_tree = true)
{
if (!$admin = Auth::guard($this->guard)->user()){
throw new AuthTokenException('认证失败!');
@@ -77,7 +77,7 @@ class AuthService extends Service
$menus = array_merge($menus, $item);
}
- return list_to_tree($menus);
+ return $is_tree ? list_to_tree($menus) : $menus;
}
/**
--
Gitee
From 24b1f3ef1372f9b7c559bf6f5249c00569fc995b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=B0=8F=E4=B8=91=E8=B7=AF=E4=BA=BA?= <2278757482@qq.com>
Date: Tue, 9 Aug 2022 17:44:05 +0800
Subject: [PATCH 2/3] =?UTF-8?q?optimize=20=E8=A7=92=E8=89=B2=E8=B5=8B?=
=?UTF-8?q?=E4=BA=88=E6=9D=83=E9=99=90=E6=97=B6=EF=BC=8C=E8=8F=9C=E5=8D=95?=
=?UTF-8?q?Id=E7=BB=84=EF=BC=9A=E8=BF=BD=E5=8A=A0=E9=80=89=E4=B8=AD?=
=?UTF-8?q?=E5=AD=90=E8=8A=82=E7=82=B9=E7=9A=84=E7=88=B6=E8=8A=82=E7=82=B9?=
=?UTF-8?q?=E7=9A=84key?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Resources/vue-element-admin/views/admin_roles/index.vue | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
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 f0924d1..04fc7e3 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) {
--
Gitee
From 65bac2a2786b20ebdcea4fabc05e09ea52b654f9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=B0=8F=E4=B8=91=E8=B7=AF=E4=BA=BA?= <2278757482@qq.com>
Date: Tue, 9 Aug 2022 18:21:12 +0800
Subject: [PATCH 3/3] =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E5=88=97?=
=?UTF-8?q?=E8=A1=A8=E5=AE=9E=E7=8E=B0`=E6=97=A0=E6=9D=83=E9=99=90`?=
=?UTF-8?q?=E7=9A=84=E6=8C=89=E9=92=AE=E4=B8=8D=E5=B1=95=E7=A4=BA=EF=BC=8C?=
=?UTF-8?q?=E5=85=B6=E5=AE=83=E9=A1=B5=E9=9D=A2=E6=99=9A=E4=BA=9B=E5=90=8C?=
=?UTF-8?q?=E6=AD=A5=E5=A4=84=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Http/Controllers/IndexController.php | 5 +-
.../Admin/Http/Middleware/CheckRabc.php | 2 +-
.../Admin/Http/Requests/Rabc/AdminRequest.php | 1 +
.../Http/Requests/Rabc/AdminRoleRequest.php | 1 +
.../Resources/vue-element-admin/api/admins.js | 36 ++++++++----
.../Resources/vue-element-admin/api/common.js | 10 ++++
.../vue-element-admin/utils/permission.js | 15 +++++
.../vue-element-admin/views/admins/index.vue | 57 ++++++++++++++++---
8 files changed, 104 insertions(+), 23 deletions(-)
diff --git a/app/Modules/Admin/Http/Controllers/IndexController.php b/app/Modules/Admin/Http/Controllers/IndexController.php
index 47b22d2..8ed6db2 100644
--- a/app/Modules/Admin/Http/Controllers/IndexController.php
+++ b/app/Modules/Admin/Http/Controllers/IndexController.php
@@ -95,9 +95,12 @@ class IndexController extends BaseController
$admin_prefix = cnpscy_config('admin_prefix');
// 验证权限
foreach ($apis as $api){
+ $old_url = $api;
+ $api = trim($api, '/');
$full_url = $admin_prefix . '/' . $api;
- $result[] = [
+ $result[$api] = [
'url' => $api,
+ 'old_url' => $old_url,
'full_url' => $full_url,
'status' => empty($menus) ? false : (isset($menus[$full_url]) ? true : false),
];
diff --git a/app/Modules/Admin/Http/Middleware/CheckRabc.php b/app/Modules/Admin/Http/Middleware/CheckRabc.php
index cc85039..d536a02 100644
--- a/app/Modules/Admin/Http/Middleware/CheckRabc.php
+++ b/app/Modules/Admin/Http/Middleware/CheckRabc.php
@@ -50,7 +50,7 @@ class CheckRabc
// 获取当前路由
$route_path = $request->route()->uri();
// 白名单
- if (in_array($route_path, $this->white_lists)){
+ if (in_array($route_path, self::$white_lists)){
return true;
}
// 检测是否存在当前API
diff --git a/app/Modules/Admin/Http/Requests/Rabc/AdminRequest.php b/app/Modules/Admin/Http/Requests/Rabc/AdminRequest.php
index d912f45..8ff2e98 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 c52ba76..002c722 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 201bbe3..1ed1220 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 7f287ed..7cc61a8 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 8e2bbad..5b30442 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/admins/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/admins/index.vue
index 4fd3e0e..13d087a 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 @@