From 360aeec0e1ba95011b73af19059ec0ba23a0c10d Mon Sep 17 00:00:00 2001 From: "mzl@hnxinyouhe.com" Date: Tue, 12 Aug 2025 15:26:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=90=8E=E5=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/controller/RoleController.php | 99 +++--------------- app/admin/controller/UserController.php | 87 +++++++++++----- app/admin/logic/UserLogic.php | 80 +++++++++++++++ app/admin/service/RoleService.php | 10 ++ app/admin/service/UserService.php | 25 +++++ app/common/controller/ResourceController.php | 16 +++ app/common/controller/UserController.php | 100 +++++++++---------- app/common/logic/ResourceLogic.php | 20 ++++ app/common/logic/RoleLogic.php | 79 ++++++++++++++- app/common/service/ResourceService.php | 19 ++++ config/route.php | 4 + 11 files changed, 372 insertions(+), 167 deletions(-) diff --git a/app/admin/controller/RoleController.php b/app/admin/controller/RoleController.php index 691e070..f73f07d 100644 --- a/app/admin/controller/RoleController.php +++ b/app/admin/controller/RoleController.php @@ -5,6 +5,7 @@ namespace app\admin\controller; use app\common\controller\BaseController; use app\admin\service\RoleService; use app\common\traits\crud\CrudControllerTrait; +use support\Request; class RoleController extends BaseController { @@ -27,91 +28,15 @@ class RoleController extends BaseController return $data; } - // /** - // * 获取角色列表 - // */ - // public function list(Request $request) - // { - // try { - // $params = $request->all(); - // $result = (new RoleService())->getRoleList($params); - // // 定义后处理器 - // $postProcessor = function($formattedData) { - // if (isset($formattedData['created_at'])) - // $formattedData['created_at'] = date('Y-m-d H:i:s', $formattedData['created_at']); - // if (isset($formattedData['updated_at'])) - // $formattedData['updated_at'] = date('Y-m-d H:i:s', $formattedData['updated_at']); - // return $formattedData; - // }; - // return $this->success($this->transformData($result, $postProcessor), '角色列表获取成功'); - // } catch (\Throwable $e) { - // return $this->error($e->getMessage()); - // } - // } - // /** - // * 获取角色详情 - // */ - // public function detail(Request $request) - // { - // try { - // $roleId = $request->get('role_id'); - // if (!$roleId) { - // return $this->error('缺少角色ID', 422); - // } - // $result = (new RoleService())->getRoleDetail($roleId); - // return $this->success($result, '角色详情获取成功'); - // } catch (\Throwable $e) { - // return $this->error($e->getMessage()); - // } - // } - - // /** - // * 增加角色 - // */ - // public function create(Request $request) - // { - // try { - // $data = $this->validate(new RoleValidate(), $request->post(), 'role_create'); - // $result = (new RoleService())->createRole($data); - // return $this->success($result, '角色创建成功'); - // } catch (\think\exception\ValidateException $e) { - // return $this->error($e->getError(), 422); - // } catch (\Throwable $e) { - // return $this->error($e->getMessage()); - // } - // } - - // /** - // * 修改角色 - // */ - // public function update(Request $request) - // { - // try { - // $data = $this->validate(new RoleValidate(), $request->post(), 'role_update'); - // $result = (new RoleService())->updateRole($data); - // return $this->success($result, '角色更新成功'); - // } catch (\think\exception\ValidateException $e) { - // return $this->error($e->getError(), 422); - // } catch (\Throwable $e) { - // return $this->error($e->getMessage()); - // } - // } - - // /** - // * 删除角色 - // */ - // public function delete(Request $request) - // { - // try { - // $roleId = $request->get('role_id'); - // if (!$roleId) { - // return $this->error('缺少角色ID', 422); - // } - // (new RoleService())->deleteRole($roleId); - // return $this->success([], '角色删除成功'); - // } catch (\Throwable $e) { - // return $this->error($e->getMessage()); - // } - // } -} + public function menuResource(Request $request) + { + try { + $data = $this->validate($this->service->getValidator(), $request->post(), 'allocation'); + $res = $this->service->menuResource($request, $data); + return $this->success($res); + } catch (\Throwable $e) { + return $this->error($e->getMessage()); + } + } +} \ No newline at end of file diff --git a/app/admin/controller/UserController.php b/app/admin/controller/UserController.php index dfcebd7..ae596e3 100644 --- a/app/admin/controller/UserController.php +++ b/app/admin/controller/UserController.php @@ -6,6 +6,7 @@ use app\common\model\Corp; use app\common\traits\crud\CrudControllerTrait; use app\admin\service\UserService; use app\crm\model\Customer; +use support\Request; class UserController extends BaseController { @@ -24,32 +25,66 @@ class UserController extends BaseController * @param array $data * @return array */ - protected function indexFormat($data) - { - if(isset($data['records'])){ - return $data; - } - $data['sex_txt'] = ''; - if (isset($data['sex']) && $data['sex'] == 1){ - $data['sex_txt'] = '男'; - }elseif(isset($data['sex']) && $data['sex'] == 2){ - $data['sex_txt'] = '女'; - } + protected function indexFormat($data) + { + if(isset($data['records'])){ + return $data; + } + $data['sex_txt'] = ''; + if (isset($data['sex']) && $data['sex'] == 1){ + $data['sex_txt'] = '男'; + }elseif(isset($data['sex']) && $data['sex'] == 2){ + $data['sex_txt'] = '女'; + } - switch ($data['status']){ - case 1: - $data['status_txt'] = '正常'; - break; - case 2: - $data['status_txt'] = '离职'; - break; - default: - $data['status_txt'] = ''; - break; - } + switch ($data['status']){ + case 1: + $data['status_txt'] = '正常'; + break; + case 2: + $data['status_txt'] = '离职'; + break; + default: + $data['status_txt'] = ''; + break; + } - $data['corp_name'] = Corp::where('id', $data['corp_id'])->value('name'); - $data['customer_count'] = Customer::where('user_id', $data['id'])->count(); - return $data; - } + $data['corp_name'] = Corp::where('id', $data['corp_id'])->value('name'); + $data['customer_count'] = Customer::where('user_id', $data['id'])->count(); + return $data; + } + + /** + * 授权 + * + * @param Request $request + * @return mixed + */ + public function authorize(Request $request) + { + try { + $data = $this->validate($this->service->getValidator(), $request->post(), 'authorize'); + $res = $this->service->authorize($request, $data); + return $this->success([], '分配成功'); + } catch (\Throwable $e) { + return $this->error($e->getMessage()); + } + } + + /** + * 直接授权 + * + * @param Request $request + * @return mixed + */ + public function updateResources(Request $request) + { + try { + $data = $this->validate($this->service->getValidator(), $request->post(), 'updateResources'); + $res = $this->service->updateResources($request, $data); + return $this->success([], '分配成功'); + } catch (\Throwable $e) { + return $this->error($e->getMessage()); + } + } } \ No newline at end of file diff --git a/app/admin/logic/UserLogic.php b/app/admin/logic/UserLogic.php index de0d15d..2df041d 100644 --- a/app/admin/logic/UserLogic.php +++ b/app/admin/logic/UserLogic.php @@ -4,6 +4,7 @@ namespace app\admin\logic; use app\common\traits\crud\CrudLogicTrait; use app\common\model\User; +use support\Db; class UserLogic { @@ -14,4 +15,83 @@ class UserLogic */ protected string $modelClass = User::class; + + public function updateRoleAndSystem(array $data): bool + { + $roleIds = $data['role_ids'] ?? []; + $systemIds = $data['system_ids'] ?? []; + $userId = $data['user_id'] ?? 0; + + if (empty($roleId)) { + return false; + } + + Db::beginTransaction(); + try { + Db::table('user_roles')->where('user_id', $userId)->delete(); + if (!empty($roleIds)) { + $insertData = []; + foreach ($roleIds as $roleId) { + $insertData[] = [ + 'role_id' => $roleId, + 'user_id' => $userId + ]; + } + Db::table('user_roles')->insert($insertData); + } + + Db::table('user_systems')->where('user_id', $userId)->delete(); + if (!empty($systemIds)) { + $insertData = []; + foreach ($systemIds as $systemId) { + $insertData[] = [ + 'system_id' => $systemId, + 'user_id' => $userId + ]; + } + Db::table('user_systems')->insert($insertData); + } + + Db::commit(); + return true; + } catch (\Throwable $exception) { + Db::rollBack(); + return false; + } + } + + + public function updateUserResources(array $data): bool + { + $userId = $data['role_id'] ?? 0; + $resources = $data['resources'] ?? []; + + if (empty($userId)) { + return false; + } + + Db::beginTransaction(); + try { + // 删除原有资源关联 + Db::table('user_resources')->where('user_id', $userId)->delete(); + + // 批量插入新角色资源关联 + if (!empty($resources)) { + $insertData = []; + foreach ($resources as $resourceId) { + $insertData[] = [ + 'user_id' => $userId, + 'resource_id' => $resourceId + ]; + } + Db::table('user_resources')->insert($insertData); + } + + Db::commit(); + return true; + } catch (\Throwable $exception) { + Db::rollBack(); + return false; + } + } } \ No newline at end of file diff --git a/app/admin/service/RoleService.php b/app/admin/service/RoleService.php index 248bc3d..af86a04 100644 --- a/app/admin/service/RoleService.php +++ b/app/admin/service/RoleService.php @@ -2,9 +2,11 @@ namespace app\admin\service; +use app\common\logic\RoleLogic; use app\common\validate\RoleValidate; use app\common\traits\crud\CrudServiceTrait; use app\common\model\Role; +use support\Db; class RoleService { @@ -28,4 +30,12 @@ class RoleService { return new $this->validator; } + + /** + * 获取角色资源 + */ + public function menuResource($request, $data) + { + return (new RoleLogic)->updateRoleResources($data); + } } \ No newline at end of file diff --git a/app/admin/service/UserService.php b/app/admin/service/UserService.php index 6926bc5..4ce782a 100644 --- a/app/admin/service/UserService.php +++ b/app/admin/service/UserService.php @@ -2,6 +2,7 @@ namespace app\admin\service; +use app\admin\logic\UserLogic; use app\admin\validate\UserValidate; use app\common\traits\crud\CrudServiceTrait; use app\common\model\User; @@ -75,4 +76,28 @@ class UserService return $config; } + + /** + * 授权 + * + * @param Request $request + * @param array $data + * @return bool + */ + public function authorize(Request $request, array $data = []) + { + return (new UserLogic())->updateRoleAndSystem($data); + } + + /** + * 更新用户资源权限 + * + * @param Request $request + * @param array $data + * @return bool + */ + public function updateResources(Request $request, array $data = []) + { + return (new UserLogic())->updateUserResources($data); + } } \ No newline at end of file diff --git a/app/common/controller/ResourceController.php b/app/common/controller/ResourceController.php index 4d81058..5fd35b9 100644 --- a/app/common/controller/ResourceController.php +++ b/app/common/controller/ResourceController.php @@ -63,4 +63,20 @@ class ResourceController extends BaseController return $this->error($e->getMessage()); } } + + /** + * 菜单 + */ + public function menuTreeList(Request $request) + { + try { + $raw = $this->service->serviceMenuTreeList($request); + $data = $this->transformData($raw, method_exists($this, 'allFormat') + ? [$this, 'allFormat'] + : null); + return $this->success($data); + } catch (\Throwable $e) { + return $this->error($e->getMessage()); + } + } } \ No newline at end of file diff --git a/app/common/controller/UserController.php b/app/common/controller/UserController.php index d725166..a69f32b 100644 --- a/app/common/controller/UserController.php +++ b/app/common/controller/UserController.php @@ -9,7 +9,7 @@ class UserController extends BaseController { /** - * 用户信息 + * 用户信息(登录后调用) */ public function info(Request $request) { @@ -23,57 +23,57 @@ class UserController extends BaseController } } - /** - * 用户信息 - */ - public function getUser(Request $request) - { - try { - $uid = $request->user->uid; - $corp_abbr = $request->basic_data['corp_abbr']; - $result = (new UserService())->getUser($uid,$corp_abbr); - return $this->success($result, '获取用户信息'); - } catch (\Throwable $e) { - return $this->error($e->getMessage()); - } - } + // /** + // * 用户信息 + // */ + // public function getUser(Request $request) + // { + // try { + // $uid = $request->user->uid; + // $corp_abbr = $request->basic_data['corp_abbr']; + // $result = (new UserService())->getUser($uid,$corp_abbr); + // return $this->success($result, '获取用户信息'); + // } catch (\Throwable $e) { + // return $this->error($e->getMessage()); + // } + // } - /** - * 编辑用户 - */ - public function edit(Request $request) - { - try { - $uid = $request->user->uid; - $data = $request->all(); - $result = (new UserService())->edit($uid,$data); - unset($result['password']); - unset($result['union_id']); - unset($result['open_id']); - unset($result['tenant_key']); - return $this->success($result, '编辑成功'); - } catch (\Throwable $e) { - return $this->error($e->getMessage()); - } - } + // /** + // * 编辑用户 + // */ + // public function edit(Request $request) + // { + // try { + // $uid = $request->user->uid; + // $data = $request->all(); + // $result = (new UserService())->edit($uid,$data); + // unset($result['password']); + // unset($result['union_id']); + // unset($result['open_id']); + // unset($result['tenant_key']); + // return $this->success($result, '编辑成功'); + // } catch (\Throwable $e) { + // return $this->error($e->getMessage()); + // } + // } - /** - * 修改密码 - * @param Request $request - * @return \support\Response - * @throws \Random\RandomException - */ - public function savePassword(Request $request) - { - try { - $uid = $request->user->uid; - $data = $request->all(); - $result = (new UserService())->savePassword($uid,$data);; - return $this->success($result, '编辑成功'); - } catch (\Throwable $e) { - return $this->error($e->getMessage()); - } - } + // /** + // * 修改密码 + // * @param Request $request + // * @return \support\Response + // * @throws \Random\RandomException + // */ + // public function savePassword(Request $request) + // { + // try { + // $uid = $request->user->uid; + // $data = $request->all(); + // $result = (new UserService())->savePassword($uid,$data);; + // return $this->success($result, '编辑成功'); + // } catch (\Throwable $e) { + // return $this->error($e->getMessage()); + // } + // } } \ No newline at end of file diff --git a/app/common/logic/ResourceLogic.php b/app/common/logic/ResourceLogic.php index cbcb14e..ddf6423 100644 --- a/app/common/logic/ResourceLogic.php +++ b/app/common/logic/ResourceLogic.php @@ -4,6 +4,7 @@ namespace app\common\logic; use app\common\traits\crud\CrudLogicTrait; use app\common\model\Resource; +use support\Request; class ResourceLogic { @@ -14,4 +15,23 @@ class ResourceLogic */ protected string $modelClass = Resource::class; + + public function logicListAllResources(Request $request, array $config) + { + $data = $this->logicListAll($config); + + if ($request->get('role_id')) { + $selected = (new RoleLogic())->getRoleResources($request->get('role_id')); + } else if ($request->get('user_id')) { + $selected = (new RoleLogic())->getUserResources($request->get('user_id')); + } else { + $selected = []; + } + + foreach ($data as &$item) { + $item['selected'] = in_array($item['id'], $selected) ? true : false; + } + + return $data; + } } \ No newline at end of file diff --git a/app/common/logic/RoleLogic.php b/app/common/logic/RoleLogic.php index bd8f121..0898b10 100644 --- a/app/common/logic/RoleLogic.php +++ b/app/common/logic/RoleLogic.php @@ -2,13 +2,84 @@ namespace app\common\logic; -use app\common\model\Role; -use support\exception\BusinessException; -use support\Log; +use support\Db; class RoleLogic { - + /** + * 更新角色资源权限 + * + * @param array $data 包含 role_id 和 resources 的数据 + * @return bool 操作是否成功 + */ + public function updateRoleResources(array $data): bool + { + $roleId = $data['role_id'] ?? 0; + $resources = $data['resources'] ?? []; + + if (empty($roleId)) { + return false; + } + + Db::beginTransaction(); + try { + // 删除原有角色资源关联 + Db::table('role_resources')->where('role_id', $roleId)->delete(); + + // 批量插入新角色资源关联 + if (!empty($resources)) { + $insertData = []; + foreach ($resources as $resourceId) { + $insertData[] = [ + 'role_id' => $roleId, + 'resource_id' => $resourceId + ]; + } + Db::table('role_resources')->insert($insertData); + } + + Db::commit(); + return true; + } catch (\Throwable $exception) { + Db::rollBack(); + return false; + } + } + /** + * 获取角色资源 + * + * @param int $roleId 角色ID + * @return array 资源ID列表 + */ + public function getRoleResources(int $roleId): array + { + if (empty($roleId)) { + return []; + } + + return Db::table('role_resources') + ->where('role_id', $roleId) + ->pluck('resource_id') + ->toArray(); + } + + /** + * 获取用户资源 + * + * @param int $userId 用户ID + * @return array 资源ID列表 + */ + public function getUserResources(int $userId): array + { + if (empty($userId)) { + return []; + } + + return Db::table('user_resources') + ->where('user_id', $userId) + ->pluck('resource_id') + ->toArray(); + } } diff --git a/app/common/service/ResourceService.php b/app/common/service/ResourceService.php index 7d52eff..5c73800 100644 --- a/app/common/service/ResourceService.php +++ b/app/common/service/ResourceService.php @@ -2,6 +2,7 @@ namespace app\common\service; +use app\common\logic\ResourceLogic; use app\common\validate\ResourceValidate; use app\common\traits\crud\CrudServiceTrait; use app\common\model\Resource; @@ -50,6 +51,11 @@ class ResourceService $config['order']['sort'] = 'asc'; $config['order']['id'] = 'asc'; break; + case 'menuTreeList': + $config['where']['status'] = 1; + $config['order']['sort'] = 'asc'; + $config['order']['id'] = 'asc'; + break; case 'index': $config['where']['status'] = 1; $config['order']['sort'] = 'asc'; @@ -79,6 +85,13 @@ class ResourceService return $this->postProcess('MenuList', $result); } + public function serviceMenuTreeList(Request $request) + { + $config = $this->buildQueryConfig($request, 'menuTreeList'); + $result = (new ResourceLogic())->logicListAllResources($request, $config); + return $this->postProcess('MenuTreeList', $result); + } + protected function afterServiceListAll($data) { @@ -91,4 +104,10 @@ class ResourceService $data = Tree::buildWithReference($data->toArray()); return $data; } + + protected function afterServiceMenuTreeList($data) + { + $data = Tree::buildWithReference($data->toArray()); + return $data; + } } \ No newline at end of file diff --git a/config/route.php b/config/route.php index 5e1afa6..880c4a5 100644 --- a/config/route.php +++ b/config/route.php @@ -70,6 +70,7 @@ Route::group('/admin', function () { Route::any('/store', [app\admin\controller\RoleController::class, 'store']); Route::any('/update', [app\admin\controller\RoleController::class, 'update']); Route::any('/destroy', [app\admin\controller\RoleController::class, 'destroy']); + Route::any('/menu/resource', [app\admin\controller\RoleController::class, 'menuResource']); }); // 公司 @@ -107,6 +108,7 @@ Route::group('/admin', function () { Route::any('/update', [app\common\controller\ResourceController::class, 'update']); Route::any('/destroy', [app\common\controller\ResourceController::class, 'destroy']); Route::any('/list/menu', [app\common\controller\ResourceController::class, 'menuList']); + Route::any('/list/menu/tree', [app\common\controller\ResourceController::class, 'menuTreeList']); }); // 用户 @@ -114,6 +116,8 @@ Route::group('/admin', function () { Route::any('/list', [app\admin\controller\UserController::class, 'index']); Route::any('/show', [app\admin\controller\UserController::class, 'show']); Route::any('/update', [app\admin\controller\UserController::class, 'update']); + Route::any('/authorize', [app\admin\controller\UserController::class, 'authorize']); + Route::any('/set/resources', [app\admin\controller\UserController::class, 'updateResources']); }); // 询单