6
0
Fork 0

添加签到接口给

release
vine_liutk 2021-12-14 16:03:37 +08:00
parent e92d849d57
commit f834f8f53b
6 changed files with 154 additions and 0 deletions

View File

@ -0,0 +1,87 @@
<?php
namespace App\Endpoint\Api\Http\Controllers;
use App\Endpoint\Api\Http\Resources\ClickLogSimpleResource;
use App\Exceptions\BizException;
use App\Models\Click;
use App\Models\ClickLog;
use App\Services\PointsService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Throwable;
class ClickController extends Controller
{
/**
* 获取指定时间范围的签到情况
*
* @param Request $request
* @return void
*/
public function index(Request $request)
{
$input = $request->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]
);
}
}

View File

@ -0,0 +1,19 @@
<?php
namespace App\Endpoint\Api\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class ClickLogSimpleResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
public function toArray($request)
{
return $this->created_at->format('Y-m-d');
}
}

View File

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

View File

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

View File

@ -8,4 +8,8 @@ use Illuminate\Database\Eloquent\Model;
class ClickLog extends Model
{
use HasFactory;
protected $fillable = [
'user_id',
];
}

View File

@ -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);
}
/**
* 禁用用户
*