diff --git a/app/Endpoint/Api/Http/Controllers/ClickController.php b/app/Endpoint/Api/Http/Controllers/ClickController.php new file mode 100644 index 00000000..874ee860 --- /dev/null +++ b/app/Endpoint/Api/Http/Controllers/ClickController.php @@ -0,0 +1,87 @@ +validate([ + 'start_at' => ['bail', 'required', 'date_format:Y-m-d'], + 'end_at' => ['bail', 'required', 'date_format:Y-m-d'], + ]); + + return ClickLogSimpleResource::collection($request->user()->clickLogs()->whereBetween('created_at', [$input['start_at'], $input['end_at']])->get()); + } + + /** + * 签到动作 + * + * @return void + */ + public function click(Request $request, PointsService $pointsService) + { + if (Click::isClick($request->user())) { + throw new BizException('今天已签到,请明天再来'); + } + + $points = 0; + try { + DB::beginTransaction(); + $user = $request->user(); + + $click = $user->click()->firstOrCreate([], [ + 'continue_click_times' => 1, + 'last_click_at' => now(), + ]); + + if (!$click->wasRecentlyCreated) { + $click->update([ + 'continue_click_times' => $click->last_click_at->isYesterday() ? DB::raw('continue_click_times + 1') : 1, //如果是更新则判断昨天是否签到 + 'last_click_at' => now(), + ]); + } + $click->refresh(); + + ClickLog::create([ + 'user_id'=>$user->id, + ]); + + //发放当天签到积分 + $points = 5; + $pointsService->sendPoints(1, $user, $points, '签到奖励'); + + //发放额外的奖励积分 + // $continueClickDays = 7;//默认7天 + // $continueClickPoints = 10;//默认10分 + // if (($click->continue_click_times % $continueClickDays) == 0) { + // $pointsService->sendPoints(1, $user, $continueClickPoints, '连续签到奖励'); + // } + + DB::commit(); + } catch (Throwable $th) { + DB::rollBack(); + report($th); + throw new BizException('系统繁忙,请稍后再试'); + } + + return response()->json( + ['points'=>$points] + ); + } +} diff --git a/app/Endpoint/Api/Http/Resources/ClickLogSimpleResource.php b/app/Endpoint/Api/Http/Resources/ClickLogSimpleResource.php new file mode 100644 index 00000000..7ecbc985 --- /dev/null +++ b/app/Endpoint/Api/Http/Resources/ClickLogSimpleResource.php @@ -0,0 +1,19 @@ +created_at->format('Y-m-d'); + } +} diff --git a/app/Endpoint/Api/routes.php b/app/Endpoint/Api/routes.php index ef8e057d..652df087 100644 --- a/app/Endpoint/Api/routes.php +++ b/app/Endpoint/Api/routes.php @@ -10,6 +10,7 @@ use App\Endpoint\Api\Http\Controllers\Auth\LogoutController; use App\Endpoint\Api\Http\Controllers\Auth\RegisterController; use App\Endpoint\Api\Http\Controllers\Auth\ResetPasswordController; use App\Endpoint\Api\Http\Controllers\CaptchaController; +use App\Endpoint\Api\Http\Controllers\ClickController; use App\Endpoint\Api\Http\Controllers\CouponController; use App\Endpoint\Api\Http\Controllers\MessageController; use App\Endpoint\Api\Http\Controllers\Order\OrderController; @@ -100,6 +101,10 @@ Route::group([ Route::post('articles/{article}/read', [ArticleController::class, 'read']); Route::post('articles/{article}/like', [ArticleController::class, 'like']); + //签到 + Route::get('click', [ClickController::class, 'index']); + Route::post('click', [ClickController::class, 'click']); + // 订单 Route::apiResource('order/orders', OrderController::class); }); diff --git a/app/Models/Click.php b/app/Models/Click.php index 4f255ce0..0a11f53d 100644 --- a/app/Models/Click.php +++ b/app/Models/Click.php @@ -8,4 +8,23 @@ use Illuminate\Database\Eloquent\Model; class Click extends Model { use HasFactory; + + protected $casts = [ + 'last_click_at' => 'datetime', + ]; + + protected $fillable = [ + 'user_id', 'continue_click_times', 'last_click_at', + ]; + + /** + * 判断今天是否签到 + * + * @param User $user + * @return boolean + */ + public static function isClick(User $user) + { + return ClickLog::where('user_id', $user->id)->whereDate('created_at', now())->exists(); + } } diff --git a/app/Models/ClickLog.php b/app/Models/ClickLog.php index 50075347..cd9a66d4 100644 --- a/app/Models/ClickLog.php +++ b/app/Models/ClickLog.php @@ -8,4 +8,8 @@ use Illuminate\Database\Eloquent\Model; class ClickLog extends Model { use HasFactory; + + protected $fillable = [ + 'user_id', + ]; } diff --git a/app/Models/User.php b/app/Models/User.php index 9b3b7f1b..272a3ac9 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -138,6 +138,26 @@ class User extends Model implements AuthorizableContract, AuthenticatableContrac return $this->hasMany(UserCoupon::class); } + /** + * 签到情况 + * + * @return void + */ + public function click() + { + return $this->hasOne(Click::class, 'user_id'); + } + + /** + * 用户签到记录 + * + * @return void + */ + public function clickLogs() + { + return $this->hasMany(ClickLog::class); + } + /** * 禁用用户 *