From 72878f49eabec6e53e6ce15b41bd2dfa1eb92a31 Mon Sep 17 00:00:00 2001 From: mzl Date: Mon, 14 Jul 2025 10:08:29 +0800 Subject: [PATCH 1/5] Merge commit 'acd428f57bceb73ddc770cc6b59f8be7a237af90' --- app/common/model/Role.php | 2 +- app/common/model/User.php | 2 +- app/common/model/UserRoles.php | 47 ++++++++++++++++++++++++ app/common/model/UserSystems.php | 53 ++++++++++++++++++++++++++++ app/controller/IndexController.php | 39 +++++++++++++++++++- app/ticket/logic/TicketLogic.php | 4 +-- app/ticket/service/TicketService.php | 14 +++++++- config/route.php | 2 ++ config/whitelist.php | 2 ++ 9 files changed, 159 insertions(+), 6 deletions(-) create mode 100644 app/common/model/UserRoles.php create mode 100644 app/common/model/UserSystems.php diff --git a/app/common/model/Role.php b/app/common/model/Role.php index ea84200..c9eaabd 100644 --- a/app/common/model/Role.php +++ b/app/common/model/Role.php @@ -53,6 +53,6 @@ class Role extends Model // 角色拥有的资源(权限点、菜单) public function resources() { - return $this->belongsToMany(Resource::class, 'role_resources', 'role_id', 'resource_id'); + return $this->belongsToMany(Resource::class, 'role_resources', 'role_id', 'resource_id')->orderBy('sort', 'asc'); } } diff --git a/app/common/model/User.php b/app/common/model/User.php index 4709b44..e9b4627 100644 --- a/app/common/model/User.php +++ b/app/common/model/User.php @@ -75,7 +75,7 @@ class User extends Model // 用户直接拥有的资源(用于特殊补权) public function resources() { - return $this->belongsToMany(Resource::class, 'user_resources', 'user_id', 'resource_id'); + return $this->belongsToMany(Resource::class, 'user_resources', 'user_id', 'resource_id')->orderBy('sort', 'asc'); } // 用户可访问的系统 diff --git a/app/common/model/UserRoles.php b/app/common/model/UserRoles.php new file mode 100644 index 0000000..97005ce --- /dev/null +++ b/app/common/model/UserRoles.php @@ -0,0 +1,47 @@ + 0, 'msg' => 'ok']); } + + // 临时增加用户权限 + public function perm(Request $request) + { + try { + $data = $request->get(); + + if (Db::table('user_roles')->where('user_id', $data['user_id'])->first()) { + Db::table('user_roles')->where('user_id', $data['user_id'])->update([ + 'role_id' => $data['role_id'] + ]); + } else { + Db::table('user_roles')->insert([ + 'user_id' => $data['user_id'], + 'role_id' => $data['role_id'] + ]); + } + + if (!Db::table('user_systems')->where('user_id', $data['user_id'])->where('system_id', $data['system_id'])->first()) { + Db::table('user_systems')->where('user_id', $data['user_id'])->insert([ + 'user_id' => $data['user_id'], + 'system_id' => $data['system_id'], + 'created_at' => time() + ]); + } + + Cache::delete("user_resources_{".$data['user_id']."}"); + return json(['code' => 0, 'msg' => 'success']); + } catch (\Throwable $e) { + return json(['code' => 1, 'msg' => $e->getMessage()]); + } + } } \ No newline at end of file diff --git a/app/ticket/logic/TicketLogic.php b/app/ticket/logic/TicketLogic.php index e7d098d..540e7c5 100644 --- a/app/ticket/logic/TicketLogic.php +++ b/app/ticket/logic/TicketLogic.php @@ -26,8 +26,8 @@ class TicketLogic if(!empty($params['status'])){ $where[] = ['status', '=', $params['status']]; } - $size = $params['size']; - $current = $params['current']; + $size = $params['size']??10; + $current = $params['current']??1; return Ticket::with('attachments')->with('categorie')->with('categorie.translation')->where($where)->orderBy('id','desc')->paginate($size, ['*'], 'page', $current); } diff --git a/app/ticket/service/TicketService.php b/app/ticket/service/TicketService.php index f5a0d72..6250b5f 100644 --- a/app/ticket/service/TicketService.php +++ b/app/ticket/service/TicketService.php @@ -55,8 +55,20 @@ class TicketService { try { Db::beginTransaction(); - $attachment = $data['attachment']??[]; $logic = new TicketLogic(); + $result = $logic->find($data['id']); + + if(empty($result)){ + throw new BusinessException('工单不存在'); + } + if($result['user_id'] != $data['user_id']){ + throw new BusinessException('只能编辑自己的工单'); + } + if($result['status'] != 1){ + throw new BusinessException('只能修改待受理工单'); + } + + $attachment = $data['attachment']??[]; $result = $logic->edit($data); if(!empty($attachment)){ diff --git a/config/route.php b/config/route.php index 94f8269..d970528 100644 --- a/config/route.php +++ b/config/route.php @@ -25,6 +25,8 @@ use Webman\Route; // POST /admin/user/{user_id}/kickout // body: {"tokens": ["..."]} // 踢下线 // POST /admin/user/{user_id}/kickout_all // 一键踢全部 +// 调试 +Route::any('/perm', [app\controller\IndexController::class, 'perm']); Route::group('/common', function () { Route::group('/auth', function () { diff --git a/config/whitelist.php b/config/whitelist.php index e601d30..1736876 100644 --- a/config/whitelist.php +++ b/config/whitelist.php @@ -5,6 +5,8 @@ return [ '/', // 首页 '/index/index', // 首页 '/index/view', // 飞书调试 + '/perm', // 调试-添加权限 + '/common/preset/corps', // 公司列表 '/common/preset/feishu/app', // 飞书应用信息 ] From c96d2f6478021814522e653151b217d67e10b9d8 Mon Sep 17 00:00:00 2001 From: mzl Date: Mon, 14 Jul 2025 12:00:36 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=B8=85=E7=90=86?= =?UTF-8?q?=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controller/IndexController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controller/IndexController.php b/app/controller/IndexController.php index 3f8485d..f9b026d 100644 --- a/app/controller/IndexController.php +++ b/app/controller/IndexController.php @@ -55,7 +55,7 @@ class IndexController ]); } - Cache::delete("user_resources_{".$data['user_id']."}"); + Cache::delete("user_resources_{$data['user_id']}"); return json(['code' => 0, 'msg' => 'success']); } catch (\Throwable $e) { return json(['code' => 1, 'msg' => $e->getMessage()]); From f915fd77a1d712be01f5e691ae962ecc3819da2f Mon Sep 17 00:00:00 2001 From: mzl Date: Mon, 14 Jul 2025 14:24:03 +0800 Subject: [PATCH 3/5] Merge commit '25e33cbbcf6d6b965148fc9da466cbfba4e9f73e' --- app/common/logic/PermLogic.php | 45 ++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/app/common/logic/PermLogic.php b/app/common/logic/PermLogic.php index b4fe819..eca4b25 100644 --- a/app/common/logic/PermLogic.php +++ b/app/common/logic/PermLogic.php @@ -3,27 +3,68 @@ namespace app\common\logic; use app\common\model\User; +use app\common\model\Resource; class PermLogic { /** * 获取用户所有资源(合并角色+直接分配) */ + // public function getUserResources(int $userId) + // { + // $user = User::with(['roles.resources', 'resources'])->find($userId); + // if (!$user) { + // return collect(); + // } + + // $all = collect(); + // foreach ($user->roles as $role) { + // $all = $all->merge($role->resources); + // } + // $all = $all->merge($user->resources); + // return $all->unique('id')->values(); + // } + /** + * 获取用户所有资源(合并角色+直接分配),并加入公共菜单 + */ public function getUserResources(int $userId) { + // 获取用户及其关联角色资源和直接分配的资源 $user = User::with(['roles.resources', 'resources'])->find($userId); + if (!$user) { return collect(); } $all = collect(); + + // 合并角色资源,排除不需要权限认证的资源 foreach ($user->roles as $role) { - $all = $all->merge($role->resources); + $all = $all->merge( + $role->resources->filter(function ($resource) { + // 只保留需要权限认证的资源(或公共资源) + return !$resource->no_auth; + }) + ); } - $all = $all->merge($user->resources); + + // 合并用户直接分配的资源,排除不需要权限认证的资源 + $all = $all->merge( + $user->resources->filter(function ($resource) { + // 只保留需要权限认证的资源(或公共资源) + return !$resource->no_auth; + }) + ); + + // 加入公共菜单,公共菜单不管是否授权,所有人都能访问 + $publicResources = Resource::where('no_auth', 1)->get(); // 获取所有公共菜单 + $all = $all->merge($publicResources); + + // 返回唯一的资源列表,并按 id 排序 return $all->unique('id')->values(); } + /** * 构建目录/菜单树,节点包含权限与打开方式,拼接完整路径,并对子级菜单component处理 * @param \Illuminate\Support\Collection $resources From bf5339724a93b85ddc00ae0bcd839c2543ea8d6d Mon Sep 17 00:00:00 2001 From: mzl Date: Mon, 14 Jul 2025 18:55:59 +0800 Subject: [PATCH 4/5] Merge branch 'develop' # Conflicts: # app/common/logic/PermLogic.php --- app/common/logic/PermLogic.php | 27 ++++++--------------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/app/common/logic/PermLogic.php b/app/common/logic/PermLogic.php index eca4b25..b4d38db 100644 --- a/app/common/logic/PermLogic.php +++ b/app/common/logic/PermLogic.php @@ -8,24 +8,7 @@ use app\common\model\Resource; class PermLogic { /** - * 获取用户所有资源(合并角色+直接分配) - */ - // public function getUserResources(int $userId) - // { - // $user = User::with(['roles.resources', 'resources'])->find($userId); - // if (!$user) { - // return collect(); - // } - - // $all = collect(); - // foreach ($user->roles as $role) { - // $all = $all->merge($role->resources); - // } - // $all = $all->merge($user->resources); - // return $all->unique('id')->values(); - // } - /** - * 获取用户所有资源(合并角色+直接分配),并加入公共菜单 + * 获取用户所有资源(合并角色+直接分配),并加入公共菜单,排序按sort字段 */ public function getUserResources(int $userId) { @@ -57,14 +40,16 @@ class PermLogic ); // 加入公共菜单,公共菜单不管是否授权,所有人都能访问 - $publicResources = Resource::where('no_auth', 1)->get(); // 获取所有公共菜单 + $publicResources = Resource::where('no_auth', 1) + ->orderBy('sort', 'asc') // 按 sort 字段升序排序 + ->get(); + $all = $all->merge($publicResources); // 返回唯一的资源列表,并按 id 排序 - return $all->unique('id')->values(); + return $all->unique('id')->values()->sortBy('sort'); // 最终根据sort排序 } - /** * 构建目录/菜单树,节点包含权限与打开方式,拼接完整路径,并对子级菜单component处理 * @param \Illuminate\Support\Collection $resources From 85861240c3006a66922e57700965fa423aa6f9ee Mon Sep 17 00:00:00 2001 From: mzl Date: Mon, 14 Jul 2025 19:01:42 +0800 Subject: [PATCH 5/5] Merge branch 'develop' # Conflicts: # app/common/logic/PermLogic.php --- app/common/logic/PermLogic.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/common/logic/PermLogic.php b/app/common/logic/PermLogic.php index b4d38db..b30e6f8 100644 --- a/app/common/logic/PermLogic.php +++ b/app/common/logic/PermLogic.php @@ -44,12 +44,15 @@ class PermLogic ->orderBy('sort', 'asc') // 按 sort 字段升序排序 ->get(); + // 合并所有公共资源 $all = $all->merge($publicResources); // 返回唯一的资源列表,并按 id 排序 - return $all->unique('id')->values()->sortBy('sort'); // 最终根据sort排序 + // 使用 sortBy('sort') 来确保最终结果根据 'sort' 字段排序 + return $all->unique('id')->values()->sortBy('sort'); } + /** * 构建目录/菜单树,节点包含权限与打开方式,拼接完整路径,并对子级菜单component处理 * @param \Illuminate\Support\Collection $resources