You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

364 lines
10 KiB
PHP

<?php
namespace App\Http\Controllers\API\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Lib\Rs;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Validation\Rule;
class SysConfigController extends Controller
{
/**
* 获取配置列表
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function list(Request $request)
{
// 获取查询参数
$configName = $request->input('config_name', '');
$configKey = $request->input('config_key', '');
$configType = $request->input('config_type', '');
$status = $request->input('status', null);
$page = $request->input('page', 1);
$pageSize = $request->input('page_size', 10);
// 构建查询
$query = DB::table('sys_config')
->where('deleted', 0);
// 添加查询条件
if (!empty($configName)) {
$query->where('config_name', 'like', '%' . $configName . '%');
}
if (!empty($configKey)) {
$query->where('config_key', 'like', '%' . $configKey . '%');
}
if (!empty($configType)) {
$query->where('config_type', $configType);
}
if ($status !== null) {
$query->where('status', $status);
}
// 计算总数
$total = $query->count();
// 分页查询
$configs = $query->orderBy('id', 'asc')
->skip(($page - 1) * $pageSize)
->take($pageSize)
->get();
foreach ($configs as $config) {
if($config->config_type == 'IMAGE') {
// 处理图片类型配置
$config->config_value = config('app.url') .'/'. $config->config_value;
}
}
// 构造返回数据
$data = [
'list' => $configs,
'total' => $total,
'page' => $page,
'page_size' => $pageSize,
'total_pages' => ceil($total / $pageSize)
];
return Rs::success($data);
}
/**
* 保存配置信息
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function Save(Request $request)
{
$data = $request->validate([
'id' => 'required|integer',
'config_name' => 'required|string|max:100',
'config_key' => [
'required',
'string',
'max:100',
Rule::unique('sys_config', 'config_key')->ignore($request->id, 'id'),
],
'config_value' => 'required|string',
'config_type' => 'required|string|in:STRING,INTEGER,BOOLEAN,JSON,IMAGE',
'remark' => 'nullable|string|max:255',
'status' => 'required|integer|in:0,1',
]);
$conditions = ['id' => $data['id']];
$values = [
'config_name' => $data['config_name'],
'config_key' => $data['config_key'],
'config_value' => $data['config_value'],
'config_type' => $data['config_type'],
'remark' => $data['remark'] ?? '',
'status' => $data['status'],
];
// 如果是新增记录
if ($data['id'] == 0) {
$values['create_time'] = now();
$values['update_time'] = now();
} else {
$values['update_time'] = now();
}
$updated = DB::table('sys_config')->updateOrInsert($conditions, $values);
if ($updated) {
return Rs::success();
}
return Rs::error('操作失败');
}
/**
* 删除配置
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function Delete(Request $request)
{
$data = $request->validate([
'id' => 'required|integer',
]);
$deleted = DB::table('sys_config')->where('id', $data['id'])->update(['deleted' => 1, 'update_time' => now()]);
if ($deleted) {
return Rs::success();
}
return Rs::error('删除失败');
}
/**
* 获取配置详情
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function getInfo(Request $request)
{
$data = $request->validate([
'id' => 'required|integer',
]);
$config = DB::table('sys_config')
->where('id', $data['id'])
->where('deleted', 0)
->first();
if ($config) {
return Rs::success($config);
}
return Rs::error('配置不存在');
}
/**
* 根据配置键获取配置值
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function getByKey(Request $request)
{
$data = $request->validate([
'config_key' => 'required|string',
]);
$config = DB::table('sys_config')
->where('config_key', $data['config_key'])
->where('status', 1)
->where('deleted', 0)
->first();
if ($config) {
return Rs::success([
'config_key' => $config->config_key,
'config_value' => $config->config_value,
'config_type' => $config->config_type
]);
}
return Rs::error('配置不存在或已禁用');
}
/**
* 批量更新配置
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function batchUpdate(Request $request)
{
$data = $request->validate([
'configs' => 'required|array',
'configs.*.id' => 'required|integer',
'configs.*.config_value' => 'required|string',
]);
try {
DB::beginTransaction();
foreach ($data['configs'] as $config) {
DB::table('sys_config')
->where('id', $config['id'])
->where('deleted', 0)
->update([
'config_value' => $config['config_value'],
'update_time' => now()
]);
}
DB::commit();
return Rs::success();
} catch (\Exception $e) {
DB::rollBack();
return Rs::error('批量更新失败:' . $e->getMessage());
}
}
/**
* 获取配置(仅支持指定配置项)
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function getConfig(Request $request)
{
$data = $request->validate([
'config_keys' => 'required|array',
'config_keys.*' => 'string',
]);
$configKeys = $data['config_keys'];
if (empty($configKeys)) {
return Rs::error('config_keys 参数不能为空');
}
// 从数据库获取指定且有效的配置项
$configs = DB::table('sys_config')
->whereIn('config_key', $configKeys)
->where('status', 1)
->where('deleted', 0)
->get(['config_key', 'config_value', 'config_type']) // 明确选择字段
->keyBy('config_key') // 转为以 config_key 为 key 的集合
->toArray();
$result = [];
foreach ($configKeys as $key) {
if (isset($configs[$key])) {
$config = $configs[$key];
$value = $config->config_value;
// 如果是图片类型,拼接完整 URL
if ($config->config_type === 'IMAGE') {
$value = rtrim(config('app.url'), '/') . '/' . ltrim($value, '/');
}
$result[$key] = $value;
} else {
// 使用默认值
$result[$key] = $this->getDefaultConfigValue($key);
}
}
return Rs::success($result);
}
/**
* 获取配置的默认值
* @param string $configKey
* @return string
*/
private function getDefaultConfigValue($configKey)
{
$defaults = [
'system_title' => '后台管理系统',
'system_logo' => rtrim(config('app.url'), '/') . '/logo.png',
'system_version' => 'v1.0.0',
'page_size' => '10',
];
return $defaults[$configKey] ?? '';
}
/**
* 清除系统缓存
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function clearCache(Request $request)
{
try {
$user = $request->attributes->get('payload');
$admin=DB::table('sys_user_role')->where(['user_id'=>$user['user_id'],'role_id'=>1])->first();
if(!$admin){
return Rs::error('无权限');
}
// 清除应用缓存
Artisan::call('cache:clear');
// 清除配置缓存
Artisan::call('config:clear');
// 清除路由缓存
Artisan::call('route:clear');
// 清除视图缓存
Artisan::call('view:clear');
// 清除优化类加载器缓存
Artisan::call('clear-compiled');
// 清除OPcache缓存
if (function_exists('opcache_reset')) {
opcache_reset();
}
return Rs::success(['message' => '缓存清除成功']);
} catch (\Exception $e) {
return Rs::error('清除缓存失败:' . $e->getMessage());
}
}
/**
* 重建系统缓存
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function rebuildCache(Request $request)
{
try {
$user = $request->attributes->get('payload');
$admin=DB::table('sys_user_role')->where(['user_id'=>$user['user_id'],'role_id'=>1])->first();
if(!$admin){
return Rs::error('无权限');
}
// 清除旧缓存
Artisan::call('cache:clear');
Artisan::call('config:clear');
Artisan::call('route:clear');
Artisan::call('view:clear');
// 重新生成缓存
Artisan::call('config:cache');
Artisan::call('route:cache');
Artisan::call('view:cache');
return Rs::success(['message' => '缓存重建成功']);
} catch (\Exception $e) {
return Rs::error('重建缓存失败:' . $e->getMessage());
}
}
}