| | |
| | | color: transparent; |
| | | } |
| | | } |
| | | |
| | | @mixin placeholder { |
| | | color: var(--bole-text-color-secondary) !important; |
| | | font-size: 30px; |
| | | line-height: 42px; |
| | | } |
| | |
| | | @use './function.scss' as *; |
| | | @use './hairline.scss' as *; |
| | | @use './mixins.scss' as *; |
| | | |
| | | :root, |
| | | page { |
| | |
| | | } |
| | | |
| | | .bole-input-text-placeholder { |
| | | color: boleGetCssVar('text-color', 'placeholder') !important; |
| | | font-size: 26rpx; |
| | | line-height: 20rpx; |
| | | @include placeholder; |
| | | } |
| | | |
| | | .form-item-divider { |
| | |
| | | :showAliPay="!isInWeChat" |
| | | :showWeixinPay="isInWeChat" |
| | | @missName="handleMissName" |
| | | @editUserAccount="handleEditUserAccount" |
| | | @currentChange="emit('currentChange', $event)" |
| | | /> |
| | | </ContentScrollView> |
| | | </template> |
| | |
| | | defineOptions({ |
| | | name: 'InnerPage', |
| | | }); |
| | | |
| | | const emit = defineEmits<{ |
| | | (e: 'currentChange', current: 'step1' | 'step2'): void; |
| | | }>(); |
| | | |
| | | const isDev = process.env.NODE_ENV === 'development'; |
| | | |
| | |
| | | }); |
| | | } catch (error) {} |
| | | } |
| | | |
| | | function handleEditUserAccount(userAccountId: string) { |
| | | RouteHelper.navigateTo({ |
| | | url: `${RouterPath.editPhoneUserAccount}?id=${userAccountId}`, |
| | | }); |
| | | } |
| | | </script> |
| | |
| | | <template> |
| | | <PageLayout |
| | | class="phoneBillRecharge-page-wrapper" |
| | | :style="{ |
| | | backgroundImage: `url(${OssAssets.common.PhoneBillRechargePageBg})`, |
| | | }" |
| | | :style=" |
| | | current === 'step2' && { |
| | | backgroundImage: `url(${OssAssets.common.PhoneBillRechargePageBg})`, |
| | | } |
| | | " |
| | | :title="current != 'step2' && title" |
| | | > |
| | | <template #navigationBar> |
| | | <template #navigationBar v-if="current === 'step2'"> |
| | | <TransparentNavigationBar |
| | | :title="'话费充值'" |
| | | :title="title" |
| | | :is-absolute="false" |
| | | mode="dark" |
| | | navigationArrowWhite |
| | | > |
| | | </TransparentNavigationBar> |
| | | </template> |
| | | <InnerPage /> |
| | | <InnerPage @currentChange="handleCurrentChange" /> |
| | | </PageLayout> |
| | | </template> |
| | | |
| | |
| | | defineOptions({ |
| | | name: 'phoneBillRecharge', |
| | | }); |
| | | |
| | | type Current = 'step1' | 'step2'; |
| | | |
| | | const title = '话费充值'; |
| | | |
| | | const current = ref<Current>(); |
| | | |
| | | function handleCurrentChange(val: Current) { |
| | | current.value = val; |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss"> |
New file |
| | |
| | | <template> |
| | | <div class="account-cardV2"> |
| | | <div class="account-cardV2-add-tips-wrapper"> |
| | | <img :src="IconInfo" class="account-cardV2-add-tips-icon" /> |
| | | <div class="account-cardV2-add-tips">{{ tip }}</div> |
| | | </div> |
| | | <div class="account-cardV2-top"> |
| | | <div class="account-cardV2-content-wrapper" @click="emit('add')"> |
| | | <img :src="IconInitAdd" class="account-cardV2-init-add-icon" /> |
| | | <div class="account-cardV2-add-content">{{ content }}</div> |
| | | </div> |
| | | </div> |
| | | <div class="account-cardV2-remark">{{ remark }}</div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import IconInitAdd from '../../assets/recharge/icon-init-add.png'; |
| | | import IconInfo from '../../assets/recharge/icon-info.png'; |
| | | |
| | | defineOptions({ |
| | | name: 'AccountAddCardV2', |
| | | }); |
| | | |
| | | type Props = { |
| | | content?: string; |
| | | remark?: string; |
| | | showEditBtn?: boolean; |
| | | tip?: string; |
| | | }; |
| | | |
| | | const props = withDefaults(defineProps<Props>(), {}); |
| | | |
| | | const emit = defineEmits<{ |
| | | (e: 'add'): void; |
| | | }>(); |
| | | </script> |
New file |
| | |
| | | <template> |
| | | <div class="account-cardV2"> |
| | | <div class="account-cardV2-top"> |
| | | <div class="account-cardV2-content-wrapper"> |
| | | <div class="account-cardV2-content">{{ content }}</div> |
| | | <img |
| | | v-if="showEditBtn" |
| | | :src="IconEdit" |
| | | class="account-cardV2-edit-icon" |
| | | @click="emit('edit')" |
| | | /> |
| | | </div> |
| | | <div class="account-cardV2-add-wrapper" @click="emit('add')"> |
| | | <img :src="IconAdd" class="account-cardV2-add-icon" /> |
| | | <div class="account-cardV2-add-text">新增</div> |
| | | </div> |
| | | </div> |
| | | <div class="account-cardV2-remark">{{ remark }}</div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import IconAdd from '../../assets/recharge/icon-add.png'; |
| | | import IconEdit from '../../assets/recharge/icon-edit.png'; |
| | | |
| | | defineOptions({ |
| | | name: 'AccountCardV2', |
| | | }); |
| | | |
| | | type Props = { |
| | | content?: string; |
| | | remark?: string; |
| | | showEditBtn?: boolean; |
| | | }; |
| | | |
| | | const props = withDefaults(defineProps<Props>(), {}); |
| | | |
| | | const emit = defineEmits<{ |
| | | (e: 'add'): void; |
| | | (e: 'edit'): void; |
| | | }>(); |
| | | </script> |
| | |
| | | <template> |
| | | <nut-dialog title="请核对充值信息并支付" v-model:visible="visible" class="confirm-dialog-wrapper"> |
| | | <nut-dialog |
| | | title="请核对充值信息并支付" |
| | | v-model:visible="visible" |
| | | custom-class="confirm-dialog-wrapper" |
| | | > |
| | | <div class="confirm-dialog-content"> |
| | | <div class="confirm-dialog-content-tips"> |
| | | <slot name="tips"> |
| | | 该产品为慢充模式,0-24小时内到账,介意请勿付款! 充值前请仔细阅读充值须知! |
| | | </slot> |
| | | </div> |
| | | <div class="confirm-dialog-content-info"> |
| | | <slot name="info"></slot> |
| | | <div class="confirm-dialog-content-info-wrapper"> |
| | | <div class="confirm-dialog-content-info-cic"></div> |
| | | <div class="confirm-dialog-content-info"> |
| | | <slot name="info"></slot> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="confirm-dialog-content-warning"> |
| | | <slot name="warning"> |
| | | 同一号码充值期间,未到账前切勿在其他任何平台再次充值。因此造成的资金损失须用户自行承担!!! |
| | |
| | | <template> |
| | | <NutFormItem label="选择支付方式" class="bole-form-item" prop="lifePayType" required> |
| | | <NutRadioGroup v-model="lifePayType" direction="horizontal"> |
| | | <BlRadio |
| | | :label="LifeRechargeConstants.LifePayTypeEnum.AliPay" |
| | | shape="button" |
| | | class="select-pay-type-view-form-item-radio" |
| | | v-if="showAliPay" |
| | | <Chunk |
| | | borderRadiusSmall |
| | | :hasPaddingBottom="false" |
| | | style="padding: 0" |
| | | class="select-pay-type-view" |
| | | > |
| | | <div class="select-pay-type-form-item-title">选择支付方式</div> |
| | | <NutFormItem class="bole-form-item" prop="lifePayType" required style="padding-bottom: 0"> |
| | | <NutRadioGroup |
| | | v-model="lifePayType" |
| | | text-position="left" |
| | | class="select-pay-type-view-form-item-radio-group" |
| | | > |
| | | <div class="select-pay-type-view-form-item"> |
| | | <img class="select-pay-type-view-form-item-icon" :src="IconAliPay" /> |
| | | {{ |
| | | LifeRechargeConstants.LifePayTypeEnumText[LifeRechargeConstants.LifePayTypeEnum.AliPay] |
| | | }} |
| | | </div> |
| | | </BlRadio> |
| | | <BlRadio |
| | | :label="LifeRechargeConstants.LifePayTypeEnum.WxPay" |
| | | shape="button" |
| | | class="select-pay-type-view-form-item-radio" |
| | | v-if="showWeixinPay" |
| | | > |
| | | <div class="select-pay-type-view-form-item"> |
| | | <img class="select-pay-type-view-form-item-icon" :src="IconWeixin" /> |
| | | {{ |
| | | LifeRechargeConstants.LifePayTypeEnumText[LifeRechargeConstants.LifePayTypeEnum.WxPay] |
| | | }} |
| | | </div> |
| | | </BlRadio> |
| | | </NutRadioGroup> |
| | | </NutFormItem> |
| | | <BlRadio |
| | | :label="LifeRechargeConstants.LifePayTypeEnum.AliPay" |
| | | class="select-pay-type-view-form-item-radio" |
| | | v-if="showAliPay" |
| | | > |
| | | <div class="select-pay-type-view-form-item"> |
| | | <img class="select-pay-type-view-form-item-icon" :src="IconAliPay" /> |
| | | {{ |
| | | LifeRechargeConstants.LifePayTypeEnumText[ |
| | | LifeRechargeConstants.LifePayTypeEnum.AliPay |
| | | ] |
| | | }} |
| | | </div> |
| | | </BlRadio> |
| | | <BlRadio |
| | | :label="LifeRechargeConstants.LifePayTypeEnum.WxPay" |
| | | class="select-pay-type-view-form-item-radio" |
| | | v-if="showWeixinPay" |
| | | > |
| | | <div class="select-pay-type-view-form-item"> |
| | | <img class="select-pay-type-view-form-item-icon" :src="IconWeixin" /> |
| | | {{ |
| | | LifeRechargeConstants.LifePayTypeEnumText[LifeRechargeConstants.LifePayTypeEnum.WxPay] |
| | | }} |
| | | </div> |
| | | </BlRadio> |
| | | </NutRadioGroup> |
| | | </NutFormItem> |
| | | </Chunk> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | |
| | | import BlRadio from '../Radio/Radio.vue'; |
| | | import IconWeixin from '../../assets/icon-weixin-pay.png'; |
| | | import IconAliPay from '../../assets/icon-alipay.png'; |
| | | import Chunk from '../Layout/Chunk.vue'; |
| | | |
| | | defineOptions({ |
| | | name: 'SelectPayTypeFormItem', |
| | |
| | | } |
| | | |
| | | .par-account-list { |
| | | padding-top: 32px; |
| | | .nut-radio--button { |
| | | margin-bottom: 20px !important; |
| | | margin-bottom: 26px !important; |
| | | |
| | | &:last-child { |
| | | margin-right: 20px !important; |
| | | margin-bottom: 20px !important; |
| | | margin-right: 22px !important; |
| | | margin-bottom: 26px !important; |
| | | } |
| | | |
| | | .nut-radio__button { |
| | | padding: 8px 20px; |
| | | font-size: 22px; |
| | | background-color: transparent; |
| | | border: 1px solid #d9d9d9; |
| | | |
| | | &.nut-radio__button--active { |
| | | border-color: boleGetCssVar('color', 'primary'); |
| | | } |
| | | |
| | | &::after { |
| | | display: none; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .account-cardV2 { |
| | | .account-cardV2-top { |
| | | padding-bottom: 12px; |
| | | border-bottom: 4px solid #f1f1f1; |
| | | display: flex; |
| | | margin-bottom: 20px; |
| | | height: 80px; |
| | | align-items: center; |
| | | |
| | | .account-cardV2-content-wrapper { |
| | | flex: 1; |
| | | min-width: 0; |
| | | display: flex; |
| | | align-items: center; |
| | | |
| | | .account-cardV2-content { |
| | | flex-shrink: 1; |
| | | @include ellipsis; |
| | | font-weight: 500; |
| | | font-size: 44px; |
| | | color: boleGetCssVar('text-color', 'primary'); |
| | | margin-right: 24px; |
| | | line-height: 1.2; |
| | | } |
| | | |
| | | .account-cardV2-edit-icon { |
| | | width: 40px; |
| | | height: 40px; |
| | | } |
| | | |
| | | .account-cardV2-init-add-icon { |
| | | width: 60px; |
| | | height: 60px; |
| | | margin-right: 12px; |
| | | } |
| | | |
| | | .account-cardV2-add-content { |
| | | flex-shrink: 1; |
| | | @include ellipsis; |
| | | font-weight: 500; |
| | | font-size: 40px; |
| | | color: boleGetCssVar('text-color', 'regular'); |
| | | line-height: 1.2; |
| | | } |
| | | } |
| | | |
| | | .account-cardV2-add-wrapper { |
| | | margin-left: 12px; |
| | | .account-cardV2-add-icon { |
| | | width: 48px; |
| | | height: 48px; |
| | | margin-bottom: 4px; |
| | | } |
| | | |
| | | .account-cardV2-add-text { |
| | | font-size: 20px; |
| | | color: boleGetCssVar('text-color', 'regular'); |
| | | text-align: center; |
| | | line-height: 1.2; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .account-cardV2-add-tips-wrapper { |
| | | padding-top: 32px; |
| | | display: flex; |
| | | align-items: center; |
| | | margin-bottom: 16px; |
| | | .account-cardV2-add-tips-icon { |
| | | width: 32px; |
| | | height: 32px; |
| | | margin-right: 8px; |
| | | } |
| | | |
| | | .account-cardV2-add-tips { |
| | | font-size: 22px; |
| | | color: boleGetCssVar('text-color', 'secondary'); |
| | | } |
| | | } |
| | | |
| | | .account-cardV2-remark { |
| | | font-size: 24px; |
| | | line-height: 32px; |
| | | color: boleGetCssVar('text-color', 'regular'); |
| | | @include ellipsis; |
| | | } |
| | | } |
| | |
| | | @use './common.scss' as *; |
| | | |
| | | .recharge-tips-view { |
| | | padding: 32px; |
| | | border-radius: 24px; |
| | | background: linear-gradient(0deg, rgba(10, 90, 255, 0.04), rgba(10, 90, 255, 0.04)), #fff; |
| | | // padding: 32px; |
| | | // border-radius: 24px; |
| | | // background: linear-gradient(0deg, rgba(10, 90, 255, 0.04), rgba(10, 90, 255, 0.04)), #fff; |
| | | |
| | | .recharge-tips-title { |
| | | color: #1f2229; |
| | |
| | | } |
| | | } |
| | | |
| | | .confirm-dialog-content { |
| | | .confirm-dialog-content-tips { |
| | | margin-bottom: 32px; |
| | | .confirm-dialog-wrapper { |
| | | padding: 40px 72px !important; |
| | | width: 686px !important; |
| | | |
| | | .nut-dialog__header { |
| | | font-weight: bold; |
| | | font-size: 32rpx; |
| | | color: #222222; |
| | | height: 44rpx; |
| | | line-height: 44rpx; |
| | | } |
| | | |
| | | .confirm-dialog-content-info { |
| | | padding: 24px; |
| | | border-radius: 16px; |
| | | background: #f0f3fa; |
| | | margin-bottom: 16px; |
| | | .nut-dialog__content { |
| | | margin-top: 12px; |
| | | margin-bottom: 32px; |
| | | max-height: auto; |
| | | overflow: visible; |
| | | } |
| | | |
| | | .confirm-dialog-content-info-item { |
| | | display: flex; |
| | | margin-bottom: 20px; |
| | | .confirm-dialog-content { |
| | | .confirm-dialog-content-tips { |
| | | margin-bottom: 32px; |
| | | font-size: 22px; |
| | | color: boleGetCssVar('text-color', 'secondary'); |
| | | line-height: 30px; |
| | | } |
| | | |
| | | &:last-child { |
| | | margin-bottom: 0; |
| | | .confirm-dialog-content-info-wrapper { |
| | | padding: 0 20px; |
| | | position: relative; |
| | | margin-bottom: 32px; |
| | | |
| | | .confirm-dialog-content-info-cic { |
| | | position: absolute; |
| | | left: 0; |
| | | top: -8px; |
| | | width: 100%; |
| | | height: 27px; |
| | | box-shadow: 0px 3px 8px 0px rgba(2, 140, 255, 0.27); |
| | | border-radius: 28px 28px 28px 28px; |
| | | border: 6px solid #45aaff; |
| | | z-index: -1; |
| | | box-sizing: border-box; |
| | | } |
| | | } |
| | | |
| | | .confirm-dialog-content-info-item-label { |
| | | color: boleGetCssVar('text-color', 'regular'); |
| | | margin-right: 12px; |
| | | text-align: left; |
| | | } |
| | | .confirm-dialog-content-info { |
| | | padding: 36px 24px 40px; |
| | | border-radius: 16px; |
| | | |
| | | .confirm-dialog-content-info-item-content { |
| | | flex: 1; |
| | | min-width: 0; |
| | | @include ellipsis; |
| | | color: boleGetCssVar('text-color', 'primary'); |
| | | text-align: left; |
| | | } |
| | | box-shadow: 0px 3px 6px 0px rgba(2, 140, 255, 0.1), |
| | | inset 0px 6px 5px 0px rgba(126, 196, 255, 0.1); |
| | | background-color: #fff; |
| | | |
| | | &.danger { |
| | | .confirm-dialog-content-info-item { |
| | | display: flex; |
| | | padding: 22px 0; |
| | | font-size: 28px; |
| | | border-bottom: 1px dashed #cccccc; |
| | | |
| | | &:first-child { |
| | | padding-top: 0; |
| | | } |
| | | |
| | | &:last-child { |
| | | padding-bottom: 0; |
| | | border-bottom: none; |
| | | } |
| | | |
| | | .confirm-dialog-content-info-item-label { |
| | | color: boleGetCssVar('text-color', 'primary'); |
| | | margin-right: 12px; |
| | | text-align: left; |
| | | } |
| | | |
| | | .confirm-dialog-content-info-item-content { |
| | | color: boleGetCssVar('color', 'danger'); |
| | | flex: 1; |
| | | min-width: 0; |
| | | @include ellipsis; |
| | | color: boleGetCssVar('text-color', 'primary'); |
| | | text-align: right; |
| | | } |
| | | |
| | | &.danger { |
| | | .confirm-dialog-content-info-item-content { |
| | | color: boleGetCssVar('color', 'danger'); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .confirm-dialog-content-warning { |
| | | color: boleGetCssVar('color', 'danger'); |
| | | text-align: left; |
| | | font-size: 32px; |
| | | line-height: 40px; |
| | | .confirm-dialog-content-warning { |
| | | color: boleGetCssVar('color', 'danger'); |
| | | text-align: left; |
| | | font-size: 22px; |
| | | line-height: 30px; |
| | | position: relative; |
| | | |
| | | &::before { |
| | | content: '*'; |
| | | position: absolute; |
| | | left: -20px; |
| | | top: 10px; |
| | | background-color: boleGetCssVar('color', 'danger'); |
| | | width: 10px; |
| | | height: 10px; |
| | | border-radius: 50%; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | color: boleGetCssVar('text-color', 'primary'); |
| | | } |
| | | |
| | | .select-pay-type-view-form-item-radio { |
| | | .nut-radio__button--active { |
| | | // &::after { |
| | | // background-color: transparent; |
| | | // } |
| | | .select-pay-type-view { |
| | | .select-pay-type-form-item-title { |
| | | padding: 32px 0; |
| | | font-size: 28px; |
| | | color: #777777; |
| | | text-align: center; |
| | | border-bottom: 1px solid #f1f1f1; |
| | | } |
| | | .select-pay-type-view-form-item-radio-group { |
| | | width: 100%; |
| | | padding: 0 26px; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | .select-pay-type-view-form-item { |
| | | display: flex; |
| | | align-items: center; |
| | | color: #1d1e1e !important; |
| | | .select-pay-type-view-form-item-icon { |
| | | width: 32px; |
| | | height: 32px; |
| | | margin-right: 8px; |
| | | .select-pay-type-view-form-item-radio { |
| | | border-bottom: 1px solid #dcdcdc; |
| | | margin-bottom: 0; |
| | | padding: 48px 0; |
| | | |
| | | &:last-child { |
| | | border-bottom: none; |
| | | } |
| | | |
| | | .nut-radio__button--active { |
| | | // &::after { |
| | | // background-color: transparent; |
| | | // } |
| | | } |
| | | |
| | | .select-pay-type-view-form-item { |
| | | display: flex; |
| | | align-items: center; |
| | | color: boleGetCssVar('text-color', 'primary') !important; |
| | | font-size: 28px; |
| | | .select-pay-type-view-form-item-icon { |
| | | width: 48px; |
| | | height: 48px; |
| | | margin-right: 28px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | .lp-chunk-content { |
| | | .nut-cell.bole-form-item { |
| | | padding: 0; |
| | | padding-bottom: 48px; |
| | | } |
| | | } |
| | | } |
| | |
| | | color: transparent; |
| | | } |
| | | } |
| | | |
| | | @mixin placeholder { |
| | | color: var(--bole-text-color-secondary) !important; |
| | | font-size: 30px; |
| | | line-height: 42px; |
| | | } |
| | |
| | | @use './function.scss' as *; |
| | | @use './hairline.scss' as *; |
| | | @use './mixins.scss' as *; |
| | | |
| | | :root, |
| | | page { |
| | |
| | | } |
| | | |
| | | .bole-input-text:not(.nut-input--disabled) { |
| | | .h5-input { |
| | | .h5-input, |
| | | .input-text { |
| | | color: boleGetCssVar('text-color', 'primary') !important; |
| | | display: block; |
| | | font-size: 26rpx; |
| | | font-size: 30rpx; |
| | | line-height: 42px; |
| | | } |
| | | |
| | | .input-placeholder { |
| | | color: boleGetCssVar('text-color', 'placeholder') !important; |
| | | font-size: 26rpx; |
| | | font-size: 30rpx; |
| | | line-height: 42px; |
| | | } |
| | | } |
| | | |
| | | .bole-input-textarea:not(.nut-input--disabled) { |
| | | color: boleGetCssVar('text-color', 'primary') !important; |
| | | height: 200px; |
| | | height: 300px; |
| | | display: block; |
| | | font-size: 30rpx; |
| | | line-height: 42px; |
| | | } |
| | | |
| | | [placeholderclass='bole-input-text-placeholder'] { |
| | | &::placeholder { |
| | | @include placeholder; |
| | | } |
| | | } |
| | | |
| | | .bole-input-text-placeholder { |
| | | color: boleGetCssVar('text-color', 'placeholder') !important; |
| | | font-size: 26rpx; |
| | | line-height: 20rpx; |
| | | @include placeholder; |
| | | } |
| | | |
| | | .form-item-divider { |
| | |
| | | } |
| | | |
| | | .common-content { |
| | | padding: 0 boleGetCssVar('size', 'body-padding-h'); |
| | | // padding: 0 boleGetCssVar('size', 'body-padding-h'); |
| | | } |
| | | |
| | | .parValue-radio-group { |
| | | width: 100%; |
| | | display: grid !important; |
| | | grid-template-columns: repeat(3, 1fr); |
| | | grid-gap: 20px; |
| | | // grid-gap: 20px; |
| | | grid-column-gap: 20px; |
| | | grid-row-gap: 48px; |
| | | padding-top: 18px; |
| | | |
| | | .parValue-item { |
| | | margin-right: 0; |
| | | |
| | | .nut-radio__button { |
| | | width: 100%; |
| | | padding: 16rpx 0; |
| | | padding: 30rpx 0 28px; |
| | | background-color: transparent; |
| | | border: 1rpx solid #e2e5eb; |
| | | text-align: center; |
| | | border-radius: 4px; |
| | | border-radius: 10px; |
| | | position: relative; |
| | | } |
| | | |
| | | .nut-radio__button--active { |
| | | color: #fb5100; |
| | | border-color: #fb5100; |
| | | overflow: hidden; |
| | | color: boleGetCssVar('color', 'primary'); |
| | | border-color: boleGetCssVar('color', 'primary'); |
| | | |
| | | &::after { |
| | | border-radius: 8rpx; |
| | | background-color: rgba(251, 81, 0, 0.08); |
| | | opacity: 1; |
| | | background-color: boleGetCssVar('color', 'primary'); |
| | | opacity: 0.05; |
| | | } |
| | | |
| | | .parValue-item-inner { |
| | | .discountTag { |
| | | .discountTag, |
| | | .discount-icon { |
| | | display: block; |
| | | } |
| | | } |
| | |
| | | .amount-wrapper { |
| | | display: flex; |
| | | align-items: flex-end; |
| | | margin-bottom: 4px; |
| | | margin-bottom: 8px; |
| | | |
| | | .amount { |
| | | font-size: 40px; |
| | | font-weight: 400; |
| | | line-height: 44px; |
| | | line-height: 56px; |
| | | } |
| | | .unit { |
| | | font-size: 24px; |
| | | font-size: 40px; |
| | | font-weight: 400; |
| | | line-height: 32px; |
| | | line-height: 56px; |
| | | } |
| | | } |
| | | |
| | | .price-wrapper { |
| | | display: flex; |
| | | color: #858d98; |
| | | font-size: 24px; |
| | | color: boleGetCssVar('color', 'primary'); |
| | | font-size: 22px; |
| | | font-weight: 400; |
| | | line-height: 32px; |
| | | line-height: 30px; |
| | | |
| | | .price { |
| | | color: #fb5100; |
| | | margin-left: 6px; |
| | | } |
| | | // .price { |
| | | // color: #fb5100; |
| | | // margin-left: 6px; |
| | | // } |
| | | } |
| | | |
| | | .discountTag { |
| | | display: none; |
| | | position: absolute; |
| | | padding: 2px 8px; |
| | | border-radius: 0px 0 20px 0; |
| | | border: 1px solid #fb5100; |
| | | background: linear-gradient( |
| | | 186deg, |
| | | rgba(255, 129, 45, 0.08) 14.82%, |
| | | rgba(238, 67, 67, 0.08) 91.5% |
| | | ); |
| | | color: #fb5100; |
| | | padding: 4px 16px; |
| | | border-radius: 20px 0 20px 0; |
| | | background: linear-gradient(90deg, #1aaafe 0%, #0481ff 100%); |
| | | color: #fff; |
| | | font-size: 22px; |
| | | font-weight: 700; |
| | | line-height: 28px; |
| | | line-height: 30px; |
| | | position: absolute; |
| | | top: -2px; |
| | | top: -18px; |
| | | left: -2px; |
| | | } |
| | | |
| | | .discount-icon { |
| | | display: none; |
| | | position: absolute; |
| | | width: 48px; |
| | | height: 48px; |
| | | bottom: -1px; |
| | | right: -1px; |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | .recharge-button { |
| | | width: 100%; |
| | | margin: 40px 0; |
| | | margin: 40px 0 64px; |
| | | height: 88px; |
| | | |
| | | &.recharge-button-linear { |
| | | background: linear-gradient(90deg, #40a3ff 0%, #198bfe 100%); |
| | | box-shadow: 0px 8px 20px 0px rgba(11, 169, 255, 0.34); |
| | | } |
| | | |
| | | .recharge-button-inner { |
| | | display: flex; |
| | | font-size: 32px; |
| | | .recharge-button-text { |
| | | margin-left: 20px; |
| | | } |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | .lp-chunk-wrapper .lp-chunk-content { |
| | | .bole-form-item.user-account-form-item { |
| | | padding-bottom: 32px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | :root { |
| | | .nut-form { |
| | | &.chunk-form { |
| | | background-color: #fff; |
| | | border-radius: 16px; |
| | | |
| | | // .nut-cell-group__wrap { |
| | | // padding: 0 32px; |
| | | // } |
| | | |
| | | .nut-cell { |
| | | &.bole-form-item { |
| | | padding: 26px 32px 0; |
| | | |
| | | &:last-child { |
| | | border-bottom: none; |
| | | .nut-form-item__body__slots { |
| | | border-bottom: none; |
| | | } |
| | | } |
| | | |
| | | .nut-form-item__body__slots { |
| | | padding-bottom: 26px; |
| | | border-bottom: 2px solid #edebe4; |
| | | } |
| | | |
| | | .nut-form-item__label { |
| | | font-size: 28px; |
| | | color: boleGetCssVar('text-color', 'regular'); |
| | | } |
| | | |
| | | --nut-radio-label-font-size: 30px; |
| | | |
| | | .nut-textarea { |
| | | border-radius: 6px; |
| | | border: 2px solid #dcdcdc; |
| | | padding: 10px 16px !important; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .chunk-form-actions { |
| | | .recharge-button { |
| | | width: 100%; |
| | | margin: 20px 0; |
| | | height: 88px; |
| | | } |
| | | } |
| | |
| | | return addStarForString(str, 2, end); |
| | | } |
| | | |
| | | export function addStarForPhone(str: string) { |
| | | return `*${str.substring(str.length - 4)}`; |
| | | } |
| | | |
| | | export function formatTimeAgo(date: string, format = 'YYYY-MM-DD HH:mm') { |
| | | const diff = dayjs().diff(date, 'seconds'); // 计算时间差,单位为秒 |
| | | |
| | |
| | | } |
| | | return LifeRechargeConstants.LifePayOrderFrontStatusEnum.支付成功; |
| | | } |
| | | |
| | | export class StringUtils { |
| | | static insertSpaces(str: string, space = 4) { |
| | | if (!str) return ''; |
| | | const regex = new RegExp(`(.{${space}})`, 'g'); |
| | | return str.replace(regex, '$1 '); |
| | | } |
| | | |
| | | static societyCreditCodeInsertSpaces(str: string) { |
| | | if (!str) return ''; |
| | | return str.replace(/(.{4})(.{4})(.{4})(.{6})/g, '$1 $2 $3 $4'); |
| | | } |
| | | |
| | | static idNumberInsertSpaces(str: string) { |
| | | if (!str) return ''; |
| | | return str.replace(/(.{3})(.{3})(.{4})(.{4})(.{4})/g, '$1 $2 $3 $4 $5'); |
| | | } |
| | | |
| | | static phoneNumberAddSpace(realPhoneNumber: string) { |
| | | if (!realPhoneNumber) return ''; |
| | | return realPhoneNumber.replace(/^(\d{3})(\d*)(\d{4})$/, '$1 $2 $3'); |
| | | } |
| | | |
| | | static formatterNumber(str: string) { |
| | | const cleanedValue = str.replace(/[^\d.]/g, ''); |
| | | const singleDotValue = cleanedValue.replace(/(\..*)\./g, '$1'); |
| | | const numberValue = parseFloat(singleDotValue); |
| | | return isNaN(numberValue) ? '' : singleDotValue; |
| | | } |
| | | } |
| | |
| | | @go-pay="emit('goPay', $event)" |
| | | @paySuccess="emit('paySuccess', $event)" |
| | | @missName="emit('missName', $event)" |
| | | @editUserAccount="emit('editUserAccount', $event)" |
| | | /> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { computed, provide, useAttrs } from 'vue'; |
| | | import { computed, provide, useAttrs, watch } from 'vue'; |
| | | import { useStepper } from 'senin-mini/hooks'; |
| | | import { PhoneBillRechargeContextKey } from './context'; |
| | | import PhoneBillRechargeStep1 from './PhoneBillRechargeStep1.vue'; |
| | |
| | | const stepperInfo = useStepper(['step1', 'step2'], 'step2'); |
| | | const current = computed(() => stepperInfo.current.value); |
| | | |
| | | const outCurrent = defineModel<'step1' | 'step2'>({ |
| | | set(value) { |
| | | stepperInfo.goTo(value); |
| | | }, |
| | | get() { |
| | | return stepperInfo.current.value; |
| | | }, |
| | | }); |
| | | |
| | | const emit = defineEmits<{ |
| | | (e: 'goPay', orderNo: string): void; |
| | | (e: 'paySuccess', orderNo: string): void; |
| | | (e: 'missName', userAccountId: string): void; |
| | | (e: 'editUserAccount', userAccountId: string): void; |
| | | (e: 'currentChange', current: 'step1' | 'step2'): void; |
| | | }>(); |
| | | |
| | | watch( |
| | | current, |
| | | (newVal) => { |
| | | emit('currentChange', newVal); |
| | | }, |
| | | { |
| | | immediate: true, |
| | | } |
| | | ); |
| | | |
| | | provide(PhoneBillRechargeContextKey, { |
| | | ...stepperInfo, |
| | | }); |
| | |
| | | ref="formRef" |
| | | :rules="rules" |
| | | label-position="top" |
| | | class="order-bill-recharge phone" |
| | | class="order-bill-recharge phone chunk-form" |
| | | > |
| | | <NutFormItem label="选择运营商:" class="bole-form-item" prop="ispCode" required> |
| | | <NutRadioGroup v-model="form.ispCode" direction="horizontal" @change="handleIspCodeChange"> |
| | |
| | | class="bole-input-text" |
| | | placeholder="请填写您需要充值的手机号码" |
| | | type="text" |
| | | placeholderClass="bole-input-text-placeholder" |
| | | /> |
| | | </NutFormItem> |
| | | <NutFormItem label="机主姓名" class="bole-form-item" prop="name" required> |
| | |
| | | class="bole-input-text" |
| | | placeholder="请填写充值手机号对应的户主姓名" |
| | | type="text" |
| | | placeholderClass="bole-input-text-placeholder" |
| | | /> |
| | | </NutFormItem> |
| | | <slot></slot> |
| | |
| | | > |
| | | </NutTextarea> |
| | | </NutFormItem> |
| | | <div class="common-content"> |
| | | <nut-button class="recharge-button" type="primary" @click="handleNext"> |
| | | <div class="recharge-button-inner"> |
| | | <div class="recharge-button-text">保存</div> |
| | | </div> |
| | | </nut-button> |
| | | <nut-button class="recharge-button" type="primary" plain @click="goToNext"> |
| | | <div class="recharge-button-inner"> |
| | | <div class="recharge-button-text">返回</div> |
| | | </div> |
| | | </nut-button> |
| | | </div> |
| | | </PhoneBillRechargeBaseForm> |
| | | <div class="chunk-form-actions"> |
| | | <nut-button class="recharge-button" type="primary" @click="handleNext"> |
| | | <div class="recharge-button-inner"> |
| | | <div class="recharge-button-text">保存</div> |
| | | </div> |
| | | </nut-button> |
| | | <nut-button class="recharge-button" type="primary" plain @click="goToNext"> |
| | | <div class="recharge-button-inner"> |
| | | <div class="recharge-button-text">返回</div> |
| | | </div> |
| | | </nut-button> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | |
| | | label-position="top" |
| | | class="order-bill-recharge phone" |
| | | > |
| | | <Chunk borderRadiusSmall> |
| | | <NutFormItem class="bole-form-item" prop="currentUserAccountId"> |
| | | <Chunk borderRadiusSmall :hasPaddingBottom="false"> |
| | | <NutFormItem class="bole-form-item user-account-form-item" prop="currentUserAccountId"> |
| | | <NutRadioGroup |
| | | v-model="form.currentUserAccountId" |
| | | direction="horizontal" |
| | |
| | | shape="button" |
| | | v-for="item in userAccountAllList" |
| | | :key="item.id" |
| | | >{{ item.content }}</NutRadio |
| | | >{{ addStarForPhone(item.content) }}</NutRadio |
| | | > |
| | | </NutRadioGroup> |
| | | <AccountCard |
| | | <AccountCardV2 |
| | | v-if="userAccountAllList.length > 0" |
| | | title="充值手机号" |
| | | :content="form.phone" |
| | | :content="StringUtils.phoneNumberAddSpace(form.phone)" |
| | | :remark="form.remark" |
| | | :showEditBtn="!!form.currentUserAccountId" |
| | | @add="handleAddUserAccount" |
| | | @edit="emit('editUserAccount', form.currentUserAccountId)" |
| | | > |
| | | <template #action> |
| | | <div class="account-card-action" @click="handleAddUserAccount">新增</div> |
| | | </template> |
| | | </AccountCard> |
| | | <AccountAddCard v-else @click="handleAddUserAccount" /> |
| | | </AccountCardV2> |
| | | <AccountAddCardV2 |
| | | content="去添加充值号码" |
| | | remark="添加号码将保存在生活缴费进行管理" |
| | | tip="添加正确号码" |
| | | v-else |
| | | @add="handleAddUserAccount" |
| | | /> |
| | | </NutFormItem> |
| | | </Chunk> |
| | | |
| | | <NutFormItem label="选择充值金额" class="bole-form-item" prop="parValue" required> |
| | | <NutRadioGroup v-model="form.parValue" direction="horizontal" class="parValue-radio-group"> |
| | | <NutRadio |
| | | :label="Number(item)" |
| | | :key="item" |
| | | shape="button" |
| | | v-for="item in parValueList" |
| | | class="parValue-item" |
| | | > |
| | | <div class="parValue-item-inner"> |
| | | <div class="amount-wrapper"> |
| | | <div class="amount">{{ item }}</div> |
| | | <div class="unit">元</div> |
| | | </div> |
| | | <div class="price-wrapper"> |
| | | <div class="price-text">折后</div> |
| | | <div class="price"> |
| | | {{ blLifeRecharge.getRechargeParValue(item, lifePayPhoneRate) }}元 |
| | | <Chunk borderRadiusSmall :hasPaddingBottom="false" title="选择充值金额"> |
| | | <NutFormItem class="bole-form-item" prop="parValue" required> |
| | | <NutRadioGroup v-model="form.parValue" direction="horizontal" class="parValue-radio-group"> |
| | | <NutRadio |
| | | :label="Number(item)" |
| | | :key="item" |
| | | shape="button" |
| | | v-for="item in parValueList" |
| | | class="parValue-item" |
| | | > |
| | | <div class="parValue-item-inner"> |
| | | <div class="amount-wrapper"> |
| | | <div class="amount">{{ item }}</div> |
| | | <div class="unit">元</div> |
| | | </div> |
| | | <div class="price-wrapper"> |
| | | <div class="price-text">折后</div> |
| | | <div class="price"> |
| | | {{ blLifeRecharge.getRechargeParValue(item, lifePayPhoneRate) }}元 |
| | | </div> |
| | | </div> |
| | | <div class="discountTag" v-if="lifePayPhoneRate > 0">{{ lifePayPhoneRate }}折</div> |
| | | <img :src="IconSelect" class="discount-icon" /> |
| | | </div> |
| | | <div class="discountTag" v-if="lifePayPhoneRate > 0">{{ lifePayPhoneRate }}折</div> |
| | | </div> |
| | | </NutRadio> |
| | | </NutRadioGroup> |
| | | </NutFormItem> |
| | | </NutRadio> |
| | | </NutRadioGroup> |
| | | </NutFormItem> |
| | | </Chunk> |
| | | |
| | | <SelectPayTypeFormItem |
| | | v-model="form.lifePayType" |
| | | :showWeixinPay="showWeixinPay" |
| | | :showAliPay="showAliPay" |
| | | ></SelectPayTypeFormItem> |
| | | <div class="common-content"> |
| | | <nut-button class="recharge-button" type="primary" @click="handleSubmit"> |
| | | <nut-button |
| | | class="recharge-button recharge-button-linear" |
| | | type="primary" |
| | | @click="handleSubmit" |
| | | > |
| | | <div class="recharge-button-inner"> |
| | | <div>¥{{ realParValue }}</div> |
| | | <div class="recharge-button-text">立即充值</div> |
| | |
| | | } from '@nutui/nutui-taro'; |
| | | import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types'; |
| | | import { reactive, ref, computed, toRef } from 'vue'; |
| | | import { FormValidator, initLifePayType } from '../../utils'; |
| | | import { FormValidator, initLifePayType, addStarForPhone, StringUtils } from '../../utils'; |
| | | import { |
| | | useLifeRechargeContext, |
| | | BlLifeRecharge, |
| | |
| | | import ConfirmDialog from '../../components/Dialog/ConfirmDialog.vue'; |
| | | import ConfirmDialogInfoItem from '../../components/Dialog/ConfirmDialogInfoItem.vue'; |
| | | import { useGetRate, useGetPhoneParValue, useSetUserAccountBySelect } from '../../hooks'; |
| | | import AccountAddCard from '../../components/Card/AccountAddCard.vue'; |
| | | import AccountCard from '../../components/Card/AccountCard.vue'; |
| | | import AccountAddCardV2 from '../../components/Card/AccountAddCardV2.vue'; |
| | | import AccountCardV2 from '../../components/Card/AccountCardV2.vue'; |
| | | import { usePhoneBillRechargeContext, PhoneUserAccountExtraProperties } from './context'; |
| | | import SelectPayTypeFormItem from '../../components/SelectPayTypeFormItem/SelectPayTypeFormItem.vue'; |
| | | import { useSelectPayType, useGetPayStatusByOrderNo } from '../../hooks/selectPayType'; |
| | | import { RechargeProps } from './types'; |
| | | import Chunk from '../../components/Layout/Chunk.vue'; |
| | | import IconSelect from '../../assets/recharge/icon-select.png'; |
| | | |
| | | defineOptions({ |
| | | name: 'PhoneBillRechargeStep2', |
| | |
| | | (e: 'goPay', orderNo: string): void; |
| | | (e: 'paySuccess', orderNo: string): void; |
| | | (e: 'missName', userAccountId: string): void; |
| | | (e: 'editUserAccount', userAccountId: string): void; |
| | | }>(); |
| | | |
| | | const { lifePayPhoneRate } = useGetRate(); |
| | |
| | | |
| | | function handleSubmit() { |
| | | if (!formRef.value) return; |
| | | console.log('form: ', form, formRef.value); |
| | | formRef.value.validate().then(({ valid, errors }: any) => { |
| | | console.log('errors: ', errors); |
| | | if (valid) { |
| | | if (!form.name) { |
| | | emit('missName', form.currentUserAccountId); |