添加签到接口给
parent
e92d849d57
commit
f834f8f53b
|
|
@ -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]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -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');
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,4 +8,8 @@ use Illuminate\Database\Eloquent\Model;
|
|||
class ClickLog extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $fillable = [
|
||||
'user_id',
|
||||
];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 禁用用户
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in New Issue