From c3e7b1b3d7c47145cd31aaf46c459900e89fd04a Mon Sep 17 00:00:00 2001 From: hzj <1304805162@qq.com> Date: Fri, 22 May 2026 16:42:59 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=96=B0=E6=B4=BB=E5=8A=A8):=20=E5=8F=A4?= =?UTF-8?q?=E5=B0=94=E9=82=A6=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/activity.js | 102 + src/config/security.js | 1 + src/router/index.js | 6 + src/utils/permissionManager.js | 1 + .../GulbenFestival/components/topUser.vue | 333 +++ src/views/Activities/GulbenFestival/index.vue | 2654 +++++++++++++++++ .../Activities/GulbenFestival/page.config.js | 208 ++ 7 files changed, 3305 insertions(+) create mode 100644 src/views/Activities/GulbenFestival/components/topUser.vue create mode 100644 src/views/Activities/GulbenFestival/index.vue create mode 100644 src/views/Activities/GulbenFestival/page.config.js diff --git a/src/api/activity.js b/src/api/activity.js index b959833..eb3a12f 100644 --- a/src/api/activity.js +++ b/src/api/activity.js @@ -110,3 +110,105 @@ export const claimDailyRechargeTask2 = async (data) => { throw error } } + +// 查询用户票券数量 +export const apiGetCardTicketList = async (activityId) => { + try { + const response = await get( + `/activity/card/ticket/list?activityId=${encodeURIComponent(activityId)}`, + ) + return response + } catch (error) { + console.error('Failed to get card ticket list:', error) + console.error('error:' + (error.response?.errorMsg || error.errorMsg || error.message || '')) + throw error + } +} + +// 查询奖励池奖品列表 +export const apiGetCardRewardPrizeList = async (activityId, poolType) => { + try { + const response = await get( + `/activity/card/reward/prize/list?activityId=${encodeURIComponent(activityId)}&poolType=${encodeURIComponent(poolType)}`, + ) + return response + } catch (error) { + console.error('Failed to get card reward prize list:', error) + console.error('error:' + (error.response?.errorMsg || error.errorMsg || error.message || '')) + throw error + } +} + +// 查询中奖飘窗列表 +export const apiGetCardRewardMarquee = async (activityId) => { + try { + const response = await get( + `/activity/card/reward/marquee?activityId=${encodeURIComponent(activityId)}`, + ) + return response + } catch (error) { + console.error('Failed to get card reward marquee:', error) + console.error('error:' + (error.response?.errorMsg || error.errorMsg || error.message || '')) + throw error + } +} + +// 抽卡(消耗抽卡票或金币,抽 R 级卡片) +export const apiPostCardDraw = async (data) => { + try { + const response = await post('/activity/card/draw', data) + return response + } catch (error) { + console.error('Failed to draw card:', error) + console.error('error:' + (error.response?.errorMsg || error.errorMsg || error.message || '')) + throw error + } +} + +// 合成卡片(R×5→SR,SR×3→SSR) +export const apiPostCardCombine = async (data) => { + try { + const response = await post('/activity/card/combine', data) + return response + } catch (error) { + console.error('Failed to combine card:', error) + console.error('error:' + (error.response?.errorMsg || error.errorMsg || error.message || '')) + throw error + } +} + +// 兑换奖励票(卡片 → STANDARD/PREMIUM/LUXURY 票) +export const apiPostCardRedeem = async (data) => { + try { + const response = await post('/activity/card/redeem', data) + return response + } catch (error) { + console.error('Failed to redeem card reward ticket:', error) + console.error('error:' + (error.response?.errorMsg || error.errorMsg || error.message || '')) + throw error + } +} + +// 奖励池抽奖(消耗奖励票,抽取实际奖励) +export const apiPostCardRewardDraw = async (data) => { + try { + const response = await post('/activity/card/reward/draw', data) + return response + } catch (error) { + console.error('Failed to draw card reward:', error) + console.error('error:' + (error.response?.errorMsg || error.errorMsg || error.message || '')) + throw error + } +} + +// 查询用户卡包 +export const apiPostCardBagList = async (data) => { + try { + const response = await post('/activity/card/bag/list', data) + return response + } catch (error) { + console.error('Failed to get card bag list:', error) + console.error('error:' + (error.response?.errorMsg || error.errorMsg || error.message || '')) + throw error + } +} diff --git a/src/config/security.js b/src/config/security.js index 17abbda..73d429a 100644 --- a/src/config/security.js +++ b/src/config/security.js @@ -19,6 +19,7 @@ export const PUBLIC_PATHS = Object.freeze([ '/login-reward', '/activities/poker-ace', '/daily-recharge', + '/activities/gulben-festival', '/activities/lucky-dollars-season5', '/activities/lucky-dollars-season4', '/activities/lesser-bairam', diff --git a/src/router/index.js b/src/router/index.js index ea42c07..9ca7917 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -414,6 +414,12 @@ const router = createRouter({ component: () => import('../views/Activities/LuckyDollars/Season5/index.vue'), meta: { requiresAuth: true }, }, //2026年x月x日上午5点结束 + { + path: '/activities/gulben-festival', + name: 'gulben-festival', + component: () => import('../views/Activities/GulbenFestival/index.vue'), + meta: { requiresAuth: true }, + }, // 古尔邦节活动 { path: '/activities/poker-ace', name: 'pokerAce', diff --git a/src/utils/permissionManager.js b/src/utils/permissionManager.js index 42a0258..ccc4e8e 100644 --- a/src/utils/permissionManager.js +++ b/src/utils/permissionManager.js @@ -63,6 +63,7 @@ const ACTIVITIES = [ '/activities/poker-ace', // 扑克王牌排行榜 '/daily-recharge', // 每日充值页面 '/activities/lucky-dollars-season5', // 幸运美金活动 + '/activities/gulben-festival', // 古尔邦节活动 '/activities/lucky-dollars-season4', // 幸运美金活动 '/activities/lesser-bairam', // 开斋节打榜 '/activities/lucky-dollars-season3', // 斋月打榜 diff --git a/src/views/Activities/GulbenFestival/components/topUser.vue b/src/views/Activities/GulbenFestival/components/topUser.vue new file mode 100644 index 0000000..b92aa8d --- /dev/null +++ b/src/views/Activities/GulbenFestival/components/topUser.vue @@ -0,0 +1,333 @@ + + + + + + + + + + + + + + + + {{ name }} + + + + + + + + {{ distributionValue }} + + + + + + + + + + diff --git a/src/views/Activities/GulbenFestival/index.vue b/src/views/Activities/GulbenFestival/index.vue new file mode 100644 index 0000000..51cdd62 --- /dev/null +++ b/src/views/Activities/GulbenFestival/index.vue @@ -0,0 +1,2654 @@ + + + + + {{ t('loading') }}... + + + + + + + + + + + + rule + + + + + + + + + {{ Days }}D + + + + {{ Hours }} + + : + + {{ Minutes }} + + : + + {{ Seconds }} + + + + + + + + + {{ tab.label }} + + + + + + + + + + + + {{ tab.label }} + + + + + + + + + + + + + + + + + + + + + + + {{ getLotteryPrizeDisplayText(prize) }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + :{{ getTicketRemainingCount(ticket.type) }} + + + + + + + *Redeem Your Cards and Draw for Amazing Rewards! + + + + + + + + + + + + + + + + + + + {{ card.quantity }} + + + + + + + + + + + + + + + Remaining Tickets: *{{ cardDrawTicketCount }} + + + 1000/coins + + + + + Combine * 1 + + + + + Redeem + + + + + *1 + + + + + + + + + + + + + {{ showTarget(task) }} + + + Rewards: + + *{{ task.rewardValue }} + + + + + + + + {{ t('task_go') }} + + + + + + + {{ t('task_receive') }} + + + + + + + {{ t('task_received') }} + + + + + + + + + + + + + + + + + + + handleRewardImageError(event, getRewardTopMainReward(rewardTop).type) + " + /> + + + {{ getRewardDisplayText(getRewardTopMainReward(rewardTop)) }} + + + + + + + + + + + + + handleRewardImageError(event, reward.type)" + /> + + + {{ getRewardDisplayText(reward) }} + + + + + + + + + + + + + + + + + + + + + + + + + + {{ gift.giftCandy }} + + + + + + + + + + + + + + + + + + + + + + + + + {{ listItem.rank }} + + + + + {{ listItem.userName }} + + + {{ t('user_id_prefix') }} {{ listItem.specialAccount || listItem.account }} + + + + + + + + + + + + {{ listItem.amount || 0 }} + + + + + + + + + + + + {{ activeContentTitle }} + + + + + + + + + + + {{ myRanking.rank || 999 }} + + + + + {{ myRanking.userName }} + + + {{ t('user_id_prefix') }} {{ myRanking.specialAccount || myRanking.account }} + + + + + + + + + + + + {{ myRanking.amount || 0 }} + + + + + + + + + + + 1、How to Earn Tickets: + (1)Complete designated series of tasks to earnTickets. + 2、How to Use Tickets: + (1)Each Ticket can be used to randomly drawone R-grade Card. + 3、Card Combining& Upgrade: + (1)Combine 5 different R-grade Cards to randomlydraw one SR-grade Card. + (2)Combine 3 different SR-grade Cards torandomly draw one SSR-grade Card. + 4、Collect & Redeem Rewards: + + (1)Collect 5 different R-grade Cards to redeem onechance to draw a Standard + Reward. + + + (2)Collect 3 different SR-grade Cards to redeemone chance to draw a Premium + Reward. + + + (3)Collect 2 different SSR-grade Cards to redeemone chance to draw a Deluxe + Reward! + + + + + + + + + + + + + diff --git a/src/views/Activities/GulbenFestival/page.config.js b/src/views/Activities/GulbenFestival/page.config.js new file mode 100644 index 0000000..f57ac4c --- /dev/null +++ b/src/views/Activities/GulbenFestival/page.config.js @@ -0,0 +1,208 @@ +export const pageConfig = { + name: 'Gulben Festival', + routePath: '/activities/gulben-festival', + routeName: 'gulben-festival', + assetPath: 'Activities/GulbenFestival/', + + activity: { + activityId: '1001', + activityCode: '', + activityType: '', + personalRankActivityType: 'THIS_WEEK', + roomRankActivityType: '', + rewardActivityType: 'DAILY_RECHARGE_TASK2', + periodText: '', + }, + + preload: { + blocking: ['bg', 'ruleBtBg', 'timeBg', 'tagActiveBg', 'tagBg', 'lotteryBg', 'collectGameBg'], + background: [ + 'barrageBg', + 'cardBackBg', + 'draw5BtBg', + 'draw1Bt', + 'GameDrawBtBg', + 'Gameticket', + 'gameTitleR', + 'gameTitleSR', + 'gameTitleSSR', + 'giftBg', + 'leftBt', + 'lotteryPrizeActiveBg', + 'lotteryPrizeBg', + 'moduleActiveBg', + 'moduleBg', + 'redeemRGift', + 'redeemRGoat', + 'redeemRLamp', + 'redeemRLight', + 'redeemRMoon', + 'redeemR2001', + 'redeemR2002', + 'redeemR2003', + 'redeemR2004', + 'redeemR2005', + 'redeemSR2011', + 'redeemSR2012', + 'redeemSR2013', + 'redeemSRLamb', + 'redeemSRScroll', + 'redeemSRTurkey', + 'redeemSSR2021', + 'redeemSSR2022', + 'redeemSSRGoat', + 'redeemSSRLamb', + 'ruleActivity', + 'ruleInfoBg', + 'taskBtGo', + 'taskBtReceive', + 'taskBtReceived', + 'taskItemBg', + 'ticketHandleBtBg', + 'ticketR', + 'ticketSR', + 'ticketSSR', + 'RankingItem', + 'RewardTop1', + 'RewardTop2', + 'RewardTop3', + 'top1', + 'top2', + 'top3', + 'vip1', + 'userLevel1Bg', + 'wealthLevel1Bg', + ], + }, + + modules: { + tabs: { + enabled: true, + defaultValue: 'CollectCards toWin Prizes', + items: ['CollectCards toWin Prizes', 'Personal Rank', 'Room Rank'], + }, + sections: [ + { + name: 'collectCards', + label: 'CollectCards toWin Prizes', + enabled: true, + apis: [], + images: ['tagActiveBg', 'tagBg'], + containerImages: ['lotteryBg', 'collectGameBg', 'taskModule'], + previewImages: [], + remark: + '一级标签内容区;container 大背景图使用 itemCenter 组件,宽度 100vw,从上往下排列;开发期 padding、margin、gap 先设为 0,后续再微调。', + children: {}, + }, + { + name: 'personalRank', + label: 'Personal Rank', + enabled: true, + apis: [], + images: ['tagActiveBg', 'tagBg'], + remark: + '一级标签内容区;图片为背景图,使用 itemCenter 组件居中换行展示英文标题文本,开发期间不加翻译', + children: { + tabs: { + enabled: true, + defaultValue: 'Reward', + items: ['Reward', 'Ranking'], + }, + sections: [ + { + name: 'Reward', + enabled: true, + apis: [], + images: ['moduleActiveBg', 'moduleBg'], + previewImages: ['RewardTop1', 'RewardTop2', 'RewardTop3'], + remark: + '二级奖励标签内容区;图片为背景图,使用 itemCenter 组件居中换行展示英文标题文本,开发期间不加翻译', + children: {}, + }, + { + name: 'Ranking', + enabled: true, + apis: [], + images: ['moduleActiveBg', 'moduleBg'], + previewImages: ['top1', 'top2', 'top3'], + remark: + '二级排行榜标签内容区;图片为背景图,使用 itemCenter 组件居中换行展示英文标题文本,开发期间不加翻译', + children: {}, + }, + ], + }, + }, + { + name: 'roomRank', + label: 'Room Rank', + enabled: true, + apis: [], + images: ['tagActiveBg', 'tagBg'], + remark: + '一级标签内容区;图片为背景图,使用 itemCenter 组件居中换行展示英文标题文本,开发期间不加翻译', + children: { + tabs: { + enabled: true, + defaultValue: 'Reward', + items: ['Reward', 'Ranking'], + }, + sections: [ + { + name: 'Reward', + enabled: true, + apis: [], + images: ['moduleActiveBg', 'moduleBg'], + previewImages: ['ruleActivity'], + remark: + 'Room Rank / Reward 内容区;直接 100vw 展示 ruleActivity', + children: {}, + }, + { + name: 'Ranking', + enabled: true, + apis: [], + images: ['moduleActiveBg', 'moduleBg'], + previewImages: ['top1', 'top2', 'top3'], + remark: + '二级排行榜标签内容区;图片为背景图,使用 itemCenter 组件居中换行展示英文标题文本,开发期间不加翻译', + children: {}, + }, + ], + }, + }, + ], + popups: [ + { + name: 'rule', + triggerImage: 'ruleBtBg', + component: 'MaskLayer', + backgroundImage: 'ruleInfoBg', + contentComponent: 'itemCenter', + closeRule: 'click mask to close, click popup content stop propagation', + textStyle: { + color: '#FFF', + fontSize: '1em', + fontWeight: 600, + }, + }, + ], + features: [ + { + name: 'countdown', + enabled: '', + deadline: '', + images: ['timeBg'], + fields: { + endTime: '2026-06-01 05:00:00', + remainingText: '', + }, + remark: + '倒计时方法参考 LuckyDollars Season5:Days/Hours/Minutes/Seconds 四个 ref + calculateCountdown/startCountdown;目标时间直接在 getTargetTime 中使用 new Date(2026, 5, 1, 5, 0, 0),不解析中文;时分秒的中间用英文冒号:', + }, + ], + }, + + images: { + localized: {}, + }, +}