From 5ed0e2d4f51db1005ef824caa1224a299b8f2862 Mon Sep 17 00:00:00 2001 From: ctexthuang Date: Mon, 15 Sep 2025 17:09:00 +0800 Subject: [PATCH] feat : admin menu --- app/Controller/Admin/AdminMenuController.php | 70 ++++++++++ app/Controller/Admin/AdminRoleController.php | 21 +++ app/Repository/AdminMenuRepository.php | 80 +++++++++++ app/Repository/AdminUserRepository.php | 46 +++++++ app/Service/Admin/AdminUser/MenuService.php | 136 +++++++++++++++++++ app/Service/Admin/AdminUser/RoleService.php | 21 +++ 6 files changed, 374 insertions(+) create mode 100644 app/Controller/Admin/AdminMenuController.php create mode 100644 app/Controller/Admin/AdminRoleController.php create mode 100644 app/Repository/AdminMenuRepository.php create mode 100644 app/Service/Admin/AdminUser/MenuService.php create mode 100644 app/Service/Admin/AdminUser/RoleService.php diff --git a/app/Controller/Admin/AdminMenuController.php b/app/Controller/Admin/AdminMenuController.php new file mode 100644 index 0000000..e17713c --- /dev/null +++ b/app/Controller/Admin/AdminMenuController.php @@ -0,0 +1,70 @@ +service->handle(); + } + + /** + * @return array + */ + #[RequestMapping(path: "", methods: "POST")] + #[Permission(code: 'permission:menu:create')] + public function createMenu(): array + { + return $this->service->create(); + } + + /** + * @param int $id + * @return array + */ + #[RequestMapping(path: "{id}", methods: "PUT")] + #[Permission(code: 'permission:menu:save')] + public function updateMenu(int $id): array + { + return $this->service->update(); + } + + /** + * @return array + */ + #[RequestMapping(path: "", methods: "DELETE")] + #[Permission(code: 'permission:menu:delete')] + public function deleteMenu(): array + { + return $this->service->delete(); + } +} diff --git a/app/Controller/Admin/AdminRoleController.php b/app/Controller/Admin/AdminRoleController.php new file mode 100644 index 0000000..65e2551 --- /dev/null +++ b/app/Controller/Admin/AdminRoleController.php @@ -0,0 +1,21 @@ +perQuery($this->getQuery(), $params)->orderBy('sort')->get(); + } + + /** + * @param Builder $query + * @param array $params + * @return Builder + */ + public function handleSearch(Builder $query, array $params): Builder + { + $whereInName = static function (Builder $query, array|string $code) { + $query->whereIn('name', Arr::wrap($code)); + }; + return $query + ->when(Arr::get($params, 'sortable'), static function (Builder $query, array $sortable) { + $query->orderBy(key($sortable), current($sortable)); + }) + ->when(Arr::get($params, 'code'), $whereInName) + ->when(Arr::get($params, 'name'), $whereInName) + ->when(Arr::get($params, 'children'), static function (Builder $query) { + $query->with('children'); + })->when(Arr::get($params, 'status'), static function (Builder $query, AdminMenuStatusCode $status) { + $query->where('status', $status); + }) + ->when(Arr::has($params, 'parent_id'), static function (Builder $query) use ($params) { + $query->where('parent_id', Arr::get($params, 'parent_id')); + }); + } + + /** + * @return Builder[]|\Hyperf\Database\Model\Collection + */ + public function allTree(): \Hyperf\Database\Model\Collection|array + { + return $this->model + ->newQuery() + ->where('parent_id', 0) + ->with('children') + ->get(); + } +} \ No newline at end of file diff --git a/app/Repository/AdminUserRepository.php b/app/Repository/AdminUserRepository.php index 52f6943..d4a7b41 100644 --- a/app/Repository/AdminUserRepository.php +++ b/app/Repository/AdminUserRepository.php @@ -11,6 +11,7 @@ declare(strict_types=1); namespace App\Repository; use App\Model\AdminUser; +use Hyperf\Collection\Arr; use Hyperf\Database\Concerns\BuildsQueries; use Hyperf\Database\Model\Builder; use Hyperf\Database\Model\Model; @@ -34,4 +35,49 @@ final class AdminUserRepository extends BaseRepository ->where('username', $username) ->first(); } + + /** + * @param Builder $query + * @param array $params + * @return Builder + */ + public function handleSearch(Builder $query, array $params): Builder + { + return $query + ->when(Arr::get($params, 'unique_username'), static function (Builder $query, $uniqueUsername) { + $query->where('username', $uniqueUsername); + }) + ->when(Arr::get($params, 'username'), static function (Builder $query, $username) { + $query->where('username', 'like', '%' . $username . '%'); + }) + ->when(Arr::get($params, 'phone'), static function (Builder $query, $phone) { + $query->where('phone', $phone); + }) + ->when(Arr::get($params, 'email'), static function (Builder $query, $email) { + $query->where('email', $email); + }) + ->when(Arr::exists($params, 'status'), static function (Builder $query) use ($params) { + $query->where('status', Arr::get($params, 'status')); + }) + ->when(Arr::exists($params, 'user_type'), static function (Builder $query) use ($params) { + $query->where('user_type', Arr::get($params, 'user_type')); + }) + ->when(Arr::exists($params, 'nickname'), static function (Builder $query) use ($params) { + $query->where('nickname', 'like', '%' . Arr::get($params, 'nickname') . '%'); + }) + ->when(Arr::exists($params, 'created_at'), static function (Builder $query) use ($params) { + $query->whereBetween('created_at', [ + Arr::get($params, 'created_at')[0] . ' 00:00:00', + Arr::get($params, 'created_at')[1] . ' 23:59:59', + ]); + }) + ->when(Arr::get($params, 'user_ids'), static function (Builder $query, $userIds) { + $query->whereIn('id', $userIds); + }) + ->when(Arr::get($params, 'role_id'), static function (Builder $query, $roleId) { + $query->whereHas('roles', static function (Builder $query) use ($roleId) { + $query->where('role_id', $roleId); + }); + }); + } } \ No newline at end of file diff --git a/app/Service/Admin/AdminUser/MenuService.php b/app/Service/Admin/AdminUser/MenuService.php new file mode 100644 index 0000000..0a3248d --- /dev/null +++ b/app/Service/Admin/AdminUser/MenuService.php @@ -0,0 +1,136 @@ +adminReturn->success('success',$this->adminMenuRepository->list([ + 'children' => true, + 'parent_id' => 0 + ])?->toArray() ?? []); + } + + /** + * @return array + */ + public function create(): array + { + $data = array($this->getRequestData(),[ + 'created_by' => $this->adminId + ]); + /** + * @var AdminMenu $model + */ + $model = $this->adminMenuRepository->create($data); + + if (!$model) throw new ErrException('添加失败'); + + if ($data['meta']['type'] !== 'M' || empty($data['btnPermission'])) return $this->adminReturn->success('success',$model->toArray()); + + foreach ($data['btnPermission'] as $item) { + $this->adminMenuRepository->create([ + 'parent_id' => $model->id, + 'name' => $item['code'], + 'sort' => 0, + 'status' => 1, + 'meta' => [ + 'title' => $item['title'], + 'i18n' => $item['i18n'], + 'type' => 'B' + ], + ]); + } + + return $this->adminReturn->success('success',$model->toArray()); + } + + /** + * @param int $id + * @return array + */ + public function update(int $id): array + { + $data = array($this->getRequestData(),[ + 'updated_by' => $this->adminId + ]); + + $model = $this->adminMenuRepository->updateById($id, $data); + + if (!$model) throw new ErrException('修改失败'); + + if ($data['meta']['type'] !== 'M' || !isset($data['btnPermission'])) return $this->adminReturn->success(); + + $existsBtnPermissions = array_flip( + $this->adminMenuRepository + ->getQuery() + ->where('parent_id', $id) + ->whereJsonContains('meta->type', 'B') + ->pluck('id') + ->toArray() + ); + + if (!empty($data['btnPermission'])) { + foreach ($data['btnPermission'] as $item) { + if (empty($item['type']) || $item['type'] !== 'B') continue; + + $data = [ + 'name' => $item['code'], + 'meta' => [ + 'title' => $item['title'], + 'i18n' => $item['i18n'], + 'type' => 'B' + ], + ]; + + if (!empty($item['id'])) { + $this->adminMenuRepository->updateById($item['id'], $data); + unset($existsBtnPermissions[$item['id']]); + } else { + $data['parent_id'] = $id; + $this->adminMenuRepository->create($data); + } + } + } + + if (!empty($existsBtnPermissions)) $this->adminMenuRepository->deleteById(array_keys($existsBtnPermissions)); + + return $this->adminReturn->success(); + } + + /** + * @return array + */ + public function delete(): array + { + $res = $this->adminMenuRepository->deleteById($this->getRequestData()); + + if (!$res) throw new ErrException('删除失败'); + + return $this->adminReturn->success(); + } +} \ No newline at end of file diff --git a/app/Service/Admin/AdminUser/RoleService.php b/app/Service/Admin/AdminUser/RoleService.php new file mode 100644 index 0000000..f0f540f --- /dev/null +++ b/app/Service/Admin/AdminUser/RoleService.php @@ -0,0 +1,21 @@ +