Ver Fonte

merge:six

Tang há 3 anos atrás
pai
commit
61c86f573e
100 ficheiros alterados com 8797 adições e 3592 exclusões
  1. 5 4
      .env.development
  2. 4 3
      .env.production
  3. 5 4
      .env.staging
  4. 6 3
      package.json
  5. BIN
      public/favicon.ico
  6. 31 21
      public/index.html
  7. 22 0
      src/api/api.js
  8. BIN
      src/assets/404_images/wuyuxaog.png
  9. BIN
      src/assets/images/logo@2xS.png
  10. BIN
      src/assets/images/logo@2xSYT.png
  11. BIN
      src/assets/images/logo@2xSYTs.png
  12. BIN
      src/assets/images/logo@2xSs.png
  13. BIN
      src/assets/images/telPhoto.png
  14. BIN
      src/assets/index_images/sl1.png
  15. BIN
      src/assets/index_images/sl10.png
  16. BIN
      src/assets/index_images/sl11.png
  17. BIN
      src/assets/index_images/sl2.png
  18. BIN
      src/assets/index_images/sl3.png
  19. BIN
      src/assets/index_images/sl4.png
  20. BIN
      src/assets/index_images/sl5.png
  21. BIN
      src/assets/index_images/sl6.png
  22. BIN
      src/assets/index_images/sl7.png
  23. BIN
      src/assets/index_images/sl8.png
  24. BIN
      src/assets/index_images/sl9.png
  25. 48 14
      src/assets/styles/index.scss
  26. 294 0
      src/components/AccountTag/index.vue
  27. 59 5
      src/components/Editor/index.vue
  28. 32 21
      src/components/TopNav/index.vue
  29. 261 0
      src/components/bankMsg/index.vue
  30. 126 5
      src/components/busIns.vue
  31. 1 1
      src/components/pagination.vue
  32. 77 4
      src/components/questionBank.vue
  33. 194 0
      src/components/quickLogin/index.vue
  34. 422 59
      src/components/searchBoxNew.vue
  35. 0 2084
      src/components/tableList copy.vue
  36. 1130 980
      src/components/tableList.vue
  37. 496 0
      src/components/testPaperPreview/index.vue
  38. 19 0
      src/components/version/index.vue
  39. 227 0
      src/components/videoPreview/index.vue
  40. 202 50
      src/layout/components/Navbar.vue
  41. 15 15
      src/layout/components/Sidebar/Item.vue
  42. 4 4
      src/layout/components/Sidebar/Logo.vue
  43. 5 3
      src/layout/components/Sidebar/SidebarItem.vue
  44. 12 1
      src/main.js
  45. 42 0
      src/newApi/activityRecommend.js
  46. 93 3
      src/newApi/applicationData.js
  47. 8 0
      src/newApi/bankChapter.js
  48. 10 0
      src/newApi/business.js
  49. 82 4
      src/newApi/certificate.js
  50. 104 1
      src/newApi/classTab.js
  51. 24 0
      src/newApi/examapply.js
  52. 16 0
      src/newApi/festival.js
  53. 8 0
      src/newApi/gigChapter.js
  54. 25 1
      src/newApi/goods.js
  55. 59 0
      src/newApi/homeApi.js
  56. 42 0
      src/newApi/invoice.js
  57. 35 0
      src/newApi/mock.js
  58. 34 0
      src/newApi/mockSub.js
  59. 85 0
      src/newApi/newOrder.js
  60. 57 0
      src/newApi/order.js
  61. 34 0
      src/newApi/orderBusiness.js
  62. 50 0
      src/newApi/orderConfigBusiness.js
  63. 8 0
      src/newApi/paper.js
  64. 24 0
      src/newApi/paperquestion.js
  65. 35 0
      src/newApi/refund.js
  66. 27 0
      src/newApi/reviewer.js
  67. 18 0
      src/newApi/studentList.js
  68. 34 0
      src/newApi/studyAccountStatus.js
  69. 3 0
      src/plugins/index.js
  70. 67 0
      src/plugins/tab.js
  71. 1 1
      src/router/index.js
  72. 1 1
      src/settings.js
  73. 45 1
      src/store/getters.js
  74. 3 1
      src/store/index.js
  75. 47 0
      src/store/modules/dataCache.js
  76. 104 75
      src/store/modules/dict.js
  77. 4 3
      src/store/modules/permission.js
  78. 59 34
      src/store/modules/tagsView.js
  79. 3 1
      src/store/modules/user.js
  80. 2 0
      src/utils/eventBus.js
  81. 24 11
      src/utils/jsencrypt.js
  82. 223 3
      src/utils/methodsTool.js
  83. 7 12
      src/utils/request.js
  84. 23 25
      src/utils/uopladFile.js
  85. 5 2
      src/views/2Cport/adSlotManagement/index.vue
  86. 77 58
      src/views/2Cport/adSlotManagement/tab1.vue
  87. 642 7
      src/views/2Cport/adSlotManagement/tab2.vue
  88. 38 0
      src/views/2Cport/adv/index.vue
  89. 326 0
      src/views/2Cport/pageSettings/footer.vue
  90. 381 0
      src/views/2Cport/pageSettings/header.vue
  91. 41 0
      src/views/2Cport/pageSettings/index.vue
  92. 355 0
      src/views/2Cport/pageSettings/links.vue
  93. 41 0
      src/views/2Cport/referralManageMent/index.vue
  94. 552 0
      src/views/2Cport/referralManageMent/tab1/addGL.vue
  95. 208 0
      src/views/2Cport/referralManageMent/tab1/tab1.vue
  96. 552 0
      src/views/2Cport/referralManageMent/tab2/addGL.vue
  97. 207 0
      src/views/2Cport/referralManageMent/tab2/tab2.vue
  98. 48 35
      src/views/Marketing/basicParameters/marketings/beneficiary/index.vue
  99. 53 32
      src/views/Marketing/basicParameters/marketings/beneficiaryInfos/index.vue
  100. 4 0
      src/views/Marketing/basicParameters/marketings/channelSource/index.vue

+ 5 - 4
.env.development

@@ -1,11 +1,12 @@
 # 页面标题
-VUE_APP_TITLE = 祥粤云学堂管理后台
+VUE_APP_TITLE =中正云教育管理后台
 
 # 开发环境配置
 ENV = 'development'
 
-# 祥粤云学堂管理后台/开发环境
-VUE_APP_BASE_API = '/dev-api'
+# 中正云教育管理后台/开发环境
+VUE_APP_BASE_API = 'http://192.168.1.222:5030/'
+VUE_APP_IMG_API = 'https://file-dev.xyyxt.net'
 
 # 路由懒加载
-VUE_CLI_BABEL_TRANSPILE_MODULES = true
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 4 - 3
.env.production

@@ -1,8 +1,9 @@
 # 页面标题
-VUE_APP_TITLE = 祥粤云学堂管理后台
+VUE_APP_TITLE = 中正云教育管理后台
 
 # 生产环境配置
 ENV = 'production'
 
-# 祥粤云学堂管理后台/生产环境
-VUE_APP_BASE_API = ''
+# 中正云教育管理后台/生产环境
+VUE_APP_BASE_API = 'https://cloud.xyyxt.net/'
+VUE_APP_IMG_API = 'https://file.xyyxt.net'

+ 5 - 4
.env.staging

@@ -1,10 +1,11 @@
 # 页面标题
-VUE_APP_TITLE = 祥粤云学堂管理后台
+VUE_APP_TITLE = 中正云教育管理后台
 
 NODE_ENV = production
 
-# 测试环境配置
+# 预发布环境配置
 ENV = 'staging'
 
-# 祥粤云学堂管理后台/测试环境
-VUE_APP_BASE_API = '/stage-api'
+# 中正云教育管理后台/预发布环境
+VUE_APP_BASE_API = 'http://120.79.166.78:19007/'
+VUE_APP_IMG_API = 'https://file-dev.xyyxt.net'

+ 6 - 3
package.json

@@ -1,6 +1,6 @@
 {
-  "name": "ruoyi",
-  "version": "3.7.0",
+  "name": "zzadmin",
+  "version": "1.0.0",
   "description": "中正高校端管理系统",
   "author": "中正高校端",
   "license": "MIT",
@@ -38,23 +38,26 @@
   "dependencies": {
     "@polyv/vod-upload-js-sdk": "^1.2.3",
     "@riophae/vue-treeselect": "0.4.0",
+    "af-table-column": "^1.0.3",
     "axios": "0.21.0",
     "clipboard": "2.0.6",
     "core-js": "3.8.1",
     "echarts": "4.9.0",
     "element-ui": "2.15.6",
-    "file-saver": "2.0.5",
+    "file-saver": "^2.0.5",
     "fuse.js": "6.4.3",
     "highlight.js": "9.18.5",
     "js-beautify": "1.13.0",
     "js-cookie": "2.2.1",
     "js-md5": "^0.7.3",
     "jsencrypt": "3.0.0-rc.1",
+    "jszip": "^3.7.1",
     "nprogress": "0.2.0",
     "quill": "1.3.7",
     "quill-image-resize-module": "^3.0.0",
     "screenfull": "5.0.2",
     "sortablejs": "1.10.2",
+    "v-fit-columns": "^0.2.0",
     "vue": "2.6.12",
     "vue-count-to": "1.0.13",
     "vue-cropper": "0.5.5",

BIN
public/favicon.ico


+ 31 - 21
public/index.html

@@ -1,14 +1,19 @@
 <!DOCTYPE html>
 <html>
-  <head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="renderer" content="webkit">
-    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
-    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
-    <title><%= webpackConfig.name %></title>
-    <!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
-	  <style>
+
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <meta name="renderer" content="webkit">
+  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
+  <link rel="icon" href="<%= BASE_URL %>favicon.ico">
+  <title>
+    <%= webpackConfig.name %>
+  </title>
+  <!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
+
+  <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.2.4/gsap.min.js"></script>
+  <style>
     html,
     body,
     #app {
@@ -16,6 +21,7 @@
       margin: 0px;
       padding: 0px;
     }
+
     .chromeframe {
       margin: 0.2em 0;
       background: #ccc;
@@ -92,6 +98,7 @@
         -ms-transform: rotate(0deg);
         transform: rotate(0deg);
       }
+
       100% {
         -webkit-transform: rotate(360deg);
         -ms-transform: rotate(360deg);
@@ -105,6 +112,7 @@
         -ms-transform: rotate(0deg);
         transform: rotate(0deg);
       }
+
       100% {
         -webkit-transform: rotate(360deg);
         -ms-transform: rotate(360deg);
@@ -194,15 +202,17 @@
       opacity: 0.5;
     }
   </style>
-  </head>
-  <body>
-    <div id="app">
-	    <div id="loader-wrapper">
-		    <div id="loader"></div>
-		    <div class="loader-section section-left"></div>
-		    <div class="loader-section section-right"></div>
-		    <div class="load_title">正在加载系统资源,请耐心等待</div>
-        </div>
-	</div>
-  </body>
-</html>
+</head>
+
+<body>
+  <div id="app">
+    <div id="loader-wrapper">
+      <div id="loader"></div>
+      <div class="loader-section section-left"></div>
+      <div class="loader-section section-right"></div>
+      <div class="load_title">正在加载系统资源,请耐心等待</div>
+    </div>
+  </div>
+</body>
+
+</html>

+ 22 - 0
src/api/api.js

@@ -89,6 +89,17 @@ import adv from '../newApi/adv'//广告位管理
 import advList from '../newApi/advList'//广告位发布储存管理
 import answer from '../newApi/answer'//答疑管理
 import rolesBusin from '../newApi/rolesBusin'//角色和业务层次关联
+import reviewer from '../newApi/reviewer'//学时审核用户
+import invoice from '../newApi/invoice'//订单发票
+import orderBusiness from '../newApi/orderBusiness'//录单配置
+import orderConfigBusiness from '../newApi/orderConfigBusiness'//配置详情
+import newOrder from '../newApi/newOrder'//录单管理
+import refund from '../newApi/refund'//退费管理
+import activityRecommend from '../newApi/activityRecommend'//商品推荐管理
+import homeApi from '../newApi/homeApi'//控制台学员数据
+import studyAccountStatus from '../newApi/studyAccountStatus'//学习账号标记
+import mock from '../newApi/mock'//模考管理
+import mockSub from '../newApi/mockSub'//预约模考管理
 
 
 
@@ -158,6 +169,17 @@ export default {
     ...advList,
     ...answer,
     ...rolesBusin,
+    ...reviewer,
+    ...invoice,
+    ...orderBusiness,
+    ...orderConfigBusiness,
+    ...newOrder,
+    ...refund,
+    ...activityRecommend,
+    ...homeApi,
+    ...studyAccountStatus,
+    ...mock,
+    ...mockSub
 
     // ...login,
     // ...profession,

BIN
src/assets/404_images/wuyuxaog.png


BIN
src/assets/images/logo@2xS.png


BIN
src/assets/images/logo@2xSYT.png


BIN
src/assets/images/logo@2xSYTs.png


BIN
src/assets/images/logo@2xSs.png


BIN
src/assets/images/telPhoto.png


BIN
src/assets/index_images/sl1.png


BIN
src/assets/index_images/sl10.png


BIN
src/assets/index_images/sl11.png


BIN
src/assets/index_images/sl2.png


BIN
src/assets/index_images/sl3.png


BIN
src/assets/index_images/sl4.png


BIN
src/assets/index_images/sl5.png


BIN
src/assets/index_images/sl6.png


BIN
src/assets/index_images/sl7.png


BIN
src/assets/index_images/sl8.png


BIN
src/assets/index_images/sl9.png


+ 48 - 14
src/assets/styles/index.scss

@@ -1,22 +1,28 @@
-@import './variables.scss';
-@import './mixin.scss';
-@import './transition.scss';
-@import './element-ui.scss';
-@import './sidebar.scss';
-@import './btn.scss';
+@import "./variables.scss";
+@import "./mixin.scss";
+@import "./transition.scss";
+@import "./element-ui.scss";
+@import "./sidebar.scss";
+@import "./btn.scss";
 
 body {
   height: 100%;
   -moz-osx-font-smoothing: grayscale;
   -webkit-font-smoothing: antialiased;
   text-rendering: optimizeLegibility;
-  font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
+  font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB,
+    Microsoft YaHei, Arial, sans-serif;
+}
+// 设置全局
+.el-table__fixed-right {
+  height: 100% !important;
 }
-
 label {
   font-weight: 700;
 }
-
+.myMessageClass {
+  z-index: 3000 !important;
+}
 html {
   height: 100%;
   box-sizing: border-box;
@@ -104,7 +110,8 @@ aside {
   display: block;
   line-height: 32px;
   font-size: 16px;
-  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen,
+    Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
   color: #2c3e50;
   -webkit-font-smoothing: antialiased;
   -moz-osx-font-smoothing: grayscale;
@@ -134,7 +141,7 @@ aside {
 }
 
 .text-center {
-  text-align: center
+  text-align: center;
 }
 
 .sub-navbar {
@@ -145,7 +152,13 @@ aside {
   text-align: right;
   padding-right: 20px;
   transition: 600ms ease position;
-  background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%);
+  background: linear-gradient(
+    90deg,
+    rgba(32, 182, 249, 1) 0%,
+    rgba(32, 182, 249, 1) 0%,
+    rgba(33, 120, 241, 1) 100%,
+    rgba(33, 120, 241, 1) 100%
+  );
 
   .subtitle {
     font-size: 20px;
@@ -180,10 +193,10 @@ aside {
     margin-bottom: 10px;
   }
 }
-ul{
+ul {
   padding: 0px;
 }
-li{
+li {
   list-style-type: none;
 }
 //refine vue-multiselect plugin
@@ -194,3 +207,24 @@ li{
 .multiselect--active {
   z-index: 1000 !important;
 }
+
+.activeStyIcons {
+  color: #fff !important;
+  background-color: #f56c6c !important;
+  border-color: #f56c6c !important;
+}
+.copyDataLi {
+  border: 1px solid #999;
+  border-radius: 8px;
+  padding: 4px 6px;
+  margin-bottom: 8px;
+  margin-right: 8px;
+  display: inline-block;
+  cursor: pointer;
+  transition: all 0.3s;
+  &:hover {
+    color: #f56c6c;
+    background: #fef0f0;
+    border-color: #fbc4c4;
+  }
+}

+ 294 - 0
src/components/AccountTag/index.vue

@@ -0,0 +1,294 @@
+<template>
+  <div id="AccountTag">
+    <el-dialog
+      :visible.sync="dialogVisible"
+      width="460px"
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">
+          {{
+            stice == 1
+              ? "学习完成状态标记"
+              : stice == 4
+              ? "学习账号开通状态标记"
+              : stice == 3
+              ? "移除学员"
+              : ""
+          }}
+        </div>
+        <div class="rightBoxs">
+          <img
+            src="@/assets/images/Close@2x.png"
+            alt=""
+            @click="dialogVisible = false"
+          />
+        </div>
+      </div>
+      <div>
+        <ul>
+          <li
+            v-for="(item, index) in allCheckList"
+            :key="index"
+            class="btnLists"
+          >
+            {{ item.realname }}
+            <i
+              class="el-icon-close btnIcon"
+              v-if="allCheckList.length > 1"
+              @click="clearStudent(index)"
+            ></i>
+          </li>
+          <div style="clear: both"></div>
+          <p>
+            {{
+              stice == 1
+                ? "请对以上所选学员进行学习完成状态标记:"
+                : stice == 3
+                ? "是否移除所选中的学员?"
+                : stice == 4
+                ? "请对以上所选学员进行账号开通状态标记:"
+                : ""
+            }}
+          </p>
+          <div style="text-align: center">
+            <el-radio-group v-model="finishStatusOS" v-if="stice == 1">
+              <el-radio :label="1">已学完</el-radio>
+              <el-radio :label="0">未学完</el-radio>
+            </el-radio-group>
+            <el-radio-group
+              v-model="finishStatusOS"
+              v-if="stice == 4"
+              @change="failReason = ''"
+            >
+              <el-radio :label="1">已开通</el-radio>
+              <el-radio :label="0">未开通</el-radio>
+              <el-radio :label="2">标记失败</el-radio>
+            </el-radio-group>
+          </div>
+          <div v-if="stice == 4 && finishStatusOS === 2">
+            <p>失败原因:</p>
+            <el-input type="textarea" v-model="failReason"></el-input>
+          </div>
+        </ul>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="submit">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      dialogVisible: false,
+      stice: "",
+      allCheckList: [],
+      finishStatusOS: "",
+      failReason: "",
+    };
+  },
+  methods: {
+    clearStudent(index) {
+      this.allCheckList.splice(index, 1);
+    },
+    openBox(int, array, status) {
+      this.stice = int;
+      this.allCheckList = JSON.parse(JSON.stringify(array));
+      this.finishStatusOS = "";
+      if (status) {
+        this.initData();
+      }
+      this.dialogVisible = true;
+    },
+    /**
+     * 修改回填
+     */
+    initData() {
+      if (this.stice === 1) {
+        this.finishStatusOS = this.allCheckList[0].finishStatus;
+      }
+      if (this.stice === 4) {
+        this.finishStatusOS = this.allCheckList[0].learnStatus;
+        if (this.finishStatusOS === 2) {
+          this.failReason = this.allCheckList[0].reason;
+        }
+      }
+    },
+    submit() {
+      if (!this.allCheckList.length) {
+        this.dialogVisible = false;
+        return;
+      }
+      let ars = [];
+      this.allCheckList.map((item) => {
+        ars.push(item.id);
+      });
+      let data = {
+        id: ars,
+      };
+      if (this.stice === 1 || this.stice === 4) {
+        if (this.stice === 1) {
+          if (this.finishStatusOS !== 0 && this.finishStatusOS !== 1) {
+            this.$message.warning("请进行学习完成状态标记");
+            return;
+          }
+        }
+        if (this.stice === 4) {
+          if (
+            this.finishStatusOS !== 0 &&
+            this.finishStatusOS !== 1 &&
+            this.finishStatusOS !== 2
+          ) {
+            this.$message.warning("请选择账号开通状态标记");
+            return;
+          }
+        }
+        if (this.stice === 1) {
+          data.finishStatus = this.finishStatusOS;
+        }
+        if (this.stice === 4) {
+          data.learnStatus = this.finishStatusOS;
+          if (this.finishStatusOS === 2) {
+            if (!this.failReason) {
+              this.$message.error("请填写失败原因");
+              return;
+            }
+            data.reason = this.failReason;
+          }
+        }
+      }
+      if (this.stice === 3) {
+        data.status = 0;
+      }
+      this.$api.editGradeUserGradegrade(data).then((res) => {
+        this.$message.success("成功");
+        this.$emit("successFuncBack");
+        this.dialogVisible = false;
+      });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.dis__s {
+  margin-bottom: 14px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+.btnLists {
+  float: left;
+  border: 1px solid #333;
+  padding: 0px 10px;
+  margin-right: 10px;
+  margin-bottom: 10px;
+  border-radius: 4px;
+  height: 30px;
+  line-height: 30px;
+  .btnIcon {
+    cursor: pointer;
+    transition: all 0.2s;
+    &:hover {
+      color: blue;
+    }
+  }
+}
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
+/deep/.radioTables > .el-radio__label {
+  display: none;
+}
+</style>

+ 59 - 5
src/components/Editor/index.vue

@@ -71,6 +71,10 @@ export default {
         bounds: document.body,
         debug: "warn",
         modules: {
+          clipboard: {
+            // 粘贴版,处理粘贴时候带图片
+            matchers: [[Node.ELEMENT_NODE, this.handleCustomMatcher]],
+          },
           // 工具栏配置
           toolbar: [
             ["bold", "italic", "underline", "strike"], // 加粗 斜体 下划线 删除线
@@ -145,10 +149,60 @@ export default {
     this.Quill = null;
   },
   methods: {
+    handleCustomMatcher(node, Delta) {
+      let ops = [];
+      Delta.ops.forEach((op) => {
+        if (op.insert && typeof op.insert === "string") {
+          // 如果粘贴了图片,这里会是一个对象,所以可以这样处理
+          ops.push({
+            insert: op.insert,
+          });
+        } else {
+          if (op.insert.image.includes("data:image")) {
+            /**
+             * 粘贴图片
+             */
+            let arr = op.insert.image.split(",");
+            let mime = arr[0].match(/:(.*?);/)[1];
+            let bytes = atob(arr[1]);
+            let n = bytes.length;
+            let ia = new Uint8Array(n);
+            while (n--) {
+              ia[n] = bytes.charCodeAt(n);
+            }
+            let arry = new File([ia], "随机名称", { type: mime });
+            this.imageChange({
+              file: arry,
+            });
+          } else {
+            ops.push({
+              insert: op.insert,
+            });
+          }
+        }
+      });
+      Delta.ops = ops;
+      return Delta;
+    },
+    base64ToFile(base64, fileName) {
+      return new Promise((resolve, reject) => {
+        let arr = base64.split(",");
+        let mime = arr[0].match(/:(.*?);/)[1];
+        let bytes = atob(arr[1]);
+        let n = bytes.length;
+        let ia = new Uint8Array(n);
+        while (n--) {
+          ia[n] = bytes.charCodeAt(n);
+        }
+        let arry = new File([ia], fileName, { type: mime });
+        this.$upload.upload(arry, 2).then((res) => {
+          resolve(this.$methodsTools.splitImgHost(res));
+        });
+      });
+    },
     init() {
       const editor = this.$refs.editor;
       this.Quill = new Quill(editor, this.options);
-      console.log(this.Quill)
       // 如果设置了上传地址则自定义图片上传事件
       if (this.uploadUrl) {
         let toolbar = this.Quill.getModule("toolbar");
@@ -192,11 +246,11 @@ export default {
       this.Quill.on("editor-change", (eventName, ...args) => {
         this.$emit("on-editor-change", eventName, ...args);
       });
-      
-      editor.onclick=() => {
-        this.Quill.enable(true)
+
+      editor.onclick = () => {
+        this.Quill.enable(true);
         this.Quill.focus();
-      }
+      };
     },
     imageChange(param, type) {
       this.$upload

+ 32 - 21
src/components/TopNav/index.vue

@@ -5,14 +5,22 @@
     @select="handleSelect"
   >
     <template v-for="(item, index) in topMenus">
-      <el-menu-item :style="{'--theme': theme}" :index="item.path" :key="index" v-if="index < visibleNumber"
+      <el-menu-item
+        :style="{ '--theme': theme }"
+        :index="item.path"
+        :key="index"
+        v-if="index < visibleNumber"
         ><svg-icon :icon-class="item.meta.icon" />
         {{ item.meta.title }}</el-menu-item
       >
     </template>
 
     <!-- 顶部菜单超出数量折叠 -->
-    <el-submenu :style="{'--theme': theme}" index="more" v-if="topMenus.length > visibleNumber">
+    <el-submenu
+      :style="{ '--theme': theme }"
+      index="more"
+      v-if="topMenus.length > visibleNumber"
+    >
       <template slot="title">更多菜单</template>
       <template v-for="(item, index) in topMenus">
         <el-menu-item
@@ -38,7 +46,7 @@ export default {
       // 是否为首次加载
       isFrist: false,
       // 当前激活菜单的 index
-      currentIndex: undefined
+      currentIndex: undefined,
     };
   },
   computed: {
@@ -52,9 +60,9 @@ export default {
         if (menu.hidden !== true) {
           // 兼容顶部栏一级菜单内部跳转
           if (menu.path === "/") {
-              topMenus.push(menu.children[0]);
+            topMenus.push(menu.children[0]);
           } else {
-              topMenus.push(menu);
+            topMenus.push(menu);
           }
         }
       });
@@ -70,11 +78,13 @@ export default {
       this.routers.map((router) => {
         for (var item in router.children) {
           if (router.children[item].parentPath === undefined) {
-            if(router.path === "/") {
-              router.children[item].path = "/redirect/" + router.children[item].path;
+            if (router.path === "/") {
+              router.children[item].path =
+                "/redirect/" + router.children[item].path;
             } else {
-              if(!this.ishttp(router.children[item].path)) {
-                router.children[item].path = router.path + "/" + router.children[item].path;
+              if (!this.ishttp(router.children[item].path)) {
+                router.children[item].path =
+                  router.path + "/" + router.children[item].path;
               }
             }
             router.children[item].parentPath = router.path;
@@ -100,17 +110,17 @@ export default {
       }
       var routes = this.activeRoutes(activePath);
       if (routes.length === 0) {
-        activePath = this.currentIndex || this.defaultRouter()
+        activePath = this.currentIndex || this.defaultRouter();
         this.activeRoutes(activePath);
       }
       return activePath;
     },
   },
   beforeMount() {
-    window.addEventListener('resize', this.setVisibleNumber)
+    window.addEventListener("resize", this.setVisibleNumber);
   },
   beforeDestroy() {
-    window.removeEventListener('resize', this.setVisibleNumber)
+    window.removeEventListener("resize", this.setVisibleNumber);
   },
   mounted() {
     this.setVisibleNumber();
@@ -156,14 +166,14 @@ export default {
           }
         });
       }
-      if(routes.length > 0) {
+      if (routes.length > 0) {
         this.$store.commit("SET_SIDEBAR_ROUTERS", routes);
       }
       return routes;
     },
-	ishttp(url) {
-      return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1
-    }
+    ishttp(url) {
+      return url.indexOf("http://") !== -1 || url.indexOf("https://") !== -1;
+    },
   },
 };
 </script>
@@ -173,14 +183,15 @@ export default {
   float: left;
   height: 50px !important;
   line-height: 50px !important;
-  color: #999093 !important;
+  color: #444 !important;
   padding: 0 5px !important;
   margin: 0 10px !important;
 }
 
-.topmenu-container.el-menu--horizontal > .el-menu-item.is-active, .el-menu--horizontal > .el-submenu.is-active .el-submenu__title {
-  border-bottom: 2px solid #{'var(--theme)'} !important;
-  color: #303133;
+.topmenu-container.el-menu--horizontal > .el-menu-item.is-active,
+.el-menu--horizontal > .el-submenu.is-active .el-submenu__title {
+  border-bottom: 2px solid #{"var(--theme)"} !important;
+  color: #{"var(--theme)"} !important;
 }
 
 /* submenu item */
@@ -188,7 +199,7 @@ export default {
   float: left;
   height: 50px !important;
   line-height: 50px !important;
-  color: #999093 !important;
+  color: #444 !important;
   padding: 0 5px !important;
   margin: 0 10px !important;
 }

+ 261 - 0
src/components/bankMsg/index.vue

@@ -0,0 +1,261 @@
+<template>
+  <div id="bankMsg">
+    <div class="dis_flex">
+      <span class="span_sty">题目内容:</span>
+      <div>
+        <div class="divPy" v-html="imgExiz(bankMsg.content)"></div>
+        <div v-if="bankMsg.type === 4">
+          <div
+            style="
+              background: #eee;
+              padding: 10px;
+              border-bottom: 1px solid #a4a4a4;
+            "
+            v-for="(its, inds) in JSON.parse(bankMsg.jsonStr)"
+            :key="inds"
+          >
+            <div class="dis_flex">
+              <span class="span_sty">题目类型:</span>
+              <div>
+                <span>{{ getTypeName(its.type) }}</span>
+              </div>
+            </div>
+            <div class="dis_flex">
+              <span class="span_sty">题目内容:</span>
+              <div>
+                <div class="divPy" v-html="imgExiz(its.content)"></div>
+              </div>
+            </div>
+            <div
+              class="dis_flex"
+              v-if="its.type !== 4 && its.type !== 5 && its.type !== 3"
+            >
+              <span class="span_sty">选项内容:</span>
+              <div>
+                <ul>
+                  <li
+                    v-for="(itemsxs, indexsxs) in its.optionsList"
+                    :key="indexsxs"
+                    style="margin-bottom: 10px"
+                  >
+                    {{ Gest(indexsxs + 1) }}:{{ itemsxs.content }}
+                    <div style="margin: 10px 0px">
+                      <el-image
+                        v-if="itemsxs.imgUrl"
+                        style="
+                          max-width: 100%;
+                          max-height: 100%;
+                          vertical-align: middle;
+                        "
+                        :src="$methodsTools.splitImgHost(itemsxs.imgUrl)"
+                        :preview-src-list="[
+                          $methodsTools.splitImgHost(itemsxs.imgUrl),
+                        ]"
+                      >
+                      </el-image>
+                    </div>
+                  </li>
+                </ul>
+              </div>
+            </div>
+            <div class="dis_flex" v-if="its.type !== 5">
+              <span class="span_sty">正确答案:</span>
+              <div>
+                <span v-if="its.type === 3">
+                  {{ its.answerQuestion == 1 ? "正确" : "错误" }}
+                </span>
+                <span v-else>
+                  {{ getDictChanges(its.answerQuestion) }}
+                </span>
+              </div>
+            </div>
+            <div class="dis_flex">
+              <span class="span_sty">答案解析:</span>
+              <div>
+                <div v-html="imgExiz(its.analysisContent)"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div
+      class="dis_flex"
+      v-if="bankMsg.type !== 4 && bankMsg.type !== 5 && bankMsg.type !== 3"
+    >
+      <span class="span_sty">选项内容:</span>
+      <div>
+        <ul>
+          <li
+            v-for="(items, indexs) in JSON.parse(bankMsg.jsonStr)"
+            :key="indexs"
+            style="margin-bottom: 10px"
+          >
+            {{ Gest(indexs + 1) }}:{{ items.content }}
+
+            <div style="margin: 10px 0px">
+              <el-image
+                v-if="items.imgUrl"
+                style="
+                  max-width: 100%;
+                  max-height: 100%;
+                  vertical-align: middle;
+                "
+                :src="$methodsTools.splitImgHost(items.imgUrl)"
+                :preview-src-list="[$methodsTools.splitImgHost(items.imgUrl)]"
+              >
+              </el-image>
+            </div>
+          </li>
+        </ul>
+      </div>
+    </div>
+    <div class="dis_flex" v-if="bankMsg.type !== 5 && bankMsg.type !== 4">
+      <span class="span_sty">正确答案:</span>
+      <div>
+        <span v-if="bankMsg.type === 3">
+          {{ bankMsg.answerQuestion == 1 ? "正确" : "错误" }}
+        </span>
+        <span v-else>
+          {{ getDictChanges(bankMsg.answerQuestion) }}
+        </span>
+      </div>
+    </div>
+    <div class="dis_flex" v-if="bankMsg.type !== 4">
+      <span class="span_sty">答案解析:</span>
+      <div><div v-html="imgExiz(bankMsg.analysisContent)"></div></div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: ["bankMsg"],
+  data() {
+    return {};
+  },
+  computed: {
+    /**
+     * 题目类型转换名称
+     */
+    getTypeName: function () {
+      return function (type) {
+        let typeName = "";
+        switch (type) {
+          case 1:
+            typeName = "单选题";
+            break;
+          case 2:
+            typeName = "多选题";
+            break;
+          case 3:
+            typeName = "判断题";
+            break;
+          case 4:
+            typeName = "案例题";
+            break;
+          case 5:
+            typeName = "简答题";
+            break;
+
+          default:
+            break;
+        }
+        return typeName;
+      };
+    },
+
+    imgExiz: function () {
+      return function (vms) {
+        if (!vms) {
+          return vms;
+        } else {
+          var ast1 = vms.replace(/<p/gi, '<p style="margin:0px;"');
+          var ast = ast1.replace(/<img/gi, '<img style="max-width:100%;"');
+          return ast;
+        }
+      };
+    },
+  },
+  methods: {
+    /**
+     * 选项转换
+     */
+    Gest(ints) {
+      var int = parseInt(ints);
+      var ast = "";
+      switch (int) {
+        case 1:
+          ast = "A";
+          break;
+        case 2:
+          ast = "B";
+          break;
+        case 3:
+          ast = "C";
+          break;
+        case 4:
+          ast = "D";
+          break;
+        case 5:
+          ast = "E";
+          break;
+        case 6:
+          ast = "F";
+          break;
+        case 7:
+          ast = "G";
+          break;
+        case 8:
+          ast = "H";
+          break;
+        default:
+          ast = "X";
+          break;
+      }
+      return ast;
+    },
+    getDictChanges(dan) {
+      var arst = [];
+      var arrays;
+      if (dan instanceof Object) {
+        arrays = dan;
+      } else {
+        if (dan) {
+          arrays = dan.toString().split(",");
+        } else {
+          return "";
+        }
+      }
+      for (let i = 0; i < arrays.length; i++) {
+        arst.push(this.Gest(arrays[i]));
+      }
+      return arst.join(",");
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+#bankMsg {
+  width: 100%;
+}
+.dis_flex {
+  display: flex;
+  margin-bottom: 6px;
+  & > span {
+    width: 90px;
+    flex-shrink: 0;
+  }
+  & > div {
+    flex: 1;
+    white-space: initial;
+    ul {
+      margin: 0;
+    }
+  }
+}
+.span_sty {
+  font-weight: bold;
+}
+</style>

+ 126 - 5
src/components/busIns.vue

@@ -43,7 +43,17 @@
             @hide="hideHandle"
             :disabled="courType ? false : true"
           >
-            <el-checkbox-group v-model="sujectArray" class="checkboxSty">
+            <el-checkbox
+              v-model="checkAll"
+              @change="handleCheckAllChange"
+              :indeterminate="isIndeterminate"
+              >全选</el-checkbox
+            >
+            <el-checkbox-group
+              v-model="sujectArray"
+              class="checkboxSty"
+              @change="handleCheckedCitiesChange"
+            >
               <el-checkbox
                 v-for="(item, index) in newSujectOption"
                 :label="item.newId"
@@ -56,7 +66,10 @@
                 >确定</el-button
               >
             </div>
-            <el-button slot="reference" style="margin-left: 12px" @click="getMessage"
+            <el-button
+              slot="reference"
+              style="margin-left: 12px"
+              @click="getMessage"
               >请选择科目</el-button
             >
           </el-popover>
@@ -80,11 +93,43 @@
               <i class="el-icon-error closeIcons" @click="closeType(index)"></i>
             </div>
           </div>
+          <el-popover
+            placement="bottom-start"
+            trigger="hover"
+            :close-delay="50"
+          >
+            <ul style="margin: 0; max-width: 600px">
+              <li
+                class="copyDataLi"
+                :class="changeSty(itemT)"
+                v-for="(itemT, indexT) in localData"
+                :key="indexT"
+                @click="unTime(itemT)"
+              >
+                {{
+                  `${itemT.educationName}-${itemT.projectName}-${itemT.businessName}-${itemT.subjectName}`
+                }}
+              </li>
+            </ul>
+            <el-button
+              v-show="localData.length"
+              type="danger"
+              slot="reference"
+              size="mini"
+              style="margin-right: 10px"
+              >最近选择</el-button
+            >
+          </el-popover>
           <el-button
             size="mini"
             v-if="newSujectApis.length > 1"
             @click="changeType"
             >{{ changeHeight ? "展开" : "关闭" }}</el-button
+          ><el-button
+            size="mini"
+            v-if="newSujectApis.length > 0"
+            @click="sujectApis = []"
+            >清空</el-button
           >
           <!-- <span v-if="newSujectApis.length === 0">未选项目类型</span> -->
         </div>
@@ -98,6 +143,8 @@ export default {
   props: ["typeBus", "sujectApisTable", "newSujectApisTable"],
   data() {
     return {
+      isIndeterminate: false,
+      checkAll: false,
       changeHeight: false,
       eduTypeOptions: [], //教育类型数据
       projectTypeOptions: [], //项目类型数据
@@ -124,6 +171,12 @@ export default {
     };
   },
   watch: {
+    sujectApis: {
+      immediate: true,
+      handler(newName, oldName) {
+        this.changeTypes();
+      },
+    },
     sujectApisTable: {
       handler(newVal, oldVal) {
         this.sujectApis = newVal;
@@ -133,16 +186,80 @@ export default {
     },
     newSujectApisTable: {
       handler(newVal, oldVal) {
+        console.log(newVal, 2);
         this.newSujectApis = newVal;
       },
       // 立即处理 进入页面就触发
       immediate: true,
     },
   },
+  created() {
+    this.localData = this.$methodsTools.getBusinessList();
+  },
   mounted() {
     this.getDict();
   },
   methods: {
+    UPDates() {
+      this.localData = this.$methodsTools.getBusinessList();
+    },
+    unTime(val) {
+      let a = `${val.businessId}-${val.subjectId}`;
+      if (this.sujectApis.includes(a)) {
+        this.sujectApis.splice(this.sujectApis.indexOf(a), 1);
+      } else {
+        this.sujectApis.push(a);
+      }
+    },
+    changeSty(val) {
+      var arr = "";
+      this.sujectApis.forEach((item) => {
+        let arr1 = item.split("-").map(Number);
+        if (val.businessId == arr1[0] && val.subjectId == arr1[1]) {
+          arr = "activeStyIcons";
+        }
+      });
+      return arr;
+    },
+    handleCheckedCitiesChange() {
+      let nid = this.newSujectOption.map((item) => {
+        return item.newId;
+      });
+      this.checkAll = this.sujectArray.length === nid.length;
+      this.isIndeterminate =
+        this.sujectArray.length > 0 && this.sujectArray.length < nid.length;
+    },
+    setFunc(arr) {
+      var arrays = [];
+      for (let i = 0; i < arr.length; i++) {
+        if (!arrays.includes(arr[i])) {
+          arrays.push(arr[i]);
+        }
+      }
+      return arrays;
+    },
+    handleCheckAllChange(val) {
+      if (val) {
+        let nid = this.newSujectOption.map((item) => {
+          return item.newId;
+        });
+        let arrays = this.sujectArray.concat(nid);
+        this.sujectArray = this.setFunc(arrays);
+        this.isIndeterminate = false;
+      } else {
+        let nid = this.newSujectOption.map((item) => {
+          return item.newId;
+        });
+        let newArr = [];
+        this.sujectArray.forEach((item) => {
+          if (!nid.includes(item)) {
+            newArr.push(item);
+          }
+        });
+        this.sujectArray = newArr;
+        this.isIndeterminate = false;
+      }
+    },
     getMessage() {
       if (!this.courType) {
         this.$message.warning("请先选择业务层级");
@@ -248,7 +365,6 @@ export default {
         this.sujectApis.push(this.sujectArray[i]);
       }
       this.$refs.popovers[0].doClose();
-      this.changeTypes();
     },
     hideHandle() {},
     showHandle() {
@@ -261,20 +377,25 @@ export default {
         }
       }
       this.sujectArray = array;
+      if (!this.newSujectOption.length) {
+        this.$message.warning("该业务层次暂无关联科目");
+        this.$refs.popovers[0].doClose();
+        return;
+      }
       this.newSujectOption.map((item) => {
         item.newId = this.courType + "-" + item.id;
       });
+      this.handleCheckedCitiesChange();
     },
     closeType(index) {
       this.sujectApis.splice(index, 1);
-      this.changeTypes();
     },
   },
 };
 </script>
 
 <style lang="less" scoped>
-.checkboxSty{
+.checkboxSty {
   display: flex;
   flex-direction: column;
 }

+ 1 - 1
src/components/pagination.vue

@@ -19,7 +19,7 @@ export default {
   data() {
     return {
       //   currentPage: 1, //当前位于页
-      pageSizes: [5, 10, 15, 20], //每页多少条分组
+      pageSizes: [10, 20, 50, 100, 200, 500], //每页多少条分组
     };
   },
   methods: {

+ 77 - 4
src/components/questionBank.vue

@@ -1,3 +1,4 @@
+<!-- 题目编辑组件 -->
 <template>
   <div id="questionBank">
     <el-col :span="24" style="display: flex; justify-content: center">
@@ -75,7 +76,7 @@
         <div
           class="marg_play"
           v-if="
-            dingForm.type === 1 || dingForm.type === 2 || dingForm.type === 5
+            dingForm.type === 1 || dingForm.type === 2
           "
         >
           <span class="spans"
@@ -246,7 +247,7 @@
               </div> -->
               <div
                 class="marg_play"
-                v-if="ans.type === 1 || ans.type === 2 || ans.type === 5"
+                v-if="ans.type === 1 || ans.type === 2"
               >
                 <span class="spans"
                   ><span style="color: red" v-if="ans.type !== 5">* </span
@@ -547,6 +548,7 @@ export default {
   watch: {
     dingFormInfo: {
       handler(newVal, oldVal) {
+        console.log(newVal)
         this.dingForm = newVal;
       },
       // 立即处理 进入页面就触发
@@ -555,20 +557,83 @@ export default {
   },
   methods: {
     changeTypes(int) {
-      this.dingForm = {
+      var data = {
         questionId: this.dingForm.questionId ? this.dingForm.questionId : "",
         type: int,
         optionsList: [],
         answerQuestionList: [],
         answerQuestion: "",
         content: "",
-        // status: "",
         analysisContent: "",
       };
+      switch (int) {
+        case 1:
+          for (let i = 0; i < 4; i++) {
+            data.optionsList.push({
+              content: "",
+              imgUrl: null,
+              optionsId: i + 1,
+            });
+          }
+          break;
+        case 2:
+          for (let i = 0; i < 5; i++) {
+            data.optionsList.push({
+              content: "",
+              imgUrl: null,
+              optionsId: i + 1,
+            });
+          }
+          break;
+        case 4:
+          var datas = {
+            analysisContent: "",
+            answerQuestion: "",
+            answerQuestionList: [],
+            content: "",
+            optionsList: [],
+            type: 1,
+          };
+          for (let i = 0; i < 4; i++) {
+            datas.optionsList.push({
+              content: "",
+              imgUrl: null,
+              optionsId: i + 1,
+            });
+          }
+          data.optionsList.push(datas);
+        default:
+          break;
+      }
+      this.dingForm = data;
     },
     changeTypeChild(index) {
       this.dingForm.optionsList[index].optionsList = [];
       this.dingForm.optionsList[index].answerQuestion = "";
+      switch (this.dingForm.optionsList[index].type) {
+        case 1:
+          for (let i = 0; i < 4; i++) {
+            this.dingForm.optionsList[index].optionsList.push({
+              content: "",
+              imgUrl: null,
+              optionsId: i + 1,
+            });
+          }
+          break;
+        case 2:
+          for (let i = 0; i < 5; i++) {
+            this.dingForm.optionsList[index].optionsList.push({
+              content: "",
+              imgUrl: null,
+              optionsId: i + 1,
+            });
+          }
+          break;
+        default:
+          break;
+      }
+      // this.dingForm.optionsList[index].optionsList = [];
+      // this.dingForm.optionsList[index].answerQuestion = "";
     },
     getInfosPage() {
       return this.dingForm;
@@ -702,6 +767,13 @@ export default {
         optionsList: [],
         type: 1,
       };
+      for (let i = 0; i < 4; i++) {
+        data.optionsList.push({
+          content: "",
+          imgUrl: null,
+          optionsId: i + 1,
+        });
+      }
       this.dingForm.optionsList.push(data);
     },
     // 上传图片
@@ -827,6 +899,7 @@ export default {
   display: flex;
   margin-bottom: 15px;
   .spans {
+    flex-shrink: 0;
     text-align: right;
     width: 80px;
   }

+ 194 - 0
src/components/quickLogin/index.vue

@@ -0,0 +1,194 @@
+<template>
+  <div id="quickLogin">
+    <el-dialog
+      @closed="loadingClose"
+      :visible.sync="dialogVisible"
+      width="500px"
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">快捷验证登录:</div>
+        <div class="rightBoxs">
+          <img
+            src="@/assets/images/Close@2x.png"
+            alt=""
+            @click="dialogVisible = false"
+          />
+        </div>
+      </div>
+      <div>
+        <el-form
+          label-position="right"
+          label-width="100px"
+          :model="formLabelAlign"
+          :rules="rules"
+          ref="formLabelAlign"
+        >
+          <el-form-item label="验证码:" prop="yzm">
+            <el-input v-model="formLabelAlign.yzm"
+              ><el-button
+                type="text"
+                slot="append"
+                @click="getCode"
+                :disabled="changeStatus"
+                >{{
+                  changeStatus ? `倒计时${time}秒` : "获取验证码"
+                }}</el-button
+              ></el-input
+            >
+          </el-form-item>
+          <el-form-item label="密码:" prop="password">
+            <el-input v-model="formLabelAlign.password"></el-input>
+          </el-form-item>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取 消</el-button>
+        <el-button
+          type="primary"
+          @click="submitForm('formLabelAlign')"
+          :loading="disabledBtn"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      loading: false,
+      size: "small",
+      dialogVisible: false,
+      disabledBtn: false,
+      list: [],
+      formLabelAlign: {},
+      time: 120,
+      setFunc: null,
+      changeStatus: false,
+      rules: {
+        yzm: [{ required: true, message: "请输入验证码", trigger: "blur" }],
+        password: [{ required: true, message: "请输入密码", trigger: "blur" }],
+      },
+    };
+  },
+  methods: {
+    /**
+     * 获取验证码
+     */
+    getCode() {
+      this.changeStatus = true;
+      this.$api
+        .gradesendCode()
+        .then((res) => {
+          this.$message.success("验证码已发送");
+          this.setFunc = setInterval(() => {
+            this.time--;
+            if (this.time <= 0) {
+              clearInterval(this.setFunc);
+              this.time = 120;
+              this.changeStatus = false;
+            }
+          }, 1000);
+        })
+        .finally(() => {
+          this.changeStatus = false;
+        });
+    },
+    loadingClose() {
+      this.$refs.formLabelAlign.resetFields();
+      this.disabledBtn = false;
+      this.list = [];
+    },
+    /**
+     * status 从有接口数据标记进来 false 班级学员进来 true
+     */
+    openBoxs(arr, goodsId, status = true) {
+      if (status) {
+        this.$api.obtainGoods(goodsId).then((res) => {
+          if (res.data.categoryName) {
+            this.list = arr.map((item) => {
+              return {
+                id: item.id,
+                realname: item.realname,
+                idCard: item.idCard,
+                telphone: item.telPhone,
+                workTypeName: res.data.categoryName,
+              };
+            });
+            this.dialogVisible = true;
+          } else {
+            this.$message.error("请前往商品列表编辑设置该商品专业");
+            return;
+          }
+        });
+      } else {
+        const CHECKNAME = arr.every((item) => {
+          return item.categoryName != null;
+        });
+        if (!CHECKNAME) {
+          this.$message.error("勾选的商品必须设置专业");
+          return;
+        }
+        const GFSTATUS = arr.every((item) => {
+          return item.learnStatus !== 1;
+        });
+        if (!GFSTATUS) {
+          this.$message.error("勾选的数据不能包含账号标记已开通的数据");
+          return;
+        }
+        this.list = arr.map((item) => {
+          return {
+            id: item.id,
+            realname: item.realname,
+            idCard: item.idCard,
+            telphone: item.telPhone,
+            workTypeName: item.categoryName,
+          };
+        });
+        this.dialogVisible = true;
+      }
+    },
+    submitForm(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          this.submitApi();
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+    submitApi() {
+      this.disabledBtn = true;
+      let data = {
+        studyAccountStatusQueryBos: this.list,
+        trainYear: new Date().getFullYear(),
+      };
+      data = Object.assign(data, this.formLabelAlign);
+      this.$api
+        .gradeOpenQdyAccount(data)
+        .then((res) => {
+          this.$message.success("开通成功");
+          this.$emit("backData");
+          this.dialogVisible = false;
+        })
+        .finally(() => {
+          this.disabledBtn = false;
+        });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+/deep/ .el-input-group__append {
+  background-color: #fff;
+  width: 100px;
+  text-align: center;
+  color: #409eff;
+}
+</style>

+ 422 - 59
src/components/searchBoxNew.vue

@@ -6,13 +6,39 @@
         <el-button
           :type="formData.goodsType === item.value ? 'primary' : ''"
           :size="size"
-          v-for="(item, index) in lists"
+          v-for="(item, index) in $methodsTools.getGoodsType(false)"
           :key="index"
           @click="topSearch(item.value)"
           >{{ item.label }}</el-button
         >
       </div>
     </div>
+    <div class="inputListBox" v-if="pendingType">
+      <div class="fon_s">审核状态:</div>
+      <div>
+        <el-button
+          :type="formData.periodStatus === item.value ? 'primary' : ''"
+          :size="size"
+          v-for="(item, index) in pendlists"
+          :key="index"
+          @click="topPendingType(item.value)"
+          >{{ item.label }}</el-button
+        >
+      </div>
+    </div>
+    <div class="inputListBox" v-if="classStatus">
+      <div class="fon_s">开班状态:</div>
+      <div>
+        <el-button
+          :type="formData.classStatus === item.value ? 'primary' : ''"
+          :size="size"
+          v-for="(item, index) in classType"
+          :key="index"
+          @click="topClassType(item.value)"
+          >{{ item.label }}</el-button
+        >
+      </div>
+    </div>
     <div class="inputListBox" v-if="shType">
       <div class="fon_s">审核状态:</div>
       <div>
@@ -26,6 +52,19 @@
         >
       </div>
     </div>
+    <div class="inputListBox" v-if="hoursType">
+      <div class="fon_s">审核状态:</div>
+      <div>
+        <el-button
+          :type="formData.periodStatus === item.value ? 'primary' : ''"
+          :size="size"
+          v-for="(item, index) in lists6"
+          :key="index"
+          @click="topHoursSearchsh(item.value)"
+          >{{ item.label }}</el-button
+        >
+      </div>
+    </div>
     <!-- <div class="inputListBox" v-if="classType">
       <div>
         <el-button
@@ -77,13 +116,27 @@
               :value="items.id"
             ></el-option>
           </el-select>
+          <!-- 项目类型 -->
+          <el-select
+            v-else-if="item.scope === 'projectLevel'"
+            v-model="formData[item.prop]"
+            :placeholder="item.placeholder"
+            :size="size"
+          >
+            <el-option
+              v-for="(items, indexs) in newProjectLevel"
+              :key="indexs"
+              :label="items.projectName"
+              :value="items.id"
+            ></el-option>
+          </el-select>
           <!-- 业务层次 -->
           <el-select
             v-else-if="item.scope === 'businessLevel'"
             v-model="formData[item.prop]"
             :placeholder="item.placeholder"
             :size="size"
-            @change="changeBusinessLevel"
+            @change="changeBusinessLevel($event)"
           >
             <el-option
               v-for="(items, indexs) in newBusinessLevel"
@@ -178,7 +231,35 @@
               :value="items.value"
             ></el-option>
           </el-select>
+          <!-- 证书类型 -->
+          <el-select
+            v-else-if="item.scope === 'certificate'"
+            v-model="formData[item.prop]"
+            :placeholder="item.placeholder"
+            :size="size"
+          >
+            <el-option
+              v-for="(items, indexs) in certificate"
+              :key="indexs"
+              :label="items.certificateName"
+              :value="items.id"
+            ></el-option>
+          </el-select>
           <!-- 考试标题 -->
+          <el-select
+            v-else-if="item.scope === 'examLists'"
+            v-model="formData[item.prop]"
+            :placeholder="item.placeholder"
+            :size="size"
+          >
+            <el-option
+              v-for="(items, indexs) in examLists"
+              :key="indexs"
+              :label="items.applyName"
+              :value="items.applyId"
+            ></el-option>
+          </el-select>
+          <!-- 考试标题:只显示已启用 -->
           <el-select
             v-else-if="item.scope === 'examList'"
             v-model="formData[item.prop]"
@@ -192,7 +273,35 @@
               :value="items.applyId"
             ></el-option>
           </el-select>
-          <!-- 前培标题 -->
+          <!-- 考试地点 -->
+          <el-select
+            v-else-if="item.scope === 'applySiteAddress'"
+            v-model="formData[item.prop]"
+            :placeholder="item.placeholder"
+            :size="size"
+          >
+            <el-option
+              v-for="(items, indexs) in applySiteAddress"
+              :key="indexs"
+              :label="items.siteAddress"
+              :value="item.getType === 1 ? items.siteAddress : items.siteId"
+            ></el-option>
+          </el-select>
+          <!-- 考试地点:手动过滤 -->
+          <el-select
+            v-else-if="item.scope === 'applySiteAddressX'"
+            v-model="formData[item.prop]"
+            :placeholder="item.placeholder"
+            :size="size"
+          >
+            <el-option
+              v-for="(items, indexs) in applySiteAddressX"
+              :key="indexs"
+              :label="items.siteAddress"
+              :value="item.getType === 1 ? items.siteAddress : items.siteId"
+            ></el-option>
+          </el-select>
+          <!-- 前培标题:只显示启用 -->
           <el-select
             v-else-if="item.scope === 'beforeList'"
             v-model="formData[item.prop]"
@@ -206,6 +315,20 @@
               :value="items.beforeId"
             ></el-option>
           </el-select>
+          <!-- 前培标题 -->
+          <el-select
+            v-else-if="item.scope === 'beforeLists'"
+            v-model="formData[item.prop]"
+            :placeholder="item.placeholder"
+            :size="size"
+          >
+            <el-option
+              v-for="(items, indexs) in beforeLists"
+              :key="indexs"
+              :label="items.beforeName"
+              :value="items.beforeId"
+            ></el-option>
+          </el-select>
           <!-- 自定义select -->
           <el-select
             :clearable="item.noClear === false ? false : true"
@@ -255,6 +378,16 @@
             :max="100"
             :size="size"
           ></el-input-number>
+          <el-input
+            v-else-if="item.scope === 'textarea' && formData[item.prop]"
+            type="textarea"
+            :size="size"
+            readonly
+            :rows="3"
+            placeholder="请输入身份证"
+            v-model="formData[item.prop]"
+          >
+          </el-input>
           <el-cascader
             v-else-if="item.scope === 'cascader'"
             v-model="formData[item.prop]"
@@ -305,7 +438,7 @@
           <div v-else-if="item.scope === 'moreDataPicker'">
             <el-date-picker
               v-model="formData[item.prop1]"
-              type="date"
+              :type="item.Diszing ? 'datetime' : 'date'"
               value-format="timestamp"
               :size="size"
               :placeholder="item.placeholder1"
@@ -315,7 +448,7 @@
             <el-date-picker
               style="margin-left: 10px"
               v-model="formData[item.prop2]"
-              type="date"
+              :type="item.Diszing ? 'datetime' : 'date'"
               :size="size"
               value-format="timestamp"
               :placeholder="item.placeholder2"
@@ -324,7 +457,8 @@
             </el-date-picker>
           </div>
           <el-input
-            v-else
+            :style="item.prop === 'searchKey' ? 'width:260px;' : ''"
+            v-else-if="!item.scope"
             clearable
             v-model="formData[item.prop]"
             :placeholder="item.placeholder"
@@ -332,10 +466,18 @@
           ></el-input>
         </el-form-item>
         <el-form-item>
+          <el-button
+            v-if="advanced"
+            :size="size"
+            type="success"
+            @click="emitAdvanced"
+            >{{ advancedName }}</el-button
+          >
           <el-button :size="size" type="primary" @click="search"
             >查询</el-button
           >
           <el-button :size="size" @click="init">重置</el-button>
+          <slot name="customize"></slot>
         </el-form-item>
       </el-form>
     </div>
@@ -344,8 +486,20 @@
 
 <script>
 import { mapGetters } from "vuex";
+import handout from "../newApi/handout";
 export default {
-  props: ["formList", "topType", "formData", "shType", "redIcon"], //参考文档 component.md
+  props: [
+    "formList",
+    "topType",
+    "pendingType",
+    "formData",
+    "shType",
+    "hoursType",
+    "redIcon",
+    "advanced",
+    "advancedName",
+    "classStatus",
+  ], //参考文档 component.md
   data() {
     return {
       tireStatus: "", //当前选择的教育类型tireStatus
@@ -371,21 +525,55 @@ export default {
           value: 4,
         },
       ],
+      classType: [
+        {
+          label: "全部",
+          value: "",
+        },
+        {
+          label: "已开班",
+          value: 1,
+        },
+        {
+          label: "预报名(未开班)",
+          value: 0,
+        },
+      ],
+      pendlists: [
+        {
+          label: "初审",
+          value: 0,
+        },
+        {
+          label: "复审",
+          value: "1,2",
+        },
+      ],
       lists5: [
         {
           label: "全部",
           value: "",
         },
+        {
+          label: "待审核",
+          value: 2,
+        },
+        {
+          label: "不通过",
+          value: 3,
+        },
         {
           label: "通过",
           value: 1,
         },
+      ],
+      lists6: [
         {
           label: "待审核",
           value: 2,
         },
         {
-          label: "不通过",
+          label: "审核中",
           value: 3,
         },
       ],
@@ -440,15 +628,12 @@ export default {
         },
       ], //题目类型
       size: "small", //输入框尺寸类型
-      // formData: {
-      //   status: "0,1",
-      //   pageSize: this.pageSizes,
-      //   pageNum: this.pageNums,
-      // }, //表单数据收集
-      newBusinessLevel: [],
-      newSchoolList: [],
-      newProfessional: [],
-      newSujectType: [],
+      newProjectLevel: [], //项目类型-筛选后的数据
+      newBusinessLevel: [], //业务层次-筛选后的数据
+      newSchoolList: [], //院校-筛选后的数据
+      newProfessional: [], //专业-筛选后的数据
+      newSujectType: [], //科目-筛选后的数据
+      applySiteAddressX: [], //考试地点-根据考试计划过滤而来
       pickerOptions: {
         //日期选择器近期功能
         shortcuts: [
@@ -484,7 +669,19 @@ export default {
     };
   },
   computed: {
-    ...mapGetters(["educationType", "Professional", "examList", "beforeList"]),
+    ...mapGetters([
+      "educationType",
+      "Professional",
+      "examList",
+      "examLists",
+      "beforeList",
+      "beforeLists",
+      "applySiteAddress",
+      "certificate",
+    ]),
+    /**
+     * @remarks 过滤选择器列表
+     */
     formListComput: function () {
       return function (item) {
         var newOption = JSON.parse(JSON.stringify(item));
@@ -497,40 +694,109 @@ export default {
           ) {
             if (!this.formData[items.edu]) {
             } else {
-              const indexType = this.educationType.findIndex((its) => {
-                return its.id === this.formData[items.edu];
-              });
+              if (this.educationType) {
+                const indexType = this.educationType.findIndex((its) => {
+                  return its.id === this.formData[items.edu];
+                });
+                if (
+                  items.scope === "businessLevel" &&
+                  this.educationType[indexType].tireStatus.indexOf("2") !== -1
+                ) {
+                  return items;
+                }
+                if (
+                  items.scope === "schoolList" &&
+                  this.educationType[indexType].tireStatus.indexOf("3") !==
+                    -1 &&
+                  this.formData["businessId"]
+                ) {
+                  return items;
+                }
+                if (
+                  items.scope === "Professional" &&
+                  this.educationType[indexType].tireStatus.indexOf("4") !==
+                    -1 &&
+                  this.formData["businessId"]
+                ) {
+                  return items;
+                }
+                if (
+                  items.scope === "sujectType" &&
+                  this.formData["businessId"]
+                ) {
+                  return items;
+                }
+              }
+            }
+          } else {
+            if (items.diff === "gfxs") {
               if (
-                items.scope === "businessLevel" &&
-                this.educationType[indexType].tireStatus.indexOf("2") !== -1
+                this.formData["studyStatus"] == 2 &&
+                this.formData["periodStatus"] == 1
               ) {
                 return items;
               }
-              if (
-                items.scope === "schoolList" &&
-                this.educationType[indexType].tireStatus.indexOf("3") !== -1
-              ) {
+            } else if (items.diff === "ksdd") {
+              if (this.formData["applyId"]) {
                 return items;
               }
-              if (
-                items.scope === "Professional" &&
-                this.educationType[indexType].tireStatus.indexOf("4") !== -1
-              ) {
+            } else if (items.scope === "projectLevel") {
+              if (this.formData["educationId"]) {
                 return items;
               }
+            } else {
+              return items;
             }
-          } else {
-            return items;
           }
         });
         return arrsy;
       };
     },
   },
-  created() {
-    var self = this;
+  watch: {
+    /**
+     *
+     * @param {Number} val
+     * @remards 考试计划监听-获取对应考试地点
+     */
+    "formData.applyId"(val) {
+      const Astatus = this.formList.some((item) => {
+        return item.scope === "applySiteAddressX";
+      });
+      if (Astatus) {
+        this.getChangeAdress(val);
+        if (this.formData.applySiteAddress) {
+          this.formData.applySiteAddress = "";
+        }
+      }
+    },
   },
   methods: {
+    /**
+     * 手动过滤考试地点
+     */
+    getChangeAdress(id) {
+      this.$api
+        .inquirepayservesiteInfo({
+          applyId: id,
+          addressStatus: 1,
+        })
+        .then((res) => {
+          this.applySiteAddressX = res.rows;
+        });
+    },
+    /**
+     * @remark 高级搜索
+     */
+    emitAdvanced() {
+      this.$emit("Advanced", this.formData);
+    },
+    /**
+     *
+     * @param {int} data1
+     * @param {int} data2
+     * @remark 日期搜索-时间开始选择器触发
+     */
     change1(data1, data2) {
       if (this.formData[data1]) {
         if (
@@ -542,6 +808,12 @@ export default {
         }
       }
     },
+    /**
+     *
+     * @param {int} data1
+     * @param {int} data2
+     * @remark 日期搜索-时间结束选择器触发
+     */
     change2(data1, data2) {
       if (this.formData[data2]) {
         if (
@@ -553,22 +825,69 @@ export default {
         }
       }
     },
+    /**
+     *
+     * @param {int} status
+     * @remark 顶部定制按钮-根据商品类型点击快速搜索
+     */
     topSearch(status) {
       this.formData.goodsType = status;
       this.$emit("search", 3);
     },
+    /**
+     *
+     * @param {int} status
+     * @remark 顶部定制按钮-根据审核状态类型点击快速搜索
+     */
+    topPendingType(status) {
+      this.formData.periodStatus = status;
+      this.$emit("search", 4);
+    },
+    /**
+     *
+     * @param {int} status
+     * @remark 顶部定制按钮-根据审核状态类型点击快速搜索
+     */
+    topClassType(status) {
+      this.formData.classStatus = status;
+      this.$emit("search", 4);
+    },
+    /**
+     *
+     * @param {int} status
+     * @remark 顶部定制按钮-根据审核状态点击快速搜索
+     */
     topSearchsh(types) {
       this.formData.status = types;
       this.$emit("search", 3);
     },
-    //搜索
+    /**
+     *
+     * @param {int} status
+     * @remark 顶部定制按钮-根据学时审核状态点击快速搜索
+     */
+    topHoursSearchsh(types) {
+      this.formData.periodStatus = types;
+      this.$emit("search", 2);
+    },
+    /**
+     * @remark 搜索
+     */
     search() {
       this.$emit("search", 1);
     },
-    //重置
+    /**
+     * @remark 重置
+     */
     init() {
       this.$emit("init");
     },
+    /**
+     *
+     * @param {int} int1
+     * @param {int} int2
+     * @remark 数值取值范围选择器
+     */
     handleChanges(int1, int2) {
       if (int1 !== undefined && int2 !== undefined) {
         if (int1 > int2) {
@@ -576,46 +895,90 @@ export default {
         }
       }
     },
-    changeEducationType(id) {
+    /**
+     *
+     * @param {int} id
+     * @param {bool} status1 //是否不清空业务层级
+     * @remark 点击教育类型触发事件
+     */
+    changeEducationType(id, status1) {
+      if (!id) {
+        return;
+      }
       const indexs = this.educationType.findIndex((item) => {
         return item.id === id;
       });
       this.tireStatus = this.educationType[indexs].tireStatus;
-      if (this.formData.businessId) {
-        this.formData.businessId = "";
-      }
-      if (this.formData.schoolId) {
-        this.formData.schoolId = "";
-      }
-      if (this.formData.ProfessionalId) {
-        this.formData.ProfessionalId = "";
+      if (!status1) {
+        if (this.formData.projectId) {
+          this.formData.projectId = "";
+        }
+        if (this.formData.businessId) {
+          this.formData.businessId = "";
+        }
       }
       if (this.formData.subjectId) {
         this.formData.subjectId = "";
       }
       this.$api
-        .inquirebusinessList({ status: 1, educationId: id })
-        .then((res) => {
-          this.newBusinessLevel = res.rows;
-        });
-
-      this.$api
-        .inquireUserSchool({ status: 1, educationId: id })
+        .inquireCourseProjectType({ status: 1, educationId: id })
         .then((res) => {
-          this.newSchoolList = res.rows;
+          this.newProjectLevel = res.rows;
         });
       this.$api
-        .inquireCourseMajor({ status: 1, educationId: id })
+        .inquirebusinessList({ status: 1, educationId: id })
         .then((res) => {
-          this.newProfessional = res.rows;
+          this.newBusinessLevel = res.rows;
         });
+      if (!status1) {
+        this.$api
+          .inquireCourseSubject({ status: 1, educationId: id })
+          .then((res) => {
+            this.newSujectType = res.rows;
+          });
+      }
+    },
+    /**
+     *
+     * @param {int} id
+     * @remark 点击业务层次触发事件
+     */
+    changeBusinessLevel(v) {
+      if (this.formData.schoolId) {
+        this.formData.schoolId = "";
+      }
+      this.$api.inquireUserSchool({ status: 1, businessId: v }).then((res) => {
+        this.newSchoolList = res.rows;
+      });
+      if (this.formData.majorId) {
+        this.formData.majorId = "";
+      }
+      this.$api.inquireCourseMajor({ status: 1, businessId: v }).then((res) => {
+        this.newProfessional = res.rows;
+      });
+      if (this.formData.subjectId) {
+        this.formData.subjectId = "";
+      }
       this.$api
-        .inquireCourseSubject({ status: 1, educationId: id })
+        .inquireCourseSubject({ status: 1, businessId: v })
         .then((res) => {
           this.newSujectType = res.rows;
         });
     },
-    changeBusinessLevel(id) {},
+    /**
+     * 外部调用-商品新增编辑页
+     */
+    changeSuject(v) {
+      if (v) {
+        this.$api
+          .inquireCourseSubject({ status: 1, projectId: v })
+          .then((res) => {
+            this.newSujectType = res.rows;
+          });
+      } else {
+        this.newSujectType = [];
+      }
+    },
   },
 };
 </script>
@@ -651,4 +1014,4 @@ export default {
     margin-bottom: 0px;
   }
 }
-</style>
+</style>

+ 0 - 2084
src/components/tableList copy.vue

@@ -1,2084 +0,0 @@
-<template>
-  <div id="tableList">
-    <div class="headerNavTool">
-      <div class="leftIndexText">
-        {{ navText.title }} <strong>{{ navText.index }}</strong>
-        {{ navText.ch }}
-      </div>
-      <div class="rightBtnBox">
-        <slot name="customize"></slot>
-        <el-button
-          size="medium"
-          type="primary"
-          @click="addClick"
-          v-if="!navText.addHide"
-          >添加</el-button
-        >
-        <el-button
-          v-if="navText.backFatherBtn.status"
-          size="medium"
-          type="warning"
-          @click="backFather"
-          >{{ navText.backFatherBtn.title }}</el-button
-        >
-        <el-popover
-          popper-class="slotPopper"
-          placement="bottom-end"
-          trigger="click"
-        >
-          <div class="popoverDis">
-            <div class="checkboxHeader">
-              <el-checkbox
-                :indeterminate="isIndeterminate"
-                v-model="checkAll"
-                @change="handleCheckAllChange"
-                >列展示</el-checkbox
-              >
-              <div class="initbtns" @click="initVue">重置</div>
-            </div>
-
-            <div
-              style="height: 1px; width: 100%; background-color: #eaeefb"
-            ></div>
-            <el-checkbox-group
-              class="checkboxGroup"
-              v-model="checkedCities"
-              @change="handleCheckedCitiesChange"
-            >
-              <div
-                class="checkboxchild"
-                v-for="(item, index) in cities"
-                :key="index"
-              >
-                <el-checkbox
-                  :label="item"
-                  @change="checkboxChange(item, $event)"
-                  >{{ item }}</el-checkbox
-                >
-                <div class="icon-right">
-                  <i class="el-icon-upload2" @click="upMove(item, index)"></i>
-                  <i
-                    class="el-icon-download"
-                    @click="downMove(item, index)"
-                  ></i>
-                </div>
-              </div>
-            </el-checkbox-group>
-          </div>
-          <el-button style="margin-left: 10px" size="medium" slot="reference"
-            >自定义列</el-button
-          >
-        </el-popover>
-      </div>
-    </div>
-    <el-table
-      :data="tableData"
-      stripe
-      style="width: 100%"
-      @select-all="selectAll"
-      @select="select"
-      :row-key="rowKey"
-      :load="load"
-      :cell-style="timeStyle"
-      lazy
-      :border="true"
-      ref="pagerset"
-      v-loading="loading"
-      :header-cell-style="{
-        'background-color': '#eee',
-        color: '#333',
-        fontSize: '14px',
-      }"
-      :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
-    >
-      <el-table-column
-        v-if="navText.choice"
-        align="center"
-        type="selection"
-        width="55"
-        header-align="center"
-        fixed="left"
-      >
-      </el-table-column>
-      <!-- v-if="navText.num" ↓ -->
-      <el-table-column
-        type="index"
-        label="序号"
-        width="70"
-        align="center"
-        header-align="center"
-      >
-      </el-table-column>
-      <template v-for="(item, index) in tableSet">
-        <el-table-column
-          v-if="item.hidden"
-          :width="item.width"
-          :key="index"
-          :label="item.label"
-          align="center"
-          :sortable="item.prop === 'sort' || item.sort"
-          :sort-method="sortMethods"
-          :show-overflow-tooltip="item.showTooltip ? false : true"
-          header-align="center"
-          :prop="item.prop"
-          sort-by="sort"
-        >
-          <template slot-scope="scope">
-            <div class="imgboxsq" v-if="item.scope === 'img'">
-              <el-image
-                class="el_images"
-                lazy
-                :src="$methodsTools.splitImgHost(scope.row[item.prop])"
-                style="height: 100%"
-                :preview-src-list="[
-                  $methodsTools.splitImgHost(scope.row[item.prop]),
-                ]"
-                alt="加载失败..."
-              >
-              </el-image>
-            </div>
-            <span v-else-if="item.scope === 'status'">{{
-              Number(scope.row[item.prop]) === 1
-                ? "启用"
-                : Number(scope.row[item.prop]) === 0
-                ? "关闭"
-                : Number(scope.row[item.prop]) === -1
-                ? "已删除"
-                : "未知"
-            }}</span>
-            <span v-else-if="item.scope === 'hasTime'">{{
-              Number(scope.row[item.prop]) === 1
-                ? "有效"
-                : Number(scope.row[item.prop]) === 0
-                ? "无效"
-                : "未知"
-            }}</span>
-            <span v-else-if="item.scope === 'statusZpFB'">{{
-              Number(scope.row[item.prop]) === 1
-                ? "未发布"
-                : Number(scope.row[item.prop]) === 2
-                ? "已发布"
-                : Number(scope.row[item.prop]) === 0
-                ? "停用"
-                : Number(scope.row[item.prop]) === -1
-                ? "已删除"
-                : "未知"
-            }}</span>
-            <span v-else-if="item.scope === 'reStatus'">{{
-              Number(scope.row[item.prop]) === 1
-                ? "定时发布"
-                : Number(scope.row[item.prop]) === 0
-                ? "手动发布"
-                : "未知"
-            }}</span>
-            <span v-else-if="item.scope === 'fabStatus'">{{
-              Number(scope.row[item.prop]) === 1
-                ? "发布"
-                : Number(scope.row[item.prop]) === 0
-                ? "未发布"
-                : "未知"
-            }}</span>
-            <span v-else-if="item.scope === 'sectionTypes'">{{
-              Number(scope.row[item.prop]) === 2
-                ? "录播"
-                : Number(scope.row[item.prop]) === 1
-                ? "直播"
-                : Number(scope.row[item.prop]) === 3
-                ? "回放"
-                : "未知"
-            }}</span>
-            <span v-else-if="item.scope === 'getShops'">
-              {{
-                scope.row["goodsCode"] +
-                "-" +
-                scope.row["goodsName"] +
-                " (" +
-                scope.row["educationName"] +
-                "-" +
-                scope.row["projectName"] +
-                "-" +
-                scope.row["businessName"] +
-                ")"
-              }}
-            </span>
-            <span
-              v-else-if="
-                item.scope === 'treeWatch' &&
-                (scope.row['goodsType'] === 1 || scope.row['goodsType'] === 2)
-              "
-              style="color: blue"
-              @click="
-                scope.row['goodsType'] === 1
-                  ? diavios(scope.row['goodsId'])
-                  : diaviosTK(scope.row['goodsId'])
-              "
-              >结构树视图</span
-            >
-            <span v-else-if="item.scope === 'leftCh'">
-              {{ item.ch }}{{ scope.row[item.prop] }}
-            </span>
-            <span
-              v-else-if="item.scope === 'goodsIds'"
-              class="editInfoSty"
-              @click="editInfo(scope.row, 3)"
-            >
-              {{
-                !scope.row[item.prop]
-                  ? 0
-                  : scope.row[item.prop].split(",").map(Number).length
-              }}
-            </span>
-            <span
-              v-else-if="item.scope === 'jumpPeolpe'"
-              class="editInfoSty"
-              @click="jumpPeolpe(scope.row, item.type)"
-            >
-            {{scope.row[item.prop]}}
-            </span>
-            <span v-else-if="item.scope === 'sectionTypesTTT'">{{
-              Number(scope.row[item.prop]) === 1
-                ? "录播"
-                : Number(scope.row[item.prop]) === 2
-                ? "直播"
-                : Number(scope.row[item.prop]) === 3
-                ? "回放"
-                : ""
-            }}</span>
-            <span v-else-if="item.scope === 'ggType'">{{
-              Number(scope.row[item.prop]) === 1
-                ? "学习中心"
-                : Number(scope.row[item.prop]) === 2
-                ? "求职中心"
-                : "未知"
-            }}</span>
-            <ul v-else-if="item.scope === 'mapTypesTeacher'" class="ulAuto">
-              <template v-for="(itm, inds) in scope.row[item.prop]">
-                <li :key="inds" v-if="inds < 2">
-                  {{ itm.educationName + "-" + itm.projectName
-                  }}{{ inds === 0 ? ", " : "" }}
-                </li>
-              </template>
-              <el-popover
-                :key="Math.random()"
-                placement="right"
-                trigger="click"
-              >
-                <ul>
-                  <li v-for="(itm, inds) in scope.row[item.prop]" :key="inds">
-                    {{ inds + 1 }}、
-                    {{ itm.educationName + "-" + itm.projectName }}
-                  </li>
-                </ul>
-                <el-button
-                  slot="reference"
-                  style="margin-left: 6px"
-                  type="text"
-                  v-if="scope.row[item.prop].length > 2"
-                  size="mini"
-                  >更多</el-button
-                >
-              </el-popover>
-            </ul>
-            <span v-else-if="item.scope === 'goodsInfos'">
-              {{ scope.row[item.prop1] + "-" + scope.row[item.prop2] + "-"
-              }}<span style="color: red">¥{{ scope.row[item.prop3] }}</span>
-            </span>
-            <div v-else-if="item.scope === 'applyInfos'">
-              <div
-                v-for="(items, indexs) in scope.row[item.prop]"
-                :key="indexs"
-              >
-                <div>{{ items.siteAddress }}</div>
-                <div
-                  v-for="(itemsxs, indexsxs) in items.examApplySiteTime"
-                  :key="indexsxs"
-                >
-                  <div v-for="(ks, ds) in itemsxs.siteTime" :key="ds">
-                    {{ $methodsTools.onlyForma(itemsxs.examTime, false) }}
-                    {{ ks.startTime.replace("-", ":") }}-{{
-                      ks.endTime.replace("-", ":")
-                    }}
-                  </div>
-                </div>
-              </div>
-            </div>
-            <ul v-else-if="item.scope === 'moreGoodsList'" class="ulAuto">
-              <template v-for="(itm, inds) in scope.row[item.prop]">
-                <li :key="inds" v-if="inds < 1">
-                  {{ itm[item.prop1] + "-" + itm[item.prop2] + "-" }}
-                  <span style="color: red">¥{{ itm[item.prop3] }}</span>
-                </li>
-              </template>
-              <el-popover
-                :key="Math.random()"
-                placement="right"
-                trigger="click"
-              >
-                <ul>
-                  <li v-for="(itm, inds) in scope.row[item.prop]" :key="inds">
-                    {{ inds + 1 }}、
-                    {{ itm[item.prop1] + "-" + itm[item.prop2] + "-" }}
-                    <span style="color: red">¥{{ itm[item.prop3] }}</span>
-                  </li>
-                </ul>
-                <el-button
-                  slot="reference"
-                  style="margin-left: 6px"
-                  type="text"
-                  v-if="scope.row[item.prop].length >= 2"
-                  size="mini"
-                  >更多</el-button
-                >
-              </el-popover>
-            </ul>
-            <ul v-else-if="item.scope === 'mapTypes'" class="ulAuto">
-              <template v-for="(itm, inds) in scope.row[item.prop]">
-                <li :key="inds" v-if="inds === 0">
-                  {{ itm.educationName + "-" + itm.projectName }}
-                </li>
-              </template>
-              <el-popover
-                :key="Math.random()"
-                placement="right"
-                trigger="click"
-              >
-                <ul>
-                  <li v-for="(itm, inds) in scope.row[item.prop]" :key="inds">
-                    {{ inds + 1 }}、
-                    {{ itm.educationName + "-" + itm.projectName }}
-                  </li>
-                </ul>
-                <el-button
-                  slot="reference"
-                  style="margin-left: 6px"
-                  type="text"
-                  v-if="scope.row[item.prop].length > 1"
-                  size="mini"
-                  >更多</el-button
-                >
-              </el-popover>
-            </ul>
-            <ul v-else-if="item.scope === 'mapTypesBUS'" class="ulAuto">
-              <template v-for="(itm, inds) in scope.row[item.prop]">
-                <li :key="inds" v-if="inds === 0">
-                  {{
-                    itm.educationName +
-                    "-" +
-                    itm.projectName +
-                    "-" +
-                    itm.businessName
-                  }}
-                </li>
-              </template>
-              <el-popover
-                :key="Math.random()"
-                placement="right"
-                trigger="click"
-              >
-                <ul>
-                  <li v-for="(itm, inds) in scope.row[item.prop]" :key="inds">
-                    {{ inds + 1 }}、
-                    {{
-                      itm.educationName +
-                      "-" +
-                      itm.projectName +
-                      "-" +
-                      itm.businessName
-                    }}
-                  </li>
-                </ul>
-                <el-button
-                  slot="reference"
-                  style="margin-left: 6px"
-                  type="text"
-                  v-if="scope.row[item.prop].length > 1"
-                  size="mini"
-                  >更多</el-button
-                >
-              </el-popover>
-            </ul>
-            <div v-else-if="item.scope === 'splits'" class="dis_sdt">
-              <ul>
-                <template v-for="(itm, inds) in scope.row[item.prop]">
-                  <li :key="inds" v-if="inds < 2">
-                    {{ itm }}
-                  </li>
-                </template>
-              </ul>
-              <el-popover
-                :key="Math.random()"
-                placement="right"
-                trigger="click"
-              >
-                <ul>
-                  <li v-for="(itm, inds) in scope.row[item.prop]" :key="inds">
-                    {{ inds + 1 }}、
-                    {{ itm }}
-                  </li>
-                </ul>
-                <el-button
-                  slot="reference"
-                  style="margin-left: 6px"
-                  type="text"
-                  v-if="scope.row[item.prop].length > 2"
-                  size="mini"
-                  >更多</el-button
-                >
-              </el-popover>
-            </div>
-
-            <ul v-else-if="item.scope === 'classNums'" class="ulAutos">
-              <li
-                style="font-size: 12px; cursor: pointer; color: #1890ff"
-                v-if="!scope.row[item.prop].length"
-              >
-                班级({{ scope.row[item.prop].length }})
-              </li>
-              <el-popover
-                :key="Math.random()"
-                placement="right"
-                trigger="click"
-              >
-                <ul>
-                  <li
-                    v-for="(itm, inds) in scope.row[item.prop]"
-                    :key="inds"
-                    class="jumpClass"
-                    @click="jumpClass(itm)"
-                  >
-                    {{ inds + 1 }}、
-                    {{ itm.gradeName }}
-                  </li>
-                </ul>
-                <el-button
-                  v-if="scope.row[item.prop].length"
-                  slot="reference"
-                  type="text"
-                  size="mini"
-                  >班级({{ scope.row[item.prop].length }})</el-button
-                >
-              </el-popover>
-            </ul>
-            <div v-else-if="item.scope === 'goodsList'" class="ulAuto">
-              <ul>
-                <template v-for="(itm, inds) in scope.row[item.prop]">
-                  <li :key="inds" v-if="inds === 0">
-                    {{ itm.goodsName }}
-                  </li>
-                </template>
-              </ul>
-              <el-popover
-                :key="Math.random()"
-                placement="right"
-                trigger="click"
-              >
-                <ul>
-                  <li v-for="(itm, inds) in scope.row[item.prop]" :key="inds">
-                    {{ inds + 1 }}、
-                    {{ itm.goodsName }}
-                  </li>
-                </ul>
-                <el-button
-                  slot="reference"
-                  style="margin-left: 6px"
-                  type="text"
-                  v-if="scope.row[item.prop].length > 1"
-                  size="mini"
-                  >更多</el-button
-                >
-              </el-popover>
-            </div>
-            <div v-else-if="item.scope === 'aboutChapter'" class="ulAuto">
-              <ul>
-                <template v-for="(itm, inds) in scope.row[item.prop]">
-                  <li
-                    class="jumpStys"
-                    :key="inds"
-                    v-if="inds === 0"
-                    @click="jumpPages(itm, item.int)"
-                  >
-                    {{ itm[item.prop1] }}
-                  </li>
-                </template>
-              </ul>
-              <el-popover
-                :key="Math.random()"
-                placement="right"
-                trigger="click"
-              >
-                <ul>
-                  <li
-                    v-for="(itm, inds) in scope.row[item.prop]"
-                    :key="inds"
-                    class="jumpStys"
-                    @click="jumpPages(itm, item.int)"
-                  >
-                    {{ inds + 1 }}、
-                    {{ itm[item.prop1] }}
-                  </li>
-                </ul>
-                <el-button
-                  slot="reference"
-                  style="margin-left: 6px"
-                  type="text"
-                  v-if="scope.row[item.prop].length > 1"
-                  size="mini"
-                  >更多</el-button
-                >
-              </el-popover>
-            </div>
-            <ul v-else-if="item.scope === 'mapTypesMores'" class="ulAuto">
-              <template v-for="(itm, inds) in scope.row[item.prop]">
-                <li :key="inds" v-if="inds === 0">
-                  {{
-                    itm.educationName +
-                    "-" +
-                    itm.projectName +
-                    "-" +
-                    itm.businessName +
-                    "-" +
-                    itm.subjectName
-                  }}
-                </li>
-              </template>
-              <el-popover
-                :key="Math.random()"
-                placement="right"
-                trigger="click"
-              >
-                <ul>
-                  <li v-for="(itm, inds) in scope.row[item.prop]" :key="inds">
-                    {{ inds + 1 }}、
-                    {{
-                      itm.educationName +
-                      "-" +
-                      itm.projectName +
-                      "-" +
-                      itm.businessName +
-                      "-" +
-                      itm.subjectName
-                    }}
-                  </li>
-                </ul>
-                <el-button
-                  slot="reference"
-                  style="margin-left: 6px"
-                  type="text"
-                  v-if="scope.row[item.prop].length > 1"
-                  size="mini"
-                  >更多</el-button
-                >
-              </el-popover>
-            </ul>
-            <span v-else-if="item.scope === 'statusRe'">{{
-              Number(scope.row[item.prop]) === 0
-                ? "已删除"
-                : Number(scope.row[item.prop]) === 1 &&
-                  Number(scope.row["reStatus"]) === 1
-                ? "待发布"
-                : Number(scope.row[item.prop]) === 1 &&
-                  Number(scope.row["reStatus"]) === 0
-                ? "未发布"
-                : Number(scope.row[item.prop]) === 2
-                ? "已撤回"
-                : Number(scope.row[item.prop]) === 3
-                ? "已发布"
-                : Number(scope.row[item.prop]) === 4
-                ? "已到期"
-                : "未知"
-            }}</span>
-            <span v-else-if="item.scope === 'TimeVoBtn'">
-              <el-popover :key="Math.random()" placement="left" trigger="click">
-                <div
-                  v-for="(items, indexs) in scope.row[item.prop]"
-                  :key="indexs"
-                  style="margin-bottom: 6px"
-                >
-                  {{ $methodsTools.onlyForma(items.startTime) }} ~
-                  {{ $methodsTools.onlyForma(items.endTime) }}
-                </div>
-                <el-button slot="reference" size="mini">查看</el-button>
-              </el-popover>
-            </span>
-            <div v-else-if="item.scope === 'video'">
-              <i
-                v-if="scope.row[item.prop][item.prop1] !== null"
-                class="el-icon-video-play cvideo"
-                @click="
-                  openVideo(
-                    $methodsTools.splitImgHost(scope.row[item.prop][item.prop1])
-                  )
-                "
-              ></i>
-            </div>
-            <div
-              v-else-if="item.scope === 'PDF'"
-              style="display: flex; align-items: center"
-            >
-              <a
-                v-if="scope.row[item.prop][item.prop1] !== null"
-                :href="
-                  $methodsTools.splitImgHost(scope.row[item.prop][item.prop1])
-                "
-                target="_blank"
-                style="
-                  display: block;
-                  width: 35px;
-                  height: 45px;
-                  margin-right: 10px;
-                "
-              >
-                <img class="imgHover" src="@/assets/images/pdf@3x.png" alt="" />
-              </a>
-              <div>{{ scope.row[item.prop][item.prop2] }}</div>
-            </div>
-            <span v-else-if="item.scope === 'Salary'">
-              {{ scope.row[item.prop1] === 1 ? "月薪" : "年薪" }}
-              {{
-                scope.row[item.prop2] === scope.row[item.prop3]
-                  ? scope.row[item.prop2]
-                  : scope.row[item.prop2] + "~" + scope.row[item.prop3]
-              }}
-            </span>
-            <div v-else-if="item.scope === 'changAdress'">
-              <div>{{ scope.row[item.prop1] }}</div>
-              <div>
-                {{ $methodsTools.onlyForma(scope.row[item.prop2], false) }}
-                <span
-                  >{{
-                    scope.row[item.prop3]
-                      ? scope.row[item.prop3].replace("-", ":")
-                      : scope.row[item.prop3]
-                  }}-{{
-                    scope.row[item.prop4]
-                      ? scope.row[item.prop4].replace("-", ":")
-                      : scope.row[item.prop4]
-                  }}</span
-                >
-              </div>
-            </div>
-            <span v-else-if="item.scope === 'activityType'">{{
-              Number(scope.row[item.prop]) === 0
-                ? "优惠券"
-                : Number(scope.row[item.prop]) === 1
-                ? "折扣券"
-                : Number(scope.row[item.prop]) === 2
-                ? "线上直播"
-                : Number(scope.row[item.prop]) === 3
-                ? "定价"
-                : Number(scope.row[item.prop]) === 4
-                ? "优惠"
-                : Number(scope.row[item.prop]) === 5
-                ? "折扣"
-                : Number(scope.row[item.prop]) === 6
-                ? "线下活动"
-                : "未知"
-            }}</span>
-            <span v-else-if="item.scope === 'activityRemarks'">{{
-              Number(scope.row[item.prop]) === 0
-                ? "金额:¥" + scope.row["price"]
-                : Number(scope.row[item.prop]) === 1
-                ? "折扣:" + scope.row["price"] + "折"
-                : Number(scope.row[item.prop]) === 2
-                ? "直播内容:" + scope.row["liveContent"]
-                : Number(scope.row[item.prop]) === 3
-                ? "商品金额:¥" + scope.row["price"]
-                : Number(scope.row[item.prop]) === 4
-                ? "优惠金额:¥" + scope.row["price"]
-                : Number(scope.row[item.prop]) === 5
-                ? "商品折扣:" + scope.row["price"] + "折"
-                : Number(scope.row[item.prop]) === 6
-                ? "活动地点:" + scope.row["liveAdress"]
-                : "未知"
-            }}</span>
-            <span v-else-if="item.scope === 'isUrgent'">{{
-              scope.row[item.prop] === 0
-                ? "不是"
-                : scope.row[item.prop] === 1
-                ? "是"
-                : "未知"
-            }}</span>
-            <span v-else-if="item.scope === 'gfStatus'">{{
-              scope.row[item.prop] === 0
-                ? "否"
-                : scope.row[item.prop] === 1
-                ? "是"
-                : "未知"
-            }}</span>
-            <span v-else-if="item.scope === 'refundPrice'">
-              {{
-                scope.row["goodsRealPrice"] && scope.row["goodsReceived"]
-                  ? Number(scope.row["goodsRealPrice"]) -
-                    Number(scope.row["goodsReceived"]) +
-                    "元"
-                  : ""
-              }}
-            </span>
-            <span v-else-if="item.scope === 'peopleNum'">{{
-              scope.row[item.prop] === 0 ? "不限制" : scope.row[item.prop]
-            }}</span>
-            <span v-else-if="item.scope === 'address'"
-              >{{
-                scope.row[item.prop1] +
-                scope.row[item.prop2] +
-                scope.row[item.prop3]
-              }}{{ scope.row[item.prop4] ? scope.row[item.prop4] : "" }}</span
-            >
-            <span v-else-if="item.scope === 'statusActivity'">{{
-              Number(scope.row[item.prop]) === 0
-                ? "已删除"
-                : Number(scope.row[item.prop]) === 1
-                ? "已结束"
-                : Number(scope.row[item.prop]) === 2
-                ? "已撤回"
-                : Number(scope.row[item.prop]) === 3
-                ? "已开始"
-                : Number(scope.row[item.prop]) === 4
-                ? "未开始"
-                : "未知"
-            }}</span>
-            <span v-else-if="item.scope === 'sex'">
-              {{
-                scope.row[item.prop] == 1
-                  ? "男"
-                  : scope.row[item.prop] == 2
-                  ? "女"
-                  : "未知"
-              }}
-            </span>
-            <span v-else-if="item.scope === 'statusFB'">{{
-              scope.row[item.prop] === 0
-                ? "删除"
-                : scope.row[item.prop] === 1
-                ? "发布"
-                : scope.row[item.prop] === 2
-                ? "撤回"
-                : scope.row[item.prop] === 3
-                ? "未发布"
-                : "未知"
-            }}</span>
-            <span v-else-if="item.scope === 'typeStatus'">{{
-              scope.row[item.prop] === 0
-                ? "报名指引"
-                : scope.row[item.prop] === 1
-                ? "打印准考证"
-                : scope.row[item.prop] === 2
-                ? "成绩查询指引"
-                : "未知"
-            }}</span>
-            <span v-else-if="item.scope === 'typeId'">{{
-              scope.row[item.prop] === 1
-                ? "普通练习"
-                : scope.row[item.prop] === 2
-                ? "押题试卷"
-                : scope.row[item.prop] === 3
-                ? "真题试卷"
-                : "未知"
-            }}</span>
-            <span v-else-if="item.scope === 'taskType'">{{
-              scope.row[item.prop] === 0
-                ? "每日签到"
-                : scope.row[item.prop] === 1
-                ? "完善信息"
-                : scope.row[item.prop] === 2
-                ? "邀请好友"
-                : scope.row[item.prop] === 3
-                ? "每日分享"
-                : scope.row[item.prop] === 4
-                ? "视频学习"
-                : scope.row[item.prop] === 5
-                ? "模拟考试"
-                : "未知"
-            }}</span>
-            <span v-else-if="item.scope === 'releaseType'">{{
-              scope.row[item.prop] === 0
-                ? "手动发布"
-                : scope.row[item.prop] === 1
-                ? "定时发布"
-                : "未知"
-            }}</span>
-            <span v-else-if="item.scope === 'releaseStatus'">{{
-              scope.row[item.prop] === 0
-                ? "删除"
-                : scope.row[item.prop] === 1
-                ? "待发布"
-                : scope.row[item.prop] === 2
-                ? "撤回"
-                : scope.row[item.prop] === 3
-                ? "发布成功"
-                : scope.row[item.prop] === 4
-                ? "未发布"
-                : scope.row[item.prop] === 5
-                ? "已结束"
-                : "未知"
-            }}</span>
-            <div v-else-if="item.scope === 'knowledge'" class="overSty">
-              <el-button
-                type="success"
-                size="small"
-                v-for="(items, ks) in scope.row[item.prop]"
-                :key="ks"
-              >
-                {{ items.knowledgeName }}
-              </el-button>
-            </div>
-            <span v-else-if="item.scope === 'numberAll'">{{
-              scope.row[item.prop1] + scope.row[item.prop2]
-            }}</span>
-            <span v-else-if="item.scope === 'moreLists'">{{
-              scope.row[item.prop1] + " ~ " + scope.row[item.prop2]
-            }}</span>
-            <span v-else-if="item.scope === 'resultType'">
-              {{ scope.row[item.prop1] }}
-              <span
-                :style="
-                  scope.row[item.prop2] === 1
-                    ? 'color:purple'
-                    : scope.row[item.prop2] === 0
-                    ? 'color:red;'
-                    : ''
-                "
-              >
-                {{
-                  scope.row[item.prop2] === 1
-                    ? "通过"
-                    : scope.row[item.prop2] === 0
-                    ? "不通过"
-                    : ""
-                }}
-              </span>
-            </span>
-            <span v-else-if="item.scope === 'TimeLists'"
-              >{{
-                $methodsTools.onlyForma(scope.row[item.prop1], item.Diszing)
-              }}
-              至
-              {{
-                $methodsTools.onlyForma(scope.row[item.prop2], item.Diszing)
-              }}</span
-            >
-            <span v-else-if="item.scope === 'aTimeList'">{{
-              scope.row[item.prop] === null
-                ? "--"
-                : $methodsTools.onlyForma(scope.row[item.prop])
-            }}</span>
-            <div v-else-if="item.scope === 'inputs'">
-              <el-input-number
-                style="width: 50px"
-                size="small"
-                :controls="false"
-                v-model="scope.row[item.prop]"
-                controls-position="right"
-                :min="0"
-              ></el-input-number>
-            </div>
-            <span v-else-if="item.scope === 'topic'">{{
-              scope.row[item.prop] === 1
-                ? "单选题"
-                : scope.row[item.prop] === 2
-                ? "多选题"
-                : scope.row[item.prop] === 3
-                ? "判断题"
-                : scope.row[item.prop] === 4
-                ? "案例题"
-                : scope.row[item.prop] === 5
-                ? "简答题"
-                : "未知"
-            }}</span>
-            <span v-else-if="item.scope === 'typeStatusName'">{{
-              scope.row[item.prop] === 1
-                ? "扫码支付"
-                : scope.row[item.prop] === 2
-                ? "刷卡支付"
-                : scope.row[item.prop] === 3
-                ? "现金支付"
-                : scope.row[item.prop] === 4
-                ? "转账"
-                : "未知"
-            }}</span>
-            <span v-else-if="item.scope === 'teachers'">
-              <span v-for="(itm, indm) in scope.row[item.prop]" :key="indm"
-                >{{ itm.nickName
-                }}{{
-                  indm !== scope.row[item.prop].length - 1 ? "," : ""
-                }}</span
-              >
-            </span>
-            <span v-else-if="item.scope === 'streamType'">{{
-              scope.row[item.prop] === 1
-                ? "正式"
-                : scope.row[item.prop] === 2
-                ? "测试"
-                : "未知"
-            }}</span>
-            <span
-              v-else-if="item.scope === 'statusPeriod'"
-              :style="scope.row[item.prop] === 0 ? 'color:red' : ''"
-            >
-              {{
-                scope.row[item.prop] === 0
-                  ? "未通过"
-                  : scope.row[item.prop] === 1
-                  ? "已通过"
-                  : scope.row[item.prop] === 2
-                  ? "待审核"
-                  : ""
-              }}
-            </span>
-            <div v-else-if="item.scope === 'changeCLS'">
-              <div v-if="scope.row[item.prop] === 1" style="color: red">
-                有变更
-                <span style="marign-left:6px;color:blue;cursor: pointer;" @click="isShowBoxsFun(scope.row)">查看</span>
-              </div>
-              <span v-else> 正常 </span>
-            </div>
-            <span
-              v-else-if="item.scope === 'finishStatus'"
-              :style="scope.row[item.prop] === 0 ? 'color:red' : ''"
-            >
-              {{
-                scope.row[item.prop] === 0
-                  ? "未结业"
-                  : scope.row[item.prop] === 1
-                  ? "结业"
-                  : ""
-              }}
-            </span>
-            <span v-else-if="item.scope === 'computer'">
-              {{ scope.row[item.prop1] + "/" + scope.row[item.prop2] }}
-              {{
-                scope.row[item.prop1] == 0 && scope.row[item.prop2] == 0
-                  ? "0%"
-                  : (scope.row[item.prop1] / scope.row[item.prop2]) * 100 + "%"
-              }}
-            </span>
-            <span v-else-if="item.scope === 'statusOrder'">{{
-              scope.row[item.prop] === -2
-                ? "超时关闭"
-                : scope.row[item.prop] === -1
-                ? "手动关闭"
-                : scope.row[item.prop] === 0
-                ? "待付款"
-                : scope.row[item.prop] === 1
-                ? "已付款"
-                : scope.row[item.prop] === 3
-                ? "成功"
-                : "未知"
-            }}</span>
-            <span v-else-if="item.scope === 'cType'">
-              <el-tag
-                type="success"
-                v-if="
-                  compType(scope.row[item.prop], scope.row['requestMethod']) ===
-                  '新增'
-                "
-              >
-                {{
-                  compType(scope.row[item.prop], scope.row["requestMethod"])
-                }}</el-tag
-              >
-              <el-tag
-                v-if="
-                  compType(scope.row[item.prop], scope.row['requestMethod']) ===
-                  '修改'
-                "
-              >
-                {{
-                  compType(scope.row[item.prop], scope.row["requestMethod"])
-                }}</el-tag
-              >
-              <el-tag
-                type="warning"
-                v-if="
-                  compType(scope.row[item.prop], scope.row['requestMethod']) ===
-                  '查询'
-                "
-              >
-                {{
-                  compType(scope.row[item.prop], scope.row["requestMethod"])
-                }}</el-tag
-              >
-            </span>
-            <span v-else-if="item.scope === 'time'">{{
-              numTime(scope.row[item.prop])
-            }}</span>
-            <span v-else-if="item.scope === 'timeBtn'"
-              >{{ numTime(scope.row[item.prop]) }}
-              <el-button type="text" @click="getxq(scope.row)">详情</el-button>
-            </span>
-            <span
-              class="editInfoSty"
-              v-else-if="item.scope === 'editInfo'"
-              @click="editInfo(scope.row)"
-              >{{ scope.row[item.prop] }}
-            </span>
-            <span
-              class="editInfoSty"
-              v-else-if="item.scope === 'editInfoMore'"
-              @click="editInfo(scope.row)"
-              >{{ scope.row[item.prop1] }} - {{ scope.row[item.prop2] }}
-            </span>
-            <span v-else-if="item.scope === 'InfoMore'"
-              >{{ scope.row[item.prop1] }} - {{ scope.row[item.prop2] }}
-            </span>
-            <el-button
-              v-else-if="item.scope === 'aboutTrees'"
-              slot="reference"
-              @click="activesBoxszing(scope.row[item.prop])"
-              >查看</el-button
-            >
-            <div
-              class="editInfoSty"
-              v-else-if="item.scope === 'editInfoHTML'"
-              @click="editInfo(scope.row)"
-            >
-              {{ getSimpleText(scope.row[item.prop]) }}
-            </div>
-            <span v-else-if="item.scope === 'minute'">{{
-              numTimeminute(scope.row[item.prop])
-            }}</span>
-            <span
-              v-else-if="item.scope === 'jumpPage'"
-              @click="jumpPage(scope.row)"
-              style="color: #409eff; cursor: pointer"
-              >{{ scope.row[item.prop] }}</span
-            >
-            <span v-else-if="item.scope === 'objType'">
-              {{
-                scope.row[item.objProp].length
-                  ? scope.row[item.objProp][0][item.prop]
-                  : ""
-              }}
-            </span>
-            <span v-else-if="item.scope === 'isOKs'" style="color: red"
-              >审核通过</span
-            >
-            <span v-else-if="item.scope === 'classTypes'">
-              {{
-                scope.row[item.prop] === 1
-                  ? "已开班:" + scope.row[item.prop1]
-                  : scope.row[item.prop] === 0
-                  ? "未开班"
-                  : ""
-              }}
-            </span>
-            <span v-else-if="item.scope === 'classTimeTypes'">
-              {{
-                scope.row[item.prop] === 1
-                  ? "即刻"
-                  : scope.row[item.prop] === 2
-                  ? "待定"
-                  : scope.row[item.prop] === 3
-                  ? $methodsTools.onlyForma(scope.row[item.prop1])
-                  : "未知"
-              }}
-            </span>
-            <div v-else-if="item.scope === 'objTypeYW'">
-              <span v-if="scope.row[item.objProp].length">
-                {{ scope.row[item.objProp][0][item.prop1] }}-{{
-                  scope.row[item.objProp][0][item.prop2]
-                }}-{{ scope.row[item.objProp][0][item.prop3] }}
-              </span>
-            </div>
-            <div v-else-if="item.scope === 'againStudent'">
-              <span :style="scope.row[item.prop] ? 'color:blue' : ''">{{
-                scope.row[item.prop]
-              }}</span>
-              <span style="color: red;margin-left:10px;" v-if="scope.row[item.prop]"
-                >已重修{{ scope.row[item.prop1] }}节</span
-              >
-            </div>
-            <span v-else-if="item.scope === 'eduTypes'">
-              {{
-                scope.row[item.prop1] +
-                "-" +
-                scope.row[item.prop2] +
-                "-" +
-                scope.row[item.prop3]
-              }}{{ scope.row[item.prop4] ? "-" + scope.row[item.prop4] : "" }}
-            </span>
-            <span
-              v-else-if="item.scope === 'sendStatus'"
-              :style="scope.row[item.prop] === 0 ? 'color:red;' : ''"
-            >
-              {{
-                scope.row[item.prop] === 1
-                  ? "发送成功"
-                  : scope.row[item.prop] === 0
-                  ? "发送失败"
-                  : "--"
-              }}
-            </span>
-            <span v-else-if="item.scope === 'peopleNums'">
-              {{ scope.row[item.prop1] }} / {{ scope.row[item.prop2] }}
-            </span>
-            <span
-              v-else-if="item.scope === 'jumpPageLabel'"
-              @click="jumpPageLabel(scope.row)"
-              style="color: #409eff; cursor: pointer"
-              >{{ scope.row[item.prop] }}</span
-            >
-            <span v-else-if="item.scope === 'urlStatus'">
-              {{
-                scope.row[item.prop] === 1
-                  ? scope.row[item.prop1]
-                  : scope.row[item.prop] === 2
-                  ? scope.row[item.prop2]
-                  : scope.row[item.prop] === 3
-                  ? scope.row[item.prop3]
-                  : ""
-              }}
-            </span>
-            <div v-else-if="item.scope === 'morePeople'">
-              <span
-                v-for="(itm, idm) in scope.row[item.prop]
-                  .split(',')
-                  .map(Number)"
-                :key="idm"
-              >
-                {{ itm === 1 ? "非补考学员" : itm === 2 ? "补考学员" : "" }}
-              </span>
-            </div>
-            <span
-              v-else-if="item.scope === 'jumpPageLabelProfess'"
-              @click="jumpPageLabelProfess(scope.row)"
-              style="color: #409eff; cursor: pointer"
-              >{{ scope.row[item.prop] }}</span
-            >
-            <span
-              v-else-if="item.scope === 'infoJump'"
-              @click="jumpinfoJump(scope.row)"
-              style="color: #409eff; cursor: pointer"
-              >详情</span
-            >
-            <span v-else-if="item.scope === 'ptai'">{{
-              scope.row[item.prop] == 1 ? "微信小程序" : "未知"
-            }}</span>
-            <span v-else-if="item.scope === 'diffTime'"
-              >{{
-                scope.row["sectionType"] === 2
-                  ? scope.row[item.prop1]
-                  : scope.row[item.prop2]
-              }}分钟</span
-            >
-            <div v-else-if="item.scope === 'isOptions'">
-              <template v-for="(itemt, indext) in item.options">
-                <span
-                  :key="indext"
-                  v-if="itemt.value === scope.row[item.prop]"
-                  :style="itemt.style ? itemt.style : ''"
-                  >{{ itemt.label }}</span
-                >
-              </template>
-            </div>
-            <div v-else-if="item.scope === 'isOptionsDZYQ'">
-              <template v-for="(itemt, indext) in item.options">
-                <span
-                  :key="indext"
-                  v-if="itemt.value === scope.row[item.prop]"
-                  :style="itemt.style ? itemt.style : ''"
-                  >{{
-                    scope.row["subscribeStatus"] === 1 ? itemt.label : ""
-                  }}</span
-                >
-              </template>
-            </div>
-            <span v-else
-              >{{ scope.row[item.prop] }}
-              {{
-                (scope.row[item.prop] || scope.row[item.prop] === 0) && item.ch
-                  ? item.ch
-                  : ""
-              }}</span
-            >
-          </template>
-        </el-table-column>
-      </template>
-      <el-table-column
-        label="官方信息推送状态"
-        align="center"
-        width="180px"
-        v-if="navText.gftsStatus"
-      >
-        <template slot-scope="scope">
-          {{
-            scope.row.officialStatus === 1
-              ? `是(${scope.row.officialNum})`
-              : scope.row.officialStatus === 0
-              ? "否"
-              : ""
-          }}
-        </template>
-      </el-table-column>
-      <el-table-column
-        label="官方学时推送状态"
-        align="center"
-        width="180px"
-        v-if="navText.gfxsStatus"
-      >
-        <template slot-scope="scope">
-          {{
-            scope.row.periodPlush === 1
-              ? `是(${scope.row.plushNum})`
-              : scope.row.periodPlush === 0
-              ? "否"
-              : ""
-          }}
-        </template>
-      </el-table-column>
-      <el-table-column
-        label="官方学习账号开通状态"
-        align="center"
-        width="180px"
-        v-if="navText.gfUserStatus"
-      >
-        <template slot-scope="scope">
-          {{
-            scope.row.learnStatus === 1
-              ? "是"
-              : scope.row.learnStatus === 0
-              ? "否"
-              : ""
-          }}
-        </template>
-      </el-table-column>
-      <el-table-column
-        label="操作"
-        align="center"
-        fixed="right"
-        :width="navText.changeWidth ? navText.changeWidth : '180px'"
-        v-if="!navText.tableHide"
-      >
-        <template slot-scope="scope">
-          <slot name="btn" :scope="scope"></slot>
-        </template>
-      </el-table-column>
-    </el-table>
-    <el-dialog
-      :visible.sync="diaBox"
-      width="500px"
-      :show-close="false"
-      :destroy-on-close="true"
-    >
-      <div slot="title" class="hearders">
-        <div class="leftTitle">详情</div>
-        <div class="rightBoxs">
-          <img
-            src="@/assets/images/Close@2x.png"
-            alt=""
-            @click="closeBeforefs"
-          />
-        </div>
-      </div>
-      <el-row class="contentBox" :gutter="30">
-        <div style="width: 100%; height: 100%">
-          <video
-            controls
-            preload
-            style="width: 100%; height: 100%"
-            :src="$methodsTools.splitImgHost(videoUrls)"
-          ></video>
-        </div>
-      </el-row>
-      <div slot="footer" class="dialog-footer">
-        <el-button @click="closeBeforefs">关闭</el-button>
-      </div>
-    </el-dialog>
-    <el-dialog
-      :visible.sync="dialogVisible"
-      width="560px"
-      :show-close="false"
-      :close-on-click-modal="false"
-    >
-      <div slot="title" class="hearders">
-        <div class="leftTitle">课程树形图</div>
-        <div class="rightBoxs">
-          <img src="@/assets/images/Close@2x.png" alt="" @click="closes" />
-        </div>
-      </div>
-      <div>
-        <el-tree
-          :key="Math.random()"
-          :props="props"
-          :load="loadNode"
-          lazy
-        ></el-tree>
-      </div>
-      <span slot="footer" class="dialog-footer">
-        <el-button @click="closes">取 消</el-button>
-      </span>
-    </el-dialog>
-    <el-dialog
-      :visible.sync="diaviosOpen"
-      width="560px"
-      :show-close="false"
-      :close-on-click-modal="false"
-    >
-      <div slot="title" class="hearders">
-        <div class="leftTitle">商品树形图</div>
-        <div class="rightBoxs">
-          <img
-            src="@/assets/images/Close@2x.png"
-            alt=""
-            @click="diaviosOpen = false"
-          />
-        </div>
-      </div>
-      <div>
-        <el-tree
-          :key="Math.random()"
-          :props="props1"
-          :load="loadNode1"
-          lazy
-        ></el-tree>
-      </div>
-      <span slot="footer" class="dialog-footer">
-        <el-button @click="diaviosOpen = false">取 消</el-button>
-      </span>
-    </el-dialog>
-    <el-dialog
-      :visible.sync="isShowBoxs"
-      width="400px"
-      :show-close="false"
-      :close-on-click-modal="false"
-    >
-      <div slot="title" class="hearders">
-        <div class="leftTitle">资料变更详情</div>
-        <div class="rightBoxs">
-          <img
-            src="@/assets/images/Close@2x.png"
-            alt=""
-            @click="isShowBoxs = false"
-          />
-        </div>
-      </div>
-      <div style="max-height:400px;overflow:auto;">
-        <ul>
-          <li v-for="(items,indexs) in listBoxsGET" :key="indexs" style="margin-bottom:30px;">
-            <p>{{$methodsTools.onlyForma(items.createTime)}}</p>
-            <p style="padding-left:14px;color:#999;">姓名:{{items.realname}}</p>
-            <p style="padding-left:14px;color:#999;">身份证号码:{{items.idCard}}</p>
-          </li>
-        </ul>
-      </div>
-      <span slot="footer" class="dialog-footer">
-        <el-button @click="isShowBoxs = false">取 消</el-button>
-      </span>
-    </el-dialog>
-    <el-dialog
-      :visible.sync="diaviosTKOpen"
-      width="560px"
-      :show-close="false"
-      :close-on-click-modal="false"
-    >
-      <div slot="title" class="hearders">
-        <div class="leftTitle">商品树形图</div>
-        <div class="rightBoxs">
-          <img
-            src="@/assets/images/Close@2x.png"
-            alt=""
-            @click="diaviosTKOpen = false"
-          />
-        </div>
-      </div>
-      <div>
-        <el-tree
-          :key="Math.random()"
-          :props="props2"
-          :load="loadNode2"
-          lazy
-        ></el-tree>
-      </div>
-      <span slot="footer" class="dialog-footer">
-        <el-button @click="diaviosTKOpen = false">取 消</el-button>
-      </span>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-export default {
-  props: ["tableSets", "tableData", "navText", "rowKey", "loading"],
-  data: function () {
-    return {
-      diaviosOpen: false,
-      diaviosTKOpen: false,
-      dialogVisible: false,
-      tableSet: this.tableSets,
-      allCheckData: [], //表格多选
-      checkAll: true,
-      checkedCities: [], //自定义列 选中数组
-      cities: [], //自定义列 总数组
-      isIndeterminate: false,
-      videoUrls: "",
-      diaBox: false,
-      isShowBoxs:false,
-      listBoxsGET:[],
-      props: {
-        label(data, node) {
-          return data.menuName || data.name;
-        },
-        isLeaf(data, node) {
-          return data.hasChildren ? false : true;
-        },
-      },
-      props1: {
-        label(data, node) {
-          return data.courseName || data.menuName || data.name;
-        },
-        isLeaf(data, node) {
-          return data.hasChildren ? false : true;
-        },
-      },
-      props2: {
-        label(data, node) {
-          return data.examName || data.menuName || data.name;
-        },
-        isLeaf(data, node) {
-          return data.hasChildren ? false : true;
-        },
-      },
-      treeDatas: [],
-      treeDatas1: [],
-      treeDatas2: [],
-    };
-  },
-  computed: {
-    numTime: function () {
-      return function (res) {
-        return Number(res / 3600).toFixed(2);
-      };
-    },
-    numTimeminute: function () {
-      return function (res) {
-        return Number(res / 60).toFixed(2);
-      };
-    },
-    compType: function () {
-      return function (res, data) {
-        if (data === "POST") {
-          if (res.indexOf("edit") !== -1 || res.indexOf("update") !== -1) {
-            return "修改";
-          } else {
-            return "新增";
-          }
-        } else if (data === "GET") {
-          return "查询";
-        }
-      };
-    },
-  },
-  created() {
-    this.inittableSet = JSON.stringify(this.tableSet);
-    this.initTR();
-  },
-  mounted() {},
-  methods: {
-    isShowBoxsFun(item){
-      this.$api.inquireuserUpdateListsy({userId:item.userId}).then(res => {
-        this.listBoxsGET = res.rows
-        this.isShowBoxs = true
-        this.$api.editgradestudentuserUpdate({userId:item.userId,status:1}).then(result => {})
-      })
-    },
-    sortMethods(a, b) {
-      return a.classGradeUserGoodsVoList.length >
-        b.classGradeUserGoodsVoList.length
-        ? -1
-        : 1;
-    },
-    // int: 1 节列表-关联章 2 章列表-关联模块 3 模块列表-关联课程 4 课程列表-关联商品 5 题目列表-关联试卷 6 试卷列表-关联商品 7 章卷列表-关联商品 8 模块列表-关联商品
-    jumpPages(v, int) {
-      if (int === 1) {
-        this.$router.push({
-          path: "/resource/videoManagement/chapterEdit",
-          query: {
-            id: v.chapterId,
-          },
-        });
-      }
-      if (int === 2) {
-        this.$router.push({
-          path: "/resource/videoManagement/moduleManagementEdit",
-          query: {
-            id: v.moduleId,
-          },
-        });
-      }
-      if (int === 3) {
-        this.$router.push({
-          path: "/resource/videoManagement/editCourse",
-          query: {
-            id: v.courseId,
-          },
-        });
-      }
-      if (int === 4) {
-        this.$router.push({
-          path: "/Marketing/commodityManageMentEdit",
-          query: {
-            id: v.goodsId,
-          },
-        });
-      }
-      if (int === 5) {
-        this.$router.push({
-          path: "/resource/bankManagement/editPaper",
-          query: {
-            id: v.examId,
-          },
-        });
-      }
-      if (int === 6) {
-        this.$router.push({
-          path: "/Marketing/commodityManageMentEdit",
-          query: {
-            id: v.goodsId,
-          },
-        });
-      }
-      if (int === 7) {
-        this.$router.push({
-          path: "/Marketing/commodityManageMentEdit",
-          query: {
-            id: v.goodsId,
-          },
-        });
-      }
-      if (int === 8) {
-        this.$router.push({
-          path: "/Marketing/commodityManageMentEdit",
-          query: {
-            id: v.goodsId,
-          },
-        });
-      }
-    },
-    jumpClass(v) {
-      this.$router.push({
-        path: "/education/classManageMent/studentMenu",
-        query: {
-          id: v.gradeId,
-          goodsId: v.id,
-        },
-      });
-    },
-    getSimpleText(html) {
-      var re1 = new RegExp("<.+?>", "g"); //匹配html标签的正则表达式,"g"是搜索匹配多个符合的内容
-      var msg = html.replace(re1, ""); //执行替换成空字符
-      return msg;
-    },
-    //树形图关闭
-    closes() {
-      this.dialogVisible = false;
-    },
-    activesBoxszing(ids) {
-      this.$api.inquireCoursemenuListS({ courseId: ids }).then((res) => {
-        res.rows.forEach((item) => {
-          item.TypeId = item.type + "-" + item.menuId;
-        });
-        this.treeDatas = res.rows;
-        this.dialogVisible = true;
-      });
-    },
-    loadNode(node, resolve) {
-      if (node.level === 0) {
-        this.treeDatas.forEach((item) => {
-          if (item.type === 1) {
-            item.hasChildren = true;
-          }
-          if (item.type === 2) {
-            item.hasChildren = true;
-          }
-          if (item.type === 3) {
-            item.hasChildren = false;
-          }
-        });
-        return resolve(this.treeDatas);
-      } else {
-        if (node.data.type === 1) {
-          this.$api
-            .inquireCourseListmodulechapter(node.data.courseId)
-            .then((res) => {
-              res.data.forEach((item) => {
-                item.TypeId = 2 + "-" + item.chapterId;
-                item.hasChildren = true;
-                item.menuId = item.chapterId;
-                item.type = 2;
-              });
-              return resolve(res.data);
-            });
-        }
-        if (node.data.type === 2) {
-          this.$api
-            .inquireCoursechaptersectionlist(node.data.menuId)
-            .then((res) => {
-              res.data.forEach((item) => {
-                item.TypeId = 3 + "-" + item.sectionId;
-                item.type = 3;
-              });
-              return resolve(res.data);
-            });
-        }
-        if (node.data.type === 3) {
-          return resolve([]);
-        }
-      }
-    },
-    diavios(ids) {
-      this.$api.obtainCourseSgoodsId(ids).then((res) => {
-        res.rows.forEach((item) => {
-          item.TypeId = "0-" + item.courseId;
-          item.type = 0;
-          item.hasChildren = true;
-        });
-        this.treeDatas1 = res.rows;
-        this.diaviosOpen = true;
-      });
-    },
-    loadNode1(node, resolve) {
-      if (node.level === 0) {
-        return resolve(this.treeDatas1);
-      } else {
-        if (node.data.type === 0) {
-          this.$api
-            .inquireCoursemenuListS({ courseId: node.data.courseId })
-            .then((res) => {
-              res.rows.forEach((item) => {
-                item.TypeId = 1 + "-" + item.menuId;
-                item.hasChildren = item.type === 3 ? false : true;
-                item.menuId = item.menuId;
-              });
-              return resolve(res.rows);
-            });
-        }
-        if (node.data.type === 1) {
-          this.$api
-            .inquireCourseListmodulechapter(node.data.courseId)
-            .then((res) => {
-              res.data.forEach((item) => {
-                item.TypeId = 2 + "-" + item.chapterId;
-                item.hasChildren = true;
-                item.menuId = item.chapterId;
-                item.type = 2;
-              });
-              return resolve(res.data);
-            });
-        }
-        if (node.data.type === 2) {
-          this.$api
-            .inquireCoursechaptersectionlist(node.data.menuId)
-            .then((res) => {
-              res.data.forEach((item) => {
-                item.TypeId = 3 + "-" + item.sectionId;
-                item.type = 3;
-              });
-              return resolve(res.data);
-            });
-        }
-        if (node.data.type === 3) {
-          return resolve([]);
-        }
-      }
-    },
-    diaviosTK(ids) {
-      this.$api.inquireGoodsbanklist({ goodsId: ids }).then((res) => {
-        res.data.forEach((item) => {
-          item.TypeId = item.type + "-" + item.majorId;
-          item.hasChildren = item.type === 3 ? false : true;
-        });
-        this.treeDatas2 = res.data;
-        this.diaviosTKOpen = true;
-      });
-    },
-    loadNode2(node, resolve) {
-      if (node.level === 0) {
-        return resolve(this.treeDatas2);
-      } else {
-        if (node.data.type === 1) {
-          this.$api
-            .inquireBankchapterModule({ moduleExamId: node.data.majorId })
-            .then((res) => {
-              res.data.forEach((item) => {
-                item.TypeId = 2 + "-" + item.chapterExamId;
-                item.menuId = item.chapterExamId;
-                item.type = 2;
-              });
-              return resolve(res.data);
-            });
-        }
-        if (node.data.type === 2) {
-          this.$api
-            .inquirebankchapterexamList({
-              chapterExamId: node.data.majorId,
-            })
-            .then((res) => {
-              res.data.forEach((item) => {
-                item.TypeId = 3 + "-" + item.examId;
-                item.type = 3;
-              });
-              return resolve(res.data);
-            });
-        }
-        if (node.data.type === 3) {
-          return resolve([]);
-        }
-      }
-    },
-    timeStyle(column) {
-      if (column.columnIndex === 0 && this.navText.firstColLeft) {
-        return "text-align:left!important;  padding-left: 40px;";
-      }
-    },
-    //初始化
-    initTR() {
-      this.cities = [];
-      this.checkedCities = [];
-      this.checkAll = true;
-      this.isIndeterminate = false;
-      this.tableSet.forEach((item, index) => {
-        this.cities.push(item.label);
-        if (item.hidden) {
-          this.checkedCities.push(item.label);
-        }
-      });
-      if (this.checkedCities.length === 0) {
-        this.isIndeterminate = false;
-      } else if (this.checkedCities.length === this.cities.length) {
-        this.isIndeterminate = false;
-        this.checkAll = true;
-      } else {
-        this.isIndeterminate = true;
-        this.checkAll = false;
-      }
-    },
-    //自定义列全选按钮触发
-    handleCheckAllChange(val) {
-      console.log(val,123)
-      this.checkedCities = val ? this.cities : [];
-      this.isIndeterminate = false;
-      if (val) {
-        this.tableSet.forEach((item, index) => {
-          item.hidden = true;
-        });
-      } else {
-        this.tableSet.forEach((item, index) => {
-          item.hidden = false;
-        });
-      }
-    },
-    // 勾选自定义列子选项
-    handleCheckedCitiesChange(value) {
-      let checkedCount = value.length;
-      this.checkAll = checkedCount === this.cities.length;
-      this.isIndeterminate =
-        checkedCount > 0 && checkedCount < this.cities.length;
-    },
-    checkboxChange(v, e) {
-      this.tableSet.forEach((item) => {
-        if (item.label === v) {
-          item.hidden = e;
-        }
-      });
-    },
-    // 下移
-    downMove(option, index) {
-      if (index !== this.tableSet.length - 1) {
-        this.tableSet[index] = this.tableSet.splice(
-          index + 1,
-          1,
-          this.tableSet[index]
-        )[0];
-        this.cities[index] = this.cities.splice(
-          index + 1,
-          1,
-          this.cities[index]
-        )[0];
-      } else {
-        this.tableSet.unshift(this.tableSet.splice(index, 1)[0]);
-        this.cities.unshift(this.cities.splice(index, 1)[0]);
-      }
-    },
-    // 上移
-    upMove(option, index) {
-      if (index != 0) {
-        this.tableSet[index] = this.tableSet.splice(
-          index - 1,
-          1,
-          this.tableSet[index]
-        )[0];
-        this.cities[index] = this.cities.splice(
-          index - 1,
-          1,
-          this.cities[index]
-        )[0];
-      } else {
-        this.tableSet.push(this.tableSet.shift());
-        this.cities.push(this.cities.shift());
-      }
-    },
-    //跳转页面
-    jumpPage(options) {
-      this.$router.push({
-        path: "dictData",
-        query: {
-          dictId: options.dictId,
-          dictType: options.dictType,
-        },
-      });
-    },
-    //跳转页面
-    jumpPageLabel(options) {
-      this.$router.push({
-        path: "labelInfos",
-        query: {
-          id: options.id,
-        },
-      });
-    }, //跳转页面
-    jumpPageLabelProfess(options) {
-      this.$router.push({
-        path: "labelInfos",
-        query: {
-          id: options.labelId,
-        },
-      });
-    },
-    jumpinfoJump(options) {
-      this.$router.push({
-        path: "beneficiaryInfos",
-        query: {
-          id: options.payeeId,
-        },
-      });
-    },
-    //新增按钮
-    addClick() {
-      this.$emit("addClick");
-    },
-    //将选中值传回调用组件
-    backFather() {
-      this.$emit("emitData", this.allCheckData);
-    },
-    edit() {},
-    selectAll(value) {
-      this.allCheckData = value;
-    },
-    select(value) {
-      this.allCheckData = value;
-    },
-    //自定义列重置
-    initVue() {
-      // this.$emit("initTableset");
-      this.tableSet = JSON.parse(this.inittableSet);
-      this.initTR();
-    },
-    load(tree, treeNode, resolve) {
-      this.$emit("load", tree, treeNode, resolve);
-    },
-    editInfo(option, int) {
-      if (int === 3) {
-        this.$emit("aboutGoods", option);
-      } else {
-        this.$emit("editInfo", option);
-      }
-    },
-    jumpPeolpe(item,type){
-      if(type === 1){
-        this.$router.push({
-        path: "applicationData",
-        query: {
-          id: item.applyId,
-          type:type
-        },
-      });
-      }
-      if(type === 2){
-        this.$router.push({
-        path: "applicationData",
-        query: {
-          id: item.beforeId,
-          type:type
-        },
-      });
-      }
-    },
-    getxq(option) {
-      this.$emit("getxq", option.userId);
-    },
-    openVideo(url) {
-      this.videoUrls = url;
-      this.diaBox = true;
-    },
-    closeBeforefs() {
-      this.diaBox = false;
-    },
-  },
-};
-</script>
-<style lang="less">
-.overSty {
-  white-space: nowrap;
-  overflow-x: auto;
-  &::-webkit-scrollbar {
-    width: 14px;
-    height: 14px;
-  }
-
-  &::-webkit-scrollbar-track,
-  &::-webkit-scrollbar-thumb {
-    border-radius: 999px;
-    border: 5px solid transparent;
-  }
-
-  &::-webkit-scrollbar-track {
-    box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.2) inset;
-  }
-
-  &::-webkit-scrollbar-thumb {
-    min-height: 20px;
-    background-clip: content-box;
-    box-shadow: 0 0 0 5px rgba(0, 0, 0, 0.2) inset;
-  }
-
-  &::-webkit-scrollbar-corner {
-    background: transparent;
-  }
-}
-.slotPopper {
-  padding: 0px !important;
-}
-</style>
-<style lang="less" scoped>
-#tableList {
-  padding: 0px 16px 16px;
-  border-radius: 8px;
-  box-shadow: 0px 0px 9px 1px rgba(28, 41, 90, 0.1);
-  background: #ffffff;
-  .headerNavTool {
-    height: 72px;
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    .rightBtnBox {
-      display: flex;
-      align-items: center;
-    }
-  }
-}
-.popoverDis {
-  display: flex;
-  flex-direction: column;
-  align-items: flex-start;
-  font-size: 14px;
-  .checkboxHeader {
-    height: 40px;
-    display: flex;
-    align-items: center;
-    justify-content: space-between;
-    padding-left: 13px;
-    padding-right: 15px;
-    width: 100%;
-    .initbtns {
-      color: #47a6ff;
-      cursor: pointer;
-    }
-  }
-  .checkboxGroup {
-    display: flex;
-    flex-direction: column;
-    width: 100%;
-    .checkboxchild {
-      width: 100%;
-      justify-content: space-between;
-      height: 40px;
-      display: flex;
-      align-items: center;
-      padding: 0px 15px 0px 13px;
-      transition: all 0.4s;
-      &:hover {
-        background-color: #ecf5ff;
-      }
-      &:hover .icon-right {
-        display: flex;
-      }
-      .icon-right {
-        display: flex;
-        align-items: center;
-        width: 30px;
-        height: 30px;
-        color: #666;
-        font-size: 14px;
-        display: none;
-        i {
-          cursor: pointer;
-          margin: 0px 3px;
-          &:hover {
-            color: #47a6ff;
-          }
-        }
-      }
-    }
-  }
-}
-/deep/.el-checkbox__input.is-checked + .el-checkbox__label {
-  color: #666;
-}
-.imgboxsq {
-  margin: 0 auto;
-  height: 60px;
-  max-height: 60px;
-  .el_images {
-    /deep/.el-image__inner {
-      width: auto;
-    }
-  }
-}
-.imgHover {
-  width: 100%;
-  height: 100%;
-  cursor: pointer;
-}
-.cvideo {
-  transition: all 0.2s;
-  color: #333;
-  cursor: pointer;
-  font-size: 30px;
-}
-.cvideo:hover {
-  color: #47a6ff;
-}
-.editInfoSty {
-  cursor: pointer;
-  color: blue;
-}
-.ulAuto {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-}
-.ulAutos {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-}
-.dis_sdt {
-  display: flex;
-  align-items: flex-end;
-  ul {
-    margin: 0px;
-    li {
-      text-align: left;
-    }
-  }
-}
-.jumpClass {
-  color: #333;
-  cursor: pointer;
-}
-.jumpStys {
-  color: blue;
-  cursor: pointer;
-}
-</style>
-

Diff do ficheiro suprimidas por serem muito extensas
+ 1130 - 980
src/components/tableList.vue


+ 496 - 0
src/components/testPaperPreview/index.vue

@@ -0,0 +1,496 @@
+<template>
+  <div id="testPaperPreview">
+    <el-dialog
+      :visible.sync="diavos"
+      width="1080px"
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">试卷预览</div>
+        <div class="rightBoxs">
+          <img src="@/assets/images/Close@2x.png" alt="" @click="clears" />
+        </div>
+      </div>
+      <div>
+        <table class="table_style" border>
+          <tr>
+            <td>当前总分</td>
+            <td>及格分数</td>
+            <td>答卷时长</td>
+            <td>答卷次数</td>
+            <td>做题类型</td>
+          </tr>
+          <tr>
+            <td>{{ topData.getAllpocis }}</td>
+            <td>{{ topData.passScore }}</td>
+            <td>
+              {{ topData.answerTime === 0 ? "无限时长" : topData.answerTime }}
+            </td>
+            <td>
+              {{ topData.answerNum === 0 ? "无限次" : topData.answerNum }}
+            </td>
+            <td>
+              {{
+                topData.doType === 1
+                  ? "练习"
+                  : topData.doType === 2
+                  ? "考试"
+                  : ""
+              }}
+            </td>
+          </tr>
+        </table>
+        <div class="bank_style">
+          <div v-for="(item, index) in tableData" :key="index">
+            <div class="header_style">
+              <span>题目{{ index + 1 }}</span>
+              <span>{{ getTypeName(item.type) }}</span>
+              <span>分值:{{ item.score }}</span>
+              <el-button
+                size="mini"
+                style="float: right"
+                @click="changeDatas(item)"
+                v-if="type === 2"
+                >修改</el-button
+              >
+              <div style="clear: both"></div>
+            </div>
+            <div class="dis_flex">
+              <span>题目内容:</span>
+              <div>
+                <div class="divPy" v-html="imgExiz(item.content)"></div>
+                <div v-if="item.type === 4">
+                  <div
+                    style="background: #e0e0e0; padding: 10px"
+                    v-for="(its, inds) in JSON.parse(item.jsonStr)"
+                    :key="inds"
+                  >
+                    <div class="header_style">
+                      <span>题目{{ inds + 1 }}</span>
+                      <span>{{ getTypeName(its.type) }}</span>
+                    </div>
+                    <div class="dis_flex">
+                      <span>题目内容:</span>
+                      <div>
+                        <div class="divPy" v-html="imgExiz(its.content)"></div>
+                      </div>
+                    </div>
+                    <div
+                      class="dis_flex"
+                      v-if="its.type !== 4 && its.type !== 5 && its.type !== 3"
+                    >
+                      <span>选项内容:</span>
+                      <div>
+                        <ul>
+                          <li
+                            v-for="(itemsxs, indexsxs) in its.optionsList"
+                            :key="indexsxs"
+                            :style="
+                              indexsxs === its.optionsList.length - 1
+                                ? 'margin-bottom: 0px'
+                                : 'margin-bottom: 10px'
+                            "
+                          >
+                            {{ Gest(indexsxs + 1) }}:{{ itemsxs.content }}
+
+                            <div style="margin: 10px 0px">
+                              <el-image
+                                v-if="itemsxs.imgUrl"
+                                style="
+                                  max-width: 100%;
+                                  max-height: 100%;
+                                  vertical-align: middle;
+                                "
+                                :src="
+                                  $methodsTools.splitImgHost(itemsxs.imgUrl)
+                                "
+                                :preview-src-list="[
+                                  $methodsTools.splitImgHost(itemsxs.imgUrl),
+                                ]"
+                              >
+                              </el-image>
+                            </div>
+                          </li>
+                        </ul>
+                      </div>
+                    </div>
+                    <div class="dis_flex" v-if="its.type !== 5">
+                      <span>正确答案:</span>
+                      <div>
+                        <span v-if="its.type === 3">
+                          {{ its.answerQuestion == 1 ? "正确" : "错误" }}
+                        </span>
+                        <span v-else>
+                          {{ getDictChanges(its.answerQuestion) }}
+                        </span>
+                      </div>
+                    </div>
+                    <div class="dis_flex">
+                      <span>答案解析:</span>
+                      <div>
+                        <div v-html="imgExiz(its.analysisContent)"></div>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div
+              class="dis_flex"
+              v-if="item.type !== 3 && item.type !== 4 && item.type !== 5"
+            >
+              <span>选项内容:</span>
+              <div>
+                <ul v-if="item.type !== 4">
+                  <li
+                    v-for="(items, indexs) in item.optionsList"
+                    :key="indexs"
+                    :style="
+                      indexs === item.optionsList.length - 1
+                        ? 'margin-bottom: 0px'
+                        : 'margin-bottom: 10px'
+                    "
+                  >
+                    {{ Gest(indexs + 1) }}:{{ items.content }}
+                    <div style="margin: 10px 0px">
+                      <el-image
+                        v-if="items.imgUrl"
+                        style="
+                          max-width: 100%;
+                          max-height: 100%;
+                          vertical-align: middle;
+                        "
+                        :src="$methodsTools.splitImgHost(items.imgUrl)"
+                        :preview-src-list="[
+                          $methodsTools.splitImgHost(items.imgUrl),
+                        ]"
+                      >
+                      </el-image>
+                    </div>
+                  </li>
+                </ul>
+              </div>
+            </div>
+            <div class="dis_flex" v-if="item.type !== 5 && item.type !== 4">
+              <span>正确答案:</span>
+              <div>
+                <span v-if="item.type === 3">
+                  {{ item.answerQuestion == 1 ? "正确" : "错误" }}
+                </span>
+                <span v-else>
+                  {{ getDictChanges(item.answerQuestion) }}
+                </span>
+              </div>
+            </div>
+            <div class="dis_flex" v-if="item.type !== 4">
+              <span>答案解析:</span>
+              <div><div v-html="imgExiz(item.analysisContent)"></div></div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="clears">确 认</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      diavos: false,
+      tableData: [], //题目内容
+      topData: {}, //顶部表格数据
+      type: "",
+    };
+  },
+  computed: {
+    /**
+     * 题目类型转换名称
+     */
+    getTypeName: function () {
+      return function (type) {
+        let typeName = "";
+        switch (type) {
+          case 1:
+            typeName = "单选题";
+            break;
+          case 2:
+            typeName = "多选题";
+            break;
+          case 3:
+            typeName = "判断题";
+            break;
+          case 4:
+            typeName = "案例题";
+            break;
+          case 5:
+            typeName = "简答题";
+            break;
+
+          default:
+            break;
+        }
+        return typeName;
+      };
+    },
+
+    imgExiz: function () {
+      return function (vms) {
+        if (!vms) {
+          return vms;
+        } else {
+          var ast1 = vms.replace(/<p/gi, '<p style="margin:0px;"');
+          var ast = ast1.replace(/<img/gi, '<img style="max-width:100%;"');
+          return ast;
+        }
+      };
+    },
+  },
+  methods: {
+    /**
+     * type = 1时Id获取数据row = ID, 2时直接获取数据row = 数据
+     */
+    openBox(type, row) {
+      const ROWS = JSON.parse(JSON.stringify(row));
+      this.type = type;
+      if (type === 1) {
+        //搜索Id处理数据
+        this.$api.obtainbankexam(row).then((res) => {
+          console.log(111);
+          this.topData = {
+            answerTime: res.data.answerTime,
+            answerNum: res.data.answerNum,
+            doType: res.data.doType,
+            passScore: res.data.passScore,
+          };
+        });
+        this.$api.inquirebankexamquestionList({ examId: row }).then((res) => {
+          res.data.map((item) => {
+            item.optionsList = JSON.parse(item.jsonStr);
+          });
+          this.tableData = res.data;
+          var num = 0;
+          res.data.forEach((item) => {
+            num += item.score;
+          });
+          this.topData.getAllpocis = num;
+          this.diavos = true;
+        });
+      }
+      if (type === 2) {
+        this.topData = ROWS.topData;
+        this.tableData = ROWS.tableData;
+        this.diavos = true;
+      }
+    },
+    changeDatas(row) {
+      this.$parent.addClick(row, 0, row.index, true);
+    },
+    clears() {
+      this.diavos = false;
+    },
+    changeUploadStatus(data) {
+      let index = this.tableData.findIndex((item) => {
+        return item.index === data.index;
+      });
+      this.$set(this.tableData, index, data);
+      console.log(data);
+    },
+    /**
+     * 选项转换
+     */
+    Gest(ints) {
+      var int = parseInt(ints);
+      var ast = "";
+      switch (int) {
+        case 1:
+          ast = "A";
+          break;
+        case 2:
+          ast = "B";
+          break;
+        case 3:
+          ast = "C";
+          break;
+        case 4:
+          ast = "D";
+          break;
+        case 5:
+          ast = "E";
+          break;
+        case 6:
+          ast = "F";
+          break;
+        case 7:
+          ast = "G";
+          break;
+        case 8:
+          ast = "H";
+          break;
+        default:
+          ast = "X";
+          break;
+      }
+      return ast;
+    },
+    getDictChanges(dan) {
+      var arst = [];
+      var arrays;
+      if (dan instanceof Object) {
+        arrays = dan;
+      } else {
+        if (dan) {
+          arrays = dan.toString().split(",");
+        } else {
+          return "";
+        }
+      }
+      for (let i = 0; i < arrays.length; i++) {
+        arst.push(this.Gest(arrays[i]));
+      }
+      return arst.join(",");
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.table_style {
+  width: 100%;
+  border-collapse: collapse;
+  text-align: center;
+  margin-bottom: 14px;
+  tr {
+    &:first-of-type {
+      background-color: rgb(255, 255, 204);
+      font-weight: bold;
+    }
+    td {
+      padding: 6px;
+    }
+  }
+}
+.bank_style {
+  max-height: 600px;
+  overflow: auto;
+  & > div {
+    padding: 10px;
+    background-color: #eee;
+    margin-bottom: 11px;
+  }
+  & .header_style {
+    border-bottom: 1px dotted #999;
+    padding-bottom: 6px;
+    & > span {
+      margin-right: 10px;
+    }
+  }
+  & .dis_flex {
+    display: flex;
+    margin-bottom: 6px;
+    & > span {
+      width: 90px;
+      flex-shrink: 0;
+    }
+    & > div {
+      flex: 1;
+      ul {
+        margin: 0;
+      }
+    }
+  }
+}
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
+</style>

+ 19 - 0
src/components/version/index.vue

@@ -0,0 +1,19 @@
+<template>
+  <span>
+    <svg-icon class-name="size-icon" icon-class="redis" @click="openMsg" />
+  </span>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+    };
+  },
+  methods: {
+    openMsg() {
+      this.$emit('openMsg')
+    },
+  },
+};
+</script>

+ 227 - 0
src/components/videoPreview/index.vue

@@ -0,0 +1,227 @@
+<template>
+  <div id="videoPreview">
+    <el-dialog
+      :visible.sync="diavos"
+      width="840px"
+      @opened="isOkBf"
+      @close="clears"
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">视频预览</div>
+        <div class="rightBoxs">
+          <img src="@/assets/images/Close@2x.png" alt="" @click="clears" />
+        </div>
+      </div>
+      <div>
+        <div id="player" v-if="listData.sectionType === 1"></div>
+        <div id="playerzb" v-if="listData.sectionType === 2"></div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="clears">取 消</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      vodPlayerJs: "https://player.polyv.net/script/player.js",
+      vid: "",
+      vidzb: "",
+      playerJs:
+        "https://player.polyv.net/resp/live-h5-player/latest/liveplayer.min.js",
+      uidzb: "egsxlptzdq",
+      fileSetting: {
+        desc: "i am desc", // 描述
+        cataid: "1639399775001", // 分类ID 可以后端传递 也可以不写 或写死
+        tag: "i am tag", // 标签
+        luping: 0, // 是否开启视频课件优化处理,对于上传录屏类视频清晰度有所优化:0为不开启,1为开启
+        keepsource: 1, // 是否源文件播放(不对视频进行编码):0为编码,1为不编码
+      },
+      diavos: false,
+      listData: {}, //数据
+    };
+  },
+  methods: {
+    diavosFun(item) {
+      if (item.sectionType === 1) {
+        this.vid = item.recordingUrl;
+      }
+      if (item.sectionType === 2) {
+        this.vidzb = item.liveUrl;
+      }
+      this.listData = item;
+      this.diavos = true;
+    },
+    isOkBf() {
+      if (this.listData.sectionType === 1) {
+        this.loadPlayerScript(this.loadPlayer);
+      }
+      if (this.listData.sectionType === 2) {
+        this.loadPlayerScriptzb(this.loadPlayerzb);
+      }
+    },
+    loadPlayerScript(callback) {
+      if (!window.polyvPlayer) {
+        const myScript = document.createElement("script");
+        myScript.setAttribute("src", this.vodPlayerJs);
+        myScript.onload = callback;
+        document.body.appendChild(myScript);
+      } else {
+        callback();
+        this.player.on("serverError", (...params) => {
+          this.$message.error(returnTitle(params[1]));
+          console.log(params);
+        });
+      }
+    },
+    loadPlayer() {
+      var self = this;
+      const polyvPlayer = window.polyvPlayer;
+      self.player = polyvPlayer({
+        wrap: "#player",
+        width: 800,
+        height: 533,
+        vid: self.vid,
+        teaser_show: 0,
+        playsafe: function (vid, next) {
+          self.$api.obtainpolyvvideosign(vid).then((res) => {
+            next(res.data);
+          });
+        },
+      });
+    },
+    /**
+     * @param {String} 关闭视频窗口-销毁实例
+     */
+    clears() {
+      this.diavos = false;
+      if (this.listData.sectionType === 1 && this.player) {
+        this.player.destroy();
+      }
+      if (this.listData.sectionType === 2 && this.playerzb) {
+        this.playerzb.destroy();
+      }
+      this.listData = {};
+    },
+    loadPlayerScriptzb(callback) {
+      if (!window.polyvLivePlayer) {
+        const myScript = document.createElement("script");
+        myScript.setAttribute("src", this.playerJs);
+        myScript.onload = callback;
+        document.body.appendChild(myScript);
+      } else {
+        callback();
+      }
+    },
+
+    loadPlayerzb() {
+      var self = this;
+      const polyvLivePlayer = window.polyvLivePlayer;
+      self.playerzb = polyvLivePlayer({
+        wrap: "#playerzb",
+        width: 800,
+        height: 533,
+        uid: self.uidzb,
+        vid: self.vidzb,
+      });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
+</style>

+ 202 - 50
src/layout/components/Navbar.vue

@@ -1,14 +1,23 @@
 <template>
   <div class="navbar">
-    <hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
+    <hamburger
+      id="hamburger-container"
+      :is-active="sidebar.opened"
+      class="hamburger-container"
+      @toggleClick="toggleSideBar"
+    />
 
-    <breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav"/>
-    <top-nav id="topmenu-container" class="topmenu-container" v-if="topNav"/>
+    <breadcrumb
+      id="breadcrumb-container"
+      class="breadcrumb-container"
+      v-if="!topNav"
+    />
+    <top-nav id="topmenu-container" class="topmenu-container" v-if="topNav" />
 
     <div class="right-menu">
-      <template v-if="device!=='mobile'">
+      <template v-if="device !== 'mobile'">
         <search id="header-search" class="right-menu-item" />
-        
+
         <!-- <el-tooltip content="源码地址" effect="dark" placement="bottom">
           <ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />
         </el-tooltip>
@@ -16,18 +25,52 @@
         <el-tooltip content="文档地址" effect="dark" placement="bottom">
           <ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />
         </el-tooltip> -->
+        <el-tooltip content="版本说明" effect="dark" placement="bottom">
+          <version
+            id="version"
+            class="right-menu-item hover-effect"
+            @openMsg="openMsg"
+          />
+        </el-tooltip>
 
+        <el-dialog
+          append-to-body
+          :visible.sync="dialogVisible"
+          width="560px"
+          :show-close="false"
+          :close-on-click-modal="false"
+        >
+          <div slot="title" class="hearders">
+            <div class="leftTitle">版本说明</div>
+            <div class="rightBoxs">
+              <img
+                src="@/assets/images/Close@2x.png"
+                alt=""
+                @click="dialogVisible = false"
+              />
+            </div>
+          </div>
+          <div class="dialogSty">
+            <h2>v6.0.0</h2>
+            <p>1.第六阶段完整版</p>
+          </div>
+          <span slot="footer" class="dialog-footer">
+            <el-button @click="dialogVisible = false">关 闭</el-button>
+          </span>
+        </el-dialog>
         <screenfull id="screenfull" class="right-menu-item hover-effect" />
 
         <el-tooltip content="布局大小" effect="dark" placement="bottom">
           <size-select id="size-select" class="right-menu-item hover-effect" />
         </el-tooltip>
-
       </template>
 
-      <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
+      <el-dropdown
+        class="avatar-container right-menu-item hover-effect"
+        trigger="click"
+      >
         <div class="avatar-wrapper">
-          <img :src="avatar" class="user-avatar">
+          <img :src="avatar" class="user-avatar" />
           <i class="el-icon-caret-bottom" />
         </div>
         <el-dropdown-menu slot="dropdown">
@@ -47,15 +90,16 @@
 </template>
 
 <script>
-import { mapGetters } from 'vuex'
-import Breadcrumb from '@/components/Breadcrumb'
-import TopNav from '@/components/TopNav'
-import Hamburger from '@/components/Hamburger'
-import Screenfull from '@/components/Screenfull'
-import SizeSelect from '@/components/SizeSelect'
-import Search from '@/components/HeaderSearch'
-import RuoYiGit from '@/components/RuoYi/Git'
-import RuoYiDoc from '@/components/RuoYi/Doc'
+import { mapGetters } from "vuex";
+import Breadcrumb from "@/components/Breadcrumb";
+import TopNav from "@/components/TopNav";
+import Hamburger from "@/components/Hamburger";
+import Screenfull from "@/components/Screenfull";
+import SizeSelect from "@/components/SizeSelect";
+import version from "@/components/version";
+import Search from "@/components/HeaderSearch";
+import RuoYiGit from "@/components/RuoYi/Git";
+import RuoYiDoc from "@/components/RuoYi/Doc";
 
 export default {
   components: {
@@ -66,68 +110,176 @@ export default {
     SizeSelect,
     Search,
     RuoYiGit,
-    RuoYiDoc
+    RuoYiDoc,
+    version,
+  },
+  data() {
+    return {
+      dialogVisible: false,
+    };
   },
   computed: {
-    ...mapGetters([
-      'sidebar',
-      'avatar',
-      'device'
-    ]),
+    ...mapGetters(["sidebar", "avatar", "device"]),
     setting: {
       get() {
-        return this.$store.state.settings.showSettings
+        return this.$store.state.settings.showSettings;
       },
       set(val) {
-        this.$store.dispatch('settings/changeSetting', {
-          key: 'showSettings',
-          value: val
-        })
-      }
+        this.$store.dispatch("settings/changeSetting", {
+          key: "showSettings",
+          value: val,
+        });
+      },
     },
     topNav: {
       get() {
-        return this.$store.state.settings.topNav
-      }
-    }
+        return this.$store.state.settings.topNav;
+      },
+    },
   },
   methods: {
+    openMsg() {
+      this.dialogVisible = true;
+    },
     toggleSideBar() {
-      this.$store.dispatch('app/toggleSideBar')
+      this.$store.dispatch("app/toggleSideBar");
     },
     async logout() {
-      this.$confirm('确定注销并退出系统吗?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).then(() => {
-        this.$store.dispatch('LogOut').then(() => {
-          location.href = '/index';
+      this.$confirm("确定注销并退出系统吗?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          this.$store.dispatch("LogOut").then(() => {
+            location.href = "/index";
+          });
         })
-      }).catch(() => {});
-    }
-  }
-}
+        .catch(() => {});
+    },
+  },
+};
 </script>
 
 <style lang="scss" scoped>
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/.el-dialog {
+  z-index: 9999;
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__body {
+    padding: 0px 20px;
+    max-height: 450px;
+    overflow: auto;
+    h2 {
+      font-weight: bold;
+      color: #333;
+      border-bottom: 2px dashed #000;
+      padding-bottom: 10px;
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
 .navbar {
   height: 50px;
   overflow: hidden;
   position: relative;
   background: #fff;
-  box-shadow: 0 1px 4px rgba(0,21,41,.08);
+  box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
 
   .hamburger-container {
     line-height: 46px;
     height: 100%;
     float: left;
     cursor: pointer;
-    transition: background .3s;
-    -webkit-tap-highlight-color:transparent;
+    transition: background 0.3s;
+    -webkit-tap-highlight-color: transparent;
 
     &:hover {
-      background: rgba(0, 0, 0, .025)
+      background: rgba(0, 0, 0, 0.025);
     }
   }
 
@@ -164,10 +316,10 @@ export default {
 
       &.hover-effect {
         cursor: pointer;
-        transition: background .3s;
+        transition: background 0.3s;
 
         &:hover {
-          background: rgba(0, 0, 0, .025)
+          background: rgba(0, 0, 0, 0.025);
         }
       }
     }

+ 15 - 15
src/layout/components/Sidebar/Item.vue

@@ -24,21 +24,21 @@ export default {
       vnodes.push(<svg-icon icon-class={icon} />);
     }
 
-    if (title === "学时待审核列表") {
-      if (indexnum >= 301) {
-        vnodes.push(
-          <i class="iconfont icon-safe_warn" style="color:red!important;"></i>
-        );
-      } else if (indexnum < 301 && indexnum >= 101) {
-        vnodes.push(
-          <i class="iconfont icon-safe_warn" style="color:yellow!important;"></i>
-        );
-      } else {
-        vnodes.push(
-          <i class="iconfont icon-safe_warn" style="color:#bfcbd9!important;"></i>
-        );
-      }
-    }
+    // if (title === "学时待审核列表") {
+    //   if (indexnum >= 301) {
+    //     vnodes.push(
+    //       <i class="iconfont icon-safe_warn" style="color:red!important;"></i>
+    //     );
+    //   } else if (indexnum < 301 && indexnum >= 101) {
+    //     vnodes.push(
+    //       <i class="iconfont icon-safe_warn" style="color:yellow!important;"></i>
+    //     );
+    //   } else {
+    //     vnodes.push(
+    //       <i class="iconfont icon-safe_warn" style="color:#bfcbd9!important;"></i>
+    //     );
+    //   }
+    // }
     if (title) {
       vnodes.push(<span slot="title">{title}</span>);
     }

+ 4 - 4
src/layout/components/Sidebar/Logo.vue

@@ -36,7 +36,7 @@ export default {
   },
   data() {
     return {
-      title: '祥粤云学堂',
+      title: '中正云教育',
       logo: logoImg,
       logoYT:logoYTImg,
     }
@@ -68,7 +68,7 @@ export default {
     width: 100%;
 
     & .sidebar-logo {
-      width: 27px;
+      width: 37.4px;
       height: 27px;
       vertical-align: middle;
       margin-right: 12px;
@@ -80,8 +80,8 @@ export default {
       color: #fff;
       font-weight: bold;
       line-height: 50px;
-      font-size: 14px;
-      font-family: Microsoft YaHei;
+      font-size: 16px;
+      font-family: "Heiti SC","黑体-简";
       vertical-align: middle;
     }
   }

+ 5 - 3
src/layout/components/Sidebar/SidebarItem.vue

@@ -51,7 +51,7 @@
 </template>
 
 <script>
-import { mapGetters } from "vuex";
+// import { mapGetters } from "vuex";
 import path from "path";
 import { isExternal } from "@/utils/validate";
 import Item from "./Item";
@@ -79,9 +79,11 @@ export default {
   },
   data() {
     this.onlyOneChild = null;
-    return {};
+    return {
+      indexnum:0
+    };
   },
-  computed: { ...mapGetters(["indexnum"]) },
+  // computed: { ...mapGetters(["indexnum"]) },
   methods: {
     hasOneShowingChild(children = [], parent) {
       if (!children) {

+ 12 - 1
src/main.js

@@ -3,6 +3,7 @@ import Vue from 'vue'
 import Cookies from 'js-cookie'
 
 import Element from 'element-ui'
+import AFTableColumn from 'af-table-column'
 import './assets/fonts/iconfont.css'
 import './assets/styles/element-variables.scss'
 
@@ -37,7 +38,9 @@ import VueMeta from 'vue-meta'
 // 字典数据组件
 import DictData from '@/components/DictData'
 import methodsTools from '@/utils/methodsTool'
+import bus from '@/utils/eventBus'
 // 全局方法挂载
+
 Vue.prototype.$store = store
 Vue.prototype.getDicts = getDicts
 Vue.prototype.getConfigKey = getConfigKey
@@ -50,6 +53,7 @@ Vue.prototype.handleTree = handleTree
 Vue.prototype.$api = api
 Vue.prototype.$upload = upload
 Vue.prototype.$methodsTools = methodsTools
+Vue.prototype.$bus = bus
 // 全局组件挂载
 Vue.component('DictTag', DictTag)
 Vue.component('Pagination', Pagination)
@@ -57,7 +61,14 @@ Vue.component('RightToolbar', RightToolbar)
 Vue.component('Editor', Editor)
 Vue.component('FileUpload', FileUpload)
 Vue.component('ImageUpload', ImageUpload)
-
+const fontRate = {
+  CHAR_RATE: 1.1, // 汉字比率
+  NUM_RATE: 0.65, // 数字
+  OTHER_RATE: 0.8 // 除汉字和数字以外的字符的比率
+}
+const fontSize = 16
+// 注册组件
+Vue.use(AFTableColumn, { fontRate, fontSize })
 Vue.use(directive)
 Vue.use(plugins)
 Vue.use(VueMeta)

+ 42 - 0
src/newApi/activityRecommend.js

@@ -0,0 +1,42 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //新增商品推荐
+    appactivityrecommend(data) {
+        return request({
+            url: '/activity/recommend',
+            method: 'post',
+            data
+        })
+    },
+    //修改商品推荐
+    editactivityrecommend(data) {
+        return request({
+            url: '/activity/recommend/edit',
+            method: 'post',
+            data
+        })
+    },
+    //删除商品推荐
+    removeactivityrecommend(data) {
+        return request({
+            url: '/activity/recommend/remove',
+            method: 'post',
+            data
+        })
+    },
+    //查询商品推荐列表
+    inquireactivityrecommendList(data) {
+        return request({
+            url: '/activity/recommend/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //获取商品推荐详细信息
+    obtainactivityrecommend(data) {
+        return request({
+            url: `/activity/recommend/` + data,
+            method: 'get',
+        })
+    },
+}

+ 93 - 3
src/newApi/applicationData.js

@@ -16,10 +16,18 @@ export default {
             data
         })
     },
-    //导入新增预约考试模板
-    editsystemimportDatae(data) {
+    //批量选考试登记状态
+    editMoresystemsubscribe(data) {
         return request({
-            url: '/system/subscribe/importData',
+            url: '/system/subscribe/editMore',
+            method: 'post',
+            data
+        })
+    },
+    //预约考试身份证导入新增模板
+    editsystemimportIdsData(data) {
+        return request({
+            url: '/system/subscribe/importIdsData',
             method: 'post',
             data
         })
@@ -56,4 +64,86 @@ export default {
             params: data
         })
     },
+    //查询报考数据用户列表
+    inquiresystemsubscribelistUser(data) {
+        return request({
+            url: '/system/subscribe/listUser',
+            method: 'get',
+            params: data
+        })
+    },
+    //导出新增预约模板
+    inquiresystemsubscribeexportNew(data) {
+        return request({
+            url: '/system/subscribe/exportNew',
+            method: 'get',
+            params: data
+        })
+    },
+    //导出登记模板
+    inquiresystemsubscribeexportRegister(data) {
+        return request({
+            url: '/system/subscribe/exportRegister',
+            method: 'get',
+            params: data
+        })
+    },
+
+    //导入新增预约考试模板
+    editsystemsubscribeimportData(data) {
+        return request({
+            url: '/system/subscribe/importData',
+            method: 'post',
+            data
+        })
+    },
+    //导入新增预约考培模板
+    editsystemsubscribeimportTrainData(data) {
+        return request({
+            url: '/system/subscribe/importTrainData',
+            method: 'post',
+            data
+        })
+    },
+    //导出错误数据
+    inquiresystemsubscribeexportErrorNew(data) {
+        return request({
+            url: '/system/subscribe/exportErrorNew',
+            method: 'post',
+            data
+        })
+    },
+    //导出新增含考培错误数据
+    inquiresystemsubscribeexportexportErrorTrain(data) {
+        return request({
+            url: '/system/subscribe/exportErrorTrain',
+            method: 'post',
+            data
+        })
+    },
+    //导出前培错误数据
+    inquiresystemsubscribeexportexportErrorUpdate(data) {
+        return request({
+            url: '/system/subscribe/exportErrorUpdate',
+            method: 'post',
+            data
+        })
+    },
+    //预约考试身份证导入新增模板过滤不存在
+    inquiresystemsubscribeimportIdsDataFilter(data) {
+        return request({
+            url: '/system/subscribe/importIdsDataFilter',
+            method: 'post',
+            data
+        })
+    },
+    //导入前检查身份证是否存在
+    inquiresystemsubscribecheckIdCardData(data) {
+        return request({
+            url: '/system/subscribe/checkIdCardData',
+            method: 'post',
+            data
+        })
+    },
+    
 }

+ 8 - 0
src/newApi/bankChapter.js

@@ -47,5 +47,13 @@ export default {
             params: data
         })
     },
+    //批量新增章卷
+    addMorebankchapter(data) {
+        return request({
+            url: '/bank/chapter/addMore',
+            method: 'post',
+            data
+        })
+    },
     
 }

+ 10 - 0
src/newApi/business.js

@@ -55,4 +55,14 @@ export default {
             data
         })
     },
+
+    //修改业务层次-退款审核
+    editRefundPeriodUserIdsCourseBusiness(data) {
+        return request({
+            url: '/course/business/editRefundPeriodUserIds',
+            method: 'post',
+            data
+        })
+    },
+
 }

+ 82 - 4
src/newApi/certificate.js

@@ -1,6 +1,6 @@
 import request from '@/utils/request' //引入axios请求及拦截器
 export default {
-    //新增证书
+    //新增证书类型
     appBaseCertificate(data) {
         return request({
             url: '/base/certificate',
@@ -8,7 +8,7 @@ export default {
             data
         })
     },
-    //修改证书
+    //修改证书类型
     editBaseCertificate(data) {
         return request({
             url: '/base/certificate/edit',
@@ -16,7 +16,7 @@ export default {
             data
         })
     },
-    //查询证书列表
+    //查询证书类型列表
     inquireBaseCertificate(data) {
         return request({
             url: '/base/certificate/list',
@@ -24,11 +24,89 @@ export default {
             params: data
         })
     },
-    //获取证书详细信息
+    //获取证书类型详细信息
     obtainBaseCertificate(data) {
         return request({
             url: `/base/certificate/` + data,
             method: 'get',
         })
     },
+    /**
+     *  
+     * @remarks 证书模板 
+     */
+    //新增证书模板
+    appBaseCertificatetp(data) {
+        return request({
+            url: '/certificate/tp',
+            method: 'post',
+            data
+        })
+    },
+    //修改证书模板
+    editBaseCertificatetp(data) {
+        return request({
+            url: '/certificate/tp/edit',
+            method: 'post',
+            data
+        })
+    },
+    //查询证书模板列表
+    inquireBaseCertificatetp(data) {
+        return request({
+            url: '/certificate/tp/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //获取证书模板详细信息
+    obtainBaseCertificatetp(data) {
+        return request({
+            url: `/certificate/tp/` + data,
+            method: 'get',
+        })
+    },
+    //查询用户证书列表
+    inquireBaseuserCertificatelist(data) {
+        return request({
+            url: '/user/certificate/list',
+            method: 'get',
+            params: data
+        })
+    },
+    /**
+     *  
+     * @remarks 证书名称 
+     */
+    //新增证书名称
+    appBaseCertificatecommon(data) {
+        return request({
+            url: '/base/certificate/common',
+            method: 'post',
+            data
+        })
+    },
+    //修改证书名称
+    editBaseCertificatecommon(data) {
+        return request({
+            url: '/base/certificate/common/edit',
+            method: 'post',
+            data
+        })
+    },
+    //查询证书名称列表
+    inquireBaseCertificatecommon(data) {
+        return request({
+            url: '/base/certificate/common/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //获取证书名称详细信息
+    obtainBaseCertificatecommon(data) {
+        return request({
+            url: `/base/certificate/common/` + data,
+            method: 'get',
+        })
+    },
 }

+ 104 - 1
src/newApi/classTab.js

@@ -1,6 +1,21 @@
 import request from '@/utils/request' //引入axios请求及拦截器
 export default {
-
+    //查询学员学习记录列表
+    gradegradelistUserStudyRecord(data) {
+        return request({
+            url: '/grade/grade/listUserStudyRecord',
+            method: 'get',
+            params: data
+        })
+    },
+    //导出学员学时列表
+    inquireGradegradeListexport(data) {
+        return request({
+            url: '/grade/grade/export',
+            method: 'get',
+            params: data
+        })
+    },
     //选新班
     gradegradechangeGrade(data) {
         return request({
@@ -59,6 +74,14 @@ export default {
     },
     //查询学员学时列表
     inquireGradegradelistUserPeriod(data) {
+        return request({
+            url: '/grade/grade/listUserPeriodRecord',
+            method: 'get',
+            params: data
+        })
+    },
+    //查询学员学时列表s
+    inquireGradegradelistUserPeriods(data) {
         return request({
             url: '/grade/grade/listUserPeriod',
             method: 'get',
@@ -120,6 +143,22 @@ export default {
             params: data
         })
     },
+    //锁定学时审核页面
+    inquireGradegradelockPeriod(data) {
+        return request({
+            url: '/grade/grade/lockPeriod',
+            method: 'post',
+            data
+        })
+    },
+    //查看学时审核锁定状态
+    inquireGradegradelockPeriodStatus(data) {
+        return request({
+            url: '/grade/grade/lockPeriodStatus',
+            method: 'post',
+            data
+        })
+    },
     //学时审核獲得商品節下面的審核記錄
     inquireGradegradelistPeriodAuditStatus(data) {
         return request({
@@ -153,4 +192,68 @@ export default {
             data
         })
     },
+    //批量打回待审核状态
+    editGradeUsereditrollbackPeriod(data) {
+        return request({
+            url: '/grade/grade/rollbackPeriod',
+            method: 'post',
+            data
+        })
+    },
+    //学时通过确认
+    editGradeUsereditrollconfirmPeriod(data) {
+        return request({
+            url: '/grade/grade/confirmPeriod',
+            method: 'post',
+            data
+        })
+    },
+    //批量官方信息推送
+    editGradeUsereditpushInfo(data) {
+        return request({
+            url: '/grade/student/pushInfo',
+            method: 'post',
+            data
+        })
+    },
+    //批量学时信息推送
+    editGradeUsereditpushPeriod(data) {
+        return request({
+            url: '/grade/student/pushPeriod',
+            method: 'post',
+            data
+        })
+    },
+    //查询班级信息推送数量
+    inquireGradegradeofficialInfoCount(data) {
+        return request({
+            url: '/grade/grade/officialInfoCount',
+            method: 'get',
+            params: data
+        })
+    },
+    //查询班级学时推送数量
+    inquireGradegradeofficialPeriodCount(data) {
+        return request({
+            url: '/grade/grade/officialPeriodCount',
+            method: 'get',
+            params: data
+        })
+    },
+    //批量官方信息推送
+    gradesendCode(data) {
+        return request({
+            url: '/grade/grade/sendCode',
+            method: 'post',
+            data
+        })
+    },
+    //数据批量同步到官方系统
+    gradeOpenQdyAccount(data) {
+        return request({
+            url: '/grade/grade/OpenQdyAccount',
+            method: 'post',
+            data
+        })
+    },
 }

+ 24 - 0
src/newApi/examapply.js

@@ -48,6 +48,14 @@ export default {
             params: data
         })
     },
+    //查询考试配置绑定用户列表
+    inquirepayservelistUser(data) {
+        return request({
+            url: '/system/apply/listUser',
+            method: 'get',
+            params: data
+        })
+    },
     //查询考试安排商品列表
     inquirepayservelistGoods(data) {
         return request({
@@ -71,4 +79,20 @@ export default {
             method: 'get',
         })
     },
+    //批量新增前培绑定考试计划
+    addexamapply(data) {
+        return request({
+            url: '/exam/apply',
+            method: 'post',
+            data
+        })
+    },
+    //查询前培绑定考试计划列表
+    inquireexamapplyList(data) {
+        return request({
+            url: '/exam/apply/list',
+            method: 'get',
+            params: data
+        })
+    },
 }

+ 16 - 0
src/newApi/festival.js

@@ -24,6 +24,14 @@ export default {
             data
         })
     },
+    //导入节模板-带业务层次
+    drCourseSectionimportDataBusiness(data) {
+        return request({
+            url: '/course/section/importDataBusiness',
+            method: 'post',
+            data
+        })
+    },
     //查询课程小节列表
     inquireCourseSection(data) {
         return request({
@@ -47,4 +55,12 @@ export default {
             method: 'get',
         })
     },
+    //批量新增课程小节
+    drCourseSectionaddMore(data) {
+        return request({
+            url: '/course/section/addMore',
+            method: 'post',
+            data
+        })
+    },
 }

+ 8 - 0
src/newApi/gigChapter.js

@@ -45,4 +45,12 @@ export default {
             method: 'get',
         })
     },
+    //批量新增课程大章
+    addMoreCoursechapter(data) {
+        return request({
+            url: '/course/chapter/addMore',
+            method: 'post',
+            data
+        })
+    },
 }

+ 25 - 1
src/newApi/goods.js

@@ -98,7 +98,31 @@ export default {
     //查询编辑数据是否有用户通过学时
     gradecheckGoodsChange(data) {
         return request({
-            url: '/grade/grade/checkGoodsChange',
+            url: '/grade/grade/checkGoodsStudy',
+            method: 'get',
+            params: data
+        })
+    },
+    //查询免费题库商品列表
+    inquiregoodslistFreeGoodsList(data) {
+        return request({
+            url: '/goods/listFreeGoodsList',
+            method: 'get',
+            params: data
+        })
+    },
+    //查询用户题库商品列表
+    inquiregoodslistBankGoodsList(data) {
+        return request({
+            url: '/goods/listBankGoodsList',
+            method: 'get',
+            params: data
+        })
+    },
+    //导出直播商品列表
+    inquiregoodslistBankexport_list(data) {
+        return request({
+            url: '/goods/export_list',
             method: 'get',
             params: data
         })

+ 59 - 0
src/newApi/homeApi.js

@@ -0,0 +1,59 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //控制台学员数据
+    baseconsolestudentData(data) {
+        return request({
+            url: '/base/console/studentData',
+            method: 'get',
+            params: data
+        })
+    },
+    //控制台订单数据
+    baseconsoleorderData(data) {
+        return request({
+            url: '/base/console/orderData',
+            method: 'get',
+            params: data
+        })
+    },
+    //控制台班级数据
+    baseconsolegradeData(data) {
+        return request({
+            url: '/base/console/gradeData',
+            method: 'get',
+            params: data
+        })
+    },
+    //控制台学时数据
+    baseconsoleperiodData(data) {
+        return request({
+            url: '/base/console/periodData',
+            method: 'get',
+            params: data
+        })
+    },
+    //控制台考试数据
+    baseconsoletestData(data) {
+        return request({
+            url: '/base/console/testData',
+            method: 'get',
+            params: data
+        })
+    },
+    //控制台模考数据
+    baseconsolemockData(data) {
+        return request({
+            url: '/base/console/mockData',
+            method: 'get',
+            params: data
+        })
+    },
+    //控制台填写资料审核数据
+    baseconsoleprofileData(data) {
+        return request({
+            url: '/base/console/profileData',
+            method: 'get',
+            params: data
+        })
+    },
+}

+ 42 - 0
src/newApi/invoice.js

@@ -0,0 +1,42 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //新增订单发票
+    addorderInvoice(data) {
+        return request({
+            url: '/order/invoice',
+            method: 'post',
+            data
+        })
+    },
+    //修改订单发票
+    editorderInvoice(data) {
+        return request({
+            url: '/order/invoice/edit',
+            method: 'post',
+            data
+        })
+    },
+    //查询订单发票列表
+    inquireorderInvoiceList(data) {
+        return request({
+            url: '/order/invoice/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //获取订单发票详细信息
+    obtainorderInvoice(data) {
+        return request({
+            url: `/order/invoice/` + data,
+            method: 'get',
+        })
+    },
+    //发票识别
+    editvatInvoiceOCR(data) {
+        return request({
+            url: '/order/invoice/vatInvoiceOCR',
+            method: 'post',
+            data
+        })
+    },
+}

+ 35 - 0
src/newApi/mock.js

@@ -0,0 +1,35 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //新增模考安排
+    appmockapply(data) {
+        return request({
+            url: '/mock/apply',
+            method: 'post',
+            data
+        })
+    },
+    //修改模考安排
+    editmockapply(data) {
+        return request({
+            url: '/mock/apply/edit',
+            method: 'post',
+            data
+        })
+    },
+    //查询模考安排列表
+    inquiremockapplylistApply(data) {
+        return request({
+            url: '/mock/apply/listApply',
+            method: 'get',
+            params: data
+        })
+    },
+    //查询模考安排列表
+    inquiremockapplylistApplydata(data) {
+        return request({
+            url: '/mock/apply/' + data,
+            method: 'get',
+        })
+    },
+    
+}

+ 34 - 0
src/newApi/mockSub.js

@@ -0,0 +1,34 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //查询用户预约模考列表
+    inquireusersubscribelistSubscribe(data) {
+        return request({
+            url: '/user/subscribe/listSubscribe',
+            method: 'get',
+            params: data
+        })
+    },
+    //修改用户模考做题历史
+    editmockrecord(data) {
+        return request({
+            url: '/mock/record/edit',
+            method: 'post',
+            data
+        })
+    },
+    //查询用户模考做题历史列表
+    inquiremockrecordlist(data) {
+        return request({
+            url: '/mock/record/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //获取用户模考做题历史详细信息
+    inquiremockrecordId(data) {
+        return request({
+            url: '/mock/record/' + data,
+            method: 'get',
+        })
+    },
+}

+ 85 - 0
src/newApi/newOrder.js

@@ -0,0 +1,85 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //新增录单
+    apporderinput(data) {
+        return request({
+            url: '/order/input',
+            method: 'post',
+            data
+        })
+    },
+    //新增后台录单
+    apporderinputOrder(data) {
+        return request({
+            url: '/order/inputOrder',
+            method: 'post',
+            data
+        })
+    },
+    //查询录单列表
+    inquireorderinputList(data) {
+        return request({
+            url: '/order/input/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //查询商品列表To录单
+    inquiregoodslistToInputList(data) {
+        return request({
+            url: '/goods/listToInput',
+            method: 'get',
+            params: data
+        })
+    },
+    //修改订单计费单-单个
+    editordersheetedit(data) {
+        return request({
+            url: '/order/sheet/edit',
+            method: 'post',
+            data
+        })
+    },
+    //修改录单总单计费单
+    editOrdersheetinput(data) {
+        return request({
+            url: '/order/sheet/input/edit',
+            method: 'post',
+            data
+        })
+    },
+    //获取录单详细信息
+    inquireorderinputdetail(data) {
+        return request({
+            url: '/order/input/detail',
+            method: 'get',
+            params: data
+        })
+    },
+    //查询录单详情用户列表
+    inquireorderinputuserList(data) {
+        return request({
+            url: '/order/input/userList',
+            method: 'get',
+            params: data
+        })
+    },
+    //查询录单用户商品列表
+    inquireorderinputuserGoodsList(data) {
+        return request({
+            url: '/order/input/userGoodsList',
+            method: 'get',
+            params: data
+        })
+    },
+    //导出错误录入订单
+    inquireorderexportWrongInputOrder(data) {
+        return request({
+            url: '/order/exportWrongInputOrder',
+            method: 'post',
+            data
+        })
+    },
+
+
+}

+ 57 - 0
src/newApi/order.js

@@ -24,6 +24,14 @@ export default {
             params: data
         })
     },
+    //查询复购冲突订单列表
+    inquireOrderrebuyListList(data) {
+        return request({
+            url: '/order/rebuyList',
+            method: 'get',
+            params: data
+        })
+    },
     //获取订单详细信息
     obtainOrder(data) {
         return request({
@@ -55,4 +63,53 @@ export default {
             params: data
         })
     },
+    //查询购买商品的用户列表
+    inquireOrderGoodsBuyGoodsUserList(data) {
+        return request({
+            url: '/order/goods/buyGoodsUserList',
+            method: 'get',
+            params: data
+        })
+    },
+    
+    //关闭订单商品
+    closeOrderGoodsordergoods(data) {
+        return request({
+            url: '/order/goods/closeOrderGoods',
+            method: 'post',
+            data
+        })
+    },
+    //查询购买直播商品的用户列表
+    inquireOrderGoodsBuyLiveGoodsList(data) {
+        return request({
+            url: '/order/goods/listLiveGoodsList',
+            method: 'get',
+            params: data
+        })
+    },
+    //直播商品的用户学习列表
+    inquireOrderGoodsBuyuserSectionLiveList(data) {
+        return request({
+            url: '/order/goods/userSectionLiveList',
+            method: 'get',
+            params: data
+        })
+    },
+    //保利威用户学习时间日志
+    inquireOrderGoodsBuyuserSectionLiveLog(data) {
+        return request({
+            url: '/order/goods/userSectionLiveLog',
+            method: 'get',
+            params: data
+        })
+    },
+    //导出购买直播商品的学员学习记录
+    inquireOrderGoodsexport_listLiveGoodsList(data) {
+        return request({
+            url: '/order/goods/export_listLiveGoodsList',
+            method: 'get',
+            params: data
+        })
+    },
 }

+ 34 - 0
src/newApi/orderBusiness.js

@@ -0,0 +1,34 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //新增录单配置
+    apporderbusinessconfig(data) {
+        return request({
+            url: '/order/business/config',
+            method: 'post',
+            data
+        })
+    },
+    //修改录单配置
+    editorderbusinessconfig(data) {
+        return request({
+            url: '/order/business/config/edit',
+            method: 'post',
+            data
+        })
+    },
+    //查询录单配置列表
+    inquireorderbusinessconfigList(data) {
+        return request({
+            url: '/order/business/config/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //获取录单配置详细信息
+    obtainorderbusinessconfig(data) {
+        return request({
+            url: `/order/business/config/` + data,
+            method: 'get',
+        })
+    },
+}

+ 50 - 0
src/newApi/orderConfigBusiness.js

@@ -0,0 +1,50 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //新增订单配置商品
+    apporderconfiggoods(data) {
+        return request({
+            url: '/order/config/goods',
+            method: 'post',
+            data
+        })
+    },
+    //修改订单配置商品
+    editorderconfiggoods(data) {
+        return request({
+            url: '/order/config/goods/edit',
+            method: 'post',
+            data
+        })
+    },
+    //查询订单配置商品列表
+    inquireorderconfiggoodsList(data) {
+        return request({
+            url: '/order/config/goods/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //获取录单配置详细信息
+    obtainorderconfiggoods(data) {
+        return request({
+            url: `/order/config/goods/` + data,
+            method: 'get',
+        })
+    },
+    //导入用户
+    appuserimportData(data) {
+        return request({
+            url: '/app/user/importData',
+            method: 'post',
+            data
+        })
+    },
+    //导出失败导入用户
+    appuserimporexportFailData(data) {
+        return request({
+            url: '/app/user/exportFailData',
+            method: 'post',
+            data
+        })
+    },
+}

+ 8 - 0
src/newApi/paper.js

@@ -80,4 +80,12 @@ export default {
             method: 'get',
         })
     },
+    //批量新增试卷
+    addMorebankexam(data) {
+        return request({
+            url: '/bank/exam/addMore',
+            method: 'post',
+            data
+        })
+    },
 }

+ 24 - 0
src/newApi/paperquestion.js

@@ -47,4 +47,28 @@ export default {
             method: 'get',
         })
     },
+    //导入题目Word模板
+    bankquestionimportWordData(data) {
+        return request({
+            url: '/bank/question/importWordData',
+            method: 'post',
+            data
+        })
+    },
+    //导入题目Word模板列表
+    bankquestionimportWordQuestionList(data) {
+        return request({
+            url: '/bank/question/importWordQuestionList',
+            method: 'post',
+            data
+        })
+    },
+    //导入题目模板EXCEL
+    importDatabankimportDataBackList(data) {
+        return request({
+            url: '/bank/question/importDataBackList',
+            method: 'post',
+            data
+        })
+    },
 }

+ 35 - 0
src/newApi/refund.js

@@ -0,0 +1,35 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //批量新增录单订单商品退款
+    apporderinputOrderrefund(data) {
+        return request({
+            url: '/order/refund',
+            method: 'post',
+            data
+        })
+    },
+    //查询订单商品退款列表
+    inquireorderrefundlist(data) {
+        return request({
+            url: '/order/refund/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //初审确认
+    editorderrefundfirstPeriod(data) {
+        return request({
+            url: '/order/refund/firstPeriod',
+            method: 'post',
+            data
+        })
+    },
+    //复审确认
+    editorderrefundconfirmPeriod(data) {
+        return request({
+            url: '/order/refund/confirmPeriod',
+            method: 'post',
+            data
+        })
+    },
+}

+ 27 - 0
src/newApi/reviewer.js

@@ -0,0 +1,27 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //更改审核资料模板用户ID
+    editcourseBusinessProfileTpUserIds(data) {
+        return request({
+            url: '/course/business/editProfileTpUserIds',
+            method: 'post',
+            data
+        })
+    },
+    //更改学时审核用户ID
+    editcourseBusinessPeriodUserIds(data) {
+        return request({
+            url: '/course/business/editPeriodUserIds',
+            method: 'post',
+            data
+        })
+    },
+    //业务层次获取用户列表
+    inquiresystemUserbusinessPeopleList(data) {
+        return request({
+            url: '/system/user/businessPeopleList',
+            method: 'get',
+            params: data
+        })
+    },
+}

+ 18 - 0
src/newApi/studentList.js

@@ -72,4 +72,22 @@ export default {
             params: data
         })
     },
+    // 查询用户修改记录列表
+    inquireuserChangeInfoList(data) {
+        return request({
+            url: '/grade/student/userChangeInfoList',
+            method: 'get',
+            params: data
+        })
+    },
+    // 查询学员直播商品学习记录
+    inquireuserlistLive(data) {
+        return request({
+            url: '/grade/student/listLive',
+            method: 'get',
+            params: data
+        })
+    },
+    
+
 }

+ 34 - 0
src/newApi/studyAccountStatus.js

@@ -0,0 +1,34 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    // //新增广告发布储存
+    // appbaseadvertising(data) {
+    //     return request({
+    //         url: '/base/advertising',
+    //         method: 'post',
+    //         data
+    //     })
+    // },
+    // //修改广告发布储存
+    // editbaseadvertising(data) {
+    //     return request({
+    //         url: '/base/advertising/edit',
+    //         method: 'post',
+    //         data
+    //     })
+    // },
+    //查询学习账号标记列表
+    gradelistStudyAccountStatus(data) {
+        return request({
+            url: '/grade/grade/listStudyAccountStatus',
+            method: 'get',
+            params: data
+        })
+    },
+    // //获取广告发布储存详细信息
+    // obtainbaseadvertising(data) {
+    //     return request({
+    //         url: `/base/advertising/` + data,
+    //         method: 'get',
+    //     })
+    // },
+}

+ 3 - 0
src/plugins/index.js

@@ -2,9 +2,12 @@ import auth from './auth'
 import cache from './cache'
 import modal from './modal'
 import download from './download'
+import tab from './tab'
 
 export default {
   install(Vue) {
+    // 页签操作
+    Vue.prototype.$tab = tab
     // 认证对象
     Vue.prototype.$auth = auth
     // 缓存对象

+ 67 - 0
src/plugins/tab.js

@@ -0,0 +1,67 @@
+import store from '@/store'
+import router from '@/router';
+
+export default {
+  // 刷新当前tab页签
+  refreshPage(obj) {
+    const { path, query, matched } = router.currentRoute;
+    if (obj === undefined) {
+      matched.forEach((m) => {
+        if (m.components && m.components.default && m.components.default.name) {
+          if (!['Layout', 'ParentView'].includes(m.components.default.name)) {
+            obj = { name: m.components.default.name, path: path, query: query };
+          }
+        }
+      });
+    }
+    return store.dispatch('tagsView/delCachedView', obj).then(() => {
+      const { path, query } = obj
+      router.replace({
+        path: '/redirect' + path,
+        query: query
+      })
+    })
+  },
+  // 关闭当前tab页签,打开新页签
+  closeOpenPage(obj) {
+    store.dispatch("tagsView/delView", router.currentRoute);
+    if (obj !== undefined) {
+      return router.push(obj);
+    }
+  },
+  // 关闭指定tab页签
+  closePage(obj) {
+    if (obj === undefined) {
+      return store.dispatch('tagsView/delView', router.currentRoute).then(({ lastPath }) => {
+        return router.push(lastPath || '/');
+      });
+    }
+    return store.dispatch('tagsView/delView', obj);
+  },
+  // 关闭所有tab页签
+  closeAllPage() {
+    return store.dispatch('tagsView/delAllViews');
+  },
+  // 关闭左侧tab页签
+  closeLeftPage(obj) {
+    return store.dispatch('tagsView/delLeftTags', obj || router.currentRoute);
+  },
+  // 关闭右侧tab页签
+  closeRightPage(obj) {
+    return store.dispatch('tagsView/delRightTags', obj || router.currentRoute);
+  },
+  // 关闭其他tab页签
+  closeOtherPage(obj) {
+    return store.dispatch('tagsView/delOthersViews', obj || router.currentRoute);
+  },
+  // 添加tab页签
+  openPage(title, url) {
+    var obj = { path: url, meta: { title: title } }
+    store.dispatch('tagsView/addView', obj);
+    return router.push(url);
+  },
+  // 修改tab页签
+  updatePage(obj) {
+    return store.dispatch('tagsView/updateVisitedView', obj);
+  }
+}

+ 1 - 1
src/router/index.js

@@ -72,7 +72,7 @@ export const constantRoutes = [
         path: 'index',
         component: (resolve) => require(['@/views/index'], resolve),
         name: 'Index',
-        meta: { title: '首页', icon: 'dashboard', affix: true }
+        meta: { title: '工作台', icon: 'dashboard', affix: true }
       }
     ]
   },

+ 1 - 1
src/settings.js

@@ -12,7 +12,7 @@ module.exports = {
   /**
    * 是否显示顶部导航
    */
-  topNav: false,
+  topNav: true,
 
   /**
    * 是否显示 tagsView

+ 45 - 1
src/store/getters.js

@@ -1,6 +1,10 @@
 import api from '@/api/api'
 
 const getters = {
+  modulePage: state => state.dataCache.modulePage,//模块变化
+  festivalPage: state => state.dataCache.festivalPage,//章变化
+  chapterExamPage: state => state.dataCache.chapterExamPage,//章卷变化
+  testPaperPage: state => state.dataCache.testPaperPage,//试卷变化
   sidebar: state => state.app.sidebar,
   size: state => state.app.size,
   device: state => state.app.device,
@@ -19,7 +23,7 @@ const getters = {
   sidebarRouters: state => state.permission.sidebarRouters,
   indexnum(state) {
     if (!state.dict.indexnum) {
-      api.inquireGradegradelistUserPeriod({ status: "0,1", periodStatus: 2 }).then(res => {
+      api.inquireGradegradelistUserPeriod({ status: 1, periodStatus: 2, pageSize: 1, pageNum: 1 }).then(res => {
         state.dict.indexnum = res.total
       })
     }
@@ -97,6 +101,22 @@ const getters = {
     }
     return state.dict.certificate
   },
+  certificateName(state) {
+    if (!state.dict.certificateName) {
+      api.inquireBaseCertificatecommon({ status: 1 }).then(res => {
+        state.dict.certificateName = res.rows
+      })
+    }
+    return state.dict.certificateName
+  },
+  certificateTp(state) {
+    if (!state.dict.certificateTp) {
+      api.inquireBaseCertificatetp({ status: 1 }).then(res => {
+        state.dict.certificateTp = res.rows
+      })
+    }
+    return state.dict.certificateTp
+  },
   labelList(state) {
     if (!state.dict.labelList) {
       api.inquireCourseLabelList({ status: 1 }).then(res => {
@@ -201,6 +221,14 @@ const getters = {
     }
     return state.dict.classList
   },
+  examLists(state) {
+    if (!state.dict.examLists) {
+      api.inquiresystemapplyList({ status: "0,1,2" }).then(res => {
+        state.dict.examLists = res.rows
+      })
+    }
+    return state.dict.examLists
+  },
   examList(state) {
     if (!state.dict.examList) {
       api.inquiresystemapplyList({ status: 1 }).then(res => {
@@ -209,6 +237,14 @@ const getters = {
     }
     return state.dict.examList
   },
+  applySiteAddress(state) {
+    if (!state.dict.applySiteAddress) {
+      api.inquiresystemsite({ status: 1 }).then(res => {
+        state.dict.applySiteAddress = res.rows
+      })
+    }
+    return state.dict.applySiteAddress
+  },
   beforeList(state) {
     if (!state.dict.beforeList) {
       api.inquiresystembefore({ status: 1 }).then(res => {
@@ -217,5 +253,13 @@ const getters = {
     }
     return state.dict.beforeList
   },
+  beforeLists(state) {
+    if (!state.dict.beforeLists) {
+      api.inquiresystembefore({ status: '0,1,2' }).then(res => {
+        state.dict.beforeLists = res.rows
+      })
+    }
+    return state.dict.beforeLists
+  },
 }
 export default getters

+ 3 - 1
src/store/index.js

@@ -1,6 +1,7 @@
 import Vue from 'vue'
 import Vuex from 'vuex'
 import app from './modules/app'
+import dataCache from './modules/dataCache'
 import user from './modules/user'
 import tagsView from './modules/tagsView'
 import permission from './modules/permission'
@@ -17,7 +18,8 @@ const store = new Vuex.Store({
     tagsView,
     permission,
     settings,
-    dict
+    dict,
+    dataCache
   },
   getters
 })

+ 47 - 0
src/store/modules/dataCache.js

@@ -0,0 +1,47 @@
+
+const state = {
+  modulePage: null,//模块-章变化
+  festivalPage: null,//章-节变化
+  chapterExamPage: null,//章卷-节变化
+  testPaperPage:null,//试卷变化
+}
+const mutations = {
+  //更新模块变化记录
+  MODULEPAGE(state, data) {
+    state.modulePage = data
+  },
+  //更新模块变化记录
+  FESTIVALPAGE(state, data) {
+    state.festivalPage = data
+  },
+  //更新章卷变化记录
+  CHAPTEREXAMPAGE(state, data) {
+    state.chapterExamPage = data
+  },
+  //更新试卷变化记录
+  TESTPAPERPAGE(state, data) {
+    state.testPaperPage = data
+  },
+}
+
+const actions = {
+  changemodulePage({ commit }, data) {
+    commit('MODULEPAGE', data)
+  },
+  changefestivalPage({ commit }, data) {
+    commit('FESTIVALPAGE', data)
+  },
+  changechapterExamPage({ commit }, data) {
+    commit('CHAPTEREXAMPAGE', data)
+  },
+  changetestPaperPage({ commit }, data) {
+    commit('TESTPAPERPAGE', data)
+  },
+}
+
+export default {
+  state,
+  mutations,
+  actions
+}
+

+ 104 - 75
src/store/modules/dict.js

@@ -1,184 +1,213 @@
 
 import api from '@/api/api'
 const state = {
-    roleList:null,//角色列表
-    educationType: null,//教育类型
-    projectType: null,//项目类型
-    businessLevel: null,//业务层级
-    sujectType: null,//科目
-    schoolList: null,//院校
-    Professional: null,//专业
-    courseExamine: null,//考期
-    certificate: null,//证书
-    labelList: null,//标签
-    payList: null,//支付通道
-    paypayee: null,//收款方
-    paysource: null,//渠道来源
-    payvisit: null,//到访分校
-    payserve: null,//服务模式
-    paysupply: null,//供应方
-    paynature: null,//收费性质
-    paycost: null,//费用类型
-    paperexam: null,//试卷类型
-    areas: null,//地区-省
-    cityList: null,//地区-市
-    classList:null,//班级
-    examList:null,//考试安排
-    beforeList:null,//前培安排
-    indexnum:null,//模拟
+  roleList: null,//角色列表
+  educationType: null,//教育类型
+  projectType: null,//项目类型
+  businessLevel: null,//业务层级
+  sujectType: null,//科目
+  schoolList: null,//院校
+  Professional: null,//专业
+  courseExamine: null,//考期
+  certificate: null,//证书类型
+  certificateName: null,//证书名称
+  certificateTp: null,//证书模板
+  labelList: null,//标签
+  payList: null,//支付通道
+  paypayee: null,//收款方
+  paysource: null,//渠道来源
+  payvisit: null,//到访分校
+  payserve: null,//服务模式
+  paysupply: null,//供应方
+  paynature: null,//收费性质
+  paycost: null,//费用类型
+  paperexam: null,//试卷类型
+  areas: null,//地区-省
+  cityList: null,//地区-市
+  classList: null,//班级
+  examList: null,//考试安排过滤
+  examLists: null,//考试安排
+  applySiteAddress: null,//考试地点
+  beforeList: null,//前培安排过滤
+  beforeLists: null,//前培安排
+  indexnum: null,//模拟
 }
 const mutations = {
   //更新角色列表
-  EDICROLELIST(state){
-    api.obtainRoleList({status:1}).then(res => {
+  EDICROLELIST(state) {
+    api.obtainRoleList({ status: 1 }).then(res => {
       state.roleList = res.rows
     })
   },
   //更新教育类型
-  EDICATIONTYPE(state){
-    api.inquireCourseEducationType({status:1}).then(res => {
+  EDICATIONTYPE(state) {
+    api.inquireCourseEducationType({ status: 1 }).then(res => {
       state.educationType = res.rows
     })
   },
   //更新项目类型
-  PROJECTTYPE(state){
-    api.inquireCourseProjectType({status:1}).then(res => {
+  PROJECTTYPE(state) {
+    api.inquireCourseProjectType({ status: 1 }).then(res => {
       state.projectType = res.rows
     })
   },
   //更新业务层级
-  BUSINESSLEVEL(state){
-    api.inquirebusinessList({status:1}).then(res => {
+  BUSINESSLEVEL(state) {
+    api.inquirebusinessList({ status: 1 }).then(res => {
       state.businessLevel = res.rows
     })
   },
 
   //更新科目
-  SUJECTTYPE(state){
-    api.inquireCourseSubject({status:1}).then(res => {
+  SUJECTTYPE(state) {
+    api.inquireCourseSubject({ status: 1 }).then(res => {
       state.sujectType = res.rows
     })
   },
   //更新院校
-  SCHOOLLIST(state){
-    api.inquireUserSchool({status:1}).then(res => {
+  SCHOOLLIST(state) {
+    api.inquireUserSchool({ status: 1 }).then(res => {
       state.schoolList = res.rows
     })
   },
   //更新专业
-  PROFESSIONAL(state){
-    api.inquireCourseMajor({status:1}).then(res => {
+  PROFESSIONAL(state) {
+    api.inquireCourseMajor({ status: 1 }).then(res => {
       state.Professional = res.rows
     })
   },
   //更新考期
-  COURSEEXAMINE(state){
-    api.inquireCourseExamine({status:1}).then(res => {
+  COURSEEXAMINE(state) {
+    api.inquireCourseExamine({ status: 1 }).then(res => {
       state.courseExamine = res.rows
     })
   },
-  //更新证书
-  CERTIFICATE(state){
-    api.inquireBaseCertificate({status:1}).then(res => {
+  //更新证书类型
+  CERTIFICATE(state) {
+    api.inquireBaseCertificate({ status: 1 }).then(res => {
       state.certificate = res.rows
     })
   },
+  //更新证书名称
+  CERTIFICATENAME(state) {
+    api.inquireBaseCertificatecommon({ status: 1 }).then(res => {
+      state.certificateName = res.rows
+    })
+  },
+  //更新证书模板
+  CERTIFICATETP(state) {
+    api.inquireBaseCertificatetp({ status: 1 }).then(res => {
+      state.certificateTp = res.rows
+    })
+  },
   //更新标签
-  LABELLIST(state){
-    api.inquireCourseLabelList({status:1}).then(res => {
+  LABELLIST(state) {
+    api.inquireCourseLabelList({ status: 1 }).then(res => {
       state.labelList = res.rows
     })
   },
   //更新支付通道
-  PAYLIST(state){
-    api.inquirepayaislelist({status:1}).then(res => {
+  PAYLIST(state) {
+    api.inquirepayaislelist({ status: 1 }).then(res => {
       state.payList = res.rows
     })
   },
   //更新收款方
-  PAYPAYEE(state){
-    api.inquirepaypayee({status:1}).then(res => {
+  PAYPAYEE(state) {
+    api.inquirepaypayee({ status: 1 }).then(res => {
       state.paypayee = res.rows
     })
   },
   //更新渠道来源
-  PAYSOURCE(state){
-    api.inquirepaysource({status:1}).then(res => {
+  PAYSOURCE(state) {
+    api.inquirepaysource({ status: 1 }).then(res => {
       state.paysource = res.rows
     })
   },
   //更新到访分校
-  PAYVISIT(state){
-    api.inquirepayvisit({status:1}).then(res => {
+  PAYVISIT(state) {
+    api.inquirepayvisit({ status: 1 }).then(res => {
       state.payvisit = res.rows
     })
   },
 
 
   //更新服务模式
-  PAYSERVE(state){
-    api.inquirepayserve({status:1}).then(res => {
+  PAYSERVE(state) {
+    api.inquirepayserve({ status: 1 }).then(res => {
       state.payserve = res.rows
     })
   },
   //更新供应方
-  PAYSUPPLY(state){
-    api.inquirepaysupply({status:1}).then(res => {
+  PAYSUPPLY(state) {
+    api.inquirepaysupply({ status: 1 }).then(res => {
       state.paysupply = res.rows
     })
   },
   //更新收费性质
-  PAYNATURE(state){
-    api.inquirepaynature({status:1}).then(res => {
+  PAYNATURE(state) {
+    api.inquirepaynature({ status: 1 }).then(res => {
       state.paynature = res.rows
     })
   },
   //更新费用类型
-  PAYCOST(state){
-    api.inquirepaycost({status:1}).then(res => {
+  PAYCOST(state) {
+    api.inquirepaycost({ status: 1 }).then(res => {
       state.paycost = res.rows
     })
   },
   //更新地区-省
-  AREAS(state){
-    api.inquireapplyAreas({status:1}).then(res => {
+  AREAS(state) {
+    api.inquireapplyAreas({ status: 1 }).then(res => {
       state.areas = res.rows
     })
   },
   //更新地区-市
-  CITYLIST(state){
-    api.inquireapplyCityList({status:1}).then(res => {
+  CITYLIST(state) {
+    api.inquireapplyCityList({ status: 1 }).then(res => {
       state.cityList = res.rows
     })
   },
   //更新班级
-  CLASSLIST(state){
-    api.inquireGradegradeList({status:1}).then(res => {
+  CLASSLIST(state) {
+    api.inquireGradegradeList({ status: 1 }).then(res => {
       state.classList = res.rows
     })
   },
   //更新考试安排
-  EXAMLIST(state){
-    api.inquiresystemapplyList({status:1}).then(res => {
+  EXAMLIST(state) {
+    api.inquiresystemapplyList({ status: 1 }).then(res => {
       state.examList = res.rows
     })
+    api.inquiresystemapplyList({ status: "0,1,2" }).then(res => {
+      state.examLists = res.rows
+    })
+  },
+  //更新考试地点
+  APPLYSITEADDRESS(state) {
+    api.inquiresystemsite({ status: 1 }).then(res => {
+      state.applySiteAddress = res.rows
+    })
   },
   //更新前培安排
-  BEFORELIST(state){
-    api.inquiresystembefore({status:1}).then(res => {
+  BEFORELIST(state) {
+    api.inquiresystembefore({ status: 1 }).then(res => {
       state.beforeList = res.rows
     })
+    api.inquiresystembefore({ status: '0,1,2' }).then(res => {
+      state.beforeLists = res.rows
+    })
   },
   //更新试卷类型
-  EXAMTYPE(state){
-    api.inquirepaperexamList({status:1}).then(res => {
+  EXAMTYPE(state) {
+    api.inquirepaperexamList({ status: 1 }).then(res => {
       state.paperexam = res.rows
     })
   },
 }
 
 const actions = {
-  
+
 }
 
 export default {

+ 4 - 3
src/store/modules/permission.js

@@ -44,9 +44,10 @@ const permission = {
       // 顶部导航菜单默认添加统计报表栏指向首页
       const index = [{
         path: 'index',
-        meta: { title: '统计报表', icon: 'dashboard'}
+        meta: { title: '工作台', icon: 'dashboard'}
       }]
-      state.topbarRouters = routes.concat(index);
+      let ary = []
+      state.topbarRouters = ary.concat(index,routes)
     },
     SET_SIDEBAR_ROUTERS: (state, routes) => {
       state.sidebarRouters = routes
@@ -132,7 +133,7 @@ export const loadView = (view) => {
     return (resolve) => require([`@/views/${view}`], resolve)
   } else {
     // 使用 import 实现生产环境的路由懒加载
-    return () => import(`@/views/${view}`)
+    return (resolve) => require([`@/views/${view}`],resolve)
   }
 }
 

+ 59 - 34
src/store/modules/tagsView.js

@@ -1,6 +1,8 @@
+import { MessageBox } from 'element-ui';
 const state = {
   visitedViews: [],
-  cachedViews: []
+  cachedViews: [],
+  alertPage: ["CommodityManageMentAdd", "CommodityManageMentEdit", "FestivalAdd", "FestivalEdit", "ChapterAdd", "ChapterEdit", "ModuleManagementAdd", "ModuleManagementEdit", "BasicInfoEdit", "BasicInfoAdd", "ChapterContent", "EditCourse", "OrderDetail", "OrderPrice", "AddOrder", "EditPaper", "AddPaper", "TopicAddPaper", "ChapterVolumeManagementEdit", "ChapterVolumeManagementAdd", "VolumeManagementAdd", "VolumeManagementEdit", "HandoutListEdit", "HandoutListAdd", "StudentXQ", "AddClass", "ManageClass", "NotificationInfo", "NotificationListAdd", "NotificationEdit", "BulkImportPlan", "MatchInfoData", "BatchRecord", "OrderChargeInfo", "RefundDocument", "BillingBillCharges", "AddMockExam", "EditMockExam","RecordQusetion"],
 }
 
 const mutations = {
@@ -28,7 +30,6 @@ const mutations = {
     }
   },
   DEL_CACHED_VIEW: (state, view) => {
-    console.log(111)
     const index = state.cachedViews.indexOf(view.name)
     index > -1 && state.cachedViews.splice(index, 1)
   },
@@ -64,7 +65,7 @@ const mutations = {
       }
     }
   },
-  
+
   DEL_RIGHT_VIEWS: (state, view) => {
     const index = state.visitedViews.findIndex(v => v.path === view.path)
     if (index === -1) {
@@ -112,16 +113,6 @@ const actions = {
     commit('ADD_CACHED_VIEW', view)
   },
 
-  delView({ dispatch, state }, view) {
-    return new Promise(resolve => {
-      dispatch('delVisitedView', view)
-      dispatch('delCachedView', view)
-      resolve({
-        visitedViews: [...state.visitedViews],
-        cachedViews: [...state.cachedViews]
-      })
-    })
-  },
   delVisitedView({ commit, state }, view) {
     return new Promise(resolve => {
       commit('DEL_VISITED_VIEW', view)
@@ -135,16 +126,6 @@ const actions = {
     })
   },
 
-  delOthersViews({ dispatch, state }, view) {
-    return new Promise(resolve => {
-      dispatch('delOthersVisitedViews', view)
-      dispatch('delOthersCachedViews', view)
-      resolve({
-        visitedViews: [...state.visitedViews],
-        cachedViews: [...state.cachedViews]
-      })
-    })
-  },
   delOthersVisitedViews({ commit, state }, view) {
     return new Promise(resolve => {
       commit('DEL_OTHERS_VISITED_VIEWS', view)
@@ -158,16 +139,6 @@ const actions = {
     })
   },
 
-  delAllViews({ dispatch, state }, view) {
-    return new Promise(resolve => {
-      dispatch('delAllVisitedViews', view)
-      dispatch('delAllCachedViews', view)
-      resolve({
-        visitedViews: [...state.visitedViews],
-        cachedViews: [...state.cachedViews]
-      })
-    })
-  },
   delAllVisitedViews({ commit, state }) {
     return new Promise(resolve => {
       commit('DEL_ALL_VISITED_VIEWS')
@@ -184,7 +155,61 @@ const actions = {
   updateVisitedView({ commit }, view) {
     commit('UPDATE_VISITED_VIEW', view)
   },
-
+  exitView({ dispatch, state }, view) {
+    return new Promise(resolve => {
+      dispatch('delVisitedView', view)
+      dispatch('delCachedView', view)
+      resolve({
+        visitedViews: [...state.visitedViews],
+        cachedViews: [...state.cachedViews]
+      })
+    })
+  },
+  delView({ dispatch, state }, view) {
+    return new Promise(resolve => {
+      var func = () => {
+        dispatch('delVisitedView', view)
+        dispatch('delCachedView', view)
+        resolve({
+          visitedViews: [...state.visitedViews],
+          cachedViews: [...state.cachedViews]
+        })
+      }
+      if (state.alertPage.includes(view.name)) {
+        MessageBox.alert('<p style="color:red;">请检测清楚是否保存页面内容,再关闭页面,避免数据丢失!</p>', '当前正在编辑内容!', {
+          dangerouslyUseHTMLString: true,
+          confirmButtonText: '确认关闭',
+          cancelButtonText: '暂不关闭',
+          iconClass: "el-icon-warning",
+          showCancelButton: true,
+        }).then(res => {
+          func()
+        }).catch(() => { })
+      } else {
+        func()
+      }
+    })
+  },
+  delAllViews({ dispatch, state }, view) {
+    return new Promise(resolve => {
+      dispatch('delAllVisitedViews', view)
+      dispatch('delAllCachedViews', view)
+      resolve({
+        visitedViews: [...state.visitedViews],
+        cachedViews: [...state.cachedViews]
+      })
+    })
+  },
+  delOthersViews({ dispatch, state }, view) {
+    return new Promise(resolve => {
+      dispatch('delOthersVisitedViews', view)
+      dispatch('delOthersCachedViews', view)
+      resolve({
+        visitedViews: [...state.visitedViews],
+        cachedViews: [...state.cachedViews]
+      })
+    })
+  },
   delRightTags({ commit }, view) {
     return new Promise(resolve => {
       commit('DEL_RIGHT_VIEWS', view)

+ 3 - 1
src/store/modules/user.js

@@ -1,6 +1,7 @@
 import { login, logout, getInfo } from '@/api/login'
 import { getToken, setToken, removeToken } from '@/utils/auth'
 import methods from "@/utils/methodsTool";
+import { encrypt } from '@/utils/jsencrypt'
 
 const user = {
   state: {
@@ -37,7 +38,8 @@ const user = {
     // 登录
     Login({ commit }, userInfo) {
       const username = userInfo.username.trim()
-      const password = userInfo.password
+      const password = encrypt(userInfo.password)
+      // const password = userInfo.password
       const code = userInfo.code
       const uuid = userInfo.uuid
       return new Promise((resolve, reject) => {

+ 2 - 0
src/utils/eventBus.js

@@ -0,0 +1,2 @@
+import Vue from "vue"
+export default new Vue

+ 24 - 11
src/utils/jsencrypt.js

@@ -2,18 +2,31 @@ import JSEncrypt from 'jsencrypt/bin/jsencrypt.min'
 
 // 密钥对生成 http://web.chacuo.net/netrsakeypair
 
-const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' +
-  'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=='
-
-const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' +
-  '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' +
-  'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' +
-  'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' +
-  'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' +
-  'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' +
-  'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' +
-  'UP8iWi1Qw0Y='
+const publicKey = `-----BEGIN PUBLIC KEY-----
+MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4qkbwIKErstK1sFESPEhOShpR
+pj4+sOVpJHxl5r/2xLBfA/MrXcAEra5Ro9cXNQSqmLLt8wecoLk/glfa5IdhXV0h
+RVQplIVs5z3MxcUa9ptKPHUTgh8xMCBvl8sUJKwkmn4vYWeDfHT22EL7Hr1pTMwU
+hF6WiNlWfQTVoF1rhwIDAQAB
+-----END PUBLIC KEY-----
+`
 
+const privateKey = `-----BEGIN PRIVATE KEY-----
+MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALiqRvAgoSuy0rWw
+URI8SE5KGlGmPj6w5WkkfGXmv/bEsF8D8ytdwAStrlGj1xc1BKqYsu3zB5yguT+C
+V9rkh2FdXSFFVCmUhWznPczFxRr2m0o8dROCHzEwIG+XyxQkrCSafi9hZ4N8dPbY
+QvsevWlMzBSEXpaI2VZ9BNWgXWuHAgMBAAECgYAxNW7h3lAUjPqJYAq6iUXbVvPc
+fihoHEuF0Ss1HGBbKd618x+BluHsXTvulXJjxMURkM9diT2mB05WFi3DLtLEM243
+w9tDsYq+0nwrRx9NNcxXlMtwlFC1EeAHPn4aKz1gfsT9ISBJvlDr8KK86hyvXnYG
+bzhcNRrb9e8LOZHjAQJBAN2y1uqHD7eeMYPYUCpXGNhvCTd9Z6n9GRfClohuB7sZ
+64zEDD4KSK+9DGRmwq+ETEeLrGdXBcb6oiUat6OZ+/ECQQDVPJipF875bDXqzJmG
+SIkjT1snZoecio+sK0nHKgbDhhbeCQCwPjp35K4JKgGZLqeWWkBmOTzUS4PmPGxu
+jrb3AkEAhrFmI50lLnDdMnZU1jSOcsibN+xn8/5CpY3iuUboSYOI+cAOlA7ZdHQO
+OF26gLqHQZyZhTt41hhmNNbTpYEjcQJBAJROYerxOS22ukVE6d5AYskhL0fXAqi4
+ojZfoR+ZNj0U7KCe6FCr5yRt8zFCevwcO8jRmoq+cnVA1Er0aYH3Vn8CQHU/jOtg
+wAtnR3lOcM4428X39l6rJPAuR1CzubMNGMS5grHDhrOVy0gYbZPWU4QUgC82wPq0
+yrzs/ckG/wLyzpw=
+-----END PRIVATE KEY-----
+`
 // 加密
 export function encrypt(txt) {
   const encryptor = new JSEncrypt()

Diff do ficheiro suprimidas por serem muito extensas
+ 223 - 3
src/utils/methodsTool.js


+ 7 - 12
src/utils/request.js

@@ -7,21 +7,14 @@ import methods from '@/utils/methodsTool';
 
 axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
 // 创建axios实例
-/**
- * @remard 线上地址
- */
-// export const baseURL = 'https://cloud.xyyxt.net/'
-// export const BASE_IMG_URL = 'https://file.xyyxt.net'
-/**
- * @remard 测试地址
- */
-export const baseURL = 'http://192.168.1.222:5030/'
-export const BASE_IMG_URL = 'https://file-dev.xyyxt.net'
+export const baseURL = process.env.VUE_APP_BASE_API
+// export const baseURL = 'http://192.168.1.24:5030/'
+export const BASE_IMG_URL = process.env.VUE_APP_IMG_API
 const service = axios.create({
   // axios中请求配置有baseURL选项,表示请求URL公共部分
   baseURL: baseURL,
   // 超时
-  timeout: 10000
+  timeout: 60000
 })
 // request拦截器
 service.interceptors.request.use(config => {
@@ -87,6 +80,8 @@ service.interceptors.response.use(res => {
       showClose: true
     })
     return Promise.reject(new Error(msg))
+  } else if (code === 510 || code === 511) {
+    return res.data
   } else if (code !== 200) {
     Notification.error({
       title: msg
@@ -117,4 +112,4 @@ service.interceptors.response.use(res => {
   }
 )
 
-export default service
+export default service

+ 23 - 25
src/utils/uopladFile.js

@@ -1,5 +1,6 @@
 import PlvVideoUpload from '@polyv/vod-upload-js-sdk'
 import api from '@/api/api'
+import { Message } from 'element-ui';
 // import md5 from 'js-md5'
 
 // 此方法主要用于加密一些保利威的专用参数 如果是后端传递的 可以打掉
@@ -10,8 +11,8 @@ function getToken(videoUpload, array) {
     // const writeToken = '8f14a371-9d02-4ec1-922d-54d7b4f79dca'
     const hash = array.hash
     const sign = array.sign
-//     const hash = md5(ptime + writeToken)
-//   const sign = md5(secretkey + ptime)
+    //     const hash = md5(ptime + writeToken)
+    //   const sign = md5(secretkey + ptime)
     videoUpload.updateUserData({ ptime, hash, sign, userid })
     videoUpload.startAll()
 }
@@ -29,7 +30,6 @@ function autoUpdateUserData(timer, videoUpload, array) {
 }
 
 /**
- * @Date: 2021/3/26
  * @param: files -> 一个文件的数组 注意 是【数组】
  * @param: fileSetting -> 主要是用来传递给保利威的属性
  * @param: callback -> 上传进度,成功,失败 的回调 tips:回调太多 我就拿了这三个比较有用的
@@ -44,33 +44,31 @@ export function uploadFile(files, fileSetting, callback) {
             UploadComplete: () => { }  // 全部上传任务完成回调
         }
     })
-    console.log(videoUpload,'init')
     new Promise((resolve, reject) => {
         api.inquirepolyvvideogetPolyvUpload().then(res => {
             resolve(res)
         })
     }).then(res => {
         autoUpdateUserData(null, videoUpload, res.data)
-        var filet = [files]
-        Array.from(filet).forEach((file, index) => {
-            console.log(videoUpload, 1121)
-            const uploader = videoUpload.addFile(file, {
-                // 上传视频进度的回调
-                FileProgress: ({ progress }) => {
-                    const progressSize = (progress * 100).toFixed(2)
-                    callback(index, progressSize)
-                },
-                // 上传视频成功的回调
-                FileSucceed: ({ fileData }) => {
-                    callback(index, fileData)
-                },
-                // 上传视频失败的回调
-                onFileFailed: ({ errData }) => {
-                    callback(index, errData)
-                }
-            }, fileSetting)
-            // console.log(uploader)
-        })
+        const uploader = videoUpload.addFile(files, {
+            FileStarted: function (uploadInfo) { // 文件开始上传回调
+                console.log("文件上传开始: " + uploadInfo.fileData.title);
+            },
+            FileProgress: function (uploadInfo) { // 文件上传过程返回上传进度信息回调
+                console.log("文件上传中: " + (uploadInfo.progress * 100).toFixed(2) + '%');
+            },
+            FileStopped: function (uploadInfo) { // 文件暂停上传回调
+                console.log("文件上传停止: " + uploadInfo.fileData.title);
+            },
+            FileSucceed: ({ fileData }) => {// 上传视频成功的回调
+                Message.success({ message: "视频已上传成功,待审核中,等待审核通过后才可使用。如未自动填充时长,请手动填写!", duration: 6000, showClose: true })
+                callback(fileData)
+            },
+            FileFailed: ({ errData }) => {// 上传视频失败的回调
+                Message.error({ message: "文件上传失败" })
+                callback("文件上传失败: " + errData)
+            }
+        }, fileSetting)
 
     })
     /**
@@ -79,5 +77,5 @@ export function uploadFile(files, fileSetting, callback) {
      * 但是考虑到对于有多选上传不是很友好
      * 就无论你传递几个视频 这里都统一一起上传
      * */
-    
+
 }

+ 5 - 2
src/views/2Cport/adSlotManagement/index.vue

@@ -11,7 +11,6 @@
         size="mini"
         :type="activeIndex === 2 ? 'primary' : ''"
         @click="activeIndex = 2"
-        disabled
         >PC官网</el-button
       >
     </div>
@@ -24,13 +23,17 @@
 import tab1 from "./tab1.vue";
 import tab2 from "./tab2.vue";
 export default {
+  name:"AdSlotManagement",
   components: { tab1, tab2 },
   data() {
     return {
       activeIndex: 1,
     };
   },
-  methods: {},
+  mounted(){
+  },
+  methods: {
+  },
 };
 </script>
 

+ 77 - 58
src/views/2Cport/adSlotManagement/tab1.vue

@@ -43,46 +43,48 @@
           style="width: 100%; margin-top: 10px"
           border
         >
-          <template v-for="(item, index) in tableSet">
-            <el-table-column
-              :width="item.width"
-              :key="index"
-              :prop="item.prop"
-              :label="item.label"
-              align="center"
-            >
-              <template slot-scope="scope">
-                <div v-if="item.scope === 'img'">
-                  <el-image
-                    style="width: 225px; height: 96px"
-                    :src="$methodsTools.splitImgHost(scope.row[item.prop])"
-                    :preview-src-list="[
-                      $methodsTools.splitImgHost(scope.row[item.prop]),
-                    ]"
-                  >
-                  </el-image>
-                </div>
-                <div v-else-if="item.scope === 'input'">
-                  <el-input-number
-                    v-model="scope.row[item.prop]"
-                    :controls="false"
-                    :min="0"
-                    :precision="0"
-                    style="width: 100%"
-                  ></el-input-number>
-                </div>
-                <span v-else-if="item.scope === 'status'">
-                  {{
-                    scope.row[item.prop] === 1
-                      ? "启用"
-                      : scope.row[item.prop] === 2
-                      ? "关闭"
-                      : "未知"
-                  }}
-                </span>
-                <div v-else>{{ scope.row[item.prop] }}</div>
-              </template></el-table-column
-            ></template
+          <el-table-column
+            v-for="(item, index) in tableSet"
+            :width="item.width"
+            :key="index"
+            :prop="item.prop"
+            :label="item.label"
+            align="center"
+          >
+            <template slot-scope="scope">
+              <div
+                v-if="item.scope === 'img'"
+                style="width: 100%; height: 100%"
+              >
+                <el-image
+                  style="width: 100%; height: 100%"
+                  :src="$methodsTools.splitImgHost(scope.row[item.prop])"
+                  :preview-src-list="[
+                    $methodsTools.splitImgHost(scope.row[item.prop]),
+                  ]"
+                >
+                </el-image>
+              </div>
+              <div v-else-if="item.scope === 'input'">
+                <el-input-number
+                  v-model="scope.row[item.prop]"
+                  :controls="false"
+                  :min="0"
+                  :precision="0"
+                  style="width: 100%"
+                ></el-input-number>
+              </div>
+              <span v-else-if="item.scope === 'status'">
+                {{
+                  scope.row[item.prop] === 1
+                    ? "启用"
+                    : scope.row[item.prop] === 0
+                    ? "关闭"
+                    : "未知"
+                }}
+              </span>
+              <div v-else>{{ scope.row[item.prop] }}</div>
+            </template></el-table-column
           >
           <el-table-column
             fixed="right"
@@ -96,8 +98,8 @@
                 size="small"
                 @click="editList(0, scope.row)"
                 >修改</el-button
-              >
-            </template>
+              ></template
+            >
           </el-table-column>
         </el-table>
       </div>
@@ -207,6 +209,16 @@
               "
             ></el-input>
           </el-form-item>
+          <el-form-item
+            label="appid"
+            prop="remarks"
+            v-if="listData.jumpType === 4"
+          >
+            <el-input
+              v-model="listData.remarks"
+              placeholder="请输入外部小程序appid"
+            ></el-input>
+          </el-form-item>
           <el-form-item label="排序" prop="sort">
             <el-input-number
               :min="1"
@@ -284,6 +296,9 @@ export default {
           { required: true, message: "请输入广告标题", trigger: "blur" },
         ],
         jumpUrl: [{ required: true, message: "请输入内容", trigger: "blur" }],
+        remarks: [
+          { required: true, message: "请输入外部小程序appid", trigger: "blur" },
+        ],
         adverUrl: [{ required: true, validator: valiIcon, trigger: "change" }],
         status: [
           { required: true, message: "请选择发布状态", trigger: "change" },
@@ -320,14 +335,16 @@ export default {
       this.disabledBtn = false;
     },
     getInfo() {
-      this.$api.inquireadvlocationlist({ status: 1 }).then((res) => {
-        this.tabList = res.rows;
-        if (res.rows.length) {
-          this.activeid = res.rows[0].locationId + "";
-          this.activeFunc(res.rows[0].locationId);
-          this.second = res.rows[0].intervalTime;
-        }
-      });
+      this.$api
+        .inquireadvlocationlist({ status: 1, platform: 1 })
+        .then((res) => {
+          this.tabList = res.rows;
+          if (res.rows.length) {
+            this.activeid = res.rows[0].locationId + "";
+            this.activeFunc(res.rows[0].locationId);
+            this.second = res.rows[0].intervalTime;
+          }
+        });
     },
     close() {
       this.dialogVisible = false;
@@ -346,7 +363,7 @@ export default {
         this.statusPop = 0;
         this.listData = JSON.parse(JSON.stringify(v));
       }
-      this.listData.locationId = Number(this.activeid)
+      this.listData.locationId = Number(this.activeid);
       this.dialogVisible = true;
     },
     /**
@@ -369,7 +386,6 @@ export default {
       }
       this.$upload.upload(file, 0).then((res) => {
         this.$set(this.listData, "adverUrl", res);
-        console.log(this.listData);
       });
     },
     /**
@@ -391,22 +407,25 @@ export default {
       var statusNS = false;
       this.tableData.forEach((item) => {
         if (item.status === 1) {
-          anum++;
+          if (this.statusPop === 0) {
+            if (item.id !== this.listData.id) {
+              anum++;
+            }
+          } else {
+            anum++;
+          }
         }
         if (this.statusPop === 1) {
           if (item.sort == this.listData.sort) {
             statusNS = true;
           }
         } else {
-          if (
-            item.sort == this.listData.sort &&
-            item.id !== this.listData.id
-          ) {
+          if (item.sort == this.listData.sort && item.id !== this.listData.id) {
             statusNS = true;
           }
         }
       });
-      if (anum >= 5) {
+      if (anum >= 5 && this.listData.status === 1) {
         this.$message.error("轮播图启用数量不得大于5个!");
         this.disabledBtn = false;
         return;

+ 642 - 7
src/views/2Cport/adSlotManagement/tab2.vue

@@ -1,21 +1,656 @@
 <template>
   <div id="tab2">
-tab2
+    <el-tabs
+      type="border-card"
+      style="margin-top: 16px"
+      v-model="activeid"
+      @tab-click="activeFunc(activeid)"
+    >
+      <el-tab-pane
+        v-for="(item, index) in tabList"
+        :label="item.name"
+        :name="item.locationId + ''"
+        :key="index"
+      ></el-tab-pane>
+      <div>
+        <div>
+          轮播间隔:{{ second }}S
+          <el-popover placement="bottom" trigger="manual" v-model="visible">
+            <el-input-number
+              v-model="copySecond"
+              :min="1"
+              :max="60"
+              :precision="0"
+            ></el-input-number>
+            <div style="text-align: center; margin-top: 10px">
+              <el-button size="mini" @click="visible = false">取消</el-button
+              ><el-button size="mini" @click="editFun">确定</el-button>
+            </div>
+            <el-button size="mini" slot="reference" @click="visibleFun"
+              >修改</el-button
+            >
+          </el-popover>
+          <el-button
+            size="mini"
+            @click="editList(1)"
+            type="success"
+            style="margin-left: 10px"
+            >添加轮播</el-button
+          >
+        </div>
+        <el-table
+          :data="tableData"
+          style="width: 100%; margin-top: 10px"
+          border
+        >
+          <el-table-column
+            v-for="(item, index) in tableSet"
+            :width="item.width"
+            :key="index"
+            :prop="item.prop"
+            :label="item.label"
+            align="center"
+          >
+            <template slot-scope="scope">
+              <div
+                v-if="item.scope === 'img'"
+                style="width: 100%; height: 100%"
+              >
+                <el-image
+                  style="width: 100%; height: 100%"
+                  :src="$methodsTools.splitImgHost(scope.row[item.prop])"
+                  :preview-src-list="[
+                    $methodsTools.splitImgHost(scope.row[item.prop]),
+                  ]"
+                >
+                </el-image>
+              </div>
+              <div v-else-if="item.scope === 'input'">
+                <el-input-number
+                  v-model="scope.row[item.prop]"
+                  :controls="false"
+                  :min="0"
+                  :precision="0"
+                  style="width: 100%"
+                ></el-input-number>
+              </div>
+              <span v-else-if="item.scope === 'status'">
+                {{
+                  scope.row[item.prop] === 1
+                    ? "启用"
+                    : scope.row[item.prop] === 0
+                    ? "关闭"
+                    : "未知"
+                }}
+              </span>
+              <div v-else>{{ scope.row[item.prop] }}</div>
+            </template></el-table-column
+          >
+          <el-table-column
+            fixed="right"
+            label="操作"
+            width="100"
+            align="center"
+          >
+            <template slot-scope="scope">
+              <el-button
+                type="text"
+                size="small"
+                @click="editList(0, scope.row)"
+                >修改</el-button
+              >
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+    </el-tabs>
+    <el-dialog
+      @closed="loadingClose"
+      :visible.sync="dialogVisible"
+      width="680px"
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">
+          {{ statusPop === 1 ? "添加" : statusPop === 0 ? "修改" : "详情" }}
+        </div>
+        <div class="rightBoxs">
+          <img src="@/assets/images/Close@2x.png" alt="" @click="close" />
+        </div>
+      </div>
+      <div>
+        <el-form
+          label-position="right"
+          label-width="170px"
+          :model="listData"
+          :rules="rules"
+          ref="listData"
+        >
+          <el-form-item label="图片标题" prop="advName">
+            <el-input v-model="listData.advName"></el-input>
+          </el-form-item>
+          <el-form-item label="图片" prop="adverUrl">
+            <div class="dis_fs">
+              <span v-if="!listData.adverUrl">暂无图片</span>
+              <img
+                v-else
+                class="imgBoxs"
+                :src="$methodsTools.splitImgHost(listData.adverUrl)"
+                alt="加载失败"
+              />
+            </div>
+            <div class="styPsty">
+              <label class="btns"
+                >修改封面
+                <input
+                  ref="file"
+                  type="file"
+                  style="display: none"
+                  @change="editImg"
+                />
+              </label>
+              <div style="font-size: 12px; color: #999; line-height: 17px">
+                注:请上传小于300kb,尺寸为
+                <span style="color: red">750*320</span>
+                的像素图片,支持jpg、jpeg、png等类型
+              </div>
+            </div>
+          </el-form-item>
+          <el-form-item label="banner栏两侧颜色填充" prop="color">
+            <el-color-picker
+              v-model="listData.color"
+              show-alpha
+              :predefine="predefineColors"
+            >
+            </el-color-picker>
+          </el-form-item>
+          <el-form-item
+            label="跳转位置"
+            :required="
+              listData.jumpType === 2 ||
+              listData.jumpType === 3 ||
+              listData.jumpType === 4
+                ? true
+                : false
+            "
+          >
+            <el-select
+              v-model="listData.jumpType"
+              placeholder="请选择跳转类型"
+              clearable
+            >
+              <el-option
+                v-for="(item, index) in options"
+                :key="index"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item
+            label=""
+            v-if="
+              listData.jumpType === 2 ||
+              listData.jumpType === 3 ||
+              listData.jumpType === 4
+            "
+            :prop="
+              listData.jumpType === 2 ||
+              listData.jumpType === 3 ||
+              listData.jumpType === 4
+                ? 'jumpUrl'
+                : ''
+            "
+          >
+            <el-input
+              v-model="listData.jumpUrl"
+              :placeholder="
+                listData.jumpType === 2
+                  ? '请输入URL'
+                  : listData.jumpType === 3
+                  ? '请输入内部接口地址'
+                  : listData.jumpType === 4
+                  ? '请输入外部接口地址'
+                  : ''
+              "
+            ></el-input>
+          </el-form-item>
+          <el-form-item
+            label="appid"
+            prop="remarks"
+            v-if="listData.jumpType === 4"
+          >
+            <el-input
+              v-model="listData.remarks"
+              placeholder="请输入外部小程序appid"
+            ></el-input>
+          </el-form-item>
+          <el-form-item label="排序" prop="sort">
+            <el-input-number
+              :min="1"
+              v-model="listData.sort"
+              :precision="0"
+              :controls="false"
+            ></el-input-number>
+          </el-form-item>
+          <el-form-item label="发布状态" prop="status">
+            <el-radio-group v-model="listData.status">
+              <el-radio :label="1">启用</el-radio>
+              <el-radio :label="0">关闭</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="close">取 消</el-button>
+        <el-button @click="submitForm('listData')" :loading="disabledBtn"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
   </div>
 </template>
 
 <script>
 export default {
-  data () {
+  data() {
+    var valiIcon = (rule, value, callback) => {
+      // 图片验证
+      if (!this.listData.adverUrl) {
+        callback(new Error("请上传图片"));
+      } else {
+        callback();
+      }
+    };
     return {
-    }
+      predefineColors: [
+        "#ff4500",
+        "#ff8c00",
+        "#ffd700",
+        "#90ee90",
+        "#00ced1",
+        "#1e90ff",
+        "#c71585",
+        "rgba(255, 69, 0, 0.68)",
+        "rgb(255, 120, 0)",
+        "hsv(51, 100, 98)",
+        "hsva(120, 40, 94, 0.5)",
+        "hsl(181, 100%, 37%)",
+        "hsla(209, 100%, 56%, 0.73)",
+        "#c7158577",
+      ],
+      disabledBtn: false,
+      activeid: "",
+      visible: false,
+      second: "",
+      copySecond: "",
+      tableSet: [
+        {
+          label: "排序",
+          prop: "sort",
+          width: "120px",
+        },
+        {
+          label: "广告标题",
+          prop: "advName",
+        },
+        {
+          label: "图片",
+          prop: "adverUrl",
+          scope: "img",
+        },
+        {
+          label: "颜色填充值",
+          prop: "color",
+          // scope: "color",
+        },
+        {
+          label: "跳转位置",
+          prop: "jumpUrl",
+        },
+        {
+          label: "发布状态",
+          prop: "status",
+          scope: "status",
+        },
+      ],
+      tabList: [],
+      tableData: [],
+      dialogVisible: false,
+      listData: {},
+      rules: {
+        advName: [
+          { required: true, message: "请输入广告标题", trigger: "blur" },
+        ],
+        jumpUrl: [{ required: true, message: "请输入内容", trigger: "blur" }],
+        remarks: [
+          { required: true, message: "请输入外部小程序appid", trigger: "blur" },
+        ],
+        adverUrl: [{ required: true, validator: valiIcon, trigger: "change" }],
+        status: [
+          { required: true, message: "请选择发布状态", trigger: "change" },
+        ],
+        sort: [{ required: true, message: "请输入图片排序", trigger: "blur" }],
+      },
+      statusPop: 0,
+      options: [
+        {
+          label: "无跳转",
+          value: 1,
+        },
+        {
+          label: "URL",
+          value: 2,
+        },
+        {
+          label: "内部接口地址",
+          value: 3,
+        }
+      ],
+    };
+  },
+  mounted() {
+    this.getInfo();
   },
   methods: {
-
-  }
-}
+    loadingClose() {
+      this.$refs["listData"].resetFields();
+      this.disabledBtn = false;
+    },
+    getInfo() {
+      this.$api
+        .inquireadvlocationlist({ status: 1, platform: 2 })
+        .then((res) => {
+          this.tabList = res.rows;
+          if (res.rows.length) {
+            this.activeid = res.rows[0].locationId + "";
+            this.activeFunc(res.rows[0].locationId);
+            this.second = res.rows[0].intervalTime;
+          }
+        });
+    },
+    close() {
+      this.dialogVisible = false;
+    },
+    /**
+     * 修改单条轮播信息
+     */
+    editList(int, v) {
+      if (int === 1) {
+        this.statusPop = 1;
+        this.listData = {
+          adverUrl: "oss/images/avatar/20211013/1634097664410_1397766697",
+          status: 1,
+        };
+      } else {
+        this.statusPop = 0;
+        this.listData = JSON.parse(JSON.stringify(v));
+      }
+      this.listData.locationId = Number(this.activeid);
+      this.dialogVisible = true;
+    },
+    /**
+     * 修改封面
+     */
+    editImg(e) {
+      var file = e.target.files[0];
+      if (file === undefined) {
+        return;
+      }
+      if (file.size > 0.3 * 1024 * 1024) {
+        this.$message.warning("图片不得大于300kb");
+        return;
+      }
+      var type = this.$refs.file.value.toLowerCase().split(".").splice(-1);
+      if (type[0] != "jpg" && type[0] != "png" && type[0] != "jpeg") {
+        this.$message.warning("上传格式需为:.jpg/.png/.jpeg");
+        this.$refs.file.value = "";
+        return;
+      }
+      this.$upload.upload(file, 0).then((res) => {
+        this.$set(this.listData, "adverUrl", res);
+      });
+    },
+    /**
+     * 提交修改/添加 表单验证
+     */
+    submitForm(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          this.submit();
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+    submit() {
+      this.disabledBtn = true;
+      var anum = 0;
+      var statusNS = false;
+      this.tableData.forEach((item) => {
+        if (item.status === 1) {
+          if (this.statusPop === 0) {
+            if (item.id !== this.listData.id) {
+              anum++;
+            }
+          } else {
+            anum++;
+          }
+        }
+        if (this.statusPop === 1) {
+          if (item.sort == this.listData.sort) {
+            statusNS = true;
+          }
+        } else {
+          if (item.sort == this.listData.sort && item.id !== this.listData.id) {
+            statusNS = true;
+          }
+        }
+      });
+      if (anum >= 5 && this.listData.status === 1) {
+        this.$message.error("轮播图启用数量不得大于5个!");
+        this.disabledBtn = false;
+        return;
+      }
+      if (statusNS) {
+        this.$message.warning("存在相同排序,请重新设置排序");
+        this.disabledBtn = false;
+        return;
+      }
+      if (this.statusPop === 1) {
+        this.$api
+          .appbaseadvertising(this.listData)
+          .then((res) => {
+            this.$message.success("新增成功");
+            this.dialogVisible = false;
+            this.activeFunc(this.activeid);
+          })
+          .catch(() => {
+            this.disabledBtn = false;
+          });
+      }
+      if (this.statusPop === 0) {
+        this.$api
+          .editbaseadvertising(this.listData)
+          .then((res) => {
+            this.$message.success("修改成功");
+            this.dialogVisible = false;
+            this.activeFunc(this.activeid);
+          })
+          .catch(() => {
+            this.disabledBtn = false;
+          });
+      }
+    },
+    activeFunc(id) {
+      if (this.visible) {
+        this.visible = false;
+      }
+      this.$api.inquirebaseadvertisinglist({ locationId: id }).then((res) => {
+        this.tabList.forEach((item) => {
+          if (item.locationId == id) {
+            this.second = item.intervalTime;
+          }
+        });
+        this.tableData = res.rows;
+      });
+    },
+    visibleFun() {
+      if (this.visible) {
+        this.visible = false;
+        return;
+      }
+      this.copySecond = this.second;
+      this.visible = true;
+    },
+    /**
+     * 确定修改轮播间隔
+     */
+    editFun() {
+      this.$api
+        .editadvlocation({
+          locationId: this.activeid,
+          intervalTime: this.copySecond,
+        })
+        .then((res) => {
+          this.$api.inquireadvlocationlist({ status: 1 }).then((res) => {
+            this.tabList = res.rows;
+            if (res.rows.length) {
+              this.activeFunc(this.activeid);
+              this.second = res.rows[0].intervalTime;
+              this.$message.success("修改成功");
+              this.visible = false;
+            }
+          });
+        });
+    },
+  },
+};
 </script>
 
 <style lang="less" scoped>
-
+.styFlex {
+  margin-top: 10px;
+  text-align: center;
+}
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
+.dis_fs {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 337.5px;
+  height: 144px;
+  border: 1px solid #999;
+  .imgBoxs {
+    width: 100%;
+    height: 100%;
+  }
+}
+.styPsty {
+  margin-top: 10px;
+  display: flex;
+  align-items: center;
+  .btns {
+    border: 1px solid #999;
+    font-size: 12px;
+    height: 28px;
+    line-height: 28px;
+    padding: 0px 10px;
+    border-radius: 4px;
+    cursor: pointer;
+    margin-right: 10px;
+    flex-shrink: 0;
+  }
+}
 </style>

+ 38 - 0
src/views/2Cport/adv/index.vue

@@ -96,6 +96,7 @@
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
 export default {
+  name: "Adv",
   components: { tableList, pagination },
   data() {
     return {
@@ -130,6 +131,22 @@ export default {
           prop: "intervalTime",
           hidden: true,
         },
+        {
+          label: "适用区域",
+          prop: "platform",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            {
+              label: "小程序",
+              value: 1,
+            },
+            {
+              label: "PC网站",
+              value: 2,
+            },
+          ],
+        },
         {
           label: "状态",
           prop: "status",
@@ -156,6 +173,21 @@ export default {
           prop: "intervalTime",
           scope: "Number",
         },
+        {
+          label: "适用区域",
+          prop: "platform",
+          scope: "status",
+          options: [
+            {
+              label: "小程序",
+              value: 1,
+            },
+            {
+              label: "PC网站",
+              value: 2,
+            },
+          ],
+        },
         {
           label: "状态",
           prop: "status",
@@ -187,6 +219,9 @@ export default {
         intervalTime: [
           { required: true, message: "请输入间隔秒数", trigger: "blur" },
         ],
+        platform: [
+          { required: true, message: "请选择适用区域", trigger: "change" },
+        ],
         status: [{ required: true, message: "请选择状态", trigger: "change" }],
       },
     };
@@ -194,6 +229,9 @@ export default {
   mounted() {
     this.search();
   },
+  activated() {
+    this.search();
+  },
   methods: {
     loadingClose() {
       this.disabledBtn = false;

+ 326 - 0
src/views/2Cport/pageSettings/footer.vue

@@ -0,0 +1,326 @@
+<template>
+  <div id="footer">
+    <div class="smallBox">
+      <div style="text-align: right">
+        <el-button :size="size" @click="add(1)">添加</el-button>
+      </div>
+      <el-table :data="listData" style="width: 700px; margin-top: 10px" border>
+        <el-table-column
+          v-for="(item, index) in tableSet"
+          :width="item.width"
+          :key="index"
+          :prop="item.prop"
+          :label="item.label"
+          align="center"
+        >
+          <template slot-scope="scope">
+            <div v-if="item.scope === 'input'">
+              <el-input-number
+                @blur="changeVal(scope.row)"
+                v-model="scope.row[item.prop]"
+                :controls="false"
+                :min="0"
+                :precision="0"
+                style="width: 80%"
+              ></el-input-number>
+            </div>
+            <div v-else-if="item.scope === 'set'">
+              <el-button type="text" @click="add(0, scope.row, scope.$index)"
+                >修改</el-button
+              >
+              <el-button type="text" @click="del(scope.$index)">删除</el-button>
+            </div>
+            <div v-else>{{ scope.row[item.prop] }}</div>
+          </template></el-table-column
+        >
+      </el-table>
+      <div style="text-align: center; margin-top: 20px">
+        <el-button :size="size" type="primary" @click="submit">保 存</el-button>
+      </div>
+    </div>
+    <el-dialog
+      @closed="loadingClose"
+      :visible.sync="dialogVisible"
+      width="680px"
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">
+          {{ statusPop === 1 ? "添加" : statusPop === 0 ? "修改" : "详情" }}
+        </div>
+        <div class="rightBoxs">
+          <img src="@/assets/images/Close@2x.png" alt="" @click="close" />
+        </div>
+      </div>
+      <div>
+        <el-form
+          label-position="right"
+          label-width="170px"
+          :model="boxData"
+          :rules="rules"
+          ref="boxData"
+        >
+          <el-form-item label="文本内容" prop="name">
+            <el-input v-model="boxData.name"></el-input>
+          </el-form-item>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="close">取 消</el-button>
+        <el-button @click="submitForm('boxData')" :loading="disabledBtn"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listConfig,updateConfig } from "@/api/system/config";
+export default {
+  data() {
+    return {
+      disabledBtn: false,
+      dialogVisible: false,
+      size: "mini",
+      tableSet: [
+        {
+          label: "排序",
+          prop: "sort",
+          scope: "input",
+          width: "120px",
+        },
+        {
+          label: "文本内容",
+          prop: "name",
+        },
+        {
+          label: "操作",
+          scope: "set",
+          width: "160px",
+        },
+      ],
+      Nav: [],
+      initData: {},
+      listData: [],
+      statusPop: "",
+      boxData: {},
+      rules: {
+        name: [{ required: true, message: "请填写文本内容", trigger: "blur" }],
+      },
+      newIndex: "",
+    };
+  },
+  mounted() {
+    this.init();
+  },
+  methods: {
+    changeVal(row) {
+      if (!row.sort && row.sort !== 0) {
+        this.$message.warning("检测到你没有赋值或赋值异常,已自动赋值为0");
+        row.sort = 0;
+      } else {
+        for (let i = 0; i < this.listData.length; i++) {
+          if (
+            this.listData[i].name !== row.name &&
+            this.listData[i].sort == row.sort
+          ) {
+            this.$message.warning("检测到重复值,已自动赋值为0");
+            row.sort = 0;
+          }
+        }
+      }
+      this.listData.sort(this.sort);
+    },
+    sort(a, b) {
+      return a.sort - b.sort;
+    },
+    loadingClose() {
+      this.disabledBtn = false;
+    },
+    del(index) {
+      this.listData.splice(index, 1);
+    },
+    add(int, row, index) {
+      this.statusPop = int;
+      this.newIndex = index;
+      if (int === 0) {
+        this.boxData = JSON.parse(JSON.stringify(row));
+      }
+      if (int === 1) {
+        var indexNum = 0;
+        this.listData.forEach((item) => {
+          if (item.sort >= indexNum) {
+            indexNum = item.sort + 1;
+          }
+        });
+        this.boxData = {};
+        this.boxData.sort = indexNum;
+      }
+      this.dialogVisible = true;
+      this.$nextTick(() => {
+        this.$refs.boxData.clearValidate();
+      });
+    },
+    close() {
+      this.dialogVisible = false;
+    },
+    submitForm(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          if (this.statusPop === 1) {
+            this.listData.push(this.boxData);
+          } else {
+            this.listData.splice(this.newIndex, 1, this.boxData);
+          }
+          this.dialogVisible = false;
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+    init() {
+      listConfig({ configKey: "home.footer" }).then((res) => {
+        if (res.rows.length) {
+          this.initData = res.rows[0];
+          this.listData = JSON.parse(res.rows[0].configValue);
+        }
+      });
+    },
+    submit() {
+      let data = JSON.parse(JSON.stringify(this.listData));
+      let copySubmitData = JSON.parse(JSON.stringify(this.initData));
+      copySubmitData.configValue = JSON.stringify(data);
+      updateConfig(copySubmitData).then((res) => {
+        this.$message.success("保存成功");
+      });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.smallBox {
+  width: 700px;
+}
+
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
+.dis_fs {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 337.5px;
+  height: 144px;
+  border: 1px solid #999;
+  .imgBoxs {
+    width: 100%;
+    height: 100%;
+  }
+}
+.styPsty {
+  margin-top: 10px;
+  display: flex;
+  align-items: center;
+  .btns {
+    border: 1px solid #999;
+    font-size: 12px;
+    height: 28px;
+    line-height: 28px;
+    padding: 0px 10px;
+    border-radius: 4px;
+    cursor: pointer;
+    margin-right: 10px;
+    flex-shrink: 0;
+  }
+}
+</style>

+ 381 - 0
src/views/2Cport/pageSettings/header.vue

@@ -0,0 +1,381 @@
+<template>
+  <div id="header">
+    <div>
+      <h5>导航效果预览</h5>
+      <div class="topSty_home">
+        <el-row :gutter="20">
+          <el-col :span="6" style="display: flex; flex-direction: row-reverse">
+            <div v-if="!listData.companyLogo" class="noLogoImg">logo图片</div>
+            <img
+              v-else
+              style="width: 216px; height: 46px"
+              :src="$methodsTools.splitImgHost(listData.companyLogo)"
+              alt="加载失败"
+            />
+          </el-col>
+          <el-col
+            :span="12"
+            style="display: flex; flex-direction: column; align-items: center"
+          >
+            <div>
+              <input class="dzStyInput" type="text" />
+              <div class="btnSty">搜索</div>
+            </div>
+            <div>
+              <ul class="ul_styLI">
+                <li
+                  v-for="(item, index) in compyList(listData.Nav)"
+                  :key="index"
+                >
+                  {{ item.name }}
+                </li>
+              </ul>
+            </div>
+          </el-col>
+          <el-col :span="6" class="flex_sty" style="font-size: 14px">
+            <img
+              style="width: 66px; height: 54px"
+              src="@/assets/images/telPhoto.png"
+              alt=""
+            />
+            <div style="flex: 1">
+              <h4 style="margin: 6px 0px">{{ listData.serviceTel.tel }}</h4>
+              <div>服务时间:{{ listData.serviceTel.time }}</div>
+            </div>
+          </el-col>
+        </el-row>
+      </div>
+    </div>
+    <div>
+      <h5>企业标识</h5>
+      <ul style="margin-left: 20px">
+        <li class="liSty">
+          <span style="align-self: flex-start">LOGO图片</span>
+          <div>
+            <div
+              style="
+                width: 216px;
+                height: 46px;
+                border: 1px dashed #999;
+                border-radius: 28px;
+                line-height: 46px;
+                text-align: center;
+              "
+              v-if="!listData.companyLogo"
+            >
+              <label for="uplose">
+                <i class="el-icon-circle-plus-outline iconStsz"></i
+              ></label>
+              <input
+                ref="file"
+                type="file"
+                style="display: none"
+                id="uplose"
+                @change="getImgFile"
+              />
+            </div>
+            <div v-else class="flex_sty">
+              <el-image
+                style="width: 216px; height: 46px"
+                :src="$methodsTools.splitImgHost(listData.companyLogo)"
+                :preview-src-list="[
+                  $methodsTools.splitImgHost(listData.companyLogo),
+                ]"
+              >
+              </el-image>
+              <el-button
+                @click="listData.companyLogo = ''"
+                style="margin-left: 16px"
+                type="danger"
+                icon="el-icon-delete"
+                circle
+                size="mini"
+              ></el-button>
+            </div>
+            <p style="font-size: 12px; color: #999">
+              注:建议上传logo图片是透明底色的png格式,尺寸为216px * 46px
+            </p>
+          </div>
+        </li>
+        <li class="liSty">
+          <span>公司名称</span>
+          <div>
+            <el-input v-model="listData.companyName" :size="size"></el-input>
+          </div>
+        </li>
+        <li class="liSty">
+          <span>客服电话是否显示</span>
+          <div>
+            <el-radio-group v-model="listData.serviceTel.status">
+              <el-radio :label="1">是</el-radio>
+              <el-radio :label="0">否</el-radio>
+            </el-radio-group>
+          </div>
+        </li>
+        <li class="liSty">
+          <span>电话号码</span>
+          <div>
+            <el-input v-model="listData.serviceTel.tel" :size="size"></el-input>
+          </div>
+        </li>
+        <li class="liSty">
+          <span>客服时间</span>
+          <div>
+            <el-input
+              v-model="listData.serviceTel.time"
+              :size="size"
+            ></el-input>
+          </div>
+        </li>
+      </ul>
+    </div>
+    <div>
+      <h5>导航栏菜单设置</h5>
+      <el-table
+        :data="listData.Nav"
+        style="width: 800px; margin-top: 10px"
+        border
+      >
+        <el-table-column
+          v-for="(item, index) in tableSet"
+          :width="item.width"
+          :key="index"
+          :prop="item.prop"
+          :label="item.label"
+          align="center"
+        >
+          <template slot-scope="scope">
+            <div v-if="item.scope === 'input'">
+              <el-input-number
+                @blur="changeVal(scope.row)"
+                v-model="scope.row[item.prop]"
+                :controls="false"
+                :min="0"
+                :precision="0"
+                style="width: 50%"
+              ></el-input-number>
+            </div>
+            <div v-else-if="item.scope === 'status'" class="disflex_sty">
+              <el-switch
+                :size="size"
+                v-if="scope.row['name'] !== '首页'"
+                :active-value="1"
+                :inactive-value="0"
+                v-model="scope.row[item.prop]"
+                active-color="#13ce66"
+                inactive-color="#ff4949"
+              >
+              </el-switch>
+              <span style="margin-left: 14px">
+                {{
+                  scope.row[item.prop] === 1
+                    ? "开启"
+                    : scope.row[item.prop] === 0
+                    ? "关闭"
+                    : "未知"
+                }}
+              </span>
+            </div>
+            <div v-else>{{ scope.row[item.prop] }}</div>
+          </template></el-table-column
+        >
+      </el-table>
+    </div>
+    <div style="text-align: center; margin-top: 20px">
+      <el-button :size="size" type="primary" @click="submit">保 存</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { listConfig, updateConfig } from "@/api/system/config";
+export default {
+  data() {
+    return {
+      size: "mini",
+      listData: {
+        serviceTel: {},
+      },
+      tableSet: [
+        {
+          label: "排序",
+          prop: "sort",
+          scope: "input",
+        },
+        {
+          label: "导航菜单名称",
+          prop: "name",
+        },
+        {
+          label: "状态",
+          prop: "status",
+          scope: "status",
+        },
+      ],
+      initData:{},
+    };
+  },
+  computed: {
+    compyList: function () {
+      return function (arr) {
+        let ary = [];
+        if (arr) {
+          ary = arr.filter((item) => {
+            return item.status === 1;
+          });
+        }
+        return ary;
+      };
+    },
+  },
+  mounted() {
+    this.init();
+  },
+  methods: {
+    changeVal(row) {
+      if (!row.sort && row.sort !== 0) {
+        this.$message.warning("检测到你没有赋值或赋值异常,已自动赋值为0");
+        row.sort = 0;
+      } else {
+        for (let i = 0; i < this.listData.Nav.length; i++) {
+          if (
+            this.listData.Nav[i].name !== row.name &&
+            this.listData.Nav[i].sort == row.sort
+          ) {
+            this.$message.warning("检测到重复值,已自动赋值为0");
+            row.sort = 0;
+          }
+        }
+      }
+      this.listData.Nav.sort(this.sort);
+    },
+    submit() {
+      let data = JSON.parse(JSON.stringify(this.listData));
+      let copySubmitData = JSON.parse(JSON.stringify(this.initData))
+      copySubmitData.configValue = JSON.stringify(data)
+      updateConfig(copySubmitData).then((res) => {
+        this.$message.success("保存成功");
+      });
+    },
+    sort(a, b) {
+      return a.sort - b.sort;
+    },
+    init() {
+      listConfig({ configKey: "home.header" }).then((res) => {
+        if (res.rows.length) {
+          this.initData = res.rows[0];
+          this.listData = JSON.parse(res.rows[0].configValue);
+        }
+      });
+    },
+    getImgFile() {
+      var self = this;
+      var file = self.$refs.file.files[0];
+      if (file === undefined) {
+        self.$set(self.listData, "companyLogo", "");
+        return;
+      }
+      if (file.size > 0.3 * 1024 * 1024) {
+        self.$message.error("图片不得大于300kb");
+        return;
+      }
+      var type = self.$refs.file.value.toLowerCase().split(".").splice(-1);
+      if (
+        type[0] != "jpg" &&
+        type[0] != "png" &&
+        type[0] != "jpeg" &&
+        type[0] != "gif"
+      ) {
+        self.$message.error("上传格式需为:.jpg/.png/.jpeg/gif");
+        self.$refs.file.value = "";
+        return;
+      }
+      this.$upload.upload(file, 0).then((res) => {
+        self.listData.companyLogo = res;
+      });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+/deep/.el-input--mini .el-input__inner {
+  max-width: 300px;
+}
+h5 {
+  font-weight: bold;
+}
+.liSty {
+  display: flex;
+  align-items: center;
+  font-size: 14px;
+  margin-bottom: 20px;
+  span {
+    width: 140px;
+    text-align: right;
+    margin-right: 10px;
+  }
+}
+.disflex_sty {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.flex_sty {
+  display: flex;
+  align-items: center;
+}
+.iconStsz {
+  font-size: 20px;
+  color: #67c23a;
+  cursor: pointer;
+}
+.topSty_home {
+  border-radius: 14px;
+  padding: 10px;
+  border: 1px solid #666;
+}
+.dzStyInput {
+  width: 400px;
+  height: 34px;
+  outline: none;
+  padding-left: 10px;
+  font-size: 14px;
+  border: 1px solid #666;
+  border-top-left-radius: 6px;
+  border-bottom-left-radius: 6px;
+  border-color: rgb(65, 140, 251);
+}
+.btnSty {
+  display: inline-block;
+  height: 34px;
+  padding: 0px 6px;
+  border: 1px solid #666;
+  line-height: 32px;
+  border-left: none;
+  background-color: rgb(65, 140, 251);
+  color: #fff;
+  font-size: 14px;
+  border-color: rgb(65, 140, 251);
+  border-top-right-radius: 6px;
+  border-bottom-right-radius: 6px;
+  cursor: pointer;
+  user-select: none;
+}
+.noLogoImg {
+  border: 1px solid #666;
+  width: 216px;
+  height: 46px;
+  text-align: center;
+  font-size: 14px;
+  line-height: 46px;
+}
+.ul_styLI {
+  width: 400px;
+  display: flex;
+  align-items: center;
+  justify-content: space-around;
+  font-size: 14px;
+  user-select: none;
+}
+</style>

+ 41 - 0
src/views/2Cport/pageSettings/index.vue

@@ -0,0 +1,41 @@
+<template>
+  <div id="pageSettings">
+    <el-tabs v-model="activeName">
+      <el-tab-pane label="页头设置" name="headerPage"></el-tab-pane>
+      <el-tab-pane label="页尾设置" name="footerPage"></el-tab-pane>
+      <el-tab-pane label="友情链接" name="linksPage"></el-tab-pane>
+    </el-tabs>
+    <div class="allSy">
+      <header-page ref="headerPage" v-if="activeName === 'headerPage'" />
+      <footer-page ref="footerPage" v-if="activeName === 'footerPage'" />
+      <links-page ref="linksPage" v-if="activeName === 'linksPage'" />
+    </div>
+  </div>
+</template>
+
+<script>
+import headerPage from "./header.vue";
+import footerPage from "./footer.vue";
+import linksPage from "./links.vue";
+export default {
+  components: { headerPage, footerPage, linksPage },
+  data() {
+    return {
+      activeName: "headerPage",
+    };
+  },
+  methods: {},
+};
+</script>
+
+<style lang="less" scoped>
+#pageSettings {
+  display: flex;
+  flex-direction: column;
+  height: calc(100vh - 130px);
+}
+.allSy {
+  flex: 1;
+  overflow: auto;
+}
+</style>

+ 355 - 0
src/views/2Cport/pageSettings/links.vue

@@ -0,0 +1,355 @@
+<template>
+  <div id="links">
+    <div class="smallBox">
+      <div style="text-align: right">
+        <el-button :size="size" @click="add(1)">添加</el-button>
+      </div>
+      <el-table :data="listData" style="width: 900px; margin-top: 10px" border>
+        <el-table-column
+          v-for="(item, index) in tableSet"
+          :width="item.width"
+          :key="index"
+          :prop="item.prop"
+          :label="item.label"
+          align="center"
+        >
+          <template slot-scope="scope">
+            <div v-if="item.scope === 'input'">
+              <el-input-number
+                @blur="changeVal(scope.row)"
+                v-model="scope.row[item.prop]"
+                :controls="false"
+                :min="0"
+                :precision="0"
+                style="width: 80%"
+              ></el-input-number>
+            </div>
+            <div v-else-if="item.scope === 'set'">
+              <el-button type="text" @click="add(0, scope.row, scope.$index)"
+                >修改</el-button
+              >
+              <el-button type="text" @click="del(scope.$index)">删除</el-button>
+            </div>
+            <div v-else-if="item.scope === 'status'">
+              {{ scope.row[item.prop] == 1 ? "启用" : "关闭" }}
+            </div>
+            <div v-else>{{ scope.row[item.prop] }}</div>
+          </template></el-table-column
+        >
+      </el-table>
+      <div style="text-align: center; margin-top: 20px">
+        <el-button :size="size" type="primary" @click="submit">保 存</el-button>
+      </div>
+    </div>
+    <el-dialog
+      @closed="loadingClose"
+      :visible.sync="dialogVisible"
+      width="680px"
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">
+          {{ statusPop === 1 ? "添加" : statusPop === 0 ? "修改" : "详情" }}
+        </div>
+        <div class="rightBoxs">
+          <img src="@/assets/images/Close@2x.png" alt="" @click="close" />
+        </div>
+      </div>
+      <div>
+        <el-form
+          label-position="right"
+          label-width="170px"
+          :model="boxData"
+          :rules="rules"
+          ref="boxData"
+        >
+          <el-form-item label="名称" prop="name">
+            <el-input v-model="boxData.name"></el-input>
+          </el-form-item>
+          <el-form-item label="链接地址" prop="url">
+            <el-input v-model="boxData.url"></el-input>
+          </el-form-item>
+          <el-form-item label="状态" prop="status">
+            <el-radio-group v-model="boxData.status">
+              <el-radio :label="1">启用</el-radio>
+              <el-radio :label="0">关闭</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="close">取 消</el-button>
+        <el-button @click="submitForm('boxData')" :loading="disabledBtn"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listConfig, updateConfig } from "@/api/system/config";
+export default {
+  data() {
+    return {
+      disabledBtn: false,
+      dialogVisible: false,
+      size: "mini",
+      tableSet: [
+        {
+          label: "排序",
+          prop: "sort",
+          scope: "input",
+          width: "120px",
+        },
+        {
+          label: "名称",
+          prop: "name",
+        },
+        {
+          label: "链接地址",
+          prop: "url",
+        },
+        {
+          label: "状态",
+          prop: "status",
+          scope: "status",
+        },
+        {
+          label: "操作",
+          scope: "set",
+          width: "160px",
+        },
+      ],
+      Nav: [],
+      initData: {},
+      listData: [],
+      statusPop: "",
+      boxData: {},
+      rules: {
+        name: [{ required: true, message: "请填写名称", trigger: "blur" }],
+        url: [{ required: true, message: "请填写链接地址", trigger: "blur" }],
+        status: [
+          {
+            required: true,
+            message: "请选择状态",
+            trigger: "change",
+          },
+        ],
+      },
+      newIndex: "",
+    };
+  },
+  mounted() {
+    this.init();
+  },
+  methods: {
+    changeVal(row) {
+      if (!row.sort && row.sort !== 0) {
+        this.$message.warning("检测到你没有赋值或赋值异常,已自动赋值为0");
+        row.sort = 0;
+      } else {
+        for (let i = 0; i < this.listData.length; i++) {
+          if (
+            this.listData[i].name !== row.name &&
+            this.listData[i].sort == row.sort
+          ) {
+            this.$message.warning("检测到重复值,已自动赋值为0");
+            row.sort = 0;
+          }
+        }
+      }
+      this.listData.sort(this.sort);
+    },
+    sort(a, b) {
+      return a.sort - b.sort;
+    },
+    loadingClose() {
+      this.disabledBtn = false;
+    },
+    del(index) {
+      this.listData.splice(index, 1);
+    },
+    add(int, row, index) {
+      this.statusPop = int;
+      this.newIndex = index;
+      if (int === 0) {
+        this.boxData = JSON.parse(JSON.stringify(row));
+      }
+      if (int === 1) {
+        var indexNum = 0;
+        this.listData.forEach((item) => {
+          if (item.sort >= indexNum) {
+            indexNum = item.sort + 1;
+          }
+        });
+        this.boxData = {};
+        this.boxData.sort = indexNum;
+      }
+      this.dialogVisible = true;
+      this.$nextTick(() => {
+        this.$refs.boxData.clearValidate();
+      });
+    },
+    close() {
+      this.dialogVisible = false;
+    },
+    submitForm(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          if (this.statusPop === 1) {
+            this.listData.push(this.boxData);
+          } else {
+            this.listData.splice(this.newIndex, 1, this.boxData);
+          }
+          this.dialogVisible = false;
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+    init() {
+      listConfig({ configKey: "home.links" }).then((res) => {
+        if (res.rows.length) {
+          this.initData = res.rows[0];
+          this.listData = JSON.parse(res.rows[0].configValue);
+        }
+      });
+    },
+    submit() {
+      let data = JSON.parse(JSON.stringify(this.listData));
+      let copySubmitData = JSON.parse(JSON.stringify(this.initData));
+      copySubmitData.configValue = JSON.stringify(data);
+      updateConfig(copySubmitData).then((res) => {
+        this.$message.success("保存成功");
+      });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.smallBox {
+  width: 900px;
+}
+
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
+.dis_fs {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 337.5px;
+  height: 144px;
+  border: 1px solid #999;
+  .imgBoxs {
+    width: 100%;
+    height: 100%;
+  }
+}
+.styPsty {
+  margin-top: 10px;
+  display: flex;
+  align-items: center;
+  .btns {
+    border: 1px solid #999;
+    font-size: 12px;
+    height: 28px;
+    line-height: 28px;
+    padding: 0px 10px;
+    border-radius: 4px;
+    cursor: pointer;
+    margin-right: 10px;
+    flex-shrink: 0;
+  }
+}
+</style>

+ 41 - 0
src/views/2Cport/referralManageMent/index.vue

@@ -0,0 +1,41 @@
+<template>
+  <div id="referralManageMent">
+    <div>
+      <el-button
+        size="mini"
+        :type="activeIndex === 1 ? 'primary' : ''"
+        @click="activeIndex = 1"
+        >小程序</el-button
+      >
+      <el-button
+        size="mini"
+        :type="activeIndex === 2 ? 'primary' : ''"
+        @click="activeIndex = 2"
+        >PC官网</el-button
+      >
+    </div>
+    <tab1 v-if="activeIndex === 1" />
+    <tab2 v-if="activeIndex === 2" />
+  </div>
+</template>
+
+<script>
+import tab1 from "./tab1/tab1.vue";
+import tab2 from "./tab2/tab2.vue";
+export default {
+  name:"ReferralManageMent",
+  components: { tab1, tab2 },
+  data() {
+    return {
+      activeIndex: 1,
+    };
+  },
+  mounted(){
+  },
+  methods: {
+  },
+};
+</script>
+
+<style lang="less" scoped>
+</style>

+ 552 - 0
src/views/2Cport/referralManageMent/tab1/addGL.vue

@@ -0,0 +1,552 @@
+<template>
+  <div id="addGL">
+    <el-dialog
+      @closed="loadingClose"
+      :visible.sync="dialogVisible"
+      width="710px"
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">
+          {{ statusPop === 1 ? "添加" : statusPop === 0 ? "修改" : "详情" }}
+        </div>
+        <div class="rightBoxs">
+          <img src="@/assets/images/Close@2x.png" alt="" @click="close" />
+        </div>
+      </div>
+      <div>
+        <el-form
+          label-position="right"
+          label-width="150px"
+          :model="listData"
+          :rules="rules"
+          ref="listData"
+          :size="size"
+        >
+          <el-form-item label="显示标题" prop="name">
+            <el-input v-model="listData.name"></el-input>
+          </el-form-item>
+          <el-form-item label="业务层级" prop="educationTypeId">
+            <el-select
+              v-model="listData.educationTypeId"
+              placeholder="请选择教育类型"
+              @change="activeEdu"
+              :disabled="listData.goodsList.length > 0"
+            >
+              <el-option
+                v-for="(item, index) in educationType"
+                :key="index"
+                :label="item.educationName"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item
+            label=""
+            prop="businessId"
+            v-if="listData.educationTypeId"
+          >
+            <el-select
+              v-model="listData.businessId"
+              :disabled="listData.goodsList.length > 0"
+              placeholder="请选择业务层级"
+            >
+              <el-option
+                v-for="(item, index) in newBusinessLevel"
+                :key="index"
+                :label="item.projectName + ' - ' + item.businessName"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <div v-if="listData.businessId" style="margin-bottom: 10px">
+            <p class="p_sty">
+              <span style="color: red">注:推荐位最多显示15个商品</span>
+              <el-button :size="size" @click="addList">添加</el-button>
+            </p>
+            <el-table
+              :data="listData.goodsList"
+              style="width: 100%; margin-top: 10px"
+              border
+              :size="size"
+              max-height="400px"
+              :default-sort="{ prop: 'sort', order: 'ascending' }"
+            >
+              <template v-for="(items, indexs) in tableSet">
+                <el-table-column
+                  :width="items.width"
+                  :key="indexs"
+                  :prop="items.prop"
+                  :label="items.label"
+                  align="center"
+                  :sortable="items.scope === 'sort'"
+                >
+                  <template slot-scope="scope">
+                    <div v-if="items.scope === 'sort'">
+                      <el-input-number
+                        style="width: 80px"
+                        :size="size"
+                        :min="1"
+                        v-model="scope.row[items.prop]"
+                        :precision="0"
+                        :controls="false"
+                      ></el-input-number>
+                    </div>
+                    <div v-else>{{ items.ch }}{{ scope.row[items.prop] }}</div>
+                  </template></el-table-column
+                ></template
+              >
+              <el-table-column
+                fixed="right"
+                label="操作"
+                width="100"
+                align="center"
+              >
+                <template slot-scope="scope">
+                  <el-button
+                    type="text"
+                    size="small"
+                    @click="delList(scope.row.goodsId)"
+                    >删除</el-button
+                  >
+                </template>
+              </el-table-column>
+            </el-table>
+          </div>
+          <el-form-item label="排序" prop="sort">
+            <el-input-number
+              :min="1"
+              v-model="listData.sort"
+              :precision="0"
+              :controls="false"
+            ></el-input-number>
+          </el-form-item>
+          <el-form-item label="状态" prop="status">
+            <el-radio-group v-model="listData.status">
+              <el-radio :label="1">启用</el-radio>
+              <el-radio :label="0">关闭</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="close">取 消</el-button>
+        <el-button @click="submitForm('listData')" :loading="disabledBtn"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+    <el-dialog
+      @closed="loadingClose"
+      :visible.sync="dialogVisibleList"
+      width="710px"
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">选择关联商品</div>
+        <div class="rightBoxs">
+          <img
+            src="@/assets/images/Close@2x.png"
+            alt=""
+            @click="dialogVisibleList = false"
+          />
+        </div>
+      </div>
+      <el-checkbox-group v-model="newActiveNum">
+        <div class="over_sty">
+          <el-checkbox
+            v-for="(item, index) in goodsList"
+            :key="index"
+            :label="item.goodsId"
+            :disabled="activeNum.indexOf(item.goodsId) !== -1"
+            >{{ item.code }} - {{ item.goodsName }}({{
+              item.educationName +
+              " - " +
+              item.projectName +
+              " - " +
+              item.businessName
+            }}) -
+            <span style="color: red">¥{{ item.standPrice }}</span></el-checkbox
+          >
+        </div>
+      </el-checkbox-group>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisibleList = false">取 消</el-button>
+        <el-button
+          @click="submitFormList"
+          :disabled="newActiveNum < 1"
+          :loading="disabledBtn"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from "vuex";
+export default {
+  data() {
+    return {
+      size: "small",
+      dialogVisible: false,
+      dialogVisibleList: false,
+      disabledBtn: false,
+      listData: {
+        businessId: "",
+        goodsList: [],
+      },
+      rules: {
+        name: [{ required: true, message: "请输入显示标题", trigger: "blur" }],
+        educationTypeId: [
+          { required: true, message: "请选择教育类型", trigger: "change" },
+        ],
+        businessId: [
+          {
+            required: true,
+            message: "请选择业务层次",
+            trigger: ["change", "blur"],
+          },
+        ],
+        sort: [{ required: true, message: "请输入排序", trigger: "blur" }],
+        status: [
+          {
+            required: true,
+            message: "请选择状态",
+            trigger: ["change", "blur"],
+          },
+        ],
+      },
+      statusPop: 1,
+      tableSet: [
+        {
+          label: "排序",
+          prop: "sort",
+          width: "120px",
+          scope: "sort",
+        },
+        {
+          label: "商品编码",
+          prop: "code",
+        },
+        {
+          label: "商品名称",
+          prop: "goodsName",
+        },
+        {
+          label: "商品标准价格",
+          prop: "standPrice",
+          ch: "¥",
+        },
+      ],
+      newBusinessLevel: [],
+      activeNum: [], //已选商品ID
+      newActiveNum: [],
+      goodsList: [], //商品列表
+    };
+  },
+  computed: {
+    ...mapGetters(["educationType"]),
+  },
+  watch: {
+    "listData.businessId"(val) {
+      if (val) {
+        for (let i = 0; i < this.newBusinessLevel.length; i++) {
+          if (this.newBusinessLevel[i].id == val) {
+            this.listData.projectId = this.newBusinessLevel[i].projectId;
+            break;
+          }
+        }
+      }
+    },
+  },
+  methods: {
+    openBox(int, id) {
+      this.statusPop = int;
+      if (int === 0) {
+        this.$api.obtainactivityrecommend(id).then((res) => {
+          this.listData = res.data;
+          this.activeEdu(res.data.educationTypeId);
+        });
+      }
+      if (int === 1) {
+        var dy = this.$parent.tableData.map((item) => {
+          return Number(item.sort);
+        });
+        let MAXNUM = Math.max.apply(null, dy);
+        this.listData = { businessId: "", goodsList: [], sort: MAXNUM + 1 };
+      }
+      this.dialogVisible = true;
+      this.$nextTick(() => {
+        this.$refs.listData.clearValidate();
+      });
+    },
+    activeEdu(v) {
+      if (this.statusPop !== 0) {
+        this.listData.businessId = "";
+        this.listData.projectId = "";
+      }
+      this.$api
+        .inquirebusinessList({ status: 1, educationId: v })
+        .then((res) => {
+          this.newBusinessLevel = res.rows;
+        });
+    },
+    loadingClose() {
+      this.disabledBtn = false;
+    },
+    submitForm(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          this.submit();
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+    unique(arr) {
+      var arrs = []
+      for(let i = 0; i < arr.length;i++){
+        if(arr[i] && !arrs.includes(arr[i])){
+          arrs.push(arr[i])
+        }else{
+          return false
+        }
+      }
+      return true
+    },
+    submit() {
+      if (this.listData.goodsList.length) {
+        if (this.listData.goodsList.length > 16) {
+          this.$message.warning("推荐位最多显示15个商品");
+          return;
+        }
+        var indexNum = this.listData.goodsList.map((item) => {
+          return item.sort;
+        });
+        if (!this.unique(indexNum)) {
+          this.$message.error("推荐位商品排序不允许重复或空");
+          return;
+        }
+      }
+      this.disabledBtn = true;
+      if (this.statusPop === 1) {
+        let data = JSON.parse(JSON.stringify(this.listData));
+        data.platform = 1;
+        data.type = this.$parent.activeName === "first" ? 1 : 2;
+        this.$api
+          .appactivityrecommend(data)
+          .then((res) => {
+            this.$message.success("新增成功");
+            this.$parent.search();
+            this.dialogVisible = false;
+          })
+          .catch((err) => {
+            this.disabledBtn = false;
+          });
+      }
+      if (this.statusPop === 0) {
+        let data = JSON.parse(JSON.stringify(this.listData));
+        this.$api
+          .editactivityrecommend(data)
+          .then((res) => {
+            this.$message.success("修改成功");
+            this.$parent.search();
+            this.dialogVisible = false;
+          })
+          .catch((err) => {
+            this.disabledBtn = false;
+          });
+      }
+    },
+    close() {
+      this.dialogVisible = false;
+    },
+    delList(id) {
+      const Index = this.listData.goodsList.findIndex((item) => {
+        return item.goodsId === id;
+      });
+      this.listData.goodsList.splice(Index, 1);
+    },
+    addList() {
+      this.newActiveNum = [];
+      this.activeNum = this.listData.goodsList.map((item) => {
+        return item.goodsId;
+      });
+      this.$api
+        .inquireGoods({
+          businessId: this.listData.businessId,
+          status: 1,
+          goodsType: this.$parent.activeName === "first" ? 1 : 2,
+        })
+        .then((res) => {
+          this.goodsList = res.rows;
+        });
+      this.dialogVisibleList = true;
+    },
+    submitFormList() {
+      let ary = this.goodsList.filter((item) => {
+        return this.newActiveNum.includes(item.goodsId);
+      });
+      if (this.listData.goodsList.length) {
+        let maxIndex = 0;
+        this.listData.goodsList.forEach((item) => {
+          if (item.sort > maxIndex) {
+            maxIndex = item.sort;
+          }
+        });
+        ary.forEach((item, index) => {
+          item.sort = maxIndex + index + 1;
+        });
+      } else {
+        ary.forEach((item, index) => {
+          item.sort = index + 1;
+        });
+      }
+      let data = this.listData.goodsList.concat(ary);
+      this.$set(this.listData, "goodsList", data);
+      this.dialogVisibleList = false;
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.p_sty {
+  margin: 0px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
+.dis_fs {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 337.5px;
+  height: 144px;
+  border: 1px solid #999;
+  .imgBoxs {
+    width: 100%;
+    height: 100%;
+  }
+}
+.styPsty {
+  margin-top: 10px;
+  display: flex;
+  align-items: center;
+  .btns {
+    border: 1px solid #999;
+    font-size: 12px;
+    height: 28px;
+    line-height: 28px;
+    padding: 0px 10px;
+    border-radius: 4px;
+    cursor: pointer;
+    margin-right: 10px;
+    flex-shrink: 0;
+  }
+}
+.over_sty {
+  max-height: 600px;
+  overflow: auto;
+  background-color: #eee;
+  padding: 20px;
+}
+/deep/ .el-input--small .el-input__inner {
+  max-width: 215px;
+}
+</style>

+ 208 - 0
src/views/2Cport/referralManageMent/tab1/tab1.vue

@@ -0,0 +1,208 @@
+<template>
+  <div id="tab1">
+    <div class="postMs">
+      <el-tabs v-model="activeName">
+        <el-tab-pane label="推荐课程" name="first"></el-tab-pane>
+        <el-tab-pane label="推荐题库" name="second"></el-tab-pane>
+      </el-tabs>
+      <el-button class="topPost" size="mini" type="success" @click="add"
+        >添加</el-button
+      >
+    </div>
+    <div>
+      <el-table
+        v-loading="loading"
+        :data="tableData"
+        style="width: 100%; margin-top: 10px"
+        border
+      >
+        <template v-for="(item, index) in tableSet">
+          <af-table-column
+            :width="item.width"
+            :key="index"
+            :prop="item.prop"
+            :label="item.label"
+            align="center"
+          >
+            <template slot-scope="scope">
+              <span v-if="item.scope === 'status'">
+                {{
+                  scope.row[item.prop] === 1
+                    ? "启用"
+                    : scope.row[item.prop] === 0
+                    ? "关闭"
+                    : "未知"
+                }}
+              </span>
+              <div v-else-if="item.scope === 'businType'">
+                {{ scope.row[item.prop1] + "-" + scope.row[item.prop2] }}
+              </div>
+              <div v-else-if="item.scope === 'aboutChapter'" class="ulAuto">
+                <ul>
+                  <template v-for="(itm, inds) in scope.row[item.prop]">
+                    <li class="jumpStys" :key="inds" v-if="inds === 0">
+                      {{ itm[item.prop1] }}
+                    </li>
+                  </template>
+                </ul>
+                <el-popover
+                  :key="Math.random()"
+                  placement="right"
+                  trigger="click"
+                >
+                  <ul style="overflow: auto; max-height: 500px; margin: 0px">
+                    <li
+                      v-for="(itm, inds) in scope.row[item.prop]"
+                      :key="inds"
+                      class="jumpStys"
+                    >
+                      {{ inds + 1 }}、
+                      {{ itm[item.prop1] }}
+                    </li>
+                  </ul>
+                  <el-button
+                    slot="reference"
+                    style="margin-left: 6px"
+                    type="text"
+                    v-if="scope.row[item.prop].length > 1"
+                    size="mini"
+                    >更多</el-button
+                  >
+                </el-popover>
+              </div>
+              <div v-else>{{ scope.row[item.prop] }}</div>
+            </template></af-table-column
+          ></template
+        >
+        <el-table-column fixed="right" label="操作" width="100" align="center">
+          <template slot-scope="scope">
+            <el-button type="text" size="small" @click="editList(scope.row)"
+              >修改</el-button
+            ><el-button type="text" size="small" @click="del(scope.row)"
+              >删除</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <add-gl ref="addGL" />
+  </div>
+</template>
+
+<script>
+import addGl from "./addGL.vue";
+export default {
+  components: { addGl },
+  data() {
+    return {
+      activeName: "first",
+      tableSet: [
+        {
+          label: "排序",
+          prop: "sort",
+          width: "120px",
+        },
+        {
+          label: "名称",
+          prop: "name",
+        },
+        {
+          label: "教育类型",
+          prop: "educationName",
+        },
+        {
+          label: "业务层次",
+          prop1: "projectName",
+          prop2: "businessName",
+          scope: "businType",
+        },
+        {
+          label: "关联商品",
+          prop: "goodsList",
+          prop1: "goodsName",
+          scope: "aboutChapter",
+        },
+        {
+          label: "状态",
+          prop: "status",
+          scope: "status",
+        },
+      ],
+      tableData: [],
+      loading: false,
+    };
+  },
+  watch: {
+    activeName(val) {
+      this.search();
+    },
+  },
+  mounted() {
+    this.search();
+  },
+  methods: {
+    search() {
+      this.loading = true;
+      this.$api
+        .inquireactivityrecommendList({
+          platform: 1,
+          type: this.activeName === "first" ? 1 : 2
+        })
+        .then((res) => {
+          this.tableData = res.rows;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    /**
+     * 新增
+     */
+    add() {
+      this.$refs.addGL.openBox(1);
+    },
+    editList(row) {
+      this.$refs.addGL.openBox(0, row.recommendId);
+    },
+    del(v) {
+      this.$alert(
+        "确定删除此内容?<br />内容删除后将无法恢复,请慎重考虑",
+        "提示",
+        {
+          dangerouslyUseHTMLString: true,
+        }
+      )
+        .then(() => {
+          var data = {
+            recommendId: v.recommendId
+          };
+          this.$api.removeactivityrecommend(data).then((res) => {
+            this.$message.success("删除成功");
+            this.search();
+          });
+        })
+        .catch(() => {
+        });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.postMs {
+  position: relative;
+  .topPost {
+    position: absolute;
+    top: 10%;
+    right: 10px;
+  }
+}
+.ulAuto {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  & > ul {
+    margin: 0px;
+  }
+}
+</style>

+ 552 - 0
src/views/2Cport/referralManageMent/tab2/addGL.vue

@@ -0,0 +1,552 @@
+<template>
+  <div id="addGL">
+    <el-dialog
+      @closed="loadingClose"
+      :visible.sync="dialogVisible"
+      width="710px"
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">
+          {{ statusPop === 1 ? "添加" : statusPop === 0 ? "修改" : "详情" }}
+        </div>
+        <div class="rightBoxs">
+          <img src="@/assets/images/Close@2x.png" alt="" @click="close" />
+        </div>
+      </div>
+      <div>
+        <el-form
+          label-position="right"
+          label-width="150px"
+          :model="listData"
+          :rules="rules"
+          ref="listData"
+          :size="size"
+        >
+          <el-form-item label="显示标题" prop="name">
+            <el-input v-model="listData.name"></el-input>
+          </el-form-item>
+          <el-form-item label="业务层级" prop="educationTypeId">
+            <el-select
+              v-model="listData.educationTypeId"
+              placeholder="请选择教育类型"
+              @change="activeEdu"
+              :disabled="listData.goodsList.length > 0"
+            >
+              <el-option
+                v-for="(item, index) in educationType"
+                :key="index"
+                :label="item.educationName"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item
+            label=""
+            prop="businessId"
+            v-if="listData.educationTypeId"
+          >
+            <el-select
+              v-model="listData.businessId"
+              :disabled="listData.goodsList.length > 0"
+              placeholder="请选择业务层级"
+            >
+              <el-option
+                v-for="(item, index) in newBusinessLevel"
+                :key="index"
+                :label="item.projectName + ' - ' + item.businessName"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <div v-if="listData.businessId" style="margin-bottom: 10px">
+            <p class="p_sty">
+              <span style="color: red">注:推荐位最多显示15个商品</span>
+              <el-button :size="size" @click="addList">添加</el-button>
+            </p>
+            <el-table
+              :data="listData.goodsList"
+              style="width: 100%; margin-top: 10px"
+              border
+              :size="size"
+              max-height="400px"
+              :default-sort="{ prop: 'sort', order: 'ascending' }"
+            >
+              <template v-for="(items, indexs) in tableSet">
+                <el-table-column
+                  :width="items.width"
+                  :key="indexs"
+                  :prop="items.prop"
+                  :label="items.label"
+                  align="center"
+                  :sortable="items.scope === 'sort'"
+                >
+                  <template slot-scope="scope">
+                    <div v-if="items.scope === 'sort'">
+                      <el-input-number
+                        style="width: 80px"
+                        :size="size"
+                        :min="1"
+                        v-model="scope.row[items.prop]"
+                        :precision="0"
+                        :controls="false"
+                      ></el-input-number>
+                    </div>
+                    <div v-else>{{ items.ch }}{{ scope.row[items.prop] }}</div>
+                  </template></el-table-column
+                ></template
+              >
+              <el-table-column
+                fixed="right"
+                label="操作"
+                width="100"
+                align="center"
+              >
+                <template slot-scope="scope">
+                  <el-button
+                    type="text"
+                    size="small"
+                    @click="delList(scope.row.goodsId)"
+                    >删除</el-button
+                  >
+                </template>
+              </el-table-column>
+            </el-table>
+          </div>
+          <el-form-item label="排序" prop="sort">
+            <el-input-number
+              :min="1"
+              v-model="listData.sort"
+              :precision="0"
+              :controls="false"
+            ></el-input-number>
+          </el-form-item>
+          <el-form-item label="状态" prop="status">
+            <el-radio-group v-model="listData.status">
+              <el-radio :label="1">启用</el-radio>
+              <el-radio :label="0">关闭</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="close">取 消</el-button>
+        <el-button @click="submitForm('listData')" :loading="disabledBtn"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+    <el-dialog
+      @closed="loadingClose"
+      :visible.sync="dialogVisibleList"
+      width="710px"
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">选择关联商品</div>
+        <div class="rightBoxs">
+          <img
+            src="@/assets/images/Close@2x.png"
+            alt=""
+            @click="dialogVisibleList = false"
+          />
+        </div>
+      </div>
+      <el-checkbox-group v-model="newActiveNum">
+        <div class="over_sty">
+          <el-checkbox
+            v-for="(item, index) in goodsList"
+            :key="index"
+            :label="item.goodsId"
+            :disabled="activeNum.indexOf(item.goodsId) !== -1"
+            >{{ item.code }} - {{ item.goodsName }}({{
+              item.educationName +
+              " - " +
+              item.projectName +
+              " - " +
+              item.businessName
+            }}) -
+            <span style="color: red">¥{{ item.standPrice }}</span></el-checkbox
+          >
+        </div>
+      </el-checkbox-group>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisibleList = false">取 消</el-button>
+        <el-button
+          @click="submitFormList"
+          :disabled="newActiveNum < 1"
+          :loading="disabledBtn"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from "vuex";
+export default {
+  data() {
+    return {
+      size: "small",
+      dialogVisible: false,
+      dialogVisibleList: false,
+      disabledBtn: false,
+      listData: {
+        businessId: "",
+        goodsList: [],
+      },
+      rules: {
+        name: [{ required: true, message: "请输入显示标题", trigger: "blur" }],
+        educationTypeId: [
+          { required: true, message: "请选择教育类型", trigger: "change" },
+        ],
+        businessId: [
+          {
+            required: true,
+            message: "请选择业务层次",
+            trigger: ["change", "blur"],
+          },
+        ],
+        sort: [{ required: true, message: "请输入排序", trigger: "blur" }],
+        status: [
+          {
+            required: true,
+            message: "请选择状态",
+            trigger: ["change", "blur"],
+          },
+        ],
+      },
+      statusPop: 1,
+      tableSet: [
+        {
+          label: "排序",
+          prop: "sort",
+          width: "120px",
+          scope: "sort",
+        },
+        {
+          label: "商品编码",
+          prop: "code",
+        },
+        {
+          label: "商品名称",
+          prop: "goodsName",
+        },
+        {
+          label: "商品标准价格",
+          prop: "standPrice",
+          ch: "¥",
+        },
+      ],
+      newBusinessLevel: [],
+      activeNum: [], //已选商品ID
+      newActiveNum: [],
+      goodsList: [], //商品列表
+    };
+  },
+  computed: {
+    ...mapGetters(["educationType"]),
+  },
+  watch: {
+    "listData.businessId"(val) {
+      if (val) {
+        for (let i = 0; i < this.newBusinessLevel.length; i++) {
+          if (this.newBusinessLevel[i].id == val) {
+            this.listData.projectId = this.newBusinessLevel[i].projectId;
+            break;
+          }
+        }
+      }
+    },
+  },
+  methods: {
+    openBox(int, id) {
+      this.statusPop = int;
+      if (int === 0) {
+        this.$api.obtainactivityrecommend(id).then((res) => {
+          this.listData = res.data;
+          this.activeEdu(res.data.educationTypeId);
+        });
+      }
+      if (int === 1) {
+        var dy = this.$parent.tableData.map((item) => {
+          return Number(item.sort);
+        });
+        let MAXNUM = Math.max.apply(null, dy);
+        this.listData = { businessId: "", goodsList: [], sort: MAXNUM + 1 };
+      }
+      this.dialogVisible = true;
+      this.$nextTick(() => {
+        this.$refs.listData.clearValidate();
+      });
+    },
+    activeEdu(v) {
+      if (this.statusPop !== 0) {
+        this.listData.businessId = "";
+        this.listData.projectId = "";
+      }
+      this.$api
+        .inquirebusinessList({ status: 1, educationId: v })
+        .then((res) => {
+          this.newBusinessLevel = res.rows;
+        });
+    },
+    loadingClose() {
+      this.disabledBtn = false;
+    },
+    submitForm(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          this.submit();
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+    unique(arr) {
+      var arrs = [];
+      for (let i = 0; i < arr.length; i++) {
+        if (arr[i] && !arrs.includes(arr[i])) {
+          arrs.push(arr[i]);
+        } else {
+          return false;
+        }
+      }
+      return true;
+    },
+    submit() {
+      if (this.listData.goodsList.length) {
+        if (this.listData.goodsList.length > 15) {
+          this.$message.warning("推荐位最多显示15个商品");
+          return;
+        }
+        var indexNum = this.listData.goodsList.map((item) => {
+          return item.sort;
+        });
+        if (!this.unique(indexNum)) {
+          this.$message.error("推荐位商品排序不允许重复或空");
+          return;
+        }
+      }
+      this.disabledBtn = true;
+      if (this.statusPop === 1) {
+        let data = JSON.parse(JSON.stringify(this.listData));
+        data.platform = 2;
+        data.type = this.$parent.activeName === "first" ? 1 : 2;
+        this.$api
+          .appactivityrecommend(data)
+          .then((res) => {
+            this.$message.success("新增成功");
+            this.$parent.search();
+            this.dialogVisible = false;
+          })
+          .catch((err) => {
+            this.disabledBtn = false;
+          });
+      }
+      if (this.statusPop === 0) {
+        let data = JSON.parse(JSON.stringify(this.listData));
+        this.$api
+          .editactivityrecommend(data)
+          .then((res) => {
+            this.$message.success("修改成功");
+            this.$parent.search();
+            this.dialogVisible = false;
+          })
+          .catch((err) => {
+            this.disabledBtn = false;
+          });
+      }
+    },
+    close() {
+      this.dialogVisible = false;
+    },
+    delList(id) {
+      const Index = this.listData.goodsList.findIndex((item) => {
+        return item.goodsId === id;
+      });
+      this.listData.goodsList.splice(Index, 1);
+    },
+    addList() {
+      this.newActiveNum = [];
+      this.activeNum = this.listData.goodsList.map((item) => {
+        return item.goodsId;
+      });
+      this.$api
+        .inquireGoods({
+          businessId: this.listData.businessId,
+          status: 1,
+          goodsType: this.$parent.activeName === "first" ? 1 : 2,
+        })
+        .then((res) => {
+          this.goodsList = res.rows;
+        });
+      this.dialogVisibleList = true;
+    },
+    submitFormList() {
+      let ary = this.goodsList.filter((item) => {
+        return this.newActiveNum.includes(item.goodsId);
+      });
+      if (this.listData.goodsList.length) {
+        let maxIndex = 0;
+        this.listData.goodsList.forEach((item) => {
+          if (item.sort > maxIndex) {
+            maxIndex = item.sort;
+          }
+        });
+        ary.forEach((item, index) => {
+          item.sort = maxIndex + index + 1;
+        });
+      } else {
+        ary.forEach((item, index) => {
+          item.sort = index + 1;
+        });
+      }
+      let data = this.listData.goodsList.concat(ary);
+      this.$set(this.listData, "goodsList", data);
+      this.dialogVisibleList = false;
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.p_sty {
+  margin: 0px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
+.dis_fs {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 337.5px;
+  height: 144px;
+  border: 1px solid #999;
+  .imgBoxs {
+    width: 100%;
+    height: 100%;
+  }
+}
+.styPsty {
+  margin-top: 10px;
+  display: flex;
+  align-items: center;
+  .btns {
+    border: 1px solid #999;
+    font-size: 12px;
+    height: 28px;
+    line-height: 28px;
+    padding: 0px 10px;
+    border-radius: 4px;
+    cursor: pointer;
+    margin-right: 10px;
+    flex-shrink: 0;
+  }
+}
+.over_sty {
+  max-height: 600px;
+  overflow: auto;
+  background-color: #eee;
+  padding: 20px;
+}
+/deep/ .el-input--small .el-input__inner {
+  max-width: 215px;
+}
+</style>

+ 207 - 0
src/views/2Cport/referralManageMent/tab2/tab2.vue

@@ -0,0 +1,207 @@
+<template>
+  <div id="tab2">
+    <div class="postMs">
+      <el-tabs v-model="activeName">
+        <el-tab-pane label="推荐课程" name="first"></el-tab-pane>
+        <el-tab-pane label="推荐题库" name="second"></el-tab-pane>
+      </el-tabs>
+      <el-button class="topPost" size="mini" type="success" @click="add"
+        >添加</el-button
+      >
+    </div>
+    <div>
+      <el-table
+        v-loading="loading"
+        :data="tableData"
+        style="width: 100%; margin-top: 10px"
+        border
+      >
+        <template v-for="(item, index) in tableSet">
+          <af-table-column
+            :width="item.width"
+            :key="index"
+            :prop="item.prop"
+            :label="item.label"
+            align="center"
+          >
+            <template slot-scope="scope">
+              <span v-if="item.scope === 'status'">
+                {{
+                  scope.row[item.prop] === 1
+                    ? "启用"
+                    : scope.row[item.prop] === 0
+                    ? "关闭"
+                    : "未知"
+                }}
+              </span>
+              <div v-else-if="item.scope === 'businType'">
+                {{ scope.row[item.prop1] + "-" + scope.row[item.prop2] }}
+              </div>
+              <div v-else-if="item.scope === 'aboutChapter'" class="ulAuto">
+                <ul>
+                  <template v-for="(itm, inds) in scope.row[item.prop]">
+                    <li class="jumpStys" :key="inds" v-if="inds === 0">
+                      {{ itm[item.prop1] }}
+                    </li>
+                  </template>
+                </ul>
+                <el-popover
+                  :key="Math.random()"
+                  placement="right"
+                  trigger="click"
+                >
+                  <ul style="overflow: auto; max-height: 500px; margin: 0px">
+                    <li
+                      v-for="(itm, inds) in scope.row[item.prop]"
+                      :key="inds"
+                      class="jumpStys"
+                    >
+                      {{ inds + 1 }}、
+                      {{ itm[item.prop1] }}
+                    </li>
+                  </ul>
+                  <el-button
+                    slot="reference"
+                    style="margin-left: 6px"
+                    type="text"
+                    v-if="scope.row[item.prop].length > 1"
+                    size="mini"
+                    >更多</el-button
+                  >
+                </el-popover>
+              </div>
+              <div v-else>{{ scope.row[item.prop] }}</div>
+            </template></af-table-column
+          ></template
+        >
+        <el-table-column fixed="right" label="操作" width="100" align="center">
+          <template slot-scope="scope">
+            <el-button type="text" size="small" @click="editList(scope.row)"
+              >修改</el-button
+            ><el-button type="text" size="small" @click="del(scope.row)"
+              >删除</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <add-gl ref="addGL" />
+  </div>
+</template>
+
+<script>
+import addGl from "./addGL.vue";
+export default {
+  components: { addGl },
+  data() {
+    return {
+      activeName: "first",
+      tableSet: [
+        {
+          label: "排序",
+          prop: "sort",
+          width: "120px",
+        },
+        {
+          label: "名称",
+          prop: "name",
+        },
+        {
+          label: "教育类型",
+          prop: "educationName",
+        },
+        {
+          label: "业务层次",
+          prop1: "projectName",
+          prop2: "businessName",
+          scope: "businType",
+        },
+        {
+          label: "关联商品",
+          prop: "goodsList",
+          prop1: "goodsName",
+          scope: "aboutChapter",
+        },
+        {
+          label: "状态",
+          prop: "status",
+          scope: "status",
+        },
+      ],
+      tableData: [],
+      loading: false,
+    };
+  },
+  watch: {
+    activeName(val) {
+      this.search();
+    },
+  },
+  mounted() {
+    this.search();
+  },
+  methods: {
+    search() {
+      this.loading = true;
+      this.$api
+        .inquireactivityrecommendList({
+          platform: 2,
+          type: this.activeName === "first" ? 1 : 2,
+        })
+        .then((res) => {
+          this.tableData = res.rows;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    /**
+     * 新增
+     */
+    add() {
+      this.$refs.addGL.openBox(1);
+    },
+    editList(row) {
+      this.$refs.addGL.openBox(0, row.recommendId);
+    },
+    del(v) {
+      this.$alert(
+        "确定删除此内容?<br />内容删除后将无法恢复,请慎重考虑",
+        "提示",
+        {
+          dangerouslyUseHTMLString: true,
+        }
+      )
+        .then(() => {
+          var data = {
+            recommendId: v.recommendId,
+          };
+          this.$api.removeactivityrecommend(data).then((res) => {
+            this.$message.success("删除成功");
+            this.search();
+          });
+        })
+        .catch(() => {});
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.postMs {
+  position: relative;
+  .topPost {
+    position: absolute;
+    top: 10%;
+    right: 10px;
+  }
+}
+.ulAuto {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  & > ul {
+    margin: 0px;
+  }
+}
+</style>

+ 48 - 35
src/views/Marketing/basicParameters/marketings/beneficiary/index.vue

@@ -23,7 +23,7 @@
       @handleCurrentChange="handleCurrentChange"
     />
     <el-dialog
-    @closed="loadingClose"
+      @closed="loadingClose"
       :visible.sync="dialogVisible"
       width="560px"
       :show-close="false"
@@ -81,7 +81,7 @@
         <el-button @click="close">取 消</el-button>
         <el-button
           type="primary"
-:loading="disabledBtn"
+          :loading="disabledBtn"
           v-if="statusPop !== 2"
           @click="submit('listData')"
           >确 定</el-button
@@ -96,10 +96,11 @@ import searchBox from "@/components/searchBox";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
 export default {
+  name: "Beneficiary",
   components: { searchBox, tableList, pagination },
   data() {
     return {
-disabledBtn: false,
+      disabledBtn: false,
       loading: false, //当前表单加载是否加载动画
       navText: {
         title: "收款方",
@@ -119,12 +120,12 @@ disabledBtn: false,
           label: "收款方名称",
           prop: "payeeName",
           hidden: true,
-          scope: 'editInfo'
+          scope: "editInfo",
         },
         {
           label: "收款方信息",
           hidden: true,
-          scope:"infoJump"
+          scope: "infoJump",
         },
         {
           label: "状态",
@@ -185,27 +186,33 @@ disabledBtn: false,
   mounted() {
     this.search();
   },
+  activated(){
+    this.search();
+  },
   methods: {
-loadingClose(){
-      this.disabledBtn = false
+    loadingClose() {
+      this.disabledBtn = false;
     },
-    editInfo(v){
-      this.addClick(v,0)
+    editInfo(v) {
+      this.addClick(v, 0);
     },
     search(v) {
       this.loading = true;
       var data = {
-        status:'0,1',
+        status: "0,1",
         pageSize: this.pageSize,
         pageNum: this.currentPage,
       };
-      this.$api.inquirepaypayee(data).then((res) => {
-        this.tableData = res.rows;
-        this.total = res.total;
-        this.navText.index = res.total;
-      }).finally(()=>{
-        this.loading = false;
-      })
+      this.$api
+        .inquirepaypayee(data)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
     },
     init() {
       this.search();
@@ -225,7 +232,7 @@ loadingClose(){
           };
           this.$api.editpaypayee(data).then((res) => {
             this.$message.success("删除成功");
-          this.$store.commit("PAYPAYEE");
+            this.$store.commit("PAYPAYEE");
             this.search();
           });
         })
@@ -261,26 +268,32 @@ loadingClose(){
       });
     },
     rulesTableSumbit() {
-      this.disabledBtn = true
+      this.disabledBtn = true;
       if (this.statusPop === 1) {
-        this.$api.apppaypayee(this.listData).then((res) => {
-          this.$message.success("新增成功");
-          this.dialogVisible = false;
-          this.$store.commit("PAYPAYEE");
-          this.search();
-        }).catch(()=>{
-          this.disabledBtn = false
-        })
+        this.$api
+          .apppaypayee(this.listData)
+          .then((res) => {
+            this.$message.success("新增成功");
+            this.dialogVisible = false;
+            this.$store.commit("PAYPAYEE");
+            this.search();
+          })
+          .catch(() => {
+            this.disabledBtn = false;
+          });
       }
       if (this.statusPop === 0) {
-        this.$api.editpaypayee(this.listData).then((res) => {
-          this.$message.success("修改成功");
-          this.dialogVisible = false;
-          this.$store.commit("PAYPAYEE");
-          this.search();
-        }).catch(()=>{
-          this.disabledBtn = false
-        })
+        this.$api
+          .editpaypayee(this.listData)
+          .then((res) => {
+            this.$message.success("修改成功");
+            this.dialogVisible = false;
+            this.$store.commit("PAYPAYEE");
+            this.search();
+          })
+          .catch(() => {
+            this.disabledBtn = false;
+          });
       }
     },
     close() {

+ 53 - 32
src/views/Marketing/basicParameters/marketings/beneficiaryInfos/index.vue

@@ -23,7 +23,7 @@
       @handleCurrentChange="handleCurrentChange"
     />
     <el-dialog
-    @closed="loadingClose"
+      @closed="loadingClose"
       :visible.sync="dialogVisible"
       width="560px"
       :show-close="false"
@@ -108,7 +108,7 @@
         <el-button @click="close">取 消</el-button>
         <el-button
           type="primary"
-:loading="disabledBtn"
+          :loading="disabledBtn"
           v-if="statusPop !== 2"
           @click="submit('listData')"
           >确 定</el-button
@@ -119,15 +119,16 @@
 </template>
 
 <script>
-import {mapGetters} from "vuex"
+import { mapGetters } from "vuex";
 import searchBox from "@/components/searchBox";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
 export default {
+  name: "BeneficiaryInfos",
   components: { searchBox, tableList, pagination },
   data() {
     return {
-disabledBtn: false,
+      disabledBtn: false,
       loading: false, //当前表单加载是否加载动画
       navText: {
         title: "收款方详情",
@@ -153,7 +154,7 @@ disabledBtn: false,
           label: "收款方账号类型",
           prop: "typeStatus",
           hidden: true,
-          scope:"typeStatusName"
+          scope: "typeStatusName",
         },
         {
           label: "支付通道",
@@ -231,22 +232,33 @@ disabledBtn: false,
           { required: true, message: "请输入收款方账号", trigger: "blur" },
         ],
         typeStatus: [
-          { required: true, message: "请选择收款方账号类型", trigger: ["change","blur"] },
+          {
+            required: true,
+            message: "请选择收款方账号类型",
+            trigger: ["change", "blur"],
+          },
         ],
         aisleId: [
-          { required: true, message: "请选择支付通道", trigger: ["change","blur"] },
+          {
+            required: true,
+            message: "请选择支付通道",
+            trigger: ["change", "blur"],
+          },
         ],
         status: [{ required: true, message: "请选择状态", trigger: "change" }],
       },
     };
   },
-  computed:{...mapGetters(["payList"])},
+  computed: { ...mapGetters(["payList"]) },
   mounted() {
     this.search();
   },
+  activated(){
+    this.search();
+  },
   methods: {
-loadingClose(){
-      this.disabledBtn = false
+    loadingClose() {
+      this.disabledBtn = false;
     },
     editInfo(v) {
       this.addClick(v, 0);
@@ -259,13 +271,16 @@ loadingClose(){
         pageSize: this.pageSize,
         pageNum: this.currentPage,
       };
-      this.$api.inquirePayeeAisle(data).then((res) => {
-        this.tableData = res.rows;
-        this.total = res.total;
-        this.navText.index = res.total;
-      }).finally(()=>{
-        this.loading = false;
-      })
+      this.$api
+        .inquirePayeeAisle(data)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
     },
     init() {
       this.search();
@@ -321,24 +336,30 @@ loadingClose(){
       });
     },
     rulesTableSumbit() {
-      this.disabledBtn = true
+      this.disabledBtn = true;
       if (this.statusPop === 1) {
-        this.$api.appPayeeAisle(this.listData).then((res) => {
-          this.$message.success("新增成功");
-          this.dialogVisible = false;
-          this.search();
-        }).catch(()=>{
-          this.disabledBtn = false
-        })
+        this.$api
+          .appPayeeAisle(this.listData)
+          .then((res) => {
+            this.$message.success("新增成功");
+            this.dialogVisible = false;
+            this.search();
+          })
+          .catch(() => {
+            this.disabledBtn = false;
+          });
       }
       if (this.statusPop === 0) {
-        this.$api.editPayeeAisle(this.listData).then((res) => {
-          this.$message.success("修改成功");
-          this.dialogVisible = false;
-          this.search();
-        }).catch(()=>{
-          this.disabledBtn = false
-        })
+        this.$api
+          .editPayeeAisle(this.listData)
+          .then((res) => {
+            this.$message.success("修改成功");
+            this.dialogVisible = false;
+            this.search();
+          })
+          .catch(() => {
+            this.disabledBtn = false;
+          });
       }
     },
     close() {

+ 4 - 0
src/views/Marketing/basicParameters/marketings/channelSource/index.vue

@@ -96,6 +96,7 @@ import searchBox from "@/components/searchBox";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
 export default {
+  name:"ChannelSource",
   components: { searchBox, tableList, pagination },
   data() {
     return {
@@ -180,6 +181,9 @@ export default {
   mounted() {
     this.search();
   },
+  activated(){
+    this.search();
+  },
   methods: {
     loadingClose(){
       this.disabledBtn = false

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff