column('id', 'ID')->sortable(); $grid->column('name', '服务名称')->sortable(); $grid->column('code', '服务代码')->sortable(); // 服务类型 $grid->column('type', '服务类型')->display(function ($type) { $serviceType = SERVICE_TYPE::tryFrom($type); if ($serviceType) { $label = $serviceType->getLabel(); $color = $serviceType->getColor(); return "{$label}"; } return $type; }); // 服务提供商 $grid->column('provider', '服务提供商')->sortable(); // 认证类型 $grid->column('auth_type', '认证类型')->display(function ($authType) { $auth = AUTH_TYPE::tryFrom($authType); if ($auth) { $label = $auth->getLabel(); $level = $auth->getSecurityLevel(); $color = $auth->getSecurityLevelColor(); return "{$label}"; } return $authType; }); // 服务状态 $grid->column('status', '状态')->display(function ($status) { $serviceStatus = SERVICE_STATUS::tryFrom($status); if ($serviceStatus) { $label = $serviceStatus->getLabel(); $color = $serviceStatus->getColor(); $icon = $serviceStatus->getIcon(); return " {$label}"; } return $status; }); // 优先级 $grid->column('priority', '优先级')->sortable(); // 健康状态 $grid->column('health_status', '健康状态')->display(function ($healthStatus) { $colors = [ 'HEALTHY' => 'success', 'WARNING' => 'warning', 'ERROR' => 'danger', 'UNKNOWN' => 'secondary', ]; $color = $colors[$healthStatus] ?? 'secondary'; return "{$healthStatus}"; }); // 最后健康检查时间 $grid->column('last_health_check', '最后检查')->display(function ($time) { return $time ? $time : '未检查'; }); // 创建时间 $grid->column('created_at', '创建时间')->sortable(); // 过滤器 $grid->filter(function (Grid\Filter $filter) { $filter->equal('type', '服务类型')->select(SERVICE_TYPE::getOptions()); $filter->equal('status', '状态')->select(SERVICE_STATUS::getOptions()); $filter->equal('auth_type', '认证类型')->select(AUTH_TYPE::getOptions()); $filter->like('name', '服务名称'); $filter->like('code', '服务代码'); $filter->like('provider', '服务提供商'); }); // 批量操作 $grid->batchActions(function (Grid\Tools\BatchActions $batch) { $batch->add('批量激活', new \App\Module\ThirdParty\AdminActions\BatchActivateServiceAction()); $batch->add('批量停用', new \App\Module\ThirdParty\AdminActions\BatchDeactivateServiceAction()); }); // 工具栏 $grid->tools(function (Grid\Tools $tools) { $tools->append(' 健康检查'); $tools->append(' 统计报告'); }); // 行操作 $grid->actions(function (Grid\Displayers\Actions $actions) { $actions->append(' 凭证'); $actions->append(' 日志'); if ($actions->row->status === SERVICE_STATUS::ACTIVE->value) { $actions->append(' 测试'); } }); // 默认排序 $grid->model()->orderBy('priority')->orderBy('name'); }); } /** * 详情页面 * * @return Show */ protected function detail($id): Show { return Show::make($id, new ThirdPartyServiceRepository(), function (Show $show) { $show->field('id', 'ID'); $show->field('name', '服务名称'); $show->field('code', '服务代码'); $show->field('type', '服务类型')->as(function ($type) { $serviceType = SERVICE_TYPE::tryFrom($type); return $serviceType ? $serviceType->getLabel() : $type; }); $show->field('provider', '服务提供商'); $show->field('description', '服务描述'); $show->field('base_url', '基础URL'); $show->field('version', 'API版本'); $show->field('auth_type', '认证类型')->as(function ($authType) { $auth = AUTH_TYPE::tryFrom($authType); return $auth ? $auth->getLabel() : $authType; }); $show->field('status', '状态')->as(function ($status) { $serviceStatus = SERVICE_STATUS::tryFrom($status); return $serviceStatus ? $serviceStatus->getLabel() : $status; }); $show->field('priority', '优先级'); $show->field('timeout', '超时时间')->as(function ($timeout) { return $timeout . ' 秒'; }); $show->field('retry_times', '重试次数'); $show->field('retry_delay', '重试延迟')->as(function ($delay) { return $delay . ' 毫秒'; }); $show->field('config', '服务配置')->json(); $show->field('headers', '默认请求头')->json(); $show->field('params', '默认参数')->json(); $show->field('webhook_url', 'Webhook URL'); $show->field('health_check_url', '健康检查URL'); $show->field('health_check_interval', '健康检查间隔')->as(function ($interval) { return $interval . ' 秒'; }); $show->field('health_status', '健康状态'); $show->field('last_health_check', '最后健康检查时间'); $show->field('created_at', '创建时间'); $show->field('updated_at', '更新时间'); // 关联信息 $show->relation('credentials', '认证凭证', function ($model) { $grid = new Grid(new \App\Module\ThirdParty\Models\ThirdPartyCredential()); $grid->model()->where('service_id', $model->id); $grid->column('name', '凭证名称'); $grid->column('type', '认证类型'); $grid->column('environment', '环境'); $grid->column('is_active', '状态')->display(function ($active) { return $active ? '激活' : '未激活'; }); $grid->column('expires_at', '过期时间'); $grid->disableCreateButton(); $grid->disableActions(); return $grid; }); }); } /** * 表单页面 * * @return Form */ protected function form(): Form { return Form::make(new ThirdPartyServiceRepository(), function (Form $form) { $form->display('id', 'ID'); $form->text('name', '服务名称')->required()->help('第三方服务的显示名称'); $form->text('code', '服务代码')->help('唯一标识符,留空自动生成'); $form->select('type', '服务类型')->options(SERVICE_TYPE::getOptions())->required(); $form->text('provider', '服务提供商')->required(); $form->textarea('description', '服务描述'); $form->url('base_url', '基础URL')->help('第三方服务的API基础地址'); $form->text('version', 'API版本')->default('v1'); $form->select('auth_type', '认证类型')->options(AUTH_TYPE::getOptions())->required(); $form->select('status', '状态')->options(SERVICE_STATUS::getOptions())->default(SERVICE_STATUS::INACTIVE->value); $form->number('priority', '优先级')->default(0)->help('数字越小优先级越高'); $form->number('timeout', '超时时间(秒)')->default(30)->min(1)->max(300); $form->number('retry_times', '重试次数')->default(3)->min(0)->max(10); $form->number('retry_delay', '重试延迟(毫秒)')->default(1000)->min(100)->max(60000); $form->json('config', '服务配置')->help('JSON格式的服务特定配置'); $form->json('headers', '默认请求头')->help('JSON格式的默认HTTP请求头'); $form->json('params', '默认参数')->help('JSON格式的默认请求参数'); $form->url('webhook_url', 'Webhook URL')->help('接收第三方服务回调的地址'); $form->text('webhook_secret', 'Webhook密钥')->help('用于验证Webhook请求的密钥'); $form->url('health_check_url', '健康检查URL')->help('用于检查服务健康状态的URL'); $form->number('health_check_interval', '健康检查间隔(秒)')->default(300)->min(60)->max(86400); $form->display('created_at', '创建时间'); $form->display('updated_at', '更新时间'); // 保存前处理 $form->saving(function (Form $form) { // 如果没有提供代码,自动生成 if (empty($form->code)) { $form->code = ThirdPartyService::generateCode($form->name, $form->provider); } }); }); } }