From 8afcceeb8242a4329d89f813aebfca54485e4e07 Mon Sep 17 00:00:00 2001 From: lion <120344285@qq.com> Date: Thu, 27 Aug 2026 14:59:28 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A6=96=E9=A1=B5logo=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Api/Admin/CompetitionAdminController.php | 43 +++++++++++++------ .../Api/Admin/ReviewerScopeController.php | 16 +++++-- ...ensure_event_location_on_people_tables.php | 41 ++++++++++++++++++ 3 files changed, 82 insertions(+), 18 deletions(-) create mode 100644 database/migrations/2026_08_27_150000_ensure_event_location_on_people_tables.php diff --git a/app/Http/Controllers/Api/Admin/CompetitionAdminController.php b/app/Http/Controllers/Api/Admin/CompetitionAdminController.php index 565905b..70343ed 100644 --- a/app/Http/Controllers/Api/Admin/CompetitionAdminController.php +++ b/app/Http/Controllers/Api/Admin/CompetitionAdminController.php @@ -8,6 +8,7 @@ use App\Models\CompetitionAdmin; use App\Support\BizDateTime; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Schema; use Illuminate\Validation\Rule; class CompetitionAdminController extends Controller @@ -23,16 +24,20 @@ class CompetitionAdminController extends Controller $query = $competition->competitionAdmins()->orderByDesc('id'); $keyword = trim((string) ($data['keyword'] ?? '')); + $hasMobile = Schema::hasColumn('competition_admins', 'mobile'); + $hasEventLocation = Schema::hasColumn('competition_admins', 'event_location'); if ($keyword !== '') { $like = '%'.str_replace(['%', '_'], ['\\%', '\\_'], $keyword).'%'; - $query->where(function ($q) use ($like): void { + $query->where(function ($q) use ($like, $hasMobile): void { $q->where('username', 'like', $like) - ->orWhere('name', 'like', $like) - ->orWhere('mobile', 'like', $like); + ->orWhere('name', 'like', $like); + if ($hasMobile) { + $q->orWhere('mobile', 'like', $like); + } }); } $eventLocation = trim((string) ($data['event_location'] ?? '')); - if ($eventLocation !== '') { + if ($eventLocation !== '' && $hasEventLocation) { $query->where('event_location', $eventLocation); } @@ -47,14 +52,19 @@ class CompetitionAdminController extends Controller { $data = $this->validatedPayload($request, $competition); - $row = $competition->competitionAdmins()->create([ + $payload = [ 'username' => $data['username'], 'password_hash' => $data['password'], 'name' => $data['name'], - 'mobile' => $data['mobile'] ?? null, - 'event_location' => $data['event_location'] ?? null, 'status' => $data['status'] ?? 'active', - ]); + ]; + if (Schema::hasColumn('competition_admins', 'mobile')) { + $payload['mobile'] = $data['mobile'] ?? null; + } + if (Schema::hasColumn('competition_admins', 'event_location')) { + $payload['event_location'] = $data['event_location'] ?? null; + } + $row = $competition->competitionAdmins()->create($payload); return response()->json($this->toRow($row), 201); } @@ -64,15 +74,20 @@ class CompetitionAdminController extends Controller $this->ensureBelongs($competition, $competition_admin); $data = $this->validatedPayload($request, $competition, (int) $competition_admin->id); - $competition_admin->fill([ + $fill = [ 'username' => $data['username'], 'name' => $data['name'], - 'mobile' => array_key_exists('mobile', $data) ? $data['mobile'] : $competition_admin->mobile, - 'event_location' => array_key_exists('event_location', $data) - ? $data['event_location'] - : $competition_admin->event_location, 'status' => $data['status'] ?? $competition_admin->status, - ]); + ]; + if (Schema::hasColumn('competition_admins', 'mobile')) { + $fill['mobile'] = array_key_exists('mobile', $data) ? $data['mobile'] : $competition_admin->mobile; + } + if (Schema::hasColumn('competition_admins', 'event_location')) { + $fill['event_location'] = array_key_exists('event_location', $data) + ? $data['event_location'] + : $competition_admin->event_location; + } + $competition_admin->fill($fill); if (! empty($data['password'])) { $competition_admin->password_hash = $data['password']; } diff --git a/app/Http/Controllers/Api/Admin/ReviewerScopeController.php b/app/Http/Controllers/Api/Admin/ReviewerScopeController.php index 712d7d6..5deffee 100644 --- a/app/Http/Controllers/Api/Admin/ReviewerScopeController.php +++ b/app/Http/Controllers/Api/Admin/ReviewerScopeController.php @@ -10,6 +10,7 @@ use App\Models\ReviewerScope; use App\Support\PortalAccess; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Schema; use Symfony\Component\HttpFoundation\Response; class ReviewerScopeController extends Controller @@ -40,6 +41,10 @@ class ReviewerScopeController extends Controller */ public function countsByEventLocation(Competition $competition): JsonResponse { + if (! Schema::hasColumn('reviewer_scopes', 'event_location')) { + return response()->json(['data' => []]); + } + $pairs = ReviewerScope::query() ->where('competition_id', $competition->id) ->whereNotNull('event_location') @@ -88,7 +93,7 @@ class ReviewerScopeController extends Controller $q->where('track_code', $validated['track_code']); } - if (! empty($validated['event_location'])) { + if (! empty($validated['event_location']) && Schema::hasColumn('reviewer_scopes', 'event_location')) { $q->where('event_location', $validated['event_location']); } @@ -139,12 +144,15 @@ class ReviewerScopeController extends Controller $validated = $request->validated(); PortalAccess::assertCompetition($request, (int) $validated['competition_id']); - $scope = ReviewerScope::query()->create([ + $payload = [ 'reviewer_id' => (int) $validated['reviewer_id'], 'competition_id' => (int) $validated['competition_id'], 'track_code' => $validated['track_code'], - 'event_location' => $validated['event_location'] ?? null, - ]); + ]; + if (Schema::hasColumn('reviewer_scopes', 'event_location')) { + $payload['event_location'] = $validated['event_location'] ?? null; + } + $scope = ReviewerScope::query()->create($payload); $scope->load(['reviewer:id,mobile,username,name,status,password_hash', 'competition:id,slug,name']); $track = CompetitionTrack::query() diff --git a/database/migrations/2026_08_27_150000_ensure_event_location_on_people_tables.php b/database/migrations/2026_08_27_150000_ensure_event_location_on_people_tables.php new file mode 100644 index 0000000..63cc0a6 --- /dev/null +++ b/database/migrations/2026_08_27_150000_ensure_event_location_on_people_tables.php @@ -0,0 +1,41 @@ +string('event_location', 64)->nullable()->after('track_code'); + $table->index(['competition_id', 'event_location'], 'idx_rev_scope_comp_location'); + }); + } + + if (! Schema::hasTable('competition_admins')) { + return; + } + + Schema::table('competition_admins', function (Blueprint $table) { + if (! Schema::hasColumn('competition_admins', 'mobile')) { + $table->string('mobile', 20)->nullable()->after('name'); + } + if (! Schema::hasColumn('competition_admins', 'event_location')) { + $after = Schema::hasColumn('competition_admins', 'mobile') ? 'mobile' : 'name'; + $table->string('event_location', 64)->nullable()->after($after); + } + }); + } + + public function down(): void + { + // 列由 2026_08_26_100000_add_event_location_to_people_tables 管理,此处不回滚以免误删。 + } +};