| | |
| | | export * from './access'; |
| | | export * from './login'; |
| | | export * from './infiniteLoading'; |
| | | export * from './lifepay'; |
New file |
| | |
| | | import { useQuery } from '@tanstack/vue-query'; |
| | | import { useLifeRechargeContext, CreateEditPayChannelsInput } from '@life-payment/core-vue'; |
| | | |
| | | export function useOnlineService() { |
| | | const { blLifeRecharge } = useLifeRechargeContext(); |
| | | |
| | | const { data } = useQuery({ |
| | | queryKey: ['blLifeRecharge/getOnlineService'], |
| | | queryFn: async () => { |
| | | return await blLifeRecharge.services.getOnlineService({ |
| | | showLoading: false, |
| | | }); |
| | | }, |
| | | placeholderData: () => '', |
| | | }); |
| | | |
| | | return { |
| | | onlineServiceLink: data, |
| | | }; |
| | | } |
| | | |
| | | type UseLifePayChannlesAllListOptions = { |
| | | onSuccess?: (data: API.CreateEditPayChannelsInput[]) => any; |
| | | }; |
| | | |
| | | export function useLifePayChannlesAllList(options: UseLifePayChannlesAllListOptions = {}) { |
| | | const { onSuccess } = options; |
| | | |
| | | const { blLifeRecharge } = useLifeRechargeContext(); |
| | | |
| | | const { |
| | | data: allChannlesList, |
| | | isLoading, |
| | | refetch, |
| | | } = useQuery({ |
| | | queryKey: ['blLifeRecharge/getLifePayChannlesAllList'], |
| | | queryFn: async () => { |
| | | return await blLifeRecharge.services.getLifePayChannlesAllList({ |
| | | showLoading: false, |
| | | }); |
| | | }, |
| | | placeholderData: () => [] as CreateEditPayChannelsInput[], |
| | | onSuccess: (data) => { |
| | | onSuccess?.(data); |
| | | }, |
| | | }); |
| | | |
| | | function getChannlesNameByNum(channlesNum: string) { |
| | | return ( |
| | | allChannlesList.value.find((item) => item.channlesNum === channlesNum)?.channlesName ?? '' |
| | | ); |
| | | } |
| | | |
| | | return { |
| | | allChannlesList, |
| | | isLoading, |
| | | refetch, |
| | | getChannlesNameByNum, |
| | | }; |
| | | } |
| | |
| | | <ListItem title="数据看板" @click="goDashboard"></ListItem> |
| | | <ListItem title="推广二维码" @click="goShareQrcode"></ListItem> |
| | | </template> |
| | | <ListItem v-if="isWeb" title="在线客服" @click="handleChat"></ListItem> |
| | | <ListItem v-if="isWeb && !isInAlipay" title="在线客服" @click="handleChat"></ListItem> |
| | | <ListItem v-if="isLogin" title="退出登录" @click="goLogout"></ListItem> |
| | | </List> |
| | | </ContentScrollView> |
| | |
| | | |
| | | <script setup lang="ts"> |
| | | import { TransparentNavigationBar, List, ListItem } from '@/components'; |
| | | import { useUser, useIsLogin, useGoLogin, useAccessLogin } from '@/hooks'; |
| | | import { useUser, useIsLogin, useGoLogin, useAccessLogin, useOnlineService } from '@/hooks'; |
| | | import Taro from '@tarojs/taro'; |
| | | import { RouterPath, OssAssets } from '@/constants'; |
| | | import DefaultAvatar from '@/assets/components/icon-default-avatar.png'; |
| | |
| | | import PageLayoutWithBg from '@/components/Layout/PageLayoutWithBg.vue'; |
| | | import { useUserStore } from '@/stores/modules/user'; |
| | | import { Message } from '@/utils'; |
| | | import { isWeb } from '@/utils/env'; |
| | | import { isWeb, isInAlipay } from '@/utils/env'; |
| | | import { useLifeRechargeContext } from '@life-payment/core-vue'; |
| | | import { hiddenPhoneNumber } from '@life-payment/utils'; |
| | | |
| | |
| | | } catch (error) {} |
| | | } |
| | | |
| | | const { onlineServiceLink } = useOnlineService(); |
| | | |
| | | function handleChat() { |
| | | if (isWeb) { |
| | | window.open('https://work.weixin.qq.com/kfid/kfcd24e0c60fd91099e', '_blank'); |
| | | if (isWeb && onlineServiceLink.value) { |
| | | if (isInAlipay) { |
| | | Message.warning('请在微信中打开使用该功能'); |
| | | } else { |
| | | window.open(onlineServiceLink.value, '_blank'); |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | |
| | | |
| | | if (res) { |
| | | this.loginVirtualSuccess({ |
| | | virtualUserId: res, |
| | | virtualUserId: res.userId, |
| | | virtualPhoneNumber: data.phoneNumber, |
| | | }); |
| | | } |
| | |
| | | try { |
| | | // let res = await userServices.getUserInfo({ showLoading: false }); |
| | | // if (res) { |
| | | // res.originalAvatarUrl = res.avatarUrl; |
| | | // res.avatarUrl = res.avatarUrl ? setOSSLink(res.avatarUrl) : DefaultAvatar; |
| | | // this.setUserDetail(res); |
| | | // this.firstGetUserDetail = false; |
| | | // } |
| | |
| | | ); |
| | | userStore.loginVirtualSuccess({ |
| | | virtualPhoneNumber: form.phoneNumber, |
| | | virtualUserId: res, |
| | | virtualUserId: res.userId, |
| | | }); |
| | | jump(); |
| | | } |
| | |
| | | <template> |
| | | <ContentScrollView> |
| | | <ShareQrcodeView /> |
| | | </ContentScrollView> |
| | | <ProTabs v-model="orderType" name="user-home-tabs" class="user-home-tabs" flexTitle fullHeight> |
| | | <ProTabPane title="话费订单" pane-key="1"> |
| | | <ShareQrcodeView :channles-num="'818'" /> |
| | | </ProTabPane> |
| | | <ProTabPane title="电费订单" pane-key="2"> |
| | | <ShareQrcodeView :channles-num="'818'" /> |
| | | </ProTabPane> |
| | | </ProTabs> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { ShareQrcodeView } from '@life-payment/components'; |
| | | import { useLifePayChannlesAllList } from '@/hooks'; |
| | | |
| | | defineOptions({ |
| | | name: 'InnerPage', |
| | | }); |
| | | |
| | | const orderType = ref('1'); |
| | | |
| | | const { getChannlesNameByNum } = useLifePayChannlesAllList(); |
| | | </script> |
| | |
| | | name: 'ShareQrcodeView', |
| | | }); |
| | | |
| | | type Props = { |
| | | channlesNum?: string; |
| | | }; |
| | | |
| | | const props = withDefaults(defineProps<Props>(), {}); |
| | | |
| | | const { blLifeRecharge } = useLifeRechargeContext(); |
| | | |
| | | const link = computed( |
| | | () => `${CLIENT_ORIGIN}?channelId=${blLifeRecharge.accountModel.channlesNum}` |
| | | ); |
| | | const link = computed(() => `${CLIENT_ORIGIN}?channelId=${props.channlesNum}`); |
| | | </script> |
| | |
| | | async login(body: PhoneMesssageCodeLoginInput, options?: RequestConfig) { |
| | | try { |
| | | let res = await this.services.lifePayPhoneMesssageCodeLogin(body, options); |
| | | this.accountModel.setUserId(res); |
| | | this.accountModel.setUserId(res.userId); |
| | | this.accountModel.setPhoneNumber(body.phoneNumber); |
| | | return res; |
| | | } catch (error) { |
| | |
| | | import { BlLifeRechargeAccountModelOptions } from './types'; |
| | | import { LifePayPhoneMesssageCodeLoginOutput } from './lifeRechargeServices'; |
| | | |
| | | export class BlLifeRechargeAccountModel { |
| | | userId = ''; |
| | |
| | | } |
| | | |
| | | async lifePayPhoneMesssageCodeLogin(body: PhoneMesssageCodeLoginInput, options?: RequestConfig) { |
| | | return this.request<string>('/api/Account/LifePayPhoneMesssageCodeLogin', { |
| | | return this.request<LifePayPhoneMesssageCodeLoginOutput>( |
| | | '/api/Account/LifePayPhoneMesssageCodeLogin', |
| | | { |
| | | method: 'POST', |
| | | headers: { |
| | | 'Content-Type': 'application/json', |
| | | }, |
| | | data: body, |
| | | ...(options || {}), |
| | | }); |
| | | } |
| | | ); |
| | | } |
| | | |
| | | /** 获取折扣 GET /api/LifePay/GetRate */ |
| | |
| | | 'Content-Type': 'application/json', |
| | | }, |
| | | data: body, |
| | | ...(options || {}), |
| | | }); |
| | | } |
| | | |
| | | /** 获取在线客服 GET /api/LifePay/GetOnlineService */ |
| | | async getOnlineService(options?: RequestConfig) { |
| | | return this.request<string>('/api/LifePay/GetOnlineService', { |
| | | method: 'GET', |
| | | ...(options || {}), |
| | | }); |
| | | } |
| | | |
| | | /** 获取全部缴费渠道 GET /api/LifePay/GetLifePayChannlesAllList */ |
| | | async getLifePayChannlesAllList(options?: RequestConfig) { |
| | | return this.request<CreateEditPayChannelsInput[]>('/api/LifePay/GetLifePayChannlesAllList', { |
| | | method: 'GET', |
| | | ...(options || {}), |
| | | }); |
| | | } |
| | |
| | | export interface ChannelRateOutput { |
| | | channlesRate?: number; |
| | | } |
| | | |
| | | export interface CreateEditPayChannelsInput { |
| | | id?: string; |
| | | channlesName?: string; |
| | | channlesNum?: string; |
| | | channlesRate?: number; |
| | | channlesRakeRate?: number; |
| | | } |
| | | |
| | | export interface LifePayPhoneMesssageCodeLoginOutput { |
| | | /** 用户Id */ |
| | | userId?: string; |
| | | /** 是否是后台用户 */ |
| | | isBackClientUser?: boolean; |
| | | /** 渠道号 */ |
| | | channlesNum?: string[]; |
| | | } |
| | |
| | | body: API.LifePayPhoneMesssageCodeLoginInput, |
| | | options?: API.RequestConfig |
| | | ) { |
| | | return request<string>('/api/Account/LifePayPhoneMesssageCodeLogin', { |
| | | return request<API.LifePayPhoneMesssageCodeLoginOutput>( |
| | | '/api/Account/LifePayPhoneMesssageCodeLogin', |
| | | { |
| | | method: 'POST', |
| | | headers: { |
| | | 'Content-Type': 'application/json', |
| | | }, |
| | | data: body, |
| | | ...(options || {}), |
| | | }); |
| | | } |
| | | ); |
| | | } |
| | | |
| | | /** 此处后端没有提供注释 GET /api/accountAuth/GetCode */ |
| | |
| | | }); |
| | | } |
| | | |
| | | /** 上传充值流水 POST /api/LifePay/AddUpdatePayRechargeReceipts */ |
| | | export async function addUpdatePayRechargeReceipts( |
| | | body: API.AddUpdatePayRechargeReceiptsInput, |
| | | options?: API.RequestConfig |
| | | ) { |
| | | return request<number>('/api/LifePay/AddUpdatePayRechargeReceipts', { |
| | | method: 'POST', |
| | | headers: { |
| | | 'Content-Type': 'application/json', |
| | | }, |
| | | data: body, |
| | | ...(options || {}), |
| | | }); |
| | | } |
| | | |
| | | /** 添加或修改我的户号 POST /api/LifePay/AddUpdateUserAccount */ |
| | | export async function addUpdateUserAccount( |
| | | body: API.AddUpdateUserAccountInput, |
| | |
| | | }); |
| | | } |
| | | |
| | | /** 获取充值流水分页数据 POST /api/LifePay/GetLifePayRechargeReceiptsPage */ |
| | | export async function getLifePayRechargeReceiptsPage( |
| | | body: API.LifePayRechargeReceiptsPageInput, |
| | | options?: API.RequestConfig |
| | | ) { |
| | | return request<API.LifePayRechargeReceiptsListOutputLifePayRechargeReceiptsPageOutput>( |
| | | '/api/LifePay/GetLifePayRechargeReceiptsPage', |
| | | { |
| | | method: 'POST', |
| | | headers: { |
| | | 'Content-Type': 'application/json', |
| | | }, |
| | | data: body, |
| | | ...(options || {}), |
| | | } |
| | | ); |
| | | } |
| | | |
| | | /** 导出退款订单Excel POST /api/LifePay/GetLifePayRefudOrderPageExport */ |
| | | export async function getLifePayRefudOrderPageExport( |
| | | body: API.QueryLifePayRefundOrderListInput, |
| | |
| | | 'Content-Type': 'application/json', |
| | | }, |
| | | data: body, |
| | | ...(options || {}), |
| | | }); |
| | | } |
| | | |
| | | /** 获取在线客服 GET /api/LifePay/GetOnlineService */ |
| | | export async function getOnlineService(options?: API.RequestConfig) { |
| | | return request<string>('/api/LifePay/GetOnlineService', { |
| | | method: 'GET', |
| | | ...(options || {}), |
| | | }); |
| | | } |
| | |
| | | }); |
| | | } |
| | | |
| | | /** 查询支付宝支付订单信息 POST /api/LifePay/QueryAlipayTrade */ |
| | | export async function queryAlipayTrade(body: API.OrderInQuiryInput, options?: API.RequestConfig) { |
| | | return request<API.AlipayTradeQueryResponse>('/api/LifePay/QueryAlipayTrade', { |
| | | method: 'POST', |
| | | headers: { |
| | | 'Content-Type': 'application/json', |
| | | }, |
| | | data: body, |
| | | ...(options || {}), |
| | | }); |
| | | } |
| | | |
| | | /** 查询支付宝退款订单信息 POST /api/LifePay/QueryAlipayTradeRefund */ |
| | | export async function queryAlipayTradeRefund( |
| | | body: API.OrderInQuiryInput, |
| | | options?: API.RequestConfig |
| | | ) { |
| | | return request<API.AlipayTradeFastpayRefundQueryResponse>('/api/LifePay/QueryAlipayTradeRefund', { |
| | | method: 'POST', |
| | | headers: { |
| | | 'Content-Type': 'application/json', |
| | | }, |
| | | data: body, |
| | | ...(options || {}), |
| | | }); |
| | | } |
| | | |
| | | /** 退款生活缴费订单 POST /api/LifePay/RefundLifePayOrder */ |
| | | export async function refundLifePayOrder( |
| | | body: API.RefundLifePayOrderInput, |
| | |
| | | ...(options || {}), |
| | | }); |
| | | } |
| | | |
| | | /** 修改实际到账金额 POST /api/LifePay/UpdateLifePayOrderActualReceivedAmount */ |
| | | export async function updateLifePayOrderActualReceivedAmount( |
| | | body: API.UpdateLifePayOrderInput, |
| | | options?: API.RequestConfig |
| | | ) { |
| | | return request<number>('/api/LifePay/UpdateLifePayOrderActualReceivedAmount', { |
| | | method: 'POST', |
| | | headers: { |
| | | 'Content-Type': 'application/json', |
| | | }, |
| | | data: body, |
| | | ...(options || {}), |
| | | }); |
| | | } |
| | | |
| | | /** 在线客服配置 POST /api/LifePay/UpdateOnlineService */ |
| | | export async function updateOnlineService( |
| | | body: API.OnlineServiceInput, |
| | | options?: API.RequestConfig |
| | | ) { |
| | | return request<number>('/api/LifePay/UpdateOnlineService', { |
| | | method: 'POST', |
| | | headers: { |
| | | 'Content-Type': 'application/json', |
| | | }, |
| | | data: body, |
| | | ...(options || {}), |
| | | }); |
| | | } |
| | | |
| | | /** 此处后端没有提供注释 GET /api/LifePay/WxPayDomesticRefundsQuery */ |
| | | export async function wxPayDomesticRefundsQuery( |
| | | // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) |
| | | params: API.APIwxPayDomesticRefundsQueryParams, |
| | | options?: API.RequestConfig |
| | | ) { |
| | | return request<any>('/api/LifePay/WxPayDomesticRefundsQuery', { |
| | | method: 'GET', |
| | | params: { |
| | | ...params, |
| | | }, |
| | | ...(options || {}), |
| | | }); |
| | | } |
| | |
| | | implementFrom?: string; |
| | | } |
| | | |
| | | interface AddUpdatePayRechargeReceiptsInput { |
| | | /** 编号 */ |
| | | id?: string; |
| | | /** 业务订单号 */ |
| | | orderNo?: string; |
| | | /** 充值金额 */ |
| | | rechargeAmount?: number; |
| | | /** 备注 */ |
| | | remark?: string; |
| | | /** 充值凭证 */ |
| | | voucher?: string; |
| | | } |
| | | |
| | | interface AddUpdateUserAccountInput { |
| | | pageModel?: Pagination; |
| | | checkChannelId?: string; |
| | |
| | | extraProperties?: string; |
| | | /** 备注 */ |
| | | remark?: string; |
| | | } |
| | | |
| | | interface AlipayTradeFastpayRefundQueryResponse { |
| | | httpBody?: string; |
| | | code?: string; |
| | | msg?: string; |
| | | subCode?: string; |
| | | subMsg?: string; |
| | | errorCode?: string; |
| | | gmtRefundPay?: string; |
| | | industrySepcDetail?: string; |
| | | outRequestNo?: string; |
| | | outTradeNo?: string; |
| | | presentRefundBuyerAmount?: string; |
| | | presentRefundDiscountAmount?: string; |
| | | presentRefundMdiscountAmount?: string; |
| | | refundAmount?: string; |
| | | refundChargeAmount?: string; |
| | | refundDetailItemList?: TradeFundBill[]; |
| | | refundReason?: string; |
| | | refundRoyaltys?: RefundRoyaltyResult[]; |
| | | refundSettlementId?: string; |
| | | refundStatus?: string; |
| | | sendBackFee?: string; |
| | | totalAmount?: string; |
| | | tradeNo?: string; |
| | | } |
| | | |
| | | interface AlipayTradeQueryResponse { |
| | | httpBody?: string; |
| | | code?: string; |
| | | msg?: string; |
| | | subCode?: string; |
| | | subMsg?: string; |
| | | tradeNo?: string; |
| | | outTradeNo?: string; |
| | | buyerLogonId?: string; |
| | | tradeStatus?: string; |
| | | totalAmount?: string; |
| | | transCurrency?: string; |
| | | settleCurrency?: string; |
| | | settleAmount?: string; |
| | | payCurrency?: string; |
| | | payAmount?: string; |
| | | settleTransRate?: string; |
| | | transPayRate?: string; |
| | | buyerPayAmount?: string; |
| | | pointAmount?: string; |
| | | invoiceAmount?: string; |
| | | sendPayDate?: string; |
| | | receiptAmount?: string; |
| | | storeId?: string; |
| | | terminalId?: string; |
| | | fundBillList?: TradeFundBill[]; |
| | | storeName?: string; |
| | | buyerUserId?: string; |
| | | chargeAmount?: string; |
| | | chargeFlags?: string; |
| | | settlementId?: string; |
| | | tradeSettleInfo?: TradeSettleInfo[]; |
| | | authTradePayMode?: string; |
| | | buyerUserType?: string; |
| | | mdiscountAmount?: string; |
| | | discountAmount?: string; |
| | | buyerUserName?: string; |
| | | subject?: string; |
| | | body?: string; |
| | | alipaySubMerchantId?: string; |
| | | extInfos?: string; |
| | | } |
| | | |
| | | interface AllSubModule { |
| | |
| | | |
| | | interface APIupdateRolesParams { |
| | | id?: string; |
| | | } |
| | | |
| | | interface APIwxPayDomesticRefundsQueryParams { |
| | | outTradeNo?: string; |
| | | } |
| | | |
| | | interface ApplicationApiDescriptionModel { |
| | |
| | | phoneNumber: string; |
| | | } |
| | | |
| | | interface LifePayPhoneMesssageCodeLoginOutput { |
| | | /** 用户Id */ |
| | | userId?: string; |
| | | /** 是否是后台用户 */ |
| | | isBackClientUser?: boolean; |
| | | /** 渠道号 */ |
| | | channlesNum?: string[]; |
| | | } |
| | | |
| | | interface LifePayPremiumInput { |
| | | premiumType?: LifePayTypeEnum; |
| | | rate?: number; |
| | |
| | | } |
| | | |
| | | type LifePayRateTypeEnum = 10 | 20 | 30 | 40; |
| | | |
| | | interface LifePayRechargeReceiptsListOutput { |
| | | /** 编号 */ |
| | | id?: string; |
| | | /** 业务订单号 */ |
| | | orderNo?: string; |
| | | /** 充值金额 */ |
| | | rechargeAmount?: number; |
| | | /** 备注 */ |
| | | remark?: string; |
| | | /** 凭证 */ |
| | | voucher?: string; |
| | | /** 记账时间 */ |
| | | creationTime?: string; |
| | | } |
| | | |
| | | interface LifePayRechargeReceiptsListOutputLifePayRechargeReceiptsPageOutput { |
| | | pageModel?: Pagination; |
| | | objectData?: any; |
| | | data?: LifePayRechargeReceiptsListOutput[]; |
| | | /** 累计充值 */ |
| | | totalRechargeAmount?: number; |
| | | } |
| | | |
| | | interface LifePayRechargeReceiptsPageInput { |
| | | pageModel?: Pagination; |
| | | checkChannelId?: string; |
| | | /** 查询条件 */ |
| | | keyWord?: string; |
| | | /** 记账开始时间 */ |
| | | creationTimeBegin?: string; |
| | | /** 记账结束时间 */ |
| | | creationTimeEnd?: string; |
| | | } |
| | | |
| | | interface LifePayRefundOrderOutput { |
| | | id?: string; |
| | |
| | | enums?: Record<string, any>; |
| | | } |
| | | |
| | | interface OnlineServiceInput { |
| | | /** 在线客服链接 */ |
| | | link?: string; |
| | | } |
| | | |
| | | interface OperateHistoryDto { |
| | | /** 关联关系ID */ |
| | | relationId?: string; |
| | |
| | | interface OrderInput { |
| | | property?: string; |
| | | order?: OrderTypeEnum; |
| | | } |
| | | |
| | | interface OrderInQuiryInput { |
| | | outTradeNo?: string; |
| | | } |
| | | |
| | | type OrderTypeEnum = 0 | 1; |
| | |
| | | checkChannelId?: string; |
| | | /** 手机号/用户名 */ |
| | | queryCondition?: string; |
| | | /** 注册时间 */ |
| | | /** 注册开始时间 */ |
| | | creationTimeBegin?: string; |
| | | /** 注册结束时间 */ |
| | | creationTimeEnd?: string; |
| | | /** 登录开始时间 */ |
| | | loginTimeBegin?: string; |
| | | /** 登录结束时间 */ |
| | | loginTimeEnd?: string; |
| | | } |
| | | |
| | | interface RefundLifePayOrderInput { |
| | |
| | | lifePayRefundType?: LifePayRefundTypeEnum; |
| | | /** 退款金额 */ |
| | | refundPrice?: number; |
| | | } |
| | | |
| | | interface RefundRoyaltyResult { |
| | | refundAmount?: string; |
| | | royaltyType?: string; |
| | | resultCode?: string; |
| | | transOut?: string; |
| | | transOutEmail?: string; |
| | | transIn?: string; |
| | | transInEmail?: string; |
| | | } |
| | | |
| | | interface RefundUserLifePayOrderInput { |
| | |
| | | yesterdayActiveUsers?: number; |
| | | } |
| | | |
| | | interface TradeFundBill { |
| | | fundChannel?: string; |
| | | bankCode?: string; |
| | | amount?: string; |
| | | realAmount?: string; |
| | | fundType?: string; |
| | | } |
| | | |
| | | interface TradeSettleDetail { |
| | | operationType?: string; |
| | | operationSerial_no?: string; |
| | | operationDt?: string; |
| | | transOut?: string; |
| | | transIn?: string; |
| | | amount?: string; |
| | | } |
| | | |
| | | interface TradeSettleInfo { |
| | | tradeSettleDetailList?: TradeSettleDetail[]; |
| | | } |
| | | |
| | | interface TypeApiDescriptionModel { |
| | | baseType?: string; |
| | | isEnum?: boolean; |
| | |
| | | features?: UpdateFeatureDto[]; |
| | | } |
| | | |
| | | interface UpdateLifePayOrderInput { |
| | | id?: string; |
| | | /** 实际到账金额 */ |
| | | actualReceivedAmount?: number; |
| | | } |
| | | |
| | | interface UpdatePassWordInput { |
| | | id?: string; |
| | | passWord?: string; |