service = $service; } #[OA\Post( path: '/member/sign', summary: '每日签到', tags: ['会员签到'], responses: [ new OA\Response(response: 200, description: '签到成功'), new OA\Response(response: 401, description: '未登录'), new OA\Response(response: 400, description: '今日已签到'), ] )] #[SimpleResponse(schema: [], example: [])] #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] public function sign(): Response { try { /** @var CurrentMember $currentMember */ $currentMember = Container::make(CurrentMember::class); $member = $currentMember->user(true); if (empty($member)) { throw new UnauthorizedHttpException('用户凭证失效请重新登录'); } $memberId = $member['id']; // 记录设备信息 $deviceInfo = [ 'ip' => request()->getRealIp(), 'ua' => request()->header('user-agent'), ]; // 调用服务层执行签到 $result = $this->service->sign($memberId, $deviceInfo); return Json::success('签到成功', [ 'points' => $result['points'], 'continuous_days' => $result['continuous_days'], 'sign_date' => $result['sign_date'], ]); } catch (UnauthorizedHttpException $e) { return Json::fail($e->getMessage(), null, 401); } catch (\Exception $e) { return Json::fail($e->getMessage(), null, 400); } catch (\Throwable $e) { return Json::fail($e->getMessage()); } } #[OA\Get( path: '/member/sign/status', summary: '获取签到状态', tags: ['会员签到'], responses: [ new OA\Response(response: 200, description: '获取成功'), new OA\Response(response: 401, description: '未登录'), ] )] #[SimpleResponse(schema: [], example: [])] #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] public function getStatus(): Response { try { /** @var CurrentMember $currentMember */ $currentMember = Container::make(CurrentMember::class); $member = $currentMember->user(true); if (empty($member)) { throw new UnauthorizedHttpException('用户凭证失效请重新登录'); } $memberId = $member['id']; $result = $this->service->getStatus($memberId); return Json::success('获取成功', $result); } catch (\Throwable $e) { return Json::fail($e->getMessage()); } } #[OA\Get( path: '/member/sign/calendar', summary: '获取签到日历', tags: ['会员签到'], parameters: [ new OA\Parameter(name: 'year', description: '年份', in: 'query', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'month', description: '月份', in: 'query', schema: new OA\Schema(type: 'integer')), ], responses: [ new OA\Response(response: 200, description: '获取成功'), new OA\Response(response: 401, description: '未登录'), ] )] #[SimpleResponse(schema: [], example: [])] #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] public function getCalendar(Request $request): Response { try { /** @var CurrentMember $currentMember */ $currentMember = Container::make(CurrentMember::class); $member = $currentMember->user(true); if (empty($member)) { throw new UnauthorizedHttpException('用户凭证失效请重新登录'); } $memberId = (int)$member['id']; $year = (int)$request->input('year', date('Y')); $month = (int)$request->input('month', date('m')); // 调用服务层获取签到日历 $result = $this->service->getCalendar($memberId, $year, $month); return Json::success('获取成功', $result); } catch (UnauthorizedHttpException $e) { return Json::fail($e->getMessage(), null, 401); } catch (\Throwable $e) { return Json::fail($e->getMessage()); } } #[OA\Get( path: '/member/sign/statistics', summary: '获取签到统计', tags: ['会员签到'], parameters: [ new OA\Parameter(name: 'type', description: '统计类型 (week/month/year)', in: 'query', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'year', description: '年份', in: 'query', schema: new OA\Schema(type: 'integer')), ], responses: [ new OA\Response(response: 200, description: '获取成功'), new OA\Response(response: 401, description: '未登录'), ] )] #[SimpleResponse(schema: [], example: [])] #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] public function getStatistics(Request $request): Response { try { /** @var CurrentMember $currentMember */ $currentMember = Container::make(CurrentMember::class); $member = $currentMember->user(true); if (empty($member)) { throw new UnauthorizedHttpException('用户凭证失效请重新登录'); } $memberId = (int)$member['id']; $type = $request->input('type', 'month'); // 调用服务层获取签到统计 $result = $this->service->getStatistics($memberId, $type); return Json::success('获取成功', $result); } catch (UnauthorizedHttpException $e) { return Json::fail($e->getMessage(), null, 401); } catch (\Throwable $e) { return Json::fail($e->getMessage()); } } }