From 7259eb5fc4e01791b5d68efdc1ea63fa965552cd Mon Sep 17 00:00:00 2001 From: liutk <961510893@qq.com> Date: Sun, 19 May 2024 16:42:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=B4=BB=E5=8A=A8=E8=AF=A6?= =?UTF-8?q?=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Exceptions/Handler.php | 9 ++++ .../Controllers/Api/ActivityController.php | 49 +++++++++++++++++++ .../Api/ActivityGameController.php | 14 ++++++ app/Http/Controllers/Api/UserController.php | 12 ++++- .../Resources/Api/ActivityGameResource.php | 1 + app/Http/Resources/Api/ActivityResource.php | 33 +++++++++++++ .../Resources/Api/UserActivityResource.php | 32 ++++++++++++ app/Models/Activity.php | 5 ++ app/Models/UserActivity.php | 8 ++- ...16_153926_create_user_activities_table.php | 4 +- routes/api.php | 12 ++++- 11 files changed, 174 insertions(+), 5 deletions(-) create mode 100644 app/Http/Controllers/Api/ActivityController.php create mode 100644 app/Http/Resources/Api/ActivityResource.php create mode 100644 app/Http/Resources/Api/UserActivityResource.php diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 56af264..5a7b849 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -4,6 +4,7 @@ namespace App\Exceptions; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; use Throwable; +use Illuminate\Database\Eloquent\ModelNotFoundException; class Handler extends ExceptionHandler { @@ -27,4 +28,12 @@ class Handler extends ExceptionHandler // }); } + public function render($request, Throwable $e){ + // // FirstOrFail 和 FindOrFail 异常处理 + if ($e instanceof ModelNotFoundException) { + if ($request->ajax() || $request->wantsJson()) { + return response()->json(['data'=>null,'code'=>404 , 'message' => '数据未找到,或已被删除' ], 404); + } + } + } } diff --git a/app/Http/Controllers/Api/ActivityController.php b/app/Http/Controllers/Api/ActivityController.php new file mode 100644 index 0000000..753c41a --- /dev/null +++ b/app/Http/Controllers/Api/ActivityController.php @@ -0,0 +1,49 @@ +sort() + ->simplePaginate($request->query('per_page', 20)); + + return $this->success(['activities' => ActivityResource::collection($activities)->resolve()]); + } + + public function show(Activity $activity) + { + return ActivityResource::make($activity); + } + + public function rankList(Request $request) + { + $activityId = $request->input('activity_id', 0); + + //获取排行表 + $list = UserActivity::with('user')->where('activity_id', $activityId)->sort()->limit(30)->get(); + + //获取当前排名; + $userMark = UserActivity::where([ + 'user_id' => $request->user()->id, + 'activity_id' => $activityId, + ])->value('mark'); + + $rankNumber = null; + if($userMark){ + $rankNumber = UserActivity::where('activity_id', $activityId)->where('mark', '>', $userMark)->sort()->count(); + $rankNumber++; + } + + return $this->success(['rank_list' => UserActivityResource::collection($list)->resolve(), 'rank_number'=>$rankNumber]); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Api/ActivityGameController.php b/app/Http/Controllers/Api/ActivityGameController.php index b3416aa..ca076d7 100644 --- a/app/Http/Controllers/Api/ActivityGameController.php +++ b/app/Http/Controllers/Api/ActivityGameController.php @@ -6,10 +6,24 @@ use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Arr; use App\Models\Activity; +use App\Models\ActivityGame; use App\Http\Resources\Api\ActivityGameResource; class ActivityGameController extends ApiController { + public function index(Request $request) + { + $activityId = $request->input('activity_id', 0); + + $games = ActivityGame::with(['logs'=> function($q){ + $q->where('user_id', auth('api')->user()?->id ?? 0); + }]) + ->where('activity_id', $activityId)->show()->sort() + ->simplePaginate($request->query('per_page', 20)); + + return $this->success(['games'=>ActivityGameResource::collection($games)->resolve()]); + } + public function latestGame(Request $request) { //获取最新的活动; diff --git a/app/Http/Controllers/Api/UserController.php b/app/Http/Controllers/Api/UserController.php index 5548eb9..9660718 100644 --- a/app/Http/Controllers/Api/UserController.php +++ b/app/Http/Controllers/Api/UserController.php @@ -17,6 +17,11 @@ class UserController extends ApiController public function bindPhone(CodeRequest $request) { + $user = $request->user(); + if($user->phone){ + return $this->error('您已绑定手机号,请勿重复绑定'); + } + $code = $request->input('code'); $app = EasyWeChat::miniApp(); @@ -34,7 +39,7 @@ class UserController extends ApiController $phone = Arr::get($response['phone_info'], 'phoneNumber'); // $phone = '17784326301'; - $res = $this->service->bindPhone(auth('api')->user(), $phone); + $res = $this->service->bindPhone($user, $phone); if($res){ return $this->success(null, '绑定成功'); @@ -42,4 +47,9 @@ class UserController extends ApiController return $this->error('绑定失败,请稍后重试'); } + + public function updateUserInfo() + { + + } } \ No newline at end of file diff --git a/app/Http/Resources/Api/ActivityGameResource.php b/app/Http/Resources/Api/ActivityGameResource.php index 9582fd9..96b482b 100644 --- a/app/Http/Resources/Api/ActivityGameResource.php +++ b/app/Http/Resources/Api/ActivityGameResource.php @@ -25,6 +25,7 @@ class ActivityGameResource extends JsonResource 'away_logo' => $this->away_logo ??'', 'game_at' => $this->game_at->format('Y-m-d H:i'), 'has_guess' => !$this->logs->isEmpty() ? ($this->logs[0]->score):false, + 'state' => $this->state, ]; } diff --git a/app/Http/Resources/Api/ActivityResource.php b/app/Http/Resources/Api/ActivityResource.php new file mode 100644 index 0000000..ef85918 --- /dev/null +++ b/app/Http/Resources/Api/ActivityResource.php @@ -0,0 +1,33 @@ + $this->id, + 'name' => $this->name, + 'cover' => $this->cover ??'', + 'rules' => $this->rules ??'', + 'start_at' => $this->start_at->format('Y-m-d H:i'), + 'end_at' => $this->end_at->format('Y-m-d H:i'), + 'state' => $this->state, + ]; + } + + public function with($request) + { + return ['code' => Response::HTTP_OK, 'message' => '']; + } +} \ No newline at end of file diff --git a/app/Http/Resources/Api/UserActivityResource.php b/app/Http/Resources/Api/UserActivityResource.php new file mode 100644 index 0000000..0374ad7 --- /dev/null +++ b/app/Http/Resources/Api/UserActivityResource.php @@ -0,0 +1,32 @@ + $this->user?->nick_name ?? '', + 'avatar' => $this->user?->avatar ?? '', + + 'join_times' => $this->join_times, + 'right_times' => $this->right_times, + 'mark' => $this->mark, + ]; + } + + public function with($request) + { + return ['code' => Response::HTTP_OK, 'message' => '']; + } +} \ No newline at end of file diff --git a/app/Models/Activity.php b/app/Models/Activity.php index ab62676..edd99f5 100644 --- a/app/Models/Activity.php +++ b/app/Models/Activity.php @@ -10,6 +10,11 @@ class Activity extends Model { use HasFactory,Filterable; + protected $casts = [ + 'start_at' => 'datetime', + 'end_at' => 'datetime' + ]; + public function scopeShow($q){ $q->where('state', '>' ,0) ->where('start_at', '<', now()); diff --git a/app/Models/UserActivity.php b/app/Models/UserActivity.php index 85434f7..3794534 100644 --- a/app/Models/UserActivity.php +++ b/app/Models/UserActivity.php @@ -2,6 +2,7 @@ namespace App\Models; +use DB; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -16,7 +17,12 @@ class UserActivity extends Model public function scopeSort($q) { $q->orderBy('mark', 'desc') - ->orderBy('right_time', 'desc') + ->orderBy('right_times', 'desc') ->orderBy('last_join_at', 'asc'); } + + public function user() + { + return $this->belongsTo(User::class, 'user_id'); + } } diff --git a/database/migrations/2024_05_16_153926_create_user_activities_table.php b/database/migrations/2024_05_16_153926_create_user_activities_table.php index 367fdad..4fefcbb 100644 --- a/database/migrations/2024_05_16_153926_create_user_activities_table.php +++ b/database/migrations/2024_05_16_153926_create_user_activities_table.php @@ -16,8 +16,8 @@ return new class extends Migration $table->unsignedBigInteger('user_id'); $table->unsignedBigInteger('activity_id'); $table->unsignedInteger('mark')->default(0)->comment('分数'); - $table->unsignedInteger('join_time')->default(0)->comment('竞猜次数'); - $table->unsignedInteger('right_time')->default(0)->comment('猜对次数'); + $table->unsignedInteger('join_times')->default(0)->comment('竞猜次数'); + $table->unsignedInteger('right_times')->default(0)->comment('猜对次数'); $table->timestamp('last_join_at')->comment('最后一次竞猜时间'); $table->unsignedTinyInteger('has_gift')->default(0)->comment('是否获奖'); $table->timestamps(); diff --git a/routes/api.php b/routes/api.php index 6e34dd2..7ccaad5 100644 --- a/routes/api.php +++ b/routes/api.php @@ -29,13 +29,23 @@ Route::group(['prefix' => 'miniprogram', 'namespace' => 'Api\Miniprogram'], func Route::get('categories', [App\Http\Controllers\Api\ArticleController::class, 'category']); Route::get('articles', [App\Http\Controllers\Api\ArticleController::class, 'index']); Route::get('articles/{article}', [App\Http\Controllers\Api\ArticleController::class, 'show']); + // 活动接口 + Route::get('activities', [App\Http\Controllers\Api\ActivityController::class, 'index']); + Route::get('activities/rank-list', [App\Http\Controllers\Api\ActivityController::class, 'rankList']); + Route::get('activities/{activity}', [App\Http\Controllers\Api\ActivityController::class, 'show']); + Route::get('games', [App\Http\Controllers\Api\ActivityGameController::class, 'index']); // 绑定接口 Route::put('users/bind-phone', [App\Http\Controllers\Api\UserController::class, 'bindPhone']); // 已授权绑定手机号 Route::middleware([HasBindPhone::class])->group(function(){ - + //参与竞猜 + //更新资料 + //竞猜记录 + //中奖记录 + //领奖 + //中奖记录详情; }); }); });