Răsfoiți Sursa

fix: 修改跳页方法

liangan 2 săptămâni în urmă
părinte
comite
87d5ded65e

+ 1 - 2
src/interceptors/route.ts

@@ -23,7 +23,7 @@ const navigateToInterceptor = {
   // 注意,这里的url是 '/' 开头的,如 '/pages/index/index',跟 'pages.json' 里面的 path 不同
   // 增加对相对路径的处理,BY 网友 @ideal
   invoke({ url }: { url: string }) {
-    // console.log(url) // /pages/route-interceptor/index?name=feige&age=30
+    console.log(url) // /pages/route-interceptor/index?name=feige&age=30
     let path = url.split('?')[0]
 
     // 处理相对路径
@@ -33,7 +33,6 @@ const navigateToInterceptor = {
       const baseDir = normalizedCurrentPath.substring(0, normalizedCurrentPath.lastIndexOf('/'))
       path = `${baseDir}/${path}`
     }
-    console.log(url)
 
     let needLoginPages: string[] = []
     // 为了防止开发时出现BUG,这里每次都获取一下。生产环境可以移到函数外,性能更好

+ 1 - 1
src/pages/bestSellers/bestSellers.vue

@@ -81,7 +81,7 @@ function getRankNumber(index: number) {
       </view>
     </template>
     <view class="pt-20rpx">
-      <view v-for="(item, index) in dataList" :key="item.productId" class="mb-20rpx mb-20rpx flex items-center gap-24rpx bg-white p-24rpx" @click="toPage('/pages/productDetail/productDetail', { productId: item.productId })">
+      <view v-for="(item, index) in dataList" :key="item.productId" class="mb-20rpx mb-20rpx flex items-center gap-24rpx bg-white p-24rpx" @click="toPage({ url: '/pages/productDetail/productDetail', productId: item.productId })">
         <view class="relative">
           <view class="h-160rpx w-160rpx shrink-0">
             <image

+ 2 - 2
src/pages/forgotPassword/forgotPassword.vue

@@ -132,7 +132,7 @@ async function handleResetPassword() {
 
     // 跳转到登录页
     setTimeout(() => {
-      toPage('/pages/login/login', {}, true)
+      toPage({ url: '/pages/login/login', isReLaunch: true })
     }, 1500)
   }
   catch (error) {
@@ -328,7 +328,7 @@ onUnmounted(() => {
         <text class="text-28rpx text-#5C5C5C">
           {{ $t('auth.forgotPassword.hasAccount') }}
         </text>
-        <text class="ml-10rpx text-28rpx text-[var(--wot-color-theme)]" @click="toPage('/pages/login/login')">
+        <text class="ml-10rpx text-28rpx text-[var(--wot-color-theme)]" @click="toPage({ url: '/pages/login/login' })">
           {{ $t('auth.forgotPassword.loginNow') }}
         </text>
       </view>

+ 2 - 2
src/pages/income/income.vue

@@ -154,13 +154,13 @@ onShow(() => {
         </view>
       </view>
       <view class="mb-20rpx flex items-center justify-between gap-22rpx text-center text-32rpx">
-        <view class="flex-1 rounded-16rpx bg-[rgba(var(--wot-color-theme-rgb),0.5)] py-32rpx shadow-[4rpx_4rpx_8rpx_0rpx_rgba(0,0,0,0.5)]" @click="toPage('/pages/myOrders/myOrders')">
+        <view class="flex-1 rounded-16rpx bg-[rgba(var(--wot-color-theme-rgb),0.5)] py-32rpx shadow-[4rpx_4rpx_8rpx_0rpx_rgba(0,0,0,0.5)]" @click="toPage({ url: '/pages/myOrders/myOrders' })">
           <text class="pr-16rpx">
             {{ $t('income.myGroupData') }}
           </text>
           <wd-icon name="chevron-right-circle" size="32rpx" />
         </view>
-        <view class="flex-1 rounded-16rpx bg-#FEE750/50 py-32rpx shadow-[4rpx_4rpx_8rpx_0rpx_rgba(0,0,0,0.5)]" @click="toPage('/pages/wallet/withdraw', { balance: walletInfo.balance, type: 2 })">
+        <view class="flex-1 rounded-16rpx bg-#FEE750/50 py-32rpx shadow-[4rpx_4rpx_8rpx_0rpx_rgba(0,0,0,0.5)]" @click="toPage({ url: '/pages/wallet/withdraw', params: { balance: walletInfo.balance, type: 2 } })">
           <text class="pr-16rpx">
             {{ $t('income.withdrawNow') }}
           </text>

+ 7 - 10
src/pages/index/index.vue

@@ -16,7 +16,6 @@ import { onPageScroll, onReachBottom } from '@dcloudio/uni-app'
 import useZPaging from 'z-paging/components/z-paging/js/hooks/useZPaging.js'
 import { bannerList, noticeUnread } from '@/api/common'
 import { getList } from '@/api/product'
-import { parseQs } from '@/utils'
 import { toPage } from '@/utils/page'
 
 defineOptions({
@@ -37,12 +36,10 @@ const current = ref<number>(0)
 const swiperList = ref([])
 function handleSwiperClick(e: any) {
   if (e.item.linkType === 0) {
-    const url = e.item.link.split('?')[0]
-    const params = parseQs(e.item.link.split('?')[1] || '')
-    toPage(url, params)
+    toPage({ url: e.item.link })
   }
   else {
-    toPage('/pages/webLink/webLink', { title: e.item.title, link: e.item.link })
+    toPage({ url: '/pages/webLink/webLink', params: { title: e.item.title, link: e.item.link } })
   }
 }
 
@@ -203,14 +200,14 @@ onLoad(async () => {
             <image
               src="/static/icons/search.png"
               class="mr-20rpx h-40rpx w-40rpx"
-              @click="toPage('/pages/search/search')"
+              @click="toPage({ url: '/pages/search/search' })"
             />
           </wd-badge>
           <wd-badge :model-value="unread" :max="99">
             <image
               src="/static/icons/notifications.png"
               class="h-40rpx w-40rpx"
-              @click="toPage('/pages/notifications/notifications')"
+              @click="toPage({ url: '/pages/notifications/notifications' })"
             />
           </wd-badge>
         </view>
@@ -315,7 +312,7 @@ onLoad(async () => {
             v-for="(item, index) in navIcons"
             :key="index"
             class="flex flex-col items-center"
-            @click="toPage(item.url)"
+            @click="toPage({ url: item.url })"
           >
             <image :src="item.image" :style="`width: ${item.size}; height: ${item.size};`" />
             <view class="mt-14rpx whitespace-pre-line text-center text-22rpx text-#898989 font-bold">
@@ -335,7 +332,7 @@ onLoad(async () => {
                 :title-font-size="18"
                 :item="item"
                 class="shrink-0"
-                @item-click="toPage('/pages/productDetail/productDetail', { productId: item.productId })"
+                @item-click="toPage({ url: '/pages/productDetail/productDetail', params: { productId: item.productId } })"
               />
             </view>
           </scroll-view>
@@ -370,7 +367,7 @@ onLoad(async () => {
               width="100%"
               :height="340"
               :item="item"
-              @item-click="toPage('/pages/productDetail/productDetail', { productId: item.productId })"
+              @item-click="toPage({ url: '/pages/productDetail/productDetail', params: { productId: item.productId } })"
             />
           </view>
         </view>

+ 4 - 5
src/pages/login/login.vue

@@ -10,7 +10,7 @@
 <script lang="ts" setup>
 import { t } from '@/locale'
 import { useUserStore } from '@/store/user'
-import { getPageParams, goBack, toPage } from '@/utils/page'
+import { goBack, toPage } from '@/utils/page'
 import { toast } from '@/utils/toast'
 
 defineOptions({
@@ -83,8 +83,7 @@ async function handleLogin() {
   }
 }
 onLoad((options) => {
-  const params = getPageParams(options)
-  redirectUrl.value = params.redirect || null
+  redirectUrl.value = options.redirect || null
 })
 </script>
 
@@ -150,7 +149,7 @@ onLoad((options) => {
         <view class="mt-40rpx">
           <wd-button
             plain
-            @click="toPage('/pages/register/register')"
+            @click="toPage({ url: '/pages/register/register' })"
           >
             {{ $t('auth.login.register') }}
           </wd-button>
@@ -159,7 +158,7 @@ onLoad((options) => {
 
       <!-- 忘记密码 -->
       <view class="fixed bottom-20rpx left-0 w-full text-center" :style="{ paddingBottom: `${safeAreaInsets?.bottom + 40}px` }">
-        <text class="text-28rpx text-#5C5C5C" @click="toPage('/pages/forgotPassword/forgotPassword')">
+        <text class="text-28rpx text-#5C5C5C" @click="toPage({ url: '/pages/forgotPassword/forgotPassword' })">
           {{ $t('auth.login.forgotPassword') }}
         </text>
       </view>

+ 4 - 4
src/pages/mine/addressBook.vue

@@ -16,7 +16,7 @@ import useZPaging from 'z-paging/components/z-paging/js/hooks/useZPaging.js'
 import { addressDel, addressList } from '@/api/mine'
 import { bindingAddress } from '@/api/order'
 import { t } from '@/locale'
-import { getPageParams, goBack, toPage } from '@/utils/page'
+import { goBack, toPage } from '@/utils/page'
 import { toast } from '@/utils/toast'
 
 defineOptions({
@@ -60,7 +60,7 @@ function handleAddressClick(item: any) {
 
 // 编辑地址
 function editAddress(id: any) {
-  toPage('/pages/mine/addressBookOperate', { id })
+  toPage({ url: '/pages/mine/addressBookOperate', params: { id } })
 }
 
 // 选择地址并绑定到订单
@@ -135,7 +135,7 @@ onShow(async () => {
 })
 // 页面加载时获取参数
 onLoad((options) => {
-  pageParams.value = getPageParams(options)
+  pageParams.value = options
 })
 </script>
 
@@ -173,7 +173,7 @@ onLoad((options) => {
     </view>
     <template #bottom>
       <view class="bg-white/60 px-28rpx py-30rpx backdrop-blur-20">
-        <wd-button plain block @click="toPage('/pages/mine/addressBookOperate', { default: dataList.length === 0 ? '1' : '0' })">
+        <wd-button plain block @click="toPage({ url: '/pages/mine/addressBookOperate', params: { default: dataList.length === 0 ? '1' : '0' } })">
           {{ $t('addressBook.button.add') }}
         </wd-button>
       </view>

+ 4 - 5
src/pages/mine/addressBookOperate.vue

@@ -16,7 +16,7 @@ import useZPaging from 'z-paging/components/z-paging/js/hooks/useZPaging.js'
 import { divisionsTreeList } from '@/api/common'
 import { addressAdd, addressDetail, addressUpdate } from '@/api/mine'
 import { t } from '@/locale'
-import { getPageParams, goBack } from '@/utils/page'
+import { goBack } from '@/utils/page'
 import { toast } from '@/utils/toast'
 
 defineOptions({
@@ -239,13 +239,12 @@ onLoad(async (options: any) => {
     area.value = [res.data]
 
     // 检查是否为编辑模式
-    const params = getPageParams(options)
-    if (params.default && params.default === '1') {
+    if (options.default && options.default === '1') {
       model.value.isDefault = 1
     }
-    if (params.id) {
+    if (options.id) {
       isEditMode.value = true
-      addressId.value = params.id
+      addressId.value = options.id
       // 设置页面标题
       uni.setNavigationBarTitle({
         title: t('addressBook.operate.title.edit'),

+ 8 - 8
src/pages/mine/mine.vue

@@ -50,7 +50,7 @@ const menuList = ref([
 ])
 function menuClick(item: any) {
   if (item.url) {
-    toPage(item.url)
+    toPage({ url: item.url })
   }
   else {
     openWhatsApp()
@@ -149,17 +149,17 @@ onLoad(() => {
       </view>
       <!-- 未登录 -->
       <view v-else class="ml-24rpx flex items-center">
-        <wd-button size="small" custom-class="mr-20rpx! bg-transparent!" plain @click="toPage('/pages/register/register')">
+        <wd-button size="small" custom-class="mr-20rpx! bg-transparent!" plain @click="toPage({ url: '/pages/register/register' })">
           {{ $t('mine.auth.register') }}
         </wd-button>
-        <wd-button size="small" @click="toPage('/pages/login/login')">
+        <wd-button size="small" @click="toPage({ url: '/pages/login/login' })">
           {{ $t('mine.auth.login') }}
         </wd-button>
       </view>
     </view>
-    <wd-icon name="setting" color="#3A444C" size="36rpx" @click="toPage('/pages/mine/setting')" />
+    <wd-icon name="setting" color="#3A444C" size="36rpx" @click="toPage({ url: '/pages/mine/setting' })" />
   </view>
-  <view class="relative rounded-tl-24rpx rounded-tr-24rpx bg-white px-24rpx pb-36rpx pt-32rpx -top-24rpx" @click="toPage('/pages/wallet/myWallet')">
+  <view class="relative rounded-tl-24rpx rounded-tr-24rpx bg-white px-24rpx pb-36rpx pt-32rpx -top-24rpx" @click="toPage({ url: '/pages/wallet/myWallet' })">
     <view class="mb-24rpx text-32rpx">
       {{ $t('mine.wallet.title') }}
     </view>
@@ -177,7 +177,7 @@ onLoad(() => {
           </view>
         </view>
       </view>
-      <view class="flex flex-col items-end" @click.stop="toPage('/pages/wallet/recharge')">
+      <view class="flex flex-col items-end" @click.stop="toPage({ url: '/pages/wallet/recharge' })">
         <wd-button size="small">
           {{ $t('mine.wallet.recharge') }}
         </wd-button>
@@ -189,7 +189,7 @@ onLoad(() => {
       <text class="text-32rpx">
         {{ $t('mine.group.title') }}
       </text>
-      <view class="flex items-center" @click="toPage('/pages/myOrders/myOrders')">
+      <view class="flex items-center" @click="toPage({ url: '/pages/myOrders/myOrders' })">
         <text class="mr-8rpx text-22rpx text-#3A444C">
           {{ $t('mine.group.all') }}
         </text>
@@ -197,7 +197,7 @@ onLoad(() => {
       </view>
     </view>
     <view class="grid grid-cols-4 gap-24rpx">
-      <view v-for="(item, index) in groupList" :key="index" class="flex flex-col items-center" @click="toPage(item.url, { type: item.type })">
+      <view v-for="(item, index) in groupList" :key="index" class="flex flex-col items-center" @click="toPage({ url: item.url, params: { type: item.type } })">
         <wd-badge :model-value="item.type === 3 ? 0 : pendingRedDotsData[item.dotName]" :max="99">
           <wd-img width="48rpx" height="48rpx" :src="item.icon" />
         </wd-badge>

+ 1 - 1
src/pages/mine/myFavorite.vue

@@ -47,7 +47,7 @@ async function queryList(pageNo: number, pageSize: number) {
     <template v-if="dataList.length">
       <view class="px-24rpx py-24rpx">
         <view class="grid grid-cols-2 gap-20rpx">
-          <Product v-for="(item, index) in dataList" :key="index" width="100%" :height="340" :item="item" @item-click="toPage('/pages/productDetail/productDetail', { productId: item.productId })" />
+          <Product v-for="(item, index) in dataList" :key="index" width="100%" :height="340" :item="item" @item-click="toPage({ url: '/pages/productDetail/productDetail', params: { productId: item.productId } })" />
         </view>
       </view>
     </template>

+ 2 - 2
src/pages/mine/setting.vue

@@ -28,7 +28,7 @@ function changeLanguage(data: any) {
 }
 function logout() {
   userStore.removeUserInfo()
-  toPage('/pages/login/login', {}, true)
+  toPage({ url: '/pages/login/login', isReLaunch: true })
 }
 const appInfo = ref<any>({})
 function getAppInfo() {
@@ -46,7 +46,7 @@ onLoad(() => {
 <template>
   <view class="py-20rpx">
     <wd-cell-group custom-class="mb-20rpx" border>
-      <wd-cell :title="$t('setting.changePassword')" custom-title-class="text-32rpx" is-link @click="toPage('/pages/forgotPassword/forgotPassword')" />
+      <wd-cell :title="$t('setting.changePassword')" custom-title-class="text-32rpx" is-link @click="toPage({ url: '/pages/forgotPassword/forgotPassword' })" />
       <wd-picker v-model="language" :columns="columns" use-default-slot @confirm="changeLanguage">
         <wd-cell :title="$t('setting.language')" custom-title-class="text-32rpx" custom-value-class="text-#838383! text-32rpx!" :value="columns.find(item => item.value === language)?.label" is-link />
       </wd-picker>

+ 1 - 1
src/pages/missionCenter/missionCenter.vue

@@ -127,7 +127,7 @@ onLoad(() => {
             </view>
           </view>
         </view>
-        <wd-button size="small" @click="toPage(item.url)">
+        <wd-button size="small" @click="toPage({ url: item.url })">
           {{ $t('missionCenter.dailyMission.startNow') }}
         </wd-button>
       </view>

+ 4 - 5
src/pages/myOrders/myOrders.vue

@@ -16,7 +16,7 @@ import useZPaging from 'z-paging/components/z-paging/js/hooks/useZPaging.js'
 import { orderList, orderStatusEnum } from '@/api/order'
 import { t } from '@/locale'
 import { formatNumber } from '@/utils'
-import { getPageParams, toPage } from '@/utils/page'
+import { toPage } from '@/utils/page'
 
 defineOptions({
   name: 'MyOrders', // 我的订单
@@ -95,10 +95,9 @@ onLoad((options) => {
 
   // 处理页面参数,如果有type参数则切换到对应的tab
   if (options) {
-    const params = getPageParams(options)
-    if (params.type !== undefined) {
+    if (options.type !== undefined) {
       // 确保type值在有效范围内
-      const typeValue = Number(params.type)
+      const typeValue = Number(options.type)
       if (typeValue >= 0 && typeValue <= 4) {
         tab.value = typeValue
       }
@@ -151,7 +150,7 @@ onLoad((options) => {
     <!-- 实际内容 -->
     <template v-else>
       <view class="pt-24rpx">
-        <wd-card v-for="item in dataList" :key="item.orderId" type="rectangle" custom-class="px-24rpx! py-6rpx!" custom-content-class="py-18rpx!" custom-title-class="py-18rpx!" @click="toPage('/pages/myOrders/orderDetail', { id: item.id })">
+        <wd-card v-for="item in dataList" :key="item.orderId" type="rectangle" custom-class="px-24rpx! py-6rpx!" custom-content-class="py-18rpx!" custom-title-class="py-18rpx!" @click="toPage({ url: '/pages/myOrders/orderDetail', params: { id: item.id } })">
           <template #title>
             <view class="flex items-center justify-between">
               <view class="text-28rpx text-#000">

+ 6 - 6
src/pages/myOrders/orderDetail.vue

@@ -16,7 +16,7 @@ import DialogBox from '@/components/DialogBox/DialogBox.vue'
 import { DialogUtils } from '@/components/DialogBox/utils'
 import { t } from '@/locale'
 import { formatNumber } from '@/utils'
-import { getPageParams, toPage } from '@/utils/page'
+import { toPage } from '@/utils/page'
 import { toast } from '@/utils/toast'
 
 defineOptions({
@@ -146,10 +146,10 @@ async function getPink() {
 
 // 跳转到地址簿选择地址
 function selectAddress() {
-  toPage('/pages/mine/addressBook', {
+  toPage({ url: '/pages/mine/addressBook', params: {
     selectMode: true,
     orderId: detail.value?.orderId,
-  })
+  } })
 }
 
 // 显示取消订单确认对话框
@@ -207,7 +207,7 @@ function handleDialogConfirm() {
     goPay()
   }
   else if (dialogType.value === 'recharge') {
-    toPage('/pages/wallet/recharge', { price: detail.value?.payPrice }, true)
+    toPage({ url: '/pages/wallet/recharge', params: { price: detail.value?.payPrice }, isRedirect: true })
   }
   // 关闭对话框
   handleDialogClose()
@@ -281,7 +281,7 @@ function copyDelivery() {
 onLoad(async (options) => {
   getConfig('open_red_envelope_rate')
   getConfig('join_red_envelope_rate')
-  const params = getPageParams(options)
+  const params = options
 
   // 兼容 id 和 orderNo 两种传参方式,优先使用 JSON 参数,其次使用直接参数
   orderNo.value = params.orderNo || options.orderNo
@@ -474,7 +474,7 @@ onUnmounted(() => {
           </template>
         </view>
         <!-- 商品信息 -->
-        <wd-card type="rectangle" custom-class="px-24rpx! py-6rpx!" custom-content-class="py-18rpx!" custom-title-class="py-18rpx!" @click="toPage('/pages/productDetail/productDetail', { productId: detail?.orderInfoVO?.[0].productId })">
+        <wd-card type="rectangle" custom-class="px-24rpx! py-6rpx!" custom-content-class="py-18rpx!" custom-title-class="py-18rpx!" @click="toPage({ url: '/pages/productDetail/productDetail', params: { productId: detail?.orderInfoVO?.[0].productId } })">
           <template #title>
             <view class="flex items-center justify-between">
               <view class="text-28rpx text-#000">

+ 2 - 2
src/pages/notifications/notifications.vue

@@ -195,7 +195,7 @@ function handleNoticeClick(item: any) {
     // OTHER 类型使用 page 字段和 toPage 方法跳转
     const page = item.pages
     if (page) {
-      toPage(page)
+      toPage({ url: page })
     }
   }
   else {
@@ -203,7 +203,7 @@ function handleNoticeClick(item: any) {
     const config = contentTypeMap[item.noticeType]
     const link = config?.link
     if (link) {
-      toPage(link, typeMap.order.includes(item.noticeType) ? { orderNo: item.noticeMessage } : {})
+      toPage({ url: link, params: typeMap.order.includes(item.noticeType) ? { orderNo: item.noticeMessage } : {} })
     }
   }
 }

+ 3 - 4
src/pages/productDetail/checkOut.vue

@@ -13,7 +13,7 @@
 import { computedPrice, createOrder, loadPre } from '@/api/order'
 import { getWalletAccountInfo } from '@/api/wallet'
 import { formatNumber } from '@/utils'
-import { getPageParams, toPage } from '@/utils/page'
+import { toPage } from '@/utils/page'
 
 defineOptions({
   name: 'CheckOut', // 结账页面
@@ -21,8 +21,7 @@ defineOptions({
 
 const queryParams = ref<any>({})
 onLoad((options) => {
-  const params = getPageParams(options)
-  queryParams.value = params
+  queryParams.value = options
   getPrice()
 })
 
@@ -68,7 +67,7 @@ async function handlePlaceOrder() {
     const orderRes = await createOrder(params)
     console.log(orderRes)
     if (orderRes.code === '200') {
-      toPage('/pages/myOrders/orderDetail', { id: orderRes?.data?.columns?.orderId, isPayOrder: true }, true)
+      toPage({ url: '/pages/myOrders/orderDetail', params: { id: orderRes?.data?.columns?.orderId, isPayOrder: true }, isRedirect: true })
     }
   }
   finally {

+ 11 - 11
src/pages/productDetail/productDetail.vue

@@ -18,7 +18,7 @@ import { carousel, getDetail, pinkList } from '@/api/product'
 import { requireLogin } from '@/hooks/usePageAuth'
 import { t } from '@/locale'
 import { formatNumber } from '@/utils/index'
-import { getPageParams, goBack, toPage } from '@/utils/page'
+import { goBack, toPage } from '@/utils/page'
 import { toast } from '@/utils/toast'
 import CustomTooltip from './components/CustomTooltip.vue'
 import NotificationCarousel from './components/NotificationCarousel.vue'
@@ -318,13 +318,15 @@ async function preOrder() {
     if (res.code === '200') {
       showSku.value = false
       toPage(
-        '/pages/productDetail/checkOut',
         {
-          preOrderId: res.data,
-          joinOrderId: joinOrderId.value,
-          pinkId: pinkId.value,
-          cid: detail.value.cid,
-          groupType: groupType.value,
+          url: '/pages/productDetail/checkOut',
+          params: {
+            preOrderId: res.data,
+            joinOrderId: joinOrderId.value,
+            pinkId: pinkId.value,
+            cid: detail.value.cid,
+            groupType: groupType.value,
+          },
         },
       )
     }
@@ -336,9 +338,7 @@ async function preOrder() {
 
 // 商品详情初始化
 onLoad((options) => {
-  console.log(options)
-  const params = getPageParams(options)
-  productId.value = params.productId
+  productId.value = options.productId || ''
 })
 onShow(async () => {
   try {
@@ -512,7 +512,7 @@ onShow(async () => {
               {{ $t('productDetail.groupRules') }}
             </text>
           </view>
-          <view class="flex items-center" @click="toPage('/pages/webLink/webLink', { title: $t('productDetail.viewRules'), link: 'http://' })">
+          <view class="flex items-center" @click="toPage({ url: '/pages/webLink/webLink', params: { title: $t('productDetail.viewRules'), link: 'http://' } })">
             <text class="mr-8rpx text-24rpx text-#3A444C">
               {{ $t('productDetail.viewRules') }}
             </text>

+ 1 - 1
src/pages/referEarn/referEarn.vue

@@ -84,7 +84,7 @@ onLoad(() => {
             </text>
           </view>
         </view>
-        <view class="rounded-full bg-#F9CD96 py-14rpx text-34rpx text-[var(--wot-color-theme)] font-bold shadow-[0_2rpx_8rpx_0_rgba(249,205,150,0.5)]" @click="toPage('/pages/mine/share')">
+        <view class="rounded-full bg-#F9CD96 py-14rpx text-34rpx text-[var(--wot-color-theme)] font-bold shadow-[0_2rpx_8rpx_0_rgba(249,205,150,0.5)]" @click="toPage({ url: '/pages/mine/share' })">
           {{ $t('referEarn.shareNow') }}
         </view>
       </view>

+ 2 - 2
src/pages/register/register.vue

@@ -118,7 +118,7 @@ async function handleRegister() {
     // 注册成功
     toast.success(t('auth.register.success.registered'))
     setTimeout(() => {
-      toPage('/pages/login/login', { redirect: '/pages/index/index' }, true)
+      toPage({ url: '/pages/login/login', params: { redirect: '/pages/index/index' }, isRedirect: true })
     }, 1500)
   }
   catch (error) {
@@ -280,7 +280,7 @@ onUnmounted(() => {
         <text class="text-28rpx text-#5C5C5C">
           {{ $t('auth.register.hasAccount') }}
         </text>
-        <text class="ml-10rpx text-28rpx text-[var(--wot-color-theme)]" @click="toPage('/pages/login/login')">
+        <text class="ml-10rpx text-28rpx text-[var(--wot-color-theme)]" @click="toPage({ url: '/pages/login/login' })">
           {{ $t('auth.register.loginNow') }}
         </text>
       </view>

+ 1 - 1
src/pages/search/search.vue

@@ -150,7 +150,7 @@ onLoad(() => {
           width="100%"
           :height="340"
           :item="item"
-          @item-click="toPage('/pages/productDetail/productDetail', { productId: item.productId })"
+          @item-click="toPage({ url: '/pages/productDetail/productDetail', params: { productId: item.productId } })"
         />
       </view>
     </view>

+ 4 - 4
src/pages/wallet/myWallet.vue

@@ -74,13 +74,13 @@ function handleDialogClose() {
 function handleDialogConfirm() {
   //  继续充值
   handleDialogClose()
-  toPage('/pages/wallet/rechargeRecord')
+  toPage({ url: '/pages/wallet/rechargeRecord' })
   // 关闭对话框
 }
 function handleDialogCancel() {
   //  新充值
   handleDialogClose()
-  toPage('/pages/wallet/recharge')
+  toPage({ url: '/pages/wallet/recharge' })
 }
 // 查询未完成的充值订单
 async function getUnpaidOrder() {
@@ -131,13 +131,13 @@ onShow(() => {
           </view>
         </view>
         <view class="flex flex-col items-end">
-          <wd-button size="small" @click="toPage('/pages/wallet/recharge')">
+          <wd-button size="small" @click="toPage({ url: '/pages/wallet/recharge' })">
             {{ $t('wallet.recharge') }}
           </wd-button>
         </view>
       </view>
       <view class="mb-20rpx flex justify-center">
-        <view class="flex items-center justify-center" @click="toPage('/pages/wallet/withdraw', { balance: walletInfo.balance, type: 1 })">
+        <view class="flex items-center justify-center" @click="toPage({ url: '/pages/wallet/withdraw', params: { balance: walletInfo.balance, type: 1 } })">
           <text class="mr-8rpx">
             {{ $t('wallet.withdrawNow') }}
           </text>

+ 4 - 5
src/pages/wallet/recharge.vue

@@ -23,7 +23,7 @@
 import { paymentMethod, rechargeAdd, rechargeGoodsList } from '@/api/wallet'
 import { t } from '@/locale'
 import { formatNumber } from '@/utils'
-import { getPageParams, toPage } from '@/utils/page'
+import { toPage } from '@/utils/page'
 import { toast } from '@/utils/toast'
 
 defineOptions({
@@ -46,7 +46,7 @@ const methodIconMap = {
 // 触发确定按钮
 onNavigationBarButtonTap((event: any) => {
   if (event.text === t('wallet.recharge.record')) {
-    toPage('/pages/wallet/rechargeRecord')
+    toPage({ url: '/pages/wallet/rechargeRecord' })
   }
 })
 const methodList = ref<any[]>([])
@@ -106,7 +106,7 @@ async function submit() {
   try {
     const addRes = await rechargeAdd({ amount, methodId: selectData.value.methodId })
     if (addRes.code === '200') {
-      toPage('/pages/webLink/webLink', { link: addRes.data.payUrl, title: t('wallet.recharge.title') }, true)
+      toPage({ url: '/pages/webLink/webLink', params: { link: addRes.data.payUrl, title: t('wallet.recharge.title') }, isRedirect: true })
     }
   }
   finally {
@@ -118,8 +118,7 @@ onShow(() => {
   getMethodList()
 })
 onLoad((options) => {
-  const params = getPageParams(options)
-  orderPrice.value = params.price || 0
+  orderPrice.value = options.price || 0
 })
 
 // 监听自定义金额变化

+ 3 - 3
src/pages/wallet/withdraw.vue

@@ -14,7 +14,7 @@ import { withdrawAdd } from '@/api/wallet'
 import { t } from '@/locale'
 import { useUserStore } from '@/store'
 import { formatNumber } from '@/utils'
-import { getPageParams, goBack, toPage } from '@/utils/page'
+import { goBack, toPage } from '@/utils/page'
 import { toast } from '@/utils/toast'
 
 defineOptions({
@@ -88,7 +88,7 @@ async function getConfig() {
 
 onLoad((options) => {
   getConfig()
-  queryParams.value = getPageParams(options)
+  queryParams.value = options
 })
 </script>
 
@@ -104,7 +104,7 @@ onLoad((options) => {
         <wd-icon name="thin-arrow-left" size="32rpx" @click="() => goBack()" />
       </template>
       <template #right>
-        <text class="text-28rpx" @click="toPage('/pages/wallet/withdrawRecord', { type: queryParams.type })">
+        <text class="text-28rpx" @click="toPage({ url: '/pages/wallet/withdrawRecord', params: { type: queryParams.type } })">
           {{ $t('wallet.withdraw.record') }}
         </text>
       </template>

+ 1 - 2
src/pages/wallet/withdrawRecord.vue

@@ -16,7 +16,6 @@ import useZPaging from 'z-paging/components/z-paging/js/hooks/useZPaging.js'
 import { getEnum as _getEnum } from '@/api/common'
 import { withdrawRecordList } from '@/api/wallet'
 import { formatNumber } from '@/utils'
-import { getPageParams } from '@/utils/page'
 
 defineOptions({
   name: 'WithdrawRecord', // 充值记录
@@ -48,7 +47,7 @@ async function queryList(pageNo: number, pageSize: number) {
   }
 }
 onLoad((options) => {
-  queryParams.value = getPageParams(options)
+  queryParams.value = options
   getEnum()
 })
 </script>

+ 1 - 2
src/pages/webLink/webLink.vue

@@ -11,12 +11,11 @@
 
 <script setup>
 import { t } from '@/locale'
-import { getPageParams } from '@/utils/page'
 
 const params = ref({})
 
 onLoad((options) => {
-  params.value = getPageParams(options)
+  params.value = options
   uni.setNavigationBarTitle({
     title: params.value.title || t('webLink.title'),
   })

+ 1 - 1
src/store/user.ts

@@ -71,7 +71,7 @@ export const useUserStore = defineStore(
         setTimeout(() => {
           if (redirectUrl) {
             // 使用 toPage 方法,自动判断是否为 tabBar 页面
-            toPage(decodeURIComponent(redirectUrl), {}, true)
+            toPage({ url: decodeURIComponent(redirectUrl), isRedirect: true })
           }
           else {
             // 默认跳转到首页

+ 1 - 1
src/utils/http.ts

@@ -21,7 +21,7 @@ export function http<T>(options: CustomRequestOptions) {
           }
           else if (res.data.code === '598') {
             toast.error((res.data as IResData<T>).message)
-            toPage('/pages/login/login')
+            toPage({ url: '/pages/login/login' })
           }
           else {
             toast.error((res.data as IResData<T>).message || '请求错误')

+ 10 - 18
src/utils/page.ts

@@ -1,4 +1,5 @@
 import { CUSTOM_TABBAR_NO_CACHE } from '@/layouts/fg-tabbar/tabbarList'
+import { stringifyQuery } from './queryString'
 
 //  uniapp 返回 入参为堆栈
 export function goBack(delta = 1) {
@@ -8,15 +9,15 @@ export function goBack(delta = 1) {
 }
 
 // uniapp 跳转页面 可携带参数
-// 示例: toPage('/pages/productDetail/productDetail', { id: 123 })
-export function toPage(url: string, params?: Record<string, any>, isRedirect = false) {
+export function toPage({ url, params, isRedirect = false, isReLaunch = false }: any) {
   let targetUrl = url
   const tabBarPages = ['/pages/index/index', '/pages/income/income', '/pages/mine/mine']
 
   if (params && Object.keys(params).length > 0) {
-    const data = JSON.stringify(params)
-    targetUrl = `${url}?params=${encodeURIComponent(data)}`
+    const strParams = stringifyQuery(params)
+    targetUrl = `${url}?${strParams}`
   }
+  console.log(targetUrl)
   if (tabBarPages.includes(url)) {
     if (CUSTOM_TABBAR_NO_CACHE) {
       uni.navigateTo({ url: targetUrl })
@@ -33,6 +34,11 @@ export function toPage(url: string, params?: Record<string, any>, isRedirect = f
         url: targetUrl,
       })
     }
+    else if (isReLaunch) {
+      uni.reLaunch({
+        url: targetUrl,
+      })
+    }
     else {
       uni.navigateTo({
         url: targetUrl,
@@ -40,17 +46,3 @@ export function toPage(url: string, params?: Record<string, any>, isRedirect = f
     }
   }
 }
-
-// page参数解析方法
-export function getPageParams(options: any) {
-  if (options && options.params) {
-    try {
-      return JSON.parse(decodeURIComponent(options.params))
-    }
-    catch (e) {
-      console.error('解析页面参数失败:', e)
-      return {}
-    }
-  }
-  return {}
-}