parent
43dc99264d
commit
73cc701ad9
@ -0,0 +1,113 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\AdminRole;
|
||||
use App\Models\RoleMenuPermission;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Validation\Rule;
|
||||
|
||||
class AdminRoleController extends Controller
|
||||
{
|
||||
public function index(Request $request): JsonResponse
|
||||
{
|
||||
$this->ensureSuperAdmin($request);
|
||||
|
||||
$roles = AdminRole::query()->orderBy('sort')->orderBy('id')->get(['id', 'slug', 'name', 'is_system', 'full_access', 'sort']);
|
||||
|
||||
return response()->json($roles);
|
||||
}
|
||||
|
||||
public function store(Request $request): JsonResponse
|
||||
{
|
||||
$this->ensureSuperAdmin($request);
|
||||
|
||||
$data = $request->validate([
|
||||
'slug' => [
|
||||
'required',
|
||||
'string',
|
||||
'max:50',
|
||||
'regex:/^[a-z][a-z0-9_]{1,47}$/',
|
||||
Rule::unique('admin_roles', 'slug'),
|
||||
Rule::notIn(['super_admin', 'venue_admin']),
|
||||
],
|
||||
'name' => ['required', 'string', 'max:100'],
|
||||
'full_access' => ['sometimes', 'boolean'],
|
||||
]);
|
||||
|
||||
$slug = strtolower(trim($data['slug']));
|
||||
|
||||
$role = AdminRole::create([
|
||||
'slug' => $slug,
|
||||
'name' => trim($data['name']),
|
||||
'is_system' => false,
|
||||
'full_access' => (bool) ($data['full_access'] ?? false),
|
||||
'sort' => (int) (AdminRole::query()->max('sort') ?? 0) + 1,
|
||||
]);
|
||||
|
||||
return response()->json($role, 201);
|
||||
}
|
||||
|
||||
public function update(Request $request, string $slug): JsonResponse
|
||||
{
|
||||
$this->ensureSuperAdmin($request);
|
||||
|
||||
$role = AdminRole::query()->where('slug', $slug)->firstOrFail();
|
||||
|
||||
$data = $request->validate([
|
||||
'name' => ['sometimes', 'string', 'max:100'],
|
||||
'full_access' => ['sometimes', 'boolean'],
|
||||
]);
|
||||
|
||||
if (isset($data['name'])) {
|
||||
$role->name = trim($data['name']);
|
||||
}
|
||||
|
||||
if (array_key_exists('full_access', $data)) {
|
||||
if ($role->slug === 'venue_admin') {
|
||||
abort_if($data['full_access'], 422, '场馆管理员不可设为系统级全权限');
|
||||
}
|
||||
if ($role->slug === 'super_admin') {
|
||||
// 固定为全权限
|
||||
$role->full_access = true;
|
||||
} else {
|
||||
$role->full_access = (bool) $data['full_access'];
|
||||
}
|
||||
}
|
||||
|
||||
$role->save();
|
||||
|
||||
return response()->json($role->fresh());
|
||||
}
|
||||
|
||||
public function destroy(Request $request, string $slug): JsonResponse
|
||||
{
|
||||
$this->ensureSuperAdmin($request);
|
||||
|
||||
$role = AdminRole::query()->where('slug', $slug)->firstOrFail();
|
||||
|
||||
abort_if($role->is_system, 422, '系统内置角色不可删除');
|
||||
|
||||
abort_if(
|
||||
User::query()->where('role', $slug)->exists(),
|
||||
422,
|
||||
'仍有管理员使用该角色,无法删除'
|
||||
);
|
||||
|
||||
DB::transaction(function () use ($slug) {
|
||||
RoleMenuPermission::query()->where('role', $slug)->delete();
|
||||
AdminRole::query()->where('slug', $slug)->delete();
|
||||
});
|
||||
|
||||
return response()->json(['message' => '角色已删除']);
|
||||
}
|
||||
|
||||
private function ensureSuperAdmin(Request $request): void
|
||||
{
|
||||
abort_unless($request->user()?->isSuperAdmin(), 403, '仅超级管理员可操作');
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,138 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class SystemLogController extends Controller
|
||||
{
|
||||
private const MAX_LINES = 5000;
|
||||
|
||||
private const DEFAULT_LINES = 400;
|
||||
|
||||
/** 仅允许 laravel.log 与 laravel-YYYY-MM-DD.log */
|
||||
private function isAllowedBasename(string $name): bool
|
||||
{
|
||||
return (bool) preg_match('/^laravel(-\d{4}-\d{2}-\d{2})?\.log$/', $name);
|
||||
}
|
||||
|
||||
public function index(Request $request): JsonResponse
|
||||
{
|
||||
abort_unless($request->user()?->isSuperAdmin(), 403, '仅超级管理员可查看系统日志');
|
||||
|
||||
$logsDir = storage_path('logs');
|
||||
$files = $this->listLogFiles($logsDir);
|
||||
|
||||
$requested = basename((string) $request->query('file', ''));
|
||||
$selected = '';
|
||||
if ($requested !== '' && $requested !== '.' && $this->isAllowedBasename($requested)) {
|
||||
$candidate = $logsDir.DIRECTORY_SEPARATOR.$requested;
|
||||
if (is_file($candidate)) {
|
||||
$selected = $requested;
|
||||
}
|
||||
}
|
||||
if ($selected === '' && $files !== []) {
|
||||
$selected = $files[0]['name'];
|
||||
}
|
||||
|
||||
$linesParam = (int) $request->query('lines', self::DEFAULT_LINES);
|
||||
$lines = max(50, min(self::MAX_LINES, $linesParam));
|
||||
|
||||
$linesPayload = [];
|
||||
$error = null;
|
||||
|
||||
if ($selected !== '') {
|
||||
$fullPath = $logsDir.DIRECTORY_SEPARATOR.$selected;
|
||||
if (! is_file($fullPath) || ! is_readable($fullPath)) {
|
||||
$error = '日志文件不可读';
|
||||
} else {
|
||||
$linesPayload = $this->tailLines($fullPath, $lines);
|
||||
}
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'files' => $files,
|
||||
'file' => $selected,
|
||||
'lines' => $linesPayload,
|
||||
'lines_requested' => $lines,
|
||||
'error' => $error,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<int, array{name: string, size_bytes: int, modified_at: string}>
|
||||
*/
|
||||
private function listLogFiles(string $logsDir): array
|
||||
{
|
||||
if (! is_dir($logsDir)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$pattern = $logsDir.DIRECTORY_SEPARATOR.'laravel*.log';
|
||||
$paths = glob($pattern) ?: [];
|
||||
|
||||
$files = [];
|
||||
foreach ($paths as $full) {
|
||||
$base = basename($full);
|
||||
if (! $this->isAllowedBasename($base)) {
|
||||
continue;
|
||||
}
|
||||
$mtime = @filemtime($full);
|
||||
$size = @filesize($full);
|
||||
$files[] = [
|
||||
'name' => $base,
|
||||
'size_bytes' => $size !== false ? $size : 0,
|
||||
'modified_at' => $mtime ? date('c', $mtime) : '',
|
||||
];
|
||||
}
|
||||
|
||||
usort($files, static function (array $a, array $b): int {
|
||||
return strcmp($b['modified_at'], $a['modified_at']);
|
||||
});
|
||||
|
||||
return array_values($files);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<int, string>
|
||||
*/
|
||||
private function tailLines(string $path, int $maxLines): array
|
||||
{
|
||||
$size = filesize($path);
|
||||
if ($size === false || $size === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$maxLines = max(1, min(self::MAX_LINES, $maxLines));
|
||||
$chunk = min($size, 262144);
|
||||
|
||||
while ($chunk <= $size) {
|
||||
$start = $size - $chunk;
|
||||
$data = file_get_contents($path, false, null, $start, $chunk);
|
||||
if ($data === false) {
|
||||
return [];
|
||||
}
|
||||
if ($start > 0) {
|
||||
$firstNl = strpos($data, "\n");
|
||||
if ($firstNl !== false) {
|
||||
$data = substr($data, $firstNl + 1);
|
||||
}
|
||||
}
|
||||
|
||||
$parts = preg_split('/\r\n|\r|\n/', $data);
|
||||
if ($parts === false) {
|
||||
$parts = [];
|
||||
}
|
||||
|
||||
if (count($parts) >= $maxLines || $chunk >= $size) {
|
||||
return array_values(array_slice($parts, -$maxLines));
|
||||
}
|
||||
|
||||
$chunk = min($size, $chunk * 2);
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,112 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Activity;
|
||||
use App\Models\TicketGrabEvent;
|
||||
use App\Models\VerifyPortalCredential;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
|
||||
class VerifyPortalAuthController extends Controller
|
||||
{
|
||||
public function login(Request $request): JsonResponse
|
||||
{
|
||||
$data = $request->validate([
|
||||
'portal_code' => ['nullable', 'string', 'max:16'],
|
||||
'portal_token' => ['nullable', 'string', 'max:64'],
|
||||
'username' => ['required', 'string', 'max:64'],
|
||||
'password' => ['required', 'string', 'max:72'],
|
||||
]);
|
||||
|
||||
$code = strtolower(trim((string) ($data['portal_code'] ?? '')));
|
||||
$portalToken = trim((string) ($data['portal_token'] ?? ''));
|
||||
|
||||
if ($code === '' && ($portalToken === '' || strlen($portalToken) < 32)) {
|
||||
return response()->json(['message' => '请提供核销入口短码或有效入口参数'], 422);
|
||||
}
|
||||
|
||||
$activity = null;
|
||||
$tg = null;
|
||||
|
||||
if ($code !== '') {
|
||||
$activity = Activity::query()->where('verify_portal_code', $code)->first();
|
||||
if (! $activity) {
|
||||
$tg = TicketGrabEvent::query()->where('verify_portal_code', $code)->first();
|
||||
}
|
||||
} elseif ($portalToken !== '' && strlen($portalToken) >= 32) {
|
||||
$activity = Activity::query()->where('verify_portal_token', $portalToken)->first();
|
||||
if (! $activity) {
|
||||
$tg = TicketGrabEvent::query()->where('verify_portal_token', $portalToken)->first();
|
||||
}
|
||||
}
|
||||
|
||||
if ($activity) {
|
||||
$kind = VerifyPortalCredential::KIND_ACTIVITY;
|
||||
$portalId = (int) $activity->id;
|
||||
} elseif ($tg) {
|
||||
$kind = VerifyPortalCredential::KIND_TICKET_GRAB;
|
||||
$portalId = (int) $tg->id;
|
||||
} else {
|
||||
return response()->json(['message' => '无效的核销入口'], 404);
|
||||
}
|
||||
|
||||
$cred = VerifyPortalCredential::query()
|
||||
->where('portal_kind', $kind)
|
||||
->where('portal_id', $portalId)
|
||||
->where('username', $data['username'])
|
||||
->first();
|
||||
|
||||
if (! $cred || ! Hash::check($data['password'], $cred->password)) {
|
||||
return response()->json(['message' => '账号或密码错误'], 422);
|
||||
}
|
||||
|
||||
if (! $cred->portalAcceptsVerification()) {
|
||||
return response()->json(['message' => '活动已结束,无法登录核销'], 422);
|
||||
}
|
||||
|
||||
$cred->tokens()->delete();
|
||||
$expiresAt = now()->addMonths(6);
|
||||
$plain = $cred->createToken('verify-portal', ['verify-portal'], $expiresAt)->plainTextToken;
|
||||
|
||||
return response()->json([
|
||||
'token' => $plain,
|
||||
'auth_mode' => 'verify_portal',
|
||||
'portal_kind' => $kind,
|
||||
'portal_id' => $portalId,
|
||||
]);
|
||||
}
|
||||
|
||||
public function me(Request $request): JsonResponse
|
||||
{
|
||||
$cred = $request->user();
|
||||
if (! $cred instanceof VerifyPortalCredential) {
|
||||
return response()->json(['message' => '非核销门户登录态'], 403);
|
||||
}
|
||||
|
||||
if (! $cred->portalAcceptsVerification()) {
|
||||
$cred->tokens()->delete();
|
||||
|
||||
return response()->json(['message' => '活动已结束,核销已失效'], 403);
|
||||
}
|
||||
|
||||
$cred->load('venue:id,name');
|
||||
$title = '';
|
||||
if ($cred->portal_kind === VerifyPortalCredential::KIND_ACTIVITY) {
|
||||
$title = (string) Activity::query()->where('id', $cred->portal_id)->value('title');
|
||||
} else {
|
||||
$title = (string) TicketGrabEvent::query()->where('id', $cred->portal_id)->value('title');
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'auth_mode' => 'verify_portal',
|
||||
'portal_kind' => $cred->portal_kind,
|
||||
'portal_id' => $cred->portal_id,
|
||||
'username' => $cred->username,
|
||||
'venue' => $cred->venue ? ['id' => $cred->venue->id, 'name' => $cred->venue->name] : null,
|
||||
'event_title' => $title,
|
||||
]);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,274 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Activity;
|
||||
use App\Models\TicketGrabEvent;
|
||||
use App\Models\TicketGrabEventVenue;
|
||||
use App\Models\VerifyPortalCredential;
|
||||
use App\Support\VerifyPortalCode;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Crypt;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
|
||||
class VerifyPortalManageController extends Controller
|
||||
{
|
||||
public function activityShow(Request $request, Activity $activity): JsonResponse
|
||||
{
|
||||
$this->ensureActivityVenueAdmin($request, $activity);
|
||||
if ($activity->verify_portal_token === null || $activity->verify_portal_token === '') {
|
||||
$activity->forceFill(['verify_portal_token' => (string) \Illuminate\Support\Str::uuid()])->save();
|
||||
}
|
||||
VerifyPortalCode::ensureForActivity($activity);
|
||||
$activity->refresh();
|
||||
$rows = VerifyPortalCredential::query()
|
||||
->where('portal_kind', VerifyPortalCredential::KIND_ACTIVITY)
|
||||
->where('portal_id', $activity->id)
|
||||
->with('venue:id,name')
|
||||
->orderBy('id')
|
||||
->get()
|
||||
->map(fn (VerifyPortalCredential $c) => $this->credentialToRow($c));
|
||||
|
||||
return response()->json([
|
||||
'verify_portal_code' => $activity->verify_portal_code,
|
||||
'credentials' => $rows,
|
||||
]);
|
||||
}
|
||||
|
||||
public function activityStore(Request $request, Activity $activity): JsonResponse
|
||||
{
|
||||
$this->ensureActivityVenueAdmin($request, $activity);
|
||||
$data = $request->validate([
|
||||
'username' => ['required', 'string', 'max:64'],
|
||||
'password' => ['required', 'string', 'min:6', 'max:72'],
|
||||
'note' => ['nullable', 'string', 'max:255'],
|
||||
]);
|
||||
$vid = (int) $activity->venue_id;
|
||||
$exists = VerifyPortalCredential::query()
|
||||
->where('portal_kind', VerifyPortalCredential::KIND_ACTIVITY)
|
||||
->where('portal_id', $activity->id)
|
||||
->where('venue_id', $vid)
|
||||
->where('username', $data['username'])
|
||||
->exists();
|
||||
if ($exists) {
|
||||
return response()->json(['message' => '该场馆下此用户名已存在'], 422);
|
||||
}
|
||||
$plain = (string) $data['password'];
|
||||
$c = VerifyPortalCredential::query()->create([
|
||||
'portal_kind' => VerifyPortalCredential::KIND_ACTIVITY,
|
||||
'portal_id' => $activity->id,
|
||||
'venue_id' => $vid,
|
||||
'username' => $data['username'],
|
||||
'password' => Hash::make($plain),
|
||||
'password_plain_enc' => Crypt::encryptString($plain),
|
||||
'note' => $data['note'] ?? null,
|
||||
]);
|
||||
|
||||
return response()->json(['id' => $c->id], 201);
|
||||
}
|
||||
|
||||
public function activityUpdate(Request $request, Activity $activity, VerifyPortalCredential $verifyPortalCredential): JsonResponse
|
||||
{
|
||||
$this->ensureActivityVenueAdmin($request, $activity);
|
||||
$this->assertCredentialBelongsActivity($verifyPortalCredential, $activity);
|
||||
$data = $request->validate([
|
||||
'password' => ['sometimes', 'string', 'min:6', 'max:72'],
|
||||
'note' => ['sometimes', 'nullable', 'string', 'max:255'],
|
||||
]);
|
||||
if (array_key_exists('password', $data)) {
|
||||
$plain = (string) $data['password'];
|
||||
$verifyPortalCredential->password = Hash::make($plain);
|
||||
$verifyPortalCredential->password_plain_enc = Crypt::encryptString($plain);
|
||||
}
|
||||
if (array_key_exists('note', $data)) {
|
||||
$verifyPortalCredential->note = $data['note'];
|
||||
}
|
||||
$verifyPortalCredential->save();
|
||||
|
||||
return response()->json(['message' => '已更新']);
|
||||
}
|
||||
|
||||
public function activityDestroy(Request $request, Activity $activity, VerifyPortalCredential $verifyPortalCredential): JsonResponse
|
||||
{
|
||||
$this->ensureActivityVenueAdmin($request, $activity);
|
||||
$this->assertCredentialBelongsActivity($verifyPortalCredential, $activity);
|
||||
$verifyPortalCredential->tokens()->delete();
|
||||
$verifyPortalCredential->delete();
|
||||
|
||||
return response()->json(['message' => '已删除']);
|
||||
}
|
||||
|
||||
public function ticketGrabShow(Request $request, TicketGrabEvent $ticketGrabEvent): JsonResponse
|
||||
{
|
||||
$this->ensureTicketGrabAdmin($request, $ticketGrabEvent);
|
||||
if ($ticketGrabEvent->verify_portal_token === null || $ticketGrabEvent->verify_portal_token === '') {
|
||||
$ticketGrabEvent->forceFill(['verify_portal_token' => (string) \Illuminate\Support\Str::uuid()])->save();
|
||||
}
|
||||
VerifyPortalCode::ensureForTicketGrabEvent($ticketGrabEvent);
|
||||
$ticketGrabEvent->refresh();
|
||||
$rows = VerifyPortalCredential::query()
|
||||
->where('portal_kind', VerifyPortalCredential::KIND_TICKET_GRAB)
|
||||
->where('portal_id', $ticketGrabEvent->id)
|
||||
->with('venue:id,name')
|
||||
->orderBy('venue_id')
|
||||
->orderBy('id')
|
||||
->get()
|
||||
->map(fn (VerifyPortalCredential $c) => $this->credentialToRow($c));
|
||||
|
||||
return response()->json([
|
||||
'verify_portal_code' => $ticketGrabEvent->verify_portal_code,
|
||||
'credentials' => $rows,
|
||||
]);
|
||||
}
|
||||
|
||||
public function ticketGrabStore(Request $request, TicketGrabEvent $ticketGrabEvent): JsonResponse
|
||||
{
|
||||
$this->ensureTicketGrabAdmin($request, $ticketGrabEvent);
|
||||
$data = $request->validate([
|
||||
'venue_id' => ['required', 'integer'],
|
||||
'username' => ['required', 'string', 'max:64'],
|
||||
'password' => ['required', 'string', 'min:6', 'max:72'],
|
||||
'note' => ['nullable', 'string', 'max:255'],
|
||||
]);
|
||||
$vid = (int) $data['venue_id'];
|
||||
$pivotOk = TicketGrabEventVenue::query()
|
||||
->where('ticket_grab_event_id', $ticketGrabEvent->id)
|
||||
->where('venue_id', $vid)
|
||||
->exists();
|
||||
abort_unless($pivotOk, 422, '场馆未参与本抢票活动');
|
||||
|
||||
$exists = VerifyPortalCredential::query()
|
||||
->where('portal_kind', VerifyPortalCredential::KIND_TICKET_GRAB)
|
||||
->where('portal_id', $ticketGrabEvent->id)
|
||||
->where('venue_id', $vid)
|
||||
->where('username', $data['username'])
|
||||
->exists();
|
||||
if ($exists) {
|
||||
return response()->json(['message' => '该场馆下此用户名已存在'], 422);
|
||||
}
|
||||
|
||||
$plain = (string) $data['password'];
|
||||
$c = VerifyPortalCredential::query()->create([
|
||||
'portal_kind' => VerifyPortalCredential::KIND_TICKET_GRAB,
|
||||
'portal_id' => $ticketGrabEvent->id,
|
||||
'venue_id' => $vid,
|
||||
'username' => $data['username'],
|
||||
'password' => Hash::make($plain),
|
||||
'password_plain_enc' => Crypt::encryptString($plain),
|
||||
'note' => $data['note'] ?? null,
|
||||
]);
|
||||
|
||||
return response()->json(['id' => $c->id], 201);
|
||||
}
|
||||
|
||||
public function ticketGrabUpdate(
|
||||
Request $request,
|
||||
TicketGrabEvent $ticketGrabEvent,
|
||||
VerifyPortalCredential $verifyPortalCredential,
|
||||
): JsonResponse {
|
||||
$this->ensureTicketGrabAdmin($request, $ticketGrabEvent);
|
||||
$this->assertCredentialBelongsTicketGrab($verifyPortalCredential, $ticketGrabEvent);
|
||||
$data = $request->validate([
|
||||
'password' => ['sometimes', 'string', 'min:6', 'max:72'],
|
||||
'note' => ['sometimes', 'nullable', 'string', 'max:255'],
|
||||
]);
|
||||
if (array_key_exists('password', $data)) {
|
||||
$plain = (string) $data['password'];
|
||||
$verifyPortalCredential->password = Hash::make($plain);
|
||||
$verifyPortalCredential->password_plain_enc = Crypt::encryptString($plain);
|
||||
}
|
||||
if (array_key_exists('note', $data)) {
|
||||
$verifyPortalCredential->note = $data['note'];
|
||||
}
|
||||
$verifyPortalCredential->save();
|
||||
|
||||
return response()->json(['message' => '已更新']);
|
||||
}
|
||||
|
||||
public function ticketGrabDestroy(
|
||||
Request $request,
|
||||
TicketGrabEvent $ticketGrabEvent,
|
||||
VerifyPortalCredential $verifyPortalCredential,
|
||||
): JsonResponse {
|
||||
$this->ensureTicketGrabAdmin($request, $ticketGrabEvent);
|
||||
$this->assertCredentialBelongsTicketGrab($verifyPortalCredential, $ticketGrabEvent);
|
||||
$verifyPortalCredential->tokens()->delete();
|
||||
$verifyPortalCredential->delete();
|
||||
|
||||
return response()->json(['message' => '已删除']);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
private function credentialToRow(VerifyPortalCredential $c): array
|
||||
{
|
||||
$plain = null;
|
||||
if ($c->password_plain_enc !== null && $c->password_plain_enc !== '') {
|
||||
try {
|
||||
$plain = Crypt::decryptString($c->password_plain_enc);
|
||||
} catch (\Throwable) {
|
||||
$plain = null;
|
||||
}
|
||||
}
|
||||
|
||||
return [
|
||||
'id' => $c->id,
|
||||
'venue_id' => $c->venue_id,
|
||||
'venue_name' => $c->venue?->name,
|
||||
'username' => $c->username,
|
||||
'password_plain' => $plain,
|
||||
'note' => $c->note,
|
||||
'created_at' => $c->created_at?->toDateTimeString(),
|
||||
];
|
||||
}
|
||||
|
||||
private function ensureActivityVenueAdmin(Request $request, Activity $activity): void
|
||||
{
|
||||
$user = $request->user();
|
||||
if ($user->isSuperAdmin()) {
|
||||
return;
|
||||
}
|
||||
$allowed = $user->venues()->where('venues.id', $activity->venue_id)->exists();
|
||||
abort_unless($allowed, 403, '仅可操作已绑定场馆');
|
||||
}
|
||||
|
||||
private function ensureTicketGrabAdmin(Request $request, TicketGrabEvent $e): void
|
||||
{
|
||||
$pivots = TicketGrabEventVenue::query()
|
||||
->where('ticket_grab_event_id', $e->id)
|
||||
->pluck('venue_id')
|
||||
->all();
|
||||
if ($pivots === []) {
|
||||
return;
|
||||
}
|
||||
$user = $request->user();
|
||||
if ($user->isSuperAdmin()) {
|
||||
return;
|
||||
}
|
||||
$allow = $user->venues()->pluck('venues.id');
|
||||
foreach (array_unique(array_map('intval', $pivots)) as $id) {
|
||||
if ($id > 0 && ! $allow->contains($id)) {
|
||||
abort(403, '仅可操作已绑定场馆');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function assertCredentialBelongsActivity(VerifyPortalCredential $c, Activity $activity): void
|
||||
{
|
||||
abort_unless(
|
||||
$c->portal_kind === VerifyPortalCredential::KIND_ACTIVITY && (int) $c->portal_id === (int) $activity->id,
|
||||
404
|
||||
);
|
||||
}
|
||||
|
||||
private function assertCredentialBelongsTicketGrab(VerifyPortalCredential $c, TicketGrabEvent $e): void
|
||||
{
|
||||
abort_unless(
|
||||
$c->portal_kind === VerifyPortalCredential::KIND_TICKET_GRAB && (int) $c->portal_id === (int) $e->id,
|
||||
404
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\WechatUser;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class WechatUserController extends Controller
|
||||
{
|
||||
public function index(Request $request): JsonResponse
|
||||
{
|
||||
$pageSize = max(1, min(100, (int) $request->input('page_size', 20)));
|
||||
|
||||
$query = WechatUser::query()->orderByDesc('id');
|
||||
|
||||
if ($request->filled('keyword')) {
|
||||
$keyword = trim((string) $request->input('keyword'));
|
||||
$query->where(function ($q) use ($keyword) {
|
||||
$q->where('phone', 'like', "%{$keyword}%")
|
||||
->orWhere('nickname', 'like', "%{$keyword}%")
|
||||
->orWhere('real_name', 'like', "%{$keyword}%");
|
||||
});
|
||||
}
|
||||
|
||||
$user = $request->user();
|
||||
if (! $user->isSuperAdmin()) {
|
||||
$venueIds = $user->venues()->pluck('venues.id');
|
||||
$query->whereExists(function ($sub) use ($venueIds) {
|
||||
$sub->selectRaw('1')
|
||||
->from('reservations')
|
||||
->whereColumn('reservations.wechat_user_id', 'wechat_users.id')
|
||||
->whereIn('reservations.venue_id', $venueIds);
|
||||
});
|
||||
}
|
||||
|
||||
return response()->json($query->paginate($pageSize));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class AdminRole extends Model
|
||||
{
|
||||
protected $fillable = [
|
||||
'slug',
|
||||
'name',
|
||||
'is_system',
|
||||
'full_access',
|
||||
'sort',
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
'is_system' => 'boolean',
|
||||
'full_access' => 'boolean',
|
||||
'sort' => 'integer',
|
||||
];
|
||||
}
|
||||
@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Laravel\Sanctum\HasApiTokens;
|
||||
|
||||
class VerifyPortalCredential extends Model
|
||||
{
|
||||
use HasApiTokens;
|
||||
|
||||
public const KIND_ACTIVITY = 'activity';
|
||||
|
||||
public const KIND_TICKET_GRAB = 'ticket_grab';
|
||||
|
||||
protected $fillable = [
|
||||
'portal_kind',
|
||||
'portal_id',
|
||||
'venue_id',
|
||||
'username',
|
||||
'password',
|
||||
'password_plain_enc',
|
||||
'note',
|
||||
];
|
||||
|
||||
protected $hidden = [
|
||||
'password',
|
||||
'password_plain_enc',
|
||||
];
|
||||
|
||||
protected function casts(): array
|
||||
{
|
||||
return [
|
||||
'portal_id' => 'integer',
|
||||
'venue_id' => 'integer',
|
||||
];
|
||||
}
|
||||
|
||||
public function venue(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Venue::class);
|
||||
}
|
||||
|
||||
/** 活动/抢票结束日(含当日)内可核销;超过 end 日则失效 */
|
||||
public function portalAcceptsVerification(): bool
|
||||
{
|
||||
if ($this->portal_kind === self::KIND_ACTIVITY) {
|
||||
$a = Activity::query()->find($this->portal_id);
|
||||
if (! $a || ! $a->end_at) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return now()->toDateString() <= $a->end_at->toDateString();
|
||||
}
|
||||
if ($this->portal_kind === self::KIND_TICKET_GRAB) {
|
||||
$e = TicketGrabEvent::query()->find($this->portal_id);
|
||||
if (! $e || ! $e->end_at) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return now()->toDateString() <= $e->end_at->toDateString();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace App\Support;
|
||||
|
||||
use App\Models\Activity;
|
||||
use App\Models\TicketGrabEvent;
|
||||
|
||||
final class VerifyPortalCode
|
||||
{
|
||||
/** 8 位十六进制,便于手机录入;全库(活动+抢票)唯一 */
|
||||
public static function generateUnique(): string
|
||||
{
|
||||
for ($i = 0; $i < 80; $i++) {
|
||||
$c = strtolower(substr(bin2hex(random_bytes(4)), 0, 8));
|
||||
if (! self::isTaken($c)) {
|
||||
return $c;
|
||||
}
|
||||
}
|
||||
|
||||
return strtolower(substr(bin2hex(random_bytes(8)), 0, 12));
|
||||
}
|
||||
|
||||
public static function isTaken(string $code): bool
|
||||
{
|
||||
$code = strtolower(trim($code));
|
||||
|
||||
return Activity::query()->where('verify_portal_code', $code)->exists()
|
||||
|| TicketGrabEvent::query()->where('verify_portal_code', $code)->exists();
|
||||
}
|
||||
|
||||
public static function ensureForActivity(Activity $activity): void
|
||||
{
|
||||
if ($activity->verify_portal_code !== null && $activity->verify_portal_code !== '') {
|
||||
return;
|
||||
}
|
||||
$activity->forceFill(['verify_portal_code' => self::generateUnique()])->save();
|
||||
}
|
||||
|
||||
public static function ensureForTicketGrabEvent(TicketGrabEvent $event): void
|
||||
{
|
||||
if ($event->verify_portal_code !== null && $event->verify_portal_code !== '') {
|
||||
return;
|
||||
}
|
||||
$event->forceFill(['verify_portal_code' => self::generateUnique()])->save();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,77 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('activities', function (Blueprint $table) {
|
||||
$table->string('verify_portal_token', 36)->nullable()->unique()->after('id');
|
||||
});
|
||||
|
||||
Schema::table('ticket_grab_events', function (Blueprint $table) {
|
||||
$table->string('verify_portal_token', 36)->nullable()->unique()->after('id');
|
||||
});
|
||||
|
||||
Schema::create('verify_portal_credentials', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('portal_kind', 32);
|
||||
$table->unsignedBigInteger('portal_id');
|
||||
$table->foreignId('venue_id')->constrained('venues')->cascadeOnDelete();
|
||||
$table->string('username', 64);
|
||||
$table->string('password');
|
||||
$table->string('note', 255)->nullable();
|
||||
$table->timestamps();
|
||||
|
||||
$table->unique(['portal_kind', 'portal_id', 'venue_id', 'username'], 'vpc_portal_venue_username');
|
||||
$table->index(['portal_kind', 'portal_id']);
|
||||
});
|
||||
|
||||
Schema::table('reservations', function (Blueprint $table) {
|
||||
$table->foreignId('verify_credential_id')
|
||||
->nullable()
|
||||
->after('verified_by')
|
||||
->constrained('verify_portal_credentials')
|
||||
->nullOnDelete();
|
||||
});
|
||||
|
||||
if (Schema::hasTable('activities')) {
|
||||
foreach (DB::table('activities')->whereNull('verify_portal_token')->pluck('id') as $id) {
|
||||
DB::table('activities')->where('id', $id)->update([
|
||||
'verify_portal_token' => Str::uuid()->toString(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
if (Schema::hasTable('ticket_grab_events')) {
|
||||
foreach (DB::table('ticket_grab_events')->whereNull('verify_portal_token')->pluck('id') as $id) {
|
||||
DB::table('ticket_grab_events')->where('id', $id)->update([
|
||||
'verify_portal_token' => Str::uuid()->toString(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('reservations', function (Blueprint $table) {
|
||||
$table->dropConstrainedForeignId('verify_credential_id');
|
||||
});
|
||||
|
||||
Schema::dropIfExists('verify_portal_credentials');
|
||||
|
||||
Schema::table('ticket_grab_events', function (Blueprint $table) {
|
||||
$table->dropUnique(['verify_portal_token']);
|
||||
$table->dropColumn('verify_portal_token');
|
||||
});
|
||||
|
||||
Schema::table('activities', function (Blueprint $table) {
|
||||
$table->dropUnique(['verify_portal_token']);
|
||||
$table->dropColumn('verify_portal_token');
|
||||
});
|
||||
}
|
||||
};
|
||||
@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
use App\Models\Activity;
|
||||
use App\Models\TicketGrabEvent;
|
||||
use App\Support\VerifyPortalCode;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('activities', function (Blueprint $table) {
|
||||
$table->string('verify_portal_code', 12)->nullable()->index()->after('verify_portal_token');
|
||||
});
|
||||
|
||||
Schema::table('ticket_grab_events', function (Blueprint $table) {
|
||||
$table->string('verify_portal_code', 12)->nullable()->index()->after('verify_portal_token');
|
||||
});
|
||||
|
||||
Schema::table('verify_portal_credentials', function (Blueprint $table) {
|
||||
$table->text('password_plain_enc')->nullable()->after('password');
|
||||
});
|
||||
|
||||
Activity::query()->select('id')->orderBy('id')->chunkById(100, function ($rows) {
|
||||
foreach ($rows as $row) {
|
||||
$a = Activity::query()->find($row->id);
|
||||
if ($a && ($a->verify_portal_code === null || $a->verify_portal_code === '')) {
|
||||
$a->forceFill(['verify_portal_code' => VerifyPortalCode::generateUnique()])->save();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
TicketGrabEvent::query()->select('id')->orderBy('id')->chunkById(100, function ($rows) {
|
||||
foreach ($rows as $row) {
|
||||
$e = TicketGrabEvent::query()->find($row->id);
|
||||
if ($e && ($e->verify_portal_code === null || $e->verify_portal_code === '')) {
|
||||
$e->forceFill(['verify_portal_code' => VerifyPortalCode::generateUnique()])->save();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('verify_portal_credentials', function (Blueprint $table) {
|
||||
$table->dropColumn('password_plain_enc');
|
||||
});
|
||||
|
||||
Schema::table('ticket_grab_events', function (Blueprint $table) {
|
||||
$table->dropIndex(['verify_portal_code']);
|
||||
$table->dropColumn('verify_portal_code');
|
||||
});
|
||||
|
||||
Schema::table('activities', function (Blueprint $table) {
|
||||
$table->dropIndex(['verify_portal_code']);
|
||||
$table->dropColumn('verify_portal_code');
|
||||
});
|
||||
}
|
||||
};
|
||||
@ -0,0 +1,88 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
if (! Schema::hasTable('admin_menus')) {
|
||||
return;
|
||||
}
|
||||
|
||||
$活动管理Id = (int) (DB::table('admin_menus')->where('name', '活动管理')->where('parent_id', 0)->value('id') ?? 0);
|
||||
if ($活动管理Id > 0) {
|
||||
DB::table('admin_menus')
|
||||
->where('parent_id', $活动管理Id)
|
||||
->whereIn('path', ['/activities/registrations', '/activities/verify', '/activities/blacklist'])
|
||||
->update(['is_visible' => false]);
|
||||
}
|
||||
|
||||
$exists = DB::table('admin_menus')->where('path', '/wechat-users')->exists();
|
||||
if ($exists) {
|
||||
return;
|
||||
}
|
||||
|
||||
$parentId = DB::table('admin_menus')->insertGetId([
|
||||
'name' => '用户管理',
|
||||
'path' => null,
|
||||
'icon' => 'IconUser',
|
||||
'parent_id' => 0,
|
||||
'sort' => 31,
|
||||
'is_visible' => true,
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
|
||||
$childId = DB::table('admin_menus')->insertGetId([
|
||||
'name' => '用户列表',
|
||||
'path' => '/wechat-users',
|
||||
'icon' => 'IconUserGroup',
|
||||
'parent_id' => $parentId,
|
||||
'sort' => 1,
|
||||
'is_visible' => true,
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
|
||||
if (Schema::hasTable('role_menu_permissions')) {
|
||||
$now = now();
|
||||
foreach (['super_admin', 'venue_admin'] as $role) {
|
||||
foreach ([$parentId, $childId] as $mid) {
|
||||
DB::table('role_menu_permissions')->insertOrIgnore([
|
||||
'role' => $role,
|
||||
'menu_id' => $mid,
|
||||
'created_at' => $now,
|
||||
'updated_at' => $now,
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
if (! Schema::hasTable('admin_menus')) {
|
||||
return;
|
||||
}
|
||||
|
||||
$活动管理Id = (int) (DB::table('admin_menus')->where('name', '活动管理')->where('parent_id', 0)->value('id') ?? 0);
|
||||
if ($活动管理Id > 0) {
|
||||
DB::table('admin_menus')
|
||||
->where('parent_id', $活动管理Id)
|
||||
->whereIn('path', ['/activities/registrations', '/activities/verify', '/activities/blacklist'])
|
||||
->update(['is_visible' => true]);
|
||||
}
|
||||
|
||||
$childRow = DB::table('admin_menus')->where('path', '/wechat-users')->first();
|
||||
if ($childRow) {
|
||||
$pid = (int) ($childRow->parent_id ?? 0);
|
||||
DB::table('admin_menus')->where('id', $childRow->id)->delete();
|
||||
if ($pid > 0) {
|
||||
DB::table('admin_menus')->where('id', $pid)->where('name', '用户管理')->delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('admin_roles', function (Blueprint $table) {
|
||||
$table->boolean('full_access')->default(false)->after('is_system');
|
||||
});
|
||||
|
||||
DB::table('admin_roles')->where('slug', 'super_admin')->update(['full_access' => true]);
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('admin_roles', function (Blueprint $table) {
|
||||
$table->dropColumn('full_access');
|
||||
});
|
||||
}
|
||||
};
|
||||
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('audit_logs', function (Blueprint $table) {
|
||||
$table->string('operation_summary', 500)->nullable()->after('action');
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('audit_logs', function (Blueprint $table) {
|
||||
$table->dropColumn('operation_summary');
|
||||
});
|
||||
}
|
||||
};
|
||||
@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('admin_roles', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('slug', 50)->unique();
|
||||
$table->string('name', 100);
|
||||
$table->boolean('is_system')->default(false);
|
||||
$table->unsignedInteger('sort')->default(0);
|
||||
$table->timestamps();
|
||||
});
|
||||
|
||||
$now = now();
|
||||
DB::table('admin_roles')->insert([
|
||||
[
|
||||
'slug' => 'super_admin',
|
||||
'name' => '超级管理员',
|
||||
'is_system' => true,
|
||||
'sort' => 1,
|
||||
'created_at' => $now,
|
||||
'updated_at' => $now,
|
||||
],
|
||||
[
|
||||
'slug' => 'venue_admin',
|
||||
'name' => '场馆管理员',
|
||||
'is_system' => true,
|
||||
'sort' => 2,
|
||||
'created_at' => $now,
|
||||
'updated_at' => $now,
|
||||
],
|
||||
]);
|
||||
|
||||
$driver = Schema::getConnection()->getDriverName();
|
||||
if (in_array($driver, ['mysql', 'mariadb'], true)) {
|
||||
DB::statement("ALTER TABLE users MODIFY COLUMN role VARCHAR(50) NOT NULL DEFAULT 'venue_admin'");
|
||||
}
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('admin_roles');
|
||||
|
||||
$driver = Schema::getConnection()->getDriverName();
|
||||
if (in_array($driver, ['mysql', 'mariadb'], true)) {
|
||||
DB::statement("ALTER TABLE users MODIFY COLUMN role ENUM('super_admin','venue_admin') NOT NULL DEFAULT 'venue_admin'");
|
||||
}
|
||||
}
|
||||
};
|
||||
@ -0,0 +1 @@
|
||||
.activity-address-coord-row[data-v-0f0b3fd7]{flex-wrap:wrap;align-items:center;gap:12px;width:100%;display:flex}.activity-address-coord-row__address[data-v-0f0b3fd7]{flex:45%;min-width:320px;max-width:100%}.activity-address-coord-row__lng[data-v-0f0b3fd7],.activity-address-coord-row__lat[data-v-0f0b3fd7]{flex:180px;width:200px;min-width:180px}.activity-address-coord-row__map[data-v-0f0b3fd7]{flex-shrink:0}.activity-cover-carousel-wrap[data-v-0f0b3fd7]{flex-wrap:wrap;align-items:flex-start;gap:20px;width:100%;display:flex}.activity-cover-carousel-row__col[data-v-0f0b3fd7]{flex:320px;min-width:min(100%,320px)}.activity-cover-carousel-row__sub[data-v-0f0b3fd7]{color:var(--color-text-1);margin-bottom:8px;font-weight:500}.activity-cover-thumb[data-v-0f0b3fd7]{object-fit:cover;cursor:zoom-in;border:1px solid #e5e6eb;border-radius:4px;width:120px;height:70px}.activity-gallery-grid[data-v-0f0b3fd7]{flex-wrap:wrap;align-items:flex-start;gap:12px;width:100%;display:flex}.activity-gallery-item[data-v-0f0b3fd7]{flex-direction:column;align-items:flex-start;gap:8px;display:flex}.activity-gallery-thumb[data-v-0f0b3fd7]{object-fit:cover;cursor:zoom-in;border:1px solid #e5e6eb;border-radius:4px;width:120px;height:70px}.activity-gallery-thumb--video[data-v-0f0b3fd7]{display:block}.activity-form-tags[data-v-0f0b3fd7]{max-width:520px}.activity-form-tags__line[data-v-0f0b3fd7]{flex-flow:row;align-items:center;gap:8px;width:100%;display:flex}.activity-form-tags__input[data-v-0f0b3fd7]{flex:auto;min-width:0}.activity-form-tags__input[data-v-0f0b3fd7] .arco-input-wrapper{width:100%}.activity-form-tags__save[data-v-0f0b3fd7]{flex-shrink:0}.activity-form-tags__chips[data-v-0f0b3fd7]{flex-wrap:wrap;align-items:center;gap:8px;margin-top:8px;display:flex}.activity-form-tags__empty[data-v-0f0b3fd7]{color:#86909c;font-size:12px}
|
||||
@ -1 +0,0 @@
|
||||
.activity-address-coord-row[data-v-dbd5747f]{flex-wrap:wrap;align-items:center;gap:12px;width:100%;display:flex}.activity-address-coord-row__address[data-v-dbd5747f]{flex:45%;min-width:320px;max-width:100%}.activity-address-coord-row__lng[data-v-dbd5747f],.activity-address-coord-row__lat[data-v-dbd5747f]{flex:180px;width:200px;min-width:180px}.activity-address-coord-row__map[data-v-dbd5747f]{flex-shrink:0}.activity-cover-carousel-wrap[data-v-dbd5747f]{flex-wrap:wrap;align-items:flex-start;gap:20px;width:100%;display:flex}.activity-cover-carousel-row__col[data-v-dbd5747f]{flex:320px;min-width:min(100%,320px)}.activity-cover-carousel-row__sub[data-v-dbd5747f]{color:var(--color-text-1);margin-bottom:8px;font-weight:500}.activity-cover-thumb[data-v-dbd5747f]{object-fit:cover;cursor:zoom-in;border:1px solid #e5e6eb;border-radius:4px;width:120px;height:70px}.activity-gallery-grid[data-v-dbd5747f]{flex-wrap:wrap;align-items:flex-start;gap:12px;width:100%;display:flex}.activity-gallery-item[data-v-dbd5747f]{flex-direction:column;align-items:flex-start;gap:8px;display:flex}.activity-gallery-thumb[data-v-dbd5747f]{object-fit:cover;cursor:zoom-in;border:1px solid #e5e6eb;border-radius:4px;width:120px;height:70px}.activity-gallery-thumb--video[data-v-dbd5747f]{display:block}.activity-form-tags[data-v-dbd5747f]{max-width:520px}.activity-form-tags__line[data-v-dbd5747f]{flex-flow:row;align-items:center;gap:8px;width:100%;display:flex}.activity-form-tags__input[data-v-dbd5747f]{flex:auto;min-width:0}.activity-form-tags__input[data-v-dbd5747f] .arco-input-wrapper{width:100%}.activity-form-tags__save[data-v-dbd5747f]{flex-shrink:0}.activity-form-tags__chips[data-v-dbd5747f]{flex-wrap:wrap;align-items:center;gap:8px;margin-top:8px;display:flex}.activity-form-tags__empty[data-v-dbd5747f]{color:#86909c;font-size:12px}
|
||||
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{I as e,d as t,y as n}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as r}from"./PagePlaceholder-0iDIbJ_3.js";var i=n({__name:`Alerts`,setup(n){return(n,i)=>(e(),t(r,{title:`客流监控 / 异常告警`}))}});export{i as default};
|
||||
import{I as e,d as t,y as n}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as r}from"./PagePlaceholder-C01qW8FK.js";var i=n({__name:`Alerts`,setup(n){return(n,i)=>(e(),t(r,{title:`客流监控 / 异常告警`}))}});export{i as default};
|
||||
@ -0,0 +1 @@
|
||||
.audit-api-endpoint[data-v-f4d2ff07]{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:12px}
|
||||
@ -0,0 +1 @@
|
||||
import{I as e,N as t,V as n,Y as r,_ as i,d as a,it as o,kt as s,nt as c,u as l,ut as u,v as d,y as f}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as p}from"./message-Dh9377vh.js";import{n as m}from"./http-BWP--XXK.js";import{i as h}from"./index-CLnpIFlv.js";import{t as g}from"./listTableRowIndex-Bl-nc9Qt.js";import{t as _}from"./datetime-DLy52ZIc.js";var v={class:`audit-api-endpoint`},y=1280,b=h(f({__name:`AuditLogs`,setup(f){let h=o(!1),b=o([]),x=c({current:1,pageSize:20,total:0}),S=c({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(e){p.error(e?.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 t(C),(t,o)=>{let c=n(`a-alert`),f=n(`a-input`),p=n(`a-option`),m=n(`a-select`),C=n(`a-input-number`),O=n(`a-range-picker`),k=n(`a-button`),A=n(`a-space`),j=n(`a-table-column`),M=n(`a-table`),N=n(`a-card`);return e(),a(N,{title:`用户与权限 / 操作日志`},{default:r(()=>[d(c,{type:`info`,style:{"margin-bottom":`12px`},closable:``},{default:r(()=>[...o[4]||=[i(` 此处为「操作日志」(写操作审计)。系统设置里的「系统日志」页面用于查看服务器 Laravel 日志文件,不是本页。列表不包含 GET 类查询请求。 `,-1)]]),_:1}),d(A,{wrap:``,size:12,style:{"margin-bottom":`12px`}},{default:r(()=>[d(f,{modelValue:S.keyword,"onUpdate:modelValue":o[0]||=e=>S.keyword=e,placeholder:`操作人 / 操作项`,"allow-clear":``,style:{width:`240px`}},null,8,[`modelValue`]),d(m,{modelValue:S.method,"onUpdate:modelValue":o[1]||=e=>S.method=e,style:{width:`120px`}},{default:r(()=>[d(p,{value:`all`},{default:r(()=>[...o[5]||=[i(`全部方法`,-1)]]),_:1}),d(p,{value:`POST`},{default:r(()=>[...o[6]||=[i(`POST`,-1)]]),_:1}),d(p,{value:`PUT`},{default:r(()=>[...o[7]||=[i(`PUT`,-1)]]),_:1}),d(p,{value:`PATCH`},{default:r(()=>[...o[8]||=[i(`PATCH`,-1)]]),_:1}),d(p,{value:`DELETE`},{default:r(()=>[...o[9]||=[i(`DELETE`,-1)]]),_:1})]),_:1},8,[`modelValue`]),d(C,{modelValue:S.status_code,"onUpdate:modelValue":o[2]||=e=>S.status_code=e,min:100,max:599,placeholder:`状态码`,style:{width:`120px`}},null,8,[`modelValue`]),d(O,{modelValue:S.dateRange,"onUpdate:modelValue":o[3]||=e=>S.dateRange=e,style:{width:`260px`}},null,8,[`modelValue`]),d(k,{type:`primary`,onClick:w},{default:r(()=>[...o[10]||=[i(`查询`,-1)]]),_:1})]),_:1}),d(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:r(()=>[d(j,{title:``,width:52,ellipsis:!0,tooltip:!0},{cell:r(({rowIndex:e})=>[i(s(u(g)(e,x.current,x.pageSize)),1)]),_:1}),d(j,{title:`操作人`,"data-index":`username`,width:140,ellipsis:!0,tooltip:!0},{cell:r(({record:e})=>[i(s(e.username||`—`),1)]),_:1}),d(j,{title:`操作时间`,width:178},{cell:r(({record:e})=>[i(s(u(_)(e.created_at)),1)]),_:1}),d(j,{title:`接口`,width:320,ellipsis:!0,tooltip:!0},{cell:r(({record:e})=>[l(`span`,v,s(D(e)),1)]),_:1}),d(j,{title:`操作项`,"min-width":320,ellipsis:!0,tooltip:!0},{cell:r(({record:e})=>[i(s(E(e)),1)]),_:1})]),_:1},8,[`scroll`,`data`,`loading`,`pagination`])]),_:1})}}}),[[`__scopeId`,`data-v-f4d2ff07`]]);export{b 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,ut as u,v as d,y as f}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{n as p}from"./index-Dyg4zy2p.js";import{t as m}from"./listTableRowIndex-CwNZabrG.js";import{t as h}from"./datetime-CjmbUMhc.js";var g=1600,_=f({__name:`AuditLogs`,setup(f){let _=s(!1),v=s([]),y=l({current:1,pageSize:20,total:0}),b=l({keyword:``,method:`all`,status_code:void 0,dateRange:[]});async function x(){_.value=!0;try{let{data:e}=await p.get(`/audit-logs`,{params:{keyword:b.keyword||void 0,method:b.method,status_code:b.status_code||void 0,start_date:b.dateRange?.[0]||void 0,end_date:b.dateRange?.[1]||void 0,page:y.current,page_size:y.pageSize}});v.value=e.data,y.total=e.total}catch(t){e.error(t?.response?.data?.message??`加载操作日志失败`)}finally{_.value=!1}}function S(){y.current=1,x()}function C(e){y.current=e,x()}function w(e){return e===`super_admin`?`超级管理员`:e===`venue_admin`?`场馆管理员`:`-`}return n(x),(e,n)=>{let s=r(`a-input`),l=r(`a-option`),f=r(`a-select`),p=r(`a-input-number`),T=r(`a-range-picker`),E=r(`a-button`),D=r(`a-space`),O=r(`a-table-column`),k=r(`a-typography-paragraph`),A=r(`a-table`),j=r(`a-card`);return t(),o(j,{title:`用户与权限 / 操作日志`},{default:i(()=>[d(D,{wrap:``,size:12,style:{"margin-bottom":`12px`}},{default:i(()=>[d(s,{modelValue:b.keyword,"onUpdate:modelValue":n[0]||=e=>b.keyword=e,placeholder:`操作人/路径/动作`,"allow-clear":``,style:{width:`240px`}},null,8,[`modelValue`]),d(f,{modelValue:b.method,"onUpdate:modelValue":n[1]||=e=>b.method=e,style:{width:`120px`}},{default:i(()=>[d(l,{value:`all`},{default:i(()=>[...n[4]||=[a(`全部方法`,-1)]]),_:1}),d(l,{value:`POST`},{default:i(()=>[...n[5]||=[a(`POST`,-1)]]),_:1}),d(l,{value:`PUT`},{default:i(()=>[...n[6]||=[a(`PUT`,-1)]]),_:1}),d(l,{value:`PATCH`},{default:i(()=>[...n[7]||=[a(`PATCH`,-1)]]),_:1}),d(l,{value:`DELETE`},{default:i(()=>[...n[8]||=[a(`DELETE`,-1)]]),_:1})]),_:1},8,[`modelValue`]),d(p,{modelValue:b.status_code,"onUpdate:modelValue":n[2]||=e=>b.status_code=e,min:100,max:599,placeholder:`状态码`,style:{width:`120px`}},null,8,[`modelValue`]),d(T,{modelValue:b.dateRange,"onUpdate:modelValue":n[3]||=e=>b.dateRange=e,style:{width:`260px`}},null,8,[`modelValue`]),d(E,{type:`primary`,onClick:S},{default:i(()=>[...n[9]||=[a(`查询`,-1)]]),_:1}),d(E,{onClick:x},{default:i(()=>[...n[10]||=[a(`刷新`,-1)]]),_:1})]),_:1}),d(A,{class:`list-data-table`,scroll:{x:g},data:v.value,loading:_.value,"row-key":`id`,pagination:{current:y.current,pageSize:y.pageSize,total:y.total,showTotal:!0},onPageChange:C},{columns:i(()=>[d(O,{title:``,width:50,ellipsis:!0,tooltip:!0},{cell:i(({rowIndex:e})=>[a(c(u(m)(e,y.current,y.pageSize)),1)]),_:1}),d(O,{title:`操作人`,"data-index":`username`,width:140,ellipsis:!0,tooltip:!0}),d(O,{title:`角色`,width:120},{cell:i(({record:e})=>[a(c(w(e.role)),1)]),_:1}),d(O,{title:`方法`,"data-index":`method`,width:90}),d(O,{title:`路径`,"data-index":`path`,width:260,ellipsis:!0,tooltip:!0}),d(O,{title:`动作`,"data-index":`action`,width:220,ellipsis:!0,tooltip:!0}),d(O,{title:`状态码`,"data-index":`status_code`,width:100}),d(O,{title:`IP`,"data-index":`ip`,width:140,ellipsis:!0,tooltip:!0}),d(O,{title:`时间`,width:190},{cell:i(({record:e})=>[a(c(u(h)(e.created_at)),1)]),_:1}),d(O,{title:`请求参数`,"min-width":260},{cell:i(({record:e})=>[d(k,{ellipsis:{rows:2}},{default:i(()=>[a(c(e.request_payload?JSON.stringify(e.request_payload):`-`),1)]),_:2},1024)]),_:1})]),_:1},8,[`scroll`,`data`,`loading`,`pagination`])]),_:1})}}});export{_ 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{I as e,d as t,y as n}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as r}from"./PagePlaceholder-0iDIbJ_3.js";var i=n({__name:`Categories`,setup(n){return(n,i)=>(e(),t(r,{title:`数据统计 / 类别分析`}))}});export{i as default};
|
||||
import{I as e,d as t,y as n}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as r}from"./PagePlaceholder-C01qW8FK.js";var i=n({__name:`Categories`,setup(n){return(n,i)=>(e(),t(r,{title:`数据统计 / 类别分析`}))}});export{i as default};
|
||||
@ -1 +0,0 @@
|
||||
.dashboard-wrap[data-v-c21a264b]{gap:14px;display:grid}.summary-scope-hint[data-v-c21a264b]{color:#86909c;margin-top:-4px;font-size:12px;line-height:1.5}.stats-cards-flow[data-v-c21a264b]{grid-template-columns:repeat(auto-fit,minmax(118px,1fr));gap:10px;width:100%;display:grid}.stats-cards-flow--dense[data-v-c21a264b]{grid-template-columns:repeat(auto-fit,minmax(104px,1fr));gap:8px;margin-bottom:14px}.stats-cards-flow--tg[data-v-c21a264b]{grid-template-columns:repeat(auto-fit,minmax(124px,1fr));gap:8px;margin-bottom:14px}.stat-card-mini[data-v-c21a264b]{background:linear-gradient(#fff 0%,#f7faff 100%);border:1px solid #e8edf5;border-radius:10px;min-height:62px;padding:8px 10px;box-shadow:0 2px 8px #0f172a0f}.stat-card-mini--accent[data-v-c21a264b]{background:linear-gradient(#fff 0%,#f0f6ff 100%);border-color:#c8ddff}.stat-card-mini--tg[data-v-c21a264b]{background:#fafbfd;border:1px solid #e8ecf2;border-radius:10px;box-shadow:0 2px 8px #0f172a0d}.stat-card-mini__title[data-v-c21a264b]{color:#4e5969;word-break:break-all;font-size:11px;line-height:1.25}.stat-card-mini__value[data-v-c21a264b]{color:#165dff;margin-top:6px;font-size:20px;font-weight:700;line-height:1.1}.stat-card-mini__value--sm[data-v-c21a264b]{color:#1d2129;font-size:15px;font-weight:600}.stat-card-mini__value--green[data-v-c21a264b]{color:#00b42a}.stat-card-mini__value--yellow[data-v-c21a264b]{color:#d89614}.stat-card-mini__value--orange[data-v-c21a264b]{color:#f77234}.stat-card-mini__value--rate[data-v-c21a264b]{color:#1d2129;font-size:18px}.stat-card-mini__suffix[data-v-c21a264b]{color:#86909c;margin-left:2px;font-size:12px;font-weight:500}.stat-card-mini__unit[data-v-c21a264b]{color:#86909c;margin-left:2px;font-size:11px;font-weight:500}.stat-card-mini--tg-blue .stat-card-mini__value[data-v-c21a264b]{color:#165dff}.stat-card-mini--tg-green .stat-card-mini__value[data-v-c21a264b]{color:#00b42a}.stat-card-mini--tg-gold .stat-card-mini__value[data-v-c21a264b]{color:#d89614}.stat-card-mini--tg-rose .stat-card-mini__value[data-v-c21a264b]{color:#f53f3f}.activity-venue-table[data-v-c21a264b]{margin-top:4px}.activity-venue-table[data-v-c21a264b] .arco-card-header{padding-top:8px}.panel-card[data-v-c21a264b],.query-card[data-v-c21a264b]{background:linear-gradient(#fff 0%,#f9fbff 100%);border-radius:12px;box-shadow:0 4px 14px #0f172a14}.panel-hint[data-v-c21a264b]{color:#86909c;text-align:right;max-width:320px;font-size:12px}.tg-title-row[data-v-c21a264b]{align-items:center;gap:10px;display:inline-flex}.ticket-grab-panel .tg-subtitle[data-v-c21a264b]{color:#4e5969;margin-bottom:14px;font-size:13px}.tg-three-col[data-v-c21a264b]{grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-bottom:16px;display:grid}.tg-box[data-v-c21a264b]{background:#fcfdff;border:1px dashed #c9cdd4;border-radius:10px;min-height:120px;padding:12px 14px}.tg-box-title[data-v-c21a264b]{color:#1d2129;margin-bottom:8px;font-weight:600}.tg-highlight-line[data-v-c21a264b],.tg-list-line[data-v-c21a264b]{color:#1d2129;margin-bottom:4px;font-size:13px;line-height:1.6}.tg-muted[data-v-c21a264b]{color:#86909c;font-size:13px}.inner-panel[data-v-c21a264b]{box-shadow:none;background:0 0;margin-bottom:12px}.inner-panel[data-v-c21a264b] .arco-card-header{padding-left:0}.inner-panel[data-v-c21a264b] .arco-card-body{padding-left:0;padding-right:0}.tg-footer[data-v-c21a264b]{color:#86909c;text-align:right;margin-top:8px;font-size:12px}[data-v-c21a264b] .query-card .arco-card-header-title,[data-v-c21a264b] .panel-card .arco-card-header-title{color:#1d2129}[data-v-c21a264b] .query-card .arco-card-body,[data-v-c21a264b] .panel-card .arco-card-body{background:0 0}[data-v-c21a264b] .panel-card .arco-table-container{border-radius:8px;overflow:hidden}@media (width<=1200px){.tg-three-col[data-v-c21a264b]{grid-template-columns:1fr}}
|
||||
@ -0,0 +1 @@
|
||||
.dashboard-wrap[data-v-4833f0bd]{gap:14px;display:grid}.summary-scope-hint[data-v-4833f0bd]{color:#86909c;margin-top:-4px;font-size:12px;line-height:1.5}.stats-cards-flow[data-v-4833f0bd]{grid-template-columns:repeat(auto-fit,minmax(118px,1fr));gap:10px;width:100%;display:grid}.stats-cards-flow--dense[data-v-4833f0bd]{grid-template-columns:repeat(auto-fit,minmax(104px,1fr));gap:8px;margin-bottom:14px}.stats-cards-flow--tg[data-v-4833f0bd]{grid-template-columns:repeat(auto-fit,minmax(124px,1fr));gap:8px;margin-bottom:14px}.stat-card-mini[data-v-4833f0bd]{background:linear-gradient(#fff 0%,#f7faff 100%);border:1px solid #e8edf5;border-radius:10px;min-height:62px;padding:8px 10px;box-shadow:0 2px 8px #0f172a0f}.stat-card-mini--accent[data-v-4833f0bd]{background:linear-gradient(#fff 0%,#f0f6ff 100%);border-color:#c8ddff}.stat-card-mini--tg[data-v-4833f0bd]{background:#fafbfd;border:1px solid #e8ecf2;border-radius:10px;box-shadow:0 2px 8px #0f172a0d}.stat-card-mini__title[data-v-4833f0bd]{color:#4e5969;word-break:break-all;font-size:11px;line-height:1.25}.stat-card-mini__value[data-v-4833f0bd]{color:#165dff;margin-top:6px;font-size:20px;font-weight:700;line-height:1.1}.stat-card-mini__value--sm[data-v-4833f0bd]{color:#1d2129;font-size:15px;font-weight:600}.stat-card-mini__value--green[data-v-4833f0bd]{color:#00b42a}.stat-card-mini__value--yellow[data-v-4833f0bd]{color:#d89614}.stat-card-mini__value--orange[data-v-4833f0bd]{color:#f77234}.stat-card-mini__value--rate[data-v-4833f0bd]{color:#1d2129;font-size:18px}.stat-card-mini__suffix[data-v-4833f0bd]{color:#86909c;margin-left:2px;font-size:12px;font-weight:500}.stat-card-mini__unit[data-v-4833f0bd]{color:#86909c;margin-left:2px;font-size:11px;font-weight:500}.stat-card-mini--tg-blue .stat-card-mini__value[data-v-4833f0bd]{color:#165dff}.stat-card-mini--tg-green .stat-card-mini__value[data-v-4833f0bd]{color:#00b42a}.stat-card-mini--tg-gold .stat-card-mini__value[data-v-4833f0bd]{color:#d89614}.stat-card-mini--tg-rose .stat-card-mini__value[data-v-4833f0bd]{color:#f53f3f}.activity-venue-table[data-v-4833f0bd]{margin-top:4px}.activity-venue-table[data-v-4833f0bd] .arco-card-header{padding-top:8px}.panel-card[data-v-4833f0bd],.query-card[data-v-4833f0bd]{background:linear-gradient(#fff 0%,#f9fbff 100%);border-radius:12px;box-shadow:0 4px 14px #0f172a14}.panel-hint[data-v-4833f0bd]{color:#86909c;text-align:right;max-width:320px;font-size:12px}.tg-title-row[data-v-4833f0bd]{align-items:center;gap:10px;display:inline-flex}.ticket-grab-panel .tg-subtitle[data-v-4833f0bd]{color:#4e5969;margin-bottom:14px;font-size:13px}.tg-three-col[data-v-4833f0bd]{grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-bottom:16px;display:grid}.tg-box[data-v-4833f0bd]{background:#fcfdff;border:1px dashed #c9cdd4;border-radius:10px;min-height:120px;padding:12px 14px}.tg-box-title[data-v-4833f0bd]{color:#1d2129;margin-bottom:8px;font-weight:600}.tg-highlight-line[data-v-4833f0bd],.tg-list-line[data-v-4833f0bd]{color:#1d2129;margin-bottom:4px;font-size:13px;line-height:1.6}.tg-muted[data-v-4833f0bd]{color:#86909c;font-size:13px}.inner-panel[data-v-4833f0bd]{box-shadow:none;background:0 0;margin-bottom:12px}.inner-panel[data-v-4833f0bd] .arco-card-header{padding-left:0}.inner-panel[data-v-4833f0bd] .arco-card-body{padding-left:0;padding-right:0}.tg-footer[data-v-4833f0bd]{color:#86909c;text-align:right;margin-top:8px;font-size:12px}[data-v-4833f0bd] .query-card .arco-card-header-title,[data-v-4833f0bd] .panel-card .arco-card-header-title{color:#1d2129}[data-v-4833f0bd] .query-card .arco-card-body,[data-v-4833f0bd] .panel-card .arco-card-body{background:0 0}[data-v-4833f0bd] .panel-card .arco-table-container{border-radius:8px;overflow:hidden}@media (width<=1200px){.tg-three-col[data-v-4833f0bd]{grid-template-columns:1fr}}
|
||||
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{I as e,d as t,y as n}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as r}from"./PagePlaceholder-0iDIbJ_3.js";var i=n({__name:`Exports`,setup(n){return(n,i)=>(e(),t(r,{title:`数据统计 / 报表导出`,desc:`后续接入按时间/区域/类别筛选与 Excel 导出下载。`}))}});export{i as default};
|
||||
import{I as e,d as t,y as n}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as r}from"./PagePlaceholder-C01qW8FK.js";var i=n({__name:`Exports`,setup(n){return(n,i)=>(e(),t(r,{title:`数据统计 / 报表导出`,desc:`后续接入按时间/区域/类别筛选与 Excel 导出下载。`}))}});export{i as default};
|
||||
@ -1 +1 @@
|
||||
import{I as e,d as t,y as n}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as r}from"./PagePlaceholder-0iDIbJ_3.js";var i=n({__name:`Leaderboard`,setup(n){return(n,i)=>(e(),t(r,{title:`客流监控 / 活跃指数排行榜`}))}});export{i as default};
|
||||
import{I as e,d as t,y as n}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as r}from"./PagePlaceholder-C01qW8FK.js";var i=n({__name:`Leaderboard`,setup(n){return(n,i)=>(e(),t(r,{title:`客流监控 / 活跃指数排行榜`}))}});export{i as default};
|
||||
@ -0,0 +1,2 @@
|
||||
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/dynamicAdminRoutes-BLw7NroI.js","assets/dynamicAdminRoutes-D4W5LZHg.js","assets/preload-helper-CII-I4WM.js","assets/http-BWP--XXK.js","assets/axios-DUaTpsmW.js"])))=>i.map(i=>d[i]);
|
||||
import{I as e,V as t,Y as n,_ as r,it as i,nt as a,p as o,v as s,y as c}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as l}from"./message-Dh9377vh.js";import{n as u,t as d}from"./http-BWP--XXK.js";import{t as f}from"./preload-helper-CII-I4WM.js";import{n as p}from"./index-CLnpIFlv.js";var m={style:{height:`100vh`,display:`grid`,"place-items":`center`,background:`var(--color-fill-2)`}},h=c({__name:`Login`,setup(c){let h=p(),g=i(!1),_=a({username:`admin`,password:`admin123456`});async function v(){g.value=!0;try{let{data:e}=await u.post(`/auth/login`,_);localStorage.setItem(d,e.token),l.success(`登录成功`);let{getFirstMenuPath:t}=await f(async()=>{let{getFirstMenuPath:e}=await import(`./dynamicAdminRoutes-BLw7NroI.js`);return{getFirstMenuPath:e}},__vite__mapDeps([0,1,2,3,4]));h.replace(await t())}catch(e){l.error(e?.response?.data?.message??`登录失败`)}finally{g.value=!1}}return(i,a)=>{let c=t(`a-input`),l=t(`a-form-item`),u=t(`a-input-password`),d=t(`a-button`),f=t(`a-form`),p=t(`a-card`);return e(),o(`div`,m,[s(p,{title:`苏州市科普场馆地图管理后台登录`,style:{width:`380px`}},{default:n(()=>[s(f,{model:_,layout:`vertical`,onSubmitSuccess:v},{default:n(()=>[s(l,{field:`username`,label:`用户名`},{default:n(()=>[s(c,{modelValue:_.username,"onUpdate:modelValue":a[0]||=e=>_.username=e,placeholder:`请输入用户名`},null,8,[`modelValue`])]),_:1}),s(l,{field:`password`,label:`密码`},{default:n(()=>[s(u,{modelValue:_.password,"onUpdate:modelValue":a[1]||=e=>_.password=e,placeholder:`请输入密码`},null,8,[`modelValue`])]),_:1}),s(d,{type:`primary`,long:``,loading:g.value,onClick:v},{default:n(()=>[...a[2]||=[r(`登录`,-1)]]),_:1},8,[`loading`])]),_:1},8,[`model`])]),_:1})])}}});export{h as default};
|
||||
@ -1 +0,0 @@
|
||||
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{i as u,n as d,t as f}from"./index-Dyg4zy2p.js";var p={style:{height:`100vh`,display:`grid`,"place-items":`center`,background:`var(--color-fill-2)`}},m=l({__name:`Login`,setup(l){let m=u(),h=a(!1),g=o({username:`admin`,password:`admin123456`});async function _(){h.value=!0;try{let{data:t}=await d.post(`/auth/login`,g);localStorage.setItem(f,t.token),e.success(`登录成功`),m.replace(`/dashboard`)}catch(t){e.error(t?.response?.data?.message??`登录失败`)}finally{h.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`),m=n(`a-card`);return t(),s(`div`,p,[c(m,{title:`苏州市科普场馆地图管理后台登录`,style:{width:`380px`}},{default:r(()=>[c(f,{model:g,layout:`vertical`,onSubmitSuccess:_},{default:r(()=>[c(l,{field:`username`,label:`用户名`},{default:r(()=>[c(o,{modelValue:g.username,"onUpdate:modelValue":a[0]||=e=>g.username=e,placeholder:`请输入用户名`},null,8,[`modelValue`])]),_:1}),c(l,{field:`password`,label:`密码`},{default:r(()=>[c(u,{modelValue:g.password,"onUpdate:modelValue":a[1]||=e=>g.password=e,placeholder:`请输入密码`},null,8,[`modelValue`])]),_:1}),c(d,{type:`primary`,long:``,loading:h.value,onClick:_},{default:r(()=>[...a[2]||=[i(`登录`,-1)]]),_:1},8,[`loading`])]),_:1},8,[`model`])]),_:1})])}}});export{m 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{I as e,d as t,y as n}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as r}from"./PagePlaceholder-0iDIbJ_3.js";var i=n({__name:`Monitor`,setup(n){return(n,i)=>(e(),t(r,{title:`客流监控 / 实时客流监控`,desc:`后续接入 50 个重点场馆实时客流数据源。`}))}});export{i as default};
|
||||
import{I as e,d as t,y as n}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as r}from"./PagePlaceholder-C01qW8FK.js";var i=n({__name:`Monitor`,setup(n){return(n,i)=>(e(),t(r,{title:`客流监控 / 实时客流监控`,desc:`后续接入 50 个重点场馆实时客流数据源。`}))}});export{i as default};
|
||||
@ -1 +1 @@
|
||||
import{I as e,d as t,y as n}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as r}from"./PagePlaceholder-0iDIbJ_3.js";var i=n({__name:`Notifications`,setup(n){return(n,i)=>(e(),t(r,{title:`系统设置 / 消息通知`}))}});export{i as default};
|
||||
import{I as e,d as t,y as n}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as r}from"./PagePlaceholder-C01qW8FK.js";var i=n({__name:`Notifications`,setup(n){return(n,i)=>(e(),t(r,{title:`系统设置 / 消息通知`}))}});export{i as default};
|
||||
@ -1 +1 @@
|
||||
import{I as e,d as t,y as n}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as r}from"./PagePlaceholder-0iDIbJ_3.js";var i=n({__name:`Overview`,setup(n){return(n,i)=>(e(),t(r,{title:`数据统计 / 综合统计`}))}});export{i as default};
|
||||
import{I as e,d as t,y as n}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as r}from"./PagePlaceholder-C01qW8FK.js";var i=n({__name:`Overview`,setup(n){return(n,i)=>(e(),t(r,{title:`数据统计 / 综合统计`}))}});export{i as default};
|
||||
@ -1 +1 @@
|
||||
import{I as e,d as t,y as n}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as r}from"./PagePlaceholder-0iDIbJ_3.js";var i=n({__name:`Regions`,setup(n){return(n,i)=>(e(),t(r,{title:`数据统计 / 区域分析`}))}});export{i as default};
|
||||
import{I as e,d as t,y as n}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as r}from"./PagePlaceholder-C01qW8FK.js";var i=n({__name:`Regions`,setup(n){return(n,i)=>(e(),t(r,{title:`数据统计 / 区域分析`}))}});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 +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,f as s,i as c,it as l,kt as u,l as d,p as f,v as p,y as m,z as h}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{n as g}from"./index-Dyg4zy2p.js";var _=m({__name:`Roles`,setup(m){let _=l(!1),v=l(!1),y=l(!1),b=l([]),x=l([]),S=l(`super_admin`),C=l([]),w=d(()=>{let e=new Map;b.value.forEach(t=>e.set(t.id,{key:t.id,title:t.name,children:[]}));let t=[];return b.value.forEach(n=>{let r=e.get(n.id);n.parent_id>0&&e.has(n.parent_id)?e.get(n.parent_id).children.push(r):t.push(r)}),t}),T=d(()=>x.value.find(e=>e.role===S.value));async function E(){let{data:e}=await g.get(`/me`);y.value=e?.role===`super_admin`}async function D(){_.value=!0;try{let{data:e}=await g.get(`/role-menu-permissions`);b.value=e.menus||[],x.value=e.roles||[];let t=x.value[0];t&&(S.value=t.role,C.value=[...t.menu_ids||[]])}catch(t){e.error(t?.response?.data?.message??`加载角色菜单权限失败`)}finally{_.value=!1}}function O(e){S.value=e,C.value=[...x.value.find(t=>t.role===e)?.menu_ids||[]]}function k(e){C.value=e.map(e=>Number(e))}async function A(){if(y.value){v.value=!0;try{await g.put(`/role-menu-permissions/${S.value}`,{menu_ids:C.value});let t=x.value.find(e=>e.role===S.value);t&&(t.menu_ids=[...C.value]),e.success(`角色菜单权限保存成功`)}catch(t){e.error(t?.response?.data?.message??`保存失败`)}finally{v.value=!1}}}return n(async()=>{await E(),await D()}),(e,n)=>{let l=r(`a-alert`),d=r(`a-button`),m=r(`a-space`),g=r(`a-card`),b=r(`a-tree`),E=r(`a-spin`);return t(),o(g,{title:`用户与权限 / 角色管理(菜单权限)`},{default:i(()=>[p(l,{style:{"margin-bottom":`12px`}},{default:i(()=>[...n[0]||=[a(` 当前仅控制“每个角色可查看哪些菜单”;接口级细粒度权限后续可继续扩展。 `,-1)]]),_:1}),y.value?s(``,!0):(t(),o(l,{key:0,type:`info`,style:{"margin-bottom":`12px`}},{default:i(()=>[...n[1]||=[a(` 当前为只读模式,仅超级管理员可以修改角色菜单权限。 `,-1)]]),_:1})),p(E,{loading:_.value},{default:i(()=>[p(m,{align:`start`,fill:``},{default:i(()=>[p(g,{title:`角色列表`,size:`small`,style:{width:`220px`}},{default:i(()=>[p(m,{direction:`vertical`,fill:``},{default:i(()=>[(t(!0),f(c,null,h(x.value,e=>(t(),o(d,{key:e.role,type:S.value===e.role?`primary`:`secondary`,long:``,onClick:t=>O(e.role)},{default:i(()=>[a(u(e.label),1)]),_:2},1032,[`type`,`onClick`]))),128))]),_:1})]),_:1}),p(g,{title:`${T.value?.label||``} - 菜单权限`,size:`small`,style:{flex:`1`}},{extra:i(()=>[p(d,{type:`primary`,disabled:!y.value,loading:v.value,onClick:A},{default:i(()=>[...n[2]||=[a(`保存当前角色`,-1)]]),_:1},8,[`disabled`,`loading`])]),default:i(()=>[p(b,{checkable:``,"block-node":``,data:w.value,"checked-keys":C.value,"default-expand-all":!0,onCheck:k},null,8,[`data`,`checked-keys`])]),_:1},8,[`title`])]),_:1})]),_:1},8,[`loading`])]),_:1})}}});export{_ 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
@ -0,0 +1 @@
|
||||
.system-logs-tool-label[data-v-00758b3f]{color:var(--color-text-2);font-size:13px}.system-logs-panel[data-v-00758b3f]{border:1px solid var(--color-border-2);border-radius:var(--border-radius-medium);background:var(--color-fill-1);max-height:min(70vh,720px);padding:12px;overflow:auto}.system-logs-pre[data-v-00758b3f]{white-space:pre-wrap;word-break:break-word;color:var(--color-text-1);margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:12px;line-height:1.45}.system-logs-empty[data-v-00758b3f]{text-align:center;color:var(--color-text-3);padding:24px}
|
||||
@ -1 +0,0 @@
|
||||
import{I as e,d as t,y as n}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as r}from"./PagePlaceholder-0iDIbJ_3.js";var i=n({__name:`SystemLogs`,setup(n){return(n,i)=>(e(),t(r,{title:`系统设置 / 系统日志`}))}});export{i as default};
|
||||
File diff suppressed because one or more lines are too long
@ -0,0 +1 @@
|
||||
.tg-venue-block[data-v-4ab0fb79]{width:100%}.tg-venue-block__add[data-v-4ab0fb79]{margin-bottom:10px}.tg-venue-table-scroll[data-v-4ab0fb79]{box-sizing:border-box;width:100%;max-width:100%;overflow-x:auto}.tg-venue-table[data-v-4ab0fb79]{width:100%;min-width:0}.tg-venue-quota-input[data-v-4ab0fb79] .arco-input-wrapper{min-width:120px}.tg-venue-actions[data-v-4ab0fb79]{box-sizing:border-box;flex-wrap:nowrap;justify-content:center;align-items:center;gap:0;width:100%;display:inline-flex}.tg-venue-actions[data-v-4ab0fb79] .arco-btn-size-small{padding-left:4px;padding-right:4px}.tg-list-actions[data-v-4ab0fb79]{flex-wrap:wrap;justify-content:flex-start;row-gap:2px;max-width:100%}.activity-cover-carousel-wrap[data-v-4ab0fb79]{flex-wrap:wrap;align-items:flex-start;gap:20px;width:100%;display:flex}.activity-cover-carousel-row__col[data-v-4ab0fb79]{flex:320px;min-width:min(100%,320px)}.activity-cover-carousel-row__sub[data-v-4ab0fb79]{color:var(--color-text-1);margin-bottom:8px;font-weight:500}.activity-cover-thumb[data-v-4ab0fb79]{object-fit:cover;cursor:zoom-in;border:1px solid #e5e6eb;border-radius:4px;width:120px;height:70px}.activity-gallery-grid[data-v-4ab0fb79]{flex-wrap:wrap;align-items:flex-start;gap:12px;width:100%;display:flex}.activity-gallery-item[data-v-4ab0fb79]{flex-direction:column;align-items:flex-start;gap:8px;display:flex}.activity-gallery-thumb[data-v-4ab0fb79]{object-fit:cover;cursor:zoom-in;border:1px solid #e5e6eb;border-radius:4px;width:120px;height:80px}.activity-gallery-thumb--video[data-v-4ab0fb79]{cursor:default}.activity-address-coord-row[data-v-4ab0fb79]{flex-wrap:wrap;align-items:center;gap:12px;width:100%;display:flex}.activity-address-coord-row__address[data-v-4ab0fb79]{flex:45%;min-width:220px;max-width:100%}.activity-address-coord-row__lng[data-v-4ab0fb79],.activity-address-coord-row__lat[data-v-4ab0fb79]{flex:180px;width:200px;min-width:160px}.activity-address-coord-row__map[data-v-4ab0fb79]{flex-shrink:0}.tg-venue-contact-row[data-v-4ab0fb79]{flex-wrap:wrap;align-items:flex-start;gap:16px;width:100%;display:flex}.tg-venue-contact-row__col[data-v-4ab0fb79]{flex:200px;min-width:180px;max-width:100%}.tg-venue-contact-row__sub[data-v-4ab0fb79]{color:var(--color-text-1);margin-bottom:8px;font-size:13px;font-weight:500}
|
||||
@ -1 +0,0 @@
|
||||
.tg-venue-block[data-v-1889475c]{width:100%}.tg-venue-block__add[data-v-1889475c]{margin-bottom:10px}.tg-venue-table-scroll[data-v-1889475c]{box-sizing:border-box;width:100%;max-width:100%;overflow-x:auto}.tg-venue-table[data-v-1889475c]{width:100%;min-width:0}.tg-venue-quota-input[data-v-1889475c] .arco-input-wrapper{min-width:120px}.tg-venue-actions[data-v-1889475c]{box-sizing:border-box;flex-wrap:nowrap;justify-content:center;align-items:center;gap:0;width:100%;display:inline-flex}.tg-venue-actions[data-v-1889475c] .arco-btn-size-small{padding-left:4px;padding-right:4px}.tg-list-actions[data-v-1889475c]{flex-wrap:wrap;justify-content:flex-start;row-gap:2px;max-width:100%}.activity-cover-carousel-wrap[data-v-1889475c]{flex-wrap:wrap;align-items:flex-start;gap:20px;width:100%;display:flex}.activity-cover-carousel-row__col[data-v-1889475c]{flex:320px;min-width:min(100%,320px)}.activity-cover-carousel-row__sub[data-v-1889475c]{color:var(--color-text-1);margin-bottom:8px;font-weight:500}.activity-cover-thumb[data-v-1889475c]{object-fit:cover;cursor:zoom-in;border:1px solid #e5e6eb;border-radius:4px;width:120px;height:70px}.activity-gallery-grid[data-v-1889475c]{flex-wrap:wrap;align-items:flex-start;gap:12px;width:100%;display:flex}.activity-gallery-item[data-v-1889475c]{flex-direction:column;align-items:flex-start;gap:8px;display:flex}.activity-gallery-thumb[data-v-1889475c]{object-fit:cover;cursor:zoom-in;border:1px solid #e5e6eb;border-radius:4px;width:120px;height:80px}.activity-gallery-thumb--video[data-v-1889475c]{cursor:default}.activity-address-coord-row[data-v-1889475c]{flex-wrap:wrap;align-items:center;gap:12px;width:100%;display:flex}.activity-address-coord-row__address[data-v-1889475c]{flex:45%;min-width:220px;max-width:100%}.activity-address-coord-row__lng[data-v-1889475c],.activity-address-coord-row__lat[data-v-1889475c]{flex:180px;width:200px;min-width:160px}.activity-address-coord-row__map[data-v-1889475c]{flex-shrink:0}.tg-venue-contact-row[data-v-1889475c]{flex-wrap:wrap;align-items:flex-start;gap:16px;width:100%;display:flex}.tg-venue-contact-row__col[data-v-1889475c]{flex:200px;min-width:180px;max-width:100%}.tg-venue-contact-row__sub[data-v-1889475c]{color:var(--color-text-1);margin-bottom:8px;font-size:13px;font-weight:500}
|
||||
File diff suppressed because one or more lines are too long
@ -0,0 +1 @@
|
||||
import{I as e,N as t,V as n,Y as r,_ as i,d as a,i as o,it as s,kt as c,nt as l,p as u,u as d,ut as f,v as p,y as m,z as h}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as g}from"./message-Dh9377vh.js";import{n as _}from"./http-BWP--XXK.js";import{t as v}from"./listTableRowIndex-Bl-nc9Qt.js";import{n as y,t as b}from"./datetime-DLy52ZIc.js";import{t as x}from"./bookingType-sDQIPutU.js";import{t as S}from"./reservationStatus-DPnogIlu.js";var C={style:{"font-family":`monospace`,"font-size":`12px`}},w=1680,T=m({__name:`TicketGrabRegistrations`,setup(m){let T=s(!1),E=s(`all`),D=s(``),O=s(void 0),k=s([]),A=l({current:1,pageSize:10,total:0}),j=s([]),M=s([]);async function N(){try{let{data:e}=await _.get(`/ticket-grab-events/options`,{params:{limit:2e3}});M.value=e.data??[]}catch{M.value=[]}}async function P(){T.value=!0;try{let{data:e}=await _.get(`/activity-registrations`,{params:{reservation_kind:`ticket_grab`,ticket_grab_event_id:O.value||void 0,status:E.value,keyword:D.value||void 0,start_date:k.value?.[0]||void 0,end_date:k.value?.[1]||void 0,page:A.current,page_size:A.pageSize}});j.value=e.data,A.total=e.total}catch(e){g.error(e?.response?.data?.message??`加载失败`)}finally{T.value=!1}}function F(e){A.current=e,P()}function I(e){A.pageSize=e,A.current=1,P()}return t(async()=>{await N(),await P()}),(t,s)=>{let l=n(`a-option`),m=n(`a-select`),g=n(`a-radio`),_=n(`a-radio-group`),N=n(`a-input`),L=n(`a-range-picker`),R=n(`a-button`),z=n(`a-space`),B=n(`a-table-column`),V=n(`a-tag`),H=n(`a-table`),U=n(`a-card`);return e(),a(U,{title:`抢票管理 / 抢票报名`,bordered:!1},{default:r(()=>[p(z,{direction:`vertical`,fill:``},{default:r(()=>[p(z,{wrap:``,size:12},{default:r(()=>[p(m,{modelValue:O.value,"onUpdate:modelValue":s[0]||=e=>O.value=e,"allow-clear":``,placeholder:`抢票活动(全部)`,style:{width:`260px`},"allow-search":``,onChange:s[1]||=()=>{A.current=1,P()}},{default:r(()=>[(e(!0),u(o,null,h(M.value,t=>(e(),a(l,{key:t.id,value:t.id},{default:r(()=>[i(c(t.title),1)]),_:2},1032,[`value`]))),128))]),_:1},8,[`modelValue`]),p(_,{modelValue:E.value,"onUpdate:modelValue":s[2]||=e=>E.value=e,type:`button`,size:`small`,onChange:P},{default:r(()=>[p(g,{value:`all`},{default:r(()=>[...s[7]||=[i(`全部`,-1)]]),_:1}),p(g,{value:`pending`},{default:r(()=>[...s[8]||=[i(`待核销`,-1)]]),_:1}),p(g,{value:`verified`},{default:r(()=>[...s[9]||=[i(`已核销`,-1)]]),_:1}),p(g,{value:`cancelled`},{default:r(()=>[...s[10]||=[i(`已取消`,-1)]]),_:1}),p(g,{value:`expired`},{default:r(()=>[...s[11]||=[i(`已过期`,-1)]]),_:1})]),_:1},8,[`modelValue`]),p(N,{modelValue:D.value,"onUpdate:modelValue":s[3]||=e=>D.value=e,placeholder:`姓名 / 身份证 / token`,"allow-clear":``,style:{width:`220px`}},null,8,[`modelValue`]),p(L,{modelValue:k.value,"onUpdate:modelValue":s[4]||=e=>k.value=e,style:{width:`260px`}},null,8,[`modelValue`]),p(R,{type:`primary`,onClick:s[5]||=()=>{A.current=1,P()}},{default:r(()=>[...s[12]||=[i(` 查询 `,-1)]]),_:1}),p(R,{onClick:s[6]||=()=>{E.value=`all`,D.value=``,O.value=void 0,k.value=[],A.current=1,P()}},{default:r(()=>[...s[13]||=[i(` 重置 `,-1)]]),_:1})]),_:1}),p(H,{scroll:{x:w},data:j.value,loading:T.value,"row-key":`id`,pagination:{current:A.current,pageSize:A.pageSize,total:A.total,showTotal:!0,onChange:F,onPageSizeChange:I}},{columns:r(()=>[p(B,{title:``,width:50,ellipsis:!0,tooltip:!0},{cell:r(({rowIndex:e})=>[i(c(f(v)(e,A.current,A.pageSize)),1)]),_:1}),p(B,{title:`抢票活动`,width:200,ellipsis:!0,tooltip:!0},{cell:r(({record:e})=>[i(c(e.ticket_grab_event?.title??`-`),1)]),_:1}),p(B,{title:`场馆`,width:160,ellipsis:!0,tooltip:!0},{cell:r(({record:e})=>[i(c(e.venue?.name??`-`),1)]),_:1}),p(B,{title:`姓名`,"data-index":`visitor_name`,width:100}),p(B,{title:`身份证`,"data-index":`id_card`,width:180,ellipsis:!0,tooltip:!0}),p(B,{title:`入馆日`,width:120},{cell:r(({record:e})=>[i(c(e.entry_date?f(y)(String(e.entry_date)):`-`),1)]),_:1}),p(B,{title:`预约类型`,width:100},{cell:r(({record:e})=>[i(c(f(x)(e.booking_type,e.ticket_count)),1)]),_:1}),p(B,{title:`票数`,width:80},{cell:r(({record:e})=>[i(c(e.ticket_count??1),1)]),_:1}),p(B,{title:`状态`,width:100},{cell:r(({record:e})=>[p(V,{color:e.status===`verified`?`green`:e.status===`pending`?`arcoblue`:`gray`},{default:r(()=>[i(c(f(S)(e.status)),1)]),_:2},1032,[`color`])]),_:1}),p(B,{title:`下单时间`,width:170},{cell:r(({record:e})=>[i(c(f(b)(e.created_at)),1)]),_:1}),p(B,{title:`核销时间`,width:170},{cell:r(({record:e})=>[i(c(e.verified_at?f(b)(String(e.verified_at)):`-`),1)]),_:1}),p(B,{title:`核销 Token`,width:220,ellipsis:!0,tooltip:!0},{cell:r(({record:e})=>[d(`span`,C,c(e.qr_token),1)]),_:1})]),_:1},8,[`scroll`,`data`,`loading`,`pagination`])]),_:1})]),_:1})}}});export{T 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,ut as u,v as d,y as f}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{n as p}from"./index-Dyg4zy2p.js";import{t as m}from"./listTableRowIndex-CwNZabrG.js";import{n as h,t as g}from"./datetime-CjmbUMhc.js";import{t as _}from"./bookingType-CGtYk0HZ.js";import{t as v}from"./reservationStatus-DfEgE0qr.js";var y=1280,b=f({__name:`TicketGrabRegistrations`,setup(f){let b=s(!1),x=s(`all`),S=s(``),C=s([]),w=l({current:1,pageSize:10,total:0}),T=s([]);async function E(){b.value=!0;try{let{data:e}=await p.get(`/activity-registrations`,{params:{reservation_kind:`ticket_grab`,status:x.value,keyword:S.value||void 0,start_date:C.value?.[0]||void 0,end_date:C.value?.[1]||void 0,page:w.current,page_size:w.pageSize}});T.value=e.data,w.total=e.total}catch(t){e.error(t?.response?.data?.message??`加载失败`)}finally{b.value=!1}}function D(e){w.current=e,E()}function O(e){w.pageSize=e,w.current=1,E()}return n(E),(e,n)=>{let s=r(`a-radio`),l=r(`a-radio-group`),f=r(`a-input`),p=r(`a-range-picker`),k=r(`a-button`),A=r(`a-space`),j=r(`a-table-column`),M=r(`a-tag`),N=r(`a-table`),P=r(`a-card`);return t(),o(P,{title:`抢票管理 / 抢票报名`,bordered:!1},{default:i(()=>[d(A,{direction:`vertical`,fill:``},{default:i(()=>[d(A,{wrap:``,size:12},{default:i(()=>[d(l,{modelValue:x.value,"onUpdate:modelValue":n[0]||=e=>x.value=e,type:`button`,size:`small`,onChange:E},{default:i(()=>[d(s,{value:`all`},{default:i(()=>[...n[5]||=[a(`全部`,-1)]]),_:1}),d(s,{value:`pending`},{default:i(()=>[...n[6]||=[a(`待核销`,-1)]]),_:1}),d(s,{value:`verified`},{default:i(()=>[...n[7]||=[a(`已核销`,-1)]]),_:1}),d(s,{value:`cancelled`},{default:i(()=>[...n[8]||=[a(`已取消`,-1)]]),_:1}),d(s,{value:`expired`},{default:i(()=>[...n[9]||=[a(`已过期`,-1)]]),_:1})]),_:1},8,[`modelValue`]),d(f,{modelValue:S.value,"onUpdate:modelValue":n[1]||=e=>S.value=e,placeholder:`姓名 / 身份证 / token`,"allow-clear":``,style:{width:`220px`}},null,8,[`modelValue`]),d(p,{modelValue:C.value,"onUpdate:modelValue":n[2]||=e=>C.value=e,style:{width:`260px`}},null,8,[`modelValue`]),d(k,{type:`primary`,onClick:n[3]||=()=>{w.current=1,E()}},{default:i(()=>[...n[10]||=[a(` 查询 `,-1)]]),_:1}),d(k,{onClick:n[4]||=()=>{x.value=`all`,S.value=``,C.value=[],w.current=1,E()}},{default:i(()=>[...n[11]||=[a(` 重置 `,-1)]]),_:1}),d(k,{onClick:E},{default:i(()=>[...n[12]||=[a(`刷新`,-1)]]),_:1})]),_:1}),d(N,{scroll:{x:y},data:T.value,loading:b.value,"row-key":`id`,pagination:{current:w.current,pageSize:w.pageSize,total:w.total,showTotal:!0,onChange:D,onPageSizeChange:O}},{columns:i(()=>[d(j,{title:``,width:50,ellipsis:!0,tooltip:!0},{cell:i(({rowIndex:e})=>[a(c(u(m)(e,w.current,w.pageSize)),1)]),_:1}),d(j,{title:`抢票活动`,width:200,ellipsis:!0,tooltip:!0},{cell:i(({record:e})=>[a(c(e.ticket_grab_event?.title??`-`),1)]),_:1}),d(j,{title:`场馆`,width:160,ellipsis:!0,tooltip:!0},{cell:i(({record:e})=>[a(c(e.venue?.name??`-`),1)]),_:1}),d(j,{title:`姓名`,"data-index":`visitor_name`,width:100}),d(j,{title:`身份证`,"data-index":`id_card`,width:180,ellipsis:!0,tooltip:!0}),d(j,{title:`入馆日`,width:120},{cell:i(({record:e})=>[a(c(e.entry_date?u(h)(String(e.entry_date)):`-`),1)]),_:1}),d(j,{title:`预约类型`,width:100},{cell:i(({record:e})=>[a(c(u(_)(e.booking_type,e.ticket_count)),1)]),_:1}),d(j,{title:`票数`,width:80},{cell:i(({record:e})=>[a(c(e.ticket_count??1),1)]),_:1}),d(j,{title:`状态`,width:100},{cell:i(({record:e})=>[d(M,{color:e.status===`verified`?`green`:e.status===`pending`?`arcoblue`:`gray`},{default:i(()=>[a(c(u(v)(e.status)),1)]),_:2},1032,[`color`])]),_:1}),d(j,{title:`下单时间`,width:170},{cell:i(({record:e})=>[a(c(u(g)(e.created_at)),1)]),_:1})]),_:1},8,[`scroll`,`data`,`loading`,`pagination`])]),_:1})]),_:1})}}});export{b 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,u,ut as d,v as f,y as p}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{n as m,o as h}from"./index-Dyg4zy2p.js";import{t as g}from"./listTableRowIndex-CwNZabrG.js";import{n as _,t as v}from"./datetime-CjmbUMhc.js";import{t as y}from"./bookingType-CGtYk0HZ.js";import{t as b}from"./reservationStatus-DfEgE0qr.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};
|
||||
@ -0,0 +1 @@
|
||||
import{I as e,N as t,V as n,Y as r,_ as i,d as a,it as o,kt as s,nt as c,u as l,ut as u,v as d,y as f}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as p}from"./message-Dh9377vh.js";import{n as m}from"./http-BWP--XXK.js";import{i as h}from"./index-CLnpIFlv.js";import{t as g}from"./listTableRowIndex-Bl-nc9Qt.js";import{n as _,t as v}from"./datetime-DLy52ZIc.js";import{t as y}from"./bookingType-sDQIPutU.js";import{t as b}from"./reservationStatus-DPnogIlu.js";var x={class:`verify-list-toolbar`},S=1780,C=h(f({__name:`TicketGrabVerify`,setup(f){let h=o(!1),C=o([]),w=o(``),T=o(!1),E=o(`all`),D=o(``),O=o([]),k=c({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(e){p.error(e?.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){p.warning(`请输入二维码 token`);return}T.value=!0;try{await m.post(`/reservations/verify`,{qr_token:w.value}),p.success(`核销成功`),w.value=``,await A()}catch(e){p.error(e?.response?.data?.message??`核销失败`)}finally{T.value=!1}}return t(A),(t,o)=>{let c=n(`a-alert`),f=n(`a-input`),p=n(`a-button`),m=n(`a-space`),P=n(`a-radio`),F=n(`a-radio-group`),I=n(`a-range-picker`),L=n(`a-table-column`),R=n(`a-tag`),z=n(`a-table`),B=n(`a-card`);return e(),a(B,{title:`抢票管理 / 抢票核销`,bordered:!1},{default:r(()=>[d(m,{direction:`vertical`,fill:``},{default:r(()=>[d(c,null,{default:r(()=>[...o[5]||=[i(`抢票预约按「入馆日」为当天方可核销。输入二维码 token 核销。`,-1)]]),_:1}),d(m,{wrap:``,size:12},{default:r(()=>[d(f,{modelValue:w.value,"onUpdate:modelValue":o[0]||=e=>w.value=e,style:{width:`min(100%, 420px)`},placeholder:`请输入二维码 token`,"allow-clear":``},null,8,[`modelValue`]),d(p,{type:`primary`,loading:T.value,onClick:N},{default:r(()=>[...o[6]||=[i(`立即核销`,-1)]]),_:1},8,[`loading`])]),_:1}),l(`div`,x,[d(m,{wrap:``,size:12},{default:r(()=>[d(F,{modelValue:E.value,"onUpdate:modelValue":o[1]||=e=>E.value=e,type:`button`,size:`small`,onChange:A},{default:r(()=>[d(P,{value:`all`},{default:r(()=>[...o[7]||=[i(`全部`,-1)]]),_:1}),d(P,{value:`pending`},{default:r(()=>[...o[8]||=[i(`待核销`,-1)]]),_:1}),d(P,{value:`verified`},{default:r(()=>[...o[9]||=[i(`已核销`,-1)]]),_:1}),d(P,{value:`cancelled`},{default:r(()=>[...o[10]||=[i(`已取消`,-1)]]),_:1}),d(P,{value:`expired`},{default:r(()=>[...o[11]||=[i(`已过期`,-1)]]),_:1})]),_:1},8,[`modelValue`]),d(f,{modelValue:D.value,"onUpdate:modelValue":o[2]||=e=>D.value=e,placeholder:`姓名 / 手机 / 身份证 / token`,"allow-clear":``,style:{width:`240px`}},null,8,[`modelValue`]),d(I,{modelValue:O.value,"onUpdate:modelValue":o[3]||=e=>O.value=e,style:{width:`260px`}},null,8,[`modelValue`]),d(p,{type:`primary`,onClick:j},{default:r(()=>[...o[12]||=[i(`查询`,-1)]]),_:1}),d(p,{onClick:M},{default:r(()=>[...o[13]||=[i(`重置`,-1)]]),_:1}),d(p,{onClick:A},{default:r(()=>[...o[14]||=[i(`刷新列表`,-1)]]),_:1})]),_:1})]),d(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:o[4]||=e=>k.current=e},{columns:r(()=>[d(L,{title:``,width:50,ellipsis:!0,tooltip:!0},{cell:r(({rowIndex:e})=>[i(s(u(g)(e,k.current,k.pageSize)),1)]),_:1}),d(L,{title:`预约场次`,width:220,ellipsis:!0,tooltip:!0},{cell:r(({record:e})=>[i(s(e.ticket_grab_event?.title??`-`),1)]),_:1}),d(L,{title:`场馆`,width:180,ellipsis:!0,tooltip:!0},{cell:r(({record:e})=>[i(s(e.venue?.name??`-`),1)]),_:1}),d(L,{title:`姓名`,"data-index":`visitor_name`,width:100}),d(L,{title:`身份证`,"data-index":`id_card`,width:180,ellipsis:!0,tooltip:!0}),d(L,{title:`手机号`,"data-index":`visitor_phone`,width:120}),d(L,{title:`预约类型`,width:100},{cell:r(({record:e})=>[i(s(u(y)(e.booking_type,e.ticket_count)),1)]),_:1}),d(L,{title:`场次时间`,width:140},{cell:r(({record:e})=>[i(s(e.entry_date?u(_)(String(e.entry_date)):`-`),1)]),_:1}),d(L,{title:`状态`,width:100},{cell:r(({record:e})=>[d(R,{color:e.status===`verified`?`green`:e.status===`pending`?`arcoblue`:e.status===`expired`?`orange`:`gray`},{default:r(()=>[i(s(u(b)(e.status)),1)]),_:2},1032,[`color`])]),_:1}),d(L,{title:`预约时间`,width:175},{cell:r(({record:e})=>[i(s(u(v)(e.created_at)),1)]),_:1}),d(L,{title:`核销时间`,width:175},{cell:r(({record:e})=>[i(s(u(v)(e.verified_at)),1)]),_:1}),d(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};
|
||||
@ -0,0 +1 @@
|
||||
.import-file-label[data-v-db5c7e55]{cursor:pointer;display:inline-block}.import-file-input[data-v-db5c7e55]{opacity:0;width:0;height:0;position:absolute;overflow:hidden}.import-file-btn[data-v-db5c7e55]{border:1px solid var(--color-border-2);border-radius:var(--border-radius-small);padding:0 15px;line-height:32px;display:inline-block}.import-file-label:hover .import-file-btn[data-v-db5c7e55]{border-color:rgb(var(--primary-6));color:rgb(var(--primary-6))}.venue-address-coord-row[data-v-db5c7e55]{flex-wrap:wrap;align-items:center;gap:12px;width:100%;display:flex}.venue-address-coord-row__address[data-v-db5c7e55]{flex:45%;min-width:320px;max-width:100%}.venue-address-coord-row__lng[data-v-db5c7e55],.venue-address-coord-row__lat[data-v-db5c7e55]{flex:180px;width:200px;min-width:180px}.venue-address-coord-row__map[data-v-db5c7e55]{flex-shrink:0}.venue-form-split-label[data-v-db5c7e55]{color:var(--color-text-2);margin-bottom:8px;font-size:13px;font-weight:500}.venue-cover-carousel-wrap[data-v-db5c7e55]{flex-wrap:wrap;align-items:flex-start;gap:20px;width:100%;display:flex}.venue-cover-carousel-row__col[data-v-db5c7e55]{flex:320px;min-width:min(100%,320px)}.venue-cover-carousel-row__sub[data-v-db5c7e55]{color:var(--color-text-1);margin-bottom:8px;font-weight:500}.venue-gallery-grid[data-v-db5c7e55]{flex-wrap:wrap;align-items:flex-start;gap:12px;width:100%;display:flex}.venue-gallery-item[data-v-db5c7e55]{flex-direction:column;align-items:flex-start;gap:8px;display:flex}.venue-gallery-thumb[data-v-db5c7e55]{object-fit:cover;cursor:zoom-in;border:1px solid #e5e6eb;border-radius:4px;width:80px;height:50px}.venue-gallery-thumb--video[data-v-db5c7e55]{display:block}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1 +0,0 @@
|
||||
.import-file-label[data-v-8d39421c]{cursor:pointer;display:inline-block}.import-file-input[data-v-8d39421c]{opacity:0;width:0;height:0;position:absolute;overflow:hidden}.import-file-btn[data-v-8d39421c]{border:1px solid var(--color-border-2);border-radius:var(--border-radius-small);padding:0 15px;line-height:32px;display:inline-block}.import-file-label:hover .import-file-btn[data-v-8d39421c]{border-color:rgb(var(--primary-6));color:rgb(var(--primary-6))}.venue-address-coord-row[data-v-8d39421c]{flex-wrap:wrap;align-items:center;gap:12px;width:100%;display:flex}.venue-address-coord-row__address[data-v-8d39421c]{flex:45%;min-width:320px;max-width:100%}.venue-address-coord-row__lng[data-v-8d39421c],.venue-address-coord-row__lat[data-v-8d39421c]{flex:180px;width:200px;min-width:180px}.venue-address-coord-row__map[data-v-8d39421c]{flex-shrink:0}.venue-form-split-label[data-v-8d39421c]{color:var(--color-text-2);margin-bottom:8px;font-size:13px;font-weight:500}.venue-cover-carousel-wrap[data-v-8d39421c]{flex-wrap:wrap;align-items:flex-start;gap:20px;width:100%;display:flex}.venue-cover-carousel-row__col[data-v-8d39421c]{flex:320px;min-width:min(100%,320px)}.venue-cover-carousel-row__sub[data-v-8d39421c]{color:var(--color-text-1);margin-bottom:8px;font-weight:500}.venue-gallery-grid[data-v-8d39421c]{flex-wrap:wrap;align-items:flex-start;gap:12px;width:100%;display:flex}.venue-gallery-item[data-v-8d39421c]{flex-direction:column;align-items:flex-start;gap:8px;display:flex}.venue-gallery-thumb[data-v-8d39421c]{object-fit:cover;cursor:zoom-in;border:1px solid #e5e6eb;border-radius:4px;width:80px;height:50px}.venue-gallery-thumb--video[data-v-8d39421c]{display:block}
|
||||
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 @@
|
||||
import{I as e,N as t,V as n,Y as r,_ as i,it as a,kt as o,nt as s,p as c,u as l,v as u,y as d}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as f}from"./message-Dh9377vh.js";import{i as p,n as m,t as h}from"./index-CLnpIFlv.js";import{i as g,n as _,o as v,r as y,t as b}from"./h5Http-DeskuLbk.js";var x={class:`m-verify-page`},S={class:`m-verify-hero`},C={class:`m-verify-sub`},w={class:`m-verify-card`},T={key:0,class:`m-verify-tip`},E={key:1,class:`m-verify-tip`},D=p(d({__name:`VerifyLogin`,setup(d){let p=m(),D=h(),O=a(!1),k=a(``),A=a(``),j=s({username:``,password:``});function M(e){let t=D.query[e];return(typeof t==`string`?t:Array.isArray(t)?String(t[0]??``):``).trim()}t(()=>{let e=M(`v`).toLowerCase(),t=M(`portal`);e.length>=6?(k.value=e,A.value=``,localStorage.setItem(y,e),localStorage.removeItem(g)):t.length>=32?(A.value=t,k.value=``,localStorage.setItem(g,t),localStorage.removeItem(y)):(k.value=localStorage.getItem(`szkp_verify_portal_code`)||``,A.value=localStorage.getItem(`szkp_verify_portal_legacy_token`)||``)});function N(){return D.path.startsWith(`/m/`)?`/m/verify`:`/h5/verify/scan`}async function P(){O.value=!0;try{if(k.value.length>=6){let{data:e}=await v.post(`/verify-portal/login`,{portal_code:k.value,username:j.username.trim(),password:j.password});localStorage.setItem(b,e.token),localStorage.setItem(`${b}_saved_at`,String(Date.now())),localStorage.setItem(_,`portal`),f.success(`登录成功`),p.replace(N());return}if(A.value.length>=32){let{data:e}=await v.post(`/verify-portal/login`,{portal_token:A.value,username:j.username.trim(),password:j.password});localStorage.setItem(b,e.token),localStorage.setItem(`${b}_saved_at`,String(Date.now())),localStorage.setItem(_,`portal`),f.success(`登录成功`),p.replace(N());return}let{data:e}=await v.post(`/auth/login`,{...j,client:`h5_verify`});localStorage.setItem(b,e.token),localStorage.setItem(`${b}_saved_at`,String(Date.now())),localStorage.setItem(_,`admin`),localStorage.removeItem(y),localStorage.removeItem(g),f.success(`登录成功`),p.replace(N())}catch(e){f.error(e?.response?.data?.message??`登录失败`)}finally{O.value=!1}}return(t,a)=>{let s=n(`a-input`),d=n(`a-form-item`),f=n(`a-input-password`),p=n(`a-button`),m=n(`a-form`);return e(),c(`div`,x,[l(`div`,S,[a[2]||=l(`div`,{class:`m-verify-title`},`苏州市科普场馆地图`,-1),l(`div`,C,o(k.value.length>=6||A.value.length>=32?`活动专用核销登录(活动结束后账号失效)`:`超级管理员核销登录`),1)]),l(`div`,w,[u(m,{model:j,layout:`vertical`,onSubmitSuccess:P},{default:r(()=>[u(d,{label:`用户名`},{default:r(()=>[u(s,{modelValue:j.username,"onUpdate:modelValue":a[0]||=e=>j.username=e,placeholder:`请输入账号`,size:`large`,"allow-clear":``},null,8,[`modelValue`])]),_:1}),u(d,{label:`密码`},{default:r(()=>[u(f,{modelValue:j.password,"onUpdate:modelValue":a[1]||=e=>j.password=e,placeholder:`请输入密码`,size:`large`,"allow-clear":``},null,8,[`modelValue`])]),_:1}),u(p,{type:`primary`,long:``,size:`large`,loading:O.value,onClick:P},{default:r(()=>[...a[3]||=[i(`登录`,-1)]]),_:1},8,[`loading`])]),_:1},8,[`model`]),k.value.length>=6||A.value.length>=32?(e(),c(`p`,T,[...a[4]||=[i(` 请使用后台配置的核销用户名与密码。链接中的 `,-1),l(`strong`,null,`v=`,-1),i(` 为活动短码,无需输入长串 ID。 `,-1)]])):(e(),c(`p`,E,[...a[5]||=[i(` 仅`,-1),l(`strong`,null,`超级管理员`,-1),i(`可使用后台账号登录本页。场馆工作人员请打开管理员提供的带 `,-1),l(`strong`,null,`?v=短码`,-1),i(` 的专用链接。 `,-1)]])),a[6]||=l(`p`,{class:`m-verify-tip`},`登录状态将保持较长时间;若已失效会自动回到本页。`,-1)])])}}}),[[`__scopeId`,`data-v-071c78f9`]]);export{D as default};
|
||||
@ -1 +0,0 @@
|
||||
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,u as c,v as l,y as u}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{i as d,o as f,r as p}from"./index-Dyg4zy2p.js";import{n as m,t as h}from"./h5Http-B_zh1Fd1.js";var g={class:`m-verify-page`},_={class:`m-verify-card`},v=f(u({__name:`VerifyLogin`,setup(u){let f=d(),v=p(),y=a(!1),b=o({username:``,password:``});function x(){return v.path.startsWith(`/m/`)?`/m/verify`:`/h5/verify/scan`}async function S(){y.value=!0;try{let{data:t}=await m.post(`/auth/login`,{...b,client:`h5_verify`});localStorage.setItem(h,t.token),localStorage.setItem(`${h}_saved_at`,String(Date.now())),e.success(`登录成功`),f.replace(x())}catch(t){e.error(t?.response?.data?.message??`登录失败`)}finally{y.value=!1}}return(e,a)=>{let o=n(`a-input`),u=n(`a-form-item`),d=n(`a-input-password`),f=n(`a-button`),p=n(`a-form`);return t(),s(`div`,g,[a[4]||=c(`div`,{class:`m-verify-hero`},[c(`div`,{class:`m-verify-title`},`苏州市科普场馆地图`),c(`div`,{class:`m-verify-sub`},`移动端核销登录`)],-1),c(`div`,_,[l(p,{model:b,layout:`vertical`,onSubmitSuccess:S},{default:r(()=>[l(u,{label:`用户名`},{default:r(()=>[l(o,{modelValue:b.username,"onUpdate:modelValue":a[0]||=e=>b.username=e,placeholder:`请输入账号`,size:`large`,"allow-clear":``},null,8,[`modelValue`])]),_:1}),l(u,{label:`密码`},{default:r(()=>[l(d,{modelValue:b.password,"onUpdate:modelValue":a[1]||=e=>b.password=e,placeholder:`请输入密码`,size:`large`,"allow-clear":``},null,8,[`modelValue`])]),_:1}),l(f,{type:`primary`,long:``,size:`large`,loading:y.value,onClick:S},{default:r(()=>[...a[2]||=[i(`登录`,-1)]]),_:1},8,[`loading`])]),_:1},8,[`model`]),a[3]||=c(`p`,{class:`m-verify-tip`},`登录状态将保持较长时间;若已失效会自动回到本页。`,-1)])])}}}),[[`__scopeId`,`data-v-b762ebdf`]]);export{v as default};
|
||||
@ -0,0 +1 @@
|
||||
.m-verify-page[data-v-071c78f9]{box-sizing:border-box;background:linear-gradient(165deg,#e8f1ff 0%,#f5f7fa 45%,#fff 100%);min-height:100dvh;padding:20px 16px 32px}.m-verify-hero[data-v-071c78f9]{text-align:center;padding:28px 8px 20px}.m-verify-title[data-v-071c78f9]{color:#1d2129;letter-spacing:.02em;font-size:20px;font-weight:700}.m-verify-sub[data-v-071c78f9]{color:#86909c;margin-top:8px;font-size:14px}.m-verify-card[data-v-071c78f9]{background:#fff;border-radius:14px;max-width:420px;margin:0 auto;padding:20px;box-shadow:0 8px 28px #0f172a14}.m-verify-tip[data-v-071c78f9]{color:#86909c;margin-top:14px;font-size:12px;line-height:1.5}
|
||||
@ -1 +0,0 @@
|
||||
.m-verify-page[data-v-b762ebdf]{box-sizing:border-box;background:linear-gradient(165deg,#e8f1ff 0%,#f5f7fa 45%,#fff 100%);min-height:100dvh;padding:20px 16px 32px}.m-verify-hero[data-v-b762ebdf]{text-align:center;padding:28px 8px 20px}.m-verify-title[data-v-b762ebdf]{color:#1d2129;letter-spacing:.02em;font-size:20px;font-weight:700}.m-verify-sub[data-v-b762ebdf]{color:#86909c;margin-top:8px;font-size:14px}.m-verify-card[data-v-b762ebdf]{background:#fff;border-radius:14px;max-width:420px;margin:0 auto;padding:20px;box-shadow:0 8px 28px #0f172a14}.m-verify-tip[data-v-b762ebdf]{color:#86909c;margin-top:14px;font-size:12px;line-height:1.5}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1 +1 @@
|
||||
.m-scan[data-v-c9326014]{min-height:100dvh;padding:16px;padding-bottom:calc(16px + env(safe-area-inset-bottom));box-sizing:border-box;background:linear-gradient(#f0f5ff 0%,#f7f8fa 40%,#fff 100%)}.m-scan-head[data-v-c9326014]{justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:28px;display:flex}.m-scan-brand[data-v-c9326014]{color:#1d2129;font-size:22px;font-weight:700}.m-scan-sub[data-v-c9326014]{color:#86909c;margin-top:4px;font-size:13px}.m-scan-venue[data-v-c9326014]{color:#1d2129;word-break:break-all;margin-top:8px;font-size:14px;font-weight:600;line-height:1.45}.m-scan-stats[data-v-c9326014]{box-sizing:border-box;gap:12px;max-width:420px;margin:0 auto 20px;padding:0 4px;display:flex}.m-scan-stats-loading[data-v-c9326014]{text-align:center;color:#86909c;background:#ffffffb3;border:1px solid #e5e6eb;border-radius:12px;width:100%;padding:12px;font-size:13px}.m-scan-stat[data-v-c9326014]{text-align:center;background:#fff;border:1px solid #e5e6eb;border-radius:12px;flex:1;min-width:0;padding:14px 12px;box-shadow:0 2px 8px #0000000a}.m-scan-stat--verified[data-v-c9326014]{background:linear-gradient(#f6ffed 0%,#fff 100%);border-color:#00b42a59}.m-scan-stat-label[data-v-c9326014]{color:#86909c;margin-bottom:6px;font-size:12px}.m-scan-stat-num[data-v-c9326014]{color:#1d2129;font-variant-numeric:tabular-nums;font-size:26px;font-weight:700;line-height:1.2}.m-scan-stat--verified .m-scan-stat-num[data-v-c9326014]{color:#00b42a}.m-scan-main[data-v-c9326014]{flex-direction:column;align-items:center;gap:16px;max-width:420px;margin:0 auto;display:flex}.m-scan-btn[data-v-c9326014]{color:#fff;cursor:pointer;background:linear-gradient(145deg,#165dff 0%,#0e42d2 100%);border:none;border-radius:50%;flex-direction:column;justify-content:center;align-items:center;gap:10px;width:168px;height:168px;font-size:18px;font-weight:600;display:flex;box-shadow:0 12px 32px #165dff59}.m-scan-btn[data-v-c9326014]:disabled{opacity:.65;cursor:not-allowed}.m-scan-btn-icon[data-v-c9326014]{background:#ffffff40;border-radius:8px;width:40px;height:40px;position:relative}.m-scan-btn-icon[data-v-c9326014]:before,.m-scan-btn-icon[data-v-c9326014]:after{content:"";border:3px solid #fff;border-radius:4px;position:absolute}.m-scan-btn-icon[data-v-c9326014]:before{inset:6px}.m-scan-btn-icon[data-v-c9326014]:after{inset:10px}.m-scan-hint[data-v-c9326014]{text-align:center;color:#86909c;margin:0;padding:0 8px;font-size:13px;line-height:1.5}.m-scan-hint--sub[data-v-c9326014]{margin-top:6px;font-size:12px}.m-scan-secondary[data-v-c9326014]{max-width:280px}.cam-wrap[data-v-c9326014]{flex-direction:column;gap:12px;display:flex}.cam-video[data-v-c9326014]{object-fit:cover;background:#000;border-radius:10px;width:100%;min-height:220px}.cam-tip[data-v-c9326014]{color:#86909c;text-align:center;margin:0;font-size:13px}.today-list[data-v-c9326014]{flex-direction:column;gap:10px;max-height:min(60vh,420px);display:flex;overflow:auto}.today-item[data-v-c9326014]{background:#f7f8fa;border:1px solid #e5e6eb;border-radius:10px;padding:12px}.today-row[data-v-c9326014]{justify-content:space-between;align-items:center;gap:8px;display:flex}.today-name[data-v-c9326014]{color:#1d2129;font-size:15px;font-weight:600}.today-act[data-v-c9326014]{color:#4e5969;margin-top:6px;font-size:14px}.today-meta[data-v-c9326014]{color:#86909c;margin-top:4px;font-size:12px;line-height:1.45}.today-meta--sub[data-v-c9326014]{color:#a3a6ad;margin-top:2px;font-size:11px}.today-modal-summary[data-v-c9326014]{color:#4e5969;background:#f7f8fa;border-radius:8px;margin:-4px 0 12px;padding:8px 10px;font-size:13px;line-height:1.5}.today-modal-summary strong[data-v-c9326014]{color:#1d2129;font-variant-numeric:tabular-nums}.m-verify-res-modal.arco-modal{max-width:calc(100vw - 24px);margin:12px}.m-verify-res-modal .arco-modal-header{padding:14px 16px 10px}.m-verify-res-modal .arco-modal-title{font-size:17px;font-weight:600}.m-verify-res-modal .arco-modal-footer{padding:10px 16px 16px;padding-bottom:calc(16px + env(safe-area-inset-bottom));border-top:1px solid var(--color-border-2,#e5e6eb);flex-direction:column;gap:10px;display:flex}.m-verify-res-modal .arco-modal-footer .arco-btn{width:100%;margin:0!important}.m-verify-res-desc .arco-descriptions-item-label{vertical-align:top;color:#86909c;width:88px;padding-bottom:10px}.m-verify-res-desc .arco-descriptions-item-value{word-break:break-all;padding-bottom:10px}@media (width>=480px){.m-verify-res-modal .arco-modal-footer{flex-direction:row;justify-content:flex-end}.m-verify-res-modal .arco-modal-footer .arco-btn{width:auto;min-width:100px}}
|
||||
.m-scan[data-v-e1b23e8d]{min-height:100dvh;padding:16px;padding-bottom:calc(16px + env(safe-area-inset-bottom));box-sizing:border-box;background:linear-gradient(#f0f5ff 0%,#f7f8fa 40%,#fff 100%)}.m-scan-head[data-v-e1b23e8d]{justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:28px;display:flex}.m-scan-brand[data-v-e1b23e8d]{color:#1d2129;font-size:22px;font-weight:700}.m-scan-sub[data-v-e1b23e8d]{color:#86909c;margin-top:4px;font-size:13px}.m-scan-venue[data-v-e1b23e8d]{color:#1d2129;word-break:break-all;margin-top:8px;font-size:14px;font-weight:600;line-height:1.45}.m-scan-stats[data-v-e1b23e8d]{box-sizing:border-box;gap:12px;max-width:420px;margin:0 auto 20px;padding:0 4px;display:flex}.m-scan-stats-loading[data-v-e1b23e8d]{text-align:center;color:#86909c;background:#ffffffb3;border:1px solid #e5e6eb;border-radius:12px;width:100%;padding:12px;font-size:13px}.m-scan-stat[data-v-e1b23e8d]{text-align:center;background:#fff;border:1px solid #e5e6eb;border-radius:12px;flex:1;min-width:0;padding:14px 12px;box-shadow:0 2px 8px #0000000a}.m-scan-stat--verified[data-v-e1b23e8d]{background:linear-gradient(#f6ffed 0%,#fff 100%);border-color:#00b42a59}.m-scan-stat-label[data-v-e1b23e8d]{color:#86909c;margin-bottom:6px;font-size:12px}.m-scan-stat-num[data-v-e1b23e8d]{color:#1d2129;font-variant-numeric:tabular-nums;font-size:26px;font-weight:700;line-height:1.2}.m-scan-stat--verified .m-scan-stat-num[data-v-e1b23e8d]{color:#00b42a}.m-scan-main[data-v-e1b23e8d]{flex-direction:column;align-items:center;gap:16px;max-width:420px;margin:0 auto;display:flex}.m-scan-btn[data-v-e1b23e8d]{color:#fff;cursor:pointer;background:linear-gradient(145deg,#165dff 0%,#0e42d2 100%);border:none;border-radius:50%;flex-direction:column;justify-content:center;align-items:center;gap:10px;width:168px;height:168px;font-size:18px;font-weight:600;display:flex;box-shadow:0 12px 32px #165dff59}.m-scan-btn[data-v-e1b23e8d]:disabled{opacity:.65;cursor:not-allowed}.m-scan-btn-icon[data-v-e1b23e8d]{background:#ffffff40;border-radius:8px;width:40px;height:40px;position:relative}.m-scan-btn-icon[data-v-e1b23e8d]:before,.m-scan-btn-icon[data-v-e1b23e8d]:after{content:"";border:3px solid #fff;border-radius:4px;position:absolute}.m-scan-btn-icon[data-v-e1b23e8d]:before{inset:6px}.m-scan-btn-icon[data-v-e1b23e8d]:after{inset:10px}.m-scan-hint[data-v-e1b23e8d]{text-align:center;color:#86909c;margin:0;padding:0 8px;font-size:13px;line-height:1.5}.m-scan-hint--sub[data-v-e1b23e8d]{margin-top:6px;font-size:12px}.m-scan-secondary[data-v-e1b23e8d]{max-width:280px}.cam-wrap[data-v-e1b23e8d]{flex-direction:column;gap:12px;display:flex}.cam-video[data-v-e1b23e8d]{object-fit:cover;background:#000;border-radius:10px;width:100%;min-height:220px}.cam-tip[data-v-e1b23e8d]{color:#86909c;text-align:center;margin:0;font-size:13px}.today-list[data-v-e1b23e8d]{flex-direction:column;gap:10px;max-height:min(60vh,420px);display:flex;overflow:auto}.today-item[data-v-e1b23e8d]{background:#f7f8fa;border:1px solid #e5e6eb;border-radius:10px;padding:12px}.today-row[data-v-e1b23e8d]{justify-content:space-between;align-items:center;gap:8px;display:flex}.today-name[data-v-e1b23e8d]{color:#1d2129;font-size:15px;font-weight:600}.today-act[data-v-e1b23e8d]{color:#4e5969;margin-top:6px;font-size:14px}.today-meta[data-v-e1b23e8d]{color:#86909c;margin-top:4px;font-size:12px;line-height:1.45}.today-meta--sub[data-v-e1b23e8d]{color:#a3a6ad;margin-top:2px;font-size:11px}.today-modal-summary[data-v-e1b23e8d]{color:#4e5969;background:#f7f8fa;border-radius:8px;margin:-4px 0 12px;padding:8px 10px;font-size:13px;line-height:1.5}.today-modal-summary strong[data-v-e1b23e8d]{color:#1d2129;font-variant-numeric:tabular-nums}.m-verify-res-modal.arco-modal{max-width:calc(100vw - 24px);margin:12px}.m-verify-res-modal .arco-modal-header{padding:14px 16px 10px}.m-verify-res-modal .arco-modal-title{font-size:17px;font-weight:600}.m-verify-res-modal .arco-modal-footer{padding:10px 16px 16px;padding-bottom:calc(16px + env(safe-area-inset-bottom));border-top:1px solid var(--color-border-2,#e5e6eb);flex-direction:column;gap:10px;display:flex}.m-verify-res-modal .arco-modal-footer .arco-btn{width:100%;margin:0!important}.m-verify-res-desc .arco-descriptions-item-label{vertical-align:top;color:#86909c;width:88px;padding-bottom:10px}.m-verify-res-desc .arco-descriptions-item-value{word-break:break-all;padding-bottom:10px}@media (width>=480px){.m-verify-res-modal .arco-modal-footer{flex-direction:row;justify-content:flex-end}.m-verify-res-modal .arco-modal-footer .arco-btn{width:auto;min-width:100px}}
|
||||
@ -1 +1 @@
|
||||
import{I as e,d as t,y as n}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as r}from"./PagePlaceholder-0iDIbJ_3.js";var i=n({__name:`Wechat`,setup(n){return(n,i)=>(e(),t(r,{title:`系统设置 / 微信配置`}))}});export{i as default};
|
||||
import{I as e,d as t,y as n}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as r}from"./PagePlaceholder-C01qW8FK.js";var i=n({__name:`Wechat`,setup(n){return(n,i)=>(e(),t(r,{title:`系统设置 / 微信配置`}))}});export{i as default};
|
||||
@ -0,0 +1 @@
|
||||
import{I as e,N as t,V as n,Y as r,_ as i,d as a,it as o,kt as s,nt as c,p as l,ut as u,v as d,y as f}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as p}from"./message-Dh9377vh.js";import{n as m}from"./http-BWP--XXK.js";import{t as h}from"./listTableRowIndex-Bl-nc9Qt.js";var g=[`src`],_={key:1},v=f({__name:`WechatUsers`,setup(f){let v=o(!1),y=o([]),b=c({current:1,pageSize:15,total:0}),x=o(``);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(e){p.error(e?.response?.data?.message??`加载失败`)}finally{v.value=!1}}function C(){b.current=1,S()}function w(e){b.current=e,S()}return t(()=>void S()),(t,o)=>{let c=n(`a-input`),f=n(`a-button`),p=n(`a-space`),m=n(`a-table-column`),S=n(`a-avatar`),T=n(`a-table`),E=n(`a-card`);return e(),a(E,{title:`用户管理 / 用户列表`},{default:r(()=>[d(p,{style:{"margin-bottom":`12px`},wrap:``},{default:r(()=>[d(c,{modelValue:x.value,"onUpdate:modelValue":o[0]||=e=>x.value=e,placeholder:`搜索手机号或昵称`,style:{width:`240px`},"allow-clear":``,onPressEnter:C},null,8,[`modelValue`]),d(f,{type:`primary`,onClick:C},{default:r(()=>[...o[1]||=[i(`查询`,-1)]]),_:1})]),_:1}),d(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:r(()=>[d(m,{title:``,width:52},{cell:r(({rowIndex:e})=>[i(s(u(h)(e,b.current,b.pageSize)),1)]),_:1}),d(m,{title:`头像`,width:72},{cell:r(({record:t})=>[d(S,{size:40},{default:r(()=>[t.avatar_url?(e(),l(`img`,{key:0,src:t.avatar_url,alt:``},null,8,g)):(e(),l(`span`,_,`访`))]),_:2},1024)]),_:1}),d(m,{title:`手机号`,"data-index":`phone`,width:140}),d(m,{title:`昵称`,"data-index":`nickname`,width:140,ellipsis:``,tooltip:``}),d(m,{title:`姓名`,"data-index":`real_name`,width:120,ellipsis:``,tooltip:``}),d(m,{title:`注册时间`,"data-index":`created_at`,width:180})]),_:1},8,[`data`,`loading`,`pagination`])]),_:1})}}});export{v as default};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue