Tang 3 năm trước cách đây
mục cha
commit
41b992888b
59 tập tin đã thay đổi với 4120 bổ sung1070 xóa
  1. 2 2
      .env.development
  2. 2 2
      .env.production
  3. 2 2
      .env.staging
  4. BIN
      dist.zip
  5. BIN
      public/favicon.ico
  6. BIN
      src/assets/images/logo@2xS.png
  7. BIN
      src/assets/images/logo@2xSYT.png
  8. 50 22
      src/components/searchBoxNew.vue
  9. 2084 0
      src/components/tableList copy.vue
  10. 60 39
      src/components/tableList.vue
  11. 10 8
      src/layout/components/Sidebar/Logo.vue
  12. 8 0
      src/newApi/festival.js
  13. 8 0
      src/newApi/polyv.js
  14. 4 1
      src/permission.js
  15. 4 4
      src/store/getters.js
  16. 0 3
      src/store/modules/dict.js
  17. 8 8
      src/utils/index.js
  18. 18 19
      src/utils/methodsTool.js
  19. 71 0
      src/utils/polyvError.js
  20. 11 7
      src/utils/request.js
  21. 133 381
      src/views/Marketing/goods/commodityManageMent/add/index.vue
  22. 118 385
      src/views/Marketing/goods/commodityManageMent/edit/index.vue
  23. 0 0
      src/views/Marketing/goods/commodityManageMent/index.vue
  24. 0 0
      src/views/Marketing/goods/commodityManageMent/poppleSet.vue
  25. 0 0
      src/views/Marketing/goods/commodityManageMent/poppleSetTK.vue
  26. 714 0
      src/views/Marketing/goods/courseInquiryList/index.vue
  27. 0 0
      src/views/Marketing/order/orderList/add/order/index copy.vue
  28. 0 0
      src/views/Marketing/order/orderList/add/order/index.vue
  29. 0 0
      src/views/Marketing/order/orderList/add/orderPrice/index.vue
  30. 0 0
      src/views/Marketing/order/orderList/details/costPriceManages.vue
  31. 0 0
      src/views/Marketing/order/orderList/details/goodsManage.vue
  32. 0 0
      src/views/Marketing/order/orderList/details/index.vue
  33. 0 0
      src/views/Marketing/order/orderList/details/studentManageOrder.vue
  34. 4 16
      src/views/Marketing/order/orderList/index.vue
  35. 48 17
      src/views/education/classManageMent/classHours/index.vue
  36. 29 20
      src/views/education/classManageMent/classHoursReview/index.vue
  37. 39 8
      src/views/education/classManageMent/classList/addClass/index.vue
  38. 67 30
      src/views/education/classManageMent/classList/manageClass/baseInfo.vue
  39. 3 3
      src/views/education/classManageMent/studentMenu/index.vue
  40. 67 0
      src/views/education/dataReview/dataConfig/index.vue
  41. 1 1
      src/views/education/dataReview/informationTemplate/index.vue
  42. 86 13
      src/views/education/dataReview/stamp/index.vue
  43. 9 9
      src/views/education/examManagement/applicationData/asPlanned.vue
  44. 0 1
      src/views/education/examManagement/examArrangement/index.vue
  45. 1 0
      src/views/education/notificationManageMent/notificationList/add/index.vue
  46. 1 0
      src/views/education/notificationManageMent/notificationList/edit/index.vue
  47. 14 7
      src/views/education/studentManageMent/studentXQ/BankQuestionPassRecord.vue
  48. 14 10
      src/views/resource/bankManagement/topicManagement/index.vue
  49. 10 0
      src/views/resource/handoutManagement/handoutList/add/index.vue
  50. 10 0
      src/views/resource/handoutManagement/handoutList/edit/index.vue
  51. 32 13
      src/views/resource/handoutManagement/handoutList/index.vue
  52. 0 0
      src/views/resource/handoutManagement/tang.md
  53. 95 9
      src/views/resource/videoManagement/festival/add/index.vue
  54. 82 0
      src/views/resource/videoManagement/festival/edit/index.vue
  55. 115 15
      src/views/resource/videoManagement/festival/index.vue
  56. 67 5
      src/views/resource/videoManagement/flow/index.vue
  57. 2 2
      src/views/systemManagement/systemConfig/videoConfig/index.vue
  58. 16 7
      src/views/systemSettings/menu/index.vue
  59. 1 1
      vue.config.js

+ 2 - 2
.env.development

@@ -1,10 +1,10 @@
 # 页面标题
-VUE_APP_TITLE = 中正高校端管理系统
+VUE_APP_TITLE = 祥粤云学堂管理后台
 
 # 开发环境配置
 ENV = 'development'
 
-# 中正高校端管理系统/开发环境
+# 祥粤云学堂管理后台/开发环境
 VUE_APP_BASE_API = '/dev-api'
 
 # 路由懒加载

+ 2 - 2
.env.production

@@ -1,8 +1,8 @@
 # 页面标题
-VUE_APP_TITLE = 中正高校端管理系统
+VUE_APP_TITLE = 祥粤云学堂管理后台
 
 # 生产环境配置
 ENV = 'production'
 
-# 中正高校端管理系统/生产环境
+# 祥粤云学堂管理后台/生产环境
 VUE_APP_BASE_API = ''

+ 2 - 2
.env.staging

@@ -1,10 +1,10 @@
 # 页面标题
-VUE_APP_TITLE = 中正高校端管理系统
+VUE_APP_TITLE = 祥粤云学堂管理后台
 
 NODE_ENV = production
 
 # 测试环境配置
 ENV = 'staging'
 
-# 中正高校端管理系统/测试环境
+# 祥粤云学堂管理后台/测试环境
 VUE_APP_BASE_API = '/stage-api'

BIN
dist.zip


BIN
public/favicon.ico


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


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


+ 50 - 22
src/components/searchBoxNew.vue

@@ -39,9 +39,20 @@
       </div>
     </div> -->
     <div class="inputListBoxs">
+      <div class="fon_sIcon" v-if="redIcon">
+        <el-tooltip
+          effect="light"
+          class="item"
+          content="该页面中的数据查询,针对的是「有效、有课程内容」的视频商品"
+          placement="bottom-start"
+        >
+          <i class="el-icon-warning-outline iconStyS"></i>
+        </el-tooltip>
+      </div>
       <div
         class="fon_s"
         style="padding-top: 10px; width: 70px; text-align: end"
+        v-else
       >
         筛选:
       </div>
@@ -74,7 +85,7 @@
               <el-option
                 v-for="(items, indexs) in newBusinessLevel"
                 :key="indexs"
-                :label="items.projectName + '-' +items.businessName"
+                :label="items.projectName + '-' + items.businessName"
                 :value="items.id"
               ></el-option>
             </el-select>
@@ -212,7 +223,7 @@
                 controls-position="right"
                 :min="0"
                 :max="100"
-              :size="size"
+                :size="size"
                 @change="
                   handleChanges(formData[item.prop1], formData[item.prop2])
                 "
@@ -224,7 +235,7 @@
                 controls-position="right"
                 :min="0"
                 :max="100"
-              :size="size"
+                :size="size"
                 @change="
                   handleChanges(formData[item.prop1], formData[item.prop2])
                 "
@@ -290,19 +301,19 @@
                 v-model="formData[item.prop1]"
                 type="date"
                 value-format="timestamp"
-              :size="size"
+                :size="size"
                 :placeholder="item.placeholder1"
-                @change="change1(item.prop1,item.prop2)"
+                @change="change1(item.prop1, item.prop2)"
               >
               </el-date-picker>
               <el-date-picker
-              style="margin-left:10px;"
+                style="margin-left: 10px"
                 v-model="formData[item.prop2]"
                 type="date"
-              :size="size"
+                :size="size"
                 value-format="timestamp"
                 :placeholder="item.placeholder2"
-                @change="change2(item.prop1,item.prop2)"
+                @change="change2(item.prop1, item.prop2)"
               >
               </el-date-picker>
             </div>
@@ -329,7 +340,7 @@
 <script>
 import { mapGetters } from "vuex";
 export default {
-  props: ["formList", "topType", "formData","shType"], //参考文档 component.md
+  props: ["formList", "topType", "formData", "shType", "redIcon"], //参考文档 component.md
   data() {
     return {
       lists: [
@@ -354,7 +365,7 @@ export default {
           value: 4,
         },
       ],
-      lists5:[
+      lists5: [
         {
           label: "全部",
           value: "",
@@ -370,7 +381,7 @@ export default {
         {
           label: "不通过",
           value: 3,
-        }
+        },
       ],
       // classLists: [
       //   {
@@ -467,7 +478,7 @@ export default {
     };
   },
   computed: {
-    ...mapGetters(["educationType","Professional","examList","beforeList"]),
+    ...mapGetters(["educationType", "Professional", "examList", "beforeList"]),
   },
   created() {
     var self = this;
@@ -479,19 +490,25 @@ export default {
     // };
   },
   methods: {
-    change1(data1,data2){
-      if(this.formData[data1]){
-        if(this.formData[data2] && this.formData[data1]>this.formData[data2]){
-          this.formData[data1] = ''
-          this.$message.warning("开始时间不能大于结束时间,请重新选择开始时间")
+    change1(data1, data2) {
+      if (this.formData[data1]) {
+        if (
+          this.formData[data2] &&
+          this.formData[data1] > this.formData[data2]
+        ) {
+          this.formData[data1] = "";
+          this.$message.warning("开始时间不能大于结束时间,请重新选择开始时间");
         }
       }
     },
-    change2(data1,data2){
-      if(this.formData[data2]){
-        if(this.formData[data1] && this.formData[data2]<this.formData[data1]){
-          this.formData[data2] = ''
-          this.$message.warning("结束时间不能小于开始时间,请重新选择结束时间")
+    change2(data1, data2) {
+      if (this.formData[data2]) {
+        if (
+          this.formData[data1] &&
+          this.formData[data2] < this.formData[data1]
+        ) {
+          this.formData[data2] = "";
+          this.$message.warning("结束时间不能小于开始时间,请重新选择结束时间");
         }
       }
     },
@@ -581,6 +598,17 @@ export default {
   font-size: 14px;
   color: #6b6b6b;
 }
+.fon_sIcon {
+  width: 50px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.iconStyS {
+  font-size: 24px;
+  font-weight: bold;
+  color: red;
+}
 .inputListBox {
   display: flex;
   align-items: center;

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

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

+ 60 - 39
src/components/tableList.vue

@@ -233,7 +233,7 @@
               class="editInfoSty"
               @click="jumpPeolpe(scope.row, item.type)"
             >
-            {{scope.row[item.prop]}}
+              {{ scope.row[item.prop] }}
             </span>
             <span v-else-if="item.scope === 'sectionTypesTTT'">{{
               Number(scope.row[item.prop]) === 1
@@ -439,7 +439,7 @@
                 placement="right"
                 trigger="click"
               >
-                <ul>
+                <ul class="max-heightStyles">
                   <li
                     v-for="(itm, inds) in scope.row[item.prop]"
                     :key="inds"
@@ -928,7 +928,11 @@
             <div v-else-if="item.scope === 'changeCLS'">
               <div v-if="scope.row[item.prop] === 1" style="color: red">
                 有变更
-                <span style="marign-left:6px;color:blue;cursor: pointer;" @click="isShowBoxsFun(scope.row)">查看</span>
+                <span
+                  style="marign-left: 6px; color: blue; cursor: pointer"
+                  @click="isShowBoxsFun(scope.row)"
+                  >查看</span
+                >
               </div>
               <span v-else> 正常 </span>
             </div>
@@ -1084,7 +1088,9 @@
               <span :style="scope.row[item.prop] ? 'color:blue' : ''">{{
                 scope.row[item.prop]
               }}</span>
-              <span style="color: red" v-if="scope.row[item.prop]"
+              <span
+                style="color: red; margin-left: 10px"
+                v-if="scope.row[item.prop]"
                 >已重修{{ scope.row[item.prop1] }}节</span
               >
             </div>
@@ -1352,12 +1358,20 @@
           />
         </div>
       </div>
-      <div style="max-height:400px;overflow:auto;">
+      <div style="max-height: 400px; overflow: auto">
         <ul>
-          <li v-for="(items,indexs) in listBoxsGET" :key="indexs" style="margin-bottom:30px;">
-            <p>{{$methodsTools.onlyForma(items.createTime)}}</p>
-            <p style="padding-left:14px;color:#999;">姓名:{{items.realname}}</p>
-            <p style="padding-left:14px;color:#999;">身份证号码:{{items.idCard}}</p>
+          <li
+            v-for="(items, indexs) in listBoxsGET"
+            :key="indexs"
+            style="margin-bottom: 30px"
+          >
+            <p>{{ $methodsTools.onlyForma(items.createTime) }}</p>
+            <p style="padding-left: 14px; color: #999">
+              姓名:{{ items.realname }}
+            </p>
+            <p style="padding-left: 14px; color: #999">
+              身份证号码:{{ items.idCard }}
+            </p>
           </li>
         </ul>
       </div>
@@ -1412,8 +1426,8 @@ export default {
       isIndeterminate: false,
       videoUrls: "",
       diaBox: false,
-      isShowBoxs:false,
-      listBoxsGET:[],
+      isShowBoxs: false,
+      listBoxsGET: [],
       props: {
         label(data, node) {
           return data.menuName || data.name;
@@ -1474,12 +1488,14 @@ export default {
   },
   mounted() {},
   methods: {
-    isShowBoxsFun(item){
-      this.$api.inquireuserUpdateListsy({userId:item.userId}).then(res => {
-        this.listBoxsGET = res.rows
-        this.isShowBoxs = true
-        this.$api.editgradestudentuserUpdate({userId:item.userId,status:1}).then(result => {})
-      })
+    isShowBoxsFun(item) {
+      this.$api.inquireuserUpdateListsy({ userId: item.userId }).then((res) => {
+        this.listBoxsGET = res.rows;
+        this.isShowBoxs = true;
+        this.$api
+          .editgradestudentuserUpdate({ userId: item.userId, status: 1 })
+          .then((result) => {});
+      });
     },
     sortMethods(a, b) {
       return a.classGradeUserGoodsVoList.length >
@@ -1598,7 +1614,7 @@ export default {
       } else {
         if (node.data.type === 1) {
           this.$api
-            .inquireCourseListmodulechapter(node.data.courseId)
+            .inquireCourseListmodulechapter(node.data.menuId)
             .then((res) => {
               res.data.forEach((item) => {
                 item.TypeId = 2 + "-" + item.chapterId;
@@ -1754,6 +1770,7 @@ export default {
     },
     //自定义列全选按钮触发
     handleCheckAllChange(val) {
+      console.log(val, 123);
       this.checkedCities = val ? this.cities : [];
       this.isIndeterminate = false;
       if (val) {
@@ -1780,6 +1797,12 @@ export default {
         }
       });
     },
+    //自定义列重置
+    initVue() {
+      // this.$emit("initTableset");
+      this.tableSet = JSON.parse(this.inittableSet);
+      this.initTR();
+    },
     // 下移
     downMove(option, index) {
       if (index !== this.tableSet.length - 1) {
@@ -1866,12 +1889,6 @@ export default {
     select(value) {
       this.allCheckData = value;
     },
-    //自定义列重置
-    initVue() {
-      // this.$emit("initTableset");
-      this.tableSet = JSON.parse(this.inittableSet);
-      this.initTR();
-    },
     load(tree, treeNode, resolve) {
       this.$emit("load", tree, treeNode, resolve);
     },
@@ -1882,24 +1899,24 @@ export default {
         this.$emit("editInfo", option);
       }
     },
-    jumpPeolpe(item,type){
-      if(type === 1){
+    jumpPeolpe(item, type) {
+      if (type === 1) {
         this.$router.push({
-        path: "applicationData",
-        query: {
-          id: item.applyId,
-          type:type
-        },
-      });
+          path: "applicationData",
+          query: {
+            id: item.applyId,
+            type: type,
+          },
+        });
       }
-      if(type === 2){
+      if (type === 2) {
         this.$router.push({
-        path: "applicationData",
-        query: {
-          id: item.beforeId,
-          type:type
-        },
-      });
+          path: "applicationData",
+          query: {
+            id: item.beforeId,
+            type: type,
+          },
+        });
       }
     },
     getxq(option) {
@@ -1916,6 +1933,10 @@ export default {
 };
 </script>
 <style lang="less">
+.max-heightStyles{
+  max-height: 500px;
+  overflow-y: auto;
+}
 .overSty {
   white-space: nowrap;
   overflow-x: auto;

+ 10 - 8
src/layout/components/Sidebar/Logo.vue

@@ -2,11 +2,11 @@
   <div class="sidebar-logo-container" :class="{'collapse':collapse}" :style="{ backgroundColor: sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground }">
     <transition name="sidebarLogoFade">
       <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">
-        <img v-if="logo" :src="logo" class="sidebar-logo" />
+        <img v-if="logo" :src="sideTheme === 'theme-dark'? logo : logoYT" class="sidebar-logo" />
         <h1 v-else class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1>
       </router-link>
       <router-link v-else key="expand" class="sidebar-logo-link" to="/">
-        <img v-if="logo" :src="logo" class="sidebar-logo" />
+        <img v-if="logo" :src="sideTheme === 'theme-dark'? logo : logoYT" class="sidebar-logo" />
         <h1 class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1>
       </router-link>
     </transition>
@@ -15,6 +15,7 @@
 
 <script>
 import logoImg from '@/assets/images/logo@2xS.png'
+import logoYTImg from '@/assets/images/logo@2xSYT.png'
 import variables from '@/assets/styles/variables.scss'
 
 export default {
@@ -35,8 +36,9 @@ export default {
   },
   data() {
     return {
-      title: '中正-云教育业务系统',
-      logo: logoImg
+      title: '祥粤云学堂',
+      logo: logoImg,
+      logoYT:logoYTImg,
     }
   }
 }
@@ -66,8 +68,8 @@ export default {
     width: 100%;
 
     & .sidebar-logo {
-      width: 24px;
-      height: 16px;
+      width: 27px;
+      height: 27px;
       vertical-align: middle;
       margin-right: 12px;
     }
@@ -76,10 +78,10 @@ export default {
       display: inline-block;
       margin: 0;
       color: #fff;
-      font-weight: 600;
+      font-weight: bold;
       line-height: 50px;
       font-size: 14px;
-      font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
+      font-family: Microsoft YaHei;
       vertical-align: middle;
     }
   }

+ 8 - 0
src/newApi/festival.js

@@ -16,6 +16,14 @@ export default {
             data
         })
     },
+    //导入节模板
+    drCourseSectionimportData(data) {
+        return request({
+            url: '/course/section/importData',
+            method: 'post',
+            data
+        })
+    },
     //查询课程小节列表
     inquireCourseSection(data) {
         return request({

+ 8 - 0
src/newApi/polyv.js

@@ -8,6 +8,14 @@ export default {
             params: data
         })
     },
+    //查询保利威视频分类
+    obtainpolyvvideosignlistCata(data) {
+        return request({
+            url: '/polyv/video/listCata',
+            method: 'get',
+            params: data
+        })
+    },
     //获取保利威视频播放凭证
     obtainpolyvvideosign(data) {
         return request({

+ 4 - 1
src/permission.js

@@ -13,13 +13,16 @@ const whiteList = ['/login', '/auth-redirect', '/bind', '/register']
 router.beforeEach((to, from, next) => {
   if (to.path !== from.path) {
     NProgress.start();
-}
+  }
   if (methods.getQueryVariable('TenantId') && !sessionStorage.TenantId) {
     sessionStorage.TenantId = methods.getQueryVariable('TenantId')
   }
   if (methods.getQueryVariable('TenantId') && sessionStorage.TenantId == undefined) {
     sessionStorage.TenantId = methods.getQueryVariable('TenantId')
   }
+  if (methods.getQueryVariable('TenantId') && sessionStorage.TenantId != methods.getQueryVariable('TenantId')) {
+    sessionStorage.TenantId = methods.getQueryVariable('TenantId')
+  }
   if (getToken()) {
     to.meta.title && store.dispatch('settings/setTitle', to.meta.title)
     /* has token*/

+ 4 - 4
src/store/getters.js

@@ -193,16 +193,16 @@ const getters = {
     }
     return state.dict.classList
   },
-  examList(state){
-    if(!state.dict.examList){
+  examList(state) {
+    if (!state.dict.examList) {
       api.inquiresystemapplyList({ status: 1 }).then(res => {
         state.dict.examList = res.rows
       })
     }
     return state.dict.examList
   },
-  beforeList(state){
-    if(!state.dict.beforeList){
+  beforeList(state) {
+    if (!state.dict.beforeList) {
       api.inquiresystembefore({ status: 1 }).then(res => {
         state.dict.beforeList = res.rows
       })

+ 0 - 3
src/store/modules/dict.js

@@ -156,9 +156,6 @@ const mutations = {
       state.classList = res.rows
     })
   },
-
-
-
   //更新考试安排
   EXAMLIST(state){
     api.inquiresystemapplyList({status:1}).then(res => {

+ 8 - 8
src/utils/index.js

@@ -5,12 +5,12 @@ import { parseTime } from './ruoyi'
  */
 export function formatDate(cellValue) {
   if (cellValue == null || cellValue == "") return "";
-  var date = new Date(cellValue) 
+  var date = new Date(cellValue)
   var year = date.getFullYear()
   var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
-  var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate() 
-  var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours() 
-  var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes() 
+  var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
+  var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
+  var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
   var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
   return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
 }
@@ -218,7 +218,7 @@ export function getTime(type) {
 export function debounce(func, wait, immediate) {
   let timeout, args, context, timestamp, result
 
-  const later = function() {
+  const later = function () {
     // 据上一次触发时间间隔
     const last = +new Date() - timestamp
 
@@ -235,7 +235,7 @@ export function debounce(func, wait, immediate) {
     }
   }
 
-  return function(...args) {
+  return function (...args) {
     context = this
     timestamp = +new Date()
     const callNow = immediate && !timeout
@@ -330,7 +330,7 @@ export function makeMap(str, expectsLowerCase) {
     ? val => map[val.toLowerCase()]
     : val => map[val]
 }
- 
+
 export const exportDefault = 'export default '
 
 export const beautifierConf = {
@@ -387,4 +387,4 @@ export function camelCase(str) {
 export function isNumberStr(str) {
   return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str)
 }
- 
+

+ 18 - 19
src/utils/methodsTool.js

@@ -1,9 +1,8 @@
-// const BASE_IMG_URL = 'https://file.xyyxt.net'
-export const BASE_IMG_URL = 'https://file-dev.xyyxt.net'
+import * as baseUrls from "@/utils/request.js";
 import router from '@/router/index'//引入路由对象
 export default {
 	getUrl() {
-		return BASE_IMG_URL + '/'
+		return baseUrls.BASE_IMG_URL + '/'
 	},
 	isLogin() {
 		if (uni.getStorageSync('union_id')) {
@@ -19,7 +18,7 @@ export default {
 		if (url.indexOf("http") != -1 || url.indexOf("https") != -1 || url.indexOf("base64") != -1) {
 			return url;
 		}
-		return BASE_IMG_URL + '/' + url
+		return baseUrls.BASE_IMG_URL + '/' + url
 	},
 	onlyForma(timeStamp, Diszing = true) {
 		if (!timeStamp) {
@@ -105,11 +104,11 @@ export default {
 	},
 	//计算两个时间之间的时间差 多少天时分秒
 	newTime(endTime) {
-		if(!endTime){
+		if (!endTime) {
 			return '-'
 		}
 		var date1 = (Date.parse(new Date())) / 1000; //开始时间
-		if(date1 > endTime){
+		if (date1 > endTime) {
 			return '0'
 		}
 		var date2 = endTime; //结束时间
@@ -129,7 +128,7 @@ export default {
 
 		var leave3 = leave2 % (60 * 1000); //计算分钟数后剩余的毫秒数
 		var seconds = Math.round(leave3 / 1000);
-		return   days + "天" + hours + "小时" + minutes + "分钟" + seconds + "秒"
+		return days + "天" + hours + "小时" + minutes + "分钟" + seconds + "秒"
 		// return days
 	},
 	/**
@@ -138,17 +137,17 @@ export default {
 	 * @returns {string}
 	 * @remard 单位S转小时分钟秒
 	 */
-	secondToDate(result){
-		var h = Math.floor(result / 3600) < 10 ? '0'+Math.floor(result / 3600) : Math.floor(result / 3600);
+	secondToDate(result) {
+		var h = Math.floor(result / 3600) < 10 ? '0' + Math.floor(result / 3600) : Math.floor(result / 3600);
 		var m = Math.floor((result / 60 % 60)) < 10 ? '0' + Math.floor((result / 60 % 60)) : Math.floor((result / 60 % 60));
 		var s = Math.floor((result % 60)) < 10 ? '0' + Math.floor((result % 60)) : Math.floor((result % 60));
-			if(h==0){
-				result = m + ":" + s;
-			}else{
-				result = h+':'+m + ":" + s
-			}
+		if (h == 0) {
+			result = m + ":" + s;
+		} else {
+			result = h + ':' + m + ":" + s
+		}
 		return result;
-},
+	},
 	//JS计算两个时间戳相差月数、天数、时数、分钟、秒数
 	humandate(time1, time2) {
 		// var time1 = Date.parse(new Date()) / 1000;
@@ -173,11 +172,11 @@ export default {
 		// }
 	},
 	//判断是否过期 true过期 false未过期
-	expiredTime(items){
-		var currentTime = parseInt(Date.parse(new Date())/1000)
-		if(currentTime > items){
+	expiredTime(items) {
+		var currentTime = parseInt(Date.parse(new Date()) / 1000)
+		if (currentTime > items) {
 			return true
-		}else{
+		} else {
 			return false
 		}
 	},

+ 71 - 0
src/utils/polyvError.js

@@ -0,0 +1,71 @@
+/**
+ * 
+ * @param {String} str 
+ * @returns 错误提示
+ */
+export function returnTitle(str) {
+    let title = ''
+    switch (str) {
+        case '#001':
+            title = '套餐过期,请联系客服续期。'
+            break;
+        case '#002':
+            title = '套餐内流量已用完,请联系客服购买流量。'
+            break;
+        case '#003':
+            title = '视频配置文件加载失败。一般是由于网络问题导致无法加载视频配置文件,建议检查/切换网络并重试。'
+            break;
+        case '#004':
+            title = '视频不存在。请检查vid是否正确,视频是否已经被删除。'
+            break;
+        case '#005':
+            title = '视频审核不通过。只有“已发布”状态的视频才可以播放。'
+            break;
+        case '#006':
+            title = '域名黑白名单验证不通过。请检查管理后台的播放域名设置。'
+            break;
+        case '#007':
+            title = '视频文件加载失败。一般是由于网络问题导致无法加载视频文件,建议检查/切换网络并重试。'
+            break;
+        case '#008':
+            title = '视频文件加载超时。一般是由于网络问题导致加载视频文件超时,建议检查/切换网络并重试。'
+            break;
+        case '#009':
+            title = '视频正在审核中。只有“已发布”状态的视频才可以播放。'
+            break;
+        case '#010':
+            title = '视频正在编码中。只有“已发布”状态的视频才可以播放。'
+            break;
+        case '#011':
+            title = '播放器皮肤加载失败。建议检查/切换网络并重试。'
+            break;
+        case '#012':
+            title = '跑马灯加载错误。请检查跑马灯接口返回的参数是否正确。'
+            break;
+        case '#013':
+            title = '视频授权播放认证失败。请检查授权认证接口。'
+            break;
+        case '#014':
+            title = 'Flash播放器没有JavaScript运行权限。请尝试升级浏览器至最新版本或更换浏览器。'
+            break;
+        case '#015':
+            title = 'JavaScript运行错误。请尝试升级浏览器至最新版本或更换浏览器。'
+            break;
+        case '#016':
+            title = '跑马灯被篡改。'
+            break;
+        case '#020':
+            title = 'playsafeUrl接口请求失败。请检查playsafeUrl参数的接口服务是否正常。'
+            break;
+        case '#024':
+            title = '基于视频版权保护考虑,播放器会禁止加密视频在某些自带录屏功能的浏览器上播放。请更换其它浏览器。'
+            break;
+        case '#10000':
+            title = '视频被禁止播放,请联系管理员'
+            break;
+        default:
+            title = '未知错误,请联系管理员'
+            break;
+    }
+    return title
+}

+ 11 - 7
src/utils/request.js

@@ -7,15 +7,19 @@ import methods from '@/utils/methodsTool';
 
 axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
 // 创建axios实例
-// export const baseURL = 'http://192.168.1.222:5030/'
-export const baseURL = 'http://192.168.1.222/'
+/**
+ * @remard 线上地址
+ */
+// export const baseURL = 'https://cloud.xyyxt.net/'
+// export const BASE_IMG_URL = 'https://file.xyyxt.net'
+/**
+ * @remard 测试地址
+ */
+export const baseURL = 'http://192.168.1.222:5030/'
+export const BASE_IMG_URL = 'https://file-dev.xyyxt.net'
 const service = axios.create({
   // axios中请求配置有baseURL选项,表示请求URL公共部分
-  // baseURL: 'http://192.168.1.24:5030/',
   baseURL: baseURL,
-  // baseURL: process.env.VUE_APP_BASE_API,
-  // baseURL: 'https://cloud.xyyxt.net/',
-
   // 超时
   timeout: 10000
 })
@@ -26,7 +30,7 @@ service.interceptors.request.use(config => {
   if (getToken() && !isToken) {
     config.headers['AuthorizationToken'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
   }
-  config.headers.TenantId = sessionStorage.TenantId || methods.getQueryVariable('TenantId')
+    config.headers.TenantId = sessionStorage.TenantId || methods.getQueryVariable('TenantId')
   // get请求映射params参数
   if (config.method === 'get' && config.params) {
     let url = config.url + '?';

+ 133 - 381
src/views/Marketing/commodityManageMent/add/index.vue → src/views/Marketing/goods/commodityManageMent/add/index.vue

@@ -39,7 +39,7 @@
               <el-select
                 v-model="listData.goodsType"
                 placeholder="请选择商品类型"
-                @change="listData.studyTimeArrays = []"
+                @change="changeTypes"
               >
                 <el-option
                   v-for="(item, index) in goodsTypeOptions"
@@ -487,8 +487,31 @@
         </el-table>
       </div>
       <div v-if="listData.goodsType === 1 || listData.goodsType === 2">
-        <el-form label-position="right" label-width="110px">
-          <el-form-item label="学习有效期" required style="margin-top: 12px">
+        <el-form
+          label-position="right"
+          label-width="110px"
+          :model="listData"
+          :rules="rulesMors3"
+          ref="listData3"
+        >
+          <el-form-item
+            label="学习机会"
+            style="margin-top: 12px"
+            prop="studyCount"
+          >
+            <el-input-number
+              v-model="listData.studyCount"
+              :controls="false"
+              controls-position="right"
+              :min="1"
+              :precision="0"
+            ></el-input-number>
+          </el-form-item>
+          <el-form-item
+            label="学习有效期"
+            style="margin-top: 12px"
+            prop="studyTimeArrays"
+          >
             <el-date-picker
               v-model="listData.studyTimeArrays"
               type="datetimerange"
@@ -1097,7 +1120,7 @@
     </el-dialog>
     <el-dialog
       :visible.sync="dialogPhoto"
-      width="780px"
+      width="980px"
       :show-close="false"
       :close-on-click-modal="false"
     >
@@ -1138,113 +1161,56 @@
         </div>
         <div style="width: 1px; background-color: #666; margin: 0px 14px"></div>
         <div>
-          <h4>课程节-拍照</h4>
+          <h4>课程节-点播拍照</h4>
           <div>
             <el-radio-group
               v-model="photoVideoList.photographConfig.photograph"
             >
-              <el-radio
-                :label="1"
-                @change="photoVideoList.photographConfig.intervalTime = [0]"
-                >是</el-radio
-              >
-              <el-radio
-                :label="0"
-                @change="photoVideoList.photographConfig.intervalTime = []"
-                >否</el-radio
-              >
+              <el-radio :label="1">是</el-radio>
+              <el-radio :label="0" @change="photoVideoList.photographConfig.photoNum = ''">否</el-radio>
             </el-radio-group>
-            <el-button
+          </div>
+          <div v-if="photoVideoList.photographConfig.photograph === 1">
+            拍照数量:<el-input-number
+              :min="1"
+              :controls="false"
+              :precision="0"
+              v-model="photoVideoList.photographConfig.photoNum"
+              style="width: 60px"
               size="mini"
-              style="margin-left: 10px"
-              v-if="photoVideoList.photographConfig.photograph === 1"
-              @click="photoVideoList.photographConfig.intervalTime.push(0)"
-              >添加</el-button
-            >
+            ></el-input-number
+            >张
           </div>
-          <ul v-if="photoVideoList.photographConfig.photograph === 1">
-            <li
-              v-for="(items, indexs) in photoVideoList.photographConfig
-                .intervalTime"
-              :key="indexs"
+        </div>
+        <div style="width: 1px; background-color: #666; margin: 0px 14px"></div>
+        <div>
+          <h4>课程节-直播拍照</h4>
+          <div>
+            <el-radio-group
+              v-model="photoVideoList.photographConfig.livephotograph"
             >
-              播放至<el-input-number
-                :min="0"
-                :controls="false"
-                v-model="photoVideoList.photographConfig.intervalTime[indexs]"
-                style="width: 60px"
-                :precision="2"
-                size="mini"
-              ></el-input-number
-              >分钟
-              <el-button
-                type="text"
-                @click="
-                  photoVideoList.photographConfig.intervalTime.splice(indexs, 1)
-                "
-                >删除</el-button
-              >
-            </li>
-          </ul>
+              <el-radio :label="1">是</el-radio>
+              <el-radio :label="0">否</el-radio>
+            </el-radio-group>
+          </div>
+          <div v-if="photoVideoList.photographConfig.livephotograph === 1">
+            学习开始,就拍照,只拍1张照片
+          </div>
         </div>
         <div style="width: 1px; background-color: #000; margin: 0px 14px"></div>
         <div>
-          <h4>课程章节-关联题卷-拍照</h4>
+          <h4>课程章节-章测试卷-拍照</h4>
           <div>
             <el-radio-group
               v-model="photoVideoList.goodsPhotographExamConfig.photograph"
             >
-              <el-radio
-                :label="1"
-                >是</el-radio
-              >
-              <el-radio
-                :label="0"
-                @change="
-                  photoVideoList.goodsPhotographExamConfig.intervalTime = []
-                "
-                >否</el-radio
-              >
+              <el-radio :label="1">是</el-radio>
+              <el-radio :label="0">否</el-radio>
             </el-radio-group>
-            <!-- <el-button
-              size="mini"
-              style="margin-left: 10px"
-              v-if="photoVideoList.goodsPhotographExamConfig.photograph === 1"
-              @click="
-                photoVideoList.goodsPhotographExamConfig.intervalTime.push(0)
-              "
-              >添加</el-button
-            > -->
           </div>
-          <!-- <ul v-if="photoVideoList.goodsPhotographExamConfig.photograph === 1">
-            <li
-              v-for="(items, indexs) in photoVideoList.goodsPhotographExamConfig
-                .intervalTime"
-              :key="indexs"
-            >
-              做题至第<el-input-number
-                :controls="false"
-                :min="0"
-                :precision="0"
-                v-model="
-                  photoVideoList.goodsPhotographExamConfig.intervalTime[indexs]
-                "
-                style="width: 60px"
-                size="mini"
-              ></el-input-number
-              >题
-              <el-button
-                type="text"
-                @click="
-                  photoVideoList.goodsPhotographExamConfig.intervalTime.splice(
-                    indexs,
-                    1
-                  )
-                "
-                >删除</el-button
-              >
-            </li>
-          </ul> -->
+          <div v-if="photoVideoList.goodsPhotographExamConfig.photograph === 1">
+            学习开始,就拍照,只拍1张照片
+          </div>
         </div>
       </div>
       <span slot="footer" class="dialog-footer">
@@ -1336,15 +1302,6 @@
 </template>
 
 <script>
-import {
-  listConfig,
-  getConfig,
-  delConfig,
-  addConfig,
-  updateConfig,
-  exportConfig,
-  refreshCache,
-} from "@/api/system/config";
 import searchBoxNew from "@/components/searchBoxNew";
 import poppleSet from "../poppleSet.vue";
 import poppleSetTk from "../poppleSetTK.vue";
@@ -1363,11 +1320,11 @@ export default {
         },
         photographConfig: {
           photograph: 0,
-          intervalTime: [],
+          photoNum: "",
+          livephotograph: 0,
         },
         goodsPhotographExamConfig: {
           photograph: 0,
-          intervalTime: [],
         },
       }, //播放和拍照设置---暂存
       dialogPhoto: false,
@@ -1385,6 +1342,8 @@ export default {
         certificateIds: [],
         makeGoodsId: "",
         studyTimeArrays: [],
+        timeArrays: [],
+        studyCount: 1,
       },
 
       eduTypeOptions: [], //教育类型数据
@@ -1414,7 +1373,6 @@ export default {
           value: 4,
         },
       ], //商品类型
-
       newCourTypeOptions: [], //当前业务层次数据
       newSujectOption: [], //当前科目数据数据
       newSchoolOption: [], //当前院校数据
@@ -1479,20 +1437,6 @@ export default {
             trigger: ["blur", "change"],
           },
         ],
-        // schoolId: [
-        //   {
-        //     required: true,
-        //     message: "请选择院校",
-        //     trigger: ["blur", "change"],
-        //   },
-        // ],
-        // majorId: [
-        //   {
-        //     required: true,
-        //     message: "请选择专业",
-        //     trigger: ["blur", "change"],
-        //   },
-        // ],
         subjectId: [
           {
             required: true,
@@ -1600,6 +1544,13 @@ export default {
             trigger: ["blur", "change"],
           },
         ],
+        studyTimeArrays: [
+          {
+            required: true,
+            message: "请选择有效期",
+            trigger: ["blur", "change"],
+          },
+        ],
       },
       activeGoodsBoxs: false,
       goodsList: [],
@@ -1633,36 +1584,6 @@ export default {
         status: 1,
       },
       formListjy: [
-        // {
-        //   prop: "educationTypeId",
-        //   placeholder: "教育类型",
-        //   scope: "educationType",
-        // },
-        // {
-        //   prop: "businessId",
-        //   placeholder: "业务层次",
-        //   scope: "businessLevel",
-        //   edu: "educationTypeId",
-        // },
-        // {
-        //   prop: "status",
-        //   placeholder: "发布状态",
-        //   scope: "select",
-        //   options: [
-        //     {
-        //       label: "全部状态",
-        //       value: "0,1",
-        //     },
-        //     {
-        //       label: "已发布",
-        //       value: 1,
-        //     },
-        //     {
-        //       label: "未发布",
-        //       value: 0,
-        //     },
-        //   ],
-        // },
         {
           prop: "key",
           placeholder: "请输入讲义标题/讲义编码",
@@ -1679,29 +1600,6 @@ export default {
         names: "",
       },
       formList3: [
-        // {
-        //   prop: "educationTypeId",
-        //   placeholder: "教育类型",
-        //   scope: "educationType",
-        // },
-        // {
-        //   prop: "businessId",
-        //   placeholder: "业务层次",
-        //   scope: "businessLevel",
-        //   edu: "educationTypeId",
-        // },
-        // {
-        //   prop: "schoolId",
-        //   placeholder: "院校",
-        //   scope: "schoolList",
-        //   edu: "educationTypeId",
-        // },
-        // {
-        //   prop: "majorId",
-        //   placeholder: "专业",
-        //   scope: "Professional",
-        //   edu: "educationTypeId",
-        // },
         {
           prop: "examType",
           placeholder: "题卷类型",
@@ -1912,86 +1810,52 @@ export default {
     this.getDict();
   },
   mounted() {
-    listConfig().then((res) => {
-      this.copySetInfo = JSON.parse(JSON.stringify(res.rows));
-      for (let i = 0; i < res.rows.length; i++) {
-        if (res.rows[i].configKey == "sys.play.autoPlay") {
-          //自动播放
-          this.photoVideoList.playConfig.autoPlay = Number(
-            res.rows[i].configValue
-          );
-        }
-        if (res.rows[i].configKey == "sys.play.drag") {
-          //"进度条拖拉"
-          this.photoVideoList.playConfig.drag = Number(res.rows[i].configValue);
-        }
-        if (res.rows[i].configKey == "sys.play.speed") {
-          //"倍速播放"
-          this.$set(
-            this.photoVideoList.playConfig,
-            "speed",
-            Number(res.rows[i].configValue)
-          );
-        }
-        if (res.rows[i].configKey == "sys.course.photograph") {
-          //"课程拍照"
-          this.photoVideoList.photographConfig.photograph = Number(
-            res.rows[i].configValue
-          );
-        }
-        if (res.rows[i].configKey == "sys.course.intervalTime") {
-          //"间隔时间设置"
-          if (res.rows[i].configValue) {
-            this.photoVideoList.photographConfig.intervalTime = res.rows[
-              i
-            ].configValue
-              .split(",")
-              .map(Number);
-          }
-        }
-        if (res.rows[i].configKey == "sys.paper.photograph") {
-          //"章节试卷拍照"
-          this.photoVideoList.goodsPhotographExamConfig.photograph = Number(
-            res.rows[i].configValue
-          );
-        }
-        if (res.rows[i].configKey == "sys.paper.intervalNumber") {
-          //"间隔数量设置"
-          if (res.rows[i].configValue) {
-            this.photoVideoList.goodsPhotographExamConfig.intervalTime =
-              res.rows[i].configValue.split(",").map(Number);
-          }
-        }
-      }
-    });
     // this.getJyData();
   },
   methods: {
-    zhText(param){
-        const { columns, data } = param;
-        const sums = [];
-        columns.forEach((column, index) => {
-          if (index === 0) {
-            sums[index] = '总价';
-            return;
-          }
-          const values = data.map(item => Number(item[column.property]));
-          if (!values.every(value => isNaN(value))) {
-            sums[index] = values.reduce((prev, curr) => {
-              const value = Number(curr);
-              if (!isNaN(value)) {
-                return prev + curr;
-              } else {
-                return prev;
-              }
-            }, 0);
-            sums[index] = '¥' + sums[index];
-          } else {
-            sums[index] = '';
-          }
-        });
+    changeTypes() {
+      this.listData.studyCount = 1;
+      if (this.listData.goodsType === 3 || this.listData.goodsType === 4) {
+        this.listData.timeArrays = [
+          new Date().getTime(),
+          new Date().getTime() + 365 * 3 * 24 * 3600 * 1000,
+        ];
+      } else {
+        this.listData.timeArrays = [
+          new Date().getTime(),
+          new Date().getTime() + 365 * 3 * 24 * 3600 * 1000,
+        ];
+        this.listData.studyTimeArrays = [
+          new Date().getTime(),
+          new Date().getTime() + 365 * 3 * 24 * 3600 * 1000,
+        ];
+      }
+    },
+    zhText(param) {
+      const { columns, data } = param;
+      const sums = [];
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = "总价";
+          return;
+        }
+        const values = data.map((item) => Number(item[column.property]));
+        if (!values.every((value) => isNaN(value))) {
+          sums[index] = values.reduce((prev, curr) => {
+            const value = Number(curr);
+            if (!isNaN(value)) {
+              return prev + curr;
+            } else {
+              return prev;
+            }
+          }, 0);
+          sums[index] = "¥" + sums[index];
+        } else {
+          sums[index] = "";
+        }
+      });
 
-        return sums;
+      return sums;
     },
     changeDataTime(arr) {
       if (arr && arr[0] === arr[1]) {
@@ -2074,76 +1938,6 @@ export default {
     },
     //打开播放和拍照设置窗口
     openPZ() {
-      if (this.listData.playConfig) {
-        this.photoVideoList.playConfig = JSON.parse(
-          JSON.stringify(this.listData.playConfig)
-        );
-      } else {
-        for (let i = 0; i < this.copySetInfo.length; i++) {
-          if (this.copySetInfo[i].configKey == "sys.play.autoPlay") {
-            //自动播放
-            this.photoVideoList.playConfig.autoPlay = Number(
-              this.copySetInfo[i].configValue
-            );
-          }
-          if (this.copySetInfo[i].configKey == "sys.play.drag") {
-            //"进度条拖拉"
-            this.photoVideoList.playConfig.drag = Number(
-              this.copySetInfo[i].configValue
-            );
-          }
-          if (this.copySetInfo[i].configKey == "sys.play.speed") {
-            //"倍速播放"
-            this.$set(
-              this.photoVideoList.playConfig,
-              "speed",
-              Number(this.copySetInfo[i].configValue)
-            );
-          }
-        }
-      }
-      if (this.listData.photographConfig) {
-        this.photoVideoList.photographConfig = JSON.parse(
-          JSON.stringify(this.listData.photographConfig)
-        );
-      } else {
-        for (let i = 0; i < this.copySetInfo.length; i++) {
-          if (this.copySetInfo[i].configKey == "sys.course.photograph") {
-            //"课程拍照"
-            this.photoVideoList.photographConfig.photograph = Number(
-              this.copySetInfo[i].configValue
-            );
-          }
-          if (this.copySetInfo[i].configKey == "sys.course.intervalTime") {
-            //"间隔时间设置"
-            if (this.copySetInfo[i].configValue) {
-              this.photoVideoList.photographConfig.intervalTime =
-                this.copySetInfo[i].configValue.split(",").map(Number);
-            }
-          }
-        }
-      }
-      if (this.listData.goodsPhotographExamConfig) {
-        this.photoVideoList.goodsPhotographExamConfig = JSON.parse(
-          JSON.stringify(this.listData.goodsPhotographExamConfig)
-        );
-      } else {
-        for (let i = 0; i < this.copySetInfo.length; i++) {
-          if (this.copySetInfo[i].configKey == "sys.paper.photograph") {
-            //"章节试卷拍照"
-            this.photoVideoList.goodsPhotographExamConfig.photograph = Number(
-              this.copySetInfo[i].configValue
-            );
-          }
-          if (this.copySetInfo[i].configKey == "sys.paper.intervalNumber") {
-            //"间隔数量设置"
-            if (this.copySetInfo[i].configValue) {
-              this.photoVideoList.goodsPhotographExamConfig.intervalTime =
-                this.copySetInfo[i].configValue.split(",").map(Number);
-            }
-          }
-        }
-      }
       if (this.listData.playConfig) {
         this.photoVideoList.playConfig = JSON.parse(
           JSON.stringify(this.listData.playConfig)
@@ -2162,7 +1956,8 @@ export default {
       } else {
         this.photoVideoList.photographConfig = {
           photograph: 0,
-          intervalTime: [],
+          photoNum: "",
+          livephotograph: 0,
         };
       }
       if (this.listData.goodsPhotographExamConfig) {
@@ -2172,7 +1967,6 @@ export default {
       } else {
         this.photoVideoList.goodsPhotographExamConfig = {
           photograph: 0,
-          intervalTime: [],
         };
       }
       this.dialogPhoto = true;
@@ -2181,53 +1975,11 @@ export default {
     submitPhoto() {
       if (
         this.photoVideoList.photographConfig.photograph === 1 &&
-        !this.photoVideoList.photographConfig.intervalTime.length
+        !this.photoVideoList.photographConfig.photoNum
       ) {
-        this.$message.warning("至少添加一条“课程节-拍照”");
+        this.$message.warning("请输入拍照数量");
         return;
       }
-      /**
-       * if (
-        this.photoVideoList.goodsPhotographExamConfig.photograph === 1 &&
-        !this.photoVideoList.goodsPhotographExamConfig.intervalTime.length
-      ) {
-        this.$message.warning("至少添加一条“课程章节-关联题卷-拍照”");
-        return;
-      }
-       */
-      if (
-        this.photoVideoList.photographConfig.photograph === 1 &&
-        this.photoVideoList.photographConfig.intervalTime.length
-      ) {
-        const idsSet = new Set(
-          this.photoVideoList.photographConfig.intervalTime
-        );
-        if (
-          idsSet.size ==
-          this.photoVideoList.photographConfig.intervalTime.length
-        ) {
-          // this.$message.warning("拍照存在相同时间点,请重新设置");
-        } else {
-          this.$message.warning("课程节-拍照存在相同时间点,请重新设置");
-          return;
-        }
-      }
-      // if (
-      //   this.photoVideoList.goodsPhotographExamConfig.photograph === 1 &&
-      //   this.photoVideoList.goodsPhotographExamConfig.intervalTime.length
-      // ) {
-      //   const idsSet = new Set(
-      //     this.photoVideoList.goodsPhotographExamConfig.intervalTime
-      //   );
-      //   if (
-      //     idsSet.size ==
-      //     this.photoVideoList.goodsPhotographExamConfig.intervalTime.length
-      //   ) {
-      //   } else {
-      //     this.$message.warning("关联题卷-拍照存在相同时间点,请重新设置");
-      //     return;
-      //   }
-      // }
       this.listData.playConfig = this.photoVideoList.playConfig;
       this.listData.photographConfig = this.photoVideoList.photographConfig;
       this.listData.goodsPhotographExamConfig =
@@ -2490,9 +2242,7 @@ export default {
           this.$message.error("请上传节封面");
           return false;
         }
-        if (this.listData.goodsType === 3 || this.listData.goodsType === 4) {
-          await this.rulesForms("listData3");
-        }
+        await this.rulesForms("listData3");
         //保存表单
         this.rulesTableSumbit(int);
       }
@@ -2523,6 +2273,16 @@ export default {
           this.disabledBtn = false;
           return;
         } else {
+          if (
+            this.listData.timeArrays[0] < this.listData.studyTimeArrays[0] ||
+            this.listData.timeArrays[1] > this.listData.studyTimeArrays[1]
+          ) {
+            this.$message.warning(
+              "商品有效期范围必须包含在学习有效期范围内,请重新调整"
+            );
+            this.disabledBtn = false;
+            return;
+          }
           datas.studyStartTime = this.$methodsTools.time10to13(
             this.listData.studyTimeArrays[0],
             1
@@ -2570,14 +2330,6 @@ export default {
       delete datas.timeArrays;
       delete datas.studyTimeArrays;
       if (this.listData.goodsType === 1) {
-        if (datas.photographConfig) {
-          datas.photographConfig.intervalTime =
-            datas.photographConfig.intervalTime.toString();
-        }
-        if (datas.goodsPhotographExamConfig) {
-          datas.goodsPhotographExamConfig.intervalTime =
-            datas.goodsPhotographExamConfig.intervalTime.toString();
-        }
         for (let i = 0; i < this.tableData.length; i++) {
           if (!this.tableData[i].sort && this.tableData[i].sort !== 0) {
             this.$message.warning(`课程内容第${i + 1}条请输入排序`);
@@ -2602,11 +2354,11 @@ export default {
         });
         var auditionListArray = [];
         this.auditionList.map((item) => {
-            auditionListArray.push({
-              auditionMinute: item.auditionMinute,
-              courseId: item.courseId,
-              sectionId: item.menuId,
-            });
+          auditionListArray.push({
+            auditionMinute: item.auditionMinute,
+            courseId: item.courseId,
+            sectionId: item.menuId,
+          });
         });
         datas.auditionList = auditionListArray;
         datas.courseList = courseIdList;

+ 118 - 385
src/views/Marketing/commodityManageMent/edit/index.vue → src/views/Marketing/goods/commodityManageMent/edit/index.vue

@@ -133,8 +133,7 @@
                 class="numInputs"
                 type="age"
                 v-model.number="listData.classHours"
-                ></el-input
-              >
+              ></el-input>
             </el-form-item>
             <!-- <el-form-item
               label="科目/类目"
@@ -491,8 +490,32 @@
         </el-table>
       </div>
       <div v-if="listData.goodsType === 1 || listData.goodsType === 2">
-        <el-form label-position="right" label-width="110px">
-          <el-form-item label="学习有效期" required style="margin-top: 12px">
+        <el-form
+          label-position="right"
+          label-width="110px"
+          :model="listData"
+          :rules="rulesMors3"
+          ref="listData3"
+        >
+          <el-form-item
+            label="学习机会"
+            style="margin-top: 12px"
+            prop="studyCount"
+          >
+            <el-input-number
+              v-model="listData.studyCount"
+              :controls="false"
+              controls-position="right"
+              :min="copyNums"
+              :precision="0"
+            ></el-input-number>
+          </el-form-item>
+          <el-form-item
+            label="学习有效期"
+            required
+            style="margin-top: 12px"
+            prop="studyTimeArrays"
+          >
             <el-date-picker
               v-model="listData.studyTimeArrays"
               type="datetimerange"
@@ -1109,7 +1132,7 @@
     </el-dialog>
     <el-dialog
       :visible.sync="dialogPhoto"
-      width="780px"
+      width="980px"
       :show-close="false"
       :close-on-click-modal="false"
     >
@@ -1150,113 +1173,56 @@
         </div>
         <div style="width: 1px; background-color: #666; margin: 0px 14px"></div>
         <div>
-          <h4>课程节-拍照</h4>
+          <h4>课程节-点播拍照</h4>
           <div>
             <el-radio-group
               v-model="photoVideoList.photographConfig.photograph"
             >
-              <el-radio
-                :label="1"
-                @change="photoVideoList.photographConfig.intervalTime.push(0)"
-                >是</el-radio
-              >
-              <el-radio
-                :label="0"
-                @change="photoVideoList.photographConfig.intervalTime = []"
-                >否</el-radio
-              >
+              <el-radio :label="1">是</el-radio>
+              <el-radio :label="0" @change="photoVideoList.photographConfig.photoNum = ''">否</el-radio>
             </el-radio-group>
-            <el-button
+          </div>
+          <div v-if="photoVideoList.photographConfig.photograph === 1">
+            拍照数量:<el-input-number
+              :min="1"
+              :controls="false"
+              :precision="0"
+              v-model="photoVideoList.photographConfig.photoNum"
+              style="width: 60px"
               size="mini"
-              style="margin-left: 10px"
-              v-if="photoVideoList.photographConfig.photograph === 1"
-              @click="photoVideoList.photographConfig.intervalTime.push(0)"
-              >添加</el-button
-            >
+            ></el-input-number
+            >张
           </div>
-          <ul>
-            <li
-              v-for="(items, indexs) in photoVideoList.photographConfig
-                .intervalTime"
-              :key="indexs"
+        </div>
+        <div style="width: 1px; background-color: #666; margin: 0px 14px"></div>
+        <div>
+          <h4>课程节-直播拍照</h4>
+          <div>
+            <el-radio-group
+              v-model="photoVideoList.photographConfig.livephotograph"
             >
-              播放至<el-input-number
-                :min="0"
-                :controls="false"
-                :precision="2"
-                v-model="photoVideoList.photographConfig.intervalTime[indexs]"
-                style="width: 60px"
-                size="mini"
-              ></el-input-number
-              >分钟
-              <el-button
-                type="text"
-                @click="
-                  photoVideoList.photographConfig.intervalTime.splice(indexs, 1)
-                "
-                >删除</el-button
-              >
-            </li>
-          </ul>
+              <el-radio :label="1">是</el-radio>
+              <el-radio :label="0">否</el-radio>
+            </el-radio-group>
+          </div>
+          <div v-if="photoVideoList.photographConfig.livephotograph === 1">
+            学习开始,就拍照,只拍1张照片
+          </div>
         </div>
         <div style="width: 1px; background-color: #000; margin: 0px 14px"></div>
         <div>
-          <h4>课程章节-关联题卷-拍照</h4>
+          <h4>课程章节-章测试卷-拍照</h4>
           <div>
             <el-radio-group
               v-model="photoVideoList.goodsPhotographExamConfig.photograph"
             >
-              <el-radio
-                :label="1"
-                >是</el-radio
-              >
-              <el-radio
-                :label="0"
-                @change="
-                  photoVideoList.goodsPhotographExamConfig.intervalTime = []
-                "
-                >否</el-radio
-              >
+              <el-radio :label="1">是</el-radio>
+              <el-radio :label="0">否</el-radio>
             </el-radio-group>
-            <!-- <el-button
-              size="mini"
-              style="margin-left: 10px"
-              v-if="photoVideoList.goodsPhotographExamConfig.photograph === 1"
-              @click="
-                photoVideoList.goodsPhotographExamConfig.intervalTime.push(0)
-              "
-              >添加</el-button
-            > -->
           </div>
-          <!-- <ul>
-            <li
-              v-for="(items, indexs) in photoVideoList.goodsPhotographExamConfig
-                .intervalTime"
-              :key="indexs"
-            >
-              做题至第<el-input-number
-                :controls="false"
-                :min="0"
-                :precision="0"
-                v-model="
-                  photoVideoList.goodsPhotographExamConfig.intervalTime[indexs]
-                "
-                style="width: 60px"
-                size="mini"
-              ></el-input-number
-              >题
-              <el-button
-                type="text"
-                @click="
-                  photoVideoList.goodsPhotographExamConfig.intervalTime.splice(
-                    indexs,
-                    1
-                  )
-                "
-                >删除</el-button
-              >
-            </li>
-          </ul> -->
+          <div v-if="photoVideoList.goodsPhotographExamConfig.photograph === 1">
+            学习开始,就拍照,只拍1张照片
+          </div>
         </div>
       </div>
       <span slot="footer" class="dialog-footer">
@@ -1357,20 +1323,21 @@ export default {
   components: { searchBoxNew, Editor, pagination, poppleSet, poppleSetTk },
   data() {
     return {
+      copyNums: "", //备份学习机会 - 用途在于 如果出现修改学习机会 不能小于当前值
       disabledBtn: false,
       photoVideoList: {
         playConfig: {
           autoPlay: 0,
-          drag: 1,
+          drag: 0,
           speed: 0,
         },
         photographConfig: {
-          photograph: 1,
-          intervalTime: [],
+          photograph: 0,
+          photoNum: "",
+          livephotograph: 0,
         },
         goodsPhotographExamConfig: {
           photograph: 0,
-          intervalTime: [],
         },
       }, //播放和拍照设置---暂存
       dialogPhoto: false,
@@ -1387,6 +1354,7 @@ export default {
         standPriceJson: [],
         certificateIds: [],
         makeGoodsId: "",
+        timeArrays: [],
       },
 
       eduTypeOptions: [], //教育类型数据
@@ -1602,6 +1570,13 @@ export default {
             trigger: ["blur", "change"],
           },
         ],
+        studyTimeArrays: [
+          {
+            required: true,
+            message: "请选择有效期",
+            trigger: ["blur", "change"],
+          },
+        ],
       },
       activeGoodsBoxs: false,
       goodsList: [],
@@ -1637,36 +1612,6 @@ export default {
         key: "",
       },
       formListjy: [
-        // {
-        //   prop: "educationTypeId",
-        //   placeholder: "教育类型",
-        //   scope: "educationType",
-        // },
-        // {
-        //   prop: "businessId",
-        //   placeholder: "业务层次",
-        //   scope: "businessLevel",
-        //   edu: "educationTypeId",
-        // },
-        // {
-        //   prop: "status",
-        //   placeholder: "发布状态",
-        //   scope: "select",
-        //   options: [
-        //     {
-        //       label: "全部状态",
-        //       value: "0,1",
-        //     },
-        //     {
-        //       label: "已发布",
-        //       value: 1,
-        //     },
-        //     {
-        //       label: "未发布",
-        //       value: 0,
-        //     },
-        //   ],
-        // },
         {
           prop: "key",
           placeholder: "请输入讲义标题/讲义编码",
@@ -1716,17 +1661,6 @@ export default {
         key: "",
       },
       formLists: [
-        // {
-        //   prop: "educationTypeId",
-        //   placeholder: "教育类型",
-        //   scope: "educationType",
-        // },
-        // {
-        //   prop: "businessId",
-        //   placeholder: "业务层次",
-        //   scope: "businessLevel",
-        //   edu: "educationTypeId",
-        // },
         {
           prop: "schoolId",
           placeholder: "院校",
@@ -1739,21 +1673,6 @@ export default {
           scope: "Professional",
           edu: "educationTypeId",
         },
-        // {
-        //   prop: "publishStatus",
-        //   placeholder: "发布状态",
-        //   scope: "select",
-        //   options: [
-        //     {
-        //       label: "已发布",
-        //       value: 1,
-        //     },
-        //     {
-        //       label: "未发布",
-        //       value: 0,
-        //     },
-        //   ],
-        // },
         {
           prop: "key",
           placeholder: "请输入课程标题/课程编码",
@@ -1795,29 +1714,6 @@ export default {
         names: "",
       },
       formList3: [
-        // {
-        //   prop: "educationTypeId",
-        //   placeholder: "教育类型",
-        //   scope: "educationType",
-        // },
-        // {
-        //   prop: "businessId",
-        //   placeholder: "业务层次",
-        //   scope: "businessLevel",
-        //   edu: "educationTypeId",
-        // },
-        // {
-        //   prop: "schoolId",
-        //   placeholder: "院校",
-        //   scope: "schoolList",
-        //   edu: "educationTypeId",
-        // },
-        // {
-        //   prop: "majorId",
-        //   placeholder: "专业",
-        //   scope: "Professional",
-        //   edu: "educationTypeId",
-        // },
         {
           prop: "examType",
           placeholder: "题卷类型",
@@ -1850,12 +1746,6 @@ export default {
         { label: "科目", prop: "subjectName", width: "130" },
         { label: "题卷名称", prop: "name" },
         { label: "题库类型", prop: "type", scope: "type", width: "120" },
-        // {
-        //   label: "发布状态",
-        //   prop: "publishStatus",
-        //   scope: "Status",
-        //   width: "120",
-        // },
       ],
       tableSetTSBBOX2: [
         { label: "编码", prop: "code" },
@@ -1913,31 +1803,31 @@ export default {
     this.getJyData();
   },
   methods: {
-    zhText(param){
-        const { columns, data } = param;
-        const sums = [];
-        columns.forEach((column, index) => {
-          if (index === 0) {
-            sums[index] = '总价';
-            return;
-          }
-          const values = data.map(item => Number(item[column.property]));
-          if (!values.every(value => isNaN(value))) {
-            sums[index] = values.reduce((prev, curr) => {
-              const value = Number(curr);
-              if (!isNaN(value)) {
-                return prev + curr;
-              } else {
-                return prev;
-              }
-            }, 0);
-            sums[index] = '¥' + sums[index];
-          } else {
-            sums[index] = '';
-          }
-        });
+    zhText(param) {
+      const { columns, data } = param;
+      const sums = [];
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = "总价";
+          return;
+        }
+        const values = data.map((item) => Number(item[column.property]));
+        if (!values.every((value) => isNaN(value))) {
+          sums[index] = values.reduce((prev, curr) => {
+            const value = Number(curr);
+            if (!isNaN(value)) {
+              return prev + curr;
+            } else {
+              return prev;
+            }
+          }, 0);
+          sums[index] = "¥" + sums[index];
+        } else {
+          sums[index] = "";
+        }
+      });
 
-        return sums;
+      return sums;
     },
     changeDataTime(arr) {
       if (arr && arr[0] === arr[1]) {
@@ -2043,7 +1933,8 @@ export default {
       } else {
         this.photoVideoList.photographConfig = {
           photograph: 0,
-          intervalTime: [],
+          photoNum: "",
+          livephotograph: 0,
         };
       }
       if (this.listData.goodsPhotographExamConfig) {
@@ -2053,7 +1944,6 @@ export default {
       } else {
         this.photoVideoList.goodsPhotographExamConfig = {
           photograph: 0,
-          intervalTime: [],
         };
       }
       this.dialogPhoto = true;
@@ -2062,53 +1952,11 @@ export default {
     submitPhoto() {
       if (
         this.photoVideoList.photographConfig.photograph === 1 &&
-        !this.photoVideoList.photographConfig.intervalTime.length
-      ) {
-        this.$message.warning("至少添加一条“课程节-拍照”");
-        return;
-      }
-      /**
-       * if (
-        this.photoVideoList.goodsPhotographExamConfig.photograph === 1 &&
-        !this.photoVideoList.goodsPhotographExamConfig.intervalTime.length
+        !this.photoVideoList.photographConfig.photoNum
       ) {
-        this.$message.warning("至少添加一条“课程章节-关联题卷-拍照”");
+        this.$message.warning("请输入拍照数量");
         return;
       }
-       */
-      if (
-        this.photoVideoList.photographConfig.photograph === 1 &&
-        this.photoVideoList.photographConfig.intervalTime.length
-      ) {
-        const idsSet = new Set(
-          this.photoVideoList.photographConfig.intervalTime
-        );
-        if (
-          idsSet.size ==
-          this.photoVideoList.photographConfig.intervalTime.length
-        ) {
-          // this.$message.warning("拍照存在相同时间点,请重新设置");
-        } else {
-          this.$message.warning("课程节-拍照存在相同时间点,请重新设置");
-          return;
-        }
-      }
-      // if (
-      //   this.photoVideoList.goodsPhotographExamConfig.photograph === 1 &&
-      //   this.photoVideoList.goodsPhotographExamConfig.intervalTime.length
-      // ) {
-      //   const idsSet = new Set(
-      //     this.photoVideoList.goodsPhotographExamConfig.intervalTime
-      //   );
-      //   if (
-      //     idsSet.size ==
-      //     this.photoVideoList.goodsPhotographExamConfig.intervalTime.length
-      //   ) {
-      //   } else {
-      //     this.$message.warning("关联题卷-拍照存在相同时间点,请重新设置");
-      //     return;
-      //   }
-      // }
       this.listData.playConfig = this.photoVideoList.playConfig;
       this.listData.photographConfig = this.photoVideoList.photographConfig;
       this.listData.goodsPhotographExamConfig =
@@ -2326,11 +2174,11 @@ export default {
           var arrays = [];
           goodsAuditionConfig.map((item) => {
             arrays.push({
-              TypeId:'3-' + item.sectionId,
+              TypeId: "3-" + item.sectionId,
               menuId: item.sectionId,
               courseId: item.courseId,
               auditionMinute: item.auditionMinute,
-              type:3
+              type: 3,
             });
           });
           this.auditionList = arrays;
@@ -2396,25 +2244,14 @@ export default {
             res.data.photographConfig = JSON.parse(
               res.data.goodsPhotographConfig
             );
-            if (res.data.photographConfig.intervalTime) {
-              res.data.photographConfig.intervalTime =
-                res.data.photographConfig.intervalTime.split(",");
-            } else {
-              res.data.photographConfig.intervalTime = [];
-            }
           }
           if (res.data.goodsPhotoExamConfig) {
             res.data.goodsPhotographExamConfig = JSON.parse(
               res.data.goodsPhotoExamConfig
             );
-            if (res.data.goodsPhotographExamConfig.intervalTime) {
-              res.data.goodsPhotographExamConfig.intervalTime =
-                res.data.goodsPhotographExamConfig.intervalTime.split(",");
-            } else {
-              res.data.goodsPhotographExamConfig.intervalTime = [];
-            }
           }
         }
+        this.copyNums = res.data.studyCount;
         res.data.year = res.data.year + "";
         this.listData = res.data;
         // //富文本编辑器神坑处理
@@ -2587,9 +2424,7 @@ export default {
           this.$message.error("请上传节封面");
           return false;
         }
-        if (this.listData.goodsType === 3 || this.listData.goodsType === 4) {
-          await this.rulesForms("listData3");
-        }
+        await this.rulesForms("listData3");
         //保存表单
         this.rulesTableSumbit(int);
       }
@@ -2622,6 +2457,16 @@ export default {
           this.disabledBtn = false;
           return;
         } else {
+          if (
+            this.listData.timeArrays[0] < this.listData.studyTimeArrays[0] ||
+            this.listData.timeArrays[1] > this.listData.studyTimeArrays[1]
+          ) {
+            this.$message.warning(
+              "商品有效期范围必须包含在学习有效期范围内,请重新调整"
+            );
+            this.disabledBtn = false;
+            return;
+          }
           datas.studyStartTime = this.$methodsTools.time10to13(
             this.listData.studyTimeArrays[0],
             1
@@ -2668,14 +2513,6 @@ export default {
       delete datas.timeArrays;
       delete datas.studyTimeArrays;
       if (this.listData.goodsType === 1) {
-        if (datas.photographConfig) {
-          datas.photographConfig.intervalTime =
-            datas.photographConfig.intervalTime.toString();
-        }
-        if (datas.goodsPhotographExamConfig) {
-          datas.goodsPhotographExamConfig.intervalTime =
-            datas.goodsPhotographExamConfig.intervalTime.toString();
-        }
         for (let i = 0; i < this.tableData.length; i++) {
           if (!this.tableData[i].sort && this.tableData[i].sort !== 0) {
             this.$message.warning(`课程内容第${i + 1}条请输入排序`);
@@ -2688,7 +2525,7 @@ export default {
         });
         if (new Set(arr).size != arr.length) {
           this.$message.warning("排序不允许有重复值");
-            this.disabledBtn = false;
+          this.disabledBtn = false;
           return;
         }
         var courseIdList = [];
@@ -2735,7 +2572,7 @@ export default {
         });
         if (new Set(arr).size != arr.length) {
           this.$message.warning("排序不允许有重复值");
-            this.disabledBtn = false;
+          this.disabledBtn = false;
           return;
         }
         var courseIdList = [];
@@ -3175,101 +3012,6 @@ export default {
         });
       }
     },
-    // editAddBoxs2(int) {
-    //   var self = this;
-    //   if (self.optionsNums === 1) {
-    //     self.$api
-    //       .inquireBankModule({
-    //         status: 1,
-    //         // pageNum: self.currentPage2,
-    //         // pageSize: self.pageSize2,
-    //       })
-    //       .then((res) => {
-    //         var aList = [];
-    //         self.tableData2.map((item) => {
-    //           if (item.type === 1) {
-    //             aList.push(item.moduleExamId);
-    //           }
-    //         });
-    //         res.rows.forEach((item) => {
-    //           item.ids = 1 + "-" + item.moduleExamId;
-    //           item.type = 1;
-    //           item.name = item.moduleName;
-    //           item.sort = 0;
-    //         });
-    //         self.disCheckList2.moduleCheck = aList;
-    //         self.boxtableData2 = res.rows;
-    //         self.total2 = res.total;
-    //         self.dialogVisibleTableBoxs2 = true;
-    //         if (int === 1) {
-    //           self.$nextTick(function () {
-    //             self.$refs.multipleTable2.clearSelection();
-    //           });
-    //         }
-    //       });
-    //   }
-    //   if (self.optionsNums === 2) {
-    //     self.$api
-    //       .inquirebankchapterList({
-    //         status: 1,
-    //         // pageNum: self.currentPage2,
-    //         // pageSize: self.pageSize2,
-    //       })
-    //       .then((res) => {
-    //         var aList = [];
-    //         self.tableData2.map((item) => {
-    //           if (item.type === 2) {
-    //             aList.push(item.chapterExamId);
-    //           }
-    //         });
-    //         res.rows.forEach((item) => {
-    //           item.ids = 2 + "-" + item.chapterExamId;
-    //           item.sort = 0;
-    //           item.type = 2;
-    //         });
-    //         self.disCheckList2.chapterCheck = aList;
-    //         self.boxtableData2 = res.rows;
-    //         self.total2 = res.total;
-    //         self.dialogVisibleTableBoxs2 = true;
-    //         if (int === 1) {
-    //           self.$nextTick(function () {
-    //             self.$refs.multipleTable2.clearSelection();
-    //           });
-    //         }
-    //       });
-    //   }
-    //   if (self.optionsNums === 3) {
-    //     self.$api
-    //       .inquirebankexamList({
-    //         status: 1,
-    //         // pageNum: self.currentPage2,
-    //         // pageSize: self.pageSize2,
-    //       })
-    //       .then((res) => {
-    //         var aList = [];
-    //         self.tableData2.map((item) => {
-    //           if (item.type === 3) {
-    //             aList.push(item.examId);
-    //           }
-    //         });
-    //         res.rows.forEach((item) => {
-    //           item.ids = 3 + "-" + item.examId;
-    //           item.sort = 0;
-    //           item.type = 3;
-    //           item.name = item.examName;
-    //         });
-    //         self.disCheckList2.examCheck = aList;
-    //         self.boxtableData2 = res.rows;
-    //         self.total2 = res.total;
-    //         self.dialogVisibleTableBoxs2 = true;
-    //         if (int === 1) {
-    //           self.$nextTick(function () {
-    //             self.$refs.multipleTable2.clearSelection();
-    //           });
-    //         }
-    //       });
-    //   }
-    // },
     submitTab2() {
       if (
         this.activeLists2.moduleCheck.length === 0 &&
@@ -3375,15 +3117,6 @@ export default {
     getRowKeys2(row) {
       return row.ids;
     },
-    // handleSizeChange2(v) {
-    //   this.pageSize = v;
-    //   this.currentPage = 1;
-    //   this.getInfos2();
-    // },
-    // handleCurrentChange2(v) {
-    //   this.currentPage = v;
-    //   this.getInfos2();
-    // },
     //题库商品表格函数END
   },
 };

+ 0 - 0
src/views/Marketing/commodityManageMent/index.vue → src/views/Marketing/goods/commodityManageMent/index.vue


+ 0 - 0
src/views/Marketing/commodityManageMent/poppleSet.vue → src/views/Marketing/goods/commodityManageMent/poppleSet.vue


+ 0 - 0
src/views/Marketing/commodityManageMent/poppleSetTK.vue → src/views/Marketing/goods/commodityManageMent/poppleSetTK.vue


+ 714 - 0
src/views/Marketing/goods/courseInquiryList/index.vue

@@ -0,0 +1,714 @@
+<template>
+  <div id="courseInquiryList">
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+      :redIcon="redIcon"
+    />
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+    >
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="msgInfo(props.scope.row)"
+          >详情</el-button
+        >
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+    <el-dialog
+      :visible.sync="dialogVisible"
+      width="1300px"
+      :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="close" />
+        </div>
+      </div>
+      <div class="dis_flexs">
+        <div class="leftBoxs">
+          <span v-if="!activeId" style="font-size: 30px"
+            >请打开目录详情,点击播放您需要观看的视频内容。</span
+          >
+          <div v-show="vid" id="player"></div>
+          <div v-show="vidzb" id="playerzb"></div>
+        </div>
+        <div class="rightBoxslist">
+          <div v-for="(item, index) in courseList" :key="index" class="bg_ls">
+            <div
+              class="jus_sty"
+              :style="
+                item.checked
+                  ? 'border-bottom: 1px dotted #666;margin-bottom:6px;'
+                  : ''
+              "
+            >
+              <div style="font-size: 12px">{{ item.courseName }}</div>
+              <div class="line_h" @click="getCourseInfos(item, index)">
+                {{ item.checked ? "—" : "+" }}
+              </div>
+            </div>
+            <template v-if="item.checked">
+              <div v-for="(items, indexs) in item.children" :key="indexs">
+                <div
+                  class="firstSty"
+                  @click="getSecouredInfos(items, index, indexs)"
+                >
+                  <div class="typeIcon" v-if="items.type === 3">
+                    {{ getTypeName(items.sectionType) }}
+                  </div>
+                  <i
+                    v-if="items.type !== 3"
+                    :class="
+                      items.checked
+                        ? 'el-icon-caret-bottom'
+                        : 'el-icon-caret-right'
+                    "
+                  ></i>
+                  <span :style="activeId === items.onlyId ? 'color:red;' : ''">
+                    {{ items.menuName }}
+                  </span>
+                  <span v-if="items.type === 3" class="itemsty"
+                    >{{ items.durationTime }}分钟</span
+                  >
+                </div>
+                <template v-if="items.checked">
+                  <div
+                    v-for="(its, ids) in items.children"
+                    :key="ids"
+                    style="padding-left: 14px"
+                  >
+                    <div
+                      class="firstSty"
+                      @click="getTemsInfo(its, index, indexs, ids)"
+                    >
+                      <div class="typeIcon" v-if="its.type === 3">
+                        {{ getTypeName(its.sectionType) }}
+                      </div>
+                      <i
+                        v-if="its.type !== 3"
+                        :class="
+                          its.checked
+                            ? 'el-icon-caret-bottom'
+                            : 'el-icon-caret-right'
+                        "
+                      ></i>
+                      <span
+                        :style="activeId === its.onlyId ? 'color:red;' : ''"
+                      >
+                        {{ its.menuName }}
+                      </span>
+                      <span v-if="its.type === 3" class="itemsty"
+                        >{{ its.durationTime }}分钟</span
+                      >
+                    </div>
+                    <template v-if="its.checked">
+                      <div
+                        v-for="(itschild, ids) in its.children"
+                        :key="ids"
+                        style="padding-left: 14px"
+                        @click="getTemsInfo(itschild)"
+                      >
+                        <div class="firstSty">
+                          <div class="typeIcon">
+                            {{ getTypeName(itschild.sectionType) }}
+                          </div>
+                          <span
+                            :style="
+                              activeId === itschild.onlyId ? 'color:red;' : ''
+                            "
+                          >
+                            {{ itschild.menuName }}
+                          </span>
+                          <span class="itemsty"
+                            >{{ itschild.durationTime }}分钟</span
+                          >
+                        </div>
+                      </div>
+                    </template>
+                  </div>
+                </template>
+              </div>
+            </template>
+          </div>
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="close">取 消</el-button>
+        <el-button type="primary">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  name: "courseInquiryList",
+  components: { searchBoxNew, tableList, pagination },
+  data() {
+    return {
+      loading: false, //当前表单加载是否加载动画
+      redIcon: true,
+      navText: {
+        title: "课程查询列表",
+        index: 0,
+        ch: "条",
+        num: false,
+        changeWidth: "150px",
+        border: true,
+        choice: true,
+        addHide: true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          prop: "educationTypeId",
+          placeholder: "教育类型",
+          scope: "educationType",
+        },
+        {
+          prop: "businessId",
+          placeholder: "业务层次",
+          scope: "businessLevel",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "goodsName",
+          placeholder: "请输入商品名称",
+        },
+      ],
+      formData: {
+        goodsType: 1,
+        status: 1,
+        pageSize: 10,
+        pageNum: 1,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "教育类型",
+          prop: "educationName",
+          hidden: true,
+        },
+        {
+          label: "业务层次",
+          prop1: "projectName",
+          prop2: "businessName",
+          hidden: true,
+          width: "220px",
+          scope: "InfoMore",
+        },
+        {
+          label: "专业",
+          prop: "categoryName",
+          hidden: true,
+        },
+        {
+          label: "商品编码",
+          prop: "code",
+          hidden: true,
+        },
+        {
+          label: "商品名称",
+          prop: "goodsName",
+          hidden: true,
+        },
+        {
+          label: "商品状态",
+          prop: "status",
+          hidden: true,
+          scope: "hasTime",
+        },
+        {
+          label: "学时",
+          prop: "classHours",
+          hidden: true,
+        },
+        {
+          label: "学习有效期",
+          prop1: "studyStartTime",
+          prop2: "studyEndTime",
+          scope: "TimeLists",
+          width: "320px",
+          Diszing: true,
+          hidden: true,
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+      dialogVisible: false,
+      courseList: [], //详情列表
+      activeId: "", //当前选中ID
+      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: "",
+    };
+  },
+  mounted() {
+    this.search();
+  },
+  activated() {
+    this.search();
+  },
+  methods: {
+    getTypeName(type) {
+      let ast = "";
+      switch (type) {
+        case 1:
+          ast = "录播";
+          break;
+        case 2:
+          ast = "直播";
+          break;
+        case 3:
+          ast = "回放";
+          break;
+        default:
+          break;
+      }
+      return ast;
+    },
+    /**
+     * 关闭详情触发事件
+     */
+    close() {
+      this.dialogVisible = false;
+      this.clears();
+    },
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          goodsType: 1,
+          status: 1,
+          pageSize: 10,
+          pageNum: 1,
+        };
+      }
+      if (int === 3) {
+        this.formData.pageNum = 1;
+      }
+      var data = JSON.parse(JSON.stringify(this.formData));
+      this.$api
+        .inquireGoods(data)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    init() {
+      this.search(2);
+    },
+    /**
+     * 点击详情
+     */
+    msgInfo(option) {
+      this.$api.obtainCourseSgoodsId(option.goodsId).then((res) => {
+        res.rows.forEach((item) => {
+          item.checked = false;
+        });
+        this.courseList = res.rows;
+        this.dialogVisible = true;
+      });
+    },
+    /**
+     * 点击课程
+     */
+    getCourseInfos(option, int) {
+      if (option.checked) {
+        this.$set(this.courseList[int], "checked", false);
+      } else {
+        if (option.children) {
+          this.$set(this.courseList[int], "checked", true);
+          return;
+        }
+        this.$api
+          .inquireCoursemenuListS({ courseId: option.courseId })
+          .then((res) => {
+            res.rows.forEach((item) => {
+              if (item.type !== 3) {
+                item.checked = false;
+              }
+              if (item.type === 3) {
+                item.onlyId = `${option.courseId}-0-0-${item.menuId}`;
+              }
+            });
+            this.$set(this.courseList[int], "children", res.rows);
+            this.$set(this.courseList[int], "checked", true);
+          });
+      }
+    },
+    getSecouredInfos(option, int, ints) {
+      if (option.type === 3) {
+        //触发节函数
+        this.activeId = option.onlyId;
+        this.initVideo(option);
+      } else {
+        if (option.checked) {
+          this.$set(this.courseList[int].children[ints], "checked", false);
+        } else {
+          if (option.children) {
+            this.$set(this.courseList[int].children[ints], "checked", true);
+            return;
+          }
+          if (option.type === 1) {
+            this.$api
+              .inquireCourseListmodulechapter(option.menuId)
+              .then((res) => {
+                res.data.forEach((item) => {
+                  if (item.type !== 3) {
+                    item.checked = false;
+                    item.type = 2;
+                    item.courseId = option.courseId;
+                    item.menuName = item.name;
+                  }
+                });
+                this.$set(
+                  this.courseList[int].children[ints],
+                  "children",
+                  res.data
+                );
+                this.$set(this.courseList[int].children[ints], "checked", true);
+              });
+          }
+          if (option.type === 2) {
+            this.$api
+              .inquireCoursechaptersectionlist(option.menuId)
+              .then((res) => {
+                res.data.forEach((item) => {
+                  item.type = 3;
+                  item.menuName = item.name;
+                  item.onlyId = `${option.courseId}-0-${option.menuId}-${item.sectionId}`;
+                });
+                this.$set(
+                  this.courseList[int].children[ints],
+                  "children",
+                  res.data
+                );
+                this.$set(this.courseList[int].children[ints], "checked", true);
+              });
+          }
+        }
+      }
+    },
+    getTemsInfo(option, int, ints, ids) {
+      if (option.type === 3) {
+        //触发节函数
+        this.initVideo(option);
+      } else {
+        if (option.checked) {
+          this.$set(
+            this.courseList[int].children[ints].children[ids],
+            "checked",
+            false
+          );
+        } else {
+          if (option.children) {
+            this.$set(
+              this.courseList[int].children[ints].children[ids],
+              "checked",
+              true
+            );
+            return;
+          }
+          if (option.type === 2) {
+            this.$api
+              .inquireCoursechaptersectionlist(option.chapterId)
+              .then((res) => {
+                res.data.forEach((item) => {
+                  item.type = 3;
+                  item.menuName = item.name;
+                  item.onlyId = `${option.courseId}-${option.moduleId}-${option.chapterId}-${item.sectionId}`;
+                });
+                this.$set(
+                  this.courseList[int].children[ints].children[ids],
+                  "children",
+                  res.data
+                );
+                this.$set(
+                  this.courseList[int].children[ints].children[ids],
+                  "checked",
+                  true
+                );
+              });
+          }
+        }
+      }
+    },
+    handleSizeChange(v) {
+      this.formData.pageSize = v;
+      this.formData.pageNum = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.formData.pageNum = v;
+      this.search();
+    },
+    async initVideo(option) {
+      await this.clears();
+      this.activeId = option.onlyId;
+      if (option.sectionType === 2) {
+        this.vidzb = option.liveUrl;
+        this.loadPlayerScriptzb(this.loadPlayerzb);
+      } else {
+        this.vid = option.recordingUrl;
+        this.loadPlayerScript(this.loadPlayer);
+      }
+    },
+    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: 932,
+        height: 627,
+        vid: self.vid,
+        teaser_show: 0,
+        playsafe: function (vid, next) {
+          self.$api.obtainpolyvvideosign(vid).then((res) => {
+            next(res.data);
+          });
+        },
+      });
+    },
+    /**
+     * @param {String} 关闭视频窗口-销毁实例
+     */
+    clears() {
+      return new Promise((resolve, reject) => {
+        this.activeId = "";
+        this.vid = "";
+        this.vidzb = "";
+        if (this.player) {
+          this.player.destroy();
+        }
+        if (this.playerzb) {
+          this.playerzb.destroy();
+        }
+        resolve();
+      });
+    },
+    /**
+     * @param {String} 直播预览
+     */
+    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: 932,
+        height: 627,
+        uid: this.uidzb,
+        vid: this.vidzb,
+      });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
+.dis_flexs {
+  display: flex;
+}
+.leftBoxs {
+  width: 932px;
+  height: 627px;
+  border: 1px solid #eee;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.rightBoxslist {
+  flex: 1;
+  max-height: 627px;
+  overflow-y: auto;
+  margin-left: 10px;
+}
+.bg_ls {
+  background-color: #eee;
+  padding: 8px;
+  margin-bottom: 10px;
+}
+.jus_sty {
+  display: flex;
+  justify-content: space-between;
+  padding: 6px 0px;
+}
+.line_h {
+  font-size: 14px;
+  height: 18px;
+  width: 18px;
+  font-weight: bold;
+  color: #000;
+  background-color: rgb(153, 153, 153);
+  line-height: 18px;
+  text-align: center;
+  cursor: pointer;
+}
+.firstSty {
+  font-size: 13px;
+  margin-bottom: 6px;
+  cursor: pointer;
+  &:hover {
+    color: red;
+  }
+}
+.typeIcon {
+  display: inline-block;
+  border-radius: 8px;
+  border: 1px solid #000;
+  padding: 0px 4px;
+  color: #000 !important;
+  font-size: 12px;
+}
+.itemsty {
+  font-size: 13px;
+  color: purple;
+  margin-left: 14px;
+}
+</style>
+

+ 0 - 0
src/views/Marketing/orderList/add/order/index copy.vue → src/views/Marketing/order/orderList/add/order/index copy.vue


+ 0 - 0
src/views/Marketing/orderList/add/order/index.vue → src/views/Marketing/order/orderList/add/order/index.vue


+ 0 - 0
src/views/Marketing/orderList/add/orderPrice/index.vue → src/views/Marketing/order/orderList/add/orderPrice/index.vue


+ 0 - 0
src/views/Marketing/orderList/details/costPriceManages.vue → src/views/Marketing/order/orderList/details/costPriceManages.vue


+ 0 - 0
src/views/Marketing/orderList/details/goodsManage.vue → src/views/Marketing/order/orderList/details/goodsManage.vue


+ 0 - 0
src/views/Marketing/orderList/details/index.vue → src/views/Marketing/order/orderList/details/index.vue


+ 0 - 0
src/views/Marketing/orderList/details/studentManageOrder.vue → src/views/Marketing/order/orderList/details/studentManageOrder.vue


+ 4 - 16
src/views/Marketing/orderList/index.vue → src/views/Marketing/order/orderList/index.vue

@@ -103,30 +103,18 @@ export default {
           ],
         },
         {
-          prop: "orderStatus",
+          prop: "status",
           placeholder: "订单状态",
           scope: "select",
           options: [
             {
-              label: "超时关闭",
-              value: -2,
-            },
-            {
-              label: "手动关闭",
-              value: -1,
+              label: "有效",
+              value: 1,
             },
             {
-              label: "普通状态",
+              label: "无效",
               value: 0,
             },
-            {
-              label: "已付款",
-              value: 1,
-            },
-            {
-              label: "成功",
-              value: 3,
-            }
           ],
         },
         {

+ 48 - 17
src/views/education/classManageMent/classHours/index.vue

@@ -26,7 +26,20 @@
           :type="activeBtn === 2 ? 'primary' : ''"
           :size="size"
           @click="changeBTN(2)"
-          >待审核</el-button
+          >待审核
+          <i
+            class="el-icon-warning-outline"
+            :style="
+              reviewListNums >= 200
+                ? 'color:red;'
+                : reviewListNums < 200 && reviewListNums > 99
+                ? 'color:yellow'
+                : reviewListNums < 100
+                ? 'color:block;'
+                : ''
+            "
+            style="font-weight: bold"
+          ></i></el-button
         ><el-button
           :type="activeBtn === 0 ? 'primary' : ''"
           :size="size"
@@ -123,10 +136,12 @@
 <script>
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
+import { mapGetters } from "vuex";
 export default {
   components: { tableList, pagination },
   data() {
     return {
+      reviewListNums: 0,
       statusShow: "", //1无官方接口按钮 2只有官方推送 3都有
       size: "medium",
       active: 2,
@@ -137,7 +152,7 @@ export default {
         index: 0,
         ch: "条",
         num: false,
-        border:true,
+        border: true,
         choice: true,
         addHide: true,
         gfxsStatus: false,
@@ -158,7 +173,7 @@ export default {
           label: "学员编码",
           prop: "studentCode",
           hidden: true,
-          width:"130px"
+          width: "130px",
         },
         {
           label: "学员姓名",
@@ -169,13 +184,13 @@ export default {
           label: "学员身份证",
           prop: "idCard",
           hidden: true,
-          width:"160px"
+          width: "160px",
         },
         {
           label: "绑定手机号码",
           prop: "telPhone",
           hidden: true,
-          width:"130px"
+          width: "130px",
         },
         {
           label: "学时",
@@ -188,7 +203,7 @@ export default {
           prop2: "secAllNum",
           hidden: true,
           scope: "computer",
-          width:"140px"
+          width: "140px",
         },
         {
           label: "做题进度(章卷)",
@@ -196,14 +211,14 @@ export default {
           prop2: "examNum",
           hidden: true,
           scope: "computer",
-          width:"130px"
+          width: "130px",
         },
         {
           label: "学时审批状态",
           prop: "periodStatus",
           hidden: true,
           scope: "statusPeriod",
-          width:"130px"
+          width: "130px",
         },
         {
           label: "学习开始时间",
@@ -228,13 +243,13 @@ export default {
           width: "220px",
         },
         {
-          label:"待重修(视频节和题卷)",
-          prop:"waitRebuildNum",
-          prop1:"rebuildNum",
-          hidden:true,
-          scope:"againStudent",
-          width:"150px"
-        }
+          label: "待重修(视频节和题卷)",
+          prop: "waitRebuildNum",
+          prop1: "rebuildNum",
+          hidden: true,
+          scope: "againStudent",
+          width: "150px",
+        },
       ],
       tableData: [], //表单数据
       total: 0, //一共多少条
@@ -243,9 +258,11 @@ export default {
       stice: 0,
     };
   },
+  computed: { ...mapGetters(["reviewStatus"]) },
   async mounted() {
     await this.getStatus();
     this.search();
+    this.getInitList();
   },
   methods: {
     changeBTN(int) {
@@ -331,12 +348,12 @@ export default {
         return;
       } else {
         if (int === 1) {
-          this.active = int;
+          // this.active = int;
           this.$router.push({
             path: "studentMenu",
             query: {
               id: this.$route.query.id,
-              goodsId:this.$route.query.goodsId
+              goodsId: this.$route.query.goodsId,
             },
           });
         }
@@ -384,6 +401,20 @@ export default {
           this.loading = false;
         });
     },
+    /**
+     * 待审核数量
+     */
+    getInitList() {
+      this.$api
+        .inquireGradegradelistUserPeriod({
+          periodStatus: 2,
+          gradeId: this.$route.query.id,
+          status: "0,1",
+        })
+        .then((res) => {
+          this.reviewListNums = res.rows.length;
+        });
+    },
     handleSizeChange(v) {
       this.formData.pageSize = v;
       this.formData.pageNum = 1;

+ 29 - 20
src/views/education/classManageMent/classHoursReview/index.vue

@@ -205,7 +205,11 @@
                   :disabled="scope.row.status === 0"
                   class="btnstyles"
                   size="mini"
-                  @click="scope.row.status === 2 ? changeStatus(scope.row, 2, scope.$index) : ''"
+                  @click="
+                    scope.row.status === 2 || scope.row.status === 3
+                      ? changeStatus(scope.row, 2, scope.$index)
+                      : ''
+                  "
                   >作弊</el-button
                 >
               </div>
@@ -336,13 +340,14 @@
                         class="btnstyles"
                         size="mini"
                         @click="
-                        scope2.row.status === 2 ?
-                          changeStatusCharpter(
-                            scope2.row,
-                            2,
-                            scope.$index,
-                            scope2.$index
-                          ):''
+                          scope2.row.status === 2 || scope2.row.status === 3
+                            ? changeStatusCharpter(
+                                scope2.row,
+                                2,
+                                scope.$index,
+                                scope2.$index
+                              )
+                            : ''
                         "
                         >作弊</el-button
                       >
@@ -462,14 +467,16 @@
                               class="btnstyles"
                               size="mini"
                               @click="
-                              scope3.row.status === 2 ?
-                                changeStatusModule(
-                                  scope3.row,
-                                  2,
-                                  scope.$index,
-                                  scope2.$index,
-                                  scope3.$index
-                                ):''
+                                scope3.row.status === 2 ||
+                                scope3.row.status === 3
+                                  ? changeStatusModule(
+                                      scope3.row,
+                                      2,
+                                      scope.$index,
+                                      scope2.$index,
+                                      scope3.$index
+                                    )
+                                  : ''
                               "
                               >作弊</el-button
                             >
@@ -868,9 +875,12 @@ export default {
     this.search();
   },
   methods: {
+    /**
+     * 通过 作弊 periodId
+     */
     changeStatus(item, int, index) {
       var data = {
-        id: [item.periodId],
+        id: item.periodStatusId,
       };
       if (int === 1) {
         data.status = 1;
@@ -885,7 +895,7 @@ export default {
     },
     changeStatusCharpter(item, int, index1, index2) {
       var data = {
-        id: [item.periodId],
+        id: item.periodStatusId,
       };
       if (int === 1) {
         data.status = 1;
@@ -900,7 +910,7 @@ export default {
     },
     changeStatusModule(item, int, index1, index2, index3) {
       var data = {
-        id: [item.periodId],
+        id: item.periodStatusId,
       };
       if (int === 1) {
         data.status = 1;
@@ -1020,7 +1030,6 @@ export default {
           goodsId: this.$route.query.goodsId,
         })
         .then((res) => {
-          console.log(JSON.parse(res.rows[0].keyValue));
           if (res.rows[0].keyValue) {
             var data = JSON.parse(res.rows[0].keyValue);
             this.recent_photos = data.recent_photos.value;

+ 39 - 8
src/views/education/classManageMent/classList/addClass/index.vue

@@ -62,7 +62,7 @@
                 : 'learningStatus'
             "
           >
-          <!-- <el-button
+            <!-- <el-button
               style="margin-right: 14px"
               size="mini"
               v-if="listData.learningStatus"
@@ -94,15 +94,28 @@
           </el-form-item>
           <el-form-item label="班级有效期" prop="timeList">
             <el-date-picker
+              style="width: 90%"
               v-model="listData.timeList"
               type="datetimerange"
               range-separator="至"
               start-placeholder="开始日期"
               end-placeholder="结束日期"
               value-format="timestamp"
-               @change="changeDataTimeStudy(listData.timeList)"
+              @change="changeDataTimeStudy(listData.timeList)"
             >
             </el-date-picker>
+            <el-tooltip class="item" effect="dark" placement="right">
+              <div slot="content">
+                商品学习有效期:{{ $methodsTools.onlyForma(timeArrays[0]) }}
+                至
+                {{ $methodsTools.onlyForma(timeArrays[1]) }}
+              </div>
+              <i
+                style="margin-left: 10px; font-size: 20px; color: #E6A23C"
+                v-show="timeArrays.length"
+                class="el-icon-warning"
+              ></i>
+            </el-tooltip>
           </el-form-item>
           <el-form-item label="考期" prop="examineId">
             <el-select
@@ -370,7 +383,7 @@ export default {
         officialName: "",
         cityId: "",
         classGradeGoodsAddBos: [],
-        studentUpper:300,
+        studentUpper: 300,
       },
       rules: {
         className: [
@@ -454,6 +467,7 @@ export default {
       type3List: [],
       teacherList: [],
       statusShow: 1, //0隐藏1显示
+      timeArrays: [], //限制班级有效期时间
     };
   },
   computed: { ...mapGetters(["courseExamine", "areas"]) },
@@ -463,10 +477,20 @@ export default {
     this.getGFList();
   },
   methods: {
-    changeDataTimeStudy(arr){
-      if(arr && arr[0] === arr[1]){
-        this.$message.warning('开始时间与结束时间不允许相同')
-        this.listData.timeList = []
+    changeDataTimeStudy(arr) {
+      if (arr) {
+        if (
+          this.timeArrays &&
+          (parseInt(arr[0] / 1000) < this.timeArrays[0] ||
+            parseInt(arr[1] / 1000) > this.timeArrays[1])
+        ) {
+          this.$message.warning("超出商品学习有效期,请重新选择");
+          this.listData.timeList = [];
+        }
+        if (arr[0] === arr[1]) {
+          this.$message.warning("开始时间与结束时间不允许相同");
+          this.listData.timeList = [];
+        }
       }
     },
     handleSizeChange(v) {
@@ -529,11 +553,18 @@ export default {
     },
     //单选触发
     getTemplateRow(index, row) {
+      console.log(row);
       this.templateRadio = row.goodsId;
       this.goodsName = row.goodsName;
     },
-    //确定选择商品列表
+    /**
+     * 确定选择商品列表
+     */
     submitPZ() {
+      this.$api.obtainGoods(this.templateRadio).then((res) => {
+        this.timeArrays = [res.data.studyStartTime, res.data.studyEndTime];
+        this.listData.timeList = [];
+      });
       this.listData.classGradeGoodsAddBos[0] = this.templateRadio;
       this.listData.goodsName = this.goodsName;
       this.dialogVisiblePZDown = false;

+ 67 - 30
src/views/education/classManageMent/classList/manageClass/baseInfo.vue

@@ -46,12 +46,12 @@
             </el-form-item>
             <el-form-item label="班级号">
               <el-button
-              style="margin-right: 14px"
-              size="mini"
-              v-if="listData.classStatus || listData.classStatus === 0"
-              @click="listData.classStatus = ''"
-              >清除选择</el-button
-            >
+                style="margin-right: 14px"
+                size="mini"
+                v-if="listData.classStatus || listData.classStatus === 0"
+                @click="listData.classStatus = ''"
+                >清除选择</el-button
+              >
               <el-radio-group
                 v-model="listData.classStatus"
                 @change="changeClassStatus"
@@ -72,13 +72,19 @@
               ></el-input>
             </el-form-item>
             <el-form-item label="学员上限" prop="studentUpper">
-              <el-input-number :min="minNums"  :max="300" :controls="false"
+              <el-input-number
+                :min="minNums"
+                :max="300"
+                :controls="false"
                 v-model="listData.studentUpper"
                 placeholder="请填写学员上限"
               ></el-input-number>
             </el-form-item>
             <el-form-item label="当前学员人数" prop="studentNum">
-              <el-input-number :min="minNums" :controls="false" disabled
+              <el-input-number
+                :min="minNums"
+                :controls="false"
+                disabled
                 v-model="listData.studentNum"
                 placeholder="请填写学员上限"
               ></el-input-number>
@@ -91,7 +97,7 @@
                   : 'learningStatus'
               "
             >
-            <!-- <el-button
+              <!-- <el-button
               style="margin-right: 14px"
               size="mini"
               v-if="listData.learningStatus"
@@ -123,15 +129,28 @@
             </el-form-item>
             <el-form-item label="班级有效期" prop="timeList">
               <el-date-picker
-              v-model="listData.timeList"
-              type="datetimerange"
-              range-separator="至"
-              start-placeholder="开始日期"
-              end-placeholder="结束日期"
-              value-format="timestamp"
-               @change="changeDataTimeStudy(listData.timeList)"
-            >
-            </el-date-picker>
+                style="width: 90%"
+                v-model="listData.timeList"
+                type="datetimerange"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="timestamp"
+                @change="changeDataTimeStudy(listData.timeList)"
+              >
+              </el-date-picker>
+              <el-tooltip class="item" effect="dark" placement="right">
+                <div slot="content">
+                  商品学习有效期:{{ $methodsTools.onlyForma(timeArrays[0]) }}
+                  至
+                  {{ $methodsTools.onlyForma(timeArrays[1]) }}
+                </div>
+                <i
+                  style="margin-left: 10px; font-size: 20px; color: #e6a23c"
+                  v-show="timeArrays.length"
+                  class="el-icon-warning"
+                ></i>
+              </el-tooltip>
             </el-form-item>
             <el-form-item label="考期" prop="examineId">
               <el-select
@@ -272,7 +291,7 @@ import { mapGetters } from "vuex";
 export default {
   data() {
     return {
-      minNums:0,
+      minNums: 0,
       listData: {
         goodsList: [{}],
       },
@@ -294,7 +313,7 @@ export default {
             trigger: "blur",
           },
         ],
-        studentNum:[
+        studentNum: [
           { required: true, message: "请填写学员上限", trigger: "blur" },
         ],
         status: [{ required: true, message: "请选择状态", trigger: "change" }],
@@ -322,6 +341,7 @@ export default {
       type3List: [],
       teacherList: [],
       statusShow: 0, //0隐藏1出现
+      timeArrays: [], //限制班级有效期时间
     };
   },
   computed: { ...mapGetters(["courseExamine", "areas"]) },
@@ -331,10 +351,20 @@ export default {
     this.search();
   },
   methods: {
-    changeDataTimeStudy(arr){
-      if(arr && arr[0] === arr[1]){
-        this.$message.warning('开始时间与结束时间不允许相同')
-        this.listData.timeList = []
+    changeDataTimeStudy(arr) {
+      if (arr) {
+        if (
+          this.timeArrays &&
+          (parseInt(arr[0] / 1000) < this.timeArrays[0] ||
+            parseInt(arr[1] / 1000) > this.timeArrays[1])
+        ) {
+          this.$message.warning("超出商品学习有效期,请重新选择");
+          this.listData.timeList = [];
+        }
+        if (arr[0] === arr[1]) {
+          this.$message.warning("开始时间与结束时间不允许相同");
+          this.listData.timeList = [];
+        }
       }
     },
     //   初始获取数据
@@ -357,8 +387,16 @@ export default {
             this.$methodsTools.time10to13(res.data.classEndTime, 2),
           ];
         }
-        console.log(res.data)
-        this.minNums = res.data.studentNum
+        if (
+          res.data.goodsList[0].studyStartTime &&
+          res.data.goodsList[0].studyEndTime
+        ) {
+          this.timeArrays = [
+            res.data.goodsList[0].studyStartTime,
+            res.data.goodsList[0].studyEndTime,
+          ];
+        }
+        this.minNums = res.data.studentNum;
         this.listData = res.data;
       });
     },
@@ -371,7 +409,7 @@ export default {
         this.statusShow = res.data;
       });
       this.$api.obtainUserList({ status: 1 }).then((res) => {
-        console.log(res.rows)
+        console.log(res.rows);
         this.teacherList = res.rows;
       });
     },
@@ -415,7 +453,7 @@ export default {
     //返回
     backPage() {
       this.$router.push({
-        path:"classList"
+        path: "classList",
       });
     },
     //表单验证
@@ -432,8 +470,7 @@ export default {
     //提交
     submit() {
       var data = JSON.parse(JSON.stringify(this.listData));
-      console.log(data)
-      if ( data.timeList && data.timeList.length) {
+      if (data.timeList && data.timeList.length) {
         data.classStartTime = this.listData.timeList[0] / 1000;
         data.classEndTime = this.listData.timeList[1] / 1000;
       }

+ 3 - 3
src/views/education/classManageMent/studentMenu/index.vue

@@ -172,7 +172,7 @@
         <el-row :gutter="20">
           <el-col :span="3">所属商品课程:</el-col>
           <el-col :span="21">
-            <el-descriptions :labelStyle="{width:'110px'}" border>
+            <el-descriptions :labelStyle="{ width: '110px' }" border>
               <el-descriptions-item label="商品编码">{{
                 obtainGoods.code
               }}</el-descriptions-item>
@@ -524,7 +524,7 @@ export default {
       },
       totalClass: 0,
       formDataClass: {
-        pastDue:1,
+        pastDue: 1,
         atFull: 1,
         goodsId: this.$route.query.goodsId,
         status: 1,
@@ -844,7 +844,7 @@ export default {
         return;
       } else {
         if (int === 2) {
-          this.active = int;
+          // this.active = int;
           this.$router.push({
             path: "classHours",
             query: {

+ 67 - 0
src/views/education/dataReview/dataConfig/index.vue

@@ -16,6 +16,11 @@
       :loading="loading"
       @editInfo="editInfo"
     >
+      <template slot="customize">
+        <el-button size="small" type="success" @click="moreActive"
+          >批量导出</el-button
+        >
+      </template>
       <template slot="btn" slot-scope="props">
         <el-button
           type="text"
@@ -291,6 +296,52 @@
         <el-button @click="dialogVisibleRecord = false">取 消</el-button>
       </span>
     </el-dialog>
+    <el-dialog
+      :visible.sync="dialogDR"
+      width="660px"
+      :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="dialogDR = false"
+          />
+        </div>
+      </div>
+      <div>
+        <div class="swq">
+          <img
+            style="width: 182px; height: 168px"
+            src="@/assets/images/dr.png"
+            alt=""
+          />
+        </div>
+        <div style="padding: 40px">
+          <el-row>
+            <el-col :span="12"><div style="text-align:end;padding-right:14px;">填写资料审核状态: </div></el-col>
+            <el-col :span="12">
+              <el-radio-group v-model="activeDCIndex">
+                <el-radio
+                style="display:block;margin-bottom:16px;"
+                  v-for="(items, indexs) in DCLIST"
+                  :key="indexs"
+                  :label="items.value"
+                  >{{ items.label }}</el-radio
+                >
+              </el-radio-group>
+            </el-col>
+          </el-row>
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogDR = false">取消</el-button>
+        <el-button type="primary">确定</el-button>
+      </span>
+    </el-dialog>
   </div>
 </template>
 
@@ -303,6 +354,7 @@ export default {
   components: { searchBoxNew, tableList, pagination },
   data() {
     return {
+      dialogDR: false,
       disabledBtn: false,
       dialogVisibleRecord: false,
       shType: true,
@@ -486,6 +538,13 @@ export default {
       listInfos: [],
       recordList: [{ keyValueArrays: [] }], //记录列表
       activeIndex: 0,
+      activeDCIndex: 1, //导出按钮索引
+      DCLIST: [
+        { label: "全部", value: 1 },
+        { label: "待审核", value: 2 },
+        { label: "审核通过", value: 3 },
+        { label: "审核不通过", value: 4 },
+      ], //导出按钮列表
     };
   },
   mounted() {
@@ -495,6 +554,10 @@ export default {
     this.search();
   },
   methods: {
+    moreActive() {
+      this.activeDCIndex = 1;
+      this.dialogDR = true;
+    },
     changeIndex(v) {
       if (this.activeIndex === v) {
         return;
@@ -732,6 +795,10 @@ export default {
     border-bottom: 1px solid #999 !important;
   }
 }
+.swq {
+  text-align: center;
+  border-bottom: 1px solid #eee;
+}
 .active {
   color: blue;
 }

+ 1 - 1
src/views/education/dataReview/informationTemplate/index.vue

@@ -805,7 +805,7 @@
 </template>
 <!-- 输入类型 1输入框 2下拉选择 3上传文件 4下载文件 5时间选择器 -->
 <script>
-import * as baseUrls from "@/utils/methodsTool.js";
+import * as baseUrls from "@/utils/request.js";
 import searchBoxNew from "@/components/searchBoxNew";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";

+ 86 - 13
src/views/education/dataReview/stamp/index.vue

@@ -16,6 +16,11 @@
       :loading="loading"
       @editInfo="editInfo"
     >
+      <template slot="customize">
+        <el-button size="small" type="success" @click="moreActive"
+          >批量导出</el-button
+        >
+      </template>
       <template slot="btn" slot-scope="props">
         <el-button
           type="text"
@@ -68,12 +73,12 @@
             <div class="stys">{{ item.fieldName }}:</div>
             <div v-if="item.fieldKey === 'commitment_seal'" style="width: 100%">
               <el-image
-                  v-if="item.value"
-                  style="width: 100%;"
-                  :src="$methodsTools.splitImgHost(item.value)"
-                  :preview-src-list="[$methodsTools.splitImgHost(item.value)]"
-                >
-                </el-image>
+                v-if="item.value"
+                style="width: 100%"
+                :src="$methodsTools.splitImgHost(item.value)"
+                :preview-src-list="[$methodsTools.splitImgHost(item.value)]"
+              >
+              </el-image>
               <p v-else>暂无上传图片</p>
             </div>
           </li>
@@ -175,12 +180,14 @@
                     style="width: 100%"
                   >
                     <el-image
-                  v-if="item.value"
-                  style="width: 100%;"
-                  :src="$methodsTools.splitImgHost(item.value)"
-                  :preview-src-list="[$methodsTools.splitImgHost(item.value)]"
-                >
-                </el-image>
+                      v-if="item.value"
+                      style="width: 100%"
+                      :src="$methodsTools.splitImgHost(item.value)"
+                      :preview-src-list="[
+                        $methodsTools.splitImgHost(item.value),
+                      ]"
+                    >
+                    </el-image>
                     <p v-else>暂无上传图片</p>
                   </div>
                 </li>
@@ -199,6 +206,56 @@
         <el-button @click="dialogVisibleRecord = false">取 消</el-button>
       </span>
     </el-dialog>
+    <el-dialog
+      :visible.sync="dialogDR"
+      width="660px"
+      :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="dialogDR = false"
+          />
+        </div>
+      </div>
+      <div>
+        <div class="swq">
+          <img
+            style="width: 182px; height: 168px"
+            src="@/assets/images/dr.png"
+            alt=""
+          />
+        </div>
+        <div style="padding: 40px">
+          <el-row>
+            <el-col :span="12"
+              ><div style="text-align: end; padding-right: 14px">
+                填写资料审核状态:
+              </div></el-col
+            >
+            <el-col :span="12">
+              <el-radio-group v-model="activeDCIndex">
+                <el-radio
+                  style="display: block; margin-bottom: 16px"
+                  v-for="(items, indexs) in DCLIST"
+                  :key="indexs"
+                  :label="items.value"
+                  >{{ items.label }}</el-radio
+                >
+              </el-radio-group>
+            </el-col>
+          </el-row>
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogDR = false">取消</el-button>
+        <el-button type="primary">确定</el-button>
+      </span>
+    </el-dialog>
   </div>
 </template>
 
@@ -207,10 +264,11 @@ import searchBoxNew from "@/components/searchBoxNew";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
 export default {
-  name:"Stamp",
+  name: "Stamp",
   components: { searchBoxNew, tableList, pagination },
   data() {
     return {
+      dialogDR: false,
       disabledBtn: false,
       dialogVisibleRecord: false,
       shType: true,
@@ -393,6 +451,13 @@ export default {
       listInfos: [],
       recordList: [{ keyValueArrays: [] }], //记录列表
       activeIndex: 0,
+      activeDCIndex: 1, //导出按钮索引
+      DCLIST: [
+        { label: "全部", value: 1 },
+        { label: "待审核", value: 2 },
+        { label: "审核通过", value: 3 },
+        { label: "审核不通过", value: 4 }
+        ],//导出按钮列表
     };
   },
   mounted() {
@@ -402,6 +467,10 @@ export default {
     this.search();
   },
   methods: {
+    moreActive() {
+      this.activeDCIndex = 1;
+      this.dialogDR = true;
+    },
     changeIndex(v) {
       if (this.activeIndex === v) {
         return;
@@ -727,6 +796,10 @@ export default {
     }
   }
 }
+.swq {
+  text-align: center;
+  border-bottom: 1px solid #eee;
+}
 .imgBox {
   width: 100%;
   // height: 210px;

+ 9 - 9
src/views/education/examManagement/applicationData/asPlanned.vue

@@ -338,8 +338,7 @@
 </template>
 
 <script>
-import * as baseUrls from "@/utils/methodsTool.js";
-import * as baseUrlst from "@/utils/request.js";
+import * as baseUrls from "@/utils/request.js";
 import searchBoxNew from "@/components/searchBoxNew";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
@@ -638,9 +637,8 @@ export default {
       let formData = new FormData();
       formData.append("file", file);
       this.$api.editsystemimportDatae(formData).then((res) => {
-        e.target.value = "";
         if (res.msg) {
-          let url = baseUrlst.baseURL + "common/download?fileName=" + res.msg;
+          let url = baseUrls.baseURL + "common/download?fileName=" + res.msg;
           let link = document.createElement("a");
           let fileName = "失败原因" + ".xlsx";
           document.body.appendChild(link);
@@ -653,7 +651,9 @@ export default {
           self.$message.success("导入成功");
         }
         self.search();
-      });
+      }).finally(()=>{
+        e.target.value = "";
+      })
     },
     importMobleEdit(e) {
       var self = this;
@@ -661,7 +661,6 @@ export default {
       let formData = new FormData();
       formData.append("file", file);
       this.$api.editsystemimportUpdateData(formData).then((res) => {
-        e.target.value = "";
         if (res.msg) {
           let url =
             "http://192.168.1.12:5030/common/download?fileName=" + res.msg;
@@ -677,7 +676,9 @@ export default {
           self.$message.success("导入成功");
         }
         self.search();
-      });
+      }).finally(()=>{
+        e.target.value = "";
+      })
     },
     openZS(row, int) {
       if (row.examStatus !== 1) {
@@ -798,8 +799,7 @@ export default {
         );
         var ast = this.peopleList.every((item) => {
           return (
-            item.examStatus === 0 &&
-            item.subscribeStatus === 1 
+            item.examStatus === 0 && item.subscribeStatus === 1
             // && item.beforeCount
           );
         });

+ 0 - 1
src/views/education/examManagement/examArrangement/index.vue

@@ -1118,7 +1118,6 @@ this.$message.warning(
         }
         this.dialogExamBoxs = false;
         this.search();
-        18988855344;
       });
     },
     //添加考点地点

+ 1 - 0
src/views/education/notificationManageMent/notificationList/add/index.vue

@@ -364,6 +364,7 @@
           <span v-if="idCods === 2">第</span>
           <el-input-number
             size="small"
+            :precision="idCods === 2 ? 0 : 2"
             :min="0"
             :max="
               idCods === 1

+ 1 - 0
src/views/education/notificationManageMent/notificationList/edit/index.vue

@@ -362,6 +362,7 @@
           <span v-if="idCods === 2">第</span>
           <el-input-number
             size="small"
+            :precision="idCods === 2 ? 0 : 2"
             :min="0"
             :max="
               idCods === 1

+ 14 - 7
src/views/education/studentManageMent/studentXQ/BankQuestionPassRecord.vue

@@ -87,7 +87,11 @@
               {{ $methodsTools.onlyForma(scope.row[item.prop2]) }}
             </span>
             <span v-else-if="item.scope === 'computes'">
-              {{ ((scope.row[item.prop1] / scope.row[item.prop2]) * 100).toFixed(2) }}%
+              {{
+                ((scope.row[item.prop1] / scope.row[item.prop2]) * 100).toFixed(
+                  2
+                )
+              }}%
             </span>
             <span v-else>
               {{ scope.row[item.prop] }}{{ item.ch ? item.ch : "" }}
@@ -207,7 +211,8 @@
                   <td>做题用时(分)</td>
                   <td>做题状态</td>
                   <td>已答题数</td>
-                  <td>得分</td>
+                  <td>得分(不含主观题)</td>
+                  <td>得分(含主观题)</td>
                 </tr>
                 <tr>
                   <td>
@@ -224,6 +229,7 @@
                       getInfoRecord.totalQuestionNum
                     }}
                   </td>
+                  <td>{{ getInfoRecord.performance }}</td>
                   <td>{{ getInfoRecord.performance + getInfoRecord.score }}</td>
                 </tr>
               </table>
@@ -608,7 +614,7 @@ export default {
       getInfoRecord: {}, //当前点击的数据
       numPrise: "", //当前弹窗分数
       activeIndexs: "",
-      maxScore:0,//弹窗评分最大值
+      maxScore: 0, //弹窗评分最大值
     };
   },
   mounted() {
@@ -631,7 +637,8 @@ export default {
       for (let i = 0; i < data.historyExamJson.length; i++) {
         if (
           (data.historyExamJson[i].type === 4 ||
-            data.historyExamJson[i].type === 5) && data.historyExamJson[i].scoreResult
+            data.historyExamJson[i].type === 5) &&
+          data.historyExamJson[i].scoreResult
         ) {
           data.score += data.historyExamJson[i].scoreResult;
         }
@@ -651,7 +658,7 @@ export default {
       this.visible = false;
     },
     setMath(option, indexs) {
-      this.maxScore = option.score
+      this.maxScore = option.score;
       this.numPrise = this.getInfoRecord.historyExamJson[indexs].scoreResult;
       this.activeIndexs = indexs;
       this.visible = true;
@@ -747,8 +754,8 @@ export default {
       }
       this.$api.obtainrecordexam(id).then((res) => {
         res.data.historyExamJson = JSON.parse(res.data.historyExamJson);
-        if(!res.data.score){
-          res.data.score = 0
+        if (!res.data.score) {
+          res.data.score = 0;
         }
         this.getInfoRecord = res.data;
       });

+ 14 - 10
src/views/resource/bankManagement/topicManagement/index.vue

@@ -206,7 +206,7 @@
 </template>
 
 <script>
-import * as baseUrls from "@/utils/methodsTool.js";
+import * as baseUrls from "@/utils/request.js";
 import searchBoxNew from "@/components/searchBoxNew";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
@@ -214,7 +214,7 @@ import busIns from "@/components/busIns";
 import questionBank from "@/components/questionBank";
 export default {
   components: { questionBank, busIns, tableList, pagination, searchBoxNew },
-  name:"TopicManagement",
+  name: "TopicManagement",
   data() {
     return {
       statusHide: false,
@@ -366,7 +366,7 @@ export default {
     this.getFns();
     this.search();
   },
-  activated(){
+  activated() {
     this.getFns();
     this.search();
   },
@@ -387,11 +387,15 @@ export default {
       var file = e.target.files[0];
       let formData = new FormData();
       formData.append("file", file);
-      this.$api.importDatabankquestion(formData).then((res) => {
-        self.$message.success("导入成功");
-      }).finally(()=>{
-        self.search();
-      })
+      this.$api
+        .importDatabankquestion(formData)
+        .then((res) => {
+          self.$message.success("导入成功");
+        })
+        .finally(() => {
+          self.search();
+          e.target.value = "";
+        });
     },
     editInfo(v) {
       this.addClick(v, 0);
@@ -505,8 +509,8 @@ export default {
                 });
               });
             self.activeExam = a;
-          }else{
-            self.activeExam = []
+          } else {
+            self.activeExam = [];
           }
           if (res.data.type === 2) {
             if (res.data.answerQuestion) {

+ 10 - 0
src/views/resource/handoutManagement/handoutList/add/index.vue

@@ -92,6 +92,12 @@
         <el-form-item label="讲义标题" prop="handoutsName">
           <el-input v-model="listData.handoutsName"></el-input>
         </el-form-item>
+        <el-form-item label="是否可下载" prop="canDownload">
+          <el-radio-group v-model="listData.canDownload">
+            <el-radio :label="1">是</el-radio>
+            <el-radio :label="0">否</el-radio>
+          </el-radio-group>
+        </el-form-item>
         <el-form-item label="是否发布" prop="status">
           <el-radio-group v-model="listData.status">
             <el-radio :label="1">是</el-radio>
@@ -166,6 +172,9 @@ export default {
         handoutsName: [
           { required: true, message: "请输入讲义标题", trigger: "blur" },
         ],
+        canDownload:[
+          { required: true, message: "请选择是否可下载", trigger: "change" },
+        ],
         status: [
           { required: true, message: "请选择是否发布", trigger: "change" },
         ],
@@ -324,6 +333,7 @@ export default {
         handoutsName: this.listData.handoutsName,
         courseHandoutsBusinessAddBos: this.newSujectApis,
         status: this.listData.status,
+        canDownload: this.listData.canDownload,
         coverUrl: this.listData.coverUrl,
       };
       if (this.listData.handoutsUrl) {

+ 10 - 0
src/views/resource/handoutManagement/handoutList/edit/index.vue

@@ -126,6 +126,12 @@
             </div>
           </div>
         </el-form-item>
+        <el-form-item label="是否可下载" prop="canDownload">
+          <el-radio-group v-model="listData.canDownload">
+            <el-radio :label="1">是</el-radio>
+            <el-radio :label="0">否</el-radio>
+          </el-radio-group>
+        </el-form-item>
         <el-form-item label="是否发布" prop="status">
           <el-radio-group v-model="listData.status">
             <el-radio :label="1">是</el-radio>
@@ -170,6 +176,9 @@ export default {
         handoutsName: [
           { required: true, message: "请输入讲义标题", trigger: "blur" },
         ],
+        canDownload:[
+          { required: true, message: "请选择是否可下载", trigger: "change" },
+        ],
         status: [
           { required: true, message: "请选择是否发布", trigger: "change" },
         ],
@@ -365,6 +374,7 @@ export default {
         courseHandoutsBusinessAddBos: this.newSujectApis,
         handoutsName: this.listData.handoutsName,
         status: this.listData.status,
+        canDownload:this.listData.canDownload
       };
       if (this.listData.handoutsUrl !== this.bfImg) {
         if (this.listData.handoutsUrl) {

+ 32 - 13
src/views/resource/handoutManagement/handoutList/index.vue

@@ -37,7 +37,7 @@ import searchBoxNew from "@/components/searchBoxNew";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
 export default {
-  name:"HandoutList",
+  name: "HandoutList",
   components: { searchBoxNew, tableList, pagination },
   data() {
     return {
@@ -56,7 +56,7 @@ export default {
       },
       //搜索
       formList: [
-         {
+        {
           prop: "educationId",
           placeholder: "教育类型",
           scope: "educationType",
@@ -80,7 +80,7 @@ export default {
           options: [
             {
               label: "全部状态",
-              value: '0,1',
+              value: "0,1",
             },
             {
               label: "发布",
@@ -122,6 +122,22 @@ export default {
           scope: "mapTypesMores",
           width: "400",
         },
+        {
+          label: "是否可下载",
+          prop: "canDownload",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            {
+              label: "是",
+              value: 1,
+            },
+            {
+              label: "否",
+              value: 0,
+            },
+          ],
+        },
         {
           label: "发布状态",
           prop: "status",
@@ -138,8 +154,8 @@ export default {
   mounted() {
     this.search();
   },
-  activated(){
-    this.search()
+  activated() {
+    this.search();
   },
   methods: {
     editInfo(v) {
@@ -147,7 +163,7 @@ export default {
     },
     search(int) {
       this.loading = true;
-       if (int === 1) {
+      if (int === 1) {
         this.formData.pageNum = 1;
       }
       if (int === 2) {
@@ -157,13 +173,16 @@ export default {
           pageNum: 1,
         };
       }
-      this.$api.inquireCourseHandoutsList(this.formData).then((res) => {
-        this.tableData = res.rows;
-        this.total = res.total;
-        this.navText.index = res.total;
-      }).finally(()=>{
-        this.loading = false;
-      })
+      this.$api
+        .inquireCourseHandoutsList(this.formData)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
     },
     init() {
       this.search(2);

+ 0 - 0
src/views/resource/handoutManagement/tang.md


+ 95 - 9
src/views/resource/videoManagement/festival/add/index.vue

@@ -133,6 +133,14 @@
             >
             </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
@@ -208,6 +216,14 @@
             >
             </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="节时长"
@@ -291,23 +307,48 @@
         <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'
+import { uploadFile } from "@/utils/uopladFile.js";
 export default {
   data() {
     return {
       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', // 标签
+        desc: "i am desc", // 描述
+        cataid: "1639399775001", // 分类ID 可以后端传递 也可以不写 或写死
+        tag: "i am tag", // 标签
         luping: 0, // 是否开启视频课件优化处理,对于上传录屏类视频清晰度有所优化:0为不开启,1为开启
-        keepsource: 1 // 是否源文件播放(不对视频进行编码):0为编码,1为不编码
+        keepsource: 1, // 是否源文件播放(不对视频进行编码):0为编码,1为不编码
       },
       sectionTypeOptions: [
         {
@@ -385,6 +426,10 @@ export default {
         document.body.appendChild(myScript);
       } else {
         callback();
+        this.player.on("serverError", (...params) => {
+          this.$message.error(returnTitle(params[1]));
+          console.log(params);
+        });
       }
     },
     loadPlayer() {
@@ -426,6 +471,47 @@ export default {
     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];
@@ -433,8 +519,8 @@ export default {
       // formData.append("file", file);
       // console.log(formData);
       if (!event.target.value) {
-        this.$message.error('请选择您要上传的文件')
-        return false
+        this.$message.error("请选择您要上传的文件");
+        return false;
       }
       /**
        * @param: event.target.files -> 传递的文件list
@@ -442,8 +528,8 @@ export default {
        * @param: 回调
        */
       uploadFile(file, this.fileSetting, (index, event) => {
-        this.listData.recordingUrl = event.vid
-      })
+        this.listData.recordingUrl = event.vid;
+      });
     },
     getMessage() {
       if (!this.courType) {

+ 82 - 0
src/views/resource/videoManagement/festival/edit/index.vue

@@ -132,6 +132,14 @@
             >
             </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
@@ -298,17 +306,43 @@
         <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 { returnTitle } from "@/utils/polyvError.js";
 import { uploadFile } from "@/utils/uopladFile.js";
 export default {
   data() {
     return {
       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 可以后端传递 也可以不写 或写死
@@ -391,6 +425,10 @@ export default {
         document.body.appendChild(myScript);
       } else {
         callback();
+        this.player.on("serverError", (...params) => {
+          this.$message.error(returnTitle(params[1]));
+          console.log(params);
+        });
       }
     },
     loadPlayer() {
@@ -432,6 +470,50 @@ export default {
     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();
+        // this.playerzb.on("serverError", (...err) => {
+        //   console.log(err, 321);
+        // });
+      }
+    },
+
+    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];

+ 115 - 15
src/views/resource/videoManagement/festival/index.vue

@@ -15,6 +15,11 @@
       :loading="loading"
       @editInfo="editInfo"
     >
+      <template slot="customize">
+        <el-button size="medium" type="success" @click="moreActive"
+          >批量导入</el-button
+        >
+      </template>
       <template slot="btn" slot-scope="props">
         <el-button type="text" @click="addClick(props.scope.row, 0)"
           >修改</el-button
@@ -29,25 +34,79 @@
       @handleSizeChange="handleSizeChange"
       @handleCurrentChange="handleCurrentChange"
     />
+    <el-dialog
+      :visible.sync="dialogDR"
+      width="660px"
+      :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="dialogDR = false"
+          />
+        </div>
+      </div>
+      <div>
+        <div class="swq">
+          <img
+            style="width: 182px; height: 168px"
+            src="@/assets/images/dr.png"
+            alt=""
+          />
+        </div>
+        <div style="padding-left: 100px">
+          <p>第一步:下载导入模板</p>
+          <p style="padding-left: 50px">
+            <i class="el-icon-upload"></i
+            ><span class="dowmStys" @click="getDowm">下载模板</span>
+          </p>
+          <p>
+            第二步:(批量新增):点击“上传Excel”完成导入
+          </p>
+          <label
+            for="mobles"
+            class="el-button el-button--primary"
+            style="margin-left: 50px; padding: 10px 20px"
+            >上传Excel</label
+          ><input
+            style="display: none"
+            type="file"
+            id="mobles"
+            ref="input1"
+            @change="importMobleadd"
+          />
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogDR = false">取消</el-button>
+        <!-- <el-button type="primary" @click="submitChecksDR">确定</el-button> -->
+      </span>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import * as baseUrls from "@/utils/request.js";
 import searchBoxNew from "@/components/searchBoxNew";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
 export default {
-  name:"Festival",
+  name: "Festival",
   components: { searchBoxNew, tableList, pagination },
   data() {
     return {
+      dialogDR: false, //导入窗口
       loading: false, //当前表单加载是否加载动画
       navText: {
         title: "节类型",
         index: 0,
         ch: "条",
         num: true,
-        border:true,
+        border: true,
         choice: true,
         addHide: false,
         backFatherBtn: {
@@ -66,13 +125,13 @@ export default {
           prop: "businessId",
           placeholder: "业务层次",
           scope: "businessLevel",
-          edu:"educationTypeId"
+          edu: "educationTypeId",
         },
         {
           prop: "subjectId",
           placeholder: "科目",
           scope: "sujectType",
-          edu:"educationTypeId"
+          edu: "educationTypeId",
         },
         {
           prop: "sectionType",
@@ -147,7 +206,7 @@ export default {
           label: "适用业务层级",
           prop: "businessList",
           hidden: true,
-          scope: "mapTypesMores", 
+          scope: "mapTypesMores",
           width: "280",
         },
         {
@@ -157,7 +216,7 @@ export default {
           hidden: true,
           scope: "aboutChapter",
           width: "150",
-          int:1
+          int: 1,
         },
         // {
         //   label: "关联模块",
@@ -212,10 +271,39 @@ export default {
   mounted() {
     this.search();
   },
-  activated(){
-    this.search()
+  activated() {
+    this.search();
   },
   methods: {
+    getDowm() {
+      let url = baseUrls.BASE_IMG_URL + "/oss/images/file/20220110.xlsx";
+      let link = document.createElement("a");
+      let fileName = "导入模板" + ".xlsx";
+      document.body.appendChild(link);
+      link.href = url;
+      link.dowmload = fileName;
+      link.click();
+      link.remove();
+    },
+    importMobleadd(e) {
+      var self = this;
+      var file = e.target.files[0];
+      let formData = new FormData();
+      formData.append("file", file);
+      this.$api.drCourseSectionimportData(formData).then((res) => {
+        if(res.code === 200){
+          self.$message.success("导入成功")
+          self.search();
+        }else{
+          self.$message.error(res.msg)
+        }
+      }).finally(()=>{
+        e.target.value = "";
+      })
+    },
+    moreActive() {
+      this.dialogDR = true;
+    },
     editInfo(v) {
       this.addClick(v, 0);
     },
@@ -231,13 +319,16 @@ export default {
           pageNum: 1,
         };
       }
-      this.$api.inquireCourseSection(this.formData).then((res) => {
-        this.tableData = res.rows;
-        this.total = res.total;
-        this.navText.index = res.total;
-      }).finally(()=>{
-        this.loading = false;
-      })
+      this.$api
+        .inquireCourseSection(this.formData)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
     },
     init() {
       this.search(2);
@@ -338,6 +429,15 @@ export default {
     }
   }
 }
+
+.swq {
+  text-align: center;
+  border-bottom: 1px solid #eee;
+}
+.dowmStys {
+  color: blue;
+  cursor: pointer;
+}
 .imgBox {
   width: 100%;
   // height: 210px;

+ 67 - 5
src/views/resource/videoManagement/flow/index.vue

@@ -15,6 +15,11 @@
       :loading="loading"
       @editInfo="editInfo"
     >
+      <!-- <template slot="customize">
+        <el-button size="small" type="success" @click="moreActive"
+          >同步BL频道</el-button
+        >
+      </template> -->
       <template slot="btn" slot-scope="props">
         <el-button type="text" @click="addClick(props.scope.row, 0)"
           >修改</el-button
@@ -194,6 +199,30 @@
         >
       </span>
     </el-dialog>
+    <el-dialog
+      :visible.sync="disBoxs"
+      width="440px"
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">选择同步BL频道分类</div>
+        <div class="rightBoxs">
+          <img
+            src="@/assets/images/Close@2x.png"
+            alt=""
+            @click="disBoxs = false"
+          />
+        </div>
+      </div>
+      <div class="max-heightSty">
+        <el-tree :props="props" :load="loadNode" lazy show-checkbox> </el-tree>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="disBoxs = false">取 消</el-button>
+        <el-button @click="submitForms">确 定</el-button>
+      </span>
+    </el-dialog>
   </div>
 </template>
 
@@ -202,10 +231,11 @@ import searchBoxNew from "@/components/searchBoxNew";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
 export default {
-  name:"Flow",
+  name: "Flow",
   components: { searchBoxNew, tableList, pagination },
   data() {
     return {
+      disBoxs: false, //弹窗Bool
       changeHeight: true,
       loading: false, //当前表单加载是否加载动画
       navText: {
@@ -213,7 +243,7 @@ export default {
         index: 0,
         ch: "条",
         num: true,
-        border:true,
+        border: true,
         choice: true,
         addHide: false,
         backFatherBtn: {
@@ -463,6 +493,10 @@ export default {
           },
         ],
       },
+      props: {
+        label: "cataname",
+        children: "children",
+      },
     };
   },
   watch: {
@@ -473,12 +507,36 @@ export default {
   mounted() {
     this.search();
     this.initOptions();
+    this.getInfosPL();
   },
-  activated(){
-    this.search()
+  activated() {
+    this.search();
     this.initOptions();
+    this.getInfosPL();
   },
   methods: {
+    loadNode(node, resolve) {
+      console.log(node);
+      if (node.level === 0) {
+        this.$api.obtainpolyvvideosignlistCata({ cataid: 1 }).then((res) => {
+          return resolve(res.rows);
+        });
+      }
+      if (node.level >= 1) {
+        this.$api
+          .obtainpolyvvideosignlistCata({ parentid: node.data.cataid })
+          .then((res) => {
+            return resolve(res.rows);
+          });
+      }
+    },
+    getInfosPL() {
+      this.$api.obtainpolyvvideosignlistCata().then((res) => {});
+    },
+    submitForms() {},
+    moreActive() {
+      this.disBoxs = true;
+    },
     getMessage() {
       if (!this.eduType) {
         this.$message.warning("请先选择教育类型");
@@ -606,7 +664,7 @@ export default {
         this.statusPop = 1;
         this.listData = {
           status: 1,
-          streamingAddressType:1,
+          streamingAddressType: 1,
         };
         this.eduType = "";
         this.cauType = [];
@@ -704,6 +762,10 @@ export default {
 </script>
 
 <style lang="less" scoped>
+.max-heightSty {
+  max-height: 500px;
+  overflow-y: auto;
+}
 /deep/.el-button {
   border-radius: 8px;
 }

+ 2 - 2
src/views/systemManagement/systemConfig/videoConfig/index.vue

@@ -15,7 +15,7 @@
             </el-radio-group>
           </el-form-item>
         </el-form>
-        <el-button @click="submit">保存</el-button>
+        <el-button @click="submit" v-hasPermi="['system:config:edit']">保存</el-button>
       </div>
     </div>
     <div class="boxWs">
@@ -58,7 +58,7 @@
             </el-form-item>
           </template>
         </el-form>
-        <el-button @click="submitVideo">保存</el-button>
+        <el-button @click="submitVideo" >保存</el-button>
       </div>
     </div>
     <div class="boxWs">

+ 16 - 7
src/views/systemSettings/menu/index.vue

@@ -116,8 +116,8 @@
             @click="handleUpdate(scope.row)"
             >修改</el-button
           >
+          <!-- v-if="scope.row.menuType === 'M'" -->
           <el-button
-          v-if="scope.row.menuType === 'M'"
             size="mini"
             type="text"
             icon="el-icon-plus"
@@ -363,15 +363,24 @@ export default {
         children: node.children,
       };
     },
+    // /** 查询菜单下拉树结构 */
+    // getTreeselect() {
+    //   this.$api.getsystemmenu().then((response) => {
+    //     this.menuOptions = [];
+    //     const menu = { menuId: 0, menuName: "主类目", children: [] };
+    //     response = response.data.filter((item,index) => {
+    //       return item.menuType == 'M'
+    //     })
+    //     menu.children = this.handleTree(response, "menuId");
+    //     this.menuOptions.push(menu);
+    //   });
+    // },
     /** 查询菜单下拉树结构 */
     getTreeselect() {
-      this.$api.getsystemmenu().then((response) => {
+      this.$api.getsystemmenu().then(response => {
         this.menuOptions = [];
-        const menu = { menuId: 0, menuName: "主类目", children: [] };
-        response = response.data.filter((item,index) => {
-          return item.menuType == 'M'
-        })
-        menu.children = this.handleTree(response, "menuId");
+        const menu = { menuId: 0, menuName: '主类目', children: [] };
+        menu.children = this.handleTree(response.data, "menuId");
         this.menuOptions.push(menu);
       });
     },

+ 1 - 1
vue.config.js

@@ -5,7 +5,7 @@ function resolve(dir) {
   return path.join(__dirname, dir)
 }
 
-const name = process.env.VUE_APP_TITLE || '中正高校端管理系统' // 网页标题
+const name = process.env.VUE_APP_TITLE || '祥粤云学堂管理后台' // 网页标题
 
 const port = process.env.port || process.env.npm_config_port || 80 // 端口