├── .gitignore ├── README.md ├── composer.json ├── composer.lock ├── migrations ├── 2022_02_20_065520_create_admin_users_table.php ├── 2022_02_20_114512_create_admin_menus_table.php ├── 2022_02_21_034708_create_admin_departments_table.php ├── 2022_02_21_054427_create_admin_roles_table.php ├── 2022_02_21_075326_create_admin_user_roles_table.php ├── 2022_02_21_100644_create_admin_role_menus_table.php └── 2022_02_21_100656_create_admin_role_departments_table.php ├── src ├── Constructs │ └── CurdInterface.php ├── Controllers │ ├── AuthController.php │ ├── CommonController.php │ ├── CoolBaseController.php │ ├── DepartmentController.php │ ├── MenuController.php │ ├── RoleController.php │ └── UserController.php ├── Cool.php ├── CoolAdminSeeder.php ├── CoolServiceProvider.php ├── Models │ ├── AdminDepartment.php │ ├── AdminMenu.php │ ├── AdminRole.php │ ├── AdminRoleDepartment.php │ ├── AdminRoleMenu.php │ ├── AdminUser.php │ └── AdminUserRole.php ├── Requests │ └── AuthLoginRequest.php ├── Resources │ ├── DepartmentResource.php │ ├── MenusResource.php │ ├── RoleResource.php │ └── UsersResource.php ├── Traits │ ├── CurdEventTrait.php │ └── ResponseTrait.php ├── config.php └── route.php └── tests ├── CoolAdminCurdTest.php └── Faker └── CurdController.php /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor 2 | /.idea 3 | 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 当第一眼看到 [Cool-Admin](https://github.com/cool-team-official/cool-admin-vue) 就被它的颜值惊艳到了 3 | 4 | ![image.png](https://cdn.learnku.com/uploads/images/202202/22/30430/U1ZpcEn2NW.png!large) 5 | 6 | 官方只有node和java版本的server api,于是基于Laravel做了权限管理模块 7 | 8 | ### 安装 9 | 10 | `composer require flaravel/cool-admin-api` 11 | 12 | ### 配置文件 13 | 14 | `php artisan vendor:publish --tag=cool-admin` 15 | 16 | ### 迁移 17 | `php artisan migrate` 18 | 19 | ### 初始化数据 20 | `php artisan vendor:publish --tag=cool-seeder` 21 | 22 | `php artisan db:seed --class=CoolAdminSeeder` 23 | 24 | ### 生成jwt密钥 25 | `php artisan jwt:secret` 26 | 27 | ### 前端 28 | 29 | github: https://github.com/flaravel/cool-admin-vue 30 | 31 | 代码拉取下来之后更改代理配置(在 vite.config.ts文件 中), 更改成当前你的后面请求地址 32 | 33 | ```js 34 | const proxy = { 35 | "/dev": { 36 | target: "请求服务端的url", 37 | changeOrigin: true, 38 | rewrite: (path: string) => path.replace(/^\/dev/, "") 39 | }, 40 | 41 | "/pro": { 42 | target: "https://show.cool-admin.com", 43 | changeOrigin: true, 44 | rewrite: (path: string) => path.replace(/^\/pro/, "/api") 45 | } 46 | }; 47 | ``` 48 | 49 | 更改完运行就能看到如下界面: 50 | 51 | ![img_1.png](http://wxlib-dev.oss-cn-shanghai.aliyuncs.com/dev/ly6SzTx7EUUdPB3sBOfKKgnaWjmeV3N9eIf081Ga.png) 52 | 53 | 54 | ### 演示地址 55 | 56 | http://119.29.159.240:8001 57 | 58 | 管理员: 59 | 60 | - admin 61 | - password 62 | 63 | 测试: 64 | - test 65 | - password 66 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flaravel/cool-admin-api", 3 | "description": "基于Laravel的Cool-Admin Server Api", 4 | "keywords": ["cool-admin","laravel", "sdk"], 5 | "license": "MIT", 6 | "authors": [ 7 | { 8 | "name": "flaravel", 9 | "email": "flaravel7@gamil.com" 10 | } 11 | ], 12 | "require": { 13 | "php-open-source-saver/jwt-auth": "^1.4", 14 | "illuminate/container": "^6.0 || ^7.0 || ^8.0 || ^9.0" 15 | }, 16 | "require-dev": { 17 | "phpunit/phpunit": "^9.5" 18 | }, 19 | "autoload": { 20 | "psr-4": { 21 | "Cool\\": "src/", 22 | "Tests\\": "tests/" 23 | } 24 | }, 25 | "extra":{ 26 | "laravel": { 27 | "providers": [ 28 | "Cool\\CoolServiceProvider" 29 | ] 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /migrations/2022_02_20_065520_create_admin_users_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->unsignedInteger('department_id')->comment('部门ID')->default(0); 19 | $table->string('name', 30)->default('')->comment('姓名'); 20 | $table->string('username', 30)->default('')->comment('用户名'); 21 | $table->string('password', 150)->default('')->comment('密码'); 22 | $table->string('avatar')->default('')->default('')->comment('头像'); 23 | $table->string('email', 20)->default('')->comment('邮箱'); 24 | $table->unsignedTinyInteger('status')->default(1)->comment('状态 0:禁用 1:启用'); 25 | $table->string('nick_name', 50)->default('')->comment('昵称'); 26 | $table->char('phone', 11)->default('')->comment('手机号'); 27 | $table->string('remark')->default('')->comment('备注'); 28 | $table->timestamps(); 29 | }); 30 | } 31 | 32 | /** 33 | * Reverse the migrations. 34 | * 35 | * @return void 36 | */ 37 | public function down() 38 | { 39 | Schema::dropIfExists('admin_users'); 40 | } 41 | }; 42 | -------------------------------------------------------------------------------- /migrations/2022_02_20_114512_create_admin_menus_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->unsignedInteger('parent_id')->comment('父菜单ID')->nullable(); 19 | $table->string('name',100)->comment('菜单名称')->default(''); 20 | $table->string('router',100)->comment('菜单地址')->default(''); 21 | $table->string('perms')->comment('权限标识')->default(''); 22 | $table->unsignedTinyInteger('type')->comment('类型 0:目录 1:菜单 2:按钮')->default(0); 23 | $table->string('icon',100)->comment('图标')->default(''); 24 | $table->unsignedInteger('order_num')->comment('排序')->default(0); 25 | $table->string('view_path',200)->comment('视图地址')->default(''); 26 | $table->unsignedTinyInteger('keep_alive')->comment('路由缓存')->default(1); 27 | $table->unsignedTinyInteger('is_show')->comment('是否展示')->default(1); 28 | $table->timestamps(); 29 | $table->softDeletes(); 30 | }); 31 | } 32 | 33 | /** 34 | * Reverse the migrations. 35 | * 36 | * @return void 37 | */ 38 | public function down() 39 | { 40 | Schema::dropIfExists('admin_menus'); 41 | } 42 | }; 43 | -------------------------------------------------------------------------------- /migrations/2022_02_21_034708_create_admin_departments_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->unsignedInteger('parent_id')->comment('父菜单ID')->default(0); 19 | $table->string('name', 50)->default('')->comment('部门名称'); 20 | $table->unsignedInteger('order_num')->comment('排序')->default(0); 21 | $table->timestamps(); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | * 28 | * @return void 29 | */ 30 | public function down() 31 | { 32 | Schema::dropIfExists('admin_departments'); 33 | } 34 | }; 35 | -------------------------------------------------------------------------------- /migrations/2022_02_21_054427_create_admin_roles_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->unsignedInteger('user_id')->comment('管理员ID')->default(0); 19 | $table->string('name')->comment('名称')->default(''); 20 | $table->string('remark')->comment('备注')->default(''); 21 | $table->string('label')->comment('角色标签')->default(''); 22 | $table->unsignedTinyInteger('relevance')->comment('数据权限是否关联上下级')->default(1); 23 | $table->timestamps(); 24 | $table->softDeletes(); 25 | }); 26 | } 27 | 28 | /** 29 | * Reverse the migrations. 30 | * 31 | * @return void 32 | */ 33 | public function down() 34 | { 35 | Schema::dropIfExists('admin_roles'); 36 | } 37 | }; 38 | -------------------------------------------------------------------------------- /migrations/2022_02_21_075326_create_admin_user_roles_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->unsignedInteger('user_id')->comment('用户ID')->default(0); 19 | $table->unsignedInteger('role_id')->comment('角色ID')->default(0); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | * 27 | * @return void 28 | */ 29 | public function down() 30 | { 31 | Schema::dropIfExists('admin_user_roles'); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /migrations/2022_02_21_100644_create_admin_role_menus_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->unsignedInteger('menu_id')->comment('菜单ID')->default(0); 19 | $table->unsignedInteger('role_id')->comment('角色ID')->default(0); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | * 27 | * @return void 28 | */ 29 | public function down() 30 | { 31 | Schema::dropIfExists('admin_role_menus'); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /migrations/2022_02_21_100656_create_admin_role_departments_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->unsignedInteger('department_id')->comment('部门ID')->default(0); 19 | $table->unsignedInteger('role_id')->comment('角色ID')->default(0); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | * 27 | * @return void 28 | */ 29 | public function down() 30 | { 31 | Schema::dropIfExists('admin_role_departments'); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /src/Constructs/CurdInterface.php: -------------------------------------------------------------------------------- 1 | validated(); 23 | 24 | $token = Auth::guard('cool')->attempt($validated); 25 | if (!$token) { 26 | return $this->error('账号或密码错误'); 27 | } 28 | return $this->respondWithToken($token); 29 | } 30 | 31 | 32 | /** 33 | * @return JsonResponse 34 | */ 35 | public function logout(): JsonResponse 36 | { 37 | Auth::guard('cool')->logout(); 38 | 39 | return $this->message('退出成功'); 40 | } 41 | 42 | /** 43 | * @param $token 44 | * 45 | * @return JsonResponse 46 | */ 47 | protected function respondWithToken($token): JsonResponse 48 | { 49 | return $this->success([ 50 | 'token' => $token, 51 | 'token_type' => 'Bearer', 52 | 'expires_in' => optional(Auth::guard('cool'))->factory()->getTTL() * 60 53 | ]); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/Controllers/CommonController.php: -------------------------------------------------------------------------------- 1 | success([ 21 | 'mode' => 'local', 22 | ]); 23 | } 24 | 25 | 26 | /** 27 | * @param Request $request 28 | * 29 | * @return JsonResponse 30 | */ 31 | public function upload(Request $request): JsonResponse 32 | { 33 | /* 34 | * @var $files UploadedFile[] 35 | */ 36 | if (empty($request->file('file'))) { 37 | return $this->success([]); 38 | } 39 | $files = is_array($request->file('file')) ? $request->file('file') : [$request->file('file')]; 40 | 41 | $path = $request->get('path', date('Ymd')); 42 | 43 | $fileArr = []; 44 | 45 | foreach ($files as $file) { 46 | if ($file->isValid()) { 47 | $fileArr[] = Storage::url($file->store(is_null($path) ? '/' : $path)); 48 | } 49 | } 50 | 51 | return $this->success(count($fileArr) > 1 ? $fileArr : current($fileArr)); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/Controllers/CoolBaseController.php: -------------------------------------------------------------------------------- 1 | model()->get(); 29 | 30 | return $this->success($this->responseWithResource($lists)); 31 | } 32 | 33 | 34 | /** 35 | * @param Request $request 36 | * 37 | * @return JsonResponse 38 | */ 39 | public function page(Request $request): JsonResponse 40 | { 41 | $size = $request->input('size', 15); 42 | 43 | $data = $this->model()->where(function ($query) use ($request) { 44 | $this->queryWhere($query, $request); 45 | })->latest()->paginate($size); 46 | 47 | return $this->success($this->responseWithResource($data)); 48 | } 49 | 50 | 51 | 52 | /** 53 | * @param Request $request 54 | * 55 | * @return JsonResponse 56 | */ 57 | public function create(Request $request): JsonResponse 58 | { 59 | $validated = Cool::snake($request->all()); 60 | 61 | $created = $this->model()->create($this->formatValidatedData($validated,$request)); 62 | 63 | if ($created) { 64 | $this->created($created, $request); 65 | return $this->message('添加成功'); 66 | } 67 | return $this->error('添加失败'); 68 | } 69 | 70 | 71 | /** 72 | * @param Request $request 73 | * 74 | * @return JsonResponse 75 | */ 76 | public function show(Request $request): JsonResponse 77 | { 78 | $id = $request->input('id', 0); 79 | 80 | $model = $this->model()->findOrFail($id); 81 | 82 | return $this->success($this->responseWithResource($model)); 83 | } 84 | 85 | 86 | /** 87 | * @param Request $request 88 | * 89 | * @return JsonResponse 90 | */ 91 | public function update(Request $request): JsonResponse 92 | { 93 | $validated = Cool::snake($request->all()); 94 | 95 | $id = $validated['id'] ?? 0; 96 | if (!$id) { 97 | return $this->error('更新失败'); 98 | } 99 | 100 | $model = $this->model()->where('id', $id)->first(); 101 | 102 | if (!$model) { 103 | return $this->error('更新失败'); 104 | } 105 | 106 | $updated = $model->update($this->formatValidatedData($validated,$request)); 107 | 108 | if ($updated) { 109 | $this->updated($model, $request); 110 | return $this->message('更新成功'); 111 | } 112 | return $this->error('更新失败'); 113 | } 114 | 115 | 116 | /** 117 | * @param Request $request 118 | * 119 | * @return JsonResponse 120 | */ 121 | public function delete(Request $request): JsonResponse 122 | { 123 | $ids = $request->input('ids'); 124 | 125 | if (!$ids) { 126 | return $this->error('删除失败'); 127 | } 128 | $models = $this->model()->whereIn('id', $ids)->get(); 129 | if ($models->isEmpty()) { 130 | return $this->error('删除失败'); 131 | } 132 | foreach ($models as $model) { 133 | $response = $this->deleting($model); 134 | if ($response instanceof JsonResponse) { 135 | return $response->send(); 136 | } 137 | $model->delete(); 138 | } 139 | 140 | return $this->message('删除成功'); 141 | } 142 | 143 | 144 | /** 145 | * @param array $validated 146 | * @param Request $request 147 | * 148 | * @return array 149 | */ 150 | protected function formatValidatedData(array $validated, Request $request): array 151 | { 152 | return $validated; 153 | } 154 | 155 | 156 | /** 157 | * @param Collection|LengthAwarePaginator|Model $data 158 | * 159 | * @return mixed 160 | */ 161 | protected function responseWithResource($data) 162 | { 163 | $resource = $this->resource(); 164 | 165 | if (empty($resource)) { 166 | return $this->formatResponseData($data); 167 | } 168 | if (!is_subclass_of($resource, JsonResource::class)) { 169 | throw new InvalidArgumentException(sprintf('resource [%s] is not instanceof JsonResource', $resource)); 170 | } 171 | if ($data instanceof LengthAwarePaginator) { 172 | $formatData = $this->formatResponseData($data); 173 | $formatData['list'] = $resource::collection($formatData['list']); 174 | return $formatData; 175 | } 176 | if ($data instanceof Collection) { 177 | return $resource::collection($data); 178 | } 179 | return new $resource($data); 180 | } 181 | 182 | 183 | /** 184 | * @param mixed $data 185 | * 186 | * @return mixed 187 | */ 188 | protected function formatResponseData($data) 189 | { 190 | if ($data instanceof LengthAwarePaginator) { 191 | return [ 192 | 'list' => $data->items(), 193 | 'pagination' => [ 194 | 'page' => $data->currentPage(), 195 | 'size' => $data->perPage(), 196 | 'total' => $data->total(), 197 | ] 198 | ]; 199 | } 200 | return $data; 201 | } 202 | } 203 | -------------------------------------------------------------------------------- /src/Controllers/DepartmentController.php: -------------------------------------------------------------------------------- 1 | all() as $value) { 42 | $this->model()->where('id', $value['id'])->update([ 43 | 'parent_id' => $value['parentId'] ?? 0, 44 | 'order_num' => $value['orderNum'] 45 | ]); 46 | } 47 | return $this->message('设置成功'); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/Controllers/MenuController.php: -------------------------------------------------------------------------------- 1 | user(); 22 | 23 | return $this->success([ 24 | 'menus' => MenusResource::collection($user->getMenus()), 25 | 'perms' => $user->getPerms(), 26 | ]); 27 | } 28 | 29 | 30 | /** 31 | * @return Builder 32 | */ 33 | public function model(): Builder 34 | { 35 | return AdminMenu::query(); 36 | } 37 | 38 | 39 | /** 40 | * @return string 41 | */ 42 | public function resource(): string 43 | { 44 | return MenusResource::class; 45 | } 46 | 47 | 48 | /** 49 | * @param $model 50 | * 51 | * @return JsonResponse|void 52 | */ 53 | protected function deleting($model) 54 | { 55 | if ($model->children()->exists()) { 56 | return $this->error('请先删除子级菜单'); 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/Controllers/RoleController.php: -------------------------------------------------------------------------------- 1 | input('keyWord'); 27 | 28 | if ($keyWord) { 29 | $query->where('name', $keyWord)->orWhere('label', $keyWord); 30 | } 31 | } 32 | 33 | 34 | /** 35 | * @return string 36 | */ 37 | public function resource(): string 38 | { 39 | return RoleResource::class; 40 | } 41 | 42 | 43 | /** 44 | * @param array $validated 45 | * @param Request $request 46 | * 47 | * @return array 48 | */ 49 | protected function formatValidatedData(array $validated, Request $request): array 50 | { 51 | return [ 52 | 'relevance' => $validated['relevance'], 53 | 'name' => $validated['name'], 54 | 'label' => $validated['label'], 55 | 'remark' => $validated['remark'] ?? '', 56 | ]; 57 | } 58 | 59 | 60 | /** 61 | * @param $model 62 | * @param Request $request 63 | */ 64 | protected function created($model, Request $request) 65 | { 66 | $this->attachPerms($model, $request); 67 | } 68 | 69 | 70 | /** 71 | * @param $model 72 | * @param Request $request 73 | */ 74 | protected function updated($model, Request $request) 75 | { 76 | $this->attachPerms($model, $request); 77 | } 78 | 79 | 80 | /** 81 | * @param $model 82 | * 83 | * @return JsonResponse|void 84 | */ 85 | public function deleting($model) 86 | { 87 | if ($model->isSuper()) { 88 | return $this->error('超管角色无法删除'); 89 | } 90 | } 91 | 92 | 93 | /** 94 | * @param $model 95 | * @param Request $request 96 | */ 97 | protected function attachPerms($model, Request $request) 98 | { 99 | $menuIds = $request->input('menuIdList'); 100 | $departmentIds = $request->input('departmentIdList'); 101 | $model->attachMenus($menuIds); 102 | $model->attachDepartments($departmentIds); 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /src/Controllers/UserController.php: -------------------------------------------------------------------------------- 1 | success(new UsersResource(Auth::guard('cool')->user())); 21 | } 22 | 23 | 24 | /** 25 | * @param Request $request 26 | * 27 | * @return JsonResponse 28 | */ 29 | public function personUpdate(Request $request): JsonResponse 30 | { 31 | $validated = $request->only('headImg', 'nickName', 'password'); 32 | if (isset($validated['password']) && $validated['password']) { 33 | $validated['password'] = Hash::make($validated['password']); 34 | } 35 | $validated['avatar'] = $validated['headImg']; 36 | $validated['nick_name'] = $validated['nickName'] ?? ''; 37 | 38 | Auth::guard('cool')->user()->update($validated); 39 | 40 | return $this->message('更新成功'); 41 | } 42 | 43 | /** 44 | * @return Builder 45 | */ 46 | public function model(): Builder 47 | { 48 | return AdminUser::query(); 49 | } 50 | 51 | 52 | /** 53 | * @return string 54 | */ 55 | public function resource(): string 56 | { 57 | return UsersResource::class; 58 | } 59 | 60 | 61 | /** 62 | * @param Builder $query 63 | * @param Request $request 64 | */ 65 | protected function queryWhere(Builder $query, Request $request) 66 | { 67 | $departmentIds = $request->input('departmentIds'); 68 | $order = $request->input('order'); 69 | $sort = $request->input('sort'); 70 | $keyWord = $request->input('keyWord'); 71 | 72 | if ($departmentIds) { 73 | $query->whereIn('department_id', $departmentIds); 74 | } 75 | 76 | if ($order && $sort) { 77 | $orderData = [ 78 | 'createTime' => 'created_at' 79 | ]; 80 | $query->orderBy($orderData[$order], $sort); 81 | } 82 | 83 | if ($keyWord) { 84 | $query->where('name', $keyWord)->orWhere('phone', $keyWord); 85 | } 86 | 87 | $query->where('id','!=', 1); // 超级管理员不展示 88 | } 89 | 90 | 91 | /** 92 | * @param array $validated 93 | * @param Request $request 94 | * 95 | * @return array 96 | */ 97 | protected function formatValidatedData(array $validated, Request $request): array 98 | { 99 | $status = $validated['status']; 100 | $validated = array_filter($validated); 101 | $this->getValidationFactory()->make($validated, [ 102 | 'phone' => 'regex:/^1[345789][0-9]{9}$/', 103 | 'email' => 'email', 104 | 'head_img' => 'url' 105 | ], [ 106 | 'phone.regex' => '手机号格式不正确', 107 | 'email.email' => '邮箱格式不正确', 108 | ])->validate(); 109 | 110 | if (isset($validated['password']) && $validated['password']) { 111 | $validated['password'] = Hash::make($validated['password']); 112 | } 113 | $validated['avatar'] = $validated['head_img'] ?? ''; 114 | $validated['status'] = $status ?? 1; 115 | return $validated; 116 | } 117 | 118 | 119 | /** 120 | * @param $model 121 | * @param Request $request 122 | */ 123 | protected function updated($model, Request $request) 124 | { 125 | $roleIds = $request->input('roleIdList'); 126 | $model->attachRole($roleIds); 127 | } 128 | 129 | 130 | /** 131 | * @param $model 132 | * @param Request $request 133 | */ 134 | protected function created($model, Request $request) 135 | { 136 | $roleIds = $request->input('roleIdList'); 137 | $model->attachRole($roleIds); 138 | } 139 | } 140 | -------------------------------------------------------------------------------- /src/Cool.php: -------------------------------------------------------------------------------- 1 | $value) { 20 | $newData[Str::snake($key)] = $value; 21 | } 22 | return $newData; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/CoolAdminSeeder.php: -------------------------------------------------------------------------------- 1 | truncate(); 26 | AdminRole::query()->truncate(); 27 | AdminUserRole::query()->truncate(); 28 | AdminMenu::query()->truncate(); 29 | AdminRoleMenu::query()->truncate(); 30 | AdminDepartment::query()->truncate(); 31 | AdminRoleDepartment::query()->truncate(); 32 | 33 | $user = AdminUser::query()->create([ 34 | 'department_id' => 1, 35 | 'name' => 'admin', 36 | 'username' => 'admin', 37 | 'password' => Hash::make('password'), 38 | 'avatar' => 'https://zy-1309318760.cos.ap-shanghai.myqcloud.com/zy/dq3w8Cp9819ZzSJr6XfT6p4msII5tQcJnFt221u7.png', 39 | 'email' => 'flaravel7@gmail.com', 40 | 'status' => 1, 41 | 'nick_name' => 'flaravel', 42 | 'phone' => '18507193432', 43 | 'remark' => '超级管理员', 44 | ]); 45 | 46 | $role = AdminRole::query()->create([ 47 | 'name' => '管理员', 48 | 'label' => 'admin', 49 | 'remark' => '超级管理员' 50 | ]); 51 | 52 | $user->attachRole([$role->id]); 53 | 54 | 55 | $sql = "INSERT INTO `admin_menus` (`id`, `parent_id`, `name`, `router`, `perms`, `type`, `icon`, `order_num`, `view_path`, `keep_alive`, `is_show`, `created_at`, `updated_at`, `deleted_at`) VALUES 56 | ('1', NULL, '工作台', '/', '', '0', 'icon-workbench', '1', '', '1', '1', '2022-02-20 12:11:16', '2022-02-20 12:11:16', NULL), 57 | ('2', NULL, '系统管理', '/sys', '', '0', 'icon-system', '2', '', '1', '1', '2022-02-20 12:11:16', '2022-02-20 12:11:16', NULL), 58 | ('8', '27', '菜单列表', '/sys/menu', '', '1', 'icon-menu', '2', 'cool/modules/base/views/menu.vue', '1', '1', '2022-02-20 12:11:16', '2022-02-20 12:11:16', NULL), 59 | ('10', '8', '新增', '', 'system:menu:add', '2', '', '1', '', '0', '1', '2022-02-20 12:11:16', '2022-02-20 12:11:16', NULL), 60 | ('11', '8', '删除', '', 'system:menu:delete', '2', '', '2', '', '0', '1', '2022-02-20 12:11:16', '2022-02-20 12:11:16', NULL), 61 | ('12', '8', '修改', '', 'system:menu:update', '2', '', '3', '', '0', '1', '2022-02-20 12:11:16', '2022-02-20 12:11:16', NULL), 62 | ('13', '8', '查询', '', 'system:menu:page', '2', '', '4', '', '0', '1', '2022-02-20 12:11:16', '2022-02-20 12:11:16', NULL), 63 | ('22', '27', '角色列表', '/sys/role', '', '1', 'icon-common', '3', 'cool/modules/base/views/role.vue', '1', '1', '2022-02-20 12:11:16', '2022-02-20 12:11:16', NULL), 64 | ('23', '22', '新增', '', 'system:role:add', '2', '', '1', '', '0', '1', '2022-02-20 12:11:16', '2022-02-21 14:46:57', NULL), 65 | ('24', '22', '删除', '', 'system:role:delete', '2', '', '2', '', '0', '1', '2022-02-20 12:11:16', '2022-02-21 14:47:05', NULL), 66 | ('25', '22', '修改', '', 'system:role:update', '2', '', '3', '', '0', '1', '2022-02-20 12:11:16', '2022-02-21 14:47:16', NULL), 67 | ('26', '22', '查询', '', 'system:role:page,system:role:list,system:role:info', '2', '', '4', '', '0', '1', '2022-02-20 12:11:16', '2022-02-21 14:47:30', NULL), 68 | ('27', '2', '权限管理', '', '', '0', 'icon-auth', '1', '', '0', '1', '2022-02-20 12:11:16', '2022-02-21 08:27:35', NULL), 69 | ('29', '105', '请求日志', '/sys/log', '', '1', 'icon-log', '1', 'cool/modules/base/views/log.vue', '1', '1', '2022-02-20 12:11:16', '2022-02-20 17:05:57', '2022-02-20 17:05:57'), 70 | ('30', '29', '权限', '', 'base:sys:log:page,base:sys:log:clear,base:sys:log:getKeep,base:sys:log:setKeep', '2', '', '1', '', '0', '1', '2022-02-20 12:11:16', '2022-02-20 17:06:01', '2022-02-20 17:06:01'), 71 | ('43', '45', 'crud 示例', '/crud', '', '1', 'icon-favor', '1', 'cool/modules/demo/views/crud.vue', '1', '1', '2022-02-20 12:11:16', '2022-02-20 12:11:16', NULL), 72 | ('45', '1', '组件库', '/ui-lib', '', '0', 'icon-common', '2', '', '1', '1', '2022-02-20 12:11:16', '2022-02-20 12:11:16', NULL), 73 | ('49', '45', 'quill 富文本编辑器', '/editor-quill', '', '1', 'icon-favor', '2', 'cool/modules/demo/views/editor-quill.vue', '1', '1', '2022-02-20 12:11:16', '2022-02-20 12:11:16', NULL), 74 | ('59', '97', '部门列表', '', 'system:department:page,system:department:list', '2', '', '0', '', '1', '1', '2022-02-20 12:11:16', '2022-02-21 14:44:25', NULL), 75 | ('60', '97', '新增部门', '', 'system:department:add', '2', '', '0', '', '1', '1', '2022-02-20 12:11:16', '2022-02-21 14:44:39', NULL), 76 | ('61', '97', '更新部门', '', 'system:department:update', '2', '', '0', '', '1', '1', '2022-02-20 12:11:16', '2022-02-21 14:44:48', NULL), 77 | ('62', '97', '删除部门', '', 'system:department:delete', '2', '', '0', '', '1', '1', '2022-02-20 12:11:16', '2022-02-21 14:45:00', NULL), 78 | ('63', '97', '部门排序', '', 'system:department:order', '2', '', '0', '', '1', '1', '2022-02-20 12:11:16', '2022-02-21 14:43:59', NULL), 79 | ('65', '97', '用户转移', '', 'base:sys:user:move', '2', '', '0', '', '1', '1', '2022-02-20 12:11:16', '2022-02-21 13:30:17', '2022-02-21 13:30:17'), 80 | ('78', '2', '参数配置', '', '', '0', 'icon-common', '4', '', '1', '1', '2022-02-20 12:11:16', '2022-02-20 17:16:34', '2022-02-20 17:16:34'), 81 | ('79', '78', '参数列表', '/sys/param', '', '1', 'icon-menu', '0', 'cool/modules/base/views/param.vue', '1', '1', '2022-02-20 12:11:16', '2022-02-20 17:16:32', '2022-02-20 17:16:32'), 82 | ('80', '79', '新增', '', 'base:sys:param:add', '2', '', '0', '', '1', '1', '2022-02-20 12:11:16', '2022-02-20 17:16:30', '2022-02-20 17:16:30'), 83 | ('81', '79', '修改', '', 'base:sys:param:info,base:sys:param:update', '2', '', '0', '', '1', '1', '2022-02-20 12:11:16', '2022-02-20 17:16:28', '2022-02-20 17:16:28'), 84 | ('82', '79', '删除', '', 'base:sys:param:delete', '2', '', '0', '', '1', '1', '2022-02-20 12:11:16', '2022-02-20 17:16:26', '2022-02-20 17:16:26'), 85 | ('83', '79', '查看', '', 'base:sys:param:page,base:sys:param:list,base:sys:param:info', '2', '', '0', '', '1', '1', '2022-02-20 12:11:16', '2022-02-20 17:16:24', '2022-02-20 17:16:24'), 86 | ('86', '45', '文件上传', '/upload', '', '1', 'icon-favor', '3', 'cool/modules/demo/views/upload.vue', '1', '1', '2022-02-20 12:11:16', '2022-02-20 12:11:16', NULL), 87 | ('96', '1', '组件预览', '/demo', '', '1', 'icon-favor', '0', 'cool/modules/demo/views/demo.vue', '1', '1', '2022-02-20 12:11:16', '2022-02-20 12:11:16', NULL), 88 | ('97', '27', '用户列表', '/sys/user', '', '1', 'icon-user', '0', 'cool/modules/base/views/user.vue', '1', '1', '2022-02-20 12:11:16', '2022-02-20 12:11:16', NULL), 89 | ('98', '97', '新增', '', 'system:user:add', '2', '', '0', '', '1', '1', '2022-02-20 12:11:16', '2022-02-21 14:45:41', NULL), 90 | ('99', '97', '删除', '', 'system:user:delete', '2', '', '0', '', '1', '1', '2022-02-20 12:11:16', '2022-02-21 14:45:53', NULL), 91 | ('100', '97', '修改', '', 'system:user:update', '2', '', '0', '', '1', '1', '2022-02-20 12:11:16', '2022-02-21 14:46:02', NULL), 92 | ('101', '97', '查询', '', 'system:user:list,system:user:info,system:user:page', '2', '', '0', '', '1', '1', '2022-02-20 12:11:16', '2022-02-21 14:46:14', NULL), 93 | ('122', NULL, 'demo', '', '', '0', 'icon-like', '3', '', '1', '1', '2022-02-20 17:29:46', '2022-02-20 17:31:59', '2022-02-20 17:31:59'), 94 | ('123', '122', '测试菜单', '/demo/test', '', '1', 'icon-info', '1', 'views/home/index.vue', '0', '1', '2022-02-20 17:30:24', '2022-02-20 17:31:55', '2022-02-20 17:31:55');"; 95 | 96 | DB::getPdo()->exec($sql); 97 | 98 | 99 | $sql2 = "INSERT INTO `admin_role_menus` (`id`, `menu_id`, `role_id`, `created_at`, `updated_at`) VALUES 100 | ('101', '1', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 101 | ('102', '96', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 102 | ('103', '45', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 103 | ('104', '43', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 104 | ('105', '49', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 105 | ('106', '86', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 106 | ('107', '2', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 107 | ('108', '27', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 108 | ('109', '97', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 109 | ('110', '59', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 110 | ('111', '60', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 111 | ('112', '61', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 112 | ('113', '62', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 113 | ('114', '63', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 114 | ('115', '98', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 115 | ('116', '99', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 116 | ('117', '100', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 117 | ('118', '101', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 118 | ('119', '8', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 119 | ('120', '10', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 120 | ('121', '11', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 121 | ('122', '12', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 122 | ('123', '13', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 123 | ('124', '22', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 124 | ('125', '23', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 125 | ('126', '24', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 126 | ('127', '25', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 127 | ('128', '26', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45');"; 128 | 129 | DB::getPdo()->exec($sql2); 130 | 131 | $sql3 = "INSERT INTO `admin_departments` (`id`, `parent_id`, `name`, `order_num`, `created_at`, `updated_at`) VALUES 132 | ('1', '0', 'COOL', '0', '2022-02-21 03:59:52', '2022-02-21 15:33:25'), 133 | ('17', '1', '测试', '1', '2022-02-21 14:50:23', '2022-02-21 15:33:25');"; 134 | 135 | DB::getPdo()->exec($sql3); 136 | 137 | 138 | $sql4 = "INSERT INTO `admin_role_departments` (`id`, `department_id`, `role_id`, `created_at`, `updated_at`) VALUES 139 | ('1', '1', '16', '2022-02-21 10:17:16', '2022-02-21 10:17:16'), 140 | ('2', '11', '16', '2022-02-21 10:17:16', '2022-02-21 10:17:16'), 141 | ('3', '12', '16', '2022-02-21 10:17:16', '2022-02-21 10:17:16'), 142 | ('4', '13', '16', '2022-02-21 10:17:16', '2022-02-21 10:17:16'), 143 | ('13', '1', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45'), 144 | ('14', '17', '1', '2022-02-21 15:06:45', '2022-02-21 15:06:45');"; 145 | 146 | DB::getPdo()->exec($sql4); 147 | } 148 | } 149 | -------------------------------------------------------------------------------- /src/CoolServiceProvider.php: -------------------------------------------------------------------------------- 1 | runningInConsole()) { 32 | $this->loadMigrationsFrom(__DIR__ . '/../migrations'); 33 | 34 | $this->publishes([ 35 | __DIR__.'/config.php' => config_path('cool.php') 36 | ], 'cool-admin'); 37 | $this->publishes([ 38 | __DIR__ . '/CoolAdminSeeder.php' => database_path('seeders/CoolAdminSeeder.php') 39 | ], 'cool-seeder'); 40 | 41 | } else { 42 | $this->defineCoolAdminException(); 43 | } 44 | 45 | $this->defineCoolAdminRoutes(); 46 | $this->defineCoolAdminConfigureGuard(); 47 | } 48 | 49 | 50 | /** 51 | * @return void 52 | */ 53 | protected function defineCoolAdminException() 54 | { 55 | optional(app(ExceptionHandler::class))->renderable(function (ValidationException $e) { 56 | return $this->error($e->getMessage()); 57 | }); 58 | } 59 | 60 | /** 61 | * @return void 62 | */ 63 | protected function defineCoolAdminRoutes() 64 | { 65 | if (app()->routesAreCached()) { 66 | return; 67 | } 68 | $this->loadRoutesFrom(__DIR__.'/route.php'); 69 | } 70 | 71 | /** 72 | * @return void 73 | */ 74 | protected function defineCoolAdminConfigureGuard() 75 | { 76 | $guardData = array_merge(config('auth.guards'), [ 77 | 'cool' => [ 78 | 'driver' => 'jwt', 79 | 'provider' => 'cool_user', 80 | ] 81 | ]); 82 | 83 | $providersData = array_merge(config('auth.providers'), [ 84 | 'cool_user' => [ 85 | 'driver' => 'eloquent', 86 | 'model' => AdminUser::class, 87 | ] 88 | ]); 89 | config(['auth.guards' => $guardData]); 90 | config(['auth.providers' => $providersData]); 91 | } 92 | } 93 | 94 | -------------------------------------------------------------------------------- /src/Models/AdminDepartment.php: -------------------------------------------------------------------------------- 1 | hasMany(AdminDepartment::class, 'parent_id'); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/Models/AdminMenu.php: -------------------------------------------------------------------------------- 1 | 'boolean', 22 | 'keep_alive' => 'boolean', 23 | ]; 24 | 25 | /** 26 | * @return HasMany 27 | */ 28 | public function children(): HasMany 29 | { 30 | return $this->hasMany(AdminMenu::class, 'parent_id'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/Models/AdminRole.php: -------------------------------------------------------------------------------- 1 | hasMany(AdminRoleMenu::class, 'role_id'); 24 | } 25 | 26 | /** 27 | * @return HasMany 28 | */ 29 | public function roleDepartments(): HasMany 30 | { 31 | return $this->hasMany(AdminRoleDepartment::class, 'role_id'); 32 | } 33 | 34 | /** 35 | * @param array $menuIds 36 | */ 37 | public function attachMenus(array $menuIds) 38 | { 39 | $this->roleMenus()->delete(); 40 | foreach ($menuIds as $menuId) { 41 | $this->roleMenus()->firstOrCreate([ 42 | 'menu_id' => $menuId 43 | ]); 44 | } 45 | } 46 | 47 | /** 48 | * @param array $departmentIds 49 | */ 50 | public function attachDepartments(array $departmentIds) 51 | { 52 | $this->roleDepartments()->delete(); 53 | foreach ($departmentIds as $departmentId) { 54 | $this->roleDepartments()->create([ 55 | 'department_id' => $departmentId 56 | ]); 57 | } 58 | } 59 | 60 | /** 61 | * @return bool 62 | */ 63 | public function isSuper(): bool 64 | { 65 | return $this->label == 'admin'; 66 | } 67 | 68 | 69 | /** 70 | * @return array 71 | */ 72 | public function getDepartmentIds(): array 73 | { 74 | return $this->roleDepartments()->get(['department_id'])->pluck('department_id')->toArray(); 75 | } 76 | 77 | /** 78 | * @return array 79 | */ 80 | public function getMenuIds(): array 81 | { 82 | return $this->roleMenus()->get(['menu_id'])->pluck('menu_id')->toArray(); 83 | } 84 | 85 | 86 | /** 87 | * @return Builder[]|Collection 88 | */ 89 | public function getMenus() 90 | { 91 | $menuIds = $this->roleMenus()->get(['menu_id'])->pluck('menu_id')->toArray(); 92 | 93 | return AdminMenu::query()->whereIn('id', $menuIds)->get(); 94 | } 95 | 96 | /** 97 | * @return array 98 | */ 99 | public function getMenuPerms(): array 100 | { 101 | $menuIds = $this->roleMenus()->get(['menu_id'])->pluck('menu_id')->toArray(); 102 | 103 | return AdminMenu::query()->whereIn('id', $menuIds)->get(['perms'])->pluck('perms')->filter()->values()->toArray(); 104 | } 105 | } 106 | 107 | -------------------------------------------------------------------------------- /src/Models/AdminRoleDepartment.php: -------------------------------------------------------------------------------- 1 | getKey(); 29 | } 30 | 31 | /** 32 | * Return a key value array, containing any custom claims to be added to the JWT. 33 | * 34 | * @return array 35 | */ 36 | public function getJWTCustomClaims(): array 37 | { 38 | return []; 39 | } 40 | 41 | 42 | /** 43 | * @return BelongsTo 44 | */ 45 | public function department(): BelongsTo 46 | { 47 | return $this->belongsTo(AdminDepartment::class); 48 | } 49 | 50 | /** 51 | * @return HasMany 52 | */ 53 | public function adminRole(): HasMany 54 | { 55 | return $this->hasMany(AdminUserRole::class, 'user_id'); 56 | } 57 | 58 | 59 | /** 60 | * @return HasManyThrough 61 | */ 62 | public function role(): HasManyThrough 63 | { 64 | return $this->hasManyThrough(AdminRole::class, AdminUserRole::class, 'user_id', 'id', 'id', 'role_id'); 65 | } 66 | 67 | /** 68 | * @return void 69 | */ 70 | public function attachRole(array $roleIds) 71 | { 72 | $this->adminRole()->delete(); 73 | foreach ($roleIds as $roleId) { 74 | $this->adminRole()->create([ 75 | 'role_id' => $roleId 76 | ]); 77 | } 78 | } 79 | 80 | /** 81 | * @return string 82 | */ 83 | public function getRoleString(): string 84 | { 85 | return $this->role()->get()->pluck('name')->implode(','); 86 | } 87 | 88 | /** 89 | * @return array 90 | */ 91 | public function getRoleIds(): array 92 | { 93 | return $this->role()->get()->pluck('id')->toArray(); 94 | } 95 | 96 | /** 97 | * @return array 98 | */ 99 | public function getPerms(): array 100 | { 101 | $roles = $this->role()->get(); 102 | $perms = []; 103 | foreach ($roles as $role) { 104 | $perms += $role->getMenuPerms(); 105 | } 106 | return $perms; 107 | } 108 | 109 | /** 110 | * @return array 111 | */ 112 | public function getMenus() 113 | { 114 | $roles = $this->role()->get(); 115 | $menuIds = []; 116 | foreach ($roles as $role) { 117 | $menuIds += $role->getMenuIds(); 118 | } 119 | $menuIds = array_unique($menuIds); 120 | 121 | return AdminMenu::query()->whereIn('id', $menuIds)->get(); 122 | } 123 | } 124 | -------------------------------------------------------------------------------- /src/Models/AdminUserRole.php: -------------------------------------------------------------------------------- 1 | 'required|string', 13 | 'password' => 'required|string', 14 | ]; 15 | } 16 | 17 | public function authorize(): bool 18 | { 19 | return true; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/Resources/DepartmentResource.php: -------------------------------------------------------------------------------- 1 | $this->id, 22 | 'parentId' => $this->parent_id, 23 | 'name' => $this->name, 24 | 'orderNum' => $this->order_num, 25 | ]; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Resources/MenusResource.php: -------------------------------------------------------------------------------- 1 | $this->id, 22 | 'parentId' => $this->parent_id, 23 | 'name' => $this->name, 24 | 'router' => $this->router, 25 | 'perms' => $this->perms, 26 | 'type' => $this->type, 27 | 'icon' => $this->icon, 28 | 'orderNum' => $this->order_num, 29 | 'viewPath' => $this->view_path, 30 | 'keepAlive' => $this->keep_alive, 31 | 'isShow' => $this->is_show, 32 | 'updateTime' => Carbon::parse($this->updated_at)->toDateTimeString(), 33 | ]; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/Resources/RoleResource.php: -------------------------------------------------------------------------------- 1 | $this->id, 22 | 'name' => $this->name, 23 | 'label' => $this->label, 24 | 'remark' => $this->remark, 25 | 'departmentIdList' => $this->getDepartmentIds(), 26 | 'menuIdList' => $this->getMenuIds(), 27 | 'createTime' => Carbon::parse($this->created_at)->toDateTimeString(), 28 | 'updateTime' => Carbon::parse($this->updated_at)->toDateTimeString(), 29 | ]; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/Resources/UsersResource.php: -------------------------------------------------------------------------------- 1 | $this->id, 22 | 'name' => $this->name, 23 | 'username' => $this->username, 24 | 'headImg' => $this->avatar, 25 | 'status' => $this->status, 26 | 'phone' => $this->phone, 27 | 'email' => $this->email, 28 | 'nickName' => $this->nick_name, 29 | 'remark' => $this->remark, 30 | 'departmentName'=> optional($this->department)->name ?? '', 31 | 'departmentId' => $this->department_id, 32 | 'roleName' => $this->getRoleString(), 33 | 'roleIdList' => $this->getRoleIds(), 34 | 'createTime' => Carbon::parse($this->created_at)->toDateTimeString(), 35 | ]; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/Traits/CurdEventTrait.php: -------------------------------------------------------------------------------- 1 | $code, 'message' => $message, 'data' => $data]) 21 | ->setEncodingOptions(JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); 22 | } 23 | 24 | /** 25 | * @param string $message 26 | * 27 | * @return JsonResponse 28 | */ 29 | public function error(string $message = ''): JsonResponse 30 | { 31 | return $this->response(NULL, $message, -1); 32 | } 33 | 34 | 35 | /** 36 | * @param mixed $data 37 | * 38 | * @return JsonResponse 39 | */ 40 | public function success($data): JsonResponse 41 | { 42 | return $this->response($data); 43 | } 44 | 45 | 46 | /** 47 | * @param string $message 48 | * 49 | * @return JsonResponse 50 | */ 51 | public function message($message = 'ok'): JsonResponse 52 | { 53 | return $this->response(NULL, $message); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/config.php: -------------------------------------------------------------------------------- 1 | [ 6 | 7 | 'prefix' => 'admin' 8 | ] 9 | ]; 10 | -------------------------------------------------------------------------------- /src/route.php: -------------------------------------------------------------------------------- 1 | config('cool.route.prefix')], function () { 11 | 12 | 13 | Route::post('login', [AuthController::class, "login"]); 14 | 15 | Route::post('logout', [AuthController::class, "logout"]); 16 | 17 | Route::group(['middleware' => 'auth:cool'], function () { 18 | 19 | // 文件上传 20 | Route::get('uploadMode', [CommonController::class, "uploadMode"]); 21 | Route::post('upload', [CommonController::class, "upload"]); 22 | 23 | // 管理员信息 24 | Route::get('user', [UserController::class, "user"]); 25 | Route::post('personUpdate', [UserController::class, "personUpdate"]); 26 | 27 | // 权限菜单 28 | Route::get('permmenu', [MenuController::class, "perms"]); 29 | 30 | Route::group(['prefix' => 'system'], function () { 31 | 32 | // 管理员 33 | Route::get('user/info', [UserController::class, "show"]); 34 | Route::post('user/page', [UserController::class, "page"]); 35 | Route::post('user/delete', [UserController::class, "delete"]); 36 | Route::post('user/add', [UserController::class, "create"]); 37 | Route::post('user/update', [UserController::class, "update"]); 38 | 39 | // 角色 40 | Route::get('role/list', [RoleController::class, "lists"]); 41 | Route::post('role/page', [RoleController::class, "page"]); 42 | Route::post('role/add', [RoleController::class, "create"]); 43 | Route::post('role/update', [RoleController::class, "update"]); 44 | Route::post('role/delete', [RoleController::class, "delete"]); 45 | Route::get('role/info', [RoleController::class, "show"]); 46 | 47 | // 部门 48 | Route::get('department/list', [DepartmentController::class, "lists"]); 49 | Route::post('department/add', [DepartmentController::class, "create"]); 50 | Route::post('department/update', [DepartmentController::class, "update"]); 51 | Route::post('department/delete', [DepartmentController::class, "delete"]); 52 | Route::get('department/info', [DepartmentController::class, "show"]); 53 | Route::post('department/order', [DepartmentController::class, "order"]); 54 | 55 | // 菜单 56 | Route::get('menu/list', [MenuController::class, "lists"]); 57 | Route::post('menu/delete', [MenuController::class, "delete"]); 58 | Route::post('menu/add', [MenuController::class, "create"]); 59 | Route::get('menu/info', [MenuController::class, "show"]); 60 | Route::post('menu/update', [MenuController::class, "update"]); 61 | }); 62 | }); 63 | }); 64 | 65 | -------------------------------------------------------------------------------- /tests/CoolAdminCurdTest.php: -------------------------------------------------------------------------------- 1 |