diff --git a/app/Challenge.php b/app/Challenge.php index bcc0262..44040ab 100644 --- a/app/Challenge.php +++ b/app/Challenge.php @@ -27,4 +27,8 @@ public function logs() { return $this->hasMany('App\Log', 'challenge_id', 'challenge_id'); } + + public function level(){ + return $this->belongsTo('App\Level', 'level_id', 'level_id'); + } } diff --git a/app/Http/Controllers/BulletinController.php b/app/Http/Controllers/BulletinController.php index 5dc2daf..703ee49 100644 --- a/app/Http/Controllers/BulletinController.php +++ b/app/Http/Controllers/BulletinController.php @@ -73,15 +73,14 @@ public function delete(Request $request) return APIReturn::error('invalid_parameters', $validator->errors()->all(), 400); } - try{ + try { $bulletin = Bulletin::find($request->input('bulletinId')); - if (!$bulletin){ + if (!$bulletin) { return APIReturn::error("bulletin_not_found", "该公告不存在", 404); } $bulletin->delete(); return APIReturn::success(); - } - catch (\Exception $e){ + } catch (\Exception $e) { return APIReturn::error("database_error", "数据库读写错误", 500); } } @@ -92,28 +91,28 @@ public function delete(Request $request) * @return \Illuminate\Http\JsonResponse * @author Eridanus Sora */ - public function edit(Request $request){ + public function edit(Request $request) + { $validator = \Validator::make($request->only(['bulletinId', 'title', 'content']), [ - 'bulletinId' => 'required', - 'title' => 'required', - 'content' => 'required' + 'bulletinId' => 'required', + 'title' => 'required', + 'content' => 'required' ]); if ($validator->fails()) { return APIReturn::error('invalid_parameters', $validator->errors()->all(), 400); } - try{ + try { $bulletin = Bulletin::find($request->input('bulletinId')); - if (!$bulletin){ + if (!$bulletin) { return APIReturn::error("bulletin_not_found", "该公告不存在", 404); } $bulletin->title = $request->input('title'); $bulletin->content = $request->input('content'); $bulletin->save(); return APIReturn::success($bulletin); - } - catch (\Exception $e){ + } catch (\Exception $e) { return APIReturn::error("database_error", "数据库读写错误", 500); } } diff --git a/app/Http/Controllers/ChallengeController.php b/app/Http/Controllers/ChallengeController.php index 4bd9106..96aa32a 100644 --- a/app/Http/Controllers/ChallengeController.php +++ b/app/Http/Controllers/ChallengeController.php @@ -197,6 +197,58 @@ public function resetScore(Request $request) } } + /** + * 查询已经完成题目的队伍 + * @param Request $request + * @return \Illuminate\Http\JsonResponse + * @author Eridanus Sora + */ + public function getSolvedTeams(Request $request){ + $validator = Validator::make($request->only(['challengeId']), [ + 'challengeId' => 'required' + ], [ + 'challengeId.required' => __('缺少 题目ID 字段') + ]); + + + if ($validator->fails()) { + return APIReturn::error('invalid_parameters', $validator->errors()->all(), 400); + } + + try{ + $team = JWTAuth::parseToken()->toUser(); + $team->load(['logs' => function ($query) { + $query->where('status', 'correct'); + }]); + $challenge = Challenge::where('challenge_id',$request->input('challengeId'))->with("level")->first(); + if ($challenge->count() == 0){ + return APIReturn::error("challenge_not_found", __("问题不存在"), 404); + } + $logs = Log::where([ + ["challenge_id", '=', $request->input("challengeId")], + ["status", "=", "correct"] + ])->with(['team'])->orderBy("created_at")->get(); + $ruleValidator = new RuleValidator($team->team_id, $challenge->level->rules); + if (!$ruleValidator->check($team->logs)){ + // 题目未开放 + return APIReturn::error("challenge_not_found", __("问题不存在"), 404); + } + $result = []; + + $logs->each(function($log) use(&$result){ + array_push($result, [ + 'teamName' => $log->team->team_name, + 'solvedAt' => Carbon::parse($log->created_at)->toIso8601String() + ]); + }); + return APIReturn::success($result); + } + catch (\Exception $e){ + dump($e); + return APIReturn::error("database_error", "数据库读写错误", 500); + } + } + /** * 获得 Flags 详情 * @param Request $request diff --git a/app/Log.php b/app/Log.php index e1fadd8..dfd4725 100644 --- a/app/Log.php +++ b/app/Log.php @@ -13,4 +13,8 @@ public function level() { return $this->belongsTo('App\Level', 'level_id', 'level_id'); } + + public function team(){ + return $this->belongsTo('App\Team', 'team_id', 'team_id'); + } } diff --git a/resources/lang/en.json b/resources/lang/en.json index 6ce247a..c3bb2e3 100644 --- a/resources/lang/en.json +++ b/resources/lang/en.json @@ -17,5 +17,7 @@ "数据库读写错误": "Database error", - "操作过于频繁": "Too many requests. Please try again later." + "操作过于频繁": "Too many requests. Please try again later.", + "缺少 题目ID 字段": "Missing Challenge ID", + "问题不存在": "Challenge not found" } \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index bbc143a..f371fed 100644 --- a/routes/web.php +++ b/routes/web.php @@ -14,14 +14,14 @@ Route::get('/', 'IndexController@index'); Route::group(['prefix' => 'User'], function () { //Route::group(['middleware' => 'throttle:120'], function(){ - Route::post('login', 'TeamController@login'); - Route::post('register', 'TeamController@register'); - Route::get('token', 'TeamController@tokenVerify'); + Route::post('login', 'TeamController@login'); + Route::post('register', 'TeamController@register'); + Route::get('token', 'TeamController@tokenVerify'); //}); //Route::group(['middleware' => 'throttle:100'], function(){ - Route::get('select', 'TeamController@publicListTeams'); - Route::get('ranking', 'TeamController@getRanking'); + Route::get('select', 'TeamController@publicListTeams'); + Route::get('ranking', 'TeamController@getRanking'); //}); Route::group(['middleware' => 'jwt.auth.mod'], function () { @@ -72,36 +72,37 @@ Route::group(['middleware' => ['jwt.auth.mod', 'TimeCheck']], function () { Route::get('list', 'ChallengeController@list'); + Route::get('solvedTeams', 'ChallengeController@getSolvedTeams'); }); - Route::group(['middleware' => ['jwt.auth.mod', 'TimeCheck', 'BlockCheck']], function(){ - Route::post('submitFlag', 'ChallengeController@submitFlag'); + Route::group(['middleware' => ['jwt.auth.mod', 'TimeCheck', 'BlockCheck']], function () { + Route::post('submitFlag', 'ChallengeController@submitFlag'); }); }); - Route::group(['prefix' => 'Flag', 'middleware' => ['jwt.auth.mod', 'AdminCheck']], function(){ - Route::post('delete', 'FlagController@deleteFlag'); - Route::post('edit', 'FlagController@editFlag'); + Route::group(['prefix' => 'Flag', 'middleware' => ['jwt.auth.mod', 'AdminCheck']], function () { + Route::post('delete', 'FlagController@deleteFlag'); + Route::post('edit', 'FlagController@editFlag'); }); - Route::group(['prefix' => 'SystemLog', 'middleware' => ['jwt.auth.mod', 'AdminCheck']], function(){ - Route::get('list', 'SystemLogController@list'); + Route::group(['prefix' => 'SystemLog', 'middleware' => ['jwt.auth.mod', 'AdminCheck']], function () { + Route::get('list', 'SystemLogController@list'); }); - Route::group(['prefix' => 'System'], function(){ - Route::get('meta', 'SystemController@getMetaInfo'); - Route::group(['middleware' => ['jwt.auth.mod', 'AdminCheck']], function(){ - Route::post('edit', 'SystemController@editMetaInfo'); - }); + Route::group(['prefix' => 'System'], function () { + Route::get('meta', 'SystemController@getMetaInfo'); + Route::group(['middleware' => ['jwt.auth.mod', 'AdminCheck']], function () { + Route::post('edit', 'SystemController@editMetaInfo'); + }); }); - Route::group(['prefix' => 'Bulletin'], function(){ + Route::group(['prefix' => 'Bulletin'], function () { Route::get('list', 'BulletinController@list'); - Route::group(['middleware' => ['jwt.auth.mod', 'AdminCheck']], function(){ - Route::post('delete', 'BulletinController@delete'); - Route::post('create', 'BulletinController@create'); - Route::post('edit', 'BulletinController@edit'); + Route::group(['middleware' => ['jwt.auth.mod', 'AdminCheck']], function () { + Route::post('delete', 'BulletinController@delete'); + Route::post('create', 'BulletinController@create'); + Route::post('edit', 'BulletinController@edit'); }); }); });