service = $service; } #[OA\Get( path: "/system/config/group/{group_code}", summary: "按分组获取配置", tags: ["系统配置"], x: [ SchemaConstants::X_SCHEMA_REQUEST => ConfigGroupQueryRequest::class, ] )] #[AllowAnonymous(requireToken: false, requirePermission: false)] #[SimpleResponse(schema: [], example: '{"site_open": "1","site_url": "http://127.0.0.1:8001","site_name": "madong-admin","site_logo": "https://madong.tech/assets/images/logo.svg","site_network_security": "2024042441号-2","site_description": "快速开发框架","site_record_no": "2024042442","site_icp_url": "https://beian.miit.gov.cn/","site_network_security_url": ""}')] public function getByGroup(Request $request, string $group_code): \support\Response { try { // 参数验证 if (empty($group_code)) { return Json::fail('分组编码不能为空'); } $options = [ 'enabled_only' => $request->input('enabled_only', true), 'with_metadata' => $request->input('with_metadata', false), ]; $result = $this->service->getByGroup($group_code, [], $options); return Json::success('操作成功', $result); } catch (\Exception $e) { return Json::fail($e->getMessage()); } } #[OA\Get( path: "/system/config/code/{code}", summary: "按code获取配置", tags: ["系统配置"], x: [ SchemaConstants::X_SCHEMA_REQUEST => ConfigQueryRequest::class, ] )] #[OA\Parameter( name: "code", description: "配置编码", in: "path", required: true, schema: new OA\Schema(type: "string"), )] #[AllowAnonymous(requireToken: false, requirePermission: false)] #[SimpleResponse(schema: [], example: ' {"site_open": "1","site_url": "http://127.0.0.1:8001"}')] public function getByCode(Request $request, string $code): \support\Response { try { // 参数验证 if (empty($code)) { return Json::fail('配置编码不能为空'); } $groupCode = $request->input('group_code', ''); $options = []; if (!empty($groupCode)) { $options['group_code'] = $groupCode; } $result = $this->service->config($code, [], $options); return Json::success('操作成功', $result); } catch (\Exception $e) { return Json::fail($e->getMessage()); } } /** * 保存单个配置 * * @param Request $request * * @return \support\Response * @throws \Exception */ #[OA\Post( path: "/system/config", summary: "保存单个配置", tags: ["系统配置"], )] #[Permission(code: 'system:config:create')] #[SimpleResponse(schema: [], example: [])] public function store(Request $request): \support\Response { try { $data = $request->all(); // 参数验证 if (empty($data['group_code']) || empty($data['code']) || empty($data['name'])) { return Json::fail('参数不能为空'); } $options = [ 'group_code' => $data['group_code'], 'name' => $data['name'], ]; if (isset($data['enabled'])) { $options['enabled'] = $data['enabled']; } $this->service->update( $data['code'], $data['content'], $options ); return Json::success('保存成功'); } catch (\Exception $e) { return Json::fail($e->getMessage()); } } /** * 保存单个配置 * * @param Request $request * * @return \support\Response * @throws \Exception */ #[OA\Put( path: "/system/config/{code}", summary: "更新配置", tags: ["系统配置"], )] #[Permission(code: 'system:config:update')] #[SimpleResponse(schema: [], example: [])] public function update(Request $request): \support\Response { try { $data = $request->all(); $code = $request->route->param('code'); $options = [ 'name' => $data['name'], 'group_code' => $data['group_code'] ?? '', 'enabled' => $data['enabled'] ?? 0, ]; $this->service->update( $code, $data['content'], $options ); return Json::success('更新成功'); } catch (\Exception $e) { return Json::fail($e->getMessage()); } } /** * 获取特定配置项的特定键值 * * @param Request $request * @param string $code * * @return \support\Response * @throws \Exception */ #[OA\Get( path: "/system/config/{code}/value", summary: "获取特定配置项的特定键值", tags: ["系统配置"], x: [ SchemaConstants::X_SCHEMA_REQUEST => ConfigValueRequest::class, ] )] #[SimpleResponse(schema: [], example: '{"data": "value"}')] public function getValue(Request $request, string $code): \support\Response { try { // 参数验证 if (empty($code)) { return Json::fail('配置项编码不能为空'); } $groupCode = $request->input('group_code'); $key = $request->input('key'); if (empty($groupCode) || empty($key)) { return Json::fail('分组编码和配置键不能为空'); } $result = $this->service->getValue($code, $key, null, ['group_code' => $groupCode]); return Json::success('操作成功', $result); } catch (\Exception $e) { return Json::fail($e->getMessage()); } } #[OA\Put( path: "/system/config/{code}/value", summary: "更新特定配置项的特定键值", tags: ["系统配置"], )] #[Permission(code: 'system:config:update_value')] #[SimpleResponse(schema: [], example: [])] public function setValue(Request $request, string $code): \support\Response { try { // 参数验证 if (empty($code)) { return Json::fail('配置项编码不能为空'); } $groupCode = $request->post('group_code'); $key = $request->post('key'); $value = $request->post('value'); if (empty($groupCode) || empty($key)) { return Json::fail('分组编码和配置键不能为空'); } $result = $this->service->setValue($code, $key, $value, ['group_code' => $groupCode]); if ($result) { return Json::success('更新成功'); } else { return Json::fail('更新失败'); } } catch (\Exception $e) { return Json::fail($e->getMessage()); } } #[OA\Get( path: "/system/config/all-grouped", summary: "获取所有配置并按分组整理", tags: ["系统配置"], )] #[OA\Parameter( name: "enabled_only", description: "是否只获取启用的配置项", in: "query", required: false, schema: new OA\Schema(type: "boolean", default: true), )] #[OA\Parameter( name: "group_filter", description: "分组过滤,多个分组用逗号分隔", in: "query", required: false, schema: new OA\Schema(type: "string"), )] #[OA\Parameter( name: "with_metadata", description: "是否包含配置项的完整元数据", in: "query", required: false, schema: new OA\Schema(type: "boolean", default: false), )] #[OA\Parameter( name: "key_by", description: "按指定字段作为键名('code' 或 'id')", in: "query", required: false, schema: new OA\Schema(type: "string", enum: ["code", "id"]), )] #[OA\Parameter( name: "sort_groups", description: "是否对分组进行排序", in: "query", required: false, schema: new OA\Schema(type: "boolean", default: false), )] #[OA\Parameter( name: "sort_configs", description: "是否对配置项进行排序", in: "query", required: false, schema: new OA\Schema(type: "boolean", default: false), )] #[SimpleResponse(schema: [], example: '{"site": {"site_name": "网站名称"}, "oss": {"accessKeyId": "xxx"}}')] public function getAllGrouped(Request $request): \support\Response { try { $options = [ 'enabled_only' => $request->input('enabled_only', true), 'with_metadata' => $request->input('with_metadata', false), 'key_by' => $request->input('key_by', null), 'sort_groups' => $request->input('sort_groups', false), 'sort_configs' => $request->input('sort_configs', false), ]; // 处理分组过滤参数 $groupFilter = $request->input('group_filter', ''); if (!empty($groupFilter)) { $options['group_filter'] = explode(',', $groupFilter); } $result = $this->service->getAllGrouped($options); return Json::success('操作成功', $result); } catch (\Exception $e) { return Json::fail($e->getMessage()); } } #[OA\Get( path: "/system/config/items", summary: "获取配置项列表", tags: ["系统配置"], )] #[OA\Parameter( name: "page", description: "页码", in: "query", required: false, schema: new OA\Schema(type: "integer", default: 1), )] #[OA\Parameter( name: "pageSize", description: "每页数量", in: "query", required: false, schema: new OA\Schema(type: "integer", default: 20), )] #[OA\Parameter( name: "groupCode", description: "分组代码", in: "query", required: true, schema: new OA\Schema(type: "string"), )] #[OA\Parameter( name: "keyword", description: "搜索关键字", in: "query", required: false, schema: new OA\Schema(type: "string"), )] #[SimpleResponse(schema: [], example: ['items'=>[],'total'=>0])] public function getItems(Request $request): \support\Response { try { $page = $request->input('page', 1); $pageSize = $request->input('pageSize', 20); $groupCode = $request->input('groupCode', ''); $keyword = $request->input('keyword', ''); if (empty($groupCode)) { return Json::fail('分组代码不能为空'); } $result = $this->service->getItems((int)$page, (int)$pageSize, $groupCode, $keyword); return Json::success('操作成功', $result); } catch (\Exception $e) { return Json::fail($e->getMessage()); } } /** * 创建单个配置项 * * @param Request $request * * @return \support\Response * @throws \Exception */ #[OA\Post( path: "/system/config/item", summary: "创建配置项", tags: ["系统配置"], )] #[Permission(code: 'system:config:create')] #[SimpleResponse(schema: [], example: [])] public function createItem(Request $request): \support\Response { try { $data = $request->post(); // 参数验证 if (empty($data['group_code']) || empty($data['code']) || empty($data['name']) || !isset($data['value'])) { return Json::fail('参数不能为空'); } $type = $data['type'] ?? 'string'; // 值类型转换 $value = $this->convertValue($data['value'], $type); $configData = [ 'group_code' => $data['group_code'], 'code' => $data['code'], 'name' => $data['name'], 'content' => $type === 'json' ? $value : (string)$value, 'type' => $type, 'description' => $data['description'] ?? '', 'enabled' => $data['enabled'] ?? 1, 'is_sys' => 0, 'remark' => '', ]; $this->service->createItem($configData); return Json::success('创建成功'); } catch (\Exception $e) { return Json::fail($e->getMessage()); } } /** * 更新单个配置项 * * @param Request $request * @param int $id * * @return \support\Response * @throws \Exception */ #[OA\Put( path: "/system/config/item/{id}", summary: "更新配置项", tags: ["系统配置"], )] #[Permission(code: 'system:config:update')] #[SimpleResponse(schema: [], example: [])] public function updateItem(Request $request, int $id): \support\Response { try { $data = $request->post(); $type = $data['type'] ?? 'string'; // 值类型转换 $value = $this->convertValue($data['value'], $type); $configData = [ 'name' => $data['name'], 'content' => $type === 'json' ? $value : (string)$value, 'type' => $type, 'description' => $data['description'] ?? '', 'enabled' => $data['enabled'] ?? 1, ]; $this->service->updateItem($id, $configData); return Json::success('更新成功'); } catch (\Exception $e) { return Json::fail($e->getMessage()); } } #[OA\Put( path: "/system/config/item/{id}/toggle", summary: "切换配置项状态", tags: ["系统配置"], )] #[Permission(code: 'system:config:update')] #[SimpleResponse(schema: [], example: [])] public function toggleItem(Request $request, int $id): \support\Response { try { $enabled = $request->post('enabled', 0); $this->service->toggleItem($id, (bool)$enabled); return Json::success('操作成功'); } catch (\Exception $e) { return Json::fail($e->getMessage()); } } /** * 值类型转换 * * @param mixed $value 原始值 * @param string $type 目标类型 * * @return mixed */ private function convertValue(mixed $value, string $type): mixed { return match ($type) { 'string' => (string)$value, 'number' => (string)$value, 'boolean' => $value ? '1' : '0', 'json' => is_string($value) ? $value : json_encode($value, JSON_UNESCAPED_UNICODE), default => (string)$value }; } /** * 删除配置项(按code) * * @param Request $request * @param string $code 配置编码 * * @return \support\Response * @throws \Exception */ #[OA\Delete( path: "/system/config/{code}", summary: "删除配置项", tags: ["系统配置"], )] #[OA\Parameter( name: "code", description: "配置编码", in: "path", required: true, schema: new OA\Schema(type: "string"), )] #[OA\Parameter( name: "group_code", description: "分组代码", in: "query", required: false, schema: new OA\Schema(type: "string"), )] #[Permission(code: 'system:config:delete')] #[SimpleResponse(schema: [], example: [])] public function delete(Request $request, string $code): \support\Response { try { if (empty($code)) { return Json::fail('配置编码不能为空'); } $options = []; $groupCode = $request->input('group_code'); if (!empty($groupCode)) { $options['group_code'] = $groupCode; } $result = $this->service->delete($code, $options); if ($result) { return Json::success('删除成功'); } else { return Json::fail('配置不存在'); } } catch (\Exception $e) { return Json::fail($e->getMessage()); } } }