This commit is contained in:
xingyy 2025-02-25 17:00:07 +08:00
parent 33bafebfdf
commit d88f1d5a4f
22 changed files with 1223 additions and 240 deletions

View File

@ -124,25 +124,24 @@ const togglePasswordVisibility = () => {
<div v-show="pane === 0">
<div class="">
<div class="border-b-[1.7px] mt-[8px]">
<van-field v-model="phoneNum" clearable placeholder="请输入手机号">
<van-field v-model="phoneNum" clearable :placeholder="$t('collectCode.login.phoneNumberPlaceholder')">
<template #label>
<div class="text-[16px] text-[#1A1A1A] flex align-center justify-start">
手机号
{{ $t('collectCode.login.phoneNumber') }}
</div>
</template>
</van-field>
</div>
<div class="border-b-[1.7px] mt-[8px]" v-show="loginType === 1">
<van-field
v-model="password"
:type="showPassword ? 'text' : 'password'"
clearable
placeholder="请输入密码"
:placeholder="$t('collectCode.login.passwordPlaceholder')"
>
<template #label>
<div class="text-[16px] text-[#1A1A1A] flex align-center justify-start">
密码
{{ $t('collectCode.login.password') }}
</div>
</template>
<template #button>
@ -155,27 +154,26 @@ const togglePasswordVisibility = () => {
</div>
</template>
</van-field>
</div>
<div class="flex justify-end mt-[10px]">
<div class="text-[14px] text-[#2B53AC]" @click="changeToPwd">
{{ loginType === 0 ? '密码登录' : '验证码登录' }}
{{ loginType === 0 ? $t('collectCode.login.passwordLogin') : $t('collectCode.login.codeLogin') }}
</div>
</div>
<div/>
</div>
<div class="mt-[55px]">
<div v-if="loginType === 0">
<van-button :loading="loadingRef.loading1" v-if="phoneNum" loading-text="获取验证码"
type="primary" block style="height: 48px" @click="getCode">获取验证码
<van-button :loading="loadingRef.loading1" v-if="phoneNum" :loading-text="$t('collectCode.login.getCode')"
type="primary" block style="height: 48px" @click="getCode">{{ $t('collectCode.login.getCode') }}
</van-button>
<van-button v-else type="primary" color="#D3D3D3" block style="height: 48px">获取验证码</van-button>
<van-button v-else type="primary" color="#D3D3D3" block style="height: 48px">{{ $t('collectCode.login.getCode') }}</van-button>
</div>
<div v-else>
<van-button type="primary" v-if="password" block :loading="loadingRef.loading2" loading-text="登录"
style="height: 48px;margin-top:10px" @click="goLogin">登录
<van-button type="primary" v-if="password" block :loading="loadingRef.loading2" :loading-text="$t('collectCode.login.login')"
style="height: 48px;margin-top:10px" @click="goLogin">{{ $t('collectCode.login.login') }}
</van-button>
<van-button v-else type="primary" color="#D3D3D3" block style="height: 48px">登录</van-button>
<van-button v-else type="primary" color="#D3D3D3" block style="height: 48px">{{ $t('collectCode.login.login') }}</van-button>
</div>
</div>
</div>
@ -183,34 +181,31 @@ const togglePasswordVisibility = () => {
<van-swipe-item>
<div v-show="pane === 1">
<div class="flex mb-[16px]">
<div class="text-[16px] text-[#BDBDBD] mr-[10px]">{{ $t('login.hasSendTo') }}</div>
<div class="text-[16px] text-[#BDBDBD] mr-[10px]">{{ $t('collectCode.login.hasSendTo') }}</div>
<div class="text-[16px] text-[#000]">+86 {{ phoneNum }}</div>
</div>
<van-password-input :value="code" :gutter="10" :mask="false" focused @focus="showKeyboard = true"/>
<div class="flex justify-between">
<div :class="`${countdown>0?'text-#BDBDBD':'text-#2B53AC'} text-14px`">
{{ $t('login.reSend') }}<span v-if="countdown>0">({{ countdown }})</span>
{{ $t('collectCode.login.reSend') }}<span v-if="countdown>0">({{ countdown }})</span>
</div>
<div @click="goBack" class="text-#2B53AC text-14px">
{{ $t('login.back') }}
{{ $t('collectCode.login.back') }}
</div>
</div>
<div class="mt-[17px]">
<van-button v-if="code.length === 6" type="primary" block :loading="loadingRef.loading2"
:loading-text="$t('login.login')" style="height: 48px" @click="goLogin">{{
$t('login.login')
}}
:loading-text="$t('collectCode.login.login')" style="height: 48px" @click="goLogin">
{{ $t('collectCode.login.login') }}
</van-button>
<van-button v-else type="primary" color="#D3D3D3" block style="height: 48px">{{
$t('login.login')
}}
<van-button v-else type="primary" color="#D3D3D3" block style="height: 48px">
{{ $t('collectCode.login.login') }}
</van-button>
</div>
</div>
</van-swipe-item>
</van-swipe>
<van-number-keyboard v-model="code" :show="showKeyboard" @blur="showKeyboard = false"/>
</div>
</template>

View File

@ -4,9 +4,14 @@ import XImage from "@/components/x-image/index.vue";
import {useRuntimeConfig} from "#app";
import QRCode from 'qrcode'
import { showImagePreview } from 'vant';
import { useI18n } from 'vue-i18n';
const t = useI18n();
const statusLabel=[
{label:'已付款',value:2,color:'#18A058'}, {label:'未付款',value:1,color:'#CF3050'}, {label:'已部分付款',value:4,color:'#F09F1F'}
{label: t('collectCode.qrcode.status.paid'), value:2, color:'#18A058'},
{label: t('collectCode.qrcode.status.unpaid'), value:1, color:'#CF3050'},
{label: t('collectCode.qrcode.status.partialPaid'), value:4, color:'#F09F1F'}
]
const props = defineProps({
data: {
@ -54,13 +59,13 @@ const openQrCode=async ()=>{
<XImage class="w-57px h-56px rounded-4px" :src="data.hdPic"></XImage>
</div>
<div class="text-12px text-#1E1E1E">
<div>Lot{{ data.lotNo }}</div>
<div>创建人{{ data.userName }}</div>
<div>创建时间{{data.createdAt}}</div>
<div>{{ $t('collectCode.qrcode.card.lotNo') }}{{ data.lotNo }}</div>
<div>{{ $t('collectCode.qrcode.card.creator') }}{{ data.userName }}</div>
<div>{{ $t('collectCode.qrcode.card.createTime') }}{{data.createdAt}}</div>
</div>
<div class="flex flex-col justify-end ml-auto ">
<div class="flex w-55px h-26px bg-#2B53AC rounded-4px justify-center items-center">
<div @click="openQrCode(data)" class="text-12px text-#fff line-height-none mt-0.5px mr-5px">查看</div>
<div @click="openQrCode(data)" class="text-12px text-#fff line-height-none mt-0.5px mr-5px">{{ $t('collectCode.qrcode.card.view') }}</div>
<div>
<img class="w-12px h-12px" src="@/static/images/icon-design-42@3x.png" alt="">
</div>

View File

@ -43,10 +43,10 @@ const createForm=ref({
})
const confirm=async ()=>{
if (!createForm.value.price){
message.warning('请输入金额')
message.warning(t('collectCode.message.amountRequired'))
return false
}else if (!createForm.value.lotNo){
message.warning('请输入Lot号')
message.warning(t('collectCode.message.lotNoRequired'))
return false
}
const res=await offlineQrcodeCreate({...createForm.value,price:String(createForm.value.price)})
@ -54,7 +54,6 @@ const confirm=async ()=>{
show.value=false
onRefresh()
}
}
const onRefresh = async () => {
try {
@ -90,7 +89,7 @@ const deleteData=async (qrUid)=>{
})
if (res.status===0){
getOfflineQrcodeList()
message.success('删除成功')
message.success(t('collectCode.message.deleteSuccess'))
onRefresh()
}
}
@ -112,17 +111,17 @@ initData()
</div>
</div>
<div class="border-b-1px border-b-#D3D3D3 px-16px flex">
<div class="text-#000 text-16px border-b-3 border-b-#2B53AC h-36px">线下付款二维码 </div>
<div class="text-#000 text-16px border-b-3 border-b-#2B53AC h-36px">{{ $t('collectCode.mine.offlineQrcode') }}</div>
</div>
<div class="grow-1 flex flex-col overflow-hidden py-15px">
<div class="overflow-auto">
<van-pull-refresh v-model="localState.refreshing"
success-text="刷新成功"
:success-text="$t('collectCode.mine.refreshSuccess')"
:success-duration="700"
@refresh="onRefresh">
<van-list v-model:loading="storeLoading"
:finished="localState.finished"
finished-text="没有更多了"
:finished-text="$t('collectCode.mine.noMore')"
@load="loadMore" class="px-14px">
<template v-for="(item,index) of itemList" :key="item.qrUid">
<template v-if="item.payStatus===1">
@ -150,39 +149,38 @@ initData()
</div>
<div class="h-81px w-full flex justify-center shrink-0 pt-10px">
<div class="w-213px h-38px bg-#2B53AC text-#fff flex justify-center items-center text-14px rounded-4px" @click="show=true">
新增
</div>
{{ $t('collectCode.mine.add') }}</div>
</div>
<van-dialog v-model:show="show">
<div class="pt-18px pb-24px px-24px">
<div class="text-16px text-#000 font-bold text-center mb-26px">新增收款二维码</div>
<div class="text-16px text-#000 font-bold text-center mb-26px">{{ $t('collectCode.mine.addQrcode.title') }}</div>
<div class="">
<div class="flex mb-6px items-center">
<div class="w-58px">
<div class="text-#1A1A1A text-16px">金额</div>
<div class="text-#939393 text-12px">RMB</div>
<div class="text-#1A1A1A text-16px">{{ $t('collectCode.mine.addQrcode.amount') }}</div>
<div class="text-#939393 text-12px">{{ $t('collectCode.mine.addQrcode.amountUnit') }}</div>
</div>
<div>
<input v-model="createForm.price" type="number"
class="w-214px h-48px bg-#F3F3F3 rounded-4px px-11px text-16px" placeholder="请输入金额">
class="w-214px h-48px bg-#F3F3F3 rounded-4px px-11px text-16px" :placeholder="$t('collectCode.mine.addQrcode.amountPlaceholder')">
</div>
</div>
<div class="flex items-center">
<div class="w-58px">
<div class="text-#1A1A1A text-16px">Lot号</div>
<div class="text-#1A1A1A text-16px">{{ $t('collectCode.mine.addQrcode.lotNo') }}</div>
</div>
<div>
<input type="number" v-model="createForm.lotNo" @input="inputLotNo" class="w-214px h-48px bg-#F3F3F3 rounded-4px px-11px text-16px" placeholder="请输入拍品序号">
<input type="number" v-model="createForm.lotNo" @input="inputLotNo" class="w-214px h-48px bg-#F3F3F3 rounded-4px px-11px text-16px" :placeholder="$t('collectCode.mine.addQrcode.lotNoPlaceholder')">
</div>
</div>
</div>
<div class="flex flex-col items-center" v-if="abnormal">
<div class="text-#CF3050 text-12px mb-8px mt-4px">*该拍品号当前已存在收款二维码确定要创建吗</div>
<div class="text-#CF3050 text-12px mb-8px mt-4px">{{ $t('collectCode.mine.addQrcode.existingWarning') }}</div>
<div>
<XImage class="w-116px h-116px rounded-4px mb-9px" :src="abnormalRow.hdPic"></XImage>
<div class="text-12px text-#575757 flex flex-col items-center">
<div>日出而作日落而息</div>
<div>张天赐</div>
<div>{{ abnormalRow.title }}</div>
<div>{{ abnormalRow.author }}</div>
</div>
</div>
</div>
@ -190,10 +188,10 @@ initData()
<template #footer>
<div class="border-t flex">
<van-button class="w-50% h-56px" style="border: none;border-radius: 0;border-right: 1.5px solid #E7E7E7" @click="show=false">
<span class="text-#000 text-16px text-center">取消</span>
<span class="text-#000 text-16px text-center">{{ $t('collectCode.mine.addQrcode.cancel') }}</span>
</van-button>
<van-button class="w-50% h-56px !rounded-0" style="border: none;border-radius: 0" @click="confirm">
<span class="text-#000 text-16px text-center text-#2B53AC">确定</span>
<span class="text-#000 text-16px text-center text-#2B53AC">{{ $t('collectCode.mine.addQrcode.confirm') }}</span>
</van-button>
</div>
</template>

View File

@ -7,6 +7,9 @@ import {authStore} from "~/stores/auth/index.js";
import {message} from "~/components/x-message/useMessage.js";
import {createOrder} from "~/api-collect-code/goods/index.js";
import {codeAuthStore} from "~/stores-collect-code/auth/index.js";
import {useI18n} from "vue-i18n";
const {t} = useI18n();
const {checkoutSessionUrl,qrUid,qrData} = codeAuthStore()
const payStatus = ref(0)
definePageMeta({
@ -18,15 +21,15 @@ const changePayStatus = () => {
const amount = ref('')
const confirmPay = async () => {
if (payStatus.value === 1 && !amount.value) {
message.warning('请输入金额')
message.warning(t('collectCode.payment.enterAmount'))
return
}
if (Number(qrData.value.leftPrice) < Number(amount.value)) {
message.warning('不得高于全部金额')
message.warning(t('collectCode.payment.exceedTotal'))
return
}
showLoadingToast({
message: '加载中...',
message: t('common.loading'),
forbidClick: true,
});
const res = await createOrder({
@ -67,18 +70,18 @@ const handleInput = (e) => {
<div class="mb-30px">
<img class="w-126px h-126px" src="@/static/images/dddf34@2x.png" alt="">
</div>
<div class="text-#1A1A1A text-16px mb-25px font-bold">{{ payStatus === 0 ? '支付全部' : '支付部分' }}</div>
<div class="text-#1A1A1A text-16px mb-25px font-bold">{{ payStatus === 0 ? $t('collectCode.payment.fullPayment') : $t('collectCode.payment.partialPayment') }}</div>
<div class="text-#999999 text-16px mb-24px font-bold" v-if="payStatus===0">{{ qrData.currency }}
{{ qrData?.leftPrice }}
</div>
<div class="mb-12px" v-else>
<input v-model="amount" class="w-272px h-48px bg-#F3F3F3 px-11px text-16px" type="text"
:placeholder="`最多${qrData.currency}${qrData?.leftPrice}`" @input="handleInput">
:placeholder="$t('collectCode.payment.maxAmount', { currency: qrData.currency, price: qrData?.leftPrice })" @input="handleInput">
</div>
<div class="text-#2B53AC text-14px" @click="changePayStatus">{{ payStatus === 1 ? '支付全部' : '支付部分' }}</div>
<div class="text-#2B53AC text-14px" @click="changePayStatus">{{ payStatus === 1 ? $t('collectCode.payment.fullPayment') : $t('collectCode.payment.partialPayment') }}</div>
<div class="w-full mt-auto mb-40px">
<van-button type="primary" block @click="confirmPay">
确认支付
{{ $t('collectCode.payment.confirmPayment') }}
</van-button>
</div>
</div>

View File

@ -4,6 +4,9 @@ import { showToast } from 'vant';
import { onMounted } from 'vue';
import {codeAuthStore} from "~/stores-collect-code/auth/index.js";
import {signOffline} from "~/api/goods/index.js";
import {useI18n} from "vue-i18n";
const {t} = useI18n();
const {formData,number}=codeAuthStore()
const signaturePad = ref(null);
definePageMeta({
@ -14,15 +17,14 @@ const imgUrl = ref('');
const show = ref(false);
const goBack = () => {
router.back()
//
};
const submitSignature = () => {
if (signaturePad.value?.isEmpty()) {
showToast('请先签名');
showToast(t('collectCode.signature.pleaseSign'));
return;
}
const { data } = signaturePad.value?.saveSignature(); // base64
const { data } = signaturePad.value?.saveSignature();
imgUrl.value = data;
show.value = true;
};
@ -30,6 +32,7 @@ const submitSignature = () => {
const clearSignature = () => {
signaturePad.value?.clearSignature();
};
const confirm=async ()=>{
const res=await signOffline({
userInfo:formData.value,
@ -54,13 +57,13 @@ router.push('/collectCode/signature/result')
</client-only>
<div class="flex justify-evenly">
<van-button class="!h-40px mr-15px" type="primary" @click="goBack">
返回
{{ $t('collectCode.signature.back') }}
</van-button>
<van-button class="!h-40px" type="warning" @click="clearSignature">
清空
{{ $t('collectCode.signature.clear') }}
</van-button>
<van-button class="!h-40px" type="primary" @click="submitSignature">
确认
{{ $t('collectCode.signature.confirm') }}
</van-button>
</div>
<van-dialog v-model:show="show" show-cancel-button @confirm="confirm">

View File

@ -20,9 +20,9 @@ const columns = ref([
{text: t('realAuth.female'), value: 2},
])
const columns1 = ref([
{text: '身份证', value: 1},
{text: '护照', value: 2},
{text: '其他', value: 3},
{text: t('realAuth.idCard'), value: 1},
{text: t('realAuth.passport'), value: 2},
{text: t('realAuth.other'), value: 3},
])
const goCountryRegion=()=>{
router.push({
@ -76,7 +76,7 @@ const nextClick=async ()=>{
//
if (number.value==1){
if (!isFormComplete(formData.value)){
message.warning('请填写完整信息')
message.warning(t('signature.error.incompleteForm'))
return
}
//
@ -95,16 +95,14 @@ if (number.value==1){
if (res1.status===0){
window.location.href=res1.data.fddVerifyUrl
}
}
}
//
} else {
//
router.push('/collectCode/signature/protocol')
}
//
} else if(number.value==2) {
if (!formData.value.phone&&formData.value.countryCode&&formData.value.userName){
if (!formData.value.phone || !formData.value.countryCode || !formData.value.userName){
message.warning('请填写完整信息')
return
}
@ -118,13 +116,13 @@ initData()
<div
class="w-[100vw] bg-[url('@/static/images/asdfsdd.png')] h-screen-nav bg-cover pt-77px flex-grow-1 flex flex-col ">
<div class="text-16px text-#191919 font-bold mb-40px px-34px">
请填写个人相关信息
{{ $t('personal.title') }}
</div>
<div class="grow-1 px-34px">
<van-field v-model="formData.phone" type="tel" :label-width="161" label="文本" class="mb-10px" placeholder="请输入手机号">
<van-field v-model="formData.phone" type="tel" :label-width="161" :label="$t('personal.text')" class="mb-10px" :placeholder="$t('realAuth.phonePlaceholder')">
<template #label>
<div class="flex">
<div class="mr-41px whitespace-nowrap">手机号</div>
<div class="mr-41px whitespace-nowrap">{{ $t('profile.phone') }}</div>
<div @click="goCountryRegion">
<span class="mr-13px">+ {{ formData.countryCode }}</span>
<van-icon name="arrow-down" class="text-#777777"/>
@ -132,20 +130,20 @@ initData()
</div>
</template>
</van-field>
<van-field label="姓名" v-model="formData.userName" class="mb-10px" placeholder="请输入姓名"/>
<van-field :label="$t('profile.name')" v-model="formData.userName" class="mb-10px" :placeholder="$t('realAuth.namePlaceholder')"/>
<template v-if="number===1">
<x-van-select v-model="formData.gender" label="性别" :columns="columns"/>
<x-van-date label="出生日期" v-model="formData.birthday" />
<van-field label="家庭住址" v-model="formData.address" class="mb-10px" placeholder="请输入家庭住址"/>
<van-field label="所属银行" v-model="formData.bankName" class="mb-10px" placeholder="请输入所属银行"/>
<van-field label="银行卡号码" v-model="formData.bankNo" class="mb-10px" placeholder="请输入银行卡号码"/>
<x-van-select v-model="formData.cardType" label="证件类型" :columns="columns1"/>
<van-field label="证件号" v-model="formData.cardId" class="mb-10px" placeholder="请输入证件号"/>
<x-van-select v-model="formData.gender" :label="$t('realAuth.gender')" :columns="columns"/>
<x-van-date :label="$t('realAuth.birthday')" v-model="formData.birthday" />
<van-field :label="$t('realAuth.adress')" v-model="formData.address" class="mb-10px" :placeholder="$t('realAuth.adressPlaceholder')"/>
<van-field :label="$t('realAuth.bank')" v-model="formData.bankName" class="mb-10px" :placeholder="$t('realAuth.bankPlaceholder')"/>
<van-field :label="$t('realAuth.bankCard')" v-model="formData.bankNo" class="mb-10px" :placeholder="$t('realAuth.bankCardPlaceholder')"/>
<x-van-select v-model="formData.cardType" :label="$t('realAuth.idCard')" :columns="columns1"/>
<van-field :label="$t('realAuth.idCard')" v-model="formData.cardId" class="mb-10px" :placeholder="$t('realAuth.idCardPlaceholder')"/>
</template>
</div>
<div class="h-81px bg-#fff flex justify-center pt-7px border-t shrink-0">
<van-button color="#2B53AC" class="w-213px van-btn-h-38px" @click="nextClick">下一步</van-button>
<van-button color="#2B53AC" class="w-213px van-btn-h-38px" @click="nextClick">{{ $t('personal.next') }}</van-button>
</div>
</div>
</template>

View File

@ -15,16 +15,16 @@ const pmblUrl = ref('') // 存储拍卖笔录的URL
//
const protocolList = computed(() => {
if(number.value===1){
return [ { id: '4', title: '《竞买协议》', pdfName: 'jmxy', type: 'local' },
{ id: '3', title: '《竞买须知》', pdfName: 'jmxz', type: 'local' },
{ id: '1', title: '《拍卖公告》', pdfName: 'pmgg', type: 'local' },
{ id: '2', title: '《拍卖规则》', pdfName: 'pmgz', type: 'local' },
return [
{ id: '4', title: $t('signature.agreement.buyerAgreement'), pdfName: 'jmxy', type: 'local' },
{ id: '3', title: $t('signature.agreement.buyerGuide'), pdfName: 'jmxz', type: 'local' },
{ id: '1', title: $t('signature.agreement.notice'), pdfName: 'pmgg', type: 'local' },
{ id: '2', title: $t('signature.agreement.rules'), pdfName: 'pmgz', type: 'local' },
]
}else if(number.value===2) {
return [
{ id: '6', title: '《拍卖移交确认书》', pdfName: 'pmyjqrs', type: 'local' },
{ id: '5', title: '《拍卖笔录成交确认书》', pdfName: pmblUrl.value, type: 'remote' }
{ id: '6', title: $t('signature.agreement.transfer'), pdfName: 'pmyjqrs', type: 'local' },
{ id: '5', title: $t('signature.agreement.record'), pdfName: pmblUrl.value, type: 'remote' }
]
}
})
@ -77,7 +77,7 @@ const goSignature = () => {
<template>
<div class="bg-#EBEBEB h-screen-nav flex flex-col">
<div class="h-50px text-14px text-#191919 bg-#fff flex items-center px-21px mb-6px shrink-0">
支付前需同意以下内容并签字
{{ $t('signature.tips.prePayment') }}
</div>
<van-collapse
@ -109,7 +109,7 @@ const goSignature = () => {
class="w-213px van-btn-h-38px"
@click="confirm"
>
同意并签字
{{ $t('signature.action.agree') }}
</van-button>
</div>
</div>

View File

@ -2,7 +2,7 @@
<div class="pdf-container">
<client-only>
<div v-if="loading" class="loading-container">
<van-loading type="spinner" size="24px">加载中...</van-loading>
<van-loading type="spinner" size="24px">{{ $t('common.loading') }}</van-loading>
</div>
<VuePdfEmbed
v-if="pdfUrl"

View File

@ -1,10 +1,12 @@
<script setup>
import {sessionUserNoCreate} from "~/api-collect-code/goods/index.js";
import {codeAuthStore} from "~/stores-collect-code/auth/index.js";
import { useI18n } from 'vue-i18n';
const { t } = useI18n();
const {formData,number}=codeAuthStore()
const auctionUserNo=ref('')
definePageMeta({
title:'领取号牌'
i18n: 'collectCode.signature.result.title'
})
const res=await sessionUserNoCreate({
phone:formData.value.phone
@ -17,8 +19,8 @@ if (res.status===0){
<template>
<div class="w-[100vw] h-screen-nav bg-[url('@/static/images/3532@2x.png')] bg-cover flex-grow-1 flex flex-col items-center pt-183px px-30px">
<div class="flex flex-col items-center pt-18px px-31px">
<div class="text-#000 text-16px mb-4px">签署成功</div>
<div class="text-#939393 text-12px mb-31px">&nbsp&nbsp&nbsp领取您的专属号牌&nbsp&nbsp&nbsp</div>
<div class="text-#000 text-16px mb-4px">{{ t('collectCode.signature.result.success') }}</div>
<div class="text-#939393 text-12px mb-31px">&nbsp&nbsp&nbsp{{ t('collectCode.signature.result.getNumber') }}&nbsp&nbsp&nbsp</div>
<div class="relative">
<img class="w-258px h-144px" src="@/static/images/zu6020@2x.png" alt="">
<div class="absolute text-#FDD68D text-68px bottom-1px left-1/2 transform translate-x--1/2">{{auctionUserNo}}</div>

View File

@ -187,10 +187,8 @@ onUnmounted(() => {
<div />
</div>
<div class="mt-[55px]">
<van-button :loading="loadingRef.loading1" v-if="phoneNum" :loading-text="$t('login.getCode')" color="#2B53AC" 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>
<van-button :loading="loadingRef.loading1" v-if="phoneNum" :loading-text="$t('login.getCode')" color="#2B53AC" 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>
</van-swipe-item>
@ -210,9 +208,7 @@ onUnmounted(() => {
</div>
</div>
<div class="mt-[17px]">
<van-button v-if="code.length === 6" type="primary" block :loading="loadingRef.loading2" :loading-text="$t('login.login')" style="height: 48px" @click="goLogin">{{
$t('login.login')
}}</van-button>
<van-button v-if="code.length === 6" type="primary" block :loading="loadingRef.loading2" :loading-text="$t('login.login')" 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>
@ -220,7 +216,7 @@ onUnmounted(() => {
</van-swipe>
<van-number-keyboard v-model="code" :show="showKeyboard" @blur="showKeyboard = false" />
<div v-if="!isKeyboardVisible" class="text-center text-14px absolute left-1/2 transform translate-x--1/2 bottom-20px">
登录即同意<span class="text-#3454AF " @click="$router.push('/privacyPolicy')">隐私政策</span>
{{ $t('login.agreement') }}<span class="text-#3454AF " @click="$router.push('/privacyPolicy')">{{ $t('login.privacyPolicy') }}</span>
</div>
</div>
</template>

View File

@ -8,7 +8,7 @@ import {message} from "~/components/x-message/useMessage.js";
const {checkoutSessionUrl,payment}= authStore()
const payStatus=ref(0)
definePageMeta({
title: '支付'
i18n: 'payment.title'
})
const changePayStatus=()=>{
payStatus.value=payStatus.value===0?1:0
@ -17,15 +17,15 @@ const { auctionData} = liveStore()
const amount=ref('')
const confirmPay=async ()=>{
if (payStatus.value===1&&!amount.value){
message.warning('请输入金额')
message.warning(t('payment.amountRequired'))
return
}
if (Number(payment.value.leftPrice)<Number(amount.value)){
message.warning('不得高于全部金额')
message.warning(t('payment.exceedAmount'))
return
}
showLoadingToast({
message: '加载中...',
message: t('payment.loading'),
forbidClick: true,
});
const res=await createBuyOrder({
@ -65,15 +65,15 @@ const handleInput = (e) => {
<div class="mb-30px">
<img class="w-126px h-126px" src="@/static/images/dddf34@2x.png" alt="">
</div>
<div class="text-#1A1A1A text-16px mb-25px font-bold">{{payStatus===0?'支付全部':'支付部分'}}</div>
<div class="text-#1A1A1A text-16px mb-25px font-bold">{{payStatus===0 ? t('payment.payAll') : t('payment.payPartial')}}</div>
<div class="text-#999999 text-16px mb-24px font-bold" v-if="payStatus===0">{{payment.leftCurrency}} {{payment?.leftPrice}}</div>
<div class="mb-12px" v-else>
<input v-model="amount" class="w-272px h-48px bg-#F3F3F3 px-11px text-16px" type="text" :placeholder="`最多${payment.leftCurrency}${payment?.leftPrice}`" @input="handleInput">
</div>
<div class="text-#2B53AC text-14px" @click="changePayStatus">{{payStatus===1?'支付全部':'支付部分'}}</div>
<div class="text-#2B53AC text-14px" @click="changePayStatus">{{payStatus===1 ? t('payment.payAll') : t('payment.payPartial')}}</div>
<div class="w-full mt-auto mb-40px">
<van-button type="primary" block @click="confirmPay">
确认支付
{{ t('payment.confirm') }}
</van-button>
</div>
</div>

View File

@ -33,7 +33,7 @@ const goHome=()=>{
</div>
<div class="w-full mt-auto mb-40px">
<van-button type="primary" block @click="goHome">
回到首页
{{ t('payment.backToHome') }}
</van-button>
</div>
</div>

View File

@ -1,7 +1,7 @@
<script setup lang="ts">
definePageMeta({
title:'隐私政策'
i18n: 'login.privacyPolicy'
})
</script>

View File

@ -20,7 +20,7 @@ const {userInfo}= authStore()
</div>
<div class="flex mb-20px">
<div class="mr-10px">{{$t('realAuth.gender')}}</div>
<div>{{userInfo.sex===1?'男':'女'}}</div>
<div>{{userInfo.sex===1?$t('realAuth.male'):$t('realAuth.female')}}</div>
</div>
<div class="flex mb-20px">
<div class="mr-10px">{{$t('realAuth.birthday')}}</div>
@ -38,7 +38,7 @@ const {userInfo}= authStore()
</div>
<div class="flex mb-20px">
<div class="mr-10px">{{$t('realAuth.gender')}}</div>
<div>{{userInfo.sex===1?'男':'女'}}</div>
<div>{{userInfo.sex===1?$t('realAuth.male'):$t('realAuth.female')}}</div>
</div>
<div class="flex mb-20px">
<div class="mr-10px">{{$t('realAuth.birthday')}}</div>

View File

@ -20,7 +20,7 @@ const checkScreenOrientation = () => {
isLandscapeMode.value = true;
} else {
isLandscapeMode.value = false;
showToast('请将手机横屏使用');
showToast($t('common.landscape'));
}
};
@ -43,7 +43,7 @@ const clearSignature = () => {
};
const submitSignature = () => {
if (signaturePad.value?.isEmpty()) {
showToast('请先签名');
showToast($t('signature.pleaseSign'));
return;
}
const { data } = signaturePad.value?.saveSignature(); // base64
@ -88,7 +88,7 @@ router.back()
type="primary"
@click="goBack"
>
返回
{{ $t('signature.back') }}
</van-button>
<van-button
class="control-button"
@ -96,7 +96,7 @@ router.back()
type="warning"
@click="clearSignature"
>
清空
{{ $t('signature.clear') }}
</van-button>
<van-button
class="control-button"
@ -104,14 +104,14 @@ router.back()
type="primary"
@click="submitSignature"
>
确认
{{ $t('signature.confirm') }}
</van-button>
</div>
</div>
</template>
<template v-else>
<div class="orientation-hint">
<p>请将手机横屏使用</p>
<p>{{$t('common.landscape')}}</p>
</div>
</template>
<van-dialog v-model:show="show" class="signature-dialog" show-cancel-button @confirm="confirm">

View File

@ -5,7 +5,7 @@ import { authStore } from "~/stores/auth/index.js"
definePageMeta({
layout: 'default',
title: '签署内容'
i18n: 'signature.title'
})
const { userInfo, payment } = authStore()
@ -15,12 +15,12 @@ const pmblUrl = ref('') // 存储拍卖笔录的URL
//
const protocolList = computed(() => [
{ id: '1', title: '《拍卖公告》', pdfName: 'pmgg', type: 'local' },
{ id: '2', title: '《拍卖规则》', pdfName: 'pmgz', type: 'local' },
{ id: '3', title: '《竞买须知》', pdfName: 'jmxz', type: 'local' },
{ id: '4', title: '《竞买协议》', pdfName: 'jmxy', type: 'local' },
{ id: '5', title: '《拍卖笔录成交确认书》', pdfName: pmblUrl.value, type: 'remote' },
{ id: '6', title: '《拍卖移交确认书》', pdfName: 'pmyjqrs', type: 'local' }
{ id: '1', title: $t('signature.agreement.notice'), pdfName: 'pmgg', type: 'local' },
{ id: '2', title: $t('signature.agreement.rules'), pdfName: 'pmgz', type: 'local' },
{ id: '3', title: $t('signature.agreement.buyerGuide'), pdfName: 'jmxz', type: 'local' },
{ id: '4', title: $t('signature.agreement.buyerAgreement'), pdfName: 'jmxy', type: 'local' },
{ id: '5', title: $t('signature.agreement.record'), pdfName: pmblUrl.value, type: 'remote' },
{ id: '6', title: $t('signature.agreement.transfer'), pdfName: 'pmyjqrs', type: 'local' }
])
// PDF
@ -54,7 +54,7 @@ const goSignature = () => {
<template>
<div class="bg-#EBEBEB h-screen-nav flex flex-col">
<div class="h-50px text-14px text-#191919 bg-#fff flex items-center px-21px mb-6px shrink-0">
支付前需同意以下内容并签字
{{ $t('signature.tips.prePayment') }}
</div>
<van-collapse
@ -86,7 +86,7 @@ const goSignature = () => {
class="w-213px van-btn-h-38px"
@click="goSignature"
>
同意并签字
{{ $t('signature.button.agreeAndSign') }}
</van-button>
</div>
</div>

View File

@ -2,7 +2,7 @@
<div class="pdf-container">
<client-only>
<div v-if="loading" class="loading-container">
<van-loading type="spinner" size="24px">加载中...</van-loading>
<van-loading type="spinner" size="24px">{{ $t('common.loading') }}</van-loading>
</div>
<VuePdfEmbed
v-if="pdfUrl"

View File

@ -25,7 +25,19 @@
"login": "Login",
"back": "Back",
"hasSendTo": "Verification code has been sent to",
"reSend": "Re-send"
"reSend": "Re-send",
"agreement": "By logging in, you agree to the",
"privacyPolicy": "Privacy Policy"
},
"common": {
"items": "items",
"auction": "auction"
},
"profile": {
"name": "Name",
"phone": "Phone",
"text1": "You have no auction items",
"text2": "Go bid now"
},
"error_page": {
"back_btn": "Back",
@ -66,6 +78,190 @@
"bankCard": "Bank Card Number",
"bankCardPlaceholder": "Please enter bank card number",
"cancel": "Cancel",
"confirm": "Confirm",
"success_mess": "Submitted successfully",
"text1": "Please select gender",
"detail": {
"gender": {
"male": "Male",
"female": "Female"
}
}
},
"detail": {
"text1": "Artist",
"text2": "Total Square Feet",
"text3": "Length",
"text4": "Width",
"text5": "Artwork Introduction",
"text6": "Starting Price",
"text7": "Bid List",
"text8": "Auction Item Details"
},
"art_detail_page": {
"button": "Pay Now",
"prompt_title": "Congratulations",
"prompt_desc": "Bid Successful"
},
"home": {
"tab1": "Auction List",
"tab2": "Auction Instructions",
"lot_detail": "Lot Details",
"refresh_show": "Refresh Successful",
"finished_text": "No More Items",
"start_price": "Starting Price",
"close_price": "Closing Price",
"my_lots": "My Lots",
"go_home": "Go to Home",
"text1": "Click to Enter Live Room",
"text2": "Beijing Time"
},
"live_room": {
"error_mess": "Failed to get live content, try again?",
"success_mess": "Bid Successful",
"warn_mess": "Bidding is not enabled",
"now_price": "Current Price",
"lower_price": "Next Bid",
"confirm": "Confirm Bid",
"button": "Click 'Enable Bidding' to participate",
"start": "Start Auction",
"head": "Leading",
"out": "Out",
"success": "Deal",
"next_lot": "Next lot coming soon",
"spot": "On-site Bid",
"network": "Online Bid",
"me": "Me",
"all_pay": "Pay All",
"part_pay": "Partial Payment",
"lots": "Lots",
"colse_bid": "Close Bidding",
"start_bid": "Enable Bidding",
"total": "Total",
"lots_num": "Lots",
"cast": "Casting",
"wait_update": "Waiting for Update",
"text1": "Hammer Soon",
"text2": "Someone has bid",
"text3": "Bid after update",
"text4": "Congratulations, bid successful",
"text5": "Please make payment",
"text6": "This lot has ended",
"text7": "Please wait for next lot",
"text8": "Sorry, bid failed",
"text9": "Auction Ended",
"text10": "Auction ended, thank you for participating"
},
"personal": {
"title": "Please fill in personal information",
"text": "Text",
"next": "Next"
},
"payment": {
"title": "Payment",
"text1": "Payment Result",
"text2": "Payment Successful",
"text3": "Payment Failed",
"text4": "Unpaid",
"text5": "Payment Expired",
"text6": "Partial Payment",
"next": "Next",
"backHome": "Back to Home",
"confirm": "Confirm Payment",
"fullPayment": "Pay All",
"partialPayment": "Pay Partially",
"loading": "Loading...",
"error": {
"enterAmount": "Please enter amount",
"exceedTotal": "Cannot exceed total amount"
},
"placeholder": {
"amount": "Maximum {currency}{price}"
}
},
"signature": {
"title": "Sign Content",
"loading": "Loading...",
"agreement": {
"notice": "Auction Notice",
"rules": "Auction Rules",
"buyerGuide": "Buyer's Guide",
"buyerAgreement": "Buyer Agreement",
"record": "Auction Record Confirmation",
"transfer": "Auction Transfer Confirmation"
},
"error": {
"getRecord": "Failed to get auction record"
},
"action": {
"agree": "Agree and Sign",
"back": "Back",
"clear": "Clear",
"confirm": "Confirm"
},
"tips": {
"landscape": "Please use phone in landscape mode",
"needSign": "Please sign first",
"prePayment": "Please agree and sign before payment"
}
},
"liveRoom": {
"loading": "Live stream loading...",
"error": {
"player": "Player error:",
"init": "Player initialization failed:",
"noVideo": "Video element not found",
"screenshot": "Failed to get video screenshot:"
},
"player": {
"autoplay": true,
"muted": true,
"width": "100%",
"height": "100%"
},
"status": {
"error_mess": "Failed to get live content, try again?",
"success_mess": "Bid successful",
"warn_mess": "Bidding is not enabled",
"now_price": "Current Price",
"lower_price": "Next Bid",
"confirm": "Confirm Bid",
"button": "Click 'Enable Bidding' to participate",
"start": "Start Auction",
"head": "Leading",
"out": "Out",
"success": "Deal",
"next_lot": "Next lot coming soon",
"spot": "On-site Bid",
"network": "Online Bid",
"me": "Me",
"all_pay": "Pay All",
"part_pay": "Pay Partially",
"lots": "Lots",
"colse_bid": "Close Bidding",
"start_bid": "Enable Bidding",
"total": "Total",
"lots_num": "Lots",
"cast": "Casting",
"wait_update": "Waiting for Update",
"text1": "Hammer Soon",
"text2": "Someone has bid",
"text3": "Bid after update",
"text4": "Congratulations, bid successful",
"text5": "Please make payment",
"text6": "This lot has ended",
"text7": "Please wait for next lot",
"text8": "Sorry, bid failed",
"text9": "Auction Ended",
"text10": "Auction ended, thank you for participating"
}
},
"privacyPolicy": {
"title": "Privacy Policy",
"content": {
"header": "Please read the 'FENGHE Privacy Policy' carefully (especially the bold content) and make sure you understand our rules for processing your personal information. If you have any questions while reading, you can contact our customer service for consultation. If you do not agree with any terms in the agreement, you should stop accessing immediately.",
"version": "Version update date: February 6, 2025",
"scope": "The 'FENGHE' Privacy Policy applies to online bidding, shopping, and other products or services under Shanghai Fenghe Auction Co., Ltd., including but not limited to online auction live streaming, online bidding, domestic proxy bidding, overseas proxy bidding, time-limited bidding, consignment, global art purchase, treasure inheritance, and other websites, clients, mini-programs, as well as new forms of products and/or services that emerge with technological development."
}
}
}

View File

@ -1,32 +1,43 @@
{
"appSetting": {
"appName": "豊和",
"appDescription": "泰豊国際京都オークション",
"appKeyWords": "泰豊,泰豊文化,豊和,京都,オークション"
"appName": "FENGHE",
"appDescription": "泰風インターナショナル京都オークション",
"appKeyWords": "泰風,泰風文化,FENGHE,京都,オークション"
},
"menu": {
"home": "ホーム",
"profile": "マイページ",
"profile": "プロフィール",
"darkMode": "🌗 ダークモード",
"language": "📚 言語",
"404Demo": "🙅 404ページデモ",
"unocssExample": "🎨 Unocss 例",
"unocssExample": "🎨 Unocss例",
"keepAlive": "🧡 KeepAliveデモ",
"persistPiniaState": "💾 Pinia 状態の永続化",
"fetch": "🏄 ネットワークリクエスト"
},
"tabbar": {
"home": "ホーム",
"profile": "マイページ"
"profile": "プロフィール"
},
"login": {
"title": "ログイン",
"phonePlaceholder": "携帯番号を入力してください",
"phonePlaceholder": "電話番号を入力してください",
"getCode": "認証コードを取得",
"login": "ログイン",
"back": "戻る",
"hasSendTo": "認証コードは",
"reSend": "再送"
"hasSendTo": "認証コードを送信しました:",
"reSend": "再送信",
"agreement": "ログインすることで",
"privacyPolicy": "プライバシーポリシー"
},
"common": {
"items": "点",
"auction": "オークション"
},
"profile": {
"name": "名前",
"phone": "電話番号",
"text1": "オークション商品がありません",
"text2": "今すぐ入札する"
},
"error_page": {
"back_btn": "戻る",
@ -40,18 +51,18 @@
"countryRegion": {
"title": "国と地域",
"searchPlaceholder": "国と地域を入力してください",
"frequentCountry": "よく使"
"frequentCountry": "よく使用する"
},
"realAuth": {
"title": "実名認証",
"cnTab": "中国本土住民",
"otherTab": "非中国本土住民",
"cnTabDesc": "身分証情報を入力してください",
"title": "本人確認",
"cnTab": "中国本土居住者",
"otherTab": "中国本土以外の居住者",
"cnTabDesc": "身分証明書情報を入力してください",
"otherTabDesc": "個人情報をアップロードしてください",
"idCard": "身分証番号",
"idCardPlaceholder": "身分証番号を入力してください",
"name": "名",
"namePlaceholder": "名を入力してください",
"idCard": "身分証明書番号",
"idCardPlaceholder": "身分証明書番号を入力してください",
"name": "",
"namePlaceholder": "を入力してください",
"gender": "性別",
"male": "男性",
"female": "女性",
@ -59,11 +70,154 @@
"birthdayPlaceholder": "生年月日を入力してください",
"adress": "住所",
"adressPlaceholder": "住所を入力してください",
"bank": "所属銀行",
"bankPlaceholder": "所属銀行を選択してください",
"bank": "銀行",
"bankPlaceholder": "銀行を選択してください",
"bankCard": "銀行カード番号",
"bankCardPlaceholder": "銀行カード番号を入力してください",
"cancel": "キャンセル",
"confirm": "確定"
"confirm": "確認",
"success_mess": "送信が完了しました",
"text1": "性別を選択してください",
"detail": {
"gender": {
"male": "男性",
"female": "女性"
}
}
},
"detail": {
"text1": "アーティスト",
"text2": "総平方フィート",
"text3": "長さ",
"text4": "幅",
"text5": "作品紹介",
"text6": "開始価格",
"text7": "入札リスト",
"text8": "オークション商品詳細"
},
"art_detail_page": {
"button": "今すぐ支払う",
"prompt_title": "おめでとうございます",
"prompt_desc": "入札が成功しました"
},
"home": {
"tab1": "オークションリスト",
"tab2": "オークション説明",
"lot_detail": "ロット詳細",
"refresh_show": "更新が完了しました",
"finished_text": "これ以上の商品はありません",
"start_price": "開始価格",
"close_price": "落札価格",
"my_lots": "マイロット",
"go_home": "ホームへ",
"text1": "クリックしてライブルームに入る",
"text2": "北京時間"
},
"payment": {
"title": "支払い",
"text1": "支払い結果",
"text2": "支払い成功",
"text3": "支払い失敗",
"text4": "未支払い",
"text5": "支払い期限切れ",
"text6": "一部支払い",
"next": "次へ",
"backHome": "ホームに戻る",
"confirm": "支払いを確認",
"fullPayment": "全額支払い",
"partialPayment": "一部支払い",
"loading": "読み込み中...",
"error": {
"enterAmount": "金額を入力してください",
"exceedTotal": "合計金額を超えることはできません"
},
"placeholder": {
"amount": "最大 {currency}{price}"
}
},
"signature": {
"title": "署名内容",
"loading": "読み込み中...",
"agreement": {
"notice": "オークション通知",
"rules": "オークションルール",
"buyerGuide": "購入者ガイド",
"buyerAgreement": "購入者同意書",
"record": "オークション記録確認",
"transfer": "オークション譲渡確認"
},
"error": {
"getRecord": "オークション記録の取得に失敗しました"
},
"action": {
"agree": "同意して署名",
"back": "戻る",
"clear": "クリア",
"confirm": "確認"
},
"tips": {
"landscape": "スマートフォンを横向きにしてください",
"needSign": "先に署名してください",
"prePayment": "支払い前に同意して署名してください"
}
},
"liveRoom": {
"loading": "ライブストリーム読み込み中...",
"error": {
"player": "プレーヤーエラー:",
"init": "プレーヤーの初期化に失敗しました:",
"noVideo": "動画要素が見つかりません",
"screenshot": "動画スクリーンショットの取得に失敗しました:"
},
"player": {
"autoplay": true,
"muted": true,
"width": "100%",
"height": "100%"
},
"status": {
"error_mess": "ライブコンテンツの取得に失敗しました。再試行しますか?",
"success_mess": "入札が成功しました",
"warn_mess": "入札が有効になっていません",
"now_price": "現在価格",
"lower_price": "次回入札価格",
"confirm": "入札を確認",
"button": "「入札を有効にする」をクリックして参加",
"start": "オークション開始",
"head": "トップ",
"out": "アウト",
"success": "成立",
"next_lot": "次のロットがまもなく開始",
"spot": "会場入札",
"network": "オンライン入札",
"me": "自分",
"all_pay": "全額支払い",
"part_pay": "一部支払い",
"lots": "ロット",
"colse_bid": "入札を終了",
"start_bid": "入札を有効にする",
"total": "合計",
"lots_num": "ロット",
"cast": "キャスト中",
"wait_update": "更新待ち",
"text1": "まもなく落札",
"text2": "入札がありました",
"text3": "更新後に入札してください",
"text4": "おめでとうございます。入札が成功しました",
"text5": "支払いを行ってください",
"text6": "このロットは終了しました",
"text7": "次のロットをお待ちください",
"text8": "申し訳ありません。入札に失敗しました",
"text9": "オークション終了",
"text10": "オークションが終了しました。ご参加ありがとうございました"
}
},
"privacyPolicy": {
"title": "プライバシーポリシー",
"content": {
"header": "「FENGHEプライバシーポリシー」を注意深くお読みください特に太字の内容。お客様の個人情報の取り扱いに関する規則をご理解ください。読む際にご不明な点がございましたら、カスタマーサービスにお問い合わせください。契約内容にご同意いただけない場合は、直ちにアクセスを中止してください。",
"version": "バージョン更新日2025年2月6日",
"scope": "「FENGHE」プライバシーポリシーは、上海風和オークション株式会社のオンライン入札、ショッピング、その他の商品またはサービスに適用されます。これには、オンラインオークションライブストリーミング、オンライン入札、国内代理入札、海外代理入札、期間限定入札、委託販売、グローバルアート購入、宝物継承、その他のウェブサイト、クライアント、ミニプログラム、および技術の発展に伴い出現する新しい形態の商品および/またはサービスが含まれますが、これらに限定されません。"
}
}
}

View File

@ -13,7 +13,11 @@
"unocssExample": "🎨 Unocss 示例",
"keepAlive": "🧡 KeepAlive 演示",
"persistPiniaState": "💾 持久化 Pinia 状态",
"fetch": "🏄 网络请求"
"fetch": "🏄 网络请求",
"home": "首页",
"auction": "拍卖",
"live": "直播",
"settings": "设置"
},
"tabbar": {
"home": "主页",
@ -26,17 +30,88 @@
"login": "登录",
"back": "返回",
"hasSendTo": "已发送验证码至",
"reSend": "重新发送"
"reSend": "重新发送",
"agreement": "登录即同意",
"privacyPolicy": "《隐私政策》"
},
"common": {
"items": "件",
"auction": "拍品"
"auction": "拍品",
"loading": "加载中...",
"networkError": "网络错误,请重试",
"systemError": "系统错误,请稍后重试",
"success": "操作成功",
"fail": "操作失败",
"confirm": "确认",
"cancel": "取消",
"back": "返回",
"next": "下一步",
"save": "保存",
"edit": "编辑",
"delete": "删除",
"view": "查看",
"close": "关闭",
"refresh": "刷新",
"noData": "暂无数据",
"loadMore": "加载更多",
"noMore": "没有更多了",
"refreshSuccess": "刷新成功",
"pleaseInput": "请输入",
"pleaseSelect": "请选择"
},
"profile": {
"name": "姓名",
"phone": "手机号",
"text1": "您暂无拍品",
"text2": "快去竞拍吧"
"text2": "快去竞拍吧",
"title": "个人中心",
"account": {
"title": "账户信息",
"avatar": "头像",
"nickname": "昵称",
"phone": "手机号",
"email": "邮箱",
"realName": "实名认证",
"verified": "已认证",
"unverified": "未认证",
"edit": "编辑"
},
"order": {
"title": "我的订单",
"all": "全部",
"unpaid": "待付款",
"paid": "已付款",
"completed": "已完成",
"cancelled": "已取消"
},
"favorite": {
"title": "我的收藏",
"empty": "暂无收藏",
"delete": "删除",
"deleteConfirm": "确认删除选中的收藏?"
},
"address": {
"title": "收货地址",
"add": "新增地址",
"edit": "编辑地址",
"delete": "删除地址",
"default": "默认地址",
"setDefault": "设为默认",
"name": "收货人",
"phone": "手机号码",
"region": "所在地区",
"detail": "详细地址",
"save": "保存",
"deleteConfirm": "确认删除该地址?"
},
"settings": {
"title": "设置",
"notification": "消息通知",
"language": "语言",
"about": "关于我们",
"logout": "退出登录",
"logoutConfirm": "确认退出登录?"
}
},
"error_page": {
"back_btn": "返回",
@ -76,7 +151,13 @@
"cancel": "取消",
"confirm": "确定",
"success_mess": "提交成功",
"text1": "请选择性别"
"text1": "请选择性别",
"detail": {
"gender": {
"male": "男",
"female": "女"
}
}
},
"detail": {
"text1": "作者",
@ -86,7 +167,7 @@
"text5": "画作简介",
"text6": "起拍价",
"text7": "竞价表",
"text8": "拍卖品详情",
"text8": "拍卖品详情"
},
"art_detail_page": {
"button": "去支付",
@ -148,12 +229,411 @@
"next": "下一步"
},
"payment": {
"title": "支付",
"result": {
"title": "支付结果",
"success": "支付成功",
"fail": "支付失败",
"unpaid": "未支付",
"expired": "支付已过期",
"partial": "部分支付"
},
"text1": "支付结果",
"text2": "支付成功",
"text3": "支付失败",
"text4": "未支付",
"text5": "支付过期",
"text6": "部分支付",
"next": "下一步",
"text6": "部分支付"
"backHome": "回到首页",
"confirm": "确认支付",
"fullPayment": "支付全部",
"partialPayment": "支付部分",
"loading": "加载中...",
"error": {
"enterAmount": "请输入金额",
"exceedTotal": "不得高于全部金额",
"invalidAmount": "请输入有效的支付金额",
"networkError": "网络错误,请重试",
"systemError": "系统错误,请稍后重试"
},
"placeholder": {
"amount": "最多{currency}{price}"
},
"amount": "支付金额"
},
"signature": {
"protocol": {
"loading": "加载中...",
"title": "签署内容",
"agree": "同意并签字",
"cancel": "取消",
"confirm": "确认",
"success": "签署成功",
"fail": "签署失败",
"back": "返回"
},
"loading": "加载中...",
"agreement": {
"notice": "《拍卖公告》",
"rules": "《拍卖规则》",
"buyerGuide": "《竞买须知》",
"buyerAgreement": "《竞买协议》",
"record": "《拍卖笔录成交确认书》",
"transfer": "《拍卖移交确认书》"
},
"error": {
"getRecord": "获取拍卖笔录失败"
},
"action": {
"agree": "同意并签字",
"back": "返回",
"clear": "清空",
"confirm": "确认"
},
"tips": {
"landscape": "请将手机横屏使用",
"needSign": "请先签名",
"prePayment": "支付前需同意以下内容并签字"
}
},
"liveRoom": {
"loading": "直播加载中...",
"error": {
"player": "播放器错误:",
"init": "播放器初始化失败:",
"noVideo": "未找到视频元素",
"screenshot": "获取视频截图失败:"
},
"player": {
"autoplay": true,
"muted": true,
"width": "100%",
"height": "100%"
},
"status": {
"error_mess": "直播内容获取失败,是否重新获取",
"success_mess": "出价成功",
"warn_mess": "出价状态未开启",
"now_price": "当前价",
"lower_price": "下口价",
"confirm": "确认出价",
"button": "点击'开启出价',即刻参与竞拍",
"start": "开始拍卖",
"head": "领先",
"out": "出局",
"success": "成交",
"next_lot": "即将开始下一个拍品",
"spot": "现场竞价",
"network": "网络竞价",
"me": "我",
"all_pay": "支付全部",
"part_pay": "支付部分",
"lots": "拍品",
"colse_bid": "关闭出价",
"start_bid": "开启出价",
"total": "共",
"lots_num": "个拍品",
"cast": "投屏中",
"wait_update": "等待更新",
"text1": "即将落槌",
"text2": "已有人出价",
"text3": "更新后再出价",
"text4": "恭喜您,竞拍成功",
"text5": "请缴款",
"text6": "本拍品已结束",
"text7": "请期待下个拍品",
"text8": "很遗憾,竞拍失败",
"text9": "竞拍结束",
"text10": "竞拍结束,谢谢参与"
}
},
"privacyPolicy": {
"title": "隐私政策",
"content": {
"header": "请仔细阅读《丰和隐私政策》(尤其是加粗的内容)并确定了解我们对您个人信息的处理规则。阅读过程中,如您有任何疑问,可联系我们的客服咨询,如您不同意协议中的任何条款,您应立即停止访问。",
"version": "版本更新日期2025 年 2 月 6 日",
"scope": "丰和隐私政策适用于上海丰和拍卖有限公司旗下的网络竞拍、购物等产品或服务,包括但不限于在线拍卖直播、在线竞拍、国内代拍、海外代拍、限时竞拍、我要送拍、全球艺购、藏宝传家等网站、客户端、小程序以及随技术发展出现的新形态向您提供的各项产品与/或服务。"
}
},
"collectCode": {
"login": {
"title": "收藏码登录",
"phoneNumber": "手机号",
"phoneNumberPlaceholder": "请输入手机号",
"password": "密码",
"passwordPlaceholder": "请输入密码",
"passwordLogin": "密码登录",
"codeLogin": "验证码登录",
"getCode": "获取验证码",
"login": "登录",
"hasSendTo": "已发送至",
"reSend": "重新发送",
"back": "返回"
},
"mine": {
"title": "个人中心",
"logout": "退出登录",
"offlineQrcode": "线下付款二维码",
"refreshSuccess": "刷新成功",
"noMore": "没有更多了",
"add": "新增",
"addQrcode": {
"title": "新增收款二维码",
"amount": "金额",
"amountUnit": "RMB",
"amountPlaceholder": "请输入金额",
"lotNo": "Lot号",
"lotNoPlaceholder": "请输入拍品序号",
"existingWarning": "该拍品号当前已存在收款二维码,确定要创建吗?",
"cancel": "取消",
"confirm": "确定"
}
},
"qrcode": {
"status": {
"paid": "已付款",
"unpaid": "未付款",
"partialPaid": "已部分付款"
},
"card": {
"lotNo": "Lot",
"creator": "创建人:",
"createTime": "创建时间:",
"view": "查看"
}
},
"payment": {
"title": "支付",
"fullPayment": "支付全部",
"partialPayment": "支付部分",
"confirmPayment": "确认支付",
"maxAmount": "最多{currency}{price}",
"enterAmount": "请输入金额",
"exceedTotal": "不得高于全部金额"
},
"signature": {
"title": "签署",
"back": "返回",
"clear": "清空",
"confirm": "确认",
"pleaseSign": "请先签名",
"loading": "加载中..."
},
"message": {
"amountRequired": "请输入金额",
"lotNoRequired": "请输入Lot号",
"deleteSuccess": "删除成功"
}
},
"validation": {
"required": "此项为必填项",
"invalidFormat": "格式不正确",
"invalidPhone": "请输入有效的手机号",
"invalidEmail": "请输入有效的邮箱地址",
"invalidPassword": "密码格式不正确",
"invalidCode": "验证码格式不正确",
"invalidAmount": "请输入有效的金额",
"invalidNumber": "请输入有效的数字"
},
"realName": {
"title": "实名认证",
"cnTab": "中国大陆居民",
"otherTab": "非中国大陆居民",
"cnTabDesc": "请填写身份证信息",
"otherTabDesc": "请上传个人信息",
"idCard": "身份证号",
"idCardPlaceholder": "请输入身份证号",
"name": "姓名",
"namePlaceholder": "请输入姓名",
"gender": "性别",
"male": "男",
"female": "女",
"birthday": "出生日期",
"birthdayPlaceholder": "请选择出生日期",
"address": "家庭住址",
"addressPlaceholder": "请输入家庭住址",
"bank": "开户银行",
"bankPlaceholder": "请选择开户银行",
"bankCard": "银行卡号",
"bankCardPlaceholder": "请输入银行卡号",
"confirm": "确认",
"success": "提交成功",
"selectGender": "请选择性别"
},
"auction": {
"title": "拍品详情",
"area": "总平方尺",
"length": "长",
"width": "宽",
"description": "作品介绍",
"startPrice": "起拍价",
"bidList": "竞拍记录",
"detail": "拍品详情",
"tab": {
"detail": "拍品详情",
"description": "拍品说明"
},
"lotDetail": "LOT详情",
"refresh": {
"success": "刷新成功",
"noMore": "没有更多了"
},
"price": {
"start": "起拍价",
"current": "当前价",
"hammer": "成交价"
}
},
"live": {
"enterRoom": "点击进入直播间",
"beijingTime": "北京时间",
"status": {
"notStarted": "未开始",
"live": "直播中",
"ended": "已结束"
},
"message": {
"networkError": "网络异常,请检查网络连接",
"reconnecting": "正在重连...",
"reconnectSuccess": "重连成功",
"reconnectFail": "重连失败,请刷新页面"
}
},
"country": {
"title": "国家和地区",
"searchPlaceholder": "请输入国家或地区",
"frequentCountry": "常用"
},
"app": {
"name": "丰和",
"description": "丰和国际京都拍卖",
"keywords": "丰和,丰和文化,FENGHE,京都,拍卖",
"language": "📚 语言",
"unocssExample": "🎨 Unocss示例",
"loading": "加载中...",
"error": {
"404": {
"title": "页面不存在",
"back": "返回"
},
"network": "网络错误",
"server": "服务器错误"
}
},
"bid": {
"title": "竞拍",
"noBids": "暂无竞拍商品",
"bidNow": "立即竞拍",
"success": "竞拍成功",
"fail": "竞拍失败",
"confirm": "确认出价",
"cancel": "取消",
"amount": "出价金额",
"currentPrice": "当前价",
"nextPrice": "下一口价",
"bidHistory": "竞价记录",
"bidder": "竞买人",
"bidTime": "竞价时间",
"bidAmount": "竞价金额",
"status": {
"bidding": "竞价中",
"ended": "已结束",
"upcoming": "即将开始",
"cancelled": "已取消"
},
"message": {
"confirmBid": "确认出价 {amount} 元?",
"bidSuccess": "出价成功",
"bidFail": "出价失败",
"priceChanged": "价格已更新,请重新出价",
"insufficientBalance": "余额不足",
"notQualified": "您暂未获得竞买资格",
"auctionEnded": "拍卖已结束",
"auctionNotStarted": "拍卖未开始"
}
},
"settings": {
"title": "设置",
"language": "语言",
"notification": "消息通知",
"about": "关于我们",
"feedback": "意见反馈",
"privacy": "隐私政策",
"terms": "服务条款",
"version": "版本信息",
"logout": "退出登录",
"darkMode": "深色模式",
"auto": "跟随系统",
"light": "浅色",
"dark": "深色"
},
"layout": {
"default": {
"title": "丰和拍卖",
"loading": "加载中...",
"error": "出错了",
"retry": "重试",
"back": "返回"
},
"error": {
"notFound": "页面不存在",
"back": "返回首页",
"retry": "重试"
}
},
"components": {
"loading": {
"text": "加载中..."
},
"empty": {
"text": "暂无数据",
"description": "没有找到相关内容"
},
"error": {
"text": "出错了",
"description": "加载失败,请重试",
"button": "重试"
},
"navbar": {
"back": "返回",
"close": "关闭",
"home": "首页"
},
"tabbar": {
"home": "首页",
"auction": "拍卖",
"live": "直播",
"profile": "我的"
},
"dialog": {
"confirm": "确定",
"cancel": "取消",
"close": "关闭"
},
"toast": {
"success": "操作成功",
"fail": "操作失败",
"loading": "加载中..."
},
"form": {
"required": "必填",
"optional": "选填",
"save": "保存",
"submit": "提交",
"cancel": "取消",
"pleaseInput": "请输入",
"pleaseSelect": "请选择"
},
"upload": {
"text": "点击上传",
"delete": "删除",
"preview": "预览",
"maxSize": "文件大小不能超过 {size}",
"format": "支持的文件格式:{formats}",
"uploading": "上传中...",
"uploadSuccess": "上传成功",
"uploadFail": "上传失败"
}
}
}

View File

@ -1,44 +1,55 @@
{
"appSetting": {
"appName": "豐和",
"appDescription": "泰豐國際京都拍賣會",
"appKeyWords": "泰豐,泰豐文化,豐和,京都,拍賣會"
"appName": "FENGHE",
"appDescription": "泰風國際京都拍賣",
"appKeyWords": "泰風,泰風文化,FENGHE,京都,拍賣"
},
"menu": {
"home": "首頁",
"profile": "我的",
"darkMode": "🌗 暗黑模式",
"profile": "個人資料",
"darkMode": "🌗 深色模式",
"language": "📚 語言",
"404Demo": "🙅 404頁面示",
"404Demo": "🙅 404頁面",
"unocssExample": "🎨 Unocss示例",
"keepAlive": "🧡 KeepAlive 演示",
"persistPiniaState": "💾 持久化 Pinia 狀態",
"fetch": "🏄 網路請求"
"keepAlive": "🧡 KeepAlive示例",
"fetch": "🏄 網絡請求"
},
"tabbar": {
"home": "首頁",
"profile": "我的"
"profile": "個人資料"
},
"login": {
"title": "登入",
"phonePlaceholder": "請輸入手機號",
"phonePlaceholder": "請輸入手機號",
"getCode": "獲取驗證碼",
"login": "登入",
"back": "返回",
"hasSendTo": "已發送驗證碼至",
"reSend": "重新發送"
"hasSendTo": "驗證碼已發送至",
"reSend": "重新發送",
"agreement": "登入即表示同意",
"privacyPolicy": "隱私政策"
},
"common": {
"items": "件",
"auction": "拍賣"
},
"profile": {
"name": "姓名",
"phone": "手機號碼",
"text1": "您還沒有拍賣品",
"text2": "立即競拍"
},
"error_page": {
"back_btn": "返回",
"txt": "沒有找到"
"txt": "找到"
},
"prose_page": {
"btn_fetch": "拉取",
"btn_clear": "清空",
"btn_fetch": "取",
"btn_clear": "清",
"btn_empty_desc": "暫無數據"
},
"countryRegion": {
"title": "國家地區",
"title": "國家地區",
"searchPlaceholder": "請輸入國家和地區",
"frequentCountry": "常用"
},
@ -46,10 +57,10 @@
"title": "實名認證",
"cnTab": "大陸居民",
"otherTab": "非大陸居民",
"cnTabDesc": "請填寫身份證相關信息",
"otherTabDesc": "請上傳個人相關信息",
"idCard": "身份證號",
"idCardPlaceholder": "請輸入身份證號",
"cnTabDesc": "請填寫身份證信息",
"otherTabDesc": "請上傳個人信息",
"idCard": "身份證號",
"idCardPlaceholder": "請輸入身份證號",
"name": "姓名",
"namePlaceholder": "請輸入姓名",
"gender": "性別",
@ -59,12 +70,155 @@
"birthdayPlaceholder": "請輸入出生日期",
"adress": "家庭住址",
"adressPlaceholder": "請輸入家庭住址",
"bank": "所屬銀行",
"bankPlaceholder": "請選擇所屬銀行",
"bankCard": "銀行卡號",
"bankCardPlaceholder": "請輸入銀行卡號",
"bank": "銀行",
"bankPlaceholder": "請選擇銀行",
"bankCard": "銀行卡號",
"bankCardPlaceholder": "請輸入銀行卡號",
"cancel": "取消",
"confirm": "確定"
"confirm": "確認",
"success_mess": "提交成功",
"text1": "請選擇性別",
"detail": {
"gender": {
"male": "男",
"female": "女"
}
}
},
"detail": {
"text1": "藝術家",
"text2": "總平方英尺",
"text3": "長度",
"text4": "寬度",
"text5": "作品介紹",
"text6": "起拍價",
"text7": "競拍記錄",
"text8": "拍品詳情"
},
"art_detail_page": {
"button": "立即支付",
"prompt_title": "恭喜您",
"prompt_desc": "競拍成功"
},
"home": {
"tab1": "拍賣列表",
"tab2": "拍賣說明",
"lot_detail": "拍品詳情",
"refresh_show": "刷新成功",
"finished_text": "沒有更多商品",
"start_price": "起拍價",
"close_price": "成交價",
"my_lots": "我的拍品",
"go_home": "返回首頁",
"text1": "點擊進入直播間",
"text2": "北京時間"
},
"payment": {
"title": "支付",
"text1": "支付結果",
"text2": "支付成功",
"text3": "支付失敗",
"text4": "未支付",
"text5": "支付已過期",
"text6": "部分支付",
"next": "下一步",
"backHome": "返回首頁",
"confirm": "確認支付",
"fullPayment": "全額支付",
"partialPayment": "部分支付",
"loading": "加載中...",
"error": {
"enterAmount": "請輸入金額",
"exceedTotal": "不能超過總金額"
},
"placeholder": {
"amount": "最大 {currency}{price}"
}
},
"signature": {
"title": "簽署內容",
"loading": "加載中...",
"agreement": {
"notice": "拍賣須知",
"rules": "拍賣規則",
"buyerGuide": "買家指南",
"buyerAgreement": "買家協議",
"record": "拍賣記錄確認",
"transfer": "拍賣轉讓確認"
},
"error": {
"getRecord": "獲取拍賣記錄失敗"
},
"action": {
"agree": "同意並簽署",
"back": "返回",
"clear": "清除",
"confirm": "確認"
},
"tips": {
"landscape": "請將手機橫屏使用",
"needSign": "請先簽署",
"prePayment": "請先同意並簽署後再支付"
}
},
"liveRoom": {
"loading": "直播加載中...",
"error": {
"player": "播放器錯誤:",
"init": "播放器初始化失敗:",
"noVideo": "未找到視頻元素",
"screenshot": "獲取視頻截圖失敗:"
},
"player": {
"autoplay": true,
"muted": true,
"width": "100%",
"height": "100%"
},
"status": {
"error_mess": "獲取直播內容失敗,是否重試?",
"success_mess": "競拍成功",
"warn_mess": "未開啟競拍",
"now_price": "當前價格",
"lower_price": "下次出價",
"confirm": "確認出價",
"button": "點擊「開啟競拍」參與",
"start": "開始拍賣",
"head": "領先",
"out": "出局",
"success": "成交",
"next_lot": "下一件拍品即將開始",
"spot": "現場出價",
"network": "網絡出價",
"me": "本人",
"all_pay": "全額支付",
"part_pay": "部分支付",
"lots": "拍品",
"colse_bid": "關閉競拍",
"start_bid": "開啟競拍",
"total": "總計",
"lots_num": "拍品",
"cast": "投放中",
"wait_update": "等待更新",
"text1": "即將落槌",
"text2": "有人出價",
"text3": "更新後再出價",
"text4": "恭喜您,競拍成功",
"text5": "請進行支付",
"text6": "本件拍品已結束",
"text7": "請等待下一件拍品",
"text8": "抱歉,競拍失敗",
"text9": "拍賣結束",
"text10": "拍賣已結束,感謝您的參與"
}
},
"privacyPolicy": {
"title": "隱私政策",
"content": {
"header": "請仔細閱讀「FENGHE隱私政策」尤其是加粗內容並確保您理解我們處理您個人信息的規則。如果您在閱讀過程中有任何疑問可以諮詢我們的客服。如果您不同意協議中的任何條款應立即停止訪問。",
"version": "版本更新日期2025年2月6日",
"scope": "「FENGHE」隱私政策適用於上海風和拍賣有限公司旗下的線上競拍、購物及其他產品或服務包括但不限於線上拍賣直播、線上競拍、國內代理競拍、海外代理競拍、限時競拍、寄售、全球藝術品購買、珍寶傳承等網站、客戶端、小程序以及隨著技術發展出現的新形態產品及/或服務。"
}
}
}

View File

@ -63,7 +63,6 @@ export default defineNuxtConfig({
alwaysRedirect: true,
fallbackLocale: 'zh-CN'
},
langDir: 'locales',
defaultLocale: 'zh-CN',
vueI18n: './i18n/i18n.config.ts',
},