首页logo等

master
lion 4 weeks ago
parent 32a29e453a
commit 8afcceeb82

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

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

@ -0,0 +1,41 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
/**
* 人员管理按赛区配置依赖这些列。生产若只发了代码未跑 2026_08_26 迁移,
* GET /admins?event_location= 与 reviewer-scope-region-counts 会 500。
*/
return new class extends Migration
{
public function up(): void
{
if (Schema::hasTable('reviewer_scopes') && ! Schema::hasColumn('reviewer_scopes', 'event_location')) {
Schema::table('reviewer_scopes', function (Blueprint $table) {
$table->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 管理,此处不回滚以免误删。
}
};
Loading…
Cancel
Save