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>
@@ -29,6 +31,10 @@
 defineOptions({
   name: 'InnerPage',
 });
+
+const emit = defineEmits<{
+  (e: 'currentChange', current: 'step1' | 'step2'): void;
+}>();
 
 const isDev = process.env.NODE_ENV === 'development';
 
@@ -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,51 +105,54 @@
       .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.9.1