Files
MrleeAdmin/backend/app/adminapi/controller/system/ConfigController.php
T
2026-08-31 11:33:59 +08:00

579 lines
18 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
declare(strict_types=1);
/**
*+------------------
* madong
*+------------------
* Copyright (c) https://gitee.com/motion-code All rights reserved.
*+------------------
* Author: Mr. April (405784684@qq.com)
*+------------------
* Official Website: http://www.madong.tech
*/
namespace app\adminapi\controller\system;
use app\adminapi\controller\Crud;
use app\adminapi\middleware\AccessTokenMiddleware;
use app\adminapi\middleware\OperationMiddleware;
use app\adminapi\middleware\PermissionMiddleware;
use app\adminapi\schema\request\system\ConfigGroupQueryRequest;
use app\adminapi\schema\request\system\ConfigQueryRequest;
use app\adminapi\schema\request\system\ConfigValueRequest;
use app\service\admin\system\ConfigService;
use core\tool\Json;
use madong\swagger\annotation\response\SimpleResponse;
use madong\swagger\attribute\AllowAnonymous;
use madong\swagger\attribute\Permission;
use OpenApi\Attributes as OA;
use support\annotation\Middleware;
use support\Request;
use WebmanTech\Swagger\DTO\SchemaConstants;
#[Middleware(AccessTokenMiddleware::class, PermissionMiddleware::class, OperationMiddleware::class)]
final class ConfigController extends Crud
{
public function __construct(ConfigService $service)
{
$this->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());
}
}
}