wzy 1 年間 前
コミット
afcba896bb
59 ファイル変更2639 行追加145 行削除
  1. 3 0
      App.vue
  2. 20 0
      config/modules/user.js
  3. 33 7
      pages.json
  4. 4 4
      pages/tabbar/index/data.js
  5. 112 78
      pages/tabbar/index/index.scss
  6. 10 4
      pages/tabbar/index/index.vue
  7. 229 0
      pages/tabbar/newUser/index.scss
  8. 241 0
      pages/tabbar/newUser/index.vue
  9. 12 4
      pages/tabbar/order/index.scss
  10. 6 3
      pages/tabbar/order/index.vue
  11. 5 2
      pages/tabbar/user/index.vue
  12. 3 2
      pages_module/financial/index.vue
  13. 4 0
      pages_module/receiving/index.scss
  14. 5 1
      pages_module/scanCoupons/index.vue
  15. 63 37
      pages_module/withdrawal/index.vue
  16. BIN
      static/image/home/decline-icon.png
  17. BIN
      static/image/home/green-more.png
  18. BIN
      static/image/home/green.png
  19. BIN
      static/image/home/red.png
  20. BIN
      static/image/home/rise-icon.png
  21. BIN
      static/image/home/tobe_1.png
  22. BIN
      static/image/home/tobe_2.png
  23. BIN
      static/image/home/tobe_6.png
  24. BIN
      static/image/home/tobe_7.png
  25. BIN
      static/image/home/tobe_8.png
  26. BIN
      static/image/user/account_01.png
  27. BIN
      static/image/user/account_02.png
  28. BIN
      static/image/user/account_03.png
  29. BIN
      static/image/user/account_04.png
  30. BIN
      static/image/user/balance_bg.png
  31. BIN
      static/image/user/consumptionPrice_bg.png
  32. BIN
      static/image/user/money-bg.png
  33. BIN
      static/image/user/notice.png
  34. BIN
      static/image/user/platformBalance_bg.png
  35. BIN
      static/image/user/switch.png
  36. BIN
      static/image/user/user-bg.png
  37. BIN
      static/image/user/user_icon1.png
  38. BIN
      static/image/user/user_icon2.png
  39. BIN
      static/image/user/user_icon3.png
  40. BIN
      static/image/user/user_icon4.png
  41. BIN
      static/image/user/user_icon5.png
  42. BIN
      static/image/user/voucherPrice_bg.png
  43. 158 0
      user_module/balance/index.scss
  44. 159 0
      user_module/balance/index.vue
  45. 1 1
      user_module/businessInfo/index.vue
  46. 1 0
      user_module/changeLogo/index.vue
  47. 4 1
      user_module/codeDetail/index.scss
  48. 161 0
      user_module/consumptionPrice/index.scss
  49. 150 0
      user_module/consumptionPrice/index.vue
  50. 15 0
      user_module/memberManage/index.scss
  51. 10 1
      user_module/memberManage/index.vue
  52. 158 0
      user_module/platformBalance/index.scss
  53. 155 0
      user_module/platformBalance/index.vue
  54. 107 0
      user_module/voucherPrice/components/rechargePopup/index.scss
  55. 105 0
      user_module/voucherPrice/components/rechargePopup/index.vue
  56. 121 0
      user_module/voucherPrice/components/transferPopup/index.scss
  57. 185 0
      user_module/voucherPrice/components/transferPopup/index.vue
  58. 197 0
      user_module/voucherPrice/index.scss
  59. 202 0
      user_module/voucherPrice/index.vue

+ 3 - 0
App.vue

@@ -15,5 +15,8 @@
 
 <style>
 	/* 每个页面公共css */
+ .transfer-box .tui-modal__container{
+    height: unset !important;
+}
 </style>
 

+ 20 - 0
config/modules/user.js

@@ -28,4 +28,24 @@ export function getFinanceCount(data) {
   // 获取会员列表 
   export function getBuyerList(data){
     return request(`/index/buyerList`, data, "POST");
+  }
+
+
+  /* 代金券模块~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+
+  // 搜索转增人物
+  export function getBandUserInfoApi(params){
+    return request(`/buyerVoucherEntryRecord/getBandUse`, params, "GET");
+  }
+
+  //  转增
+  export function bandUserInfoApi(data){
+    return request(`/shopVoucherEntryRecord/transferVoucher`, data, "POST");
+  }
+
+
+  // 代金券充值 提交订单
+  export function voucherOrderApi(data){
+    return request(`/shopVoucherEntryRecord/submitVoucher`, data, "POST");
   }

+ 33 - 7
pages.json

@@ -31,7 +31,8 @@
       }
     },
     {
-      "path": "pages/tabbar/user/index",
+    //   "path": "pages/tabbar/user/index",
+      "path": "pages/tabbar/newUser/index",
       "style": {
         "navigationBarTitleText": "个人中心",
         "navigationStyle": "custom"
@@ -163,13 +164,37 @@
 						"navigationBarTitleText": "修改成功"
 					}
 				},
+        // {
+				// 	"path": "myAccount/index",
+				// 	"style": {
+				// 		"navigationBarTitleText": "我的账户",
+        //     "navigationStyle":"custom"
+				// 	}
+				// },
         {
-					"path": "myAccount/index",
+          "path": "balance/index",
 					"style": {
-						"navigationBarTitleText": "我的账户",
-            "navigationStyle":"custom"
+						"navigationBarTitleText": "余额"
 					}
-				},
+        },
+        {
+          "path": "consumptionPrice/index",
+					"style": {
+						"navigationBarTitleText": "消费金"
+					}
+        },
+        {
+          "path": "voucherPrice/index",
+					"style": {
+						"navigationBarTitleText": "代金券"
+					}
+        },
+        {
+          "path": "platformBalance/index",
+					"style": {
+						"navigationBarTitleText": "平台余额"
+					}
+        },
         {
           "path": "memberManage/index",
 					"style": {
@@ -229,10 +254,11 @@
 				"selectedIconPath": "static/image/tab-icon/order-active.png"
       },
       {
-        "pagePath": "pages/tabbar/user/index",
+        // "pagePath": "pages/tabbar/user/index",
+        "pagePath": "pages/tabbar/newUser/index",
         "text": "我的",
         "iconPath": "static/image/tab-icon/user.png",
-				"selectedIconPath": "static/image/tab-icon/user-active.png"
+		"selectedIconPath": "static/image/tab-icon/user-active.png"
       }
     ]
   },

+ 4 - 4
pages/tabbar/index/data.js

@@ -67,25 +67,25 @@ export const statisticsList =  [
     {
         title: "今日成交金额",
         price: "todayAmount",
-        proportion: "",
+        proportion: "",
         state: 0
     },
     {
         title: "今日成交订单量",
         price: "todayOrder",
-        proportion: "",
+        proportion: "",
         state: 0
     },
     {
         title: "今日核销金额",
         price: "todayWriteAmount",
-        proportion: "",
+        proportion: "",
         state: 1
     },
     {
         title: "今日核销订单",
         price: "todayWriteOrder",
-        proportion: "",
+        proportion: "",
         state: 2
     },
 ]

+ 112 - 78
pages/tabbar/index/index.scss

@@ -54,7 +54,8 @@
     padding: 28rpx 0;
     box-sizing: border-box;
     width: 100%;
-    height: 479rpx;
+    // height: 479rpx;
+    height: 352rpx;
     @include flex(center, column,30rpx);
     background: rgba(255, 255, 255, 0.8);
     .main-tool {
@@ -88,7 +89,6 @@
       .tube-list{
         @include flex(center);
         flex-wrap: wrap;
-        margin-top: 40rpx;
         .tube-item{
             width: 25%;
             @include flex(center,column,10rpx);
@@ -150,10 +150,12 @@
     box-sizing: border-box;
     @include flex(space-between);
     margin: 32rpx 0;
+    margin-bottom: 14rpx;
 
     .summarize-left {
       font-size: 36rpx;
-      color: #3d3d3d;
+      font-weight: 600;
+      color: #333333;
     }
 
     .summarize-right {
@@ -162,95 +164,127 @@
       color: #999999;
     }
   }
-
-  .statistics-list {
-    @include flex(space-between, null, 18rpx);
-    flex-wrap: wrap;
+  .data-list{
+    width: 100%;
     padding: 0 12rpx;
     box-sizing: border-box;
-
-    .statistics-item {
+    @include flex(space-between,null,null);
+    flex-wrap: wrap;
+    .data-box{
+      margin-top: 18rpx;
       width: 354rpx;
-      height: 286rpx;
-      padding: 32rpx;
-      box-sizing: border-box;
-      background-color: #fff;
+      height: 248rpx;
       border-radius: 28rpx;
-
-      .statistics-trans {
-        color: #666666;
-        font-size: 28rpx;
-        margin-bottom: 24rpx;
+      background-color: #ffffff;
+      // padding: 32rpx 0;
+      // padding-left: 32rpx;
+      padding: 32rpx 32rpx 100rpx 32rpx;
+      box-sizing: border-box;
+      @include flex(space-between,column,null);
+      align-items: flex-start;
+      text{
+        &:nth-of-type(1){
+          font-size: 28rpx;
+          font-weight: 500;
+          color: #666666;
+        }
+        &:nth-of-type(2){
+          font-size: 36rpx;
+          color: #FA6D30;
+          font-weight: 600;
+        }
       }
+    }
+  }
 
-      .statistics-price {
-        @include flex(space-between);
+  // .statistics-list {
+  //   @include flex(space-between, null, 18rpx);
+  //   flex-wrap: wrap;
+  //   padding: 0 12rpx;
+  //   box-sizing: border-box;
 
-        .price {
-          color: #333333;
-          font-size: 36rpx;
-        }
+  //   .statistics-item {
+  //     width: 354rpx;
+  //     height: 286rpx;
+  //     padding: 32rpx;
+  //     box-sizing: border-box;
+  //     background-color: #fff;
+  //     border-radius: 28rpx;
 
-        .text {
-          margin-right: 10rpx;
-          color: #666666;
-          font-size: 24rpx;
-        }
-      }
+  //     .statistics-trans {
+  //       color: #666666;
+  //       font-size: 28rpx;
+  //       margin-bottom: 24rpx;
+  //     }
+
+  //     .statistics-price {
+  //       @include flex(space-between);
+
+  //       .price {
+  //         color: #333333;
+  //         font-size: 36rpx;
+  //       }
+
+  //       .text {
+  //         margin-right: 10rpx;
+  //         color: #666666;
+  //         font-size: 24rpx;
+  //       }
+  //     }
 
-      .proportion {
+  //     .proportion {
         
-        @include flex(flex-end);
-        margin: 20rpx 0 12rpx;
-        display: none;
-        .proportion-box { 
-          @include flex(center, null, 5rpx);
+  //       @include flex(flex-end);
+  //       margin: 20rpx 0 12rpx;
+  //       display: none;
+  //       .proportion-box { 
+  //         @include flex(center, null, 5rpx);
 
-          text {
-            font-size: 28rpx;
-          }
+  //         text {
+  //           font-size: 28rpx;
+  //         }
 
-          image {
-            width: 20rpx;
-            height: 28rpx;
-            display: block;
-          }
-        }
-      }
+  //         image {
+  //           width: 20rpx;
+  //           height: 28rpx;
+  //           display: block;
+  //         }
+  //       }
+  //     }
 
-      .chart-img {
-        width: 100%;
-        height: 80rpx;
-        margin-top: 30rpx;
-        image {
-          width: 100%;
-          height: 100%;
-        }
-      }
+  //     .chart-img {
+  //       width: 100%;
+  //       height: 80rpx;
+  //       margin-top: 30rpx;
+  //       image {
+  //         width: 100%;
+  //         height: 100%;
+  //       }
+  //     }
 
-      .empty {
-        position: relative;
-        width: 100%;
-        height: 135rpx;
+  //     .empty {
+  //       position: relative;
+  //       width: 100%;
+  //       height: 135rpx;
 
-        .left {
-          position: absolute;
-          right: 25rpx;
-          top: 20rpx;
-          width: 28rpx;
-          height: 5rpx;
-          background-color: #666666;
-        }
+  //       .left {
+  //         position: absolute;
+  //         right: 25rpx;
+  //         top: 20rpx;
+  //         width: 28rpx;
+  //         height: 5rpx;
+  //         background-color: #666666;
+  //       }
 
-        .bottom {
-          width: 100%;
-          position: absolute;
-          left: 0;
-          bottom: 0;
-          height: 5rpx;
-          background-color: #666666;
-        }
-      }
-    }
-  }
+  //       .bottom {
+  //         width: 100%;
+  //         position: absolute;
+  //         left: 0;
+  //         bottom: 0;
+  //         height: 5rpx;
+  //         background-color: #666666;
+  //       }
+  //     }
+  //   }
+  // }
 }

+ 10 - 4
pages/tabbar/index/index.vue

@@ -59,10 +59,17 @@
       <view class="summarize-left">经营概括</view>
       <view class="summarize-right" @click="navigateTo('/pages_module/operateData/index')">
         <text>更多</text>
-        <tui-icon name="arrowright" :size="24"></tui-icon>
+        <tui-icon name="arrowright" :size="22"></tui-icon>
       </view>
     </view>
-    <view class="statistics-list">
+    <view class="data-list">
+      <view class="data-box" v-for="(item,index) in statisticsList" :key="index">
+        <text>{{ item.title }}</text>
+        <text>{{todayData[item.price]?todayData[item.price]:'0' + item.proportion}}</text>
+      </view>
+    </view>
+    <!-- <view class=""></view> -->
+    <!-- <view class="statistics-list">
       <view
         class="statistics-item"
         v-for="(item, index) in statisticsList"
@@ -71,7 +78,6 @@
         <view class="statistics-trans">{{ item.title }}</view>
         <view class="statistics-price">
           <view class="price">{{ todayData[item.price] >= 0 && !Object.is(todayData[item.price], null) ? todayData[item.price] : '--' }}</view>
-          <!-- <view class="text">较昨日</view> -->
         </view>
         <view class="proportion" v-if="item.state !== 2">
           <view class="proportion-box">
@@ -108,7 +114,7 @@
           <view class="bottom"></view>
         </view>
       </view>
-    </view>
+    </view> -->
   </view>
 </template>
 

+ 229 - 0
pages/tabbar/newUser/index.scss

@@ -0,0 +1,229 @@
+%relatedItem {
+  width: 100%;
+  height: 108rpx;
+  border-bottom: 2rpx solid #f1f1f1;
+  @include flex(space-between, null, null);
+  .item-left {
+    @include flex(center, null, 16rpx);
+    image {
+      width: 44rpx;
+      height: 44rpx;
+      display: block;
+    }
+    text {
+      font-size: 28rpx;
+      color: rgba(0, 0, 0, 0.9);
+    }
+  }
+  .item-right {
+    @include flex(center, null, 20rpx);
+    text {
+      font-size: 24rpx;
+      font-weight: 500;
+      color: rgba(0, 0, 0, 0.6);
+    }
+  }
+}
+
+.user {
+  width: 100vw;
+  min-height: 100vh;
+  background-color: rgb(247, 247, 247);
+  position: relative;
+  .pos-box {
+    position: relative;
+    z-index: 2;
+    box-sizing: border-box;
+    .user-top {
+      width: 100%;
+      color: #000000;
+      font-size: 32rpx;
+      @include flex(center, null, null);
+    }
+    .box-container {
+      margin-top: 48rpx;
+      padding: 0 32rpx;
+      box-sizing: border-box;
+      .user-info {
+        width: 100%;
+        @include flex(null, null, 32rpx);
+        position: relative;
+        .info-image {
+          position: relative;
+          .img {
+            width: 128rpx;
+            height: 128rpx;
+            padding: 5rpx;
+            box-sizing: border-box;
+            border-radius: 50%;
+            background-color: rgb(255, 255, 255);
+            @include flex(center);
+            image {
+              width: 118rpx;
+              height: 118rpx;
+              border-radius: 50%;
+            }
+          }
+          .info-switch {
+            width: 32rpx;
+            height: 32rpx;
+            position: absolute;
+            right: 6rpx;
+            bottom: 0;
+            image {
+              width: 100%;
+              height: 100%;
+            }
+          }
+        }
+        .info-text {
+          height: 128rpx;
+          padding-top: 16rpx;
+          box-sizing: border-box;
+          @include flex(space-between, column, null);
+          align-items: flex-start;
+          .text-title {
+            color: rgba(0, 0, 0, 0.9);
+            font-weight: 600;
+            font-size: 36rpx;
+          }
+          .text-name {
+            background: rgba(255, 255, 255, 0.4);
+            padding: 8rpx 16rpx;
+            color: #3d3d3d;
+            font-size: 24rpx;
+            border-radius: 40rpx;
+            text {
+              &:nth-of-type(1) {
+                margin-right: 16rpx;
+              }
+            }
+          }
+        }
+        .notice {
+          width: 48rpx;
+          height: 48rpx;
+          position: absolute;
+          top: 10rpx;
+          right: 8rpx;
+        }
+      }
+      .user-money {
+        width: 100%;
+        height: 260rpx;
+        position: relative;
+        margin-top: 32rpx;
+        border-radius: 16rpx;
+        background: linear-gradient(180deg, #fff4f0 0%, #ffffff 17%);
+        .money-bg {
+          position: absolute;
+          top: 0;
+          left: 0;
+          width: 100%;
+          height: 260rpx;
+          image {
+            width: 100%;
+            height: 260rpx;
+          }
+        }
+        .money-container {
+          width: 100%;
+          height: 100%;
+          padding: 0 32rpx;
+          box-sizing: border-box;
+          padding-top: 48rpx;
+          box-sizing: border-box;
+          .money-top {
+            @include flex(center, null, null);
+            .top-box {
+              flex: 1;
+              @include flex(center, column, 8rpx);
+              text {
+                &:nth-of-type(1) {
+                  font-size: 36rpx;
+                  color: #ef530e;
+                  font-weight: 600;
+                }
+                &:nth-of-type(2) {
+                  font-size: 28rpx;
+                  color: rgba(0, 0, 0, 0.4);
+                }
+              }
+            }
+          }
+          .money-bottom {
+            width: 100%;
+            height: 76rpx;
+            border-top: 2rpx solid #f1f1f1;
+            @include flex(space-between, null, null);
+            margin-top: 44rpx;
+            view {
+              font-size: 24rpx;
+              &:nth-of-type(1) {
+                color: rgba(0, 0, 0, 0.9);
+              }
+              &:nth-of-type(2) {
+                @include flex(center, null, 4rpx);
+                color: rgba(0, 0, 0, 0.4);
+              }
+            }
+          }
+        }
+      }
+      .user-account {
+        width: 100%;
+        height: 160rpx;
+        padding: 32rpx;
+        box-sizing: border-box;
+        border-radius: 16rpx;
+        @include flex(space-between, null);
+        background-color: #ffffff;
+        margin-top: 32rpx;
+        .account-item {
+          flex: 1;
+          @include flex(center, column, 20rpx);
+          image {
+            width: 48rpx;
+            height: 48rpx;
+          }
+          text {
+            font-size: 28rpx;
+            color: rgba(0, 0, 0, 0.4);
+          }
+        }
+      }
+      .user-related {
+        margin-top: 32rpx;
+        width: 100%;
+        border-radius: 16rpx;
+        padding: 0 32rpx;
+        box-sizing: border-box;
+        background-color: #ffffff;
+        .related-item {
+          @extend %relatedItem;
+        }
+      }
+      .user-setup {
+        margin-top: 32rpx;
+        width: 100%;
+        border-radius: 16rpx;
+        padding: 0 32rpx;
+        box-sizing: border-box;
+        background-color: #ffffff;
+        .related-item {
+          @extend %relatedItem;
+        }
+      }
+    }
+  }
+
+  .bg-box {
+    width: 100vw;
+    position: absolute;
+    top: 0;
+    left: 0;
+    image {
+      width: 100vw;
+    }
+  }
+}

+ 241 - 0
pages/tabbar/newUser/index.vue

@@ -0,0 +1,241 @@
+<template>
+  <view class="user">
+    <view class="bg-box">
+      <image class="" src="@/static/image/user/user-bg.png" mode="widthFix" />
+    </view>
+    <view class="pos-box">
+      <capsule :showBorder="true" bgColor="transparent">
+        <template v-slot:top>
+          <view class="user-top">我的</view>
+        </template>
+      </capsule>
+      <view class="box-container">
+        <view class="user-info">
+          <view class="info-image">
+            <view class="img" @click="navigateTo('/user_module/changeLogo/index')">
+              <image
+                class=""
+                :src="shopInfo.shopLogo"
+              />
+            </view>
+            <view class="info-switch">
+              <image class="" src="@/static/image/user/switch.png" />
+            </view>
+          </view>
+          <view class="info-text">
+            <view class="text-title">{{ shopInfo.shopName }}</view>
+            <view class="text-name">
+              <text>负责人:{{ shopInfo.shopReturn.returnPerson || '--' }}</text>
+              <text>{{ shopInfo.shopPhone }}</text>
+            </view>
+          </view>
+          <image class="notice" src="@/static/image/user/notice.png" />
+        </view>
+        <view class="user-money">
+          <view class="money-bg">
+            <image src="@/static/image/user/money-bg.png" />
+          </view>
+          <view class="money-container">
+            <view class="money-top">
+              <view class="top-box">
+                <text>{{ rechargeAllRealIncome || 0 }}</text>
+                <text>余额</text>
+              </view>
+              <view class="top-box">
+                <text>{{ withdrawalIn || 0 }}</text>
+                <text>消费金</text>
+              </view>
+              <view class="top-box">
+                <text>{{ voucherWithdrawalIn || 0 }}</text>
+                <text>代金券</text>
+              </view>
+              <view class="top-box">
+                <text>{{ rechargeWithdrawalIn || 0 }}</text>
+                <text>平台余额</text>
+              </view>
+            </view>
+            <view class="money-bottom">
+              <view>收入明细</view>
+              <view>
+                <text>去查看</text>
+                <tui-icon
+                  name="arrowright"
+                  color="rgba(0, 0, 0, 0.4)"
+                  :size="18"
+                ></tui-icon>
+              </view>
+            </view>
+          </view>
+        </view>
+        <view class="user-account">
+          <view
+            class="account-item"
+            v-for="(item, index) in accountList"
+            :key="index"
+            @click="userAccount(item)"
+          >
+            <image :src="item.image" />
+            <text>{{ item.title }}</text>
+          </view>
+        </view>
+        <view class="user-related">
+          <view
+            class="related-item"
+            v-for="item in relatedList"
+            :key="item.title"
+            @click="userAccount(item)"
+          >
+            <view class="item-left">
+              <image :src="item.image" />
+              <text>{{ item.title }}</text>
+            </view>
+            <view class="item-right">
+              <!-- <text>¥{{ financeInfo[item.name] }}</text> -->
+              <tui-icon name="arrowright" color="#000" :size="18"></tui-icon>
+            </view>
+          </view>
+        </view>
+        <view class="user-setup">
+          <view
+            class="related-item"
+            @click="navigateTo('/user_module/businessInfo/index')"
+          >
+            <view class="item-left">
+              <image src="@/static/image/user/user_icon5.png" />
+              <text>设置</text>
+            </view>
+            <view class="item-right">
+              <tui-icon name="arrowright" color="#000" :size="18"></tui-icon>
+            </view>
+          </view>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+import { getFinanceCount, getShopDetail } from "@/config/index.js";
+
+export default {
+  created() {
+    this.getFinance();
+  },
+  onShow() {
+    //  本地获取店铺信息
+    this.shopInfo = uni.getStorageSync("shopInfo");
+    //  如果没有店铺信息 请求店铺信息
+    if (!this.shopInfo) {
+      this.getShop();
+    }
+  },
+  data() {
+    return {
+      shopInfo: null,
+      turnover: 0,
+      frozenMoney: 0,
+      withdrawableMoney: 0,
+      rechargeWithdrawalIn:0,
+      //  总流水
+      financeInfo:{},
+      accountList: [
+        // {
+        //   title: "商家入驻",
+        //   image: require("@/static/image/user/account_01.png"),
+        //   url: "/user_module/webview/index?type=1",
+        // },
+        {
+          title: "商家码",
+          image: require("@/static/image/user/account_02.png"),
+          url: "/user_module/merchantCode/index",
+        },
+        {
+          title: "会员管理",
+          image: require("@/static/image/user/account_03.png"),
+          url: "/user_module/memberManage/index",
+        },
+        {
+          title: "官方客服",
+          image: require("@/static/image/user/account_04.png"),
+          url: "/user_module/webview/index?type=2",
+        },
+      ],
+      relatedList: [
+        {
+          title: "余额",
+          image: require("@/static/image/user/user_icon1.png"),
+          url:"/user_module/balance/index?type=4",
+          name:"rechargeAllRealIncome"
+        },
+        {
+          title: "消费金",
+          image: require("@/static/image/user/user_icon2.png"),
+          url:"/user_module/consumptionPrice/index",
+          name:"withdrawalIn"
+        },
+        {
+          title: "代金券",
+          image: require("@/static/image/user/user_icon3.png"),
+          url:"/user_module/voucherPrice/index",
+          name:"voucherWithdrawalIn"
+        },
+        {
+          title: "平台余额",
+          image: require("@/static/image/user/user_icon4.png"),
+          url:"/user_module/platformBalance/index",
+          // name:"platformBalance"
+        },
+      ],
+    };
+  },
+  methods: {
+    // 获取流水
+    async getFinance() {
+      let res = await getFinanceCount({ condition: "1", time: "",paymentMode:4 });
+      this.financeInfo = res.data;
+      this.animateNumber("turnover", res.data.turnover);
+      this.animateNumber("frozenMoney", res.data.frozenMoney);
+      this.animateNumber("withdrawableMoney", res.data.withdrawableMoney);
+      this.animateNumber("rechargeWithdrawalIn", res.data.rechargeWithdrawalIn);
+    },
+    //  获取店铺详情
+    async getShop() {
+      let { data } = await getShopDetail({});
+      this.shopInfo = data;
+      //  将店铺存到本地
+      uni.setStorageSync("shopInfo", data);
+    },
+    //  流水动画
+    animateNumber(str, targetNum) {
+      const duration = 2000; // 动画时长,单位毫秒
+      const interval = 20; // 动画间隔时间,单位毫秒
+      const distance = targetNum - this[str];
+      const steps = duration / interval;
+      const step = distance / steps;
+
+      let currentStep = 0;
+      const timer = setInterval(() => {
+        if (!targetNum) return;
+        currentStep++;
+        this[str] = parseFloat((this[str] + step).toFixed(2));
+        if (currentStep >= steps) {
+          this[str] = targetNum;
+          clearInterval(timer);
+        }
+      }, interval);
+    },
+    // 下方功能页面跳转
+    userAccount(item) {
+      if (!item.url) {
+        this.$showToast("功能暂未开放");
+        return;
+      }
+      this.navigateTo(item.url);
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+@import "./index.scss";
+</style>

+ 12 - 4
pages/tabbar/order/index.scss

@@ -2,7 +2,12 @@
   width: 100vw;
   min-height: 100vh;
   background-color: rgb(247, 247, 247);
-
+.fixed-box{
+  width: 100%;
+  position: sticky;
+  top: 0;
+  left: 0;
+}
   .order-box {
     width: 100%;
     height: 100%;
@@ -185,13 +190,16 @@
     @include flex(center,column,32rpx);
     font-size: 32rpx;
     image{
-      width: 460rpx;
-      height: 460rpx;
+      width: 320rpx;
+      height: 320rpx;
     }
     .empty-title{
-      color: #666666;
+      font-size: 28rpx;
+      // color: #666666;
+      color: #999999;
     }
     .empty-info{
+      font-size: 28rpx;
       color: #999999;
     }
   }

+ 6 - 3
pages/tabbar/order/index.vue

@@ -1,6 +1,7 @@
 <template>
   <view class="order">
-    <capsule :showBorder="true" bgColor="#FFFFFF">
+    <view class="fixed-box">
+      <capsule :showBorder="true" bgColor="#FFFFFF">
       <template v-slot:top>
         <view class="order-box">订单列表</view>
       </template>
@@ -25,6 +26,8 @@
         </scroll-view>
       </view>
     </view>
+    </view>
+    
     <view class="order-container" v-if="orderList.length > 0">
       <view class="order-list">
         <view
@@ -98,8 +101,8 @@
     </view>
     <view class="order-empty" v-else>
       <image src="@/static/image/order/empty.png" />
-      <view class="empty-title">暂无订单信息</view>
-      <view class="empty-info">有订单信息您会在这边看到的</view>
+      <view class="empty-title">暂无订单信息...</view>
+      <!-- <view class="empty-info">有订单信息您会在这边看到的</view> -->
     </view>
   </view>
 </template>

+ 5 - 2
pages/tabbar/user/index.vue

@@ -31,7 +31,7 @@
         <view class="info-text">
           <view class="text-title">{{ shopInfo.shopName }}</view>
           <view class="text-lable">
-            <view class="lable">{{ shopInfo.shopReturn.returnPerson }}</view>
+            <view class="lable">{{ shopInfo.shopReturn.returnPerson || '--' }}</view>
             <view class="lable">{{ shopInfo.shopPhone }}</view>
           </view>
         </view>
@@ -53,7 +53,10 @@
         </view>
       </view>
       <view class="user-account">
-        <view class="account-top" @click="navigateTo('/user_module/myAccount/index')">
+        <view
+          class="account-top"
+          @click="navigateTo('/user_module/myAccount/index')"
+        >
           <text>我的账户</text>
           <tui-icon name="arrowright" :size="26" colo="#666666"></tui-icon>
         </view>

+ 3 - 2
pages_module/financial/index.vue

@@ -2,10 +2,10 @@
   <view class="financial">
     <view class="financial-box">
       <view class="drawable-price">
-        <text>可提现额(元)</text>
+        <text>可提现额(元)</text>
         <text>{{ financialData.withdrawableMoney || "0" }}</text>
       </view>
-      <view class="detailed" @click="navigateTo(`/pages_module/withdrawal/index?balance=${financialData.withdrawableMoney}&trading=${financialData.beeWithdrawal}`)">查看明细</view>
+      <view class="detailed" @click="navigateTo(`/pages_module/withdrawal/index`)">查看明细</view>
     </view>
     <view class="financial-price">
       <view class="price-title">基本数据</view>
@@ -83,6 +83,7 @@ export default {
       queryData: {
         condition: "1",
         time: "",
+        paymentMode:4
       },
     };
   },

+ 4 - 0
pages_module/receiving/index.scss

@@ -55,6 +55,7 @@
         box-sizing: border-box;
         background-color: #C22525;
         border-radius: 16rpx;
+        position: relative;
         .card-title{
             @include flex(space-between, null);
             text{
@@ -77,6 +78,9 @@
         .card-prople{
             margin-top: 24rpx;
             font-size: 28rpx;
+            position: absolute;
+            left: 32rpx;
+            bottom: 30rpx;
             text{
                 &:nth-of-type(1){
                     color: rgba(255, 255, 255, 0.4);

+ 5 - 1
pages_module/scanCoupons/index.vue

@@ -68,7 +68,11 @@ export default {
         this.$showToast("请输入劵码");
         return;
       }
-      let {data} = await getCoupons({ writeCode: this.iptValue });
+      let {data,code} = await getCoupons({ writeCode: this.iptValue });
+	  if(code == "核销码错误"){
+		  this.$showToast("核销码错误")
+		  return
+	  }
       //  传递值过去
       uni.navigateTo({
           url: `/pages_module/orderVerifica/index?orderId=${data.orderId}&code=${data.writeCode}`,

+ 63 - 37
pages_module/withdrawal/index.vue

@@ -2,8 +2,8 @@
   <view class="withdrawal">
     <view class="withdrawal-box">
       <view class="box-text">
-        <text>可提现额</text>
-        <text>{{ balance }}</text>
+        <text>可提现额</text>
+        <text>{{ financialData.withdrawableMoney }}</text>
       </view>
       <view class="goWithd" @click="goWithdClick">去提现</view>
     </view>
@@ -43,7 +43,10 @@
         <view class="popup-type">
           <view class="type-title">提现类型</view>
           <view class="type-btn">
-            <view
+            <view class="btn-box" v-for="item in popupList" :key="item.value"  :class="popupIdx == item.value ? 'active' : ''"  @click="changeIdx(item.value)">
+              {{ item.name }}
+            </view>
+            <!-- <view
               class="btn-box"
               :class="popupIdx == 1 ? 'active' : ''"
               @click="changeIdx(1)"
@@ -54,7 +57,7 @@
               :class="popupIdx == 2 ? 'active' : ''"
               @click="changeIdx(2)"
               >交易金</view
-            >
+            > -->
           </view>
         </view>
         <view class="popup-amount">
@@ -93,40 +96,55 @@
 </template>
 
 <script>
-import { getWithdrawal, financeBank, applyWithdrawal } from "@/config/index";
+import { getFinancial,getWithdrawal, financeBank, applyWithdrawal } from "@/config/index";
 export default {
-  onLoad(props) {
-    //  余额
-    this.balance = props.balance;
-    //  交易金
-    this.trading = props.trading;
-  },
   onShow() {
     this.getAll();
+    this.getFinancialData()
   },
   computed: {
     popupText() {
-      //  可提现{{ popupIdx == 1 ? "金额" : "交易金余额" }}:8483元
-      if (this.popupIdx == 1) {
-        return `可提现金额余额${this.balance}元`;
-      } else {
-        return `可提交易金余额${this.trading}元`;
-      }
+      let item = this.popupList.find((item) => item.value == this.popupIdx);
+      //  赋值
+      this.applyInfo.withdrawalMoney = this.financialData[item.title];
+      return `可提现${item.name}:${this.financialData[item.title]}元`;
     },
   },
   data() {
     return {
-      balance: "",
-      trading: "",
       queryData: {
         page: 1,
         pageSize: 10,
+        withdrawalType:""
       },
       //  提现记录列表
       withdrawalList: [],
       //  底部弹框控制
       showPopup: false,
       popupIdx: 1,
+      // 提现列表
+      popupList:[
+        {
+          name:"余额",
+          value:1,
+          title:"withdrawableMoney"
+        },
+        {
+          name:"交易金",
+          value:2,
+          title:"beeWithdrawal"
+        },
+        {
+          name:"代金券",
+          value:3,
+          title:"voucherWithdrawal"
+        },
+        {
+          name:"平台余额",
+          value:4,
+          title:"rechargeWithdrawalIn"
+        },
+      ],
       // 弹窗的信息
       bankInfo: {},
       // 提现请求信息
@@ -138,9 +156,21 @@ export default {
         withdrawalMoney: "",
         withdrawalType: "",
       },
+      // 提现数据
+      financialData:{}
     };
   },
   methods: {
+    // 获取提现总体数据
+    async getFinancialData() {
+      try {
+        this.$loading.show("计算中...");
+        const res = await getFinancial({condition: "1",time: "",paymentMode: 1,});
+        this.financialData = res.data;
+      } finally {
+        this.$loading.hide();
+      }
+    },
     async getAll() {
       let { data } = await getWithdrawal(this.queryData);
       this.withdrawalList = [...this.withdrawalList, ...data];
@@ -151,19 +181,18 @@ export default {
       this.showPopup = true;
       //  获取 bankInfo
       let { data } = await financeBank({});
-      this.applyInfo.withdrawalMoney = this.balance;
       this.bankInfo = data;
+      //  过滤出当前是什么提现模块
+      let obj = this.popupList.find((item) => item.value == this.popupIdx);
+      this.applyInfo.withdrawalMoney = this.financialData[obj.title];
     },
     //  确认申请提现
     async confirmBtn() {
-      //  对数据进行判断
-      if (
-        this.applyInfo.withdrawalMoney >
-        (this.popupIdx === 1 ? this.balance : this.trading)
-      ) {
-        this.$showToast("提现金额不能大于余额");
+      if(this.applyInfo.withdrawalMoney == 0){
+        this.$showToast("您当前的提现额度为0");
         return;
       }
+      //  对数据进行判断
       let { bankCard, bankName, shopCode, shopName } = this.bankInfo;
       //  对提交的信息进行处理
       this.applyInfo = {
@@ -172,7 +201,7 @@ export default {
         shopCode,
         shopName,
         withdrawalMoney: this.applyInfo.withdrawalMoney,
-        withdrawalType: this.popupIdx == 1 ? "1" : "2",
+        withdrawalType: this.popupIdx,
       };
 
       this.$loading.show("申请提现中");
@@ -190,17 +219,14 @@ export default {
     //  提现类型点击
     changeIdx(val) {
       this.popupIdx = val;
-      if (val == 1) {
-        this.applyInfo.withdrawalMoney = this.balance;
-      } else if (val == 2) {
-        this.applyInfo.withdrawalMoney = this.trading;
-      }
+      //  过滤出来当前点击的是哪一项
+      let obj = this.popupList.find((item) => item.value == val);
+      this.applyInfo.withdrawalType = this.financialData[obj.title];
     },
 
     //  全部提现点击
     allRawal() {
-      this.applyInfo.withdrawalMoney =
-        this.popupIdx == 1 ? this.balance : this.trading;
+      return;
     },
     // 关闭弹框事件
     clonePopup() {
@@ -209,9 +235,9 @@ export default {
   },
   //  触底加载
   onReachBottom() {
-    if (this.withdrawalList.length < 10) return;
-    this.queryData.page++;
-    this.getAll();
+    // if (this.withdrawalList.length < 10) return;
+    // this.queryData.page++;
+    // this.getAll();
   },
 };
 </script>

BIN
static/image/home/decline-icon.png


BIN
static/image/home/green-more.png


BIN
static/image/home/green.png


BIN
static/image/home/red.png


BIN
static/image/home/rise-icon.png


BIN
static/image/home/tobe_1.png


BIN
static/image/home/tobe_2.png


BIN
static/image/home/tobe_6.png


BIN
static/image/home/tobe_7.png


BIN
static/image/home/tobe_8.png


BIN
static/image/user/account_01.png


BIN
static/image/user/account_02.png


BIN
static/image/user/account_03.png


BIN
static/image/user/account_04.png


BIN
static/image/user/balance_bg.png


BIN
static/image/user/consumptionPrice_bg.png


BIN
static/image/user/money-bg.png


BIN
static/image/user/notice.png


BIN
static/image/user/platformBalance_bg.png


BIN
static/image/user/switch.png


BIN
static/image/user/user-bg.png


BIN
static/image/user/user_icon1.png


BIN
static/image/user/user_icon2.png


BIN
static/image/user/user_icon3.png


BIN
static/image/user/user_icon4.png


BIN
static/image/user/user_icon5.png


BIN
static/image/user/voucherPrice_bg.png


+ 158 - 0
user_module/balance/index.scss

@@ -0,0 +1,158 @@
+.balance {
+  width: 100vw;
+  min-height: 100vh;
+  background-color: rgb(247, 247, 247);
+  padding: 32rpx;
+  padding-bottom: 50rpx;
+  box-sizing: border-box;
+  .balance-header {
+    width: 100%;
+    height: 304rpx;
+    background: url("@/static/image/user/balance_bg.png") no-repeat;
+    background-size: 100% 100%;
+    position: relative;
+    padding: 0 48rpx;
+    padding-top: 48rpx;
+    box-sizing: border-box;
+    .header-top {
+      @include flex(space-between, null, null);
+      .price-left {
+        @include flex(center, column, 10rpx);
+        text {
+          &:nth-of-type(1) {
+            font-size: 56rpx;
+            background: linear-gradient(180deg, #ffffff 0%, #ffd5b8 100%);
+            -webkit-background-clip: text;
+            -webkit-text-fill-color: transparent;
+            font-weight: 600;
+          }
+          &:nth-of-type(2) {
+            color: #ffffff;
+            font-size: 28rpx;
+          }
+        }
+      }
+      .price-right{
+        width: 160rpx;
+        height: 64rpx;
+        text-align: center;
+        line-height: 64rpx;
+        font-size: 32rpx;
+        font-weight: 500;
+        background: rgba(255, 255, 255, 0.4);
+        border: 2rpx solid rgba(255, 255, 255, 0.39);
+        color: #FFFFFF;
+        border-radius: 50rpx;
+      }
+    }
+    .header-bottom{
+        position: absolute;
+        bottom: 0;
+        left: 50%;
+        transform: translateX(-50%);
+        width: calc(100% - 64rpx);
+        height: 96rpx;
+        border-top: 2rpx solid rgba(255, 255, 255, 0.4);
+        @include flex(flex-start,null,104rpx);
+        .text-box{
+            @include flex(flex-start,null,16rpx);
+            text{
+                &:nth-of-type(1){
+                    color: rgba(255, 255, 255, 0.8);
+                    font-size: 24rpx;
+                }
+                &:nth-of-type(2){
+                    color: #FFFFFF;
+                    font-size: 32rpx;
+                    font-weight: 600;
+                }
+            }
+        }
+    }
+  }
+  .balance-container{
+    width: 100%;
+    margin-top: 32rpx;
+    .text-tab{
+        @include flex(flex-start,null,64rpx);
+        view{
+            color: rgba(0, 0, 0, 0.4);
+            font-size: 32rpx;
+            padding-bottom: 10rpx;
+        }
+        .active{
+            position: relative;
+            color: rgba(0, 0, 0, 0.9);
+            &::after{
+                content: '';
+                position: absolute;
+                left: 50%;
+                transform: translateX(-50%);
+                bottom: 0;
+                width: 32rpx;
+                height: 8rpx;
+                background-color: #FF604E;
+                border-radius: 4rpx;
+            }
+        }
+    }
+    .record-list{
+        margin-top: 16rpx;
+        width: 100%;
+        background-color: #FFFFFF;
+        border-radius: 16rpx;
+        .record-item{
+            width: 100%;
+            height: 168rpx;
+            border-bottom: 2rpx solid #F1F1F1;
+            padding: 32rpx 24rpx 32rpx 32rpx;
+            box-sizing: border-box;
+            @include flex(space-between,null,null);
+            .item-left{
+                @include flex(center,column,16rpx);
+                align-items: flex-start;
+                text{
+                    &:nth-of-type(1){
+                        color: rgba(0, 0, 0, 0.9);
+                        font-size: 28rpx;
+                        font-weight: 600;
+                    }
+                    &:nth-of-type(2){
+                        color: rgba(0, 0, 0, 0.4);
+                        font-size: 28rpx;
+                    }
+                }
+            }
+            .item-right{
+                font-size: 28rpx;
+                color: #EA5C1E;
+                font-weight: 900;
+            }
+        }   
+        .no-more{
+            width: 100%;
+            height: 100rpx;
+            text-align: center;
+            line-height: 100rpx;
+            font-size: 24rpx;
+            color: rgba(0, 0, 0, 0.24);
+        }
+    }
+    .empty{
+      margin-top: 96rpx;
+      width: 100%;
+      @include flex(flex-start,column,32rpx);
+      image{
+        width: 320rpx;
+        height: 320rpx;
+        display: block;
+      }
+
+      text{
+        font-weight: 600;
+        font-size: 28rpx;
+        color: rgba(0, 0, 0, 0.4);
+      }
+    }
+  }
+}

+ 159 - 0
user_module/balance/index.vue

@@ -0,0 +1,159 @@
+<template>
+  <view class="balance">
+    <view class="balance-header">
+      <view class="header-top">
+        <view class="price-left">
+          <text>{{ financeInfo.withdrawableMoney || '0'}}</text>
+          <text>可提现金额(元)</text>
+        </view>
+        <view class="price-right" @click="navigateTo(`/pages_module/withdrawal/index`)">提现</view>
+      </view>
+      <view class="header-bottom">
+        <view class="text-box">
+          <text>途中金额</text>
+          <text>{{ financeInfo.frozenMoney || '0' }}</text>
+        </view>
+        <view class="text-box">
+          <text>累计营业额(元)</text>
+          <text>{{ financeInfo.turnover || '0' }}</text>
+        </view>
+      </view>
+    </view>
+    <view class="balance-container">
+      <view class="text-tab">
+        <view
+          v-for="(item, index) in tabList"
+          :key="item"
+          :class="idx == index ? 'active' : ''"
+          @click="changeTab(index)"
+          >{{ item }}</view
+        >
+      </view>
+      <view v-show="idx == 0">
+        <template v-if="recordList.length > 0">
+          <view class="record-list">
+            <view class="record-item" v-for="item in recordList" :key="item">
+              <view class="item-left">
+                <text>{{ item.state == 0 ? "实体商品收入" : "提现支出" }}</text>
+                <text>{{ item.time }}</text>
+              </view>
+              <template v-if="item.state == 0">
+                <view class="item-right">+{{ item.income }}</view>
+              </template>
+              <template v-else>
+                <view class="item-right">-{{ item.expenditure }}</view>
+              </template>
+            </view>
+            <view class="no-more">没有更多啦</view>
+          </view>
+        </template>
+        <template v-else>
+          <view class="empty">
+            <image class="" src="@/static/image/order/empty.png" />
+            <text>暂无提现记录</text>
+          </view>
+        </template>
+      </view>
+      <view v-show="idx == 1">
+        <template v-if="withdrawalList.length > 0">
+          <view class="record-list">
+            <view
+              class="record-item"
+              v-for="item in withdrawalList"
+              :key="item"
+            >
+              <view class="item-left">
+                <text>提现支出</text>
+                <text>{{ item.applyTime }}</text>
+              </view>
+              <template v-if="item.state == 0">
+                <view class="item-right">+{{ item.income }}</view>
+              </template>
+              <template v-else>
+                <view class="item-right">-{{ item.withdrawalMoney || 0 }}</view>
+              </template>
+            </view>
+            <view class="no-more">没有更多啦</view>
+          </view>
+        </template>
+        <template v-else>
+          <view class="empty">
+            <image class="" src="@/static/image/order/empty.png" />
+            <text>暂无提现记录</text>
+          </view>
+        </template>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+import { getFinanceCount, getWithdrawal } from "@/config/index.js";
+
+export default {
+  onLoad(option) {
+    //  获取流水接口
+    this.getFinance();
+    //  获取提现记录
+    this.getWithList();
+  },
+  data() {
+    return {
+      idx: 0,
+      tabList: ["收支明细", "提现记录"],
+      queryData: {
+        condition: "1",
+        time: "",
+        paymentMode: 1,
+      },
+      //  提现记录的请求参数
+      withdeQuery: {
+        page: 1,
+        pageSize: 10,
+        withdrawalType: 1,
+      },
+      //  提现记录列表
+      withdrawalList: [],
+      //  流水信息
+      financeInfo: {},
+      //  收支明细列表
+      recordList: [],
+    };
+  },
+  methods: {
+    // 获取流水
+    async getFinance() {
+      this.$loading.show("加载中");
+      try {
+        let res = await getFinanceCount(this.queryData);
+        this.financeInfo = res.data;
+        //  对于数据进行处理 如果有支出的话就加上这一个支出
+        let list = res.data.finances.reduce((prev, item, index) => {
+          prev.push({ ...item, state: 0 });
+          if (item.expenditure > 0) {
+            prev.push({ ...item });
+          }
+          return prev;
+        }, []);
+        this.recordList = list;
+      } finally {
+        this.$loading.hide();
+      }
+    },
+    //  获取体现记录
+    async getWithList() {
+      let res = await getWithdrawal(this.withdeQuery);
+      this.withdrawalList = res.data;
+      console.log(res.data);
+    },
+    //  获取体现记录
+    changeTab(idx) {
+      this.idx = idx;
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+@import "./index.scss";
+</style>

+ 1 - 1
user_module/businessInfo/index.vue

@@ -106,7 +106,7 @@ export default {
       //  清除本地缓存
       uni.clearStorageSync();
       //  跳转回登陆页面
-      uni.redirectTo({
+      uni.reLaunch({
         url: "/pages/login/index",
       });
     },

+ 1 - 0
user_module/changeLogo/index.vue

@@ -37,6 +37,7 @@ export default {
         sizeType: ["original", "compressed"], //可以指定是原图还是压缩图,默认二者都有
         sourceType: [str], //从相册选择
         success: (res) => {
+          console.log(res.tempFilePaths[0]);
           this.getImage(res.tempFilePaths[0]);
         },
       });

+ 4 - 1
user_module/codeDetail/index.scss

@@ -28,14 +28,17 @@
   }
   .container {
     width: 100%;
-    padding: 32rpx 72rpx 0;
+    padding: 32rpx 60rpx 0;
     box-sizing: border-box;
+    // @include flex(center, column, null);
     position: relative;
     .code-image {
+      width: 650rpx;
       position: relative;
       z-index: -1111;
     }
     .img-box {
+      width: 100%;
       /* position: absolute;
           top: 32rpx;
           z-index: 9999;

+ 161 - 0
user_module/consumptionPrice/index.scss

@@ -0,0 +1,161 @@
+.balance {
+  width: 100vw;
+  min-height: 100vh;
+  background-color: rgb(247, 247, 247);
+  padding: 32rpx;
+  padding-bottom: 50rpx;
+  box-sizing: border-box;
+  .balance-header {
+    width: 100%;
+    height: 304rpx;
+    background: url("@/static/image/user/consumptionPrice_bg.png") no-repeat;
+    background-size: 100% 100%;
+    position: relative;
+    padding: 0 48rpx;
+    padding-top: 48rpx;
+    box-sizing: border-box;
+    .header-top {
+      @include flex(space-between, null, null);
+      .price-left {
+        @include flex(center, column, 10rpx);
+        text {
+          &:nth-of-type(1) {
+            font-size: 56rpx;
+            background: linear-gradient(180deg, #ffffff 0%, #b8cdff 100%);
+            -webkit-background-clip: text;
+            -webkit-text-fill-color: transparent;
+            font-weight: 600;
+            // background: linear-gradient(180deg, #ffffff 0%, #ffd5b8 100%);
+            // -webkit-background-clip: text;
+            // -webkit-text-fill-color: transparent;
+          }
+          &:nth-of-type(2) {
+            color: #ffffff;
+            font-size: 28rpx;
+          }
+        }
+      }
+      .price-right {
+        width: 160rpx;
+        height: 64rpx;
+        text-align: center;
+        line-height: 64rpx;
+        font-size: 32rpx;
+        font-weight: 500;
+        background: rgba(255, 255, 255, 0.4);
+        border: 2rpx solid rgba(255, 255, 255, 0.39);
+        color: #ffffff;
+        border-radius: 50rpx;
+      }
+    }
+    .header-bottom {
+      position: absolute;
+      bottom: 0;
+      left: 50%;
+      transform: translateX(-50%);
+      width: calc(100% - 64rpx);
+      height: 96rpx;
+      border-top: 2rpx solid rgba(255, 255, 255, 0.4);
+      @include flex(flex-start, null, 104rpx);
+      .text-box {
+        @include flex(flex-start, null, 16rpx);
+        text {
+          &:nth-of-type(1) {
+            color: rgba(255, 255, 255, 0.8);
+            font-size: 24rpx;
+          }
+          &:nth-of-type(2) {
+            color: #ffffff;
+            font-size: 32rpx;
+            font-weight: 600;
+          }
+        }
+      }
+    }
+  }
+  .balance-container {
+    width: 100%;
+    margin-top: 32rpx;
+    .text-tab {
+      @include flex(flex-start, null, 64rpx);
+      view {
+        color: rgba(0, 0, 0, 0.4);
+        font-size: 32rpx;
+        padding-bottom: 10rpx;
+      }
+      .active {
+        position: relative;
+        color: rgba(0, 0, 0, 0.9);
+        &::after {
+          content: "";
+          position: absolute;
+          left: 50%;
+          transform: translateX(-50%);
+          bottom: 0;
+          width: 32rpx;
+          height: 8rpx;
+          background-color: #ff604e;
+          border-radius: 4rpx;
+        }
+      }
+    }
+    .record-list {
+      margin-top: 16rpx;
+      width: 100%;
+      background-color: #ffffff;
+      border-radius: 16rpx;
+      .record-item {
+        width: 100%;
+        height: 168rpx;
+        border-bottom: 2rpx solid #f1f1f1;
+        padding: 32rpx 24rpx 32rpx 32rpx;
+        box-sizing: border-box;
+        @include flex(space-between, null, null);
+        .item-left {
+          @include flex(center, column, 16rpx);
+          align-items: flex-start;
+          text {
+            &:nth-of-type(1) {
+              color: rgba(0, 0, 0, 0.9);
+              font-size: 28rpx;
+              font-weight: 600;
+            }
+            &:nth-of-type(2) {
+              color: rgba(0, 0, 0, 0.4);
+              font-size: 28rpx;
+            }
+          }
+        }
+        .item-right {
+          font-size: 28rpx;
+          color: #ea5c1e;
+          font-weight: 900;
+        }
+      }
+      .no-more {
+        width: 100%;
+        height: 100rpx;
+        text-align: center;
+        line-height: 100rpx;
+        font-size: 24rpx;
+        color: rgba(0, 0, 0, 0.24);
+      }
+    }
+    .empty {
+      margin-top: 96rpx;
+      width: 100%;
+      @include flex(flex-start, column, 32rpx);
+      image {
+        width: 320rpx;
+        height: 320rpx;
+        display: block;
+      }
+
+      text {
+        font-weight: 600;
+        font-size: 28rpx;
+        color: rgba(0, 0, 0, 0.4);
+      }
+    }
+  }
+}

+ 150 - 0
user_module/consumptionPrice/index.vue

@@ -0,0 +1,150 @@
+<template>
+  <view class="balance">
+    <view class="balance-header">
+      <view class="header-top">
+        <view class="price-left">
+          <text>{{ financeInfo.beeWithdrawal || 0 }}</text>
+          <text>可提现</text>
+        </view>
+        <view class="price-right" @click="navigateTo(`/pages_module/withdrawal/index`)">提现</view>
+      </view>
+      <view class="header-bottom">
+        <view class="text-box">
+          <text>提现中</text>
+          <text>{{ financeInfo.withdrawalIn }}</text>
+        </view>
+        <view class="text-box">
+          <text>已提现</text>
+          <text>{{ financeInfo.withdrawn }}</text>
+        </view>
+      </view>
+    </view>
+    <view class="balance-container">
+      <view class="text-tab">
+        <view
+          v-for="(item, index) in tabList"
+          :key="item"
+          :class="idx == index ? 'active' : ''"
+          @click="changeTab(index)"
+          >{{ item }}</view
+        >
+      </view>
+      <view v-show="idx == 0">
+        <template v-if="recordList.length > 0">
+          <view class="record-list">
+            <view class="record-item" v-for="item in recordList" :key="item">
+              <view class="item-left">
+                <text>提现支出</text>
+                <text>{{ item.time }}</text>
+              </view>
+              <template v-if="item.state == 0">
+                <view class="item-right">+{{ item.income }}</view>
+              </template>
+              <template v-else>
+                <view class="item-right">-{{ item.expenditure }}</view>
+              </template>
+            </view>
+            <view class="no-more">没有更多啦</view>
+          </view>
+        </template>
+        <template v-else>
+          <view class="empty">
+            <image class="" src="@/static/image/order/empty.png" />
+            <text>暂无提现记录</text>
+          </view>
+        </template>
+      </view>
+      <view v-show="idx == 1">
+        <template v-if="withdrawalList.length > 0">
+          <view class="record-list">
+            <view class="record-item" v-for="item in withdrawalList" :key="item">
+              <view class="item-left">
+                <text>提现支出</text>
+                <text>{{ item.time }}</text>
+              </view>
+              <template v-if="item.state == 0">
+                <view class="item-right">+{{ item.income }}</view>
+              </template>
+              <template v-else>
+                <view class="item-right">-{{ item.expenditure }}</view>
+              </template>
+            </view>
+            <view class="no-more">没有更多啦</view>
+          </view>
+        </template>
+        <template v-else>
+          <view class="empty">
+            <image class="" src="@/static/image/order/empty.png" />
+            <text>暂无提现记录</text>
+          </view>
+        </template>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+import { getFinanceCount,getWithdrawal } from "@/config/index.js";
+
+export default {
+  onLoad(option) {
+    //  获取流水接口
+    this.getFinance();
+    //  获取提现记录
+    this.getWithList();
+  },
+  data() {
+    return {
+      idx: 0,
+      tabList: ["收支明细", "提现记录"],
+      queryData: {
+        condition: "1",
+        time: "",
+        paymentMode: 2,
+      },
+      //  提现记录的请求参数
+      withdeQuery:{
+        page: 1,
+        pageSize: 10,
+        withdrawalType:4
+      },
+      //  提现记录列表
+      withdrawalList: [],
+      //  流水信息
+      financeInfo: {},
+      //  收支明细列表
+      recordList: [],
+    };
+  },
+  methods: {
+    // 获取流水
+    async getFinance() {
+      let res = await getFinanceCount(this.queryData);
+      this.financeInfo = res.data;
+      //  对于数据进行处理 如果有支出的话就加上这一个支出
+      let list = res.data.finances.reduce((prev, item, index) => {
+        prev.push({ ...item, state: 0 });
+        if (item.expenditure > 0) {
+          prev.push({ ...item });
+        }
+        return prev;
+      }, []);
+      this.recordList = list;
+    },
+    //  获取体现记录
+    async getWithList() {
+      let res = await getWithdrawal(this.withdeQuery);
+      this.withdrawalList = res.data;
+      console.log(res);
+    },
+    //  获取体现记录
+    changeTab(idx) {
+      this.idx = idx;
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+@import "./index.scss";
+</style>

+ 15 - 0
user_module/memberManage/index.scss

@@ -92,4 +92,19 @@
             }
         }
     }
+    .empty {
+        margin-top: 96rpx;
+        width: 100%;
+        @include flex(flex-start, column, 32rpx);
+        image {
+          width: 320rpx;
+          height: 320rpx;
+          display: block;
+        }
+        text {
+          font-weight: 600;
+          font-size: 28rpx;
+          color: rgba(0, 0, 0, 0.4);
+        }
+      }
 }

+ 10 - 1
user_module/memberManage/index.vue

@@ -1,7 +1,8 @@
 <template>
   <view class="memberManage">
     <view class="membere-title">会员列表</view>
-    <view class="membere-list">
+    <template v-if="accountList.length > 0">
+      <view class="membere-list">
       <view
         class="member-item"
         v-for="(item, index) in accountList"
@@ -51,6 +52,14 @@
         </view>
       </view>
     </view>
+    </template>
+   <template v-else>
+    <view class="empty">
+      <image class="" src="@/static/image/order/empty.png" />
+      <text>该商家下面没有会员</text>
+    </view>
+   </template>
+   
   </view>
 </template>
 

+ 158 - 0
user_module/platformBalance/index.scss

@@ -0,0 +1,158 @@
+.balance {
+  width: 100vw;
+  min-height: 100vh;
+  background-color: rgb(247, 247, 247);
+  padding: 32rpx;
+  padding-bottom: 50rpx;
+  box-sizing: border-box;
+  .balance-header {
+    width: 100%;
+    height: 304rpx;
+    background: url("@/static/image/user/platformBalance_bg.png") no-repeat;
+    background-size: 100% 100%;
+    position: relative;
+    padding: 0 48rpx;
+    padding-top: 48rpx;
+    box-sizing: border-box;
+    .header-top {
+      @include flex(space-between, null, null);
+      .price-left {
+        @include flex(center, column, 10rpx);
+        text {
+          &:nth-of-type(1) {
+            font-size: 56rpx;
+            background: linear-gradient(180deg, #ffffff 0%, #ffd5b8 100%);
+            -webkit-background-clip: text;
+            -webkit-text-fill-color: transparent;
+            font-weight: 600;
+          }
+          &:nth-of-type(2) {
+            color: #ffffff;
+            font-size: 28rpx;
+          }
+        }
+      }
+      .price-right{
+        width: 160rpx;
+        height: 64rpx;
+        text-align: center;
+        line-height: 64rpx;
+        font-size: 32rpx;
+        font-weight: 500;
+        background: rgba(255, 255, 255, 0.4);
+        border: 2rpx solid rgba(255, 255, 255, 0.39);
+        color: #FFFFFF;
+        border-radius: 50rpx;
+      }
+    }
+    .header-bottom{
+        position: absolute;
+        bottom: 0;
+        left: 50%;
+        transform: translateX(-50%);
+        width: calc(100% - 64rpx);
+        height: 96rpx;
+        border-top: 2rpx solid rgba(255, 255, 255, 0.4);
+        @include flex(flex-start,null,104rpx);
+        .text-box{
+            @include flex(flex-start,null,16rpx);
+            text{
+                &:nth-of-type(1){
+                    color: rgba(255, 255, 255, 0.8);
+                    font-size: 24rpx;
+                }
+                &:nth-of-type(2){
+                    color: #FFFFFF;
+                    font-size: 32rpx;
+                    font-weight: 600;
+                }
+            }
+        }
+    }
+  }
+  .balance-container{
+    width: 100%;
+    margin-top: 32rpx;
+    .text-tab{
+        @include flex(flex-start,null,64rpx);
+        view{
+            color: rgba(0, 0, 0, 0.4);
+            font-size: 32rpx;
+            padding-bottom: 10rpx;
+        }
+        .active{
+            position: relative;
+            color: rgba(0, 0, 0, 0.9);
+            &::after{
+                content: '';
+                position: absolute;
+                left: 50%;
+                transform: translateX(-50%);
+                bottom: 0;
+                width: 32rpx;
+                height: 8rpx;
+                background-color: #FF604E;
+                border-radius: 4rpx;
+            }
+        }
+    }
+    .record-list{
+        margin-top: 16rpx;
+        width: 100%;
+        background-color: #FFFFFF;
+        border-radius: 16rpx;
+        .record-item{
+            width: 100%;
+            height: 168rpx;
+            border-bottom: 2rpx solid #F1F1F1;
+            padding: 32rpx 24rpx 32rpx 32rpx;
+            box-sizing: border-box;
+            @include flex(space-between,null,null);
+            .item-left{
+                @include flex(center,column,16rpx);
+                align-items: flex-start;
+                text{
+                    &:nth-of-type(1){
+                        color: rgba(0, 0, 0, 0.9);
+                        font-size: 28rpx;
+                        font-weight: 600;
+                    }
+                    &:nth-of-type(2){
+                        color: rgba(0, 0, 0, 0.4);
+                        font-size: 28rpx;
+                    }
+                }
+            }
+            .item-right{
+                font-size: 28rpx;
+                color: #EA5C1E;
+                font-weight: 900;
+            }
+        }   
+        .no-more{
+            width: 100%;
+            height: 100rpx;
+            text-align: center;
+            line-height: 100rpx;
+            font-size: 24rpx;
+            color: rgba(0, 0, 0, 0.24);
+        }
+    }
+    .empty{
+      margin-top: 96rpx;
+      width: 100%;
+      @include flex(flex-start,column,32rpx);
+      image{
+        width: 320rpx;
+        height: 320rpx;
+        display: block;
+      }
+
+      text{
+        font-weight: 600;
+        font-size: 28rpx;
+        color: rgba(0, 0, 0, 0.4);
+      }
+    }
+  }
+}

+ 155 - 0
user_module/platformBalance/index.vue

@@ -0,0 +1,155 @@
+<template>
+  <view class="balance">
+    <view class="balance-header">
+      <view class="header-top">
+        <view class="price-left">
+          <text>{{ financeInfo.rechargeWithdrawalIn || 0 }}</text>
+          <text>可提现</text>
+        </view>
+        <view class="price-right" @click="navigateTo(`/pages_module/withdrawal/index`)">提现</view>
+      </view>
+      <view class="header-bottom">
+        <view class="text-box">
+          <text>待到账冻结</text>
+          <text>{{ financeInfo.rechargeFreeze || '0' }}</text>
+        </view>
+        <view class="text-box">
+          <text>余额赠送代金券</text>
+          <text>{{ financeInfo.presenterRechargeVoucher || '0' }}</text>
+        </view>
+      </view>
+    </view>
+    <view class="balance-container">
+      <view class="text-tab">
+        <view
+          v-for="(item, index) in tabList"
+          :key="item"
+          :class="idx == index ? 'active' : ''"
+          @click="changeTab(index)"
+          >{{ item }}</view
+        >
+      </view>
+      <view v-show="idx == 0">
+        <template v-if="recordList.length > 0">
+          <view class="record-list">
+            <view class="record-item" v-for="item in recordList" :key="item">
+              <view class="item-left">
+                <text>{{ item.state == 0?'实体商品收入':'提现支出' }}</text>
+                <text>{{ item.time }}</text>
+              </view>
+              <template v-if="item.state == 0">
+                <view class="item-right">+{{ item.income }}</view>
+              </template>
+              <template v-else>
+                <view class="item-right">-{{ item.expenditure }}</view>
+              </template>
+            </view>
+            <view class="no-more">没有更多啦</view>
+          </view>
+        </template>
+        <template v-else>
+          <view class="empty">
+            <image class="" src="@/static/image/order/empty.png" />
+            <text>暂无提现记录</text>
+          </view>
+        </template>
+      </view>
+      <view v-show="idx == 1">
+        <template v-if="withdrawalList.length > 0">
+          <view class="record-list">
+            <view class="record-item" v-for="item in withdrawalList" :key="item">
+              <view class="item-left">
+                <text>提现支出</text>
+                <text>{{ item.time }}</text>
+              </view>
+              <template v-if="item.state == 0">
+                <view class="item-right">+{{ item.income }}</view>
+              </template>
+              <template v-else>
+                <view class="item-right">-{{ item.expenditure }}</view>
+              </template>
+            </view>
+            <view class="no-more">没有更多啦</view>
+          </view>
+        </template>
+        <template v-else>
+          <view class="empty">
+            <image class="" src="@/static/image/order/empty.png" />
+            <text>暂无提现记录</text>
+          </view>
+        </template>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+import { getFinanceCount,getWithdrawal } from "@/config/index.js";
+
+export default {
+  onLoad(option) {
+    //  获取流水接口
+    this.getFinance();
+    //  获取提现记录
+    this.getWithList();
+  },
+  data() {
+    return {
+      idx: 0,
+      tabList: ["收支明细", "提现记录"],
+      queryData: {
+        condition: "1",
+        time: "",
+        paymentMode: 4,
+      },
+      //  提现记录的请求参数
+      withdeQuery:{
+        page: 1,
+        pageSize: 10,
+        withdrawalType:4
+      },
+      //  提现记录列表
+      withdrawalList: [],
+      //  流水信息
+      financeInfo: {},
+      //  收支明细列表
+      recordList: [],
+    };
+  },
+  methods: {
+    // 获取流水
+    async getFinance() {
+      this.$loading.show("加载中");
+      try {
+        let res = await getFinanceCount(this.queryData);
+        this.financeInfo = res.data;
+        //  对于数据进行处理 如果有支出的话就加上这一个支出
+        let list = res.data.finances.reduce((prev, item, index) => {
+          prev.push({ ...item, state: 0 });
+          if (item.expenditure > 0) {
+            prev.push({ ...item });
+          }
+          return prev;
+        }, []);
+        this.recordList = list;
+      } finally {
+        this.$loading.hide();
+      }
+    },
+    //  获取体现记录
+    async getWithList() {
+      let res = await getWithdrawal(this.withdeQuery);
+      this.withdrawalList = res.data;
+      console.log(res);
+    },
+    //  获取体现记录
+    changeTab(idx) {
+      this.idx = idx;
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+@import "./index.scss";
+</style>

+ 107 - 0
user_module/voucherPrice/components/rechargePopup/index.scss

@@ -0,0 +1,107 @@
+.rechargePopup-box {
+  width: 100%;
+  padding: 32rpx;
+  box-sizing: border-box;
+  .rechargePopup-title {
+    position: relative;
+    width: 100%;
+    height: 44rpx;
+    view {
+      font-size: 30rpx;
+      &:nth-of-type(1) {
+        color: #222222;
+        font-weight: 600;
+        position: absolute;
+        left: 50%;
+        transform: translateX(-50%);
+      }
+      &:nth-of-type(2) {
+        position: absolute;
+        right: 0;
+        color: #999999;
+      }
+    }
+  }
+  .rechargePopup-list {
+    width: 100%;
+    margin-top: 48rpx;
+    @include flex(space-between, null, 16rpx);
+    flex-wrap: wrap;
+    .rechargePopup-item {
+      width: 218rpx;
+      height: 160rpx;
+      background-color: #ffebe3;
+      border-radius: 16rpx;
+      color: #ef530e;
+      font-size: 48rpx;
+      font-weight: 600;
+      @include flex(center, column, 10rpx);
+      view {
+        &:nth-of-type(2) {
+          font-size: 24rpx;
+          font-weight: normal;
+        }
+      }
+      &:nth-last-of-type(1) {
+        visibility: hidden;
+      }
+    }
+    .custom {
+      font-size: 28rpx;
+      line-height: normal;
+      font-weight: normal;
+      @include flex(center, column, null);
+      input {
+        width: 160rpx;
+        height: 50rpx;
+        border-bottom: 2rpx solid #ff986a;
+        font-weight: 600;
+      }
+    }
+    .act {
+      background-color: #ef530e;
+      color: #ffffff;
+    }
+  }
+  .custom {
+    margin-top: 16rpx;
+    width: 100%;
+    height: 96rpx;
+    background-color: #ffebe3;
+    padding: 26rpx 32rpx;
+    box-sizing: border-box;
+    color: #ef530e;
+    @include flex(center, null, null);
+    border-radius: 16rpx;
+    font-size: 24rpx;
+    .custom-left {
+      margin-right: 8rpx;
+    }
+    .custom-input {
+      flex: 1;
+      input {
+        width: 100%;
+        height: 45rpx;
+        border-bottom: 2rpx solid #ff986a;
+      }
+    }
+    .custom-right {
+      margin-left: 54rpx;
+    }
+    &.act{
+        background-color: #ef530e;
+        color: #ffffff;
+    }
+  }
+  .immediately-btn{
+    width: 100%;
+    height: 96rpx;
+    background-color: #EF530E;
+    text-align: center;
+    line-height: 96rpx;
+    margin-top: 26rpx;
+    font-size: 28rpx;
+    color: #FFFFFF;
+    border-radius: 16rpx;
+  }
+}

+ 105 - 0
user_module/voucherPrice/components/rechargePopup/index.vue

@@ -0,0 +1,105 @@
+<template>
+  <view class="rechargePopup-box">
+    <view class="rechargePopup-title">
+      <view>代金券充值</view>
+      <view @click="cancel">取消</view>
+    </view>
+    <view class="rechargePopup-list">
+      <view
+        class="rechargePopup-item"
+        v-for="(item, index) in transferPriceList"
+        :key="index"
+        :class="idx === index ? 'act' : ''"
+        @click="changeIdx(index)"
+      >
+        <view>{{ item.number }}</view>
+        <view>售价:{{ item.payGrade }}元</view>
+      </view>
+    </view>
+    <view class="custom" :class="idx === 5 ? 'act' : ''" @click="changeIdx(5)">
+      <view class="custom-left">自定义代金券</view>
+      <view class="custom-input">
+        <input type="number" v-model="customNum" />
+      </view>
+      <view class="custom-right">售价:{{ realityNum }}元</view>
+    </view>
+    <view class="immediately-btn" @click="getOrder">立即充值</view>
+  </view>
+</template>
+
+<script>
+import { voucherOrderApi } from "@/config/index.js";
+export default {
+  computed: {
+    realityNum() {
+      return this.customNum / 2;
+    },
+  },
+  data() {
+    return {
+      //  激活态
+      idx: "",
+      //  转赠金额列表
+      //  50, 100, 200, 1000, 2000, ""
+      transferPriceList: [
+        {
+          number: "50",
+          payGrade: "25",
+        },
+        {
+          number: "100",
+          payGrade: "50",
+        },
+        {
+          number: "200",
+          payGrade: "100",
+        },
+        {
+          number: "1000",
+          payGrade: "500",
+        },
+        {
+          number: "2000",
+          payGrade: "1000",
+        },
+        {
+          number: "",
+          payGrade: "",
+        },
+      ],
+      customNum: "",
+    };
+  },
+  methods: {
+    //  提交订单
+    async getOrder() {
+      this.$showToast("功能正在开发....")
+      return
+      console.log(this.idx);
+      if (this.idx === "") {
+        this.$showToast("请选择充值金额");
+        return;
+      }
+      let obj = {
+        voucherId: 186,
+        ...(this.idx === 5?{number: this.customNum,payGrade: this.realityNum,}: this.transferPriceList[this.idx]),
+      };
+      let res = await voucherOrderApi(obj);
+      console.log(res);
+    },
+    //  修改激活态
+    changeIdx(val) {
+      this.idx = val;
+    },
+
+    //  取消按钮
+    cancel() {
+      this.$emit("cancel");
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+@import "./index.scss";
+</style>

+ 121 - 0
user_module/voucherPrice/components/transferPopup/index.scss

@@ -0,0 +1,121 @@
+.transfer-box {
+  width: 100%;
+  padding: 32rpx;
+  box-sizing: border-box;
+  .transfer-title {
+    position: relative;
+    width: 100%;
+    height: 44rpx;
+    view {
+      font-size: 30rpx;
+      &:nth-of-type(1) {
+        color: #222222;
+        font-weight: 600;
+        position: absolute;
+        left: 50%;
+        transform: translateX(-50%);
+      }
+      &:nth-of-type(2) {
+        position: absolute;
+        right: 0;
+        color: #999999;
+      }
+    }
+  }
+  .transfer-list {
+    width: 100%;
+    margin-top: 48rpx;
+    @include flex(space-between, null, 16rpx);
+    flex-wrap: wrap;
+    .transfer-item {
+      width: 218rpx;
+      height: 160rpx;
+      background-color: #ffebe3;
+      border-radius: 16rpx;
+      text-align: center;
+      line-height: 160rpx;
+      color: #ef530e;
+      font-size: 48rpx;
+      font-weight: 600;
+    }
+    .custom {
+      font-size: 28rpx;
+      line-height: normal;
+      font-weight: normal;
+      @include flex(center, column, null);
+      input {
+        width: 160rpx;
+        height: 50rpx;
+        border-bottom: 2rpx solid #ff986a;
+        font-weight: 600;
+      }
+    }
+    .act{
+      background-color: #EF530E;
+      color: #FFFFFF;
+    }
+  }
+  .transfer-account {
+    margin-top: 32rpx;
+    .account-title {
+      color: #000000;
+      font-size: 28rpx;
+    }
+    .account-input {
+      .query {
+        color: #ef530e;
+        font-size: 28rpx;
+      }
+    }
+    .account-info{
+      width: 100%;
+      height: 148rpx;
+      @include flex(flex-start,null,16rpx);
+      .info-image{
+        width: 80rpx;
+        height: 80rpx;
+        image{
+          width: 100%;
+          height: 100%;
+          border-radius: 50%;
+        }
+      }
+      .info-text{
+        .name{
+          font-size: 28rpx;
+          color: rgba(0, 0, 0, 0.9);
+          font-weight: 600;
+          margin-bottom: 4rpx;
+        }
+        .text{
+          @include flex(flex-start,null,32rpx);
+          color: rgba(0, 0, 0, 0.4);
+          font-size: 24rpx;
+        }
+      }
+    }
+  }
+  .transfer-btn{
+    @include flex(space-between,null,null);
+    .available{
+      color: rgba(0, 0, 0, 0.9);
+      font-size: 32rpx;
+      text{
+        font-weight: 600;
+      }
+    }
+    .btn{
+      width: 362rpx;
+      height: 96rpx;
+      background-color: #EF530E;
+      border-radius: 16rpx;
+      color: #ffffff;
+      font-size: 28rpx;
+      text-align: center;
+      line-height: 96rpx;
+    }
+  }
+}
+::v-deep .tui-modal__container{
+    height: unset;
+}

+ 185 - 0
user_module/voucherPrice/components/transferPopup/index.vue

@@ -0,0 +1,185 @@
+<template>
+  <view class="transfer-box">
+    <view class="transfer-title">
+      <view>代金券转赠</view>
+      <view @click="cancel">取消</view>
+    </view>
+    <view class="transfer-list">
+      <view
+        class="transfer-item"
+        v-for="(item, index) in transferPriceList"
+        :key="index"
+        :class="idx === index ? 'act' : ''"
+        @click="changeIdx(index)"
+        >{{ item }}</view
+      >
+      <view
+        class="transfer-item custom"
+        :class="idx === 5 ? 'act' : ''"
+        @click="changeIdx(5)"
+      >
+        <text>自定义数额</text>
+        <input type="number" v-model="customNum" />
+      </view>
+    </view>
+    <view class="transfer-account">
+      <view class="account-title">转赠账号</view>
+      <view class="account-input">
+        <tui-input
+          placeholder="请输入用户手机号后点击查询"
+          padding="32rpx 0 32rpx 0"
+          borderColor="#e7e7e7"
+          :lineLeft="false"
+          v-model="searchValue"
+        >
+          <template #right>
+            <view class="query" @click="searchUser">查询</view>
+          </template>
+        </tui-input>
+      </view>
+      <view class="account-info">
+        <view class="info-image">
+          <image :src="buyerUserObj.headImage" />
+        </view>
+        <view class="info-text">
+          <view class="name">{{
+            buyerUserObj.wechatName || buyerUserObj.name
+          }}</view>
+          <view class="text" v-if="buyerUserObj.phone">
+            <text>ID:{{ buyerUserObj.buyerUserId }}</text>
+            <text>手机号:{{ buyerUserObj.phone || "" }}</text>
+          </view>
+        </view>
+      </view>
+    </view>
+    <view class="transfer-btn">
+      <view class="available"> 可用代金券:<text>{{ voucherWithdrawalIn }}</text> </view>
+      <view class="btn" @click="immediatelyBtn">立即转赠</view>
+    </view>
+    <!--  自定义弹框组件 -->
+    <modal
+      :showModal="modal"
+      :promptList="promptList"
+      @closeModal="closeModal"
+      @btnClick="backClick"
+      :showBtn="true"
+      showText="确认赠送"
+    ></modal>
+  </view>
+</template>
+
+<script>
+import { getBandUserInfoApi, bandUserInfoApi } from "@/config/index";
+export default {
+  props: {
+    voucherWithdrawalIn: {
+      type: String || Number,
+      default: 0,
+    },
+  },
+  data() {
+    return {
+      //  激活态
+      idx: "",
+      //  转赠金额列表
+      transferPriceList: [50, 100, 200, 1000, 2000],
+      searchValue: "",
+      //  转增人员信息
+      buyerUserObj: {},
+      //  转赠参数
+      transferUser: {
+        voucherNum: "",
+        buyerUserId: "",
+      },
+      //  自定义数额
+      customNum: "",
+      modal: false,
+      //  二次确认信息
+      promptList: ["转增金额:1000", "转赠账户:15170844121"],
+    };
+  },
+  methods: {
+    //  查询用户
+    async searchUser() {
+      if (this.searchValue == "") {
+        this.$showToast("请输入用户手机号后点击查询");
+        return;
+      }
+      //  手机正则校验
+      const phoneCodeVerification = /^[1][3-9][0-9]{9}$/;
+      if (!phoneCodeVerification.test(this.searchValue)) {
+        this.$showToast("手机号格式为1开头11位!");
+        return;
+      }
+      let res = await getBandUserInfoApi({ numPhone: this.searchValue });
+      console.log(res.data, Object.is(res.data, {}));
+      if (Object.keys(res.data).length == 0) {
+        this.$showToast("该用户不存在!");
+      }
+      this.buyerUserObj = res.data;
+      this.transferUser.buyerUserId = res.data.buyerUserId;
+    },
+    //  修改激活态
+    changeIdx(val) {
+      this.idx = val;
+    },
+    //  立即转增
+    immediatelyBtn() {
+      let num = 0;
+      if (this.idx == 5 && !this.customNum) {
+        this.$showToast("请输入自定义数额且不能为0");
+        return;
+      }else if(this.idx === ""){
+        this.$showToast("请选择需要赠送的额度");
+        return
+      }
+      if (this.idx == 5) {
+        num = this.customNum;
+      } else {
+        num = this.transferPriceList[this.idx];
+      }
+      if(Object.keys(this.buyerUserObj).length == 0){
+        this.$showToast("请查询需要赠送的账户");
+        return
+      }
+      // if(this.voucherWithdrawalIn < num){
+      //   this.$showToast("抱歉,你转赠的代金券不足,请先充值代金券");
+      //   return
+      // }
+      this.promptList = [
+        "转增金额:" + num,
+        "转赠账户:" + this.buyerUserObj.phone,
+      ]
+      this.modal = true;
+    },
+    //  确认赠送
+    async backClick() {
+      let obj = {
+        voucherNum:0,
+        buyerUserId:""
+      }
+      if (this.idx == 5) {
+        obj.voucherNum = this.customNum;
+      } else {
+        obj.voucherNum = this.transferPriceList[this.idx];
+      }
+      obj.buyerUserId = this.buyerUserObj.buyerUserId;
+      //  请求
+      let res = await bandUserInfoApi(obj);
+      console.log(res);
+    },
+    // 关闭二次确认弹框
+    closeModal() {
+      this.modal = false;
+    },
+    //  取消按钮
+    cancel(){
+      this.$emit('cancel')
+    }
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+@import "./index.scss";
+</style>

+ 197 - 0
user_module/voucherPrice/index.scss

@@ -0,0 +1,197 @@
+.balance {
+  width: 100vw;
+  min-height: 100vh;
+  background-color: rgb(247, 247, 247);
+  padding: 32rpx;
+  padding-bottom: 50rpx;
+  box-sizing: border-box;
+  .header-box{
+    width: 100%;
+    height: 384rpx;
+    position: relative;
+    .balance-header {
+      width: 100%;
+      height: 304rpx;
+       background: url("@/static/image/user/voucherPrice_bg.png") no-repeat;
+       background-size: 100% 100%;
+       position: relative;
+       z-index: 5;
+       padding: 0 48rpx;
+       padding-top: 48rpx;
+       box-sizing: border-box;
+       .header-top {
+         @include flex(space-between, null, null);
+         .price-left {
+           @include flex(center, column, 10rpx);
+           text {
+             &:nth-of-type(1) {
+               font-size: 56rpx;
+               background: linear-gradient(180deg, #ffffff 0%, #ffcac0 100%);
+               -webkit-background-clip: text;
+               -webkit-text-fill-color: transparent;
+               font-weight: 600;
+             }
+             &:nth-of-type(2) {
+               color: #ffffff;
+               font-size: 28rpx;
+             }
+           }
+         }
+         .price-right {
+           width: 160rpx;
+           height: 64rpx;
+           text-align: center;
+           line-height: 64rpx;
+           font-size: 32rpx;
+           font-weight: 500;
+           background: rgba(255, 255, 255, 0.4);
+           border: 2rpx solid rgba(255, 255, 255, 0.39);
+           color: #ffffff;
+           border-radius: 50rpx;
+         }
+       }
+       .header-bottom {
+         position: absolute;
+         bottom: 0;
+         left: 50%;
+         transform: translateX(-50%);
+         width: calc(100% - 64rpx);
+         height: 96rpx;
+         border-top: 2rpx solid rgba(255, 255, 255, 0.4);
+         @include flex(flex-start, null, 104rpx);
+         .text-box {
+           @include flex(flex-start, null, 16rpx);
+           text {
+             &:nth-of-type(1) {
+               color: rgba(255, 255, 255, 0.8);
+               font-size: 24rpx;
+             }
+             &:nth-of-type(2) {
+               color: #ffffff;
+               font-size: 32rpx;
+               font-weight: 600;
+             }
+           }
+         }
+       }
+     }
+     .header-tool{
+      width: 100%;
+      height: 96rpx;
+      background-color: #ffffff;
+      position: absolute;
+      left: 0;
+      bottom: 2rpx;
+      z-index: 2;
+      border-radius: 16rpx;
+      @include flex(center,null,null);
+      .tool-item{
+        flex: 1;
+        height: 100%;
+        text-align: center;
+        line-height: 116rpx;
+        color: #EA5C1E;
+        font-size: 28rpx;
+        font-weight: 600;
+        &:nth-of-type(1){
+          position: relative;
+          &::after{
+            content: '';
+            position: absolute;
+            right: 0;
+            top: 40rpx;
+            width: 2rpx;
+            background-color: #EBEBEB;
+            height: 50%;
+          }
+        }
+      }
+     }
+  }
+
+  .balance-container {
+    width: 100%;
+    margin-top: 32rpx;
+    .text-tab {
+      @include flex(flex-start, null, 64rpx);
+      view {
+        color: rgba(0, 0, 0, 0.4);
+        font-size: 32rpx;
+        padding-bottom: 10rpx;
+      }
+      .active {
+        position: relative;
+        color: rgba(0, 0, 0, 0.9);
+        &::after {
+          content: "";
+          position: absolute;
+          left: 50%;
+          transform: translateX(-50%);
+          bottom: 0;
+          width: 32rpx;
+          height: 8rpx;
+          background-color: #ff604e;
+          border-radius: 4rpx;
+        }
+      }
+    }
+    .record-list {
+      margin-top: 16rpx;
+      width: 100%;
+      background-color: #ffffff;
+      border-radius: 16rpx;
+      .record-item {
+        width: 100%;
+        height: 168rpx;
+        border-bottom: 2rpx solid #f1f1f1;
+        padding: 32rpx 24rpx 32rpx 32rpx;
+        box-sizing: border-box;
+        @include flex(space-between, null, null);
+        .item-left {
+          @include flex(center, column, 16rpx);
+          align-items: flex-start;
+          text {
+            &:nth-of-type(1) {
+              color: rgba(0, 0, 0, 0.9);
+              font-size: 28rpx;
+              font-weight: 600;
+            }
+            &:nth-of-type(2) {
+              color: rgba(0, 0, 0, 0.4);
+              font-size: 28rpx;
+            }
+          }
+        }
+        .item-right {
+          font-size: 28rpx;
+          color: #ea5c1e;
+          font-weight: 900;
+        }
+      }
+      .no-more {
+        width: 100%;
+        height: 100rpx;
+        text-align: center;
+        line-height: 100rpx;
+        font-size: 24rpx;
+        color: rgba(0, 0, 0, 0.24);
+      }
+    }
+    .empty {
+      margin-top: 96rpx;
+      width: 100%;
+      @include flex(flex-start, column, 32rpx);
+      image {
+        width: 320rpx;
+        height: 320rpx;
+        display: block;
+      }
+
+      text {
+        font-weight: 600;
+        font-size: 28rpx;
+        color: rgba(0, 0, 0, 0.4);
+      }
+    }
+  }
+}

+ 202 - 0
user_module/voucherPrice/index.vue

@@ -0,0 +1,202 @@
+<template>
+  <view class="balance">
+    <view class="header-box">
+      <view class="balance-header">
+        <view class="header-top">
+          <view class="price-left">
+            <text>{{ financeInfo.voucherWithdrawal || 0 }}</text>
+            <text>可提现</text>
+          </view>
+          <view class="price-right" @click="navigateTo(`/pages_module/withdrawal/index`)">提现</view>
+        </view>
+        <view class="header-bottom">
+          <view class="text-box">
+            <text>提现中</text>
+            <text>{{ financeInfo.voucherWithdrawalIn || 0 }}</text>
+          </view>
+          <view class="text-box">
+            <text>已提现</text>
+            <text>{{ financeInfo.voucherWithdrawn }}</text>
+          </view>
+        </view>
+      </view>
+      <view class="header-tool">
+        <view class="tool-item" @click="goShow(1)">去充值</view>
+        <view class="tool-item" @click="goShow(0)">去转赠</view>
+      </view>
+    </view>
+
+    <view class="balance-container">
+      <view class="text-tab">
+        <view
+          v-for="(item, index) in tabList"
+          :key="item"
+          :class="idx == index ? 'active' : ''"
+          @click="changeTab(index)"
+          >{{ item }}</view
+        >
+      </view>
+      <view v-show="idx == 0">
+        <template v-if="recordList.length > 0">
+          <view class="record-list">
+            <view class="record-item" v-for="item in recordList" :key="item">
+              <view class="item-left">
+                <text>提现支出</text>
+                <text>{{ item.time }}</text>
+              </view>
+              <template v-if="item.state == 0">
+                <view class="item-right">+{{ item.income }}</view>
+              </template>
+              <template v-else>
+                <view class="item-right">-{{ item.expenditure }}</view>
+              </template>
+            </view>
+            <view class="no-more">没有更多啦</view>
+          </view>
+        </template>
+        <template v-else>
+          <view class="empty">
+            <image class="" src="@/static/image/order/empty.png" />
+            <text>暂无提现记录</text>
+          </view>
+        </template>
+      </view>
+      <view v-show="idx == 1">
+        <template v-if="withdrawalList.length > 0">
+          <view class="record-list">
+            <view
+              class="record-item"
+              v-for="item in withdrawalList"
+              :key="item"
+            >
+              <view class="item-left">
+                <text>提现支出</text>
+                <text>{{ item.time }}</text>
+              </view>
+              <template v-if="item.state == 0">
+                <view class="item-right">+{{ item.income }}</view>
+              </template>
+              <template v-else>
+                <view class="item-right">-{{ item.expenditure }}</view>
+              </template>
+            </view>
+            <view class="no-more">没有更多啦</view>
+          </view>
+        </template>
+        <template v-else>
+          <view class="empty">
+            <image class="" src="@/static/image/order/empty.png" />
+            <text>暂无提现记录</text>
+          </view>
+        </template>
+      </view>
+    </view>
+    <tui-bottom-popup
+      :zIndex="1000"
+      backgroundColor="#FFFFFF"
+      :show="showPopup"
+      @close="clonePopup"
+    >
+      <template v-if="isShowComponent == 0">
+        <transferPopup
+          :voucherWithdrawalIn="financeInfo.voucherWithdrawalIn"
+          @cancel="clonePopup"
+        />
+      </template>
+      <template v-else>
+        <rechargePopup @cancel="clonePopup" />
+      </template>
+    </tui-bottom-popup>
+  </view>
+</template>
+
+<script>
+import { getFinanceCount, getWithdrawal } from "@/config/index.js";
+
+import transferPopup from "./components/transferPopup/index.vue";
+import rechargePopup from "./components/rechargePopup/index.vue";
+
+export default {
+  onLoad(option) {
+    //  获取流水接口
+    this.getFinance();
+    //  获取提现记录
+    this.getWithList();
+  },
+  components: {
+    transferPopup,
+    rechargePopup,
+  },
+  data() {
+    return {
+      idx: 0,
+      tabList: ["收支明细", "提现记录"],
+      //  提现记录的请求参数
+      queryData: {
+        page: 1,
+        pageSize: 10,
+        withdrawalType: 3,
+      },
+      //  提现记录的请求参数
+      withdeQuery: {
+        page: 1,
+        pageSize: 10,
+        withdrawalType: 3,
+      },
+      //  提现记录列表
+      withdrawalList: [],
+      //  流水信息
+      financeInfo: {},
+      //  收支明细列表
+      recordList: [],
+      //  控制 转赠 弹框
+      showPopup: false,
+      //  控制显示组件
+      isShowComponent: 1,
+    };
+  },
+  methods: {
+    // 获取流水
+    async getFinance() {
+      this.$loading.show("加载中");
+      try {
+        let res = await getFinanceCount(this.queryData);
+        this.financeInfo = res.data;
+        //  对于数据进行处理 如果有支出的话就加上这一个支出
+        let list = res.data.finances.reduce((prev, item, index) => {
+          prev.push({ ...item, state: 0 });
+          if (item.expenditure > 0) {
+            prev.push({ ...item });
+          }
+          return prev;
+        }, []);
+        this.recordList = list;
+      } finally {
+        this.$loading.hide();
+      }
+    },
+    //  获取体现记录
+    async getWithList() {
+      let res = await getWithdrawal(this.withdeQuery);
+      this.withdrawalList = res.data;
+      console.log(res);
+    },
+    //  获取体现记录
+    changeTab(idx) {
+      this.idx = idx;
+    },
+    //  关闭转赠弹框
+    clonePopup() {
+      this.showPopup = false;
+    },
+    goShow(val) {
+      this.isShowComponent = val;
+      this.showPopup = true;
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+@import "./index.scss";
+</style>