From 80dc90be027ee26869c63860b7d6a0759a03546b Mon Sep 17 00:00:00 2001
From: zhengyiming <540361168@qq.com>
Date: 星期二, 20 五月 2025 17:33:53 +0800
Subject: [PATCH] fix: 修改首页ui
---
packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeBaseForm.vue | 4
packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeStep1.vue | 24
packages/components/src/components/SelectPayTypeFormItem/SelectPayTypeFormItem.vue | 71 ++-
apps/taro/src/styles/nut.scss | 5
packages/components/src/assets/recharge/icon-add.png | 0
packages/components/src/components/Card/AccountAddCardV2.vue | 37 ++
packages/components/src/assets/recharge/icon-select.png | 0
apps/taro/src/subpackages/recharge/phoneBillRecharge/InnerPage.vue | 12
packages/components/src/views/PhoneBillRecharge/PhoneBillRecharge.vue | 24
packages/components/src/styles/nut.scss | 25 +
packages/components/src/components/Card/AccountCardV2.vue | 42 ++
packages/components/src/styles/components.scss | 185 +++++++++---
packages/components/src/assets/icon-weixin-pay.png | 0
packages/components/src/styles/card.scss | 110 +++++++
packages/components/src/styles/rechargeGrid.scss | 139 +++++++--
packages/components/src/utils/common.ts | 34 ++
apps/taro/src/styles/mixins.scss | 6
apps/taro/src/subpackages/recharge/phoneBillRecharge/phoneBillRecharge.vue | 25 +
packages/components/src/assets/recharge/icon-init-add.png | 0
packages/components/src/styles/layout.scss | 1
packages/components/src/assets/recharge/icon-edit.png | 0
packages/components/src/styles/mixins.scss | 6
packages/components/src/assets/icon-alipay.png | 0
packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeStep2.vue | 93 +++--
packages/components/src/assets/recharge/icon-info.png | 0
packages/components/src/components/Dialog/ConfirmDialog.vue | 14
26 files changed, 662 insertions(+), 195 deletions(-)
diff --git a/apps/taro/src/styles/mixins.scss b/apps/taro/src/styles/mixins.scss
index a883f74..8ece9d0 100644
--- a/apps/taro/src/styles/mixins.scss
+++ b/apps/taro/src/styles/mixins.scss
@@ -74,3 +74,9 @@
color: transparent;
}
}
+
+@mixin placeholder {
+ color: var(--bole-text-color-secondary) !important;
+ font-size: 30px;
+ line-height: 42px;
+}
diff --git a/apps/taro/src/styles/nut.scss b/apps/taro/src/styles/nut.scss
index ba3b1f1..06f41b2 100644
--- a/apps/taro/src/styles/nut.scss
+++ b/apps/taro/src/styles/nut.scss
@@ -1,5 +1,6 @@
@use './function.scss' as *;
@use './hairline.scss' as *;
+@use './mixins.scss' as *;
:root,
page {
@@ -130,9 +131,7 @@
}
.bole-input-text-placeholder {
- color: boleGetCssVar('text-color', 'placeholder') !important;
- font-size: 26rpx;
- line-height: 20rpx;
+ @include placeholder;
}
.form-item-divider {
diff --git a/apps/taro/src/subpackages/recharge/phoneBillRecharge/InnerPage.vue b/apps/taro/src/subpackages/recharge/phoneBillRecharge/InnerPage.vue
index 2d7461d..43d37f9 100644
--- a/apps/taro/src/subpackages/recharge/phoneBillRecharge/InnerPage.vue
+++ b/apps/taro/src/subpackages/recharge/phoneBillRecharge/InnerPage.vue
@@ -13,6 +13,8 @@
:showAliPay="!isInWeChat"
:showWeixinPay="isInWeChat"
@missName="handleMissName"
+ @editUserAccount="handleEditUserAccount"
+ @currentChange="emit('currentChange', $event)"
/>
</ContentScrollView>
</template>
@@ -30,6 +32,10 @@
name: 'InnerPage',
});
+const emit = defineEmits<{
+ (e: 'currentChange', current: 'step1' | 'step2'): void;
+}>();
+
const isDev = process.env.NODE_ENV === 'development';
const { wxOpenId } = useUser();
@@ -56,4 +62,10 @@
});
} catch (error) {}
}
+
+function handleEditUserAccount(userAccountId: string) {
+ RouteHelper.navigateTo({
+ url: `${RouterPath.editPhoneUserAccount}?id=${userAccountId}`,
+ });
+}
</script>
diff --git a/apps/taro/src/subpackages/recharge/phoneBillRecharge/phoneBillRecharge.vue b/apps/taro/src/subpackages/recharge/phoneBillRecharge/phoneBillRecharge.vue
index f813b87..eaf617a 100644
--- a/apps/taro/src/subpackages/recharge/phoneBillRecharge/phoneBillRecharge.vue
+++ b/apps/taro/src/subpackages/recharge/phoneBillRecharge/phoneBillRecharge.vue
@@ -1,20 +1,23 @@
<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>
@@ -26,6 +29,16 @@
defineOptions({
name: 'phoneBillRecharge',
});
+
+type Current = 'step1' | 'step2';
+
+const title = '璇濊垂鍏呭��';
+
+const current = ref<Current>();
+
+function handleCurrentChange(val: Current) {
+ current.value = val;
+}
</script>
<style lang="scss">
diff --git a/packages/components/src/assets/icon-alipay.png b/packages/components/src/assets/icon-alipay.png
index 3d25ddf..dfda488 100644
--- a/packages/components/src/assets/icon-alipay.png
+++ b/packages/components/src/assets/icon-alipay.png
Binary files differ
diff --git a/packages/components/src/assets/icon-weixin-pay.png b/packages/components/src/assets/icon-weixin-pay.png
index b2b0ab4..aef8214 100644
--- a/packages/components/src/assets/icon-weixin-pay.png
+++ b/packages/components/src/assets/icon-weixin-pay.png
Binary files differ
diff --git a/packages/components/src/assets/recharge/icon-add.png b/packages/components/src/assets/recharge/icon-add.png
new file mode 100644
index 0000000..45c92d3
--- /dev/null
+++ b/packages/components/src/assets/recharge/icon-add.png
Binary files differ
diff --git a/packages/components/src/assets/recharge/icon-edit.png b/packages/components/src/assets/recharge/icon-edit.png
new file mode 100644
index 0000000..20a664a
--- /dev/null
+++ b/packages/components/src/assets/recharge/icon-edit.png
Binary files differ
diff --git a/packages/components/src/assets/recharge/icon-info.png b/packages/components/src/assets/recharge/icon-info.png
new file mode 100644
index 0000000..e915f6b
--- /dev/null
+++ b/packages/components/src/assets/recharge/icon-info.png
Binary files differ
diff --git a/packages/components/src/assets/recharge/icon-init-add.png b/packages/components/src/assets/recharge/icon-init-add.png
new file mode 100644
index 0000000..5e2a6e8
--- /dev/null
+++ b/packages/components/src/assets/recharge/icon-init-add.png
Binary files differ
diff --git a/packages/components/src/assets/recharge/icon-select.png b/packages/components/src/assets/recharge/icon-select.png
new file mode 100644
index 0000000..290f573
--- /dev/null
+++ b/packages/components/src/assets/recharge/icon-select.png
Binary files differ
diff --git a/packages/components/src/components/Card/AccountAddCardV2.vue b/packages/components/src/components/Card/AccountAddCardV2.vue
new file mode 100644
index 0000000..15ed3ff
--- /dev/null
+++ b/packages/components/src/components/Card/AccountAddCardV2.vue
@@ -0,0 +1,37 @@
+<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>
diff --git a/packages/components/src/components/Card/AccountCardV2.vue b/packages/components/src/components/Card/AccountCardV2.vue
new file mode 100644
index 0000000..42b8dfc
--- /dev/null
+++ b/packages/components/src/components/Card/AccountCardV2.vue
@@ -0,0 +1,42 @@
+<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>
diff --git a/packages/components/src/components/Dialog/ConfirmDialog.vue b/packages/components/src/components/Dialog/ConfirmDialog.vue
index 38a1b2b..eecc198 100644
--- a/packages/components/src/components/Dialog/ConfirmDialog.vue
+++ b/packages/components/src/components/Dialog/ConfirmDialog.vue
@@ -1,14 +1,22 @@
<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">
鍚屼竴鍙风爜鍏呭�兼湡闂达紝鏈埌璐﹀墠鍒囧嬁鍦ㄥ叾浠栦换浣曞钩鍙板啀娆″厖鍊笺�傚洜姝ら�犳垚鐨勮祫閲戞崯澶遍』鐢ㄦ埛鑷鎵挎媴锛侊紒锛�
diff --git a/packages/components/src/components/SelectPayTypeFormItem/SelectPayTypeFormItem.vue b/packages/components/src/components/SelectPayTypeFormItem/SelectPayTypeFormItem.vue
index 855f7e5..7fc78d3 100644
--- a/packages/components/src/components/SelectPayTypeFormItem/SelectPayTypeFormItem.vue
+++ b/packages/components/src/components/SelectPayTypeFormItem/SelectPayTypeFormItem.vue
@@ -1,34 +1,46 @@
<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">
@@ -37,6 +49,7 @@
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',
diff --git a/packages/components/src/styles/card.scss b/packages/components/src/styles/card.scss
index c5f3f12..016c08a 100644
--- a/packages/components/src/styles/card.scss
+++ b/packages/components/src/styles/card.scss
@@ -63,12 +63,116 @@
}
.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;
}
}
diff --git a/packages/components/src/styles/components.scss b/packages/components/src/styles/components.scss
index 0a06f6d..cb15a85 100644
--- a/packages/components/src/styles/components.scss
+++ b/packages/components/src/styles/components.scss
@@ -1,9 +1,9 @@
@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;
@@ -28,52 +28,115 @@
}
}
-.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%;
+ }
+ }
}
}
@@ -227,21 +290,45 @@
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;
+ }
}
}
}
diff --git a/packages/components/src/styles/layout.scss b/packages/components/src/styles/layout.scss
index d2723e5..0b903dd 100644
--- a/packages/components/src/styles/layout.scss
+++ b/packages/components/src/styles/layout.scss
@@ -66,6 +66,7 @@
.lp-chunk-content {
.nut-cell.bole-form-item {
padding: 0;
+ padding-bottom: 48px;
}
}
}
diff --git a/packages/components/src/styles/mixins.scss b/packages/components/src/styles/mixins.scss
index 1d5b3da..46709b4 100644
--- a/packages/components/src/styles/mixins.scss
+++ b/packages/components/src/styles/mixins.scss
@@ -74,3 +74,9 @@
color: transparent;
}
}
+
+@mixin placeholder {
+ color: var(--bole-text-color-secondary) !important;
+ font-size: 30px;
+ line-height: 42px;
+}
diff --git a/packages/components/src/styles/nut.scss b/packages/components/src/styles/nut.scss
index 797cfdc..1d9b575 100644
--- a/packages/components/src/styles/nut.scss
+++ b/packages/components/src/styles/nut.scss
@@ -1,5 +1,6 @@
@use './function.scss' as *;
@use './hairline.scss' as *;
+@use './mixins.scss' as *;
:root,
page {
@@ -113,27 +114,37 @@
}
.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 {
diff --git a/packages/components/src/styles/rechargeGrid.scss b/packages/components/src/styles/rechargeGrid.scss
index e06c9b3..d10c55f 100644
--- a/packages/components/src/styles/rechargeGrid.scss
+++ b/packages/components/src/styles/rechargeGrid.scss
@@ -53,41 +53,44 @@
}
.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;
}
}
@@ -102,52 +105,55 @@
.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;
+ }
}
}
}
@@ -162,10 +168,17 @@
}
.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;
}
@@ -183,4 +196,62 @@
}
}
}
+
+ .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;
+ }
}
diff --git a/packages/components/src/utils/common.ts b/packages/components/src/utils/common.ts
index 5b055b6..1d761af 100644
--- a/packages/components/src/utils/common.ts
+++ b/packages/components/src/utils/common.ts
@@ -54,6 +54,10 @@
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'); // 璁$畻鏃堕棿宸紝鍗曚綅涓虹
@@ -185,3 +189,33 @@
}
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;
+ }
+}
diff --git a/packages/components/src/views/PhoneBillRecharge/PhoneBillRecharge.vue b/packages/components/src/views/PhoneBillRecharge/PhoneBillRecharge.vue
index e598d3c..a269413 100644
--- a/packages/components/src/views/PhoneBillRecharge/PhoneBillRecharge.vue
+++ b/packages/components/src/views/PhoneBillRecharge/PhoneBillRecharge.vue
@@ -6,11 +6,12 @@
@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';
@@ -28,21 +29,24 @@
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,
});
diff --git a/packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeBaseForm.vue b/packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeBaseForm.vue
index 46b9117..163da73 100644
--- a/packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeBaseForm.vue
+++ b/packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeBaseForm.vue
@@ -4,7 +4,7 @@
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">
@@ -22,6 +22,7 @@
class="bole-input-text"
placeholder="璇峰~鍐欐偍闇�瑕佸厖鍊肩殑鎵嬫満鍙风爜"
type="text"
+ placeholderClass="bole-input-text-placeholder"
/>
</NutFormItem>
<NutFormItem label="鏈轰富濮撳悕" class="bole-form-item" prop="name" required>
@@ -30,6 +31,7 @@
class="bole-input-text"
placeholder="璇峰~鍐欏厖鍊兼墜鏈哄彿瀵瑰簲鐨勬埛涓诲鍚�"
type="text"
+ placeholderClass="bole-input-text-placeholder"
/>
</NutFormItem>
<slot></slot>
diff --git a/packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeStep1.vue b/packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeStep1.vue
index c358779..77e1c85 100644
--- a/packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeStep1.vue
+++ b/packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeStep1.vue
@@ -12,19 +12,19 @@
>
</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">
diff --git a/packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeStep2.vue b/packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeStep2.vue
index 1319215..57e0e54 100644
--- a/packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeStep2.vue
+++ b/packages/components/src/views/PhoneBillRecharge/PhoneBillRechargeStep2.vue
@@ -6,8 +6,8 @@
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"
@@ -20,55 +20,68 @@
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="娣诲姞姝g‘鍙风爜"
+ 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>
@@ -100,7 +113,7 @@
} 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,
@@ -111,13 +124,14 @@
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',
@@ -164,6 +178,7 @@
(e: 'goPay', orderNo: string): void;
(e: 'paySuccess', orderNo: string): void;
(e: 'missName', userAccountId: string): void;
+ (e: 'editUserAccount', userAccountId: string): void;
}>();
const { lifePayPhoneRate } = useGetRate();
@@ -201,7 +216,9 @@
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);
--
Gitblit v1.10.0