feat: 添加站点配置/配置项分页/配置项详情/配置项新增/配置项更新/配置项删除接口/站点配置项

接口/站点配置项更新接口/配置项类型接口/配置项分组接口
This commit is contained in:
2025-03-06 18:03:44 +08:00
parent f80c09c7e6
commit 48f01ee8a6
12 changed files with 648 additions and 1 deletions

View File

@@ -0,0 +1,163 @@
<?php
declare (strict_types = 1);
namespace app\admin\controller\v1;
use app\admin\model\v1\SysConfigGroupModel;
use app\admin\model\v1\SysConfigModel;
/**
* 站酷配置控制器
*/
class SiteConfig
{
// 获取配置项
public function index()
{
// 按语言获取分组
$groups = SysConfigGroupModel::field([
'id',
'name'
])
->language(request()->lang_id)
->enabled()
->order(['sort' => 'asc', 'id' => 'desc'])
->select()
->toArray();
if (empty($groups)) {
return error('配置分组不存在');
}
// 根据分组获取配置项
$configs = SysConfigModel::field([
'id',
'group_id',
'title',
'name',
'value',
'extra',
'type',
'remark'
])
->groupId(array_column($groups, 'id'))
->order(['sort' => 'asc', 'id' => 'desc'])
->select()
->each(function($item) {
// 修改字段为null的输出为空字符串
$keys = array_keys($item->toArray());
foreach ($keys as $key) {
if (is_null($item[$key])) {
$item[$key] = '';
}
}
return $item;
})
->toArray();
if (empty($configs)) {
return error('配置项不存在');
}
// 处理附加配置项及联动项
$config_name_map = [];
foreach ($configs as $config) {
unset($config['group_id']);
$config_name_map[$config['name']] = $config;
}
$configs = $this->handleExtra($configs, $config_name_map);
// 组合数据
$config_group_map = [];
foreach ($configs as $config) {
$group_id = $config['group_id'];
unset($config['group_id']);
$config_group_map[$group_id][] = $config;
}
// 组合分组和配置项
foreach ($groups as &$group) {
$group['configs'] = $config_group_map[$group['id']] ?? [];
}
unset($group);
return success('获取成功', $groups);
}
// 处理配置联动项数据
private function handleExtra($data, $map)
{
$ret = [];
$need_delete_names = [];
foreach ($data as $val) {
if (!empty($val['extra'])) {
$extra = explode(PHP_EOL, $val['extra']);
foreach ($extra as $v) {
if (preg_match('/^([^:]+):(.+)\[(.+)\]$/i', $v, $match)) {
$item = [
'name' => $match[2],
'value' => $match[1]
];
if (isset($match[3])) {
$children = [];
$names = explode(',', $match[3]);
foreach ($names as $name) {
$name = trim(trim($name), "'");
$need_delete_names[] = $name;
if (!empty($map[$name])) {
$children[] = $map[$name];
}
}
// 处理子级
if (!empty($children)) {
$item['children'] = $this->handleExtra($children, $map);
}
}
unset($val['extra']);
if (!isset($val['extras'])) {
$val['extras'] = [];
}
$val['extras'][] = $item;
}
}
}
$ret[] = $val;
}
// 删除多余的配置项
foreach ($ret as $k => $it) {
if (in_array($it['name'], $need_delete_names)) {
unset($ret[$k]);
}
}
return $ret;
}
// 更新配置
public function update()
{
$put = request()->put();
if (empty($put)) {
return error('参数错误');
}
$validate = validate([
'id' => 'require|integer',
'value' => 'max:255'
])
->message([
'id.require' => '配置项ID不能为空',
'id.integer' => '配置项ID必须是整数',
'value.max' => '配置值不能超过255个字符'
]);
foreach ($put as $val) {
if (!$validate->check($val)) {
return error($validate->getError());
}
}
$configs = (new SysConfigModel)->saveAll($put);
if ($configs->isEmpty()) {
return error('操作失败');
}
return success('操作成功');
}
}

View File

@@ -0,0 +1,173 @@
<?php
declare (strict_types = 1);
namespace app\admin\controller\v1;
use app\admin\model\v1\SysConfigGroupModel;
use app\admin\model\v1\SysConfigModel;
use app\admin\model\v1\SysConfigTypeModel;
use app\admin\validate\v1\SysConfigValidate;
/**
* 配置项控制器
*/
class SysConfig
{
// 获取分组列表
public function groups()
{
$groups = SysConfigGroupModel::field([
'id',
'name'
])
->language(request()->lang_id)
->enabled()
->order(['sort' => 'asc', 'id' => 'desc'])
->select();
return success('获取成功', $groups);
}
// 获取配置类型
public function types()
{
$types = SysConfigTypeModel::field([
'name',
'value'
])
->order(['sort' => 'asc'])
->select();
return success('获取成功', $types);
}
// 配置项分页
public function index()
{
$param = request()->param([
'title',
'page/d' => 1,
'size/d' => 10
]);
$configs = SysConfigModel::field([
'id',
'group_id',
'title',
'name',
'type',
'sort'
])
->with([
'group' => function($query) {
$query->field(['id', 'name' => 'group_name']);
},
'type' => function($query) {
$query->field(['name' => 'type_name', 'value']);
}
])
->withSearch(['title'], ['title' => $param['title']??null])
->order(['sort' => 'asc', 'id' => 'desc'])
->paginate([
'list_rows' => $param['size'],
'page' => $param['page']
])
->bindAttr('group', ['group_name'])
->bindAttr('type', ['type_name'])
->hidden(['group_id', 'group', 'type']);
return success('获取成功', $configs);
}
// 配置项详情
public function read()
{
$id = request()->param('id');
$config = SysConfigModel::withoutField([
'created_at',
'updated_at',
'deleted_at'
])
->bypy($id)
->find();
if (empty($config)) {
return error('配置项不存在');
}
return success('获取成功', $config);
}
// 配置项新增
public function save()
{
$post = request()->post([
'group_id',
'title',
'name',
'value',
'extra',
'type' => 'text',
'sort',
'remark'
]);
$validate = new SysConfigValidate;
if (!$validate->scene('add')->check($post)) {
return error($validate->getError());
}
$config = SysConfigModel::create($post);
if ($config->isEmpty()) {
return error('操作失败');
}
return success('操作成功');
}
// 配置项更新
public function update()
{
$id = request()->param('id');
$put = request()->put([
'group_id',
'title',
'name',
'value',
'extra',
'type' => 'text',
'sort',
'remark'
]);
$validate = new SysConfigValidate;
if (!$validate->check(array_merge($put, ['id' => $id]))) {
return error($validate->getError());
}
$config = SysConfigModel::bypk($id)->find();
if (empty($config)) {
return error('请确认要操作对象是否存在');
}
if (!$config->save($put)) {
return error('操作失败');
}
return success('操作成功');
}
// 配置项删除
public function delete()
{
$id = request()->param('id');
$config = SysConfigModel::bypk($id)->find();
if (empty($config)) {
return error('请确认要操作对象是否存在');
}
if (!$config->delete()) {
return error('操作失败');
}
return success('操作成功');
}
}