'exact', 'action' => 'exact', 'target_type' => 'exact', 'created_at_from' => 'date_from', 'created_at_to' => 'date_to', ]; } protected function getDefaultSort(): string { return 'created_at'; } /** * 操作日志表无 store_id/platform_id,跳过 DataScope 过滤 */ protected function applyDataScope(\Hyperf\Database\Model\Builder $query): void { // 操作日志仅限 admin 访问,无需按店铺/平台过滤 } /** * 操作日志列表 */ #[OA\Get( path: '/logs/operations', summary: '操作日志列表', description: '获取操作日志列表,支持分页、按用户/操作类型/目标类型/时间筛选。仅 admin 可访问。', security: [['bearerAuth' => []]], tags: ['Operation Logs'], parameters: [ new OA\Parameter(name: 'page', in: 'query', required: false, schema: new OA\Schema(type: 'integer', default: 1)), new OA\Parameter(name: 'per_page', in: 'query', required: false, schema: new OA\Schema(type: 'integer', default: 15, maximum: 100)), new OA\Parameter(name: 'user_id', in: 'query', required: false, description: '用户 ID 精确筛选', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'action', in: 'query', required: false, description: '操作类型精确筛选', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'target_type', in: 'query', required: false, description: '目标类型精确筛选', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'created_at_from', in: 'query', required: false, description: '创建时间起始(含)', schema: new OA\Schema(type: 'string', format: 'date', example: '2026-01-01')), new OA\Parameter(name: 'created_at_to', in: 'query', required: false, description: '创建时间截止(含)', schema: new OA\Schema(type: 'string', format: 'date', example: '2026-12-31')), ], responses: [ new OA\Response( response: 200, description: '获取成功', content: new OA\JsonContent(properties: [ new OA\Property(property: 'code', type: 'integer', example: 0), new OA\Property(property: 'message', type: 'string', example: '获取成功'), new OA\Property(property: 'data', properties: [ new OA\Property(property: 'items', type: 'array', items: new OA\Items(ref: '#/components/schemas/OperationLogList')), new OA\Property(property: 'total', type: 'integer', example: 100), new OA\Property(property: 'page', type: 'integer', example: 1), new OA\Property(property: 'per_page', type: 'integer', example: 15), ], type: 'object'), ]) ), new OA\Response(response: 401, description: '未认证', content: new OA\JsonContent(ref: '#/components/schemas/ErrorResponse')), new OA\Response(response: 403, description: '无权限', content: new OA\JsonContent(ref: '#/components/schemas/ErrorResponse')), ] )] #[RequestMapping(path: "", methods: "GET")] public function index(): ResponseInterface|array { return parent::index(); } /** * 操作日志详情 */ #[OA\Get( path: '/logs/operations/{id}', summary: '操作日志详情', description: '获取操作日志详情,含完整操作详情 JSON。仅 admin 可访问。', security: [['bearerAuth' => []]], tags: ['Operation Logs'], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: '操作日志 ID', schema: new OA\Schema(type: 'integer')), ], responses: [ new OA\Response( response: 200, description: '获取成功', content: new OA\JsonContent(properties: [ new OA\Property(property: 'code', type: 'integer', example: 0), new OA\Property(property: 'message', type: 'string', example: '获取成功'), new OA\Property(property: 'data', ref: '#/components/schemas/OperationLogDetail'), ]) ), new OA\Response(response: 401, description: '未认证', content: new OA\JsonContent(ref: '#/components/schemas/ErrorResponse')), new OA\Response(response: 403, description: '无权限', content: new OA\JsonContent(ref: '#/components/schemas/ErrorResponse')), new OA\Response(response: 404, description: '数据不存在', content: new OA\JsonContent(ref: '#/components/schemas/ErrorResponse')), ] )] #[RequestMapping(path: "{id}", methods: "GET")] public function show(int $id): ResponseInterface|array { return parent::show($id); } }