Compare commits

...

7 Commits

11 changed files with 451 additions and 140 deletions

View File

@ -3,7 +3,7 @@ import useKeepalive from '~/composables/keepalive'
import { appName, appDescription } from '~/constants'
import { useI18n } from 'vue-i18n'
import {message} from '@/components/x-message/useMessage.js'
message.success('success')
// message.success('success')
useHead({
title: useI18n().t('appSetting.appName'),
meta: [

View File

@ -1,5 +1,5 @@
<script setup>
import { useAppFooterRouteNames as routeWhiteList } from '~/config'
import { useAppHeaderRouteNames as routeWhiteList } from '~/config'
const route = useRoute()
const router = useRouter()

View File

@ -1,2 +1,3 @@
export const useAppFooterRouteNames= ['home', 'profile']
export const useAppHeaderRouteNames= ['home', 'profile','login']

View File

@ -3,37 +3,69 @@ import {ref, computed, watch} from 'vue';
import pinyin from 'pinyin';
import countryCode from './data/index.js';
import { useI18n } from 'vue-i18n'
import { useRouter } from 'vue-router'
definePageMeta({
title: '国家地区',
i18n: 'countryRegion.title',
})
const router = useRouter()
const { t, locale } = useI18n()
const value = ref('');
const alphabet = [
'#',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
];
//
const frequentCountryCodes = ['CN', 'TW', 'JP', 'US'];
function groupByPinyinInitial(data) {
const grouped = {};
//
grouped['#'] = [];
data.forEach(country => {
//
const countryName = locale.value === 'zh-CN' ? country.cn :
locale.value === 'zh-TW' ? country.tw :
locale.value === 'ja-JP' ? country.ja :
country.en;
const initial = locale.value === 'ja-JP' ? '' :
locale.value === 'zh-CN' || locale.value === 'zh-TW' ?
pinyin(countryName, {style: pinyin.STYLE_FIRST_LETTER})[0][0].toUpperCase() :
countryName.charAt(0).toUpperCase();
if (!grouped[initial]) {
grouped[initial] = [];
if (frequentCountryCodes.includes(country.code)) {
const countryName = locale.value === 'zh-CN' ? country.cn :
locale.value === 'zh-TW' ? country.tw :
locale.value === 'ja-JP' ? country.ja :
country.en;
grouped['#'].push({
...country,
displayName: countryName
});
}
grouped[initial].push({
...country,
displayName: countryName
});
});
//
data.forEach(country => {
if (!frequentCountryCodes.includes(country.code)) {
const countryName = locale.value === 'zh-CN' ? country.cn :
locale.value === 'zh-TW' ? country.tw :
locale.value === 'ja-JP' ? country.ja :
country.en;
const initial = locale.value === 'ja-JP' ? '' :
locale.value === 'zh-CN' || locale.value === 'zh-TW' ?
pinyin(countryName, {style: pinyin.STYLE_FIRST_LETTER})[0][0].toUpperCase() :
countryName.charAt(0).toUpperCase();
if (!grouped[initial]) {
grouped[initial] = [];
}
grouped[initial].push({
...country,
displayName: countryName
});
}
});
if (locale.value === 'ja-JP') {
//
grouped[''] = grouped[''].sort((a, b) => a.displayName.localeCompare(b.displayName, 'ja-JP'));
}
return grouped;
}
@ -59,6 +91,16 @@ const searchCountry = computed(() => {
const showIndexBar = computed(() => locale.value !== 'ja-JP')
const handleCountrySelect = (country) => {
router.push({
path: '/login',
query: {
zone: country.zone,
countryName: country.displayName
}
})
}
initData()
//
@ -78,20 +120,58 @@ watch(locale, () => {
:sticky-offset-top="55"
:index-list="alphabet"
>
<!-- 常用国家分类 -->
<van-index-anchor index="#">{{ t('countryRegion.frequentCountry') }}</van-index-anchor>
<van-cell
v-for="country in searchCountry['#']"
:key="country.code"
:title="country.displayName"
@click="handleCountrySelect(country)"
clickable
>
<div class="pr-[25px]"> +{{ country.zone }}</div>
</van-cell>
<!-- 其他国家按字母分类 -->
<template v-for="(countries, index) in searchCountry" :key="index">
<van-index-anchor
:index="index"
></van-index-anchor>
<van-cell v-for="country in countries" :key="country.code" :title="country.displayName">
<div class="pr-[25px]"> +{{ country.zone }}</div>
</van-cell>
<template v-if="index !== '#'">
<van-index-anchor
:index="index"
></van-index-anchor>
<van-cell
v-for="country in countries"
:key="country.code"
:title="country.displayName"
@click="handleCountrySelect(country)"
clickable
>
<div class="pr-[25px]"> +{{ country.zone }}</div>
</van-cell>
</template>
</template>
</van-index-bar>
<div v-else>
<van-cell v-for="country in Object.values(searchCountry).flat()"
:key="country.code"
:title="country.displayName">
<div class="mb-4">
<div class="px-4 py-2 text-gray-600">{{ t('countryRegion.frequentCountry') }}</div>
<van-cell
v-for="country in searchCountry['#']"
:key="country.code"
:title="country.displayName"
@click="handleCountrySelect(country)"
clickable
>
<div class="pr-[25px]"> +{{ country.zone }}</div>
</van-cell>
</div>
<van-cell
v-for="country in Object.values(searchCountry).flat().filter(c => !frequentCountryCodes.includes(c.code))"
:key="country.code"
:title="country.displayName"
@click="handleCountrySelect(country)"
clickable
>
<div class="pr-[25px]"> +{{ country.zone }}</div>
</van-cell>
</div>

View File

@ -1,16 +1,78 @@
<script setup>
import { useRouter } from 'vue-router';
import { useRouter, useRoute } from 'vue-router';
import { useI18n } from 'vue-i18n'
import countryCode from '../countryRegion/data/index.js'
const router = useRouter();
const route = useRoute();
const { locale } = useI18n()
definePageMeta({
layout: 'login',
title: '登录',
i18n: 'login.title',
})
function goToPage() {
router.push('/countryRegion');
}
const phoneNum=ref('')
const code=ref('')
const pane=ref(0)
const phoneNum = ref('')
const code = ref('')
const pane = ref(0)
const showKeyboard = ref(true);
//
const getDefaultCountry = () => {
let defaultCode = 'CN' //
switch (locale.value) {
case 'zh-CN':
defaultCode = 'CN'
break
case 'zh-TW':
defaultCode = 'TW'
break
case 'ja-JP':
defaultCode = 'JP'
break
case 'en-US':
defaultCode = 'US'
break
}
const country = countryCode.find(c => c.code === defaultCode)
return {
zone: country.zone,
name: locale.value === 'zh-CN' ? country.cn :
locale.value === 'zh-TW' ? country.tw :
locale.value === 'ja-JP' ? country.ja :
country.en
}
}
const defaultCountry = getDefaultCountry()
//
const selectedZone = ref(route.query.zone || defaultCountry.zone)
const selectedCountry = ref(route.query.countryName || defaultCountry.name)
//
watch(locale, () => {
if (!route.query.zone) {
const newDefault = getDefaultCountry()
selectedZone.value = newDefault.zone
selectedCountry.value = newDefault.name
}
})
const getCode = () => {
pane.value = 1
}
const goBack = () => {
code.value = ''
pane.value = 0
}
const goLogin = () => {
router.push('/realAuth');
}
</script>
<template>
@ -18,19 +80,19 @@ const pane=ref(0)
<div class="w-full flex justify-center mb-[100px]">
<img class="h-[105px] w-[189px]" src="@/static/images/ghfggff.png" alt="">
</div>
<div v-if="pane===0">
<div v-if="pane === 0">
<div class="">
<div class="w-full flex justify-between" @click="goToPage">
<div class="text-[16px] text-[#000]">
中国大陆
{{ selectedCountry }}
</div>
<div><van-icon color="#777" name="arrow" size="14" /></div>
</div>
<div class="border-b-[1.7px] mt-[8px]">
<van-field v-model="phoneNum" clearable placeholder="请输入手机号">
<van-field v-model="phoneNum" clearable :placeholder="$t('login.phonePlaceholder')">
<template #label>
<div class="text-[16px] text-[#1A1A1A] flex align-center justify-start">
+86
+{{ selectedZone }}
</div>
</template>
</van-field>
@ -38,39 +100,45 @@ const pane=ref(0)
<div />
</div>
<div class="mt-[55px]">
<van-button v-if="phoneNum" type="primary" block style="height: 48px" >获取验证码</van-button>
<van-button v-else type="primary" color="#D3D3D3" block style="height: 48px" >获取验证码</van-button>
<van-button v-if="phoneNum" type="primary" block style="height: 48px" @click="getCode">{{ $t('login.getCode')
}}</van-button>
<van-button v-else type="primary" color="#D3D3D3" block style="height: 48px">{{ $t('login.getCode')
}}</van-button>
</div>
</div>
<div v-else>
<div class="flex mb-[16px]">
<div class="text-[16px] text-[#BDBDBD] mr-[10px]">已发送验证码至</div>
<div class="text-[16px] text-[#000]">15834362333</div>
<div class="text-[16px] text-[#BDBDBD] mr-[10px]">{{ $t('login.hasSendTo') }}</div>
<div class="text-[16px] text-[#000]">+{{ selectedZone }} {{ phoneNum }}</div>
</div>
<van-password-input
:value="code"
:gutter="10"
focused
/>
<van-password-input :value="code" :gutter="10" :mask="false" focused @focus="showKeyboard = true" />
<van-number-keyboard v-model="code" :show="showKeyboard" @blur="showKeyboard = false" />
<div class="text-#2B53AC text-14px">
重新发送
{{ $t('login.reSend') }}
</div>
<div class="mt-[17px]">
<van-button v-if="code.length === 6" type="primary" block style="height: 48px" >登录</van-button>
<van-button v-else type="primary" color="#D3D3D3" block style="height: 48px" >登录</van-button>
<van-button v-if="code.length === 6" type="primary" block style="height: 48px" @click="goLogin">{{
$t('login.login')
}}</van-button>
<van-button v-else type="primary" color="#D3D3D3" block style="height: 48px">{{ $t('login.login') }}</van-button>
</div>
<div class="mt-[17px]">
<van-button type="primary" @click="goBack" block style="height: 48px">{{ $t('login.back') }}</van-button>
</div>
</div>
</div>
</template>
<style scoped lang="scss">
:deep(.van-cell.van-field){
:deep(.van-cell.van-field) {
padding-left: 0;
}
:deep(.van-password-input){
:deep(.van-password-input) {
margin: 0;
}
:deep(.van-password-input__item){
:deep(.van-password-input__item) {
border: 1px solid #E5E5E5;
width: 41px;
height: 41px;

View File

@ -1,37 +1,119 @@
<script setup>
import { useRouter, useRoute } from 'vue-router';
import { useI18n } from 'vue-i18n'
const router = useRouter();
const route = useRoute();
const showPicker = ref(false);
const pickerValue = ref([]);
const gender = ref('男')
const birthday = ref('')
const birthdayDate = ref([])
const showBirthdayPicker = ref(false)
const minDate = new Date(1950, 0, 1)
const maxDate = new Date(2025, 12, 31)
const { t } = useI18n()
const columns = computed(() => [
{ text: t('realAuth.male'), value: t('realAuth.male') },
{ text: t('realAuth.female'), value: t('realAuth.female') },
]);
const onConfirm = ({ selectedValues, selectedOptions }) => {
pickerValue.value = selectedValues
gender.value = selectedOptions[0].text
showPicker.value = false
}
const onBirthdayConfirm = (value) => {
console.log(value)
birthdayDate.value = value.selectedValues
birthday.value = value.selectedValues.join('-')
showBirthdayPicker.value = false
}
definePageMeta({
title: '实名认证',
i18n: 'realAuth.title',
})
</script>
<template>
<div class="px-[31px] bg-#fff w-100vw h-100vh pt-[46px]">
<van-tabs>
<van-tab title="大陆居民" class="pt-[80px]">
<div class="text-[#BDBDBD] text-[16px] mb-[34px]">请填写身份证相关信息</div>
<div class="mb-[100px]">
<div class="border-b-[1.7px] mt-[8px]">
<van-field label="身份证号" clearable placeholder="请输入身份证号"></van-field>
<div class="px-[31px] bg-#fff w-100vw h-100vh pt-[46px]">
<van-tabs animated swipeable>
<van-tab :title="$t('realAuth.cnTab')" class="pt-[80px]">
<div class="text-[#BDBDBD] text-[16px] mb-[34px]">{{ $t('realAuth.cnTabDesc') }}</div>
<div class="mb-[100px]">
<div class="border-b-[1.7px] mt-[8px]">
<van-field :label="$t('realAuth.idCard')" clearable
:placeholder="$t('realAuth.idCardPlaceholder')"></van-field>
</div>
<div class="border-b-[1.7px] mt-[8px]">
<van-field :label="$t('realAuth.name')" clearable :placeholder="$t('realAuth.namePlaceholder')"></van-field>
</div>
</div>
<div class="border-b-[1.7px] mt-[8px]">
<van-field label="姓名" clearable placeholder="请输入姓名"></van-field>
<div class="flex justify-between">
<van-button style="width: 151px;height: 48px" color="#E9F1F8">
<div class="text-#2B53AC text-16px">{{ $t('realAuth.cancel') }}</div>
</van-button>
<van-button style="width: 151px;height: 48px" color="#2B53AC">
<div class="text-#FFFFFF text-16px">{{ $t('realAuth.confirm') }}</div>
</van-button>
</div>
</div>
<div class="flex justify-between">
<van-button style="width: 151px;height: 48px" color="#E9F1F8">
<div class="text-#2B53AC text-16px">取消</div>
</van-button>
<van-button style="width: 151px;height: 48px" color="#2B53AC">
<div class="text-#FFFFFF text-16px">确定</div>
</van-button>
</div>
</van-tab>
<van-tab title="非大陆居民">内容 2</van-tab>
</van-tabs>
</div>
</van-tab>
<van-tab :title="$t('realAuth.otherTab')" class="pt-[80px]">
<div class="text-[#BDBDBD] text-[16px] mb-[34px]">{{ $t('realAuth.otherTabDesc') }}</div>
<div class="mb-[100px]">
<div class="border-b-[1.7px] mt-[8px]">
<van-field :label="$t('realAuth.name')" clearable :placeholder="$t('realAuth.namePlaceholder')"></van-field>
</div>
<div class="border-b-[1.7px] mt-[8px]">
<van-field v-model="gender" is-link readonly name="picker" :label="$t('realAuth.gender')"
@click="showPicker = true" />
</div>
<div class="border-b-[1.7px] mt-[8px]">
<van-field v-model="birthday" is-link readonly name="birthdayPicker" :label="$t('realAuth.birthday')"
:placeholder="$t('realAuth.birthdayPlaceholder')" @click="showBirthdayPicker = true" />
</div>
<div class="border-b-[1.7px] mt-[8px]">
<van-field :label="$t('realAuth.adress')" clearable
:placeholder="$t('realAuth.adressPlaceholder')"></van-field>
</div>
<div class="border-b-[1.7px] mt-[8px]">
<van-field :label="$t('realAuth.bank')" clearable :placeholder="$t('realAuth.bankPlaceholder')"></van-field>
</div>
<div class="border-b-[1.7px] mt-[8px]">
<van-field :label="$t('realAuth.bankCard')" clearable
:placeholder="$t('realAuth.bankCardPlaceholder')"></van-field>
</div>
<div class="flex justify-between mt-[100px]">
<van-button style="width: 151px;height: 48px" color="#E9F1F8">
<div class="text-#2B53AC text-16px">{{ $t('realAuth.cancel') }}</div>
</van-button>
<van-button style="width: 151px;height: 48px" color="#2B53AC">
<div class="text-#FFFFFF text-16px">{{ $t('realAuth.confirm') }}</div>
</van-button>
</div>
</div>
</van-tab>
</van-tabs>
<van-popup v-model:show="showPicker" destroy-on-close position="bottom">
<van-picker :columns="columns" :model-value="pickerValue" @confirm="onConfirm" @cancel="showPicker = false" />
</van-popup>
<van-popup v-model:show="showBirthdayPicker" destroy-on-close position="bottom">
<van-date-picker v-model="birthdayDate" :min-date="minDate" :max-date="maxDate"
@cancel="showBirthdayPicker = false" @confirm="onBirthdayConfirm" />
</van-popup>
</div>
</template>
<style scoped>
:deep(.van-tabs__line){
:deep(.van-tabs__line) {
height: 2px;
width: 107px;
}
:deep(.van-cell) {
padding-left: 0;
}
</style>

View File

@ -19,10 +19,14 @@
"home": "Home",
"profile": "Profile"
},
"unocss_page": {
"hello": "Hello {0}",
"desc": "This is a simple example of Unocss in action.",
"btn_txt": "Button"
"login": {
"title": "Login",
"phonePlaceholder": "Please enter your phone number",
"getCode": "Get verification code",
"login": "Login",
"back": "Back",
"hasSendTo": "Verification code has been sent to",
"reSend": "Re-send"
},
"error_page": {
"back_btn": "Back",
@ -31,20 +35,38 @@
"profile_page": {
"txt": "WIP"
},
"keepalive_page": {
"label": "The current component will be cached"
},
"counter_page": {
"label": "This is a simple example of persisting Pinia state. To verify its effectiveness, you can refresh the interface and observe it.",
"label_num": "Number",
"btn_add": "Add"
},
"prose_page": {
"btn_fetch": "Fetch",
"btn_clear": "Clear",
"btn_empty_desc": "No data"
},
"countryRegion": {
"searchPlaceholder": "Please enter the country and region"
"title": "Country and Region",
"searchPlaceholder": "Please enter the country and region",
"frequentCountry": "Frequent"
},
"realAuth": {
"title": "Real-name Authentication",
"cnTab": "Mainland Residents",
"otherTab": "Non-Mainland Residents",
"cnTabDesc": "Please fill in ID card information",
"otherTabDesc": "Please upload personal information",
"idCard": "ID Card Number",
"idCardPlaceholder": "Please enter ID card number",
"name": "Name",
"namePlaceholder": "Please enter your name",
"gender": "Gender",
"male": "Male",
"female": "Female",
"birthday": "Date of Birth",
"birthdayPlaceholder": "Please enter date of birth",
"adress": "Home Address",
"adressPlaceholder": "Please enter home address",
"bank": "Bank",
"bankPlaceholder": "Please select your bank",
"bankCard": "Bank Card Number",
"bankCardPlaceholder": "Please enter bank card number",
"cancel": "Cancel",
"confirm": "Confirm"
}
}

View File

@ -19,32 +19,51 @@
"home": "ホーム",
"profile": "マイページ"
},
"unocss_page": {
"hello": "こんにちは {0}",
"desc": "これは unocss の簡単な例です。",
"btn_txt": "ボタン"
"login": {
"title": "ログイン",
"phonePlaceholder": "携帯番号を入力してください",
"getCode": "認証コードを取得",
"login": "ログイン",
"back": "戻る",
"hasSendTo": "認証コードは",
"reSend": "再送"
},
"error_page": {
"back_btn": "戻る",
"txt": "ページが見つかりません"
},
"profile_page": {
"txt": "未完成"
},
"keepalive_page": {
"label": "このコンポーネントはキャッシュされます"
},
"counter_page": {
"label": "これは Pinia の状態永続化の簡単な例です。有効性を確認するには、ページを更新して観察してください。",
"label_num": "数字",
"btn_add": "増加"
},
"prose_page": {
"btn_fetch": "取得",
"btn_clear": "クリア",
"btn_empty_desc": "データなし"
},
"countryRegion": {
"searchPlaceholder": "国と地域を入力してください"
"title": "国と地域",
"searchPlaceholder": "国と地域を入力してください",
"frequentCountry": "よく使う"
},
"realAuth": {
"title": "実名認証",
"cnTab": "中国本土住民",
"otherTab": "非中国本土住民",
"cnTabDesc": "身分証情報を入力してください",
"otherTabDesc": "個人情報をアップロードしてください",
"idCard": "身分証番号",
"idCardPlaceholder": "身分証番号を入力してください",
"name": "氏名",
"namePlaceholder": "氏名を入力してください",
"gender": "性別",
"male": "男性",
"female": "女性",
"birthday": "生年月日",
"birthdayPlaceholder": "生年月日を入力してください",
"adress": "住所",
"adressPlaceholder": "住所を入力してください",
"bank": "所属銀行",
"bankPlaceholder": "所属銀行を選択してください",
"bankCard": "銀行カード番号",
"bankCardPlaceholder": "銀行カード番号を入力してください",
"cancel": "キャンセル",
"confirm": "確定"
}
}
}

View File

@ -19,36 +19,55 @@
"home": "主页",
"profile": "我的"
},
"login": {
"title": "登录",
"phonePlaceholder": "请输入手机号",
"getCode": "获取验证码",
"login": "登录",
"back": "返回",
"hasSendTo": "已发送验证码至",
"reSend": "重新发送"
},
"profile": {
"name": "姓名",
"phone": "手机号"
},
"unocss_page": {
"hello": "你好 {0}",
"desc": "这是 unocss 一个简单例子。",
"btn_txt": "按钮"
},
"error_page": {
"back_btn": "返回",
"txt": "没有找到"
},
"profile_page": {
"txt": "未完成"
},
"keepalive_page": {
"label": "当前组件将会被缓存"
},
"counter_page": {
"label": "这是一个简单的持久化 Pinia 状态的例子。为了验证其有效性,你可以刷新界面并观察它。",
"label_num": "数字",
"btn_add": "增加"
},
"prose_page": {
"btn_fetch": "拉取",
"btn_clear": "清空",
"btn_empty_desc": "暂无数据"
},
"countryRegion": {
"searchPlaceholder": "请输入国家和地区"
"title": "国家地区",
"searchPlaceholder": "请输入国家和地区",
"frequentCountry": "常用"
},
"realAuth": {
"title": "实名认证",
"cnTab": "大陆居民",
"otherTab": "非大陆居民",
"cnTabDesc": "请填写身份证相关信息",
"otherTabDesc": "请上传个人相关信息",
"idCard": "身份证号",
"idCardPlaceholder": "请输入身份证号",
"name": "姓名",
"namePlaceholder": "请输入姓名",
"gender": "性别",
"male": "男",
"female": "女",
"birthday": "出生日期",
"birthdayPlaceholder": "请输入出生日期",
"adress":"家庭住址",
"adressPlaceholder": "请输入家庭住址",
"bank": "所属银行",
"bankPlaceholder": "请选择所属银行",
"bankCard": "银行卡号码",
"bankCardPlaceholder": "请输入银行卡号码",
"cancel": "取消",
"confirm": "确定"
}
}

View File

@ -19,32 +19,52 @@
"home": "首頁",
"profile": "我的"
},
"unocss_page": {
"hello": "你好 {0}",
"desc": "這是 unocss 一個簡單例子。",
"btn_txt": "按鈕"
"login": {
"title": "登入",
"phonePlaceholder": "請輸入手機號",
"getCode": "獲取驗證碼",
"login": "登入",
"back": "返回",
"hasSendTo": "已發送驗證碼至",
"reSend": "重新發送"
},
"error_page": {
"back_btn": "返回",
"txt": "沒有找到"
},
"profile_page": {
"txt": "未完成"
},
"keepalive_page": {
"label": "當前元件將會被快取"
},
"counter_page": {
"label": "這是一個簡單的持久化 Pinia 狀態的例子。為了驗證其有效性,你可以重新整理介面並觀察它。",
"label_num": "數字",
"btn_add": "增加"
},
"prose_page": {
"btn_fetch": "拉取",
"btn_clear": "清空",
"btn_empty_desc": "暫無數據"
},
"countryRegion": {
"searchPlaceholder": "請輸入國家和地區"
"title": "國家地區",
"searchPlaceholder": "請輸入國家和地區",
"frequentCountry": "常用"
},
"realAuth": {
"title": "實名認證 ",
"cnTab": "大陸居民",
"otherTab": "非大陸居民",
"cnTabDesc": "請填寫身份證相關信息",
"otherTabDesc": "請上傳個人相關信息",
"idCard": "身份證號",
"idCardPlaceholder": "請輸入身份證號",
"name": "姓名",
"namePlaceholder": "請輸入姓名",
"gender": "性別",
"male": "男",
"female": "女",
"birthday": "出生日期",
"birthdayPlaceholder": "請輸入出生日期",
"adress":"家庭住址",
"adressPlaceholder": "請輸入家庭住址",
"bank": "所屬銀行",
"bankPlaceholder": "請選擇所屬銀行",
"bankCard": "銀行卡號碼",
"bankCardPlaceholder": "請輸入銀行卡號碼",
"cancel": "取消",
"confirm": "確定"
}
}

View File

@ -147,7 +147,7 @@ export default defineNuxtConfig({
// 指定 Nuxt 应用程序的兼容性日期,确保应用程序在未来的 Nuxt 版本中保持稳定性
compatibilityDate: '2025-01-09',
devServer: {
host: 'localhost', // Set the host to 'localhost'
host: '0.0.0.0', // Set the host to 'localhost'
port: 3000, // Set the port to 3000 or any other port you prefer
},
})