浏览代码

feat:修改首页

st 2 月之前
父节点
当前提交
9de2cb21ec

+ 15 - 1
src/pages/index/index.vue

@@ -404,9 +404,10 @@ onShow(async () => {
   await refreshGameState()
   nextTick(() => {
     initLott()
-    value1.value = uni.getStorageSync('lang') ?? 'en'
+    tLang()
   })
 })
+
 onHide(() => {
   if (addStarTimer) {
     clearInterval(addStarTimer)
@@ -422,6 +423,19 @@ const goPage = async (url: string) => {
 }
 // 语言
 const value1 = ref('en')
+const tLang = () => {
+  nextTick(() => {
+    if (uni.getStorageSync('lang') === '') {
+      value1.value = 'en'
+    } else {
+      for (let i = 0; i < languages.length; i++) {
+        if (languages[i].value === uni.getStorageSync('lang')) {
+          value1.value = languages[i].value
+        }
+      }
+    }
+  })
+}
 const languages = [
   { value: 'en', label: 'English' },
   { value: 'vi', label: 'Tiếng Việt' },

+ 8 - 6
src/pages/play/game.vue

@@ -472,10 +472,7 @@ onUnmounted(() => {
         >
           <text
             class="text-3xl tracking-wider"
-            style="
-              font-family: 'Comic Sans MS', cursive, sans-serif;
-              text-shadow: 2px 2px 4px #000000;
-            "
+            style="font-family: cursive, sans-serif; text-shadow: 2px 2px 4px #000000"
           >
             START
           </text>
@@ -584,7 +581,11 @@ onUnmounted(() => {
           </text>
           <text
             class="text-white text-[40rpx] font-bold tracking-wider"
-            style="font-family: 'Impact', sans-serif"
+            style="
+              font-family: 'Impact', sans-serif;
+              text-shadow: '2px 2px 4px #000000';
+              font-size: 60rpx;
+            "
           >
             COMBO
           </text>
@@ -602,7 +603,7 @@ onUnmounted(() => {
             style="
               font-family: 'Comic Sans MS', cursive, sans-serif;
               text-shadow: '2px 2px 4px #000000';
-              font-size: 36rpx;
+              font-size: 60rpx;
             "
           >
             MISS!
@@ -618,6 +619,7 @@ onUnmounted(() => {
           style="
             font-family: 'Comic Sans MS', cursive, sans-serif;
             text-shadow: '2px 2px 4px #000000';
+            font-size: 60rpx;
           "
         >
           Good!

+ 27 - 16
src/pages/purse/index.vue

@@ -13,10 +13,10 @@
       class="w-690rpx h-710rpx absolute top-30rpx"
     ></image>
     <view class="w-690rpx flex z-1 mt-50rpx flex-col items-center">
-      <text class="w-630rpx text-32rpx font-700 text-white ml-40rpx">Total amount of tokens</text>
+      <text class="w-630rpx text-32rpx font-700 text-white ml-40rpx">{{ $t('purse.tokens') }}</text>
       <view class="w-630rpx flex items-center ml-40rpx mt-40rpx">
         <image src="@/static/images/trophy/jinbi.png" class="w-70rpx h-70rpx mr-20rpx"></image>
-        <text class="text-56rpx font-700 text-white">219.45K</text>
+        <text class="text-56rpx font-700 text-white">{{ walletInfo.totalBalance }}</text>
       </view>
       <view class="w-630rpx h-1rpx bg-#3D537C mt-50rpx"></view>
       <view class="w-630rpx flex flex-wrap items-center justify-between mt-30rpx">
@@ -25,8 +25,8 @@
         >
           <image src="@/static/images/purse/1.png" class="w-45rpx h-52rpx mr-20rpx"></image>
           <view class="flex flex-col text-white w-182rpx">
-            <text class="text-24rpx font-400">Total proft per hour</text>
-            <text class="text-24rpx font-700 mt-5rpx">125.78K</text>
+            <text class="text-24rpx font-400">{{ $t('purse.Total') }}</text>
+            <text class="text-24rpx font-700 mt-5rpx">{{ walletInfo.profitPerHour }}</text>
           </view>
         </view>
         <view
@@ -34,8 +34,10 @@
         >
           <image src="@/static/images/purse/2.png" class="w-45rpx h-52rpx mr-20rpx"></image>
           <view class="flex flex-col text-white w-182rpx">
-            <text class="text-24rpx font-400">Profit per hour</text>
-            <text class="text-24rpx font-700 mt-5rpx">125.78K</text>
+            <text class="text-24rpx font-400">{{ $t('purse.hour') }}</text>
+            <text class="text-24rpx font-700 mt-5rpx">
+              {{ walletInfo.profitPerHour }} GT Coin/H
+            </text>
           </view>
         </view>
         <view
@@ -43,8 +45,8 @@
         >
           <image src="@/static/images/purse/3.png" class="w-45rpx h-52rpx mr-20rpx"></image>
           <view class="flex flex-col text-white w-182rpx">
-            <text class="text-24rpx font-400">Task reward</text>
-            <text class="text-24rpx font-700 mt-5rpx">125.78K</text>
+            <text class="text-24rpx font-400">{{ $t('purse.reward') }}</text>
+            <text class="text-24rpx font-700 mt-5rpx">{{ walletInfo.taskRewards }}</text>
           </view>
         </view>
         <view
@@ -52,8 +54,8 @@
         >
           <image src="@/static/images/purse/4.png" class="w-45rpx h-52rpx mr-20rpx"></image>
           <view class="flex flex-col text-white w-182rpx">
-            <text class="text-24rpx font-400">Team Sharing</text>
-            <text class="text-24rpx font-700 mt-5rpx">125.78K</text>
+            <text class="text-24rpx font-400">{{ $t('purse.TeamSharing') }}</text>
+            <text class="text-24rpx font-700 mt-5rpx">{{ walletInfo.shareRewards }}</text>
           </view>
         </view>
         <view
@@ -61,8 +63,8 @@
         >
           <image src="@/static/images/purse/5.png" class="w-45rpx h-52rpx mr-20rpx"></image>
           <view class="flex flex-col text-white w-182rpx">
-            <text class="text-24rpx font-400">Share rewards</text>
-            <text class="text-24rpx font-700 mt-5rpx">125.78K</text>
+            <text class="text-24rpx font-400">{{ $t('purse.ShareRewards') }}</text>
+            <text class="text-24rpx font-700 mt-5rpx">{{ walletInfo.shareRewards }}</text>
           </view>
         </view>
         <view
@@ -70,8 +72,8 @@
         >
           <image src="@/static/images/purse/6.png" class="w-45rpx h-52rpx mr-20rpx"></image>
           <view class="flex flex-col text-white w-182rpx">
-            <text class="text-24rpx font-400">Resource placement</text>
-            <text class="text-24rpx font-700 mt-5rpx">125.78K</text>
+            <text class="text-24rpx font-400">{{ $t('purse.placement') }}</text>
+            <text class="text-24rpx font-700 mt-5rpx">{{ walletInfo.resourcePlacement }}</text>
           </view>
         </view>
       </view>
@@ -85,7 +87,7 @@
       >
         <view class="flex items-center ml-20rpx">
           <image src="@/static/images/purse/u.png" class="w-70rpx h-70rpx mr-29rpx"></image>
-          <text class="text-42rpx text-[#fff] fw-550">11</text>
+          <text class="text-42rpx text-[#fff] fw-550">{{ walletInfo.moneyBalance }}</text>
         </view>
         <view
           class="fw-550 w-230rpx h-70rpx bg-[#999999] flex justify-center rounded-10rpx items-center text-white relative mr-10rpx"
@@ -105,7 +107,7 @@
       >
         <view class="flex items-center ml-20rpx">
           <image src="@/static/images/trophy/jinbi.png" class="w-70rpx h-70rpx mr-29rpx"></image>
-          <text class="text-42rpx text-[#fff] fw-550">11</text>
+          <text class="text-42rpx text-[#fff] fw-550">{{ walletInfo.availableBalance }}</text>
         </view>
         <view
           class="fw-550 w-230rpx h-70rpx bg-[#999999] flex justify-center rounded-10rpx items-center text-white relative mr-10rpx"
@@ -124,12 +126,21 @@
 
 <script setup lang="ts">
 import { useTelegramBackButton } from '@/hooks/useTelegramBackButton'
+import { FinancialInfo, getWalletInfo } from '@/service/purse'
 
 useTelegramBackButton(() => {
   uni.switchTab({
     url: '/pages/index/index',
   })
 })
+const walletInfo = ref<FinancialInfo>({} as FinancialInfo)
+const getWalletInfoFn = async () => {
+  const { data } = await getWalletInfo()
+  walletInfo.value = data
+}
+onShow(async () => {
+  await getWalletInfoFn()
+})
 </script>
 
 <style scoped></style>

+ 236 - 49
src/pages/team/index.vue

@@ -48,12 +48,12 @@
               class="w-40rpx h-30rpx mr-10rpx"
               mode="scaleToFill"
             />
-            <text class="">2</text>
+            <text class="">{{ teamInfo.total }}</text>
           </view>
         </view>
         <view class="w-320rpx h-120rpx text-primary flex flex-col items-center">
           <view
-            @click="receiveshow = true"
+            @click="getRewards"
             class="w-160rpx h-60rpx bg-primary text-26rpx font-700 text-textc rounded-20rpx flex items-center justify-center"
           >
             {{ $t('team.Reward') }}
@@ -64,7 +64,7 @@
               class="w-23rpx h-30rpx mr-18.5rpx"
               mode="scaleToFill"
             />
-            <text class="">2</text>
+            <text class="">{{ teamInfo.rewardsTotal }}</text>
           </view>
         </view>
       </view>
@@ -85,7 +85,7 @@
                 mode="scaleToFill"
                 class="w-30rpx h-30rpx"
               />
-              <text class="ml-10rpx text-[24rpx]">11</text>
+              <text class="ml-10rpx text-[24rpx]">{{ teamInfo.claimableAmountA }}</text>
             </view>
             <view class="ml-20rpx flex items-center">
               <image
@@ -93,13 +93,15 @@
                 mode="scaleToFill"
                 class="w-30rpx h-22rpx"
               />
-              <text class="ml-10rpx text-[24rpx] font-700">11</text>
+              <text class="ml-10rpx text-[24rpx] font-700">
+                {{ teamInfo.teamACount }}
+              </text>
             </view>
           </view>
         </view>
         <view class="w-160rpx h-60rpx flex flex-col justify-center items-center mr-20rpx">
           <view
-            @click="abShow = true"
+            @click="openAbShow('A')"
             class="w-full h-full text-textc bg-primary rounded-10rpx flex items-center justify-center"
           >
             <text class="text-[26rpx] fw-700">{{ $t('team.GetIt') }}</text>
@@ -123,7 +125,7 @@
                 mode="scaleToFill"
                 class="w-30rpx h-30rpx"
               />
-              <text class="ml-10rpx text-[24rpx]">11</text>
+              <text class="ml-10rpx text-[24rpx]">{{ teamInfo.claimableRewardsB }}</text>
             </view>
             <view class="ml-20rpx flex items-center">
               <image
@@ -131,12 +133,15 @@
                 mode="scaleToFill"
                 class="w-30rpx h-22rpx"
               />
-              <text class="ml-10rpx text-[24rpx] font-700">11</text>
+              <text class="ml-10rpx text-[24rpx] font-700">
+                {{ teamInfo.teamBCount }}
+              </text>
             </view>
           </view>
         </view>
         <view class="w-160rpx h-60rpx flex flex-col justify-center items-center mr-20rpx">
           <view
+            @click="openAbShow('B')"
             class="w-full h-full text-textc bg-primary rounded-10rpx flex items-center justify-center"
           >
             <text class="text-[26rpx] fw-700">{{ $t('team.GetIt') }}</text>
@@ -150,7 +155,7 @@
           <text class="text-[32rpx] fw-700 mb-10rpx">{{ $t('team.Invite') }}</text>
           <text class="text-[24rpx] font-400">{{ $t('team.will') }}</text>
         </view>
-        <view class="flex flex-col justify-center" @click="lianjieShow = true">
+        <view class="flex flex-col justify-center" @click="openShareCode">
           <view
             class="w-160rpx h-60rpx text-textc bg-primary rounded-10rpx flex items-center justify-center mr-20rpx"
           >
@@ -160,17 +165,20 @@
       </view>
     </view>
     <scroll-view
+      v-if="ruleData?.inviteRewardsRuleList"
       scroll-x
       :scroll-anchoring="true"
       :enhanced="true"
       :show-scrollbar="false"
       class="custom-scroll-view w-690rpx overflow-x-auto whitespace-nowrap mb-140rpx"
+      @touchstart="handleTouchStart"
+      @touchmove="handleTouchMove"
+      @touchend="handleTouchEnd"
     >
       <view class="inline-flex">
         <view
-          @click="lingquShow = true"
           class="w-690rpx h-200rpx bg-cardlight flex items-center rounded-20rpx mr-20rpx"
-          v-for="(item, index) in 1"
+          v-for="(item, index) in ruleData?.inviteRewardsRuleList"
           :key="index"
         >
           <view class="flex w-100% items-center">
@@ -182,20 +190,30 @@
                     mode="scaleToFill"
                     class="w-70rpx h-70rpx"
                   />
-                  <text class="ml-10rpx text-[50rpx] fw-700">+1000</text>
+                  <text class="ml-10rpx text-[50rpx] fw-700">+{{ item.goldCoinNum }}</text>
                 </view>
-                <text class="text-[28rpx] fw-700">Inviting 2 friends can earn</text>
+                <text class="text-[28rpx] fw-700">{{ item.rewardsDescribe }}</text>
               </view>
               <view class="flex">
                 <view class="w-75% c-bg">
-                  <wd-progress :percentage="10" color="primary" hide-text :duration="0.1" />
+                  <wd-progress
+                    :percentage="item.percentage"
+                    color="primary"
+                    hide-text
+                    :duration="0.1"
+                  />
                 </view>
                 <view class="text-[28rpx] flex flex-col justify-center ml-10rpx">
-                  <text>1/2</text>
+                  <text>
+                    {{
+                      ruleData.inviteNum > item.inviteNum ? item.inviteNum : ruleData.inviteNum
+                    }}/{{ item.inviteNum }}
+                  </text>
                 </view>
               </view>
             </view>
             <view
+              @click="lingquShowFn(item)"
               class="mr-40rpx flex flex-col justify-center w-160rpx h-100rpx items-center rounded-10rpx bg-primary"
             >
               <text class="text-32rpx font-700">{{ $t('team.GetIt') }}</text>
@@ -220,20 +238,20 @@
   <Dialog v-model:show-value="receiveshow" width="690rpx" height="686rpx">
     <view class="w-full flex flex-col items-center">
       <view class="w-630rpx flex items-center justify-between mt-90rpx">
-        <text class="text-36rpx font-700 text-white">NewComer List</text>
+        <text class="text-36rpx font-700 text-white">{{ $t('team.NewComerList') }}</text>
         <view class="flex items-center">
           <image
             src="@/static/images/team/cat.png"
             class="w-23rpx h-30rpx mr-10rpx"
             mode="scaleToFill"
           />
-          <text class="text-primary text-28rpx font-700">2</text>
+          <text class="text-primary text-28rpx font-700">{{ rewards.length }}</text>
         </view>
       </view>
       <view class="w-630rpx bg-cards rounded-20rpx flex items-center h-194rpx mt-30rpx">
-        <scroll-view :scroll-y="true" :show-scrollbar="false">
+        <scroll-view v-if="rewards.length > 0" :scroll-y="true" :show-scrollbar="false">
           <view
-            v-for="(item, index) in 10"
+            v-for="(item, index) in rewards"
             :key="index"
             class="text-[#fff] flex flex-col justify-center w-full items-center"
           >
@@ -252,23 +270,25 @@
             </view>
           </view>
         </scroll-view>
-        <!--        <view class="flex flex-col justify-center text-center w-100% h-100% text-[#fff]">-->
-        <!--          <text>{{ $t('team.noData') }}</text>-->
-        <!--        </view>-->
+        <view v-else class="flex flex-col justify-center text-center w-100% h-100% text-[#fff]">
+          <text>{{ $t('team.noData') }}</text>
+        </view>
       </view>
       <view
+        @click="claimTeamInviteRewardFn"
         class="w-630rpx bg-primary h-100rpx flex items-center justify-center rounded-20rpx mt-30rpx"
       >
-        <text class="text-28rpx font-700 text-textc">Receive all</text>
+        <text class="text-28rpx font-700 text-textc">{{ $t('team.ReceiveAll') }}</text>
       </view>
       <view class="w-630rpx bg-cards rounded-20rpx flex items-center h-100rpx mt-30rpx">
         <text class="text-24rpx font-400 text-white flex-1 ml-30rpx">
-          You will get rewards for every invitation!
+          {{ $t('team.will') }}
         </text>
         <view
+          @click="openShareCode"
           class="w-70rpx h-70rpx rounded-20rpx bg-primary flex items-center justify-center mr-20rpx"
         >
-          <text class="text-26rpx font-700 text-textc">Go</text>
+          <text class="text-26rpx font-700 text-textc">{{ $t('play.Go') }}</text>
         </view>
       </view>
     </view>
@@ -288,9 +308,10 @@
       <view
         class="w-238rpx flex items-center fw-550 justify-between h-50rpx text-primary text-50rpx mt-38rpx"
       >
-        <text v-for="item in 'abcde'" :key="item">{{ item }}</text>
+        <text v-for="item in shareCode" :key="item">{{ item }}</text>
       </view>
       <view
+        @click="copyShareUrl"
         class="w-214rpx h-60rpx rounded-30rpx bg-primary flex items-center justify-center mt-54rpx"
       >
         <image src="@/static/images/team/copy.png" class="w-26rpx h-26rpx mr-10rpx"></image>
@@ -312,40 +333,56 @@
               src="@/static/images/team/teamcathui.png"
               class="w-40rpx h-40rpx mr-10rpx"
             ></image>
-            <text class="text-28rpx font-400">Total</text>
+            <text class="text-28rpx font-400">{{ $t('team.Total') }}</text>
           </view>
-          <text class="text-white font-24rpx font-400">1</text>
+          <text class="text-white font-24rpx font-400">
+            {{ abType === 'A' ? teamInfo.claimableRewardsA : teamInfo.claimableRewardsB }}
+          </text>
         </view>
         <image src="@/static/images/team/a.png" class="w-100rpx h-100rpx"></image>
         <view class="w-215rpx h-100rpx flex flex-col items-center justify-between">
-          <text class="text-28rpx font-400">Commission</text>
-          <text class="text-white font-24rpx font-400">2%</text>
+          <text class="text-28rpx font-400">{{ $t('team.Commission') }}</text>
+          <text class="text-white font-24rpx font-400">
+            {{ abType === 'A' ? '2%' : '0.2%' }}
+          </text>
         </view>
       </view>
       <view
+        @click="claimTeamShareRewardFn"
         class="w-630rpx h-100rpx bg-cards rounded-20rpx flex items-center justify-center mt-30rpx"
       >
         <image src="@/static/images/team/jinbi.png" class="w-40rpx h-40rpx mr-10rpx"></image>
-        <text class="text-28rpx font-700 text-primary">2</text>
+        <text class="text-28rpx font-700 text-primary">
+          {{ teamAOBData?.total ?? 0 }}
+        </text>
       </view>
       <view
         class="w-630rpx h-60rpx flex items-center mt-30rpx justify-between text-26rpx font-400 text-white"
       >
-        <text>Total Team Production</text>
-        <text>0 BH Coin</text>
+        <text>{{ $t('team.TotalTeamProduction') }}</text>
+        <text>{{ teamAOBData?.total ?? 0 }}</text>
       </view>
       <view class="w-630rpx h-1rpx bg-cards"></view>
       <view class="w-630rpx">
-        <scroll-view class="h-200rpx" :scroll-y="true" :show-scrollbar="false">
-          <view v-for="(item, index) in 5" :key="index" class="flex justify-between mt-40rpx">
+        <scroll-view
+          v-if="teamAOBData?.users"
+          class="h-200rpx"
+          :scroll-y="true"
+          :show-scrollbar="false"
+        >
+          <view
+            v-for="(item, index) in teamAOBData.users"
+            :key="index"
+            class="flex justify-between mt-40rpx"
+          >
             <view class="flex">
               <image
-                src="@/static/images/trophy/avatar.png"
+                :src="item.avatar"
                 class="w-90rpx h-90rpx rounded-100rpx mr-10rpx flex flex-col justify-center text-center"
               ></image>
               <view class="text-[#fff] ml-15rpx">
                 <view>
-                  <text class="mr-10rpx text-26rpx font-700">123123</text>
+                  <text class="mr-10rpx text-26rpx font-700">{{ item.tgAccount }}</text>
                   <image
                     src="@/static/images/team/fj.png"
                     mode="scaleToFill"
@@ -364,7 +401,7 @@
             </view>
             <view class="text-[#fff] flex flex-col justify-center">
               <view class="flex text-[24rpx] font-400">
-                <text>111</text>
+                <text>{{ item.userYieldTotal }}</text>
                 <image
                   src="@/static/images/trophy/jinbi.png"
                   mode="scaleToFill"
@@ -375,12 +412,12 @@
           </view>
         </scroll-view>
 
-        <!--      <view-->
-        <!--        v-else-->
-        <!--        class="flex flex-col justify-center text-center w-100% h-100% text-[#fff] mt-50rpx"-->
-        <!--      >-->
-        <!--        <text>{{ $t('team.noData') }}</text>-->
-        <!--      </view>-->
+        <view
+          v-else
+          class="flex flex-col justify-center text-center w-100% h-100% text-[#fff] mt-50rpx"
+        >
+          <text>{{ $t('team.noData') }}</text>
+        </view>
       </view>
     </view>
   </Dialog>
@@ -390,19 +427,20 @@
         <image src="@/static/images/team/teamcat.png" mode="scaleToFill" class="w-82rpx h-62rpx" />
       </view>
       <view class="w-630rpx flex items-center justify-center mt-30rpx">
-        <text class="text-36rpx font-700 text-white">Invite 1 friends</text>
+        <text class="text-36rpx font-700 text-white">{{ currentLingquData.rewardsDescribe }}</text>
       </view>
       <view class="w-630rpx flex items-center justify-center mt-30rpx">
         <text class="text-26rpx font-400 text-white">
           Unlock
-          <text class="text-primary">10,000</text>
-          BH Coin when you reach this level.
+          <text class="text-primary">{{ currentLingquData.goldCoinNum }}</text>
+          {{ $t('production.rewards.TapCoins') }}
         </text>
       </view>
       <view
+        @click="claim"
         class="w-630rpx bg-primary h-100rpx flex items-center justify-center rounded-20rpx mt-30rpx"
       >
-        <text class="text-28rpx font-700 text-textc">Claim</text>
+        <text class="text-28rpx font-700 text-textc">{{ $t('production.rewards.Claim') }}</text>
       </view>
     </view>
   </Dialog>
@@ -482,7 +520,27 @@
 import tabbar from '@/components/TabBar/index.vue'
 import Dialog from '@/components/common/Dialog/index.vue'
 import { shareToTelegram, TelegramLinkBuilder } from '@/utils/temlgram'
+import {
+  claimTeamInviteReward,
+  claimTeamInviteTaskReward,
+  claimTeamShareReward,
+  getMyTeamsInfo,
+  getShareCode,
+  getTeamInviteRewardsList,
+  getTeamInviteRewardsRules,
+  getTeamShareUserListByType,
+  TeamAOB,
+  TeamInfo,
+  TeamInviteRewardsRule,
+  TeamInviteRewardsRules,
+} from '@/service/team'
+import useClipboard from 'vue-clipboard3'
+import { useNotify } from 'wot-design-uni'
+import WebApp from '@twa-dev/sdk'
+import i18n from '@/locale'
 
+const { toClipboard } = useClipboard()
+const { showNotify, closeNotify } = useNotify()
 const receiveshow = ref(false)
 const lianjieShow = ref(false)
 const abShow = ref(false)
@@ -491,11 +549,140 @@ const errorModel = ref(false)
 
 const bot = new TelegramLinkBuilder(import.meta.env.VITE_TELEGRAM_BOOTNAME)
 const getSimpleLink = () => {
-  return bot.generateShareLink(`rp_${12345}`)
+  return bot.generateShareLink(`rp_${shareCode.value}`)
 }
 const shareUrl = () => {
   shareToTelegram(getSimpleLink(), '')
 }
+const teamInfo = ref<TeamInfo>({} as TeamInfo)
+const getMyTeamsInfoFn = async () => {
+  const { data } = await getMyTeamsInfo()
+  teamInfo.value = data
+}
+const shareCode = ref('')
+
+// 获取分享码信息
+const getShareCodeFn = async () => {
+  const { data } = await getShareCode()
+  shareCode.value = data
+}
+const openShareCode = () => {
+  receiveshow.value = false
+  lianjieShow.value = true
+}
+const copyShareUrl = async () => {
+  try {
+    await toClipboard(getSimpleLink())
+    showNotify({ type: 'success', message: 'success' })
+  } catch (e) {
+    showNotify({ type: 'warning', message: 'warning' })
+  }
+}
+// 固定奖励列表
+const rewards = ref<TeamInfo[]>([])
+const getRewards = async () => {
+  const { data } = await getTeamInviteRewardsList()
+  rewards.value = data
+  receiveshow.value = true
+}
+
+const claimTeamInviteRewardFn = async () => {
+  const { code, msg } = await claimTeamInviteReward()
+  if (code === 0) {
+    showNotify({ type: 'success', message: msg })
+  } else {
+    showNotify({ type: 'warning', message: msg })
+  }
+}
+// ab
+const abType = ref<'A' | 'B'>('A')
+const teamAOBData = ref<TeamAOB>({} as TeamAOB)
+const openAbShow = async (type: 'A' | 'B') => {
+  abType.value = type
+  const { data } = await getTeamShareUserListByType(type)
+  teamAOBData.value = data
+  abShow.value = true
+}
+const claimTeamShareRewardFn = async () => {
+  const { code, msg } = await claimTeamShareReward(abType.value)
+  if (code === 0) {
+    showNotify({ type: 'success', message: msg })
+  } else {
+    showNotify({ type: 'warning', message: msg })
+  }
+}
+// 阶段奖励
+const ruleData = ref<TeamInviteRewardsRule>({} as TeamInviteRewardsRule)
+const getTeamInviteRewardsListFn = async () => {
+  const { data } = await getTeamInviteRewardsRules()
+  ruleData.value = data
+  ruleData.value.inviteRewardsRuleList.forEach((item) => {
+    item.rewardsDescribe = i18n.global.t('production.rewards.yaoqinghaoyou', {
+      index: item.inviteNum,
+    })
+    item.percentage = (ruleData.value.inviteNum / item.inviteNum) * 100
+  })
+}
+const currentLingquData = ref<TeamInviteRewardsRules>({} as TeamInviteRewardsRules)
+const lingquShowFn = (item: TeamInviteRewardsRules) => {
+  if (ruleData.value.inviteNum >= item.inviteNum) {
+    currentLingquData.value = item
+    lingquShow.value = true
+  }
+}
+const claim = async () => {
+  const { code, msg } = await claimTeamInviteTaskReward(currentLingquData.value.id)
+  if (code === 0) {
+    showNotify({ type: 'success', message: msg })
+  } else {
+    showNotify({ type: 'warning', message: msg })
+  }
+  lianjieShow.value = false
+}
+// 处理滑动
+onShow(() => {
+  if (WebApp) {
+    // 禁用垂直滑动
+    WebApp.disableVerticalSwipes()
+  }
+})
+
+// 在组件卸载时恢复垂直滑动
+onHide(() => {
+  if (WebApp) {
+    // 恢复垂直滑动
+    WebApp.enableVerticalSwipes()
+  }
+})
+const startX = ref(0)
+const isScrolling = ref(false)
+const handleTouchStart = (e: TouchEvent) => {
+  startX.value = e.touches[0].pageX
+  isScrolling.value = false
+  if (WebApp?.HapticFeedback) {
+    WebApp.HapticFeedback.selectionChanged()
+  }
+}
+const handleTouchMove = (e) => {
+  const moveX = e.touches[0].pageX
+  const diffX = Math.abs(moveX - startX.value)
+
+  if (diffX > 10) {
+    isScrolling.value = true
+    if (e.cancelable) {
+      e.stopPropagation()
+      e.preventDefault()
+    }
+  }
+}
+const handleTouchEnd = () => {
+  isScrolling.value = false
+}
+onShow(async () => {
+  await getMyTeamsInfoFn()
+  await getShareCodeFn()
+  await getTeamInviteRewardsListFn()
+})
 </script>
 <style lang="scss" scoped>
 .custom-scroll-view {

+ 112 - 28
src/pages/trophy/index.vue

@@ -35,14 +35,26 @@
             class="w-full h-full absolute left-10rpx"
           ></image>
           <image
-            src="@/static/images/trophy/avatar.png"
-            class="w-120rpx h-120rpx absolute left-12rpx top-20rpx"
+            :src="dataList[1].avatar"
+            class="w-120rpx h-120rpx absolute left-12rpx top-20rpx rounded-108rpx"
           ></image>
         </view>
-        <view class="text-24rpx font-700 text-center mt-30rpx">Crypto Candlestick</view>
+        <view class="text-24rpx font-700 text-center mt-30rpx w-150rpx break-all">
+          {{ dataList[1].tgAccount }}
+        </view>
         <view class="flex items-center justify-center mt-10rpx">
-          <image src="@/static/images/trophy/jinbi.png" class="w-30rpx h-30rpx mr-10rpx"></image>
-          <text class="text-26rpx font-400">20,000</text>
+          <image
+            src="@/static/images/trophy/jinbi.png"
+            v-if="activeTab === 'one'"
+            class="w-30rpx h-30rpx mr-10rpx"
+          ></image>
+          <image
+            src="@/static/images/trophy/cat.png"
+            v-else
+            class="w-30rpx h-30rpx mr-10rpx"
+          ></image>
+
+          <text class="text-26rpx font-400">{{ dataList[1].goldCoinAmount }}</text>
         </view>
       </view>
       <view class="w-216rpx flex flex-col items-center text-white justify-center">
@@ -52,44 +64,66 @@
             class="w-full h-full absolute left-20rpx"
           ></image>
           <image
-            src="@/static/images/trophy/avatar.png"
-            class="w-160rpx h-160rpx absolute left-22rpx top-50rpx"
+            :src="dataList[0].avatar"
+            class="w-160rpx h-160rpx absolute left-22rpx top-50rpx rounded-108rpx"
           ></image>
         </view>
-        <view class="text-24rpx font-700 text-center mt-30rpx">Crypto Candlestick</view>
+        <view class="text-24rpx font-700 text-center mt-30rpx w-150rpx break-all">
+          {{ dataList[0].tgAccount }}
+        </view>
         <view class="flex items-center justify-center mt-10rpx">
-          <image src="@/static/images/trophy/jinbi.png" class="w-30rpx h-30rpx mr-10rpx"></image>
-          <text class="text-26rpx font-400">20,000</text>
+          <image
+            src="@/static/images/trophy/jinbi.png"
+            v-if="activeTab === 'one'"
+            class="w-30rpx h-30rpx mr-10rpx"
+          ></image>
+          <image
+            src="@/static/images/trophy/cat.png"
+            v-else
+            class="w-30rpx h-30rpx mr-10rpx"
+          ></image>
+          <text class="text-26rpx font-400">{{ dataList[0].goldCoinAmount }}</text>
         </view>
       </view>
       <view class="w-216rpx flex flex-col items-center text-white justify-center">
         <view class="relative w-149rpx h-208rpx">
           <image src="@/static/images/trophy/three.png" class="w-full h-full"></image>
           <image
-            src="@/static/images/trophy/avatar.png"
-            class="w-128rpx h-128rpx absolute left-4rpx top-22rpx"
+            :src="dataList[2].avatar"
+            class="w-128rpx h-128rpx absolute left-4rpx top-22rpx rounded-108rpx"
           ></image>
         </view>
-        <view class="text-24rpx font-700 text-center mt-30rpx">Crypto Candlestick</view>
+        <view class="text-24rpx font-700 text-center mt-30rpx w-150rpx break-all">
+          {{ dataList[2].tgAccount }}
+        </view>
         <view class="flex items-center justify-center mt-10rpx">
-          <image src="@/static/images/trophy/jinbi.png" class="w-30rpx h-30rpx mr-10rpx"></image>
-          <text class="text-26rpx font-400">20,000</text>
+          <image
+            src="@/static/images/trophy/jinbi.png"
+            v-if="activeTab === 'one'"
+            class="w-30rpx h-30rpx mr-10rpx"
+          ></image>
+          <image
+            src="@/static/images/trophy/cat.png"
+            v-else
+            class="w-30rpx h-30rpx mr-10rpx"
+          ></image>
+          <text class="text-26rpx font-400">{{ dataList[2].goldCoinAmount }}</text>
         </view>
       </view>
     </view>
     <view class="flex flex-col justify-center items-center w-full mt-50rpx mb-250rpx">
       <view
-        v-for="(item, index) in 10"
+        v-for="(item, index) in dataList3"
         :key="index"
         class="w-690rpx h-130rpx mt-20rpx rounded-20rpx bg-cardlight flex items-center justify-between"
       >
         <view class="flex items-center ml-20rpx">
           <image
-            src="@/static/images/trophy/avatar.png"
+            :src="item.avatar"
             class="w-90rpx h-90rpx rounded-100rpx mr-20rpx flex flex-col justify-center text-center"
           ></image>
           <view class="flex flex-col">
-            <text class="text-28rpx text-white">Crypto Candlestick</text>
+            <text class="text-28rpx text-white">{{ item.tgAccount }}</text>
             <view class="flex items-center mt-10rpx">
               <image
                 v-if="activeTab === 'one'"
@@ -98,28 +132,33 @@
               ></image>
               <image
                 v-else
-                src="@/static/images/trophy/jinbi.png"
+                src="@/static/images/trophy/cat.png"
                 class="w-30rpx h-30rpx mr-10rpx"
               ></image>
-              <view class="text-26rpx text-white">20,000</view>
+              <view class="text-26rpx text-white" v-if="activeTab === 'one'">
+                {{ item.goldCoinAmount }}
+              </view>
+              <view class="text-26rpx text-white" v-else>{{ item.invitedUsersCount }}</view>
             </view>
           </view>
         </view>
-
         <view class="w-120rpx h-70rpflex flex-col justify-center text-center">
-          <text class="text-[30rpx] text-[#fff] font-600">{{ index + 4 }}</text>
+          <text class="text-[30rpx] text-[#fff] font-600">{{ item.ranking }}</text>
         </view>
       </view>
     </view>
   </view>
-  <view class="w-full h-130rpx bg-cardlight fixed bottom-98rpx flex items-center justify-between">
+  <view
+    v-if="currentUserInfo.tgAccount"
+    class="w-full h-130rpx bg-cardlight fixed bottom-98rpx flex items-center justify-between"
+  >
     <view class="flex items-center ml-40rpx">
       <image
         src="@/static/images/trophy/avatar.png"
         class="w-90rpx h-90rpx rounded-53rpx mr-20rpx flex flex-col justify-center text-center"
       ></image>
       <view class="flex flex-col text-primary">
-        <text class="text-28rpx">Crypto Candlestick</text>
+        <text class="text-28rpx">{{ currentUserInfo.tgAccount }}</text>
         <view class="flex items-center mt-10rpx">
           <image
             v-if="activeTab === 'one'"
@@ -128,22 +167,25 @@
           ></image>
           <image
             v-else
-            src="@/static/images/trophy/jinbi.png"
+            src="@/static/images/trophy/cat.png"
             class="w-30rpx h-30rpx mr-10rpx"
           ></image>
-
-          <view class="text-26rpx">2000</view>
+          <view class="text-26rpx" v-if="activeTab === 'one'">
+            {{ currentUserInfo.goldCoinAmount }}
+          </view>
+          <view class="text-26rpx" v-else>{{ currentUserInfo.invitedUsersCount }}</view>
         </view>
       </view>
     </view>
     <view class="min-w-150rpx h-70rpflex flex justify-center text-center">
-      <text class="text-[32rpx] text-primary font-700">200</text>
+      <text class="text-[32rpx] text-primary font-700">{{ currentUserInfo.ranking }}</text>
     </view>
   </view>
   <tabbar currentTab="pages/trophy/index"></tabbar>
 </template>
 <script setup lang="ts">
 import tabbar from '@/components/TabBar/index.vue'
+import { goldCoinCompetitionRanking, Ranking, teamInviteCompetitionRanking } from '@/service/trophy'
 
 type Tab = 'one' | 'two'
 const activeTab = ref<Tab>('one')
@@ -151,10 +193,52 @@ const activeTab = ref<Tab>('one')
 // 点击切换个人数据或团队数据
 const changeActiveTab = async (tab: Tab) => {
   activeTab.value = tab
+  dataList.value = []
+  dataList3.value = []
+  currentUserInfo.value = {} as Ranking
   if (tab === 'one') {
+    await goldCoinCompetitionRankingFn()
   } else if (tab === 'two') {
+    await teamInviteCompetitionRankingFn()
+  }
+}
+const dataList = ref<Ranking[]>([])
+const dataList3 = ref<Ranking[]>([])
+const currentUserInfo = ref<Ranking>({} as Ranking)
+const goldCoinCompetitionRankingFn = async () => {
+  const { data } = await goldCoinCompetitionRanking(100)
+  if (data.rankList && data.rankList.length > 0) {
+    dataList.value = data.rankList
+    dataList3.value = data.rankList.slice(3)
+    currentUserInfo.value = data.userInfo
+  } else {
+    dataList.value = [
+      { tgAccount: 'nouser', avatar: '/staic/images/trophy/avatar.png', goldCoinAmount: 0 },
+      { tgAccount: 'nouser', avatar: '/staic/images/trophy/avatar.png', goldCoinAmount: 0 },
+      { tgAccount: 'nouser', avatar: '/staic/images/trophy/avatar.png', goldCoinAmount: 0 },
+    ]
+    dataList3.value = []
+  }
+}
+const teamInviteCompetitionRankingFn = async () => {
+  console.info('🚀 ~ file:index method:teamInviteCompetitionRankingFn line:216 -----', 11)
+  const { data } = await teamInviteCompetitionRanking(100)
+  if (data.rankList && data.rankList.length > 0) {
+    dataList.value = data.rankList
+    dataList3.value = data.rankList.slice(3)
+    currentUserInfo.value = data.userInfo
+  } else {
+    dataList.value = [
+      { tgAccount: 'nouser', avatar: '@/staic/images/trophy/avatar.png', goldCoinAmount: 0 },
+      { tgAccount: 'nouser', avatar: '@/staic/images/trophy/avatar.png', goldCoinAmount: 0 },
+      { tgAccount: 'nouser', avatar: '@/staic/images/trophy/avatar.png', goldCoinAmount: 0 },
+    ]
+    dataList3.value = []
   }
 }
+onShow(async () => {
+  await goldCoinCompetitionRankingFn()
+})
 </script>
 <style lang="scss" scoped>
 .tab-bg {

+ 18 - 0
src/service/purse/index.ts

@@ -0,0 +1,18 @@
+import { httpPost } from '@/utils/http'
+
+export interface FinancialInfo {
+  totalBalance?: number // 总额
+  availableBalance?: number // 可用余额
+  totalProfitPerHour?: number // 产币总收益
+  profitPerHour?: number // 每小时收益
+  taskRewards?: number // 任务奖励
+  teamSharing?: number // 团队收益
+  shareRewards?: number // 邀请奖励
+  resourcePlacement?: number // 空投
+  moneyBalance?: number // 真实货币余额
+}
+
+// 获取钱包信息
+export const getWalletInfo = () => {
+  return httpPost<FinancialInfo>('/app/wallet/getWalletInfo')
+}

+ 83 - 2
src/service/team/index.ts

@@ -1,5 +1,86 @@
-import { httpGet } from '@/utils/http'
+import { httpGet, httpPost } from '@/utils/http'
 
+export interface TeamInfo {
+  total?: number // 总人数 <int64>
+  rewardsTotal?: number // 可领取奖励人数 <int64>
+  teamACount?: number // 团队A人数 <int64>
+  teamBCount?: number // 团队B人数 <int64>
+  proportionA?: string // 团队A金币抽成占比
+  proportionB?: string // 团队B金币抽成占比
+  claimableRewardsA?: number // 团队A可领取奖励人数,默认值: 0 <int64>
+  claimableRewardsB?: number // 团队B可领取奖励人数,默认值: 0 <int64>
+  claimableAmountA?: number // 团队A可领取奖励金额,默认值: BigDecimal.ZERO
+  claimableAmountB?: number // 团队B可领取奖励金额
+}
+
+export interface TeamUser {
+  tgId?: string // tg小程序id
+  tgAccount?: string // tg账号
+  firstName?: string // 名
+  lastName?: string // 姓
+  nickname?: string // 昵称
+  realName?: string // 真实姓名
+  avatar?: string // 头像
+  teamType?: string // 团队类型
+  teamRewardAmount: number // 团队奖励金额
+  userYieldTotal: number // 用户总收益
+}
+
+export interface TeamAOB {
+  total: number
+  users: TeamUser[]
+}
+
+export interface TeamInviteRewardsRule {
+  inviteNum: number
+  inviteRewardsRuleList: TeamInviteRewardsRules[]
+}
+
+export interface TeamInviteRewardsRules {
+  id?: string // 主键 <int64>
+  rewardsName?: string // 奖励名称
+  rewardsDescribe?: string // 奖励说明
+  inviteNum?: number // 邀请好友数量
+  goldCoinNum?: number // 金币数量
+  rewardsLevel?: number // 奖励层级
+  createdBy?: number // 创建人 <int64>
+  createdTime?: string // 创建时间
+  updatedBy?: number // 更新人 <int64>
+  updatedTime?: string // 更新时间
+  percentage?: number
+}
+
+// 获取分享码
 export const getShareCode = () => {
-  return httpGet<string>('/app/distribution/getShareCode')
+  return httpPost<string>('/app/distribution/getShareCode')
+}
+// 获取团队信息
+export const getMyTeamsInfo = () => {
+  return httpPost<TeamInfo>('/app/team/share/getMyTeamsInfo')
+}
+// 获取团队固定奖励列表
+export const getTeamInviteRewardsList = () => {
+  return httpPost<TeamInfo[]>('/app/team/share/getTeamInviteRewardsList')
+}
+// 收取团队固定奖励
+export const claimTeamInviteReward = () => {
+  return httpPost<TeamInfo[]>('/app/team/share/claimTeamInviteReward')
+}
+
+// 获取ab邀请信息
+export const getTeamShareUserListByType = (type: 'A' | 'B') => {
+  return httpPost<TeamAOB>('/app/team/share/getTeamShareUserListByType', { type })
+}
+// 获取ab邀请奖励
+export const claimTeamShareReward = (type: 'A' | 'B') => {
+  return httpPost<TeamAOB>('/app/team/share/claimTeamShareReward', { type })
+}
+
+// 获取阶段邀请列表
+export const getTeamInviteRewardsRules = () => {
+  return httpPost<TeamInviteRewardsRule>('/app/team/share/getTeamInviteRewardsRules')
+}
+// 获取阶段邀请奖励
+export const claimTeamInviteTaskReward = (ruleId: string) => {
+  return httpPost<TeamInviteRewardsRule>('/app/team/share/claimTeamInviteTaskReward', { ruleId })
 }

+ 29 - 0
src/service/trophy/index.ts

@@ -0,0 +1,29 @@
+import { http, httpGet, httpPost } from '@/utils/http'
+
+export interface Ranking {
+  ranking?: number // 排名
+  tgId?: string // tg小程序id
+  tgAccount?: string // tg账号
+  firstName?: string // 名
+  lastName?: string // 姓
+  nickname?: string // 昵称
+  realName?: string // 真实姓名
+  avatar?: string // 头像
+  goldCoinAmount?: number // 金币余额
+  goldCoinTotalHis?: number // 金币总数量
+  invitedUsersCount?: number // 邀请人数
+}
+
+export const goldCoinCompetitionRanking = (limit: number) => {
+  return httpPost<{ rankList: Ranking[]; userInfo: Ranking }>(
+    '/app/competition/goldCoinCompetitionRanking',
+    { limit },
+  )
+}
+
+export const teamInviteCompetitionRanking = (limit: number) => {
+  return httpPost<{
+    rankList: Ranking[]
+    userInfo: Ranking
+  }>('/app/competition/teamInviteCompetitionRanking', { limit })
+}

二进制
src/static/images/trophy/cat.png


+ 89 - 5
src/types/auto-import.d.ts

@@ -98,7 +98,7 @@ declare global {
 // for type re-export
 declare global {
   // @ts-ignore
-  export type { Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
+  export type { Component, ComponentPublicInstance, ComputedRef, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, VNode, WritableComputedRef } from 'vue'
   import('vue')
 }
 // for vue template auto import
@@ -162,7 +162,6 @@ declare module 'vue' {
     readonly onUnload: UnwrapRef<typeof import('@dcloudio/uni-app')['onUnload']>
     readonly onUnmounted: UnwrapRef<typeof import('vue')['onUnmounted']>
     readonly onUpdated: UnwrapRef<typeof import('vue')['onUpdated']>
-    readonly onWatcherCleanup: UnwrapRef<typeof import('vue')['onWatcherCleanup']>
     readonly provide: UnwrapRef<typeof import('vue')['provide']>
     readonly reactive: UnwrapRef<typeof import('vue')['reactive']>
     readonly readonly: UnwrapRef<typeof import('vue')['readonly']>
@@ -181,13 +180,98 @@ declare module 'vue' {
     readonly useCssModule: UnwrapRef<typeof import('vue')['useCssModule']>
     readonly useCssVars: UnwrapRef<typeof import('vue')['useCssVars']>
     readonly useGameTimer: UnwrapRef<typeof import('../hooks/useGameTimer')['useGameTimer']>
-    readonly useId: UnwrapRef<typeof import('vue')['useId']>
     readonly useImgPath: UnwrapRef<typeof import('../hooks/useImgPath')['useImgPath']>
-    readonly useModel: UnwrapRef<typeof import('vue')['useModel']>
     readonly useRequest: UnwrapRef<typeof import('../hooks/useRequest')['default']>
     readonly useSlots: UnwrapRef<typeof import('vue')['useSlots']>
     readonly useTelegramBackButton: UnwrapRef<typeof import('../hooks/useTelegramBackButton')['useTelegramBackButton']>
-    readonly useTemplateRef: UnwrapRef<typeof import('vue')['useTemplateRef']>
+    readonly useUpload: UnwrapRef<typeof import('../hooks/useUpload')['default']>
+    readonly watch: UnwrapRef<typeof import('vue')['watch']>
+    readonly watchEffect: UnwrapRef<typeof import('vue')['watchEffect']>
+    readonly watchPostEffect: UnwrapRef<typeof import('vue')['watchPostEffect']>
+    readonly watchSyncEffect: UnwrapRef<typeof import('vue')['watchSyncEffect']>
+  }
+}
+declare module '@vue/runtime-core' {
+  interface GlobalComponents {}
+  interface ComponentCustomProperties {
+    readonly EffectScope: UnwrapRef<typeof import('vue')['EffectScope']>
+    readonly computed: UnwrapRef<typeof import('vue')['computed']>
+    readonly createApp: UnwrapRef<typeof import('vue')['createApp']>
+    readonly customRef: UnwrapRef<typeof import('vue')['customRef']>
+    readonly defineAsyncComponent: UnwrapRef<typeof import('vue')['defineAsyncComponent']>
+    readonly defineComponent: UnwrapRef<typeof import('vue')['defineComponent']>
+    readonly effectScope: UnwrapRef<typeof import('vue')['effectScope']>
+    readonly formatAmount: UnwrapRef<typeof import('../hooks/moneyProcessing')['formatAmount']>
+    readonly formatAmountNoFloat: UnwrapRef<typeof import('../hooks/moneyProcessing')['formatAmountNoFloat']>
+    readonly getCurrentInstance: UnwrapRef<typeof import('vue')['getCurrentInstance']>
+    readonly getCurrentScope: UnwrapRef<typeof import('vue')['getCurrentScope']>
+    readonly h: UnwrapRef<typeof import('vue')['h']>
+    readonly inject: UnwrapRef<typeof import('vue')['inject']>
+    readonly isProxy: UnwrapRef<typeof import('vue')['isProxy']>
+    readonly isReactive: UnwrapRef<typeof import('vue')['isReactive']>
+    readonly isReadonly: UnwrapRef<typeof import('vue')['isReadonly']>
+    readonly isRef: UnwrapRef<typeof import('vue')['isRef']>
+    readonly markRaw: UnwrapRef<typeof import('vue')['markRaw']>
+    readonly nextTick: UnwrapRef<typeof import('vue')['nextTick']>
+    readonly onActivated: UnwrapRef<typeof import('vue')['onActivated']>
+    readonly onAddToFavorites: UnwrapRef<typeof import('@dcloudio/uni-app')['onAddToFavorites']>
+    readonly onBackPress: UnwrapRef<typeof import('@dcloudio/uni-app')['onBackPress']>
+    readonly onBeforeMount: UnwrapRef<typeof import('vue')['onBeforeMount']>
+    readonly onBeforeUnmount: UnwrapRef<typeof import('vue')['onBeforeUnmount']>
+    readonly onBeforeUpdate: UnwrapRef<typeof import('vue')['onBeforeUpdate']>
+    readonly onDeactivated: UnwrapRef<typeof import('vue')['onDeactivated']>
+    readonly onError: UnwrapRef<typeof import('@dcloudio/uni-app')['onError']>
+    readonly onErrorCaptured: UnwrapRef<typeof import('vue')['onErrorCaptured']>
+    readonly onHide: UnwrapRef<typeof import('@dcloudio/uni-app')['onHide']>
+    readonly onLaunch: UnwrapRef<typeof import('@dcloudio/uni-app')['onLaunch']>
+    readonly onLoad: UnwrapRef<typeof import('@dcloudio/uni-app')['onLoad']>
+    readonly onMounted: UnwrapRef<typeof import('vue')['onMounted']>
+    readonly onNavigationBarButtonTap: UnwrapRef<typeof import('@dcloudio/uni-app')['onNavigationBarButtonTap']>
+    readonly onNavigationBarSearchInputChanged: UnwrapRef<typeof import('@dcloudio/uni-app')['onNavigationBarSearchInputChanged']>
+    readonly onNavigationBarSearchInputClicked: UnwrapRef<typeof import('@dcloudio/uni-app')['onNavigationBarSearchInputClicked']>
+    readonly onNavigationBarSearchInputConfirmed: UnwrapRef<typeof import('@dcloudio/uni-app')['onNavigationBarSearchInputConfirmed']>
+    readonly onNavigationBarSearchInputFocusChanged: UnwrapRef<typeof import('@dcloudio/uni-app')['onNavigationBarSearchInputFocusChanged']>
+    readonly onPageNotFound: UnwrapRef<typeof import('@dcloudio/uni-app')['onPageNotFound']>
+    readonly onPageScroll: UnwrapRef<typeof import('@dcloudio/uni-app')['onPageScroll']>
+    readonly onPullDownRefresh: UnwrapRef<typeof import('@dcloudio/uni-app')['onPullDownRefresh']>
+    readonly onReachBottom: UnwrapRef<typeof import('@dcloudio/uni-app')['onReachBottom']>
+    readonly onReady: UnwrapRef<typeof import('@dcloudio/uni-app')['onReady']>
+    readonly onRenderTracked: UnwrapRef<typeof import('vue')['onRenderTracked']>
+    readonly onRenderTriggered: UnwrapRef<typeof import('vue')['onRenderTriggered']>
+    readonly onResize: UnwrapRef<typeof import('@dcloudio/uni-app')['onResize']>
+    readonly onScopeDispose: UnwrapRef<typeof import('vue')['onScopeDispose']>
+    readonly onServerPrefetch: UnwrapRef<typeof import('vue')['onServerPrefetch']>
+    readonly onShareAppMessage: UnwrapRef<typeof import('@dcloudio/uni-app')['onShareAppMessage']>
+    readonly onShareTimeline: UnwrapRef<typeof import('@dcloudio/uni-app')['onShareTimeline']>
+    readonly onShow: UnwrapRef<typeof import('@dcloudio/uni-app')['onShow']>
+    readonly onTabItemTap: UnwrapRef<typeof import('@dcloudio/uni-app')['onTabItemTap']>
+    readonly onThemeChange: UnwrapRef<typeof import('@dcloudio/uni-app')['onThemeChange']>
+    readonly onUnhandledRejection: UnwrapRef<typeof import('@dcloudio/uni-app')['onUnhandledRejection']>
+    readonly onUnload: UnwrapRef<typeof import('@dcloudio/uni-app')['onUnload']>
+    readonly onUnmounted: UnwrapRef<typeof import('vue')['onUnmounted']>
+    readonly onUpdated: UnwrapRef<typeof import('vue')['onUpdated']>
+    readonly provide: UnwrapRef<typeof import('vue')['provide']>
+    readonly reactive: UnwrapRef<typeof import('vue')['reactive']>
+    readonly readonly: UnwrapRef<typeof import('vue')['readonly']>
+    readonly ref: UnwrapRef<typeof import('vue')['ref']>
+    readonly resolveComponent: UnwrapRef<typeof import('vue')['resolveComponent']>
+    readonly shallowReactive: UnwrapRef<typeof import('vue')['shallowReactive']>
+    readonly shallowReadonly: UnwrapRef<typeof import('vue')['shallowReadonly']>
+    readonly shallowRef: UnwrapRef<typeof import('vue')['shallowRef']>
+    readonly toRaw: UnwrapRef<typeof import('vue')['toRaw']>
+    readonly toRef: UnwrapRef<typeof import('vue')['toRef']>
+    readonly toRefs: UnwrapRef<typeof import('vue')['toRefs']>
+    readonly toValue: UnwrapRef<typeof import('vue')['toValue']>
+    readonly triggerRef: UnwrapRef<typeof import('vue')['triggerRef']>
+    readonly unref: UnwrapRef<typeof import('vue')['unref']>
+    readonly useAttrs: UnwrapRef<typeof import('vue')['useAttrs']>
+    readonly useCssModule: UnwrapRef<typeof import('vue')['useCssModule']>
+    readonly useCssVars: UnwrapRef<typeof import('vue')['useCssVars']>
+    readonly useGameTimer: UnwrapRef<typeof import('../hooks/useGameTimer')['useGameTimer']>
+    readonly useImgPath: UnwrapRef<typeof import('../hooks/useImgPath')['useImgPath']>
+    readonly useRequest: UnwrapRef<typeof import('../hooks/useRequest')['default']>
+    readonly useSlots: UnwrapRef<typeof import('vue')['useSlots']>
+    readonly useTelegramBackButton: UnwrapRef<typeof import('../hooks/useTelegramBackButton')['useTelegramBackButton']>
     readonly useUpload: UnwrapRef<typeof import('../hooks/useUpload')['default']>
     readonly watch: UnwrapRef<typeof import('vue')['watch']>
     readonly watchEffect: UnwrapRef<typeof import('vue')['watchEffect']>