瀏覽代碼

fix:页面样式修改

刘恒 2 年之前
父節點
當前提交
6e4b3453af

+ 2 - 2
.env

@@ -7,6 +7,6 @@ VUE_APP_USER_KEY=admin.user
 VUE_APP_SETTING_KEY=admin.setting
 VUE_APP_TBAS_KEY=admin.tabs
 VUE_APP_TBAS_TITLES_KEY=admin.tabs.titles
-VUE_APP_API_BASE_URL=https://test.baoxianzhanggui.com/web-api
-VUE_APP_BASE_URL=https://test.baoxianzhanggui.com
+VUE_APP_API_BASE_URL=https://sxzgkj.baoxianzhanggui.com/web-api
+VUE_APP_BASE_URL=https://sxzgkj.baoxianzhanggui.com
 

+ 2 - 2
.env.development

@@ -1,4 +1,4 @@
-VUE_APP_API_BASE_URL='https://test.baoxianzhanggui.com/web-api'
+VUE_APP_API_BASE_URL='http://192.168.0.42:8080/'
 # VUE_APP_API_BASE_URL='"https://test.baoxianzhanggui.com/web-api"'  #//测试服务器
 # VUE_APP_API_BASE_URL='"https://sxzgkj.baoxianzhanggui.com/web-api"'  #//正式服务器
 # VUE_APP_API_BASE_URL= '"http://192.168.0.115:8080/"'                 #//凯森
@@ -9,4 +9,4 @@ VUE_APP_API_BASE_URL='https://test.baoxianzhanggui.com/web-api'
 
 # VUE_APP_API_BASE_URL= '"http://192.168.1.101:8080/"'
 # VUE_APP_API_BASE_URL= '"http://192.168.0.250:8080/"'//
-# VUE_APP_API_BASE_URL= 'http://192.168.0.103:8080'                 #//霍续亮
+#  VUE_APP_API_BASE_URL= 'http://192.168.0.103:8080'                 #//霍续亮

二進制
dist.zip


+ 30 - 24
public/index.html

@@ -1,29 +1,35 @@
 <!DOCTYPE html>
 <html lang="en" class="beauty-scroll">
-  <head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width,initial-scale=1.0">
-    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
-    <link  rel="stylesheet" href="./reset.css">
 
-    <title><%= process.env.VUE_APP_NAME %></title>
-    <!-- require cdn assets css -->
-    <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) { %>
-      <link rel="stylesheet" href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" />
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width,initial-scale=1.0">
+  <link rel="icon" href="<%= BASE_URL %>favicon.ico">
+  <link rel="stylesheet" href="./reset.css">
+
+  <title>
+    <%= process.env.VUE_APP_NAME %>
+  </title>
+  <!-- require cdn assets css -->
+  <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) { %>
+    <link rel="stylesheet" href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" />
     <% } %>
-  </head>
-  <body>
-    <noscript>
-      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
-    </noscript>
-    <div id="popContainer" class="beauty-scroll" style="height: 100vh;">
-      <div id="app"></div>
-    </div>
-    <!-- require cdn assets js -->
-    <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %>
-      <script type="text/javascript" src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
+</head>
+
+<body>
+  <noscript>
+    <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
+        Please enable it to continue.</strong>
+  </noscript>
+  <div id="popContainer" class="beauty-scroll" style="height: 100vh;">
+    <div id="app"></div>
+  </div>
+  <!-- require cdn assets js -->
+  <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %>
+    <script type="text/javascript" src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
     <% } %>
-    <!-- built files will be auto injected -->
-  </body>
-</html>
+      <!-- built files will be auto injected -->
+</body>
+
+</html>

+ 137 - 36
public/reset.css

@@ -1,68 +1,154 @@
 /* 清除内外边距 */
-body, h1, h2, h3, h4, h5, h6, hr, p, blockquote,
-dl, dt, dd, ul, ol, li,
+body,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+hr,
+p,
+blockquote,
+dl,
+dt,
+dd,
+ul,
+ol,
+li,
 pre,
-fieldset, lengend, button, input, textarea,
-th, td {
+fieldset,
+lengend,
+button,
+input,
+textarea,
+th,
+td {
     margin: 0;
     padding: 0;
 }
- 
+
 /* 设置默认字体 */
 body,
-button, input, select, textarea { /* for ie */
+button,
+input,
+select,
+textarea {
+    /* for ie */
     /*font: 12px/1 Tahoma, Helvetica, Arial, "宋体", sans-serif;*/
-    font: 12px/1.3 "Microsoft YaHei",Tahoma, Helvetica, Arial, "\5b8b\4f53", sans-serif; /* 用 ascii 字符表示,使得在任何编码下都无问题 */
+    font: 12px/1.3 "Microsoft YaHei", Tahoma, Helvetica, Arial, "\5b8b\4f53", sans-serif;
+    /* 用 ascii 字符表示,使得在任何编码下都无问题 */
     color: #333;
 }
- 
-h1 { font-size: 18px; /* 18px / 12px = 1.5 */ }
-h2 { font-size: 16px; }
-h3 { font-size: 14px; }
-h4, h5, h6 { font-size: 100%; }
- 
-address, cite, dfn, em, var, i{ font-style: normal; } /* 将斜体扶正 */
-b, strong{ font-weight: normal; } /* 将粗体扶细 */
-code, kbd, pre, samp, tt { font-family: "Courier New", Courier, monospace; } /* 统一等宽字体 */
-small { font-size: 12px; } /* 小于 12px 的中文很难阅读,让 small 正常化 */
- 
+
+h1 {
+    font-size: 18px;
+    /* 18px / 12px = 1.5 */
+}
+
+h2 {
+    font-size: 16px;
+}
+
+h3 {
+    font-size: 14px;
+}
+
+h4,
+h5,
+h6 {
+    font-size: 100%;
+}
+
+address,
+cite,
+dfn,
+em,
+var,
+i {
+    font-style: normal;
+}
+
+/* 将斜体扶正 */
+b,
+strong {
+    font-weight: normal;
+}
+
+/* 将粗体扶细 */
+code,
+kbd,
+pre,
+samp,
+tt {
+    font-family: "Courier New", Courier, monospace;
+}
+
+/* 统一等宽字体 */
+small {
+    font-size: 12px;
+}
+
+/* 小于 12px 的中文很难阅读,让 small 正常化 */
+
 /* 重置列表元素 */
-ul, ol { list-style: none; }
- 
+ul,
+ol {
+    list-style: none;
+}
+
 /* 重置文本格式元素 */
-a { text-decoration: none; color: #666;}
- 
+a {
+    text-decoration: none;
+    color: #666;
+}
+
 /* 重置表单元素 */
-legend { color: #000; } /* for ie6 */
-fieldset, img { border: none; }
-button, input, select, textarea {
-    font-size: 100%; /* 使得表单元素在 ie 下能继承字体大小 */
+legend {
+    color: #000;
+}
+
+/* for ie6 */
+fieldset,
+img {
+    border: none;
 }
- 
+
+button,
+input,
+select,
+textarea {
+    font-size: 100%;
+    /* 使得表单元素在 ie 下能继承字体大小 */
+}
+
 /* 重置表格元素 */
 table {
     border-collapse: collapse;
     border-spacing: 0;
 }
- 
+
 /* 重置 hr */
 hr {
     border: none;
     height: 1px;
 }
-.clearFix::after{
-    content:"";
+
+.clearFix::after {
+    content: "";
     display: block;
-    clear:both;
+    clear: both;
 }
+
 /* 让非ie浏览器默认也显示垂直滚动条,防止因滚动条引起的闪烁 */
-html { overflow-y: scroll; }
- 
-a:link:hover{
-    color : rgb(79, 76, 212) !important;
+html {
+    overflow-y: scroll;
+}
+
+a:link:hover {
+    color: rgb(79, 76, 212) !important;
     text-decoration: underline;
 }
- 
+
 /* 清除浮动 */
 .clearfix::after {
     display: block;
@@ -70,4 +156,19 @@ a:link:hover{
     content: "";
     clear: both;
     visibility: hidden;
+}
+
+/* 针对整个滚动条按钮的设置 */
+::-webkit-scrollbar-button {
+    display: none;
+}
+
+/* 针对滚动条按钮的鼠标悬停状态 */
+::-webkit-scrollbar-button:hover {
+    display: none;
+}
+
+/* 针对滚动条按钮的按下状态 */
+::-webkit-scrollbar-button:active {
+    display: none;
 }

+ 2 - 1
src/App.vue

@@ -114,6 +114,7 @@ export default {
 </script>
 
 <style lang="less" scoped>
-#id {
+.ant-tree li ul {
+  padding-left: 8px !important;
 }
 </style>

二進制
src/assets/img/bgColor.png


二進制
src/assets/img/man.png


二進制
src/assets/img/woman.png


+ 39 - 1
src/components/menu/SideMenu.vue

@@ -1,7 +1,7 @@
 <template>
   <a-layout-sider
     :theme="sideTheme"
-    :class="['side-menu', 'beauty-scroll', isMobile ? null : 'shadow']"
+    :class="['side-menu', isMobile ? null : 'shadow']"
     width="256px"
     :collapsible="collapsible"
     v-model="collapsed"
@@ -106,4 +106,42 @@ export default {
 
 <style lang="less" scoped>
 @import "index";
+.ant-layout .ant-layout-sider {
+  overflow-y: auto;
+  overflow-x: hidden;
+  scrollbar-color: #000 !important;
+  scrollbar-width: thin;
+  -ms-overflow-style: none;
+  position: relative;
+
+  /* 滚动条轨道样式 */
+  // &::-webkit-scrollbar {
+  //   width: 8px; /* 设置滚动条宽度 */
+  // }
+
+  /* 滚动条滑块样式 */
+  &::-webkit-scrollbar-thumb {
+    background-color: blue !important; /* 设置滑块背景颜色 */
+    border-radius: 4px; /* 设置滑块圆角 */
+  }
+
+  /* 滚动条轨道hover状态样式 */
+  &::-webkit-scrollbar-track:hover {
+    background-color: #f1f1f1; /* 设置轨道hover状态时的背景颜色 */
+  }
+
+  /* 滚动条滑块hover状态样式 */
+  &::-webkit-scrollbar-thumb:hover {
+    background-color: #555; /* 设置滑块hover状态时的背景颜色 */
+  }
+}
+.ant-layout .ant-layout-sider::-webkit-scrollbar-button {
+  display: none;
+}
+
+.ant-layout .ant-layout-sider::-webkit-scrollbar-thumb {
+  border-radius: 8px;
+  box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
+  background: #666666;
+}
 </style>

+ 22 - 9
src/components/menu/index.less

@@ -1,11 +1,19 @@
-.shadow{
+.shadow {
   box-shadow: 2px 0 6px rgba(0, 21, 41, .35);
+
+  ::-webkit-scrollbar-button {
+    display: none !important;
+    width: 0;
+    height: 0;
+  }
 }
-.side-menu{
+
+.side-menu {
   min-height: 100vh;
   overflow-y: auto;
   z-index: 10;
-  .logo{
+
+  .logo {
     height: 64px;
     position: relative;
     line-height: 64px;
@@ -13,26 +21,31 @@
     -webkit-transition: all .3s;
     transition: all .3s;
     overflow: hidden;
+
     // background-color: @layout-trigger-background;
-    &.light{
+    &.light {
       background-color: #fff;
-      h1{
+
+      h1 {
         // color: @primary-color;
       }
     }
-    h1{
+
+    h1 {
       // color: @menu-dark-highlight-color;
       font-size: 20px;
       margin: 0 0 0 12px;
       display: inline-block;
       vertical-align: middle;
     }
-    img{
+
+    img {
       width: 32px;
       vertical-align: middle;
     }
   }
 }
-.menu{
+
+.menu {
   padding: 16px 0;
-}
+}

+ 5 - 1
src/components/table/StandardTable.vue

@@ -193,7 +193,11 @@ export default {
     background: #fff;
   }
   /deep/ .ant-table-tbody > tr.highlight-row {
-    background: #dee9f9;
+    background: linear-gradient(
+      90deg,
+      rgba(52, 93, 230, 0.1) 0%,
+      rgba(113, 229, 236, 0.1) 100%
+    );
     // opacity: ;
   }
 }

+ 3 - 2
src/layouts/AdminLayout.vue

@@ -1,5 +1,5 @@
 <template>
-  <a-layout :class="['admin-layout', 'beauty-scroll']">
+  <a-layout :class="['admin-layout']">
     <drawer v-if="isMobile" v-model="drawerOpen">
       <side-menu
         :theme="theme.mode"
@@ -29,7 +29,7 @@
       </div>
       <setting />
     </drawer>
-    <a-layout class="admin-layout-main beauty-scroll">
+    <a-layout class="admin-layout-main">
       <admin-header
         :class="[
           {
@@ -205,6 +205,7 @@ export default {
   .admin-layout-content {
     padding: 24px 24px 0;
     box-sizing: border-box;
+    overflow-y: auto;
     // background: #fff;
     /*overflow-x: hidden;*/
     /*min-height: calc(100vh - 64px - 122px);*/

+ 94 - 68
src/layouts/PageLayout.vue

@@ -13,7 +13,7 @@
       </div>
       <slot v-if="this.$slots.extra" slot="extra" name="extra"></slot>
     </page-header> -->
-    <div ref="page" :class="['page-content', layout, pageWidth]" >
+    <div ref="page" :class="['page-content', layout, pageWidth]">
       <slot></slot>
     </div>
   </div>
@@ -21,124 +21,150 @@
 
 <script>
 // import PageHeader from '@/components/page/header/PageHeader'
-import {mapState, mapMutations} from 'vuex'
-import {getI18nKey} from '@/utils/routerUtil'
+import { mapState, mapMutations } from "vuex";
+import { getI18nKey } from "@/utils/routerUtil";
 
 export default {
-  name: 'PageLayout',
+  name: "PageLayout",
   components: {},
-  props: ['desc', 'logo', 'title', 'avatar', 'linkList', 'extraImage'],
-  data () {
+  props: ["desc", "logo", "title", "avatar", "linkList", "extraImage"],
+  data() {
     return {
       page: {},
       pageHeaderHeight: 0,
-    }
+    };
   },
   watch: {
     $route() {
-      this.page = this.$route.meta.page
-    }
+      this.page = this.$route.meta.page;
+    },
   },
   updated() {
     if (!this._inactive) {
-      this.updatePageHeight()
+      this.updatePageHeight();
     }
   },
   activated() {
-    this.updatePageHeight()
+    this.updatePageHeight();
   },
   deactivated() {
-    this.updatePageHeight(0)
+    this.updatePageHeight(0);
   },
   mounted() {
-    this.updatePageHeight()
+    this.updatePageHeight();
   },
   created() {
-    this.page = this.$route.meta.page
+    this.page = this.$route.meta.page;
   },
   beforeDestroy() {
-    this.updatePageHeight(0)
+    this.updatePageHeight(0);
   },
   computed: {
-    ...mapState('setting', ['layout', 'multiPage', 'pageMinHeight', 'pageWidth', 'customTitles']),
+    ...mapState("setting", [
+      "layout",
+      "multiPage",
+      "pageMinHeight",
+      "pageWidth",
+      "customTitles",
+    ]),
     pageTitle() {
-      let pageTitle = this.page && this.page.title
-      return this.customTitle || (pageTitle && this.$t(pageTitle)) || this.title || this.routeName
+      let pageTitle = this.page && this.page.title;
+      return (
+        this.customTitle ||
+        (pageTitle && this.$t(pageTitle)) ||
+        this.title ||
+        this.routeName
+      );
     },
     routeName() {
-      const route = this.$route
-      return this.$t(getI18nKey(route.matched[route.matched.length - 1].path))
+      const route = this.$route;
+      return this.$t(getI18nKey(route.matched[route.matched.length - 1].path));
     },
     breadcrumb() {
-      let page = this.page
-      let breadcrumb = page && page.breadcrumb
+      let page = this.page;
+      let breadcrumb = page && page.breadcrumb;
       if (breadcrumb) {
-        let i18nBreadcrumb = []
-        breadcrumb.forEach(item => {
-          i18nBreadcrumb.push(this.$t(item))
-        })
-        return i18nBreadcrumb
+        let i18nBreadcrumb = [];
+        breadcrumb.forEach((item) => {
+          i18nBreadcrumb.push(this.$t(item));
+        });
+        return i18nBreadcrumb;
       } else {
-        return this.getRouteBreadcrumb()
+        return this.getRouteBreadcrumb();
       }
     },
     marginCorrect() {
-      return this.multiPage ? 24 : 0
-    }
+      return this.multiPage ? 24 : 0;
+    },
   },
   methods: {
-    ...mapMutations('setting', ['correctPageMinHeight']),
+    ...mapMutations("setting", ["correctPageMinHeight"]),
     getRouteBreadcrumb() {
-      let routes = this.$route.matched
-      const path = this.$route.path
-      let breadcrumb = []
-      routes.filter(item => path.includes(item.path))
-        .forEach(route => {
-        const path = route.path.length === 0 ? '/home' : route.path
-        breadcrumb.push(this.$t(getI18nKey(path)))
-      })
-      let pageTitle = this.page && this.page.title
+      let routes = this.$route.matched;
+      const path = this.$route.path;
+      let breadcrumb = [];
+      routes
+        .filter((item) => path.includes(item.path))
+        .forEach((route) => {
+          const path = route.path.length === 0 ? "/home" : route.path;
+          breadcrumb.push(this.$t(getI18nKey(path)));
+        });
+      let pageTitle = this.page && this.page.title;
       if (this.customTitle || pageTitle) {
-        breadcrumb[breadcrumb.length - 1] = this.customTitle || pageTitle
+        breadcrumb[breadcrumb.length - 1] = this.customTitle || pageTitle;
       }
-      return breadcrumb
+      return breadcrumb;
     },
     /**
      * 用于计算页面内容最小高度
      * @param newHeight
      */
-    updatePageHeight(newHeight =  this.marginCorrect) {
+    updatePageHeight(newHeight = this.marginCorrect) {
       // this.correctPageMinHeight(this.pageHeaderHeight - newHeight)
-      this.pageHeaderHeight = newHeight
-    }
-  }
-}
+      this.pageHeaderHeight = newHeight;
+    },
+  },
+};
 </script>
 
 <style lang="less">
-  .page-header{
-    margin: 0 -24px 0;
-  }
-  .link{
-    /*margin-top: 16px;*/
-    line-height: 24px;
-    a{
-      font-size: 14px;
-      margin-right: 32px;
-      i{
-        font-size: 22px;
-        margin-right: 8px;
-      }
+.page-layout {
+  width: 100%;
+  height: 100%;
+}
+.page-header {
+  margin: 0 -24px 0;
+}
+.link {
+  /*margin-top: 16px;*/
+  line-height: 24px;
+  a {
+    font-size: 14px;
+    margin-right: 32px;
+    i {
+      font-size: 22px;
+      margin-right: 8px;
     }
   }
-  .page-content{
-    position: relative;
-    // padding: 24px 0 0;
-    &.side{
-    }
-    &.head.fixed{
-      margin: 0 auto;
-      max-width: 1400px;
+}
+.page-content {
+  position: relative;
+  width: 100%;
+  height: 100%;
+  > div {
+    width: 100%;
+    height: 100%;
+    > div {
+      width: 100%;
+      height: 100%;
     }
   }
+  // padding: 24px 0 0;
+  &.side {
+  }
+  &.head.fixed {
+    margin: 0 auto;
+    max-width: 1400px;
+  }
+}
 </style>

+ 16 - 4
src/layouts/header/HeaderAvatar.vue

@@ -1,8 +1,14 @@
 <template>
   <a-dropdown>
     <div class="header-avatar" style="cursor: pointer">
-      <a-avatar class="avatar" size="small" shape="circle" :src="user.avatar" />
-      <span class="name">{{ user.name }}</span>
+      <a-avatar
+        class="avatar"
+        size="small"
+        shape="circle"
+        :src="process + userInfo.headSculpture"
+      />
+      <!-- {{ process + userInfo.headSculpture }} -->
+      <span class="name">{{ userInfo.name }}</span>
     </div>
     <a-menu :class="['avatar-menu']" slot="overlay">
       <a-menu-item>
@@ -23,14 +29,20 @@
 </template>
 
 <script>
-import { mapGetters } from "vuex";
+import { mapState } from "vuex";
 import { logout } from "@/services/user";
 
 export default {
   name: "HeaderAvatar",
+  data() {
+    return {
+      process: process.env.VUE_APP_API_BASE_URL,
+    };
+  },
   computed: {
-    ...mapGetters("account", ["user"]),
+    ...mapState("setting", ["userInfo"]),
   },
+  created() {},
   methods: {
     logout() {
       logout();

+ 5 - 0
src/layouts/tabs/TabsView.vue

@@ -382,9 +382,14 @@ export default {
 }
 .tabs-view-content {
   position: relative;
+  height: 100%;
   &.head.fixed {
     width: 1400px;
     margin: 0 auto;
   }
+  > div {
+    width: 100%;
+    height: 100%;
+  }
 }
 </style>

+ 2 - 1
src/main.js

@@ -39,9 +39,11 @@ import CryptoJS from "crypto-js";
 
 
 if (window.location.href.includes('token')) {
+
   const decryptedBytes = CryptoJS.AES.decrypt(window.location.href.split("=")[1],
     'token')
   const token = decryptedBytes.toString(CryptoJS.enc.Utf8);
+  console.log(token)
 
 
   setAuthorization(token,)
@@ -55,7 +57,6 @@ if (window.location.href.includes('token')) {
 //   }
 // })
 
-
 new Vue({
   router,
   store,

+ 51 - 22
src/pages/business/index.vue

@@ -46,26 +46,30 @@
     </div>
     <div class="list-details">
       <a-spin :spinning="listLoading">
-        <h2>保险分布</h2>
-        <p>{{ chooseTable.insuranceCompanyName }}保险承保状态数据展示</p>
-        <div
-          v-for="(item, index) in list"
-          :key="index"
-          :class="'list-details-item-' + index"
-          class="list-details-item"
-        >
-          <h2>{{ quotationStatus[item.quotationStatus] }}</h2>
-          <p>
-            <span>总保费:{{ item.totalPremium }}</span>
-            <span>人员数量:{{ item.userNumber }}</span>
-          </p>
-          <p>
-            <span>单均保费:{{ item.averagePremium }}</span>
-            <span>出单笔数:{{ item.qutationInsureCount }}</span>
-          </p>
-          <p>
-            <span>人均产能:{{ item.perCapitaAmount }}</span>
-          </p>
+        <div class="list-details-title">
+          <h2>保险分布</h2>
+          <p>{{ chooseTable.insuranceCompanyName }}保险承保状态数据展示</p>
+        </div>
+        <div style="padding: 0 15px; box-sizing: border-box">
+          <div
+            v-for="(item, index) in list"
+            :key="index"
+            :class="'list-details-item-' + index"
+            class="list-details-item"
+          >
+            <h2>{{ quotationStatus[item.quotationStatus] }}</h2>
+            <p>
+              <span>总保费:{{ item.totalPremium }}</span>
+              <span>人员数量:{{ item.userNumber }}</span>
+            </p>
+            <p>
+              <span>单均保费:{{ item.averagePremium }}</span>
+              <span>出单笔数:{{ item.qutationInsureCount }}</span>
+            </p>
+            <p>
+              <span>人均产能:{{ item.perCapitaAmount }}</span>
+            </p>
+          </div>
         </div>
       </a-spin>
       <!-- </a-spin> -->
@@ -278,8 +282,9 @@ export default {
     background: #fff;
     // box-shadow: 0px 2px 8px 0px rgba(42, 85, 229, 0.15);
     border-radius: 8px 8px 8px 8px;
-    padding: 15px;
+    // padding: 15px;
     box-sizing: border-box;
+
     div.list-details-item {
       //   border: 1px solid #f0f0f0;
       padding: 10px;
@@ -295,31 +300,55 @@ export default {
     div.list-details-item-0 {
       background: rgba(13, 215, 215, 0.05);
       border: 1px solid rgba(19, 168, 168, 0.1);
+      h2 {
+        color: #13a8a8;
+        font-weight: bold;
+      }
     }
     div.list-details-item-1 {
       background: rgba(23, 125, 220, 0.05);
 
       border: 1px solid rgba(23, 125, 220, 0.1);
+      h2 {
+        color: #177ddc;
+        font-weight: bold;
+      }
     }
     div.list-details-item-2 {
       background: rgba(216, 74, 27, 0.05);
 
       border: 1px solid rgba(216, 74, 27, 0.1);
+      h2 {
+        color: #d84a1b;
+        font-weight: bold;
+      }
     }
     div.list-details-item-3 {
       background: rgba(42, 85, 229, 0.05);
 
       border: 1px solid rgba(42, 85, 229, 0.1);
+      h2 {
+        color: #2a55e5;
+        font-weight: bold;
+      }
     }
     div.list-details-item-4 {
       background: rgba(211, 32, 41, 0.05);
 
       border: 1px solid rgba(211, 32, 41, 0.1);
+      h2 {
+        color: #d32029;
+        font-weight: bold;
+      }
     }
     // border: 2px solid rgba(255, 255, 255, 0.2);
   }
 }
-
+.list-details-title {
+  padding: 15px;
+  box-sizing: border-box;
+  background: url("../../assets/img/bgColor.png") 100% 100%;
+}
 .personnel-message {
   display: flex;
   flex-wrap: wrap;

+ 22 - 1
src/pages/personnelManage/channel.vue

@@ -74,7 +74,13 @@
             <span>单均保费:{{ item.averagePremium || 0 }}</span>
           </p>
           <div class="user-icon">
-            <img :src="process + item.filePath" alt="" />
+            <img v-show="item.filePath" :src="process + item.filePath" alt="" />
+            <img
+              v-if="!item.filePath && item.sex == 'm'"
+              src="../../assets/img/man.png"
+              alt=""
+            />
+            <img v-else src="../../assets/img/woman.png" alt="" />
           </div>
           <p>
             <a-button type="primary" @click="teamMessage(item)">详情</a-button>
@@ -174,6 +180,19 @@ export default {
       this.pageInfo.pageSize = pageSize;
       this.getList();
     },
+    teamMessage(item) {
+      // item
+      // console.log(this.$route)
+      this.$router.push({
+        path: "/personnelManage/front/teammanage",
+        query: {
+          userId: item.userId,
+          totalManpower: item.totalManpower,
+          totalPremium: item.totalPremium,
+          orderManpower: item.orderManpower,
+        },
+      });
+    },
   },
 };
 </script>
@@ -246,6 +265,8 @@ export default {
     // background: #f9faff;
     border-radius: 8px;
     border: 1px solid #2a55e5;
+    background: #f9faff;
+    box-shadow: 0px 2px 8px 0px rgba(42, 85, 229, 0.15);
     padding: 15px;
     box-sizing: border-box;
     margin-bottom: 15px;

+ 20 - 1
src/pages/personnelManage/front/resources.vue

@@ -69,7 +69,13 @@
             <span>总保费:{{ item.totalPremium || 0 }}</span>
           </p>
           <div class="user-icon">
-            <img :src="process + item.filePath" alt="" />
+            <img v-show="item.filePath" :src="process + item.filePath" alt="" />
+            <img
+              v-if="!item.filePath && item.sex == 'm'"
+              src="../../../assets/img/man.png"
+              alt=""
+            />
+            <img v-else src="../../../assets/img/woman.png" alt="" />
           </div>
           <!-- <div class="progress">
             <p></p>
@@ -174,6 +180,19 @@ export default {
       this.pageInfo.pageSize = pageSize;
       this.getList();
     },
+    teamMessage(item) {
+      // item
+      // console.log(this.$route)
+      this.$router.push({
+        path: "/personnelManage/front/teammanage",
+        query: {
+          userId: item.userId,
+          totalManpower: item.totalManpower,
+          totalPremium: item.totalPremium,
+          orderManpower: item.orderManpower,
+        },
+      });
+    },
   },
 };
 </script>

+ 3 - 0
src/pages/quote/agent.vue

@@ -278,6 +278,9 @@ export default {
     > div:first-child {
       border-bottom: 1px solid #f0f0f0;
     }
+    .tree {
+      scrollbar-width: thin;
+    }
   }
 }
 .back-line-main {

+ 13 - 0
src/pages/sys/role.vue

@@ -41,6 +41,8 @@
           :replaceFields="replaceFields"
           :disabled="treeDisabled"
           ref="menuTree"
+          :expandedKeys="expandedKeys"
+          @expand="expand"
         />
       </div>
       <div class="role-head">
@@ -170,6 +172,7 @@ export default {
       tableItem: {},
       checkAll: false,
       resetForm: {},
+      expandedKeys: [],
     };
   },
   created() {
@@ -241,6 +244,10 @@ export default {
       this.getList();
     },
     submit() {
+      // console.log(this.$refs.menuTree.$store);
+
+      // this.$refs.menuTree.expandedKeys([]);
+
       this.$API.sysManage
         .roleRelationMenu({
           roleId: this.tableItem.id,
@@ -250,6 +257,8 @@ export default {
         .then((res) => {
           if (res.data.code === 200) {
             this.$message.success(res.data.msg);
+            this.expandedKeys = [];
+            // this.$refs.menuTree.setCheckedNodes(allMenus);
           }
         });
     },
@@ -259,6 +268,10 @@ export default {
       this.tableItem = {};
       this.treeDisabled = true;
     },
+    expand(expand) {
+      // console.log(expand);
+      this.expandedKeys = [...expand];
+    },
     // 全选操作
     handleCheckAll() {
       if (this.checkAll) {

+ 1 - 1
src/pages/sys/roleConfig.vue

@@ -182,7 +182,7 @@ export default {
     configRole(item) {
       this.visible = true;
       this.dataForm = { ...item.record };
-      this.dataForm.roleId = item.record.roleId * 1;
+      this.dataForm.roleId = item.record.roleId;
     },
     treeChoose(id) {
       this.pagination.current = 1;

+ 448 - 0
src/pages/wallet/agency.vue

@@ -0,0 +1,448 @@
+<template>
+  <div class="quote">
+    <div class="quote-tree">
+      <div>
+        <!-- <a-tree :load-data="onLoadData" :tree-data="treeData" /> -->
+        <!-- <tree @getList="treeChoose"></tree> -->
+        <a-tree
+          :load-data="onLoadData"
+          :tree-data="treeData"
+          :replaceFields="replaceFields"
+          :title="'1'"
+          @select="treeChoose"
+        />
+      </div>
+    </div>
+    <div class="back-line-main">
+      <div class="back-line-header">
+        <div class="back-line-header-title">
+          <h2>机构</h2>
+          <div>
+            <span>时间筛选</span>
+            <a-range-picker
+              v-model="formState.time"
+              @change="timeChange"
+              valueFormat="YYYY-MM-DD HH:mm:ss"
+            >
+              <a-icon slot="suffixIcon" type="calendar" />
+            </a-range-picker>
+            <a-radio-group
+              default-value="1"
+              button-style="solid"
+              v-model="formState.days"
+            >
+              <a-radio-button :value="1"> 近1天 </a-radio-button>
+              <a-radio-button :value="7"> 近7天 </a-radio-button>
+              <a-radio-button :value="30"> 近30天 </a-radio-button>
+            </a-radio-group>
+          </div>
+        </div>
+      </div>
+      <div class="list">
+        <a-spin :spinning="loading">
+          <div class="personnel-message">
+            <div
+              v-for="item in list"
+              :key="item.deptId"
+              :class="item.comLevel ? 'agency' + item.comLevel : 'agency'"
+            >
+              <p>
+                机构名称:{{ item.deptName }}
+                <span v-show="item.comLevel">
+                  {{ numberToChinese(item.comLevel) + "级" }}
+                </span>
+              </p>
+              <p>机构负责人:{{ item.deptLeader }}</p>
+              <p>机构地址:{{ item.deptAddress }}</p>
+
+              <p>
+                <span>总收入:{{ item.totalIncome || 0 }}</span>
+                <span>机构保费:{{ item.deptManagementFee || 0 }}</span>
+              </p>
+              <p>
+                <span>已提现:{{ item.withdrawn || 0 }}</span>
+                <span>未提现:{{ item.notWithdrawn || 0 }}</span>
+              </p>
+            </div>
+          </div>
+        </a-spin>
+        <div class="page">
+          <a-pagination
+            v-model="pageInfo.pageNum"
+            :total="pageInfo.total"
+            show-less-items
+            show-size-changer
+            show-quick-jumper
+            @change="pageChange"
+            :page-size.sync="pageInfo.pageSize"
+            :pageSizeOptions="['12', '24', '36', '48']"
+          />
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+            
+<script>
+// import mixin from "../../minins/mixin";
+// import tree from "@/components/tree/tree";
+
+export default {
+  components: {
+    // tree,
+  },
+  //   mixins: [mixin],
+  data() {
+    return {
+      formState: {
+        days: "",
+        time: [],
+        name: undefined,
+        userCode: undefined,
+        phoneNumber: undefined,
+        createtimeEnd: undefined,
+        createtimeStart: undefined,
+      },
+      labelCol: { span: 4 },
+      dataForm: {},
+      visible: false,
+      backLinePersonnel: {},
+      //   columns: columns,
+      companyList: [],
+      tableList: [],
+      pageInfo: {
+        pageNum: 1,
+        pageSize: 12,
+        total: 0,
+      },
+      list: [],
+      loading: false,
+      process: process.env.VUE_APP_API_BASE_URL,
+      treeData: [],
+      onLoadData: false,
+      replaceFields: {
+        children: "children",
+        title: "name",
+        key: "id",
+      },
+    };
+  },
+  mounted() {
+    this.getAgencyList();
+    // setTimeout(() => {
+    // }, 1000);
+    this.getRole();
+  },
+  methods: {
+    numberToChinese(num) {
+      const chineseNumbers = [
+        "一",
+        "二",
+        "三",
+        "四",
+        "五",
+        "六",
+        "七",
+        "八",
+        "九",
+      ];
+      return chineseNumbers[num - 1]; // 假设num是1到9的数字
+    },
+    getRole() {
+      this.$API.wallet
+        .getSysDeptTree({
+          sysType: 2,
+        })
+        .then((res) => {
+          if (res.data.code === 200) {
+            this.treeData = [...res.data.data];
+          }
+        });
+    },
+    handleOk() {
+      //   this.visible = false;
+      // this.confirmLoading = true;
+
+      this.$API.sysManage
+        .roleSetUser({
+          //   ...this.dataForm,
+          userId: this.dataForm.id,
+          roleId: this.dataForm.roleId,
+        })
+        .then((res) => {
+          if (res.data.code === 200) {
+            this.$message.success("操作成功");
+            this.confirmLoading = false;
+            this.visible = false;
+            // this.getList();
+            this.getAgencyList();
+          }
+        });
+    },
+    configRole(item) {
+      this.visible = true;
+      this.dataForm = { ...item.record };
+      this.dataForm.roleId = item.record.roleId * 1;
+    },
+    timeChange(val) {
+      this.formState.createtimeStart = val[0];
+      this.formState.createtimeEnd = val[1];
+      // this.getList();
+    },
+    treeChoose(id) {
+      this.pageInfo.pageNum = 1;
+      this.pageInfo.pageSize = 10;
+      this.getAgencyList(id);
+    },
+
+    onChangeTime(val) {
+      // console.log(val);
+      this.formState.beginDate = val[0];
+      this.formState.endDate = val[1];
+      this.getAgencyList();
+    },
+    handleFinish() {
+      //
+    },
+    wholeHandleChange() {
+      this.getProvinceList(this.formState.whole);
+    },
+    provinceHandleChange() {
+      this.getCityList(this.formState.provinceId);
+    },
+    cityHandleChange() {
+      this.getAreaList(this.formState.cityId);
+    },
+    countyHandleChange() {
+      this.getStoreList(this.formState.countyId);
+    },
+
+    getAgencyList(id) {
+      this.loading = true;
+
+      this.$API.wallet
+        .getAgencyLeader({
+          pageNum: this.pageInfo.pageNum,
+          pageSize: this.pageInfo.pageSize,
+
+          cityId: id ? id : undefined,
+          countyId: id ? id : undefined,
+          houseId: id ? id : undefined,
+          provinceId: id ? id : undefined,
+        })
+        .then((res) => {
+          if (res.data.code === 200) {
+            this.loading = false;
+            this.list = [...res.data.data.records];
+            this.pageInfo.total = res.data.data.total;
+          }
+        });
+    },
+    //分页事件
+    pageChange(page, pageSize) {
+      //   console.log(page, pageSize);
+      this.pageInfo.pageNum = page;
+      this.pageInfo.pageSize = pageSize;
+      this.getAgencyList();
+    },
+  },
+};
+</script>
+    <style lang='less' scoped>
+.quote {
+  display: flex;
+  > div:first-child {
+    width: 20%;
+    background: #fff;
+    margin-right: 15px;
+  }
+  .quote-tree {
+    padding: 15px;
+    box-sizing: border-box;
+    //
+  }
+}
+.back-line-main {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  .back-line-header {
+    padding: 15px;
+    box-sizing: border-box;
+    .back-line-header-title {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding-bottom: 15px;
+      border-bottom: 1px solid #eee;
+      box-sizing: border-box;
+      h2 {
+        margin: 0;
+      }
+      > div {
+        flex: 1;
+        display: flex;
+        align-items: center;
+        justify-content: flex-end;
+      }
+      span {
+        display: block;
+        margin-right: 15px;
+      }
+      /deep/.ant-calendar-picker {
+        width: 300px;
+      }
+    }
+  }
+  > div {
+    // height: 152px;
+    background: #fff;
+  }
+  .ant-modal-body {
+    /deep/.ant-form-inline {
+      display: flex;
+    }
+    /deep/ .ant-form-inline .ant-form-item {
+      flex: none;
+      width: 50%;
+    }
+  }
+}
+.list {
+  padding: 0 15px;
+  box-sizing: border-box;
+  flex: 1;
+  > .ant-form {
+    padding-bottom: 10px;
+    box-sizing: border-box;
+  }
+}
+.personnel-message {
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: space-between;
+  > div {
+    width: 30%;
+    height: auto;
+    // background: #f9faff;
+    border-radius: 8px;
+    // border: 1px solid #2a55e5;
+    box-shadow: 0px 2px 8px 0px rgba(141, 149, 176, 0.15);
+    padding: 15px;
+    box-sizing: border-box;
+    margin-bottom: 15px;
+    position: relative;
+    margin-right: 2%;
+    p {
+      display: flex;
+      justify-content: space-between;
+    }
+    p:first-child {
+      justify-content: flex-start;
+      > span {
+        display: flex;
+        margin-left: 15px;
+        color: #fff;
+        padding: 0 10px;
+        box-sizing: border-box;
+        border-radius: 4px;
+        align-items: center;
+        justify-content: center;
+      }
+    }
+    // p:last-child {
+    //   margin: 0;
+    //   justify-content: flex-end;
+    //   // text-align: right;
+    // }
+    div.user-icon {
+      width: 56px;
+      height: 56px;
+      position: absolute;
+      top: 12px;
+      right: 15px;
+      border-radius: 50%;
+      overflow: hidden;
+      img {
+        width: 100%;
+        height: 100%;
+      }
+    }
+    .progress {
+      width: 100%;
+      height: 5px;
+      background: #eee;
+      border-radius: 8px;
+      margin-bottom: 8px;
+      > p {
+        width: 67%;
+        height: 100%;
+        background: #2a55e5;
+        border-radius: 8px;
+      }
+    }
+    // margin-right: 2%;
+  }
+  > div.agency1 {
+    background: linear-gradient(360deg, #ffffff 70%, #ffd6d8 100%);
+    box-shadow: 0px 2px 8px 0px rgba(141, 149, 176, 0.15);
+    border-radius: 8px 8px 8px 8px;
+    // border: 1px solid rgba(211, 32, 41, 0.5);
+    > p:first-child {
+      color: #d32029;
+      span {
+        background: #d32029;
+      }
+    }
+  }
+  > div.agency2 {
+    background: linear-gradient(360deg, #ffffff 70%, #f6dcd4 100%);
+    box-shadow: 0px 2px 8px 0px rgba(141, 149, 176, 0.15);
+    border-radius: 8px 8px 8px 8px;
+    > p:first-child {
+      color: #d84a1b;
+      span {
+        background: #d84a1b;
+      }
+    }
+  }
+  > div.agency3 {
+    background: linear-gradient(360deg, #ffffff 70%, #c8d3f8 100%);
+    box-shadow: 0px 2px 8px 0px rgba(141, 149, 176, 0.15);
+    border-radius: 8px 8px 8px 8px;
+    > p:first-child {
+      color: #2a55e5;
+      span {
+        background: #2a55e5;
+      }
+    }
+  }
+  > div.agency4 {
+    background: linear-gradient(360deg, #ffffff 70%, #c7f6f6 100%);
+    box-shadow: 0px 2px 8px 0px rgba(141, 149, 176, 0.15);
+    border-radius: 8px 8px 8px 8px;
+    > p:first-child {
+      color: #13a8a8;
+      span {
+        background: #13a8a8;
+      }
+    }
+  }
+  > div.agency5 {
+    background: linear-gradient(360deg, #ffffff 70%, #deecfa 100%);
+    box-shadow: 0px 2px 8px 0px rgba(141, 149, 176, 0.15);
+    border-radius: 8px 8px 8px 8px;
+
+    > p:first-child {
+      color: #177ddc;
+      span {
+        background: #177ddc;
+      }
+    }
+  }
+}
+.page {
+  display: flex;
+  justify-content: flex-end;
+}
+</style>

+ 461 - 0
src/pages/wallet/agent.vue

@@ -0,0 +1,461 @@
+<template>
+  <div class="quote">
+    <div class="quote-tree">
+      <div>
+        <!-- <a-tree :load-data="onLoadData" :tree-data="treeData" /> -->
+        <!-- <tree @getList="treeChoose"></tree> -->
+        <a-tree
+          :load-data="onLoadData"
+          :tree-data="treeData"
+          :replaceFields="replaceFields"
+          :title="'1'"
+          @select="treeChoose"
+        />
+      </div>
+    </div>
+    <div class="back-line-main">
+      <div class="back-line-header">
+        <div class="back-line-header-title">
+          <h2>机构</h2>
+          <div>
+            <span>时间筛选</span>
+            <a-range-picker
+              v-model="formState.time"
+              @change="onChangeTime"
+              valueFormat="YYYY-MM-DD HH:mm:ss"
+            >
+              <a-icon slot="suffixIcon" type="calendar" />
+            </a-range-picker>
+            <a-radio-group
+              default-value="1"
+              button-style="solid"
+              v-model="formState.days"
+            >
+              <a-radio-button :value="1"> 近1天 </a-radio-button>
+              <a-radio-button :value="7"> 近7天 </a-radio-button>
+              <a-radio-button :value="30"> 近30天 </a-radio-button>
+            </a-radio-group>
+          </div>
+        </div>
+      </div>
+      <div class="list">
+        <a-form layout="inline" :model="formState">
+          <a-form-item label="姓名" :labelCol="{ span: 5 }" :colon="false">
+            <a-input
+              placeholder="请输入姓名"
+              v-model="formState.name"
+              allowClear
+            ></a-input>
+          </a-form-item>
+          <a-form-item label="工号" :labelCol="{ span: 5 }" :colon="false">
+            <a-input
+              placeholder="请输入工号"
+              v-model="formState.userCode"
+              allowClear
+            ></a-input>
+          </a-form-item>
+          <a-form-item label="手机号" :labelCol="{ span: 5 }" :colon="false">
+            <a-input
+              placeholder="请输入手机号"
+              v-model="formState.phoneNumber"
+              allowClear
+            ></a-input>
+          </a-form-item>
+          <a-form-item label="" :labelCol="{ span: 5 }" :colon="false">
+          </a-form-item>
+          <a-form-item
+            label="             "
+            :labelCol="{ span: 5 }"
+            :colon="false"
+            class="form-item-search"
+          >
+            <a-button type="primary" @click="getList">查询</a-button>
+          </a-form-item>
+        </a-form>
+        <a-spin :spinning="loading">
+          <div class="personnel-message">
+            <div
+              v-for="item in list"
+              :key="item.deptId"
+              :class="item.comLevel ? 'agency' + item.comLevel : 'agency'"
+            >
+              <p>代理人:{{ item.userName }}</p>
+
+              <p>归属:{{ item.deptName }}</p>
+
+              <p>
+                <span>总收入:{{ item.totalIncome || 0 }}</span>
+              </p>
+              <p>
+                <span>已提现:{{ item.withdrawn || 0 }}</span>
+              </p>
+              <p>
+                <span>未提现:{{ item.notWithdrawn || 0 }}</span>
+              </p>
+              <div class="user-icon">
+                <img
+                  v-show="item.filePath"
+                  :src="process + item.filePath"
+                  alt=""
+                />
+                <img
+                  v-if="!item.filePath && item.sex == 'm'"
+                  src="../../assets/img/man.png"
+                  alt=""
+                />
+                <img v-else src="../../assets/img/woman.png" alt="" />
+              </div>
+            </div>
+          </div>
+        </a-spin>
+        <div class="page">
+          <a-pagination
+            v-model="pageInfo.pageNum"
+            :total="pageInfo.total"
+            show-less-items
+            show-size-changer
+            show-quick-jumper
+            @change="pageChange"
+            :page-size.sync="pageInfo.pageSize"
+            :pageSizeOptions="['12', '24', '36', '48']"
+          />
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+            
+<script>
+// import mixin from "../../minins/mixin";
+// import tree from "@/components/tree/tree";
+
+export default {
+  components: {
+    // tree,
+  },
+  //   mixins: [mixin],
+  data() {
+    return {
+      formState: {
+        days: "",
+        time: [],
+        name: undefined,
+        userCode: undefined,
+        phoneNumber: undefined,
+        createtimeEnd: undefined,
+        createtimeStart: undefined,
+      },
+      labelCol: { span: 4 },
+      dataForm: {},
+      visible: false,
+      backLinePersonnel: {},
+      //   columns: columns,
+      companyList: [],
+      tableList: [],
+      pageInfo: {
+        pageNum: 1,
+        pageSize: 12,
+        total: 0,
+      },
+      list: [],
+      loading: false,
+      process: process.env.VUE_APP_API_BASE_URL,
+      treeData: [],
+      onLoadData: false,
+      replaceFields: {
+        children: "children",
+        title: "name",
+        key: "id",
+      },
+    };
+  },
+  mounted() {
+    this.getAgencyList();
+    // setTimeout(() => {
+    // }, 1000);
+    this.getRole();
+  },
+  methods: {
+    numberToChinese(num) {
+      const chineseNumbers = [
+        "一",
+        "二",
+        "三",
+        "四",
+        "五",
+        "六",
+        "七",
+        "八",
+        "九",
+      ];
+      return chineseNumbers[num - 1]; // 假设num是1到9的数字
+    },
+    getRole() {
+      this.$API.wallet
+        .getSysDeptTree({
+          sysType: 2,
+        })
+        .then((res) => {
+          if (res.data.code === 200) {
+            this.treeData = [...res.data.data];
+          }
+        });
+    },
+
+    treeChoose(id) {
+      this.pageInfo.pageNum = 1;
+      this.pageInfo.pageSize = 12;
+      this.getAgencyList(id);
+    },
+
+    onChangeTime(val) {
+      // console.log(val);
+      this.formState.beginDate = val[0];
+      this.formState.endDate = val[1];
+      this.getAgencyList();
+    },
+    handleFinish() {
+      //
+    },
+    wholeHandleChange() {
+      this.getProvinceList(this.formState.whole);
+    },
+    provinceHandleChange() {
+      this.getCityList(this.formState.provinceId);
+    },
+    cityHandleChange() {
+      this.getAreaList(this.formState.cityId);
+    },
+    countyHandleChange() {
+      this.getStoreList(this.formState.countyId);
+    },
+
+    getAgencyList(id) {
+      this.loading = true;
+
+      this.$API.wallet
+        .getAalletAgent({
+          pageNum: this.pageInfo.pageNum,
+          pageSize: this.pageInfo.pageSize,
+          managementSource: 2,
+          deptId: id || "",
+        })
+        .then((res) => {
+          if (res.data.code === 200) {
+            this.loading = false;
+            this.list = [...res.data.data.records];
+            this.pageInfo.total = res.data.data.total;
+          }
+        });
+    },
+    //分页事件
+    pageChange(page, pageSize) {
+      //   console.log(page, pageSize);
+      this.pageInfo.pageNum = page;
+      this.pageInfo.pageSize = pageSize;
+      this.getAgencyList();
+    },
+  },
+};
+</script>
+    <style lang='less' scoped>
+.quote {
+  display: flex;
+  > div:first-child {
+    width: 20%;
+    background: #fff;
+    margin-right: 15px;
+  }
+  .quote-tree {
+    padding: 15px;
+    box-sizing: border-box;
+    //
+  }
+}
+.back-line-main {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  .back-line-header {
+    padding: 15px;
+    box-sizing: border-box;
+    .back-line-header-title {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding-bottom: 15px;
+      border-bottom: 1px solid #eee;
+      box-sizing: border-box;
+      h2 {
+        margin: 0;
+      }
+      > div {
+        flex: 1;
+        display: flex;
+        align-items: center;
+        justify-content: flex-end;
+      }
+      span {
+        display: block;
+        margin-right: 15px;
+      }
+      /deep/.ant-calendar-picker {
+        width: 300px;
+      }
+    }
+  }
+  > div {
+    // height: 152px;
+    background: #fff;
+  }
+  .ant-modal-body {
+    /deep/.ant-form-inline {
+      display: flex;
+    }
+    /deep/ .ant-form-inline .ant-form-item {
+      flex: none;
+      width: 50%;
+    }
+  }
+}
+.list {
+  padding: 0 15px;
+  box-sizing: border-box;
+  flex: 1;
+  > .ant-form {
+    padding-bottom: 10px;
+    box-sizing: border-box;
+  }
+}
+.personnel-message {
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: space-between;
+  > div {
+    width: 30%;
+    height: auto;
+    // background: #f9faff;
+    border-radius: 8px;
+    border: 1px solid #2a55e5;
+    padding: 15px;
+    box-sizing: border-box;
+    margin-bottom: 15px;
+    position: relative;
+    margin-right: 2%;
+    p {
+      display: flex;
+      justify-content: space-between;
+    }
+    p:first-child {
+      justify-content: flex-start;
+      > span {
+        display: flex;
+        margin-left: 15px;
+        color: #fff;
+        padding: 0 10px;
+        box-sizing: border-box;
+        border-radius: 4px;
+        align-items: center;
+        justify-content: center;
+      }
+    }
+    // p:last-child {
+    //   margin: 0;
+    //   justify-content: flex-end;
+    //   // text-align: right;
+    // }
+    div.user-icon {
+      width: 56px;
+      height: 56px;
+      position: absolute;
+      top: 12px;
+      right: 15px;
+      border-radius: 50%;
+      overflow: hidden;
+      img {
+        width: 100%;
+        height: 100%;
+      }
+    }
+    .progress {
+      width: 100%;
+      height: 5px;
+      background: #eee;
+      border-radius: 8px;
+      margin-bottom: 8px;
+      > p {
+        width: 67%;
+        height: 100%;
+        background: #2a55e5;
+        border-radius: 8px;
+      }
+    }
+    // margin-right: 2%;
+  }
+  > div.agency1 {
+    background: rgba(211, 32, 41, 0.05);
+    box-shadow: 0px 2px 8px 0px rgba(211, 32, 41, 0.15);
+    border-radius: 8px 8px 8px 8px;
+    border: 1px solid rgba(211, 32, 41, 0.5);
+    > p:first-child {
+      color: #d32029;
+      span {
+        background: #d32029;
+      }
+    }
+  }
+  > div.agency2 {
+    background: rgba(216, 74, 27, 0.05);
+    box-shadow: 0px 2px 8px 0px rgba(216, 74, 27, 0.15);
+    border-radius: 8px 8px 8px 8px;
+    border: 1px solid rgba(216, 74, 27, 0.5);
+    > p:first-child {
+      color: #d84a1b;
+      span {
+        background: #d84a1b;
+      }
+    }
+  }
+  > div.agency3 {
+    background: rgba(42, 85, 229, 0.05);
+    box-shadow: 0px 2px 8px 0px rgba(42, 85, 229, 0.15);
+    border-radius: 8px 8px 8px 8px;
+    border: 1px solid rgba(42, 85, 229, 0.5);
+    > p:first-child {
+      color: #2a55e5;
+      span {
+        background: #2a55e5;
+      }
+    }
+  }
+  > div.agency4 {
+    background: rgba(19, 168, 168, 0.05);
+    box-shadow: 0px 2px 8px 0px rgba(19, 168, 168, 0.15);
+    border-radius: 8px 8px 8px 8px;
+    border: 1px solid rgba(19, 168, 168, 0.5);
+    > p:first-child {
+      color: #13a8a8;
+      span {
+        background: #13a8a8;
+      }
+    }
+  }
+  > div.agency5 {
+    background: rgba(23, 125, 220, 0.05);
+    box-shadow: 0px 2px 8px 0px rgba(23, 125, 220, 0.15);
+    border-radius: 8px 8px 8px 8px;
+    border: 1px solid rgba(23, 125, 220, 0.5);
+
+    > p:first-child {
+      color: #177ddc;
+      span {
+        background: #177ddc;
+      }
+    }
+  }
+}
+.page {
+  display: flex;
+  justify-content: flex-end;
+}
+</style>

+ 466 - 0
src/pages/wallet/channel.vue

@@ -0,0 +1,466 @@
+<template>
+  <div class="quote">
+    <div class="quote-tree">
+      <div>
+        <!-- <a-tree :load-data="onLoadData" :tree-data="treeData" /> -->
+        <!-- <tree @getList="treeChoose"></tree> -->
+        <a-tree
+          :load-data="onLoadData"
+          :tree-data="treeData"
+          :replaceFields="replaceFields"
+          :title="'1'"
+          @select="treeChoose"
+        />
+      </div>
+    </div>
+    <div class="back-line-main">
+      <div class="back-line-header">
+        <div class="back-line-header-title">
+          <h2>机构</h2>
+          <div>
+            <span>时间筛选</span>
+            <a-range-picker
+              v-model="formState.time"
+              @change="onChangeTime"
+              valueFormat="YYYY-MM-DD HH:mm:ss"
+            >
+              <a-icon slot="suffixIcon" type="calendar" />
+            </a-range-picker>
+            <a-radio-group
+              default-value="1"
+              button-style="solid"
+              v-model="formState.days"
+            >
+              <a-radio-button :value="1"> 近1天 </a-radio-button>
+              <a-radio-button :value="7"> 近7天 </a-radio-button>
+              <a-radio-button :value="30"> 近30天 </a-radio-button>
+            </a-radio-group>
+          </div>
+        </div>
+      </div>
+      <div class="list">
+        <a-form layout="inline" :model="formState">
+          <a-form-item label="姓名" :labelCol="{ span: 5 }" :colon="false">
+            <a-input
+              placeholder="请输入姓名"
+              v-model="formState.name"
+              allowClear
+            ></a-input>
+          </a-form-item>
+          <a-form-item label="工号" :labelCol="{ span: 5 }" :colon="false">
+            <a-input
+              placeholder="请输入工号"
+              v-model="formState.userCode"
+              allowClear
+            ></a-input>
+          </a-form-item>
+          <a-form-item label="手机号" :labelCol="{ span: 5 }" :colon="false">
+            <a-input
+              placeholder="请输入手机号"
+              v-model="formState.phoneNumber"
+              allowClear
+            ></a-input>
+          </a-form-item>
+          <a-form-item label="" :labelCol="{ span: 5 }" :colon="false">
+          </a-form-item>
+          <a-form-item
+            label="             "
+            :labelCol="{ span: 5 }"
+            :colon="false"
+            class="form-item-search"
+          >
+            <a-button type="primary" @click="getList">查询</a-button>
+          </a-form-item>
+        </a-form>
+        <a-spin :spinning="loading">
+          <div class="personnel-message">
+            <div
+              v-for="item in list"
+              :key="item.deptId"
+              :class="item.comLevel ? 'agency' + item.comLevel : 'agency'"
+            >
+              <p>代理人:{{ item.userName }}</p>
+
+              <p>归属:{{ item.deptName }}</p>
+
+              <p>
+                <span>总收入:{{ item.totalIncome || 0 }}</span>
+              </p>
+              <p>
+                <span>已提现:{{ item.withdrawn || 0 }}</span>
+              </p>
+              <p>
+                <span>未提现:{{ item.notWithdrawn || 0 }}</span>
+              </p>
+              <div class="user-icon">
+                <img
+                  v-show="item.filePath"
+                  :src="process + item.filePath"
+                  alt=""
+                />
+                <img
+                  v-if="!item.filePath && item.sex == 'm'"
+                  src="../../assets/img/man.png"
+                  alt=""
+                />
+                <img v-else src="../../assets/img/woman.png" alt="" />
+              </div>
+            </div>
+          </div>
+        </a-spin>
+        <div class="page">
+          <a-pagination
+            v-model="pageInfo.pageNum"
+            :total="pageInfo.total"
+            show-less-items
+            show-size-changer
+            show-quick-jumper
+            @change="pageChange"
+            :page-size.sync="pageInfo.pageSize"
+            :pageSizeOptions="['12', '24', '36', '48']"
+          />
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+            
+<script>
+// import mixin from "../../minins/mixin";
+// import tree from "@/components/tree/tree";
+
+export default {
+  components: {
+    // tree,
+  },
+  //   mixins: [mixin],
+  data() {
+    return {
+      formState: {
+        days: "",
+        time: [],
+        name: undefined,
+        userCode: undefined,
+        phoneNumber: undefined,
+        createtimeEnd: undefined,
+        createtimeStart: undefined,
+      },
+      labelCol: { span: 4 },
+      dataForm: {},
+      visible: false,
+      backLinePersonnel: {},
+      //   columns: columns,
+      companyList: [],
+      tableList: [],
+      pageInfo: {
+        pageNum: 1,
+        pageSize: 12,
+        total: 0,
+      },
+      list: [],
+      loading: false,
+      process: process.env.VUE_APP_API_BASE_URL,
+      treeData: [],
+      onLoadData: false,
+      replaceFields: {
+        children: "children",
+        title: "name",
+        key: "id",
+      },
+    };
+  },
+  mounted() {
+    this.getAgencyList();
+    // setTimeout(() => {
+    // }, 1000);
+    this.getRole();
+  },
+  methods: {
+    getList() {
+      this.pageInfo.pageNum = 1;
+      this.pageInfo.pageSize = 12;
+      this.getAgencyList();
+    },
+    numberToChinese(num) {
+      const chineseNumbers = [
+        "一",
+        "二",
+        "三",
+        "四",
+        "五",
+        "六",
+        "七",
+        "八",
+        "九",
+      ];
+      return chineseNumbers[num - 1]; // 假设num是1到9的数字
+    },
+    getRole() {
+      this.$API.wallet
+        .getSysDeptTree({
+          sysType: 2,
+        })
+        .then((res) => {
+          if (res.data.code === 200) {
+            this.treeData = [...res.data.data];
+          }
+        });
+    },
+
+    treeChoose(id) {
+      this.pageInfo.pageNum = 1;
+      this.pageInfo.pageSize = 12;
+      this.getAgencyList(id);
+    },
+
+    onChangeTime(val) {
+      // console.log(val);
+      this.formState.beginDate = val[0];
+      this.formState.endDate = val[1];
+      this.getAgencyList();
+    },
+    handleFinish() {
+      //
+    },
+    wholeHandleChange() {
+      this.getProvinceList(this.formState.whole);
+    },
+    provinceHandleChange() {
+      this.getCityList(this.formState.provinceId);
+    },
+    cityHandleChange() {
+      this.getAreaList(this.formState.cityId);
+    },
+    countyHandleChange() {
+      this.getStoreList(this.formState.countyId);
+    },
+
+    getAgencyList(id) {
+      this.loading = true;
+
+      this.$API.wallet
+        .getAalletAgent({
+          pageNum: this.pageInfo.pageNum,
+          pageSize: this.pageInfo.pageSize,
+          managementSource: 1,
+          deptId: id || "",
+        })
+        .then((res) => {
+          if (res.data.code === 200) {
+            this.loading = false;
+            this.list = [...res.data.data.records];
+            this.pageInfo.total = res.data.data.total;
+          }
+        });
+    },
+    //分页事件
+    pageChange(page, pageSize) {
+      //   console.log(page, pageSize);
+      this.pageInfo.pageNum = page;
+      this.pageInfo.pageSize = pageSize;
+      this.getAgencyList();
+    },
+  },
+};
+</script>
+    <style lang='less' scoped>
+.quote {
+  display: flex;
+  > div:first-child {
+    width: 20%;
+    background: #fff;
+    margin-right: 15px;
+  }
+  .quote-tree {
+    padding: 15px;
+    box-sizing: border-box;
+    //
+  }
+}
+.back-line-main {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  .back-line-header {
+    padding: 15px;
+    box-sizing: border-box;
+    .back-line-header-title {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding-bottom: 15px;
+      border-bottom: 1px solid #eee;
+      box-sizing: border-box;
+      h2 {
+        margin: 0;
+      }
+      > div {
+        flex: 1;
+        display: flex;
+        align-items: center;
+        justify-content: flex-end;
+      }
+      span {
+        display: block;
+        margin-right: 15px;
+      }
+      /deep/.ant-calendar-picker {
+        width: 300px;
+      }
+    }
+  }
+  > div {
+    // height: 152px;
+    background: #fff;
+  }
+  .ant-modal-body {
+    /deep/.ant-form-inline {
+      display: flex;
+    }
+    /deep/ .ant-form-inline .ant-form-item {
+      flex: none;
+      width: 50%;
+    }
+  }
+}
+.list {
+  padding: 0 15px;
+  box-sizing: border-box;
+  flex: 1;
+  > .ant-form {
+    padding-bottom: 10px;
+    box-sizing: border-box;
+  }
+}
+.personnel-message {
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: space-between;
+  > div {
+    width: 30%;
+    height: auto;
+    // background: #f9faff;
+    border-radius: 8px;
+    border: 1px solid #2a55e5;
+    padding: 15px;
+    box-sizing: border-box;
+    margin-bottom: 15px;
+    position: relative;
+    margin-right: 2%;
+    p {
+      display: flex;
+      justify-content: space-between;
+    }
+    p:first-child {
+      justify-content: flex-start;
+      > span {
+        display: flex;
+        margin-left: 15px;
+        color: #fff;
+        padding: 0 10px;
+        box-sizing: border-box;
+        border-radius: 4px;
+        align-items: center;
+        justify-content: center;
+      }
+    }
+    // p:last-child {
+    //   margin: 0;
+    //   justify-content: flex-end;
+    //   // text-align: right;
+    // }
+    div.user-icon {
+      width: 56px;
+      height: 56px;
+      position: absolute;
+      top: 12px;
+      right: 15px;
+      border-radius: 50%;
+      overflow: hidden;
+      img {
+        width: 100%;
+        height: 100%;
+      }
+    }
+    .progress {
+      width: 100%;
+      height: 5px;
+      background: #eee;
+      border-radius: 8px;
+      margin-bottom: 8px;
+      > p {
+        width: 67%;
+        height: 100%;
+        background: #2a55e5;
+        border-radius: 8px;
+      }
+    }
+    // margin-right: 2%;
+  }
+  > div.agency1 {
+    background: rgba(211, 32, 41, 0.05);
+    box-shadow: 0px 2px 8px 0px rgba(211, 32, 41, 0.15);
+    border-radius: 8px 8px 8px 8px;
+    border: 1px solid rgba(211, 32, 41, 0.5);
+    > p:first-child {
+      color: #d32029;
+      span {
+        background: #d32029;
+      }
+    }
+  }
+  > div.agency2 {
+    background: rgba(216, 74, 27, 0.05);
+    box-shadow: 0px 2px 8px 0px rgba(216, 74, 27, 0.15);
+    border-radius: 8px 8px 8px 8px;
+    border: 1px solid rgba(216, 74, 27, 0.5);
+    > p:first-child {
+      color: #d84a1b;
+      span {
+        background: #d84a1b;
+      }
+    }
+  }
+  > div.agency3 {
+    background: rgba(42, 85, 229, 0.05);
+    box-shadow: 0px 2px 8px 0px rgba(42, 85, 229, 0.15);
+    border-radius: 8px 8px 8px 8px;
+    border: 1px solid rgba(42, 85, 229, 0.5);
+    > p:first-child {
+      color: #2a55e5;
+      span {
+        background: #2a55e5;
+      }
+    }
+  }
+  > div.agency4 {
+    background: rgba(19, 168, 168, 0.05);
+    box-shadow: 0px 2px 8px 0px rgba(19, 168, 168, 0.15);
+    border-radius: 8px 8px 8px 8px;
+    border: 1px solid rgba(19, 168, 168, 0.5);
+    > p:first-child {
+      color: #13a8a8;
+      span {
+        background: #13a8a8;
+      }
+    }
+  }
+  > div.agency5 {
+    background: rgba(23, 125, 220, 0.05);
+    box-shadow: 0px 2px 8px 0px rgba(23, 125, 220, 0.15);
+    border-radius: 8px 8px 8px 8px;
+    border: 1px solid rgba(23, 125, 220, 0.5);
+
+    > p:first-child {
+      color: #177ddc;
+      span {
+        background: #177ddc;
+      }
+    }
+  }
+}
+.page {
+  display: flex;
+  justify-content: flex-end;
+}
+</style>

+ 474 - 0
src/pages/wallet/partner.vue

@@ -0,0 +1,474 @@
+<template>
+  <div class="quote">
+    <div class="quote-tree">
+      <div>
+        <a-tree
+          :load-data="onLoadData"
+          :tree-data="treeData"
+          :replaceFields="replaceFields"
+          :title="'1'"
+          @select="treeChoose"
+        />
+        <!-- <tree @getList="treeChoose"></tree> -->
+      </div>
+    </div>
+    <div class="back-line-main">
+      <div class="back-line-header">
+        <div class="back-line-header-title">
+          <h2>机构</h2>
+          <div>
+            <span>时间筛选</span>
+            <a-range-picker
+              v-model="formState.time"
+              @change="timeChange"
+              valueFormat="YYYY-MM-DD HH:mm:ss"
+            >
+              <a-icon slot="suffixIcon" type="calendar" />
+            </a-range-picker>
+            <a-radio-group
+              default-value="1"
+              button-style="solid"
+              v-model="formState.days"
+            >
+              <a-radio-button :value="1"> 近1天 </a-radio-button>
+              <a-radio-button :value="7"> 近7天 </a-radio-button>
+              <a-radio-button :value="30"> 近30天 </a-radio-button>
+            </a-radio-group>
+          </div>
+        </div>
+      </div>
+      <div class="list">
+        <a-form layout="inline" :model="formState">
+          <a-form-item label="姓名" :labelCol="{ span: 5 }" :colon="false">
+            <a-input
+              placeholder="请输入姓名"
+              v-model="formState.name"
+              allowClear
+            ></a-input>
+          </a-form-item>
+          <a-form-item label="工号" :labelCol="{ span: 5 }" :colon="false">
+            <a-input
+              placeholder="请输入工号"
+              v-model="formState.userCode"
+              allowClear
+            ></a-input>
+          </a-form-item>
+          <a-form-item label="手机号" :labelCol="{ span: 5 }" :colon="false">
+            <a-input
+              placeholder="请输入手机号"
+              v-model="formState.phoneNumber"
+              allowClear
+            ></a-input>
+          </a-form-item>
+          <a-form-item label="" :labelCol="{ span: 5 }" :colon="false">
+          </a-form-item>
+          <a-form-item
+            label="             "
+            :labelCol="{ span: 5 }"
+            :colon="false"
+            class="form-item-search"
+          >
+            <a-button type="primary" @click="getList">查询</a-button>
+          </a-form-item>
+        </a-form>
+        <a-spin :spinning="loading">
+          <div class="personnel-message">
+            <div
+              v-for="item in list"
+              :key="item.deptId"
+              :class="item.comLevel ? 'agency' + item.comLevel : 'agency'"
+            >
+              <div class="user-icon">
+                <img
+                  v-show="item.filePath"
+                  :src="process + item.filePath"
+                  alt=""
+                />
+                <img
+                  v-if="!item.filePath && item.sex == 'm'"
+                  src="../../assets/img/man.png"
+                  alt=""
+                />
+                <img v-else src="../../assets/img/woman.png" alt="" />
+                {{ item.userName }}
+              </div>
+
+              <p>归属:{{ item.deptName }}</p>
+
+              <p>
+                <span>总保费:¥{{ item.totalIncome || 0 }}</span>
+                <span>管理费:¥{{ item.deptManagementFee || 0 }}</span>
+              </p>
+              <p>
+                <span>已提现:¥{{ item.withdrawn || 0 }}</span>
+                <span>未提现:¥{{ item.notWithdrawn || 0 }}</span>
+              </p>
+            </div>
+          </div>
+        </a-spin>
+        <div class="page">
+          <a-pagination
+            v-model="pageInfo.pageNum"
+            :total="pageInfo.total"
+            show-less-items
+            show-size-changer
+            show-quick-jumper
+            @change="pageChange"
+            :page-size.sync="pageInfo.pageSize"
+            :pageSizeOptions="['12', '24', '36', '48']"
+          />
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+            
+<script>
+// import mixin from "../../minins/mixin";
+// import tree from "@/components/tree/tree";
+
+export default {
+  components: {
+    // tree,
+  },
+  //   mixins: [mixin],
+  data() {
+    return {
+      formState: {
+        days: "",
+        time: [],
+        name: undefined,
+        userCode: undefined,
+        phoneNumber: undefined,
+        createtimeEnd: undefined,
+        createtimeStart: undefined,
+      },
+      labelCol: { span: 4 },
+      dataForm: {},
+      visible: false,
+      backLinePersonnel: {},
+      //   columns: columns,
+      companyList: [],
+      tableList: [],
+      pageInfo: {
+        pageNum: 1,
+        pageSize: 12,
+        total: 0,
+      },
+      list: [],
+      loading: false,
+      process: process.env.VUE_APP_API_BASE_URL,
+      treeData: [],
+      onLoadData: false,
+      replaceFields: {
+        children: "children",
+        title: "name",
+        key: "id",
+      },
+      deptId: "",
+    };
+  },
+  async mounted() {
+    await this.getTreeDeptUser();
+
+    // setTimeout(() => {
+    // }, 1000);
+  },
+  methods: {
+    async getTreeDeptUser() {
+      this.onLoadData = true;
+
+      this.$API.wallet.getSysDeptTree({}).then((res) => {
+        if (res.data.code === 200) {
+          this.treeData = [...res.data.data];
+          this.deptId = res.data.data[0].id;
+          this.getAgencyList();
+        }
+      });
+    },
+    numberToChinese(num) {
+      const chineseNumbers = [
+        "一",
+        "二",
+        "三",
+        "四",
+        "五",
+        "六",
+        "七",
+        "八",
+        "九",
+      ];
+      return chineseNumbers[num - 1]; // 假设num是1到9的数字
+    },
+
+    timeChange(val) {
+      this.formState.createtimeStart = val[0];
+      this.formState.createtimeEnd = val[1];
+      // this.getList();
+    },
+    treeChoose(id) {
+      this.pageInfo.pageNum = 1;
+      this.pageInfo.pageSize = 10;
+      this.deptId = id[0];
+      this.getAgencyList();
+    },
+
+    onChangeTime(val) {
+      // console.log(val);
+      this.formState.beginDate = val[0];
+      this.formState.endDate = val[1];
+      this.getAgencyList();
+    },
+    handleFinish() {
+      //
+    },
+    wholeHandleChange() {
+      this.getProvinceList(this.formState.whole);
+    },
+    provinceHandleChange() {
+      this.getCityList(this.formState.provinceId);
+    },
+    cityHandleChange() {
+      this.getAreaList(this.formState.cityId);
+    },
+    countyHandleChange() {
+      this.getStoreList(this.formState.countyId);
+    },
+
+    getAgencyList() {
+      this.loading = true;
+
+      this.$API.wallet
+        .getPartnerStatistics({
+          pageNum: this.pageInfo.pageNum,
+          pageSize: this.pageInfo.pageSize,
+          deptId: this.deptId,
+        })
+        .then((res) => {
+          if (res.data.code === 200) {
+            this.loading = false;
+            this.list = [...res.data.data.records];
+            this.pageInfo.total = res.data.data.total;
+          }
+        });
+    },
+    //分页事件
+    pageChange(page, pageSize) {
+      //   console.log(page, pageSize);
+      this.pageInfo.pageNum = page;
+      this.pageInfo.pageSize = pageSize;
+      this.getAgencyList();
+    },
+  },
+};
+</script>
+    <style lang='less' scoped>
+.quote {
+  display: flex;
+  > div:first-child {
+    width: 20%;
+    background: #fff;
+    margin-right: 15px;
+  }
+  .quote-tree {
+    padding: 15px;
+    box-sizing: border-box;
+    //
+  }
+}
+.back-line-main {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  .back-line-header {
+    padding: 15px;
+    box-sizing: border-box;
+    background: #fff;
+    .back-line-header-title {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding-bottom: 15px;
+      // background: #fff;
+      border-bottom: 1px solid #eee;
+      box-sizing: border-box;
+      h2 {
+        margin: 0;
+      }
+      > div {
+        flex: 1;
+        display: flex;
+        align-items: center;
+        justify-content: flex-end;
+      }
+      span {
+        display: block;
+        margin-right: 15px;
+      }
+      /deep/.ant-calendar-picker {
+        width: 300px;
+      }
+    }
+  }
+  > div {
+    // height: 152px;
+    // background: #fff;
+  }
+  .ant-modal-body {
+    /deep/.ant-form-inline {
+      display: flex;
+    }
+    /deep/ .ant-form-inline .ant-form-item {
+      flex: none;
+      width: 50%;
+    }
+  }
+}
+.list {
+  padding: 0px;
+  box-sizing: border-box;
+  flex: 1;
+  > .ant-form {
+    padding: 10px;
+    box-sizing: border-box;
+    background: #fff;
+  }
+  background: none;
+  .ant-spin-nested-loading {
+    padding: 10px 0;
+    box-sizing: border-box;
+  }
+}
+.personnel-message {
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: space-between;
+  > div {
+    width: 30%;
+    height: auto;
+    // background: #f9faff;
+    border-radius: 8px;
+    box-shadow: 0px 2px 8px 0px rgba(141, 149, 176, 0.15);
+    padding: 15px;
+    background: #fff;
+    box-sizing: border-box;
+    margin-bottom: 15px;
+    position: relative;
+    margin-right: 2%;
+    p {
+      display: flex;
+      justify-content: space-between;
+    }
+    p:first-child {
+      justify-content: flex-start;
+      > span {
+        display: flex;
+        margin-left: 15px;
+        color: #fff;
+        padding: 0 10px;
+        box-sizing: border-box;
+        border-radius: 4px;
+        align-items: center;
+        justify-content: center;
+      }
+    }
+    // p:last-child {
+    //   margin: 0;
+    //   justify-content: flex-end;
+    //   // text-align: right;
+    // }
+    div.user-icon {
+      width: 56px;
+      height: 56px;
+      position: absolute;
+      top: 12px;
+      right: 15px;
+      border-radius: 50%;
+      overflow: hidden;
+      img {
+        width: 100%;
+        height: 100%;
+      }
+    }
+    .progress {
+      width: 100%;
+      height: 5px;
+      background: #eee;
+      border-radius: 8px;
+      margin-bottom: 8px;
+      > p {
+        width: 67%;
+        height: 100%;
+        background: #2a55e5;
+        border-radius: 8px;
+      }
+    }
+    // margin-right: 2%;
+  }
+  > div.agency1 {
+    background: rgba(211, 32, 41, 0.05);
+    box-shadow: 0px 2px 8px 0px rgba(211, 32, 41, 0.15);
+    border-radius: 8px 8px 8px 8px;
+    border: 1px solid rgba(211, 32, 41, 0.5);
+    > p:first-child {
+      color: #d32029;
+      span {
+        background: #d32029;
+      }
+    }
+  }
+  > div.agency2 {
+    background: rgba(216, 74, 27, 0.05);
+    box-shadow: 0px 2px 8px 0px rgba(216, 74, 27, 0.15);
+    border-radius: 8px 8px 8px 8px;
+    border: 1px solid rgba(216, 74, 27, 0.5);
+    > p:first-child {
+      color: #d84a1b;
+      span {
+        background: #d84a1b;
+      }
+    }
+  }
+  > div.agency3 {
+    background: rgba(42, 85, 229, 0.05);
+    box-shadow: 0px 2px 8px 0px rgba(42, 85, 229, 0.15);
+    border-radius: 8px 8px 8px 8px;
+    border: 1px solid rgba(42, 85, 229, 0.5);
+    > p:first-child {
+      color: #2a55e5;
+      span {
+        background: #2a55e5;
+      }
+    }
+  }
+  > div.agency4 {
+    background: rgba(19, 168, 168, 0.05);
+    box-shadow: 0px 2px 8px 0px rgba(19, 168, 168, 0.15);
+    border-radius: 8px 8px 8px 8px;
+    border: 1px solid rgba(19, 168, 168, 0.5);
+    > p:first-child {
+      color: #13a8a8;
+      span {
+        background: #13a8a8;
+      }
+    }
+  }
+  > div.agency5 {
+    background: rgba(23, 125, 220, 0.05);
+    box-shadow: 0px 2px 8px 0px rgba(23, 125, 220, 0.15);
+    border-radius: 8px 8px 8px 8px;
+    border: 1px solid rgba(23, 125, 220, 0.5);
+
+    > p:first-child {
+      color: #177ddc;
+      span {
+        background: #177ddc;
+      }
+    }
+  }
+}
+.page {
+  display: flex;
+  justify-content: flex-end;
+}
+</style>

+ 7 - 7
src/router/config.js

@@ -20,7 +20,12 @@ const router = new Router({
       redirect: '/index',
       children: [
 
-
+        {
+          path: '/financial/receivablesMessage',
+          name: '每月详情',
+          hidden: true,
+          component: () => import('@/pages/financial/receivablesMessage'),
+        },
         // {
         //   path: 'personnelManage',
         //   name: '人员统计',
@@ -232,12 +237,7 @@ const router = new Router({
       name: '登录页',
       component: () => import('@/pages/login')
     },
-    // {
-    //   path: '*',
-    //   name: '404',
-    //   hidden: true,
-    //   component: () => import('@/pages/exception/404'),
-    // },
+
     {
       path: '/403',
       name: '403',

+ 2 - 2
src/services/api.js

@@ -5,8 +5,8 @@
 
 
 // const BASE_URL = '"https://test.baoxianzhanggui.com/web-api"'//测试服务器
-const BASE_URL = '"https://test.baoxianzhanggui.com/web-api"'//正式服务器
-// const BASE_URL='"https://sxzgkj.baoxianzhanggui.com/web-api"'//正式服务器
+// const BASE_URL = '"https://test.baoxianzhanggui.com/web-api"'//正式服务器
+const BASE_URL = '"https://sxzgkj.baoxianzhanggui.com/web-api"'//正式服务器
 // const BASE_URL= '"http://192.168.0.115:8080/"' //凯森
 // const BASE_URL= '"http://192.168.0.106:8080/"'//屈晨
 // const BASE_URL= '"http://192.168.0.253:8080/"'//田智

+ 4 - 2
src/services/index.js

@@ -9,7 +9,8 @@ import financial from './financial'//财务
 import quote from './quote'//报价
 import profit from './profit'//利润
 import business from "./business" //业务
-import sysManage from "./sysManage"
+import sysManage from "./sysManage"//系统管理
+import wallet from "./wallet"
 export const api = {
   userService,
   dataSource,
@@ -21,6 +22,7 @@ export const api = {
   quote,
   profit,
   business,
-  sysManage
+  sysManage,
+  wallet
 }
 Vue.prototype.$API = api //挂载实例

+ 1 - 1
src/services/mechanism.js

@@ -9,7 +9,7 @@ export async function getMechanism(data) {
 
 //获取树形
 export async function getMechanismTree() {
-    return request(`/dept/findAllTree/`, METHOD.GET)
+    return request(`/dept/findAllTree`, METHOD.GET)
 }
 
 //获取保险公司列表

+ 1 - 1
src/services/profit.js

@@ -3,7 +3,7 @@ import { request, METHOD, } from '@/utils/request'
 
 //获取报价次数列表
 export async function getProfitList(data) {
-    return request("/profitAnalysis/queryPage", METHOD.POST, data)
+    return request("/profitAnalysis/getProfitAnalysisQueryList", METHOD.POST, data)
 }
 
 

+ 30 - 0
src/services/wallet.js

@@ -0,0 +1,30 @@
+import { request, METHOD, } from '@/utils/request'
+
+
+export async function getAgencyLeader(data) {
+    return request("/deptBalance/deptLeaderStatistics", METHOD.POST, data)
+}
+export async function getPartnerStatistics(data) {
+    return request("/deptBalance/queryPartnerStatistics", METHOD.POST, data)
+}
+export async function getTreeDeptUser(data) {
+    return request("/deptBalance/treeDeptUser", METHOD.POST, data)
+}
+export async function getAalletAgent(data) {
+    return request("/deptBalance/walletAgent", METHOD.POST, data)
+}
+export async function getSysDeptTree(data) {
+    return request("/dept/getPartnerDeptTree", METHOD.GET, data)
+}
+
+
+
+
+
+export default {
+    getAgencyLeader,
+    getPartnerStatistics,
+    getTreeDeptUser,
+    getAalletAgent,
+    getSysDeptTree
+}

+ 36 - 12
src/theme/default/style.less

@@ -1,34 +1,58 @@
-.week-mode{
+.week-mode {
   overflow: hidden;
   filter: invert(80%);
 }
-.beauty-scroll{
+
+.ant-tree li ul {
+  padding-left: 8px !important;
+}
+
+.beauty-scroll {
   overflow-y: auto;
-  scrollbar-color: @primary-color @primary-2;
+  scrollbar-color: #eee #fff;
   scrollbar-width: thin;
-  -ms-overflow-style:none;
+  -ms-overflow-style: none;
   position: relative;
-  &::-webkit-scrollbar{
+
+  &::-webkit-scrollbar {
     width: 3px;
     height: 1px;
   }
+
   &::-webkit-scrollbar-thumb {
-    border-radius: 3px;
-    background: @primary-color;
+    display: none;
   }
+
   &::-webkit-scrollbar-track {
-    -webkit-box-shadow: inset 0 0 1px rgba(0,0,0,0);
+    -webkit-box-shadow: inset 0 0 1px rgba(0, 0, 0, 0);
     border-radius: 3px;
-    background: @primary-3;
+    background: none;
   }
+
+
+
+}
+
+.beauty-scroll::-webkit-scrollbar-track {
+  -webkit-box-shadow: inset 0 0 1px rgba(0, 0, 0, 0);
+  border-radius: 3px;
+  background: none;
 }
-.split-right{
+
+.beauty-scroll::-webkit-scrollbar-button {
+  display: none;
+}
+
+
+
+.split-right {
   &:not(:last-child) {
     border-right: 1px solid rgba(98, 98, 98, 0.2);
   }
 }
-.disabled{
+
+.disabled {
   cursor: not-allowed;
   color: @disabled-color;
   pointer-events: none;
-}
+}

+ 1 - 1
src/utils/request.js

@@ -51,7 +51,7 @@ async function request(url, method, params, config) {
  * @param authType {AUTH_TYPE} 认证类型,默认:{AUTH_TYPE.BEARER}
  */
 function setAuthorization(auth, authType = AUTH_TYPE.BEARER) {
-  console.log(authType, AUTH_TYPE.BEARER, auth)
+  // console.log(authType, AUTH_TYPE.BEARER, auth)
   switch (authType) {
     case AUTH_TYPE.BEARER:
       Cookie.set(xsrfHeaderName, 'Bearer ' + auth)

+ 2 - 2
vue.config.js

@@ -121,9 +121,9 @@ module.exports = {
     }
   },
 
-  publicPath: 'https://test.baoxianzhanggui.com/console-api',
+  // publicPath: 'https://sxzgkj.baoxianzhanggui.com/console-api',
 
-  // publicPath: '/',
+  publicPath: '/',
   outputDir: 'dist',
   assetsDir: 'static',
   productionSourceMap: false