From 9262a58f1022b67f226a9e64a28594037c45ce59 Mon Sep 17 00:00:00 2001 From: vine_liutk <961510893@qq.com> Date: Fri, 14 Oct 2022 14:57:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A7=92=E8=89=B2=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/AdminPermissionController.php | 35 +++++++ app/Http/Controllers/AdminRoleController.php | 83 ++++++++++++++++ app/Http/Controllers/AdminUserController.php | 17 ++-- app/Http/Requestes/AdminRoleRequest.php | 43 +++++++++ app/Http/Requestes/AdminUserRequest.php | 2 + app/Http/Requestes/AdminUserUpdateRequest.php | 51 ++++++++++ app/Http/Resources/AdminRoleResource.php | 27 ++++++ app/Http/Resources/AdminUserResource.php | 2 +- app/ModelFilters/AdminRoleFilter.php | 11 +++ app/Models/AdminPermission.php | 15 +++ app/Models/AdminRole.php | 11 +++ composer.lock | 4 +- database/seeders/EndpointPermissionSeeder.php | 94 +++++++++++++++++++ database/seeders/PermissionSeeder.php | 22 +++++ routes/api.php | 16 ++-- 15 files changed, 418 insertions(+), 15 deletions(-) create mode 100644 app/Http/Controllers/AdminPermissionController.php create mode 100644 app/Http/Controllers/AdminRoleController.php create mode 100644 app/Http/Requestes/AdminRoleRequest.php create mode 100644 app/Http/Requestes/AdminUserUpdateRequest.php create mode 100644 app/Http/Resources/AdminRoleResource.php create mode 100644 app/ModelFilters/AdminRoleFilter.php create mode 100644 app/Models/AdminPermission.php create mode 100644 app/Models/AdminRole.php create mode 100644 database/seeders/EndpointPermissionSeeder.php create mode 100644 database/seeders/PermissionSeeder.php diff --git a/app/Http/Controllers/AdminPermissionController.php b/app/Http/Controllers/AdminPermissionController.php new file mode 100644 index 0000000..1f81ebb --- /dev/null +++ b/app/Http/Controllers/AdminPermissionController.php @@ -0,0 +1,35 @@ +toTree(AdminPermission::endPoint()->get()); + return $this->json($this->formatPermissionsTreeToArray($permissions)); + } + + /** + * 格式化树 + * + * @param array $permissions + * @return void + */ + protected function formatPermissionsTreeToArray(array $permissions) + { + $res = []; + foreach ($permissions as $permission) { + $res[] = [ + 'id' => $permission->id, + 'label' => $permission->name, + 'children' => $this->formatPermissionsTreeToArray($permission->children ?? []), + ]; + } + return $res; + } +} diff --git a/app/Http/Controllers/AdminRoleController.php b/app/Http/Controllers/AdminRoleController.php new file mode 100644 index 0000000..8fb0e6e --- /dev/null +++ b/app/Http/Controllers/AdminRoleController.php @@ -0,0 +1,83 @@ +input())->where('id', '>', '1'); + $list = $query->simplePaginate(Paginator::resolvePerPage('per_page', 20, 50)); + return $this->json(AdminRoleResource::collection($list)); + } + + public function store(AdminRoleRequest $request) + { + $permissionIds = $request->input('permission_ids', []); + //验证slug唯一 + if(AdminRole::where('slug', $request->input('slug'))->exists()){ + return $this->error('该角色编码已存在'); + } + try{ + DB::beginTransaction(); + //添加角色信息 + $role = AdminRole::create($request->input()); + //添加角色权限 + $role->permissions()->sync($permissionIds); + DB::commit(); + }catch(\Throwable $th){ + DB::rollBack(); + report($th); + return $this->error('添加失败,请稍后再试'); + } + return $this->success('添加成功'); + } + + public function show(AdminRole $adminRole){ + $adminRole->load('permissions'); + return $this->json(AdminRoleResource::make($adminRole)); + } + + public function update(AdminRole $adminRole, AdminRoleRequest $request) + { + $permissionIds = $request->input('permission_ids', []); + //验证slug唯一 + if(AdminRole::where('slug', $request->input('slug'))->where('id', '<>', $adminRole->id)->exists()){ + return $this->error('该角色编码已存在'); + } + try{ + DB::beginTransaction(); + //添加角色信息 + $adminRole->update($request->input()); + //添加角色权限 + $adminRole->permissions()->sync($permissionIds); + DB::commit(); + }catch(\Throwable $th){ + DB::rollBack(); + report($th); + return $this->error('添加失败,请稍后再试'); + } + return $this->success('添加成功'); + } + + public function destroy(AdminRole $adminRole){ + try{ + DB::beginTransaction(); + $adminRole->permissions()->sync([]); + $adminRole->delete(); + DB::commit(); + }catch(\Throwable $th){ + DB::rollBack(); + report($th); + return $this->error('删除失败,请稍后再试'); + } + return $this->success('删除成功!'); + } +} diff --git a/app/Http/Controllers/AdminUserController.php b/app/Http/Controllers/AdminUserController.php index beeee37..e5c13c9 100644 --- a/app/Http/Controllers/AdminUserController.php +++ b/app/Http/Controllers/AdminUserController.php @@ -8,6 +8,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use App\Http\Requestes\AdminUserRequest; use App\Http\Resources\AdminUserResource; +use App\Http\Requestes\AdminUserUpdateRequest; class AdminUserController extends Controller { @@ -23,9 +24,10 @@ class AdminUserController extends Controller $baseIds = $request->input('base_ids', []); try{ DB::beginTransaction(); - //添加基地信息 - $user = AdminUser::create($request->input()); - //添加基地农作物 + //添加管理员信息 + $password = bcrypt($request->input('password')); + $user = AdminUser::create(array_merge(['password'=> $password], $request->input())); + //添加管理员查看基地的数据权限; $user->bases()->sync($baseIds); DB::commit(); }catch(\Throwable $th){ @@ -40,14 +42,14 @@ class AdminUserController extends Controller return $this->json(AdminUserResource::make($adminUser)); } - public function update(AdminUser $adminUser, AdminUserRequest $request) + public function update(AdminUser $adminUser, AdminUserUpdateRequest $request) { $baseIds = $request->input('base_ids', []); try{ DB::beginTransaction(); - //添加基地信息 + //添加管理员信息 $adminUser->update($request->input()); - //添加基地农作物 + //添加管理员查看基地的数据权限; $adminUser->crops()->sync($baseIds); DB::commit(); }catch(\Throwable $th){ @@ -59,6 +61,9 @@ class AdminUserController extends Controller } public function destroy(AdminUser $adminUser){ + if($adminUser->id == 1){ + return $this->error('删除失败,请稍后再试'); + } try{ DB::beginTransaction(); $adminUser->crops()->sync([]); diff --git a/app/Http/Requestes/AdminRoleRequest.php b/app/Http/Requestes/AdminRoleRequest.php new file mode 100644 index 0000000..890d3e8 --- /dev/null +++ b/app/Http/Requestes/AdminRoleRequest.php @@ -0,0 +1,43 @@ + 'required|string|max:100', + 'slug' => 'required|alpha_num|max:100', + 'permission_ids' => 'nullable|array', + ]; + } + + public function messages() + { + $messages = [ + 'name.required' => '请填写角色名称', + 'name.max' => '角色名称过长,请修改后提交', + 'slug.required' => '请填写角色编码', + 'slug.alpha_num' => '角色编码仅能由数字与字母组合', + 'slug.max' => '角色编码长度过长,请修改后提交', + ]; + + return $messages; + } + + protected function failedValidation(Validator $validator) + { + $error = $validator->errors()->all(); + throw new HttpResponseException(response()->json(['data' => [], 'code' => 400, 'message' => $error[0]])); + } +} diff --git a/app/Http/Requestes/AdminUserRequest.php b/app/Http/Requestes/AdminUserRequest.php index 8dc1c88..3c0fdd3 100644 --- a/app/Http/Requestes/AdminUserRequest.php +++ b/app/Http/Requestes/AdminUserRequest.php @@ -23,6 +23,7 @@ class AdminUserRequest extends FormRequest 'department' => 'nullable|string', 'phone' => 'nullable|string', 'status' => 'required|integer|min:0', + 'role_id' => 'required|integer|min:0', 'base_ids' => 'nullable|array', ]; } @@ -41,6 +42,7 @@ class AdminUserRequest extends FormRequest 'name.string' =>'请正确填写名称', 'name.max' => '名称长度不能超过100位', 'status' => '请选择用户状态', + 'role_id' => "请选择角色" ]; return $messages; diff --git a/app/Http/Requestes/AdminUserUpdateRequest.php b/app/Http/Requestes/AdminUserUpdateRequest.php new file mode 100644 index 0000000..2c6abc9 --- /dev/null +++ b/app/Http/Requestes/AdminUserUpdateRequest.php @@ -0,0 +1,51 @@ + 'required|alpha_num|max:100', + 'name' => 'required|string|max:100', + 'avatar' => 'nullable|string', + 'department' => 'nullable|string', + 'phone' => 'nullable|string', + 'status' => 'required|integer|min:0', + 'role_id' => 'required|integer|min:0', + 'base_ids' => 'nullable|array', + ]; + } + + public function messages() + { + $messages = [ + 'username.required' => '请填写登录用户名', + 'username.alpha_num' => '用户名只能由字母和数字组成', + 'username.max' => '用户名最长100位', + 'name.required' => '请填写名称', + 'name.string' =>'请正确填写名称', + 'name.max' => '名称长度不能超过100位', + 'status' => '请选择用户状态', + 'role_id' => "请选择角色" + ]; + + return $messages; + } + + protected function failedValidation(Validator $validator) + { + $error = $validator->errors()->all(); + throw new HttpResponseException(response()->json(['data' => [], 'code' => 400, 'message' => $error[0]])); + } +} diff --git a/app/Http/Resources/AdminRoleResource.php b/app/Http/Resources/AdminRoleResource.php new file mode 100644 index 0000000..36fee3f --- /dev/null +++ b/app/Http/Resources/AdminRoleResource.php @@ -0,0 +1,27 @@ + $this->id, + 'name' => $this->name, + 'slug'=> $this->slug, + 'permissions' => $this->whenLoaded('permissions', function () { + return $this->permissions->pluck('id'); + }, ''), + ]; + } +} diff --git a/app/Http/Resources/AdminUserResource.php b/app/Http/Resources/AdminUserResource.php index 6341f33..e55d1ab 100644 --- a/app/Http/Resources/AdminUserResource.php +++ b/app/Http/Resources/AdminUserResource.php @@ -23,7 +23,7 @@ class AdminUserResource extends JsonResource 'phone' => $this->phone, 'status' => $this->status, 'is_enable'=> $this->is_enable, - 'bases' => AgriculturalBaseResource::collection($this->whenload('bases')), + 'bases' => AgriculturalBaseResource::collection($this->whenloaded('bases')), ]; } } diff --git a/app/ModelFilters/AdminRoleFilter.php b/app/ModelFilters/AdminRoleFilter.php new file mode 100644 index 0000000..978c9f6 --- /dev/null +++ b/app/ModelFilters/AdminRoleFilter.php @@ -0,0 +1,11 @@ +where('slug', 'like', 'endpoint%'); + } +} diff --git a/app/Models/AdminRole.php b/app/Models/AdminRole.php new file mode 100644 index 0000000..89503a0 --- /dev/null +++ b/app/Models/AdminRole.php @@ -0,0 +1,11 @@ +['name' => '系统权限', 'curd'=>false, 'in_path'=> true, 'children' => [ + 'monitor_data' => ['name' =>'监测数据管理', 'curd' => false, 'children'=> [ + 'weather' =>['name' =>'气象管理', 'curd'=>['index']], + 'camera' => ['name' =>'智能监控', 'curd'=>['index']], + 'soil' => ['name' =>'土壤监控', 'curd'=>['index'], 'children'=> ['setting'=>'设置']], + 'water' => ['name' =>'水质监控', 'curd'=>['index'], 'children'=> ['setting'=>'设置']] + ]], + 'base_data' => ['name' => '基础数据管理', 'curd' => false, 'children'=>[ + 'citydata_statistics' => ['name'=>'全市基础数据', 'curd'=> ['index', 'edit']], + 'agricultural_basic' =>['name'=>'基地数据', 'curd'=>true], + 'crops_build' => ['name' =>'农业产业结构', 'curd'=>true], + 'crops_output'=> ['name' =>'产量排行榜','curd'=>true], + 'crops_flow' => ['name' =>'农产品流向', 'curd'=>true], + 'crops_price' => ['name' =>'农产品价格走势', 'curd'=>['index'], 'children'=> ['is_enable'=>'自动监测开关']], + ]], + 'device_data' => ['name' => '设备管理', 'curd'=>false,'children'=>[ + 'device' => ['name' =>'设备管理', 'curd'=>true], + ]], + 'manage'=>['name' =>'系统管理', 'curd'=>false, 'children'=>[ + 'admin_users' => ['name' =>'管理员管理', 'curd'=>true, 'children'=>[ + 'edit_password'=>'修改密码', 'enable'=>'启用/禁用' + ]], + 'admin_roles' =>['name'=>'角色管理', 'curd' =>true], + 'operation_log' => ['name' =>'操作日志', 'curd'=>['index']] + ]] + ]] + ]; + $this->createPermissionData($permissions); + } + + /** + * 插入权限 + * + * @param array $permissions + * @param string $key + * @param int $pId + */ + public function createPermissionData(array $permissions, string $key = '', int $pId = 0) + { + $curdArr = [ + 'index' => '列表', + 'create' => '新增', + 'edit' => '修改', + 'destroy' => '删除', + 'show' => '详情', + ]; + foreach ($permissions as $slug => $permission) { + //是否已存在该权限 + $slugKey = ($key ? $key.'.'.$slug : $slug); + + $pper = Permission::updateOrCreate(['slug' => $slugKey], ['name' => is_string($permission) ? $permission : $permission['name'], 'parent_id' => $pId]); + + if (! is_string($permission)) { + if (! isset($permission['children'])) { + $permission['children'] = []; + } + //判断是否默认插入curd权限 + if (isset($permission['curd']) && $permission['curd']) { + if (is_array($permission['curd'])) { + $permission['curd'] = array_reverse($permission['curd']); + foreach ($permission['curd'] as $value) { + $permission['children'] = array_merge([$value => $curdArr[$value]], $permission['children']); + } + } else { + $permission['children'] = array_merge($curdArr, $permission['children']); + } + } + + if (count($permission['children']) > 0) { + $_key = ($permission['curd'] !== false || ($permission['in_path'] ?? false)) ? ($key ? $key.'.'.$slug : $slug) : $key; + $this->createPermissionData($permission['children'], $_key ?? $slug, $pper->id); + } + } + } + } +} diff --git a/database/seeders/PermissionSeeder.php b/database/seeders/PermissionSeeder.php new file mode 100644 index 0000000..b3c83d7 --- /dev/null +++ b/database/seeders/PermissionSeeder.php @@ -0,0 +1,22 @@ +call([ + AdminPermissionSeeder::class, + EndpointPermissionSeeder::class, + ]); + } +} diff --git a/routes/api.php b/routes/api.php index a2143f4..8170ac7 100644 --- a/routes/api.php +++ b/routes/api.php @@ -20,15 +20,19 @@ Route::post('auth/login', [AuthController::class, 'login']); Route::group(['middleware' => 'auth:sanctum'], function () { Route::get('keywords-crops', [KeywordController::class, 'crops']); //农作物 Route::get('keywords-crops-cate', [KeywordController::class, 'cropsCate']); //农作物产业分类 + Route::get('permissions', [AdminPermissionController::class, 'index']); - //全市基础数据 - Route::get('citydata-statistics', [CityDataController::class, 'statistics']); - //基地数据 - Route::apiResource('agricultural-basic', AgriculturalBaseController::class); + Route::group(['as'=>'endpoint.'], function (){ + //全市基础数据 + Route::get('citydata-statistics', [CityDataController::class, 'statistics'])->name('citydata_statistics.index'); + //基地数据 + Route::apiResource('agricultural-basic', AgriculturalBaseController::class)->names('agricultural_basic'); - /** 系统管理 **/ - Route::apiResource('admin-users', AdminUserController::class); + /** 系统管理 **/ + Route::apiResource('admin-users', AdminUserController::class)->names('admin_users'); + Route::apiResource('admin-roles', AdminRoleController::class)->names('admin_roles'); + }); Route::prefix('users')->group(function () { Route::put('reset-password', [UserController::class, 'resetPwd']);