From 0d86b7da2c9341e009adeda25b75a7e01445c272 Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期一, 04 八月 2025 16:23:02 +0800
Subject: [PATCH] feat: mine

---
 apps/cMiniApp/src/subpackages/wallet/mineWallet/mineWallet.config.ts             |    3 
 apps/cMiniApp/src/subpackages/wallet/bindBankCard/bindBankCard.vue               |   18 +
 apps/cMiniApp/src/subpackages/wallet/unboundBankCard/InnerPage.vue               |  135 +++++++++++
 packages/components/src/List/IncomeDetailListItem.vue                            |   78 ++++++
 apps/cMiniApp/src/subpackages/wallet/incomeDetail/incomeDetail.config.ts         |    3 
 apps/cMiniApp/src/subpackages/wallet/mineWallet/mineWallet.vue                   |   18 +
 apps/cMiniApp/src/subpackages/wallet/incomeDetailInfo/InnerPage.vue              |   84 +++++++
 apps/bMiniApp/project.private.config.json                                        |    2 
 apps/cMiniApp/src/subpackages/wallet/incomeDetailInfo/incomeDetailInfo.vue       |   18 +
 apps/cMiniApp/src/subpackages/wallet/unboundBankCard/unboundBankCard.config.ts   |    3 
 packages/components/src/index.ts                                                 |    1 
 apps/cMiniApp/src/subpackages/wallet/incomeDetail/incomeDetail.vue               |   18 +
 apps/cMiniApp/src/constants/router.ts                                            |    6 
 apps/cMiniApp/src/app.config.ts                                                  |   10 
 apps/cMiniApp/src/pages/mine/index.vue                                           |   10 
 apps/cMiniApp/src/subpackages/wallet/bindBankCard/InnerPage.vue                  |  106 ++++++++
 apps/cMiniApp/src/subpackages/wallet/mineWallet/InnerPage.vue                    |   52 ++++
 apps/cMiniApp/project.private.config.json                                        |    2 
 apps/cMiniApp/src/subpackages/wallet/incomeDetailInfo/incomeDetailInfo.config.ts |    3 
 apps/cMiniApp/src/subpackages/curriculum/mineCurriculumVitae/InnerPage.vue       |    4 
 packages/services/api/typings.d.ts                                               |    2 
 apps/bMiniApp/src/pages/mine/index.vue                                           |    4 
 apps/cMiniApp/src/subpackages/wallet/unboundBankCard/unboundBankCard.vue         |   17 +
 apps/cMiniApp/src/subpackages/wallet/incomeDetail/InnerPage.vue                  |   64 +++++
 apps/cMiniApp/src/subpackages/wallet/bindBankCard/bindBankCard.config.ts         |    3 
 25 files changed, 655 insertions(+), 9 deletions(-)

diff --git a/apps/bMiniApp/project.private.config.json b/apps/bMiniApp/project.private.config.json
index fab06fe..05123c7 100644
--- a/apps/bMiniApp/project.private.config.json
+++ b/apps/bMiniApp/project.private.config.json
@@ -81,5 +81,5 @@
             ]
         }
     },
-    "libVersion": "3.7.3"
+    "libVersion": "3.9.0"
 }
\ No newline at end of file
diff --git a/apps/bMiniApp/src/pages/mine/index.vue b/apps/bMiniApp/src/pages/mine/index.vue
index 70e0c29..3dada20 100644
--- a/apps/bMiniApp/src/pages/mine/index.vue
+++ b/apps/bMiniApp/src/pages/mine/index.vue
@@ -42,7 +42,7 @@
             <div class="mine-go-login" v-else>鍘荤櫥褰�</div>
           </div>
         </template>
-        <!-- <div class="mine-business-card">
+        <div class="mine-business-card">
           <div class="mine-business-card-item">
             <img class="mine-business-card-item-icon" :src="IconBusinessCard" alt="" />
             <div class="mine-business-card-item-text">鎴戠殑鐢靛瓙鍚嶇墖</div>
@@ -50,7 +50,7 @@
           <div class="mine-business-card-btn">
             <nut-button type="info">閫掑悕鐗�</nut-button>
           </div>
-        </div> -->
+        </div>
       </UserHomeTopView>
       <template v-if="isLogin">
         <div class="mine-content-record">
diff --git a/apps/cMiniApp/project.private.config.json b/apps/cMiniApp/project.private.config.json
index 9961598..0c6b36b 100644
--- a/apps/cMiniApp/project.private.config.json
+++ b/apps/cMiniApp/project.private.config.json
@@ -60,5 +60,5 @@
             ]
         }
     },
-    "libVersion": "3.7.3"
+    "libVersion": "3.9.0"
 }
\ No newline at end of file
diff --git a/apps/cMiniApp/src/app.config.ts b/apps/cMiniApp/src/app.config.ts
index 8599939..c605d13 100644
--- a/apps/cMiniApp/src/app.config.ts
+++ b/apps/cMiniApp/src/app.config.ts
@@ -83,6 +83,16 @@
       ],
     },
     {
+      root: 'subpackages/wallet',
+      pages: [
+        'mineWallet/mineWallet',
+        'bindBankCard/bindBankCard',
+        'unboundBankCard/unboundBankCard',
+        'incomeDetail/incomeDetail',
+        'incomeDetailInfo/incomeDetailInfo',
+      ],
+    },
+    {
       root: 'subpackages/curriculum',
       pages: [
         'editMineInfo/editMineInfo',
diff --git a/apps/cMiniApp/src/constants/router.ts b/apps/cMiniApp/src/constants/router.ts
index 5ba6748..54ddfd1 100644
--- a/apps/cMiniApp/src/constants/router.ts
+++ b/apps/cMiniApp/src/constants/router.ts
@@ -37,6 +37,12 @@
   mineAgreementSignDetail = '/subpackages/mine/mineAgreementSignDetail/mineAgreementSignDetail',
   setting = '/subpackages/mine/setting/setting',
 
+  mineWallet = '/subpackages/wallet/mineWallet/mineWallet',
+  unboundBankCard = '/subpackages/wallet/unboundBankCard/unboundBankCard',
+  bindBankCard = '/subpackages/wallet/bindBankCard/bindBankCard',
+  incomeDetail = '/subpackages/wallet/incomeDetail/incomeDetail',
+  incomeDetailInfo = '/subpackages/wallet/incomeDetailInfo/incomeDetailInfo',
+
   mineCurriculumVitae = '/subpackages/curriculum/mineCurriculumVitae/mineCurriculumVitae',
   editMineInfo = '/subpackages/curriculum/editMineInfo/editMineInfo',
   mineJobIntention = '/subpackages/curriculum/mineJobIntention/mineJobIntention',
diff --git a/apps/cMiniApp/src/pages/mine/index.vue b/apps/cMiniApp/src/pages/mine/index.vue
index e07e7ce..24c681e 100644
--- a/apps/cMiniApp/src/pages/mine/index.vue
+++ b/apps/cMiniApp/src/pages/mine/index.vue
@@ -50,14 +50,14 @@
       </UserHomeTopView>
     </ContentView>
     <ContentScrollView v-if="isLogin" class="mine-content-scroll-view">
-      <!-- <List class="mine-list-wrapper mine-balance">
+      <List class="mine-list-wrapper mine-balance">
         <div class="mine-balance-title">鎴戠殑浣欓</div>
         <div class="mine-balance-money">锟{ toThousand(100) }}</div>
-        <div class="mine-balance-btn">
+        <div class="mine-balance-btn" @click="goMineWallet">
           杩涘叆鎴戠殑閽卞寘
           <img :src="IconArrow" class="mine-balance-btn-icon" />
         </div>
-      </List> -->
+      </List>
       <List class="mine-list-wrapper mine-order-list">
         <div class="mine-order-list-title">
           <div class="mine-order-list-title-text">鎴戠殑璁㈠崟</div>
@@ -160,6 +160,10 @@
 function goMineAgreementSign() {
   goPage(RouterPath.mineAgreementSign);
 }
+
+function goMineWallet() {
+  goPage(RouterPath.mineWallet);
+}
 </script>
 
 <style lang="scss">
diff --git a/apps/cMiniApp/src/subpackages/curriculum/mineCurriculumVitae/InnerPage.vue b/apps/cMiniApp/src/subpackages/curriculum/mineCurriculumVitae/InnerPage.vue
index c8b000e..28bdc57 100644
--- a/apps/cMiniApp/src/subpackages/curriculum/mineCurriculumVitae/InnerPage.vue
+++ b/apps/cMiniApp/src/subpackages/curriculum/mineCurriculumVitae/InnerPage.vue
@@ -40,7 +40,9 @@
           </div>
           <div class="mine-curriculum-info-item-detail">
             {{
-              `${detail?.resumeBaseInfo?.age}宀� | ${detail?.resumeBaseInfo?.socialIdentityName} | ${detail?.resumeBaseInfo?.educationalLevelName}`
+              `${detail?.resumeBaseInfo?.age ?? ''}宀� | ${
+                detail?.resumeBaseInfo?.socialIdentityName
+              } | ${detail?.resumeBaseInfo?.educationalLevelName}`
             }}
           </div>
         </div>
diff --git a/apps/cMiniApp/src/subpackages/wallet/bindBankCard/InnerPage.vue b/apps/cMiniApp/src/subpackages/wallet/bindBankCard/InnerPage.vue
new file mode 100644
index 0000000..0ac88a1
--- /dev/null
+++ b/apps/cMiniApp/src/subpackages/wallet/bindBankCard/InnerPage.vue
@@ -0,0 +1,106 @@
+<template>
+  <ContentScrollView>
+    <div class="bind-bank-card-wrapper">
+      <div class="bg-left-top"></div>
+      <div class="bind-bank-card-content">
+        <div class="bank-card-name">{{ '鎷涘晢閾惰' }}</div>
+        <div class="bank-card-number">{{ '**** **** **** 1234' }}</div>
+        <div class="bank-card-type">{{ '鍌ㄨ搫鍗�' }}</div>
+      </div>
+      <div class="bg-right-bottom"></div>
+    </div>
+    <div class="bind-bank-card-tips">鐩墠鍙敮鎸佷竴寮犻摱琛屽崱锛屽闇�鎹㈠崱璇峰厛瑙g粦</div>
+  </ContentScrollView>
+  <PageFooter :isOnlyAction="false">
+    <PageFooterBtn type="primary" @click="handleUnbind()">瑙g粦閾惰鍗�</PageFooterBtn>
+  </PageFooter>
+</template>
+
+<script setup lang="ts">
+import { useUserStore } from '@/stores/modules/user';
+import Taro from '@tarojs/taro';
+
+defineOptions({
+  name: 'InnerPage',
+});
+
+const userStore = useUserStore();
+
+function handleUnbind() {}
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+
+.bindBankCard-page-wrapper {
+  .bind-bank-card-wrapper {
+    margin: 20px auto 0;
+    width: 660px;
+    height: 360px;
+    padding: 60px 72px;
+    background: linear-gradient(134deg, #6c7ff6 0%, #7996f7 100%);
+    box-shadow: 0px 4 10px 5px rgba(122, 151, 248, 0.3);
+    border-radius: 22px;
+    position: relative;
+    box-sizing: border-box;
+    overflow: hidden;
+
+    .bg-left-top {
+      position: absolute;
+      width: 148px;
+      height: 130px;
+      background-color: #7c8ef7;
+      top: 0;
+      left: 0;
+      border-radius: 0 0 148px 0;
+      z-index: 0;
+    }
+
+    .bind-bank-card-content {
+      display: flex;
+      flex-direction: column;
+      justify-content: space-between;
+      height: 100%;
+      position: relative;
+      z-index: 1;
+
+      .bank-card-name {
+        font-size: 40px;
+        font-weight: 600;
+        color: #ffffff;
+      }
+
+      .bank-card-number {
+        font-size: 32px;
+        color: #ffffff;
+        font-weight: 600;
+      }
+
+      .bank-card-type {
+        font-size: 24px;
+        font-weight: 400;
+        color: rgba(255, 255, 255, 0.5);
+      }
+    }
+
+    .bg-right-bottom {
+      position: absolute;
+      width: 306px;
+      height: 306px;
+      background: #7d98f7;
+      left: 360px;
+      top: 180px;
+      border-radius: 50%;
+      z-index: 0;
+    }
+  }
+
+  .bind-bank-card-tips {
+    margin: 66px auto 0;
+    font-size: 22px;
+    font-weight: 400;
+    text-align: center;
+    color: boleGetCssVar('text-color', 'secondary');
+  }
+}
+</style>
diff --git a/apps/cMiniApp/src/subpackages/wallet/bindBankCard/bindBankCard.config.ts b/apps/cMiniApp/src/subpackages/wallet/bindBankCard/bindBankCard.config.ts
new file mode 100644
index 0000000..305fdb1
--- /dev/null
+++ b/apps/cMiniApp/src/subpackages/wallet/bindBankCard/bindBankCard.config.ts
@@ -0,0 +1,3 @@
+export default definePageConfig({
+  disableScroll: true,
+});
diff --git a/apps/cMiniApp/src/subpackages/wallet/bindBankCard/bindBankCard.vue b/apps/cMiniApp/src/subpackages/wallet/bindBankCard/bindBankCard.vue
new file mode 100644
index 0000000..f3ee2e4
--- /dev/null
+++ b/apps/cMiniApp/src/subpackages/wallet/bindBankCard/bindBankCard.vue
@@ -0,0 +1,18 @@
+<template>
+  <PageLayout class="bindBankCard-page-wrapper" :title="'缁戝畾閾惰鍗�'">
+    <InnerPage></InnerPage>
+  </PageLayout>
+</template>
+
+<script setup lang="ts">
+import { PageLayout } from '@/components';
+import InnerPage from './InnerPage.vue';
+
+defineOptions({
+  name: 'bindBankCard',
+});
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+</style>
diff --git a/apps/cMiniApp/src/subpackages/wallet/incomeDetail/InnerPage.vue b/apps/cMiniApp/src/subpackages/wallet/incomeDetail/InnerPage.vue
new file mode 100644
index 0000000..1c4f0c5
--- /dev/null
+++ b/apps/cMiniApp/src/subpackages/wallet/incomeDetail/InnerPage.vue
@@ -0,0 +1,64 @@
+<template>
+  <List>
+    <IncomeDetailListItem :item="'鏀跺叆:锟�600.00'">
+      <template #title>
+        <div class="income-detail-time-picker">
+          <ChooseInputWithPicker v-model="form.month" :value-enum="TaskStatusText" />
+        </div>
+      </template>
+    </IncomeDetailListItem>
+    <IncomeDetailListItem
+      :title="'鏀跺叆-瀹佹尝浜哄姏鏃犲咖'"
+      :item="'2024.12.20 13:30:30'"
+      :value="'+300.00'"
+      @click="goIncomeDetailInfo()"
+    >
+    </IncomeDetailListItem>
+  </List>
+</template>
+
+<script setup lang="ts">
+import { List, IncomeDetailListItem, ChooseInputWithPicker } from '@12333/components';
+import { TaskStatusText, TaskStatus } from '@/constants';
+import { useUserStore } from '@/stores/modules/user';
+import Taro from '@tarojs/taro';
+
+defineOptions({
+  name: 'InnerPage',
+});
+
+const userStore = useUserStore();
+
+const form = reactive({
+  month: TaskStatus.All,
+});
+
+function goIncomeDetailInfo() {
+  Taro.navigateTo({
+    url: `${RouterPath.incomeDetailInfo}`,
+  });
+}
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+
+.incomeDetail-page-wrapper {
+  .income-detail-time-picker {
+    .nut-input {
+      border-bottom: none;
+      padding: 0;
+
+      .input-text {
+        font-size: 20px;
+        font-weight: 500;
+        height: 28px;
+      }
+
+      .nut-input-right-box {
+        display: none;
+      }
+    }
+  }
+}
+</style>
diff --git a/apps/cMiniApp/src/subpackages/wallet/incomeDetail/incomeDetail.config.ts b/apps/cMiniApp/src/subpackages/wallet/incomeDetail/incomeDetail.config.ts
new file mode 100644
index 0000000..305fdb1
--- /dev/null
+++ b/apps/cMiniApp/src/subpackages/wallet/incomeDetail/incomeDetail.config.ts
@@ -0,0 +1,3 @@
+export default definePageConfig({
+  disableScroll: true,
+});
diff --git a/apps/cMiniApp/src/subpackages/wallet/incomeDetail/incomeDetail.vue b/apps/cMiniApp/src/subpackages/wallet/incomeDetail/incomeDetail.vue
new file mode 100644
index 0000000..9141308
--- /dev/null
+++ b/apps/cMiniApp/src/subpackages/wallet/incomeDetail/incomeDetail.vue
@@ -0,0 +1,18 @@
+<template>
+  <PageLayout class="incomeDetail-page-wrapper" :title="'鏀跺叆鏄庣粏'">
+    <InnerPage></InnerPage>
+  </PageLayout>
+</template>
+
+<script setup lang="ts">
+import { PageLayout } from '@/components';
+import InnerPage from './InnerPage.vue';
+
+defineOptions({
+  name: 'incomeDetail',
+});
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+</style>
diff --git a/apps/cMiniApp/src/subpackages/wallet/incomeDetailInfo/InnerPage.vue b/apps/cMiniApp/src/subpackages/wallet/incomeDetailInfo/InnerPage.vue
new file mode 100644
index 0000000..3b14523
--- /dev/null
+++ b/apps/cMiniApp/src/subpackages/wallet/incomeDetailInfo/InnerPage.vue
@@ -0,0 +1,84 @@
+<template>
+  <div class="income-detail-info-money">
+    <div class="income-detail-info-money-value">
+      <div class="income-detail-info-money-value-unit">锟�</div>
+      <div class="income-detail-info-money-value-num">{{ '33.33' }}</div>
+    </div>
+    <div class="income-detail-info-money-type">{{ '鏀跺叆' }}</div>
+  </div>
+  <List>
+    <ListItem title="娴佹按鍙�" :show-arrow="false">
+      <template #extra>
+        <div class="income-detail-info-value">{{ '5893485943859843095843' }}</div>
+      </template>
+    </ListItem>
+    <ListItem title="浼佷笟鍚嶇О" :show-arrow="false">
+      <template #extra>
+        <div class="income-detail-info-value">{{ '瀹佹尝浜哄姏鏃犲咖' }}</div>
+      </template>
+    </ListItem>
+    <ListItem title="缁撶畻鏃ユ湡" :show-arrow="false">
+      <template #extra>
+        <div class="income-detail-info-value">{{ '2024.11.13' }}</div>
+      </template>
+    </ListItem>
+    <ListItem title="缁撶畻鍗曞唴瀹�" :show-arrow="false">
+      <template #extra>
+        <div class="income-detail-info-value">{{ '33.33鍏�' }}</div>
+      </template>
+    </ListItem>
+    <ListItem title="缁撶畻鍗曞唴瀹�" :show-arrow="false">
+      <template #extra>
+        <div class="income-detail-info-value">{{ '33.33鍏�' }}</div>
+      </template>
+    </ListItem>
+  </List>
+</template>
+
+<script setup lang="ts">
+import { List, ListItem } from '@12333/components';
+import { useUserStore } from '@/stores/modules/user';
+
+defineOptions({
+  name: 'InnerPage',
+});
+
+const userStore = useUserStore();
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+
+.incomeDetailInfo-page-wrapper {
+  .income-detail-info-money {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    flex-direction: column;
+    background-color: #ffffff;
+    padding: 70px 0;
+
+    .income-detail-info-money-value {
+      display: flex;
+      align-items: center;
+      font-weight: 600;
+      color: boleGetCssVar('text-color', 'primary');
+
+      .income-detail-info-money-value-unit {
+        font-size: 32px;
+      }
+
+      .income-detail-info-money-value-num {
+        font-size: 64px;
+      }
+    }
+
+    .income-detail-info-money-type {
+      margin-top: 10px;
+      font-weight: 400;
+      font-size: 28px;
+      color: boleGetCssVar('text-color', 'primary');
+    }
+  }
+}
+</style>
diff --git a/apps/cMiniApp/src/subpackages/wallet/incomeDetailInfo/incomeDetailInfo.config.ts b/apps/cMiniApp/src/subpackages/wallet/incomeDetailInfo/incomeDetailInfo.config.ts
new file mode 100644
index 0000000..305fdb1
--- /dev/null
+++ b/apps/cMiniApp/src/subpackages/wallet/incomeDetailInfo/incomeDetailInfo.config.ts
@@ -0,0 +1,3 @@
+export default definePageConfig({
+  disableScroll: true,
+});
diff --git a/apps/cMiniApp/src/subpackages/wallet/incomeDetailInfo/incomeDetailInfo.vue b/apps/cMiniApp/src/subpackages/wallet/incomeDetailInfo/incomeDetailInfo.vue
new file mode 100644
index 0000000..a318788
--- /dev/null
+++ b/apps/cMiniApp/src/subpackages/wallet/incomeDetailInfo/incomeDetailInfo.vue
@@ -0,0 +1,18 @@
+<template>
+  <PageLayout class="incomeDetailInfo-page-wrapper" :title="'鏀跺叆璇︽儏'">
+    <InnerPage></InnerPage>
+  </PageLayout>
+</template>
+
+<script setup lang="ts">
+import { PageLayout } from '@/components';
+import InnerPage from './InnerPage.vue';
+
+defineOptions({
+  name: 'incomeDetailInfo',
+});
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+</style>
diff --git a/apps/cMiniApp/src/subpackages/wallet/mineWallet/InnerPage.vue b/apps/cMiniApp/src/subpackages/wallet/mineWallet/InnerPage.vue
new file mode 100644
index 0000000..28ae10b
--- /dev/null
+++ b/apps/cMiniApp/src/subpackages/wallet/mineWallet/InnerPage.vue
@@ -0,0 +1,52 @@
+<template>
+  <List>
+    <ListItem title="鏀跺叆鏄庣粏" @click="goIncomeDetail"> </ListItem>
+    <ListItem title="閾惰鍗�" @click="goBankBind">
+      <template #extra>
+        <div class="bind-bank-card">
+          {{ isBinding ? '宸茬粦瀹�' : '鏈粦瀹氥�佺珛鍗崇粦瀹�' }}
+        </div>
+      </template>
+    </ListItem>
+  </List>
+</template>
+
+<script setup lang="ts">
+import { List, ListItem } from '@12333/components';
+import { useUserStore } from '@/stores/modules/user';
+import Taro from '@tarojs/taro';
+import { Message } from '@12333/utils';
+
+defineOptions({
+  name: 'InnerPage',
+});
+
+const userStore = useUserStore();
+
+const isBinding = ref(false);
+
+function goIncomeDetail() {
+  Taro.navigateTo({
+    url: `${RouterPath.incomeDetail}`,
+  });
+}
+function goBankBind() {
+  // Message.confirm({ message: '瀹屾垚瀹炲悕璁よ瘉鍚庢墠鍙繘琛岄摱琛屽崱缁戝畾' }).then(() => {
+  //   Taro.navigateTo({
+  //     url: `${RouterPath.authenticationHome}`,
+  //   });
+  // });
+  Taro.navigateTo({
+    url: `${isBinding.value ? RouterPath.bindBankCard : RouterPath.unboundBankCard}`,
+  });
+}
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+
+.bind-bank-card {
+  color: boleGetCssVar('text-color', 'regular');
+  font-size: 24px;
+}
+</style>
diff --git a/apps/cMiniApp/src/subpackages/wallet/mineWallet/mineWallet.config.ts b/apps/cMiniApp/src/subpackages/wallet/mineWallet/mineWallet.config.ts
new file mode 100644
index 0000000..305fdb1
--- /dev/null
+++ b/apps/cMiniApp/src/subpackages/wallet/mineWallet/mineWallet.config.ts
@@ -0,0 +1,3 @@
+export default definePageConfig({
+  disableScroll: true,
+});
diff --git a/apps/cMiniApp/src/subpackages/wallet/mineWallet/mineWallet.vue b/apps/cMiniApp/src/subpackages/wallet/mineWallet/mineWallet.vue
new file mode 100644
index 0000000..2a730f7
--- /dev/null
+++ b/apps/cMiniApp/src/subpackages/wallet/mineWallet/mineWallet.vue
@@ -0,0 +1,18 @@
+<template>
+  <PageLayout class="mineWallet-page-wrapper" :title="'鎴戠殑閽卞寘'">
+    <InnerPage></InnerPage>
+  </PageLayout>
+</template>
+
+<script setup lang="ts">
+import { PageLayout } from '@/components';
+import InnerPage from './InnerPage.vue';
+
+defineOptions({
+  name: 'mineWallet',
+});
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+</style>
diff --git a/apps/cMiniApp/src/subpackages/wallet/unboundBankCard/InnerPage.vue b/apps/cMiniApp/src/subpackages/wallet/unboundBankCard/InnerPage.vue
new file mode 100644
index 0000000..46e5264
--- /dev/null
+++ b/apps/cMiniApp/src/subpackages/wallet/unboundBankCard/InnerPage.vue
@@ -0,0 +1,135 @@
+<template>
+  <ContentScrollView :paddingH="false">
+    <nut-form :model-value="form" ref="formRef" :rules="rules">
+      <nut-form-item label="鎸佸崱浜�:" class="bole-form-item" prop="name">
+        <nut-input v-model.trim="form.name" placeholder="璇疯緭鍏ユ寔鍗′汉" />
+      </nut-form-item>
+      <nut-form-item label="韬唤璇佸彿:" class="bole-form-item" prop="name">
+        <nut-input v-model.trim="form.name" placeholder="璇疯緭鍏ヨ韩浠借瘉鍙�" />
+      </nut-form-item>
+      <nut-form-item label="閾惰鍗″彿:" class="bole-form-item" prop="name">
+        <nut-input v-model.trim="form.name" placeholder="璇疯緭鍏ラ摱琛屽崱鍙�" />
+      </nut-form-item>
+      <nut-form-item label="寮�鎴疯:" class="bole-form-item" prop="name">
+        <nut-input v-model.trim="form.name" placeholder="璇疯緭鍏ュ紑鎴疯" />
+      </nut-form-item>
+      <nut-form-item label="鎵嬫満鍙�:" class="bole-form-item" prop="phoneNumber" required>
+        <nut-input
+          v-model.trim="form.phoneNumber"
+          class="nut-input-text bole-input-text"
+          placeholder="璇峰~鍐欑粡鍔炰汉鐨勬墜鏈哄彿鐮�"
+          type="text"
+        >
+          <template #right>
+            <ProFormCaptcha
+              :onGetCaptcha="() => onGetCaptcha(form.phoneNumber)"
+              phonePropName="phoneNumber"
+              :validateField="formRef?.validate"
+            ></ProFormCaptcha>
+          </template>
+        </nut-input>
+      </nut-form-item>
+      <nut-form-item label="鐭俊楠岃瘉鐮�:" class="bole-form-item" prop="verificationCode" required>
+        <nut-input
+          v-model.trim="form.verificationCode"
+          class="nut-input-text bole-input-text"
+          placeholder="璇疯緭鍏ラ獙璇佺爜"
+          type="number"
+        />
+      </nut-form-item>
+    </nut-form>
+  </ContentScrollView>
+  <PageFooter>
+    <PageFooterBtn type="primary" @click="handleConfirm">缁戝畾閾惰鍗�</PageFooterBtn>
+  </PageFooter>
+</template>
+
+<script setup lang="ts">
+import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types';
+import { ProFormCaptcha } from 'senin-mini/components';
+import { Message } from '@12333/utils';
+import { VerificationCodeBusinessType } from '@12333/constants';
+import * as commonServices from '@12333/services/api/Common';
+import * as userResumeServices from '@12333/services/api/userResume';
+import Taro from '@tarojs/taro';
+import { useQuery } from '@tanstack/vue-query';
+
+defineOptions({
+  name: 'InnerPage',
+});
+
+const form = reactive({
+  name: '',
+  phoneNumber: '',
+  verificationCode: '',
+});
+
+const {
+  isLoading,
+  isError,
+  data: detail,
+  refetch,
+} = useQuery({
+  queryKey: ['userResumeServices/getUserResumeBaseInfo'],
+  queryFn: async () => {
+    return await userResumeServices.getUserResumeBaseInfo({
+      showLoading: false,
+    });
+  },
+  placeholderData: () => ({} as API.UserResumeBaseInfoOutput),
+  onSuccess(data) {
+    form.name = data.name;
+    form.phoneNumber = data.phoneNumber;
+  },
+});
+
+const rules = reactive<FormRules>({
+  name: [{ required: true, message: '璇疯緭鍏ユ寔鍗′汉' }],
+  phoneNumber: [{ required: true, message: '璇疯緭鍏ユ墜鏈哄彿' }],
+});
+
+async function onGetCaptcha(phoneNumber: string) {
+  await commonServices.sendPhoneCertificationVerificationCode(
+    {
+      name: form.name,
+      identity: form.name,
+      mobile: form.phoneNumber,
+      businessType: VerificationCodeBusinessType.UserCertificationPhoneCertification,
+    },
+    { showLoading: false }
+  );
+}
+
+const formRef = ref<any>(null);
+function handleConfirm() {
+  if (!formRef.value) return;
+  formRef.value.validate().then(({ valid, errors }: any) => {
+    if (valid) {
+      confirm();
+    }
+  });
+}
+
+async function confirm() {
+  try {
+    let params: API.SaveUserResumeBaseInfoInput = {
+      name: form.name,
+      phoneNumber: form.phoneNumber,
+    };
+    let res = await userResumeServices.saveUserResumeBaseInfo(params);
+    if (res) {
+      Message.success('淇濆瓨鎴愬姛', {
+        onClosed() {
+          Taro.navigateTo({
+            url: `${RouterPath.mineCurriculumVitae}`,
+          });
+        },
+      });
+    }
+  } catch (error) {}
+}
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+</style>
diff --git a/apps/cMiniApp/src/subpackages/wallet/unboundBankCard/unboundBankCard.config.ts b/apps/cMiniApp/src/subpackages/wallet/unboundBankCard/unboundBankCard.config.ts
new file mode 100644
index 0000000..305fdb1
--- /dev/null
+++ b/apps/cMiniApp/src/subpackages/wallet/unboundBankCard/unboundBankCard.config.ts
@@ -0,0 +1,3 @@
+export default definePageConfig({
+  disableScroll: true,
+});
diff --git a/apps/cMiniApp/src/subpackages/wallet/unboundBankCard/unboundBankCard.vue b/apps/cMiniApp/src/subpackages/wallet/unboundBankCard/unboundBankCard.vue
new file mode 100644
index 0000000..0108c1a
--- /dev/null
+++ b/apps/cMiniApp/src/subpackages/wallet/unboundBankCard/unboundBankCard.vue
@@ -0,0 +1,17 @@
+<template>
+  <PageLayout class="unboundBankCard-page-wrapper" title="缁戝畾閾惰鍗�" has-border>
+    <InnerPage></InnerPage>
+  </PageLayout>
+</template>
+
+<script setup lang="ts">
+import InnerPage from './InnerPage.vue';
+
+defineOptions({
+  name: 'unboundBankCard',
+});
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+</style>
diff --git a/packages/components/src/List/IncomeDetailListItem.vue b/packages/components/src/List/IncomeDetailListItem.vue
new file mode 100644
index 0000000..886542f
--- /dev/null
+++ b/packages/components/src/List/IncomeDetailListItem.vue
@@ -0,0 +1,78 @@
+<template>
+  <div class="income-detail-list-item">
+    <div class="income-detail-list-item-inner" :class="{ 'border-none': !showBorder }">
+      <slot name="title">
+        <div class="income-detail-list-item-title">{{ title }}</div>
+      </slot>
+      <div class="income-detail-list-item-content">
+        <div class="income-detail-list-item-content-item">{{ item }}</div>
+        <div class="income-detail-list-item-content-value" v-if="showValue">{{ value }}</div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+defineOptions({
+  name: 'IncomeDetailListItem',
+});
+
+type Props = {
+  title?: string;
+  item?: string;
+  value?: string;
+  showValue?: boolean;
+  showBorder?: boolean;
+};
+
+const props = withDefaults(defineProps<Props>(), {
+  showValue: true,
+  showBorder: true,
+});
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+
+.income-detail-list-item {
+  padding: 0 boleGetCssVar('size', 'body-padding-h');
+
+  .income-detail-list-item-inner {
+    padding: 24px 0 18px;
+    border-bottom: 1px solid #f6f6f6;
+    display: flex;
+    flex-direction: column;
+
+    &.border-none {
+      border-bottom: none;
+    }
+
+    .income-detail-list-item-title {
+      font-weight: 400;
+      font-size: 24px;
+      color: boleGetCssVar('text-color', 'primary');
+      line-height: 34px;
+    }
+
+    .income-detail-list-item-content {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+
+      .income-detail-list-item-content-item {
+        font-weight: 400;
+        font-size: 20px;
+        color: boleGetCssVar('text-color', 'secondary');
+        line-height: 44px;
+      }
+
+      .income-detail-list-item-content-value {
+        font-weight: 500;
+        font-size: 30px;
+        color: boleGetCssVar('text-color', 'primary');
+        line-height: 44px;
+      }
+    }
+  }
+}
+</style>
diff --git a/packages/components/src/index.ts b/packages/components/src/index.ts
index 1d6af42..8702eca 100644
--- a/packages/components/src/index.ts
+++ b/packages/components/src/index.ts
@@ -8,6 +8,7 @@
 export { default as ProTabPane } from './Tabs/ProTabPane.vue';
 export { default as List } from './List/List.vue';
 export { default as ListItem } from './List/ListItem.vue';
+export { default as IncomeDetailListItem } from './List/IncomeDetailListItem.vue';
 export { default as NumberInput } from './Input/NumberInput.vue';
 export { default as ChooseInputWithPicker } from './Input/ChooseInputWithPicker.vue';
 export { default as ChooseInputWithDatePicker } from './Input/ChooseInputWithDatePicker.vue';
diff --git a/packages/services/api/typings.d.ts b/packages/services/api/typings.d.ts
index 58ea6e5..b4ce2de 100644
--- a/packages/services/api/typings.d.ts
+++ b/packages/services/api/typings.d.ts
@@ -852,7 +852,7 @@
 
   type FlexTaskSettleTypeEnum = 10 | 20 | 30;
 
-  type FlexTaskWorkerHireEnum = 10 | 20 | 30;
+  type FlexTaskWorkerHireEnum = 1 | 10 | 20 | 30 | 40;
 
   type FlexWorkerEleSignEnum = 10 | 20 | 30;
 

--
Gitblit v1.9.1