| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392 |
- <?php
- namespace App\Module\OpenAPI\AdminControllers;
- use App\Module\OpenAPI\Models\OpenApiApp;
- use App\Module\OpenAPI\Enums\APP_STATUS;
- use App\Module\OpenAPI\Enums\AUTH_TYPE;
- use App\Module\OpenAPI\Enums\SCOPE_TYPE;
- use App\Module\OpenAPI\Services\OpenApiService;
- use App\Module\Admin\AdminControllers\Helper\GridHelper;
- use Dcat\Admin\Form;
- use Dcat\Admin\Grid;
- use Dcat\Admin\Show;
- use Illuminate\Http\Request;
- use Spatie\RouteAttributes\Attributes\Resource;
- use UCore\DcatAdmin\AdminController;
- /**
- * OpenAPI应用管理控制器
- */
- #[Resource('openapi-apps', names: 'openapi.apps')]
- class AppController extends AdminController
- {
- protected $title = 'OpenAPI应用管理';
- /**
- * @var OpenApiService
- */
- protected OpenApiService $openApiService;
- public function __construct()
- {
- $this->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 '<span class="text-muted">无</span>';
- }
- $labels = [];
- foreach ($scopes as $scope) {
- try {
- $enum = SCOPE_TYPE::from($scope);
- $labels[] = "<span class=\"badge badge-{$enum->getColor()}\">{$enum->getLabel()}</span>";
- } catch (\ValueError $e) {
- $labels[] = "<span class=\"badge badge-secondary\">{$scope}</span>";
- }
- }
- 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('<a href="javascript:void(0)" onclick="approveApp(' . $app->id . ')" class="btn btn-sm btn-success">审核通过</a>');
- $actions->append('<a href="javascript:void(0)" onclick="rejectApp(' . $app->id . ')" class="btn btn-sm btn-danger">审核拒绝</a>');
- }
- // 激活/暂停操作
- if ($app->status === APP_STATUS::APPROVED->value || $app->status === APP_STATUS::SUSPENDED->value) {
- $actions->append('<a href="javascript:void(0)" onclick="activateApp(' . $app->id . ')" class="btn btn-sm btn-primary">激活</a>');
- }
- if ($app->status === APP_STATUS::ACTIVE->value) {
- $actions->append('<a href="javascript:void(0)" onclick="suspendApp(' . $app->id . ')" class="btn btn-sm btn-warning">暂停</a>');
- }
- // 重新生成密钥
- $actions->append('<a href="javascript:void(0)" onclick="regenerateSecret(' . $app->id . ')" class="btn btn-sm btn-info">重新生成密钥</a>');
- });
- // 工具栏
- $grid->tools(function (Grid\Tools $tools) {
- $tools->append('<a href="javascript:void(0)" onclick="refreshStats()" class="btn btn-sm btn-primary">刷新统计</a>');
- });
- });
- 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);
- }
- }
- }
|