Commit af3e1ed6 authored by 罗超's avatar 罗超
parents d57d3d47 32565b73
......@@ -256,10 +256,11 @@ export interface ResetPasswordResponseDto {
* 通用响应
*/
export interface GeneralResponseDto {
/** 是否成功 */
success: boolean
/** 错误码 */
code?: number
/** 消息 */
message?: string
success?: boolean
}
/**
......@@ -1107,7 +1108,7 @@ class UserService {
static async updateMemberGuest(
tenantId: string,
data: MemberGuestInputDto
): Promise<MemberGuestInputDto> {
): Promise<GeneralResponseDto> {
const response = await OtaRequest.post(
'/member-guest/or-update',
data,
......@@ -1117,7 +1118,7 @@ class UserService {
} : {}
}
)
return response as unknown as MemberGuestInputDto
return response as unknown as GeneralResponseDto
}
/**
......@@ -1166,7 +1167,7 @@ class UserService {
static async updateMemberMailingAddress(
tenantId: string,
data: MemberMailingAddressInputDto
): Promise<MemberMailingAddressInputDto> {
): Promise<GeneralResponseDto> {
const response = await OtaRequest.post(
'/member-mailing-address/or-update',
data,
......@@ -1176,7 +1177,7 @@ class UserService {
} : {}
}
)
return response as unknown as MemberMailingAddressInputDto
return response as unknown as GeneralResponseDto
}
/**
......
<template>
<div class="w-[977px] h-full flex flex-col flex-shrink-0"
:class="[current<3?'overflow-hidden':'']">
<a-spin :loading="loading">
<div class="flex pl-[13px]">
<div v-for="(item,index) in TitleBars"
class="myOrder-status mr-[42px] py-[22px] cursor-pointer relative"
:class="[activeMenu==item.key?'active font-medium':'font-light',index?'ml-[42px]':null]"
@click="changeStatus(item.path)">{{ item.label }}
<div class="myOrder-status-border absolute left-0 bottom-0 w-full flex justify-center">
<div></div>
</div>
<div class="w-[977px] flex flex-col pt-[25px] h-full overflow-hidden"
:class="[current<3?'':'']">
<div class="flex pl-[13px]">
<div v-for="(item,index) in TitleBars"
class="myOrder-status mr-[42px] py-[22px] cursor-pointer relative"
:class="[activeMenu==item.key?'active font-medium':'font-light',index?'ml-[42px]':null]"
@click="changeStatus(item.path)">{{ item.label }}
<div class="myOrder-status-border absolute left-0 bottom-0 w-full flex justify-center">
<div></div>
</div>
</div>
<a-divider class="!m-[0]"/>
<main class="max-h-[735px] mt-[20px] overflow-hidden">
<router-view />
</main>
</a-spin>
</div>
<a-divider class="!m-[0]"/>
<!-- max-h-[735px] -->
<main class="flex-1 mt-[20px] overflow-hidden">
<router-view />
</main>
</div>
</template>
<script setup lang="ts">
......
<template>
<div class="h-full overflow-auto">
<div class="accountCenter rounded-[14px] border-[1px] mb-[28px] flex items-center py-[30px] pl-[43px] pr-[35px]">
<div class="w-[102px] mr-[43px]">
<div class="customPrimary-bg-7 rounded-full w-[50px] h-[50px] flex justify-center items-center">
<img class="w-[29px] h-[36px]" src="../../../assets/images/personal/mm.png" alt="" />
<div class="w-full h-full overflow-hidden" >
<a-scrollbar class="overflow-auto h-[100%]">
<div class="accountCenter rounded-[14px] border-[1px] mb-[28px] flex items-center py-[30px] pl-[43px] pr-[35px]">
<div class="w-[102px] mr-[43px]">
<div class="customPrimary-bg-7 rounded-full w-[50px] h-[50px] flex justify-center items-center">
<img class="w-[29px] h-[36px]" src="../../../assets/images/personal/mm.png" alt="" />
</div>
</div>
<div class="text-sm w-[200px]">
<span v-if="userInfor?.email==''" class="customColor-text-7">{{ t('personal.notYetBin') }}</span>
<span v-else class="SourceHanSansCN">
<span>{{ t('personal.securityLevel') }}</span>
<span class="customPrimary-9">
<template v-if="userInfor?.passwordSecurity<2">
{{ t('personal.low') }}
</template>
<template v-else-if="userInfor?.passwordSecurity==2">
{{ t('personal.medium') }}
</template>
<template v-else-if="userInfor?.passwordSecurity==3">
{{ t('personal.high') }}
</template>
</span>
</span>
</div>
<div class="w-[415px] leading-[20px] SourceHanSansCN">
<div class="w-[325px] customColor-text-7">{{ t('personal.passwordSecurityTip') }}</div>
</div>
<div class="flex-1 flex justify-end items-end">
<a-button @click="goPage('/perForgePassword/'+userInfor?.email)"
type="primary"
size="large"
class="acc-button !h-[34px] !rounded-[8px] !text-sm !px-[13px]">
<span class="customPrimary-6 font-medium ">{{t('login.forgetPassword')}}</span>
</a-button>
<a-button @click="goPage('/resetPassword')"
type="primary"
size="large"
class="acc-button !h-[34px] !rounded-[8px] !text-sm !px-[13px]">
<span class="customPrimary-6 font-medium ">{{t('login.resetPassword')}}</span>
</a-button>
</div>
</div>
</div>
<div class="text-sm w-[200px]">
<span v-if="userInfor?.email==''" class="customColor-text-7">{{ t('personal.notYetBin') }}</span>
<span v-else class="SourceHanSansCN">
<span>{{ t('personal.securityLevel') }}</span>
<span class="customPrimary-9">
<template v-if="userInfor?.passwordSecurity<2">
{{ t('personal.low') }}
</template>
<template v-else-if="userInfor?.passwordSecurity==2">
{{ t('personal.medium') }}
</template>
<template v-else-if="userInfor?.passwordSecurity==3">
{{ t('personal.high') }}
</template>
</span>
</span>
</div>
<div class="w-[415px] leading-[20px] SourceHanSansCN">
<div class="w-[325px] customColor-text-7">{{ t('personal.passwordSecurityTip') }}</div>
</div>
<div class="flex-1 flex justify-end items-end">
<a-button @click="goPage('/perForgePassword/'+userInfor?.email)"
type="primary"
size="large"
class="acc-button !h-[34px] !rounded-[8px] !text-sm !px-[13px]">
<span class="customPrimary-6 font-medium ">{{t('login.forgetPassword')}}</span>
</a-button>
<a-button @click="goPage('/resetPassword')"
type="primary"
size="large"
class="acc-button !h-[34px] !rounded-[8px] !text-sm !px-[13px]">
<span class="customPrimary-6 font-medium ">{{t('login.resetPassword')}}</span>
</a-button>
</div>
</div>
<div class="accountCenter rounded-[14px] border-[1px] mb-[28px] flex items-center py-[30px] pl-[43px] pr-[35px]">
<div class="w-[102px] mr-[43px]">
<div class="customPrimary-bg-7 rounded-full w-[50px] h-[50px] flex justify-center items-center">
<img class="w-[35px] h-[25px]" src="../../../assets/images/personal/email.png" alt="" />
<div class="accountCenter rounded-[14px] border-[1px] mb-[28px] flex items-center py-[30px] pl-[43px] pr-[35px]">
<div class="w-[102px] mr-[43px]">
<div class="customPrimary-bg-7 rounded-full w-[50px] h-[50px] flex justify-center items-center">
<img class="w-[35px] h-[25px]" src="../../../assets/images/personal/email.png" alt="" />
</div>
</div>
<div class="text-sm w-[200px] font-medium">
<span :class="[userInfor?.email?'':'customColor-text-7']">{{ userInfor?.email||t('personal.notYetBin') }}</span>
</div>
<div class="w-[415px] leading-[20px] SourceHanSansCN">
<div class="customColor-text-7">{{ t('personal.bindEmailTip') }}</div>
</div>
<div class="flex-1 flex justify-end items-end">
<a-button @click="goPage('/editEmail')"
type="primary"
size="large"
class="acc-button !h-[34px] !rounded-[8px] !text-sm !px-[13px]">
<span class="customPrimary-6 font-medium">{{userInfor?.email?t('personal.changeBindData'):t('personal.goBind')}}</span>
</a-button>
</div>
</div>
</div>
<div class="text-sm w-[200px] font-medium">
<span :class="[userInfor?.email?'':'customColor-text-7']">{{ userInfor?.email||t('personal.notYetBin') }}</span>
</div>
<div class="w-[415px] leading-[20px] SourceHanSansCN">
<div class="customColor-text-7">{{ t('personal.bindEmailTip') }}</div>
</div>
<div class="flex-1 flex justify-end items-end">
<a-button @click="goPage('/editEmail')"
type="primary"
size="large"
class="acc-button !h-[34px] !rounded-[8px] !text-sm !px-[13px]">
<span class="customPrimary-6 font-medium">{{userInfor?.email?t('personal.changeBindData'):t('personal.goBind')}}</span>
</a-button>
</div>
</div>
<div class="accountCenter rounded-[14px] border-[1px] mb-[28px] flex items-center py-[30px] pl-[43px] pr-[35px]">
<div class="w-[102px] mr-[43px]">
<div class="rounded-full w-[52px] h-[52px] flex justify-center items-center">
<img class="w-[42px] h-[35px]" src="../../../assets/images/personal/wx.png" alt="" />
<div class="accountCenter rounded-[14px] border-[1px] mb-[28px] flex items-center py-[30px] pl-[43px] pr-[35px]">
<div class="w-[102px] mr-[43px]">
<div class="rounded-full w-[52px] h-[52px] flex justify-center items-center">
<img class="w-[42px] h-[35px]" src="../../../assets/images/personal/wx.png" alt="" />
</div>
</div>
<div class="text-sm w-[200px] font-medium">
<span :class="[WeChatInfor?'':'customColor-text-7']">{{ WeChatInfor?WeChatInfor.providerDisplayName:t('personal.notYetBin') }}</span>
</div>
<div class="w-[415px] leading-[20px] SourceHanSansCN">
<div class="customColor-text-7">{{ t('personal.bindWechatTip') }}</div>
</div>
<div class="flex-1 flex justify-end items-end">
<a-button @click="WeChatInfor?unBindWeChatAccount(2):getAppIdRedirectUri(providerTypeEnum.WECHAT.value)"
type="primary"
size="large"
class="acc-button !h-[34px] !rounded-[8px] !text-sm !px-[13px]">
<span class="customPrimary-6 font-medium ">{{WeChatInfor?t('personal.unBind'):t('personal.goBind')}}</span>
</a-button>
</div>
</div>
</div>
<div class="text-sm w-[200px] font-medium">
<span :class="[WeChatInfor?'':'customColor-text-7']">{{ WeChatInfor?WeChatInfor.providerDisplayName:t('personal.notYetBin') }}</span>
</div>
<div class="w-[415px] leading-[20px] SourceHanSansCN">
<div class="customColor-text-7">{{ t('personal.bindWechatTip') }}</div>
</div>
<div class="flex-1 flex justify-end items-end">
<a-button @click="WeChatInfor?unBindWeChatAccount(2):getAppIdRedirectUri(providerTypeEnum.WECHAT.value)"
type="primary"
size="large"
class="acc-button !h-[34px] !rounded-[8px] !text-sm !px-[13px]">
<span class="customPrimary-6 font-medium ">{{WeChatInfor?t('personal.unBind'):t('personal.goBind')}}</span>
</a-button>
</div>
</div>
<div class="accountCenter rounded-[14px] border-[1px] mb-[28px] flex items-center py-[30px] pl-[43px] pr-[35px]">
<div class="rounded-full w-[102px] h-[50px] flex justify-center items-center mr-[43px]">
<img class="w-[102px]" src="../../../assets/images/personal/google.png" alt="" />
</div>
<div class="text-sm w-[200px] font-medium">
<span :class="[GoogleInfor?'':'customColor-text-7']">{{ GoogleInfor?GoogleInfor.providerDisplayName:t('personal.notYetBin') }}</span>
</div>
<div class="w-[415px] leading-[20px] SourceHanSansCN">
<div class="customColor-text-7">{{ t('personal.bindGoogleTip') }}</div>
</div>
<div class="flex-1 flex justify-end items-end relative">
<a-button @click="GoogleInfor?unBindWeChatAccount(1):''"
type="primary"
size="large"
class="acc-button !h-[34px] !rounded-[8px] !text-sm !px-[13px]">
<span class="customPrimary-6 font-medium">{{GoogleInfor?t('personal.unBind'):t('personal.goBind')}}</span>
<div v-if="!GoogleInfor"
ref="googleButtonContainer"
class="g-signin2 rounded-full !rounded-[13px] overflow-hidden
w-full h-full z-[6] flex items-center justify-center cursor-pointer
absolute top-0 left-0 bottom-0 right-0"
data-onsuccess="onSignIn"
data-theme="dark"
@click.stop="">
<div class="accountCenter rounded-[14px] border-[1px] mb-[28px] flex items-center py-[30px] pl-[43px] pr-[35px]">
<div class="rounded-full w-[102px] h-[50px] flex justify-center items-center mr-[43px]">
<img class="w-[102px]" src="../../../assets/images/personal/google.png" alt="" />
</div>
</a-button>
</div>
</div>
<div class="accountCenter rounded-[14px] border-[1px] mb-[28px] flex items-center py-[30px] pl-[43px] pr-[35px]">
<div class="rounded-full w-[102px] h-[52px] flex items-center mr-[43px]">
<img class="w-[43px] h-[41px] ml-[11px]" src="../../../assets/images/personal/line.png" alt="" />
</div>
<div class="text-sm w-[200px] font-medium">
<span :class="[LnlineInfor?'':'customColor-text-7']">{{ LnlineInfor?LnlineInfor.providerDisplayName:t('personal.notYetBin') }}</span>
</div>
<div class="w-[415px] leading-[20px] SourceHanSansCN">
<div class="customColor-text-7">{{ t('personal.bindLineTip') }}</div>
</div>
<div class="flex-1 flex justify-end items-end">
<a-button @click="LnlineInfor?unBindWeChatAccount(3):getAppIdRedirectUri(providerTypeEnum.LINE.value)"
type="primary"
size="large"
class="acc-button !h-[34px] !rounded-[8px] !text-sm !px-[13px]">
<span class="customPrimary-6 font-medium ">{{LnlineInfor?t('personal.unBind'):t('personal.goBind')}}</span>
</a-button>
</div>
</div>
<div class="text-sm w-[200px] font-medium">
<span :class="[GoogleInfor?'':'customColor-text-7']">{{ GoogleInfor?GoogleInfor.providerDisplayName:t('personal.notYetBin') }}</span>
</div>
<div class="w-[415px] leading-[20px] SourceHanSansCN">
<div class="customColor-text-7">{{ t('personal.bindGoogleTip') }}</div>
</div>
<div class="flex-1 flex justify-end items-end relative">
<a-button @click="GoogleInfor?unBindWeChatAccount(1):''"
type="primary"
size="large"
class="acc-button !h-[34px] !rounded-[8px] !text-sm !px-[13px]">
<span class="customPrimary-6 font-medium">{{GoogleInfor?t('personal.unBind'):t('personal.goBind')}}</span>
<div v-if="!GoogleInfor"
ref="googleButtonContainer"
class="g-signin2 rounded-full !rounded-[13px] overflow-hidden
w-full h-full z-[6] flex items-center justify-center cursor-pointer
absolute top-0 left-0 bottom-0 right-0"
data-onsuccess="onSignIn"
data-theme="dark"
@click.stop="">
</div>
</a-button>
</div>
</div>
<div class="accountCenter rounded-[14px] border-[1px] mb-[28px] flex items-center py-[30px] pl-[43px] pr-[35px]">
<div class="rounded-full w-[102px] h-[52px] flex items-center mr-[43px]">
<img class="w-[43px] h-[41px] ml-[11px]" src="../../../assets/images/personal/line.png" alt="" />
</div>
<div class="text-sm w-[200px] font-medium">
<span :class="[LnlineInfor?'':'customColor-text-7']">{{ LnlineInfor?LnlineInfor.providerDisplayName:t('personal.notYetBin') }}</span>
</div>
<div class="w-[415px] leading-[20px] SourceHanSansCN">
<div class="customColor-text-7">{{ t('personal.bindLineTip') }}</div>
</div>
<div class="flex-1 flex justify-end items-end">
<a-button @click="LnlineInfor?unBindWeChatAccount(3):getAppIdRedirectUri(providerTypeEnum.LINE.value)"
type="primary"
size="large"
class="acc-button !h-[34px] !rounded-[8px] !text-sm !px-[13px]">
<span class="customPrimary-6 font-medium ">{{LnlineInfor?t('personal.unBind'):t('personal.goBind')}}</span>
</a-button>
</div>
</div>
</a-scrollbar>
</div>
</template>
<script setup lang="ts">
......@@ -453,4 +455,8 @@ inData()
background: url('../../../../assets/images/personal/sc_1.png')no-repeat;
background-size: 100% 100%;
}
:deep(.arco-scrollbar){
height: 100%;
overflow: hidden;
}
</style>
\ No newline at end of file
<template>
<div class="w-full h-full overflow-auto">
<div class="w-full h-full overflow-hidden">
<a-scrollbar class="overflow-auto h-[100%]">
<a-spin :loading="loading" class="w-full">
<a-space direction="vertical" class="w-full">
<!-- horizonta -->
<a-form :model="formData" :rules="rules" layout="vertical" class="w-full"
......@@ -181,12 +183,14 @@
</a-form>
</a-space>
</a-spin>
<!-- 图片预览 -->
<a-image-preview
v-model:visible="previewVisible"
:src="previewUrl"
:actions-layout="['rotateLeft', 'rotateRight', 'zoomIn', 'zoomOut', 'originalSize']"
/>
</a-scrollbar>
</div>
</template>
<script setup lang="ts">
......@@ -196,7 +200,6 @@ import { useRouter } from 'vue-router'
import { Message } from '@arco-design/web-vue'
import { useSystemConfigStore } from '@/stores/index'
import UserService from '@/services/UserService'
import type { setRegisterDto } from '@/services/UserService'
import CountryService from '@/services/CountryService'
import { useUserStore } from '@/stores/user'
import UploadService from '@/services/UploadService'
......@@ -255,11 +258,7 @@ const rules = computed(() => ({
],
}))
const loading = ref(false)
const codeValidateStatus = ref<'' | 'success' | 'error'>('')
const emailVerified = ref(false)
const loading = ref(true)
const maxSize = 2 // 2MB
// 预览相关
......@@ -422,6 +421,8 @@ const getUserDetail = async () => {
}
} catch (error) {
} finally {
loading.value = false
}
}
......@@ -480,4 +481,8 @@ initData()
background-color: rgb(var(--arcoblue-6));
color: rgb(var(--arcoblue-10));
}
:deep(.arco-scrollbar){
height: 100%;
overflow: hidden;
}
</style>
\ No newline at end of file
<template>
<a-spin :loading="loading" class="w-full">
<div v-show="!showType">
<a-scrollbar class="max-h-[692px] overflow-auto"
@scroll="handleDivScroll"
ref="scrollContainer">
<div class="accountCenter rounded-[14px]
border-[1px] mb-[18px] flex items-center
justify-between py-[15px] pl-[36px] pr-[22px]"
v-for="(item,index) in dataList">
<div class="w-[100px] mr-[20px]">
{{ item.name }}
</div>
<div class="flex-1 mr-[20px]">
{{ item.cityName }}{{ item.address }}
</div>
<div class="w-[200px] mr-[20px]">
{{item.phoneCode}} {{ item.phone }}
</div>
<div class="w-[100px]"
:class="[item.isDefault?'customColor-text-5':'']">
<!-- <a-switch v-if="item.isDefault" v-model="item.isDefault" :checked-value="Number(1)" :unchecked-value="Number(0)" disabled/> -->
{{ item.isDefault?t('personal.default'):'' }}
</div>
<div class="flex items-center justify-between">
<div class="w-[16px] h-[16px] editIcon cursor-pointer" @click="clickItem(item,1)">&nbsp;</div>
<div class="w-[14px] h-[16px] deleteIcon ml-[17px] cursor-pointer" @click="clickItem(item,0)">&nbsp;</div>
</div>
</div>
</a-scrollbar>
<div class="rounded-[8px] addGuestButton py-[10px] text-center text-base cursor-pointer" @click="showType = 1">{{ t('personal.addPostAddress') }}</div>
</div>
<div v-if="showType" class="addPassenger h-[581px] bg-[#FFFFFF] rounded-b-[12px] shadow-lg shadow-[#E3E6DA]">
<div class="addPassengerHeader py-[20px] px-[31px] rounded-t-[12px] text-base">{{ showType === 1 ? t('personal.addPostAddress') : t('personal.editPostAddress') }}</div>
<a-space direction="vertical" class="w-full p-[40px]">
<!-- horizonta -->
<a-form :model="formData" :rules="rules" layout="vertical" class="w-full">
<a-row class="w-full">
<a-col :span="8">
<a-form-item :label="t('personal.recipient')" field="name" required>
<a-input class="formData-input !w-[289px] mr-[30px]"
v-model="formData.name"
size="large"
:placeholder="t('personal.placeholderRecipient')">
</a-input>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item field="countryId" :label="t('CustomField.Participant.Nationality')" required>
<a-select class="formData-input !w-[289px] mr-[30px]"
v-model="formData.countryId"
<div class="w-full h-full overflow-hidden">
<div v-show="!showType" class="flex flex-col h-full overflow-hidden">
<a-scrollbar class="overflow-auto h-full"
@scroll="handleDivScroll"
ref="scrollContainer">
<a-spin :loading="loading" class="w-full">
<div class="accountCenter rounded-[14px]
border-[1px] mb-[18px] flex items-center
justify-between py-[15px] pl-[36px] pr-[22px]"
v-for="(item,index) in dataList">
<div class="w-[100px] mr-[20px]">
{{ item.name }}
</div>
<div class="flex-1 mr-[20px]">
{{ item.cityName }} {{ item?.address || '-' }}
</div>
<div class="w-[200px] mr-[20px]">
{{item.phoneCode}} {{ item?.phone ||'-' }}
</div>
<div class="w-[100px]"
:class="[item.isDefault?'customColor-text-5':'']">
<!-- <a-switch v-if="item.isDefault" v-model="item.isDefault" :checked-value="Number(1)" :unchecked-value="Number(0)" disabled/> -->
{{ item.isDefault?t('personal.default'):'' }}
</div>
<div class="flex items-center justify-between">
<div class="w-[16px] h-[16px] editIcon cursor-pointer" @click="clickItem(item,1)">&nbsp;</div>
<div class="w-[14px] h-[16px] deleteIcon ml-[17px] cursor-pointer" @click="clickItem(item,0)">&nbsp;</div>
</div>
</div>
</a-spin>
</a-scrollbar>
<div class="rounded-[8px] addGuestButton py-[10px] text-center text-base cursor-pointer" @click="showType = 1">{{ t('personal.addPostAddress') }}</div>
</div>
<div v-if="showType" class="addPassenger h-[581px] bg-[#FFFFFF] rounded-b-[12px] shadow-lg shadow-[#E3E6DA]">
<div class="addPassengerHeader py-[20px] px-[31px] rounded-t-[12px] text-base">{{ showType === 1 ? t('personal.addPostAddress') : t('personal.editPostAddress') }}</div>
<a-space direction="vertical" class="w-full p-[40px]">
<!-- horizonta -->
<a-form :model="formData" :rules="rules" layout="vertical" class="w-full">
<a-row class="w-full">
<a-col :span="8">
<a-form-item :label="t('personal.recipient')" field="name" required>
<a-input class="formData-input !w-[289px] mr-[30px]"
v-model="formData.name"
size="large"
:placeholder="t('personal.placeholderRecipient')">
</a-input>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item field="countryId" :label="t('CustomField.Participant.Nationality')" required>
<a-select class="formData-input !w-[289px] mr-[30px]"
v-model="formData.countryId"
size="large"
:placeholder="t('personal.placeholder')"
allow-search>
<a-option v-for="item of AreaCodeList" :value="item.id" :label="item.name" />
</a-select>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item :label="t('personal.city')" field="cityName">
<a-input class="formData-input !w-[289px] mr-[30px]"
v-model="formData.cityName"
size="large"
:placeholder="t('personal.placeholderCity')">
<template #suffix>
</template>
</a-input>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item :label="t('personal.address')" field="address" required>
<a-input class="formData-input !w-[289px] mr-[30px]"
v-model="formData.address"
size="large"
:placeholder="t('personal.placeholderAddress')">
<template #suffix>
</template>
</a-input>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item field="phoneCode" :label="t('login.phoneCode')" required>
<a-select class="formData-input !w-[289px] mr-[30px]"
v-model="formData.phoneCode"
size="large"
allow-search
:placeholder="t('personal.placeholder')">
<a-option v-for="item of AreaCodeList" :value="item.phoneCode" :label="item.phoneCode" >
<span>{{ item.name }}</span>
<span>({{ item.phoneCode }})</span>
</a-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item field="phone" :label="t('login.bindingPhone')" required>
<a-input class="formData-input !w-[289px] mr-[30px]"
v-model="formData.phone"
:placeholder="t('login.bindingPhoneRequired')"
size="large"></a-input>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item :label="t('personal.postalCode')" field="postalCode">
<a-input class="formData-input !w-[289px] mr-[30px]"
v-model="formData.postalCode"
size="large"
:placeholder="t('personal.placeholderPostalCode')">
<template #suffix>
</template>
</a-input>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item :label="t('personal.defaultAddress')" field="">
<a-switch v-model="formData.isDefault" :checked-value="Number(1)" :unchecked-value="Number(0)" />
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item field="" label="" class="mt-[95px] flex">
<div class="flex-1"></div>
<a-button
size="large"
:placeholder="t('personal.placeholder')"
allow-search>
<a-option v-for="item of AreaCodeList" :value="item.id" :label="item.name" />
</a-select>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item :label="t('personal.city')" field="cityName">
<a-input class="formData-input !w-[289px] mr-[30px]"
v-model="formData.cityName"
:loading="loading"
html-type="submit"
class="cancelbuttonBox !w-[159px] !border-[1px] !border-[#E3E6DA] font-bold text-gray-200 !h-[46px] !rounded-[13px] !text-base mr-[37px]"
@click="cancel()"
>
{{ t('personal.cancel') }}
</a-button>
<a-button
type="primary"
size="large"
:placeholder="t('personal.placeholderCity')">
<template #suffix>
</template>
</a-input>
:loading="loading"
html-type="submit"
class="SubmitBox !w-[159px] font-bold text-gray-200 !h-[46px] !rounded-[13px] !text-base mr-[37px]"
:class="[loading?'active':'']"
@click="handleSubmit()"
>
{{ t('personal.save') }}
</a-button>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item :label="t('personal.address')" field="address" required>
<a-input class="formData-input !w-[289px] mr-[30px]"
v-model="formData.address"
size="large"
:placeholder="t('personal.placeholderAddress')">
<template #suffix>
</template>
</a-input>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item field="phoneCode" :label="t('login.phoneCode')" required>
<a-select class="formData-input !w-[289px] mr-[30px]"
v-model="formData.phoneCode"
size="large"
allow-search
:placeholder="t('personal.placeholder')">
<a-option v-for="item of AreaCodeList" :value="item.phoneCode" :label="item.phoneCode" >
<span>{{ item.name }}</span>
<span>({{ item.phoneCode }})</span>
</a-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item field="phone" :label="t('login.bindingPhone')" required>
<a-input class="formData-input !w-[289px] mr-[30px]"
v-model="formData.phone"
:placeholder="t('login.bindingPhoneRequired')"
size="large"></a-input>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item :label="t('personal.postalCode')" field="postalCode">
<a-input class="formData-input !w-[289px] mr-[30px]"
v-model="formData.postalCode"
size="large"
:placeholder="t('personal.placeholderPostalCode')">
<template #suffix>
</template>
</a-input>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item :label="t('personal.defaultAddress')" field="">
<a-switch v-model="formData.isDefault" :checked-value="Number(1)" :unchecked-value="Number(0)" />
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item field="" label="" class="mt-[95px] flex">
<div class="flex-1"></div>
<a-button
size="large"
:loading="loading"
html-type="submit"
class="cancelbuttonBox !w-[159px] !border-[1px] !border-[#E3E6DA] font-bold text-gray-200 !h-[46px] !rounded-[13px] !text-base mr-[37px]"
@click="cancel()"
>
{{ t('personal.cancel') }}
</a-button>
<a-button
type="primary"
size="large"
:loading="loading"
html-type="submit"
class="SubmitBox !w-[159px] font-bold text-gray-200 !h-[46px] !rounded-[13px] !text-base mr-[37px]"
:class="[loading?'active':'']"
@click="handleSubmit()"
>
{{ t('personal.save') }}
</a-button>
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-space>
</a-col>
</a-row>
</a-form>
</a-space>
</div>
</div>
</a-spin>
</template>
<script setup lang="ts">
import { ref,reactive, computed } from 'vue'
......@@ -450,4 +450,9 @@ initData()
:deep(.arco-scrollbar-track-direction-vertical){
display: none;
}
:deep(.arco-scrollbar){
max-height: calc(100vh - 106px);
padding-bottom: 15px;
overflow: hidden;
}
</style>
\ No newline at end of file
<template>
<a-spin :loading="loading" class="w-full">
<div v-show="!showType">
<a-scrollbar class="max-h-[692px]"
@scroll="handleDivScroll"
ref="scrollContainer">
<div class="accountCenter rounded-[14px]
border-[1px] mb-[18px] flex items-center
justify-between py-[15px] pl-[36px] pr-[22px]"
v-for="(item,index) in dataList">
<div class="w-[100px]">
{{ item.name }}
</div>
<div class="w-[100px]">
{{ item.surName }}
</div>
<div class="w-[50px]">
{{ item.sex === 1 ? t('ORDER.GENDER_MALE') : t('ORDER.GENDER_FEMALE') }}
</div>
<div class="w-[200px]">
{{ item.email }}
</div>
<div class="w-[150px]">
{{item.phoneCode}} {{ item.phone }}
</div>
<div class="flex items-center justify-between">
<div class="w-[16px] h-[16px] editIcon cursor-pointer" @click="clickItem(item,1)">&nbsp;</div>
<div class="w-[14px] h-[16px] deleteIcon ml-[17px] cursor-pointer" @click="clickItem(item,0)">&nbsp;</div>
</div>
</div>
</a-scrollbar>
<div class="rounded-[8px] addGuestButton py-[10px] text-center text-base cursor-pointer" @click="showType = 1">{{ t('personal.addPassenger') }}</div>
</div>
<div v-if="showType" class="addPassenger h-[581px] bg-[#FFFFFF] rounded-b-[12px] shadow-lg shadow-[#E3E6DA]">
<div class="addPassengerHeader py-[20px] px-[31px] rounded-t-[12px] text-base">{{ showType === 1 ? t('personal.addPassenger') : t('personal.editPassenger') }}</div>
<a-space direction="vertical" class="w-full p-[40px]">
<!-- horizonta -->
<a-form :model="formData" :rules="rules" layout="vertical" class="w-full">
<a-row class="w-full">
<a-col :span="8">
<a-form-item :label="t('personal.firstName')" field="name" required>
<a-input class="formData-input !w-[289px] mr-[30px]"
v-model="formData.name"
size="large"
:placeholder="t('personal.placeholderFirstName')">
</a-input>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item :label="t('personal.lastName')" field="surName" required>
<a-input class="formData-input !w-[289px] mr-[30px]"
v-model="formData.surName"
size="large"
:placeholder="t('personal.placeholderLastName')">
<template #suffix>
</template>
</a-input>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item field="sex" :label="t('personal.gender')">
<a-select class="formData-input !w-[289px] mr-[30px]"
v-model="formData.sex"
size="large"
:placeholder="t('personal.placeholder')">
<a-option v-for="item of genderOptions" :value="item.value" :label="item.label" />
</a-select>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item field="birthday" :label="t('personal.birthday')">
<a-date-picker class="formData-input !w-[289px] w-full mr-[30px]"
v-model="formData.birthday"
size="large"
placeholder="YYYY/MM/DD"
type="date"
format="YYYY/MM/DD"
value-format="YYYY-MM-DD"
>
</a-date-picker>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item field="countryId" :label="t('CustomField.Participant.Nationality')" required>
<a-select class="formData-input !w-[289px] mr-[30px]"
v-model="formData.countryId"
size="large"
:placeholder="t('personal.placeholder')"
allow-search>
<a-option v-for="item of AreaCodeList" :value="item.id" :label="item.name" />
</a-select>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item :label="t('personal.idCard')" field="surName" required>
<a-input class="formData-input !w-[289px] mr-[30px]"
v-model="formData.idCard"
size="large"
:placeholder="t('personal.placeholderIdCard')">
<template #suffix>
</template>
</a-input>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item field="phoneCode" :label="t('login.phoneCode')">
<div class="w-full h-full overflow-hidden">
<div v-show="!showType" class="flex flex-col h-full overflow-hidden">
<a-scrollbar class="overflow-auto h-full"
@scroll="handleDivScroll"
ref="scrollContainer">
<a-spin :loading="loading" class="w-full">
<div class="accountCenter rounded-[14px]
border-[1px] mb-[18px] flex items-center
justify-between py-[15px] pl-[36px] pr-[22px]"
v-for="(item,index) in dataList">
<div class="w-[100px]">
{{ item.name }}
</div>
<div class="w-[100px]">
{{ item.surName }}
</div>
<div class="w-[50px]">
{{ item.sex === 1 ? t('ORDER.GENDER_MALE') : t('ORDER.GENDER_FEMALE') }}
</div>
<div class="w-[200px]">
{{ item?.email||'-' }}
</div>
<div class="w-[150px]">
{{ item.phoneCode }} {{ item?.phone || '-' }}
</div>
<div class="flex items-center justify-between">
<div class="w-[16px] h-[16px] editIcon cursor-pointer" @click="clickItem(item,1)">&nbsp;</div>
<div class="w-[14px] h-[16px] deleteIcon ml-[17px] cursor-pointer" @click="clickItem(item,0)">&nbsp;</div>
</div>
</div>
</a-spin>
</a-scrollbar>
<div class="rounded-[8px] addGuestButton py-[10px] text-center text-base cursor-pointer" @click="showType = 1">{{ t('personal.addPassenger') }}</div>
</div>
<div v-if="showType" class="addPassenger h-[581px] bg-[#FFFFFF] rounded-b-[12px] shadow-lg shadow-[#E3E6DA]">
<div class="addPassengerHeader py-[20px] px-[31px] rounded-t-[12px] text-base">{{ showType === 1 ? t('personal.addPassenger') : t('personal.editPassenger') }}</div>
<a-space direction="vertical" class="w-full p-[40px]">
<!-- horizonta -->
<a-form :model="formData" :rules="rules" layout="vertical" class="w-full">
<a-row class="w-full">
<a-col :span="8">
<a-form-item :label="t('personal.firstName')" field="name" required>
<a-input class="formData-input !w-[289px] mr-[30px]"
v-model="formData.name"
size="large"
:placeholder="t('personal.placeholderFirstName')">
</a-input>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item :label="t('personal.lastName')" field="surName" required>
<a-input class="formData-input !w-[289px] mr-[30px]"
v-model="formData.surName"
size="large"
:placeholder="t('personal.placeholderLastName')">
<template #suffix>
</template>
</a-input>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item field="sex" :label="t('personal.gender')">
<a-select class="formData-input !w-[289px] mr-[30px]"
v-model="formData.phoneCode"
v-model="formData.sex"
size="large"
allow-search
:placeholder="t('personal.placeholder')">
<a-option v-for="item of AreaCodeList" :value="item.phoneCode" :label="item.phoneCode" >
<span>{{ item.name }}</span>
<span>({{ item.phoneCode }})</span>
</a-option>
<a-option v-for="item of genderOptions" :value="item.value" :label="item.label" />
</a-select>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item field="phone" :label="t('login.bindingPhone')">
<a-input class="formData-input !w-[289px] mr-[30px]"
v-model="formData.phone"
:placeholder="t('login.bindingPhoneRequired')"
size="large"></a-input>
</a-col>
<a-col :span="8">
<a-form-item field="birthday" :label="t('personal.birthday')">
<a-date-picker class="formData-input !w-[289px] w-full mr-[30px]"
v-model="formData.birthday"
size="large"
placeholder="YYYY/MM/DD"
type="date"
format="YYYY/MM/DD"
value-format="YYYY-MM-DD"
>
</a-date-picker>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item field="countryId" :label="t('CustomField.Participant.Nationality')" required>
<a-select class="formData-input !w-[289px] mr-[30px]"
v-model="formData.countryId"
size="large"
:placeholder="t('personal.placeholder')"
allow-search>
<a-option v-for="item of AreaCodeList" :value="item.id" :label="item.name" />
</a-select>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item :label="t('login.emailLogin')" field="">
<a-input class="formData-input !w-[289px] mr-[30px]"
v-model="formData.email"
</a-col>
<a-col :span="8">
<a-form-item :label="t('personal.idCard')" field="surName" required>
<a-input class="formData-input !w-[289px] mr-[30px]"
v-model="formData.idCard"
size="large"
:placeholder="t('personal.placeholderIdCard')">
<template #suffix>
</template>
</a-input>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item field="phoneCode" :label="t('login.phoneCode')">
<a-select class="formData-input !w-[289px] mr-[30px]"
v-model="formData.phoneCode"
size="large"
allow-search
:placeholder="t('personal.placeholder')">
<a-option v-for="item of AreaCodeList" :value="item.phoneCode" :label="item.phoneCode" >
<span>{{ item.name }}</span>
<span>({{ item.phoneCode }})</span>
</a-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item field="phone" :label="t('login.bindingPhone')">
<a-input class="formData-input !w-[289px] mr-[30px]"
v-model="formData.phone"
:placeholder="t('login.bindingPhoneRequired')"
size="large"></a-input>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item :label="t('login.emailLogin')" field="">
<a-input class="formData-input !w-[289px] mr-[30px]"
v-model="formData.email"
size="large"
:placeholder="t('login.emailRequiredReset')">
<template #suffix>
</template>
</a-input>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item field="" label="" class="mt-[95px] flex">
<div class="flex-1"></div>
<a-button
size="large"
:loading="loading"
html-type="submit"
class="cancelbuttonBox !w-[159px] !border-[1px] !border-[#E3E6DA] font-bold text-gray-200 !h-[46px] !rounded-[13px] !text-base mr-[37px]"
@click="cancel()"
>
{{ t('personal.cancel') }}
</a-button>
<a-button
type="primary"
size="large"
:placeholder="t('login.emailRequiredReset')">
<template #suffix>
</template>
</a-input>
:loading="loading"
html-type="submit"
class="SubmitBox !w-[159px] font-bold text-gray-200 !h-[46px] !rounded-[13px] !text-base mr-[37px]"
:class="[loading?'active':'']"
@click="handleSubmit()"
>
{{ t('personal.save') }}
</a-button>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item field="" label="" class="mt-[95px] flex">
<div class="flex-1"></div>
<a-button
size="large"
:loading="loading"
html-type="submit"
class="cancelbuttonBox !w-[159px] !border-[1px] !border-[#E3E6DA] font-bold text-gray-200 !h-[46px] !rounded-[13px] !text-base mr-[37px]"
@click="cancel()"
>
{{ t('personal.cancel') }}
</a-button>
<a-button
type="primary"
size="large"
:loading="loading"
html-type="submit"
class="SubmitBox !w-[159px] font-bold text-gray-200 !h-[46px] !rounded-[13px] !text-base mr-[37px]"
:class="[loading?'active':'']"
@click="handleSubmit()"
>
{{ t('personal.save') }}
</a-button>
</a-form-item>
</a-col>
</a-row>
</a-col>
</a-row>
</a-form>
</a-space>
</a-form>
</a-space>
</div>
</div>
</a-spin>
</template>
<script setup lang="ts">
import { ref,reactive, computed } from 'vue'
......@@ -295,7 +298,7 @@ const loadData = async () => {
totalCount.value = response.totalCount || 0
pageCount.value = Math.ceil(totalCount.value/queryParams.MaxResultCount) || 0
}
noMoreData.value = pageCount.value >= queryParams.SkipCount
noMoreData.value = pageCount.value <= queryParams.SkipCount
}
} catch (error: any) {
console.error('加载失败:', error)
......@@ -319,6 +322,7 @@ const clickItem = (item: any,type: number) => {
formData.countryId = item.countryId || null
formData.sex = item.sex || null
formData.idCard = item.idCard || null
formData.email = item.email || null
}else{
deleteItem(item)
}
......@@ -372,12 +376,12 @@ const handleSubmit = async () => {
return
}
loading.value = true
try {
try {
const registerData = formData
const response = await UserService.updateMemberGuest(systemConfig.tenantId || 'default',registerData)
console.log('提交成功:', response)
showType.value = null
resetQuery()
cancel()
} catch (error: any) {
console.error('提交失败:', error)
Message.error(error.message)
......@@ -479,4 +483,9 @@ initData()
:deep(.arco-scrollbar-track-direction-vertical){
display: none;
}
:deep(.arco-scrollbar){
max-height: calc(100vh - 106px);
padding-bottom: 15px;
overflow: hidden;
}
</style>
\ No newline at end of file
<template>
<div class="h-screen flex justify-center pt-[25px] pb-[12px]">
<div class="h-screen flex justify-center pb-[12px] h-[797px]">
<div class="h-full flex justify-between w-[1200px]">
<!-- 左侧导航栏 -->
<LeftView
<LeftView class="pt-[25px]"
:menu-list="menuList"
:active-menu="activeMenu"/>
<!-- 右侧页面内容 -->
<main class="h-full flex-1 ml-[24px]">
<main class="flex-1 ml-[24px] overflow-hidden">
<router-view />
</main>
</div>
......
<template>
<div class="w-[977px] h-full flex flex-col flex-shrink-0">
<div class="w-[977px] h-full flex flex-col flex-shrink-0 mt-[25px]">
<a-spin :loading="loading">
<div class="myOrderData rounded-[14px] flex justify-between pt-[22px] pb-[19px] pl-[16px] relative">
<div class="flex items-center p-[20px]">
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment