query('src', '')); $publicSourceCode = null; if (preg_match('/^[A-Za-z0-9_-]{2,64}$/', $sourceCode) === 1) { try { $publicSourceCode = PublicSourceChannel::query() ->where('source_code', $sourceCode) ->where('status', PublicSourceChannel::STATUS_ENABLED) ->value('source_code'); } catch (Throwable) { $publicSourceCode = null; } } return view('welcome', [ 'publicSourceCode' => $publicSourceCode, ]); }); Route::get('/channel-entry', ChannelEntryController::class)->name('channel.entry'); /** 选手端附件预览:签名临时 URL,避免仅依赖 public/storage → storage/app/public 的软链(未 link 时 /storage/... 404) */ Route::get('/participant/application-files/{file}', [ApplicationFileController::class, 'downloadSigned']) ->middleware('signed') ->whereNumber('file') ->name('participant.application-file.download'); /** cxxfds-web 生产构建产出目录:public/admin */ Route::redirect('/admin', '/admin/', 301); Route::get('/admin/{path?}', function (?string $path = null) { if ($path !== null && $path !== '') { $candidate = public_path('admin/'.$path); if (File::isFile($candidate)) { return response()->file($candidate); } } $index = public_path('admin/index.html'); if (! File::exists($index)) { abort(503, 'Admin frontend not built. Run npm run build in cxxfds-web.'); } return response()->file($index, ['Content-Type' => 'text/html; charset=UTF-8']); })->where('path', '.*')->name('admin.spa');