完善活动详情

main
liutk 2024-05-19 16:42:38 +08:00
parent 4a3ba818ec
commit 7259eb5fc4
11 changed files with 174 additions and 5 deletions

View File

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

View File

@ -0,0 +1,49 @@
<?php
namespace App\Http\Controllers\Api;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use App\Models\Activity;
use App\Models\UserActivity;
use App\Http\Resources\Api\ActivityResource;
use App\Http\Resources\Api\UserActivityResource;
class ActivityController extends ApiController
{
public function index(Request $request)
{
$activities = Activity::show()->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]);
}
}

View File

@ -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)
{
//获取最新的活动;

View File

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

View File

@ -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,
];
}

View File

@ -0,0 +1,33 @@
<?php
namespace App\Http\Resources\Api;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Http\Response;
class ActivityResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $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' => ''];
}
}

View File

@ -0,0 +1,32 @@
<?php
namespace App\Http\Resources\Api;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Http\Response;
class UserActivityResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'nick_name' => $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' => ''];
}
}

View File

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

View File

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

View File

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

View File

@ -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(){
//参与竞猜
//更新资料
//竞猜记录
//中奖记录
//领奖
//中奖记录详情;
});
});
});