openApiService = app('openapi.service'); } /** * 构建表格 * * @return Grid */ protected function grid(): Grid { $grid = Grid::make(OpenApiApp::query(), function (Grid $grid) { $helper = new GridHelper($grid, $this); // 基础列 $helper->columnId(); $grid->column('app_id', '应用ID')->copyable(); $grid->column('name', '应用名称')->limit(30); $grid->column('user_name', '创建用户'); // 状态列 $grid->column('status', '状态')->using(APP_STATUS::getOptions()) ->dot([ APP_STATUS::PENDING->value => 'warning', APP_STATUS::APPROVED->value => 'info', APP_STATUS::REJECTED->value => 'danger', APP_STATUS::ACTIVE->value => 'success', APP_STATUS::SUSPENDED->value => 'warning', APP_STATUS::DISABLED->value => 'secondary', APP_STATUS::EXPIRED->value => 'dark', ], 'secondary'); // 认证类型 $grid->column('auth_type', '认证类型')->using(AUTH_TYPE::getOptions()); // 权限范围 $grid->column('scopes', '权限范围')->display(function ($scopes) { if (empty($scopes)) { return ''; } $labels = []; foreach ($scopes as $scope) { try { $enum = SCOPE_TYPE::from($scope); $labels[] = "getColor()}\">{$enum->getLabel()}"; } catch (\ValueError $e) { $labels[] = "{$scope}"; } } return implode(' ', $labels); }); // 时间列 $grid->column('last_used_at', '最后使用')->sortable(); $helper->columnCreatedAt(); // 筛选器 $grid->filter(function (Grid\Filter $filter) { $filter->equal('status', '状态')->select(APP_STATUS::getOptions()); $filter->equal('auth_type', '认证类型')->select(AUTH_TYPE::getOptions()); $filter->equal('user_id', '用户ID'); $filter->like('name', '应用名称'); $filter->like('app_id', '应用ID'); $filter->between('created_at', '创建时间')->datetime(); }); // TODO: 创建批量操作类 // 批量操作 // $grid->batchActions([ // new \App\Module\OpenAPI\AdminActions\BatchApproveAction(), // new \App\Module\OpenAPI\AdminActions\BatchSuspendAction(), // ]); // 行操作 $grid->actions(function (Grid\Displayers\Actions $actions) { $app = $this->row; // 审核操作 if ($app->status === APP_STATUS::PENDING->value) { $actions->append('审核通过'); $actions->append('审核拒绝'); } // 激活/暂停操作 if ($app->status === APP_STATUS::APPROVED->value || $app->status === APP_STATUS::SUSPENDED->value) { $actions->append('激活'); } if ($app->status === APP_STATUS::ACTIVE->value) { $actions->append('暂停'); } // 重新生成密钥 $actions->append('重新生成密钥'); }); // 工具栏 $grid->tools(function (Grid\Tools $tools) { $tools->append('刷新统计'); }); }); return $grid; } /** * 构建详情页 * * @return Show */ protected function detail($id): Show { return Show::make($id, OpenApiApp::query(), function (Show $show) { $show->field('id', 'ID'); $show->field('app_id', '应用ID'); $show->field('name', '应用名称'); $show->field('description', '应用描述'); $show->field('website', '应用网站')->link(); $show->field('logo', '应用Logo')->image(); $show->field('callback_url', '回调地址'); $show->field('contact_email', '联系邮箱'); $show->field('status', '状态')->using(APP_STATUS::getOptions()); $show->field('auth_type', '认证类型')->using(AUTH_TYPE::getOptions()); $show->field('scopes', '权限范围')->as(function ($scopes) { if (empty($scopes)) { return '无'; } $labels = []; foreach ($scopes as $scope) { try { $enum = SCOPE_TYPE::from($scope); $labels[] = $enum->getLabel(); } catch (\ValueError $e) { $labels[] = $scope; } } return implode(', ', $labels); }); $show->field('rate_limits', '限流配置')->as(function ($value) { return $value ? json_encode($value, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) : '无'; }); $show->field('ip_whitelist', 'IP白名单')->as(function ($value) { return $value ? json_encode($value, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) : '无'; }); $show->field('user_id', '创建用户ID'); $show->field('user_name', '创建用户'); $show->field('approved_at', '审核时间'); $show->field('approved_by', '审核人ID'); $show->field('approved_note', '审核备注'); $show->field('expires_at', '过期时间'); $show->field('last_used_at', '最后使用时间'); $show->field('created_at', '创建时间'); $show->field('updated_at', '更新时间'); // 显示掩码后的密钥 $show->field('masked_secret', '应用密钥')->as(function () { return $this->masked_secret; }); }); } /** * 构建表单 * * @return Form */ protected function form(): Form { return Form::make(OpenApiApp::query(), function (Form $form) { $form->display('id', 'ID'); $form->display('app_id', '应用ID'); $form->text('name', '应用名称')->required(); $form->textarea('description', '应用描述')->required(); $form->url('website', '应用网站'); $form->image('logo', '应用Logo'); $form->url('callback_url', '回调地址')->required(); $form->email('contact_email', '联系邮箱'); $form->select('status', '状态')->options(APP_STATUS::getOptions())->required(); $form->select('auth_type', '认证类型')->options(AUTH_TYPE::getOptions())->required(); $form->checkbox('scopes', '权限范围')->options($this->getScopeOptions()); $form->textarea('rate_limits', '限流配置')->help('JSON格式的限流配置'); $form->tags('ip_whitelist', 'IP白名单'); $form->number('user_id', '创建用户ID')->required(); $form->text('user_name', '创建用户')->required(); $form->datetime('approved_at', '审核时间'); $form->number('approved_by', '审核人ID'); $form->textarea('approved_note', '审核备注'); $form->datetime('expires_at', '过期时间'); $form->display('created_at', '创建时间'); $form->display('updated_at', '更新时间'); }); } /** * 获取权限范围选项 * * @return array */ protected function getScopeOptions(): array { $options = []; $categories = SCOPE_TYPE::getByCategory(); foreach ($categories as $category => $scopes) { foreach ($scopes as $scope) { $options[$scope->value] = $category . ' - ' . $scope->getLabel(); } } return $options; } /** * 审核通过 * * @param Request $request * @return \Illuminate\Http\JsonResponse */ public function approve(Request $request) { try { $appId = $request->input('app_id'); $note = $request->input('note', ''); $approvedBy = auth('admin')->id(); $app = $this->openApiService->approveApp($appId, true, $note, $approvedBy); return response()->json([ 'status' => 'success', 'message' => '应用审核通过', 'data' => $app, ]); } catch (\Exception $e) { return response()->json([ 'status' => 'error', 'message' => $e->getMessage(), ], 500); } } /** * 审核拒绝 * * @param Request $request * @return \Illuminate\Http\JsonResponse */ public function reject(Request $request) { try { $appId = $request->input('app_id'); $note = $request->input('note', ''); $approvedBy = auth('admin')->id(); $app = $this->openApiService->approveApp($appId, false, $note, $approvedBy); return response()->json([ 'status' => 'success', 'message' => '应用审核拒绝', 'data' => $app, ]); } catch (\Exception $e) { return response()->json([ 'status' => 'error', 'message' => $e->getMessage(), ], 500); } } /** * 激活应用 * * @param Request $request * @return \Illuminate\Http\JsonResponse */ public function activate(Request $request) { try { $appId = $request->input('app_id'); $app = $this->openApiService->activateApp($appId); return response()->json([ 'status' => 'success', 'message' => '应用已激活', 'data' => $app, ]); } catch (\Exception $e) { return response()->json([ 'status' => 'error', 'message' => $e->getMessage(), ], 500); } } /** * 暂停应用 * * @param Request $request * @return \Illuminate\Http\JsonResponse */ public function suspend(Request $request) { try { $appId = $request->input('app_id'); $reason = $request->input('reason', ''); $app = $this->openApiService->suspendApp($appId, $reason); return response()->json([ 'status' => 'success', 'message' => '应用已暂停', 'data' => $app, ]); } catch (\Exception $e) { return response()->json([ 'status' => 'error', 'message' => $e->getMessage(), ], 500); } } /** * 重新生成密钥 * * @param Request $request * @return \Illuminate\Http\JsonResponse */ public function regenerateSecret(Request $request) { try { $appId = $request->input('app_id'); $app = $this->openApiService->regenerateSecret($appId); return response()->json([ 'status' => 'success', 'message' => '密钥已重新生成', 'data' => [ 'app_id' => $app->app_id, 'masked_secret' => $app->masked_secret, ], ]); } catch (\Exception $e) { return response()->json([ 'status' => 'error', 'message' => $e->getMessage(), ], 500); } } }