column('id', 'ID')->sortable();
// 计划信息
$grid->column('plan.plan_name', '所属计划')->sortable();
// Model/表信息
$grid->column('model_class', 'Model类')->display(function ($value) {
if (!empty($value)) {
$className = class_basename($value);
return "{$className}";
}
return '未设置';
})->sortable();
$grid->column('table_name', '表名')->display(function ($value) {
if (!empty($this->model_class)) {
try {
$model = new $this->model_class();
$actualTable = $model->getTable();
return "{$actualTable}";
} catch (\Exception $e) {
return "{$value} (Model错误)";
}
} else {
return "{$value} (旧数据)";
}
})->sortable();
// 清理类型
$grid->column('cleanup_type', '清理类型')->using([
1 => '清空表',
2 => '删除所有',
3 => '按时间删除',
4 => '按用户删除',
5 => '按条件删除',
])->label([
1 => 'danger',
2 => 'warning',
3 => 'info',
4 => 'primary',
5 => 'secondary',
])->sortable();
// 配置信息
$grid->column('priority', '优先级')->sortable();
$grid->column('batch_size', '批处理大小')->display(function ($value) {
return number_format($value);
})->sortable();
// 状态
$grid->column('is_enabled', '启用状态')->using([1 => '启用', 0 => '禁用'])->label([
1 => 'success',
0 => 'danger',
])->sortable();
$grid->column('backup_enabled', '备份启用')->using([1 => '启用', 0 => '禁用'])->label([
1 => 'success',
0 => 'danger',
])->sortable();
// 条件描述
$grid->column('conditions_description', '清理条件')->display(function () {
return $this->conditions_description;
});
// 时间
$grid->column('created_at', '创建时间')->sortable();
$grid->column('updated_at', '更新时间')->sortable();
// 筛选器
$grid->filter(function (Grid\Filter $filter) {
// 按计划筛选
$plans = CleanupPlan::pluck('plan_name', 'id')->toArray();
$filter->equal('plan_id', '所属计划')->select($plans);
// Model类筛选
$filter->like('model_class', 'Model类');
// 表名筛选
$filter->like('table_name', '表名');
// 按清理类型筛选
$filter->equal('cleanup_type', '清理类型')->select([
1 => '清空表',
2 => '删除所有',
3 => '按时间删除',
4 => '按用户删除',
5 => '按条件删除',
]);
// 按状态筛选
$filter->equal('is_enabled', '启用状态')->select([
1 => '启用',
0 => '禁用',
]);
$filter->equal('backup_enabled', '备份启用')->select([
1 => '启用',
0 => '禁用',
]);
// 按表名搜索
$filter->like('table_name', '表名');
// 按优先级范围
$filter->between('priority', '优先级');
});
// 批量操作
$grid->batchActions([
new \App\Module\Cleanup\AdminControllers\Actions\BatchEnableAction(),
new \App\Module\Cleanup\AdminControllers\Actions\BatchDisableAction(),
new \App\Module\Cleanup\AdminControllers\Actions\BatchMigrateToModelAction(),
]);
// 行操作
$grid->actions(function (Grid\Displayers\Actions $actions) {
$actions->append(new \App\Module\Cleanup\AdminControllers\Actions\EditPlanContentAction());
$actions->append(new \App\Module\Cleanup\AdminControllers\Actions\DeletePlanContentAction());
$actions->append(new \App\Module\Cleanup\AdminControllers\Actions\TestCleanupAction());
$actions->append(new \App\Module\Cleanup\AdminControllers\Actions\MigrateToModelAction());
});
// 设置每页显示数量
$grid->paginate(20);
});
}
/**
* 详情页面
*/
protected function detail($id): Show
{
return Show::make($id, new CleanupPlanContentRepository(), function (Show $show) {
$show->field('id', 'ID');
// 关联信息
$show->field('plan.plan_name', '所属计划');
// Model/表信息
$show->field('model_class', 'Model类')->as(function ($value) {
if (!empty($value)) {
return $value;
} else {
return '未设置(旧数据)';
}
});
$show->field('table_name', '表名')->as(function ($value) {
if (!empty($this->model_class)) {
try {
$model = new $this->model_class();
return $model->getTable() . ' (从Model获取)';
} catch (\Exception $e) {
return $value . ' (Model错误: ' . $e->getMessage() . ')';
}
} else {
return $value . ' (旧数据)';
}
});
// 清理配置
$show->field('cleanup_type', '清理类型')->using([
1 => '清空表',
2 => '删除所有',
3 => '按时间删除',
4 => '按用户删除',
5 => '按条件删除',
]);
$show->field('conditions', '清理条件')->json();
$show->field('conditions_description', '条件描述');
// 执行配置
$show->field('priority', '优先级');
$show->field('batch_size', '批处理大小');
// 状态配置
$show->field('is_enabled', '启用状态')->using([1 => '启用', 0 => '禁用']);
$show->field('backup_enabled', '备份启用')->using([1 => '启用', 0 => '禁用']);
// 备注和时间
$show->field('notes', '备注说明');
$show->field('created_at', '创建时间');
$show->field('updated_at', '更新时间');
});
}
/**
* 创建/编辑表单
*/
protected function form(): Form
{
return Form::make(new CleanupPlanContentRepository(), function (Form $form) {
$form->display('id', 'ID');
// 基础信息
$form->select('plan_id', '所属计划')
->options(CleanupPlan::pluck('plan_name', 'id')->toArray())
->required();
// Model类选择(推荐使用)
$availableModels = $this->getAvailableModels();
$form->select('model_class', 'Model类')
->options($availableModels)
->help('选择要清理的Model类(推荐使用)');
// 表名选择(兼容旧数据)
$availableTables = CleanupConfig::whereNull('model_class')
->orWhere('model_class', '')
->pluck('table_name', 'table_name')
->toArray();
if (!empty($availableTables)) {
$form->select('table_name', '表名(兼容旧数据)')
->options($availableTables)
->help('仅用于兼容旧数据,建议使用Model类选择');
}
// 清理类型
$form->select('cleanup_type', '清理类型')
->options([
1 => '清空表',
2 => '删除所有',
3 => '按时间删除',
4 => '按用户删除',
5 => '按条件删除',
])
->required()
->help('选择清理方式');
// 清理条件(JSON配置)
$form->keyValue('conditions', '清理条件')
->help('JSON格式的清理条件配置,根据清理类型设置相应参数');
// 执行配置
$form->number('priority', '优先级')
->default(100)
->min(1)
->max(999)
->help('数字越小优先级越高');
$form->number('batch_size', '批处理大小')
->default(1000)
->min(100)
->max(10000)
->help('每批处理的记录数量');
// 状态配置
$form->switch('is_enabled', '启用状态')->default(1);
$form->switch('backup_enabled', '备份启用')->default(1);
// 备注
$form->textarea('notes', '备注说明')
->help('对此清理配置的说明');
// 表单验证
$form->saving(function (Form $form) {
$modelClass = $form->input('model_class');
$tableName = $form->input('table_name');
// 验证至少选择了Model类或表名
if (empty($modelClass) && empty($tableName)) {
return $form->response()->error('请至少选择Model类或表名');
}
// 如果选择了Model类,验证Model是否存在
if (!empty($modelClass)) {
if (!class_exists($modelClass)) {
return $form->response()->error('选择的Model类不存在:' . $modelClass);
}
// 自动设置表名
try {
$modelInstance = new $modelClass();
$form->input('table_name', $modelInstance->getTable());
} catch (\Exception $e) {
return $form->response()->error('Model类实例化失败:' . $e->getMessage());
}
}
});
// 时间字段
$form->display('created_at', '创建时间');
$form->display('updated_at', '更新时间');
// 添加JavaScript增强用户体验
$form->html('
', '用户体验增强');
});
}
/**
* 获取可用的Model类列表
*/
private function getAvailableModels(): array
{
// 从CleanupConfig中获取已配置的Model类
$configuredModels = CleanupConfig::whereNotNull('model_class')
->where('model_class', '!=', '')
->pluck('model_class', 'model_class')
->toArray();
// 格式化显示名称
$formattedModels = [];
foreach ($configuredModels as $modelClass) {
$className = class_basename($modelClass);
$moduleName = $this->extractModuleName($modelClass);
$formattedModels[$modelClass] = "{$moduleName} - {$className}";
}
// 按模块和类名排序
asort($formattedModels);
return $formattedModels;
}
/**
* 从Model类名中提取模块名
*/
private function extractModuleName(string $modelClass): string
{
if (preg_match('/App\\\\Module\\\\([^\\\\]+)\\\\Models\\\\/', $modelClass, $matches)) {
return $matches[1];
}
return 'Unknown';
}
}