panhui 2 жил өмнө
parent
commit
2fb7473cfa

+ 1 - 0
package.json

@@ -17,6 +17,7 @@
     "qs": "^6.11.2",
     "vant": "^4.8.0",
     "vue": "^3.3.4",
+    "vue-i18n": "^9.8.0",
     "vue-router": "^4.2.5"
   },
   "devDependencies": {

+ 2 - 2
src/App.vue

@@ -4,7 +4,7 @@
 
 <style lang="less" scoped>
 .container {
-    height: 100vh;
-    overflow-y: auto;
+    min-height: 100vh;
+    // overflow-y: auto;
 }
 </style>

BIN
src/assets/icon_yaoqinghaoyou.png


BIN
src/assets/login_icon_mima.png


BIN
src/assets/login_icon_yanzhengma.png


BIN
src/assets/login_icon_zhanghao.png


BIN
src/assets/png-denglu-bg.png


+ 100 - 0
src/components/BuyPage copy.vue

@@ -0,0 +1,100 @@
+<template>
+    <van-popup class="buy-page" v-model:show="show" closeable round position="bottom" :style="{ maxHeight: '70%' }">
+        <div class="news-title text-white text-lg AlimamaShuHeiTi relative">
+            <span class="z-[1] relative">購買金豆</span>
+            <img class="w-[78px] h-[16px] absolute bottom-0 left-0 z-0" src="@/assets/png-xiantiao1.png" alt="" />
+        </div>
+        <div class="money text-xs text-white mt-[5px]">帳戶餘額:789金豆</div>
+
+        <div class="choose-list flex flex-wrap justify-between">
+            <div class="choose-btn active flex flex-col items-center justify-center">
+                <div class="val text-white">
+                    <span class="text-[16px]">¥</span>
+                    <span class="text-[26px]">19.9</span>
+                </div>
+                <div class="sub text-xs text-white">1990金豆+<span class="text-[#FFEF00]">送888金豆</span></div>
+                <div class="btn-tag">首充福利</div>
+            </div>
+            <div v-for="i in 3" :key="i" class="choose-btn flex flex-col items-center justify-center">
+                <div class="val text-white">
+                    <span class="text-[16px]">¥</span>
+                    <span class="text-[26px]">19.9</span>
+                </div>
+                <div class="sub text-xs text-white">1990金豆+<span class="text-[#FFEF00]">送888金豆</span></div>
+                <div class="btn-tag">粉丝福利</div>
+            </div>
+        </div>
+
+        <div class="tips text-[10px] text-[#61657A] text-center pt-[90px] pb-[18px]">
+            虛擬商品購買後不可退換,青少年請在家長陪同下購買
+        </div>
+
+        <div class="btn">
+            <van-button class="AlimamaShuHeiTi" type="primary" block round>立即支付</van-button>
+        </div>
+    </van-popup>
+</template>
+
+<script setup>
+import { ref } from 'vue'
+const show = ref(false)
+// const props = defineProps({
+//     show: {
+//         type: Boolean,
+//         default: false
+//     }
+// })
+// const emit = defineEmits(['update:show'])
+function changeShow(val) {
+    show.value = val
+}
+defineExpose({ changeShow })
+</script>
+
+<style lang="less" scoped>
+.buy-page {
+    --van-popup-background: #20223c;
+    padding: 21px 18px;
+}
+
+.choose-btn {
+    width: calc(50vw - 27px);
+    height: 88px;
+    background: #2d3059;
+    border-radius: 8px;
+    border: 1px solid #525686;
+    margin-top: 18px;
+    display: inline-flex;
+    position: relative;
+
+    .btn-tag {
+        font-size: 12px;
+        color: #ffffff;
+        line-height: 18px;
+        position: absolute;
+        top: 0;
+        left: 0;
+        width: 62px;
+        height: 18px;
+        background: #7f82af;
+        border-radius: 8px 0px 8px 0px;
+        text-align: center;
+    }
+
+    &.active {
+        background: #2d3059 linear-gradient(318deg, rgba(255, 87, 186, 0.1) 0%, rgba(255, 87, 186, 0.2) 100%);
+        border-radius: 8px;
+        border: 2px solid #ff57ba;
+        .sub {
+            span {
+                color: #fff !important;
+            }
+        }
+        .btn-tag {
+            background: #2d3059 linear-gradient(-318deg, #ff3b20, #ff57ba);
+            left: -2px;
+            top: -1px;
+        }
+    }
+}
+</style>

+ 12 - 0
src/locales/index.js

@@ -0,0 +1,12 @@
+import { createI18n } from 'vue-i18n'
+import zhTW from './zh-tw.json'
+const messages = {
+    zhTW: zhTW
+}
+const i18n = createI18n({
+    locale: 'zhTW',
+    fallbackLocale: 'zhTW',
+    messages,
+    legacy: false
+})
+export default i18n

+ 31 - 0
src/locales/zh-tw.json

@@ -0,0 +1,31 @@
+{
+  "mine": {
+    "wallet": "充值記錄",
+    "record": "消費記錄",
+    "connect": "聯系客服",
+    "history": "觀看歷史",
+    "share": "邀請好友",
+    "sign": "立即簽到",
+    "buy": "購買金豆",
+    "money": "我的金豆",
+    "nickname": "用戶昵稱",
+    "id": "看官ID",
+    "mine": "我的"
+  },
+  "zouma": "走馬短劇",
+  "home": {
+    "new": "新劇上線",
+    "hot": "熱門排行",
+    "recommend": "優選好劇"
+  },
+  "watching": {
+    "watching": "追劇",
+    "recently": "最近觀看",
+    "mine": "我的追劇"
+  },
+  "tab": {
+    "home": "首頁",
+    "watching": "追劇",
+    "mine": "我的"
+  }
+}

+ 5 - 0
src/main.js

@@ -10,6 +10,10 @@ import './styles/fonts.less'
 import vant from 'vant'
 import 'vant/lib/index.css'
 import './styles/common.less'
+import { Locale } from 'vant'
+import zhTW from 'vant/es/locale/lang/zh-TW'
+Locale.use('zh-TW', zhTW)
+import i18n from './locales'
 
 const app = createApp(App)
 
@@ -17,5 +21,6 @@ app.use(createPinia())
 app.use(router)
 app.use(vant)
 app.use(http)
+app.use(i18n)
 
 app.mount('#app')

+ 13 - 1
src/router/index.js

@@ -52,8 +52,20 @@ const router = createRouter({
             path: '/record',
             name: 'record',
             component: () => import('@/views/RecordView.vue')
+        },
+        {
+            path: '/login',
+            name: 'login',
+            component: () => import('@/views/LoginView.vue')
+        }
+    ],
+    scrollBehavior(to, from, savedPosition) {
+        console.log(to)
+        return {
+            left: 0,
+            top: 0
         }
-    ]
+    }
 })
 
 export default router

+ 1 - 0
src/styles/common.less

@@ -3,6 +3,7 @@
     --van-button-small-font-size: 14px;
     --van-button-primary-background: #7968fb;
     --van-button-primary-border-color: #7968fb;
+    --van-primary-color: #7968fb;
     --van-button-normal-font-size: 16px;
     --van-button-default-height: 40px;
 }

+ 5 - 5
src/views/HomeView.vue

@@ -1,7 +1,7 @@
 <template>
     <div class="home relative">
         <img src="@/assets/png-shouye-bg.png" class="top-bg !absolute w-full h-[200px] top-0 left-0 !z-0" alt="" />
-        <div class="title p-[18px] text-white text-[26px] AlimamaShuHeiTi">走馬短劇.</div>
+        <div class="title p-[18px] text-white text-[26px] AlimamaShuHeiTi">{{ $t('zouma') }}.</div>
 
         <van-swipe :loop="false" :width="300">
             <van-swipe-item v-for="i in 5" :key="i" class="pl-[18px]">
@@ -15,7 +15,7 @@
 
         <div class="py-6 px-[18px]">
             <div class="news-title text-white text-lg AlimamaShuHeiTi relative">
-                <span class="z-[1] relative">新劇上線</span>
+                <span class="z-[1] relative">{{ $t('home.new') }}</span>
                 <img class="w-78px] h-[16px] absolute bottom-0 left-0 z-0" src="@/assets/png-xiantiao1.png" alt="" />
             </div>
             <div class="news-list">
@@ -24,7 +24,7 @@
         </div>
 
         <div class="hot">
-            <div class="hot-title">熱門排行</div>
+            <div class="hot-title">{{ $t('home.hot') }}</div>
             <img src="@/assets/hotImg.png" alt="" class="hot-img" />
             <div class="hot-list">
                 <video-line v-for="i in 3" :key="i"></video-line>
@@ -52,7 +52,7 @@
         </div>
         <div class="py-6 px-[18px]">
             <div class="news-title text-white text-lg AlimamaShuHeiTi relative">
-                <span class="z-[1] relative">優選好劇</span>
+                <span class="z-[1] relative">{{ $t('home.recommend') }}</span>
                 <img class="w-[78px] h-[16px] absolute bottom-0 left-0 z-0" src="@/assets/png-xiantiao1.png" alt="" />
             </div>
             <div class="perfect-list">
@@ -136,7 +136,7 @@ import VideoLine from '../components/VideoLine.vue'
     .hot-list {
         position: relative;
         z-index: 1;
-        padding:0 14px 14px;
+        padding: 0 14px 14px;
 
         .video-info + .video-info {
             margin-top: 14px;

+ 137 - 0
src/views/LoginView.vue

@@ -0,0 +1,137 @@
+<template>
+    <div class="login">
+        <img src="@/assets/png-denglu-bg.png" class="top-bg !absolute w-full h-[200px] top-0 left-0 !z-0" alt="" />
+        <div class="login-content h-full">
+            <div class="text-white text-[26px] AlimamaShuHeiTi">Hi,歡迎來到走馬短劇</div>
+
+            <!-- 可以使用 CellGroup 作为容器 -->
+            <van-cell-group :border="false">
+                <van-field label-align="top" clearable v-model="form.mail" label="郵箱" placeholder="请输入郵箱">
+                    <template #left-icon>
+                        <img class="left-icon" src="@/assets/login_icon_zhanghao.png" alt="" />
+                    </template>
+                    <template #label>
+                        <div class="text-white text-[14px]">郵箱</div>
+                    </template>
+                </van-field>
+
+                <van-field
+                    label-align="top"
+                    clearable
+                    v-model="form.code"
+                    label="驗證碼"
+                    placeholder="請輸入驗證碼"
+                    v-if="loginCode"
+                >
+                    <template #left-icon>
+                        <img class="left-icon" src="@/assets/login_icon_yanzhengma.png" alt="" />
+                    </template>
+                    <template #label>
+                        <div class="text-white text-[14px]">驗證碼</div>
+                    </template>
+                    <template #button>
+                        <van-button class="px-[11px]" size="mini" round type="primary">獲取驗證碼</van-button>
+                    </template>
+                </van-field>
+
+                <van-field
+                    label-align="top"
+                    type="password"
+                    clearable
+                    v-model="form.password"
+                    label="密碼"
+                    placeholder="請輸入密碼"
+                    v-else
+                >
+                    <template #left-icon>
+                        <img class="left-icon" src="@/assets/login_icon_mima.png" alt="" />
+                    </template>
+                    <template #label>
+                        <div class="text-white text-[14px]">密碼</div>
+                    </template>
+                </van-field>
+
+                <!-- <div @click="loginCode = !loginCode" class="text-[#61657A] text-right text-xs underline pt-[10px]">
+                    {{ loginCode ? '密碼登录' : '验证码登录' }}
+                </div> -->
+
+                <div class="btn py-[64px] px-[17px]">
+                    <van-button type="primary" class="AlimamaShuHeiTi" block round>登入</van-button>
+
+                    <div class="text-[#61657A] text-sm mt-[20px] text-center">暫無帳號,立即注册</div>
+                </div>
+            </van-cell-group>
+
+            <div class="rule flex justify-center van-safe-area-bottom">
+                <van-checkbox v-model="checked">點擊同意注册協定</van-checkbox>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script setup>
+import { ref } from 'vue'
+
+const form = ref({
+    mail: '',
+    password: '',
+    code: ''
+})
+
+const checked = ref(false)
+
+const loginCode = ref(false)
+</script>
+
+<style lang="less" scoped>
+.login {
+    .login-content {
+        position: relative;
+        z-index: 1;
+        padding: 30px;
+    }
+}
+
+.van-cell-group {
+    --van-cell-group-background: transparent;
+    --van-cell-background: transparent;
+    --van-cell-border-color: #4d61657a;
+    --van-field-placeholder-text-color: #61657a;
+    /deep/.van-field__label--top {
+        margin-bottom: 14px;
+    }
+
+    /deep/.van-cell__value {
+        line-height: 44px;
+    }
+    .van-cell {
+        --van-cell-value-color: #fff;
+        --van-cell-font-size: 14px;
+        --van-field-input-text-color: #fff;
+        --van-field-clear-icon-color: #404455;
+        padding: 40px 0 0;
+        &::after {
+            left: 0;
+            right: 0;
+        }
+    }
+
+    .left-icon {
+        width: 24px;
+        height: 24px;
+    }
+}
+
+.rule {
+    position: fixed;
+    bottom: 30px;
+    left: 50%;
+    transform: translateX(-50%);
+    .van-checkbox {
+        --van-checkbox-size: 16px;
+        --van-checkbox-border-color: #61657a;
+        --van-checkbox-label-color: #61657a;
+        font-size: 12px;
+    }
+}
+</style>

+ 18 - 10
src/views/MineView.vue

@@ -2,13 +2,13 @@
     <div class="mine">
         <img src="@/assets/png-wode-bg.png" class="top-bg !absolute w-full h-[200px] top-0 left-0 !z-0" alt="" />
         <div class="mine-content">
-            <div class="title p-[18px] text-white text-[26px] AlimamaShuHeiTi">我的</div>
+            <div class="title p-[18px] text-white text-[26px] AlimamaShuHeiTi">{{ $t('mine.mine') }}</div>
 
             <div class="user-box flex px-[18px] pb-[28px]">
                 <van-image :src="defaultImg" width="60" height="60" type="contain" />
                 <div class="user-info ml-[12px]">
-                    <div class="text-[20px] text-white">用戶昵稱</div>
-                    <div class="text-xs text-white">看官ID: 338392</div>
+                    <div class="text-[20px] text-white">{{ $t('mine.nickname') }}</div>
+                    <div class="text-xs text-white">{{ $t('mine.id') }}: 338392</div>
                 </div>
             </div>
 
@@ -18,14 +18,14 @@
                 <div class="wallet-content absolute w-full h-full left-0 top-0 px-[36px] pt-[23px]">
                     <div class="wallet-title flex items-center">
                         <img src="@/assets/icon_jindou.png" class="w-[18px] h-[18px]" alt="" />
-                        <span>我的金豆</span>
+                        <span>{{ $t('mine.money') }}</span>
                     </div>
 
                     <div class="wallet-val flex items-center">
                         <div class="wallet-money">789</div>
                         <div @click="buy" class="wallet-btn">
                             <img src="@/assets/icon-anniu.png" alt="" />
-                            <span>購買金豆</span>
+                            <span>{{ $t('mine.buy') }}</span>
                         </div>
                     </div>
 
@@ -35,7 +35,7 @@
                         </div>
                         <div class="sign-btn w-[220px] mx-auto">
                             <van-button round block size="small" color="linear-gradient(180deg, #FF7340 , #FF3E3E )">
-                                立即簽到</van-button
+                                {{ $t('mine.sign') }}</van-button
                             >
                         </div>
                     </div>
@@ -44,7 +44,15 @@
 
             <div class="menu">
                 <van-cell-group>
-                    <van-cell title="觀看歷史" :to="{ path: '/history' }" is-link>
+                    <van-cell :title="$t('mine.share')" :to="{ path: '/history' }" is-link>
+                        <template #icon>
+                            <img src="@/assets/icon_yaoqinghaoyou.png" class="w-[24px] h-[24px] mr-[10px]" alt="" />
+                        </template>
+                        <!-- <template #right-icon>
+                        <img src="@/assets/icon_inter.png" class="w-[24px] h-[24px]" alt="" />
+                    </template> -->
+                    </van-cell>
+                    <van-cell :title="$t('mine.history')" :to="{ path: '/history' }" is-link>
                         <template #icon>
                             <img src="@/assets/icon_guankanjilu.png" class="w-[24px] h-[24px] mr-[10px]" alt="" />
                         </template>
@@ -52,17 +60,17 @@
                         <img src="@/assets/icon_inter.png" class="w-[24px] h-[24px]" alt="" />
                     </template> -->
                     </van-cell>
-                    <van-cell title="充值記錄" :to="{ path: '/wallet' }" is-link>
+                    <van-cell :title="$t('mine.wallet')" :to="{ path: '/wallet' }" is-link>
                         <template #icon>
                             <img src="@/assets/icon_chongzhijilu.png" class="w-[24px] h-[24px] mr-[10px]" alt="" />
                         </template>
                     </van-cell>
-                    <van-cell title="消費記錄" :to="{ path: '/record' }" is-link>
+                    <van-cell :title="$t('mine.record')" :to="{ path: '/record' }" is-link>
                         <template #icon>
                             <img src="@/assets/icon_xiaofeijilu.png" class="w-[24px] h-[24px] mr-[10px]" alt="" />
                         </template>
                     </van-cell>
-                    <van-cell title="聯系客服" @click="connect" is-link>
+                    <van-cell :title="$t('mine.connect')" @click="connect" is-link>
                         <template #icon>
                             <img src="@/assets/icon_kefu.png" class="w-[24px] h-[24px] mr-[10px]" alt="" />
                         </template>

+ 3 - 3
src/views/TabView.vue

@@ -6,19 +6,19 @@
 
         <van-tabbar v-model="active" route>
             <van-tabbar-item name="home" to="/home">
-                <span>首頁</span>
+                <span>{{ $t('tab.home') }}</span>
                 <template #icon="props">
                     <img :src="props.active ? homeImgPre : homeImg" />
                 </template>
             </van-tabbar-item>
             <van-tabbar-item name="watching" to="/watching">
-                <span>追劇</span>
+                <span>{{ $t('tab.watching') }}</span>
                 <template #icon="props">
                     <img :src="props.active ? videoImgPre : videoImg" />
                 </template>
             </van-tabbar-item>
             <van-tabbar-item name="mine" to="/mine">
-                <span>我的</span>
+                <span>{{ $t('tab.mine') }}</span>
                 <template #icon="props">
                     <img :src="props.active ? mineImgPre : mineImg" />
                 </template>

+ 1 - 1
src/views/WalletView.vue

@@ -5,7 +5,7 @@
             <van-sticky @change="changeSticky">
                 <van-nav-bar
                     :class="{ isFixed: isFixed }"
-                    title="充值記錄"
+                    :title="$t('mine.wallet')"
                     left-text=""
                     left-arrow
                     @click-left="back"

+ 3 - 3
src/views/WatchingView.vue

@@ -2,10 +2,10 @@
     <div class="watching">
         <img src="@/assets/png-zhuiju-bg.png" class="top-bg !absolute w-full h-[200px] top-0 left-0 !z-0" alt="" />
         <div class="watching-content">
-            <div class="title p-[18px] text-white text-[26px] AlimamaShuHeiTi">追劇</div>
+            <div class="title p-[18px] text-white text-[26px] AlimamaShuHeiTi">{{ $t('watching.watching') }}</div>
             <div class="pb-6 px-[18px]">
                 <div class="news-title text-white text-lg AlimamaShuHeiTi relative">
-                    <span class="z-[1] relative">最近觀看</span>
+                    <span class="z-[1] relative">{{ $t('watching.recently') }}</span>
                     <img
                         class="w-[78px] h-[16px] absolute bottom-0 left-0 z-0"
                         src="@/assets/png-xiantiao1.png"
@@ -19,7 +19,7 @@
 
             <div class="pb-6 px-[18px]">
                 <div class="news-title text-white text-lg AlimamaShuHeiTi relative">
-                    <span class="z-[1] relative">我的追劇</span>
+                    <span class="z-[1] relative">{{ $t('watching.mine') }}</span>
                     <img
                         class="w-[78px] h-[16px] absolute bottom-0 left-0 z-0"
                         src="@/assets/png-xiantiao1.png"

+ 149 - 26
yarn.lock

@@ -17,11 +17,116 @@
   resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz"
   integrity sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==
 
+"@esbuild/android-arm64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622"
+  integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==
+
+"@esbuild/android-arm@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682"
+  integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==
+
+"@esbuild/android-x64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2"
+  integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==
+
+"@esbuild/darwin-arm64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1"
+  integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==
+
 "@esbuild/darwin-x64@0.18.20":
   version "0.18.20"
   resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz"
   integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==
 
+"@esbuild/freebsd-arm64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54"
+  integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==
+
+"@esbuild/freebsd-x64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e"
+  integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==
+
+"@esbuild/linux-arm64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0"
+  integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==
+
+"@esbuild/linux-arm@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0"
+  integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==
+
+"@esbuild/linux-ia32@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7"
+  integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==
+
+"@esbuild/linux-loong64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d"
+  integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==
+
+"@esbuild/linux-mips64el@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231"
+  integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==
+
+"@esbuild/linux-ppc64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb"
+  integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==
+
+"@esbuild/linux-riscv64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6"
+  integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==
+
+"@esbuild/linux-s390x@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071"
+  integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==
+
+"@esbuild/linux-x64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338"
+  integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==
+
+"@esbuild/netbsd-x64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1"
+  integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==
+
+"@esbuild/openbsd-x64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae"
+  integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==
+
+"@esbuild/sunos-x64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d"
+  integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==
+
+"@esbuild/win32-arm64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9"
+  integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==
+
+"@esbuild/win32-ia32@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102"
+  integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==
+
+"@esbuild/win32-x64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d"
+  integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==
+
 "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
   version "4.4.0"
   resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz"
@@ -73,6 +178,27 @@
   resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz"
   integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==
 
+"@intlify/core-base@9.8.0":
+  version "9.8.0"
+  resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-9.8.0.tgz#969ca59f55084e23e968ec0bfe71678774e568ec"
+  integrity sha512-UxaSZVZ1DwqC/CltUZrWZNaWNhfmKtfyV4BJSt/Zt4Or/fZs1iFj0B+OekYk1+MRHfIOe3+x00uXGQI4PbO/9g==
+  dependencies:
+    "@intlify/message-compiler" "9.8.0"
+    "@intlify/shared" "9.8.0"
+
+"@intlify/message-compiler@9.8.0":
+  version "9.8.0"
+  resolved "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-9.8.0.tgz#587d69b302f9b8130a4a949b0ab4add519761787"
+  integrity sha512-McnYWhcoYmDJvssVu6QGR0shqlkJuL1HHdi5lK7fNqvQqRYaQ4lSLjYmZxwc8tRNMdIe9/KUKfyPxU9M6yCtNQ==
+  dependencies:
+    "@intlify/shared" "9.8.0"
+    source-map-js "^1.0.2"
+
+"@intlify/shared@9.8.0":
+  version "9.8.0"
+  resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.8.0.tgz#62adf8f6ef67c8eba6cf8d521e248f3503f237d3"
+  integrity sha512-TmgR0RCLjzrSo+W3wT0ALf9851iFMlVI9EYNGeWvZFUQTAJx0bvfsMlPdgVtV1tDNRiAfhkFsMKu6jtUY1ZLKQ==
+
 "@jridgewell/gen-mapping@^0.3.2":
   version "0.3.3"
   resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz"
@@ -113,7 +239,7 @@
     "@nodelib/fs.stat" "2.0.5"
     run-parallel "^1.1.9"
 
-"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
   version "2.0.5"
   resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
   integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
@@ -266,7 +392,7 @@
     "@vue/compiler-ssr" "3.3.8"
     "@vue/shared" "3.3.8"
 
-"@vue/shared@^3.0.0", "@vue/shared@3.3.8":
+"@vue/shared@3.3.8", "@vue/shared@^3.0.0":
   version "3.3.8"
   resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.3.8.tgz"
   integrity sha512-8PGwybFwM4x8pcfgqEQFy70NaQxASvOC5DJwLQfpArw1UDfUXrJkdxD3BhVTMS+0Lef/TU7YO0Jvr0jJY8T+mw==
@@ -298,7 +424,7 @@ acorn-jsx@^5.3.2:
   resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
   integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
 
-"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.9.0:
+acorn@^8.9.0:
   version "8.11.2"
   resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz"
   integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==
@@ -416,7 +542,7 @@ braces@^3.0.2, braces@~3.0.2:
   dependencies:
     fill-range "^7.0.1"
 
-browserslist@^4.21.10, "browserslist@>= 4.21.0":
+browserslist@^4.21.10:
   version "4.22.1"
   resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz"
   integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==
@@ -697,7 +823,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4
   resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
   integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
 
-"eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^6.2.0 || ^7.0.0 || ^8.0.0", eslint@^8.49.0, "eslint@>= 8.0.0", eslint@>=6.0.0, eslint@>=7.0.0, eslint@>=8.0.0:
+eslint@^8.49.0:
   version "8.54.0"
   resolved "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz"
   integrity sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==
@@ -932,7 +1058,7 @@ get-stream@^6.0.0, get-stream@^6.0.1:
   resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz"
   integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
 
-glob-parent@^5.1.2:
+glob-parent@^5.1.2, glob-parent@~5.1.2:
   version "5.1.2"
   resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
   integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
@@ -946,14 +1072,7 @@ glob-parent@^6.0.2:
   dependencies:
     is-glob "^4.0.3"
 
-glob-parent@~5.1.2:
-  version "5.1.2"
-  resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
-  integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
-  dependencies:
-    is-glob "^4.0.1"
-
-glob@^7.1.3, glob@7.1.6:
+glob@7.1.6, glob@^7.1.3:
   version "7.1.6"
   resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz"
   integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
@@ -1185,7 +1304,7 @@ keyv@^4.5.3:
   dependencies:
     json-buffer "3.0.1"
 
-less@*, less@^4.2.0:
+less@^4.2.0:
   version "4.2.0"
   resolved "https://registry.npmjs.org/less/-/less-4.2.0.tgz"
   integrity sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==
@@ -1316,7 +1435,7 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2:
   dependencies:
     brace-expansion "^1.1.7"
 
-ms@^2.1.1, ms@2.1.2:
+ms@2.1.2, ms@^2.1.1:
   version "2.1.2"
   resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
   integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
@@ -1571,7 +1690,7 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0:
   resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
   integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
 
-postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.27, postcss@^8.4.31, postcss@>=8.0.9:
+postcss@^8.4.23, postcss@^8.4.27, postcss@^8.4.31:
   version "8.4.31"
   resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz"
   integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==
@@ -1592,7 +1711,7 @@ prettier-linter-helpers@^1.0.0:
   dependencies:
     fast-diff "^1.1.2"
 
-prettier@^3.0.3, "prettier@>= 3.0.0", prettier@>=3.0.0:
+prettier@^3.0.3:
   version "3.1.0"
   resolved "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz"
   integrity sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==
@@ -1923,7 +2042,7 @@ vant@^4.8.0:
     "@vant/use" "^1.6.0"
     "@vue/shared" "^3.0.0"
 
-"vite@^4.0.0 || ^5.0.0", vite@^4.4.11:
+vite@^4.4.11:
   version "4.5.0"
   resolved "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz"
   integrity sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==
@@ -1934,12 +2053,7 @@ vant@^4.8.0:
   optionalDependencies:
     fsevents "~2.3.2"
 
-vue-demi@>=0.14.5:
-  version "0.14.6"
-  resolved "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz"
-  integrity sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==
-
-vue-demi@>=0.14.6:
+vue-demi@>=0.14.5, vue-demi@>=0.14.6:
   version "0.14.6"
   resolved "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz"
   integrity sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==
@@ -1957,6 +2071,15 @@ vue-eslint-parser@^9.3.1:
     lodash "^4.17.21"
     semver "^7.3.6"
 
+vue-i18n@^9.8.0:
+  version "9.8.0"
+  resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-9.8.0.tgz#54339daf377a31b234b027c5158e774728b6bc24"
+  integrity sha512-Izho+6PYjejsTq2mzjcRdBZ5VLRQoSuuexvR8029h5CpN03FYqiqBrShMyf2I1DKkN6kw/xmujcbvC+4QybpsQ==
+  dependencies:
+    "@intlify/core-base" "9.8.0"
+    "@intlify/shared" "9.8.0"
+    "@vue/devtools-api" "^6.5.0"
+
 vue-router@^4.2.5:
   version "4.2.5"
   resolved "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz"
@@ -1964,7 +2087,7 @@ vue-router@^4.2.5:
   dependencies:
     "@vue/devtools-api" "^6.5.0"
 
-"vue@^2.6.14 || ^3.3.0", vue@^3.0.0, "vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.25, vue@^3.3.4, vue@3.3.8:
+vue@^3.3.4:
   version "3.3.8"
   resolved "https://registry.npmjs.org/vue/-/vue-3.3.8.tgz"
   integrity sha512-5VSX/3DabBikOXMsxzlW8JyfeLKlG9mzqnWgLQLty88vdZL7ZJgrdgBOmrArwxiLtmS+lNNpPcBYqrhE6TQW5w==