Browse Source

feat: 更新依赖版本,添加活动结束时间字段,优化倒计时组件,移除 Sentry 相关代码,添加 TooltipEvo 组件

EvilDragon 3 months ago
parent
commit
9ef1ff8b8f

+ 1 - 2
packages/app/package.json

@@ -110,13 +110,12 @@
     "pinia-plugin-persistedstate": "3.2.1",
     "qs": "6.5.3",
     "radash": "^12.1.0",
-    "sentry-uniapp": "^1.0.12",
     "uqrcodejs": "^4.0.7",
     "validator": "^13.12.0",
     "vue": "^3.4.21",
     "vue-component-type-helpers": "^2.1.8",
     "vue-i18n": "^9.1.9",
-    "wot-design-uni": "^1.3.13",
+    "wot-design-uni": "^1.3.14",
     "z-paging": "^2.7.10"
   },
   "devDependencies": {

+ 0 - 9
packages/app/src/App.vue

@@ -1,17 +1,8 @@
 <script setup lang="ts">
 import { onLaunch, onShow, onHide } from '@dcloudio/uni-app'
-import * as sentry from 'sentry-uniapp'
 
 onLaunch(() => {
   console.log('App Launch')
-  // sentry.init({
-  //   dsn: 'https://285d1dabcc1091ba170bea48e6c332b2@o4507049702195200.ingest.us.sentry.io/4508207497871361',
-  // })
-  // sentry.captureMessage('custom message from ' + uni.getSystemInfoSync().platform, {
-  //   UserId: 123,
-  //   Command: 'npm i -g uapp',
-  // })
-  // sentry.cap
 })
 onShow(() => {
   console.log('App Show')

+ 18 - 0
packages/app/src/components/tooltip-evo.vue

@@ -0,0 +1,18 @@
+<script setup lang="ts">
+const modelValue = defineModel({ default: false, type: Boolean })
+withDefaults(defineProps<{ content?: string }>(), { content: '' })
+</script>
+<template>
+  <div class="">
+    <div v-if="modelValue" class="relative flex justify-center">
+      <div
+        class="absolute bottom-1 px-2.5 py-1 bg-[#ffe0e0] rounded justify-center items-center gap-2.5 inline-flex"
+      >
+        <div class="text-[#c40000]/90 text-[10px] font-normal font-['PingFang_SC'] leading-normal">
+          {{ content }}
+        </div>
+      </div>
+    </div>
+    <slot></slot>
+  </div>
+</template>

+ 51 - 16
packages/app/src/composables/activity.ts

@@ -1,32 +1,67 @@
 import { get } from 'radash'
 import { Activity, StudyTour } from '../core/libs/models'
-import {
-  getActivityStatus,
-  getActivityStatusButtonText,
-  getActivityStatusText,
-} from '../core/utils/common'
+import { getActivityStatusButtonText } from '../core/utils/common'
+import dayjs from 'dayjs'
+import { useUserStore } from '../store'
+import { storeToRefs } from 'pinia'
 
 /**
  * 游学活动
  */
-export const useActivity = (options: Activity | StudyTour) => {
-  const status = computed(() =>
-    getActivityStatus(
-      options?.applyStartTime || options?.planApplyStartTime,
-      options?.applyEndTime || options?.planApplyEndTime,
-    ),
+export const useActivity = (options: Partial<Activity | StudyTour>) => {
+  const userStore = useUserStore()
+  const { userInfo } = storeToRefs(userStore)
+  const applyStartAt = options?.applyStartTime || options?.planApplyStartTime
+  const applyEndAt = options?.applyEndTime || options?.planApplyEndTime
+  const startAt = options?.activityStartTime || options?.studyStartTime
+  const endAt = options?.activityEndTime || options?.studyEndTime
+  const listItemButtonText = ref(getActivityStatusButtonText(applyStartAt, applyEndAt))
+  const tooltipShow = ref(true)
+  const difference = computed(() =>
+    options?.needPointsType === '1' ? options?.needPointsCount - userInfo.value?.level?.point : 0,
   )
+  const getActivityStatus = () => {
+    const now = new Date()
+    if (dayjs(now).isBefore(dayjs(applyStartAt))) {
+      return 'waiting'
+    } else if (dayjs(now).isAfter(dayjs(applyStartAt)) && dayjs(now).isBefore(dayjs(applyEndAt))) {
+      return 'registering'
+    } else if (dayjs(now).isAfter(dayjs(applyEndAt)) && dayjs(now).isBefore(dayjs(startAt))) {
+      return 'closed'
+    } else if (dayjs(now).isAfter(dayjs(startAt)) && dayjs(now).isBefore(dayjs(endAt))) {
+      return 'running'
+    } else {
+      return 'overdue'
+    }
+  }
+  const getActivityStatusText = () =>
+    ({
+      waiting: '未开始',
+      registering: '报名中',
+      closed: '报名已结束',
+      running: '活动进行中',
+      overdue: '活动已结束',
+    })[getActivityStatus()]
+  const status = ref(getActivityStatus())
+  const statusText = ref(getActivityStatusText())
+  const detailButtonText = ref()
+  const refresh = () => {
+    listItemButtonText.value = getActivityStatusButtonText(applyStartAt, applyEndAt)
+    status.value = getActivityStatus()
+    statusText.value = getActivityStatusText()
+  }
   return {
     getActivityStatusButtonText: () =>
       getActivityStatusButtonText(
         options?.applyStartTime || options?.planApplyStartTime,
         options?.applyEndTime || options?.planApplyEndTime,
       ),
-    getActivityStatusText: () =>
-      getActivityStatusText(
-        options?.applyStartTime || options?.planApplyStartTime,
-        options?.applyEndTime || options?.planApplyEndTime,
-      ),
+    getActivityStatusText: () => getActivityStatusText(),
     status,
+    listItemButtonText,
+    statusText,
+    tooltipShow,
+    difference,
+    refresh,
   }
 }

+ 7 - 0
packages/app/src/core/libs/models.ts

@@ -208,6 +208,7 @@ export interface Activity {
   applyStartTime: string
   planApplyStartTime?: string
   studyStartTime: string
+  studyEndTime: string
   /**
    * 报名结束时间 or 计划报名截止时间
    */
@@ -348,6 +349,12 @@ export interface StudyTour {
     clockExplainDesc: string
     clockExplainUrl: string
   }[]
+  /**
+   * 补充字段
+   */
+  activityStartTime?: any
+  activityEndTime?: any
+  activityAddr?: any
 }
 export interface MyStudyTour {
   id: number

+ 35 - 10
packages/app/src/pages/home/activity/detail/index.vue

@@ -36,6 +36,10 @@ import mapLocation from '@designer-hub/assets/src/libs/assets/mapLocation'
 import cameraWhite from '@designer-hub/assets/src/libs/assets/cameraWhite'
 import ButtonEvo from '@/components/button-evo.vue'
 import mpHtml from 'mp-html/dist/uni-app/components/mp-html/mp-html.vue'
+import { useActivity } from '../../../../composables/activity'
+import ImageEvo from '@/components/image-evo.vue'
+import TooltipEvo from '@/components/tooltip-evo.vue'
+import ActivityAsOf from '../../components/activity-as-of.vue'
 const themeVars = ref<ConfigProviderThemeVars>({
   tableBorderColor: 'white',
   tabsNavLineBgColor: 'white',
@@ -46,7 +50,7 @@ const id = ref()
 const type = ref<'activity' | 'studyTour'>()
 const activityTypes = ref({ activity: '活动', studyTour: '游学' })
 const tab = ref(0)
-const request = ref<() => Promise<IResData<Partial<StudyTour> & Partial<Activity>>>>()
+const request = ref<() => Promise<IResData<Partial<StudyTour> | Partial<Activity>>>>()
 const { data, run: setData } = useRequest(() => request.value(), { initialData: {} })
 const { data: signups, run: setSignups } = useRequest(
   () => getActivitySignups({ activityId: id.value }),
@@ -59,7 +63,6 @@ const show = ref(false)
 const successShow = ref(false)
 const listShow = ref(false)
 const dominantColor = ref()
-const palette = ref()
 const isActivity = computed(() => type.value === 'activity')
 const isStudyTour = computed(() => type.value === 'studyTour')
 const levelsById = computed(() =>
@@ -141,6 +144,8 @@ const infos = computed(() => [
   },
 ])
 
+const { status, statusText, difference, refresh } = useActivity(data.value)
+
 const handleConfirm = async () => {
   const { data, code, msg } = await (isActivity.value ? activitySignup : studyTourSignup)({
     id: id.value,
@@ -219,7 +224,8 @@ onShareTimeline(() => ({ title: data.value.name, imageUrl: data.value.thumbnailU
         canvas-id="firstCanvas"
         id="firstCanvas"
       ></canvas>
-      <wd-img width="100%" height="100%" :src="data?.backgroundUrl"></wd-img>
+      <ImageEvo :src="data?.backgroundUrl"></ImageEvo>
+      <!-- <wd-img width="100%" height="100%" :src="data?.backgroundUrl"></wd-img> -->
       <div class="absolute left-3.5 bottom-3" @click="listShow = true">
         <div
           v-if="isStudyTour"
@@ -246,7 +252,7 @@ onShareTimeline(() => ({ title: data.value.name, imageUrl: data.value.thumbnailU
       </div>
     </div>
     <div class="h-9">
-      <div v-if="type === 'studyTour'" class="flex items-center h-full mt-9">
+      <div v-if="type === 'studyTour'" class="flex items-center h-full mt-9 gap-1.5">
         <wd-img width="18" height="18" :src="map"></wd-img>
         <div class="text-[#c1c1c1] text-base font-normal font-['PingFang_SC'] leading-normal">
           第一站
@@ -254,13 +260,14 @@ onShareTimeline(() => ({ title: data.value.name, imageUrl: data.value.thumbnailU
       </div>
     </div>
     <div
-      class="w-[347px] text-white text-[26px] font-normal font-['PingFang_SC'] leading-[44px] flex items-center gap-4"
+      class="text-white text-[26px] font-normal font-['PingFang_SC'] leading-[44px] flex items-center gap-4"
     >
       <!-- 日本研学·东京艺术大学设计游学 -->
       <div class="inline-block">{{ data?.name }}</div>
       <div class="inline-block py-1.5 px-4 bg-white rounded-[20px] backdrop-blur-[15px]">
         <div class="text-[#a60707] text-sm font-normal font-['PingFang_SC'] leading-relaxed">
-          {{ getActivityStatusText(data?.applyStartTime, data?.applyEndTime) }}
+          <!-- {{ getActivityStatusText(data?.applyStartTime, data?.applyEndTime) }} -->
+          {{ statusText }}
         </div>
       </div>
     </div>
@@ -372,13 +379,31 @@ onShareTimeline(() => ({ title: data.value.name, imageUrl: data.value.thumbnailU
           积分
         </div>
         <div class="flex-1"></div>
-        <div @click="show = true">
-          <!-- <ImgBtnEvo>{{ data?.ifSingnUp ? '已报名' : '立即报名' }}</ImgBtnEvo> -->
-          <ButtonEvo>{{ data?.ifSingnUp ? '已报名' : '立即报名' }}</ButtonEvo>
-          <!-- <TiltedButton size="large">{{ data?.ifSingnUp ? '已报名' : '立即报名' }}</TiltedButton> -->
+        <div>
+          <div class="relative">
+            <div class="absolute bottom-3 left-0 right-0 flex flex-col justify-center items-center">
+              <div class="bg-[#3b3c46] rounded-[60px] flex items-center py-1.5 px-4">
+                <ActivityAsOf
+                  :start-at="data?.applyStartTime || data?.planApplyStartTime"
+                  :end-at="data?.applyEndTime || data?.planApplyEndTime"
+                  @end="refresh"
+                ></ActivityAsOf>
+              </div>
+            </div>
+          </div>
+          <TooltipEvo
+            placement="top"
+            :content="`还差${difference}积分`"
+            :model-value="status === 'runing' && difference > 0"
+          >
+            <div @click="show = true">
+              <ButtonEvo>{{ data?.ifSingnUp ? '已报名' : '立即报名' }}</ButtonEvo>
+            </div>
+          </TooltipEvo>
         </div>
       </div>
     </BottomAppBar>
+
     <wd-action-sheet v-model="show">
       <view class="px-3.5 py-10">
         <div class="flex gap-5 mb-13.5">

+ 57 - 0
packages/app/src/pages/home/components/activity-as-of.vue

@@ -0,0 +1,57 @@
+<script setup lang="ts">
+import dayjs from 'dayjs'
+
+const props = defineProps<{ startAt?: string | number; endAt?: string | number }>()
+const emits = defineEmits<{ end: [] }>()
+const status = computed(() => {
+  // 如果当前时间小于开始时间返回等待中,如果当前时间大于等于开始时间小于等于结束时间返回进行中,当前时间大于结束时间返回已结束
+  const now = new Date()
+  if (dayjs(now).isBefore(dayjs(props.startAt))) {
+    return 'waiting'
+  } else if (dayjs(now).isAfter(dayjs(props.startAt)) && dayjs(now).isBefore(dayjs(props.endAt))) {
+    return 'running'
+  } else {
+    return 'overdue'
+  }
+})
+const time = computed(() =>
+  dayjs({ waiting: props.startAt, running: props.endAt }[status.value]).diff(
+    new Date(),
+    'millisecond',
+  ),
+)
+</script>
+<template>
+  <div>
+    <wd-count-down :time="time" @finish="emits('end')">
+      <template #default="{ current }">
+        <div
+          class="flex items-center text-white text-xs font-normal font-['PingFang_SC'] leading-normal whitespace-nowrap"
+        >
+          <div v-if="current.days" class="text-[#ef4343]">
+            {{ current.days }}
+          </div>
+          <span v-if="current.days">天</span>
+          <div v-if="current.hours && !current.days" class="text-[#ef4343]">
+            {{ current.hours }}
+          </div>
+          <span v-if="current.hours && !current.days">小时</span>
+          <div v-if="current.minutes && !current.hours && !current.days" class="text-[#ef4343]">
+            {{ current.minutes }}
+          </div>
+          <span v-if="current.minutes && !current.hours && !current.days">分钟</span>
+          <div
+            v-if="current.seconds && !current.minutes && !current.hours && !current.days"
+            class="text-[#ef4343]"
+          >
+            {{ current.seconds }}
+          </div>
+          <span v-if="current.seconds && !current.minutes && !current.hours && !current.days">
+            秒
+          </span>
+          <span>后 报名{{ { waiting: '开始', running: '截止' }[status] }}</span>
+        </div>
+      </template>
+    </wd-count-down>
+  </div>
+</template>

+ 18 - 5
packages/app/src/pages/home/components/activity-count-down.vue

@@ -2,6 +2,7 @@
 import dayjs from 'dayjs'
 
 const props = defineProps<{ startAt?: string | number; endAt?: string | number }>()
+const emits = defineEmits<{ end: [] }>()
 const status = computed(() => {
   // 如果当前时间小于开始时间返回等待中,如果当前时间大于等于开始时间小于等于结束时间返回进行中,当前时间大于结束时间返回已结束
   const now = new Date()
@@ -13,21 +14,26 @@ const status = computed(() => {
     return 'overdue'
   }
 })
+const time = ref(
+  dayjs({ waiting: props.startAt, running: props.endAt }[status.value]).diff(
+    new Date(),
+    'millisecond',
+  ),
+)
 </script>
 <template>
   <div>
-    <wd-count-down
-      :time="dayjs({ waiting: startAt, running: endAt }[status]).diff(new Date(), 'millisecond')"
-    >
+    <wd-count-down :time="time" @finish="emits('end')">
       <template #default="{ current }">
-        <div class="flex items-center gap-1.25 text-black/40 text-sm">
+        <div v-if="time" class="flex items-center gap-1.25 text-black/40 text-sm">
           <div>距{{ { waiting: '开始', running: '结束' }[status] }}还剩</div>
           <div
+            v-if="current.days"
             class="w-4 h-4 bg-black/90 rounded text-white text-2.5 flex items-center justify-center"
           >
             {{ current.days }}
           </div>
-          <span class="custom-count-down-colon">天</span>
+          <span v-if="current.days" class="custom-count-down-colon">天</span>
           <div
             class="w-4 h-4 bg-black/90 rounded text-white text-2.5 flex items-center justify-center"
           >
@@ -40,6 +46,13 @@ const status = computed(() => {
             {{ current.minutes }}
           </div>
           <span class="custom-count-down-colon">分</span>
+          <div
+            v-if="!current.days"
+            class="w-4 h-4 bg-black/90 rounded text-white text-2.5 flex items-center justify-center"
+          >
+            {{ current.seconds }}
+          </div>
+          <span v-if="!current.days" class="custom-count-down-colon">秒</span>
         </div>
       </template>
     </wd-count-down>

+ 21 - 11
packages/app/src/pages/home/study-tour/components/study-tour-card.vue

@@ -1,5 +1,4 @@
 <script lang="ts" setup>
-import TiltedButton from '@/components/tilted-button.vue'
 import { StudyTour } from '../../../../core/libs/models'
 import dayjs from 'dayjs'
 import { useRouter } from '../../../../core/utils/router'
@@ -9,6 +8,7 @@ import ActivityCountDown from '../../components/activity-count-down.vue'
 import { useActivity } from '../../../../composables/activity'
 import ButtonEvo from '@/components/button-evo.vue'
 import { omit } from 'radash'
+import TooltipEvo from '@/components/tooltip-evo.vue'
 
 const props = defineProps<{
   customClass?: string
@@ -16,8 +16,9 @@ const props = defineProps<{
 }>()
 
 const router = useRouter()
-const { getActivityStatusButtonText, getActivityStatusText, getActivityStatus, status } =
-  useActivity(omit(props.options, ['levelsByMemberLevel', 'index']))
+const { listItemButtonText, statusText, status, difference, refresh } = useActivity(
+  omit(props.options, ['levelsByMemberLevel', 'index']),
+)
 const toDetail = () => {
   router.push(`/pages/home/activity/detail/index?id=${props.options?.id}&type=studyTour`)
 }
@@ -36,9 +37,12 @@ const toDetail = () => {
           第{{ options?.index + 1 }}站
         </div>
         <div class="flex-1"></div>
-        <div class="bg-[#f3f3f3] rounded-[20px] backdrop-blur-[15px] px-4 py-1.5">
-          <div class="text-black/40 text-sm font-normal font-['PingFang_SC']">
-            {{ getActivityStatusText() }}
+        <div
+          class="rounded-[20px] backdrop-blur-[15px] px-4 py-1.5"
+          :class="`${['running', 'registering'].includes(status) ? 'bg-[#fff4f4] text-[#a60707]' : 'bg-[#f3f3f3] text-black/40'}`"
+        >
+          <div class="text-sm font-normal font-['PingFang_SC']">
+            {{ statusText }}
           </div>
         </div>
       </div>
@@ -81,13 +85,19 @@ const toDetail = () => {
         <ActivityCountDown
           :start-at="options?.applyStartTime || options?.planApplyStartTime"
           :end-at="options?.applyEndTime || options?.planApplyEndTime"
+          @end="refresh"
         ></ActivityCountDown>
-        <div @tap.stop="status === 'running' && toDetail()">
-          <!-- {{ status !== 'running' }} -->
-          <ButtonEvo size="md" :disabled="status !== 'running'">
-            {{ options?.ifSingnUp ? '已报名' : getActivityStatusButtonText() }}
+        <TooltipEvo
+          placement="top"
+          :content="`还差${difference}积分`"
+          :model-value="status === 'runing' && difference > 0"
+        >
+          <!-- {{ difference }} -->
+          <ButtonEvo size="md">
+            {{ options?.ifSingnUp ? '已报名' : listItemButtonText }}
           </ButtonEvo>
-        </div>
+          <div @tap.stop="toDetail()"></div>
+        </TooltipEvo>
       </div>
       <div class="flex justify-between border-t-solid border-t-[#f2f2f2] border-t-1 py-4">
         <div></div>

+ 0 - 3
packages/app/src/utils/http.ts

@@ -2,7 +2,6 @@ import { refreshToken } from '../core/libs/requests'
 import { CustomRequestOptions } from '../interceptors/request'
 import { useUserStore } from '../store'
 import dayjs from 'dayjs'
-import * as sentry from 'sentry-uniapp'
 
 const userStore = useUserStore()
 // console.log(userStore.userInfo)
@@ -52,7 +51,6 @@ export const http = async <T>(options: CustomRequestOptions) => {
           } else if ((res.data as IResData<T>).code === 401) {
             userStore.clearUserInfo()
             // uni.navigateTo({ url: '/pages/login/index' })
-            sentry.captureException(res)
             reject(res)
           } else {
             !options.hideErrorToast &&
@@ -60,7 +58,6 @@ export const http = async <T>(options: CustomRequestOptions) => {
                 icon: 'none',
                 title: (res.data as IResData<T>).msg || '请求错误',
               })
-            sentry.captureException(res)
             reject(res.data)
           }
         } else if (res.statusCode === 401) {

+ 1 - 1
packages/merchant/package.json

@@ -113,7 +113,7 @@
     "vue": "^3.4.21",
     "vue-component-type-helpers": "^2.1.8",
     "vue-i18n": "^9.1.9",
-    "wot-design-uni": "^1.3.13",
+    "wot-design-uni": "^1.3.14",
     "z-paging": "^2.7.10"
   },
   "devDependencies": {

+ 14 - 92
pnpm-lock.yaml

@@ -92,9 +92,6 @@ importers:
       radash:
         specifier: ^12.1.0
         version: 12.1.0
-      sentry-uniapp:
-        specifier: ^1.0.12
-        version: 1.0.12
       uqrcodejs:
         specifier: ^4.0.7
         version: 4.0.7
@@ -111,8 +108,8 @@ importers:
         specifier: ^9.1.9
         version: 9.14.1(vue@3.5.13(typescript@4.9.5))
       wot-design-uni:
-        specifier: ^1.3.13
-        version: 1.3.13(vue@3.5.13(typescript@4.9.5))
+        specifier: ^1.3.14
+        version: 1.3.14(vue@3.5.13(typescript@4.9.5))
       z-paging:
         specifier: ^2.7.10
         version: 2.8.0
@@ -379,8 +376,8 @@ importers:
         specifier: ^9.1.9
         version: 9.14.1(vue@3.5.13(typescript@4.9.5))
       wot-design-uni:
-        specifier: ^1.3.13
-        version: 1.3.13(vue@3.5.13(typescript@4.9.5))
+        specifier: ^1.3.14
+        version: 1.3.14(vue@3.5.13(typescript@4.9.5))
       z-paging:
         specifier: ^2.7.10
         version: 2.8.0
@@ -2023,7 +2020,6 @@ packages:
   '@esbuild/darwin-arm64@0.20.2':
     resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==}
     engines: {node: '>=12'}
-    cpu: [arm64]
     os: [darwin]
 
   '@esbuild/darwin-arm64@0.21.5':
@@ -2035,7 +2031,6 @@ packages:
   '@esbuild/darwin-x64@0.20.2':
     resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==}
     engines: {node: '>=12'}
-    cpu: [x64]
     os: [darwin]
 
   '@esbuild/darwin-x64@0.21.5':
@@ -2805,42 +2800,36 @@ packages:
     engines: {node: '>= 10.0.0'}
     cpu: [arm]
     os: [linux]
-    libc: [glibc]
 
   '@parcel/watcher-linux-arm-musl@2.5.0':
     resolution: {integrity: sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==}
     engines: {node: '>= 10.0.0'}
     cpu: [arm]
     os: [linux]
-    libc: [musl]
 
   '@parcel/watcher-linux-arm64-glibc@2.5.0':
     resolution: {integrity: sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==}
     engines: {node: '>= 10.0.0'}
     cpu: [arm64]
     os: [linux]
-    libc: [glibc]
 
   '@parcel/watcher-linux-arm64-musl@2.5.0':
     resolution: {integrity: sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==}
     engines: {node: '>= 10.0.0'}
     cpu: [arm64]
     os: [linux]
-    libc: [musl]
 
   '@parcel/watcher-linux-x64-glibc@2.5.0':
     resolution: {integrity: sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==}
     engines: {node: '>= 10.0.0'}
     cpu: [x64]
     os: [linux]
-    libc: [glibc]
 
   '@parcel/watcher-linux-x64-musl@2.5.0':
     resolution: {integrity: sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==}
     engines: {node: '>= 10.0.0'}
     cpu: [x64]
     os: [linux]
-    libc: [musl]
 
   '@parcel/watcher-win32-arm64@2.5.0':
     resolution: {integrity: sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==}
@@ -2897,7 +2886,6 @@ packages:
 
   '@rollup/rollup-darwin-x64@4.27.3':
     resolution: {integrity: sha512-xW//zjJMlJs2sOrCmXdB4d0uiilZsOdlGQIC/jjmMWT47lkLLoB1nsNhPUcnoqyi5YR6I4h+FjBpILxbEy8JRg==}
-    cpu: [x64]
     os: [darwin]
 
   '@rollup/rollup-freebsd-arm64@4.27.3':
@@ -2914,55 +2902,46 @@ packages:
     resolution: {integrity: sha512-h2Ay79YFXyQi+QZKo3ISZDyKaVD7uUvukEHTOft7kh00WF9mxAaxZsNs3o/eukbeKuH35jBvQqrT61fzKfAB/Q==}
     cpu: [arm]
     os: [linux]
-    libc: [glibc]
 
   '@rollup/rollup-linux-arm-musleabihf@4.27.3':
     resolution: {integrity: sha512-Sv2GWmrJfRY57urktVLQ0VKZjNZGogVtASAgosDZ1aUB+ykPxSi3X1nWORL5Jk0sTIIwQiPH7iE3BMi9zGWfkg==}
     cpu: [arm]
     os: [linux]
-    libc: [musl]
 
   '@rollup/rollup-linux-arm64-gnu@4.27.3':
     resolution: {integrity: sha512-FPoJBLsPW2bDNWjSrwNuTPUt30VnfM8GPGRoLCYKZpPx0xiIEdFip3dH6CqgoT0RnoGXptaNziM0WlKgBc+OWQ==}
     cpu: [arm64]
     os: [linux]
-    libc: [glibc]
 
   '@rollup/rollup-linux-arm64-musl@4.27.3':
     resolution: {integrity: sha512-TKxiOvBorYq4sUpA0JT+Fkh+l+G9DScnG5Dqx7wiiqVMiRSkzTclP35pE6eQQYjP4Gc8yEkJGea6rz4qyWhp3g==}
     cpu: [arm64]
     os: [linux]
-    libc: [musl]
 
   '@rollup/rollup-linux-powerpc64le-gnu@4.27.3':
     resolution: {integrity: sha512-v2M/mPvVUKVOKITa0oCFksnQQ/TqGrT+yD0184/cWHIu0LoIuYHwox0Pm3ccXEz8cEQDLk6FPKd1CCm+PlsISw==}
     cpu: [ppc64]
     os: [linux]
-    libc: [glibc]
 
   '@rollup/rollup-linux-riscv64-gnu@4.27.3':
     resolution: {integrity: sha512-LdrI4Yocb1a/tFVkzmOE5WyYRgEBOyEhWYJe4gsDWDiwnjYKjNs7PS6SGlTDB7maOHF4kxevsuNBl2iOcj3b4A==}
     cpu: [riscv64]
     os: [linux]
-    libc: [glibc]
 
   '@rollup/rollup-linux-s390x-gnu@4.27.3':
     resolution: {integrity: sha512-d4wVu6SXij/jyiwPvI6C4KxdGzuZOvJ6y9VfrcleHTwo68fl8vZC5ZYHsCVPUi4tndCfMlFniWgwonQ5CUpQcA==}
     cpu: [s390x]
     os: [linux]
-    libc: [glibc]
 
   '@rollup/rollup-linux-x64-gnu@4.27.3':
     resolution: {integrity: sha512-/6bn6pp1fsCGEY5n3yajmzZQAh+mW4QPItbiWxs69zskBzJuheb3tNynEjL+mKOsUSFK11X4LYF2BwwXnzWleA==}
     cpu: [x64]
     os: [linux]
-    libc: [glibc]
 
   '@rollup/rollup-linux-x64-musl@4.27.3':
     resolution: {integrity: sha512-nBXOfJds8OzUT1qUreT/en3eyOXd2EH5b0wr2bVB5999qHdGKkzGzIyKYaKj02lXk6wpN71ltLIaQpu58YFBoQ==}
     cpu: [x64]
     os: [linux]
-    libc: [musl]
 
   '@rollup/rollup-win32-arm64-msvc@4.27.3':
     resolution: {integrity: sha512-ogfbEVQgIZOz5WPWXF2HVb6En+kWzScuxJo/WdQTqEgeyGkaa2ui5sQav9Zkr7bnNCLK48uxmmK0TySm22eiuw==}
@@ -2982,26 +2961,6 @@ packages:
   '@rtsao/scc@1.1.0':
     resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
 
-  '@sentry/core@6.19.7':
-    resolution: {integrity: sha512-tOfZ/umqB2AcHPGbIrsFLcvApdTm9ggpi/kQZFkej7kMphjT+SGBiQfYtjyg9jcRW+ilAR4JXC9BGKsdEQ+8Vw==}
-    engines: {node: '>=6'}
-
-  '@sentry/hub@6.19.7':
-    resolution: {integrity: sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==}
-    engines: {node: '>=6'}
-
-  '@sentry/minimal@6.19.7':
-    resolution: {integrity: sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==}
-    engines: {node: '>=6'}
-
-  '@sentry/types@6.19.7':
-    resolution: {integrity: sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==}
-    engines: {node: '>=6'}
-
-  '@sentry/utils@6.19.7':
-    resolution: {integrity: sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==}
-    engines: {node: '>=6'}
-
   '@sindresorhus/is@0.7.0':
     resolution: {integrity: sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==}
     engines: {node: '>=4'}
@@ -7800,10 +7759,6 @@ packages:
     resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
     engines: {node: '>= 0.8.0'}
 
-  sentry-uniapp@1.0.12:
-    resolution: {integrity: sha512-vAmJsYASH41R6Ery0F1Pmsxqj9fYw45GIQpYF2lOitb02B9xQ7A/1nvBlZilUWeggkj2a03825UySui4AZsv9A==}
-    engines: {node: '>=14'}
-
   serve-static@1.16.2:
     resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
     engines: {node: '>= 0.8.0'}
@@ -8349,9 +8304,6 @@ packages:
   tslib@1.10.0:
     resolution: {integrity: sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==}
 
-  tslib@1.14.1:
-    resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
-
   tslib@2.8.1:
     resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
 
@@ -8808,6 +8760,12 @@ packages:
     peerDependencies:
       vue: '>=3.2.47'
 
+  wot-design-uni@1.3.14:
+    resolution: {integrity: sha512-njqhMpVVHPWjiQdnuUkAFvCrJKv28RraSU6BiAW1soHw7BA6L3b7UJ0mdUMxsjT+A2hCk2YN8RsLKC03wDV9zw==}
+    engines: {HBuilderX: ^3.8.7}
+    peerDependencies:
+      vue: '>=3.2.47'
+
   wrap-ansi@6.2.0:
     resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
     engines: {node: '>=8'}
@@ -12433,33 +12391,6 @@ snapshots:
 
   '@rtsao/scc@1.1.0': {}
 
-  '@sentry/core@6.19.7':
-    dependencies:
-      '@sentry/hub': 6.19.7
-      '@sentry/minimal': 6.19.7
-      '@sentry/types': 6.19.7
-      '@sentry/utils': 6.19.7
-      tslib: 1.14.1
-
-  '@sentry/hub@6.19.7':
-    dependencies:
-      '@sentry/types': 6.19.7
-      '@sentry/utils': 6.19.7
-      tslib: 1.14.1
-
-  '@sentry/minimal@6.19.7':
-    dependencies:
-      '@sentry/hub': 6.19.7
-      '@sentry/types': 6.19.7
-      tslib: 1.14.1
-
-  '@sentry/types@6.19.7': {}
-
-  '@sentry/utils@6.19.7':
-    dependencies:
-      '@sentry/types': 6.19.7
-      tslib: 1.14.1
-
   '@sindresorhus/is@0.7.0': {}
 
   '@sindresorhus/is@4.6.0': {}
@@ -18489,13 +18420,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  sentry-uniapp@1.0.12:
-    dependencies:
-      '@sentry/core': 6.19.7
-      '@sentry/types': 6.19.7
-      '@sentry/utils': 6.19.7
-      tslib: 1.14.1
-
   serve-static@1.16.2:
     dependencies:
       encodeurl: 2.0.0
@@ -19103,8 +19027,6 @@ snapshots:
 
   tslib@1.10.0: {}
 
-  tslib@1.14.1: {}
-
   tslib@2.8.1: {}
 
   tunnel-agent@0.6.0:
@@ -19597,14 +19519,14 @@ snapshots:
 
   word-wrap@1.2.5: {}
 
-  wot-design-uni@1.3.13(vue@3.5.13(typescript@4.9.5)):
-    dependencies:
-      vue: 3.5.13(typescript@4.9.5)
-
   wot-design-uni@1.3.13(vue@3.5.13(typescript@5.6.3)):
     dependencies:
       vue: 3.5.13(typescript@5.6.3)
 
+  wot-design-uni@1.3.14(vue@3.5.13(typescript@4.9.5)):
+    dependencies:
+      vue: 3.5.13(typescript@4.9.5)
+
   wrap-ansi@6.2.0:
     dependencies:
       ansi-styles: 4.3.0