diff --git a/src/locales/langs/en-us.ts b/src/locales/langs/en-us.ts index 9fade52..13612f7 100644 --- a/src/locales/langs/en-us.ts +++ b/src/locales/langs/en-us.ts @@ -559,6 +559,7 @@ const local: any = { pay:'pay now' }, headerbanner:{ + packageCount:'My packages', nopackage:'No package', packageinfo:'Package information', packagename:'Package name', @@ -690,6 +691,7 @@ const local: any = { refresh:"Refresh", }, usercard:{ + package:"My packages", changeInfo:"Change Information", resetpwd:"Reset password", kyc:"KYC Certification", @@ -783,6 +785,22 @@ const local: any = { submitcer:'Submit for certification.', previewimage:'Preview image', }, + package:{ + myPackages:'My Packages', + active:'Active', + expired:'Waiting', + price:'Price', + period: 'Period', + traffic: 'Traffic', + devices: 'Device', + unlimited: 'Unlimited', + upLimit: 'Up rate', + downLimit: 'Down rate', + day: 'Day', + month: 'Month', + year: 'Year', + total:'Total', + }, }, form: { required: 'Cannot be empty', diff --git a/src/locales/langs/zh-cn.ts b/src/locales/langs/zh-cn.ts index beb0599..51bbccc 100644 --- a/src/locales/langs/zh-cn.ts +++ b/src/locales/langs/zh-cn.ts @@ -22,6 +22,7 @@ const viewZh: any = { "view.userInfo_accsee":"当前设备", "view.userInfo_records":"历史设备", "view.userInfo_cdrlrecords":"上网记录", + "view.userInfo_package":"我的套餐", }; const local:any = { @@ -560,6 +561,7 @@ const local:any = { pay:'立即支付', }, headerbanner:{ + packageCount:'我的套餐', packageinfo:'套餐信息', packagename:'套餐名称', price:'套餐费用', @@ -783,6 +785,22 @@ const local:any = { submitcer:'提交认证', previewimage:'预览图片', }, + package:{ + myPackages:'我的套餐', + active:'启用', + expired:'待启用', + price:'价格', + period: '有效期', + traffic: '流量', + devices: '设备数', + unlimited: '无限制', + upLimit: '上行限速', + downLimit: '下行限速', + day: '天', + month: '月', + year: '年', + total:'共', + }, }, form: { required: '不能为空', diff --git a/src/router/elegant/routes.ts b/src/router/elegant/routes.ts index 333d485..cafcee4 100644 --- a/src/router/elegant/routes.ts +++ b/src/router/elegant/routes.ts @@ -538,6 +538,17 @@ export const customRoutes: GeneratedRoute[] = [ order:22, hideInMenu: true } + }, + { + name:'user-info_package', + path:'/userInfo/package', + component:'view.userInfo_package', + meta:{ + title:'已办理套餐', + i18nKey:'view.userInfo_package', + order:23, + hideInMenu:true + } } ] }, diff --git a/src/service/api/auth.ts b/src/service/api/auth.ts index 29167ed..0b8e503 100644 --- a/src/service/api/auth.ts +++ b/src/service/api/auth.ts @@ -206,6 +206,15 @@ export function resetPasswordByEmail(data: { email: string; code: string; passwo data }); } +/** Get user's purchased packages */ +export function fetchUserPackages(params: Api.Package.UserPackageQueryParams) { + return request({ + url: '/u/accountPackage/page', + method: 'get', + params + }); +} + diff --git a/src/typings/api.d.ts b/src/typings/api.d.ts index 069ceb2..96ba8b9 100644 --- a/src/typings/api.d.ts +++ b/src/typings/api.d.ts @@ -666,6 +666,32 @@ declare namespace Api { pageNum: number; pageSize: number; } + + /** User package information */ + interface UserPackage { + id: number; + packageName: string; + price: number; + startTime: number; + endTime: number; + status: number; // 1: active, 0: expired + } + + /** User package list response */ + interface UserPackageListResponse { + code: number; + msg: string; + data: { + rows: UserPackage[]; + total: number; + }; + } + + /** User package query parameters */ + interface UserPackageQueryParams { + pageNum: number; + pageSize: number; + } } /** diff --git a/src/typings/auto-imports.d.ts b/src/typings/auto-imports.d.ts index 4db86d8..18a2b49 100644 --- a/src/typings/auto-imports.d.ts +++ b/src/typings/auto-imports.d.ts @@ -112,6 +112,7 @@ declare global { const fetchRechargeHistory: typeof import('../service/api/auth')['fetchRechargeHistory'] const fetchRefreshToken: typeof import('../service/api/auth')['fetchRefreshToken'] const fetchRegister: typeof import('../service/api/auth')['fetchRegister'] + const fetchUserPackages: typeof import('../service/api/auth')['fetchUserPackages'] const filterAuthRoutesByRoles: typeof import('../store/modules/route/shared')['filterAuthRoutesByRoles'] const filterTabsById: typeof import('../store/modules/tab/shared')['filterTabsById'] const filterTabsByIds: typeof import('../store/modules/tab/shared')['filterTabsByIds'] diff --git a/src/views/home/modules/header-banner.vue b/src/views/home/modules/header-banner.vue index dfa639f..1bbab01 100644 --- a/src/views/home/modules/header-banner.vue +++ b/src/views/home/modules/header-banner.vue @@ -281,11 +281,10 @@ const speedLimits = ref({ // 添加套餐信息的响应式引用 const packageInfo = ref({ - // packageName: '', - // price: '0.00' packageName: t('page.headerbanner.nopackage'), price: '-', - status:3, + status: 3, + packageNum: 0 // 添加套餐数量字段 }); // 修改数据更新函数,添加套餐信息的更新 @@ -296,8 +295,9 @@ async function mockDataUpdate() { // 更新套餐信息 packageInfo.value = { packageName: response.packageName ? response.packageName : t('page.headerbanner.nopackage'), - price: response.packageName ? formatBalance(response.price) : '-',// 有套餐时才格式化价格 - status: response.status !== undefined ? Number(response.status) : 3,//有套餐时才判断状态 + price: response.packageName ? formatBalance(response.price) : '-', + status: response.status !== undefined ? Number(response.status) : 3, + packageNum: response.packageNum || 0 // 添加套餐数量 }; // 更新余额和设备数据 @@ -310,9 +310,9 @@ async function mockDataUpdate() { unit: t('page.headerbanner.money'), subTitle: t('page.headerbanner.deviceCount') + `: ${ response.packageName ? ( - !response.clientNumEnable - ? t('page.headerbanner.nolimit') - : (response.clientNum || 0) + t('page.headerbanner.device') + !response.clientNumEnable + ? t('page.headerbanner.nolimit') + : (response.clientNum || 0) + t('page.headerbanner.device') ):'-' }` }; @@ -334,35 +334,35 @@ async function mockDataUpdate() { }; } else { // 有套餐时的正常显示逻辑 - const totalTraffic = response.trafficEnable ? (response.traffic || 0) : 0; - const usedTraffic = response.trafficEnable ? (response.trafficUsed || 0) : 0; - const remainingTraffic = Math.max(0, totalTraffic - usedTraffic); + const totalTraffic = response.trafficEnable ? (response.traffic || 0) : 0; + const usedTraffic = response.trafficEnable ? (response.trafficUsed || 0) : 0; + const remainingTraffic = Math.max(0, totalTraffic - usedTraffic); - // 格式化流量显示 - const formattedTotal = formatTraffic(totalTraffic); - const formattedUsed = formatTraffic(usedTraffic); + // 格式化流量显示 + const formattedTotal = formatTraffic(totalTraffic); + const formattedUsed = formatTraffic(usedTraffic); - const formattedRemaining = formatTraffic(remainingTraffic); + const formattedRemaining = formatTraffic(remainingTraffic); - // 更新流量数据显示 - // baseData.value[1] = { - // ...baseData.value[1], - // value: remainingTraffic, - // max: totalTraffic, - // displayValue: !response.trafficEnable ? t('page.headerbanner.nolimit') : `${formattedRemaining.value}${formattedRemaining.unit}`, - // unit: '', - // description: !response.trafficEnable - // ? t('page.headerbanner.nolimit') - // : `${formattedTotal.value}${formattedTotal.unit}`, - // subTitle: !response.trafficEnable - // ? t('page.headerbanner.nolimit') - // : formattedUsed.value+formattedUsed.unit, - // speedLimits: { - // upLimit: speedLimits.value.upLimit, - // downLimit: speedLimits.value.downLimit - // } - // }; - // console.log(baseData.value[1].description) + // 更新流量数据显示 + // baseData.value[1] = { + // ...baseData.value[1], + // value: remainingTraffic, + // max: totalTraffic, + // displayValue: !response.trafficEnable ? t('page.headerbanner.nolimit') : `${formattedRemaining.value}${formattedRemaining.unit}`, + // unit: '', + // description: !response.trafficEnable + // ? t('page.headerbanner.nolimit') + // : `${formattedTotal.value}${formattedTotal.unit}`, + // subTitle: !response.trafficEnable + // ? t('page.headerbanner.nolimit') + // : formattedUsed.value+formattedUsed.unit, + // speedLimits: { + // upLimit: speedLimits.value.upLimit, + // downLimit: speedLimits.value.downLimit + // } + // }; + // console.log(baseData.value[1].description) baseData.value[1] = { ...baseData.value[1], value: remainingTraffic, @@ -537,6 +537,12 @@ const getDeviceCount = (subTitle?: string, clientNumEnable?: boolean): string => {{ t('page.headerbanner.client') }} {{ getDeviceCount(baseData[0].subTitle, baseData[0].speedLimits?.upLimit !== t('page.headerbanner.nolimit')) }} +
+ + {{ t('page.headerbanner.packageCount') }} + {{ packageInfo.packageNum }} + +
@@ -799,4 +805,33 @@ const getDeviceCount = (subTitle?: string, clientNumEnable?: boolean): string => margin-bottom: 6px; } } + +.clickable-row { + text-decoration: none; + color: inherit; + width: 100%; + cursor: pointer; + transition: background-color 0.3s; +} + +.clickable-row:hover { + background-color: rgba(255, 255, 255, 0.1); +} + +/* 移除之前的链接样式 */ +.package-link { + text-decoration: none; + color: inherit; +} + +.link-text { + cursor: pointer; + color: #fff; + position: relative; + display: inline-block; +} + +.link-text:hover { + opacity: 0.9; +} diff --git a/src/views/recharge/package/index.vue b/src/views/recharge/package/index.vue index 639fef7..1ec8ca6 100644 --- a/src/views/recharge/package/index.vue +++ b/src/views/recharge/package/index.vue @@ -435,7 +435,7 @@ onMounted(async () => {