From 20c00c14d5e57ebe8e4210a01447a8c46378c885 Mon Sep 17 00:00:00 2001 From: zhx Date: Fri, 15 May 2026 09:58:36 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A0=B8=E8=9B=8B=E5=92=8C=E8=BD=AC=E7=9B=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/api/legacy/resident-activity.ts | 47 + apps/src/router/access.ts | 27 +- .../routes/modules/resident-activity.ts | 13 + .../components/props-source-select-drawer.vue | 230 ++- .../resident-activity/smash-golden-egg.vue | 1552 +++++++++++++++++ .../views/resident-activity/wheel-config.vue | 1158 ++++++++++++ 6 files changed, 2950 insertions(+), 77 deletions(-) create mode 100644 apps/src/views/resident-activity/smash-golden-egg.vue create mode 100644 apps/src/views/resident-activity/wheel-config.vue diff --git a/apps/src/api/legacy/resident-activity.ts b/apps/src/api/legacy/resident-activity.ts index df7cf47..049d3b3 100644 --- a/apps/src/api/legacy/resident-activity.ts +++ b/apps/src/api/legacy/resident-activity.ts @@ -12,6 +12,8 @@ const RECHARGE_REWARD_BASE = '/go/resident-activity/recharge-reward'; const TASK_CENTER_BASE = '/go/resident-activity/task-center'; const VOICE_ROOM_RED_PACKET_BASE = '/go/resident-activity/voice-room-red-packet'; const VOICE_ROOM_ROCKET_BASE = '/go/resident-activity/voice-room-rocket'; +const WHEEL_BASE = '/go/resident-activity/wheel'; +const SMASH_GOLDEN_EGG_BASE = '/go/resident-activity/smash-golden-egg'; export async function getResidentInviteConfig(sysOrigin: string) { return requestClient.get>('/resident-activity/invite/config', { @@ -100,6 +102,51 @@ export async function pageResidentVipUserStates(params: Record) { }); } +export async function getResidentWheelConfig(sysOrigin: string) { + return requestClient.get>(`${WHEEL_BASE}/config`, { + params: { sysOrigin }, + }); +} + +export async function saveResidentWheelConfig(data: Record) { + return requestClient.post>(`${WHEEL_BASE}/config/save`, data); +} + +export async function saveResidentWheelCategoryConfig(data: Record) { + return requestClient.post>( + `${WHEEL_BASE}/config/category/save`, + data, + ); +} + +export async function pageResidentWheelDrawRecords(params: Record) { + return requestClient.get>(`${WHEEL_BASE}/record/page`, { + params, + }); +} + +export async function getResidentSmashGoldenEggConfig(sysOrigin: string) { + return requestClient.get>(`${SMASH_GOLDEN_EGG_BASE}/config`, { + params: { sysOrigin }, + }); +} + +export async function saveResidentSmashGoldenEggConfig(data: Record) { + return requestClient.post>( + `${SMASH_GOLDEN_EGG_BASE}/config/save`, + data, + ); +} + +export async function pageResidentSmashGoldenEggDrawRecords( + params: Record, +) { + return requestClient.get>( + `${SMASH_GOLDEN_EGG_BASE}/draw-record/page`, + { params }, + ); +} + export async function getResidentRechargeRewardConfig(sysOrigin: string) { return requestClient.get>(`${RECHARGE_REWARD_BASE}/config`, { params: { sysOrigin }, diff --git a/apps/src/router/access.ts b/apps/src/router/access.ts index 7e9b868..105b66c 100644 --- a/apps/src/router/access.ts +++ b/apps/src/router/access.ts @@ -62,6 +62,12 @@ const ROUTE_MENU_OVERRIDES: Record< }, }; +const LOCAL_RESIDENT_ACTIVITY_FALLBACK_ROUTES = new Set([ + 'ResidentWheelConfig', + 'ResidentSmashGoldenEggConfig', + 'ResidentVoiceRoomRocket', +]); + function normalizeRoutePath(path?: string | null) { return String(path || '') .trim() @@ -109,6 +115,7 @@ function buildAuthorizedMenuMatcher(menus: LegacyMenu[]) { const aliasSet = new Set(); const routerSet = new Set(); const titleSet = new Set(); + let hasResidentActivityAccess = false; const queue = [...menus]; while (queue.length > 0) { @@ -119,18 +126,34 @@ function buildAuthorizedMenuMatcher(menus: LegacyMenu[]) { if (item.alias) { aliasSet.add(String(item.alias)); } - if (item.router) { - routerSet.add(normalizeRoutePath(item.router)); + const normalizedRouter = normalizeRoutePath(item.router); + if (normalizedRouter) { + routerSet.add(normalizedRouter); } if (item.menuType === 2 && item.menuName) { titleSet.add(String(item.menuName).trim()); } + const menuName = String(item.menuName || '').trim(); + if ( + String(item.alias || '') === 'ResidentActivityManager' || + menuName === '常驻活动' || + normalizedRouter === 'resident-activity/manager' || + normalizedRouter.startsWith('resident-activity/manager/') + ) { + hasResidentActivityAccess = true; + } if (Array.isArray(item.childrens) && item.childrens.length > 0) { queue.push(...item.childrens); } } return (route: RouteRecordRaw) => { + if ( + hasResidentActivityAccess && + LOCAL_RESIDENT_ACTIVITY_FALLBACK_ROUTES.has(String(route.name || '')) + ) { + return true; + } for (const alias of collectRouteAliases(route)) { if (aliasSet.has(alias)) { return true; diff --git a/apps/src/router/routes/modules/resident-activity.ts b/apps/src/router/routes/modules/resident-activity.ts index c6b5e2d..4b52a81 100644 --- a/apps/src/router/routes/modules/resident-activity.ts +++ b/apps/src/router/routes/modules/resident-activity.ts @@ -23,6 +23,19 @@ const routes: RouteRecordRaw[] = [ component: () => import('#/views/resident-activity/vip-config.vue'), meta: { title: 'VIP' }, }, + { + name: 'ResidentWheelConfig', + path: 'wheel/config', + component: () => import('#/views/resident-activity/wheel-config.vue'), + meta: { title: '转盘' }, + }, + { + name: 'ResidentSmashGoldenEggConfig', + path: 'smash-golden-egg/config', + component: () => + import('#/views/resident-activity/smash-golden-egg.vue'), + meta: { title: '砸蛋' }, + }, { name: 'ResidentRechargeRewardConfig', path: 'recharge-reward/config', diff --git a/apps/src/views/operate/components/props-source-select-drawer.vue b/apps/src/views/operate/components/props-source-select-drawer.vue index 1a7c600..abd9cd2 100644 --- a/apps/src/views/operate/components/props-source-select-drawer.vue +++ b/apps/src/views/operate/components/props-source-select-drawer.vue @@ -1,14 +1,6 @@ + + + + diff --git a/apps/src/views/resident-activity/wheel-config.vue b/apps/src/views/resident-activity/wheel-config.vue new file mode 100644 index 0000000..c4c16a2 --- /dev/null +++ b/apps/src/views/resident-activity/wheel-config.vue @@ -0,0 +1,1158 @@ + + + + +