generated from liutk/owl-admin-base
完善活动详情
parent
4a3ba818ec
commit
7259eb5fc4
|
|
@ -4,6 +4,7 @@ namespace App\Exceptions;
|
||||||
|
|
||||||
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
|
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
|
||||||
use Throwable;
|
use Throwable;
|
||||||
|
use Illuminate\Database\Eloquent\ModelNotFoundException;
|
||||||
|
|
||||||
class Handler extends ExceptionHandler
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -6,10 +6,24 @@ use Carbon\Carbon;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Arr;
|
use Illuminate\Support\Arr;
|
||||||
use App\Models\Activity;
|
use App\Models\Activity;
|
||||||
|
use App\Models\ActivityGame;
|
||||||
use App\Http\Resources\Api\ActivityGameResource;
|
use App\Http\Resources\Api\ActivityGameResource;
|
||||||
|
|
||||||
class ActivityGameController extends ApiController
|
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)
|
public function latestGame(Request $request)
|
||||||
{
|
{
|
||||||
//获取最新的活动;
|
//获取最新的活动;
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,11 @@ class UserController extends ApiController
|
||||||
|
|
||||||
public function bindPhone(CodeRequest $request)
|
public function bindPhone(CodeRequest $request)
|
||||||
{
|
{
|
||||||
|
$user = $request->user();
|
||||||
|
if($user->phone){
|
||||||
|
return $this->error('您已绑定手机号,请勿重复绑定');
|
||||||
|
}
|
||||||
|
|
||||||
$code = $request->input('code');
|
$code = $request->input('code');
|
||||||
$app = EasyWeChat::miniApp();
|
$app = EasyWeChat::miniApp();
|
||||||
|
|
||||||
|
|
@ -34,7 +39,7 @@ class UserController extends ApiController
|
||||||
|
|
||||||
$phone = Arr::get($response['phone_info'], 'phoneNumber');
|
$phone = Arr::get($response['phone_info'], 'phoneNumber');
|
||||||
// $phone = '17784326301';
|
// $phone = '17784326301';
|
||||||
$res = $this->service->bindPhone(auth('api')->user(), $phone);
|
$res = $this->service->bindPhone($user, $phone);
|
||||||
|
|
||||||
if($res){
|
if($res){
|
||||||
return $this->success(null, '绑定成功');
|
return $this->success(null, '绑定成功');
|
||||||
|
|
@ -42,4 +47,9 @@ class UserController extends ApiController
|
||||||
|
|
||||||
return $this->error('绑定失败,请稍后重试');
|
return $this->error('绑定失败,请稍后重试');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function updateUserInfo()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -25,6 +25,7 @@ class ActivityGameResource extends JsonResource
|
||||||
'away_logo' => $this->away_logo ??'',
|
'away_logo' => $this->away_logo ??'',
|
||||||
'game_at' => $this->game_at->format('Y-m-d H:i'),
|
'game_at' => $this->game_at->format('Y-m-d H:i'),
|
||||||
'has_guess' => !$this->logs->isEmpty() ? ($this->logs[0]->score):false,
|
'has_guess' => !$this->logs->isEmpty() ? ($this->logs[0]->score):false,
|
||||||
|
'state' => $this->state,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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' => ''];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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' => ''];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -10,6 +10,11 @@ class Activity extends Model
|
||||||
{
|
{
|
||||||
use HasFactory,Filterable;
|
use HasFactory,Filterable;
|
||||||
|
|
||||||
|
protected $casts = [
|
||||||
|
'start_at' => 'datetime',
|
||||||
|
'end_at' => 'datetime'
|
||||||
|
];
|
||||||
|
|
||||||
public function scopeShow($q){
|
public function scopeShow($q){
|
||||||
$q->where('state', '>' ,0)
|
$q->where('state', '>' ,0)
|
||||||
->where('start_at', '<', now());
|
->where('start_at', '<', now());
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
namespace App\Models;
|
namespace App\Models;
|
||||||
|
|
||||||
|
use DB;
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
|
@ -16,7 +17,12 @@ class UserActivity extends Model
|
||||||
public function scopeSort($q)
|
public function scopeSort($q)
|
||||||
{
|
{
|
||||||
$q->orderBy('mark', 'desc')
|
$q->orderBy('mark', 'desc')
|
||||||
->orderBy('right_time', 'desc')
|
->orderBy('right_times', 'desc')
|
||||||
->orderBy('last_join_at', 'asc');
|
->orderBy('last_join_at', 'asc');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function user()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(User::class, 'user_id');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,8 @@ return new class extends Migration
|
||||||
$table->unsignedBigInteger('user_id');
|
$table->unsignedBigInteger('user_id');
|
||||||
$table->unsignedBigInteger('activity_id');
|
$table->unsignedBigInteger('activity_id');
|
||||||
$table->unsignedInteger('mark')->default(0)->comment('分数');
|
$table->unsignedInteger('mark')->default(0)->comment('分数');
|
||||||
$table->unsignedInteger('join_time')->default(0)->comment('竞猜次数');
|
$table->unsignedInteger('join_times')->default(0)->comment('竞猜次数');
|
||||||
$table->unsignedInteger('right_time')->default(0)->comment('猜对次数');
|
$table->unsignedInteger('right_times')->default(0)->comment('猜对次数');
|
||||||
$table->timestamp('last_join_at')->comment('最后一次竞猜时间');
|
$table->timestamp('last_join_at')->comment('最后一次竞猜时间');
|
||||||
$table->unsignedTinyInteger('has_gift')->default(0)->comment('是否获奖');
|
$table->unsignedTinyInteger('has_gift')->default(0)->comment('是否获奖');
|
||||||
$table->timestamps();
|
$table->timestamps();
|
||||||
|
|
|
||||||
|
|
@ -29,13 +29,23 @@ Route::group(['prefix' => 'miniprogram', 'namespace' => 'Api\Miniprogram'], func
|
||||||
Route::get('categories', [App\Http\Controllers\Api\ArticleController::class, 'category']);
|
Route::get('categories', [App\Http\Controllers\Api\ArticleController::class, 'category']);
|
||||||
Route::get('articles', [App\Http\Controllers\Api\ArticleController::class, 'index']);
|
Route::get('articles', [App\Http\Controllers\Api\ArticleController::class, 'index']);
|
||||||
Route::get('articles/{article}', [App\Http\Controllers\Api\ArticleController::class, 'show']);
|
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::put('users/bind-phone', [App\Http\Controllers\Api\UserController::class, 'bindPhone']);
|
||||||
|
|
||||||
// 已授权绑定手机号
|
// 已授权绑定手机号
|
||||||
Route::middleware([HasBindPhone::class])->group(function(){
|
Route::middleware([HasBindPhone::class])->group(function(){
|
||||||
|
//参与竞猜
|
||||||
|
//更新资料
|
||||||
|
//竞猜记录
|
||||||
|
//中奖记录
|
||||||
|
//领奖
|
||||||
|
//中奖记录详情;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue