master
lion 1 week ago
parent fe7fac5cab
commit 83164f76e8

@ -2,6 +2,7 @@
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Concerns\AuthorizesActivitySubmitter;
use App\Http\Controllers\Controller;
use App\Models\Activity;
use App\Models\ActivityDay;
@ -13,6 +14,7 @@ use Illuminate\Validation\ValidationException;
class ActivityBookingController extends Controller
{
use AuthorizesActivitySubmitter;
private const BOOKING_MODE_INDIVIDUAL = 'individual';
private const BOOKING_MODE_GROUP = 'group';
@ -22,6 +24,7 @@ class ActivityBookingController extends Controller
public function show(Request $request, Activity $activity): JsonResponse
{
$this->ensureVenuePermission($request, $activity->venue_id);
$this->authorizeActivityEditForNonSuperAdmin($request, $activity);
return response()->json($this->formatBookingPayload($activity->load('venue:id,appointment_type')));
}
@ -29,6 +32,7 @@ class ActivityBookingController extends Controller
public function update(Request $request, Activity $activity): JsonResponse
{
$this->ensureVenuePermission($request, $activity->venue_id);
$this->authorizeActivityEditForNonSuperAdmin($request, $activity);
if (($activity->reservation_type ?? Activity::RESERVATION_TYPE_ONLINE) !== Activity::RESERVATION_TYPE_ONLINE) {
throw ValidationException::withMessages([

@ -3,6 +3,7 @@
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Concerns\AuthorizesActivitySubmitter;
use App\Models\Activity;
use App\Support\VerifyPortalCode;
use Carbon\Carbon;
@ -13,6 +14,7 @@ use Illuminate\Validation\ValidationException;
class ActivityController extends Controller
{
use AuthorizesActivitySubmitter;
public function index(Request $request): JsonResponse
{
$query = Activity::with('venue:id,name')->orderByHotThenScheduleStatusPriority();
@ -120,6 +122,7 @@ class ActivityController extends Controller
'audit_status' => $auditStatus,
'audit_remark' => null,
'last_approved_snapshot' => null,
'submitted_by' => $request->user()->isSuperAdmin() ? null : $request->user()->id,
]);
if (! $activity->verify_portal_token) {
$activity->forceFill(['verify_portal_token' => (string) Str::uuid()])->save();
@ -137,6 +140,7 @@ class ActivityController extends Controller
public function update(Request $request, Activity $activity): JsonResponse
{
$this->ensureVenuePermission($request, $activity->venue_id);
$this->authorizeActivityEditForNonSuperAdmin($request, $activity);
$data = $request->validate([
'venue_id' => ['sometimes', 'integer', 'exists:venues,id'],
@ -232,6 +236,7 @@ class ActivityController extends Controller
public function updateBehindScenes(Request $request, Activity $activity): JsonResponse
{
$this->ensureVenuePermission($request, $activity->venue_id);
$this->authorizeActivityEditForNonSuperAdmin($request, $activity);
$status = Activity::computeScheduleStatusFromBounds($activity->start_at, $activity->end_at);
abort_unless($status === 'ended', 422, '仅已结束活动可上传花絮');
@ -285,6 +290,7 @@ class ActivityController extends Controller
public function toggle(Request $request, Activity $activity): JsonResponse
{
$this->ensureVenuePermission($request, $activity->venue_id);
$this->authorizeActivityEditForNonSuperAdmin($request, $activity);
$activity->is_active = ! $activity->is_active;
$activity->save();
@ -294,6 +300,7 @@ class ActivityController extends Controller
public function destroy(Request $request, Activity $activity): JsonResponse
{
$this->ensureVenuePermission($request, $activity->venue_id);
$this->authorizeActivityEditForNonSuperAdmin($request, $activity);
$count = $activity->reservations()->count();
if ($count > 0) {
return response()->json([
@ -310,6 +317,7 @@ class ActivityController extends Controller
{
$activity = Activity::withTrashed()->findOrFail($activityId);
$this->ensureVenuePermission($request, $activity->venue_id);
$this->authorizeActivityEditForNonSuperAdmin($request, $activity);
$disableAfterRestore = $request->boolean('disable_after_restore');
$activity->restore();
if ($disableAfterRestore) {

@ -731,6 +731,7 @@ class H5ContentController extends Controller
'reservation_type' => $a->reservation_type ?? Activity::RESERVATION_TYPE_ONLINE,
'is_hot' => (bool) ($a->is_hot ?? false),
'has_behind_scenes' => $this->activityHasBehindScenes($a),
'offline_reservation_method' => (string) ($a->offline_reservation_method ?? ''),
];
})->merge($grabs->map(function (TicketGrabEvent $e) {
$firstVenue = $e->venues->first();
@ -793,6 +794,12 @@ class H5ContentController extends Controller
return $aStart <=> $bStart;
}
$tx = $this->mixedListActivityTicketPaidRank($x);
$ty = $this->mixedListActivityTicketPaidRank($y);
if ($tx !== $ty) {
return $tx <=> $ty;
}
return (int) $y['id'] <=> (int) $x['id'];
})->values();
@ -812,6 +819,18 @@ class H5ContentController extends Controller
return response()->json($paginator);
}
/**
* 与 {@see Activity::scopeOrderByTicketNoteFreeBeforePaid} 一致:仅活动行区分收费门票;抢票为 0。
*/
private function mixedListActivityTicketPaidRank(array $row): int
{
if (($row['list_kind'] ?? '') !== 'activity') {
return 0;
}
return (($row['offline_reservation_method'] ?? '') === Activity::TICKET_PAID) ? 1 : 0;
}
/**
* 0=进行中, 1=未开始, 2=已结束(与 orderByScheduleStatusPriority 同序).
*/

@ -33,6 +33,7 @@ class H5HomeController extends Controller
->whereNotNull('cover_image')
->where('cover_image', '!=', '')
->orderBy('sort')
->orderByTicketNoteFreeBeforePaid()
->orderByDesc('id')
->limit(5)
->get(['id', 'title', 'summary', 'cover_image'])
@ -108,7 +109,7 @@ class H5HomeController extends Controller
->with('activityDays')
->visibleOnH5()
->orderByHotThenScheduleStatusPriority()
->get(['id', 'venue_id', 'title', 'summary', 'cover_image', 'start_at', 'end_at', 'registered_count', 'address', 'tags', 'sort', 'behind_scenes_media', 'is_hot'])
->get(['id', 'venue_id', 'title', 'summary', 'cover_image', 'start_at', 'end_at', 'registered_count', 'address', 'tags', 'sort', 'behind_scenes_media', 'is_hot', 'offline_reservation_method'])
->map(function ($a) {
$isBookable = $a->activityDays->contains(
fn (ActivityDay $d) => $d->isCurrentlyBookable()
@ -130,6 +131,7 @@ class H5HomeController extends Controller
'tags' => array_values($a->tags ?? []),
'is_hot' => (bool) ($a->is_hot ?? false),
'has_behind_scenes' => $this->activityHasBehindScenes($a),
'offline_reservation_method' => (string) ($a->offline_reservation_method ?? ''),
];
});
$tgRows = TicketGrabEvent::query()
@ -188,6 +190,12 @@ class H5HomeController extends Controller
return strcmp((string) $a, (string) $b);
}
$tx = $this->homeActivityTicketPaidRank($x);
$ty = $this->homeActivityTicketPaidRank($y);
if ($tx !== $ty) {
return $tx <=> $ty;
}
return (int) $y['id'] <=> (int) $x['id'];
})->values()->take(5)->values();
@ -256,7 +264,19 @@ class H5HomeController extends Controller
}
/**
* 与活动列表 H5 混合排序0 进行中/未结束, 1 未开始, 2 已结束.
* 与 SQL orderByTicketNoteFreeBeforePaid 一致:活动收费门票说明排后,抢票等非活动为 0。
*/
private function homeActivityTicketPaidRank(array $row): int
{
if (($row['list_kind'] ?? '') !== 'activity') {
return 0;
}
return (($row['offline_reservation_method'] ?? '') === Activity::TICKET_PAID) ? 1 : 0;
}
/**
* 与活动列表 H5 混合排序0 进行中/未结束, 1 未开始, 2 已结束。
*/
private function homeScheduleRank(?string $startIso, ?string $endIso, string $today): int
{

@ -40,7 +40,7 @@ class VerifyPortalManageController extends Controller
public function activityStore(Request $request, Activity $activity): JsonResponse
{
$this->ensureActivityVenueAdmin($request, $activity);
$this->ensureActivityVerifyCredentialMutation($request, $activity);
$data = $request->validate([
'username' => ['required', 'string', 'max:64'],
'password' => ['required', 'string', 'min:6', 'max:72'],
@ -72,7 +72,7 @@ class VerifyPortalManageController extends Controller
public function activityUpdate(Request $request, Activity $activity, VerifyPortalCredential $verifyPortalCredential): JsonResponse
{
$this->ensureActivityVenueAdmin($request, $activity);
$this->ensureActivityVerifyCredentialMutation($request, $activity);
$this->assertCredentialBelongsActivity($verifyPortalCredential, $activity);
$data = $request->validate([
'password' => ['sometimes', 'string', 'min:6', 'max:72'],
@ -93,7 +93,7 @@ class VerifyPortalManageController extends Controller
public function activityDestroy(Request $request, Activity $activity, VerifyPortalCredential $verifyPortalCredential): JsonResponse
{
$this->ensureActivityVenueAdmin($request, $activity);
$this->ensureActivityVerifyCredentialMutation($request, $activity);
$this->assertCredentialBelongsActivity($verifyPortalCredential, $activity);
$verifyPortalCredential->tokens()->delete();
$verifyPortalCredential->delete();
@ -236,6 +236,15 @@ class VerifyPortalManageController extends Controller
abort_unless($allowed, 403, '仅可操作已绑定场馆');
}
/** 场馆管理员仅可查看核销链接与账号,不可增删改凭证 */
private function ensureActivityVerifyCredentialMutation(Request $request, Activity $activity): void
{
$this->ensureActivityVenueAdmin($request, $activity);
if ($request->user()->role === 'venue_admin') {
abort(403, '场馆管理员仅可查看核销信息');
}
}
private function ensureTicketGrabAdmin(Request $request, TicketGrabEvent $e): void
{
$pivots = TicketGrabEventVenue::query()

@ -0,0 +1,22 @@
<?php
namespace App\Http\Controllers\Concerns;
use App\Models\Activity;
use Illuminate\Http\Request;
trait AuthorizesActivitySubmitter
{
/** 非超级管理员仅能维护本人创建的活动;平台代录(提交人为空)仅超管可改 */
protected function authorizeActivityEditForNonSuperAdmin(Request $request, Activity $activity): void
{
$user = $request->user();
if ($user?->isSuperAdmin()) {
return;
}
if ($activity->submitted_by === null) {
abort(403, '该平台录入的活动仅超级管理员可修改');
}
abort_unless((int) $activity->submitted_by === (int) $user->id, 403, '只能编辑本人提交的活动');
}
}

@ -37,6 +37,7 @@ class Activity extends Model
protected $fillable = [
'venue_id',
'submitted_by',
'reservation_type',
'location',
'check_in_meeting_point',
@ -138,6 +139,11 @@ class Activity extends Model
return $this->belongsTo(Venue::class);
}
public function submitter(): BelongsTo
{
return $this->belongsTo(User::class, 'submitted_by');
}
public function reservations(): HasMany
{
return $this->hasMany(Reservation::class);
@ -162,6 +168,7 @@ class Activity extends Model
->orderByRaw('CASE WHEN end_at IS NOT NULL AND end_at < ? THEN end_at END DESC', [$today])
->orderByRaw('CASE WHEN (end_at IS NULL OR end_at >= ?) AND start_at IS NULL THEN 1 ELSE 0 END ASC', [$today])
->orderByRaw('CASE WHEN end_at IS NULL OR end_at >= ? THEN start_at END ASC', [$today])
->orderByTicketNoteFreeBeforePaid()
->orderByDesc('id');
}
@ -183,6 +190,7 @@ class Activity extends Model
)
->orderByRaw('start_at IS NULL ASC')
->orderBy('start_at', 'asc')
->orderByTicketNoteFreeBeforePaid()
->orderByDesc('id');
}
@ -205,9 +213,21 @@ class Activity extends Model
)
->orderByRaw('start_at IS NULL ASC')
->orderBy('start_at', 'asc')
->orderByTicketNoteFreeBeforePaid()
->orderByDesc('id');
}
/**
* 门票说明:免费等非 paid 在前收费paid在后。
*/
public function scopeOrderByTicketNoteFreeBeforePaid(Builder $query): Builder
{
return $query->orderByRaw(
'CASE WHEN offline_reservation_method = ? THEN 1 ELSE 0 END ASC',
[self::TICKET_PAID]
);
}
/**
* 按活动开始/结束日(应用时区下的日历日)计算「未开始 / 进行中 / 已结束」,与后台列表筛选一致。
*/

@ -0,0 +1,26 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('activities', function (Blueprint $table) {
$table->foreignId('submitted_by')
->nullable()
->after('venue_id')
->constrained('users')
->nullOnDelete();
});
}
public function down(): void
{
Schema::table('activities', function (Blueprint $table) {
$table->dropConstrainedForeignId('submitted_by');
});
}
};

File diff suppressed because one or more lines are too long

@ -1 +0,0 @@
.activity-address-coord-row[data-v-550953f9]{flex-wrap:wrap;align-items:center;gap:12px;width:100%;display:flex}.activity-address-coord-row__address[data-v-550953f9]{flex:45%;min-width:320px;max-width:100%}.activity-address-coord-row__lng[data-v-550953f9],.activity-address-coord-row__lat[data-v-550953f9]{flex:180px;width:200px;min-width:180px}.activity-address-coord-row__map[data-v-550953f9]{flex-shrink:0}.activity-cover-carousel-wrap[data-v-550953f9]{flex-wrap:wrap;align-items:flex-start;gap:20px;width:100%;display:flex}.activity-cover-carousel-row__col[data-v-550953f9]{flex:320px;min-width:min(100%,320px)}.activity-cover-carousel-row__sub[data-v-550953f9]{color:var(--color-text-1);margin-bottom:8px;font-weight:500}.activity-cover-thumb[data-v-550953f9]{object-fit:cover;cursor:zoom-in;border:1px solid #e5e6eb;border-radius:4px;width:120px;height:70px}.activity-gallery-grid[data-v-550953f9]{flex-wrap:wrap;align-items:flex-start;gap:12px;width:100%;display:flex}.activity-gallery-item[data-v-550953f9]{flex-direction:column;align-items:flex-start;gap:8px;display:flex}.activity-gallery-thumb[data-v-550953f9]{object-fit:cover;cursor:zoom-in;border:1px solid #e5e6eb;border-radius:4px;width:120px;height:70px}.activity-gallery-thumb--video[data-v-550953f9]{display:block}.activity-form-tags[data-v-550953f9]{max-width:520px}.activity-form-tags__line[data-v-550953f9]{flex-flow:row;align-items:center;gap:8px;width:100%;display:flex}.activity-form-tags__input[data-v-550953f9]{flex:auto;min-width:0}.activity-form-tags__input[data-v-550953f9] .arco-input-wrapper{width:100%}.activity-form-tags__save[data-v-550953f9]{flex-shrink:0}.activity-form-tags__chips[data-v-550953f9]{flex-wrap:wrap;align-items:center;gap:8px;margin-top:8px;display:flex}.activity-form-tags__empty[data-v-550953f9]{color:#86909c;font-size:12px}.activity-form-tags__chips--readonly[data-v-550953f9]{margin-top:0}.activity-form-tags__chips--inline[data-v-550953f9]{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.activity-audit-inline[data-v-550953f9]{grid-template-columns:repeat(3,minmax(0,1fr));gap:10px 16px;padding-bottom:4px;display:grid}.activity-audit-inline-row[data-v-550953f9]{align-items:flex-start;gap:12px;min-width:0;font-size:14px;line-height:1.5715;display:flex}.activity-audit-inline-row--tags[data-v-550953f9]{align-items:center}.activity-audit-inline-label[data-v-550953f9]{color:var(--color-text-3);text-align:right;flex:0 0 74px}.activity-audit-inline-value[data-v-550953f9]{min-width:0;color:var(--color-text-1);word-break:break-word;flex:1}.activity-audit-stack[data-v-550953f9]{margin-top:20px}.activity-audit-stack__label[data-v-550953f9]{color:var(--color-text-1);margin-bottom:8px;font-size:14px;font-weight:500}.activity-audit-stack__body[data-v-550953f9]{min-width:0}@media (width<=1400px){.activity-audit-inline[data-v-550953f9]{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width<=980px){.activity-audit-inline[data-v-550953f9]{grid-template-columns:minmax(0,1fr)}}.activity-audit-static-text[data-v-550953f9]{color:var(--color-text-1);word-break:break-word;font-size:14px;line-height:1.5715}.activity-audit-static-text--fill[data-v-550953f9]{border:1px solid var(--color-neutral-3);border-radius:var(--border-radius-small);background:var(--color-fill-2);box-sizing:border-box;align-items:center;min-height:32px;padding:4px 11px;display:flex}.activity-audit-static-coord[data-v-550953f9]{border:1px solid var(--color-neutral-3);border-radius:var(--border-radius-small);background:var(--color-fill-2);box-sizing:border-box;min-height:32px;color:var(--color-text-2);font-variant-numeric:tabular-nums;align-items:center;padding:4px 11px;font-size:14px;line-height:1.5715;display:flex}.activity-audit-muted[data-v-550953f9]{color:var(--color-text-3);font-size:13px}.activity-audit-break[data-v-550953f9]{word-break:break-word}.activity-audit-rich[data-v-550953f9]{color:var(--color-text-1);background:#fafafa;border:1px solid #e5e6eb;border-radius:8px;max-height:380px;padding:12px;font-size:13px;line-height:1.7;overflow-y:auto}.activity-audit-rich[data-v-550953f9] img{vertical-align:top;max-width:100%;height:auto}.activity-audit-rich[data-v-550953f9] video{max-width:100%}.bts-preview-grid[data-v-550953f9]{flex-wrap:wrap;gap:16px;width:100%;display:flex}.bts-preview-item[data-v-550953f9]{box-sizing:border-box;flex:none;width:220px}.bts-preview-img[data-v-550953f9]{object-fit:cover;cursor:zoom-in;border:1px solid #e5e6eb;border-radius:8px;width:220px;height:220px;display:block}.bts-preview-actions[data-v-550953f9]{flex-flow:row;align-items:center;gap:8px;width:100%;margin-top:8px;display:flex}.bts-preview-actions[data-v-550953f9] .bts-act-btn.arco-btn-size-mini{flex:1 1 0;min-width:0;padding-left:6px;padding-right:6px}

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
.activity-address-coord-row[data-v-3cc5fb67]{flex-wrap:wrap;align-items:center;gap:12px;width:100%;display:flex}.activity-address-coord-row__address[data-v-3cc5fb67]{flex:45%;min-width:320px;max-width:100%}.activity-address-coord-row__lng[data-v-3cc5fb67],.activity-address-coord-row__lat[data-v-3cc5fb67]{flex:180px;width:200px;min-width:180px}.activity-address-coord-row__map[data-v-3cc5fb67]{flex-shrink:0}.activity-cover-carousel-wrap[data-v-3cc5fb67]{flex-wrap:wrap;align-items:flex-start;gap:20px;width:100%;display:flex}.activity-cover-carousel-row__col[data-v-3cc5fb67]{flex:320px;min-width:min(100%,320px)}.activity-cover-carousel-row__sub[data-v-3cc5fb67]{color:var(--color-text-1);margin-bottom:8px;font-weight:500}.activity-cover-thumb[data-v-3cc5fb67]{object-fit:cover;cursor:zoom-in;border:1px solid #e5e6eb;border-radius:4px;width:120px;height:70px}.activity-gallery-grid[data-v-3cc5fb67]{flex-wrap:wrap;align-items:flex-start;gap:12px;width:100%;display:flex}.activity-gallery-item[data-v-3cc5fb67]{flex-direction:column;align-items:flex-start;gap:8px;display:flex}.activity-gallery-thumb[data-v-3cc5fb67]{object-fit:cover;cursor:zoom-in;border:1px solid #e5e6eb;border-radius:4px;width:120px;height:70px}.activity-gallery-thumb--video[data-v-3cc5fb67]{display:block}.activity-form-tags[data-v-3cc5fb67]{max-width:520px}.activity-form-tags__line[data-v-3cc5fb67]{flex-flow:row;align-items:center;gap:8px;width:100%;display:flex}.activity-form-tags__input[data-v-3cc5fb67]{flex:auto;min-width:0}.activity-form-tags__input[data-v-3cc5fb67] .arco-input-wrapper{width:100%}.activity-form-tags__save[data-v-3cc5fb67]{flex-shrink:0}.activity-form-tags__chips[data-v-3cc5fb67]{flex-wrap:wrap;align-items:center;gap:8px;margin-top:8px;display:flex}.activity-form-tags__empty[data-v-3cc5fb67]{color:#86909c;font-size:12px}.activity-form-tags__chips--readonly[data-v-3cc5fb67]{margin-top:0}.activity-form-tags__chips--inline[data-v-3cc5fb67]{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.activity-audit-inline[data-v-3cc5fb67]{grid-template-columns:repeat(3,minmax(0,1fr));gap:10px 16px;padding-bottom:4px;display:grid}.activity-audit-inline-row[data-v-3cc5fb67]{align-items:flex-start;gap:12px;min-width:0;font-size:14px;line-height:1.5715;display:flex}.activity-audit-inline-row--tags[data-v-3cc5fb67]{align-items:center}.activity-audit-inline-label[data-v-3cc5fb67]{color:var(--color-text-3);text-align:right;flex:0 0 74px}.activity-audit-inline-value[data-v-3cc5fb67]{min-width:0;color:var(--color-text-1);word-break:break-word;flex:1}.activity-audit-stack[data-v-3cc5fb67]{margin-top:20px}.activity-audit-stack__label[data-v-3cc5fb67]{color:var(--color-text-1);margin-bottom:8px;font-size:14px;font-weight:500}.activity-audit-stack__body[data-v-3cc5fb67]{min-width:0}@media (width<=1400px){.activity-audit-inline[data-v-3cc5fb67]{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width<=980px){.activity-audit-inline[data-v-3cc5fb67]{grid-template-columns:minmax(0,1fr)}}.activity-audit-static-text[data-v-3cc5fb67]{color:var(--color-text-1);word-break:break-word;font-size:14px;line-height:1.5715}.activity-audit-static-text--fill[data-v-3cc5fb67]{border:1px solid var(--color-neutral-3);border-radius:var(--border-radius-small);background:var(--color-fill-2);box-sizing:border-box;align-items:center;min-height:32px;padding:4px 11px;display:flex}.activity-audit-static-coord[data-v-3cc5fb67]{border:1px solid var(--color-neutral-3);border-radius:var(--border-radius-small);background:var(--color-fill-2);box-sizing:border-box;min-height:32px;color:var(--color-text-2);font-variant-numeric:tabular-nums;align-items:center;padding:4px 11px;font-size:14px;line-height:1.5715;display:flex}.activity-audit-muted[data-v-3cc5fb67]{color:var(--color-text-3);font-size:13px}.activity-audit-break[data-v-3cc5fb67]{word-break:break-word}.activity-audit-rich[data-v-3cc5fb67]{color:var(--color-text-1);background:#fafafa;border:1px solid #e5e6eb;border-radius:8px;max-height:380px;padding:12px;font-size:13px;line-height:1.7;overflow-y:auto}.activity-audit-rich[data-v-3cc5fb67] img{vertical-align:top;max-width:100%;height:auto}.activity-audit-rich[data-v-3cc5fb67] video{max-width:100%}.bts-preview-grid[data-v-3cc5fb67]{flex-wrap:wrap;gap:16px;width:100%;display:flex}.bts-preview-item[data-v-3cc5fb67]{box-sizing:border-box;flex:none;width:220px}.bts-preview-img[data-v-3cc5fb67]{object-fit:cover;cursor:zoom-in;border:1px solid #e5e6eb;border-radius:8px;width:220px;height:220px;display:block}.bts-preview-actions[data-v-3cc5fb67]{flex-flow:row;align-items:center;gap:8px;width:100%;margin-top:8px;display:flex}.bts-preview-actions[data-v-3cc5fb67] .bts-act-btn.arco-btn-size-mini{flex:1 1 0;min-width:0;padding-left:6px;padding-right:6px}

@ -1 +1 @@
import{n as e}from"./axios-CiYFffbI.js";import{I as t,N as n,V as r,Y as i,_ as a,d as o,it as s,kt as c,nt as l,u,ut as d,v as f,y as p}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{n as m}from"./http-LCi9aT1G.js";import{u as h}from"./index-Di-9WPzB.js";import{t as g}from"./listTableRowIndex-Bl-nc9Qt.js";import{t as _}from"./datetime-DLy52ZIc.js";var v={class:`audit-api-endpoint`},y=1280,b=h(p({__name:`AuditLogs`,setup(p){let h=s(!1),b=s([]),x=l({current:1,pageSize:20,total:0}),S=l({keyword:``,method:`all`,status_code:void 0,dateRange:[]});async function C(){h.value=!0;try{let{data:e}=await m.get(`/audit-logs`,{params:{keyword:S.keyword||void 0,method:S.method,status_code:S.status_code||void 0,start_date:S.dateRange?.[0]||void 0,end_date:S.dateRange?.[1]||void 0,page:x.current,page_size:x.pageSize}});b.value=e.data,x.total=e.total}catch(t){e.error(t?.response?.data?.message??`加载操作日志失败`)}finally{h.value=!1}}function w(){x.current=1,C()}function T(e){x.current=e,C()}function E(e){return e.operation_summary&&String(e.operation_summary).trim()!==``?e.operation_summary:e.action&&String(e.action).trim()!==``?e.action:``}function D(e){let t=(e.method||``).toUpperCase()||``,n=(e.path||``).trim();return!n||n===`/`?t+``:(n.startsWith(`/`)||(n=`/`+n),`${t} ${n}`)}return n(C),(e,n)=>{let s=r(`a-alert`),l=r(`a-input`),p=r(`a-option`),m=r(`a-select`),C=r(`a-input-number`),O=r(`a-range-picker`),k=r(`a-button`),A=r(`a-space`),j=r(`a-table-column`),M=r(`a-table`),N=r(`a-card`);return t(),o(N,{title:`用户与权限 / 操作日志`},{default:i(()=>[f(s,{type:`info`,style:{"margin-bottom":`12px`},closable:``},{default:i(()=>[...n[4]||=[a(` 此处为「操作日志」(写操作审计)。系统设置里的「系统日志」页面用于查看服务器 Laravel 日志文件,不是本页。列表不包含 GET 类查询请求。 `,-1)]]),_:1}),f(A,{wrap:``,size:12,style:{"margin-bottom":`12px`}},{default:i(()=>[f(l,{modelValue:S.keyword,"onUpdate:modelValue":n[0]||=e=>S.keyword=e,placeholder:`操作人 / 操作项`,"allow-clear":``,style:{width:`240px`}},null,8,[`modelValue`]),f(m,{modelValue:S.method,"onUpdate:modelValue":n[1]||=e=>S.method=e,style:{width:`120px`}},{default:i(()=>[f(p,{value:`all`},{default:i(()=>[...n[5]||=[a(`全部方法`,-1)]]),_:1}),f(p,{value:`POST`},{default:i(()=>[...n[6]||=[a(`POST`,-1)]]),_:1}),f(p,{value:`PUT`},{default:i(()=>[...n[7]||=[a(`PUT`,-1)]]),_:1}),f(p,{value:`PATCH`},{default:i(()=>[...n[8]||=[a(`PATCH`,-1)]]),_:1}),f(p,{value:`DELETE`},{default:i(()=>[...n[9]||=[a(`DELETE`,-1)]]),_:1})]),_:1},8,[`modelValue`]),f(C,{modelValue:S.status_code,"onUpdate:modelValue":n[2]||=e=>S.status_code=e,min:100,max:599,placeholder:`状态码`,style:{width:`120px`}},null,8,[`modelValue`]),f(O,{modelValue:S.dateRange,"onUpdate:modelValue":n[3]||=e=>S.dateRange=e,style:{width:`260px`}},null,8,[`modelValue`]),f(k,{type:`primary`,onClick:w},{default:i(()=>[...n[10]||=[a(`查询`,-1)]]),_:1})]),_:1}),f(M,{class:`list-data-table`,scroll:{x:y},data:b.value,loading:h.value,"row-key":`id`,pagination:{current:x.current,pageSize:x.pageSize,total:x.total,showTotal:!0},onPageChange:T},{columns:i(()=>[f(j,{title:``,width:52,ellipsis:!0,tooltip:!0},{cell:i(({rowIndex:e})=>[a(c(d(g)(e,x.current,x.pageSize)),1)]),_:1}),f(j,{title:`操作人`,"data-index":`username`,width:140,ellipsis:!0,tooltip:!0},{cell:i(({record:e})=>[a(c(e.username||``),1)]),_:1}),f(j,{title:`操作时间`,width:178},{cell:i(({record:e})=>[a(c(d(_)(e.created_at)),1)]),_:1}),f(j,{title:`接口`,width:320,ellipsis:!0,tooltip:!0},{cell:i(({record:e})=>[u(`span`,v,c(D(e)),1)]),_:1}),f(j,{title:`操作项`,"min-width":320,ellipsis:!0,tooltip:!0},{cell:i(({record:e})=>[a(c(E(e)),1)]),_:1})]),_:1},8,[`scroll`,`data`,`loading`,`pagination`])]),_:1})}}}),[[`__scopeId`,`data-v-f4d2ff07`]]);export{b as default};
import{n as e}from"./axios-CiYFffbI.js";import{I as t,N as n,V as r,Y as i,_ as a,d as o,it as s,kt as c,nt as l,u,ut as d,v as f,y as p}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{n as m}from"./http-LCi9aT1G.js";import{u as h}from"./index-B7ZWoF_u.js";import{t as g}from"./listTableRowIndex-Bl-nc9Qt.js";import{t as _}from"./datetime-DLy52ZIc.js";var v={class:`audit-api-endpoint`},y=1280,b=h(p({__name:`AuditLogs`,setup(p){let h=s(!1),b=s([]),x=l({current:1,pageSize:20,total:0}),S=l({keyword:``,method:`all`,status_code:void 0,dateRange:[]});async function C(){h.value=!0;try{let{data:e}=await m.get(`/audit-logs`,{params:{keyword:S.keyword||void 0,method:S.method,status_code:S.status_code||void 0,start_date:S.dateRange?.[0]||void 0,end_date:S.dateRange?.[1]||void 0,page:x.current,page_size:x.pageSize}});b.value=e.data,x.total=e.total}catch(t){e.error(t?.response?.data?.message??`加载操作日志失败`)}finally{h.value=!1}}function w(){x.current=1,C()}function T(e){x.current=e,C()}function E(e){return e.operation_summary&&String(e.operation_summary).trim()!==``?e.operation_summary:e.action&&String(e.action).trim()!==``?e.action:``}function D(e){let t=(e.method||``).toUpperCase()||``,n=(e.path||``).trim();return!n||n===`/`?t+``:(n.startsWith(`/`)||(n=`/`+n),`${t} ${n}`)}return n(C),(e,n)=>{let s=r(`a-alert`),l=r(`a-input`),p=r(`a-option`),m=r(`a-select`),C=r(`a-input-number`),O=r(`a-range-picker`),k=r(`a-button`),A=r(`a-space`),j=r(`a-table-column`),M=r(`a-table`),N=r(`a-card`);return t(),o(N,{title:`用户与权限 / 操作日志`},{default:i(()=>[f(s,{type:`info`,style:{"margin-bottom":`12px`},closable:``},{default:i(()=>[...n[4]||=[a(` 此处为「操作日志」(写操作审计)。系统设置里的「系统日志」页面用于查看服务器 Laravel 日志文件,不是本页。列表不包含 GET 类查询请求。 `,-1)]]),_:1}),f(A,{wrap:``,size:12,style:{"margin-bottom":`12px`}},{default:i(()=>[f(l,{modelValue:S.keyword,"onUpdate:modelValue":n[0]||=e=>S.keyword=e,placeholder:`操作人 / 操作项`,"allow-clear":``,style:{width:`240px`}},null,8,[`modelValue`]),f(m,{modelValue:S.method,"onUpdate:modelValue":n[1]||=e=>S.method=e,style:{width:`120px`}},{default:i(()=>[f(p,{value:`all`},{default:i(()=>[...n[5]||=[a(`全部方法`,-1)]]),_:1}),f(p,{value:`POST`},{default:i(()=>[...n[6]||=[a(`POST`,-1)]]),_:1}),f(p,{value:`PUT`},{default:i(()=>[...n[7]||=[a(`PUT`,-1)]]),_:1}),f(p,{value:`PATCH`},{default:i(()=>[...n[8]||=[a(`PATCH`,-1)]]),_:1}),f(p,{value:`DELETE`},{default:i(()=>[...n[9]||=[a(`DELETE`,-1)]]),_:1})]),_:1},8,[`modelValue`]),f(C,{modelValue:S.status_code,"onUpdate:modelValue":n[2]||=e=>S.status_code=e,min:100,max:599,placeholder:`状态码`,style:{width:`120px`}},null,8,[`modelValue`]),f(O,{modelValue:S.dateRange,"onUpdate:modelValue":n[3]||=e=>S.dateRange=e,style:{width:`260px`}},null,8,[`modelValue`]),f(k,{type:`primary`,onClick:w},{default:i(()=>[...n[10]||=[a(`查询`,-1)]]),_:1})]),_:1}),f(M,{class:`list-data-table`,scroll:{x:y},data:b.value,loading:h.value,"row-key":`id`,pagination:{current:x.current,pageSize:x.pageSize,total:x.total,showTotal:!0},onPageChange:T},{columns:i(()=>[f(j,{title:``,width:52,ellipsis:!0,tooltip:!0},{cell:i(({rowIndex:e})=>[a(c(d(g)(e,x.current,x.pageSize)),1)]),_:1}),f(j,{title:`操作人`,"data-index":`username`,width:140,ellipsis:!0,tooltip:!0},{cell:i(({record:e})=>[a(c(e.username||``),1)]),_:1}),f(j,{title:`操作时间`,width:178},{cell:i(({record:e})=>[a(c(d(_)(e.created_at)),1)]),_:1}),f(j,{title:`接口`,width:320,ellipsis:!0,tooltip:!0},{cell:i(({record:e})=>[u(`span`,v,c(D(e)),1)]),_:1}),f(j,{title:`操作项`,"min-width":320,ellipsis:!0,tooltip:!0},{cell:i(({record:e})=>[a(c(E(e)),1)]),_:1})]),_:1},8,[`scroll`,`data`,`loading`,`pagination`])]),_:1})}}}),[[`__scopeId`,`data-v-f4d2ff07`]]);export{b as default};

@ -1,2 +1,2 @@
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/dynamicAdminRoutes-Bk2NMkHu.js","assets/dynamicAdminRoutes-B4v7pfij.js","assets/preload-helper-BIjWqNH5.js","assets/http-LCi9aT1G.js","assets/axios-CiYFffbI.js","assets/runtime-core.esm-bundler-CnFWH3R5.js"])))=>i.map(i=>d[i]);
import{n as e}from"./axios-CiYFffbI.js";import{I as t,V as n,Y as r,_ as i,it as a,nt as o,p as s,v as c,y as l}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{n as u,t as d}from"./http-LCi9aT1G.js";import{t as f}from"./preload-helper-BIjWqNH5.js";import{c as p,s as m}from"./index-Di-9WPzB.js";var h={style:{height:`100vh`,display:`grid`,"place-items":`center`,background:`var(--color-fill-2)`}},g=l({__name:`Login`,setup(l){let g=p(),_=m(),v=a(!1),y=o({username:`admin`,password:`admin123456`});async function b(){v.value=!0;try{let{data:t}=await u.post(`/auth/login`,y);localStorage.setItem(d,t.token),e.success(`登录成功`);let{getFirstMenuPath:n}=await f(async()=>{let{getFirstMenuPath:e}=await import(`./dynamicAdminRoutes-Bk2NMkHu.js`);return{getFirstMenuPath:e}},__vite__mapDeps([0,1,2,3,4,5])),r=typeof _.query.redirect==`string`?_.query.redirect.trim():``,i=r&&r.startsWith(`/`)&&!r.startsWith(`//`)?r:await n();g.replace(i)}catch(t){e.error(t?.response?.data?.message??`登录失败`)}finally{v.value=!1}}return(e,a)=>{let o=n(`a-input`),l=n(`a-form-item`),u=n(`a-input-password`),d=n(`a-button`),f=n(`a-form`),p=n(`a-card`);return t(),s(`div`,h,[c(p,{title:`苏州市科普场馆地图后台管理系统登录`,style:{width:`380px`}},{default:r(()=>[c(f,{model:y,layout:`vertical`,onSubmitSuccess:b},{default:r(()=>[c(l,{field:`username`,label:`用户名`},{default:r(()=>[c(o,{modelValue:y.username,"onUpdate:modelValue":a[0]||=e=>y.username=e,placeholder:`请输入用户名`},null,8,[`modelValue`])]),_:1}),c(l,{field:`password`,label:`密码`},{default:r(()=>[c(u,{modelValue:y.password,"onUpdate:modelValue":a[1]||=e=>y.password=e,placeholder:`请输入密码`},null,8,[`modelValue`])]),_:1}),c(d,{type:`primary`,long:``,loading:v.value,onClick:b},{default:r(()=>[...a[2]||=[i(`登录`,-1)]]),_:1},8,[`loading`])]),_:1},8,[`model`])]),_:1})])}}});export{g as default};
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/dynamicAdminRoutes-nUdod0Fq.js","assets/dynamicAdminRoutes-CHR5Fw1q.js","assets/preload-helper-BIjWqNH5.js","assets/http-LCi9aT1G.js","assets/axios-CiYFffbI.js","assets/runtime-core.esm-bundler-CnFWH3R5.js"])))=>i.map(i=>d[i]);
import{n as e}from"./axios-CiYFffbI.js";import{I as t,V as n,Y as r,_ as i,it as a,nt as o,p as s,v as c,y as l}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{n as u,t as d}from"./http-LCi9aT1G.js";import{t as f}from"./preload-helper-BIjWqNH5.js";import{c as p,s as m}from"./index-B7ZWoF_u.js";var h={style:{height:`100vh`,display:`grid`,"place-items":`center`,background:`var(--color-fill-2)`}},g=l({__name:`Login`,setup(l){let g=p(),_=m(),v=a(!1),y=o({username:`admin`,password:`admin123456`});async function b(){v.value=!0;try{let{data:t}=await u.post(`/auth/login`,y);localStorage.setItem(d,t.token),e.success(`登录成功`);let{getFirstMenuPath:n}=await f(async()=>{let{getFirstMenuPath:e}=await import(`./dynamicAdminRoutes-nUdod0Fq.js`);return{getFirstMenuPath:e}},__vite__mapDeps([0,1,2,3,4,5])),r=typeof _.query.redirect==`string`?_.query.redirect.trim():``,i=r&&r.startsWith(`/`)&&!r.startsWith(`//`)?r:await n();g.replace(i)}catch(t){e.error(t?.response?.data?.message??`登录失败`)}finally{v.value=!1}}return(e,a)=>{let o=n(`a-input`),l=n(`a-form-item`),u=n(`a-input-password`),d=n(`a-button`),f=n(`a-form`),p=n(`a-card`);return t(),s(`div`,h,[c(p,{title:`苏州市科普场馆地图后台管理系统登录`,style:{width:`380px`}},{default:r(()=>[c(f,{model:y,layout:`vertical`,onSubmitSuccess:b},{default:r(()=>[c(l,{field:`username`,label:`用户名`},{default:r(()=>[c(o,{modelValue:y.username,"onUpdate:modelValue":a[0]||=e=>y.username=e,placeholder:`请输入用户名`},null,8,[`modelValue`])]),_:1}),c(l,{field:`password`,label:`密码`},{default:r(()=>[c(u,{modelValue:y.password,"onUpdate:modelValue":a[1]||=e=>y.password=e,placeholder:`请输入密码`},null,8,[`modelValue`])]),_:1}),c(d,{type:`primary`,long:``,loading:v.value,onClick:b},{default:r(()=>[...a[2]||=[i(`登录`,-1)]]),_:1},8,[`loading`])]),_:1},8,[`model`])]),_:1})])}}});export{g as default};

@ -1 +1 @@
import{I as e,V as t,Y as n,_ as r,d as i,v as a}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{u as o}from"./index-Di-9WPzB.js";var s={};function c(o,s){let c=t(`a-alert`),l=t(`a-descriptions-item`),u=t(`a-descriptions`),d=t(`a-card`);return e(),i(d,{title:`系统设置 / 地图与第三方配置`},{default:n(()=>[a(c,{type:`info`,style:{"margin-bottom":`12px`}},{default:n(()=>[...s[0]||=[r(` 当前后台场馆地图选点已使用腾讯地图,坐标统一为 GCJ-02火星坐标系`,-1)]]),_:1}),a(u,{column:1,bordered:``},{default:n(()=>[a(l,{label:`前端地图Key`},{default:n(()=>[...s[1]||=[r(" 在 `code/szkp-map-web/.env` 配置 `VITE_TENCENT_MAP_KEY=你的腾讯地图JS_KEY` ",-1)]]),_:1}),a(l,{label:`地图外链 referer`},{default:n(()=>[...s[2]||=[r(" 在 `code/szkp-map-web/.env` 配置 `VITE_TENCENT_MAP_REFERER=你的应用标识` ",-1)]]),_:1}),a(l,{label:`后端服务Key`},{default:n(()=>[...s[3]||=[r(" 在 `code/szkp-map-service/.env` 配置 `TENCENT_MAP_SERVER_KEY=你的腾讯地图WebService_KEY` ",-1)]]),_:1})]),_:1})]),_:1})}var l=o(s,[[`render`,c]]);export{l as default};
import{I as e,V as t,Y as n,_ as r,d as i,v as a}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{u as o}from"./index-B7ZWoF_u.js";var s={};function c(o,s){let c=t(`a-alert`),l=t(`a-descriptions-item`),u=t(`a-descriptions`),d=t(`a-card`);return e(),i(d,{title:`系统设置 / 地图与第三方配置`},{default:n(()=>[a(c,{type:`info`,style:{"margin-bottom":`12px`}},{default:n(()=>[...s[0]||=[r(` 当前后台场馆地图选点已使用腾讯地图,坐标统一为 GCJ-02火星坐标系`,-1)]]),_:1}),a(u,{column:1,bordered:``},{default:n(()=>[a(l,{label:`前端地图Key`},{default:n(()=>[...s[1]||=[r(" 在 `code/szkp-map-web/.env` 配置 `VITE_TENCENT_MAP_KEY=你的腾讯地图JS_KEY` ",-1)]]),_:1}),a(l,{label:`地图外链 referer`},{default:n(()=>[...s[2]||=[r(" 在 `code/szkp-map-web/.env` 配置 `VITE_TENCENT_MAP_REFERER=你的应用标识` ",-1)]]),_:1}),a(l,{label:`后端服务Key`},{default:n(()=>[...s[3]||=[r(" 在 `code/szkp-map-service/.env` 配置 `TENCENT_MAP_SERVER_KEY=你的腾讯地图WebService_KEY` ",-1)]]),_:1})]),_:1})]),_:1})}var l=o(s,[[`render`,c]]);export{l as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1,2 +1,2 @@
import{n as e}from"./axios-CiYFffbI.js";import{I as t,N as n,O as r,V as i,Y as a,_ as o,d as s,f as c,i as l,it as u,kt as d,l as f,p,q as m,u as h,ut as g,v as _,y as v,z as y}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{n as b}from"./http-LCi9aT1G.js";import{u as x}from"./index-Di-9WPzB.js";import{t as S}from"./datetime-DLy52ZIc.js";var C={key:0,class:`system-logs-pre`},w={key:1,class:`system-logs-empty`},T=x(v({__name:`SystemLogs`,setup(v){let x=u(!1),T=u(``),E=u(400),D=u(``),O=u([]),k=u([]),A=u(null),j=u(null),M=u(!1),N=f(()=>{let e=T.value.trim().toLowerCase();return e?k.value.filter(t=>t.toLowerCase().includes(e)):k.value});function P(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(2)} MB`}async function F(){await r();let e=j.value;e&&(e.scrollTop=e.scrollHeight)}async function I(){x.value=!0,A.value=null;try{let{data:e}=await b.get(`/system-logs`,{params:{file:D.value||void 0,lines:E.value}});O.value=e.files??[],M.value=!0,D.value=e.file??``,await r(),M.value=!1,k.value=e.lines??[],A.value=e.error??null,await F()}catch(t){e.error(t?.response?.data?.message??`加载系统日志失败`),k.value=[],M.value=!1}finally{x.value=!1}}return m(D,()=>{M.value||I()}),n(I),(e,n)=>{let r=i(`a-alert`),u=i(`a-option`),f=i(`a-select`),m=i(`a-input-number`),v=i(`a-input`),b=i(`a-button`),k=i(`a-space`),M=i(`a-spin`),F=i(`a-card`);return t(),s(F,{title:`系统设置 / 系统日志`},{default:a(()=>[_(r,{type:`warning`,style:{"margin-bottom":`12px`}},{default:a(()=>[...n[3]||=[o(` 展示服务器 `,-1),h(`code`,null,`storage/logs`,-1),o(` 下 Laravel 应用日志文件尾部(按行)。仅超级管理员可访问;请勿将日志内容外传。 `,-1)]]),_:1}),_(k,{wrap:``,size:12,style:{"margin-bottom":`12px`}},{default:a(()=>[n[5]||=h(`span`,{class:`system-logs-tool-label`},`日志文件`,-1),_(f,{modelValue:D.value,"onUpdate:modelValue":n[0]||=e=>D.value=e,"allow-clear":``,placeholder:`选择文件`,style:{width:`260px`},loading:x.value},{default:a(()=>[(t(!0),p(l,null,y(O.value,e=>(t(),s(u,{key:e.name,value:e.name},{default:a(()=>[o(d(e.name)+``+d(P(e.size_bytes))+``+d(g(S)(e.modified_at))+` `,1)]),_:2},1032,[`value`]))),128))]),_:1},8,[`modelValue`,`loading`]),n[6]||=h(`span`,{class:`system-logs-tool-label`},`尾部行数`,-1),_(m,{modelValue:E.value,"onUpdate:modelValue":n[1]||=e=>E.value=e,min:50,max:5e3,step:50,style:{width:`120px`}},null,8,[`modelValue`]),_(v,{modelValue:T.value,"onUpdate:modelValue":n[2]||=e=>T.value=e,placeholder:`在行内筛选关键字`,"allow-clear":``,style:{width:`220px`}},null,8,[`modelValue`]),_(b,{type:`primary`,loading:x.value,onClick:I},{default:a(()=>[...n[4]||=[o(`刷新`,-1)]]),_:1},8,[`loading`])]),_:1}),A.value?(t(),s(r,{key:0,type:`error`,style:{"margin-bottom":`8px`}},{default:a(()=>[o(d(A.value),1)]),_:1})):c(``,!0),h(`div`,{ref_key:`scrollEl`,ref:j,class:`system-logs-panel`,tabindex:`0`,role:`region`,"aria-label":`日志内容`},[_(M,{loading:x.value,style:{display:`block`,"min-height":`120px`}},{default:a(()=>[N.value.length?(t(),p(`pre`,C,d(N.value.join(`
import{n as e}from"./axios-CiYFffbI.js";import{I as t,N as n,O as r,V as i,Y as a,_ as o,d as s,f as c,i as l,it as u,kt as d,l as f,p,q as m,u as h,ut as g,v as _,y as v,z as y}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{n as b}from"./http-LCi9aT1G.js";import{u as x}from"./index-B7ZWoF_u.js";import{t as S}from"./datetime-DLy52ZIc.js";var C={key:0,class:`system-logs-pre`},w={key:1,class:`system-logs-empty`},T=x(v({__name:`SystemLogs`,setup(v){let x=u(!1),T=u(``),E=u(400),D=u(``),O=u([]),k=u([]),A=u(null),j=u(null),M=u(!1),N=f(()=>{let e=T.value.trim().toLowerCase();return e?k.value.filter(t=>t.toLowerCase().includes(e)):k.value});function P(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(2)} MB`}async function F(){await r();let e=j.value;e&&(e.scrollTop=e.scrollHeight)}async function I(){x.value=!0,A.value=null;try{let{data:e}=await b.get(`/system-logs`,{params:{file:D.value||void 0,lines:E.value}});O.value=e.files??[],M.value=!0,D.value=e.file??``,await r(),M.value=!1,k.value=e.lines??[],A.value=e.error??null,await F()}catch(t){e.error(t?.response?.data?.message??`加载系统日志失败`),k.value=[],M.value=!1}finally{x.value=!1}}return m(D,()=>{M.value||I()}),n(I),(e,n)=>{let r=i(`a-alert`),u=i(`a-option`),f=i(`a-select`),m=i(`a-input-number`),v=i(`a-input`),b=i(`a-button`),k=i(`a-space`),M=i(`a-spin`),F=i(`a-card`);return t(),s(F,{title:`系统设置 / 系统日志`},{default:a(()=>[_(r,{type:`warning`,style:{"margin-bottom":`12px`}},{default:a(()=>[...n[3]||=[o(` 展示服务器 `,-1),h(`code`,null,`storage/logs`,-1),o(` 下 Laravel 应用日志文件尾部(按行)。仅超级管理员可访问;请勿将日志内容外传。 `,-1)]]),_:1}),_(k,{wrap:``,size:12,style:{"margin-bottom":`12px`}},{default:a(()=>[n[5]||=h(`span`,{class:`system-logs-tool-label`},`日志文件`,-1),_(f,{modelValue:D.value,"onUpdate:modelValue":n[0]||=e=>D.value=e,"allow-clear":``,placeholder:`选择文件`,style:{width:`260px`},loading:x.value},{default:a(()=>[(t(!0),p(l,null,y(O.value,e=>(t(),s(u,{key:e.name,value:e.name},{default:a(()=>[o(d(e.name)+``+d(P(e.size_bytes))+``+d(g(S)(e.modified_at))+` `,1)]),_:2},1032,[`value`]))),128))]),_:1},8,[`modelValue`,`loading`]),n[6]||=h(`span`,{class:`system-logs-tool-label`},`尾部行数`,-1),_(m,{modelValue:E.value,"onUpdate:modelValue":n[1]||=e=>E.value=e,min:50,max:5e3,step:50,style:{width:`120px`}},null,8,[`modelValue`]),_(v,{modelValue:T.value,"onUpdate:modelValue":n[2]||=e=>T.value=e,placeholder:`在行内筛选关键字`,"allow-clear":``,style:{width:`220px`}},null,8,[`modelValue`]),_(b,{type:`primary`,loading:x.value,onClick:I},{default:a(()=>[...n[4]||=[o(`刷新`,-1)]]),_:1},8,[`loading`])]),_:1}),A.value?(t(),s(r,{key:0,type:`error`,style:{"margin-bottom":`8px`}},{default:a(()=>[o(d(A.value),1)]),_:1})):c(``,!0),h(`div`,{ref_key:`scrollEl`,ref:j,class:`system-logs-panel`,tabindex:`0`,role:`region`,"aria-label":`日志内容`},[_(M,{loading:x.value,style:{display:`block`,"min-height":`120px`}},{default:a(()=>[N.value.length?(t(),p(`pre`,C,d(N.value.join(`
`)),1)):x.value?c(``,!0):(t(),p(`div`,w,`暂无日志内容或无权限读取文件`))]),_:1},8,[`loading`])],512)]),_:1})}}}),[[`__scopeId`,`data-v-00758b3f`]]);export{T as default};

@ -1 +1 @@
import{n as e}from"./axios-CiYFffbI.js";import{I as t,N as n,V as r,Y as i,_ as a,d as o,it as s,kt as c,nt as l,u,ut as d,v as f,y as p}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{n as m}from"./http-LCi9aT1G.js";import{u as h}from"./index-Di-9WPzB.js";import{t as g}from"./listTableRowIndex-Bl-nc9Qt.js";import{n as _,t as v}from"./datetime-DLy52ZIc.js";import{t as y}from"./bookingType-sDQIPutU.js";import{t as b}from"./reservationStatus-DPnogIlu.js";var x={class:`verify-list-toolbar`},S=1780,C=h(p({__name:`TicketGrabVerify`,setup(p){let h=s(!1),C=s([]),w=s(``),T=s(!1),E=s(`all`),D=s(``),O=s([]),k=l({current:1,pageSize:10});async function A(){h.value=!0;try{let e={status:E.value,keyword:D.value||void 0,reservation_kind:`ticket_grab`};O.value?.length===2&&(e.start_date=O.value[0],e.end_date=O.value[1],e.date_field=`entry_date`);let{data:t}=await m.get(`/reservations`,{params:e});C.value=t,k.current=1}catch(t){e.error(t?.response?.data?.message??`加载预约列表失败`)}finally{h.value=!1}}function j(){A()}function M(){E.value=`all`,D.value=``,O.value=[],A()}async function N(){if(!w.value){e.warning(`请输入二维码 token`);return}T.value=!0;try{await m.post(`/reservations/verify`,{qr_token:w.value}),e.success(`核销成功`),w.value=``,await A()}catch(t){e.error(t?.response?.data?.message??`核销失败`)}finally{T.value=!1}}return n(A),(e,n)=>{let s=r(`a-alert`),l=r(`a-input`),p=r(`a-button`),m=r(`a-space`),P=r(`a-radio`),F=r(`a-radio-group`),I=r(`a-range-picker`),L=r(`a-table-column`),R=r(`a-tag`),z=r(`a-table`),B=r(`a-card`);return t(),o(B,{title:`抢票管理 / 抢票核销`,bordered:!1},{default:i(()=>[f(m,{direction:`vertical`,fill:``},{default:i(()=>[f(s,null,{default:i(()=>[...n[5]||=[a(`抢票预约按「入馆日」为当天方可核销。输入二维码 token 核销。`,-1)]]),_:1}),f(m,{wrap:``,size:12},{default:i(()=>[f(l,{modelValue:w.value,"onUpdate:modelValue":n[0]||=e=>w.value=e,style:{width:`min(100%, 420px)`},placeholder:`请输入二维码 token`,"allow-clear":``},null,8,[`modelValue`]),f(p,{type:`primary`,loading:T.value,onClick:N},{default:i(()=>[...n[6]||=[a(`立即核销`,-1)]]),_:1},8,[`loading`])]),_:1}),u(`div`,x,[f(m,{wrap:``,size:12},{default:i(()=>[f(F,{modelValue:E.value,"onUpdate:modelValue":n[1]||=e=>E.value=e,type:`button`,size:`small`,onChange:A},{default:i(()=>[f(P,{value:`all`},{default:i(()=>[...n[7]||=[a(`全部`,-1)]]),_:1}),f(P,{value:`pending`},{default:i(()=>[...n[8]||=[a(`待核销`,-1)]]),_:1}),f(P,{value:`verified`},{default:i(()=>[...n[9]||=[a(`已核销`,-1)]]),_:1}),f(P,{value:`cancelled`},{default:i(()=>[...n[10]||=[a(`已取消`,-1)]]),_:1}),f(P,{value:`expired`},{default:i(()=>[...n[11]||=[a(`已过期`,-1)]]),_:1})]),_:1},8,[`modelValue`]),f(l,{modelValue:D.value,"onUpdate:modelValue":n[2]||=e=>D.value=e,placeholder:`姓名 / 手机 / 身份证 / token`,"allow-clear":``,style:{width:`240px`}},null,8,[`modelValue`]),f(I,{modelValue:O.value,"onUpdate:modelValue":n[3]||=e=>O.value=e,style:{width:`260px`}},null,8,[`modelValue`]),f(p,{type:`primary`,onClick:j},{default:i(()=>[...n[12]||=[a(`查询`,-1)]]),_:1}),f(p,{onClick:M},{default:i(()=>[...n[13]||=[a(`重置`,-1)]]),_:1}),f(p,{onClick:A},{default:i(()=>[...n[14]||=[a(`刷新列表`,-1)]]),_:1})]),_:1})]),f(z,{class:`list-data-table verify-table`,scroll:{x:S},data:C.value,loading:h.value,"row-key":`id`,pagination:{current:k.current,pageSize:k.pageSize,total:C.value.length,showTotal:!0},onPageChange:n[4]||=e=>k.current=e},{columns:i(()=>[f(L,{title:``,width:50,ellipsis:!0,tooltip:!0},{cell:i(({rowIndex:e})=>[a(c(d(g)(e,k.current,k.pageSize)),1)]),_:1}),f(L,{title:`预约场次`,width:220,ellipsis:!0,tooltip:!0},{cell:i(({record:e})=>[a(c(e.ticket_grab_event?.title??`-`),1)]),_:1}),f(L,{title:`场馆`,width:180,ellipsis:!0,tooltip:!0},{cell:i(({record:e})=>[a(c(e.venue?.name??`-`),1)]),_:1}),f(L,{title:`姓名`,"data-index":`visitor_name`,width:100}),f(L,{title:`身份证`,"data-index":`id_card`,width:180,ellipsis:!0,tooltip:!0}),f(L,{title:`手机号`,"data-index":`visitor_phone`,width:120}),f(L,{title:`预约类型`,width:100},{cell:i(({record:e})=>[a(c(d(y)(e.booking_type,e.ticket_count)),1)]),_:1}),f(L,{title:`场次时间`,width:140},{cell:i(({record:e})=>[a(c(e.entry_date?d(_)(String(e.entry_date)):`-`),1)]),_:1}),f(L,{title:`状态`,width:100},{cell:i(({record:e})=>[f(R,{color:e.status===`verified`?`green`:e.status===`pending`?`arcoblue`:e.status===`expired`?`orange`:`gray`},{default:i(()=>[a(c(d(b)(e.status)),1)]),_:2},1032,[`color`])]),_:1}),f(L,{title:`预约时间`,width:175},{cell:i(({record:e})=>[a(c(d(v)(e.created_at)),1)]),_:1}),f(L,{title:`核销时间`,width:175},{cell:i(({record:e})=>[a(c(d(v)(e.verified_at)),1)]),_:1}),f(L,{title:`二维码 token`,"data-index":`qr_token`,width:200,ellipsis:!0,tooltip:!0,fixed:`right`})]),_:1},8,[`scroll`,`data`,`loading`,`pagination`])]),_:1})]),_:1})}}}),[[`__scopeId`,`data-v-f1a484a3`]]);export{C as default};
import{n as e}from"./axios-CiYFffbI.js";import{I as t,N as n,V as r,Y as i,_ as a,d as o,it as s,kt as c,nt as l,u,ut as d,v as f,y as p}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{n as m}from"./http-LCi9aT1G.js";import{u as h}from"./index-B7ZWoF_u.js";import{t as g}from"./listTableRowIndex-Bl-nc9Qt.js";import{n as _,t as v}from"./datetime-DLy52ZIc.js";import{t as y}from"./bookingType-sDQIPutU.js";import{t as b}from"./reservationStatus-DPnogIlu.js";var x={class:`verify-list-toolbar`},S=1780,C=h(p({__name:`TicketGrabVerify`,setup(p){let h=s(!1),C=s([]),w=s(``),T=s(!1),E=s(`all`),D=s(``),O=s([]),k=l({current:1,pageSize:10});async function A(){h.value=!0;try{let e={status:E.value,keyword:D.value||void 0,reservation_kind:`ticket_grab`};O.value?.length===2&&(e.start_date=O.value[0],e.end_date=O.value[1],e.date_field=`entry_date`);let{data:t}=await m.get(`/reservations`,{params:e});C.value=t,k.current=1}catch(t){e.error(t?.response?.data?.message??`加载预约列表失败`)}finally{h.value=!1}}function j(){A()}function M(){E.value=`all`,D.value=``,O.value=[],A()}async function N(){if(!w.value){e.warning(`请输入二维码 token`);return}T.value=!0;try{await m.post(`/reservations/verify`,{qr_token:w.value}),e.success(`核销成功`),w.value=``,await A()}catch(t){e.error(t?.response?.data?.message??`核销失败`)}finally{T.value=!1}}return n(A),(e,n)=>{let s=r(`a-alert`),l=r(`a-input`),p=r(`a-button`),m=r(`a-space`),P=r(`a-radio`),F=r(`a-radio-group`),I=r(`a-range-picker`),L=r(`a-table-column`),R=r(`a-tag`),z=r(`a-table`),B=r(`a-card`);return t(),o(B,{title:`抢票管理 / 抢票核销`,bordered:!1},{default:i(()=>[f(m,{direction:`vertical`,fill:``},{default:i(()=>[f(s,null,{default:i(()=>[...n[5]||=[a(`抢票预约按「入馆日」为当天方可核销。输入二维码 token 核销。`,-1)]]),_:1}),f(m,{wrap:``,size:12},{default:i(()=>[f(l,{modelValue:w.value,"onUpdate:modelValue":n[0]||=e=>w.value=e,style:{width:`min(100%, 420px)`},placeholder:`请输入二维码 token`,"allow-clear":``},null,8,[`modelValue`]),f(p,{type:`primary`,loading:T.value,onClick:N},{default:i(()=>[...n[6]||=[a(`立即核销`,-1)]]),_:1},8,[`loading`])]),_:1}),u(`div`,x,[f(m,{wrap:``,size:12},{default:i(()=>[f(F,{modelValue:E.value,"onUpdate:modelValue":n[1]||=e=>E.value=e,type:`button`,size:`small`,onChange:A},{default:i(()=>[f(P,{value:`all`},{default:i(()=>[...n[7]||=[a(`全部`,-1)]]),_:1}),f(P,{value:`pending`},{default:i(()=>[...n[8]||=[a(`待核销`,-1)]]),_:1}),f(P,{value:`verified`},{default:i(()=>[...n[9]||=[a(`已核销`,-1)]]),_:1}),f(P,{value:`cancelled`},{default:i(()=>[...n[10]||=[a(`已取消`,-1)]]),_:1}),f(P,{value:`expired`},{default:i(()=>[...n[11]||=[a(`已过期`,-1)]]),_:1})]),_:1},8,[`modelValue`]),f(l,{modelValue:D.value,"onUpdate:modelValue":n[2]||=e=>D.value=e,placeholder:`姓名 / 手机 / 身份证 / token`,"allow-clear":``,style:{width:`240px`}},null,8,[`modelValue`]),f(I,{modelValue:O.value,"onUpdate:modelValue":n[3]||=e=>O.value=e,style:{width:`260px`}},null,8,[`modelValue`]),f(p,{type:`primary`,onClick:j},{default:i(()=>[...n[12]||=[a(`查询`,-1)]]),_:1}),f(p,{onClick:M},{default:i(()=>[...n[13]||=[a(`重置`,-1)]]),_:1}),f(p,{onClick:A},{default:i(()=>[...n[14]||=[a(`刷新列表`,-1)]]),_:1})]),_:1})]),f(z,{class:`list-data-table verify-table`,scroll:{x:S},data:C.value,loading:h.value,"row-key":`id`,pagination:{current:k.current,pageSize:k.pageSize,total:C.value.length,showTotal:!0},onPageChange:n[4]||=e=>k.current=e},{columns:i(()=>[f(L,{title:``,width:50,ellipsis:!0,tooltip:!0},{cell:i(({rowIndex:e})=>[a(c(d(g)(e,k.current,k.pageSize)),1)]),_:1}),f(L,{title:`预约场次`,width:220,ellipsis:!0,tooltip:!0},{cell:i(({record:e})=>[a(c(e.ticket_grab_event?.title??`-`),1)]),_:1}),f(L,{title:`场馆`,width:180,ellipsis:!0,tooltip:!0},{cell:i(({record:e})=>[a(c(e.venue?.name??`-`),1)]),_:1}),f(L,{title:`姓名`,"data-index":`visitor_name`,width:100}),f(L,{title:`身份证`,"data-index":`id_card`,width:180,ellipsis:!0,tooltip:!0}),f(L,{title:`手机号`,"data-index":`visitor_phone`,width:120}),f(L,{title:`预约类型`,width:100},{cell:i(({record:e})=>[a(c(d(y)(e.booking_type,e.ticket_count)),1)]),_:1}),f(L,{title:`场次时间`,width:140},{cell:i(({record:e})=>[a(c(e.entry_date?d(_)(String(e.entry_date)):`-`),1)]),_:1}),f(L,{title:`状态`,width:100},{cell:i(({record:e})=>[f(R,{color:e.status===`verified`?`green`:e.status===`pending`?`arcoblue`:e.status===`expired`?`orange`:`gray`},{default:i(()=>[a(c(d(b)(e.status)),1)]),_:2},1032,[`color`])]),_:1}),f(L,{title:`预约时间`,width:175},{cell:i(({record:e})=>[a(c(d(v)(e.created_at)),1)]),_:1}),f(L,{title:`核销时间`,width:175},{cell:i(({record:e})=>[a(c(d(v)(e.verified_at)),1)]),_:1}),f(L,{title:`二维码 token`,"data-index":`qr_token`,width:200,ellipsis:!0,tooltip:!0,fixed:`right`})]),_:1},8,[`scroll`,`data`,`loading`,`pagination`])]),_:1})]),_:1})}}}),[[`__scopeId`,`data-v-f1a484a3`]]);export{C as default};

File diff suppressed because one or more lines are too long

@ -1 +1 @@
import{n as e}from"./axios-CiYFffbI.js";import{I as t,N as n,V as r,Y as i,_ as a,i as o,it as s,kt as c,nt as l,p as u,u as d,v as f,y as p}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{c as m,s as h,u as g}from"./index-Di-9WPzB.js";import{i as _,n as v,o as y,r as b,t as x}from"./h5Http-CIzJQiXt.js";var S={class:`m-verify-page`},C={class:`m-verify-hero`},w={class:`m-verify-sub`},T={class:`m-verify-card`},E={key:0,class:`m-verify-tip`},D={key:1,class:`m-verify-tip`},O=g(p({__name:`VerifyLogin`,setup(p){let g=m(),O=h(),k=s(!1),A=s(``),j=s(``),M=s(``),N=s(!1),P=l({username:``,password:``});function F(e){let t=O.query[e];return(typeof t==`string`?t:Array.isArray(t)?String(t[0]??``):``).trim()}async function I(){let e=A.value,t=j.value;if(e.length>=6){N.value=!0;try{let{data:t}=await y.get(`/verify-portal/preview`,{params:{portal_code:e}});M.value=String(t?.event_title||``).trim()||``}catch{M.value=``}finally{N.value=!1}return}if(t.length>=32){N.value=!0;try{let{data:e}=await y.get(`/verify-portal/preview`,{params:{portal_token:t}});M.value=String(e?.event_title||``).trim()||``}catch{M.value=``}finally{N.value=!1}return}M.value=``}n(()=>{let e=F(`v`).toLowerCase(),t=F(`portal`);e.length>=6?(A.value=e,j.value=``,localStorage.setItem(b,e),localStorage.removeItem(_)):t.length>=32?(j.value=t,A.value=``,localStorage.setItem(_,t),localStorage.removeItem(b)):(A.value=localStorage.getItem(`szkp_verify_portal_code`)||``,j.value=localStorage.getItem(`szkp_verify_portal_legacy_token`)||``),I()});function L(){return O.path.startsWith(`/m/`)?`/m/verify`:`/h5/verify/scan`}async function R(){k.value=!0;try{if(A.value.length>=6){let{data:t}=await y.post(`/verify-portal/login`,{portal_code:A.value,username:P.username.trim(),password:P.password});localStorage.setItem(x,t.token),localStorage.setItem(`${x}_saved_at`,String(Date.now())),localStorage.setItem(v,`portal`),e.success(`登录成功`),g.replace(L());return}if(j.value.length>=32){let{data:t}=await y.post(`/verify-portal/login`,{portal_token:j.value,username:P.username.trim(),password:P.password});localStorage.setItem(x,t.token),localStorage.setItem(`${x}_saved_at`,String(Date.now())),localStorage.setItem(v,`portal`),e.success(`登录成功`),g.replace(L());return}let{data:t}=await y.post(`/auth/login`,{...P,client:`h5_verify`});localStorage.setItem(x,t.token),localStorage.setItem(`${x}_saved_at`,String(Date.now())),localStorage.setItem(v,`admin`),localStorage.removeItem(b),localStorage.removeItem(_),e.success(`登录成功`),g.replace(L())}catch(t){e.error(t?.response?.data?.message??`登录失败`)}finally{k.value=!1}}return(e,n)=>{let s=r(`a-input`),l=r(`a-form-item`),p=r(`a-input-password`),m=r(`a-button`),h=r(`a-form`);return t(),u(`div`,S,[d(`div`,C,[n[2]||=d(`div`,{class:`m-verify-title`},`核销入口`,-1),d(`div`,w,[A.value.length>=6||j.value.length>=32?(t(),u(o,{key:0},[a(c(N.value?`活动信息加载中…`:M.value||``),1)],64)):(t(),u(o,{key:1},[a(`超级管理员核销登录`)],64))])]),d(`div`,T,[f(h,{model:P,layout:`vertical`,onSubmitSuccess:R},{default:i(()=>[f(l,{label:`用户名`},{default:i(()=>[f(s,{modelValue:P.username,"onUpdate:modelValue":n[0]||=e=>P.username=e,placeholder:`请输入账号`,size:`large`,"allow-clear":``},null,8,[`modelValue`])]),_:1}),f(l,{label:`密码`},{default:i(()=>[f(p,{modelValue:P.password,"onUpdate:modelValue":n[1]||=e=>P.password=e,placeholder:`请输入密码`,size:`large`,"allow-clear":``},null,8,[`modelValue`])]),_:1}),f(m,{type:`primary`,long:``,size:`large`,loading:k.value,onClick:R},{default:i(()=>[...n[3]||=[a(`登录`,-1)]]),_:1},8,[`loading`])]),_:1},8,[`model`]),A.value.length>=6||j.value.length>=32?(t(),u(`p`,E,` 活动专用核销登录(活动结束后账号失效) `)):(t(),u(`p`,D,[...n[4]||=[a(``,-1),d(`strong`,null,`超级管理员`,-1),a(`可使用后台账号登录本页。场馆工作人员请打开管理员提供的带 `,-1),d(`strong`,null,`?v=短码`,-1),a(` 的专用链接。 `,-1)]])),n[5]||=d(`p`,{class:`m-verify-tip`},`登录状态将保持较长时间;若已失效会自动回到本页。`,-1)])])}}}),[[`__scopeId`,`data-v-54556c3e`]]);export{O as default};
import{n as e}from"./axios-CiYFffbI.js";import{I as t,N as n,V as r,Y as i,_ as a,i as o,it as s,kt as c,nt as l,p as u,u as d,v as f,y as p}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{c as m,s as h,u as g}from"./index-B7ZWoF_u.js";import{i as _,n as v,o as y,r as b,t as x}from"./h5Http-CIzJQiXt.js";var S={class:`m-verify-page`},C={class:`m-verify-hero`},w={class:`m-verify-sub`},T={class:`m-verify-card`},E={key:0,class:`m-verify-tip`},D={key:1,class:`m-verify-tip`},O=g(p({__name:`VerifyLogin`,setup(p){let g=m(),O=h(),k=s(!1),A=s(``),j=s(``),M=s(``),N=s(!1),P=l({username:``,password:``});function F(e){let t=O.query[e];return(typeof t==`string`?t:Array.isArray(t)?String(t[0]??``):``).trim()}async function I(){let e=A.value,t=j.value;if(e.length>=6){N.value=!0;try{let{data:t}=await y.get(`/verify-portal/preview`,{params:{portal_code:e}});M.value=String(t?.event_title||``).trim()||``}catch{M.value=``}finally{N.value=!1}return}if(t.length>=32){N.value=!0;try{let{data:e}=await y.get(`/verify-portal/preview`,{params:{portal_token:t}});M.value=String(e?.event_title||``).trim()||``}catch{M.value=``}finally{N.value=!1}return}M.value=``}n(()=>{let e=F(`v`).toLowerCase(),t=F(`portal`);e.length>=6?(A.value=e,j.value=``,localStorage.setItem(b,e),localStorage.removeItem(_)):t.length>=32?(j.value=t,A.value=``,localStorage.setItem(_,t),localStorage.removeItem(b)):(A.value=localStorage.getItem(`szkp_verify_portal_code`)||``,j.value=localStorage.getItem(`szkp_verify_portal_legacy_token`)||``),I()});function L(){return O.path.startsWith(`/m/`)?`/m/verify`:`/h5/verify/scan`}async function R(){k.value=!0;try{if(A.value.length>=6){let{data:t}=await y.post(`/verify-portal/login`,{portal_code:A.value,username:P.username.trim(),password:P.password});localStorage.setItem(x,t.token),localStorage.setItem(`${x}_saved_at`,String(Date.now())),localStorage.setItem(v,`portal`),e.success(`登录成功`),g.replace(L());return}if(j.value.length>=32){let{data:t}=await y.post(`/verify-portal/login`,{portal_token:j.value,username:P.username.trim(),password:P.password});localStorage.setItem(x,t.token),localStorage.setItem(`${x}_saved_at`,String(Date.now())),localStorage.setItem(v,`portal`),e.success(`登录成功`),g.replace(L());return}let{data:t}=await y.post(`/auth/login`,{...P,client:`h5_verify`});localStorage.setItem(x,t.token),localStorage.setItem(`${x}_saved_at`,String(Date.now())),localStorage.setItem(v,`admin`),localStorage.removeItem(b),localStorage.removeItem(_),e.success(`登录成功`),g.replace(L())}catch(t){e.error(t?.response?.data?.message??`登录失败`)}finally{k.value=!1}}return(e,n)=>{let s=r(`a-input`),l=r(`a-form-item`),p=r(`a-input-password`),m=r(`a-button`),h=r(`a-form`);return t(),u(`div`,S,[d(`div`,C,[n[2]||=d(`div`,{class:`m-verify-title`},`核销入口`,-1),d(`div`,w,[A.value.length>=6||j.value.length>=32?(t(),u(o,{key:0},[a(c(N.value?`活动信息加载中…`:M.value||``),1)],64)):(t(),u(o,{key:1},[a(`超级管理员核销登录`)],64))])]),d(`div`,T,[f(h,{model:P,layout:`vertical`,onSubmitSuccess:R},{default:i(()=>[f(l,{label:`用户名`},{default:i(()=>[f(s,{modelValue:P.username,"onUpdate:modelValue":n[0]||=e=>P.username=e,placeholder:`请输入账号`,size:`large`,"allow-clear":``},null,8,[`modelValue`])]),_:1}),f(l,{label:`密码`},{default:i(()=>[f(p,{modelValue:P.password,"onUpdate:modelValue":n[1]||=e=>P.password=e,placeholder:`请输入密码`,size:`large`,"allow-clear":``},null,8,[`modelValue`])]),_:1}),f(m,{type:`primary`,long:``,size:`large`,loading:k.value,onClick:R},{default:i(()=>[...n[3]||=[a(`登录`,-1)]]),_:1},8,[`loading`])]),_:1},8,[`model`]),A.value.length>=6||j.value.length>=32?(t(),u(`p`,E,` 活动专用核销登录(活动结束后账号失效) `)):(t(),u(`p`,D,[...n[4]||=[a(``,-1),d(`strong`,null,`超级管理员`,-1),a(`可使用后台账号登录本页。场馆工作人员请打开管理员提供的带 `,-1),d(`strong`,null,`?v=短码`,-1),a(` 的专用链接。 `,-1)]])),n[5]||=d(`p`,{class:`m-verify-tip`},`登录状态将保持较长时间;若已失效会自动回到本页。`,-1)])])}}}),[[`__scopeId`,`data-v-54556c3e`]]);export{O as default};

@ -1,2 +1,2 @@
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Dashboard-vqjXeddj.js","assets/index-Di-9WPzB.js","assets/axios-CiYFffbI.js","assets/runtime-core.esm-bundler-CnFWH3R5.js","assets/preload-helper-BIjWqNH5.js","assets/http-LCi9aT1G.js","assets/index-C6I69YBI.css","assets/Dashboard-D_6tkjXe.css","assets/VenueList-TI3jsAHB.js","assets/RichEditorField-CHQzPc9O.js","assets/RichEditorField-BSoIk7uU.css","assets/listTableRowIndex-Bl-nc9Qt.js","assets/mediaUrl-CPV6u7br.js","assets/VenueList-WvFrBNwX.css","assets/ActivityList-BdWrkT55.js","assets/h5Http-CIzJQiXt.js","assets/ActivityList-C7ilG0u7.css","assets/Registrations-CQGLjP62.js","assets/bookingType-sDQIPutU.js","assets/datetime-DLy52ZIc.js","assets/reservationStatus-DPnogIlu.js","assets/Registrations-BFJ7lCw0.css","assets/Verify-DkNLrP3h.js","assets/Verify-Dw49jI2o.css","assets/Blacklist-CWbkb4Jr.js","assets/Blacklist-CtQQ6LfC.css","assets/TicketGrabList-qZR67066.js","assets/TicketGrabList-LRJZ5ryK.css","assets/TicketGrabRegistrations-C9INxLtz.js","assets/TicketGrabVerify-CzAJ0XNQ.js","assets/TicketGrabVerify-C99ifrCo.css","assets/StudyTourList-DZHRPzU3.js","assets/StudyTourList-S9h38Ufv.css","assets/Monitor-CwQryTgE.js","assets/PagePlaceholder-Cy4-OO0C.js","assets/Leaderboard-DpnW60sP.js","assets/Alerts-CLB4PUbf.js","assets/Overview-DWCg_gXr.js","assets/Regions-wTSahatX.js","assets/Categories-C4UExwsU.js","assets/Exports-B2d1jnIW.js","assets/Admins-DC1D747T.js","assets/Roles-B0m-fIGA.js","assets/Menus-BX2sSLCM.js","assets/Menus-CIRuEnr6.css","assets/AuditLogs-CP4JHnXf.js","assets/AuditLogs-Bd90uV6l.css","assets/Wechat-GC1DNCzj.js","assets/Map-DnFBdEPf.js","assets/Notifications-CnFkl2pO.js","assets/SystemLogs-BQud3TsP.js","assets/SystemLogs-DSVhElsT.css","assets/Dictionaries-Cq9OnVyA.js","assets/WechatUsers-CslkSm73.js"])))=>i.map(i=>d[i]);
import{n as e}from"./http-LCi9aT1G.js";import{t}from"./preload-helper-BIjWqNH5.js";var n={"/dashboard":()=>t(()=>import(`./Dashboard-vqjXeddj.js`),__vite__mapDeps([0,1,2,3,4,5,6,7])),"/venues":()=>t(()=>import(`./VenueList-TI3jsAHB.js`),__vite__mapDeps([8,1,2,3,4,5,6,9,10,11,12,13])),"/activities":()=>t(()=>import(`./ActivityList-BdWrkT55.js`),__vite__mapDeps([14,1,2,3,4,5,6,9,10,15,11,16])),"/activities/registrations":()=>t(()=>import(`./Registrations-CQGLjP62.js`),__vite__mapDeps([17,1,2,3,4,5,6,18,19,11,20,21])),"/activities/verify":()=>t(()=>import(`./Verify-DkNLrP3h.js`),__vite__mapDeps([22,1,2,3,4,5,6,18,19,11,20,23])),"/activities/blacklist":()=>t(()=>import(`./Blacklist-CWbkb4Jr.js`),__vite__mapDeps([24,1,2,3,4,5,6,19,25])),"/ticket-grab-events":()=>t(()=>import(`./TicketGrabList-qZR67066.js`),__vite__mapDeps([26,1,2,3,4,5,6,9,10,15,11,12,27])),"/ticket-grab-events/registrations":()=>t(()=>import(`./TicketGrabRegistrations-C9INxLtz.js`),__vite__mapDeps([28,2,3,5,18,19,11,20])),"/ticket-grab-events/verify":()=>t(()=>import(`./TicketGrabVerify-CzAJ0XNQ.js`),__vite__mapDeps([29,1,2,3,4,5,6,18,19,11,20,30])),"/study-tours":()=>t(()=>import(`./StudyTourList-DZHRPzU3.js`),__vite__mapDeps([31,1,2,3,4,5,6,9,10,11,12,32])),"/traffic":()=>t(()=>import(`./Monitor-CwQryTgE.js`),__vite__mapDeps([33,3,34])),"/traffic/leaderboard":()=>t(()=>import(`./Leaderboard-DpnW60sP.js`),__vite__mapDeps([35,3,34])),"/traffic/alerts":()=>t(()=>import(`./Alerts-CLB4PUbf.js`),__vite__mapDeps([36,3,34])),"/stats":()=>t(()=>import(`./Overview-DWCg_gXr.js`),__vite__mapDeps([37,3,34])),"/stats/regions":()=>t(()=>import(`./Regions-wTSahatX.js`),__vite__mapDeps([38,3,34])),"/stats/categories":()=>t(()=>import(`./Categories-C4UExwsU.js`),__vite__mapDeps([39,3,34])),"/stats/exports":()=>t(()=>import(`./Exports-B2d1jnIW.js`),__vite__mapDeps([40,3,34])),"/system/admins":()=>t(()=>import(`./Admins-DC1D747T.js`),__vite__mapDeps([41,2,3,5,11])),"/system/roles":()=>t(()=>import(`./Roles-B0m-fIGA.js`),__vite__mapDeps([42,1,2,3,4,5,6])),"/system/menus":()=>t(()=>import(`./Menus-BX2sSLCM.js`),__vite__mapDeps([43,1,2,3,4,5,6,44])),"/system/audit-logs":()=>t(()=>import(`./AuditLogs-CP4JHnXf.js`),__vite__mapDeps([45,1,2,3,4,5,6,19,11,46])),"/settings/wechat":()=>t(()=>import(`./Wechat-GC1DNCzj.js`),__vite__mapDeps([47,3,34])),"/settings/map":()=>t(()=>import(`./Map-DnFBdEPf.js`),__vite__mapDeps([48,1,2,3,4,5,6])),"/settings/notifications":()=>t(()=>import(`./Notifications-CnFkl2pO.js`),__vite__mapDeps([49,3,34])),"/settings/system-logs":()=>t(()=>import(`./SystemLogs-BQud3TsP.js`),__vite__mapDeps([50,1,2,3,4,5,6,19,51])),"/settings/dictionaries":()=>t(()=>import(`./Dictionaries-Cq9OnVyA.js`),__vite__mapDeps([52,2,3,5])),"/wechat-users":()=>t(()=>import(`./WechatUsers-CslkSm73.js`),__vite__mapDeps([53,2,3,5,11]))};function r(e){let t=[],n=e=>{for(let r of e){let e=r?.path?.trim();e&&t.push(e),Array.isArray(r?.children)&&n(r.children)}};return n(e),t}function i(e){let t=e.trim().replace(/\/+$/,``)||`/`;return t.startsWith(`/`)?t:`/${t}`}function a(e){if(e.size===0)return`/dashboard`;for(let t of[`/dashboard`,`/activities`,`/venues`,`/wechat-users`])if(e.has(t))return t;return[...e].sort()[0]??`/dashboard`}var o=null,s=!1;function c(){return o}async function l(){try{let{data:t}=await e.get(`/admin-menus`),n=r(Array.isArray(t)?t:[]);return a(new Set(n.map(e=>i(e))))}catch{return`/dashboard`}}async function u(t){if(s)return;let{data:a}=await e.get(`/admin-menus`),c=r(Array.isArray(a)?a:[]);o=new Set(c.map(e=>i(e)));for(let e of c){let r=i(e).replace(/\/$/,``)||`/`,a=n[r];if(!a)continue;let o=r.startsWith(`/`)?r.slice(1):r,s=`dyn-${o.replace(/\//g,`-`)}`;t.hasRoute(s)||t.addRoute(`admin-layout`,{path:o,name:s,component:a})}s=!0}function d(e){o=null,s=!1;for(let t of e.getRoutes()){let n=t.name?.toString()??``;n.startsWith(`dyn-`)&&e.removeRoute(n)}}function f(){return s}export{a,f as i,c as n,u as o,l as r,d as s,r as t};
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Dashboard-JT_Nhu_m.js","assets/index-B7ZWoF_u.js","assets/axios-CiYFffbI.js","assets/runtime-core.esm-bundler-CnFWH3R5.js","assets/preload-helper-BIjWqNH5.js","assets/http-LCi9aT1G.js","assets/index-C6I69YBI.css","assets/Dashboard-D_6tkjXe.css","assets/VenueList-B2OhFIfN.js","assets/RichEditorField-DoanZHNG.js","assets/RichEditorField-BSoIk7uU.css","assets/listTableRowIndex-Bl-nc9Qt.js","assets/mediaUrl-CPV6u7br.js","assets/VenueList-WvFrBNwX.css","assets/ActivityList-D0J0_X_r.js","assets/h5Http-CIzJQiXt.js","assets/ActivityList-pdF1v7F2.css","assets/Registrations-D-YzxpIa.js","assets/bookingType-sDQIPutU.js","assets/datetime-DLy52ZIc.js","assets/reservationStatus-DPnogIlu.js","assets/Registrations-BFJ7lCw0.css","assets/Verify-DRtsFMay.js","assets/Verify-Dw49jI2o.css","assets/Blacklist-Enkdm5xi.js","assets/Blacklist-CtQQ6LfC.css","assets/TicketGrabList-B_54Xw7J.js","assets/TicketGrabList-LRJZ5ryK.css","assets/TicketGrabRegistrations-C9INxLtz.js","assets/TicketGrabVerify-CLw-TZ_m.js","assets/TicketGrabVerify-C99ifrCo.css","assets/StudyTourList-yNMYnzKZ.js","assets/StudyTourList-S9h38Ufv.css","assets/Monitor-CwQryTgE.js","assets/PagePlaceholder-Cy4-OO0C.js","assets/Leaderboard-DpnW60sP.js","assets/Alerts-CLB4PUbf.js","assets/Overview-DWCg_gXr.js","assets/Regions-wTSahatX.js","assets/Categories-C4UExwsU.js","assets/Exports-B2d1jnIW.js","assets/Admins-DC1D747T.js","assets/Roles-Bhp4TUXx.js","assets/Menus-CJUvC0ZA.js","assets/Menus-CIRuEnr6.css","assets/AuditLogs-Bwlu39Hl.js","assets/AuditLogs-Bd90uV6l.css","assets/Wechat-GC1DNCzj.js","assets/Map-CroIjhkk.js","assets/Notifications-CnFkl2pO.js","assets/SystemLogs-CIEuXrwv.js","assets/SystemLogs-DSVhElsT.css","assets/Dictionaries-Cq9OnVyA.js","assets/WechatUsers-CslkSm73.js"])))=>i.map(i=>d[i]);
import{n as e}from"./http-LCi9aT1G.js";import{t}from"./preload-helper-BIjWqNH5.js";var n={"/dashboard":()=>t(()=>import(`./Dashboard-JT_Nhu_m.js`),__vite__mapDeps([0,1,2,3,4,5,6,7])),"/venues":()=>t(()=>import(`./VenueList-B2OhFIfN.js`),__vite__mapDeps([8,1,2,3,4,5,6,9,10,11,12,13])),"/activities":()=>t(()=>import(`./ActivityList-D0J0_X_r.js`),__vite__mapDeps([14,1,2,3,4,5,6,9,10,15,11,16])),"/activities/registrations":()=>t(()=>import(`./Registrations-D-YzxpIa.js`),__vite__mapDeps([17,1,2,3,4,5,6,18,19,11,20,21])),"/activities/verify":()=>t(()=>import(`./Verify-DRtsFMay.js`),__vite__mapDeps([22,1,2,3,4,5,6,18,19,11,20,23])),"/activities/blacklist":()=>t(()=>import(`./Blacklist-Enkdm5xi.js`),__vite__mapDeps([24,1,2,3,4,5,6,19,25])),"/ticket-grab-events":()=>t(()=>import(`./TicketGrabList-B_54Xw7J.js`),__vite__mapDeps([26,1,2,3,4,5,6,9,10,15,11,12,27])),"/ticket-grab-events/registrations":()=>t(()=>import(`./TicketGrabRegistrations-C9INxLtz.js`),__vite__mapDeps([28,2,3,5,18,19,11,20])),"/ticket-grab-events/verify":()=>t(()=>import(`./TicketGrabVerify-CLw-TZ_m.js`),__vite__mapDeps([29,1,2,3,4,5,6,18,19,11,20,30])),"/study-tours":()=>t(()=>import(`./StudyTourList-yNMYnzKZ.js`),__vite__mapDeps([31,1,2,3,4,5,6,9,10,11,12,32])),"/traffic":()=>t(()=>import(`./Monitor-CwQryTgE.js`),__vite__mapDeps([33,3,34])),"/traffic/leaderboard":()=>t(()=>import(`./Leaderboard-DpnW60sP.js`),__vite__mapDeps([35,3,34])),"/traffic/alerts":()=>t(()=>import(`./Alerts-CLB4PUbf.js`),__vite__mapDeps([36,3,34])),"/stats":()=>t(()=>import(`./Overview-DWCg_gXr.js`),__vite__mapDeps([37,3,34])),"/stats/regions":()=>t(()=>import(`./Regions-wTSahatX.js`),__vite__mapDeps([38,3,34])),"/stats/categories":()=>t(()=>import(`./Categories-C4UExwsU.js`),__vite__mapDeps([39,3,34])),"/stats/exports":()=>t(()=>import(`./Exports-B2d1jnIW.js`),__vite__mapDeps([40,3,34])),"/system/admins":()=>t(()=>import(`./Admins-DC1D747T.js`),__vite__mapDeps([41,2,3,5,11])),"/system/roles":()=>t(()=>import(`./Roles-Bhp4TUXx.js`),__vite__mapDeps([42,1,2,3,4,5,6])),"/system/menus":()=>t(()=>import(`./Menus-CJUvC0ZA.js`),__vite__mapDeps([43,1,2,3,4,5,6,44])),"/system/audit-logs":()=>t(()=>import(`./AuditLogs-Bwlu39Hl.js`),__vite__mapDeps([45,1,2,3,4,5,6,19,11,46])),"/settings/wechat":()=>t(()=>import(`./Wechat-GC1DNCzj.js`),__vite__mapDeps([47,3,34])),"/settings/map":()=>t(()=>import(`./Map-CroIjhkk.js`),__vite__mapDeps([48,1,2,3,4,5,6])),"/settings/notifications":()=>t(()=>import(`./Notifications-CnFkl2pO.js`),__vite__mapDeps([49,3,34])),"/settings/system-logs":()=>t(()=>import(`./SystemLogs-CIEuXrwv.js`),__vite__mapDeps([50,1,2,3,4,5,6,19,51])),"/settings/dictionaries":()=>t(()=>import(`./Dictionaries-Cq9OnVyA.js`),__vite__mapDeps([52,2,3,5])),"/wechat-users":()=>t(()=>import(`./WechatUsers-CslkSm73.js`),__vite__mapDeps([53,2,3,5,11]))};function r(e){let t=[],n=e=>{for(let r of e){let e=r?.path?.trim();e&&t.push(e),Array.isArray(r?.children)&&n(r.children)}};return n(e),t}function i(e){let t=e.trim().replace(/\/+$/,``)||`/`;return t.startsWith(`/`)?t:`/${t}`}function a(e){if(e.size===0)return`/dashboard`;for(let t of[`/dashboard`,`/activities`,`/venues`,`/wechat-users`])if(e.has(t))return t;return[...e].sort()[0]??`/dashboard`}var o=null,s=!1;function c(){return o}async function l(){try{let{data:t}=await e.get(`/admin-menus`),n=r(Array.isArray(t)?t:[]);return a(new Set(n.map(e=>i(e))))}catch{return`/dashboard`}}async function u(t){if(s)return;let{data:a}=await e.get(`/admin-menus`),c=r(Array.isArray(a)?a:[]);o=new Set(c.map(e=>i(e)));for(let e of c){let r=i(e).replace(/\/$/,``)||`/`,a=n[r];if(!a)continue;let o=r.startsWith(`/`)?r.slice(1):r,s=`dyn-${o.replace(/\//g,`-`)}`;t.hasRoute(s)||t.addRoute(`admin-layout`,{path:o,name:s,component:a})}s=!0}function d(e){o=null,s=!1;for(let t of e.getRoutes()){let n=t.name?.toString()??``;n.startsWith(`dyn-`)&&e.removeRoute(n)}}function f(){return s}export{a,f as i,c as n,u as o,l as r,d as s,r as t};

@ -1 +1 @@
import{a as e,i as t,n,o as r,r as i,s as a,t as o}from"./dynamicAdminRoutes-B4v7pfij.js";export{o as flattenMenuPaths,n as getCachedAllowedPaths,i as getFirstMenuPath,t as isDynamicRoutesRegistered,e as pickDefaultPath,r as registerDynamicAdminRoutes,a as resetDynamicAdminRoutes};
import{a as e,i as t,n,o as r,r as i,s as a,t as o}from"./dynamicAdminRoutes-CHR5Fw1q.js";export{o as flattenMenuPaths,n as getCachedAllowedPaths,i as getFirstMenuPath,t as isDynamicRoutesRegistered,e as pickDefaultPath,r as registerDynamicAdminRoutes,a as resetDynamicAdminRoutes};

File diff suppressed because one or more lines are too long

@ -5,12 +5,12 @@
<link rel="icon" type="image/svg+xml" href="/admin/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>苏州市科普场馆地图后台管理系统</title>
<script type="module" crossorigin src="/admin/assets/index-Di-9WPzB.js"></script>
<script type="module" crossorigin src="/admin/assets/index-B7ZWoF_u.js"></script>
<link rel="modulepreload" crossorigin href="/admin/assets/runtime-core.esm-bundler-CnFWH3R5.js">
<link rel="modulepreload" crossorigin href="/admin/assets/axios-CiYFffbI.js">
<link rel="modulepreload" crossorigin href="/admin/assets/preload-helper-BIjWqNH5.js">
<link rel="modulepreload" crossorigin href="/admin/assets/http-LCi9aT1G.js">
<link rel="modulepreload" crossorigin href="/admin/assets/dynamicAdminRoutes-B4v7pfij.js">
<link rel="modulepreload" crossorigin href="/admin/assets/dynamicAdminRoutes-CHR5Fw1q.js">
<link rel="stylesheet" crossorigin href="/admin/assets/index-C6I69YBI.css">
</head>
<body>

Loading…
Cancel
Save