添加签到接口给
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\RegisterController;
|
||||||
use App\Endpoint\Api\Http\Controllers\Auth\ResetPasswordController;
|
use App\Endpoint\Api\Http\Controllers\Auth\ResetPasswordController;
|
||||||
use App\Endpoint\Api\Http\Controllers\CaptchaController;
|
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\CouponController;
|
||||||
use App\Endpoint\Api\Http\Controllers\MessageController;
|
use App\Endpoint\Api\Http\Controllers\MessageController;
|
||||||
use App\Endpoint\Api\Http\Controllers\Order\OrderController;
|
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}/read', [ArticleController::class, 'read']);
|
||||||
Route::post('articles/{article}/like', [ArticleController::class, 'like']);
|
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);
|
Route::apiResource('order/orders', OrderController::class);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -8,4 +8,23 @@ use Illuminate\Database\Eloquent\Model;
|
||||||
class Click extends Model
|
class Click extends Model
|
||||||
{
|
{
|
||||||
use HasFactory;
|
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
|
class ClickLog extends Model
|
||||||
{
|
{
|
||||||
use HasFactory;
|
use HasFactory;
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
'user_id',
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -138,6 +138,26 @@ class User extends Model implements AuthorizableContract, AuthenticatableContrac
|
||||||
return $this->hasMany(UserCoupon::class);
|
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