Browse Source

Merge branch '11/24SAAS' of http://git.dayaedu.com/yonge/dy-admin-manager into 11/24SAAS

mo 3 years ago
parent
commit
9cdcb6b5b7
59 changed files with 1531 additions and 397 deletions
  1. 2 2
      src/App.vue
  2. 0 10
      src/assets/element-variables.scss
  3. BIN
      src/assets/menu/icon_admin_account.png
  4. BIN
      src/assets/menu/icon_admin_book.png
  5. BIN
      src/assets/menu/icon_admin_change.png
  6. BIN
      src/assets/menu/icon_admin_charge.png
  7. BIN
      src/assets/menu/icon_admin_content.png
  8. BIN
      src/assets/menu/icon_admin_edit.png
  9. BIN
      src/assets/menu/icon_admin_exit.png
  10. BIN
      src/assets/menu/icon_admin_goods.png
  11. BIN
      src/assets/menu/icon_admin_home.png
  12. BIN
      src/assets/menu/icon_admin_message.png
  13. BIN
      src/assets/menu/icon_admin_oa.png
  14. BIN
      src/assets/menu/icon_admin_operate.png
  15. BIN
      src/assets/menu/icon_admin_orgin.png
  16. BIN
      src/assets/menu/icon_admin_people.png
  17. BIN
      src/assets/menu/icon_admin_platform.png
  18. BIN
      src/assets/menu/icon_admin_report.png
  19. BIN
      src/assets/menu/icon_admin_setting.png
  20. BIN
      src/assets/menu/icon_admin_tenant.png
  21. BIN
      src/assets/menu/icon_admin_tenant_manager.png
  22. BIN
      src/assets/menu/icon_admin_user.png
  23. 7 0
      src/constant/index.js
  24. 1 1
      src/layout/components/AppMain.vue
  25. 69 86
      src/layout/components/Navbar.vue
  26. 7 7
      src/layout/components/TagsView.vue
  27. 2 2
      src/layout/index.vue
  28. 4 1
      src/router/index.js
  29. 17 12
      src/store/modules/user.js
  30. 5 0
      src/styles/index.scss
  31. 44 0
      src/styles/menu.scss
  32. 5 77
      src/styles/sidebar.scss
  33. 86 0
      src/styles/theme/berlinBlue.scss
  34. 86 0
      src/styles/theme/cloudAshes.scss
  35. 86 0
      src/styles/theme/volcanicRed.scss
  36. 10 33
      src/styles/variables.scss
  37. 1 0
      src/utils/auth.js
  38. 98 41
      src/utils/setTheme.js
  39. 11 0
      src/utils/vueFilter.js
  40. 14 14
      src/views/businessManager/orderManager/payRecord.vue
  41. 224 0
      src/views/categroyManager/generalSettings/groupMarkPrice.vue
  42. 1 1
      src/views/categroyManager/generalSettings/overallManager.vue
  43. 12 1
      src/views/categroyManager/globalConfig.vue
  44. 1 1
      src/views/login/index.vue
  45. 1 1
      src/views/organManager/components/memberSetting.vue
  46. 47 62
      src/views/organManager/components/organInfo.vue
  47. 7 0
      src/views/resetTeaming/api.js
  48. 44 20
      src/views/resetTeaming/components/giveMemberList.vue
  49. 11 0
      src/views/setSilder/addSilder.vue
  50. 4 4
      src/views/teamBuild/components/teamBaseInfo.vue
  51. 8 0
      src/views/teamDetail/api.js
  52. 91 0
      src/views/teamDetail/components/modals/createMember.vue
  53. 53 17
      src/views/teamDetail/components/studentList.vue
  54. 6 0
      src/views/tenantSetting/api.js
  55. 277 0
      src/views/tenantSetting/chargingRecord.vue
  56. 177 0
      src/views/tenantSetting/groupRecordManager.vue
  57. 10 2
      src/views/tenantSetting/tenantInfo.vue
  58. 1 0
      src/views/tenantSetting/tenantTradeManager.vue
  59. 1 2
      vue.config.js

+ 2 - 2
src/App.vue

@@ -40,7 +40,7 @@ export default {
   display: none !important;
 }
 #app {
-  --color-primary: #14928a;
+  --color-primary: #00A79D;
 }
 // 13817a
 body {
@@ -54,7 +54,7 @@ body {
   visibility: hidden;
 }
 .el-checkbox__inner:hover {
-  background-color: rgb(19, 129, 122);
+  background-color: #00A79D;
 }
 .el-checkbox__input.is-checked .el-checkbox__inner,
 .el-checkbox__input.is-indeterminate .el-checkbox__inner {

+ 0 - 10
src/assets/element-variables.scss

@@ -1,10 +0,0 @@
-$--color-primary: #409EFF !default;
-// $--color-primary-light-1: mix($--color-white, $--color-primary, 10%) !default; /* 53a8ff */
-// $--color-primary-light-2: mix($--color-white, $--color-primary, 20%) !default; /* 66b1ff */
-// $--color-primary-light-3: mix($--color-white, $--color-primary, 30%) !default; /* 79bbff */
-// $--color-primary-light-4: mix($--color-white, $--color-primary, 40%) !default; /* 8cc5ff */
-// $--color-primary-light-5: mix($--color-white, $--color-primary, 50%) !default; /* a0cfff */
-// $--color-primary-light-6: mix($--color-white, $--color-primary, 60%) !default; /* b3d8ff */
-// $--color-primary-light-7: mix($--color-white, $--color-primary, 70%) !default; /* c6e2ff */
-// $--color-primary-light-8: mix($--color-white, $--color-primary, 80%) !default; /* d9ecff */
-// $--color-primary-light-9: mix($--color-white, $--color-primary, 90%) !default; /* ecf5ff */

BIN
src/assets/menu/icon_admin_account.png


BIN
src/assets/menu/icon_admin_book.png


BIN
src/assets/menu/icon_admin_change.png


BIN
src/assets/menu/icon_admin_charge.png


BIN
src/assets/menu/icon_admin_content.png


BIN
src/assets/menu/icon_admin_edit.png


BIN
src/assets/menu/icon_admin_exit.png


BIN
src/assets/menu/icon_admin_goods.png


BIN
src/assets/menu/icon_admin_home.png


BIN
src/assets/menu/icon_admin_message.png


BIN
src/assets/menu/icon_admin_oa.png


BIN
src/assets/menu/icon_admin_operate.png


BIN
src/assets/menu/icon_admin_orgin.png


BIN
src/assets/menu/icon_admin_people.png


BIN
src/assets/menu/icon_admin_platform.png


BIN
src/assets/menu/icon_admin_report.png


BIN
src/assets/menu/icon_admin_setting.png


BIN
src/assets/menu/icon_admin_tenant.png


BIN
src/assets/menu/icon_admin_tenant_manager.png


BIN
src/assets/menu/icon_admin_user.png


+ 7 - 0
src/constant/index.js

@@ -369,3 +369,10 @@ export const memberEnum = {
   "YEAR_HALF": '按半年',
   "YEAR": '按年'
 }
+export const cloudGroupActive = {
+  1: '固定天数',
+  2: '月度',
+  3: '季度',
+  4: '半年',
+  5: '年度'
+}

+ 1 - 1
src/layout/components/AppMain.vue

@@ -126,7 +126,7 @@ export default {
   margin-top: 20px;
 }
 .fixed-header + .app-main {
-  padding-top: 105px;
+  padding-top: 90px;
 }
 </style>
 

+ 69 - 86
src/layout/components/Navbar.vue

@@ -28,7 +28,10 @@
             class="indexlayout-top-menu-li"
             :class="{ active: getTopMenuActive === route.path }"
           >
-            <span>{{ route.meta.title }}</span>
+            <div style="display: flex; align-items: center; justify-content: center; flex-direction: column; height: 76px;">
+              <i :class="[route.meta.icon, 'menuSize']"></i>
+              <span style="line-height: 1.2">{{ route.meta.title }}</span>
+            </div>
           </app-link>
         </template>
       </el-scrollbar>
@@ -37,92 +40,57 @@
       <el-popover
         placement="bottom"
         trigger="hover"
-        style="display: flex; height: 89px"
+        style="display: flex;"
       >
         <div class="popover-container" style="text-align: center">OA审批</div>
 
         <div
-          style="
-            display: flex;
-            align-items: center;
-            justify-content: center;
-            height: 89px;
-          "
-          class="msginfo"
+          class="msginfo right-position"
           @click="gotoOa"
           slot="reference"
         >
-          <img
-            src="@/assets/images/base/icon_oa.png"
-            width="24px"
-            height="24px"
-          />
-
-          <!-- <div class="active"></div> -->
+          <i class="icon_admin_oa operationSize"></i>
         </div>
       </el-popover>
       <el-popover
         v-if="isShowIns"
         placement="bottom"
         trigger="hover"
-        style="display: flex; height: 89px"
+        style="display: flex;"
       >
         <div class="popover-container" style="text-align: center">操作手册</div>
 
         <div
-          style="
-            display: flex;
-            align-items: center;
-            justify-content: center;
-            height: 89px;
-          "
-          class="msginfo"
+          class="msginfo right-position"
           @click="openIns"
           slot="reference"
         >
-          <img
-            src="@/assets/images/base/instruction-icon.png"
-            width="24px"
-            height="24px"
-          />
-
-          <!-- <div class="active"></div> -->
+          <i class="icon_admin_book operationSize"></i>
         </div>
       </el-popover>
 
       <el-popover
         placement="bottom"
         trigger="hover"
-        style="display: flex; height: 89px"
+        style="display: flex;"
       >
         <div class="popover-container" style="text-align: center">系统日志</div>
         <div
-          style="
-            display: flex;
-            align-items: center;
-            justify-content: center;
-            height: 89px;
-          "
-          class="msginfo"
+          class="msginfo right-position"
           v-permission="'/journal'"
           @click="gotoRecode"
           slot="reference"
         >
-          <img
-            src="@/assets/images/base/base-bell.png"
-            width="24px"
-            height="24px"
-          />
-          <!-- <div class="active"></div> -->
+          <i class="icon_admin_message operationSize"></i>
         </div>
       </el-popover>
 
-      <div class="left-menu">
+      <div class="left-menu" style="margin-right: 12px">
         <el-popover
           placement="top-start"
           width="300"
           trigger="hover"
-          style="display: flex; height: 89px"
+          style="display: flex;"
         >
           <div class="popover-container">
             <el-tag
@@ -135,21 +103,9 @@
           </div>
           <span
             slot="reference"
-            class="msginfo"
-            style="
-              display: flex;
-              align-items: center;
-              justify-content: center;
-              height: 89px;
-            "
+            class="msginfo right-position"
           >
-            <!-- {{ organName.length > 10 ? organName.substr(0, 10) + "..." : organName }} -->
-            <!-- <i class="el-icon-s-home" style="font-size: 23px; color: #1A1A1A;"></i> -->
-            <img
-              src="@/assets/images/base/base-home.png"
-              width="24px"
-              height="24px"
-            />
+            <i class="icon_admin_orgin operationSize"></i>
           </span>
         </el-popover>
       </div>
@@ -171,16 +127,21 @@
         <el-dropdown-menu slot="dropdown" class="user-dropdown">
           <!-- divided -->
           <el-dropdown-item v-if="tenantStatus">
-            <span style="display: block" @click="onTenantChange">{{ tenantName }} <i class="el-icon-sort"></i></span>
+            <i class="icon_admin_tenant userSize"></i>
+            <span class="dropdown-text" @click="onTenantChange">{{ tenantName }}</span>
+            <i style="margin-left: 3px" class="icon_admin_change userSize"></i>
           </el-dropdown-item>
           <el-dropdown-item>
-            <span style="display: block" @click="resetPassWord">修改密码</span>
+            <i class="icon_admin_edit userSize"></i>
+            <span class="dropdown-text" @click="resetPassWord">修改密码</span>
           </el-dropdown-item>
           <el-dropdown-item>
-            <span style="display: block" @click="accountSetting">账号设置</span>
+            <i class="icon_admin_account userSize"></i>
+            <span class="dropdown-text" @click="accountSetting">账号设置</span>
           </el-dropdown-item>
-          <el-dropdown-item>
-            <span style="display: block" @click="logout">安全退出</span>
+          <el-dropdown-item style="border-top: 1px solid #EBEEF5;">
+            <i class="icon_admin_exit userSize"></i>
+            <span class="dropdown-text" @click="logout">安全退出</span>
           </el-dropdown-item>
         </el-dropdown-menu>
       </el-dropdown>
@@ -384,7 +345,7 @@ export default {
     },
     async onTenantChange() {
       try {
-        const res = await tenantInfoQueryPage({ page: 1, rows: 999 }, )
+        const res = await tenantInfoQueryPage({ page: 1, rows: 999, payState: 1 }, )
         this.tenantList = res.data?.rows || []
         this.tenantVisible = true
       } catch(e) {}
@@ -409,7 +370,7 @@ export default {
             //判断是否是当前路由
             // if(url == this.$route.path) {
               tenantConfig.tenantId = tenantForm.tenantId
-              tenantConfig.tenantName = tenantForm.tenantName
+              tenantConfig.tenantName = tenantName
               sessionStorage.setItem('tenantConfig', JSON.stringify(tenantConfig))
               this.$router.push({
                   path: '/redirect',
@@ -521,16 +482,16 @@ export default {
 
 .indexlayout-top-menu {
   padding-left: 57px;
-  height: 90px;
-  line-height: 88px;
+  height: 76px;
+  line-height: 76px;
   flex: 1;
   display: flex;
   overflow: hidden;
   /* overflow-x: auto; */
   .indexlayout-top-menu-li {
-    display: inline-block;
+    display: table-cell;
     padding: 0 5px;
-    height: 90px;
+    height: 76px;
     text-decoration: none;
     color: #f2f2f2;
     font-size: 16px;
@@ -538,21 +499,22 @@ export default {
     span {
       // display: block;
       transition: all 0.3s ease;
-      padding: 10px 20px;
+      // padding: 10px 20px;
+      padding: 8px 20px 3px;
     }
     &:hover,
     &.active {
       span {
-        background: #fff;
-        border-radius: 6px;
+        font-weight: 500;
+      //   border-radius: 6px;
       }
     }
-    &.active span {
-      font-weight: bold;
-    }
+    // &.active span {
+    //   font-weight: bold;
+    // }
   }
   .breadcrumb {
-    line-height: 90px;
+    line-height: 76px;
     margin-left: 10px;
     .el-breadcrumb__item {
       display: inline-block;
@@ -568,7 +530,7 @@ export default {
   display: flex;
   flex-direction: row;
   justify-content: space-between;
-  height: 90px;
+  height: 76px;
   overflow: hidden;
   position: relative;
   z-index: 2000;
@@ -576,12 +538,12 @@ export default {
 
   h2 {
     font-size: 18px;
-    line-height: 90px;
+    line-height: 76px;
     margin: 0 0 0 30px;
     display: inline-block;
   }
   .hamburger-container {
-    line-height: 90px;
+    line-height: 76px;
     height: 100%;
     float: left;
     cursor: pointer;
@@ -597,7 +559,7 @@ export default {
     float: left;
   }
   .left-menu {
-    line-height: 90px;
+    line-height: 76px;
     // padding-right: 22px;
     font-size: 16px;
     .topIcon {
@@ -609,7 +571,7 @@ export default {
     min-width: 154px;
     float: right;
     height: 100%;
-    line-height: 90px;
+    line-height: 76px;
     display: flex;
     flex-direction: row;
     justify-content: flex-start;
@@ -627,7 +589,7 @@ export default {
       flex-direction: row;
       justify-content: flex-start;
       align-items: center;
-      padding-right: 25px;
+      padding: 0 12px;
       position: relative;
       cursor: pointer;
       img {
@@ -663,7 +625,7 @@ export default {
     }
 
     .avatar-container {
-      height: 90px;
+      height: 76px;
       margin-right: 42px;
       cursor: pointer;
 
@@ -700,4 +662,25 @@ export default {
     }
   }
 }
+.user-dropdown {
+  width: 135px;
+  .el-dropdown-menu__item {
+    display: flex;
+    align-items: center;
+    padding: 3px 17px;
+  }
+  .dropdown-text {
+    display: block;
+    width: 60px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+}
+.right-position {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  height: 75px;
+}
 </style>

+ 7 - 7
src/layout/components/TagsView.vue

@@ -268,16 +268,16 @@ export default {
   .tags-view-wrapper {
     background: #edeef0;
     height: 34px;
-    // border-bottom: 1px solid #d8dce5;
-    box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12), 0 0 3px 0 rgba(0, 0, 0, 0.04);
-    // box-shadow: 0 2px 10px 0 rgba(0,0,0,.05);
+    background: linear-gradient(180deg, #F9F9F9 0%, #ECECEC 100%);
+    box-shadow: 0px 1px 1px 0px rgba(255, 255, 255, 0.5);
     .tags-view-item {
+      background: linear-gradient(180deg, #f6f6f6 0%, #ececec 100%);
       min-width: 120px;
       display: inline-flex;
       .icon {
-        font-size: 20px;
+        font-size: 22px;
         position: relative;
-        top: 3px;
+        top: 1px;
         float: right;
         margin-right: 5px;
       }
@@ -294,12 +294,12 @@ export default {
       // margin-left: 5px;
       margin-top: 4px;
       &:first-of-type {
-        margin-left: 15px;
+        // margin-left: 15px;
       }
       &.active {
         color: #495060;
         left: -1px;
-        background-color: #fff;
+        background: #fff;
         z-index: 2;
 
         &::before {

+ 2 - 2
src/layout/index.vue

@@ -16,7 +16,7 @@
     </div>
     <sidebar class="sidebar-container" @childStatus="childStatus" :class="[onlyStatus && isCollapse ? null : 'noSide']" />
     <div class="main-container" :class="[ onlyStatus && isCollapse ? null : 'noContainer' ]">
-      <div :class="{'fixed-header':fixedHeader, 'noTagView': !(onlyStatus && isCollapse)}" style="top: 90px; z-index:999!important" >
+      <div :class="{'fixed-header':fixedHeader, 'noTagView': !(onlyStatus && isCollapse)}" style="top: 76px; z-index:999!important" >
         <!-- <navbar /> -->
         <tags-view></tags-view>
       </div>
@@ -83,7 +83,7 @@ export default {
 @import "~@/styles/variables.scss";
 
 #app .sidebar-container {
-  top: 90px;
+  top: 76px;
   background-color: #fff;
 
 }

+ 4 - 1
src/router/index.js

@@ -497,7 +497,10 @@ export const asyncRoutes = {
   tenantInfoSetting:() => import('@/views/tenantSetting/tenantInfo.vue'),
   // 机构交易管理
   tenantTradeManager:() => import('@/views/tenantSetting/tenantTradeManager.vue'),
-
+  // 团练宝激活记录
+  groupRecordManager:() => import('@/views/tenantSetting/groupRecordManager.vue'),
+  // 扣费记录
+  chargingRecord:() => import('@/views/tenantSetting/chargingRecord.vue'),
 }
 
 export default router

+ 17 - 12
src/store/modules/user.js

@@ -52,20 +52,22 @@ async function tenantQueryPage(id) {
   try {
     let tenantId = id
     if(tenantId < 0) {
-      const res = await tenantInfoQueryPage({ page: 1, rows: 1 })
+      const res = await tenantInfoQueryPage({ page: 1, rows: 1, payState: 1 })
       const tenantList = res.data?.rows || []
       tenantId = tenantList[0]?.id
     }
-    const info = await tenantInfoInfo({id: tenantId})
-    const data = info.data
-    sessionStorage.setItem('tenantConfig', JSON.stringify({
-      themeColor: data.config.themeColor,
-      theme: data.config.theme,
-      tenantId: data.id,
-      tenantName: data.name,
-      tenantLogo: data.logo,
-      tenantStatus: 'on' // 判断是否此状态,没有的话,刷新页面会重新请求页面
-    }))
+    if(tenantId) {
+      const info = await tenantInfoInfo({id: tenantId})
+      const data = info.data
+      sessionStorage.setItem('tenantConfig', JSON.stringify({
+        themeColor: data.config.themeColor,
+        theme: data.config.theme,
+        tenantId: data.id,
+        tenantName: data.name,
+        tenantLogo: data.logo,
+        tenantStatus: 'on' // 判断是否此状态,没有的话,刷新页面会重新请求页面
+      }))
+    }
   } catch(e) {}
 }
 
@@ -114,11 +116,14 @@ const actions = {
           tenantConfig = tenantConfig ? JSON.parse(tenantConfig) : {}
           if(tenantConfig.tenantStatus != 'on') {
             await tenantQueryPage(tenantId)
+            // 会重置数据
+            tenantConfig = sessionStorage.getItem('tenantConfig')
+            tenantConfig = tenantConfig ? JSON.parse(tenantConfig) : {}
           }
           if(tenantId > 0) { // 判断是机构才会根据主题去设置
             const themeColor = tenantConfig.themeColor
             const theme = tenantConfig.theme
-            setTheme(themeColor)
+            setTheme({ theme, themeColor })
           }
           sessionStorage.setItem('baseTenantId', tenantId)
           commit('SET_NAME', username)

+ 5 - 0
src/styles/index.scss

@@ -3,7 +3,12 @@
 @import './transition.scss';
 @import './element-ui.scss';
 @import './sidebar.scss';
+// 引用其它三种皮肤
+@import './theme/berlinBlue.scss';
+@import './theme/cloudAshes.scss';
+@import './theme/volcanicRed.scss';
 
+@import './menu.scss';
 // $--color-primary: red;
 body {
   height: 100%;

+ 44 - 0
src/styles/menu.scss

@@ -0,0 +1,44 @@
+.menuSize {
+  width: 16px;
+  height: 16px;
+}
+.operationSize {
+  width: 22px;
+  height: 22px;
+}
+.userSize {
+  width: 14px;
+  height: 14px;
+}
+
+.baseCss {
+  display: inline-block;
+}
+
+$menuList: icon_admin_home, icon_admin_tenant_manager, icon_admin_charge, icon_admin_operate, icon_admin_user, icon_admin_people, icon_admin_content, icon_admin_goods, icon_admin_report, icon_admin_setting, icon_admin_platform, icon_admin_oa, icon_admin_book, icon_admin_message, icon_admin_orgin, icon_admin_tenant, icon_admin_change, icon_admin_account, icon_admin_edit, icon_admin_exit;
+
+// 开始 @each 循环遍历数组
+// $c 作为循环变量,代表了数组的元素,不是索引~!!!
+@each $c in $menuList{
+  .#{$c} {
+    @extend .baseCss;
+    background: url('~@/assets/menu/#{$c}.png') no-repeat center center;
+    background-size: cover;
+  }
+}
+
+// $operationList: icon_admin_oa, icon_admin_book, icon_admin_message, icon_admin_orgin;
+// @each $c in $operationList{
+//   .#{$c} {
+//     background: url('~@/assets/menu/#{$c}.png') no-repeat center center;
+//     background-size: cover;
+//   }
+// }
+
+// $userList: icon_admin_tenant, icon_admin_change, icon_admin_account, icon_admin_edit, icon_admin_exit;
+// @each $c in $userList{
+//   .#{$c} {
+//     background: url('~@/assets/menu/#{$c}.png') no-repeat center center;
+//     background-size: cover;
+//   }
+// }

+ 5 - 77
src/styles/sidebar.scss

@@ -1,9 +1,4 @@
-#app, #app.green {
-  .indexlayout-top-menu-li {
-    &:hover, &.active {
-      color: $menuActiveText2 !important;
-    }
-  }
+#app, #app.adenGreen {
   .sidebar-container {
     background-color: $menuBg;
     // menu hover
@@ -65,7 +60,7 @@
 
 
   .el-menu-item.is-active {
-    font-weight: bold;
+    // font-weight: bold;
     position: relative;
     &::after {
       position: absolute;
@@ -303,7 +298,7 @@
   }
 
   .el-menu-item.is-active {
-    font-weight: bold;
+    // font-weight: bold;
     position: relative;
     &::after {
       position: absolute;
@@ -322,80 +317,13 @@
       color: #fff;
     }
   }
-}
-
-#app.dark {
   .indexlayout-top-menu-li {
     &:hover, &.active {
-      color: $darkmenuActiveText2 !important;
-    }
-  }
-  .sidebar-container {
-    background-color: $darkmenuBg;
-    .submenu-title-noDropdown,
-    .el-submenu__title {
-      &:hover {
-        background-color: $darkmenuHover !important;
-        color: $darkmenuActiveText2 !important;
-        &::after{
-          background-color: $darkmenuActiveText2;
-        }
-      }
-    }
-    .is-active>.el-submenu__title {
-      color: $darksubMenuActiveText !important;
-    }
-
-    & .nest-menu .el-submenu>.el-submenu__title,
-    & .el-submenu .el-menu-item {
-      background-color: $darksubMenuBg!important;
-
-      &:hover {
-        background-color: $darksubMenuHover!important;
-        color: $darkmenuActiveText2 !important;
-        &::after{
-          background-color: $darkmenuActiveText2;
-        }
-      }
-    }
-
-    & .el-menu-item {
-      &:hover {
-        background-color: $darksubMenuHover!important;
-        color: $darkmenuActiveText2 !important;
-        &::after{
-          background-color: $darkmenuActiveText2;
-        }
-      }
-    }
-  }
-
-  .el-submenu .el-menu-item.is-active {
-    background-color: $darksubMenuActiveBg!important;
-    &::after{
-      background-color: $darkmenuActiveText2;
-    }
-  }
-
-  .el-menu-item.is-active {
-    background-color: $darkmenuHover !important;
-    color: $darkmenuActiveText2 !important;
-    &::after {
-      background-color: $darkmenuActiveAfter;
-    }
-  }
-  .el-submenu .el-menu-item.is-active {
-    color: $darkmenuActiveText2 !important;
-  }
-
-  .navbar {
-    background: $darkmenuPrimary;
-    .left-menu {
-      color: #fff;
+      color: $menuActiveText !important;
+      background-color: $menuActiveBg !important;
     }
   }
 }
-
 // when menu collapsed
 // .el-menu--vertical {
 //   &>.el-menu {

+ 86 - 0
src/styles/theme/berlinBlue.scss

@@ -0,0 +1,86 @@
+// 第二套样式配置
+$bluemenuPrimary: #2B78CC;
+$bluemenuActiveBg: #2568B2;
+$bluemenuText:#1a1a1a;
+$bluemenuActiveText:#fff;
+$bluemenuActiveText2:#2B78CC;
+$bluesubMenuActiveText:#030303; //https://github.com/ElemeFE/element/issues/12951
+$bluemenuBg:#fff; // 侧边栏一级默认样式
+$bluemenuHover: #EDF6FF; // 侧边栏一级滑动样式
+$bluesubMenuBg:#fff; // 侧边栏二级默认样式
+$bluesubMenuHover:#EDF6FF; // 侧边栏二级鼠标滑动样式
+$bluesubMenuActiveBg:#EDF6FF; // 侧边栏二级选中样式
+$bluemenuActiveAfter: #2B78CC;
+
+#app.berlinBlue {
+  .sidebar-container {
+    background-color: $bluemenuBg;
+    .submenu-title-noDropdown,
+    .el-submenu__title {
+      &:hover {
+        background-color: $bluemenuHover !important;
+        color: $bluemenuActiveText2 !important;
+        &::after{
+          background-color: $bluemenuActiveText2;
+        }
+      }
+    }
+    .is-active>.el-submenu__title {
+      color: $bluesubMenuActiveText !important;
+    }
+
+    & .nest-menu .el-submenu>.el-submenu__title,
+    & .el-submenu .el-menu-item {
+      background-color: $bluesubMenuBg!important;
+
+      &:hover {
+        background-color: $bluesubMenuHover!important;
+        color: $bluemenuActiveText2 !important;
+        &::after{
+          background-color: $bluemenuActiveText2;
+        }
+      }
+    }
+
+    & .el-menu-item {
+      &:hover {
+        background-color: $bluesubMenuHover!important;
+        color: $bluemenuActiveText2 !important;
+        &::after{
+          background-color: $bluemenuActiveText2;
+        }
+      }
+    }
+  }
+
+  .el-submenu .el-menu-item.is-active {
+    background-color: $bluesubMenuActiveBg!important;
+    &::after{
+      background-color: $bluemenuActiveText2;
+    }
+  }
+
+  .el-menu-item.is-active {
+    background-color: $bluemenuHover !important;
+    color: $bluemenuActiveText2 !important;
+    &::after {
+      background-color: $bluemenuActiveAfter;
+    }
+  }
+  .el-submenu .el-menu-item.is-active {
+    color: $bluemenuActiveText2 !important;
+  }
+
+  .navbar {
+    background: $bluemenuPrimary;
+    .left-menu {
+      color: #fff;
+    }
+  }
+  .indexlayout-top-menu-li {
+    &:hover, &.active {
+      color: $bluemenuActiveText !important;
+      background-color: $bluemenuActiveBg !important;
+    }
+  }
+}

+ 86 - 0
src/styles/theme/cloudAshes.scss

@@ -0,0 +1,86 @@
+// 第二套样式配置
+$ashesmenuPrimary: #444D5C;
+$ashesmenuActiveBg: #363A49; // 头部菜单选中背景色
+$ashesmenuText:#1a1a1a;
+$ashesmenuActiveText:#fff;
+$ashesmenuActiveText2:#444D5C;
+$ashessubMenuActiveText:#030303; //https://github.com/ElemeFE/element/issues/12951
+$ashesmenuBg:#fff; // 侧边栏一级默认样式
+$ashesmenuHover: #F3F4F7; // 侧边栏一级滑动样式
+$ashessubMenuBg:#fff; // 侧边栏二级默认样式
+$ashessubMenuHover:#F3F4F7; // 侧边栏二级鼠标滑动样式
+$ashessubMenuActiveBg:#F3F4F7; // 侧边栏二级选中样式
+$ashesmenuActiveAfter: #444D5C;
+
+#app.cloudAshes {
+  .sidebar-container {
+    background-color: $ashesmenuBg;
+    .submenu-title-noDropdown,
+    .el-submenu__title {
+      &:hover {
+        background-color: $ashesmenuHover !important;
+        color: $ashesmenuActiveText2 !important;
+        &::after{
+          background-color: $ashesmenuActiveText2;
+        }
+      }
+    }
+    .is-active>.el-submenu__title {
+      color: $ashessubMenuActiveText !important;
+    }
+
+    & .nest-menu .el-submenu>.el-submenu__title,
+    & .el-submenu .el-menu-item {
+      background-color: $ashessubMenuBg!important;
+
+      &:hover {
+        background-color: $ashessubMenuHover!important;
+        color: $ashesmenuActiveText2 !important;
+        &::after{
+          background-color: $ashesmenuActiveText2;
+        }
+      }
+    }
+
+    & .el-menu-item {
+      &:hover {
+        background-color: $ashessubMenuHover!important;
+        color: $ashesmenuActiveText2 !important;
+        &::after{
+          background-color: $ashesmenuActiveText2;
+        }
+      }
+    }
+  }
+
+  .el-submenu .el-menu-item.is-active {
+    background-color: $ashessubMenuActiveBg!important;
+    &::after{
+      background-color: $ashesmenuActiveText2;
+    }
+  }
+
+  .el-menu-item.is-active {
+    background-color: $ashesmenuHover !important;
+    color: $ashesmenuActiveText2 !important;
+    &::after {
+      background-color: $ashesmenuActiveAfter;
+    }
+  }
+  .el-submenu .el-menu-item.is-active {
+    color: $ashesmenuActiveText2 !important;
+  }
+
+  .navbar {
+    background: $ashesmenuPrimary;
+    .left-menu {
+      color: #fff;
+    }
+  }
+  .indexlayout-top-menu-li {
+    &:hover, &.active {
+      color: $ashesmenuActiveText !important;
+      background-color: $ashesmenuActiveBg !important;
+    }
+  }
+}

+ 86 - 0
src/styles/theme/volcanicRed.scss

@@ -0,0 +1,86 @@
+// 第二套样式配置
+$redmenuPrimary: #BC3030;
+$redmenuActiveBg: #A62929;
+$redmenuText:#1a1a1a;
+$redmenuActiveText:#fff;
+$redmenuActiveText2:#BC3030;
+$redsubMenuActiveText:#030303; //https://github.com/ElemeFE/element/issues/12951
+$redmenuBg:#fff; // 侧边栏一级默认样式
+$redmenuHover: #FBF3F3; // 侧边栏一级滑动样式
+$redsubMenuBg:#fff; // 侧边栏二级默认样式
+$redsubMenuHover:#FBF3F3; // 侧边栏二级鼠标滑动样式
+$redsubMenuActiveBg:#FBF3F3; // 侧边栏二级选中样式
+$redmenuActiveAfter: #BC3030;
+
+#app.volcanicRed {
+  .sidebar-container {
+    background-color: $redmenuBg;
+    .submenu-title-noDropdown,
+    .el-submenu__title {
+      &:hover {
+        background-color: $redmenuHover !important;
+        color: $redmenuActiveText2 !important;
+        &::after{
+          background-color: $redmenuActiveText2;
+        }
+      }
+    }
+    .is-active>.el-submenu__title {
+      color: $redsubMenuActiveText !important;
+    }
+
+    & .nest-menu .el-submenu>.el-submenu__title,
+    & .el-submenu .el-menu-item {
+      background-color: $redsubMenuBg!important;
+
+      &:hover {
+        background-color: $redsubMenuHover!important;
+        color: $redmenuActiveText2 !important;
+        &::after{
+          background-color: $redmenuActiveText2;
+        }
+      }
+    }
+
+    & .el-menu-item {
+      &:hover {
+        background-color: $redsubMenuHover!important;
+        color: $redmenuActiveText2 !important;
+        &::after{
+          background-color: $redmenuActiveText2;
+        }
+      }
+    }
+  }
+
+  .el-submenu .el-menu-item.is-active {
+    background-color: $redsubMenuActiveBg!important;
+    &::after{
+      background-color: $redmenuActiveText2;
+    }
+  }
+
+  .el-menu-item.is-active {
+    background-color: $redmenuHover !important;
+    color: $redmenuActiveText2 !important;
+    &::after {
+      background-color: $redmenuActiveAfter;
+    }
+  }
+  .el-submenu .el-menu-item.is-active {
+    color: $redmenuActiveText2 !important;
+  }
+
+  .navbar {
+    background: $redmenuPrimary;
+    .left-menu {
+      color: #fff;
+    }
+  }
+  .indexlayout-top-menu-li {
+    &:hover, &.active {
+      color: $redmenuActiveText !important;
+      background-color: $redmenuActiveBg !important;
+    }
+  }
+}

+ 10 - 33
src/styles/variables.scss

@@ -1,34 +1,21 @@
 // 默认大雅绿样式
-$menuPrimary: #14928A;
+$menuPrimary: #00A79D;
+$menuActiveBg: #00928A; // 头部菜单选中背景色
 $menuText:#1a1a1a;    // #000
 $menuActiveText:#fff;
-$menuActiveText2:#14928A;
-$subMenuActiveText:#1a1a1a; //https://github.com/ElemeFE/element/issues/12951
+$menuActiveText2:#00A79D;
+$subMenuActiveText:#030303; //https://github.com/ElemeFE/element/issues/12951
 $menuBg:#fff; // 侧边栏一级默认样式
-$menuHover: #EEF4F4; // 侧边栏一级滑动样式
+$menuHover: #F0FAF9; // 侧边栏一级滑动样式
 $subMenuBg:#fff; // 侧边栏二级默认样式
-$subMenuHover:#EEF4F4; // 侧边栏二级鼠标滑动样式
-$subMenuActiveBg:#EEF4F4; // 侧边栏二级选中样式
-$menuActiveAfter: #14928A;
-
-// 第二套样式配置
-$darkmenuPrimary: #177ddc;
-$darkmenuText:#fff;
-$darkmenuActiveText:#fff;
-$darkmenuActiveText2:#000;
-$darksubMenuActiveText:#fff; //https://github.com/ElemeFE/element/issues/12951
-$darkmenuBg:#000; // 侧边栏一级默认样式
-$darkmenuHover: #177ddc; // 侧边栏一级滑动样式
-$darksubMenuBg:#000; // 侧边栏二级默认样式
-$darksubMenuHover:#177ddc; // 侧边栏二级鼠标滑动样式
-$darksubMenuActiveBg:#177ddc; // 侧边栏二级选中样式
-$darkmenuActiveAfter: #000;
-
+$subMenuHover:#F0FAF9; // 侧边栏二级鼠标滑动样式
+$subMenuActiveBg:#F0FAF9; // 侧边栏二级选中样式
+$menuActiveAfter: #00A79D;
 
 
 $sideBarWidth: 195px;
 /* 改变主题色变量 */
-// $--color-primary: rgb(19, 129, 122);
+// $--color-primary: #00A79D;
 // the :export directive is the magic sauce for webpack
 // https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
 :export {
@@ -42,20 +29,10 @@ $sideBarWidth: 195px;
   subMenuHover: $subMenuHover;
   menuActiveAfter: $menuActiveAfter;
   sideBarWidth: $sideBarWidth;
-
-  darkmenuText: $darkmenuText;
-  darkmenuActiveText: $darkmenuActiveText;
-  darkmenuActiveText2: $darkmenuActiveText2;
-  darksubMenuActiveText: $darksubMenuActiveText;
-  darkmenuBg: $darkmenuBg;
-  darkmenuHover: $darkmenuHover;
-  darksubMenuBg: $darksubMenuBg;
-  darksubMenuHover: $darksubMenuHover;
-  darkmenuActiveAfter: $darkmenuActiveAfter
 }
 
 /* 改变主题色变量 */
-$--color-primary: #14928a;
+$--color-primary: #00A79D;
 
 /* 改变 icon 字体路径变量,必需 */
 $--font-path: '~element-ui/lib/theme-chalk/fonts';

+ 1 - 0
src/utils/auth.js

@@ -35,6 +35,7 @@ export function removeToken () {
 export function removeTenant() {
   // 移除跟机构相关信息
   sessionStorage.removeItem('tenantConfig')
+  sessionStorage.removeItem('baseTenantId')
 }
 
 export function setCrossToken (token) {

+ 98 - 41
src/utils/setTheme.js

@@ -4,60 +4,117 @@ const version = require('element-ui/package.json').version // element-ui version
 const ORIGINAL_THEME = '#409EFF' // default color
 
 let chalk = ''
-let theme = ''
-
-export const setTheme = async (val, isLoading) => { // 是否显示加载样式
-  const oldVal = ORIGINAL_THEME
-  if (typeof val !== 'string') return
-  const themeCluster = getThemeCluster(val.replace('#', ''))
-  const originalCluster = getThemeCluster(oldVal.replace('#', ''))
-
-  if(isLoading) {
-    showFullScreenLoading()
-  }
-
-  const getHandler = (variable, id) => {
-    return () => {
-      const originalCluster = getThemeCluster(ORIGINAL_THEME.replace('#', ''))
-      const newStyle = updateStyle(chalk, originalCluster, themeCluster)
+// let theme = ''
+
+// themeList: [{
+//   selected: true,
+//   name: '大雅绿(默认)',
+//   color: '#14928a',
+//   style: 'background-color: #14928a'
+// }, {
+//   selected: false,
+//   name: '拂晓蓝',
+//   color: '#1890ff',
+//   style: 'background-color: #1890ff'
+// }, {
+//   selected: false,
+//   name: '薄暮',
+//   color: '#f5222d',
+//   style: 'background-color: #f5222d'
+// }, {
+//   selected: false,
+//   name: '火山',
+//   color: '#fa541c',
+//   style: 'background-color: #fa541c'
+// }, {
+//   selected: false,
+//   name: '日暮',
+//   color: '#faad14',
+//   style: 'background-color: #faad14'
+// }, {
+//   selected: false,
+//   name: '明青',
+//   color: '#13c2c2',
+//   style: 'background-color: #13c2c2'
+// }, {
+//   selected: false,
+//   name: '极客蓝',
+//   color: '#2f54eb',
+//   style: 'background-color: #2f54eb'
+// }, {
+//   selected: false,
+//   name: '酱紫',
+//   color: '#722ed1',
+//   style: 'background-color: #722ed1'
+// }],
+
+
+// 设置主题色
+export const setTheme = async (params) => { // 是否显示加载样式
+  const { themeColor, theme, isLoading } = params
+  if(themeColor) {
+    const oldVal = ORIGINAL_THEME
+    if (typeof themeColor !== 'string') return
+    const themeCluster = getThemeCluster(themeColor.replace('#', ''))
+    const originalCluster = getThemeCluster(oldVal.replace('#', ''))
+
+    if(isLoading) {
+      showFullScreenLoading()
+    }
 
-      let styleTag = document.getElementById(id)
-      if (!styleTag) {
-        styleTag = document.createElement('style')
-        styleTag.setAttribute('id', id)
-        document.head.appendChild(styleTag)
+    const getHandler = (variable, id) => {
+      return () => {
+        const originalCluster = getThemeCluster(ORIGINAL_THEME.replace('#', ''))
+        const newStyle = updateStyle(chalk, originalCluster, themeCluster)
+
+        let styleTag = document.getElementById(id)
+        if (!styleTag) {
+          styleTag = document.createElement('style')
+          styleTag.setAttribute('id', id)
+          document.head.appendChild(styleTag)
+        }
+        styleTag.innerText = newStyle
       }
-      styleTag.innerText = newStyle
     }
-  }
 
-  if (!chalk) {
-    const url = `https://unpkg.com/element-ui@${version}/lib/theme-chalk/index.css`
-    await getCSSString(url, 'chalk')
-  }
+    if (!chalk) {
+      const url = `https://unpkg.com/element-ui@${version}/lib/theme-chalk/index.css`
+      await getCSSString(url, 'chalk')
+    }
 
-  const chalkHandler = getHandler('chalk', 'chalk-style')
+    const chalkHandler = getHandler('chalk', 'chalk-style')
 
-  chalkHandler()
+    chalkHandler()
 
-  const styles = [].slice.call(document.querySelectorAll('style'))
-    .filter(style => {
-      const text = style.innerText
-      return new RegExp(oldVal, 'i').test(text) && !/Chalk Variables/.test(text)
+    const styles = [].slice.call(document.querySelectorAll('style'))
+      .filter(style => {
+        const text = style.innerText
+        return new RegExp(oldVal, 'i').test(text) && !/Chalk Variables/.test(text)
+      })
+    styles.forEach(style => {
+      const { innerText } = style
+      if (typeof innerText !== 'string') return
+      style.innerText = updateStyle(innerText, originalCluster, themeCluster)
     })
-  styles.forEach(style => {
-    const { innerText } = style
-    if (typeof innerText !== 'string') return
-    style.innerText = updateStyle(innerText, originalCluster, themeCluster)
-  })
 
-  const element = document.getElementById('app')
-  element.style.setProperty('--color-primary', val)
+    // 修改其它不是组件里面的颜色
+    const element = document.getElementById('app')
+    element.style.setProperty('--color-primary', themeColor)
+  }
+  // 修改主题
+  if(theme) {
+    document.querySelector("#app").className = theme
+  }
 
   // 修改存的主题色
   let tenantConfig = sessionStorage.getItem('tenantConfig')
   tenantConfig = tenantConfig ? JSON.parse(tenantConfig) : {}
-  tenantConfig.themeColor = val
+  if(themeColor) {
+    tenantConfig.themeColor = themeColor
+  }
+  if(theme) {
+    tenantConfig.theme = theme
+  }
   sessionStorage.setItem('tenantConfig', JSON.stringify(tenantConfig))
 
   if(isLoading) {

+ 11 - 0
src/utils/vueFilter.js

@@ -777,3 +777,14 @@ Vue.filter('couponTypeFilter', (value) => {
 Vue.filter('tenantStatus', value => {
   return constant.tenantStatus[value]
 })
+
+Vue.filter('cloudGroupActive', value => {
+  let template = {
+    1: '天数',
+    2: '月度',
+    3: '季度',
+    4: '半年',
+    5: '年度'
+  }
+  return template[value]
+})

+ 14 - 14
src/views/businessManager/orderManager/payRecord.vue

@@ -89,7 +89,7 @@
             <el-option v-for="item in paymentChannelStatus" :key="item.value" :label="item.label" :value="item.value"></el-option>
           </el-select>
         </el-form-item> -->
-        <el-form-item>
+        <!-- <el-form-item>
           <el-date-picker
             style="width: 410px"
             v-model.trim="searchForm.orderDate"
@@ -102,7 +102,7 @@
             :picker-options="{ firstDayOfWeek: 1 }"
           >
           </el-date-picker>
-        </el-form-item>
+        </el-form-item> -->
         <el-form-item>
           <el-button native-type="submit" type="danger">搜索</el-button>
           <el-button native-type="reset" type="primary">重置</el-button>
@@ -332,7 +332,7 @@ export default {
         dingtalkProcessNo: "",
         financialProcessNo: "",
         cooperationOrganId: null,
-        orderDate: [],
+        // orderDate: [],
       },
       headers: {
         Authorization: getToken(),
@@ -352,15 +352,15 @@ export default {
     };
   },
   created(){
-        if (this.searchForm.orderDate?.length < 1) {
-      var now = new Date();
-      var startDate = dayjs().format("YYYY-MM-DD");
-      var endDate = dayjs().format("YYYY-MM-DD");
-      this.searchForm.orderDate = [];
-      this.searchForm.orderDate.push(startDate);
-      this.searchForm.orderDate.push(endDate);
-      this.searchOrderDate(this.searchForm.orderDate);
-    }
+    // if (this.searchForm.orderDate?.length < 1) {
+    //   var now = new Date();
+    //   var startDate = dayjs().format("YYYY-MM-DD");
+    //   var endDate = dayjs().format("YYYY-MM-DD");
+    //   this.searchForm.orderDate = [];
+    //   this.searchForm.orderDate.push(startDate);
+    //   this.searchForm.orderDate.push(endDate);
+    //   this.searchOrderDate(this.searchForm.orderDate);
+    // }
   },
   mounted() {
     // getEmployeeOrgan().then(res => {
@@ -452,13 +452,13 @@ export default {
       });
     },
     getList() {
-      let { orderDate,organId, ...ruset } = this.searchForm;
+      let { organId, ...ruset } = this.searchForm;
       let params = {
         ...ruset,
         page: this.pageInfo.page,
         rows: this.pageInfo.limit,
         organId:this.searchForm.organId.join(','),
-        ...getTimes(orderDate, ["startTime", "endTime"]),
+        // ...getTimes(orderDate, ["startTime", "endTime"]),
       };
       getFinancialExpenditure(params).then((res) => {
         let result = res.data;

+ 224 - 0
src/views/categroyManager/generalSettings/groupMarkPrice.vue

@@ -0,0 +1,224 @@
+<template>
+  <div class="">
+    <div class="m-core">
+      <el-form :inline="true" :model="form" ref="form">
+        <el-alert
+          style="margin: 10px 0"
+          title="机构团练宝定价范围设置"
+          :closable="false"
+          type="info"
+        >
+        </el-alert>
+        <el-row>
+          <el-form-item
+            prop="190"
+            :rules="[
+              {
+                required: false,
+                pattern: /^[1-9][0-9]*$/,
+                message: '请输入正确的账号数量',
+              },
+            ]"
+          >
+            月度团练宝机构定价范围最低:
+            <el-input
+              v-model="form['190']"
+              placeholder="请输入金额"
+            >
+              <template slot="append">元</template>
+            </el-input>
+            最高
+          </el-form-item>
+          <el-form-item
+            prop="190"
+            :rules="[
+              {
+                required: false,
+                pattern: /^[1-9][0-9]*$/,
+                message: '请输入正确的账号数量',
+              },
+            ]"
+          >
+            <el-input
+              v-model="form['190']"
+              placeholder="请输入金额"
+            >
+              <template slot="append">元</template>
+            </el-input>
+          </el-form-item>
+        </el-row>
+        <el-row>
+          <el-form-item
+            prop="190"
+            :rules="[
+              {
+                required: false,
+                pattern: /^[1-9][0-9]*$/,
+                message: '请输入正确的账号数量',
+              },
+            ]"
+          >
+            季度团练宝机构定价范围最低:
+            <el-input
+              v-model="form['190']"
+              placeholder="请输入金额"
+            >
+              <template slot="append">元</template>
+            </el-input>
+            最高
+          </el-form-item>
+          <el-form-item
+            prop="190"
+            :rules="[
+              {
+                required: false,
+                pattern: /^[1-9][0-9]*$/,
+                message: '请输入正确的账号数量',
+              },
+            ]"
+          >
+            <el-input
+              v-model="form['190']"
+              placeholder="请输入金额"
+            >
+              <template slot="append">元</template>
+            </el-input>
+          </el-form-item>
+        </el-row>
+        <el-row>
+          <el-form-item
+            prop="190"
+            :rules="[
+              {
+                required: false,
+                pattern: /^[1-9][0-9]*$/,
+                message: '请输入正确的账号数量',
+              },
+            ]"
+          >
+            半年团练宝机构定价范围最低:
+            <el-input
+              v-model="form['190']"
+              placeholder="请输入金额"
+            >
+              <template slot="append">元</template>
+            </el-input>
+            最高
+          </el-form-item>
+          <el-form-item
+            prop="190"
+            :rules="[
+              {
+                required: false,
+                pattern: /^[1-9][0-9]*$/,
+                message: '请输入正确的账号数量',
+              },
+            ]"
+          >
+            <el-input
+              v-model="form['190']"
+              placeholder="请输入金额"
+            >
+              <template slot="append">元</template>
+            </el-input>
+          </el-form-item>
+        </el-row>
+        <el-row>
+          <el-form-item
+            prop="190"
+            :rules="[
+              {
+                required: false,
+                pattern: /^[1-9][0-9]*$/,
+                message: '请输入正确的账号数量',
+              },
+            ]"
+          >
+            年度团练宝机构定价范围最低:
+            <el-input
+              v-model="form['190']"
+              placeholder="请输入金额"
+            >
+              <template slot="append">元</template>
+            </el-input>
+            最高
+          </el-form-item>
+          <el-form-item
+            prop="190"
+            :rules="[
+              {
+                required: false,
+                pattern: /^[1-9][0-9]*$/,
+                message: '请输入正确的账号数量',
+              },
+            ]"
+          >
+            <el-input
+              v-model="form['190']"
+              placeholder="请输入金额"
+            >
+              <template slot="append">元</template>
+            </el-input>
+          </el-form-item>
+        </el-row>
+      </el-form>
+    </div>
+    <el-button  type="primary" @click="save" class="saveBtn"
+     v-permission="'sysConfig/batchUpdate_loginRules'"
+      >保存</el-button
+    >
+  </div>
+</template>
+<script>
+import { sysConfigList, sysConfigUpdate } from "@/api/generalSettings"; // 平台的修改和查
+export default {
+  data() {
+    return {
+      form: {},
+      questionList: [],
+      rulesVisiable: false,
+    };
+  },
+  async mounted() {
+    this.getRules();
+  },
+  methods: {
+    async getRules() {
+      try {
+        const res = await sysConfigList({ group: "LOGIN" });
+        res.data.forEach((item) => {
+          // this.form[item.paramName] = item.paranValue
+          this.$set(this.form, item.id, item.paranValue);
+        });
+        // this.$forceUpdate()
+        console.log(this.form);
+      } catch (e) {
+        console.log(e);
+      }
+    },
+    async save() {
+      this.$refs.form.validate(async (valid) => {
+        if (valid) {
+          let param = [];
+          for (let i in this.form) {
+            param.push({
+              id: i,
+              paranValue: this.form[i],
+            });
+          }
+          try {
+            const res = await sysConfigUpdate(param);
+            this.$message.success("保存成功");
+            this.getRules();
+          } catch (e) {
+            console.log(e);
+          }
+        }
+      });
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+@import "~@scss/views/courseRulersManager/index.scss";
+</style>

+ 1 - 1
src/views/categroyManager/generalSettings/overallManager.vue

@@ -5,7 +5,7 @@
       <el-form :inline="true" :model="form" ref="form">
         <el-alert
           style="margin: 10px 0"
-          title="账号登录设置"
+          title="平台参数设置"
           :closable="false"
           type="info"
         >

+ 12 - 1
src/views/categroyManager/globalConfig.vue

@@ -20,6 +20,14 @@
           <loginRules v-if="activeIndex == 6" />
         </el-tab-pane>
         <el-tab-pane
+          label="团练宝定价"
+          lazy
+          name="3"
+          v-if="permissionList.groupMarkPrice"
+        >
+          <groupMarkPrice v-if="activeIndex == 3" />
+        </el-tab-pane>
+        <el-tab-pane
           label="平台参数"
           lazy
           name="2"
@@ -67,6 +75,7 @@
 // import errorManager from "./generalSettings/errorManager";
 import loginRules from "@/views/courseRulersManager/components/loginRules";
 import overallManager from "./generalSettings/overallManager";
+import groupMarkPrice from "./generalSettings/groupMarkPrice";
 import overallManagerTwo from "./generalSettings/overallManagerTwo";
 import holidaySetting from "./generalSettings/holidaySetting";
 import earlyWarning from "./generalSettings/earlyWarning";
@@ -77,6 +86,7 @@ export default {
     overallManagerTwo,
     holidaySetting,
     loginRules,
+    groupMarkPrice,
     // musicalManager,
     // musicalManagerOut,
     // typesManager,
@@ -95,7 +105,8 @@ export default {
       permissionList: {
         overallManager: permission("/globalConfig/overallManager"),
         overallManagerTwo: permission("/globalConfig/overallManagerTwo"),
-        loginRules: permission("/globalConfig/loginRules")
+        loginRules: permission("/globalConfig/loginRules"),
+        groupMarkPrice: permission("/globalConfig/groupMarkPrice"),
       },
     };
   },

+ 1 - 1
src/views/login/index.vue

@@ -179,7 +179,7 @@ export default {
 /* 修复input 背景不协调 和光标变色 */
 /* Detail see https://github.com/PanJiaChen/vue-element-admin/pull/927 */
 .loginBtn {
-  background-color: rgb(19, 129, 122);
+  background-color: #00A79D;
   text-align: center;
   width: 100%;
   height: 51px;

+ 1 - 1
src/views/organManager/components/memberSetting.vue

@@ -18,7 +18,7 @@
             type="number"
             style="width: 238px;"
           >
-            <div slot="append">元/</div>
+            <div slot="append">元/</div>
           </el-input>
         </el-form-item>
         <el-form-item label="月度会员激活价" prop="month_divide"

+ 47 - 62
src/views/organManager/components/organInfo.vue

@@ -34,21 +34,20 @@
               v-model="form.theme"
               :disabled="isDisabled"
               placeholder="请选择主题"
+              @change="themeChange"
             >
-              <el-option label="大雅绿" value="green"></el-option>
+              <el-option v-for="item in themeList" :key="item.color" :label="item.name" :value="item.value"></el-option>
             </el-select>
           </el-form-item>
-          <el-form-item label="主题色" v-if="tenantInfo == 'SETTING'" prop="themeColor" :rules="[{ required: true, message: '请选择主题色', trigger: 'change' }]">
+          <!-- <el-form-item label="主题色" v-if="tenantInfo == 'SETTING'" prop="themeColor" :rules="[{ required: true, message: '请选择主题色', trigger: 'change' }]">
             <div style="width: 300px !important">
-              <!-- <el-color-picker :disabled="isDisabled" v-model="form.themeColor"></el-color-picker> -->
-              <!-- <theme-picker  /> -->
               <div class="themeColor">
                 <el-tooltip v-for="item in themeList" :key="item.color" effect="dark" :content="item.name" placement="top">
                     <div class="themeColor-block" @click="onSelectTheme(item)" :style="item.style"><i class="el-icon-check" v-show="item.selected"></i></div>
                 </el-tooltip>
               </div>
             </div>
-          </el-form-item>
+          </el-form-item> -->
         </el-col>
         <el-form-item label="公司全称" prop="tsignName"
           :rules="[{ required: true, message: '请输入公司全称', trigger: 'blur' }]">
@@ -85,7 +84,7 @@
               ></el-option>
             </el-select>
           </el-form-item>
-          <el-form-item prop="city" :rules="[{ required: true, message: '请选择市', trigger: 'change' }]">
+          <el-form-item prop="city" :rules="[{ required: true, message: '请选择市', trigger: 'change' }]" style="margin-right: 0;">
             <el-select
               v-model.trim="form.city"
               filterable
@@ -188,45 +187,21 @@ export default {
         Authorization: getToken(),
       },
       themeList: [{
-        selected: true,
-        name: '大雅绿(默认)',
-        color: '#14928a',
-        style: 'background-color: #14928a'
-      }, {
-        selected: false,
-        name: '拂晓蓝',
-        color: '#1890ff',
-        style: 'background-color: #1890ff'
-      }, {
-        selected: false,
-        name: '薄暮',
-        color: '#f5222d',
-        style: 'background-color: #f5222d'
+        name: "亚丁绿",
+        value: "adenGreen",
+        color: "#00A79D"
       }, {
-        selected: false,
-        name: '火山',
-        color: '#fa541c',
-        style: 'background-color: #fa541c'
+        name: "暮云灰",
+        value: "cloudAshes",
+        color: "#444D5C"
       }, {
-        selected: false,
-        name: '日暮',
-        color: '#faad14',
-        style: 'background-color: #faad14'
+        name: "柏林蓝",
+        value: "berlinBlue",
+        color: "#2B78CC"
       }, {
-        selected: false,
-        name: '明青',
-        color: '#13c2c2',
-        style: 'background-color: #13c2c2'
-      }, {
-        selected: false,
-        name: '极客蓝',
-        color: '#2f54eb',
-        style: 'background-color: #2f54eb'
-      }, {
-        selected: false,
-        name: '酱紫',
-        color: '#722ed1',
-        style: 'background-color: #722ed1'
+        name: "火山红",
+        value: "volcanicRed",
+        color: "#BC3030"
       }],
       form: {
         tsignName: null,
@@ -241,8 +216,8 @@ export default {
         address: null,
         customerServicePhone: null,
         remark: null,
-        theme: 'green',
-        themeColor: '#14928a'
+        theme: 'adenGreen',
+        themeColor: '#00A79D'
       },
       payState: null,
       imageWidthM: 72,
@@ -258,13 +233,13 @@ export default {
       this.payState = this.data.payState
     }
     // 选中默认颜色
-    this.themeList.forEach(theme => {
-      if(theme.color == this.form.themeColor) {
-        theme.selected = true
-      } else {
-        theme.selected = false
-      }
-    })
+    // this.themeList.forEach(theme => {
+    //   if(theme.color == this.form.themeColor) {
+    //     theme.selected = true
+    //   } else {
+    //     theme.selected = false
+    //   }
+    // })
     // 判断是否有城市编号
     if(this.form.areaId) {
       await getParentArea({ id: this.form.areaId }).then(async (res) => {
@@ -294,13 +269,21 @@ export default {
     }
   },
   methods: {
-    onSelectTheme(item) {
+    themeChange(val) {
+      // 切换主题时设置跟主题对应的主题色
       this.themeList.forEach(theme => {
-        theme.selected = false
-      })
-      item.selected = true
-      this.form.themeColor = item.color
+        if(theme.value == val) {
+          this.form.themeColor = theme.color
+        }
+      });
     },
+    // onSelectTheme(item) {
+    //   this.themeList.forEach(theme => {
+    //     theme.selected = false
+    //   })
+    //   item.selected = true
+    //   this.form.themeColor = item.color
+    // },
     onSubmit() {
       let state = false
       this.$refs.form.validate(_ => {
@@ -348,6 +331,14 @@ export default {
       };
       const isImage = imageType[file.type];
       const isLt2M = file.size / 1024 / 1024 < 2;
+      if (!isImage) {
+        this.$message.error("只能上传图片格式!");
+        return false
+      }
+      if (!isLt2M) {
+        this.$message.error("上传头像图片大小不能超过 2MB!");
+        return false
+      }
       const imageWidth = this.imageWidthM;
       const imageHeigh = this.imageHeightM;
       const _URL = window.URL || window.webkitURL;
@@ -381,12 +372,6 @@ export default {
           return Promise.reject();
         }
       );
-      if (!isImage) {
-        this.$message.error("只能上传图片格式!");
-      }
-      if (!isLt2M) {
-        this.$message.error("上传头像图片大小不能超过 2MB!");
-      }
       return isImage && isLt2M && isSize;
     },
   },

+ 7 - 0
src/views/resetTeaming/api.js

@@ -107,4 +107,11 @@ export const getAllmemberRank = (data) => request2({
   params: data
 })
 
+// 查询未激活团练宝用户
+export const queryInactive = (data) => request2({
+  url: '/api-web//cloudTeacherOrder/queryInactive',
+  method: 'post',
+  data
+})
+
 

+ 44 - 20
src/views/resetTeaming/components/giveMemberList.vue

@@ -33,7 +33,7 @@
     <!-- <div class="newBand"
          @click="resetPays"
          v-permission="'musicGroupStudentFee/batchUpdateCourseFee'">修改缴费金额</div> -->
-    <el-button @click="addMember" type="primary">激活会员</el-button>
+    <el-button @click="addMember" type="primary" style="margin-bottom: 20px">激活会员</el-button>
 
     <div class="tableWrap">
       <el-table
@@ -41,28 +41,17 @@
         :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
         :data="tableList"
         ref="multipleTable"
-        max-height="300"
         @selection-change="handleSelectionChange"
       >
         <el-table-column type="selection" width="55"> </el-table-column>
         <el-table-column
           align="center"
-          prop="userId"
+          prop="studentId"
           label="学员编号"
         ></el-table-column>
         <el-table-column align="center" prop="name" label="学员姓名">
-          <!-- <template slot-scope="scope">
-            <div v-if="scope.row.sysUser">
-              {{scope.row.sysUser.username}}
-            </div>
-          </template> -->
         </el-table-column>
-        <el-table-column align="center" prop="studentId" label="联系电话">
-          <template slot-scope="scope">
-            <div v-if="scope.row.sysUser">
-              {{ scope.row.sysUser.phone }}
-            </div>
-          </template>
+        <el-table-column align="center" prop="phone" label="联系电话">
         </el-table-column>
         <el-table-column
           align="center"
@@ -71,19 +60,26 @@
         ></el-table-column>
         <el-table-column
           align="center"
-          prop="courseFee"
+          prop="type"
           label="团练宝类型"
-        ></el-table-column>
+        >
+          <template slot-scope="scope">
+            {{ scope.row.type | cloudGroupActive }}
+          </template>
+        </el-table-column>
         <el-table-column
           align="center"
-          prop="courseFee"
+          prop="time"
           label="数量"
         ></el-table-column>
         <el-table-column
           align="center"
-          prop="courseFee"
           label="缴费金额(元)"
-        ></el-table-column>
+        >
+          <template slot-scope="scope">
+            {{ scope.row.amount | hasMoneyFormat }}
+          </template>
+        </el-table-column>
         <!-- <el-table-column align="center"
                          label="操作">
           <template slot-scope="scope">
@@ -108,10 +104,14 @@
 </template>
 <script>
 import pagination from "@/components/Pagination/index";
+import { findSound } from '@/api/buildTeam'
+import { queryInactive } from '../api'
 export default {
   components: { pagination },
   data() {
+    let musicGroupId = this.$route.query.id;
     return {
+      musicGroupId,
       searchForm: {
         search: "",
         subjectId: "",
@@ -127,8 +127,32 @@ export default {
       },
     };
   },
-  mounted() {},
+  mounted() {
+    this.__init()
+    this.getList()
+  },
   methods: {
+    async __init() {
+      try {
+        let res = await findSound({ musicGroupId: this.musicGroupId })
+        if (res.code == 200) {
+          this.soundList = res.data;
+        }
+      } catch(e) {}
+    },
+    async getList() {
+      try {
+        const res = await queryInactive({
+          ...this.searchForm,
+          page: this.rules.page,
+          rows: this.rules.limit,
+        });
+        console.log(res)
+        this.rules.total = res.data.total;
+        this.tableList = res.data.rows;
+      } catch (e) { }
+      queryInactive
+    },
     handleSelectionChange(val) {},
     search() {},
     onReSet() {},

+ 11 - 0
src/views/setSilder/addSilder.vue

@@ -155,6 +155,12 @@
                       :value="1"></el-option>
           </el-select>
         </el-form-item>
+        <el-form-item label="ICON名称"
+                      prop="icon"
+                      :label-width="formLabelWidth">
+          <el-input v-model.trim="form.icon"
+                    autocomplete="off"></el-input>
+        </el-form-item>
         <el-form-item label="排序"
                       :label-width="formLabelWidth">
           <el-input v-model.trim="form.sort"
@@ -194,6 +200,7 @@ export default {
         component: null,
         hid: 0,
         type: 0,
+        icon: null, // 图标名称
         parentPermission: null,
         keepAlive: 1
       },
@@ -255,6 +262,7 @@ export default {
           component: row.component,
           id: row.id,
           hid: row.hid,
+          icon: row.icon,
           type: Number(row.type),
           parentPermission: row.parentPermission,
           keepAlive: Number(row.keepAlive),
@@ -277,6 +285,7 @@ export default {
               sort: form.sort,
               parentId: form.parentId.pop(),
               hid: form.hid,
+              icon: form.icon,
               type: form.type,
               parentPermission: form.parentPermission,
               keepAlive: form.keepAlive,
@@ -334,6 +343,7 @@ export default {
           component: res.component,
           sort: res.sort,
           hid: res.hid,
+          icon: res.icon,
           type: res.type,
           keepAlive: res.keepAlive,
           parentPermission: res.parentPermission,
@@ -365,6 +375,7 @@ export default {
         component: null,
         hid: 0,
         type: 0,
+        icon: null,
         parentPermission: null,
         keepAlive: 1
       }

+ 4 - 4
src/views/teamBuild/components/teamBaseInfo.vue

@@ -1546,16 +1546,16 @@ input[disabled] {
   color: #606266;
 }
 /deep/.el-radio-button__orig-radio:checked + .el-radio-button__inner {
-  background-color: rgb(19, 129, 122);
-  border-color: rgb(19, 129, 122);
+  background-color: #00A79D;
+  border-color: #00A79D;
   // -webkit-box-shadow: -1px 0 0 0 rgb (19, 129, 122);
-  box-shadow: -1px 0 0 rgb(19, 129, 122);
+  box-shadow: -1px 0 0 #00A79D;
   color: #fff;
   outline: none;
 }
 /deep/.el-radio-button__inner {
   &:hover {
-    color: rgb(19, 129, 122);
+    color: #00A79D;
   }
   outline: none;
 }

+ 8 - 0
src/views/teamDetail/api.js

@@ -30,3 +30,11 @@ export const updateMemberExperience = data => request2({
   method: 'post',
   requestType: 'form'
 })
+
+
+// 添加会员
+export const cloudAddStudents = data => request2({
+  url: '/api-web/cloudTeacherOrder/addStudents',
+  data,
+  method: 'post'
+})

+ 91 - 0
src/views/teamDetail/components/modals/createMember.vue

@@ -0,0 +1,91 @@
+<template>
+  <div>
+    <!-- <p class="title">已选择{{ multipleSelection.length }}名学员</p> -->
+    <el-form :model="memberForm" label-width="120px" ref="memberForm">
+      <el-form-item
+        label="赠送会员类型"
+        prop="addType"
+        :rules="[
+          { required: true, message: '请选择赠送会员类型', trigger: 'blur' },
+        ]"
+      >
+        <el-select
+          placeholder="赠送会员类型"
+          clearable
+          v-model.trim="memberForm.addType"
+          style="width: 100% !important"
+        >
+          <el-option label="月度" :value="2"></el-option>
+          <el-option label="季度" :value="3"></el-option>
+          <el-option label="半年" :value="4"></el-option>
+          <el-option label="年度" :value="5"></el-option>
+          <el-option label="固定天数" :value="1"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item
+        label="赠送数量"
+        prop="times"
+        :rules="[
+          { required: true, message: '请输入赠送数量', trigger: 'blur' },
+        ]"
+      >
+        <el-input
+          type="number"
+          onKeypress="return (/[\d]/.test(String.fromCharCode(event.keyCode)))"
+          v-model="memberForm.times"
+          placeholder="请输入赠送数量"
+        >
+        </el-input>
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+<script>
+import { cloudAddStudents } from "../../api";
+export default {
+  props: ["multipleSelection"],
+  data() {
+    return {
+      memberForm: {
+        times: null,
+        addType: null,
+      },
+      studentIds: [],
+    };
+  },
+  mounted() {
+    this.studentIds = this.multipleSelection
+      .map((stu) => {
+        return stu.userId;
+      });
+  },
+  methods: {
+    submit() {
+      this.$refs.memberForm.validate(async (res) => {
+        if (res) {
+          try {
+            const { times, addType } = this.memberForm
+            await cloudAddStudents({
+              times: Number(times),
+              addType,
+              studentIds: this.studentIds,
+            });
+            this.$message.success('添加会员成功')
+            this.$emit("close");
+            this.$emit("submited");
+          } catch (e) {
+            console.log(e);
+          }
+        }
+      });
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+.title {
+  margin-bottom: 30px;
+  font-size: 16px;
+  color: #000;
+}
+</style>

+ 53 - 17
src/views/teamDetail/components/studentList.vue

@@ -1,21 +1,27 @@
 <template>
   <div class="stu-container">
     <div class="studentListWrap">
-      <div
+      <!-- <div
         v-if="team_status == 'PROGRESS'"
         class="newBand"
         v-permission="'studentRegistration/insertStudent'"
         @click="createStudentFrom"
       >
         新增学员
-      </div>
-      <div
+      </div> -->
+      <!-- <div
         class="newBand"
         v-permission="'studentManage/updateMemberExperience'"
         @click="addTryTime"
       >
         增加会员试用期
-      </div>
+      </div> -->
+      <el-button  style="margin-bottom: 20px;" type="primary"
+        v-if="team_status == 'PROGRESS'"
+        v-permission="'studentRegistration/insertStudent'"
+        @click="createStudentFrom" icon="el-icon-plus">新增学员</el-button>
+      <el-button  style="margin-bottom: 20px;" type="primary"
+        @click="addStudentMember" icon="el-icon-plus">添加会员</el-button>
     </div>
 
     <!-- 搜索类型 -->
@@ -932,7 +938,7 @@
         >
       </div>
     </el-dialog>
-    <el-dialog
+    <!-- <el-dialog
       title="新增会员试用期"
       width="600px"
       :visible.sync="addTryVisible"
@@ -949,6 +955,23 @@
         <el-button @click="addTryVisible = false">取 消</el-button>
         <el-button type="primary" @click="submitAddTryTime">确 定</el-button>
       </div>
+    </el-dialog> -->
+    <el-dialog
+      title="添加会员"
+      width="500px"
+      :visible.sync="memberVisible"
+    >
+      <createMember
+        ref="addMember"
+        v-if="memberVisible"
+        :multipleSelection="multipleSelection"
+        @close="memberVisible = false"
+        @submited="getList"
+      />
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="memberVisible = false">取 消</el-button>
+        <el-button type="primary" @click="submitAddMember">确 定</el-button>
+      </div>
     </el-dialog>
   </div>
 </template>
@@ -996,6 +1019,7 @@ import visit from "@/views/withdrawal-application/modals/visit";
 import mergeMusic from "@/views/teamBuild/components/merge-music";
 import quiteTeam from "@/views/teamDetail/components/modals/quite-team";
 import addTryList from "@/views/teamDetail/components/modals/addTryList";
+import createMember from "@/views/teamDetail/components/modals/createMember";
 export default {
   name: "tstudentList",
   data() {
@@ -1184,8 +1208,9 @@ export default {
       multipleSelection: [],
       isCanReg: false,
       organId: "",
-      addTryVisible: false,
-      memberRankList: [],
+      memberVisible: false,
+      // addTryVisible: false,
+      // memberRankList: [],
       isManage: false,
       gradeListObj: {},
     };
@@ -1203,6 +1228,7 @@ export default {
     mergeMusic,
     quiteTeam,
     addTryList,
+    createMember
   },
   created() {},
   filters: {
@@ -1238,12 +1264,12 @@ export default {
       });
       this.organizationCourseUnitPriceSettings = res.data.rows;
     } catch (error) {}
-    try {
-      const res = await getAllmemberRank({ isDefault: 0 });
-      this.memberRankList = res.data;
-    } catch (e) {
-      console.log(e);
-    }
+    // try {
+    //   const res = await getAllmemberRank({ isDefault: 0 });
+    //   this.memberRankList = res.data;
+    // } catch (e) {
+    //   console.log(e);
+    // }
     this.init();
   },
   methods: {
@@ -1958,16 +1984,26 @@ export default {
         params: { search: search },
       });
     },
-    addTryTime() {
+    addStudentMember() {
       if (this.multipleSelection.length > 0) {
-        this.addTryVisible = true;
+        this.memberVisible = true;
       } else {
         this.$message.error("请至少选择一名学员");
       }
     },
-    submitAddTryTime() {
-      this.$refs.addTry.submit();
+    submitAddMember() {
+      this.$refs.addMember.submit();
     },
+    // addTryTime() {
+    //   if (this.multipleSelection.length > 0) {
+    //     this.addTryVisible = true;
+    //   } else {
+    //     this.$message.error("请至少选择一名学员");
+    //   }
+    // },
+    // submitAddTryTime() {
+    //   this.$refs.addTry.submit();
+    // },
   },
   watch: {
     createUserPayVisible(val) {

+ 6 - 0
src/views/tenantSetting/api.js

@@ -5,3 +5,9 @@ export const tenantOrderRecordQueryPage = (data) => request2({
   method: 'post',
   data,
 })
+
+export const cloudTeacherOrderQueryActive = (data) => request2({
+  url: '/api-web/cloudTeacherOrder/queryActive',
+  method: 'post',
+  data,
+})

+ 277 - 0
src/views/tenantSetting/chargingRecord.vue

@@ -0,0 +1,277 @@
+<template>
+  <div class="m-container">
+    <h2>
+      <div class="squrt"></div>
+      扣费记录
+    </h2>
+    <save-form
+      :inline="true"
+      class="searchForm"
+      ref="searchForm"
+      @submit="search"
+      @reset="reset"
+      :saveKey="'tenantTradeManager'"
+      :model.sync="searchForm"
+    >
+      <el-form-item prop="transNo">
+        <el-input
+          placeholder="课程名/编号"
+          clearable
+          type="text"
+          v-model.trim="searchForm.transNo"
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="orgin">
+        <el-select
+          class="multiple"
+          v-model.trim="searchForm.orgin"
+          filterable
+          multiple
+          collapse-tags
+          clearable
+          placeholder="请选择分部"
+          @change="onBranchChange"
+        >
+          <el-option
+            v-for="(item, index) in organList"
+            :key="index"
+            :label="item.name"
+            :value="item.id"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+
+      <el-form-item prop="orderType">
+        <el-select
+          v-model.trim="searchForm.orderType"
+          clearable
+          filterable
+          @clear="onClear('orderType')"
+          placeholder="课程类型"
+        >
+          <el-option
+            v-for="(item, index) in tenantStatus"
+            :key="index"
+            :label="item.label"
+            :value="item.value"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="orderType">
+        <el-select
+          v-model.trim="searchForm.orderType"
+          clearable
+          filterable
+          @clear="onClear('orderType')"
+          placeholder="老师"
+        >
+          <el-option
+            v-for="(item, index) in tenantStatus"
+            :key="index"
+            :label="item.label"
+            :value="item.value"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+
+      <el-form-item prop="orderType">
+        <el-select
+          v-model.trim="searchForm.orderType"
+          clearable
+          filterable
+          @clear="onClear('orderType')"
+          placeholder="课程状态"
+        >
+          <el-option
+            v-for="(item, index) in tenantStatus"
+            :key="index"
+            :label="item.label"
+            :value="item.value"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="orderState">
+        <el-select
+          v-model.trim="searchForm.orderState"
+          clearable
+          filterable
+          @clear="onClear('orderState')"
+          placeholder="扣费状态"
+        >
+          <el-option label="待支付" :value="0"></el-option>
+          <el-option label="已支付" :value="1"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="createTimer">
+        <el-date-picker
+          v-model.trim="searchForm.createTimer"
+          type="daterange"
+          value-format="yyyy-MM-dd"
+          range-separator="至"
+          start-placeholder="课程开始时间"
+          end-placeholder="课程结束时间"
+          :picker-options="{ firstDayOfWeek: 1 }"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button native-type="submit" type="danger">搜索</el-button>
+        <el-button native-type="reset" type="primary">重置</el-button>
+      </el-form-item>
+    </save-form>
+    <div style="font-size: 14px; padding-bottom: 10px">
+      扣费总额:<span style="color: var(--color-primary)">1,000元</span>
+      <i style="width: 10px; display: inline-block"></i>
+      冻结金额:<span style="color: var(--color-primary)">1,000元</span>
+    </div>
+    <!-- 列表 -->
+    <div class="tableWrap">
+      <el-table
+        :data="tableList"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+      >
+        <el-table-column align="center" label="课程编号" prop="transNo">
+        </el-table-column>
+        <el-table-column align="center" label="所属分部" prop="orderNo">
+        </el-table-column>
+        <el-table-column align="center" label="课程类型" prop="createdTime">
+        </el-table-column>
+        <el-table-column align="center" label="姓名" prop="tenantId">
+        </el-table-column>
+        <el-table-column align="center" label="老师" prop="tenantName">
+        </el-table-column>
+        <el-table-column align="center" label="课程人数">
+          <template slot-scope="scope">
+            {{ scope.row.orderType | tenantStatus }}
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="课程时间">
+          <template slot-scope="scope">
+            {{ scope.row.expectAmount | moneyFormat }}
+          </template>
+        </el-table-column>
+        <!-- <el-table-column align="center" label="网络教室剩余时长" prop="productName">
+        </el-table-column> -->
+        <el-table-column align="center" label="课程状态">
+          <template slot-scope="scope">
+            {{ scope.row.actualAmount | moneyFormat }}
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="扣费状态">
+          <template slot-scope="scope">
+            {{ scope.row.orderState | tenantOrderStatus }}
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="冻结金额(元)">
+          <template slot-scope="scope">
+            {{ scope.row.orderState | tenantOrderStatus }}
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        :saveKey="'tenantTradeManager'"
+        sync
+        :total.sync="pageInfo.total"
+        :page.sync="pageInfo.page"
+        :limit.sync="pageInfo.limit"
+        :page-sizes="pageInfo.page_size"
+        @pagination="getList"
+      />
+    </div>
+
+    <el-dialog title="订单详情" :visible.sync="orderVisible" width="1200px">
+      <order-info />
+    </el-dialog>
+  </div>
+</template>
+<script>
+import pagination from "@/components/Pagination/index";
+import { tenantInfoQueryPage } from "../organManager/api";
+import { tenantOrderRecordQueryPage } from "./api";
+import { tenantStatus, dealStatus } from "@/utils/searchArray";
+import OrderInfo from './model/orderInfo'
+import { getTimes } from "@/utils";
+const initSearch = {
+  transNo: null,
+  orderNo: null,
+  tenantId: [],
+  orderType: null,
+  orderState: null,
+  createTimer: [],
+};
+export default {
+  components: { pagination, OrderInfo },
+  data() {
+    const baseTenantId = sessionStorage.getItem('baseTenantId')
+    return {
+      baseTenantId,
+      tenantStatus,
+      dealStatus,
+      tableList: [],
+      orderVisible: false,
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
+      searchForm: { ...initSearch },
+      tenantList: []
+    };
+  },
+  async mounted() {
+    await this.getTenant()
+    this.getList();
+  },
+  methods: {
+    async getTenant() {
+      try {
+        const res = await tenantInfoQueryPage({ page: 1, rows: 999 }, )
+        this.tenantList = res.data?.rows || []
+      } catch(e) {}
+    },
+    async getList() {
+      try {
+        let { createTimer, tenantId, ...reset } = this.searchForm;
+        const res = await tenantOrderRecordQueryPage({
+          ...reset,
+          tenantId: tenantId.join(','),
+          ...getTimes(createTimer, ["startDate", "endDate"], "YYYY-MM-DD"),
+          page: this.pageInfo.page,
+          rows: this.pageInfo.limit,
+        });
+        this.pageInfo.total = res.total;
+        this.tableList = res.rows;
+      } catch (e) {}
+    },
+    search() {
+      this.pageInfo.page = 1;
+      this.$refs.searchForm.save(this.searchForm);
+      this.$refs.searchForm.save(this.pageInfo, "page");
+      this.getList();
+    },
+    reset() {
+      this.searchForm = { ...initSearch };
+      this.search();
+    },
+    openService(row) {
+      this.orderVisible = true
+    },
+  },
+  filters: {
+    tenantOrderStatus(val) {
+      const template = {
+        0: "待支付",
+        1: "已支付",
+        2: "支付失败"
+      }
+      return template[val]
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.courseMask .el-dialog__body {
+  padding-bottom: 0;
+}
+</style>

+ 177 - 0
src/views/tenantSetting/groupRecordManager.vue

@@ -0,0 +1,177 @@
+<template>
+  <div class="m-container">
+    <h2>
+      <div class="squrt"></div>
+      团练宝激活记录
+    </h2>
+    <save-form
+      :inline="true"
+      class="searchForm"
+      ref="searchForm"
+      @submit="search"
+      @reset="reset"
+      :saveKey="'tenantTradeManager'"
+      :model.sync="searchForm"
+    >
+      <el-form-item prop="queryCondition">
+        <el-input
+          placeholder="学员编号/姓名/手机号"
+          clearable
+          type="text"
+          v-model.trim="searchForm.queryCondition"
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="order">
+        <el-input
+          placeholder="订单号"
+          clearable
+          type="text"
+          v-model.trim="searchForm.order"
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="createTimer">
+        <el-date-picker
+          v-model.trim="searchForm.createTimer"
+          type="daterange"
+          value-format="yyyy-MM-dd"
+          range-separator="至"
+          start-placeholder="订单开始时间"
+          end-placeholder="订单结束时间"
+          :picker-options="{ firstDayOfWeek: 1 }"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button native-type="submit" type="danger">搜索</el-button>
+        <el-button native-type="reset" type="primary">重置</el-button>
+      </el-form-item>
+    </save-form>
+    <!-- 列表 -->
+    <div class="tableWrap">
+      <el-table
+        :data="tableList"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+      >
+        <el-table-column align="center" label="交易流水号" prop="transNo">
+        </el-table-column>
+        <el-table-column align="center" label="订单号" prop="orderNo">
+        </el-table-column>
+        <el-table-column align="center" label="订单时间" prop="createdTime">
+        </el-table-column>
+        <el-table-column align="center" label="学员编号" prop="studentId">
+        </el-table-column>
+        <el-table-column align="center" label="学员名称" prop="name">
+        </el-table-column>
+        <el-table-column align="center" label="手机号码" prop="phone">
+        </el-table-column>
+        <el-table-column align="center" label="交易类型">
+          <template slot-scope="scope">
+            {{ scope.row.orderType | tenantStatus }}
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="团练宝类型">
+          <template slot-scope="scope">
+            {{ scope.row.expectAmount | moneyFormat }}
+          </template>
+        </el-table-column>
+        <!-- <el-table-column align="center" label="网络教室剩余时长" prop="productName">
+        </el-table-column> -->
+        <el-table-column align="center" label="数量">
+          <template slot-scope="scope">
+            {{ scope.row.time }}
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="激活费用(元)">
+          <template slot-scope="scope">
+            {{ scope.row.amount | moneyFormat }}
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        :saveKey="'tenantTradeManager'"
+        sync
+        :total.sync="pageInfo.total"
+        :page.sync="pageInfo.page"
+        :limit.sync="pageInfo.limit"
+        :page-sizes="pageInfo.page_size"
+        @pagination="getList"
+      />
+    </div>
+
+  </div>
+</template>
+<script>
+import pagination from "@/components/Pagination/index";
+import { cloudTeacherOrderQueryActive } from "./api";
+import { tenantStatus, dealStatus } from "@/utils/searchArray";
+import { getTimes } from "@/utils";
+const initSearch = {
+  queryCondition: null,
+  order: null,
+  createTimer: [],
+};
+export default {
+  components: { pagination },
+  data() {
+    return {
+      tenantStatus,
+      dealStatus,
+      tableList: [],
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
+      searchForm: { ...initSearch }
+    };
+  },
+  async mounted() {
+    this.getList();
+  },
+  methods: {
+    async getList() {
+      try {
+        let { createTimer, ...reset } = this.searchForm;
+        const res = await cloudTeacherOrderQueryActive({
+          ...reset,
+          ...getTimes(createTimer, ["startDate", "endDate"], "YYYY-MM-DD"),
+          page: this.pageInfo.page,
+          rows: this.pageInfo.limit,
+        });
+        console.log(res)
+        this.pageInfo.total = res.data.total;
+        this.tableList = res.data.rows;
+      } catch (e) {}
+    },
+    search() {
+      this.pageInfo.page = 1;
+      this.$refs.searchForm.save(this.searchForm);
+      this.$refs.searchForm.save(this.pageInfo, "page");
+      this.getList();
+    },
+    reset() {
+      this.searchForm = { ...initSearch };
+      this.search();
+    },
+    openService(row) {
+      this.orderVisible = true
+    },
+  },
+  filters: {
+    tenantOrderStatus(val) {
+      const template = {
+        0: "待支付",
+        1: "已支付",
+        2: "支付失败"
+      }
+      return template[val]
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.courseMask .el-dialog__body {
+  padding-bottom: 0;
+}
+</style>

+ 10 - 2
src/views/tenantSetting/tenantInfo.vue

@@ -10,6 +10,7 @@
         <organInfo ref="organInfo" :data="info" type="update" tenantInfo="SETTING" />
 
         <div style="display: flex;width: 100%;">
+          <i class="icon_admin_home"></i>
           <el-button type="primary"  @click="onNext">确认</el-button>
         </div>
     </div>
@@ -39,7 +40,7 @@ export default {
       try {
         let tenantConfig = sessionStorage.getItem('tenantConfig')
         tenantConfig = tenantConfig ? JSON.parse(tenantConfig) : {}
-        console.log(tenantConfig)
+        console.log(tenantConfig, tenantConfig.tenantId)
         const res = await tenantInfoInfo({ id: tenantConfig.tenantId })
         this.status = true
         const { config, productInfo, ...other } = res.data
@@ -64,7 +65,14 @@ export default {
       try {
           const res = await tenantInfoUpdate(params)
           this.$message.success('修改更新成功')
-          setTheme(themeColor)
+          // 机构购买不能修改主题
+          let baseTenantId = sessionStorage.getItem('baseTenantId')
+          if(baseTenantId > 0) {
+            setTheme({
+              theme,
+              themeColor
+            })
+          }
         } catch(e) {}
     }
   },

+ 1 - 0
src/views/tenantSetting/tenantTradeManager.vue

@@ -68,6 +68,7 @@
         >
           <el-option label="待支付" :value="0"></el-option>
           <el-option label="已支付" :value="1"></el-option>
+          <el-option label="支付失败" :value="2"></el-option>
         </el-select>
       </el-form-item>
       <el-form-item prop="createTimer">

+ 1 - 2
vue.config.js

@@ -16,14 +16,13 @@ const name = defaultSettings.title || '管乐迷后台管理系统' // page titl
 // http://47.99.212.176:8000
 // //  https://online.dayaedu.com
 // let target = 'https://online.dayaedu.com' //线上
-
 // let target = 'http://192.168.3.227:8000' // 何国威
 let target = 'http://192.168.3.250:8000' //邹璇
 // let target = 'http://192.168.3.112:8000' //勇哥
 
 // let target = 'http://192.168.3.139:8000' // 箭河
 // let target = 'http://192.168.3.124:8000' //邹璇
-let target = 'http://192.168.3.119:8000' //勇哥
+// let target = 'http://192.168.3.119:8000' //勇哥
 // let target = 'http://dev.dayaedu.com' // 开发环境
 // let target = 'https://test.dayaedu.com' //测试环境
 // let target = 'http://192.168.3.134:8000' // 乔