column('id', 'ID')->sortable(); // 关联服务 $grid->column('service.name', '所属服务')->sortable(); $grid->column('service.code', '服务代码'); $grid->column('name', '凭证名称')->sortable(); // 认证类型 $grid->column('type', '认证类型')->display(function ($type) { $authType = AUTH_TYPE::tryFrom($type); if ($authType) { $label = $authType->getLabel(); $level = $authType->getSecurityLevel(); $color = $authType->getSecurityLevelColor(); return "{$label}"; } return $type; }); // 环境 $grid->column('environment', '环境')->display(function ($env) { $colors = [ 'production' => 'danger', 'staging' => 'warning', 'development' => 'info', 'testing' => 'secondary', ]; $color = $colors[$env] ?? 'secondary'; $labels = [ 'production' => '生产', 'staging' => '预发布', 'development' => '开发', 'testing' => '测试', ]; $label = $labels[$env] ?? $env; return "{$label}"; }); // 状态 $grid->column('is_active', '状态')->display(function ($active) { return $active ? ' 激活' : ' 未激活'; }); // 过期时间 $grid->column('expires_at', '过期时间')->display(function ($time) { if (!$time) { return '永不过期'; } $expireTime = \Carbon\Carbon::parse($time); if ($expireTime->isPast()) { return '已过期'; } elseif ($expireTime->diffInDays() <= 7) { return '即将过期'; } else { return $expireTime->format('Y-m-d H:i:s'); } }); // 使用统计 $grid->column('usage_count', '使用次数')->sortable(); $grid->column('last_used_at', '最后使用')->display(function ($time) { return $time ? \Carbon\Carbon::parse($time)->diffForHumans() : '未使用'; }); // 创建时间 $grid->column('created_at', '创建时间')->sortable(); // 过滤器 $grid->filter(function (Grid\Filter $filter) { $filter->equal('service_id', '所属服务')->select( ThirdPartyService::pluck('name', 'id')->toArray() ); $filter->equal('type', '认证类型')->select(AUTH_TYPE::getOptions()); $filter->equal('environment', '环境')->select([ 'production' => '生产', 'staging' => '预发布', 'development' => '开发', 'testing' => '测试', ]); $filter->equal('is_active', '状态')->select([ 1 => '激活', 0 => '未激活', ]); $filter->like('name', '凭证名称'); }); // 批量操作 $grid->batchActions(function (Grid\Tools\BatchActions $batch) { // TODO: 创建批量操作类 // $batch->add('批量激活', new \App\Module\ThirdParty\AdminActions\BatchActivateCredentialAction()); // $batch->add('批量停用', new \App\Module\ThirdParty\AdminActions\BatchDeactivateCredentialAction()); }); // 工具栏 $grid->tools(function (Grid\Tools $tools) { $tools->append(' 过期凭证'); $tools->append(' 测试凭证'); }); // 行操作 $grid->actions(function (Grid\Displayers\Actions $actions) { if ($actions->row->is_active) { $actions->append(' 测试'); } $actions->append(' 使用统计'); }); // 默认排序 $grid->model()->orderBy('service_id')->orderBy('environment')->orderBy('name'); }); } /** * 详情页面 * * @return Show */ protected function detail($id): Show { return Show::make($id, new ThirdPartyCredentialRepository(['service']), function (Show $show) { $show->field('id', 'ID'); $show->field('service.name', '所属服务'); $show->field('service.code', '服务代码'); $show->field('name', '凭证名称'); $show->field('type', '认证类型')->as(function ($type) { $authType = AUTH_TYPE::tryFrom($type); return $authType ? $authType->getLabel() : $type; }); $show->field('environment', '环境')->as(function ($env) { $labels = [ 'production' => '生产环境', 'staging' => '预发布环境', 'development' => '开发环境', 'testing' => '测试环境', ]; return $labels[$env] ?? $env; }); $show->field('is_active', '状态')->as(function ($active) { return $active ? '激活' : '未激活'; }); $show->field('expires_at', '过期时间')->as(function ($time) { if (!$time) { return '永不过期'; } $expireTime = \Carbon\Carbon::parse($time); $status = $expireTime->isPast() ? ' (已过期)' : ($expireTime->diffInDays() <= 7 ? ' (即将过期)' : ''); return $expireTime->format('Y-m-d H:i:s') . $status; }); $show->field('usage_count', '使用次数'); $show->field('last_used_at', '最后使用时间'); $show->field('created_at', '创建时间'); $show->field('updated_at', '更新时间'); // 凭证信息(脱敏显示) $show->field('credentials', '凭证信息')->json(); }); } /** * 表单页面 * * @return Form */ protected function form(): Form { return Form::make(new ThirdPartyCredentialRepository(), function (Form $form) { $form->display('id', 'ID'); $form->select('service_id', '所属服务') ->options(ThirdPartyService::pluck('name', 'id')->toArray()) ->required() ->help('选择要配置凭证的第三方服务'); $form->text('name', '凭证名称')->required()->help('凭证的显示名称'); $form->select('type', '认证类型') ->options(AUTH_TYPE::getOptions()) ->required() ->help('选择认证方式'); $form->select('environment', '环境') ->options([ 'production' => '生产环境', 'staging' => '预发布环境', 'development' => '开发环境', 'testing' => '测试环境', ]) ->default('production') ->required(); $form->switch('is_active', '是否激活')->default(1); $form->datetime('expires_at', '过期时间')->help('留空表示永不过期'); // 凭证信息(根据认证类型动态显示) $form->keyValue('credentials', '凭证信息') ->required() ->help('根据认证类型填写相应的凭证信息,如API Key、Secret等'); $form->display('usage_count', '使用次数'); $form->display('last_used_at', '最后使用时间'); $form->display('created_at', '创建时间'); $form->display('updated_at', '更新时间'); }); } }