浏览代码

业务层级近期记录-确定按钮节流

Tang 3 年之前
父节点
当前提交
1a10982d75
共有 28 个文件被更改,包括 2339 次插入425 次删除
  1. 21 0
      src/assets/styles/index.scss
  2. 73 6
      src/components/busIns.vue
  3. 1 1
      src/components/tableList.vue
  4. 16 5
      src/utils/methodsTool.js
  5. 93 88
      src/views/education/dataReview/informationTemplate/index.vue
  6. 78 16
      src/views/resource/bankManagement/chapterVolumeManagement/add/index.vue
  7. 24 11
      src/views/resource/bankManagement/chapterVolumeManagement/edit/index.vue
  8. 100 21
      src/views/resource/bankManagement/knowledgeManagement/index.vue
  9. 74 22
      src/views/resource/bankManagement/testPaperManagement/addPaper/baseAddPaper/index.vue
  10. 22 11
      src/views/resource/bankManagement/testPaperManagement/addPaper/topicAddPaper/index.vue
  11. 21 11
      src/views/resource/bankManagement/testPaperManagement/editPaper/baseEditPaper/index.vue
  12. 22 12
      src/views/resource/bankManagement/testPaperManagement/editPaper/topicEditPaper/index.vue
  13. 38 16
      src/views/resource/bankManagement/topicManagement/index.vue
  14. 76 14
      src/views/resource/bankManagement/volumeManagement/add/index.vue
  15. 23 11
      src/views/resource/bankManagement/volumeManagement/edit/index.vue
  16. 59 2
      src/views/resource/handoutManagement/handoutList/add/index.vue
  17. 26 12
      src/views/resource/handoutManagement/handoutList/edit/index.vue
  18. 78 11
      src/views/resource/videoManagement/chapter/add/index.vue
  19. 20 10
      src/views/resource/videoManagement/chapter/edit/index.vue
  20. 30 19
      src/views/resource/videoManagement/courseManagement/basicInfoAdd/index.vue
  21. 18 8
      src/views/resource/videoManagement/courseManagement/basicInfoEdit/index.vue
  22. 34 15
      src/views/resource/videoManagement/courseManagement/chapterContent/index.vue
  23. 1159 0
      src/views/resource/videoManagement/festival/add/index copy.vue
  24. 91 62
      src/views/resource/videoManagement/festival/add/index.vue
  25. 21 10
      src/views/resource/videoManagement/festival/edit/index.vue
  26. 23 10
      src/views/resource/videoManagement/flow/index.vue
  27. 78 11
      src/views/resource/videoManagement/moduleManagement/add/index.vue
  28. 20 10
      src/views/resource/videoManagement/moduleManagement/edit/index.vue

+ 21 - 0
src/assets/styles/index.scss

@@ -197,3 +197,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;
+  }
+}

+ 73 - 6
src/components/busIns.vue

@@ -49,8 +49,11 @@
               :indeterminate="isIndeterminate"
               >全选</el-checkbox
             >
-            <el-checkbox-group v-model="sujectArray" class="checkboxSty" 
-              @change="handleCheckedCitiesChange">
+            <el-checkbox-group
+              v-model="sujectArray"
+              class="checkboxSty"
+              @change="handleCheckedCitiesChange"
+            >
               <el-checkbox
                 v-for="(item, index) in newSujectOption"
                 :label="item.newId"
@@ -63,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>
@@ -87,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>
@@ -133,6 +171,12 @@ export default {
     };
   },
   watch: {
+    sujectApis: {
+      immediate: true,
+      handler(newName, oldName) {
+        this.changeTypes();
+      },
+    },
     sujectApisTable: {
       handler(newVal, oldVal) {
         this.sujectApis = newVal;
@@ -142,16 +186,41 @@ 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;
@@ -296,7 +365,6 @@ export default {
         this.sujectApis.push(this.sujectArray[i]);
       }
       this.$refs.popovers[0].doClose();
-      this.changeTypes();
     },
     hideHandle() {},
     showHandle() {
@@ -321,14 +389,13 @@ export default {
     },
     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/tableList.vue

@@ -1568,7 +1568,7 @@ export default {
       },
       treeDatas: [],
       treeDatas1: [],
-      treeDatas2: [],
+      treeDatas2: []
     };
   },
   computed: {

+ 16 - 5
src/utils/methodsTool.js

@@ -313,7 +313,7 @@ export default {
 	},
 	/**
 	 * 
-	 * @param {Number} ids 
+	 * @param {Array} ids 
 	 * @returns 缓存业务层级
 	 */
 	cacheBusinessList(ids) {
@@ -324,15 +324,26 @@ export default {
 				this.storageRemove(business)
 				this.cacheBusinessList(ids)
 			} else {
-				if (!businessList.business.includes(ids)) {
-					businessList.business.push(ids)
-					this.storageSet('business', JSON.stringify(businessList))
+				if (businessList.business.length) {
+					let copyBusinList = JSON.parse(JSON.stringify(businessList.business))
+					for (let i = 0; i < ids.length; i++) {
+						let statusT = businessList.business.some(item => {
+							return item.businessId == ids[i].businessId && item.subjectId == ids[i].subjectId
+						})
+						if (!statusT) {
+							copyBusinList.push(ids[i])
+						}
+					}
+					businessList.business = copyBusinList
+				} else {
+					businessList.business = ids
 				}
+				this.storageSet('business', JSON.stringify(businessList))
 			}
 		} else {
 			let businessList = {
 				time: newTime,
-				business: [ids]
+				business: ids
 			}
 			this.storageSet('business', JSON.stringify(businessList))
 		}

+ 93 - 88
src/views/education/dataReview/informationTemplate/index.vue

@@ -49,97 +49,102 @@
           :rules="rules"
           ref="listData"
         >
-            <el-form-item v-for="(items, indexs) in listitem" :key="indexs" :label="items.label" :prop="items.prop">
-              <el-radio-group
-                v-if="items.scope === 'status'"
-                v-model="listData[items.prop]"
+          <el-form-item
+            v-for="(items, indexs) in listitem"
+            :key="indexs"
+            :label="items.label"
+            :prop="items.prop"
+          >
+            <el-radio-group
+              v-if="items.scope === 'status'"
+              v-model="listData[items.prop]"
+            >
+              <el-radio
+                v-for="(item, index) in items.options"
+                :key="index"
+                :label="item.value"
+                :disabled="statusPop === 2"
+                >{{ item.label }}</el-radio
               >
-                <el-radio
-                  v-for="(item, index) in items.options"
+            </el-radio-group>
+            <div v-else-if="items.scope === 'activeType'">
+              <div :class="changeHeight ? 'ach' : 'clh'">
+                <div
+                  v-for="(item, index) in zhType"
                   :key="index"
-                  :label="item.value"
-                  :disabled="statusPop === 2"
-                  >{{ item.label }}</el-radio
+                  class="listBoxStys"
                 >
-              </el-radio-group>
-              <div v-else-if="items.scope === 'activeType'">
-                <div :class="changeHeight ? 'ach' : 'clh'">
-                  <div
-                    v-for="(item, index) in zhType"
-                    :key="index"
-                    class="listBoxStys"
-                  >
-                    {{
-                      item.educationName +
-                      " - " +
-                      item.projectName +
-                      "-" +
-                      item.businessName
-                    }}
-                    <i
-                      class="el-icon-error closeIcons"
-                      @click="closeType(item.id)"
-                    ></i>
-                  </div>
+                  {{
+                    item.educationName +
+                    " - " +
+                    item.projectName +
+                    "-" +
+                    item.businessName
+                  }}
+                  <i
+                    class="el-icon-error closeIcons"
+                    @click="closeType(item.id)"
+                  ></i>
                 </div>
-                <el-button
-                  size="mini"
-                  v-if="zhType.length > 1"
-                  @click="changeType"
-                  >{{ changeHeight ? "展开" : "关闭" }}</el-button
-                >
               </div>
-              <div
-                v-else-if="items.scope === 'certificate'"
-                style="display: flex; align-items: center"
+              <el-button
+                size="mini"
+                v-if="zhType.length > 1"
+                @click="changeType"
+                >{{ changeHeight ? "展开" : "关闭" }}</el-button
               >
-                <el-select
-                  v-model="eduType"
-                  placeholder="请选择教育类型"
-                  @change="eduChange"
+            </div>
+            <div
+              v-else-if="items.scope === 'certificate'"
+              style="display: flex; align-items: center"
+            >
+              <el-select
+                v-model="eduType"
+                placeholder="请选择教育类型"
+                @change="eduChange"
+              >
+                <el-option
+                  v-for="item in itemOption1"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
                 >
-                  <el-option
-                    v-for="item in itemOption1"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value"
-                  >
-                  </el-option>
-                </el-select>
-                <el-popover
-                  placement="bottom"
-                  trigger="click"
-                  :disabled="eduType ? false : true"
-                  ><el-checkbox
-                    v-model="checkAll"
-                    @change="handleCheckAllChange"
-                    :indeterminate="isIndeterminate"
-                    >全选</el-checkbox
-                  >
-                  <el-checkbox-group
-                    v-model="cauType"
-                    class="checkboxSty"
-                    @change="handleCheckedCitiesChange"
-                  >
-                    <el-checkbox
-                      v-for="(item, index) in itemOption2"
-                      :label="item.id"
-                      :key="index"
-                      >{{
-                        item.projectName + "-" + item.businessName
-                      }}</el-checkbox
-                    >
-                  </el-checkbox-group>
-                  <el-button
-                    slot="reference"
-                    style="margin-left: 12px"
-                    @click="getMessage"
-                    >请选择业务层次</el-button
+                </el-option>
+              </el-select>
+              <el-popover
+                placement="bottom"
+                trigger="click"
+                :disabled="eduType ? false : true"
+                ><el-checkbox
+                  v-model="checkAll"
+                  @change="handleCheckAllChange"
+                  :indeterminate="isIndeterminate"
+                  >全选</el-checkbox
+                >
+                <el-checkbox-group
+                  v-model="cauType"
+                  class="checkboxSty"
+                  @change="handleCheckedCitiesChange"
+                >
+                  <el-checkbox
+                    v-for="(item, index) in itemOption2"
+                    :label="item.id"
+                    :key="index"
+                    >{{
+                      item.projectName + "-" + item.businessName
+                    }}</el-checkbox
                   >
-                </el-popover>
-                <span style="margin-left: 10px">注:可多选</span>
-              </div>
-              <!-- <div v-else-if="items.scope === 'select'">
+                </el-checkbox-group>
+                <el-button
+                  slot="reference"
+                  style="margin-left: 12px"
+                  @click="getMessage"
+                  >请选择业务层次</el-button
+                >
+              </el-popover>
+              <span style="margin-left: 10px">注:可多选</span>
+            </div>
+            <!-- <div v-else-if="items.scope === 'select'">
                 <el-select
                   v-model="listData[items.prop]"
                   multiple
@@ -155,11 +160,11 @@
                 </el-select>
                 <span style="margin-left: 10px">注:可多选</span>
               </div> -->
-              <div v-else>
-                <el-input v-model="listData[items.prop]"></el-input>
-                <div v-if="items.ch">{{ items.ch }}</div>
-              </div>
-            </el-form-item>
+            <div v-else>
+              <el-input v-model="listData[items.prop]"></el-input>
+              <div v-if="items.ch">{{ items.ch }}</div>
+            </div>
+          </el-form-item>
         </el-form>
         <p class="p_infos">
           模板字段组合<el-button

+ 78 - 16
src/views/resource/bankManagement/chapterVolumeManagement/add/index.vue

@@ -53,7 +53,7 @@
             </el-radio-group>
             <div style="display: block; text-align: center; margin-top: 10px">
               <el-button size="mini" type="primary" @click="submitSujectArray"
-                >确定</el-button
+                >关闭</el-button
               >
             </div>
             <el-button
@@ -85,6 +85,33 @@
               <i class="el-icon-error closeIcons" @click="closeType"></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-form-item>
         <el-form-item label="标题前缀" prop="prefixName">
           <el-input v-model="listData.prefixName"></el-input>
@@ -180,7 +207,10 @@
         </el-form-item>
         <el-form-item>
           <el-button @click="backPage">取消</el-button>
-          <el-button type="primary" @click="submitIns('listData')"
+          <el-button
+            type="primary"
+            @click="submitIns('listData')"
+            :loading="disabledBtn"
             >确定</el-button
           >
         </el-form-item>
@@ -294,6 +324,7 @@ export default {
   components: { searchBoxNew, tableList, pagination },
   data() {
     return {
+      disabledBtn: false,
       listData: {
         publishStatus: 1,
       }, //   弹窗数据
@@ -326,8 +357,8 @@ export default {
         {
           label: "发布状态",
           prop: "publishStatus",
-          scope: "Status", 
-          width: "120" 
+          scope: "Status",
+          width: "120",
         },
       ],
       tableData: [],
@@ -360,18 +391,42 @@ export default {
       ],
       disCheckList: [], //已选转禁用复选列表
       activeLists: [],
+      localData: [],
     };
   },
   watch: {
+    sujectApis: {
+      immediate: true,
+      handler(newName, oldName) {
+        this.changeTypes();
+      },
+    },
     newSujectApis() {
       this.tableData = [];
     },
   },
   mounted() {
+    this.localData = this.$methodsTools.getBusinessList();
     this.getDict();
     // this.search();
   },
   methods: {
+    unTime(val) {
+      let a = `${val.businessId}-${val.subjectId}`;
+      if (this.sujectApis == a) {
+        this.sujectApis = "";
+      } else {
+        this.sujectApis = a;
+      }
+    },
+    changeSty(val) {
+      var arr = "";
+      let arr1 = this.sujectApis.split("-").map(Number);
+      if (val.businessId == arr1[0] && val.subjectId == arr1[1]) {
+        arr = "activeStyIcons";
+      }
+      return arr;
+    },
     getMessage() {
       if (!this.courType) {
         this.$message.warning("请先选择业务层级");
@@ -477,7 +532,6 @@ export default {
       });
     },
     submitSujectArray() {
-      this.changeTypes();
       this.$refs.popovers.doClose();
     },
     showHandle() {
@@ -576,6 +630,7 @@ export default {
       });
     },
     async rulesTableSumbit() {
+      this.disabledBtn = true;
       var examList = [];
       this.tableData.map((item) => {
         examList.push({ examId: item.examId, sort: Number(item.sort) });
@@ -590,16 +645,24 @@ export default {
         year: this.listData.year,
         status: 1,
       };
-      this.$api.addbankchapter(data1).then((res) => {
-        this.$message.success("新增成功");
-        setTimeout(() => {
-          this.$store.dispatch("tagsView/exitView", this.$route).then((res) => {
-            this.$router.push({
-              path: "chapterVolumeManagement",
-            });
-          });
-        }, 500);
-      });
+      this.$api
+        .addbankchapter(data1)
+        .then((res) => {
+          this.$methodsTools.cacheBusinessList([this.newSujectApis]);
+          this.$message.success("新增成功");
+          setTimeout(() => {
+            this.$store
+              .dispatch("tagsView/exitView", this.$route)
+              .then((res) => {
+                this.$router.push({
+                  path: "chapterVolumeManagement",
+                });
+              });
+          }, 500);
+        })
+        .catch(() => {
+          this.disabledBtn = false;
+        });
     },
     backPage() {
       this.$store.dispatch("tagsView/delView", this.$route).then((res) => {
@@ -610,7 +673,6 @@ export default {
     },
     closeType() {
       this.sujectApis = "";
-      this.changeTypes();
     },
     handleSizeChange(v) {
       this.formData.pageSize = v;

+ 24 - 11
src/views/resource/bankManagement/chapterVolumeManagement/edit/index.vue

@@ -64,6 +64,7 @@
               >
             </div>
             <el-button
+              disabled
               slot="reference"
               style="margin-left: 12px"
               @click="getMessage"
@@ -191,7 +192,10 @@
         </el-form-item>
         <el-form-item>
           <el-button @click="backPage">取消</el-button>
-          <el-button type="primary" @click="submitIns('listData')"
+          <el-button
+            type="primary"
+            @click="submitIns('listData')"
+            :loading="disabledBtn"
             >确定</el-button
           >
         </el-form-item>
@@ -305,6 +309,7 @@ export default {
   components: { searchBoxNew, tableList, pagination },
   data() {
     return {
+      disabledBtn: false,
       listData: {
         publishStatus: 1,
       }, //   弹窗数据
@@ -595,6 +600,7 @@ export default {
       });
     },
     async rulesTableSumbit() {
+      this.disabledBtn = true;
       var examList = [];
       this.tableData.map((item) => {
         examList.push({ examId: item.examId, sort: Number(item.sort) });
@@ -609,16 +615,23 @@ export default {
         year: this.listData.year,
         status: 1,
       };
-      this.$api.editbankchapter(data1).then((res) => {
-        this.$message.success("修改成功");
-        setTimeout(() => {
-          this.$store.dispatch("tagsView/exitView", this.$route).then((res) => {
-            this.$router.push({
-              path: "chapterVolumeManagement",
-            });
-          });
-        }, 500);
-      });
+      this.$api
+        .editbankchapter(data1)
+        .then((res) => {
+          this.$message.success("修改成功");
+          setTimeout(() => {
+            this.$store
+              .dispatch("tagsView/exitView", this.$route)
+              .then((res) => {
+                this.$router.push({
+                  path: "chapterVolumeManagement",
+                });
+              });
+          }, 500);
+        })
+        .catch(() => {
+          this.disabledBtn = false;
+        });
     },
     backPage() {
       this.$store.dispatch("tagsView/delView", this.$route).then((res) => {

+ 100 - 21
src/views/resource/bankManagement/knowledgeManagement/index.vue

@@ -30,6 +30,7 @@
       @handleCurrentChange="handleCurrentChange"
     />
     <el-dialog
+      @closed="loadingClose"
       :visible.sync="dialogVisible"
       width="790px"
       :show-close="false"
@@ -92,14 +93,17 @@
                 @hide="hideHandle"
                 :disabled="courType ? false : true"
               >
-            <el-checkbox
-              v-model="checkAll"
-              @change="handleCheckAllChange"
-              :indeterminate="isIndeterminate"
-              >全选</el-checkbox
-            >
-                <el-checkbox-group v-model="sujectArray" class="checkboxSty" 
-              @change="handleCheckedCitiesChange">
+                <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"
@@ -148,11 +152,43 @@
                   ></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 && statusPop === 1"
+                  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>
@@ -188,7 +224,9 @@
       </div>
       <span slot="footer" class="dialog-footer">
         <el-button @click="close">取 消</el-button>
-        <el-button type="primary" @click="submit">确 定</el-button>
+        <el-button type="primary" @click="submit" :loading="disabledBtn"
+          >确 定</el-button
+        >
       </span>
     </el-dialog>
   </div>
@@ -203,6 +241,7 @@ export default {
   components: { searchBoxNew, tableList, pagination },
   data() {
     return {
+      disabledBtn: false,
       isIndeterminate: false,
       checkAll: false,
       loading: false, //当前表单加载是否加载动画
@@ -211,7 +250,7 @@ export default {
         index: 0,
         ch: "条",
         num: false,
-        border:true,
+        border: true,
         choice: true,
         addHide: false,
         backFatherBtn: {
@@ -254,7 +293,7 @@ export default {
           label: "知识点编码",
           prop: "encoder",
           hidden: true,
-          width:"140px"
+          width: "140px",
         },
         {
           label: "知识点标题",
@@ -304,6 +343,7 @@ export default {
       ],
       statusPop: 1,
       dialogVisible: false,
+      localData: [],
     };
   },
   watch: {
@@ -315,14 +355,37 @@ export default {
     },
   },
   mounted() {
+    this.localData = this.$methodsTools.getBusinessList();
     this.getDict();
     this.search();
   },
   activated() {
+    this.localData = this.$methodsTools.getBusinessList();
     this.getDict();
     this.search();
   },
   methods: {
+    loadingClose() {
+      this.disabledBtn = false;
+    },
+    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;
@@ -509,13 +572,16 @@ export default {
       this.$refs.popovers[0].doClose();
     },
     submit() {
+      this.disabledBtn = true;
       if (!this.newSujectApis.length) {
         this.$message.warning("请添加业务层级");
+        this.disabledBtn = false;
         return;
       }
       if (this.statusPop === 1) {
         if (!this.BusNameList.length) {
           this.$message.warning("请添加知识点");
+          this.disabledBtn = false;
           return;
         }
         var dataInfos = {
@@ -523,14 +589,22 @@ export default {
           examKnowledgeBusinessAddBoList: this.newSujectApis,
           knowledgeName: this.BusNameList,
         };
-        this.$api.addKnowledgeExam(dataInfos).then((res) => {
-          this.$message.success("添加成功");
-          this.dialogVisible = false;
-          this.search();
-        });
+        this.$api
+          .addKnowledgeExam(dataInfos)
+          .then((res) => {
+            this.$methodsTools.cacheBusinessList(this.newSujectApis);
+            this.$message.success("添加成功");
+            this.dialogVisible = false;
+            this.search();
+            this.localData = this.$methodsTools.getBusinessList();
+          })
+          .catch(() => {
+            this.disabledBtn = false;
+          });
       } else {
         if (!this.listData.knowledgeName) {
           this.$message.warning("请输入知识点名称");
+          this.disabledBtn = false;
           return;
         }
         var dataInfos = {
@@ -539,11 +613,16 @@ export default {
           knowledgeId: this.listData.knowledgeId,
           examKnowledgeBusinessAddBoList: this.newSujectApis,
         };
-        this.$api.editKnowledgeExam(dataInfos).then((res) => {
-          this.$message.success("修改成功");
-          this.dialogVisible = false;
-          this.search();
-        });
+        this.$api
+          .editKnowledgeExam(dataInfos)
+          .then((res) => {
+            this.$message.success("修改成功");
+            this.dialogVisible = false;
+            this.search();
+          })
+          .catch(() => {
+            this.disabledBtn = false;
+          });
       }
     },
     del(v) {

+ 74 - 22
src/views/resource/bankManagement/testPaperManagement/addPaper/baseAddPaper/index.vue

@@ -57,7 +57,7 @@
             </el-radio-group>
             <div style="display: block; text-align: center; margin-top: 10px">
               <el-button size="mini" type="primary" @click="submitSujectArray"
-                >确定</el-button
+                >关闭</el-button
               >
             </div>
             <el-button
@@ -89,6 +89,33 @@
               <i class="el-icon-error closeIcons" @click="closeType"></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-form-item>
         <el-form-item label="试卷类型" prop="examPaperId">
           <el-select
@@ -157,7 +184,10 @@
         </el-form-item>
         <el-form-item>
           <el-button @click="backPage">取消</el-button>
-          <el-button type="primary" @click="submitIns('listDataIns')"
+          <el-button
+            type="primary"
+            @click="submitIns('listDataIns')"
+            :loading="disabledBtn"
             >下一步</el-button
           >
         </el-form-item>
@@ -801,6 +831,7 @@ export default {
   name: "AddPaper",
   data() {
     return {
+      disabledBtn: false,
       activeName: "first",
       data1: {},
       page: 1,
@@ -1042,6 +1073,7 @@ export default {
       djTime: 0, //答卷时长
       djNumType: 0, //0无限1有限
       djNum: 0, //答卷次数
+      localData: [],
     };
   },
   computed: {
@@ -1055,18 +1087,17 @@ export default {
     },
   },
   mounted() {
-    console.log(this.cityList);
+    this.localData = this.$methodsTools.getBusinessList();
     this.getDict();
     this.getFns();
   },
   watch: {
-    // "listDataIns.provinceId": {
-    //   handler(newVal, oldVal) {
-    //     this.changeCity(newVal);
-    //   },
-    //   // 立即处理 进入页面就触发
-    //   immediate: true,
-    // },
+    sujectApis: {
+      immediate: true,
+      handler(newName, oldName) {
+        this.changeTypes();
+      },
+    },
     djTime: {
       handler(newVal, oldVal) {
         if (newVal === 0) {
@@ -1098,6 +1129,22 @@ export default {
     },
   },
   methods: {
+    unTime(val) {
+      let a = `${val.businessId}-${val.subjectId}`;
+      if (this.sujectApis == a) {
+        this.sujectApis = "";
+      } else {
+        this.sujectApis = a;
+      }
+    },
+    changeSty(val) {
+      var arr = "";
+      let arr1 = this.sujectApis.split("-").map(Number);
+      if (val.businessId == arr1[0] && val.subjectId == arr1[1]) {
+        arr = "activeStyIcons";
+      }
+      return arr;
+    },
     getMessage() {
       if (!this.courType) {
         this.$message.warning("请先选择业务层级");
@@ -1150,7 +1197,6 @@ export default {
       });
     },
     submitSujectArray() {
-      this.changeTypes();
       this.$refs.popovers.doClose();
     },
     showHandle() {
@@ -1235,6 +1281,7 @@ export default {
       });
     },
     async rulesTableSumbit() {
+      this.disabledBtn = true;
       var data1 = {
         examPaperId: this.listDataIns.examPaperId,
         examName: this.listDataIns.examName,
@@ -1246,18 +1293,24 @@ export default {
         year: this.listDataIns.year,
         status: 1,
       };
-      this.$api.addbankexam(data1).then((res) => {
-        this.$message.success("新增成功");
-        this.$store.dispatch("tagsView/exitView", this.$route).then(() => {
-          this.$router.push({
-            path: "topicAddPaper",
-            query: {
-              id: res.data.examId,
-              code: res.data.code,
-            },
+      this.$api
+        .addbankexam(data1)
+        .then((res) => {
+          this.$methodsTools.cacheBusinessList([this.newSujectApis]);
+          this.$message.success("新增成功");
+          this.$store.dispatch("tagsView/exitView", this.$route).then(() => {
+            this.$router.push({
+              path: "topicAddPaper",
+              query: {
+                id: res.data.examId,
+                code: res.data.code,
+              },
+            });
           });
+        })
+        .catch(() => {
+          this.disabledBtn = false;
         });
-      });
     },
     backPage() {
       this.$store.dispatch("tagsView/delView", this.$route).then((res) => {
@@ -1268,7 +1321,6 @@ export default {
     },
     closeType() {
       this.sujectApis = "";
-      this.changeTypes();
     },
     // --------------------------分割线---------------------------
     editInfo(v) {

+ 22 - 11
src/views/resource/bankManagement/testPaperManagement/addPaper/topicAddPaper/index.vue

@@ -29,7 +29,11 @@
       </table-list>
       <div class="centerStys">
         <el-button size="small" @click="backPage">取消</el-button>
-        <el-button size="small" type="primary" @click="submitTableAllInfos"
+        <el-button
+          size="small"
+          type="primary"
+          @click="submitTableAllInfos"
+          :loading="disabledBtn"
           >确定</el-button
         >
       </div>
@@ -659,6 +663,7 @@ export default {
   components: { searchBoxNew, pagination, tableList, busIns, questionBank },
   data() {
     return {
+      disabledBtn: false,
       showHide: false,
       activeName: "second",
       formList: [
@@ -1572,6 +1577,7 @@ export default {
           partScore: self.tableData[i].partScore,
         });
       }
+      this.disabledBtn = true;
       var data = {
         examId: this.$route.query.id,
         questionList: arrs,
@@ -1589,17 +1595,22 @@ export default {
       } else {
         data.answerNum = this.djNum;
       }
-      this.$api.editbankexam(data).then((res) => {
-        this.$message.success("编辑成功");
-        setTimeout(async () => {
-          await this.removeInfo();
-          this.$store.dispatch("tagsView/exitView", this.$route).then(() => {
-            this.$router.push({
-              path: "testPaperManagement",
+      this.$api
+        .editbankexam(data)
+        .then((res) => {
+          this.$message.success("编辑成功");
+          setTimeout(async () => {
+            await this.removeInfo();
+            this.$store.dispatch("tagsView/exitView", this.$route).then(() => {
+              this.$router.push({
+                path: "testPaperManagement",
+              });
             });
-          });
-        }, 500);
-      });
+          }, 500);
+        })
+        .catch(() => {
+          this.disabledBtn = false;
+        });
     },
     removeInfo() {
       return new Promise((resolve, reject) => {

+ 21 - 11
src/views/resource/bankManagement/testPaperManagement/editPaper/baseEditPaper/index.vue

@@ -64,7 +64,7 @@
               >
             </div>
             <el-button
-            disabled
+              disabled
               slot="reference"
               style="margin-left: 12px"
               @click="getMessage"
@@ -169,6 +169,7 @@
             type="primary"
             @click="submitIns('listDataIns')"
             :disabled="!noStudent"
+            :loading="disabledBtn"
             >确定</el-button
           >
         </el-form-item>
@@ -184,6 +185,7 @@ export default {
   components: { tableList },
   data() {
     return {
+      disabledBtn: false,
       listDataIns: {
         publishStatus: 1,
         year: "",
@@ -409,6 +411,7 @@ export default {
       });
     },
     async rulesTableSumbit() {
+      this.disabledBtn = true;
       var data1 = {
         examId: this.listDataIns.examId,
         examPaperId: this.listDataIns.examPaperId,
@@ -420,16 +423,23 @@ export default {
         cityId: this.listDataIns.cityId,
         year: this.listDataIns.year,
       };
-      this.$api.editbankexam(data1).then((res) => {
-        this.$message.success("修改成功");
-        setTimeout(() => {
-          this.$store.dispatch("tagsView/exitView", this.$route).then((res) => {
-            this.$router.push({
-              path: "testPaperManagement",
-            });
-          });
-        }, 500);
-      });
+      this.$api
+        .editbankexam(data1)
+        .then((res) => {
+          this.$message.success("修改成功");
+          setTimeout(() => {
+            this.$store
+              .dispatch("tagsView/exitView", this.$route)
+              .then((res) => {
+                this.$router.push({
+                  path: "testPaperManagement",
+                });
+              });
+          }, 500);
+        })
+        .catch(() => {
+          this.disabledBtn = false;
+        });
     },
     backPage() {
       this.$store.dispatch("tagsView/delView", this.$route).then((res) => {

+ 22 - 12
src/views/resource/bankManagement/testPaperManagement/editPaper/topicEditPaper/index.vue

@@ -30,6 +30,7 @@
           type="primary"
           @click="submitTableAllInfos"
           :disabled="!noStudent"
+          :loading="disabledBtn"
           >确定</el-button
         >
         <el-button
@@ -665,6 +666,7 @@ export default {
   components: { searchBoxNew, pagination, tableList, busIns, questionBank },
   data() {
     return {
+      disabledBtn: false,
       showHide: false,
       formList: [
         // {
@@ -1630,6 +1632,7 @@ export default {
           partScore: self.tableData[i].partScore,
         });
       }
+      this.disabledBtn = true;
       var data = {
         examId: this.$route.query.id,
         questionList: arrs,
@@ -1647,18 +1650,25 @@ export default {
       } else {
         data.answerNum = this.djNum;
       }
-      this.$api.editbankexam(data).then((res) => {
-        this.localStart = false;
-        this.$message.success("修改成功");
-        setTimeout(async () => {
-          await this.removeInfo();
-          this.$store.dispatch("tagsView/exitView", this.$route).then((res) => {
-            this.$router.push({
-              path: "testPaperManagement",
-            });
-          });
-        }, 500);
-      });
+      this.$api
+        .editbankexam(data)
+        .then((res) => {
+          this.localStart = false;
+          this.$message.success("修改成功");
+          setTimeout(async () => {
+            await this.removeInfo();
+            this.$store
+              .dispatch("tagsView/exitView", this.$route)
+              .then((res) => {
+                this.$router.push({
+                  path: "testPaperManagement",
+                });
+              });
+          }, 500);
+        })
+        .catch(() => {
+          this.disabledBtn = false;
+        });
     },
     removeInfo() {
       return new Promise((resolve, reject) => {

+ 38 - 16
src/views/resource/bankManagement/topicManagement/index.vue

@@ -47,6 +47,7 @@
     />
     <!-- ------------------- -->
     <el-dialog
+      @closed="loadingClose"
       width="1080px"
       :visible.sync="innerVisiblePaperTopic"
       append-to-body
@@ -145,12 +146,14 @@
         <el-button @click="closeBefore">关 闭</el-button>
         <el-button
           @click="submitForm('listData')"
+          :loading="disabledBtn"
           v-if="statusPop === 1 || statusPop === 0"
           >完成</el-button
         >
         <el-button
           type="primary"
           v-if="statusPop === 1"
+          :loading="disabledBtn"
           @click="submitForm('listData', 1)"
           >完成,并继续添加</el-button
         >
@@ -217,6 +220,7 @@ export default {
   name: "TopicManagement",
   data() {
     return {
+      disabledBtn: false,
       statusHide: false,
       loading: false, //当前表单加载是否加载动画
       navText: {
@@ -404,6 +408,9 @@ export default {
     this.search();
   },
   methods: {
+    loadingClose() {
+      this.disabledBtn = false;
+    },
     dowmModel() {
       let url = baseUrls.BASE_IMG_URL + "/oss/images/file/20220105.xlsx";
       let link = document.createElement("a");
@@ -509,6 +516,7 @@ export default {
         });
     },
     addClick(v, int) {
+      this.disabledBtn = false;
       var self = this;
       self.listNums = [];
       if (v === undefined) {
@@ -807,6 +815,7 @@ export default {
               }
             }
           }
+          this.disabledBtn = true;
           var numList = [];
           this.activeExam.map((item) => {
             numList.push(item.knowledgeId);
@@ -831,25 +840,38 @@ export default {
           }
           if (this.statusPop === 1) {
             data.status = 1;
-            this.$api.addbankquestion(data).then((res) => {
-              self.$message.success("添加成功");
-              self.innerVisiblePaperTopic = false;
-              self.statusHide = true;
-
-              self.search();
-              if (int === 1) {
-                self.addClick();
-              }
-            });
+            this.$api
+              .addbankquestion(data)
+              .then((res) => {
+                self.$methodsTools.cacheBusinessList(
+                  self.$refs.sujects.newSujectApis
+                );
+                self.$refs.sujects.UPDates();
+                self.$message.success("添加成功");
+                self.innerVisiblePaperTopic = false;
+                self.statusHide = true;
+                self.search();
+                if (int === 1) {
+                  self.addClick();
+                }
+              })
+              .catch(() => {
+                this.disabledBtn = false;
+              });
           }
           if (this.statusPop === 0) {
             data.questionId = self.questionId;
-            this.$api.editbankquestion(data).then((res) => {
-              self.$message.success("修改成功");
-              self.innerVisiblePaperTopic = false;
-              self.statusHide = true;
-              self.search();
-            });
+            this.$api
+              .editbankquestion(data)
+              .then((res) => {
+                self.$message.success("修改成功");
+                self.innerVisiblePaperTopic = false;
+                self.statusHide = true;
+                self.search();
+              })
+              .catch(() => {
+                this.disabledBtn = false;
+              });
           }
         } else {
           console.log("error submit!!");

+ 76 - 14
src/views/resource/bankManagement/volumeManagement/add/index.vue

@@ -53,7 +53,7 @@
             </el-radio-group>
             <div style="display: block; text-align: center; margin-top: 10px">
               <el-button size="mini" type="primary" @click="submitSujectArray"
-                >确定</el-button
+                >关闭</el-button
               >
             </div>
             <el-button
@@ -85,6 +85,33 @@
               <i class="el-icon-error closeIcons" @click="closeType"></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-form-item>
         <el-form-item label="标题前缀" prop="prefixName">
           <el-input v-model="listData.prefixName"></el-input>
@@ -180,7 +207,10 @@
         </el-form-item>
         <el-form-item>
           <el-button @click="backPage">取消</el-button>
-          <el-button type="primary" @click="submitIns('listData')"
+          <el-button
+            type="primary"
+            @click="submitIns('listData')"
+            :loading="disabledBtn"
             >确定</el-button
           >
         </el-form-item>
@@ -294,6 +324,7 @@ export default {
   name: "VolumeManagementAdd",
   data() {
     return {
+      disabledBtn: false,
       listData: {
         publishStatus: 1,
       }, //   弹窗数据
@@ -350,17 +381,41 @@ export default {
       },
       disCheckList: [], //已选转禁用复选列表
       activeLists: [],
+      localData: [],
     };
   },
   watch: {
+    sujectApis: {
+      immediate: true,
+      handler(newName, oldName) {
+        this.changeTypes();
+      },
+    },
     newSujectApis() {
       this.tableData = [];
     },
   },
   mounted() {
+    this.localData = this.$methodsTools.getBusinessList();
     this.getDict();
   },
   methods: {
+    unTime(val) {
+      let a = `${val.businessId}-${val.subjectId}`;
+      if (this.sujectApis == a) {
+        this.sujectApis = "";
+      } else {
+        this.sujectApis = a;
+      }
+    },
+    changeSty(val) {
+      var arr = "";
+      let arr1 = this.sujectApis.split("-").map(Number);
+      if (val.businessId == arr1[0] && val.subjectId == arr1[1]) {
+        arr = "activeStyIcons";
+      }
+      return arr;
+    },
     openBoxs() {
       if (!this.newSujectApis.subjectId) {
         this.$message.warning("请先选择科目");
@@ -443,7 +498,6 @@ export default {
       }
     },
     submitSujectArray() {
-      this.changeTypes();
       this.$refs.popovers.doClose();
     },
     showHandle() {
@@ -542,6 +596,7 @@ export default {
       });
     },
     async rulesTableSumbit() {
+      this.disabledBtn = true;
       var chapterList = [];
       this.tableData.map((item) => {
         chapterList.push({
@@ -558,16 +613,24 @@ export default {
         businessList: [this.newSujectApis],
         status: 1,
       };
-      this.$api.addBankModule(data1).then((res) => {
-        this.$message.success("新增成功");
-        setTimeout(() => {
-          this.$store.dispatch("tagsView/exitView", this.$route).then((res) => {
-            this.$router.push({
-              path: "volumeManagement",
-            });
-          });
-        }, 500);
-      });
+      this.$api
+        .addBankModule(data1)
+        .then((res) => {
+          this.$methodsTools.cacheBusinessList([this.newSujectApis]);
+          this.$message.success("新增成功");
+          setTimeout(() => {
+            this.$store
+              .dispatch("tagsView/exitView", this.$route)
+              .then((res) => {
+                this.$router.push({
+                  path: "volumeManagement",
+                });
+              });
+          }, 500);
+        })
+        .catch(() => {
+          this.disabledBtn = false;
+        });
     },
     backPage() {
       this.$store.dispatch("tagsView/delView", this.$route).then((res) => {
@@ -578,7 +641,6 @@ export default {
     },
     closeType() {
       this.sujectApis = "";
-      this.changeTypes();
     },
     handleSizeChange(v) {
       this.formData.pageSize = v;

+ 23 - 11
src/views/resource/bankManagement/volumeManagement/edit/index.vue

@@ -191,7 +191,10 @@
         </el-form-item>
         <el-form-item>
           <el-button @click="backPage">取消</el-button>
-          <el-button type="primary" @click="submitIns('listData')"
+          <el-button
+            type="primary"
+            @click="submitIns('listData')"
+            :loading="disabledBtn"
             >确定</el-button
           >
         </el-form-item>
@@ -305,6 +308,7 @@ export default {
   components: { searchBoxNew, tableList, pagination },
   data() {
     return {
+      disabledBtn: false,
       listData: {
         publishStatus: 1,
       }, //   弹窗数据
@@ -578,6 +582,7 @@ export default {
       });
     },
     async rulesTableSumbit() {
+      this.disabledBtn = true;
       var chapterList = [];
       this.tableData.map((item) => {
         chapterList.push({
@@ -594,16 +599,23 @@ export default {
         businessList: [this.newSujectApis],
         status: 1,
       };
-      this.$api.editBankModule(data1).then((res) => {
-        this.$message.success("修改成功");
-        setTimeout(() => {
-          this.$store.dispatch("tagsView/exitView", this.$route).then((res) => {
-            this.$router.push({
-              path: "volumeManagement",
-            });
-          });
-        }, 500);
-      });
+      this.$api
+        .editBankModule(data1)
+        .then((res) => {
+          this.$message.success("修改成功");
+          setTimeout(() => {
+            this.$store
+              .dispatch("tagsView/exitView", this.$route)
+              .then((res) => {
+                this.$router.push({
+                  path: "volumeManagement",
+                });
+              });
+          }, 500);
+        })
+        .catch(() => {
+          this.disabledBtn = false;
+        });
     },
     backPage() {
       this.$store.dispatch("tagsView/delView", this.$route).then((res) => {

+ 59 - 2
src/views/resource/handoutManagement/handoutList/add/index.vue

@@ -91,11 +91,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> -->
         </el-form-item>
@@ -147,7 +179,7 @@
         </el-form-item>
         <el-form-item>
           <el-button @click="backPage">取消</el-button>
-          <el-button type="primary" @click="submit('listData')">确定</el-button>
+          <el-button type="primary" @click="submit('listData')" :loading="disabledBtn">确定</el-button>
         </el-form-item>
       </el-form>
     </div>
@@ -159,6 +191,7 @@ export default {
   name: "HandoutListAdd",
   data() {
     return {
+      disabledBtn: false,
       isIndeterminate: false,
       checkAll: false,
       blob: "", //pdf本地路径
@@ -180,6 +213,7 @@ export default {
       sujectApis: [], //当前存在的科目
       newSujectApis: [],
       sujectArray: [], //选中的科目
+      localData: [],
       //表单验证
       rules: {
         handoutsName: [
@@ -212,9 +246,28 @@ export default {
     },
   },
   mounted() {
+    this.localData = this.$methodsTools.getBusinessList();
     this.getDict();
   },
   methods: {
+    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;
@@ -399,7 +452,9 @@ export default {
         dataInfos.handoutsUrl = urls;
         dataInfos.urlName = this.listData.urlName;
       }
+      this.disabledBtn = true
       this.$api.addCourseHandouts(dataInfos).then((res) => {
+        this.$methodsTools.cacheBusinessList(this.newSujectApis);
         this.$message.success("新增成功");
         setTimeout(() => {
           this.$store.dispatch("tagsView/exitView", this.$route).then((res) => {
@@ -408,7 +463,9 @@ export default {
             });
           });
         }, 500);
-      });
+      }).catch(()=>{
+          this.disabledBtn = false
+        })
     },
     backPage() {
       this.$store.dispatch("tagsView/delView", this.$route).then((res) => {

+ 26 - 12
src/views/resource/handoutManagement/handoutList/edit/index.vue

@@ -150,7 +150,12 @@
         </el-form-item>
         <el-form-item>
           <el-button @click="backPage">取消</el-button>
-          <el-button type="primary" @click="submit('listData')">确定</el-button>
+          <el-button
+            type="primary"
+            @click="submit('listData')"
+            :loading="disabledBtn"
+            >确定</el-button
+          >
         </el-form-item>
       </el-form>
     </div>
@@ -162,6 +167,7 @@ export default {
   name: "HandoutListEdit",
   data() {
     return {
+      disabledBtn: false,
       isIndeterminate: false,
       checkAll: false,
       blob: "", //pdf本地路径
@@ -451,18 +457,26 @@ export default {
         }
       } else {
         dataInfos.handoutsUrl = this.bfImg;
-        dataInfos.urlName = this.listData.urlName
+        dataInfos.urlName = this.listData.urlName;
       }
-      this.$api.editCourseHandouts(dataInfos).then((res) => {
-        this.$message.success("修改成功");
-        setTimeout(() => {
-          this.$store.dispatch("tagsView/exitView", this.$route).then((res) => {
-            this.$router.push({
-              path: "handoutList",
-            });
-          });
-        }, 500);
-      });
+      this.disabledBtn = true;
+      this.$api
+        .editCourseHandouts(dataInfos)
+        .then((res) => {
+          this.$message.success("修改成功");
+          setTimeout(() => {
+            this.$store
+              .dispatch("tagsView/exitView", this.$route)
+              .then((res) => {
+                this.$router.push({
+                  path: "handoutList",
+                });
+              });
+          }, 500);
+        })
+        .catch(() => {
+          this.disabledBtn = false;
+        });
     },
     backPage() {
       this.$store.dispatch("tagsView/delView", this.$route).then((res) => {

+ 78 - 11
src/views/resource/videoManagement/chapter/add/index.vue

@@ -94,11 +94,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> -->
         </el-form-item>
@@ -251,7 +283,12 @@
         </el-form-item>
         <el-form-item>
           <el-button @click="backPage">取消</el-button>
-          <el-button type="primary" @click="submit('listData')">确定</el-button>
+          <el-button
+            :loading="disabledBtn"
+            type="primary"
+            @click="submit('listData')"
+            >确定</el-button
+          >
         </el-form-item>
       </el-form>
     </div>
@@ -362,6 +399,7 @@ export default {
   name: "ChapterAdd",
   data() {
     return {
+      disabledBtn: false,
       isIndeterminate: false,
       checkAll: false,
       //   弹窗数据
@@ -466,6 +504,7 @@ export default {
       },
       disCheckList: [], //已选转禁用复选列表
       activeLists: [],
+      localData: [],
     };
   },
   watch: {
@@ -477,10 +516,29 @@ export default {
     },
   },
   mounted() {
+    this.localData = this.$methodsTools.getBusinessList();
     this.getDict();
     // this.search();
   },
   methods: {
+    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;
@@ -744,6 +802,7 @@ export default {
       });
     },
     async rulesTableSumbit() {
+      this.disabledBtn = true;
       var sectionIdList = [];
       this.tableData.map((item) => {
         sectionIdList.push({
@@ -760,16 +819,24 @@ export default {
         prefixName: this.listData.prefixName,
         publishStatus: this.listData.publishStatus,
       };
-      this.$api.addCoursechapter(dataInfos).then((res) => {
-        this.$message.success("新增成功");
-        setTimeout(() => {
-          this.$store.dispatch("tagsView/exitView", this.$route).then((res) => {
-            this.$router.push({
-              path: "chapter",
-            });
-          });
-        }, 500);
-      });
+      this.$api
+        .addCoursechapter(dataInfos)
+        .then((res) => {
+          this.$methodsTools.cacheBusinessList(this.newSujectApis);
+          this.$message.success("新增成功");
+          setTimeout(() => {
+            this.$store
+              .dispatch("tagsView/exitView", this.$route)
+              .then((res) => {
+                this.$router.push({
+                  path: "chapter",
+                });
+              });
+          }, 500);
+        })
+        .catch(() => {
+          this.disabledBtn = false;
+        });
     },
     backPage() {
       this.$store.dispatch("tagsView/delView", this.$route).then((res) => {

+ 20 - 10
src/views/resource/videoManagement/chapter/edit/index.vue

@@ -251,6 +251,7 @@
         <el-form-item>
           <el-button @click="backPage">取消</el-button>
           <el-button
+            :loading="disabledBtn"
             type="primary"
             @click="submit('listData')"
             :disabled="!noStudent"
@@ -366,6 +367,7 @@ export default {
   name: "ChapterEdit",
   data() {
     return {
+      disabledBtn: false,
       isIndeterminate: false,
       checkAll: false,
       //   弹窗数据
@@ -765,6 +767,7 @@ export default {
       });
     },
     async rulesTableSumbit() {
+      this.disabledBtn = true;
       var sectionIdList = [];
       this.tableData.map((item) => {
         sectionIdList.push({
@@ -782,16 +785,23 @@ export default {
         prefixName: this.listData.prefixName,
         publishStatus: this.listData.publishStatus,
       };
-      this.$api.editCoursechapter(dataInfos).then((res) => {
-        this.$message.success("修改成功");
-        setTimeout(() => {
-          this.$store.dispatch("tagsView/exitView", this.$route).then((res) => {
-            this.$router.push({
-              path: "chapter",
-            });
-          });
-        }, 500);
-      });
+      this.$api
+        .editCoursechapter(dataInfos)
+        .then((res) => {
+          this.$message.success("修改成功");
+          setTimeout(() => {
+            this.$store
+              .dispatch("tagsView/exitView", this.$route)
+              .then((res) => {
+                this.$router.push({
+                  path: "chapter",
+                });
+              });
+          }, 500);
+        })
+        .catch(() => {
+          this.disabledBtn = false;
+        });
     },
     backPage() {
       this.$store.dispatch("tagsView/delView", this.$route).then((res) => {

+ 30 - 19
src/views/resource/videoManagement/courseManagement/basicInfoAdd/index.vue

@@ -196,7 +196,11 @@
       />
       <div style="text-align: center; margin-top: 20px">
         <el-button @click="backPage" size="mini">取消</el-button>
-        <el-button type="primary" @click="submit('listData')" size="mini"
+        <el-button
+          type="primary"
+          @click="submit('listData')"
+          size="mini"
+          :loading="disabledBtn"
           >确定</el-button
         >
       </div>
@@ -212,6 +216,7 @@ export default {
   components: { Editor },
   data() {
     return {
+      disabledBtn: false,
       activeName: "first",
       uploadStatus: 2, //富文本组件传值
       active: 1,
@@ -447,30 +452,36 @@ export default {
       });
     },
     async rulesTableSumbit() {
+      this.disabledBtn = true;
       this.courTypeOptions.map((item) => {
         if (item.id === this.listData.businessId) {
           this.listData.projectId = item.projectId;
         }
       });
       this.listData.status = 1;
-      this.$api.addCourse(this.listData).then((res) => {
-        this.$message.success("新增成功");
-        setTimeout(() => {
-          this.$store
-            .dispatch("tagsView/exitView", this.$route)
-            .then((rest) => {
-              this.$router
-                .replace({
-                  path: "chapterContent",
-                  query: {
-                    id: res.data,
-                    status: "add",
-                  },
-                })
-                .catch((err) => {});
-            });
-        }, 300);
-      });
+      this.$api
+        .addCourse(this.listData)
+        .then((res) => {
+          this.$message.success("新增成功");
+          setTimeout(() => {
+            this.$store
+              .dispatch("tagsView/exitView", this.$route)
+              .then((rest) => {
+                this.$router
+                  .replace({
+                    path: "chapterContent",
+                    query: {
+                      id: res.data,
+                      status: "add",
+                    },
+                  })
+                  .catch((err) => {});
+              });
+          }, 300);
+        })
+        .catch(() => {
+          this.disabledBtn = false;
+        });
     },
     backPage() {
       this.$store.dispatch("tagsView/delView", this.$route).then((res) => {

+ 18 - 8
src/views/resource/videoManagement/courseManagement/basicInfoEdit/index.vue

@@ -95,7 +95,9 @@
         </el-form-item>
         <el-form-item label="课程名称" prop="courseName">
           <el-input v-model="listData.courseName"></el-input>
-          <div style="color: #999">注:请尽量规范易懂,方便在课程目录表呈现给学员</div>
+          <div style="color: #999">
+            注:请尽量规范易懂,方便在课程目录表呈现给学员
+          </div>
         </el-form-item>
 
         <el-form-item label="课程封面">
@@ -201,6 +203,7 @@
           type="primary"
           @click="submit('listData')"
           size="mini"
+          :loading="disabledBtn"
           :disabled="!noStudent"
           >确定</el-button
         >
@@ -216,6 +219,7 @@ export default {
   components: { Editor },
   data() {
     return {
+      disabledBtn: false,
       uploadStatus: 2, //富文本组件传值
       active: 1,
       //   弹窗数据
@@ -320,12 +324,15 @@ export default {
       }
     },
     search() {
-      this.$api.obtainCourseS(this.$route.query.id).then((res) => {
-        this.listData = res.data;
-        this.changeBusiness();
-      }).finally(()=>{
-        this.$modal.closeLoading();
-      })
+      this.$api
+        .obtainCourseS(this.$route.query.id)
+        .then((res) => {
+          this.listData = res.data;
+          this.changeBusiness();
+        })
+        .finally(() => {
+          this.$modal.closeLoading();
+        });
     },
     changeBusiness() {
       var arrays = [];
@@ -512,6 +519,7 @@ export default {
       });
     },
     async rulesTableSumbit() {
+      this.disabledBtn = true
       this.courTypeOptions.map((item) => {
         if (item.id === this.listData.businessId) {
           this.listData.projectId = item.projectId;
@@ -527,7 +535,9 @@ export default {
             });
           });
         }, 300);
-      });
+      }).catch(()=>{
+          this.disabledBtn = false
+        })
     },
     backPage() {
       this.$store.dispatch("tagsView/delView", this.$route).then((res) => {

+ 34 - 15
src/views/resource/videoManagement/courseManagement/chapterContent/index.vue

@@ -53,7 +53,11 @@
     </el-tree>
     <div class="dis-f">
       <el-button @click="backPage">取消</el-button>
-      <el-button type="primary" @click="submit" :disabled="!noStudent"
+      <el-button
+        type="primary"
+        @click="submit"
+        :disabled="!noStudent"
+        :loading="disabledBtn"
         >确定</el-button
       >
     </div>
@@ -345,6 +349,7 @@ export default {
   components: { searchBoxNew, pagination },
   data() {
     return {
+      disabledBtn: false,
       sortTablesBoxs: false,
       activeName: "second",
       status: false,
@@ -353,17 +358,17 @@ export default {
         {
           label: "试卷编码",
           prop: "code",
-          width:"120px"
+          width: "120px",
         },
         {
           label: "标题前缀",
           prop: "prefixName",
-          width:"160px"
+          width: "160px",
         },
         {
           label: "试卷标题",
           prop: "examName",
-          width:"300px"
+          width: "300px",
         },
         {
           label: "业务层级",
@@ -420,7 +425,13 @@ export default {
       tableSet: [
         { label: "编码", prop: "code", width: "120" },
         { label: "标题前缀", prop: "prefixName", width: "160" },
-        { label: "标题", prop: "moduleName", prop1: "name", scope: "teshu", width: "300" },
+        {
+          label: "标题",
+          prop: "moduleName",
+          prop1: "name",
+          scope: "teshu",
+          width: "300",
+        },
         {
           label: "发布状态",
           prop: "publishStatus",
@@ -1096,6 +1107,7 @@ export default {
       });
     },
     submit() {
+      this.disabledBtn = true;
       var array = [];
       this.tableDataInfos.map((item) => {
         array.push({
@@ -1112,16 +1124,23 @@ export default {
         menuExamList: this.menuExamList,
         menuList: array,
       };
-      this.$api.editCoursemenu(data).then((res) => {
-        this.$message.success("编辑成功");
-        setTimeout(() => {
-          this.$store.dispatch("tagsView/exitView", this.$route).then((res) => {
-            this.$router.push({
-              path: "courseManagement",
-            });
-          });
-        }, 300);
-      });
+      this.$api
+        .editCoursemenu(data)
+        .then((res) => {
+          this.$message.success("编辑成功");
+          setTimeout(() => {
+            this.$store
+              .dispatch("tagsView/exitView", this.$route)
+              .then((res) => {
+                this.$router.push({
+                  path: "courseManagement",
+                });
+              });
+          }, 300);
+        })
+        .catch(() => {
+          this.disabledBtn = false;
+        });
     },
   },
 };

+ 1159 - 0
src/views/resource/videoManagement/festival/add/index copy.vue

@@ -0,0 +1,1159 @@
+<template>
+  <div id="festivalAdd">
+    <div class="boxWidth">
+      <el-form
+        label-position="right"
+        label-width="120px"
+        :model="listData"
+        :rules="rules"
+        ref="listData"
+      >
+        <el-form-item label="适用业务层级">
+          <el-select
+            v-model="eduType"
+            placeholder="请选择教育类型"
+            @change="changeEduType"
+          >
+            <el-option
+              v-for="(item, index) in eduTypeOptions"
+              :key="index"
+              :label="item.educationName"
+              :value="item.id"
+            >
+            </el-option>
+          </el-select>
+          <!-- <el-select
+            v-model="courType"
+            placeholder="请选择业务层次"
+            @change="changecourseType"
+          >
+            <el-option
+              v-for="(item, index) in newCourTypeOptions"
+              :key="index"
+              :label="item.projectName + '-' + item.businessName"
+              :value="item.id"
+            >
+            </el-option>
+          </el-select> -->
+          <el-select
+            v-model="courType"
+            placeholder="请选择业务层次"
+            @change="changecourseType"
+          >
+            <el-option-group
+              v-for="(item, index) in newCourTypeOptions"
+              :key="index"
+              :label="item.label"
+            >
+              <el-option
+                v-for="(items, indexs) in item.options"
+                :key="indexs"
+                :label="items.projectName + ' - ' + items.businessName"
+                :value="items.id"
+              >
+              </el-option>
+            </el-option-group>
+          </el-select>
+          <el-popover
+            ref="popovers"
+            placement="bottom"
+            trigger="click"
+            @show="showHandle"
+            @hide="hideHandle"
+            :disabled="courType ? false : true"
+          >
+            <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"
+                :key="index"
+                >{{ item.subjectName }}</el-checkbox
+              >
+            </el-checkbox-group>
+            <div style="display: block; text-align: center; margin-top: 10px">
+              <el-button size="mini" type="primary" @click="submitSujectArray"
+                >确定</el-button
+              >
+            </div>
+            <el-button
+              slot="reference"
+              style="margin-left: 12px"
+              @click="getMessage"
+              >请选择科目</el-button
+            >
+          </el-popover>
+          <span style="margin-left: 10px">注:可多选</span>
+        </el-form-item>
+        <el-form-item label="">
+          <div :class="changeHeight ? 'ach' : 'clh'">
+            <div
+              v-for="(item, index) in newSujectApis"
+              :key="index"
+              class="listBoxStys"
+            >
+              {{
+                item.educationName +
+                " - " +
+                item.projectName +
+                " - " +
+                item.businessName +
+                " - " +
+                item.subjectName
+              }}
+              <i class="el-icon-error closeIcons" @click="closeType(index)"></i>
+            </div>
+          </div>
+          <el-button
+            size="mini"
+            v-if="newSujectApis.length > 1"
+            @click="changeType"
+            >{{ changeHeight ? "展开" : "关闭" }}</el-button
+          ><el-button
+            size="mini"
+            type="danger"
+            v-if="newSujectApis.length > 0"
+            @click="sujectApis = []"
+            >清空</el-button
+          >
+          <!-- <span v-if="newSujectApis.length === 0">未选项目类型</span> -->
+        </el-form-item>
+        <el-form-item label="标题前缀" prop="prefixName">
+          <el-input v-model="listData.prefixName"></el-input>
+          <div style="color: #999">注:便于检索、归类,以及区分一样的标题</div>
+        </el-form-item>
+        <el-form-item label="节标题" prop="name">
+          <el-input v-model="listData.name"></el-input>
+          <div style="color: #999">
+            注:请尽量规范易懂,方便在课程目录表呈现给学员
+          </div>
+        </el-form-item>
+        <el-form-item label="节类型">
+          <el-select
+            clearable
+            v-model="listData.sectionType"
+            placeholder="请选择节类型"
+          >
+            <el-option
+              v-for="(item, index) in sectionTypeOptions"
+              :key="index"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="直播地址" v-if="listData.sectionType === 2">
+          <el-input
+            style="width: 300px"
+            v-model="listData.liveUrl"
+            placeholder="请输入直播地址"
+          ></el-input>
+          <el-select
+            v-model="newActiveLiveUrl"
+            placeholder="快捷选中直播地址"
+            @change="changeLiveUrl"
+          >
+            <el-option
+              v-for="(item, index) in newLiveUrl"
+              :key="index"
+              :label="item.streamingName"
+              :value="item.id"
+            >
+            </el-option>
+          </el-select>
+          <div v-if="listData.liveUrl" style="margin-top: 10px">
+            <el-button
+              size="small"
+              type="warning"
+              @click="watchZbVideo(listData.liveUrl)"
+              >直播预览</el-button
+            >
+          </div>
+        </el-form-item>
+        <el-form-item label="直播开始时间" v-if="listData.sectionType === 2">
+          <el-date-picker
+            v-model="listData.liveStartTime"
+            type="datetime"
+            placeholder="请选择直播开始时间"
+            value-format="timestamp"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="直播结束时间" v-if="listData.sectionType === 2">
+          <el-date-picker
+            v-model="listData.liveEndTime"
+            type="datetime"
+            placeholder="请选择直播结束时间"
+            value-format="timestamp"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item
+          label="直播时长"
+          v-if="
+            listData.sectionType === 2 &&
+            listData.liveStartTime &&
+            listData.liveEndTime
+          "
+        >
+          {{ compTimeOUT(listData.liveStartTime, listData.liveEndTime) }}
+        </el-form-item>
+        <el-form-item
+          label="URL地址"
+          v-if="listData.sectionType === 1 || listData.sectionType === 3"
+        >
+          <el-input
+            style="width: 300px"
+            v-model="listData.recordingUrl"
+            placeholder="请输入URL地址"
+            @change="getApiTime(listData.recordingUrl)"
+          ></el-input>
+          <label
+            for="mobles"
+            class="el-button el-button--primary"
+            style="margin: 0px 6px; padding: 10px 20px"
+            >上传</label
+          ><input
+            style="display: none"
+            type="file"
+            id="mobles"
+            @change="importMoble"
+          />
+          <el-select
+            v-if="listData.sectionType === 1"
+            v-model="newActiveRecordingUrl1"
+            filterable
+            placeholder="快捷选中录播URL地址"
+            @change="changeRecordingUrl1"
+          >
+            <el-option
+              v-for="(item, index) in newSteamUrl1"
+              :key="index"
+              :label="item.streamingName"
+              :value="item.id"
+            >
+            </el-option>
+          </el-select>
+          <el-select
+            v-if="listData.sectionType === 3"
+            v-model="newActiveRecordingUrl2"
+            placeholder="快捷选中回放URL地址"
+            filterable
+            @change="changeRecordingUrl2"
+          >
+            <el-option
+              v-for="(item, index) in newSteamUrl2"
+              :key="index"
+              :label="item.streamingName"
+              :value="item.id"
+            >
+            </el-option>
+          </el-select>
+          <div v-if="listData.recordingUrl" style="margin-top: 10px">
+            <el-button
+              size="small"
+              type="warning"
+              @click="watchVideo(listData.recordingUrl)"
+              >视频预览</el-button
+            >
+          </div>
+        </el-form-item>
+        <el-form-item
+          label="节时长"
+          v-if="listData.sectionType === 1 || listData.sectionType === 3"
+        >
+          <el-time-picker
+            :disabled="disabloutime"
+            value-format="HH:mm:ss"
+            range-separator=":"
+            v-model="listData.durationTime"
+            placeholder="请填入节时长"
+          >
+          </el-time-picker>
+        </el-form-item>
+        <el-form-item label="节封面">
+          <el-row :gutter="10" style="margin-bottom: 10px">
+            <el-col :span="12">
+              <div
+                style="
+                  width: 100%;
+                  height: 150px;
+                  border: 2px dashed #999;
+                  border-radius: 28px;
+                  line-height: 150px;
+                  text-align: center;
+                "
+                v-if="!listData.coverUrl"
+              >
+                <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>
+              <el-image
+                v-else
+                style="width: 100%"
+                :src="$methodsTools.splitImgHost(listData.coverUrl)"
+                :preview-src-list="[
+                  $methodsTools.splitImgHost(listData.coverUrl),
+                ]"
+              >
+              </el-image>
+            </el-col>
+            <el-col :span="11">
+              <span style="color: #999; font-size: 14px"
+                >注:请上传小于300kb,尺寸为750*440的图片,支持gif、jpg、jpeg、png等类型</span
+              >
+            </el-col>
+          </el-row>
+          <el-button
+            v-if="listData.coverUrl"
+            type="danger"
+            size="mini"
+            class="margin-top: 20px;"
+            @click="clearImgs"
+            >删除</el-button
+          >
+        </el-form-item>
+        <el-form-item label="是否发布" prop="publishStatus">
+          <el-radio-group v-model="listData.publishStatus">
+            <el-radio :label="1">是</el-radio>
+            <el-radio :label="0">否</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item>
+          <el-button @click="backPage">取消</el-button>
+          <el-button type="primary" @click="submit('listData')">确定</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <el-dialog
+      :visible.sync="diavos"
+      width="840px"
+      @opened="isOkBf"
+      :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"></div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="clears">取 消</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog
+      :visible.sync="diavoszb"
+      width="840px"
+      @opened="isOkBfzb"
+      :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="clearszb" />
+        </div>
+      </div>
+      <div>
+        <div id="playerzb"></div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="clearszb">取 消</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { uploadFile } from "@/utils/uopladFile.js";
+export default {
+  name: "FestivalAdd",
+  data() {
+    return {
+      isIndeterminate: false,
+      checkAll: false,
+      vodPlayerJs: "https://player.polyv.net/script/player.js",
+      vid: "",
+      playerJs:
+        "https://player.polyv.net/resp/live-h5-player/latest/liveplayer.min.js",
+      uidzb: "egsxlptzdq",
+      vidzb: "",
+      diavos: false,
+      diavoszb: false,
+      fileSetting: {
+        desc: "i am desc", // 描述
+        cataid: "1639399775001", // 分类ID 可以后端传递 也可以不写 或写死
+        tag: "i am tag", // 标签
+        luping: 0, // 是否开启视频课件优化处理,对于上传录屏类视频清晰度有所优化:0为不开启,1为开启
+        keepsource: 1, // 是否源文件播放(不对视频进行编码):0为编码,1为不编码
+      },
+      sectionTypeOptions: [
+        {
+          label: "录播",
+          value: 1,
+        },
+        {
+          label: "直播",
+          value: 2,
+        },
+        // {
+        //   label: "回放",
+        //   value: 3,
+        // },
+      ],
+      //   弹窗数据
+      changeHeight: true,
+      bfImg: "oss/images/avatar/20211013/1634097664410_1397766697",
+      listData: {
+        durationTime: "",
+        sectionType: 1,
+        publishStatus: 1,
+        recordingUrl: "",
+        liveUrl: "",
+        coverUrl: "oss/images/avatar/20211013/1634097664410_1397766697",
+      },
+      newActiveLiveUrl: "",
+      newLiveUrl: [], //直播流地址
+      newActiveRecordingUrl1: "",
+      newSteamUrl1: [], //录播流地址
+      newActiveRecordingUrl2: "",
+      newSteamUrl2: [], //回放流地址
+      eduTypeOptions: [], //教育类型数据
+      courTypeOptions: [], //业务层次数据
+      newCourTypeOptions: [], //当前业务层次数据
+      sujectOption: [], //科目数据
+      newSujectOption: [], //当前科目数据数据
+      eduType: "", //当前选中教育类型
+      courType: "", //当前选中业务层次
+      sujectApis: [], //当前存在的科目
+      newSujectApis: [],
+      sujectArray: [], //选中的科目
+      disabloutime: false,
+      //表单验证
+      rules: {
+        prefixName: [
+          { required: true, message: "请输入标题前缀", trigger: "blur" },
+        ],
+        name: [{ required: true, message: "请输入节标题", trigger: "blur" }],
+        // liveDuration: [
+        //   { required: true, message: "节时长不能为空" },
+        //   { type: "number", message: "节时长必须为数字值" },
+        // ],
+        publishStatus: [
+          { required: true, message: "请选择是否发布", trigger: "change" },
+        ],
+      },
+    };
+  },
+  watch: {
+    sujectApis: {
+      immediate: true,
+      handler(newName, oldName) {
+        this.changeTypes();
+      },
+    },
+  },
+  // computed: {
+  //   compTimes() {
+  //     const aTime = 192;
+  //     let chasTime = this.$methodsTools.secondToDate(aTime, false);
+  //     console.log(chasTime);
+  //     return `00:00:00 - ${chasTime}`;
+  //   },
+  // },
+  mounted() {
+    this.getDict();
+  },
+  methods: {
+    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;
+      }
+    },
+    compTimeOUT(start, end) {
+      if (start && end) {
+        if (end < start) {
+          return "请检查开始与结束的时间范围";
+        }
+        const asTimes = end / 1000 - start / 1000;
+        return this.$methodsTools.secondToDate(asTimes, false);
+      } else {
+        return "未检测到直播开始时间结束时间,无法计算!";
+      }
+    },
+    getApiTime(val) {
+      var self = this;
+      const valueUrl = val.replace(/\s/g, "");
+      if (valueUrl && valueUrl.length > 30)
+        this.$api
+          .inquirepolyvvideo(valueUrl)
+          .then((res) => {
+            if (res.data.duration) {
+              self.listData.durationTime = res.data.duration;
+              self.disabloutime = true;
+            } else {
+              self.disabloutime = false;
+            }
+          })
+          .catch((err) => {
+            self.disabloutime = false;
+          });
+    },
+    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.player) {
+        this.player.destroy();
+      }
+    },
+    /**
+     * @param {String} 视频查看
+     */
+    watchVideo(url) {
+      if (!url) {
+        this.$message.warning("请检查URL地址是否输入完整");
+        return;
+      }
+      this.vid = url;
+      this.diavos = true;
+    },
+    isOkBf() {
+      this.loadPlayerScript(this.loadPlayer);
+    },
+    /**
+     * @param {String} 直播预览
+     */
+    watchZbVideo(url) {
+      if (!url) {
+        this.$message.warning("请检查直播流地址是否输入完整");
+        return;
+      }
+      this.vidzb = url;
+      this.diavoszb = true;
+    },
+    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() {
+      const polyvLivePlayer = window.polyvLivePlayer;
+      this.playerzb = polyvLivePlayer({
+        wrap: "#playerzb",
+        width: 800,
+        height: 533,
+        uid: this.uidzb,
+        vid: this.vidzb,
+      });
+    },
+    clearszb() {
+      this.diavoszb = false;
+      if (this.playerzb) {
+        this.playerzb.destroy();
+      }
+    },
+    isOkBfzb() {
+      this.loadPlayerScriptzb(this.loadPlayerzb);
+    },
+    importMoble(event) {
+      // var self = this;
+      var file = event.target.files[0];
+      // let formData = new FormData();
+      // formData.append("file", file);
+      // console.log(formData);
+      if (!event.target.value) {
+        this.$message.error("请选择您要上传的文件");
+        return false;
+      }
+      /**
+       * @param: event.target.files -> 传递的文件list
+       * @param: this.fileSetting -> 常规配置 上面有备注
+       * @param: 回调
+       */
+      uploadFile(file, this.fileSetting, (event) => {
+        this.listData.recordingUrl = event.vid;
+        this.listData.durationTime = "";
+        this.getApiTime(event.vid);
+      });
+    },
+    getMessage() {
+      if (!this.courType) {
+        this.$message.warning("请先选择业务层级");
+      }
+    },
+    clearImgs() {
+      this.listData.coverUrl = "";
+    },
+    changeTypes() {
+      var self = this;
+      var arrays = [];
+      this.sujectApis.map((item, index) => {
+        this.courTypeOptions.map((items) => {
+          if (items.id === item.split("-").map(Number)[0]) {
+            var obj = {
+              educationTypeId: items.educationId,
+              educationName: items.educationName,
+              projectId: items.projectId,
+              projectName: items.projectName,
+              businessId: items.id,
+              businessName: items.businessName,
+            };
+            self.sujectOption.map((i) => {
+              if (
+                i.id === item.split("-").map(Number)[1] &&
+                i.courseArrays.indexOf(items.projectId) !== -1
+              ) {
+                obj.subjectName = i.subjectName;
+                obj.subjectId = i.id;
+              }
+            });
+            arrays.push(obj);
+          }
+        });
+      });
+      this.newSujectApis = arrays;
+    },
+    changeType() {
+      this.changeHeight = !this.changeHeight;
+    },
+    submitSujectArray() {
+      var self = this;
+      this.sujectApis = this.sujectApis.filter((item, index) => {
+        return item.split("-").map(Number)[0] !== Number(self.courType);
+      });
+      for (let i = 0; i < this.sujectArray.length; i++) {
+        this.sujectApis.push(this.sujectArray[i]);
+      }
+      this.$refs.popovers.doClose();
+      this.$nextTick(() => {
+        this.changeUrl();
+      });
+    },
+    changeUrl() {
+      var arr = this.newSujectApis.map((val) => val.businessId);
+      const unique = [...new Set(arr)];
+      var busId = "";
+      if (unique.length) {
+        busId = unique.toString();
+      } else {
+        busId = "";
+      }
+      this.$api.inquireCourseStreaming({ status: 1 }).then((res) => {
+        var arraystt = [];
+        var newarrays1tt = [];
+        var newarrays2tt = [];
+        res.rows.map((item) => {
+          if (item.streamingType === 1) {
+            arraystt.push(item);
+          }
+          if (item.streamingType === 2) {
+            newarrays1tt.push(item);
+          }
+          if (item.streamingType === 3) {
+            newarrays2tt.push(item);
+          }
+        });
+        this.$api
+          .inquireCourseStreaming({ status: 1, businessId: busId })
+          .then((result) => {
+            var arrays = [];
+            var newarrays1 = [];
+            var newarrays2 = [];
+            result.rows.map((item) => {
+              if (item.streamingType === 1) {
+                arrays.push(item);
+              }
+              if (item.streamingType === 2) {
+                newarrays1.push(item);
+              }
+              if (item.streamingType === 3) {
+                newarrays2.push(item);
+              }
+            });
+            if (arrays.length) {
+              this.newLiveUrl = arrays;
+            } else {
+              this.newLiveUrl = arraystt;
+            }
+            if (newarrays1.length) {
+              this.newSteamUrl1 = newarrays1;
+            } else {
+              this.newSteamUrl1 = newarrays1tt;
+            }
+            if (newarrays2.length) {
+              this.newSteamUrl2 = newarrays2;
+            } else {
+              this.newSteamUrl2 = newarrays2tt;
+            }
+          });
+      });
+    },
+    showHandle() {
+      var array = [];
+      for (let i = 0; i < this.sujectApis.length; i++) {
+        if (
+          this.sujectApis[i].split("-").map(Number)[0] === Number(this.courType)
+        ) {
+          array.push(this.sujectApis[i]);
+        }
+      }
+      this.sujectArray = array;
+      if (!this.newSujectOption.length) {
+        this.$message.warning("该业务层次暂无关联科目");
+        this.$refs.popovers.doClose();
+        return;
+      }
+      this.newSujectOption.map((item) => {
+        item.newId = this.courType + "-" + item.id;
+      });
+      this.handleCheckedCitiesChange();
+    },
+    hideHandle() {},
+    getDict() {
+      this.$api.inquireCourseEducationType({ status: 1 }).then((res) => {
+        this.eduTypeOptions = res.rows;
+      });
+      this.$methodsTools.concatList(true).then((res) => {
+        this.courTypeOptions = res.value;
+        this.newCourTypeOptions = res.options;
+      });
+
+      this.$api.inquireCourseSubject({ status: 1 }).then((res) => {
+        res.rows.map((item, index) => {
+          var array = [];
+          item.courseProjectTypes.map((items, indexs) => {
+            array.push(items.id);
+          });
+          item.courseArrays = array;
+        });
+        this.sujectOption = res.rows;
+      });
+      this.$api.inquireCourseStreaming({ status: 1 }).then((res) => {
+        var arrays = [];
+        var newarrays1 = [];
+        var newarrays2 = [];
+        res.rows.map((item) => {
+          if (item.streamingType === 1) {
+            arrays.push(item);
+          }
+          if (item.streamingType === 2) {
+            newarrays1.push(item);
+          }
+          if (item.streamingType === 3) {
+            newarrays2.push(item);
+          }
+        });
+        this.newLiveUrl = arrays;
+        this.newSteamUrl1 = newarrays1;
+        this.newSteamUrl2 = newarrays2;
+      });
+    },
+    changeEduType(v) {
+      this.$methodsTools.concatList(false, v).then((res) => {
+        this.newCourTypeOptions = res.options;
+      });
+      this.courType = "";
+    },
+    changecourseType(ids) {
+      /**
+       * 进入缓存方法
+       */
+      this.$methodsTools.cacheBusinessList(ids);
+      /**
+       * 查找选中的业务层次对应的教育类型ID 并筛选出对应业务层级列表
+       */
+      let idArr = this.courTypeOptions.find((item) => {
+        return item.id == ids;
+      });
+      this.eduType = idArr.educationId;
+      this.$methodsTools.concatList(false, idArr.educationId).then((res) => {
+        this.newCourTypeOptions = res.options;
+      });
+      /**
+       * 筛选科目
+       */
+      var array = this.sujectOption.filter((items, indexs) => {
+        return items.courseArrays.includes(idArr.projectId);
+      });
+      this.newSujectOption = array;
+      /**
+       * 关闭科目弹窗
+       */
+      this.$refs.popovers.doClose();
+    },
+    submit(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          // if (
+          //   this.listData.coverUrl === "" ||
+          //   this.listData.coverUrl === null ||
+          //   this.listData.coverUrl === undefined
+          // ) {
+          //   this.$message.error("请上传节封面");
+          //   return false;
+          // }
+          this.rulesTableSumbit();
+        } else {
+          return false;
+        }
+      });
+    },
+    async rulesTableSumbit() {
+      var dataInfos = {
+        status: 1,
+        businessList: this.newSujectApis,
+        coverUrl: this.listData.coverUrl,
+        name: this.listData.name,
+        prefixName: this.listData.prefixName,
+        publishStatus: this.listData.publishStatus,
+      };
+
+      if (this.listData.sectionType === 2) {
+        dataInfos.sectionType = 2;
+        dataInfos.liveUrl = this.listData.liveUrl;
+        dataInfos.liveStartTime = this.$methodsTools.time10to13(
+          this.listData.liveStartTime,
+          1
+        );
+        dataInfos.liveEndTime = this.$methodsTools.time10to13(
+          this.listData.liveEndTime,
+          1
+        );
+        if (
+          dataInfos.liveStartTime &&
+          dataInfos.liveEndTime &&
+          dataInfos.liveEndTime < dataInfos.liveStartTime
+        ) {
+          this.$message.warning("请检查直播开始与结束时间范围");
+          return;
+        }
+        dataInfos.durationTime =
+          dataInfos.liveEndTime - dataInfos.liveStartTime;
+      }
+      if (this.listData.sectionType === 1) {
+        dataInfos.sectionType = 1;
+        dataInfos.recordingUrl = this.listData.recordingUrl;
+        dataInfos.durationTime = this.$methodsTools.secondFormDate(
+          this.listData.durationTime
+        );
+      }
+      if (this.listData.sectionType === 3) {
+        dataInfos.sectionType = 3;
+        dataInfos.recordingUrl = this.listData.recordingUrl;
+        dataInfos.durationTime = this.$methodsTools.secondFormDate(
+          this.listData.durationTime
+        );
+      }
+      this.$api.appCourseSection(dataInfos).then((res) => {
+        this.$message.success("新增成功");
+        setTimeout(() => {
+          this.$store.dispatch("tagsView/exitView", this.$route).then((res) => {
+            this.$router.push({
+              path: "festival",
+            });
+          });
+        }, 500);
+      });
+    },
+    backPage() {
+      this.$store.dispatch("tagsView/delView", this.$route).then((res) => {
+        this.$router.push({
+          path: "festival",
+        });
+      });
+    },
+    closeType(index) {
+      this.sujectApis.splice(index, 1);
+      this.$nextTick(() => {
+        this.changeUrl();
+      });
+    },
+    changeLiveUrl() {
+      this.newLiveUrl.map((item) => {
+        if (item.id === this.newActiveLiveUrl) {
+          this.listData.liveUrl = item.liveUrl;
+        }
+      });
+      this.newActiveLiveUrl = "";
+    },
+    changeRecordingUrl1() {
+      this.newSteamUrl1.map((item) => {
+        if (item.id === this.newActiveRecordingUrl1) {
+          this.listData.recordingUrl = item.recordingVideoId;
+          this.getApiTime(item.recordingVideoId);
+        }
+      });
+      this.newActiveRecordingUrl1 = "";
+    },
+    changeRecordingUrl2() {
+      this.newSteamUrl2.map((item) => {
+        if (item.id === this.newActiveRecordingUrl2) {
+          this.listData.recordingUrl = item.playbackUrl;
+          this.getApiTime(item.recordingVideoId);
+        }
+      });
+      this.newActiveRecordingUrl2 = "";
+    },
+    getImgFile() {
+      var self = this;
+      var file = self.$refs.file.files[0];
+      if (file === undefined) {
+        self.$set(self.listData, "coverUrl", "");
+        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.coverUrl = res;
+      });
+    },
+  },
+};
+</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;
+  }
+}
+.boxWidth {
+  width: 770px;
+}
+.numInputs {
+  width: 150px;
+}
+.checkboxSty {
+  max-height: 210px;
+  overflow: auto;
+  display: flex;
+  flex-direction: column;
+}
+.listBoxStys {
+  flex-shrink: 0;
+  padding: 0px 10px;
+  border-radius: 8px;
+  border: 1px solid #eee;
+  margin-right: 10px;
+  margin-bottom: 6px;
+}
+.closeIcons {
+  color: red;
+  cursor: pointer;
+  margin-left: 6px;
+}
+.ach {
+  display: flex;
+  align-items: center;
+  overflow: hidden;
+}
+.clh {
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+}
+.imgBoxins {
+  width: 375px;
+  height: 220px;
+  text-align: center;
+  img {
+    height: 100%;
+  }
+}
+.iconStsz {
+  font-size: 40px;
+  color: #67c23a;
+  cursor: pointer;
+}
+</style>

+ 91 - 62
src/views/resource/videoManagement/festival/add/index.vue

@@ -22,7 +22,7 @@
             >
             </el-option>
           </el-select>
-          <!-- <el-select
+          <el-select
             v-model="courType"
             placeholder="请选择业务层次"
             @change="changecourseType"
@@ -34,25 +34,6 @@
               :value="item.id"
             >
             </el-option>
-          </el-select> -->
-          <el-select
-            v-model="courType"
-            placeholder="请选择业务层次"
-            @change="changecourseType"
-          >
-            <el-option-group
-              v-for="(item, index) in newCourTypeOptions"
-              :key="index"
-              :label="item.label"
-            >
-              <el-option
-                v-for="(items, indexs) in item.options"
-                :key="indexs"
-                :label="items.projectName + ' - ' + items.businessName"
-                :value="items.id"
-              >
-              </el-option>
-            </el-option-group>
           </el-select>
           <el-popover
             ref="popovers"
@@ -113,6 +94,33 @@
               <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"
@@ -120,7 +128,6 @@
             >{{ changeHeight ? "展开" : "关闭" }}</el-button
           ><el-button
             size="mini"
-            type="danger"
             v-if="newSujectApis.length > 0"
             @click="sujectApis = []"
             >清空</el-button
@@ -339,7 +346,7 @@
         </el-form-item>
         <el-form-item>
           <el-button @click="backPage">取消</el-button>
-          <el-button type="primary" @click="submit('listData')">确定</el-button>
+          <el-button type="primary" @click="submit('listData')" :loading="disabledBtn">确定</el-button>
         </el-form-item>
       </el-form>
     </div>
@@ -392,6 +399,7 @@ export default {
   name: "FestivalAdd",
   data() {
     return {
+      disabledBtn: false,
       isIndeterminate: false,
       checkAll: false,
       vodPlayerJs: "https://player.polyv.net/script/player.js",
@@ -441,6 +449,7 @@ export default {
       newActiveRecordingUrl2: "",
       newSteamUrl2: [], //回放流地址
       eduTypeOptions: [], //教育类型数据
+      projectTypeOptions: [], //项目类型数据
       courTypeOptions: [], //业务层次数据
       newCourTypeOptions: [], //当前业务层次数据
       sujectOption: [], //科目数据
@@ -451,6 +460,7 @@ export default {
       newSujectApis: [],
       sujectArray: [], //选中的科目
       disabloutime: false,
+      localData: [], //缓存数据
       //表单验证
       rules: {
         prefixName: [
@@ -475,18 +485,29 @@ export default {
       },
     },
   },
-  // computed: {
-  //   compTimes() {
-  //     const aTime = 192;
-  //     let chasTime = this.$methodsTools.secondToDate(aTime, false);
-  //     console.log(chasTime);
-  //     return `00:00:00 - ${chasTime}`;
-  //   },
-  // },
   mounted() {
+    this.localData = this.$methodsTools.getBusinessList();
     this.getDict();
   },
   methods: {
+    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;
@@ -807,11 +828,13 @@ export default {
       this.$api.inquireCourseEducationType({ status: 1 }).then((res) => {
         this.eduTypeOptions = res.rows;
       });
-      this.$methodsTools.concatList(true).then((res) => {
-        this.courTypeOptions = res.value;
-        this.newCourTypeOptions = res.options;
+      this.$api.inquireCourseProjectType({ status: 1 }).then((res) => {
+        this.projectTypeOptions = res.rows;
+      });
+      this.$api.inquirebusinessList({ status: 1 }).then((res) => {
+        this.courTypeOptions = res.rows;
+        this.newCourTypeOptions = res.rows;
       });
-
       this.$api.inquireCourseSubject({ status: 1 }).then((res) => {
         res.rows.map((item, index) => {
           var array = [];
@@ -842,37 +865,38 @@ export default {
         this.newSteamUrl2 = newarrays2;
       });
     },
-    changeEduType(v) {
-      this.$methodsTools.concatList(false, v).then((res) => {
-        this.newCourTypeOptions = res.options;
+    changeEduType() {
+      if (!(this.courType === undefined || this.courType === "")) {
+        this.courType = "";
+      }
+      var arrays = [];
+      this.courTypeOptions.map((item) => {
+        if (item.educationId === this.eduType) {
+          arrays.push(item);
+        }
       });
-      this.courType = "";
+      this.newCourTypeOptions = arrays;
     },
-    changecourseType(ids) {
-      /**
-       * 进入缓存方法
-       */
-      this.$methodsTools.cacheBusinessList(ids);
-      /**
-       * 查找选中的业务层次对应的教育类型ID 并筛选出对应业务层级列表
-       */
-      let idArr = this.courTypeOptions.find((item) => {
-        return item.id == ids;
-      });
-      this.eduType = idArr.educationId;
-      this.$methodsTools.concatList(false, idArr.educationId).then((res) => {
-        this.newCourTypeOptions = res.options;
+    changecourseType() {
+      this.newCourTypeOptions.map((item, index) => {
+        if (item.id === this.courType) {
+          this.eduType = item.educationId;
+          var array = [];
+          this.sujectOption.map((items, indexs) => {
+            if (items.courseArrays.indexOf(item.projectId) !== -1) {
+              array.push(items);
+            }
+          });
+          this.newSujectOption = array;
+        }
       });
-      /**
-       * 筛选科目
-       */
-      var array = this.sujectOption.filter((items, indexs) => {
-        return items.courseArrays.includes(idArr.projectId);
+      var arrays = [];
+      this.courTypeOptions.map((item) => {
+        if (item.educationId === this.eduType) {
+          arrays.push(item);
+        }
       });
-      this.newSujectOption = array;
-      /**
-       * 关闭科目弹窗
-       */
+      this.newCourTypeOptions = arrays;
       this.$refs.popovers.doClose();
     },
     submit(formName) {
@@ -893,6 +917,7 @@ export default {
       });
     },
     async rulesTableSumbit() {
+      this.disabledBtn = true
       var dataInfos = {
         status: 1,
         businessList: this.newSujectApis,
@@ -919,6 +944,7 @@ export default {
           dataInfos.liveEndTime < dataInfos.liveStartTime
         ) {
           this.$message.warning("请检查直播开始与结束时间范围");
+          this.disabledBtn = false
           return;
         }
         dataInfos.durationTime =
@@ -939,6 +965,7 @@ export default {
         );
       }
       this.$api.appCourseSection(dataInfos).then((res) => {
+        this.$methodsTools.cacheBusinessList(this.newSujectApis);
         this.$message.success("新增成功");
         setTimeout(() => {
           this.$store.dispatch("tagsView/exitView", this.$route).then((res) => {
@@ -947,7 +974,9 @@ export default {
             });
           });
         }, 500);
-      });
+      }).catch(()=>{
+          this.disabledBtn = false
+        })
     },
     backPage() {
       this.$store.dispatch("tagsView/delView", this.$route).then((res) => {

+ 21 - 10
src/views/resource/videoManagement/festival/edit/index.vue

@@ -342,6 +342,7 @@
         <el-form-item>
           <el-button @click="backPage">取消</el-button>
           <el-button
+            :loading="disabledBtn"
             type="primary"
             @click="submit('listData')"
             :disabled="!noStudent"
@@ -400,6 +401,7 @@ export default {
   name: "FestivalEdit",
   data() {
     return {
+      disabledBtn: false,
       isIndeterminate: false,
       checkAll: false,
       vodPlayerJs: "https://player.polyv.net/script/player.js",
@@ -975,6 +977,7 @@ export default {
       });
     },
     async rulesTableSumbit() {
+      this.disabledBtn = true;
       var dataInfos = {
         status: 1,
         sectionId: this.$route.query.id,
@@ -1002,6 +1005,7 @@ export default {
           dataInfos.liveEndTime < dataInfos.liveStartTime
         ) {
           this.$message.warning("请检查直播开始与结束时间范围");
+          this.disabledBtn = false;
           return;
         }
         dataInfos.durationTime =
@@ -1021,16 +1025,23 @@ export default {
           this.listData.durationTime
         );
       }
-      this.$api.editCourseSection(dataInfos).then((res) => {
-        this.$message.success("修改成功");
-        setTimeout(() => {
-          this.$store.dispatch("tagsView/exitView", this.$route).then((res) => {
-            this.$router.push({
-              path: "festival",
-            });
-          });
-        }, 500);
-      });
+      this.$api
+        .editCourseSection(dataInfos)
+        .then((res) => {
+          this.$message.success("修改成功");
+          setTimeout(() => {
+            this.$store
+              .dispatch("tagsView/exitView", this.$route)
+              .then((res) => {
+                this.$router.push({
+                  path: "festival",
+                });
+              });
+          }, 500);
+        })
+        .catch(() => {
+          this.disabledBtn = false;
+        });
     },
     backPage() {
       this.$store.dispatch("tagsView/delView", this.$route).then((res) => {

+ 23 - 10
src/views/resource/videoManagement/flow/index.vue

@@ -40,6 +40,7 @@
       @handleCurrentChange="handleCurrentChange"
     />
     <el-dialog
+      @closed="loadingClose"
       :visible.sync="dialogVisible"
       width="630px"
       :show-close="false"
@@ -209,6 +210,7 @@
         <el-button
           type="primary"
           v-if="statusPop !== 2"
+          :loading="disabledBtn"
           @click="submit('listData')"
           >确 定</el-button
         >
@@ -832,6 +834,7 @@ export default {
       });
     },
     rulesTableSumbit() {
+      this.disabledBtn = true;
       var pushRays = [];
       this.zhType.map((item) => {
         pushRays.push({
@@ -863,19 +866,29 @@ export default {
         dataInfos.playbackUrl = this.listData.playbackUrl;
       }
       if (this.statusPop === 1) {
-        this.$api.appCourseStreaming(dataInfos).then((res) => {
-          this.$message.success("新增成功");
-          this.dialogVisible = false;
-          this.search();
-        });
+        this.$api
+          .appCourseStreaming(dataInfos)
+          .then((res) => {
+            this.$message.success("新增成功");
+            this.dialogVisible = false;
+            this.search();
+          })
+          .catch(() => {
+            this.disabledBtn = false;
+          });
       }
       if (this.statusPop === 0) {
         dataInfos.id = this.listData.id;
-        this.$api.editCourseBusinessCourseStreaming(dataInfos).then((res) => {
-          this.$message.success("修改成功");
-          this.dialogVisible = false;
-          this.search();
-        });
+        this.$api
+          .editCourseBusinessCourseStreaming(dataInfos)
+          .then((res) => {
+            this.$message.success("修改成功");
+            this.dialogVisible = false;
+            this.search();
+          })
+          .catch(() => {
+            this.disabledBtn = false;
+          });
       }
     },
     close() {

+ 78 - 11
src/views/resource/videoManagement/moduleManagement/add/index.vue

@@ -93,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
           >
         </el-form-item>
         <el-form-item label="标题前缀" prop="prefixName">
@@ -249,7 +281,12 @@
         </el-form-item>
         <el-form-item>
           <el-button @click="backPage">取消</el-button>
-          <el-button type="primary" @click="submit('listData')">确定</el-button>
+          <el-button
+            type="primary"
+            @click="submit('listData')"
+            :loading="disabledBtn"
+            >确定</el-button
+          >
         </el-form-item>
       </el-form>
     </div>
@@ -360,6 +397,7 @@ export default {
   name: "ModuleManagementAdd",
   data() {
     return {
+      disabledBtn: false,
       isIndeterminate: false,
       checkAll: false,
       //   弹窗数据
@@ -460,6 +498,7 @@ export default {
       },
       disCheckList: [], //已选转禁用复选列表
       activeLists: [],
+      localData: [],
     };
   },
   watch: {
@@ -471,10 +510,29 @@ export default {
     },
   },
   mounted() {
+    this.localData = this.$methodsTools.getBusinessList();
     this.getDict();
     // this.search();
   },
   methods: {
+    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;
@@ -740,6 +798,7 @@ export default {
       });
     },
     async rulesTableSumbit() {
+      this.disabledBtn = true;
       var chapterIdList = [];
       this.tableData.map((item) => {
         chapterIdList.push({
@@ -756,16 +815,24 @@ export default {
         prefixName: this.listData.prefixName,
         publishStatus: this.listData.publishStatus,
       };
-      this.$api.addCoursemodule(dataInfos).then((res) => {
-        this.$message.success("新增成功");
-        setTimeout(() => {
-          this.$store.dispatch("tagsView/exitView", this.$route).then((res) => {
-            this.$router.push({
-              path: "moduleManagement",
-            });
-          });
-        }, 500);
-      });
+      this.$api
+        .addCoursemodule(dataInfos)
+        .then((res) => {
+          this.$methodsTools.cacheBusinessList(this.newSujectApis);
+          this.$message.success("新增成功");
+          setTimeout(() => {
+            this.$store
+              .dispatch("tagsView/exitView", this.$route)
+              .then((res) => {
+                this.$router.push({
+                  path: "moduleManagement",
+                });
+              });
+          }, 500);
+        })
+        .catch(() => {
+          this.disabledBtn = false;
+        });
     },
     backPage() {
       this.$store.dispatch("tagsView/delView", this.$route).then((res) => {

+ 20 - 10
src/views/resource/videoManagement/moduleManagement/edit/index.vue

@@ -251,6 +251,7 @@
         <el-form-item>
           <el-button @click="backPage">取消</el-button>
           <el-button
+            :loading="disabledBtn"
             type="primary"
             @click="submit('listData')"
             :disabled="!noStudent"
@@ -366,6 +367,7 @@ export default {
   components: { searchBoxNew, pagination },
   data() {
     return {
+      disabledBtn: false,
       isIndeterminate: false,
       checkAll: false,
       //   弹窗数据
@@ -763,6 +765,7 @@ export default {
       });
     },
     async rulesTableSumbit() {
+      this.disabledBtn = true;
       var chapterIdList = [];
       this.tableData.map((item) => {
         chapterIdList.push({
@@ -780,16 +783,23 @@ export default {
         prefixName: this.listData.prefixName,
         publishStatus: this.listData.publishStatus,
       };
-      this.$api.editCoursemodule(dataInfos).then((res) => {
-        this.$message.success("修改成功");
-        setTimeout(() => {
-          this.$store.dispatch("tagsView/exitView", this.$route).then((res) => {
-            this.$router.push({
-              path: "moduleManagement",
-            });
-          });
-        }, 500);
-      });
+      this.$api
+        .editCoursemodule(dataInfos)
+        .then((res) => {
+          this.$message.success("修改成功");
+          setTimeout(() => {
+            this.$store
+              .dispatch("tagsView/exitView", this.$route)
+              .then((res) => {
+                this.$router.push({
+                  path: "moduleManagement",
+                });
+              });
+          }, 500);
+        })
+        .catch(() => {
+          this.disabledBtn = false;
+        });
     },
     backPage() {
       this.$store.dispatch("tagsView/delView", this.$route).then((res) => {