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);
}
}
}