From f9efbd109fc84543746af81c7ee6bab784b6e3cf Mon Sep 17 00:00:00 2001 From: Timi Date: Wed, 12 Aug 2026 22:27:16 +0800 Subject: [PATCH] add event record rank --- src/api/EventRecordAPI.ts | 2 +- src/components/CustomerList.vue | 16 - src/components/CustomerProfileCard.vue | 12 - src/components/CustomerSelector.vue | 7 - src/pages/customer/CustomerDetail.vue | 19 - src/pages/customer/CustomerList.vue | 8 - src/pages/event/EventRecordList.vue | 17 +- src/pages/event/EventRecordRank.vue | 653 ++++++++++++++++++++++++ src/pages/store/StoreDataCharts.vue | 2 +- src/pages/tabs/SettingTab.vue | 17 +- src/router/routes/registrationRoutes.ts | 15 + src/styles/global.less | 6 +- src/types/EventRecord.ts | 3 + 13 files changed, 694 insertions(+), 83 deletions(-) create mode 100644 src/pages/event/EventRecordRank.vue diff --git a/src/api/EventRecordAPI.ts b/src/api/EventRecordAPI.ts index 8888e0d..17b1b6b 100644 --- a/src/api/EventRecordAPI.ts +++ b/src/api/EventRecordAPI.ts @@ -37,7 +37,7 @@ async function remove(id: string): Promise { }); } -async function eventRank(page: EventRecordRankPage): Promise { +async function eventRank(page: EventRecordRankPage): Promise> { return await axios.post(`${BASE_URI}/rank`, withCurrentStoreId(page)); } diff --git a/src/components/CustomerList.vue b/src/components/CustomerList.vue index d35b250..d18dfc1 100644 --- a/src/components/CustomerList.vue +++ b/src/components/CustomerList.vue @@ -112,17 +112,6 @@ function handleRemove(customer: Customer): void { .avatar { width: 3.5rem; height: 3.5rem; - border-radius: .5rem; - - &.fallback { - color: #2563eb; - display: flex; - font-size: 1.25rem; - background: #dbeafe; - align-items: center; - font-weight: 600; - justify-content: center; - } } .empty-block { @@ -152,11 +141,6 @@ function handleRemove(customer: Customer): void { color: #e2e8f0; background: rgba(30, 41, 59, .9); } - - .avatar.fallback { - color: #93c5fd; - background: rgba(30, 64, 175, .32); - } } } diff --git a/src/components/CustomerProfileCard.vue b/src/components/CustomerProfileCard.vue index be347b9..8bdaf85 100644 --- a/src/components/CustomerProfileCard.vue +++ b/src/components/CustomerProfileCard.vue @@ -82,18 +82,6 @@ function openPhotoViewer(): void { .avatar { width: 4rem; height: 4rem; - display: block; - border-radius: .875rem; - - &.fallback { - color: #2563eb; - display: flex; - font-size: 1.5rem; - background: #dbeafe; - align-items: center; - font-weight: 600; - justify-content: center; - } } .content { diff --git a/src/components/CustomerSelector.vue b/src/components/CustomerSelector.vue index 8d71a50..a33bf40 100644 --- a/src/components/CustomerSelector.vue +++ b/src/components/CustomerSelector.vue @@ -273,13 +273,6 @@ onUnmounted(() => { min-height: 0; padding-bottom: env(safe-area-inset-bottom, 0); } - - .load-state { - padding: .75rem; - color: #52607a; - text-align: center; - font-size: .875rem; - } } :global(html.theme-dark) { diff --git a/src/pages/customer/CustomerDetail.vue b/src/pages/customer/CustomerDetail.vue index 1dce28d..67abb99 100644 --- a/src/pages/customer/CustomerDetail.vue +++ b/src/pages/customer/CustomerDetail.vue @@ -520,17 +520,6 @@ watch(() => route.params.id, loadCustomer); .avatar { width: 3.25rem; height: 3.25rem; - border-radius: .875rem; - - &.fallback { - color: #2563eb; - display: flex; - font-size: 1.125rem; - background: #dbeafe; - align-items: center; - font-weight: 600; - justify-content: center; - } } } } @@ -611,14 +600,6 @@ watch(() => route.params.id, loadCustomer); color: #e2e8f0; background: rgba(15, 23, 42, .96); } - - .avatar { - - &.fallback { - color: #93c5fd; - background: rgba(30, 64, 175, .32); - } - } } } diff --git a/src/pages/customer/CustomerList.vue b/src/pages/customer/CustomerList.vue index 7c8d21d..da7dc88 100644 --- a/src/pages/customer/CustomerList.vue +++ b/src/pages/customer/CustomerList.vue @@ -315,14 +315,6 @@ async function doExport(): Promise { background: rgba(30, 41, 59, .9); border-color: rgba(148, 163, 184, .16); } - - .avatar { - - &.fallback { - color: #93c5fd; - background: rgba(30, 64, 175, .32); - } - } } .stats { diff --git a/src/pages/event/EventRecordList.vue b/src/pages/event/EventRecordList.vue index 6dd1d7c..861d4d3 100644 --- a/src/pages/event/EventRecordList.vue +++ b/src/pages/event/EventRecordList.vue @@ -74,9 +74,9 @@ :src="getRecordPhotoURL(item)" :alt="getRecordEventName(item)" fit="cover" - class="photo" + class="avatar" /> -
+
diff --git a/src/pages/tabs/SettingTab.vue b/src/pages/tabs/SettingTab.vue index 5a17add..1d8c44e 100644 --- a/src/pages/tabs/SettingTab.vue +++ b/src/pages/tabs/SettingTab.vue @@ -99,6 +99,17 @@ const menuGroupList = computed(() => [ title: "客户管理", visible: userStore.hasPermissions(permissionCodes.customer.read) }, + { + icon: "usergroup", + path: "/management/customer-data-charts", + title: "客户统计数据", + visible: userStore.hasPermissions(permissionCodes.stat.read) + } + ] + }, + { + title: "登记", + items: [ { icon: "task", path: "/management/registration-events", @@ -112,9 +123,9 @@ const menuGroupList = computed(() => [ visible: userStore.hasPermissions(permissionCodes.eventRecord.read) }, { - icon: "usergroup", - path: "/management/customer-data-charts", - title: "客户统计数据", + icon: "chart", + path: "/management/registration-event-record-rank", + title: "登记记录排行", visible: userStore.hasPermissions(permissionCodes.stat.read) } ] diff --git a/src/router/routes/registrationRoutes.ts b/src/router/routes/registrationRoutes.ts index 7920136..763daae 100644 --- a/src/router/routes/registrationRoutes.ts +++ b/src/router/routes/registrationRoutes.ts @@ -5,6 +5,7 @@ import EventSort from "@/pages/event/EventSort.vue"; import EventRecordDetail from "@/pages/event/EventRecordDetail.vue"; import EventRecordEdit from "@/pages/event/EventRecordEdit.vue"; import EventRecordList from "@/pages/event/EventRecordList.vue"; +import EventRecordRank from "@/pages/event/EventRecordRank.vue"; const registrationRoutes: RouteRecordRaw[] = [ { @@ -77,6 +78,20 @@ const registrationRoutes: RouteRecordRaw[] = [ darkBodyBackground: "#10161f" } }, + { + path: "/management/registration-event-record-rank", + name: "EventRecordRank", + component: EventRecordRank, + meta: { + depth: 3, + navBarVisible: true, + navBarCanBack: true, + navBarTitle: "登记记录排行", + tabBarVisible: false, + bodyBackground: "#F5F5F8", + darkBodyBackground: "#10161f" + } + }, { path: "/management/registration-event-records/create", name: "EventRecordCreate", diff --git a/src/styles/global.less b/src/styles/global.less index c93db1a..2d97f3a 100644 --- a/src/styles/global.less +++ b/src/styles/global.less @@ -47,12 +47,14 @@ html.theme-dark body { .avatar { flex: none; + display: block; + border-radius: .875rem; &.fallback { - color: #2563eb; + color: #2563EB; display: flex; font-size: 1.25rem; - background: #dbeafe; + background: #DBEAFE; align-items: center; font-weight: 600; justify-content: center; diff --git a/src/types/EventRecord.ts b/src/types/EventRecord.ts index ad5fce5..b9240fd 100644 --- a/src/types/EventRecord.ts +++ b/src/types/EventRecord.ts @@ -42,10 +42,13 @@ export type EventRecordRankPage = { storeId?: string; customerId?: string; eventIdList?: string[]; + rankType?: EventRecordRankType; beginAt?: number; endAt?: number; } & BasePage; +export type EventRecordRankType = "TOTAL_DAYS" | "TOTAL_COUNT" | "CONTINUOUS_DAYS"; + export type CustomerEventRankView = { rank?: number; customerId?: string;