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