Selaa lähdekoodia

fix:bug+add:章新增编辑自定义节

Tang 3 vuotta sitten
vanhempi
commit
9e670b8f5a

+ 2 - 2
src/layout/components/Navbar.vue

@@ -51,8 +51,8 @@
             </div>
           </div>
           <div class="dialogSty">
-            <h2>v1.0.0</h2>
-            <p>1.开发中...待完善</p>
+            <h2>v6.0.0</h2>
+            <p>1.第六阶段完整版</p>
           </div>
           <span slot="footer" class="dialog-footer">
             <el-button @click="dialogVisible = false">关 闭</el-button>

+ 8 - 0
src/newApi/festival.js

@@ -55,4 +55,12 @@ export default {
             method: 'get',
         })
     },
+    //批量新增课程小节
+    drCourseSectionaddMore(data) {
+        return request({
+            url: '/course/section/addMore',
+            method: 'post',
+            data
+        })
+    },
 }

+ 1 - 0
src/views/education/mockTestManagement/mockExamArrangement/activeExam.vue

@@ -90,6 +90,7 @@
                   scope.row[item.prop3]
                 }}
               </span>
+              <span v-else-if="item.scope === 'fabStatus'">{{scope.row[item.prop] === 1 ? '已发布':'未发布'}}</span>
               <span v-else>{{ scope.row[item.prop] }}</span></template
             >
           </el-table-column>

+ 1 - 3
src/views/resource/baseManageInfos/resource/businessLevel/index.vue

@@ -324,10 +324,8 @@ export default {
         },
         {
           label: "业务层次名称",
-          prop1: "projectName",
-          prop2: "businessName",
+          prop: "businessName",
           hidden: true,
-          scope: "editInfoMore",
         },
         {
           label: "教育类型",

+ 24 - 1
src/views/resource/videoManagement/chapter/add/index.vue

@@ -209,6 +209,7 @@
             <el-button size="small" type="success" @click="dialogDRFunc"
               >Excel批量新增</el-button
             >
+            <el-button size="small" @click="addSection">自定义添加节</el-button>
           </div>
           <div style="color: #f56c6c">
             <span style="margin-right: 10px"
@@ -499,6 +500,7 @@
       </span>
     </el-dialog>
     <video-preview ref="preview" />
+    <add-section ref="addSection" @backData="backData" />
   </div>
 </template>
 
@@ -507,8 +509,9 @@ import * as baseUrls from "@/utils/request.js";
 import searchBoxNew from "@/components/searchBoxNew";
 import pagination from "@/components/pagination";
 import videoPreview from "@/components/videoPreview";
+import addSection from "../addSection.vue";
 export default {
-  components: { searchBoxNew, pagination, videoPreview },
+  components: { searchBoxNew, pagination, videoPreview,addSection },
   name: "ChapterAdd",
   data() {
     return {
@@ -667,6 +670,26 @@ export default {
     }
   },
   methods: {
+    /**
+     * 打开添加节组件
+     */
+    addSection() {
+      if (!this.newSujectApis.length) {
+        this.$message.warning("请选择科目");
+        return;
+      }
+      this.$refs.addSection.openBoxs(this.newSujectApis);
+    },
+    /**
+     * 添加节-返回数据
+     */
+    backData(v) {
+      console.log(v)
+      this.$api.inquireCourseSection({ sectionIds: v }).then((res) => {
+        this.activeLists = res.rows;
+        this.submitForm();
+      });
+    },
     jumpChapter(v) {
       const jump = () => {
         this.$store.dispatch("changefestivalPage", {

+ 355 - 0
src/views/resource/videoManagement/chapter/addSection.vue

@@ -0,0 +1,355 @@
+<template>
+  <div id="addSection">
+    <el-dialog
+      :visible.sync="dialogVisible"
+      width="900px"
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">添加节</div>
+        <div class="rightBoxs">
+          <img
+            src="@/assets/images/Close@2x.png"
+            alt=""
+            @click="dialogVisible = false"
+          />
+        </div>
+      </div>
+      <div>
+        <p>
+          <el-button :size="size" type="primary" @click="addChapterList"
+            >添加</el-button
+          >
+        </p>
+        <div class="heightMax">
+          <div v-for="(item, index) in list" :key="index">
+            <el-form
+              label-width="130px"
+              class="elform_style"
+              :ref="`listRulesList${index}`"
+              :model="list[index]"
+              :rules="rules"
+            >
+              <div class="left_box">
+                <el-form-item label="标题前缀" prop="prefixName">
+                  <el-input v-model="item.prefixName"></el-input>
+                  <p class="p_style">注:便于检索、归类,以及区分一样的标题</p>
+                </el-form-item>
+                <el-form-item label="节标题" prop="name">
+                  <el-input v-model="item.name"></el-input>
+                  <p class="p_style">
+                    注:请尽量规范易懂,方便在课程目录表呈现给学员
+                  </p>
+                </el-form-item>
+                <el-form-item label="节类型" prop="sectionType">
+                  <el-select
+                    clearable
+                    v-model="item.sectionType"
+                    placeholder="请选择节类型"
+                    @change="changesType(index, $event)"
+                  >
+                    <el-option
+                      v-for="(item, index) in sectionTypeOptions"
+                      :key="index"
+                      :label="item.label"
+                      :value="item.value"
+                    >
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+                <el-form-item
+                  v-if="item.sectionType"
+                  :label="item.sectionType === 1 ? 'URL地址' : '频道号'"
+                  prop="url"
+                >
+                  <el-input v-model="item.url"></el-input>
+                </el-form-item>
+                <div v-if="item.sectionType === 1">
+                  <el-form-item label="节时长" prop="durationTime">
+                    <el-time-picker
+                      value-format="HH:mm:ss"
+                      range-separator=":"
+                      v-model="item.durationTime"
+                      placeholder="请填入节时长"
+                    >
+                    </el-time-picker>
+                  </el-form-item>
+                </div>
+                <div v-if="item.sectionType === 2">
+                  <el-form-item label="直播开始时间" prop="liveStartTime">
+                    <el-date-picker
+                      v-model="item.liveStartTime"
+                      type="datetime"
+                      placeholder="请选择直播开始时间"
+                      value-format="timestamp"
+                      @change="changeStartTime(index, $event)"
+                    >
+                    </el-date-picker>
+                  </el-form-item>
+                  <el-form-item label="直播结束时间" prop="liveEndTime">
+                    <el-date-picker
+                      v-model="item.liveEndTime"
+                      type="datetime"
+                      placeholder="请选择直播结束时间"
+                      value-format="timestamp"
+                      @change="changeEndTime(index, $event)"
+                    >
+                    </el-date-picker>
+                  </el-form-item>
+                  <el-form-item
+                    label="直播时长"
+                    v-if="item.liveStartTime && item.liveEndTime"
+                  >
+                    {{ compTimeOUT(item.liveStartTime, item.liveEndTime) }}
+                  </el-form-item>
+                </div>
+                <el-form-item label="讲师" prop="teacherId">
+                  <el-select
+                    clearable
+                    v-model="item.teacherId"
+                    placeholder="请选择讲师"
+                  >
+                    <el-option
+                      v-for="(item, index) in teacherList"
+                      :key="index"
+                      :label="item.teacherName"
+                      :value="item.teacherId"
+                    >
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+              </div>
+              <div class="clear_style">
+                <el-button :size="size" @click="list.splice(index, 1)"
+                  >删除</el-button
+                >
+              </div></el-form
+            >
+          </div>
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="submitForm" :disabled="!list.length"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      size: "small",
+      dialogVisible: false,
+      list: [],
+      rules: {
+        prefixName: [
+          { required: true, message: "请输入标题前缀", trigger: "blur" },
+        ],
+        name: [{ required: true, message: "请输入节标题", trigger: "blur" }],
+        sectionType: [
+          { required: true, message: "请选择节类型", trigger: "change" },
+        ],
+        url: [
+          { required: true, message: "请输入URL地址/频道号", trigger: "blur" },
+        ],
+        durationTime: [
+          { required: true, message: "请选择节时长", trigger: "change" },
+        ],
+        liveStartTime: [
+          { required: true, message: "请选择直播开始时间", trigger: "change" },
+        ],
+        liveEndTime: [
+          { required: true, message: "请选择直播结束时间", trigger: "change" },
+        ],
+        teacherId: [
+          { required: true, message: "请选择讲师", trigger: "change" },
+        ],
+      },
+      sectionTypeOptions: [
+        {
+          label: "录播",
+          value: 1,
+        },
+        {
+          label: "直播",
+          value: 2,
+        },
+      ],
+    };
+  },
+  mounted() {
+    this.$api.inquiresystemteacherlist({ status: 1 }).then((res) => {
+      this.teacherList = res.rows;
+    });
+  },
+  computed: {
+    /**
+     * 自动计算直播时长
+     */
+    compTimeOUT: function () {
+      return function (start, end) {
+        if (start && end) {
+          if (end < start) {
+            return "请检查开始与结束的时间范围";
+          }
+          const asTimes = end / 1000 - start / 1000;
+          return this.$methodsTools.secondToDate(asTimes, false);
+        } else {
+          return "未检测到直播开始时间结束时间,无法计算!";
+        }
+      };
+    },
+  },
+  methods: {
+    /**
+     * 直播开始逻辑处理
+     */
+    changeStartTime(index, time) {
+      if (this.list[index].liveEndTime && this.list[index].liveEndTime < time) {
+        this.$set(this.list[index], "liveEndTime", "");
+        this.$message.warning("直播开始时间不能大于直播结束时间");
+        return;
+      }
+    },
+    /**
+     * 直播结束逻辑处理
+     */
+    changeEndTime(index, time) {
+      if (
+        this.list[index].liveStartTime &&
+        this.list[index].liveStartTime > time
+      ) {
+        this.$set(this.list[index], "liveEndTime", "");
+        this.$message.warning("直播结束时间不能小于直播开始时间");
+        return;
+      }
+    },
+    /**
+     * 修改节类型需要处理的逻辑
+     */
+    changesType(index, val) {
+      let ary = ["url", "durationTime", "liveStartTime", "liveEndTime"];
+      for (let i = 0; i < ary.length; i++) {
+        this.$set(this.list[index], ary[i], "");
+      }
+    },
+    /**
+     * 添加节
+     */
+    addChapterList() {
+      this.list.push({});
+    },
+    /**
+     * 打开页面触发函数
+     */
+    openBoxs(arr) {
+      this.businList = JSON.parse(JSON.stringify(arr));
+      this.list = [{}];
+      this.dialogVisible = true;
+    },
+    /**
+     * 表单校验
+     */
+    submitForm() {
+      //用Promise.all进行全部form表单的验证
+      Promise.all([
+        //数组部分的表单,用map返回验证函数的调用
+        ...this.list.map((item, index) =>
+          this.validateForm(`listRulesList${index}`)
+        ),
+      ])
+        .then((res) => {
+          if (res) {
+            // 全部表单验证通过
+            this.submitForms();
+          }
+        })
+        .catch(() => {
+          this.$message.error("请检查必填项是否填写规范");
+        });
+    },
+    validateForm(refs) {
+      //获取到form表单的dom,如果是对象直接拿到,如果是数组,就拿第一个
+      //elementui对循环的form包装成了数组
+      let valiForm = this.$refs?.[refs].validate
+        ? this.$refs?.[refs]
+        : this.$refs?.[refs][0];
+      return new Promise((resolve, reject) => {
+        //在Promise里进行验证,如果通过就resolve()
+        valiForm.validate((res) => {
+          if (res) resolve();
+          else reject();
+        });
+      });
+    },
+    /**
+     * 通过验证提交逻辑
+     */
+    submitForms() {
+      let ary = JSON.parse(JSON.stringify(this.list));
+      ary.forEach((item) => {
+        if (item.sectionType === 1) {
+          item.recordingUrl = item.url;
+          delete item.url;
+        }
+        if (item.sectionType === 2) {
+          item.liveUrl = item.url;
+          item.liveStartTime = this.$methodsTools.time10to13(
+            item.liveStartTime,
+            1
+          );
+          item.liveEndTime = this.$methodsTools.time10to13(
+            item.liveEndTime,
+            1
+          );
+          delete item.url;
+        }
+        item.businessList = this.businList;
+        item.status = 1;
+        item.publishStatus = 1;
+        item.coverUrl = "oss/images/avatar/20211013/1634097664410_1397766697";
+        item.durationTime = this.$methodsTools.secondFormDate(
+          item.durationTime
+        );
+      });
+      this.$api.drCourseSectionaddMore(ary.reverse()).then((res) => {
+        this.dialogVisible = false;
+        console.log(res.data, "data");
+        this.$emit("backData", res.data);
+      });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.elform_style {
+  background-color: #eee;
+  padding: 10px 10px 0px;
+  display: flex;
+  margin-bottom: 16px;
+  .left_box {
+    flex: 1;
+  }
+  .clear_style {
+    flex-shrink: 0;
+    width: 80px;
+    vertical-align: top;
+    text-align: center;
+  }
+}
+.p_style {
+  font-size: 12px;
+  color: #a4a4a4;
+  margin: 0;
+}
+.heightMax {
+  max-height: 600px;
+  overflow: auto;
+}
+</style>

+ 24 - 1
src/views/resource/videoManagement/chapter/edit/index.vue

@@ -181,6 +181,7 @@
             <el-button size="small" type="success" @click="dialogDRFunc"
               >Excel批量新增</el-button
             >
+            <el-button size="small" @click="addSection">自定义添加节</el-button>
           </div>
           <div style="color: #f56c6c">
             <span style="margin-right: 10px"
@@ -471,6 +472,7 @@
       </span>
     </el-dialog>
     <video-preview ref="preview" />
+    <add-section ref="addSection" @backData="backData" />
   </div>
 </template>
 
@@ -479,8 +481,9 @@ import * as baseUrls from "@/utils/request.js";
 import searchBoxNew from "@/components/searchBoxNew";
 import pagination from "@/components/pagination";
 import videoPreview from "@/components/videoPreview";
+import addSection from "../addSection.vue";
 export default {
-  components: { searchBoxNew, pagination, videoPreview },
+  components: { searchBoxNew, pagination, videoPreview,addSection },
   name: "ChapterEdit",
   data() {
     return {
@@ -645,6 +648,26 @@ export default {
     }
   },
   methods: {
+    /**
+     * 打开添加节组件
+     */
+    addSection() {
+      if (!this.newSujectApis.length) {
+        this.$message.warning("请选择科目");
+        return;
+      }
+      this.$refs.addSection.openBoxs(this.newSujectApis);
+    },
+    /**
+     * 添加节-返回数据
+     */
+    backData(v) {
+      console.log(v)
+      this.$api.inquireCourseSection({ sectionIds: v }).then((res) => {
+        this.activeLists = res.rows;
+        this.submitForm();
+      });
+    },
     jumpChapter(v) {
       const jump = () => {
         this.$store.dispatch("changefestivalPage", {

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

@@ -414,7 +414,7 @@ export default {
             }
           }
           if (!newSujectOption.length) {
-            this.newSujectOption = this.sujectOption;
+            this.newSujectOption = [];
           } else {
             this.newSujectOption = newSujectOption;
           }

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

@@ -494,7 +494,7 @@ export default {
             }
           }
           if (!newSujectOption.length) {
-            this.newSujectOption = this.sujectOption;
+            this.newSujectOption = [];
           } else {
             this.newSujectOption = newSujectOption;
           }

+ 5 - 1
src/views/resource/videoManagement/moduleManagement/giftQuestionPaper.vue

@@ -50,6 +50,7 @@
           <el-table-column label="" width="45" align="center">
             <template scope="scope">
               <el-radio
+              class="el_radio"
                 :label="scope.row.ids"
                 v-model="templateRadio"
                 @change.native="templateRadio = scope.row.ids"
@@ -207,7 +208,6 @@ export default {
         this.templateRadio = arr.examType + "-" + arr.freeExamId;
       }
       this.moduleId = arr.moduleId;
-      console.log(arr);
       this.search(2);
       this.dialogVisible = true;
     },
@@ -225,6 +225,7 @@ export default {
         };
       }
       var data = JSON.parse(JSON.stringify(this.formData));
+      data.publishStatus = 1
       if (data.examType === 1) {
         self.$api
           .inquireBankModule(data)
@@ -363,4 +364,7 @@ export default {
   display: flex;
   margin-bottom: 12px;
 }
+/deep/ .el_radio > .el-radio__label {
+  padding-left: 0;
+}
 </style>