master
lion 2 months ago
parent 8829dcbd39
commit ee93ef1f3a

@ -62,4 +62,4 @@ VITE_PUSHER_PORT="${PUSHER_PORT}"
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
TENCENT_MAP_SERVER_KEY=CRFBZ-NTART-YU4XX-LCDGK-3J456-VKBK2
TIANDITU_TK=877209ff7cbcb8d3de06ef57999f27df
TIANDITU_TK=ebd6693edf7730d8f8f9a7ba1719f5c1

@ -14,7 +14,7 @@ class Kernel extends ConsoleKernel
{
$schedule->command('reservations:sync-no-show-blacklist')->dailyAt('01:00');
$schedule->command('ticket-grab:sync-carry')->dailyAt('00:10');
$schedule->command('activities:clear-hot-ended')->dailyAt('00:15');
$schedule->command('activities:clear-hot-ended')->everyMinute();
}
/**

@ -75,6 +75,16 @@ class ActivityBookingController extends Controller
'days.*.booking_opens_at' => ['nullable', 'date'],
'days.*.day_quota' => $dayQuotaRules,
'days.*.quota_note' => ['nullable', 'string', 'max:500'],
], [
'days.required' => '请填写场次信息',
'days.min' => '公益性需预约活动请至少添加一个场次',
'days.*.session_name.required' => '请填写场次名称',
'days.*.session_start_at.required' => '请填写场次开始时间',
'days.*.session_end_at.required' => '请填写场次结束时间',
'booking_audience.required' => '请选择预约对象',
], [
'days' => '场次信息',
'booking_audience' => '预约对象',
]);
foreach ($data['days'] as $i => $dayRow) {
$deadlineRaw = $dayRow['booking_deadline_at'] ?? null;

@ -6,6 +6,7 @@ use App\Http\Controllers\Concerns\AuthorizesActivitySubmitter;
use App\Http\Controllers\Controller;
use App\Models\Activity;
use App\Models\ActivityAuditLog;
use App\Models\Venue;
use App\Support\ActivityVerifyPortalPin;
use App\Support\VerifyPortalCode;
use Carbon\Carbon;
@ -45,7 +46,9 @@ class ActivityController extends Controller
public function index(Request $request): JsonResponse
{
$query = Activity::with(['venue:id,name', 'activityDays', 'submitter:id,name'])
Activity::clearHotFlagsForEndedActivities();
$query = Activity::with(['venue:'.Venue::referenceNameSelectString(), 'activityDays', 'submitter:id,name'])
->withCount([
'auditLogs as approve_audit_logs_count' => function ($rel) {
$rel->where('action', ActivityAuditLog::ACTION_APPROVE);
@ -85,7 +88,7 @@ class ActivityController extends Controller
$a->makeHidden(['is_hot']);
}
return $a;
return $this->withVenueReferenceDisplay($a);
});
return response()->json($page);
@ -167,12 +170,12 @@ class ActivityController extends Controller
$activity->load('activityDays');
$activity->forceFill(['schedule_status' => Activity::computeScheduleStatusForDisplay($activity)])->saveQuietly();
$act = $activity->load('venue:id,name');
$act = $activity->load('venue:'.Venue::referenceNameSelectString());
if (! $request->user()?->isSuperAdmin()) {
$act->makeHidden(['is_hot']);
}
return response()->json($act, 201);
return response()->json($this->withVenueReferenceDisplay($act), 201);
}
public function update(Request $request, Activity $activity): JsonResponse
@ -262,12 +265,12 @@ class ActivityController extends Controller
]);
}
$fresh = $activity->fresh()->load(['venue:id,name', 'activityDays']);
$fresh = $activity->fresh()->load(['venue:'.Venue::referenceNameSelectString(), 'activityDays']);
if (! $request->user()?->isSuperAdmin()) {
$fresh->makeHidden(['is_hot']);
}
return response()->json($fresh);
return response()->json($this->withVenueReferenceDisplay($fresh));
}
public function approve(Request $request, Activity $activity): JsonResponse
@ -293,7 +296,7 @@ class ActivityController extends Controller
'remark' => $data['remark'] ?? null,
]);
return response()->json($activity->fresh()->load('venue:id,name'));
return response()->json($this->withVenueReferenceDisplay($activity->fresh()->load('venue:'.Venue::referenceNameSelectString())));
}
public function updateBehindScenes(Request $request, Activity $activity): JsonResponse
@ -312,12 +315,12 @@ class ActivityController extends Controller
$activity->behind_scenes_media = array_values($data['behind_scenes_media'] ?? []);
$activity->save();
$fresh = $activity->fresh()->load('venue:id,name');
$fresh = $activity->fresh()->load('venue:'.Venue::referenceNameSelectString());
if (! $request->user()?->isSuperAdmin()) {
$fresh->makeHidden(['is_hot']);
}
return response()->json($fresh);
return response()->json($this->withVenueReferenceDisplay($fresh));
}
public function setHotFlag(Request $request, Activity $activity): JsonResponse
@ -331,7 +334,7 @@ class ActivityController extends Controller
$activity->is_hot = (bool) $data['is_hot'];
$activity->save();
return response()->json($activity->fresh()->load('venue:id,name'));
return response()->json($this->withVenueReferenceDisplay($activity->fresh()->load('venue:'.Venue::referenceNameSelectString())));
}
public function reject(Request $request, Activity $activity): JsonResponse
@ -354,7 +357,7 @@ class ActivityController extends Controller
'remark' => $data['remark'] ?? null,
]);
return response()->json($activity->fresh()->load('venue:id,name'));
return response()->json($this->withVenueReferenceDisplay($activity->fresh()->load('venue:'.Venue::referenceNameSelectString())));
}
public function toggle(Request $request, Activity $activity): JsonResponse
@ -364,7 +367,7 @@ class ActivityController extends Controller
$activity->is_active = ! $activity->is_active;
$activity->save();
return response()->json($activity->fresh()->load('venue:id,name'));
return response()->json($this->withVenueReferenceDisplay($activity->fresh()->load('venue:'.Venue::referenceNameSelectString())));
}
public function destroy(Request $request, Activity $activity): JsonResponse
@ -406,7 +409,7 @@ class ActivityController extends Controller
$activity->save();
}
return response()->json($activity->fresh()->load('venue:id,name'));
return response()->json($this->withVenueReferenceDisplay($activity->fresh()->load('venue:'.Venue::referenceNameSelectString())));
}
/**
@ -676,4 +679,16 @@ class ActivityController extends Controller
$allowed = $user->venues()->where('venues.id', $venueId)->exists();
abort_unless($allowed, 403, '仅可操作已绑定场馆');
}
private function withVenueReferenceDisplay(Activity $activity): Activity
{
if ($activity->relationLoaded('venue')) {
$venue = $activity->venue;
if ($venue instanceof Venue) {
$venue->applyDisplayNameForReference();
}
}
return $activity;
}
}

@ -5,6 +5,7 @@ namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Blacklist;
use App\Models\Reservation;
use App\Models\Venue;
use App\Services\ReservationExpiryService;
use Carbon\Carbon;
use Illuminate\Http\JsonResponse;
@ -20,14 +21,14 @@ class ActivityRegistrationController extends Controller
$kind = (string) $request->input('reservation_kind', 'activity');
if ($kind === 'ticket_grab') {
$query = Reservation::with([
'venue:id,name',
'venue:'.Venue::referenceNameSelectString(),
'ticketGrabEvent:id,title',
])
->where('reservation_kind', Reservation::KIND_TICKET_GRAB)
->orderByDesc('id');
} else {
$query = Reservation::with([
'venue:id,name',
'venue:'.Venue::referenceNameSelectString(),
'activity:id,title',
'activityDay:id,activity_id,activity_date,session_name,session_start_at,session_end_at',
])
@ -113,6 +114,9 @@ class ActivityRegistrationController extends Controller
? false
: (bool) ($row->visitor_phone
&& isset($blackSet[$row->venue_id.'#'.$row->visitor_phone]));
if ($row->relationLoaded('venue') && $row->venue instanceof Venue) {
$row->venue->applyDisplayNameForReference();
}
return $row;
}));
@ -126,7 +130,7 @@ class ActivityRegistrationController extends Controller
$reservationExpiryService->expireStalePendingReservations();
$query = Reservation::with([
'venue:id,name',
'venue:'.Venue::referenceNameSelectString(),
'activity:id,title',
'activityDay:id,activity_id,activity_date,session_name,session_start_at,session_end_at',
])
@ -184,6 +188,9 @@ class ActivityRegistrationController extends Controller
fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));
fputcsv($out, ['ID', '活动', '场馆', '报名人', '手机号', '预约类型', '预约票数', '场次名称', '预约时间', '状态', '下单时间', '核销时间', '二维码Token']);
foreach ($rows as $row) {
if ($row->venue instanceof Venue) {
$row->venue->applyDisplayNameForReference();
}
$ad = $row->activityDay;
$sessionName = $ad ? (string) ($ad->session_name ?? '') : '';
$timeStr = $ad ? $ad->formatSessionTimeRangeZh() : '';
@ -232,7 +239,7 @@ class ActivityRegistrationController extends Controller
],
);
return response()->json($item->load('venue:id,name'), 201);
return response()->json($item->load('venue:'.Venue::referenceNameSelectString()), 201);
}
public function batchQuickBlacklist(Request $request): JsonResponse

@ -10,6 +10,7 @@ use App\Models\Reservation;
use App\Models\TicketGrabEvent;
use App\Models\TicketGrabEventVenue;
use App\Models\Venue;
use App\Services\WechatHomeVisitService;
use App\Services\DashboardTicketGrabStatsService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
@ -23,7 +24,7 @@ use Symfony\Component\HttpFoundation\StreamedResponse;
class DashboardController extends Controller
{
public function stats(Request $request): JsonResponse
public function stats(Request $request, WechatHomeVisitService $homeVisits): JsonResponse
{
$user = $request->user();
$allowedVenueIds = $user->isSuperAdmin()
@ -222,11 +223,15 @@ class DashboardController extends Controller
$activityItems = Activity::query()
->whereNull('deleted_at')
->where('audit_status', Activity::AUDIT_PENDING)
->with(['venue:id,name'])
->with(['venue:'.Venue::referenceNameSelectString()])
->orderByDesc('updated_at')
->limit(8)
->get(['id', 'title', 'venue_id', 'updated_at'])
->map(function (Activity $a) {
if ($a->venue instanceof Venue) {
$a->venue->applyDisplayNameForReference();
}
return [
'id' => $a->id,
'title' => $a->title,
@ -237,11 +242,34 @@ class DashboardController extends Controller
->values()
->all();
$venuePendingCount = (int) Venue::query()
->where('audit_status', Venue::AUDIT_PENDING)
->count();
$venueItems = Venue::query()
->where('audit_status', Venue::AUDIT_PENDING)
->orderByDesc('updated_at')
->limit(8)
->get(['id', 'name', 'updated_at'])
->map(function (Venue $v) {
return [
'id' => $v->id,
'name' => $v->name,
'updated_at' => $v->updated_at,
];
})
->values()
->all();
$pendingAudits = [
'activities' => [
'count' => $activityPendingCount,
'items' => $activityItems,
],
'venues' => [
'count' => $venuePendingCount,
'items' => $venueItems,
],
];
} elseif ($user->role === 'venue_admin') {
/** 待办:本账号场馆下、审核已退回的活动(供前台修改后重新提交) */
@ -263,11 +291,15 @@ class DashboardController extends Controller
->whereIn('venue_id', $scopeVenueIds)
->whereNull('deleted_at')
->where('audit_status', Activity::AUDIT_REJECTED)
->with(['venue:id,name'])
->with(['venue:'.Venue::referenceNameSelectString()])
->orderByDesc('updated_at')
->limit(8)
->get(['id', 'title', 'venue_id', 'updated_at'])
->map(function (Activity $a) {
if ($a->venue instanceof Venue) {
$a->venue->applyDisplayNameForReference();
}
return [
'id' => $a->id,
'title' => $a->title,
@ -309,6 +341,9 @@ class DashboardController extends Controller
'user_count' => (int) $userCount,
'reservation_order_count' => $reservationOrderCount,
'blacklisted_unique' => (int) $blacklistedUnique,
'wechat_user_count' => $homeVisits->totalWechatUsers(),
'home_visit_total' => $homeVisits->totalVisits(),
'home_visit_today' => $homeVisits->todayVisits(),
],
'pending_audits' => $pendingAudits,
'activity_schedule_counts' => [

@ -23,12 +23,14 @@ class H5ContentController extends Controller
{
public function activities(Request $request): JsonResponse
{
Activity::clearHotFlagsForEndedActivities();
if ($request->boolean('include_ticket_grab')) {
return $this->mixedActivities($request);
}
$size = max(1, min(30, (int) $request->input('page_size', 10)));
$rows = Activity::query()
->with(['venue:id,name,lat,lng,cover_image', 'activityDays'])
->with(['venue:'.Venue::referenceNameSelectString(['lat', 'lng', 'cover_image']), 'activityDays'])
->visibleOnH5()
->when($request->filled('keyword'), function ($q) use ($request) {
$keyword = trim((string) $request->input('keyword'));
@ -44,6 +46,9 @@ class H5ContentController extends Controller
->paginate($size);
$rows->getCollection()->transform(function ($a) {
if ($a->venue instanceof Venue) {
$a->venue->applyDisplayNameForReference();
}
$online = $this->activitySupportsOnlineBooking($a);
$isBookable = $online && $a->activityDays->contains(
fn (ActivityDay $d) => $d->isCurrentlyBookable()
@ -83,7 +88,10 @@ class H5ContentController extends Controller
{
$a = Activity::query()
->with([
'venue:id,name,address,lat,lng,open_time,district,venue_type,venue_types,ticket_type,unit_name,contact_phone,cover_image,gallery_media',
'venue:'.Venue::referenceNameSelectString([
'address', 'lat', 'lng', 'open_time', 'district', 'venue_type', 'venue_types',
'ticket_type', 'unit_name', 'contact_phone', 'cover_image', 'gallery_media',
]),
'activityDays',
])
->visibleOnH5()
@ -354,8 +362,10 @@ class H5ContentController extends Controller
$rows = $query->get()
->map(function (Venue $v) {
// 直接使用 toArray因为 visibleOnH5 已经过滤了审核状态和启用状态
$p = $v->toArray();
$p = $v->toH5Payload();
if ($p === null) {
return null;
}
return [
'id' => $p['id'],
@ -376,6 +386,7 @@ class H5ContentController extends Controller
'is_included_in_stats' => (bool) ($p['is_included_in_stats'] ?? false),
];
})
->filter()
->values();
return response()->json($rows);
@ -696,7 +707,7 @@ class H5ContentController extends Controller
}
$aQuery = Activity::query()
->with(['venue:id,name,lat,lng,cover_image', 'activityDays'])
->with(['venue:'.Venue::referenceNameSelectString(['lat', 'lng', 'cover_image']), 'activityDays'])
->visibleOnH5();
if ($keyword !== null && $keyword !== '') {
$aQuery->where('title', 'like', "%{$keyword}%");

@ -12,12 +12,16 @@ use App\Models\TicketGrabEvent;
use App\Models\Venue;
use App\Support\ActivityH5View;
use App\Support\CalendarDateFormat;
use App\Models\WechatUser;
use App\Services\WechatHomeVisitService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class H5HomeController extends Controller
{
public function index(): JsonResponse
{
Activity::clearHotFlagsForEndedActivities();
$stats = [
'reservation_total' => Reservation::query()->where('status', '!=', 'cancelled')->count(),
'verified_total' => Reservation::query()->where('status', 'verified')->count(),
@ -62,7 +66,10 @@ class H5HomeController extends Controller
->orderByDesc('id')
->get()
->map(function ($v) use ($venueTypeColors) {
$p = $v->toArray();
$p = $v->toH5Payload();
if ($p === null) {
return null;
}
$types = $p['venue_types'] ?? null;
$firstType = (is_array($types) && count($types)) ? (string) ($types[0] ?? '') : ($p['venue_type'] ?? '');
$raw = $venueTypeColors->get($firstType);
@ -96,6 +103,7 @@ class H5HomeController extends Controller
'venue_type_color' => $color,
];
})
->filter()
->values();
// 地图场馆:只返回有经纬度的(用于地图标点)
@ -104,12 +112,15 @@ class H5HomeController extends Controller
})->values();
$actRows = Activity::query()
->with('venue:id,name,cover_image')
->with('venue:'.Venue::referenceNameSelectString(['cover_image']))
->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', 'offline_reservation_method', 'reservation_type', 'ticket_fee_note'])
->map(function ($a) {
if ($a->venue instanceof Venue) {
$a->venue->applyDisplayNameForReference();
}
$t = (string) ($a->reservation_type ?? Activity::RESERVATION_TYPE_ONLINE);
$online = $t === '' || $t === Activity::RESERVATION_TYPE_ONLINE;
$isBookable = $online && $a->activityDays->contains(
@ -299,4 +310,19 @@ class H5HomeController extends Controller
default => 0,
};
}
/**
* 授权微信用户进入首页时记录一次访问(重复进入累计)。
*/
public function recordVisit(Request $request, WechatHomeVisitService $visits): JsonResponse
{
$user = $request->user();
if (! $user instanceof WechatUser) {
return response()->json(['message' => '未登录'], 401);
}
$visits->record($user);
return response()->json(['message' => 'ok']);
}
}

@ -6,7 +6,8 @@ use App\Http\Controllers\Controller;
use App\Models\DictItem;
use App\Models\StudyTour;
use App\Models\Venue;
use App\Support\HtmlToPlainText;
use App\Models\VenueAuditLog;
use App\Support\VenueAuditDiff;
use App\Support\VenueVerifyPortalPin;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
@ -385,13 +386,31 @@ class VenueController extends Controller
unset($data['sort']);
}
/** 场馆修改后直接生效,不再进入待审核 */
$data['audit_status'] = Venue::AUDIT_APPROVED;
$data['audit_remark'] = null;
$data['last_approved_snapshot'] = null;
if (! $user->isSuperAdmin()) {
unset($data['sort']);
unset($data['is_active']);
if ($venue->audit_status === Venue::AUDIT_APPROVED && ! is_array($venue->last_approved_snapshot)) {
$venue->last_approved_snapshot = $venue->buildAuditSnapshot();
}
$data['audit_status'] = Venue::AUDIT_PENDING;
$data['audit_remark'] = null;
} else {
$data['audit_status'] = Venue::AUDIT_APPROVED;
$data['audit_remark'] = null;
$data['last_approved_snapshot'] = null;
}
$venue->fill($data)->save();
if (! $user->isSuperAdmin()) {
VenueAuditLog::query()->create([
'venue_id' => $venue->id,
'admin_user_id' => $user->id,
'action' => VenueAuditLog::ACTION_EDIT_SUBMIT,
'remark' => null,
]);
}
VenueVerifyPortalPin::ensure($venue->fresh());
return response()->json($venue->fresh());
@ -399,7 +418,7 @@ class VenueController extends Controller
public function approve(Request $request, int $id): JsonResponse
{
abort_unless($request->user()?->isSuperAdmin(), 403, '仅超级管理员可审核');
abort_unless($request->user()?->isSuperAdmin(), 403, '仅管理员可审核');
$venue = Venue::query()->findOrFail($id);
$venue->audit_status = Venue::AUDIT_APPROVED;
@ -407,6 +426,13 @@ class VenueController extends Controller
$venue->last_approved_snapshot = null;
$venue->save();
VenueAuditLog::query()->create([
'venue_id' => $venue->id,
'admin_user_id' => $request->user()->id,
'action' => VenueAuditLog::ACTION_APPROVE,
'remark' => null,
]);
VenueVerifyPortalPin::ensure($venue->fresh());
return response()->json($venue->fresh());
@ -414,7 +440,7 @@ class VenueController extends Controller
public function reject(Request $request, int $id): JsonResponse
{
abort_unless($request->user()?->isSuperAdmin(), 403, '仅超级管理员可审核');
abort_unless($request->user()?->isSuperAdmin(), 403, '仅管理员可审核');
$data = $request->validate([
'remark' => ['nullable', 'string', 'max:2000'],
@ -425,9 +451,49 @@ class VenueController extends Controller
$venue->audit_remark = $data['remark'] ?? null;
$venue->save();
VenueAuditLog::query()->create([
'venue_id' => $venue->id,
'admin_user_id' => $request->user()->id,
'action' => VenueAuditLog::ACTION_REJECT,
'remark' => $data['remark'] ?? null,
]);
return response()->json($venue->fresh());
}
public function auditDetail(Request $request, int $id): JsonResponse
{
$user = $request->user();
abort_unless($user, 403, '无权限');
$venue = Venue::query()->findOrFail($id);
if (! $user->isSuperAdmin()) {
$this->ensureVenuePermission($request, $venue->id);
}
return response()->json([
'venue' => $venue,
'changes' => $user->isSuperAdmin() ? VenueAuditDiff::diff($venue) : [],
]);
}
public function auditLogs(Request $request, int $id): JsonResponse
{
abort_unless($request->user(), 403, '无权限');
$venue = Venue::query()->findOrFail($id);
$this->ensureVenuePermission($request, $venue->id);
$logs = VenueAuditLog::query()
->where('venue_id', $venue->id)
->with('adminUser:id,name,username')
->orderByDesc('id')
->limit(100)
->get();
return response()->json($logs);
}
/**
* 仅超级管理员。数据库外键会级联删除该场馆下的活动、预约关联等;并从研学线路的 venue_ids 中移除该馆。
*/

@ -3,16 +3,76 @@
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Activity;
use App\Models\Reservation;
use App\Models\TicketGrabEvent;
use App\Models\User;
use App\Models\WechatUser;
use App\Models\WechatUserHomeVisit;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use Symfony\Component\HttpFoundation\StreamedResponse;
class WechatUserController extends Controller
{
public function index(Request $request): JsonResponse
{
$pageSize = max(1, min(100, (int) $request->input('page_size', 20)));
$query = $this->buildFilteredQuery($request);
$paginator = $query->paginate($pageSize);
$ids = collect($paginator->items())->pluck('id')->map(fn ($id) => (int) $id)->values()->all();
$paginator->setCollection(collect($this->mapWechatUserRows($paginator->items(), $ids)));
return response()->json($paginator);
}
public function export(Request $request): StreamedResponse
{
abort_unless($request->user(), 403, '无权限');
$users = $this->buildFilteredQuery($request)->get();
$ids = $users->pluck('id')->map(fn ($id) => (int) $id)->values()->all();
$rows = $this->mapWechatUserRows($users->all(), $ids);
$table = [[
'手机号', '昵称', '姓名', '注册时间', '访问量', '预约活动', '预约抢票',
]];
foreach ($rows as $row) {
$table[] = [
(string) ($row['phone'] ?? ''),
(string) ($row['nickname'] ?? ''),
(string) ($row['real_name'] ?? ''),
(string) ($row['created_at'] ?? ''),
(int) ($row['visit_count'] ?? 0),
$this->formatReservationBriefsForExport($row['activity_reservations'] ?? []),
$this->formatReservationBriefsForExport($row['ticket_grab_reservations'] ?? []),
];
}
$spreadsheet = new Spreadsheet;
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('用户列表');
$sheet->fromArray($table, null, 'A1');
$writer = new Xlsx($spreadsheet);
$filename = '微信用户列表-'.now()->format('Ymd-His').'.xlsx';
return response()->streamDownload(function () use ($writer) {
$writer->save('php://output');
}, $filename, [
'Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
]);
}
/**
* @return Builder<WechatUser>
*/
private function buildFilteredQuery(Request $request): Builder
{
$query = WechatUser::query()->orderByDesc('id');
if ($request->filled('keyword')) {
@ -24,13 +84,30 @@ class WechatUserController extends Controller
});
}
if ($request->filled('has_activity_reservation')) {
$has = filter_var($request->input('has_activity_reservation'), FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
if ($has === true) {
$query->whereExists(fn ($sub) => $this->activityReservationExistsSub($sub));
} elseif ($has === false) {
$query->whereNotExists(fn ($sub) => $this->activityReservationExistsSub($sub));
}
}
if ($request->filled('has_ticket_grab_reservation')) {
$has = filter_var($request->input('has_ticket_grab_reservation'), FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
if ($has === true) {
$query->whereExists(fn ($sub) => $this->ticketGrabReservationExistsSub($sub));
} elseif ($has === false) {
$query->whereNotExists(fn ($sub) => $this->ticketGrabReservationExistsSub($sub));
}
}
$user = $request->user();
if (! $user->isSuperAdmin()) {
if ($user instanceof User && ! $user->isSuperAdmin()) {
$venueIds = $user->venues()->pluck('venues.id')->all();
if (empty($venueIds)) {
$query->whereRaw('1 = 0');
} else {
// 活动预约可能仅填手机号、wechat_user_id 为空;通过后一条件,在「个人中心」已绑定手机号的用户仍可按手机号检索到
$query->where(function ($outer) use ($venueIds) {
$outer->whereExists(function ($sub) use ($venueIds) {
$sub->selectRaw('1')
@ -51,6 +128,143 @@ class WechatUserController extends Controller
}
}
return response()->json($query->paginate($pageSize));
return $query;
}
/**
* @param array<int, WechatUser> $users
* @param list<int> $ids
* @return list<array<string, mixed>>
*/
private function mapWechatUserRows(array $users, array $ids): array
{
if ($ids === []) {
return [];
}
$visitCounts = WechatUserHomeVisit::query()
->whereIn('wechat_user_id', $ids)
->groupBy('wechat_user_id')
->selectRaw('wechat_user_id, COUNT(*) as c')
->pluck('c', 'wechat_user_id');
$activityResMap = $this->loadReservationBriefs($ids, Reservation::KIND_ACTIVITY);
$ticketGrabResMap = $this->loadReservationBriefs($ids, Reservation::KIND_TICKET_GRAB);
return array_map(function (WechatUser $wu) use ($visitCounts, $activityResMap, $ticketGrabResMap) {
$row = $wu->toArray();
$row['visit_count'] = (int) ($visitCounts[$wu->id] ?? 0);
$row['activity_reservations'] = $activityResMap[$wu->id] ?? [];
$row['ticket_grab_reservations'] = $ticketGrabResMap[$wu->id] ?? [];
if ($row['created_at'] !== null) {
$row['created_at'] = $wu->created_at?->timezone((string) config('app.timezone'))->format('Y-m-d H:i:s');
}
return $row;
}, $users);
}
/**
* @param list<int> $wechatUserIds
* @return array<int, list<array{title: string, status: string, status_label: string}>>
*/
private function loadReservationBriefs(array $wechatUserIds, string $kind): array
{
if ($wechatUserIds === []) {
return [];
}
$query = Reservation::query()
->whereIn('wechat_user_id', $wechatUserIds)
->whereNull('deleted_at')
->where('status', '!=', 'cancelled');
if ($kind === Reservation::KIND_TICKET_GRAB) {
$query->where('reservation_kind', Reservation::KIND_TICKET_GRAB);
} else {
$query->where(function ($q) {
$q->whereNull('reservation_kind')
->orWhere('reservation_kind', Reservation::KIND_ACTIVITY);
});
}
$rows = $query
->orderByDesc('id')
->get(['id', 'wechat_user_id', 'activity_id', 'ticket_grab_event_id', 'status']);
$activityIds = $rows->pluck('activity_id')->filter()->unique()->values()->all();
$eventIds = $rows->pluck('ticket_grab_event_id')->filter()->unique()->values()->all();
$activityTitles = $activityIds === []
? collect()
: Activity::query()->whereIn('id', $activityIds)->pluck('title', 'id');
$eventTitles = $eventIds === []
? collect()
: TicketGrabEvent::query()->whereIn('id', $eventIds)->pluck('title', 'id');
$out = [];
foreach ($rows as $r) {
$uid = (int) $r->wechat_user_id;
$title = $kind === Reservation::KIND_TICKET_GRAB
? (string) ($eventTitles[(int) $r->ticket_grab_event_id] ?? ('抢票#'.$r->ticket_grab_event_id))
: (string) ($activityTitles[(int) $r->activity_id] ?? ('活动#'.$r->activity_id));
$out[$uid][] = [
'title' => $title,
'status' => (string) $r->status,
'status_label' => $this->reservationStatusLabel((string) $r->status),
];
}
return $out;
}
private function reservationStatusLabel(string $status): string
{
return match ($status) {
'pending' => '待核销',
'verified' => '已核销',
'cancelled' => '已取消',
'expired' => '已过期',
default => $status,
};
}
/**
* @param list<array{title?: string, status_label?: string}> $items
*/
private function formatReservationBriefsForExport(array $items): string
{
if ($items === []) {
return '';
}
$parts = [];
foreach ($items as $it) {
$title = trim((string) ($it['title'] ?? ''));
$label = trim((string) ($it['status_label'] ?? ''));
$parts[] = $title !== '' ? "{$title}{$label}" : $label;
}
return implode('', $parts);
}
private function activityReservationExistsSub($sub): void
{
$sub->selectRaw('1')
->from('reservations')
->whereNull('reservations.deleted_at')
->whereColumn('reservations.wechat_user_id', 'wechat_users.id')
->where(function ($q) {
$q->whereNull('reservations.reservation_kind')
->orWhere('reservations.reservation_kind', Reservation::KIND_ACTIVITY);
});
}
private function ticketGrabReservationExistsSub($sub): void
{
$sub->selectRaw('1')
->from('reservations')
->whereNull('reservations.deleted_at')
->whereColumn('reservations.wechat_user_id', 'wechat_users.id')
->where('reservations.reservation_kind', Reservation::KIND_TICKET_GRAB);
}
}

@ -67,6 +67,43 @@ class Venue extends Model
'detail_html', 'live_people_count', 'sort', 'is_active', 'is_included_in_stats',
];
/** @var list<string> */
public const REFERENCE_NAME_COLUMNS = ['id', 'name', 'audit_status', 'last_approved_snapshot'];
/**
* 活动/预约等引用场馆时的 select 列(含展示名所需快照字段)。
*
* @param list<string> $extra
*/
public static function referenceNameSelectString(array $extra = []): string
{
return implode(',', array_values(array_unique(array_merge(self::REFERENCE_NAME_COLUMNS, $extra))));
}
/**
* 作为关联引用展示时使用的场馆名:待审/退回且存在已通过快照则取快照名称。
*/
public function displayNameForReference(): string
{
$current = (string) ($this->attributes['name'] ?? '');
if (! in_array($this->audit_status, [self::AUDIT_PENDING, self::AUDIT_REJECTED], true)) {
return $current;
}
$snap = $this->last_approved_snapshot;
if (is_array($snap) && trim((string) ($snap['name'] ?? '')) !== '') {
return (string) $snap['name'];
}
return $current;
}
public function applyDisplayNameForReference(): self
{
$this->setAttribute('name', $this->displayNameForReference());
return $this;
}
protected $hidden = [
'verify_portal_pin',
];
@ -85,13 +122,19 @@ class Venue extends Model
];
/**
* H5 仅展示已启用且审核通过的场馆(待审核、已退回均不展示)。
* H5 展示:已启用且(已通过审核,或待审/退回但仍有已通过快照可展示旧版内容)。
*/
public function scopeVisibleOnH5(Builder $query): Builder
{
return $query
->where('is_active', true)
->where('audit_status', self::AUDIT_APPROVED);
->where(function (Builder $q) {
$q->where('audit_status', self::AUDIT_APPROVED)
->orWhere(function (Builder $sub) {
$sub->whereIn('audit_status', [self::AUDIT_PENDING, self::AUDIT_REJECTED])
->whereNotNull('last_approved_snapshot');
});
});
}
/**
@ -99,11 +142,23 @@ class Venue extends Model
*/
public function toH5Payload(): ?array
{
if ($this->audit_status !== self::AUDIT_APPROVED || ! $this->is_active) {
if (! $this->is_active) {
return null;
}
return $this->toArray();
if ($this->audit_status === self::AUDIT_APPROVED) {
return $this->toArray();
}
$snap = $this->last_approved_snapshot;
if (is_array($snap) && $snap !== []) {
$out = $snap;
$out['id'] = $this->id;
return $out;
}
return null;
}
/**

@ -0,0 +1,32 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class VenueAuditLog extends Model
{
public const ACTION_APPROVE = 'approve';
public const ACTION_REJECT = 'reject';
public const ACTION_EDIT_SUBMIT = 'edit_submit';
protected $fillable = [
'venue_id',
'admin_user_id',
'action',
'remark',
];
public function venue(): BelongsTo
{
return $this->belongsTo(Venue::class);
}
public function adminUser(): BelongsTo
{
return $this->belongsTo(User::class, 'admin_user_id');
}
}

@ -0,0 +1,25 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class WechatUserHomeVisit extends Model
{
public $timestamps = false;
protected $fillable = [
'wechat_user_id',
'visited_at',
];
protected $casts = [
'visited_at' => 'datetime',
];
public function wechatUser(): BelongsTo
{
return $this->belongsTo(WechatUser::class);
}
}

@ -0,0 +1,39 @@
<?php
namespace App\Services;
use App\Models\WechatUser;
use App\Models\WechatUserHomeVisit;
use Illuminate\Support\Carbon;
class WechatHomeVisitService
{
public function record(WechatUser $user): void
{
WechatUserHomeVisit::query()->create([
'wechat_user_id' => $user->id,
'visited_at' => now(),
]);
}
public function totalVisits(): int
{
return (int) WechatUserHomeVisit::query()->count();
}
public function todayVisits(): int
{
$tz = (string) config('app.timezone');
$start = Carbon::now($tz)->startOfDay();
$end = Carbon::now($tz)->endOfDay();
return (int) WechatUserHomeVisit::query()
->whereBetween('visited_at', [$start, $end])
->count();
}
public function totalWechatUsers(): int
{
return (int) WechatUser::query()->count();
}
}

@ -0,0 +1,90 @@
<?php
namespace App\Support;
use App\Models\Venue;
/**
* 场馆审核对比:快照(已通过)与待审内容的字段差异。
*/
final class VenueAuditDiff
{
/** @var array<string, string> */
public const FIELD_LABELS = [
'name' => '场馆名称',
'venue_type' => '主题',
'venue_types' => '主题(多选)',
'unit_name' => '所属单位',
'district' => '行政区',
'ticket_type' => '门票类型',
'appointment_type' => '预约类型',
'booking_mode' => '预约模式',
'open_mode' => '开放模式',
'open_time' => '开放时间',
'reservation_notice' => '预约须知',
'ticket_content' => '门票说明',
'booking_method' => '预约方式',
'visit_form' => '参观形式',
'consultation_hours' => '咨询预约时间',
'booking_qr_media' => '预约二维码',
'address' => '场馆地址',
'contact_phone' => '联系电话',
'lat' => '纬度',
'lng' => '经度',
'cover_image' => '封面图',
'gallery_media' => '轮播图与视频',
'detail_html' => '场馆详情',
'live_people_count' => '实时在馆人数',
'sort' => '排序',
'is_active' => '上架',
'is_included_in_stats' => '纳入人数统计',
];
/**
* @return list<array{field: string, label: string, before: string, after: string}>
*/
public static function diff(Venue $venue): array
{
$snapshot = $venue->last_approved_snapshot;
if (! is_array($snapshot) || $snapshot === []) {
return [];
}
$out = [];
foreach (Venue::SNAPSHOT_KEYS as $key) {
$before = self::normalizeValue($snapshot[$key] ?? null);
$after = self::normalizeValue($venue->getAttribute($key));
if ($before === $after) {
continue;
}
$out[] = [
'field' => $key,
'label' => self::FIELD_LABELS[$key] ?? $key,
'before' => $before,
'after' => $after,
];
}
return $out;
}
private static function normalizeValue(mixed $v): string
{
if ($v === null) {
return '';
}
if (is_bool($v)) {
return $v ? '是' : '否';
}
if (is_array($v)) {
if ($v === []) {
return '';
}
$encoded = json_encode($v, JSON_UNESCAPED_UNICODE);
return is_string($encoded) ? $encoded : '';
}
return trim((string) $v);
}
}

@ -0,0 +1,23 @@
<?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::create('wechat_user_home_visits', function (Blueprint $table) {
$table->id();
$table->foreignId('wechat_user_id')->constrained('wechat_users')->cascadeOnDelete();
$table->timestamp('visited_at')->useCurrent();
$table->index(['wechat_user_id', 'visited_at']);
});
}
public function down(): void
{
Schema::dropIfExists('wechat_user_home_visits');
}
};

@ -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::create('venue_audit_logs', function (Blueprint $table) {
$table->id();
$table->foreignId('venue_id')->constrained('venues')->cascadeOnDelete();
$table->foreignId('admin_user_id')->nullable()->constrained('users')->nullOnDelete();
$table->string('action', 20);
$table->text('remark')->nullable();
$table->timestamps();
$table->index(['venue_id', 'created_at']);
});
}
public function down(): void
{
Schema::dropIfExists('venue_audit_logs');
}
};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

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,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-axKQV-pW.js";import{t as g}from"./listTableRowIndex-DDHXZmUA.js";import{t as _}from"./datetime-yJWaAvAa.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-C7HDPj8Y.js";import{t as g}from"./listTableRowIndex-IQDARgc9.js";import{t as _}from"./datetime-yJWaAvAa.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};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,2 @@
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/dynamicAdminRoutes-DnnzpsCY.js","assets/dynamicAdminRoutes-CVTiDgY_.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-C7HDPj8Y.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:``,password:``});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-DnnzpsCY.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,2 +0,0 @@
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/dynamicAdminRoutes-51hDIIRz.js","assets/dynamicAdminRoutes-eMySAHTb.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-axKQV-pW.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-51hDIIRz.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,u as a,v as o}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{u as s}from"./index-axKQV-pW.js";var c={};function l(s,c){let l=t(`a-alert`),u=t(`a-descriptions-item`),d=t(`a-descriptions`),f=t(`a-card`);return e(),i(f,{title:`系统设置 / 地图与第三方配置`},{default:n(()=>[o(l,{type:`info`,style:{"margin-bottom":`12px`}},{default:n(()=>[...c[0]||=[r(` 展示底图与后台地图选点已切换为`,-1),a(`strong`,null,`天地图`,-1),r(`(底图 `,-1),a(`code`,null,`vec_c`,-1),r(` / `,-1),a(`code`,null,`cva_c`,-1),r(`,国家 2000 经纬度)。库内经纬度仍为`,-1),a(`strong`,null,`腾讯 GCJ-02`,-1),r(`,展示时自动换算,`,-1),a(`strong`,null,`无需批量改库`,-1),r(`。微信导航仍用 GCJ-02。 微信内「一键导航」仍走腾讯/微信原生能力,与展示底图无关。 `,-1)]]),_:1}),o(l,{type:`warning`,style:{"margin-bottom":`12px`}},{default:n(()=>[...c[1]||=[a(`strong`,null,`本地开发localhost无法加入天地图白名单时`,-1),r(`已内置 Vite 代理,开发时瓦片/SDK 走 `,-1),a(`code`,null,`/tianditu-tile-proxy`,-1),r(``,-1),a(`code`,null,`/tianditu-api-proxy`,-1),r(`,并伪造已在白名单中的 Referer默认 `,-1),a(`code`,null,`https://szkp-map.langye.net/`,-1),r(`)。请确保天地图控制台已添加该正式域名;重启 `,-1),a(`code`,null,`npm run dev`,-1),r(` 后访问仍用 localhost 即可。可选:在 hosts 绑定 `,-1),a(`code`,null,`127.0.0.1 dev.szkp-map.langye.net`,-1),r(` 后用该域名打开项目。 `,-1)]]),_:1}),o(d,{column:1,bordered:``},{default:n(()=>[o(u,{label:`本地代理 Referer可选`},{default:n(()=>[...c[2]||=[a(`code`,null,`VITE_TIANDITU_DEV_REFERER=https://szkp-map.langye.net/`,-1),r(`(须与天地图白名单一致;设 `,-1),a(`code`,null,`VITE_TIANDITU_DEV_PROXY=0`,-1),r(` 可关闭代理) `,-1)]]),_:1}),o(u,{label:`H5 / 后台浏览器 Key`},{default:n(()=>[...c[3]||=[r(``,-1),a(`code`,null,`code/szkp-map-h5/.env`,-1),r(``,-1),a(`code`,null,`code/szkp-map-web/.env`,-1),r(` 配置 `,-1),a(`code`,null,`VITE_TIANDITU_TK=天地图开放平台应用 Key`,-1),r(`,并在控制台绑定正式/测试域名白名单。 `,-1)]]),_:1}),o(u,{label:`搜索 / 逆地理`},{default:n(()=>[...c[4]||=[r(` 后台地图选点`,-1),a(`strong`,null,`不经过 Laravel`,-1),r(`:搜索用天地图 JS `,-1),a(`code`,null,`T.LocalSearch`,-1),r(`,点击选点逆地理用浏览器请求天地图 `,-1),a(`code`,null,`geocoder`,-1),r(``,-1),a(`code`,null,`VITE_TIANDITU_TK`,-1),r(`)。`,-1),a(`code`,null,`/api/map/search`,-1),r(` 仅保留给其他场景,选点弹窗不会调用。 `,-1)]]),_:1}),o(u,{label:`导航(可选,保留)`},{default:n(()=>[...c[5]||=[r(` 微信 H5 导航仍可使用 `,-1),a(`code`,null,`VITE_TENCENT_MAP_KEY`,-1),r(` / `,-1),a(`code`,null,`VITE_TENCENT_MAP_REFERER`,-1),r(`(仅外链,非首页底图)。 `,-1)]]),_:1})]),_:1})]),_:1})}var u=s(c,[[`render`,l]]);export{u as default};
import{I as e,V as t,Y as n,_ as r,d as i,u as a,v as o}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{u as s}from"./index-C7HDPj8Y.js";var c={};function l(s,c){let l=t(`a-alert`),u=t(`a-descriptions-item`),d=t(`a-descriptions`),f=t(`a-card`);return e(),i(f,{title:`系统设置 / 地图与第三方配置`},{default:n(()=>[o(l,{type:`info`,style:{"margin-bottom":`12px`}},{default:n(()=>[...c[0]||=[r(` 展示底图与后台地图选点已切换为`,-1),a(`strong`,null,`天地图`,-1),r(`(底图 `,-1),a(`code`,null,`vec_c`,-1),r(` / `,-1),a(`code`,null,`cva_c`,-1),r(`,国家 2000 经纬度)。库内经纬度仍为`,-1),a(`strong`,null,`腾讯 GCJ-02`,-1),r(`,展示时自动换算,`,-1),a(`strong`,null,`无需批量改库`,-1),r(`。微信导航仍用 GCJ-02。 微信内「一键导航」仍走腾讯/微信原生能力,与展示底图无关。 `,-1)]]),_:1}),o(l,{type:`warning`,style:{"margin-bottom":`12px`}},{default:n(()=>[...c[1]||=[a(`strong`,null,`本地开发localhost无法加入天地图白名单时`,-1),r(`已内置 Vite 代理,开发时瓦片/SDK 走 `,-1),a(`code`,null,`/tianditu-tile-proxy`,-1),r(``,-1),a(`code`,null,`/tianditu-api-proxy`,-1),r(`,并伪造已在白名单中的 Referer默认 `,-1),a(`code`,null,`https://szkp-map.langye.net/`,-1),r(`)。请确保天地图控制台已添加该正式域名;重启 `,-1),a(`code`,null,`npm run dev`,-1),r(` 后访问仍用 localhost 即可。可选:在 hosts 绑定 `,-1),a(`code`,null,`127.0.0.1 dev.szkp-map.langye.net`,-1),r(` 后用该域名打开项目。 `,-1)]]),_:1}),o(d,{column:1,bordered:``},{default:n(()=>[o(u,{label:`本地代理 Referer可选`},{default:n(()=>[...c[2]||=[a(`code`,null,`VITE_TIANDITU_DEV_REFERER=https://szkp-map.langye.net/`,-1),r(`(须与天地图白名单一致;设 `,-1),a(`code`,null,`VITE_TIANDITU_DEV_PROXY=0`,-1),r(` 可关闭代理) `,-1)]]),_:1}),o(u,{label:`H5 / 后台浏览器 Key`},{default:n(()=>[...c[3]||=[r(``,-1),a(`code`,null,`code/szkp-map-h5/.env`,-1),r(``,-1),a(`code`,null,`code/szkp-map-web/.env`,-1),r(` 配置 `,-1),a(`code`,null,`VITE_TIANDITU_TK=天地图开放平台应用 Key`,-1),r(`,并在控制台绑定正式/测试域名白名单。 `,-1)]]),_:1}),o(u,{label:`搜索 / 逆地理`},{default:n(()=>[...c[4]||=[r(` 后台地图选点`,-1),a(`strong`,null,`不经过 Laravel`,-1),r(`:搜索用天地图 JS `,-1),a(`code`,null,`T.LocalSearch`,-1),r(`,点击选点逆地理用浏览器请求天地图 `,-1),a(`code`,null,`geocoder`,-1),r(``,-1),a(`code`,null,`VITE_TIANDITU_TK`,-1),r(`)。`,-1),a(`code`,null,`/api/map/search`,-1),r(` 仅保留给其他场景,选点弹窗不会调用。 `,-1)]]),_:1}),o(u,{label:`导航(可选,保留)`},{default:n(()=>[...c[5]||=[r(` 微信 H5 导航仍可使用 `,-1),a(`code`,null,`VITE_TENCENT_MAP_KEY`,-1),r(` / `,-1),a(`code`,null,`VITE_TENCENT_MAP_REFERER`,-1),r(`(仅外链,非首页底图)。 `,-1)]]),_:1})]),_:1})]),_:1})}var u=s(c,[[`render`,l]]);export{u 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-axKQV-pW.js";import{t as S}from"./datetime-yJWaAvAa.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-C7HDPj8Y.js";import{t as S}from"./datetime-yJWaAvAa.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};

File diff suppressed because one or more lines are too long

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,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-axKQV-pW.js";import{t as g}from"./listTableRowIndex-DDHXZmUA.js";import{n as _,t as v}from"./datetime-yJWaAvAa.js";import{t as y}from"./bookingType-DtnBG_bB.js";import{t as b}from"./reservationStatus-Bp3WxaV9.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-C7HDPj8Y.js";import{t as g}from"./listTableRowIndex-IQDARgc9.js";import{n as _,t as v}from"./datetime-yJWaAvAa.js";import{t as y}from"./bookingType-DtnBG_bB.js";import{t as b}from"./reservationStatus-Bp3WxaV9.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

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
.venue-address-coord-row[data-v-b1341515]{flex-wrap:wrap;align-items:center;gap:12px;width:100%;display:flex}.venue-address-coord-row__address[data-v-b1341515]{flex:45%;min-width:320px;max-width:100%}.venue-address-coord-row__lng[data-v-b1341515],.venue-address-coord-row__lat[data-v-b1341515]{flex:180px;width:200px;min-width:180px}.venue-address-coord-row__map[data-v-b1341515]{flex-shrink:0}.venue-form-split-label[data-v-b1341515]{color:var(--color-text-2);margin-bottom:8px;font-size:13px;font-weight:500}.venue-cover-carousel-wrap[data-v-b1341515]{flex-wrap:wrap;align-items:flex-start;gap:20px;width:100%;display:flex}.venue-cover-carousel-row__col[data-v-b1341515]{flex:320px;min-width:min(100%,320px)}.venue-cover-carousel-row__sub[data-v-b1341515]{color:var(--color-text-1);margin-bottom:8px;font-weight:500}.venue-gallery-grid[data-v-b1341515]{flex-wrap:wrap;align-items:flex-start;gap:12px;width:100%;display:flex}.venue-gallery-item[data-v-b1341515]{flex-direction:column;align-items:flex-start;gap:8px;display:flex}.venue-gallery-thumb[data-v-b1341515]{object-fit:cover;cursor:zoom-in;border:1px solid #e5e6eb;border-radius:4px;width:80px;height:50px}.venue-gallery-thumb--video[data-v-b1341515]{display:block}.venue-cover-thumb[data-v-b1341515]{object-fit:cover;border:1px solid #e5e6eb;border-radius:4px;width:120px;height:75px}.venue-audit-form[data-v-b1341515] .arco-form-item{margin-bottom:16px}.venue-audit-value-box[data-v-b1341515]{background:var(--color-fill-2);border:1px solid var(--color-border-2);white-space:pre-wrap;word-break:break-word;width:100%;min-height:32px;color:var(--color-text-1);border-radius:4px;padding:8px 12px;line-height:1.6}.venue-audit-value-box--multiline[data-v-b1341515]{min-height:80px}.venue-audit-value-box--changed[data-v-b1341515]{color:#f53f3f;background:#f53f3f0a;border-color:#f53f3f59}.venue-audit-media--changed[data-v-b1341515] .venue-gallery-thumb,img.venue-cover-thumb.venue-audit-media--changed[data-v-b1341515]{outline-offset:2px;outline:2px solid #f53f3f}.venue-audit-address-row[data-v-b1341515]{align-items:stretch}.venue-audit-address-row .venue-audit-value-box[data-v-b1341515]{align-items:center;display:flex}

@ -1 +0,0 @@
.venue-address-coord-row[data-v-3cf839e9]{flex-wrap:wrap;align-items:center;gap:12px;width:100%;display:flex}.venue-address-coord-row__address[data-v-3cf839e9]{flex:45%;min-width:320px;max-width:100%}.venue-address-coord-row__lng[data-v-3cf839e9],.venue-address-coord-row__lat[data-v-3cf839e9]{flex:180px;width:200px;min-width:180px}.venue-address-coord-row__map[data-v-3cf839e9]{flex-shrink:0}.venue-form-split-label[data-v-3cf839e9]{color:var(--color-text-2);margin-bottom:8px;font-size:13px;font-weight:500}.venue-cover-carousel-wrap[data-v-3cf839e9]{flex-wrap:wrap;align-items:flex-start;gap:20px;width:100%;display:flex}.venue-cover-carousel-row__col[data-v-3cf839e9]{flex:320px;min-width:min(100%,320px)}.venue-cover-carousel-row__sub[data-v-3cf839e9]{color:var(--color-text-1);margin-bottom:8px;font-weight:500}.venue-gallery-grid[data-v-3cf839e9]{flex-wrap:wrap;align-items:flex-start;gap:12px;width:100%;display:flex}.venue-gallery-item[data-v-3cf839e9]{flex-direction:column;align-items:flex-start;gap:8px;display:flex}.venue-gallery-thumb[data-v-3cf839e9]{object-fit:cover;cursor:zoom-in;border:1px solid #e5e6eb;border-radius:4px;width:80px;height:50px}.venue-gallery-thumb--video[data-v-3cf839e9]{display:block}

File diff suppressed because one or more lines are too long

@ -1 +1 @@
import{n as e,ot as t}from"./axios-CiYFffbI.js";import{I as n,N as r,V as i,Y as a,_ as o,it as s,p as c,u as l,v as u,y as d}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{c as f,s as p,u as m}from"./index-axKQV-pW.js";import{i as h,n as g,o as _,r as v,t as y}from"./h5Http-Dev8ozqN.js";var b={class:`m-verify-page`},x={class:`m-verify-card`},S=m(d({__name:`VerifyLogin`,setup(d){let m=f(),S=p(),C=s(!1),w=s(``);function T(){return S.path.startsWith(`/m/`)?`/m/verify`:`/h5/verify/scan`}function E(){w.value=w.value.replace(/\D/g,``).slice(0,6)}async function D(){if(E(),!/^\d{6}$/.test(w.value.trim())){e.warning(`请输入 6 位数字核销口令`);return}C.value=!0;try{let{data:t}=await _.post(`/verify-portal/login`,{password:w.value.trim()});localStorage.setItem(y,t.token),localStorage.setItem(`${y}_saved_at`,String(Date.now())),localStorage.setItem(g,`portal`),e.success(`登录成功`),m.replace(T())}catch(t){e.error(t?.response?.data?.message??`登录失败`)}finally{C.value=!1}}return r(()=>{localStorage.removeItem(v),localStorage.removeItem(h)}),(e,r)=>{let s=i(`a-input`),d=i(`a-button`);return n(),c(`div`,b,[r[4]||=l(`div`,{class:`m-verify-hero`},[l(`div`,{class:`m-verify-title`},`核销入口`)],-1),l(`div`,x,[r[2]||=l(`div`,{class:`m-verify-section-head`},`6 位数字核销口令`,-1),u(s,{modelValue:w.value,"onUpdate:modelValue":r[0]||=e=>w.value=e,maxlength:`6`,size:`large`,placeholder:`6 位数字口令`,class:`m-verify-pin`,style:{"margin-bottom":`12px`},inputmode:`numeric`,autocomplete:`one-time-code`,onInput:E,onKeyup:t(D,[`enter`])},null,8,[`modelValue`]),u(d,{type:`primary`,long:``,size:`large`,loading:C.value,onClick:D},{default:a(()=>[...r[1]||=[o(` 进入核销页 `,-1)]]),_:1},8,[`loading`]),r[3]||=l(`p`,{class:`m-verify-tip`},` 未点击核销页上的「退出」前会一直保持登录;退出后,下次再打开本链接需重新输入 6 位口令。若口令登录态过期或失效,也会自动回到本页。 `,-1)])])}}}),[[`__scopeId`,`data-v-0f087851`]]);export{S as default};
import{n as e,ot as t}from"./axios-CiYFffbI.js";import{I as n,N as r,V as i,Y as a,_ as o,it as s,p as c,u as l,v as u,y as d}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{c as f,s as p,u as m}from"./index-C7HDPj8Y.js";import{i as h,n as g,o as _,r as v,t as y}from"./h5Http-B0amz0Ts.js";var b={class:`m-verify-page`},x={class:`m-verify-card`},S=m(d({__name:`VerifyLogin`,setup(d){let m=f(),S=p(),C=s(!1),w=s(``);function T(){return S.path.startsWith(`/m/`)?`/m/verify`:`/h5/verify/scan`}function E(){w.value=w.value.replace(/\D/g,``).slice(0,6)}async function D(){if(E(),!/^\d{6}$/.test(w.value.trim())){e.warning(`请输入 6 位数字核销口令`);return}C.value=!0;try{let{data:t}=await _.post(`/verify-portal/login`,{password:w.value.trim()});localStorage.setItem(y,t.token),localStorage.setItem(`${y}_saved_at`,String(Date.now())),localStorage.setItem(g,`portal`),e.success(`登录成功`),m.replace(T())}catch(t){e.error(t?.response?.data?.message??`登录失败`)}finally{C.value=!1}}return r(()=>{localStorage.removeItem(v),localStorage.removeItem(h)}),(e,r)=>{let s=i(`a-input`),d=i(`a-button`);return n(),c(`div`,b,[r[4]||=l(`div`,{class:`m-verify-hero`},[l(`div`,{class:`m-verify-title`},`核销入口`)],-1),l(`div`,x,[r[2]||=l(`div`,{class:`m-verify-section-head`},`6 位数字核销口令`,-1),u(s,{modelValue:w.value,"onUpdate:modelValue":r[0]||=e=>w.value=e,maxlength:`6`,size:`large`,placeholder:`6 位数字口令`,class:`m-verify-pin`,style:{"margin-bottom":`12px`},inputmode:`numeric`,autocomplete:`one-time-code`,onInput:E,onKeyup:t(D,[`enter`])},null,8,[`modelValue`]),u(d,{type:`primary`,long:``,size:`large`,loading:C.value,onClick:D},{default:a(()=>[...r[1]||=[o(` 进入核销页 `,-1)]]),_:1},8,[`loading`]),r[3]||=l(`p`,{class:`m-verify-tip`},` 未点击核销页上的「退出」前会一直保持登录;退出后,下次再打开本链接需重新输入 6 位口令。若口令登录态过期或失效,也会自动回到本页。 `,-1)])])}}}),[[`__scopeId`,`data-v-0f087851`]]);export{S as default};

@ -0,0 +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,p as 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{t as h}from"./listTableRowIndex-IQDARgc9.js";import{t as g}from"./datetime-yJWaAvAa.js";var _=[`src`],v={key:1},y=p({__name:`WechatUsers`,setup(p){let y=s(!1),b=s(!1),x=s([]),S=l({current:1,pageSize:15,total:0}),C=s(``),w=s(``),T=s(``);function E(e){return e?.length?e.map(e=>`${e.title}${e.status_label}`).join(``):``}async function D(){y.value=!0;try{let{data:e}=await m.get(`/wechat-users`,{params:{page:S.current,page_size:S.pageSize,keyword:C.value.trim()||void 0,has_activity_reservation:w.value===``?void 0:w.value===`1`,has_ticket_grab_reservation:T.value===``?void 0:T.value===`1`}});x.value=e.data??[],S.total=e.total??0}catch(t){e.error(t?.response?.data?.message??`加载失败`)}finally{y.value=!1}}function O(){S.current=1,D()}function k(e){S.current=e,D()}async function A(){b.value=!0;try{let t=(await m.get(`/wechat-users/export`,{params:{keyword:C.value.trim()||void 0,has_activity_reservation:w.value===``?void 0:w.value===`1`,has_ticket_grab_reservation:T.value===``?void 0:T.value===`1`},responseType:`blob`,timeout:12e4})).data,n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=`微信用户列表-${new Date().toISOString().slice(0,10)}.xlsx`,r.click(),URL.revokeObjectURL(n),e.success(`已导出`)}catch(t){e.error(t?.response?.data?.message??`导出失败`)}finally{b.value=!1}}return n(()=>void D()),(e,n)=>{let s=r(`a-input`),l=r(`a-option`),p=r(`a-select`),m=r(`a-button`),D=r(`a-space`),j=r(`a-table-column`),M=r(`a-avatar`),N=r(`a-table`),P=r(`a-card`);return t(),o(P,{title:`用户管理 / 用户列表`},{default:i(()=>[f(D,{wrap:``,style:{"margin-bottom":`12px`}},{default:i(()=>[f(s,{modelValue:C.value,"onUpdate:modelValue":n[0]||=e=>C.value=e,placeholder:`搜索手机号或昵称`,style:{width:`240px`},"allow-clear":``,onPressEnter:O},null,8,[`modelValue`]),f(p,{modelValue:w.value,"onUpdate:modelValue":n[1]||=e=>w.value=e,"allow-clear":``,placeholder:`是否预约活动`,style:{width:`150px`}},{default:i(()=>[f(l,{value:`1`},{default:i(()=>[...n[3]||=[a(``,-1)]]),_:1}),f(l,{value:`0`},{default:i(()=>[...n[4]||=[a(``,-1)]]),_:1})]),_:1},8,[`modelValue`]),f(p,{modelValue:T.value,"onUpdate:modelValue":n[2]||=e=>T.value=e,"allow-clear":``,placeholder:`是否预约抢票`,style:{width:`150px`}},{default:i(()=>[f(l,{value:`1`},{default:i(()=>[...n[5]||=[a(``,-1)]]),_:1}),f(l,{value:`0`},{default:i(()=>[...n[6]||=[a(``,-1)]]),_:1})]),_:1},8,[`modelValue`]),f(m,{type:`primary`,onClick:O},{default:i(()=>[...n[7]||=[a(`查询`,-1)]]),_:1}),f(m,{loading:b.value,onClick:A},{default:i(()=>[...n[8]||=[a(`导出`,-1)]]),_:1},8,[`loading`])]),_:1}),f(N,{class:`list-data-table`,data:x.value,loading:y.value,"row-key":`id`,pagination:{current:S.current,pageSize:S.pageSize,total:S.total,showTotal:!0},onPageChange:k},{columns:i(()=>[f(j,{title:``,width:72},{cell:i(({rowIndex:e})=>[a(c(d(h)(e,S.current,S.pageSize)),1)]),_:1}),f(j,{title:`头像`,width:72},{cell:i(({record:e})=>[f(M,{size:40},{default:i(()=>[e.avatar_url?(t(),u(`img`,{key:0,src:e.avatar_url,alt:``},null,8,_)):(t(),u(`span`,v,`访`))]),_:2},1024)]),_:1}),f(j,{title:`手机号`,"data-index":`phone`,width:140}),f(j,{title:`昵称`,"data-index":`nickname`,width:120,ellipsis:``,tooltip:``}),f(j,{title:`姓名`,"data-index":`real_name`,width:100,ellipsis:``,tooltip:``}),f(j,{title:`访问量`,"data-index":`visit_count`,width:90,align:`right`}),f(j,{title:`预约活动`,"min-width":180,ellipsis:``,tooltip:``},{cell:i(({record:e})=>[a(c(E(e.activity_reservations)),1)]),_:1}),f(j,{title:`预约抢票`,"min-width":180,ellipsis:``,tooltip:``},{cell:i(({record:e})=>[a(c(E(e.ticket_grab_reservations)),1)]),_:1}),f(j,{title:`注册时间`,width:180},{cell:i(({record:e})=>[a(c(d(g)(e.created_at)),1)]),_:1})]),_:1},8,[`data`,`loading`,`pagination`])]),_:1})}}});export{y as default};

@ -1 +0,0 @@
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,p as 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{t as h}from"./listTableRowIndex-DDHXZmUA.js";var g=[`src`],_={key:1},v=p({__name:`WechatUsers`,setup(p){let v=s(!1),y=s([]),b=l({current:1,pageSize:15,total:0}),x=s(``);async function S(){v.value=!0;try{let{data:e}=await m.get(`/wechat-users`,{params:{page:b.current,page_size:b.pageSize,keyword:x.value.trim()||void 0}});y.value=e.data??[],b.total=e.total??0}catch(t){e.error(t?.response?.data?.message??`加载失败`)}finally{v.value=!1}}function C(){b.current=1,S()}function w(e){b.current=e,S()}return n(()=>void S()),(e,n)=>{let s=r(`a-input`),l=r(`a-button`),p=r(`a-space`),m=r(`a-table-column`),S=r(`a-avatar`),T=r(`a-table`),E=r(`a-card`);return t(),o(E,{title:`用户管理 / 用户列表`},{default:i(()=>[f(p,{style:{"margin-bottom":`12px`},wrap:``},{default:i(()=>[f(s,{modelValue:x.value,"onUpdate:modelValue":n[0]||=e=>x.value=e,placeholder:`搜索手机号或昵称`,style:{width:`240px`},"allow-clear":``,onPressEnter:C},null,8,[`modelValue`]),f(l,{type:`primary`,onClick:C},{default:i(()=>[...n[1]||=[a(`查询`,-1)]]),_:1})]),_:1}),f(T,{class:`list-data-table`,data:y.value,loading:v.value,"row-key":`id`,pagination:{current:b.current,pageSize:b.pageSize,total:b.total,showTotal:!0},onPageChange:w},{columns:i(()=>[f(m,{title:``,width:52},{cell:i(({rowIndex:e})=>[a(c(d(h)(e,b.current,b.pageSize)),1)]),_:1}),f(m,{title:`头像`,width:72},{cell:i(({record:e})=>[f(S,{size:40},{default:i(()=>[e.avatar_url?(t(),u(`img`,{key:0,src:e.avatar_url,alt:``},null,8,g)):(t(),u(`span`,_,`访`))]),_:2},1024)]),_:1}),f(m,{title:`手机号`,"data-index":`phone`,width:140}),f(m,{title:`昵称`,"data-index":`nickname`,width:140,ellipsis:``,tooltip:``}),f(m,{title:`姓名`,"data-index":`real_name`,width:120,ellipsis:``,tooltip:``}),f(m,{title:`注册时间`,"data-index":`created_at`,width:180})]),_:1},8,[`data`,`loading`,`pagination`])]),_:1})}}});export{v as default};

@ -0,0 +1,2 @@
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Dashboard-BINWeTvn.js","assets/index-C7HDPj8Y.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/xlsx-C0ANE5gA.js","assets/hikPdcClient-9YlD6z0w.js","assets/Dashboard-CWTgom4X.css","assets/VenueList-C660MFGu.js","assets/RichEditorField-D5Rpsgt7.js","assets/RichEditorField-CTiiQMLC.css","assets/adminMediaLimits-BbvlGcmA.js","assets/mapGeo-ARgXuZ-4.js","assets/listTableRowIndex-IQDARgc9.js","assets/mediaUrl-DMUQQoCr.js","assets/VenueList-CMRTVqtf.css","assets/ActivityList-CfIUaszb.js","assets/h5Http-B0amz0Ts.js","assets/ActivityList-m-Aeoiaj.css","assets/Registrations-Y6DKkaIt.js","assets/bookingType-DtnBG_bB.js","assets/datetime-yJWaAvAa.js","assets/reservationStatus-Bp3WxaV9.js","assets/Registrations-D38-egSu.css","assets/Verify-B0R8yvF3.js","assets/Verify-CYgC_s-p.css","assets/Blacklist-CZNJxoCZ.js","assets/Blacklist-CtQQ6LfC.css","assets/TicketGrabList-9lDk-hc0.js","assets/TicketGrabList-Dheb-3hV.css","assets/TicketGrabRegistrations-DjLqy-91.js","assets/TicketGrabRegistrations-BkH9w3sn.css","assets/TicketGrabVerify-B05aeI2p.js","assets/TicketGrabVerify-C99ifrCo.css","assets/StudyTourList-DicwrO7j.js","assets/StudyTourList-B-A_zGvm.css","assets/Monitor-C8m9bpjj.js","assets/PagePlaceholder-BSpn2Dsj.js","assets/Leaderboard-BYdoua9y.js","assets/Alerts-BIUQ6GHj.js","assets/HikPeopleCounting-B_ApQLvP.js","assets/HikPeopleCounting-vcrBFAvB.css","assets/Overview-BWXsz5EL.js","assets/Regions-CtO9oc6T.js","assets/Categories-c7JkdJ0r.js","assets/Exports-B-Blogeb.js","assets/Admins-DjSZW-VF.js","assets/Roles-CYSSQij8.js","assets/Menus-BildY0E-.js","assets/Menus-CIRuEnr6.css","assets/AuditLogs-nOUoc-73.js","assets/AuditLogs-Bd90uV6l.css","assets/Wechat-CKWcbeo9.js","assets/Map-_u2sEQSQ.js","assets/Notifications-2080YJrP.js","assets/SystemLogs-Hq4n1XxC.js","assets/SystemLogs-DSVhElsT.css","assets/Dictionaries-oyMC3oH7.js","assets/WechatUsers-D9Lqu4-_.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-BINWeTvn.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9])),"/venues":()=>t(()=>import(`./VenueList-C660MFGu.js`),__vite__mapDeps([10,1,2,3,4,5,6,11,12,13,14,15,16,17])),"/activities":()=>t(()=>import(`./ActivityList-CfIUaszb.js`),__vite__mapDeps([18,1,2,3,4,5,6,11,12,7,19,13,14,15,20])),"/activities/registrations":()=>t(()=>import(`./Registrations-Y6DKkaIt.js`),__vite__mapDeps([21,1,2,3,4,5,6,7,22,23,15,24,25])),"/activities/verify":()=>t(()=>import(`./Verify-B0R8yvF3.js`),__vite__mapDeps([26,1,2,3,4,5,6,7,22,23,15,24,27])),"/activities/blacklist":()=>t(()=>import(`./Blacklist-CZNJxoCZ.js`),__vite__mapDeps([28,1,2,3,4,5,6,23,29])),"/ticket-grab-events":()=>t(()=>import(`./TicketGrabList-9lDk-hc0.js`),__vite__mapDeps([30,1,2,3,4,5,6,11,12,7,19,14,15,16,31])),"/ticket-grab-events/registrations":()=>t(()=>import(`./TicketGrabRegistrations-DjLqy-91.js`),__vite__mapDeps([32,1,2,3,4,5,6,7,22,23,15,24,33])),"/ticket-grab-events/verify":()=>t(()=>import(`./TicketGrabVerify-B05aeI2p.js`),__vite__mapDeps([34,1,2,3,4,5,6,22,23,15,24,35])),"/study-tours":()=>t(()=>import(`./StudyTourList-DicwrO7j.js`),__vite__mapDeps([36,1,2,3,4,5,6,11,12,13,15,16,37])),"/traffic":()=>t(()=>import(`./Monitor-C8m9bpjj.js`),__vite__mapDeps([38,3,39])),"/traffic/leaderboard":()=>t(()=>import(`./Leaderboard-BYdoua9y.js`),__vite__mapDeps([40,3,39])),"/traffic/alerts":()=>t(()=>import(`./Alerts-BIUQ6GHj.js`),__vite__mapDeps([41,3,39])),"/hik-camera":()=>t(()=>import(`./HikPeopleCounting-B_ApQLvP.js`),__vite__mapDeps([42,1,2,3,4,5,6,8,43])),"/hik-camera/HikPeopleCounting":()=>t(()=>import(`./HikPeopleCounting-B_ApQLvP.js`),__vite__mapDeps([42,1,2,3,4,5,6,8,43])),"/stats":()=>t(()=>import(`./Overview-BWXsz5EL.js`),__vite__mapDeps([44,3,39])),"/stats/regions":()=>t(()=>import(`./Regions-CtO9oc6T.js`),__vite__mapDeps([45,3,39])),"/stats/categories":()=>t(()=>import(`./Categories-c7JkdJ0r.js`),__vite__mapDeps([46,3,39])),"/stats/exports":()=>t(()=>import(`./Exports-B-Blogeb.js`),__vite__mapDeps([47,3,39])),"/system/admins":()=>t(()=>import(`./Admins-DjSZW-VF.js`),__vite__mapDeps([48,2,3,5,15])),"/system/roles":()=>t(()=>import(`./Roles-CYSSQij8.js`),__vite__mapDeps([49,1,2,3,4,5,6])),"/system/menus":()=>t(()=>import(`./Menus-BildY0E-.js`),__vite__mapDeps([50,1,2,3,4,5,6,51])),"/system/audit-logs":()=>t(()=>import(`./AuditLogs-nOUoc-73.js`),__vite__mapDeps([52,1,2,3,4,5,6,23,15,53])),"/settings/wechat":()=>t(()=>import(`./Wechat-CKWcbeo9.js`),__vite__mapDeps([54,3,39])),"/settings/map":()=>t(()=>import(`./Map-_u2sEQSQ.js`),__vite__mapDeps([55,1,2,3,4,5,6])),"/settings/notifications":()=>t(()=>import(`./Notifications-2080YJrP.js`),__vite__mapDeps([56,3,39])),"/settings/system-logs":()=>t(()=>import(`./SystemLogs-Hq4n1XxC.js`),__vite__mapDeps([57,1,2,3,4,5,6,23,58])),"/settings/dictionaries":()=>t(()=>import(`./Dictionaries-oyMC3oH7.js`),__vite__mapDeps([59,2,3,5])),"/wechat-users":()=>t(()=>import(`./WechatUsers-D9Lqu4-_.js`),__vite__mapDeps([60,2,3,5,23,15]))};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-eMySAHTb.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-CVTiDgY_.js";export{o as flattenMenuPaths,n as getCachedAllowedPaths,i as getFirstMenuPath,t as isDynamicRoutesRegistered,e as pickDefaultPath,r as registerDynamicAdminRoutes,a as resetDynamicAdminRoutes};

@ -1,2 +0,0 @@
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Dashboard-JFrwpFEr.js","assets/index-axKQV-pW.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/hikPdcClient-9YlD6z0w.js","assets/Dashboard-CEidEXey.css","assets/VenueList-5OqqMw8m.js","assets/RichEditorField-CdYdbCrH.js","assets/RichEditorField-CTiiQMLC.css","assets/adminMediaLimits-D12la4Im.js","assets/mapGeo-CpG7j8AT.js","assets/listTableRowIndex-DDHXZmUA.js","assets/mediaUrl-DMUQQoCr.js","assets/VenueList-CV7_fRf9.css","assets/ActivityList-Clek2fh9.js","assets/xlsx-BP_eUM5j.js","assets/h5Http-Dev8ozqN.js","assets/ActivityList-BWhdlC4x.css","assets/Registrations-BUG9RVCX.js","assets/bookingType-DtnBG_bB.js","assets/datetime-yJWaAvAa.js","assets/reservationStatus-Bp3WxaV9.js","assets/Registrations-D38-egSu.css","assets/Verify-CjqTP4y6.js","assets/Verify-CYgC_s-p.css","assets/Blacklist-r6-hdIMY.js","assets/Blacklist-CtQQ6LfC.css","assets/TicketGrabList-Dl23qXrs.js","assets/TicketGrabList-Dheb-3hV.css","assets/TicketGrabRegistrations-DBRqrj7p.js","assets/TicketGrabRegistrations-BkH9w3sn.css","assets/TicketGrabVerify-DYR2lKnS.js","assets/TicketGrabVerify-C99ifrCo.css","assets/StudyTourList-PNlljRLN.js","assets/StudyTourList-B-A_zGvm.css","assets/Monitor-C8m9bpjj.js","assets/PagePlaceholder-BSpn2Dsj.js","assets/Leaderboard-BYdoua9y.js","assets/Alerts-BIUQ6GHj.js","assets/HikPeopleCounting-CCJmKaLU.js","assets/HikPeopleCounting-vcrBFAvB.css","assets/Overview-BWXsz5EL.js","assets/Regions-CtO9oc6T.js","assets/Categories-c7JkdJ0r.js","assets/Exports-B-Blogeb.js","assets/Admins-DG8-wbbd.js","assets/Roles-DJRWRdMm.js","assets/Menus-D53EjotH.js","assets/Menus-CIRuEnr6.css","assets/AuditLogs-mKIUpaAu.js","assets/AuditLogs-Bd90uV6l.css","assets/Wechat-CKWcbeo9.js","assets/Map-B0ZoYA9Y.js","assets/Notifications-2080YJrP.js","assets/SystemLogs-CLdEaCfQ.js","assets/SystemLogs-DSVhElsT.css","assets/Dictionaries-oyMC3oH7.js","assets/WechatUsers-TrILQC1a.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-JFrwpFEr.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8])),"/venues":()=>t(()=>import(`./VenueList-5OqqMw8m.js`),__vite__mapDeps([9,1,2,3,4,5,6,10,11,12,13,14,15,16])),"/activities":()=>t(()=>import(`./ActivityList-Clek2fh9.js`),__vite__mapDeps([17,1,2,3,4,5,6,10,11,18,19,12,13,14,20])),"/activities/registrations":()=>t(()=>import(`./Registrations-BUG9RVCX.js`),__vite__mapDeps([21,1,2,3,4,5,6,18,22,23,14,24,25])),"/activities/verify":()=>t(()=>import(`./Verify-CjqTP4y6.js`),__vite__mapDeps([26,1,2,3,4,5,6,18,22,23,14,24,27])),"/activities/blacklist":()=>t(()=>import(`./Blacklist-r6-hdIMY.js`),__vite__mapDeps([28,1,2,3,4,5,6,23,29])),"/ticket-grab-events":()=>t(()=>import(`./TicketGrabList-Dl23qXrs.js`),__vite__mapDeps([30,1,2,3,4,5,6,10,11,18,19,13,14,15,31])),"/ticket-grab-events/registrations":()=>t(()=>import(`./TicketGrabRegistrations-DBRqrj7p.js`),__vite__mapDeps([32,1,2,3,4,5,6,18,22,23,14,24,33])),"/ticket-grab-events/verify":()=>t(()=>import(`./TicketGrabVerify-DYR2lKnS.js`),__vite__mapDeps([34,1,2,3,4,5,6,22,23,14,24,35])),"/study-tours":()=>t(()=>import(`./StudyTourList-PNlljRLN.js`),__vite__mapDeps([36,1,2,3,4,5,6,10,11,12,14,15,37])),"/traffic":()=>t(()=>import(`./Monitor-C8m9bpjj.js`),__vite__mapDeps([38,3,39])),"/traffic/leaderboard":()=>t(()=>import(`./Leaderboard-BYdoua9y.js`),__vite__mapDeps([40,3,39])),"/traffic/alerts":()=>t(()=>import(`./Alerts-BIUQ6GHj.js`),__vite__mapDeps([41,3,39])),"/hik-camera":()=>t(()=>import(`./HikPeopleCounting-CCJmKaLU.js`),__vite__mapDeps([42,1,2,3,4,5,6,7,43])),"/hik-camera/HikPeopleCounting":()=>t(()=>import(`./HikPeopleCounting-CCJmKaLU.js`),__vite__mapDeps([42,1,2,3,4,5,6,7,43])),"/stats":()=>t(()=>import(`./Overview-BWXsz5EL.js`),__vite__mapDeps([44,3,39])),"/stats/regions":()=>t(()=>import(`./Regions-CtO9oc6T.js`),__vite__mapDeps([45,3,39])),"/stats/categories":()=>t(()=>import(`./Categories-c7JkdJ0r.js`),__vite__mapDeps([46,3,39])),"/stats/exports":()=>t(()=>import(`./Exports-B-Blogeb.js`),__vite__mapDeps([47,3,39])),"/system/admins":()=>t(()=>import(`./Admins-DG8-wbbd.js`),__vite__mapDeps([48,2,3,5,14])),"/system/roles":()=>t(()=>import(`./Roles-DJRWRdMm.js`),__vite__mapDeps([49,1,2,3,4,5,6])),"/system/menus":()=>t(()=>import(`./Menus-D53EjotH.js`),__vite__mapDeps([50,1,2,3,4,5,6,51])),"/system/audit-logs":()=>t(()=>import(`./AuditLogs-mKIUpaAu.js`),__vite__mapDeps([52,1,2,3,4,5,6,23,14,53])),"/settings/wechat":()=>t(()=>import(`./Wechat-CKWcbeo9.js`),__vite__mapDeps([54,3,39])),"/settings/map":()=>t(()=>import(`./Map-B0ZoYA9Y.js`),__vite__mapDeps([55,1,2,3,4,5,6])),"/settings/notifications":()=>t(()=>import(`./Notifications-2080YJrP.js`),__vite__mapDeps([56,3,39])),"/settings/system-logs":()=>t(()=>import(`./SystemLogs-CLdEaCfQ.js`),__vite__mapDeps([57,1,2,3,4,5,6,23,58])),"/settings/dictionaries":()=>t(()=>import(`./Dictionaries-oyMC3oH7.js`),__vite__mapDeps([59,2,3,5])),"/wechat-users":()=>t(()=>import(`./WechatUsers-TrILQC1a.js`),__vite__mapDeps([60,2,3,5,14]))};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};

File diff suppressed because one or more lines are too long

@ -1 +1 @@
var e=Math.PI;function t(e,t){return e<72.004||e>137.8347||t<.8293||t>55.8271}function n(t,n){let r=-100+2*t+3*n+.2*n*n+.1*t*n+.2*Math.sqrt(Math.abs(t));return r+=(20*Math.sin(6*t*e)+20*Math.sin(2*t*e))*2/3,r+=(20*Math.sin(n*e)+40*Math.sin(n/3*e))*2/3,r+=(160*Math.sin(n/12*e)+320*Math.sin(n*e/30))*2/3,r}function r(t,n){let r=300+t+2*n+.1*t*t+.1*t*n+.1*Math.sqrt(Math.abs(t));return r+=(20*Math.sin(6*t*e)+20*Math.sin(2*t*e))*2/3,r+=(20*Math.sin(t*e)+40*Math.sin(t/3*e))*2/3,r+=(150*Math.sin(t/12*e)+300*Math.sin(t/30*e))*2/3,r}function i(i,a){if(t(i,a))return{lng:i,lat:a};let o=6378245,s=.006693421622965943,c=n(i-105,a-35),l=r(i-105,a-35),u=a/180*e,d=Math.sin(u);d=1-s*d*d;let f=Math.sqrt(d);return c=c*180/(o*(1-s)/(d*f)*e),l=l*180/(o/f*Math.cos(u)*e),{lng:i+l,lat:a+c}}function a(e,n){if(t(e,n))return{lng:e,lat:n};let r=e,a=n;for(let t=0;t<2;t++){let t=i(r,a);r=e-(t.lng-r),a=n-(t.lat-a)}return{lng:r,lat:a}}var o=null;function s(){return!1}function c(){return s()?`/tianditu-tile-proxy`:`https://t0.tianditu.gov.cn`}function l(e){return`${c()}/vec_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=${e}`}function u(e){return`${c()}/cva_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=${e}`}function d(){return`877209ff7cbcb8d3de06ef57999f27df`}function f(e,t=!1){let n=window.T,r=new n.TileLayer(l(e),{minZoom:1,maxZoom:18});return t?[r]:[r,new n.TileLayer(u(e),{minZoom:1,maxZoom:18})]}function p(e,t){let n=a(e,t);return new window.T.LngLat(n.lng,n.lat)}async function m(){if(typeof window>`u`)throw Error(`天地图仅支持浏览器环境`);if(window.T)return;let e=d();if(!e)throw Error(`请先配置 VITE_TIANDITU_TK天地图开放平台应用 Key`);if(o||=new Promise((t,n)=>{let r=document.createElement(`script`);r.src=`${s()?`/tianditu-api-proxy`:`https://api.tianditu.gov.cn`}/api?v=4.0&tk=${encodeURIComponent(e)}`,r.async=!0,r.onload=()=>t(),r.onerror=()=>n(Error(`天地图 SDK 加载失败`)),document.head.appendChild(r)}),await o,!window.T)throw Error(`天地图 SDK 未就绪`)}function h(e,t,n,r,i){let a=d(),o=i?.simple===!0,s=new window.T.Map(e,{projection:`EPSG:4326`,layers:f(a,o)});return s.centerAndZoom(p(t,n),r),s}function g(e,t,n,r){let i=window.T;t.overlay&&=(e.removeOverLay(t.overlay),null);let a=new i.Marker(p(r,n));e.addOverLay(a),t.overlay=a}function _(e,t){t&&e.removeOverLay(t)}function v(e,t,n,r=13){e.checkResize?.(),e.centerAndZoom(p(t,n),r),setTimeout(()=>{e.checkResize?.(),e.centerAndZoom(p(t,n),r)},120)}function y(e){let t=i(e.lnglat.getLng(),e.lnglat.getLat());return{lat:Number(t.lat.toFixed(6)),lng:Number(t.lng.toFixed(6))}}function b(e,t){e.addEventListener(`click`,e=>{let{lat:n,lng:r}=y(e);t(n,r)})}function x(){return s()?`/tianditu-api-proxy`:`https://api.tianditu.gov.cn`}function S(e){let t=e.code??e.status,n=String(e.msg??e.message??e.resolve??``).trim();return t===301012||n.includes(`权限`)?`天地图 Key 权限不足:请在控制台为该应用开通「地名搜索」并在浏览器访问(本地开发需 Vite 代理)。`:t===1e3||t===`1000`?null:t!=null&&String(t)!==`0`&&Number(t)!==0?n||`天地图请求失败`:null}function C(e,t){let n=t.trim();if(!n)return Promise.resolve([]);let r=window.T;return r?.LocalSearch?new Promise((t,a)=>{try{new r.LocalSearch(e,{pageCapacity:15,onSearchComplete(e){try{if(parseInt(String(e.getResultType?.()??`1`),10)!==1){t([]);return}let n=e.getPois?.()??[],r=[];for(let e of n){let t=String(e.lonlat??``),n=null,a=null;if(t.includes(`,`)){let[e,r]=t.split(`,`).map(e=>e.trim());n=Number(e),a=Number(r)}if(!Number.isFinite(a)||!Number.isFinite(n))continue;let o=i(n,a);r.push({title:String(e.name??``),address:String(e.address??``),lat:o.lat,lng:o.lng})}t(r)}catch(e){a(e)}}}).search(n)}catch(e){a(e)}}):Promise.reject(Error(`天地图 LocalSearch 未加载,请确认 SDK 已初始化`))}async function w(e,t){let n=d();if(!n)throw Error(`未配置 VITE_TIANDITU_TK`);let r=a(t,e),i=JSON.stringify({lon:r.lng,lat:r.lat,ver:1}),o=`${x()}/geocoder?postStr=${encodeURIComponent(i)}&type=geocode&tk=${encodeURIComponent(n)}`,s=await(await fetch(o)).json(),c=S(s);if(c)throw Error(c);let l=s.result??{},u=l.addressComponent??{};return{address:String(l.formatted_address??l.address??``).trim(),province:u.province?String(u.province):void 0,city:u.city?String(u.city):void 0,district:u.district?String(u.district):u.county?String(u.county):void 0}}async function T(e,t){let n=t.trim();return n?C(e,n):[]}async function E(e,t){return w(e,t)}export{h as a,g as c,_ as i,T as n,m as o,b as r,v as s,E as t};
var e=Math.PI;function t(e,t){return e<72.004||e>137.8347||t<.8293||t>55.8271}function n(t,n){let r=-100+2*t+3*n+.2*n*n+.1*t*n+.2*Math.sqrt(Math.abs(t));return r+=(20*Math.sin(6*t*e)+20*Math.sin(2*t*e))*2/3,r+=(20*Math.sin(n*e)+40*Math.sin(n/3*e))*2/3,r+=(160*Math.sin(n/12*e)+320*Math.sin(n*e/30))*2/3,r}function r(t,n){let r=300+t+2*n+.1*t*t+.1*t*n+.1*Math.sqrt(Math.abs(t));return r+=(20*Math.sin(6*t*e)+20*Math.sin(2*t*e))*2/3,r+=(20*Math.sin(t*e)+40*Math.sin(t/3*e))*2/3,r+=(150*Math.sin(t/12*e)+300*Math.sin(t/30*e))*2/3,r}function i(i,a){if(t(i,a))return{lng:i,lat:a};let o=6378245,s=.006693421622965943,c=n(i-105,a-35),l=r(i-105,a-35),u=a/180*e,d=Math.sin(u);d=1-s*d*d;let f=Math.sqrt(d);return c=c*180/(o*(1-s)/(d*f)*e),l=l*180/(o/f*Math.cos(u)*e),{lng:i+l,lat:a+c}}function a(e,n){if(t(e,n))return{lng:e,lat:n};let r=e,a=n;for(let t=0;t<2;t++){let t=i(r,a);r=e-(t.lng-r),a=n-(t.lat-a)}return{lng:r,lat:a}}var o=null;function s(){return!1}function c(){return s()?`/tianditu-tile-proxy`:`https://t0.tianditu.gov.cn`}function l(e){return`${c()}/vec_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=${e}`}function u(e){return`${c()}/cva_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=${e}`}function d(){return`ebd6693edf7730d8f8f9a7ba1719f5c1`}function f(e,t=!1){let n=window.T,r=new n.TileLayer(l(e),{minZoom:1,maxZoom:18});return t?[r]:[r,new n.TileLayer(u(e),{minZoom:1,maxZoom:18})]}function p(e,t){let n=a(e,t);return new window.T.LngLat(n.lng,n.lat)}async function m(){if(typeof window>`u`)throw Error(`天地图仅支持浏览器环境`);if(window.T)return;let e=d();if(!e)throw Error(`请先配置 VITE_TIANDITU_TK天地图开放平台应用 Key`);if(o||=new Promise((t,n)=>{let r=document.createElement(`script`);r.src=`${s()?`/tianditu-api-proxy`:`https://api.tianditu.gov.cn`}/api?v=4.0&tk=${encodeURIComponent(e)}`,r.async=!0,r.onload=()=>t(),r.onerror=()=>n(Error(`天地图 SDK 加载失败`)),document.head.appendChild(r)}),await o,!window.T)throw Error(`天地图 SDK 未就绪`)}function h(e,t,n,r,i){let a=d(),o=i?.simple===!0,s=new window.T.Map(e,{projection:`EPSG:4326`,layers:f(a,o)});return s.centerAndZoom(p(t,n),r),s}function g(e,t,n,r){let i=window.T;t.overlay&&=(e.removeOverLay(t.overlay),null);let a=new i.Marker(p(r,n));e.addOverLay(a),t.overlay=a}function _(e,t){t&&e.removeOverLay(t)}function v(e,t,n,r=13){e.checkResize?.(),e.centerAndZoom(p(t,n),r),setTimeout(()=>{e.checkResize?.(),e.centerAndZoom(p(t,n),r)},120)}function y(e){let t=i(e.lnglat.getLng(),e.lnglat.getLat());return{lat:Number(t.lat.toFixed(6)),lng:Number(t.lng.toFixed(6))}}function b(e,t){e.addEventListener(`click`,e=>{let{lat:n,lng:r}=y(e);t(n,r)})}function x(){return s()?`/tianditu-api-proxy`:`https://api.tianditu.gov.cn`}function S(e){let t=e.code??e.status,n=String(e.msg??e.message??e.resolve??``).trim();return t===301012||n.includes(`权限`)?`天地图 Key 权限不足:请在控制台为该应用开通「地名搜索」并在浏览器访问(本地开发需 Vite 代理)。`:t===1e3||t===`1000`?null:t!=null&&String(t)!==`0`&&Number(t)!==0?n||`天地图请求失败`:null}function C(e,t){let n=t.trim();if(!n)return Promise.resolve([]);let r=window.T;return r?.LocalSearch?new Promise((t,a)=>{try{new r.LocalSearch(e,{pageCapacity:15,onSearchComplete(e){try{if(parseInt(String(e.getResultType?.()??`1`),10)!==1){t([]);return}let n=e.getPois?.()??[],r=[];for(let e of n){let t=String(e.lonlat??``),n=null,a=null;if(t.includes(`,`)){let[e,r]=t.split(`,`).map(e=>e.trim());n=Number(e),a=Number(r)}if(!Number.isFinite(a)||!Number.isFinite(n))continue;let o=i(n,a);r.push({title:String(e.name??``),address:String(e.address??``),lat:o.lat,lng:o.lng})}t(r)}catch(e){a(e)}}}).search(n)}catch(e){a(e)}}):Promise.reject(Error(`天地图 LocalSearch 未加载,请确认 SDK 已初始化`))}async function w(e,t){let n=d();if(!n)throw Error(`未配置 VITE_TIANDITU_TK`);let r=a(t,e),i=JSON.stringify({lon:r.lng,lat:r.lat,ver:1}),o=`${x()}/geocoder?postStr=${encodeURIComponent(i)}&type=geocode&tk=${encodeURIComponent(n)}`,s=await(await fetch(o)).json(),c=S(s);if(c)throw Error(c);let l=s.result??{},u=l.addressComponent??{};return{address:String(l.formatted_address??l.address??``).trim(),province:u.province?String(u.province):void 0,city:u.city?String(u.city):void 0,district:u.district?String(u.district):u.county?String(u.county):void 0}}async function T(e,t){let n=t.trim();return n?C(e,n):[]}async function E(e,t){return w(e,t)}export{h as a,g as c,_ as i,T as n,m as o,b as r,v as s,E as t};

@ -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-axKQV-pW.js"></script>
<script type="module" crossorigin src="/admin/assets/index-C7HDPj8Y.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-eMySAHTb.js">
<link rel="modulepreload" crossorigin href="/admin/assets/dynamicAdminRoutes-CVTiDgY_.js">
<link rel="stylesheet" crossorigin href="/admin/assets/index-C6I69YBI.css">
</head>
<body>

File diff suppressed because one or more lines are too long

@ -1 +1 @@
import{h as t}from"./index-DiI9PJ0b.js";function i(i={}){const{include_ticket_grab:e,bookable_only:n,...s}=i,r={...s};return e&&(r.include_ticket_grab=1),n&&(r.bookable_only=1),t.get("/h5/activities",r,{withAuth:!1})}function e(i){return t.get(`/h5/activities/${i}`,{})}function n(i,e){return t.get(`/h5/activities/${i}/registrations`,{...e||{}},{withAuth:!1})}function s(i){return t.post(`/h5/activities/${i}/view`,{},{withAuth:!1})}function r(i){return t.post(`/h5/activities/${i}/external-link-click`,{},{withAuth:!1})}function u(i){return t.get(`/h5/ticket-grab-events/${i}`,{},{withAuth:!1})}function o(i,e){return t.get(`/h5/ticket-grab-events/${i}/booking-info`,{venue_id:e},{withAuth:!0})}function h(i,e){return t.post(`/h5/ticket-grab-events/${i}/reservations`,e,{withAuth:!0})}function c(i={}){const e={};return i.only_included_in_stats&&(e.only_included_in_stats=1),t.get("/h5/venues",e,{withAuth:!1})}function a(){return t.get("/h5/venue-dicts",{},{withAuth:!1})}function _(i,e={}){const n={};return e.ticket_grab_event_id&&e.ticket_grab_event_id>0&&(n.ticket_grab_event_id=e.ticket_grab_event_id),t.get(`/h5/venues/${i}`,n,{withAuth:!1})}function g(i){return t.get(`/h5/study-tours/${i}`,{},{withAuth:!1})}function v(i={}){return t.get("/h5/study-tours",i,{withAuth:!1})}function f(i){return t.get(`/h5/activities/${i}/booking-info`,{},{withAuth:!0})}function d(i,e){return t.post(`/h5/activities/${i}/reservations`,e,{withAuth:!0})}function w(i){return t.get("/h5/my/reservations",{},{withAuth:!0})}function A(i,e){const n={};return e&&/^1\d{10}$/.test(e)&&(n.visitor_phone=e),t.get(`/h5/my/reservations/${i}`,n,{withAuth:!0})}function b(i,e){const n={};return e&&/^1\d{10}$/.test(e)&&(n.visitor_phone=e),t.post(`/h5/my/reservations/${i}/cancel`,n,{withAuth:!0})}export{c as a,i as b,v as c,w as d,b as e,e as f,a as g,r as h,n as i,u as j,o as k,_ as l,h as m,f as n,d as o,s as p,A as q,g as r};
import{h as t}from"./index-DUshN9Jj.js";function i(i={}){const{include_ticket_grab:e,bookable_only:n,...s}=i,r={...s};return e&&(r.include_ticket_grab=1),n&&(r.bookable_only=1),t.get("/h5/activities",r,{withAuth:!1})}function e(i){return t.get(`/h5/activities/${i}`,{})}function n(i,e){return t.get(`/h5/activities/${i}/registrations`,{...e||{}},{withAuth:!1})}function s(i){return t.post(`/h5/activities/${i}/view`,{},{withAuth:!1})}function r(i){return t.post(`/h5/activities/${i}/external-link-click`,{},{withAuth:!1})}function u(i){return t.get(`/h5/ticket-grab-events/${i}`,{},{withAuth:!1})}function o(i,e){return t.get(`/h5/ticket-grab-events/${i}/booking-info`,{venue_id:e},{withAuth:!0})}function h(i,e){return t.post(`/h5/ticket-grab-events/${i}/reservations`,e,{withAuth:!0})}function c(i={}){const e={};return i.only_included_in_stats&&(e.only_included_in_stats=1),t.get("/h5/venues",e,{withAuth:!1})}function a(){return t.get("/h5/venue-dicts",{},{withAuth:!1})}function _(i,e={}){const n={};return e.ticket_grab_event_id&&e.ticket_grab_event_id>0&&(n.ticket_grab_event_id=e.ticket_grab_event_id),t.get(`/h5/venues/${i}`,n,{withAuth:!1})}function g(i){return t.get(`/h5/study-tours/${i}`,{},{withAuth:!1})}function v(i={}){return t.get("/h5/study-tours",i,{withAuth:!1})}function f(i){return t.get(`/h5/activities/${i}/booking-info`,{},{withAuth:!0})}function d(i,e){return t.post(`/h5/activities/${i}/reservations`,e,{withAuth:!0})}function w(i){return t.get("/h5/my/reservations",{},{withAuth:!0})}function A(i,e){const n={};return e&&/^1\d{10}$/.test(e)&&(n.visitor_phone=e),t.get(`/h5/my/reservations/${i}`,n,{withAuth:!0})}function b(i,e){const n={};return e&&/^1\d{10}$/.test(e)&&(n.visitor_phone=e),t.post(`/h5/my/reservations/${i}/cancel`,n,{withAuth:!0})}export{c as a,i as b,v as c,w as d,b as e,e as f,a as g,r as h,n as i,u as j,o as k,_ as l,h as m,f as n,d as o,s as p,A as q,g as r};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1 +1 @@
import{L as t,M as n,a8 as r}from"./index-DiI9PJ0b.js";function o(){try{const r=t(n.localProfile);if(!r)return null;const o="string"==typeof r?JSON.parse(r):r;return o&&"object"==typeof o?o:null}catch{return null}}function l(t){r(n.localProfile,JSON.stringify(t))}export{o as l,l as s};
import{L as t,M as n,a8 as r}from"./index-DUshN9Jj.js";function o(){try{const r=t(n.localProfile);if(!r)return null;const o="string"==typeof r?JSON.parse(r):r;return o&&"object"==typeof o?o:null}catch{return null}}function l(t){r(n.localProfile,JSON.stringify(t))}export{o as l,l as s};

@ -1 +1 @@
import{d as e,r as a,c as l,U as s,y as t,k as u,f as n,e as c,B as i,F as r,i as v,j as d,a6 as o,l as f,m as _,v as p,z as m,p as y,V as h,X as k,_ as g}from"./index-DiI9PJ0b.js";import{f as b}from"./content.7RDnUpWJ.js";const w=g(e({__name:"behind-scenes",setup(e){const g=a(0),w=a(""),j=a([]),C=a(!1),F=a(!1),S=a(0),x=l(()=>j.value);function A(){F.value=!1}function I(e){var a;const l=null==(a=e.detail)?void 0:a.current;"number"==typeof l&&(S.value=l)}return s(e=>{const a=e&&"object"==typeof e?e.id:void 0;g.value=null!=a&&""!==a?parseInt(String(a),10):0,g.value&&async function(){C.value=!0;try{const e=await b(g.value);w.value=String((null==e?void 0:e.title)||"");const a=Array.isArray(null==e?void 0:e.behind_scenes_media)?e.behind_scenes_media:[];j.value=a.map(e=>String((null==e?void 0:e.url)||"").trim()).filter(e=>e.length>0)}catch{w.value="",j.value=[]}finally{C.value=!1}}()}),(e,a)=>{const l=f,s=v,g=y,b=k,z=h;return d(),t(r,null,[u(s,{class:"page"},{default:n(()=>[u(o),u(s,{class:"head"},{default:n(()=>[u(l,{class:"title"},{default:n(()=>[_(p(w.value),1)]),_:1}),u(l,{class:"sub"},{default:n(()=>[_("活动花絮")]),_:1})]),_:1}),C.value?(d(),c(s,{key:0,class:"hint"},{default:n(()=>[_("加载中…")]),_:1})):(d(),c(s,{key:1,class:"grid"},{default:n(()=>[(d(!0),t(r,null,m(j.value,(e,a)=>(d(),c(g,{key:"bts-"+a+"-"+e,class:"thumb",src:e,mode:"aspectFill",onClick:e=>function(e){S.value=e,F.value=!0}(a)},null,8,["src","onClick"]))),128))]),_:1})),C.value||j.value.length?i("",!0):(d(),c(s,{key:2,class:"hint muted"},{default:n(()=>[_("暂无花絮图片")]),_:1}))]),_:1}),F.value?(d(),c(s,{key:0,class:"preview-mask"},{default:n(()=>[u(s,{class:"preview-toolbar"},{default:n(()=>[u(l,{class:"preview-count"},{default:n(()=>[_(p(S.value+1)+" / "+p(x.value.length),1)]),_:1}),u(l,{class:"preview-close",onClick:A},{default:n(()=>[_("关闭")]),_:1})]),_:1}),u(z,{class:"preview-swiper",current:S.value,onChange:I},{default:n(()=>[(d(!0),t(r,null,m(x.value,(e,a)=>(d(),c(b,{key:"pv-"+a},{default:n(()=>[u(s,{class:"preview-slide"},{default:n(()=>[u(g,{class:"preview-img",src:e,mode:"aspectFit"},null,8,["src"])]),_:2},1024)]),_:2},1024))),128))]),_:1},8,["current"])]),_:1})):i("",!0)],64)}}}),[["__scopeId","data-v-f28245f2"]]);export{w as default};
import{d as e,r as a,c as l,U as s,y as t,k as u,f as n,e as c,B as i,F as r,i as v,j as d,a6 as o,l as f,m as _,v as p,z as m,p as y,V as h,X as k,_ as g}from"./index-DUshN9Jj.js";import{f as b}from"./content.BQmGRZOL.js";const w=g(e({__name:"behind-scenes",setup(e){const g=a(0),w=a(""),j=a([]),C=a(!1),F=a(!1),S=a(0),x=l(()=>j.value);function A(){F.value=!1}function I(e){var a;const l=null==(a=e.detail)?void 0:a.current;"number"==typeof l&&(S.value=l)}return s(e=>{const a=e&&"object"==typeof e?e.id:void 0;g.value=null!=a&&""!==a?parseInt(String(a),10):0,g.value&&async function(){C.value=!0;try{const e=await b(g.value);w.value=String((null==e?void 0:e.title)||"");const a=Array.isArray(null==e?void 0:e.behind_scenes_media)?e.behind_scenes_media:[];j.value=a.map(e=>String((null==e?void 0:e.url)||"").trim()).filter(e=>e.length>0)}catch{w.value="",j.value=[]}finally{C.value=!1}}()}),(e,a)=>{const l=f,s=v,g=y,b=k,z=h;return d(),t(r,null,[u(s,{class:"page"},{default:n(()=>[u(o),u(s,{class:"head"},{default:n(()=>[u(l,{class:"title"},{default:n(()=>[_(p(w.value),1)]),_:1}),u(l,{class:"sub"},{default:n(()=>[_("活动花絮")]),_:1})]),_:1}),C.value?(d(),c(s,{key:0,class:"hint"},{default:n(()=>[_("加载中…")]),_:1})):(d(),c(s,{key:1,class:"grid"},{default:n(()=>[(d(!0),t(r,null,m(j.value,(e,a)=>(d(),c(g,{key:"bts-"+a+"-"+e,class:"thumb",src:e,mode:"aspectFill",onClick:e=>function(e){S.value=e,F.value=!0}(a)},null,8,["src","onClick"]))),128))]),_:1})),C.value||j.value.length?i("",!0):(d(),c(s,{key:2,class:"hint muted"},{default:n(()=>[_("暂无花絮图片")]),_:1}))]),_:1}),F.value?(d(),c(s,{key:0,class:"preview-mask"},{default:n(()=>[u(s,{class:"preview-toolbar"},{default:n(()=>[u(l,{class:"preview-count"},{default:n(()=>[_(p(S.value+1)+" / "+p(x.value.length),1)]),_:1}),u(l,{class:"preview-close",onClick:A},{default:n(()=>[_("关闭")]),_:1})]),_:1}),u(z,{class:"preview-swiper",current:S.value,onChange:I},{default:n(()=>[(d(!0),t(r,null,m(x.value,(e,a)=>(d(),c(b,{key:"pv-"+a},{default:n(()=>[u(s,{class:"preview-slide"},{default:n(()=>[u(g,{class:"preview-img",src:e,mode:"aspectFit"},null,8,["src"])]),_:2},1024)]),_:2},1024))),128))]),_:1},8,["current"])]),_:1})):i("",!0)],64)}}}),[["__scopeId","data-v-f28245f2"]]);export{w as default};

@ -1 +1 @@
import{d as a,r as e,c as t,U as l,e as s,f as u,i as n,N as r,j as i,k as c,l as o,m as v,v as d,B as f,S as _,y as m,F as g,z as p,n as y,p as h,q as S,_ as $}from"./index-DiI9PJ0b.js";import{i as k}from"./content.7RDnUpWJ.js";import{P as w}from"./poster.C6TYC1FC.js";const N=$(a({__name:"registrations",setup(a){const $=e(0),N=e(""),b=e(!1),j=e(!1),x=e(1),B=e(1),F=e(0),z=e([]);function D(a){const e=(a.session_name||"").trim(),t=(a.session_time_text||"").trim(),l=(a.activity_date||"").trim();return e&&t?`${e} · ${t}`:t||(e&&l?`${e} · ${l}`:e||(l||"场次信息"))}function I(a){if(!a)return"—";const e=new Date(a);return Number.isNaN(e.getTime())?"—":`${e.getFullYear()}/${e.getMonth()+1}/${e.getDate()} ${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}:${String(e.getSeconds()).padStart(2,"0")}`}const M=t(()=>x.value<B.value),P=t(()=>!M.value&&z.value.length>0&&!b.value&&!j.value);async function U(a,e){if($.value){if(e){if(j.value||!M.value)return;j.value=!0}else b.value=!0;try{const t=await k($.value,{page:a,page_size:20});F.value=t.total,B.value=t.last_page||1,t.activity_title&&(N.value=t.activity_title),z.value=e?[...z.value,...t.data||[]]:t.data||[],x.value=a}catch{e||(z.value=[])}finally{b.value=!1,j.value=!1}}}function q(){!M.value||b.value||j.value||U(x.value+1,!0)}return l(a=>{$.value=Number((null==a?void 0:a.id)||0);const e=null==a?void 0:a.title;if(e&&"string"==typeof e)try{N.value=decodeURIComponent(e)}catch{N.value=e}U(1,!1)}),(a,e)=>{const t=r("SubPageBackBtn"),l=o,$=n,k=h,j=_;return i(),s($,{class:"page"},{default:u(()=>[c(t),c($,{class:"body"},{default:u(()=>[N.value?(i(),s($,{key:0,class:"act-hd"},{default:u(()=>[c(l,{class:"act-hd-t"},{default:u(()=>[v(d(N.value),1)]),_:1})]),_:1})):f("",!0),c(j,{"scroll-y":"",class:"scroll","lower-threshold":100,onScrolltolower:q},{default:u(()=>[b.value&&!z.value.length?(i(),s($,{key:0,class:"state-tip"},{default:u(()=>[v("加载中…")]),_:1})):(i(),s($,{key:1,class:"list-outer"},{default:u(()=>[z.value.length?(i(),s($,{key:0,class:"list-wrap"},{default:u(()=>[(i(!0),m(g,null,p(z.value,(a,e)=>(i(),s($,{key:"enr-"+a.id,class:y(["enr-row",{"is-last":e===z.value.length-1}])},{default:u(()=>[c(k,{class:"enr-avatar",src:a.avatar_url||S(w),mode:"aspectFill"},null,8,["src"]),c($,{class:"enr-mid"},{default:u(()=>[c($,{class:"enr-name-row"},{default:u(()=>[c(l,{class:"enr-name"},{default:u(()=>[v(d(a.visitor_name||"—"),1)]),_:2},1024),c(l,{class:"enr-time"},{default:u(()=>[v(d(I(a.created_at)),1)]),_:2},1024)]),_:2},1024),c(l,{class:"enr-session"},{default:u(()=>[v(d(D(a)),1)]),_:2},1024)]),_:2},1024)]),_:2},1032,["class"]))),128))]),_:1})):f("",!0),b.value||z.value.length?f("",!0):(i(),s($,{key:1,class:"state-tip"},{default:u(()=>[v("暂无报名")]),_:1})),P.value?(i(),s($,{key:2,class:"enr-end"},{default:u(()=>[v("这回真没了~")]),_:1})):f("",!0)]),_:1}))]),_:1})]),_:1})]),_:1})}}}),[["__scopeId","data-v-fcaf9d69"]]);export{N as default};
import{d as a,r as e,c as t,U as l,e as s,f as u,i as n,N as r,j as i,k as c,l as o,m as v,v as d,B as f,S as _,y as m,F as g,z as p,n as y,p as h,q as S,_ as $}from"./index-DUshN9Jj.js";import{i as k}from"./content.BQmGRZOL.js";import{P as w}from"./poster.C6TYC1FC.js";const N=$(a({__name:"registrations",setup(a){const $=e(0),N=e(""),b=e(!1),j=e(!1),x=e(1),B=e(1),F=e(0),z=e([]);function D(a){const e=(a.session_name||"").trim(),t=(a.session_time_text||"").trim(),l=(a.activity_date||"").trim();return e&&t?`${e} · ${t}`:t||(e&&l?`${e} · ${l}`:e||(l||"场次信息"))}function I(a){if(!a)return"—";const e=new Date(a);return Number.isNaN(e.getTime())?"—":`${e.getFullYear()}/${e.getMonth()+1}/${e.getDate()} ${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}:${String(e.getSeconds()).padStart(2,"0")}`}const M=t(()=>x.value<B.value),P=t(()=>!M.value&&z.value.length>0&&!b.value&&!j.value);async function U(a,e){if($.value){if(e){if(j.value||!M.value)return;j.value=!0}else b.value=!0;try{const t=await k($.value,{page:a,page_size:20});F.value=t.total,B.value=t.last_page||1,t.activity_title&&(N.value=t.activity_title),z.value=e?[...z.value,...t.data||[]]:t.data||[],x.value=a}catch{e||(z.value=[])}finally{b.value=!1,j.value=!1}}}function q(){!M.value||b.value||j.value||U(x.value+1,!0)}return l(a=>{$.value=Number((null==a?void 0:a.id)||0);const e=null==a?void 0:a.title;if(e&&"string"==typeof e)try{N.value=decodeURIComponent(e)}catch{N.value=e}U(1,!1)}),(a,e)=>{const t=r("SubPageBackBtn"),l=o,$=n,k=h,j=_;return i(),s($,{class:"page"},{default:u(()=>[c(t),c($,{class:"body"},{default:u(()=>[N.value?(i(),s($,{key:0,class:"act-hd"},{default:u(()=>[c(l,{class:"act-hd-t"},{default:u(()=>[v(d(N.value),1)]),_:1})]),_:1})):f("",!0),c(j,{"scroll-y":"",class:"scroll","lower-threshold":100,onScrolltolower:q},{default:u(()=>[b.value&&!z.value.length?(i(),s($,{key:0,class:"state-tip"},{default:u(()=>[v("加载中…")]),_:1})):(i(),s($,{key:1,class:"list-outer"},{default:u(()=>[z.value.length?(i(),s($,{key:0,class:"list-wrap"},{default:u(()=>[(i(!0),m(g,null,p(z.value,(a,e)=>(i(),s($,{key:"enr-"+a.id,class:y(["enr-row",{"is-last":e===z.value.length-1}])},{default:u(()=>[c(k,{class:"enr-avatar",src:a.avatar_url||S(w),mode:"aspectFill"},null,8,["src"]),c($,{class:"enr-mid"},{default:u(()=>[c($,{class:"enr-name-row"},{default:u(()=>[c(l,{class:"enr-name"},{default:u(()=>[v(d(a.visitor_name||"—"),1)]),_:2},1024),c(l,{class:"enr-time"},{default:u(()=>[v(d(I(a.created_at)),1)]),_:2},1024)]),_:2},1024),c(l,{class:"enr-session"},{default:u(()=>[v(d(D(a)),1)]),_:2},1024)]),_:2},1024)]),_:2},1032,["class"]))),128))]),_:1})):f("",!0),b.value||z.value.length?f("",!0):(i(),s($,{key:1,class:"state-tip"},{default:u(()=>[v("暂无报名")]),_:1})),P.value?(i(),s($,{key:2,class:"enr-end"},{default:u(()=>[v("这回真没了~")]),_:1})):f("",!0)]),_:1}))]),_:1})]),_:1})]),_:1})}}}),[["__scopeId","data-v-fcaf9d69"]]);export{N as default};

@ -1 +1 @@
import{d as a,r as s,a as e,G as l,H as t,e as u,f as r,i as o,j as c,k as n,I as i,p as d,q as f,y as m,F as _,z as v,l as p,m as h,v as y,B as g,C as k,J as b,K as x,D as w,_ as j}from"./index-DiI9PJ0b.js";import{c as C}from"./content.7RDnUpWJ.js";import{P as F}from"./poster.C6TYC1FC.js";import{s as V}from"./search.BJnl3YRK.js";const I=j(a({__name:"index",setup(a){const j=s([]),I=s(!1),q=s("");async function z(){I.value=!0;try{j.value=await C({keyword:q.value.trim()||void 0})||[]}catch{j.value=[]}finally{I.value=!1}}function B(){z()}function D(){b().length>1?x({fail:()=>{w({url:"/pages/index/index"})}}):w({url:"/pages/index/index"})}return e(()=>{z()}),l(async()=>{try{await z()}finally{t()}}),(a,s)=>{const e=o,l=i,t=d,b=p;return c(),u(e,{class:"page"},{default:r(()=>[n(e,{class:"filter-section"},{default:r(()=>[n(e,{class:"toolbar"},{default:r(()=>[n(e,{class:"back-btn","hover-class":"back-btn--hover","hover-stay-time":"80",onClick:D},{default:r(()=>[n(e,{class:"back-btn__icon","aria-hidden":"true"})]),_:1}),n(e,{class:"search-wrap"},{default:r(()=>[n(l,{modelValue:q.value,"onUpdate:modelValue":s[0]||(s[0]=a=>q.value=a),class:"search-input",placeholder:"请输入您要搜索的内容","placeholder-class":"ph","confirm-type":"search",onConfirm:B},null,8,["modelValue"]),n(t,{class:"search-icon-img",src:f(V),mode:"aspectFit"},null,8,["src"])]),_:1})]),_:1})]),_:1}),n(e,{class:"section"},{default:r(()=>[(c(!0),m(_,null,v(j.value,a=>(c(),u(e,{key:a.id,class:"tour-card",onClick:s=>{return e=a.id,void k({url:`/pages/study-tour/detail?id=${e}`});var e}},{default:r(()=>[n(e,{class:"tour-img-wrap"},{default:r(()=>[n(t,{class:"tour-img",src:a.cover_image||f(F),mode:"aspectFill"},null,8,["src"])]),_:2},1024),n(e,{class:"tour-body"},{default:r(()=>{var s;return[n(b,{class:"tour-title"},{default:r(()=>[h(y(a.name),1)]),_:2},1024),n(e,{class:"tour-stops-timeline"},{default:r(()=>[(c(!0),m(_,null,v(a.venue_names||[],(s,l)=>(c(),u(e,{key:"v-"+a.id+"-"+l,class:"tour-stop-row"},{default:r(()=>[n(e,{class:"tour-timeline-axis"},{default:r(()=>{var s;return[n(e,{class:"tour-dot-cell"},{default:r(()=>[n(e,{class:"tour-tl-dot"})]),_:1}),Number(l)<((null==(s=a.venue_names)?void 0:s.length)||0)-1?(c(),u(e,{key:0,class:"tour-tl-line"})):g("",!0)]}),_:2},1024),n(b,{class:"tour-stop-name"},{default:r(()=>[h(y(s),1)]),_:2},1024)]),_:2},1024))),128))]),_:2},1024),(null==(s=a.tags)?void 0:s.length)?(c(),u(e,{key:0,class:"tour-tags-row"},{default:r(()=>[(c(!0),m(_,null,v(a.tags,(s,e)=>(c(),u(b,{key:"t-"+a.id+"-"+e,class:"tour-tag"},{default:r(()=>[h(y(s),1)]),_:2},1024))),128))]),_:2},1024)):g("",!0)]}),_:2},1024)]),_:2},1032,["onClick"]))),128)),I.value&&!j.value.length?(c(),u(e,{key:0,class:"hint"},{default:r(()=>[h("加载中…")]),_:1})):g("",!0),I.value||j.value.length?g("",!0):(c(),u(e,{key:1,class:"hint muted"},{default:r(()=>[h("暂无科普四季研学线路推荐")]),_:1}))]),_:1})]),_:1})}}}),[["__scopeId","data-v-e6cee6f0"]]);export{I as default};
import{d as a,r as s,a as e,G as l,H as t,e as u,f as r,i as o,j as c,k as n,I as i,p as d,q as f,y as m,F as _,z as v,l as p,m as h,v as y,B as g,C as k,J as b,K as x,D as w,_ as j}from"./index-DUshN9Jj.js";import{c as C}from"./content.BQmGRZOL.js";import{P as F}from"./poster.C6TYC1FC.js";import{s as V}from"./search.BJnl3YRK.js";const I=j(a({__name:"index",setup(a){const j=s([]),I=s(!1),q=s("");async function z(){I.value=!0;try{j.value=await C({keyword:q.value.trim()||void 0})||[]}catch{j.value=[]}finally{I.value=!1}}function B(){z()}function D(){b().length>1?x({fail:()=>{w({url:"/pages/index/index"})}}):w({url:"/pages/index/index"})}return e(()=>{z()}),l(async()=>{try{await z()}finally{t()}}),(a,s)=>{const e=o,l=i,t=d,b=p;return c(),u(e,{class:"page"},{default:r(()=>[n(e,{class:"filter-section"},{default:r(()=>[n(e,{class:"toolbar"},{default:r(()=>[n(e,{class:"back-btn","hover-class":"back-btn--hover","hover-stay-time":"80",onClick:D},{default:r(()=>[n(e,{class:"back-btn__icon","aria-hidden":"true"})]),_:1}),n(e,{class:"search-wrap"},{default:r(()=>[n(l,{modelValue:q.value,"onUpdate:modelValue":s[0]||(s[0]=a=>q.value=a),class:"search-input",placeholder:"请输入您要搜索的内容","placeholder-class":"ph","confirm-type":"search",onConfirm:B},null,8,["modelValue"]),n(t,{class:"search-icon-img",src:f(V),mode:"aspectFit"},null,8,["src"])]),_:1})]),_:1})]),_:1}),n(e,{class:"section"},{default:r(()=>[(c(!0),m(_,null,v(j.value,a=>(c(),u(e,{key:a.id,class:"tour-card",onClick:s=>{return e=a.id,void k({url:`/pages/study-tour/detail?id=${e}`});var e}},{default:r(()=>[n(e,{class:"tour-img-wrap"},{default:r(()=>[n(t,{class:"tour-img",src:a.cover_image||f(F),mode:"aspectFill"},null,8,["src"])]),_:2},1024),n(e,{class:"tour-body"},{default:r(()=>{var s;return[n(b,{class:"tour-title"},{default:r(()=>[h(y(a.name),1)]),_:2},1024),n(e,{class:"tour-stops-timeline"},{default:r(()=>[(c(!0),m(_,null,v(a.venue_names||[],(s,l)=>(c(),u(e,{key:"v-"+a.id+"-"+l,class:"tour-stop-row"},{default:r(()=>[n(e,{class:"tour-timeline-axis"},{default:r(()=>{var s;return[n(e,{class:"tour-dot-cell"},{default:r(()=>[n(e,{class:"tour-tl-dot"})]),_:1}),Number(l)<((null==(s=a.venue_names)?void 0:s.length)||0)-1?(c(),u(e,{key:0,class:"tour-tl-line"})):g("",!0)]}),_:2},1024),n(b,{class:"tour-stop-name"},{default:r(()=>[h(y(s),1)]),_:2},1024)]),_:2},1024))),128))]),_:2},1024),(null==(s=a.tags)?void 0:s.length)?(c(),u(e,{key:0,class:"tour-tags-row"},{default:r(()=>[(c(!0),m(_,null,v(a.tags,(s,e)=>(c(),u(b,{key:"t-"+a.id+"-"+e,class:"tour-tag"},{default:r(()=>[h(y(s),1)]),_:2},1024))),128))]),_:2},1024)):g("",!0)]}),_:2},1024)]),_:2},1032,["onClick"]))),128)),I.value&&!j.value.length?(c(),u(e,{key:0,class:"hint"},{default:r(()=>[h("加载中…")]),_:1})):g("",!0),I.value||j.value.length?g("",!0):(c(),u(e,{key:1,class:"hint muted"},{default:r(()=>[h("暂无科普四季研学线路推荐")]),_:1}))]),_:1})]),_:1})}}}),[["__scopeId","data-v-e6cee6f0"]]);export{I 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 +1 @@
import{d as a,r as l,o as e,e as s,f as n,L as u,M as t,i as o,j as r,k as c,p as i,m as d,v as f,l as v,C as p,_}from"./index-DiI9PJ0b.js";import{g as m}from"./profile.DPsKBp4h.js";import{l as h}from"./localProfile.tAr37fwh.js";const k=_(a({__name:"index",setup(a){const _=l("游客"),k=l(""),g=l("");function j(a){return a&&11===a.length?`${a.slice(0,3)}****${a.slice(7)}`:a||""}function y(){p({url:"/pages/mine/profile"})}function C(){p({url:"/pages/mine/orders"})}return e(()=>{!async function(){var a;if(u(t.accessToken))try{const a=await m();return _.value=(a.real_name||a.nickname||"用户").trim()||"用户",k.value=a.phone?j(a.phone):"",void(g.value=a.avatar_url||"")}catch{}const l=h();_.value=(null==(a=null==l?void 0:l.real_name)?void 0:a.trim())||"游客",k.value=(null==l?void 0:l.phone)?j(l.phone):"",g.value=(null==l?void 0:l.avatar_url)||""}()}),(a,l)=>{const e=i,u=o,t=v;return r(),s(u,{class:"page"},{default:n(()=>[c(u,{class:"header"},{default:n(()=>[c(u,{class:"profile",onClick:y},{default:n(()=>[g.value?(r(),s(e,{key:0,class:"avatar",src:g.value,mode:"aspectFill"},null,8,["src"])):(r(),s(u,{key:1,class:"avatar placeholder"})),c(u,{class:"profile-info"},{default:n(()=>[c(u,{class:"name"},{default:n(()=>[d(f(_.value),1)]),_:1}),c(u,{class:"phone"},{default:n(()=>[d(f(k.value||"完善信息方便预约"),1)]),_:1})]),_:1})]),_:1})]),_:1}),c(u,{class:"panel"},{default:n(()=>[c(u,{class:"menu-item",onClick:y},{default:n(()=>[c(t,null,{default:n(()=>[d("我的信息")]),_:1}),c(t,null,{default:n(()=>[d(">")]),_:1})]),_:1}),c(u,{class:"menu-item",onClick:C},{default:n(()=>[c(t,null,{default:n(()=>[d("预约记录")]),_:1}),c(t,null,{default:n(()=>[d(">")]),_:1})]),_:1})]),_:1})]),_:1})}}}),[["__scopeId","data-v-0d216b84"]]);export{k as default};
import{d as a,r as l,o as e,e as s,f as n,L as u,M as t,i as o,j as r,k as c,p as i,m as d,v as f,l as v,C as p,_}from"./index-DUshN9Jj.js";import{g as m}from"./profile.CiCMqYEo.js";import{l as h}from"./localProfile.DHqPPn8j.js";const k=_(a({__name:"index",setup(a){const _=l("游客"),k=l(""),g=l("");function j(a){return a&&11===a.length?`${a.slice(0,3)}****${a.slice(7)}`:a||""}function y(){p({url:"/pages/mine/profile"})}function C(){p({url:"/pages/mine/orders"})}return e(()=>{!async function(){var a;if(u(t.accessToken))try{const a=await m();return _.value=(a.real_name||a.nickname||"用户").trim()||"用户",k.value=a.phone?j(a.phone):"",void(g.value=a.avatar_url||"")}catch{}const l=h();_.value=(null==(a=null==l?void 0:l.real_name)?void 0:a.trim())||"游客",k.value=(null==l?void 0:l.phone)?j(l.phone):"",g.value=(null==l?void 0:l.avatar_url)||""}()}),(a,l)=>{const e=i,u=o,t=v;return r(),s(u,{class:"page"},{default:n(()=>[c(u,{class:"header"},{default:n(()=>[c(u,{class:"profile",onClick:y},{default:n(()=>[g.value?(r(),s(e,{key:0,class:"avatar",src:g.value,mode:"aspectFill"},null,8,["src"])):(r(),s(u,{key:1,class:"avatar placeholder"})),c(u,{class:"profile-info"},{default:n(()=>[c(u,{class:"name"},{default:n(()=>[d(f(_.value),1)]),_:1}),c(u,{class:"phone"},{default:n(()=>[d(f(k.value||"完善信息方便预约"),1)]),_:1})]),_:1})]),_:1})]),_:1}),c(u,{class:"panel"},{default:n(()=>[c(u,{class:"menu-item",onClick:y},{default:n(()=>[c(t,null,{default:n(()=>[d("我的信息")]),_:1}),c(t,null,{default:n(()=>[d(">")]),_:1})]),_:1}),c(u,{class:"menu-item",onClick:C},{default:n(()=>[c(t,null,{default:n(()=>[d("预约记录")]),_:1}),c(t,null,{default:n(()=>[d(">")]),_:1})]),_:1})]),_:1})]),_:1})}}}),[["__scopeId","data-v-0d216b84"]]);export{k as default};

@ -1 +1 @@
import{d as a,r as e,a as l,e as s,f as t,L as n,M as u,i as r,N as o,j as c,k as i,m as v,p as d,v as p,l as _,I as m,O as f,g as h,P as y,Q as b,R as k,T as g,_ as w}from"./index-DiI9PJ0b.js";import{g as V,u as j}from"./profile.DPsKBp4h.js";import{l as P,s as T}from"./localProfile.tAr37fwh.js";const x=w(a({__name:"profile",setup(a){const w=e(!0),x=e(!1),B=e(!1),C=e({real_name:"",phone:"",avatar_url:""});function F(a){C.value.real_name=a.real_name||"",C.value.phone=a.phone||"",C.value.avatar_url=a.avatar_url||""}function I(){B.value?y({count:1,sizeType:["compressed"],sourceType:["album","camera"],success:async a=>{const e=a.tempFilePaths[0];if(e)try{b({title:"上传中"});const{url:a}=await k(e);C.value.avatar_url=a}catch(l){h({title:(null==l?void 0:l.message)||"上传失败",icon:"none"})}finally{g()}}}):h({title:"请先通过微信登录后再上传头像",icon:"none"})}async function U(){if(C.value.real_name.trim())if(/^1\d{10}$/.test(C.value.phone.trim())){x.value=!0;try{const a={real_name:C.value.real_name.trim(),phone:C.value.phone.trim(),avatar_url:C.value.avatar_url||void 0};B.value&&await j(a),T({real_name:a.real_name,phone:a.phone,avatar_url:a.avatar_url}),h({title:"保存成功",icon:"success"})}catch(a){h({title:(null==a?void 0:a.message)||"保存失败",icon:"none"})}finally{x.value=!1}}else h({title:"请填写11位手机号",icon:"none"});else h({title:"请填写姓名",icon:"none"})}return l(()=>{!async function(){w.value=!0,B.value=!!n(u.accessToken);try{if(B.value)try{const a=await V();C.value.real_name=a.real_name||"",C.value.phone=a.phone||"",C.value.avatar_url=a.avatar_url||""}catch{const a=P();a&&F(a)}else{const a=P();a&&F(a)}}finally{w.value=!1}}()}),(a,e)=>{const l=o("SubPageBackBtn"),n=r,u=d,h=_,y=m,b=f;return c(),s(n,{class:"page"},{default:t(()=>[i(l),w.value?(c(),s(n,{key:0,class:"loading"},{default:t(()=>[v("加载中…")]),_:1})):(c(),s(n,{key:1,class:"content"},{default:t(()=>[i(n,{class:"avatar-block"},{default:t(()=>[i(n,{class:"avatar-wrap",onClick:I},{default:t(()=>[C.value.avatar_url?(c(),s(u,{key:0,class:"avatar",src:C.value.avatar_url,mode:"aspectFill"},null,8,["src"])):(c(),s(n,{key:1,class:"avatar placeholder"})),i(n,{class:"avatar-tip"},{default:t(()=>[v(p(B.value?"点击更换头像":"登录后可上传头像"),1)]),_:1})]),_:1})]),_:1}),i(n,{class:"card"},{default:t(()=>[i(n,{class:"row"},{default:t(()=>[i(h,{class:"label"},{default:t(()=>[v("姓名")]),_:1}),i(y,{modelValue:C.value.real_name,"onUpdate:modelValue":e[0]||(e[0]=a=>C.value.real_name=a),class:"input",placeholder:"必填","placeholder-class":"ph"},null,8,["modelValue"])]),_:1}),i(n,{class:"row last"},{default:t(()=>[i(h,{class:"label"},{default:t(()=>[v("手机号")]),_:1}),i(y,{modelValue:C.value.phone,"onUpdate:modelValue":e[1]||(e[1]=a=>C.value.phone=a),class:"input",type:"number",maxlength:"11",placeholder:"必填","placeholder-class":"ph"},null,8,["modelValue"])]),_:1})]),_:1}),i(b,{class:"btn",disabled:x.value,onClick:U},{default:t(()=>[v(p(x.value?"保存中…":"保存"),1)]),_:1},8,["disabled"])]),_:1}))]),_:1})}}}),[["__scopeId","data-v-f84b8690"]]);export{x as default};
import{d as a,r as e,a as l,e as s,f as t,L as n,M as u,i as r,N as o,j as c,k as i,m as v,p as d,v as p,l as _,I as m,O as f,g as h,P as y,Q as b,R as k,T as g,_ as w}from"./index-DUshN9Jj.js";import{g as V,u as j}from"./profile.CiCMqYEo.js";import{l as P,s as T}from"./localProfile.DHqPPn8j.js";const x=w(a({__name:"profile",setup(a){const w=e(!0),x=e(!1),B=e(!1),C=e({real_name:"",phone:"",avatar_url:""});function F(a){C.value.real_name=a.real_name||"",C.value.phone=a.phone||"",C.value.avatar_url=a.avatar_url||""}function I(){B.value?y({count:1,sizeType:["compressed"],sourceType:["album","camera"],success:async a=>{const e=a.tempFilePaths[0];if(e)try{b({title:"上传中"});const{url:a}=await k(e);C.value.avatar_url=a}catch(l){h({title:(null==l?void 0:l.message)||"上传失败",icon:"none"})}finally{g()}}}):h({title:"请先通过微信登录后再上传头像",icon:"none"})}async function U(){if(C.value.real_name.trim())if(/^1\d{10}$/.test(C.value.phone.trim())){x.value=!0;try{const a={real_name:C.value.real_name.trim(),phone:C.value.phone.trim(),avatar_url:C.value.avatar_url||void 0};B.value&&await j(a),T({real_name:a.real_name,phone:a.phone,avatar_url:a.avatar_url}),h({title:"保存成功",icon:"success"})}catch(a){h({title:(null==a?void 0:a.message)||"保存失败",icon:"none"})}finally{x.value=!1}}else h({title:"请填写11位手机号",icon:"none"});else h({title:"请填写姓名",icon:"none"})}return l(()=>{!async function(){w.value=!0,B.value=!!n(u.accessToken);try{if(B.value)try{const a=await V();C.value.real_name=a.real_name||"",C.value.phone=a.phone||"",C.value.avatar_url=a.avatar_url||""}catch{const a=P();a&&F(a)}else{const a=P();a&&F(a)}}finally{w.value=!1}}()}),(a,e)=>{const l=o("SubPageBackBtn"),n=r,u=d,h=_,y=m,b=f;return c(),s(n,{class:"page"},{default:t(()=>[i(l),w.value?(c(),s(n,{key:0,class:"loading"},{default:t(()=>[v("加载中…")]),_:1})):(c(),s(n,{key:1,class:"content"},{default:t(()=>[i(n,{class:"avatar-block"},{default:t(()=>[i(n,{class:"avatar-wrap",onClick:I},{default:t(()=>[C.value.avatar_url?(c(),s(u,{key:0,class:"avatar",src:C.value.avatar_url,mode:"aspectFill"},null,8,["src"])):(c(),s(n,{key:1,class:"avatar placeholder"})),i(n,{class:"avatar-tip"},{default:t(()=>[v(p(B.value?"点击更换头像":"登录后可上传头像"),1)]),_:1})]),_:1})]),_:1}),i(n,{class:"card"},{default:t(()=>[i(n,{class:"row"},{default:t(()=>[i(h,{class:"label"},{default:t(()=>[v("姓名")]),_:1}),i(y,{modelValue:C.value.real_name,"onUpdate:modelValue":e[0]||(e[0]=a=>C.value.real_name=a),class:"input",placeholder:"必填","placeholder-class":"ph"},null,8,["modelValue"])]),_:1}),i(n,{class:"row last"},{default:t(()=>[i(h,{class:"label"},{default:t(()=>[v("手机号")]),_:1}),i(y,{modelValue:C.value.phone,"onUpdate:modelValue":e[1]||(e[1]=a=>C.value.phone=a),class:"input",type:"number",maxlength:"11",placeholder:"必填","placeholder-class":"ph"},null,8,["modelValue"])]),_:1})]),_:1}),i(b,{class:"btn",disabled:x.value,onClick:U},{default:t(()=>[v(p(x.value?"保存中…":"保存"),1)]),_:1},8,["disabled"])]),_:1}))]),_:1})}}}),[["__scopeId","data-v-f84b8690"]]);export{x as default};

@ -1 +1 @@
import{d as a,r as s,a as t,ac as l,o as e,G as n,H as c,e as i,f as u,g as o,i as r,N as d,j as f,k as m,A as _,l as v,m as p,y,F as g,z as k,n as h,v as b,p as C,q as w,B as j,C as x,_ as B}from"./index-DiI9PJ0b.js";import{a as A,g as P}from"./content.7RDnUpWJ.js";import{g as F,l as H}from"./peopleCounting.Dzvs_Cjm.js";import{P as N}from"./poster.C6TYC1FC.js";const S=B(a({__name:"index",setup(a){const B=s(!0),S=s([]),q=s(6);async function z(){B.value=!0;try{const[a,s,t]=await Promise.all([A({only_included_in_stats:!0}),P().catch(()=>null),F().catch(()=>null)]),l=Array.isArray(a)?a:[],e=function(a){const s={};for(const t of(null==a?void 0:a.district)??[]){const a=(t.value||"").trim();a&&(s[a]=(t.label||"").trim()||a)}return s}(s),n=H(t);S.value=function(a,s,t){const l=a.map(a=>{const l=(a.district||"").trim(),e=l?s[l]??l:"",n=t.has(a.id)?t.get(a.id):null;return{id:a.id,name:a.name||"未命名场馆",district:e,cover_image:a.cover_image||null,liveCount:n}}).filter(a=>null!=a.liveCount&&a.liveCount>0);return l.sort((a,s)=>s.liveCount-a.liveCount),l}(l,e,n)}catch(a){o({title:(null==a?void 0:a.message)||"加载失败",icon:"none"}),S.value=[]}finally{B.value=!1}}return t(()=>{try{const a=l();q.value=Number(a.statusBarHeight||0)+6}catch{q.value=6}}),e(()=>{z()}),n(async()=>{try{await z()}finally{c()}}),(a,s)=>{const t=d("SubPageBackBtn"),l=r,e=v,n=C;return f(),i(l,{class:"page"},{default:u(()=>[m(l,{class:"stats-header",style:_({paddingTop:q.value+"px"})},{default:u(()=>[m(l,{class:"stats-header-row"},{default:u(()=>[m(t,{embedded:""}),m(l,{class:"stats-title-line"},{default:u(()=>[m(l,{class:"title-left"},{default:u(()=>[m(l,{class:"bar","aria-hidden":"true"}),m(e,{class:"title"},{default:u(()=>[p("实时人数排行")]),_:1})]),_:1}),m(e,{class:"title-hint"},{default:u(()=>[p("纳入市科协人数统计系统场馆")]),_:1})]),_:1})]),_:1})]),_:1},8,["style"]),B.value&&!S.value.length?(f(),i(l,{key:0,class:"state"},{default:u(()=>[p("加载中…")]),_:1})):S.value.length?(f(),i(l,{key:2,class:"list"},{default:u(()=>[(f(!0),y(g,null,k(S.value,(a,s)=>(f(),i(l,{key:a.id,class:h(["row",{"is-top1":0===s,"is-top2":1===s,"is-top3":2===s}]),onClick:s=>{var t;(t=a.id)&&x({url:`/pages/venue/detail?id=${t}`})}},{default:u(()=>[m(l,{class:"rank-wrap"},{default:u(()=>[s<3?(f(),i(l,{key:0,class:h(["medal","m"+(s+1)])},{default:u(()=>[p(b(s+1),1)]),_:2},1032,["class"])):(f(),i(e,{key:1,class:"rank-num"},{default:u(()=>[p(b(s+1),1)]),_:2},1024))]),_:2},1024),m(n,{class:"thumb",src:a.cover_image||w(N),mode:"aspectFill"},null,8,["src"]),m(l,{class:"mid"},{default:u(()=>[m(e,{class:"name"},{default:u(()=>[p(b(a.name),1)]),_:2},1024),a.district?(f(),i(e,{key:0,class:"district"},{default:u(()=>[p(b(a.district),1)]),_:2},1024)):j("",!0)]),_:2},1024),m(l,{class:"count-block"},{default:u(()=>[m(e,{class:"count-label"},{default:u(()=>[p("实时人数")]),_:1}),m(l,{class:"count-row"},{default:u(()=>[m(e,{class:"count"},{default:u(()=>[p(b(a.liveCount.toLocaleString()),1)]),_:2},1024),m(e,{class:"unit"},{default:u(()=>[p("人")]),_:1})]),_:2},1024)]),_:2},1024)]),_:2},1032,["class","onClick"]))),128))]),_:1})):(f(),i(l,{key:1,class:"state muted"},{default:u(()=>[p("暂无实时人数数据")]),_:1})),m(l,{class:"bottom-safe"})]),_:1})}}}),[["__scopeId","data-v-d4b050ee"]]);export{S as default};
import{d as a,r as s,a as t,ac as l,o as e,G as n,H as c,e as i,f as u,g as o,i as r,N as d,j as f,k as m,A as _,l as v,m as p,y,F as g,z as k,n as h,v as b,p as C,q as w,B as j,C as x,_ as B}from"./index-DUshN9Jj.js";import{a as A,g as P}from"./content.BQmGRZOL.js";import{g as F,l as H}from"./peopleCounting.D_h_2o8i.js";import{P as N}from"./poster.C6TYC1FC.js";const S=B(a({__name:"index",setup(a){const B=s(!0),S=s([]),q=s(6);async function z(){B.value=!0;try{const[a,s,t]=await Promise.all([A({only_included_in_stats:!0}),P().catch(()=>null),F().catch(()=>null)]),l=Array.isArray(a)?a:[],e=function(a){const s={};for(const t of(null==a?void 0:a.district)??[]){const a=(t.value||"").trim();a&&(s[a]=(t.label||"").trim()||a)}return s}(s),n=H(t);S.value=function(a,s,t){const l=a.map(a=>{const l=(a.district||"").trim(),e=l?s[l]??l:"",n=t.has(a.id)?t.get(a.id):null;return{id:a.id,name:a.name||"未命名场馆",district:e,cover_image:a.cover_image||null,liveCount:n}}).filter(a=>null!=a.liveCount&&a.liveCount>0);return l.sort((a,s)=>s.liveCount-a.liveCount),l}(l,e,n)}catch(a){o({title:(null==a?void 0:a.message)||"加载失败",icon:"none"}),S.value=[]}finally{B.value=!1}}return t(()=>{try{const a=l();q.value=Number(a.statusBarHeight||0)+6}catch{q.value=6}}),e(()=>{z()}),n(async()=>{try{await z()}finally{c()}}),(a,s)=>{const t=d("SubPageBackBtn"),l=r,e=v,n=C;return f(),i(l,{class:"page"},{default:u(()=>[m(l,{class:"stats-header",style:_({paddingTop:q.value+"px"})},{default:u(()=>[m(l,{class:"stats-header-row"},{default:u(()=>[m(t,{embedded:""}),m(l,{class:"stats-title-line"},{default:u(()=>[m(l,{class:"title-left"},{default:u(()=>[m(l,{class:"bar","aria-hidden":"true"}),m(e,{class:"title"},{default:u(()=>[p("实时人数排行")]),_:1})]),_:1}),m(e,{class:"title-hint"},{default:u(()=>[p("纳入市科协人数统计系统场馆")]),_:1})]),_:1})]),_:1})]),_:1},8,["style"]),B.value&&!S.value.length?(f(),i(l,{key:0,class:"state"},{default:u(()=>[p("加载中…")]),_:1})):S.value.length?(f(),i(l,{key:2,class:"list"},{default:u(()=>[(f(!0),y(g,null,k(S.value,(a,s)=>(f(),i(l,{key:a.id,class:h(["row",{"is-top1":0===s,"is-top2":1===s,"is-top3":2===s}]),onClick:s=>{var t;(t=a.id)&&x({url:`/pages/venue/detail?id=${t}`})}},{default:u(()=>[m(l,{class:"rank-wrap"},{default:u(()=>[s<3?(f(),i(l,{key:0,class:h(["medal","m"+(s+1)])},{default:u(()=>[p(b(s+1),1)]),_:2},1032,["class"])):(f(),i(e,{key:1,class:"rank-num"},{default:u(()=>[p(b(s+1),1)]),_:2},1024))]),_:2},1024),m(n,{class:"thumb",src:a.cover_image||w(N),mode:"aspectFill"},null,8,["src"]),m(l,{class:"mid"},{default:u(()=>[m(e,{class:"name"},{default:u(()=>[p(b(a.name),1)]),_:2},1024),a.district?(f(),i(e,{key:0,class:"district"},{default:u(()=>[p(b(a.district),1)]),_:2},1024)):j("",!0)]),_:2},1024),m(l,{class:"count-block"},{default:u(()=>[m(e,{class:"count-label"},{default:u(()=>[p("实时人数")]),_:1}),m(l,{class:"count-row"},{default:u(()=>[m(e,{class:"count"},{default:u(()=>[p(b(a.liveCount.toLocaleString()),1)]),_:2},1024),m(e,{class:"unit"},{default:u(()=>[p("人")]),_:1})]),_:2},1024)]),_:2},1024)]),_:2},1032,["class","onClick"]))),128))]),_:1})):(f(),i(l,{key:1,class:"state muted"},{default:u(()=>[p("暂无实时人数数据")]),_:1})),m(l,{class:"bottom-safe"})]),_:1})}}}),[["__scopeId","data-v-d4b050ee"]]);export{S as default};

@ -1 +1 @@
import{d as a,r as e,c as l,a as t,a3 as s,w as u,e as d,f as c,af as v,i as n,N as i,j as r,k as o,l as f,m as h,n as y,v as _,ag as x,A as g,y as m,F as k,z as p,_ as S}from"./index-DiI9PJ0b.js";const w="trafficLineChart",b=S(a({__name:"index",setup(a){const S=e("week"),b={week:[{date:"04-03",value:12358},{date:"04-04",value:15540},{date:"04-05",value:14200},{date:"04-06",value:18680},{date:"04-07",value:14820},{date:"04-08",value:20550},{date:"04-09",value:32100}],month:[{date:"04-01",value:12800},{date:"04-05",value:18800},{date:"04-10",value:17600},{date:"04-15",value:22900},{date:"04-20",value:19600},{date:"04-25",value:26400},{date:"04-30",value:30100}],year:[{date:"01月",value:268e3},{date:"03月",value:292e3},{date:"05月",value:318e3},{date:"07月",value:346e3},{date:"09月",value:332e3},{date:"11月",value:368e3},{date:"12月",value:392e3}]},T=l(()=>b[S.value]),C=l(()=>{var a,e;return`${(null==(a=T.value[0])?void 0:a.date)||"-"} 至 ${(null==(e=T.value[T.value.length-1])?void 0:e.date)||"-"}`}),F=l(()=>T.value.reduce((a,e)=>e.value>a.value?e:a,T.value[0]));function P(){const a=T.value;if(!a.length)return;const e=v(w),l=24,t=18,s=24,u=18,d=260,c=Math.min(...a.map(a=>a.value)),n=Math.max(...a.map(a=>a.value)),i=Math.max(1,n-c),r=680-u-t,o=d-l-s;e.clearRect(0,0,680,d);const f=e.createLinearGradient(0,l,0,d);f.addColorStop(0,"rgba(5,201,172,0.35)"),f.addColorStop(1,"rgba(5,201,172,0.02)");const h=a.map((e,t)=>({x:u+r*t/Math.max(1,a.length-1),y:l+(n-e.value)/i*o,value:e.value,date:e.date}));e.beginPath(),h.forEach((a,l)=>0===l?e.moveTo(a.x,a.y):e.lineTo(a.x,a.y)),e.lineTo(h[h.length-1].x,252),e.lineTo(h[0].x,252),e.closePath(),e.setFillStyle(f),e.fill(),e.beginPath(),h.forEach((a,l)=>0===l?e.moveTo(a.x,a.y):e.lineTo(a.x,a.y)),e.setStrokeStyle("#05c9ac"),e.setLineWidth(5),e.stroke(),e.setFillStyle("#ff7d00"),h.forEach(a=>{e.beginPath(),e.arc(a.x,a.y,6,0,2*Math.PI),e.fill(),e.setFillStyle("#4e5969"),e.setFontSize(20),e.fillText(a.value.toLocaleString(),a.x-34,a.y-12),e.setFillStyle("#ff7d00")}),e.draw()}return t(async()=>{await s(),P()}),u(S,async()=>{await s(),P()}),(a,e)=>{const l=i("SubPageBackBtn"),t=n,s=f,u=x;return r(),d(t,{class:"page"},{default:c(()=>[o(l),o(t,{class:"section-title"},{default:c(()=>[o(t,{class:"bar"}),o(s,{class:"title"},{default:c(()=>[h("全市参观人数")]),_:1}),o(t,{class:"period"},{default:c(()=>[o(s,{class:y({active:"week"===S.value}),onClick:e[0]||(e[0]=a=>S.value="week")},{default:c(()=>[h("周")]),_:1},8,["class"]),o(s,{class:y({active:"month"===S.value}),onClick:e[1]||(e[1]=a=>S.value="month")},{default:c(()=>[h("月")]),_:1},8,["class"]),o(s,{class:y({active:"year"===S.value}),onClick:e[2]||(e[2]=a=>S.value="year")},{default:c(()=>[h("年")]),_:1},8,["class"])]),_:1})]),_:1}),o(t,{class:"date-range"},{default:c(()=>[h(_(C.value),1)]),_:1}),o(t,{class:"chart-card"},{default:c(()=>[o(u,{"canvas-id":w,id:w,class:"chart-canvas",style:g("width:680rpx;height:260rpx;")},null,8,["style"]),o(t,{class:"x-axis"},{default:c(()=>[(r(!0),m(k,null,p(T.value,a=>(r(),d(s,{key:a.date},{default:c(()=>[h(_(a.date),1)]),_:2},1024))),128))]),_:1})]),_:1}),o(t,{class:"list-card"},{default:c(()=>[o(t,{class:"list-title"},{default:c(()=>[h("参观人数列表")]),_:1}),(r(!0),m(k,null,p(T.value,a=>(r(),d(t,{key:a.date,class:"row"},{default:c(()=>{var e;return[o(s,{class:"d"},{default:c(()=>[h(_(a.date),1)]),_:2},1024),o(s,{class:y(["c",{hot:a.date===(null==(e=F.value)?void 0:e.date)}])},{default:c(()=>{return[h(_((e=a.value,`${e.toLocaleString()}`)),1)];var e}),_:2},1032,["class"])]}),_:2},1024))),128))]),_:1})]),_:1})}}}),[["__scopeId","data-v-90b339fd"]]);export{b as default};
import{d as a,r as e,c as l,a as t,a3 as s,w as u,e as d,f as c,af as v,i as n,N as i,j as r,k as o,l as f,m as h,n as y,v as _,ag as x,A as g,y as m,F as k,z as p,_ as S}from"./index-DUshN9Jj.js";const w="trafficLineChart",b=S(a({__name:"index",setup(a){const S=e("week"),b={week:[{date:"04-03",value:12358},{date:"04-04",value:15540},{date:"04-05",value:14200},{date:"04-06",value:18680},{date:"04-07",value:14820},{date:"04-08",value:20550},{date:"04-09",value:32100}],month:[{date:"04-01",value:12800},{date:"04-05",value:18800},{date:"04-10",value:17600},{date:"04-15",value:22900},{date:"04-20",value:19600},{date:"04-25",value:26400},{date:"04-30",value:30100}],year:[{date:"01月",value:268e3},{date:"03月",value:292e3},{date:"05月",value:318e3},{date:"07月",value:346e3},{date:"09月",value:332e3},{date:"11月",value:368e3},{date:"12月",value:392e3}]},T=l(()=>b[S.value]),C=l(()=>{var a,e;return`${(null==(a=T.value[0])?void 0:a.date)||"-"} 至 ${(null==(e=T.value[T.value.length-1])?void 0:e.date)||"-"}`}),F=l(()=>T.value.reduce((a,e)=>e.value>a.value?e:a,T.value[0]));function P(){const a=T.value;if(!a.length)return;const e=v(w),l=24,t=18,s=24,u=18,d=260,c=Math.min(...a.map(a=>a.value)),n=Math.max(...a.map(a=>a.value)),i=Math.max(1,n-c),r=680-u-t,o=d-l-s;e.clearRect(0,0,680,d);const f=e.createLinearGradient(0,l,0,d);f.addColorStop(0,"rgba(5,201,172,0.35)"),f.addColorStop(1,"rgba(5,201,172,0.02)");const h=a.map((e,t)=>({x:u+r*t/Math.max(1,a.length-1),y:l+(n-e.value)/i*o,value:e.value,date:e.date}));e.beginPath(),h.forEach((a,l)=>0===l?e.moveTo(a.x,a.y):e.lineTo(a.x,a.y)),e.lineTo(h[h.length-1].x,252),e.lineTo(h[0].x,252),e.closePath(),e.setFillStyle(f),e.fill(),e.beginPath(),h.forEach((a,l)=>0===l?e.moveTo(a.x,a.y):e.lineTo(a.x,a.y)),e.setStrokeStyle("#05c9ac"),e.setLineWidth(5),e.stroke(),e.setFillStyle("#ff7d00"),h.forEach(a=>{e.beginPath(),e.arc(a.x,a.y,6,0,2*Math.PI),e.fill(),e.setFillStyle("#4e5969"),e.setFontSize(20),e.fillText(a.value.toLocaleString(),a.x-34,a.y-12),e.setFillStyle("#ff7d00")}),e.draw()}return t(async()=>{await s(),P()}),u(S,async()=>{await s(),P()}),(a,e)=>{const l=i("SubPageBackBtn"),t=n,s=f,u=x;return r(),d(t,{class:"page"},{default:c(()=>[o(l),o(t,{class:"section-title"},{default:c(()=>[o(t,{class:"bar"}),o(s,{class:"title"},{default:c(()=>[h("全市参观人数")]),_:1}),o(t,{class:"period"},{default:c(()=>[o(s,{class:y({active:"week"===S.value}),onClick:e[0]||(e[0]=a=>S.value="week")},{default:c(()=>[h("周")]),_:1},8,["class"]),o(s,{class:y({active:"month"===S.value}),onClick:e[1]||(e[1]=a=>S.value="month")},{default:c(()=>[h("月")]),_:1},8,["class"]),o(s,{class:y({active:"year"===S.value}),onClick:e[2]||(e[2]=a=>S.value="year")},{default:c(()=>[h("年")]),_:1},8,["class"])]),_:1})]),_:1}),o(t,{class:"date-range"},{default:c(()=>[h(_(C.value),1)]),_:1}),o(t,{class:"chart-card"},{default:c(()=>[o(u,{"canvas-id":w,id:w,class:"chart-canvas",style:g("width:680rpx;height:260rpx;")},null,8,["style"]),o(t,{class:"x-axis"},{default:c(()=>[(r(!0),m(k,null,p(T.value,a=>(r(),d(s,{key:a.date},{default:c(()=>[h(_(a.date),1)]),_:2},1024))),128))]),_:1})]),_:1}),o(t,{class:"list-card"},{default:c(()=>[o(t,{class:"list-title"},{default:c(()=>[h("参观人数列表")]),_:1}),(r(!0),m(k,null,p(T.value,a=>(r(),d(t,{key:a.date,class:"row"},{default:c(()=>{var e;return[o(s,{class:"d"},{default:c(()=>[h(_(a.date),1)]),_:2},1024),o(s,{class:y(["c",{hot:a.date===(null==(e=F.value)?void 0:e.date)}])},{default:c(()=>{return[h(_((e=a.value,`${e.toLocaleString()}`)),1)];var e}),_:2},1032,["class"])]}),_:2},1024))),128))]),_:1})]),_:1})}}}),[["__scopeId","data-v-90b339fd"]]);export{b as default};

@ -1 +1 @@
import{ad as r,ae as n}from"./index-DiI9PJ0b.js";function t(){const t=n.peopleCountingUrl;return new Promise((n,e)=>{r({url:t,method:"GET",success:r=>{const t=r.statusCode||0;t>=200&&t<300?n(r.data):e(new Error(`客流接口 HTTP ${t}`))},fail:r=>e(r)})})}function e(r,n){return Math.max(0,Number(r??0)-Number(n??0))}function o(r){const n=Number(String(r).trim());return Number.isFinite(n)&&n>0?n:null}function s(r){const n=new Map;if(!Array.isArray(r))return n;for(const t of r){const r=String(t.groupId||"").trim().toUpperCase();if(!r)continue;const e=(t.groupName||"").trim();n.set(r,e||r)}return n}function u(r,n,t){const e=(t||"").trim();if(e)return e;for(const o of function(r){if(!r)return[];if(Array.isArray(r))return r.map(r=>String(r).trim().toUpperCase()).filter(Boolean);if("string"!=typeof r)return[];const n=[],t=/\[([A-Fa-f0-9]{32})\]/g;let e;for(;null!==(e=t.exec(r));)n.push(e[1].toUpperCase());const o=r.trim().match(/^[A-Fa-f0-9]{32}$/);return o&&0===n.length?[o[0].toUpperCase()]:n}(r.includedGroups)){const r=n.get(o);if(r)return r}return(r.venueName||"").trim()||"—"}function i(r){const n=new Map;if(!r||200!==r.code||!Array.isArray(r.venues))return n;for(const t of r.venues){const r=o(t.venueId);null!=r&&n.set(r,e(t.enter,t.exit))}return n}function a(r){if(!r||200!==r.code||!Array.isArray(r.venues))return null;let n=0;for(const t of r.venues){const r=o(t.venueId);null==r||r<=0||(n+=e(t.enter,t.exit))}return n}export{u as a,s as b,t as g,i as l,e as n,a as t,o as v};
import{ad as r,ae as n}from"./index-DUshN9Jj.js";function t(){const t=n.peopleCountingUrl;return new Promise((n,e)=>{r({url:t,method:"GET",success:r=>{const t=r.statusCode||0;t>=200&&t<300?n(r.data):e(new Error(`客流接口 HTTP ${t}`))},fail:r=>e(r)})})}function e(r,n){return Math.max(0,Number(r??0)-Number(n??0))}function o(r){const n=Number(String(r).trim());return Number.isFinite(n)&&n>0?n:null}function s(r){const n=new Map;if(!Array.isArray(r))return n;for(const t of r){const r=String(t.groupId||"").trim().toUpperCase();if(!r)continue;const e=(t.groupName||"").trim();n.set(r,e||r)}return n}function u(r,n,t){const e=(t||"").trim();if(e)return e;for(const o of function(r){if(!r)return[];if(Array.isArray(r))return r.map(r=>String(r).trim().toUpperCase()).filter(Boolean);if("string"!=typeof r)return[];const n=[],t=/\[([A-Fa-f0-9]{32})\]/g;let e;for(;null!==(e=t.exec(r));)n.push(e[1].toUpperCase());const o=r.trim().match(/^[A-Fa-f0-9]{32}$/);return o&&0===n.length?[o[0].toUpperCase()]:n}(r.includedGroups)){const r=n.get(o);if(r)return r}return(r.venueName||"").trim()||"—"}function i(r){const n=new Map;if(!r||200!==r.code||!Array.isArray(r.venues))return n;for(const t of r.venues){const r=o(t.venueId);null!=r&&n.set(r,e(t.enter,t.exit))}return n}function a(r){if(!r||200!==r.code||!Array.isArray(r.venues))return null;let n=0;for(const t of r.venues){const r=o(t.venueId);null==r||r<=0||(n+=e(t.enter,t.exit))}return n}export{u as a,s as b,t as g,i as l,e as n,a as t,o as v};

@ -1 +1 @@
import{g as A,ab as i}from"./index-DiI9PJ0b.js";import{s}from"./text.BxMbQPAt.js";const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAbCAYAAABr/T8RAAABxklEQVRIicXXsY+MQRjH8c979rCiQERCriDR0CgkCoJCoTiEHBqV/0M09KIUiURDgoiImkIhl1CdXKIQCRWJyzUczloZeTbeW/u+9777ur1fMtl3952Z78xvnnlmNmu/uK2mJjCJc/iIy3hbt5NWxXpbcRzncRibc+924wi+1wRnRe824hhOB3R7Qb192IYPtcDdf8FHMYUT2FWhj59KRl8IjiY7A3YGh+p2MoyS1WndbmDTKIA9JauvjxoqZtweNbQH7qwKeEBUjwYsWwJ+h+coc2E9TsY+bwD+O+NvOIXXFdpdxK2Cdxsiuy3gJb4OBOes/oX5igOeK4E+joyX9Ab3cRez+YrZ+PSDz9gS31/haYnVXbQjZ++I375gL97jAKYHtFuMfu/hURp4q7t0jfdHGVbrCtqNR75P5RIutBhrwBnoyHJK+f9K/3aaDUsWCxJ/N6L5bN/RWFcT+aheiKiucqg/w50G4E5+H2exFlW0tgH0j/JWp8TwMKz+UcHqZuC+/vdEWXGVXX1WVKt2SPzXTVxHKaqbwsdygVjVvjXJ6hTBTZRumSkHJPU+l9N8utBfjX8Dw878Jj7F8wye4GBJ/Q6u/Qah/1ByEhqpiwAAAABJRU5ErkJggg==",e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAABuElEQVRIia2VP0scURTFf2d2DVqmyQcIFn6BKJLOygUNWFpYydrYKGihkDSCprBIoWIghWlTCCbq2liEKMKuFiooElLmEyQYSAI3THZGhmHfm3HGC4eZN/e+OffPmXnqOXlPwmrABNAE3vBAVk285i0wFd2PA93A64egqYLC6ydgJOVbAS6BvdIkhuY7EMS2AzwGfpQhCZAWkHCggrTu8edCAOpqt8yJCVB/RowXgaHvhsjATI4YJ8JKPufI5lepSkCrGUF/QctlSKomfQVawDOHONaAb+XU1WarezLpLVNFPPhwOOeGth2DGzE0WXbwMeM46Kcjm3eg4eKVKCDCb1NQS6zTaJiC5x6/E0GK9Qj0ypNV6K8VnUkSS4Y+eHq8b+hlYj1mqGHoxNBspz2qNHdcymsAwx5ltqJrWvpX0ZFxHD9QpfXRJ/EsIp+tAvP/v5MM+dUM7RaU7pyhQ0OP0oPvhFHQRkH5DoG+hIdWntKno16vFWhbf55KYqyDBkA396zmOrjnKddE6kNaRPqTc089a/AurBjqNbRp6NYTVzd0LE4PCir0zp4AL4BB4Gn7z84FsAWcAfwDuxHZ5sUXudsAAAAASUVORK5CYII=",r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAeCAYAAAA2Lt7lAAADKklEQVRIiZ3W24vVVRQH8M86zpij0MVCMQq6iJaGaWbRDXowkopeooeeeuiht16CXvoTfAuKIIsCESKIigpEKQkiLcJSJrSgLMoLZmTa2KTOju2sGU+/fr8zM31hwTlnrb3WXt912SdGPntDBxbjbmzEelyFSxE4hRP4CjvxKY61uRnqcH4XHsJarMA1WNinX4YzWIrrcSc+zEDnGgGi//si3IOn8HjetgsjuCFlE27C5fg4MywXApSLpxfmTZ7PDOaCkhkvy0t9hD/q+d7k9wuyiniOuIMYJqJPN5NU28rGWuJZYs2U/dAF3WTkx/DgHG/exDDuxRP4GYd6GX0j8ShROm5afz9LjKfUzxMDbKuvTcS8WoPaCbdj+YCinsQHGMX57KxHsouaiGSk+txZeVuHVZjf4fwAtmE7fsAErsV+PIl1LWfmYWWdnxrg1hyiJkr29DvYjL/69FNDNtJ3uWb2V2B1r4ilRSwqQkPOF/FjEfuKGG/RVxktYn8R51p0C4pY3BOxUMTwZK3/JRMiTog4JqK06KscF3FUxPkW3fzqu1JUp+7vFop6uAxXDmjLSsOStG2iNsN4peiXIk61pDhUxIoibimi10HR6iJuK2K4RTdWxK81g9EsWht6uZPGstjfZvGvw8M5UF0L83ccrAG+xje4v6NVb8YzuTUPZOrLM8CNA+g7iC+GSi0iu/FAtlzbsF2Npwc460fN8DD24LupdV2335rat7N0MgjV4bvYUYeyFrLaHk+ON+A+LPifzms37sVb+F7jwal1eCFbc32O+1xQskYvZhCTAWI6wFi+RhuyS5bMMcCZPF+Z+HM6QLmYQUnFttySsy3qFCrvr+VzOY1eyz4/SLxO7MrdP9Nrdo74kniV2NfUtwWospfYTPw0iwBH0nZPm75XkpuGjBd2F7YUDnXYVDlS2FrYVTjdZtOVQZXfiK3Ee5ML8T/6St/2pPNYl5/+LmrD4Szeylwll6TNWdQV83bup060rdkmPscrONr3e32jX8YnMx3uWsP9crqIHUW8VMSRIo4XsaWI94s4OdP55l/HLtT5eDMnvNJUZ6VmMRj4Bz4oCls1OzRGAAAAAElFTkSuQmCC";function u(A){const i=s(A);return i?i.split(/[,,、;/|]+/u).map(A=>A.trim()).filter(A=>""!==A):[]}function a(s){const t=function(A){return A.trim().replace(/\s+/g,"")}(s);t?i({phoneNumber:t}):A({title:"号码无效",icon:"none"})}export{e as a,r as b,a as d,t as i,u as s};
import{g as A,ab as i}from"./index-DUshN9Jj.js";import{s}from"./text.BxMbQPAt.js";const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAbCAYAAABr/T8RAAABxklEQVRIicXXsY+MQRjH8c979rCiQERCriDR0CgkCoJCoTiEHBqV/0M09KIUiURDgoiImkIhl1CdXKIQCRWJyzUczloZeTbeW/u+9777ur1fMtl3952Z78xvnnlmNmu/uK2mJjCJc/iIy3hbt5NWxXpbcRzncRibc+924wi+1wRnRe824hhOB3R7Qb192IYPtcDdf8FHMYUT2FWhj59KRl8IjiY7A3YGh+p2MoyS1WndbmDTKIA9JauvjxoqZtweNbQH7qwKeEBUjwYsWwJ+h+coc2E9TsY+bwD+O+NvOIXXFdpdxK2Cdxsiuy3gJb4OBOes/oX5igOeK4E+joyX9Ab3cRez+YrZ+PSDz9gS31/haYnVXbQjZ++I375gL97jAKYHtFuMfu/hURp4q7t0jfdHGVbrCtqNR75P5RIutBhrwBnoyHJK+f9K/3aaDUsWCxJ/N6L5bN/RWFcT+aheiKiucqg/w50G4E5+H2exFlW0tgH0j/JWp8TwMKz+UcHqZuC+/vdEWXGVXX1WVKt2SPzXTVxHKaqbwsdygVjVvjXJ6hTBTZRumSkHJPU+l9N8utBfjX8Dw878Jj7F8wye4GBJ/Q6u/Qah/1ByEhqpiwAAAABJRU5ErkJggg==",e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAABuElEQVRIia2VP0scURTFf2d2DVqmyQcIFn6BKJLOygUNWFpYydrYKGihkDSCprBIoWIghWlTCCbq2liEKMKuFiooElLmEyQYSAI3THZGhmHfm3HGC4eZN/e+OffPmXnqOXlPwmrABNAE3vBAVk285i0wFd2PA93A64egqYLC6ydgJOVbAS6BvdIkhuY7EMS2AzwGfpQhCZAWkHCggrTu8edCAOpqt8yJCVB/RowXgaHvhsjATI4YJ8JKPufI5lepSkCrGUF/QctlSKomfQVawDOHONaAb+XU1WarezLpLVNFPPhwOOeGth2DGzE0WXbwMeM46Kcjm3eg4eKVKCDCb1NQS6zTaJiC5x6/E0GK9Qj0ypNV6K8VnUkSS4Y+eHq8b+hlYj1mqGHoxNBspz2qNHdcymsAwx5ltqJrWvpX0ZFxHD9QpfXRJ/EsIp+tAvP/v5MM+dUM7RaU7pyhQ0OP0oPvhFHQRkH5DoG+hIdWntKno16vFWhbf55KYqyDBkA396zmOrjnKddE6kNaRPqTc089a/AurBjqNbRp6NYTVzd0LE4PCir0zp4AL4BB4Gn7z84FsAWcAfwDuxHZ5sUXudsAAAAASUVORK5CYII=",r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAeCAYAAAA2Lt7lAAADKklEQVRIiZ3W24vVVRQH8M86zpij0MVCMQq6iJaGaWbRDXowkopeooeeeuiht16CXvoTfAuKIIsCESKIigpEKQkiLcJSJrSgLMoLZmTa2KTOju2sGU+/fr8zM31hwTlnrb3WXt912SdGPntDBxbjbmzEelyFSxE4hRP4CjvxKY61uRnqcH4XHsJarMA1WNinX4YzWIrrcSc+zEDnGgGi//si3IOn8HjetgsjuCFlE27C5fg4MywXApSLpxfmTZ7PDOaCkhkvy0t9hD/q+d7k9wuyiniOuIMYJqJPN5NU28rGWuJZYs2U/dAF3WTkx/DgHG/exDDuxRP4GYd6GX0j8ShROm5afz9LjKfUzxMDbKuvTcS8WoPaCbdj+YCinsQHGMX57KxHsouaiGSk+txZeVuHVZjf4fwAtmE7fsAErsV+PIl1LWfmYWWdnxrg1hyiJkr29DvYjL/69FNDNtJ3uWb2V2B1r4ilRSwqQkPOF/FjEfuKGG/RVxktYn8R51p0C4pY3BOxUMTwZK3/JRMiTog4JqK06KscF3FUxPkW3fzqu1JUp+7vFop6uAxXDmjLSsOStG2iNsN4peiXIk61pDhUxIoibimi10HR6iJuK2K4RTdWxK81g9EsWht6uZPGstjfZvGvw8M5UF0L83ccrAG+xje4v6NVb8YzuTUPZOrLM8CNA+g7iC+GSi0iu/FAtlzbsF2Npwc460fN8DD24LupdV2335rat7N0MgjV4bvYUYeyFrLaHk+ON+A+LPifzms37sVb+F7jwal1eCFbc32O+1xQskYvZhCTAWI6wFi+RhuyS5bMMcCZPF+Z+HM6QLmYQUnFttySsy3qFCrvr+VzOY1eyz4/SLxO7MrdP9Nrdo74kniV2NfUtwWospfYTPw0iwBH0nZPm75XkpuGjBd2F7YUDnXYVDlS2FrYVTjdZtOVQZXfiK3Ee5ML8T/6St/2pPNYl5/+LmrD4Szeylwll6TNWdQV83bup060rdkmPscrONr3e32jX8YnMx3uWsP9crqIHUW8VMSRIo4XsaWI94s4OdP55l/HLtT5eDMnvNJUZ6VmMRj4Bz4oCls1OzRGAAAAAElFTkSuQmCC";function u(A){const i=s(A);return i?i.split(/[,,、;/|]+/u).map(A=>A.trim()).filter(A=>""!==A):[]}function a(s){const t=function(A){return A.trim().replace(/\s+/g,"")}(s);t?i({phoneNumber:t}):A({title:"号码无效",icon:"none"})}export{e as a,r as b,a as d,t as i,u as s};

@ -1 +1 @@
import{h as t}from"./index-DiI9PJ0b.js";function e(){return t.get("/h5/me/profile",{},{withAuth:!0})}function r(e){return t.put("/h5/me/profile",e,{withAuth:!0})}export{e as g,r as u};
import{h as t}from"./index-DUshN9Jj.js";function e(){return t.get("/h5/me/profile",{},{withAuth:!0})}function r(e){return t.put("/h5/me/profile",e,{withAuth:!0})}export{e as g,r as u};

@ -9,7 +9,7 @@
content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"
/>
<title>苏州市科普场馆地图</title>
<script type="module" crossorigin src="/h5/assets/index-DiI9PJ0b.js"></script>
<script type="module" crossorigin src="/h5/assets/index-DUshN9Jj.js"></script>
<link rel="stylesheet" crossorigin href="/h5/assets/index-Bqb_3gkU.css">
</head>
<body>

@ -50,6 +50,7 @@ Route::post('/auth/login', [AuthController::class, 'login']);
Route::post('/verify-portal/login', [VerifyPortalAuthController::class, 'login']);
Route::get('/verify-portal/preview', [VerifyPortalAuthController::class, 'portalPreview']);
Route::get('/h5/home', [H5HomeController::class, 'index']);
Route::middleware('auth:sanctum')->post('/h5/home/visit', [H5HomeController::class, 'recordVisit']);
Route::post('/h5/wechat/oauth', [H5WechatController::class, 'oauth']);
Route::get('/wechat/jssdk-signature', [H5WechatController::class, 'jssdkSignature']);
/**
@ -100,6 +101,7 @@ Route::middleware(['auth:sanctum', 'audit.log'])->group(function () {
Route::get('/verify-portal/me', [VerifyPortalAuthController::class, 'me']);
Route::get('/wechat-users', [WechatUserController::class, 'index']);
Route::get('/wechat-users/export', [WechatUserController::class, 'export']);
Route::get('/admin-users', [AdminUserController::class, 'index']);
Route::post('/admin-users', [AdminUserController::class, 'store']);
Route::put('/admin-users/{user}', [AdminUserController::class, 'update']);
@ -140,6 +142,8 @@ Route::middleware(['auth:sanctum', 'audit.log'])->group(function () {
Route::delete('/venues/{id}', [VenueController::class, 'destroy'])->whereNumber('id');
Route::post('/venues/{id}/audit/approve', [VenueController::class, 'approve'])->whereNumber('id');
Route::post('/venues/{id}/audit/reject', [VenueController::class, 'reject'])->whereNumber('id');
Route::get('/venues/{id}/audit-detail', [VenueController::class, 'auditDetail'])->whereNumber('id');
Route::get('/venues/{id}/audit-logs', [VenueController::class, 'auditLogs'])->whereNumber('id');
Route::get('/activities', [ActivityController::class, 'index']);
Route::post('/activities', [ActivityController::class, 'store']);

Loading…
Cancel
Save