Explorar o código

保利威腾讯视频合并

En route hai 1 ano
pai
achega
d1cf84999e
Modificáronse 31 ficheiros con 1027 adicións e 242 borrados
  1. 1 0
      public/index.html
  2. 2 0
      src/api/api.js
  3. 1 1
      src/components/tableList.vue
  4. 58 10
      src/components/videoPreview/index.vue
  5. 41 0
      src/newApi/tc.js
  6. 10 0
      src/views/Marketing/goods/commodityManageMent/add/courseContent/courseCheck.vue
  7. 12 2
      src/views/Marketing/goods/commodityManageMent/add/courseContent/index.vue
  8. 13 3
      src/views/Marketing/goods/commodityManageMent/add/courseContent/moreListCheck.vue
  9. 15 0
      src/views/Marketing/goods/commodityManageMent/add/index.vue
  10. 6 0
      src/views/Marketing/goods/commodityManageMent/add/productInformation.vue
  11. 10 0
      src/views/Marketing/goods/commodityManageMent/edit/courseContent/courseCheck.vue
  12. 10 0
      src/views/Marketing/goods/commodityManageMent/edit/courseContent/index.vue
  13. 11 0
      src/views/Marketing/goods/commodityManageMent/edit/courseContent/moreListCheck.vue
  14. 15 0
      src/views/Marketing/goods/commodityManageMent/edit/index.vue
  15. 6 0
      src/views/Marketing/goods/commodityManageMent/edit/productInformation.vue
  16. 48 2
      src/views/Marketing/goods/courseInquiryList/index.vue
  17. 60 38
      src/views/resource/videoManagement/chapter/add/index.vue
  18. 47 11
      src/views/resource/videoManagement/chapter/addSection.vue
  19. 59 38
      src/views/resource/videoManagement/chapter/edit/index.vue
  20. 13 7
      src/views/resource/videoManagement/courseManagement/basicInfoAdd/index.vue
  21. 9 0
      src/views/resource/videoManagement/courseManagement/basicInfoEdit/index.vue
  22. 2 0
      src/views/resource/videoManagement/courseManagement/chapterContent/index.vue
  23. 124 37
      src/views/resource/videoManagement/festival/add/index.vue
  24. 136 58
      src/views/resource/videoManagement/festival/edit/index.vue
  25. 39 0
      src/views/resource/videoManagement/moduleManagement/add/index.vue
  26. 49 27
      src/views/resource/videoManagement/moduleManagement/addChapter.vue
  27. 38 0
      src/views/resource/videoManagement/moduleManagement/edit/index.vue
  28. 48 2
      src/views/secondBuild/courseList/index.vue
  29. 48 2
      src/views/secondJian/courseList/index.vue
  30. 48 2
      src/views/secondSeven/courseList/index.vue
  31. 48 2
      src/views/secondZao/courseList/index.vue

+ 1 - 0
public/index.html

@@ -14,6 +14,7 @@
   <!-- <script src="https://manage.xyyxt.net/static/js/gsap.min.js"></script> -->
   <!-- 使用CDN的CSS文件 -->
   <link rel="stylesheet" href="https://file.xyyxt.net/web/static/js/index.min.css">
+  <link href="https://web.sdk.qcloud.com/player/tcplayer/release/v5.1.0/tcplayer.min.css" rel="stylesheet" />
   <style>
     html,
     body,

+ 2 - 0
src/api/api.js

@@ -82,6 +82,7 @@ import examapply from '../newApi/examapply'//考试安排
 import qianpeiApi from '../newApi/qianpeiApi'//前培
 import applicationData from '../newApi/applicationData'//报考数据
 import polyv from '../newApi/polyv'//保利威
+import tc from '../newApi/tc'//腾讯
 import profiles from '../newApi/profiles'//填写资料审核管理
 import profileStamp from '../newApi/profileStamp'//盖章资料审核管理
 import recordList from '../newApi/recordList'//试卷做题记录
@@ -176,6 +177,7 @@ export default {
     ...qianpeiApi,
     ...applicationData,
     ...polyv,
+    ...tc,
     ...profiles,
     ...profileStamp,
     ...recordList,

+ 1 - 1
src/components/tableList.vue

@@ -2871,4 +2871,4 @@ export default {
   max-height: 500px;
   overflow-y: auto;
 }
-</style>
+</style>

+ 58 - 10
src/components/videoPreview/index.vue

@@ -11,7 +11,7 @@
       <div slot="title" class="hearders">
         <div class="leftTitle">视频预览</div>
         <div class="rightBoxs">
-          <img src="@/assets/images/Close@2x.png" alt="" @click="clears" />
+          <img src="@/assets/images/Close@2x.png" alt @click="clears" />
         </div>
       </div>
       <div>
@@ -34,16 +34,18 @@ export default {
       vidzb: "",
       playerJs:
         "https://player.polyv.net/resp/live-h5-player/latest/liveplayer.min.js",
+      vodPlayerJsForTCPlayer:
+        "https://web.sdk.qcloud.com/player/tcplayer/release/v5.1.0/tcplayer.v5.1.0.min.js",
       uidzb: "egsxlptzdq",
       fileSetting: {
         desc: "i am desc", // 描述
         cataid: "1639399775001", // 分类ID 可以后端传递 也可以不写 或写死
         tag: "i am tag", // 标签
         luping: 0, // 是否开启视频课件优化处理,对于上传录屏类视频清晰度有所优化:0为不开启,1为开启
-        keepsource: 1, // 是否源文件播放(不对视频进行编码):0为编码,1为不编码
+        keepsource: 1 // 是否源文件播放(不对视频进行编码):0为编码,1为不编码
       },
       diavos: false,
-      listData: {}, //数据
+      listData: {} //数据
     };
   },
   methods: {
@@ -59,7 +61,11 @@ export default {
     },
     isOkBf() {
       if (this.listData.sectionType === 1) {
-        this.loadPlayerScript(this.loadPlayer);
+        if(this.listData.viewSign == 2) {
+          this.loadPlayerScript_tencent(this.loadPlayer_tencent);
+        }else {
+          this.loadPlayerScript(this.loadPlayer);
+        }
       }
       if (this.listData.sectionType === 2) {
         this.loadPlayerScriptzb(this.loadPlayerzb);
@@ -79,6 +85,20 @@ export default {
         });
       }
     },
+    loadPlayerScript_tencent(callback) {
+      if (!window.TCPlayer) {
+        const myScript = document.createElement("script");
+        myScript.setAttribute("src", this.vodPlayerJsForTCPlayer);
+        myScript.onload = callback;
+        document.body.appendChild(myScript);
+      } else {
+        callback();
+        this.player_tencent.on("server", (...params) => {
+          this.$message.error(returnTitle(params[1]));
+          console.log(params);
+        });
+      }
+    },
     loadPlayer() {
       var self = this;
       const polyvPlayer = window.polyvPlayer;
@@ -88,11 +108,36 @@ export default {
         height: 533,
         vid: self.vid,
         teaser_show: 0,
-        playsafe: function (vid, next) {
-          self.$api.obtainpolyvvideosign(vid).then((res) => {
+        playsafe: function(vid, next) {
+          self.$api.obtainpolyvvideosign(vid).then(res => {
             next(res.data);
           });
-        },
+        }
+      });
+    },
+    loadPlayer_tencent() {
+      var self = this;
+      const TCPlayer = window.TCPlayer;
+      try {
+        let video = document.querySelector("video");
+        video.parentNode.removeChild(video);
+      } catch (error) {
+        console.log("清除video标签异常");
+      }
+      let player_tencent = document.createElement("video");
+      player_tencent.id = "player-tencent";
+      document
+        .getElementById("player")
+        .insertAdjacentElement("afterend", player_tencent);
+      self.$api.obtaintcvideosign(self.vid).then(res => {
+        self.player_tencent = TCPlayer("player-tencent", {
+          width: 800,
+          height: 533,
+          fileID: self.vid,
+          appID: res.data.appID,
+          psign: res.data.psign,
+          licenseUrl: res.data.licenseUrl
+        });
       });
     },
     /**
@@ -103,6 +148,9 @@ export default {
       if (this.listData.sectionType === 1 && this.player) {
         this.player.destroy();
       }
+      if (this.listData.sectionType === 1 && this.player_tencent) {
+        this.player_tencent.dispose();
+      }
       if (this.listData.sectionType === 2 && this.playerzb) {
         this.playerzb.destroy();
       }
@@ -127,10 +175,10 @@ export default {
         width: 800,
         height: 533,
         uid: self.uidzb,
-        vid: self.vidzb,
+        vid: self.vidzb
       });
-    },
-  },
+    }
+  }
 };
 </script>
 

+ 41 - 0
src/newApi/tc.js

@@ -0,0 +1,41 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //获取保利威视频上传签名
+    inquirepolyvvideogetPolyvUpload(data) {
+        return request({
+            url: '/polyv/video/getPolyvUpload',
+            method: 'get',
+            params: data
+        })
+    },
+    //同步保利威视频
+    uploadPolyvvideocata(data) {
+        return request({
+            url: '/polyv/video/importList',
+            method: 'post',
+            data
+        })
+    },
+    //查询保利威视频分类
+    obtainpolyvvideosignlistCata(data) {
+        return request({
+            url: '/polyv/video/listCata',
+            method: 'get',
+            params: data
+        })
+    },
+    //获取腾讯视频播放凭证
+    obtaintcvideosign(data) {
+        return request({
+            url: `/vod/video/sign/` + data,
+            method: 'get',
+        })
+    },
+    //获取腾讯视频信息详细信息
+    inquirevodvideodetail(data) {
+        return request({
+            url: `/vod/video/detail/` + data,
+            method: 'get',
+        })
+    },
+}

+ 10 - 0
src/views/Marketing/goods/commodityManageMent/add/courseContent/courseCheck.vue

@@ -71,6 +71,15 @@
                     : "未知"
                 }}
               </span>
+              <span v-else-if="item.scope === 'viewSign'">
+                {{
+                  scope.row[item.prop] === 1
+                    ? "保利威"
+                    : scope.row[item.prop] === 2
+                    ? "腾讯"
+                    : ""
+                }}
+              </span>
               <span v-else>{{ scope.row[item.prop] }}</span></template
             >
           </el-table-column></template
@@ -108,6 +117,7 @@ export default {
       tableSet: [
         { label: "课程编码", prop: "code", width: "140px" },
         { label: "名称前缀", prop: "prefixName", width: "160px" },
+        { label: "视频类型", prop: "viewSign", scope: "viewSign" },
         { label: "课程标题", prop: "courseName" },
         {
           label: "发布状态",

+ 12 - 2
src/views/Marketing/goods/commodityManageMent/add/courseContent/index.vue

@@ -80,6 +80,15 @@
               : "未知"
           }}</span>
 
+          <span v-else-if="item.scope === 'viewSign'">
+            {{
+              scope.row[item.prop] === 1
+                ? "保利威"
+                : scope.row[item.prop] === 2
+                ? "腾讯"
+                : ""
+            }}
+          </span>
           <span v-else-if="item.scope === 'busin'">
             {{ scope.row[item.prop1] + " - " + scope.row[item.prop2] }}
           </span>
@@ -150,6 +159,7 @@ export default {
       tableSetVideo: [
         { label: "排序", prop: "sort", scope: "inputs", width: "100" },
         { label: "编码", prop: "code", width: "140" },
+        { label: "视频类型", prop: "viewSign", scope: "viewSign" },
         { label: "课程名称", prop: "courseName", width: "300", type: 1 },
         { label: "类型", prop: "type", width: "190", type: 2, scope: "type" },
         { label: "名称", prop: "menuName", width: "300", type: 2 },
@@ -363,13 +373,13 @@ export default {
     /**
      * 点击选择关联题库
      */
-     openBankSet(){
+    openBankSet() {
       if (!this.listData.businessId) {
         this.$message.warning("请选择业务层次");
         return;
       }
       this.$refs.bankView.openBox(this.listData.questionRelIds || []);
-     },
+    },
     /**
      * 题库回调数据
      */

+ 13 - 3
src/views/Marketing/goods/commodityManageMent/add/courseContent/moreListCheck.vue

@@ -83,6 +83,15 @@
                     : "未知"
                 }}
               </span>
+              <span v-else-if="item.scope === 'viewSign'">
+                {{
+                  scope.row[item.prop] === 1
+                    ? "保利威"
+                    : scope.row[item.prop] === 2
+                    ? "腾讯"
+                    : ""
+                }}
+              </span>
               <span v-else>{{ scope.row[item.prop] }}</span></template
             >
           </el-table-column></template
@@ -120,6 +129,7 @@ export default {
       tableSet: [
         { label: "编码", prop: "code", width: "140px" },
         { label: "名称前缀", prop: "prefixName", width: "160px" },
+        { label: "视频类型", prop: "viewSign", scope: "viewSign" },
         { label: "模块标题", prop: "moduleName", type: 1 },
         { label: "章标题", prop: "name", type: 2 },
         { label: "节标题", prop: "name", type: 3 },
@@ -292,8 +302,9 @@ export default {
             menuId: splitStr[1],
             menuName: item.name,
             code: item.code,
-            courseId:0,
+            courseId: 0,
             publishStatus: item.publishStatus,
+            viewSign:item.viewSign,
             durationTime: item.durationTime,
             sectionType: splitStr[0] === 3 ? item.sectionType : "",
             auditionMinute:
@@ -332,5 +343,4 @@ export default {
 };
 </script>
 
-<style lang="less" scoped>
-</style>
+<style lang="less" scoped></style>

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

@@ -252,6 +252,14 @@ export default {
             trigger: "change",
           },
         ],
+        viewSign: [
+          {
+            type: "number",
+            required: true,
+            message: "请选择视频类型",
+            trigger: "change",
+          },
+        ],
         gradeType: [
           {
             type: "number",
@@ -863,6 +871,13 @@ export default {
         }
         //课程排序问题检查
         for (let i = 0; i < this.$refs.courseContent.tableData.length; i++) {
+          if (
+            this.$refs.courseContent.tableData[i].viewSign != this.listData.viewSign
+          ) {
+            this.$message.warning(`课程列表数据请与商品视频类型保持一致`);
+            this.disabledBtn = false;
+            return;
+          }
           if (
             !this.$refs.courseContent.tableData[i].sort &&
             this.$refs.courseContent.tableData[i].sort !== 0

+ 6 - 0
src/views/Marketing/goods/commodityManageMent/add/productInformation.vue

@@ -40,6 +40,12 @@
             </el-option>
           </el-select>
         </el-form-item>
+        <el-form-item label="视频类型" prop="viewSign" v-if="listData.goodsType == 1 || listData.goodsType == 6">
+          <el-radio-group v-model="listData.viewSign">
+            <el-radio :label="1">保利威</el-radio>
+            <el-radio :label="2">腾讯</el-radio>
+          </el-radio-group>
+        </el-form-item>
         <el-form-item label="教育类型" prop="educationTypeId">
           <el-select
             v-model="listData.educationTypeId"

+ 10 - 0
src/views/Marketing/goods/commodityManageMent/edit/courseContent/courseCheck.vue

@@ -71,6 +71,15 @@
                     : "未知"
                 }}
               </span>
+              <span v-else-if="item.scope === 'viewSign'">
+                {{
+                  scope.row[item.prop] === 1
+                    ? "保利威"
+                    : scope.row[item.prop] === 2
+                    ? "腾讯"
+                    : ""
+                }}
+              </span>
               <span v-else>{{ scope.row[item.prop] }}</span></template
             >
           </el-table-column></template
@@ -108,6 +117,7 @@ export default {
       tableSet: [
         { label: "课程编码", prop: "code", width: "140px" },
         { label: "名称前缀", prop: "prefixName", width: "160px" },
+        { label: "视频类型", prop: "viewSign", scope: "viewSign" },
         { label: "课程标题", prop: "courseName" },
         {
           label: "发布状态",

+ 10 - 0
src/views/Marketing/goods/commodityManageMent/edit/courseContent/index.vue

@@ -85,6 +85,15 @@
               ? "课程"
               : "未知"
           }}</span>
+              <span v-else-if="item.scope === 'viewSign'">
+                {{
+                  scope.row[item.prop] === 1
+                    ? "保利威"
+                    : scope.row[item.prop] === 2
+                    ? "腾讯"
+                    : ""
+                }}
+              </span>
           <span v-else-if="item.scope === 'busin'">
             {{ scope.row[item.prop1] + " - " + scope.row[item.prop2] }}
           </span>
@@ -234,6 +243,7 @@ export default {
       tableSetVideo: [
         { label: "排序", prop: "sort", scope: "inputs", width: "100" },
         { label: "编码", prop: "code", width: "140" },
+        { label: "视频类型", prop: "viewSign", scope: "viewSign" },
         // { label: "课程名称", prop: "courseName", width: "300", type: 1 },
         {
           label: "名称",

+ 11 - 0
src/views/Marketing/goods/commodityManageMent/edit/courseContent/moreListCheck.vue

@@ -83,6 +83,15 @@
                     : "未知"
                 }}
               </span>
+              <span v-else-if="item.scope === 'viewSign'">
+                {{
+                  scope.row[item.prop] === 1
+                    ? "保利威"
+                    : scope.row[item.prop] === 2
+                    ? "腾讯"
+                    : ""
+                }}
+              </span>
               <span v-else>{{ scope.row[item.prop] }}</span></template
             >
           </el-table-column></template
@@ -121,6 +130,7 @@ export default {
       tableSet: [
         { label: "编码", prop: "code", width: "140px" },
         { label: "名称前缀", prop: "prefixName", width: "160px" },
+        { label: "视频类型", prop: "viewSign", scope: "viewSign" },
         { label: "模块标题", prop: "moduleName", type: 1 },
         { label: "章标题", prop: "name", type: 2 },
         { label: "节标题", prop: "name", type: 3 },
@@ -296,6 +306,7 @@ export default {
             code: item.code,
             courseId:this.bfCourseId,
             publishStatus: item.publishStatus,
+            viewSign:item.viewSign,
             durationTime: item.durationTime,
             sectionType: splitStr[0] === 3 ? item.sectionType : "",
             auditionMinute:

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

@@ -279,6 +279,14 @@ export default {
             trigger: "change",
           },
         ],
+        viewSign: [
+          {
+            type: "number",
+            required: true,
+            message: "请选择视频类型",
+            trigger: "change",
+          },
+        ],
         gradeType: [
           {
             type: "number",
@@ -1094,6 +1102,13 @@ export default {
         }
         //课程排序问题检查
         for (let i = 0; i < this.$refs.courseContent.tableData.length; i++) {
+          if (
+            this.$refs.courseContent.tableData[i].viewSign != this.listData.viewSign
+          ) {
+            this.$message.warning(`课程列表数据请与商品视频类型保持一致`);
+            this.disabledBtn = false;
+            return;
+          }
           if (
             !this.$refs.courseContent.tableData[i].sort &&
             this.$refs.courseContent.tableData[i].sort !== 0

+ 6 - 0
src/views/Marketing/goods/commodityManageMent/edit/productInformation.vue

@@ -41,6 +41,12 @@
             </el-option>
           </el-select>
         </el-form-item>
+        <el-form-item label="视频类型" prop="viewSign" v-if="listData.goodsType == 1 || listData.goodsType == 6">
+          <el-radio-group v-model="listData.viewSign">
+            <el-radio :label="1">保利威</el-radio>
+            <el-radio :label="2">腾讯</el-radio>
+          </el-radio-group>
+        </el-form-item>
         <el-form-item label="教育类型" prop="educationTypeId">
           <el-select
             v-model="listData.educationTypeId"

+ 48 - 2
src/views/Marketing/goods/courseInquiryList/index.vue

@@ -45,7 +45,7 @@
           <span v-if="!activeId" style="font-size: 30px"
             >请打开目录详情,点击播放您需要观看的视频内容。</span
           >
-          <div v-show="vid" id="player"></div>
+          <div v-show="vid && viewSign == 1" id="player"></div>
           <div v-show="vidzb" id="playerzb"></div>
         </div>
         <div class="rightBoxslist">
@@ -302,7 +302,10 @@ export default {
       dialogVisible: false,
       courseList: [], //详情列表
       activeId: "", //当前选中ID
+      viewSign: 1,
       vodPlayerJs: "https://player.polyv.net/script/player.js",
+      vodPlayerJsForTCPlayer:
+        "https://web.sdk.qcloud.com/player/tcplayer/release/v5.1.0/tcplayer.v5.1.0.min.js",
       vid: "",
       playerJs:
         "https://player.polyv.net/resp/live-h5-player/latest/liveplayer.min.js",
@@ -390,6 +393,7 @@ export default {
      */
     msgInfo(option) {
       this.goodsBoxName = option.goodsName
+      this.viewSign = option.viewSign
       this.$api.obtainCourseSgoodsId(option.goodsId).then(async (res) => {
         // if (res.rows.length) {
         if (!res.rows.length) {
@@ -673,7 +677,11 @@ export default {
         this.loadPlayerScriptzb(this.loadPlayerzb);
       } else {
         this.vid = option.recordingUrl;
-        this.loadPlayerScript(this.loadPlayer);
+        if(this.viewSign == 2) {
+          this.loadPlayerScript_tencent(this.loadPlayer_tencent);
+        }else {
+          this.loadPlayerScript(this.loadPlayer);
+        }
       }
     },
     loadPlayerScript(callback) {
@@ -686,6 +694,16 @@ export default {
         callback();
       }
     },
+    loadPlayerScript_tencent(callback) {
+      if (!window.TCPlayer) {
+        const myScript = document.createElement("script");
+        myScript.setAttribute("src", this.vodPlayerJsForTCPlayer);
+        myScript.onload = callback;
+        document.body.appendChild(myScript);
+      } else {
+        callback();
+      }
+    },
     loadPlayer() {
       var self = this;
       const polyvPlayer = window.polyvPlayer;
@@ -702,6 +720,31 @@ export default {
         },
       });
     },
+    loadPlayer_tencent() {
+      var self = this;
+      const TCPlayer = window.TCPlayer;
+      try {
+        let video = document.querySelector("video");
+        video.parentNode.removeChild(video);
+      } catch (error) {
+        console.log("清除video标签异常");
+      }
+      let player_tencent = document.createElement("video");
+      player_tencent.id = "player-tencent";
+      document
+        .getElementById("player")
+        .insertAdjacentElement("afterend", player_tencent);
+      self.$api.obtaintcvideosign(self.vid).then(res => {
+        self.player_tencent = TCPlayer("player-tencent", {
+          width: 932,
+        height: 627,
+          fileID: self.vid,
+          appID: res.data.appID,
+          psign: res.data.psign,
+          licenseUrl: res.data.licenseUrl
+        });
+      });
+    },
     /**
      * @param {String} 关闭视频窗口-销毁实例
      */
@@ -713,6 +756,9 @@ export default {
         if (this.player) {
           this.player.destroy();
         }
+        if (this.player_tencent) {
+          this.player.dispose();
+        }
         if (this.playerzb) {
           this.playerzb.destroy();
         }

+ 60 - 38
src/views/resource/videoManagement/chapter/add/index.vue

@@ -201,6 +201,12 @@
             <el-radio :label="0">非公共章</el-radio>
           </el-radio-group>
         </el-form-item>
+        <el-form-item label="视频类型" prop="viewSign">
+          <el-radio-group v-model="listData.viewSign">
+            <el-radio :label="1">保利威</el-radio>
+            <el-radio :label="2">腾讯</el-radio>
+          </el-radio-group>
+        </el-form-item>
         <el-form-item label="是否发布" prop="publishStatus">
           <el-radio-group v-model="listData.publishStatus">
             <el-radio :label="1">是</el-radio>
@@ -247,15 +253,13 @@
             :prop="item.prop"
           >
             <template slot-scope="scope">
-              <span v-if="item.scope === 'types'">{{
-                scope.row[item.prop] === 1
-                  ? "录播"
-                  : scope.row[item.prop] === 2
-                  ? "直播"
-                  : scope.row[item.prop] === 3
-                  ? "回放"
-                  : "未知"
-              }}</span>
+              <span v-if="item.scope === 'isOptions'">
+                <span v-for="(items, indexs) in item.options" :key="indexs">
+                  <span v-if="scope.row[item.prop] == items.value">{{
+                    items.label
+                  }}</span>
+                </span>
+              </span>
               <span v-else-if="item.scope === 'convert'">{{
                 $methodsTools.secondToDate(scope.row[item.prop], false)
               }}</span>
@@ -264,15 +268,6 @@
                   ? scope.row[item.prop2]
                   : scope.row[item.prop1]
               }}</span>
-              <span v-else-if="item.scope === 'Status'">
-                {{
-                  scope.row[item.prop] === 1
-                    ? "发布"
-                    : scope.row[item.prop] === 0
-                    ? "未发布"
-                    : "未知"
-                }}
-              </span>
               <div v-else-if="item.scope === 'inputs'">
                 <el-input-number
                   style="width: 50px"
@@ -373,15 +368,13 @@
             header-align="center"
           >
             <template slot-scope="scope">
-              <span v-if="item.scope === 'types'">{{
-                scope.row[item.prop] === 1
-                  ? "录播"
-                  : scope.row[item.prop] === 2
-                  ? "直播"
-                  : scope.row[item.prop] === 3
-                  ? "回放"
-                  : ""
-              }}</span>
+              <span v-if="item.scope === 'isOptions'">
+                <span v-for="(items, indexs) in item.options" :key="indexs">
+                  <span v-if="scope.row[item.prop] == items.value">{{
+                    items.label
+                  }}</span>
+                </span>
+              </span>
               <span v-else-if="item.scope === 'convert'">{{
                 $methodsTools.secondToDate(scope.row[item.prop], false)
               }}</span>
@@ -390,15 +383,6 @@
                   ? scope.row[item.prop2]
                   : scope.row[item.prop1]
               }}</span>
-              <span v-else-if="item.scope === 'Status'">
-                {{
-                  scope.row[item.prop] === 1
-                    ? "发布"
-                    : scope.row[item.prop] === 0
-                    ? "未发布"
-                    : "未知"
-                }}
-              </span>
               <span v-else>{{ scope.row[item.prop] }}</span></template
             >
           </el-table-column></template
@@ -464,6 +448,7 @@ export default {
         publishStatus: 1,
         recordingUrl: "",
         liveUrl: "",
+        viewSign:1,
         coverUrl: "oss/images/avatar/20211013/1634097664410_1397766697",
       },
       eduTypeOptions: [], //教育类型数据
@@ -490,6 +475,9 @@ export default {
         commonSign: [
           { required: true, message: "请选择公共标识", trigger: "change" },
         ],
+        viewSign: [
+          { required: true, message: "请选择视频类型", trigger: "change" },
+        ],
         publishStatus: [
           { required: true, message: "请选择是否发布", trigger: "change" },
         ],
@@ -501,7 +489,29 @@ export default {
         { label: "节编码", prop: "code", width: "120" },
         { label: "标题前缀", prop: "prefixName", width: "180" },
         { label: "节标题", prop: "name", width: "310" },
-        { label: "节类型", prop: "sectionType", scope: "types" },
+        {
+          label: "节类型",
+          prop: "sectionType",
+          scope: "isOptions",
+          options: [
+            {
+              label: "录播",
+              value: 1,
+            },
+            { label: "直播", value: 2 },
+            { label: "回放", value: 3 },
+          ],
+        },
+        {
+          label: "视频类型",
+          prop: "viewSign",
+          scope: "isOptions",
+          options: [
+            { label: "保利威", value: 1 },
+            { label: "腾讯", value: 2 },
+          ],
+          width: "120",
+        },
         {
           label: "URL地址/直播地址",
           prop: "sectionType",
@@ -520,7 +530,14 @@ export default {
         {
           label: "发布状态",
           prop: "publishStatus",
-          scope: "Status",
+          scope: "isOptions",
+          options: [
+            {
+              label: "发布",
+              value: 1,
+            },
+            { label: "未发布", value: 0 },
+          ],
           width: "120",
         },
       ],
@@ -943,6 +960,10 @@ export default {
               this.$message.warning(`管理节第${i + 1}条请输入排序`);
               return;
             }
+            if(this.tableData[i].viewSign != this.listData.viewSign){
+              this.$message.warning("请保持节视频类型与章关联视频类型保持一致")
+              return
+            }
           }
           let arr = this.tableData.map((items) => {
             return items.sort;
@@ -968,6 +989,7 @@ export default {
       });
       var dataInfos = {
         status: 1,
+        viewSign:this.listData.viewSign,
         businessList: this.newSujectApis,
         sectionIdList: sectionIdList,
         coverUrl: this.listData.coverUrl,

+ 47 - 11
src/views/resource/videoManagement/chapter/addSection.vue

@@ -58,18 +58,38 @@
                     </el-option>
                   </el-select>
                 </el-form-item>
+                <el-form-item
+                  label="视频类型"
+                  prop="viewSign"
+                  v-if="item.sectionType === 1"
+                >
+                  <el-radio-group v-model="item.viewSign">
+                    <el-radio :label="1">保利威</el-radio>
+                    <el-radio :label="2">腾讯</el-radio>
+                  </el-radio-group>
+                </el-form-item>
                 <el-form-item
                   v-if="item.sectionType"
                   :label="item.sectionType === 1 ? 'URL地址' : '频道号'"
                   prop="url"
                 >
                   <el-input
+                    :disabled="
+                      item.sectionType == 1 && !item.viewSign ? true : false
+                    "
                     v-model="item.url"
                     @blur="
-                      item.sectionType === 1 ? getUrlTime(index, $event) : ''
+                      item.sectionType === 1
+                        ? getUrlTime(item.viewSign, index, $event)
+                        : ''
                     "
-                  ><el-button :disabled="item.url.length <= 0" slot="append" @click="seeTheVideoFunc(item)">预览</el-button></el-input>
-                   
+                    ><el-button
+                      :disabled="item.url.length <= 0"
+                      slot="append"
+                      @click="seeTheVideoFunc(item)"
+                      >预览</el-button
+                    ></el-input
+                  >
                 </el-form-item>
                 <div v-if="item.sectionType === 1">
                   <el-form-item label="节时长" prop="durationTime">
@@ -171,6 +191,9 @@ export default {
         sectionType: [
           { required: true, message: "请选择节类型", trigger: "change" },
         ],
+        viewSign: [
+          { required: true, message: "请选择视频类型", trigger: "change" },
+        ],
         url: [
           { required: true, message: "请输入URL地址/频道号", trigger: "blur" },
         ],
@@ -223,15 +246,22 @@ export default {
     /**
      * 查找节时长
      */
-    getUrlTime(index, value) {
+    getUrlTime(viewSign, index, value) {
       var self = this;
       let val = value.target.value;
       const valueUrl = val.replace(/\s/g, "");
-      if (valueUrl && valueUrl.length > 30) {
-        this.$api
-          .inquirepolyvvideo(valueUrl)
+      if (valueUrl && valueUrl.length > 10) {
+        this.$api[
+          viewSign == 1 ? "inquirepolyvvideo" : "inquirevodvideodetail"
+        ](valueUrl)
           .then((res) => {
             if (res.data.duration) {
+              if (viewSign == 2) {
+                res.data.duration = this.$methodsTools.secondToDate(
+                  res.data.duration,
+                  false
+                );
+              }
               this.$set(this.list[index], "durationTime", res.data.duration);
               this.$set(this.list[index], "disabled", true);
               this.$message.success("已自动录入节时长");
@@ -272,7 +302,13 @@ export default {
      * 修改节类型需要处理的逻辑
      */
     changesType(index, val) {
-      let ary = ["url", "durationTime", "liveStartTime", "liveEndTime"];
+      let ary = [
+        "url",
+        "durationTime",
+        "liveStartTime",
+        "liveEndTime",
+        "viewSign",
+      ];
       for (let i = 0; i < ary.length; i++) {
         this.$set(this.list[index], ary[i], "");
       }
@@ -366,11 +402,11 @@ export default {
      */
     seeTheVideoFunc(item) {
       let jsonstr = JSON.parse(JSON.stringify(item));
-      if(jsonstr.sectionType === 1){
+      if (jsonstr.sectionType === 1) {
         jsonstr.recordingUrl = item.url;
       }
-      if(jsonstr.sectionType === 2){
-        jsonstr.liveUrl = item.url
+      if (jsonstr.sectionType === 2) {
+        jsonstr.liveUrl = item.url;
       }
       this.$parent.$refs.preview.diavosFun(jsonstr);
     },

+ 59 - 38
src/views/resource/videoManagement/chapter/edit/index.vue

@@ -173,6 +173,12 @@
             <el-radio :label="0">非公共章</el-radio>
           </el-radio-group>
         </el-form-item>
+        <el-form-item label="视频类型" prop="viewSign">
+          <el-radio-group v-model="listData.viewSign" disabled>
+            <el-radio :label="1">保利威</el-radio>
+            <el-radio :label="2">腾讯</el-radio>
+          </el-radio-group>
+        </el-form-item>
         <el-form-item label="是否发布" prop="publishStatus">
           <el-radio-group v-model="listData.publishStatus">
             <el-radio :label="1">是</el-radio>
@@ -219,15 +225,13 @@
             :prop="item.prop"
           >
             <template slot-scope="scope">
-              <span v-if="item.scope === 'types'">{{
-                scope.row[item.prop] === 1
-                  ? "录播"
-                  : scope.row[item.prop] === 2
-                  ? "直播"
-                  : scope.row[item.prop] === 3
-                  ? "回放"
-                  : "未知"
-              }}</span>
+              <span v-if="item.scope === 'isOptions'">
+                <span v-for="(items, indexs) in item.options" :key="indexs">
+                  <span v-if="scope.row[item.prop] == items.value">{{
+                    items.label
+                  }}</span>
+                </span>
+              </span>
               <span v-else-if="item.scope === 'convert'">{{
                 $methodsTools.secondToDate(scope.row[item.prop], false)
               }}</span>
@@ -236,15 +240,6 @@
                   ? scope.row[item.prop2]
                   : scope.row[item.prop1]
               }}</span>
-              <span v-else-if="item.scope === 'Status'">
-                {{
-                  scope.row[item.prop] === 1
-                    ? "发布"
-                    : scope.row[item.prop] === 0
-                    ? "未发布"
-                    : "未知"
-                }}
-              </span>
               <div v-else-if="item.scope === 'inputs'">
                 <el-input-number
                   style="width: 50px"
@@ -346,15 +341,13 @@
             header-align="center"
           >
             <template slot-scope="scope">
-              <span v-if="item.scope === 'types'">{{
-                scope.row[item.prop] === 1
-                  ? "录播"
-                  : scope.row[item.prop] === 2
-                  ? "直播"
-                  : scope.row[item.prop] === 3
-                  ? "回放"
-                  : ""
-              }}</span>
+              <span v-if="item.scope === 'isOptions'">
+                <span v-for="(items, indexs) in item.options" :key="indexs">
+                  <span v-if="scope.row[item.prop] == items.value">{{
+                    items.label
+                  }}</span>
+                </span>
+              </span>
               <span v-else-if="item.scope === 'convert'">{{
                 $methodsTools.secondToDate(scope.row[item.prop], false)
               }}</span>
@@ -363,15 +356,6 @@
                   ? scope.row[item.prop2]
                   : scope.row[item.prop1]
               }}</span>
-              <span v-else-if="item.scope === 'Status'">
-                {{
-                  scope.row[item.prop] === 1
-                    ? "发布"
-                    : scope.row[item.prop] === 0
-                    ? "未发布"
-                    : "未知"
-                }}
-              </span>
               <span v-else>{{ scope.row[item.prop] }}</span></template
             >
           </el-table-column></template
@@ -461,6 +445,9 @@ export default {
         commonSign: [
           { required: true, message: "请选择公共标识", trigger: "change" },
         ],
+        viewSign: [
+          { required: true, message: "请选择视频类型", trigger: "change" },
+        ],
         publishStatus: [
           { required: true, message: "请选择是否发布", trigger: "change" },
         ],
@@ -472,7 +459,29 @@ export default {
         { label: "节编码", prop: "code", width: "120" },
         { label: "标题前缀", prop: "prefixName", width: "180" },
         { label: "节标题", prop: "name", width: "310" },
-        { label: "节类型", prop: "sectionType", scope: "types" },
+        {
+          label: "节类型",
+          prop: "sectionType",
+          scope: "isOptions",
+          options: [
+            {
+              label: "录播",
+              value: 1,
+            },
+            { label: "直播", value: 2 },
+            { label: "回放", value: 3 },
+          ],
+        },
+        {
+          label: "视频类型",
+          prop: "viewSign",
+          scope: "isOptions",
+          options: [
+            { label: "保利威", value: 1 },
+            { label: "腾讯", value: 2 },
+          ],
+          width: "120",
+        },
         {
           label: "URL地址/直播地址",
           prop: "sectionType",
@@ -491,7 +500,14 @@ export default {
         {
           label: "发布状态",
           prop: "publishStatus",
-          scope: "Status",
+          scope: "isOptions",
+          options: [
+            {
+              label: "发布",
+              value: 1,
+            },
+            { label: "未发布", value: 0 },
+          ],
           width: "120",
         },
       ],
@@ -983,6 +999,10 @@ export default {
               this.$message.warning(`管理节第${i + 1}条请输入排序`);
               return;
             }
+            if(this.tableData[i].viewSign != this.listData.viewSign){
+              this.$message.warning("请保持节视频类型与章关联视频类型保持一致")
+              return
+            }
           }
           let arr = this.tableData.map((items) => {
             return items.sort;
@@ -1011,6 +1031,7 @@ export default {
       });
       var dataInfos = {
         status: 1,
+        viewSign:this.listData.viewSign,
         chapterId: this.pageId,
         businessList: this.newSujectApis,
         sectionIdList: sectionIdList,

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

@@ -72,11 +72,7 @@
             </el-option>
           </el-select>
         </el-form-item> -->
-        <el-form-item
-          label="科目"
-          prop="subjectId"
-          v-if="listData.businessId"
-        >
+        <el-form-item label="科目" prop="subjectId" v-if="listData.businessId">
           <el-select v-model="listData.subjectId" placeholder="请选择科目">
             <el-option
               v-for="(item, index) in newSujectOption"
@@ -147,6 +143,12 @@
             >删除</el-button
           >
         </el-form-item>
+        <el-form-item label="视频类型" prop="viewSign">
+          <el-radio-group v-model="listData.viewSign">
+            <el-radio :label="1">保利威</el-radio>
+            <el-radio :label="2">腾讯</el-radio>
+          </el-radio-group>
+        </el-form-item>
         <el-form-item label="是否发布" prop="publishStatus">
           <el-radio-group v-model="listData.publishStatus">
             <el-radio :label="1">是</el-radio>
@@ -230,6 +232,7 @@ export default {
         schoolId: "",
         majorId: "",
         subjectId: "",
+        viewSign:1,
       },
 
       eduTypeOptions: [], //教育类型数据
@@ -285,6 +288,9 @@ export default {
         courseName: [
           { required: true, message: "请输入课程名称", trigger: "blur" },
         ],
+        viewSign: [
+          { required: true, message: "请选择视频类型", trigger: "change" },
+        ],
         publishStatus: [
           { required: true, message: "请选择是否发布", trigger: "change" },
         ],
@@ -404,7 +410,7 @@ export default {
           // if (!newMajorOption.length) {
           //   this.newMajorOption = this.majorOption;
           // } else {
-            this.newMajorOption = newMajorOption;
+          this.newMajorOption = newMajorOption;
           // }
           for (let i = 0; i < this.sujectOption.length; i++) {
             if (
@@ -593,4 +599,4 @@ export default {
   text-align: center;
   border: none;
 }
-</style>
+</style>

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

@@ -150,6 +150,12 @@
             >删除</el-button
           >
         </el-form-item>
+        <el-form-item label="视频类型" prop="viewSign" >
+          <el-radio-group v-model="listData.viewSign" disabled>
+            <el-radio :label="1">保利威</el-radio>
+            <el-radio :label="2">腾讯</el-radio>
+          </el-radio-group>
+        </el-form-item>
         <el-form-item label="是否发布" prop="publishStatus">
           <el-radio-group v-model="listData.publishStatus">
             <el-radio :label="1">是</el-radio>
@@ -287,6 +293,9 @@ export default {
         courseName: [
           { required: true, message: "请输入课程名称", trigger: "blur" },
         ],
+        viewSign: [
+          { required: true, message: "请选择视频类型", trigger: "change" },
+        ],
         publishStatus: [
           { required: true, message: "请选择是否发布", trigger: "change" },
         ],

+ 2 - 0
src/views/resource/videoManagement/courseManagement/chapterContent/index.vue

@@ -510,6 +510,7 @@ export default {
         publishStatus: 1,
         name: "",
         key: "",
+        viewSign:""
       },
       formList5: [],
       total6: 0,
@@ -737,6 +738,7 @@ export default {
     search() {
       this.$api.obtainCourseS(this.$route.query.id).then((res) => {
         this.pageInfo = res.data;
+        this.formData5.viewSign = res.data.viewSign || ""
       });
       this.$api
         .inquireCoursemenuListS({ courseId: this.$route.query.id })

+ 124 - 37
src/views/resource/videoManagement/festival/add/index.vue

@@ -19,8 +19,7 @@
               :key="index"
               :label="item.educationName"
               :value="item.id"
-            >
-            </el-option>
+            ></el-option>
           </el-select>
           <el-select
             v-model="courType"
@@ -32,8 +31,7 @@
               :key="index"
               :label="item.projectName + '-' + item.businessName"
               :value="item.id"
-            >
-            </el-option>
+            ></el-option>
           </el-select>
           <el-popover
             ref="popovers"
@@ -75,7 +73,7 @@
           </el-popover>
           <span style="margin-left: 10px">注:可多选</span>
         </el-form-item>
-        <el-form-item label="">
+        <el-form-item label>
           <div :class="changeHeight ? 'ach' : 'clh'">
             <div
               v-for="(item, index) in newSujectApis"
@@ -126,7 +124,8 @@
             v-if="newSujectApis.length > 1"
             @click="changeType"
             >{{ changeHeight ? "展开" : "关闭" }}</el-button
-          ><el-button
+          >
+          <el-button
             size="mini"
             v-if="newSujectApis.length > 0"
             @click="sujectApis = []"
@@ -156,10 +155,17 @@
               :key="index"
               :label="item.label"
               :value="item.value"
-            >
-            </el-option>
+            ></el-option>
           </el-select>
         </el-form-item>
+
+        <el-form-item label="视频类型" prop="viewSign">
+          <el-radio-group v-model="listData.viewSign" @change="changeViewSign">
+            <el-radio :label="1">保利威</el-radio>
+            <el-radio :label="2">腾讯</el-radio>
+          </el-radio-group>
+        </el-form-item>
+
         <el-form-item
           label="频道号"
           v-if="listData.sectionType === 2"
@@ -180,8 +186,7 @@
               :key="index"
               :label="item.streamingName"
               :value="item.id"
-            >
-            </el-option>
+            ></el-option>
           </el-select>
           <div v-if="listData.liveUrl" style="margin-top: 10px">
             <el-button
@@ -202,8 +207,7 @@
             type="datetime"
             placeholder="请选择直播开始时间"
             value-format="timestamp"
-          >
-          </el-date-picker>
+          ></el-date-picker>
         </el-form-item>
         <el-form-item
           label="直播结束时间"
@@ -215,8 +219,7 @@
             type="datetime"
             placeholder="请选择直播结束时间"
             value-format="timestamp"
-          >
-          </el-date-picker>
+          ></el-date-picker>
         </el-form-item>
         <el-form-item
           label="直播时长"
@@ -225,9 +228,10 @@
             listData.liveStartTime &&
             listData.liveEndTime
           "
+          >{{
+            compTimeOUT(listData.liveStartTime, listData.liveEndTime)
+          }}</el-form-item
         >
-          {{ compTimeOUT(listData.liveStartTime, listData.liveEndTime) }}
-        </el-form-item>
         <el-form-item
           label="URL地址"
           v-if="listData.sectionType === 1 || listData.sectionType === 3"
@@ -240,18 +244,20 @@
             @change="getApiTime(listData.recordingUrl)"
           ></el-input>
           <label
+            v-if="listData.viewSign == 1"
             for="mobles"
             class="el-button el-button--primary"
             style="margin: 0px 6px; padding: 10px 20px"
             >上传</label
-          ><input
+          >
+          <input
             style="display: none"
             type="file"
             id="mobles"
             @change="importMoble"
           />
           <el-select
-            v-if="listData.sectionType === 1"
+            v-if="listData.sectionType === 1 && listData.viewSign == 1"
             v-model="newActiveRecordingUrl1"
             filterable
             placeholder="快捷选中录播URL地址"
@@ -262,8 +268,7 @@
               :key="index"
               :label="item.streamingName"
               :value="item.id"
-            >
-            </el-option>
+            ></el-option>
           </el-select>
           <el-select
             v-if="listData.sectionType === 3"
@@ -277,8 +282,7 @@
               :key="index"
               :label="item.streamingName"
               :value="item.id"
-            >
-            </el-option>
+            ></el-option>
           </el-select>
           <div v-if="listData.recordingUrl" style="margin-top: 10px">
             <el-button
@@ -300,8 +304,7 @@
             range-separator=":"
             v-model="listData.durationTime"
             placeholder="请填入节时长"
-          >
-          </el-time-picker>
+          ></el-time-picker>
         </el-form-item>
         <el-form-item
           label="讲师"
@@ -317,8 +320,7 @@
               :key="index"
               :label="item.teacherName"
               :value="item.teacherId"
-            >
-            </el-option>
+            ></el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="节封面" prop="coverUrl">
@@ -336,8 +338,8 @@
                 v-if="!listData.coverUrl"
               >
                 <label for="uplose">
-                  <i class="el-icon-circle-plus-outline iconStsz"></i
-                ></label>
+                  <i class="el-icon-circle-plus-outline iconStsz"></i>
+                </label>
                 <input
                   ref="file"
                   type="file"
@@ -353,8 +355,7 @@
                 :preview-src-list="[
                   $methodsTools.splitImgHost(listData.coverUrl),
                 ]"
-              >
-              </el-image>
+              ></el-image>
             </el-col>
             <el-col :span="11">
               <span style="color: #999; font-size: 14px"
@@ -399,11 +400,11 @@
       <div slot="title" class="hearders">
         <div class="leftTitle">视频预览</div>
         <div class="rightBoxs">
-          <img src="@/assets/images/Close@2x.png" alt="" @click="clears" />
+          <img src="@/assets/images/Close@2x.png" alt @click="clears" />
         </div>
       </div>
       <div>
-        <div id="player"></div>
+        <div id="player" v-show="listData.viewSign == 1"></div>
       </div>
       <span slot="footer" class="dialog-footer">
         <el-button @click="clears">取 消</el-button>
@@ -419,7 +420,7 @@
       <div slot="title" class="hearders">
         <div class="leftTitle">直播预览</div>
         <div class="rightBoxs">
-          <img src="@/assets/images/Close@2x.png" alt="" @click="clearszb" />
+          <img src="@/assets/images/Close@2x.png" alt @click="clearszb" />
         </div>
       </div>
       <div>
@@ -442,6 +443,8 @@ export default {
       isIndeterminate: false,
       checkAll: false,
       vodPlayerJs: "https://player.polyv.net/script/player.js",
+      vodPlayerJsForTCPlayer:
+        "https://web.sdk.qcloud.com/player/tcplayer/release/v5.1.0/tcplayer.v5.1.0.min.js",
       vid: "",
       playerJs:
         "https://player.polyv.net/resp/live-h5-player/latest/liveplayer.min.js",
@@ -474,6 +477,7 @@ export default {
       changeHeight: true,
       bfImg: "oss/images/avatar/20211013/1634097664410_1397766697",
       listData: {
+        viewSign: 1,
         durationTime: "",
         sectionType: 1,
         publishStatus: 1,
@@ -511,6 +515,9 @@ export default {
         //   { required: true, message: "节时长不能为空" },
         //   { type: "number", message: "节时长必须为数字值" },
         // ],
+        viewSign: [
+          { required: true, message: "请选择视频类型", trigger: "change" },
+        ],
         recordingUrl: [
           {
             required: true,
@@ -559,10 +566,15 @@ export default {
     this.getDict();
   },
   methods: {
+    changeViewSign(){
+      this.listData.recordingUrl = ''
+      this.listData.durationTime = ''
+    },
     changeTypeSection() {
       this.$nextTick(() => {
         this.$refs.listData.clearValidate();
       });
+      this.changeViewSign()
     },
     unTime(val) {
       let a = `${val.businessId}-${val.subjectId}`;
@@ -633,15 +645,21 @@ export default {
       }
     },
     getApiTime(val) {
+      console.log("获取时长", this.listData.viewSign == 2);
       var self = this;
       const valueUrl = val.replace(/\s/g, "");
-      if (valueUrl && valueUrl.length > 30) {
+      if (this.listData.viewSign == 2) {
         this.disabledBtn = true;
         this.$api
-          .inquirepolyvvideo(valueUrl)
+          .inquirevodvideodetail(valueUrl)
           .then((res) => {
+            console.log("请求腾讯时长", res.data.duration);
             if (res.data.duration) {
-              self.listData.durationTime = res.data.duration;
+              self.listData.durationTime = this.$methodsTools.secondToDate(
+                res.data.duration,
+                false
+              );
+              console.log("转换后的腾讯时间", self.listData.durationTime);
               self.disabloutime = true;
             } else {
               self.disabloutime = false;
@@ -653,6 +671,26 @@ export default {
           .finally(() => {
             this.disabledBtn = false;
           });
+      } else {
+        if (valueUrl && valueUrl.length > 30) {
+          this.disabledBtn = true;
+          this.$api
+            .inquirepolyvvideo(valueUrl)
+            .then((res) => {
+              if (res.data.duration) {
+                self.listData.durationTime = res.data.duration;
+                self.disabloutime = true;
+              } else {
+                self.disabloutime = false;
+              }
+            })
+            .catch((err) => {
+              self.disabloutime = false;
+            })
+            .finally(() => {
+              this.disabledBtn = false;
+            });
+        }
       }
     },
     loadPlayerScript(callback) {
@@ -668,6 +706,19 @@ export default {
         });
       }
     },
+    loadPlayerScript_tencent(callback) {
+      if (!window.TCPlayer) {
+        const myScript = document.createElement("script");
+        myScript.setAttribute("src", this.vodPlayerJsForTCPlayer);
+        myScript.onload = callback;
+        document.body.appendChild(myScript);
+      } else {
+        callback();
+        this.player_tencent.on("error", (...params) => {
+          this.$message.error(returnTitle(params[1]));
+        });
+      }
+    },
     loadPlayer() {
       var self = this;
       const polyvPlayer = window.polyvPlayer;
@@ -684,6 +735,31 @@ export default {
         },
       });
     },
+    loadPlayer_tencent() {
+      var self = this;
+      const TCPlayer = window.TCPlayer;
+      try {
+        let video = document.querySelector("video");
+        video.parentNode.removeChild(video);
+      } catch (error) {
+        console.log("清除video标签异常");
+      }
+      let player_tencent = document.createElement("video");
+      player_tencent.id = "player-tencent";
+      document
+        .getElementById("player")
+        .insertAdjacentElement("afterend", player_tencent);
+      self.$api.obtaintcvideosign(self.vid).then((res) => {
+        self.player_tencent = TCPlayer("player-tencent", {
+          width: 800,
+          height: 533,
+          fileID: self.vid,
+          appID: res.data.appID,
+          psign: res.data.psign,
+          licenseUrl: res.data.licenseUrl,
+        });
+      });
+    },
     /**
      * @param {String} 关闭视频窗口-销毁实例
      */
@@ -692,6 +768,9 @@ export default {
       if (this.player) {
         this.player.destroy();
       }
+      if (this.player_tencent) {
+        this.player_tencent.dispose();
+      }
     },
     /**
      * @param {String} 视频查看
@@ -705,12 +784,19 @@ export default {
       this.diavos = true;
     },
     isOkBf() {
-      this.loadPlayerScript(this.loadPlayer);
+      if (this.listData.viewSign == 2) {
+        this.loadPlayerScript_tencent(this.loadPlayer_tencent);
+      } else {
+        this.loadPlayerScript(this.loadPlayer);
+      }
     },
     closePlayer() {
       if (this.player) {
         this.player.destroy();
       }
+      if (this.player_tencent) {
+        this.player_tencent.dispose();
+      }
     },
     /**
      * @param {String} 直播预览
@@ -1011,6 +1097,7 @@ export default {
       var dataInfos = {
         status: 1,
         businessList: this.newSujectApis,
+        viewSign: this.listData.viewSign,
         coverUrl: this.listData.coverUrl,
         name: this.listData.name,
         prefixName: this.listData.prefixName,

+ 136 - 58
src/views/resource/videoManagement/festival/edit/index.vue

@@ -19,8 +19,7 @@
               :key="index"
               :label="item.educationName"
               :value="item.id"
-            >
-            </el-option>
+            ></el-option>
           </el-select>
           <el-select
             v-model="courType"
@@ -32,8 +31,7 @@
               :key="index"
               :label="item.projectName + '-' + item.businessName"
               :value="item.id"
-            >
-            </el-option>
+            ></el-option>
           </el-select>
           <el-popover
             ref="popovers"
@@ -75,7 +73,7 @@
           </el-popover>
           <span style="margin-left: 10px">注:可多选</span>
         </el-form-item>
-        <el-form-item label="">
+        <el-form-item label>
           <div :class="changeHeight ? 'ach' : 'clh'">
             <div
               v-for="(item, index) in newSujectApis"
@@ -99,7 +97,8 @@
             v-if="newSujectApis.length > 1"
             @click="changeType"
             >{{ changeHeight ? "展开" : "关闭" }}</el-button
-          ><el-button
+          >
+          <el-button
             size="mini"
             v-if="newSujectApis.length > 0"
             @click="sujectApis = []"
@@ -131,10 +130,17 @@
               :disabled="item.value == 1"
               :label="item.label"
               :value="item.value"
-            >
-            </el-option>
+            ></el-option>
           </el-select>
         </el-form-item>
+
+        <el-form-item label="视频类型" prop="viewSign">
+          <el-radio-group v-model="listData.viewSign" disabled>
+            <el-radio :label="1">保利威</el-radio>
+            <el-radio :label="2">腾讯</el-radio>
+          </el-radio-group>
+        </el-form-item>
+
         <el-form-item
           label="频道号"
           v-if="listData.sectionType === 2"
@@ -155,8 +161,7 @@
               :key="index"
               :label="item.streamingName"
               :value="item.id"
-            >
-            </el-option>
+            ></el-option>
           </el-select>
           <div v-if="listData.liveUrl" style="margin-top: 10px">
             <el-button
@@ -177,8 +182,7 @@
             type="datetime"
             placeholder="请选择直播开始时间"
             value-format="timestamp"
-          >
-          </el-date-picker>
+          ></el-date-picker>
         </el-form-item>
         <el-form-item
           label="直播结束时间"
@@ -190,8 +194,7 @@
             type="datetime"
             placeholder="请选择直播结束时间"
             value-format="timestamp"
-          >
-          </el-date-picker>
+          ></el-date-picker>
         </el-form-item>
         <el-form-item
           label="直播时长"
@@ -200,9 +203,10 @@
             listData.liveStartTime &&
             listData.liveEndTime
           "
+          >{{
+            compTimeOUT(listData.liveStartTime, listData.liveEndTime)
+          }}</el-form-item
         >
-          {{ compTimeOUT(listData.liveStartTime, listData.liveEndTime) }}
-        </el-form-item>
         <el-form-item
           label="URL地址"
           v-if="listData.sectionType === 1 || listData.sectionType === 3"
@@ -215,18 +219,20 @@
             @change="getApiTime(listData.recordingUrl)"
           ></el-input>
           <label
+          v-if="listData.viewSign == 1"
             for="mobles"
             class="el-button el-button--primary"
             style="margin: 0px 6px; padding: 10px 20px"
             >上传</label
-          ><input
+          >
+          <input
             style="display: none"
             type="file"
             id="mobles"
             @change="importMoble"
           />
           <el-select
-            v-if="listData.sectionType === 1"
+            v-if="listData.sectionType === 1 && listData.viewSign == 1"
             v-model="newActiveRecordingUrl1"
             placeholder="快捷选中录播URL地址"
             filterable
@@ -237,8 +243,7 @@
               :key="index"
               :label="item.streamingName"
               :value="item.id"
-            >
-            </el-option>
+            ></el-option>
           </el-select>
           <el-select
             v-if="listData.sectionType === 3"
@@ -252,8 +257,7 @@
               :key="index"
               :label="item.streamingName"
               :value="item.id"
-            >
-            </el-option>
+            ></el-option>
           </el-select>
           <div v-if="listData.recordingUrl" style="margin-top: 10px">
             <el-button
@@ -275,8 +279,7 @@
             range-separator=":"
             v-model="listData.durationTime"
             placeholder="请填入节时长"
-          >
-          </el-time-picker>
+          ></el-time-picker>
         </el-form-item>
         <el-form-item
           label="讲师"
@@ -292,8 +295,7 @@
               :key="index"
               :label="item.teacherName"
               :value="item.teacherId"
-            >
-            </el-option>
+            ></el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="节封面" prop="coverUrl">
@@ -311,8 +313,8 @@
                 v-if="!listData.coverUrl"
               >
                 <label for="uplose">
-                  <i class="el-icon-circle-plus-outline iconStsz"></i
-                ></label>
+                  <i class="el-icon-circle-plus-outline iconStsz"></i>
+                </label>
                 <input
                   ref="file"
                   type="file"
@@ -328,8 +330,7 @@
                 :preview-src-list="[
                   $methodsTools.splitImgHost(listData.coverUrl),
                 ]"
-              >
-              </el-image>
+              ></el-image>
             </el-col>
             <el-col :span="11">
               <span style="color: #999; font-size: 14px"
@@ -375,11 +376,11 @@
       <div slot="title" class="hearders">
         <div class="leftTitle">视频预览</div>
         <div class="rightBoxs">
-          <img src="@/assets/images/Close@2x.png" alt="" @click="clears" />
+          <img src="@/assets/images/Close@2x.png" alt @click="clears" />
         </div>
       </div>
       <div>
-        <div id="player"></div>
+        <div id="player" v-show="listData.viewSign == 1"></div>
       </div>
       <span slot="footer" class="dialog-footer">
         <el-button @click="clears">取 消</el-button>
@@ -395,7 +396,7 @@
       <div slot="title" class="hearders">
         <div class="leftTitle">直播预览</div>
         <div class="rightBoxs">
-          <img src="@/assets/images/Close@2x.png" alt="" @click="clearszb" />
+          <img src="@/assets/images/Close@2x.png" alt @click="clearszb" />
         </div>
       </div>
       <div>
@@ -419,6 +420,8 @@ export default {
       isIndeterminate: false,
       checkAll: false,
       vodPlayerJs: "https://player.polyv.net/script/player.js",
+      vodPlayerJsForTCPlayer:
+        "https://web.sdk.qcloud.com/player/tcplayer/release/v5.1.0/tcplayer.v5.1.0.min.js",
       vid: "",
       playerJs:
         "https://player.polyv.net/resp/live-h5-player/latest/liveplayer.min.js",
@@ -486,6 +489,9 @@ export default {
         //   { required: true, message: "节时长不能为空" },
         //   { type: "number", message: "节时长必须为数字值" },
         // ],
+        viewSign: [
+          { required: true, message: "请选择视频类型", trigger: "change" },
+        ],
         recordingUrl: [
           {
             required: true,
@@ -618,16 +624,22 @@ export default {
       }
     },
     getApiTime(val) {
+      console.log("获取时长");
       var self = this;
       this.clearTimes(val);
       const valueUrl = val.replace(/\s/g, "");
-      if (valueUrl && valueUrl.length > 30) {
+      if (this.listData.viewSign == 2) {
         this.disabledBtn = true;
         this.$api
-          .inquirepolyvvideo(valueUrl)
+          .inquirevodvideodetail(valueUrl)
           .then((res) => {
+            console.log("请求腾讯时长", res.data.duration);
             if (res.data.duration) {
-              self.listData.durationTime = res.data.duration;
+              self.listData.durationTime = this.$methodsTools.secondToDate(
+                res.data.duration,
+                false
+              );
+              console.log("转换后的腾讯时间", self.listData.durationTime);
               self.disabloutime = true;
             } else {
               self.disabloutime = false;
@@ -639,6 +651,26 @@ export default {
           .finally(() => {
             this.disabledBtn = false;
           });
+      } else {
+        if (valueUrl && valueUrl.length > 30) {
+          this.disabledBtn = true;
+          this.$api
+            .inquirepolyvvideo(valueUrl)
+            .then((res) => {
+              if (res.data.duration) {
+                self.listData.durationTime = res.data.duration;
+                self.disabloutime = true;
+              } else {
+                self.disabloutime = false;
+              }
+            })
+            .catch((err) => {
+              self.disabloutime = false;
+            })
+            .finally(() => {
+              this.disabledBtn = false;
+            });
+        }
       }
     },
     loadPlayerScript(callback) {
@@ -654,6 +686,19 @@ export default {
         });
       }
     },
+    loadPlayerScript_tencent(callback) {
+      if (!window.TCPlayer) {
+        const myScript = document.createElement("script");
+        myScript.setAttribute("src", this.vodPlayerJsForTCPlayer);
+        myScript.onload = callback;
+        document.body.appendChild(myScript);
+      } else {
+        callback();
+        this.player_tencent.on("error", (...params) => {
+          this.$message.error(returnTitle(params[1]));
+        });
+      }
+    },
     loadPlayer() {
       var self = this;
       const polyvPlayer = window.polyvPlayer;
@@ -670,6 +715,31 @@ export default {
         },
       });
     },
+    loadPlayer_tencent() {
+      var self = this;
+      const TCPlayer = window.TCPlayer;
+      try {
+        let video = document.querySelector("video");
+        video.parentNode.removeChild(video);
+      } catch (error) {
+        console.log("清除video标签异常");
+      }
+      let player_tencent = document.createElement("video");
+      player_tencent.id = "player-tencent";
+      document
+        .getElementById("player")
+        .insertAdjacentElement("afterend", player_tencent);
+      self.$api.obtaintcvideosign(self.vid).then((res) => {
+        self.player_tencent = TCPlayer("player-tencent", {
+          width: 800,
+          height: 533,
+          fileID: self.vid,
+          appID: res.data.appID,
+          psign: res.data.psign,
+          licenseUrl: res.data.licenseUrl,
+        });
+      });
+    },
     /**
      * @param {String} 关闭视频窗口-销毁实例
      */
@@ -678,6 +748,9 @@ export default {
       if (this.player) {
         this.player.destroy();
       }
+      if (this.player_tencent) {
+        this.player_tencent.dispose();
+      }
     },
     /**
      * @param {String} 视频查看
@@ -691,12 +764,19 @@ export default {
       this.diavos = true;
     },
     isOkBf() {
-      this.loadPlayerScript(this.loadPlayer);
+      if (this.listData.viewSign == 2) {
+        this.loadPlayerScript_tencent(this.loadPlayer_tencent);
+      } else {
+        this.loadPlayerScript(this.loadPlayer);
+      }
     },
     closePlayer() {
       if (this.player) {
         this.player.destroy();
       }
+      if (this.player_tencent) {
+        this.player_tencent.dispose();
+      }
     },
     /**
      * @param {String} 直播预览
@@ -934,7 +1014,7 @@ export default {
       await this.courseTys();
       await this.businTys();
       await this.courseSubject();
-      await this.Streaming();
+      this.Streaming();
       this.search();
     },
     tearchApi() {
@@ -986,27 +1066,24 @@ export default {
       });
     },
     Streaming() {
-      return new Promise((resolve, reject) => {
-        this.$api.inquireCourseStreaming({ status: 1 }).then((res) => {
-          var arrays = [];
-          var newarrays1 = [];
-          var newarrays2 = [];
-          res.rows.map((item) => {
-            if (item.streamingType === 1) {
-              arrays.push(item);
-            }
-            if (item.streamingType === 2) {
-              newarrays1.push(item);
-            }
-            if (item.streamingType === 3) {
-              newarrays2.push(item);
-            }
-          });
-          this.newLiveUrl = arrays;
-          this.newSteamUrl1 = newarrays1;
-          this.newSteamUrl2 = newarrays2;
-          resolve();
+      this.$api.inquireCourseStreaming({ status: 1 }).then((res) => {
+        var arrays = [];
+        var newarrays1 = [];
+        var newarrays2 = [];
+        res.rows.map((item) => {
+          if (item.streamingType === 1) {
+            arrays.push(item);
+          }
+          if (item.streamingType === 2) {
+            newarrays1.push(item);
+          }
+          if (item.streamingType === 3) {
+            newarrays2.push(item);
+          }
         });
+        this.newLiveUrl = arrays;
+        this.newSteamUrl1 = newarrays1;
+        this.newSteamUrl2 = newarrays2;
       });
     },
     changeEduType() {
@@ -1070,6 +1147,7 @@ export default {
         status: 1,
         sectionId: this.pageId,
         businessList: this.newSujectApis,
+        viewSign: this.listData.viewSign,
         coverUrl: this.listData.coverUrl,
         name: this.listData.name,
         prefixName: this.listData.prefixName,

+ 39 - 0
src/views/resource/videoManagement/moduleManagement/add/index.vue

@@ -269,6 +269,12 @@
             <el-radio :label="0">非公共模块</el-radio>
           </el-radio-group>
         </el-form-item>
+        <el-form-item label="视频类型" prop="viewSign">
+          <el-radio-group v-model="listData.viewSign">
+            <el-radio :label="1">保利威</el-radio>
+            <el-radio :label="2">腾讯</el-radio>
+          </el-radio-group>
+        </el-form-item>
         <el-form-item label="是否发布" prop="publishStatus">
           <el-radio-group v-model="listData.publishStatus">
             <el-radio :label="1">是</el-radio>
@@ -324,6 +330,13 @@
                   ? "回放"
                   : "未知"
               }}</span>
+              <span v-else-if="item.scope === 'isOptions'">
+                <span v-for="(items, indexs) in item.options" :key="indexs">
+                  <span v-if="scope.row[item.prop] == items.value">{{
+                    items.label
+                  }}</span>
+                </span>
+              </span>
               <span v-else-if="item.scope === 'Status'">
                 {{
                   scope.row[item.prop] === 1
@@ -439,6 +452,13 @@
                   ? "回放"
                   : "未知"
               }}</span>
+              <span v-else-if="item.scope === 'isOptions'">
+                <span v-for="(items, indexs) in item.options" :key="indexs">
+                  <span v-if="scope.row[item.prop] == items.value">{{
+                    items.label
+                  }}</span>
+                </span>
+              </span>
               <span v-else-if="item.scope === 'Status'">
                 {{
                   scope.row[item.prop] === 1
@@ -507,6 +527,7 @@ export default {
         publishStatus: 1,
         recordingUrl: "",
         liveUrl: "",
+        viewSign:1,
         coverUrl: "oss/images/avatar/20211013/1634097664410_1397766697",
       },
       eduTypeOptions: [], //教育类型数据
@@ -535,6 +556,9 @@ export default {
         commonSign: [
           { required: true, message: "请选择公共标识", trigger: "change" },
         ],
+        viewSign: [
+          { required: true, message: "请选择视频类型", trigger: "change" },
+        ],
         publishStatus: [
           { required: true, message: "请选择是否发布", trigger: "change" },
         ],
@@ -546,6 +570,16 @@ export default {
         { label: "章编码", prop: "code", width: "120" },
         { label: "标题前缀", prop: "prefixName", width: "180" },
         { label: "章标题", prop: "name" },
+        {
+          label: "视频类型",
+          prop: "viewSign",
+          scope: "isOptions",
+          options: [
+            { label: "保利威", value: 1 },
+            { label: "腾讯", value: 2 },
+          ],
+          width: "120",
+        },
         { label: "节数量", prop: "sectionNum", width: "120" },
         {
           label: "发布状态",
@@ -996,6 +1030,10 @@ export default {
               this.$message.warning(`管理章第${i + 1}条请输入排序`);
               return;
             }
+            if(this.tableData[i].viewSign != this.listData.viewSign){
+              this.$message.warning("请保持模块视频类型与章视频类型保持一致")
+              return
+            }
           }
           let arr = this.tableData.map((items) => {
             return items.sort;
@@ -1021,6 +1059,7 @@ export default {
       });
       var dataInfos = {
         status: 1,
+        viewSign:this.listData.viewSign,
         businessList: this.newSujectApis,
         chapterIdList: chapterIdList,
         coverUrl: this.listData.coverUrl,

+ 49 - 27
src/views/resource/videoManagement/moduleManagement/addChapter.vue

@@ -22,19 +22,39 @@
             >添加</el-button
           >
         </p>
-        <el-form label-width="100px" class="elform_style">
+        <el-form
+          label-width="100px"
+          class="elform_style"
+          :rules="rules"
+          ref="ruleForm"
+          :model="{ list: list }"
+        >
           <div v-for="(item, index) in list" :key="index" class="dis_box">
             <div class="left_box">
               <el-form-item label="标题前缀">
                 <el-input v-model="item.prefixName"></el-input>
                 <p class="p_style">注:便于检索、归类,以及区分一样的标题</p>
               </el-form-item>
-              <el-form-item label="章标题" required>
+              <el-form-item
+                label="章标题"
+                :prop="'list.' + index + '.name'"
+                :rules="rules['name']"
+              >
                 <el-input v-model="item.name"></el-input>
                 <p class="p_style">
                   注:请尽量规范易懂,方便在课程目录表呈现给学员
                 </p>
               </el-form-item>
+              <el-form-item
+                label="视频类型"
+                :prop="'list.' + index + '.viewSign'"
+                :rules="rules['viewSign']"
+              >
+                <el-radio-group v-model="item.viewSign">
+                  <el-radio :label="1">保利威</el-radio>
+                  <el-radio :label="2">腾讯</el-radio>
+                </el-radio-group>
+              </el-form-item>
             </div>
             <div class="clear_style">
               <el-button :size="size" @click="list.splice(index, 1)"
@@ -61,6 +81,12 @@ export default {
       size: "small",
       dialogVisible: false,
       list: [],
+      rules: {
+        name: [{ required: true, message: "请输入章标题", trigger: "blur" }],
+        viewSign: [
+          { required: true, message: "请选择视频类型", trigger: "change" },
+        ],
+      },
     };
   },
   methods: {
@@ -69,33 +95,29 @@ export default {
     },
     openBoxs(arr) {
       this.businList = JSON.parse(JSON.stringify(arr));
-      this.list = [{}]
+      this.list = [{}];
       this.dialogVisible = true;
     },
     submitForm() {
-      const arr = [];
-      this.list.forEach((item, index) => {
-        if (!item.name && item.name !== 0) {
-          arr.push(index + 1);
+      this.$refs["ruleForm"].validate((valid) => {
+        if (valid) {
+          let data = this.list.map((item) => {
+            item.businessList = this.businList;
+            item.status = 1;
+            item.publishStatus = 1;
+            item.coverUrl =
+              "oss/images/avatar/20211013/1634097664410_1397766697";
+            return item;
+          });
+          this.$api.addMoreCoursechapter(data.reverse()).then((res) => {
+            this.dialogVisible = false;
+            this.$emit("backData", res.data);
+          });
+        } else {
+          console.log("error submit!!");
+          return false;
         }
       });
-      if (arr.length) {
-        this.$message.error(
-          `第${arr.join(",")}条数据没有填写章标题,请填写完整后提交`
-        );
-        return;
-      }
-      let data = this.list.map((item) => {
-        item.businessList = this.businList;
-        item.status = 1;
-        item.publishStatus = 1;
-        item.coverUrl = "oss/images/avatar/20211013/1634097664410_1397766697";
-        return item;
-      });
-      this.$api.addMoreCoursechapter(data.reverse()).then((res) => {
-        this.dialogVisible = false;
-        this.$emit("backData", res.data);
-      });
     },
   },
 };
@@ -117,9 +139,9 @@ export default {
     text-align: center;
   }
 }
-.elform_style{
-    max-height: 620px;
-    overflow: auto;
+.elform_style {
+  max-height: 620px;
+  overflow: auto;
 }
 .p_style {
   font-size: 12px;

+ 38 - 0
src/views/resource/videoManagement/moduleManagement/edit/index.vue

@@ -243,6 +243,12 @@
             <el-radio :label="0">非公共模块</el-radio>
           </el-radio-group>
         </el-form-item>
+        <el-form-item label="视频类型" prop="viewSign">
+          <el-radio-group v-model="listData.viewSign" disabled>
+            <el-radio :label="1">保利威</el-radio>
+            <el-radio :label="2">腾讯</el-radio>
+          </el-radio-group>
+        </el-form-item>
         <el-form-item label="是否发布" prop="publishStatus">
           <el-radio-group v-model="listData.publishStatus">
             <el-radio :label="1">是</el-radio>
@@ -298,6 +304,13 @@
                   ? "回放"
                   : "未知"
               }}</span>
+              <span v-else-if="item.scope === 'isOptions'">
+                <span v-for="(items, indexs) in item.options" :key="indexs">
+                  <span v-if="scope.row[item.prop] == items.value">{{
+                    items.label
+                  }}</span>
+                </span>
+              </span>
               <span v-else-if="item.scope === 'Status'">
                 {{
                   scope.row[item.prop] === 1
@@ -414,6 +427,13 @@
                   ? "回放"
                   : "未知"
               }}</span>
+              <span v-else-if="item.scope === 'isOptions'">
+                <span v-for="(items, indexs) in item.options" :key="indexs">
+                  <span v-if="scope.row[item.prop] == items.value">{{
+                    items.label
+                  }}</span>
+                </span>
+              </span>
               <span v-else-if="item.scope === 'Status'">
                 {{
                   scope.row[item.prop] === 1
@@ -509,6 +529,9 @@ export default {
         commonSign: [
           { required: true, message: "请选择公共标识", trigger: "change" },
         ],
+        viewSign: [
+          { required: true, message: "请选择视频类型", trigger: "change" },
+        ],
         publishStatus: [
           { required: true, message: "请选择是否发布", trigger: "change" },
         ],
@@ -520,6 +543,16 @@ export default {
         { label: "章编码", prop: "code", width: "120" },
         { label: "标题前缀", prop: "prefixName", width: "180" },
         { label: "章标题", prop: "name" },
+        {
+          label: "视频类型",
+          prop: "viewSign",
+          scope: "isOptions",
+          options: [
+            { label: "保利威", value: 1 },
+            { label: "腾讯", value: 2 },
+          ],
+          width: "120",
+        },
         { label: "节数量", prop: "sectionNum", width: "120" },
         {
           label: "发布状态",
@@ -974,6 +1007,10 @@ export default {
               this.$message.warning(`管理章第${i + 1}条请输入排序`);
               return;
             }
+            if(this.tableData[i].viewSign != this.listData.viewSign){
+              this.$message.warning("请保持模块视频类型与章视频类型保持一致")
+              return
+            }
           }
           let arr = this.tableData.map((items) => {
             return items.sort;
@@ -999,6 +1036,7 @@ export default {
       });
       var dataInfos = {
         status: 1,
+        viewSign:this.listData.viewSign,
         moduleId: this.pageId,
         businessList: this.newSujectApis,
         chapterIdList: chapterIdList,

+ 48 - 2
src/views/secondBuild/courseList/index.vue

@@ -41,7 +41,7 @@
           <span v-if="!activeId" style="font-size: 30px"
             >请打开目录详情,点击播放您需要观看的视频内容。</span
           >
-          <div v-show="vid" id="player"></div>
+          <div v-show="vid && viewSign == 1" id="player"></div>
           <div v-show="vidzb" id="playerzb"></div>
         </div>
         <div class="rightBoxslist">
@@ -246,7 +246,10 @@ export default {
       dialogVisible: false,
       courseList: [], //详情列表
       activeId: "", //当前选中ID
+      viewSign: 1,
       vodPlayerJs: "https://player.polyv.net/script/player.js",
+      vodPlayerJsForTCPlayer:
+        "https://web.sdk.qcloud.com/player/tcplayer/release/v5.1.0/tcplayer.v5.1.0.min.js",
       vid: "",
       playerJs:
         "https://player.polyv.net/resp/live-h5-player/latest/liveplayer.min.js",
@@ -345,6 +348,7 @@ export default {
      */
     msgInfo(option) {
       this.goodsBoxName = option.goodsName;
+      this.viewSign = option.viewSign
       this.$api.obtainCourseSgoodsId(option.goodsId).then(async (res) => {
         // if (res.rows.length) {
         if (!res.rows.length) {
@@ -628,7 +632,11 @@ export default {
         this.loadPlayerScriptzb(this.loadPlayerzb);
       } else {
         this.vid = option.recordingUrl;
-        this.loadPlayerScript(this.loadPlayer);
+        if(this.viewSign == 2) {
+          this.loadPlayerScript_tencent(this.loadPlayer_tencent);
+        }else {
+          this.loadPlayerScript(this.loadPlayer);
+        }
       }
     },
     loadPlayerScript(callback) {
@@ -641,6 +649,16 @@ export default {
         callback();
       }
     },
+    loadPlayerScript_tencent(callback) {
+      if (!window.TCPlayer) {
+        const myScript = document.createElement("script");
+        myScript.setAttribute("src", this.vodPlayerJsForTCPlayer);
+        myScript.onload = callback;
+        document.body.appendChild(myScript);
+      } else {
+        callback();
+      }
+    },
     loadPlayer() {
       var self = this;
       const polyvPlayer = window.polyvPlayer;
@@ -657,6 +675,31 @@ export default {
         },
       });
     },
+    loadPlayer_tencent() {
+      var self = this;
+      const TCPlayer = window.TCPlayer;
+      try {
+        let video = document.querySelector("video");
+        video.parentNode.removeChild(video);
+      } catch (error) {
+        console.log("清除video标签异常");
+      }
+      let player_tencent = document.createElement("video");
+      player_tencent.id = "player-tencent";
+      document
+        .getElementById("player")
+        .insertAdjacentElement("afterend", player_tencent);
+      self.$api.obtaintcvideosign(self.vid).then(res => {
+        self.player_tencent = TCPlayer("player-tencent", {
+          width: 932,
+        height: 627,
+          fileID: self.vid,
+          appID: res.data.appID,
+          psign: res.data.psign,
+          licenseUrl: res.data.licenseUrl
+        });
+      });
+    },
     /**
      * @param {String} 关闭视频窗口-销毁实例
      */
@@ -668,6 +711,9 @@ export default {
         if (this.player) {
           this.player.destroy();
         }
+        if (this.player_tencent) {
+          this.player.dispose();
+        }
         if (this.playerzb) {
           this.playerzb.destroy();
         }

+ 48 - 2
src/views/secondJian/courseList/index.vue

@@ -41,7 +41,7 @@
           <span v-if="!activeId" style="font-size: 30px"
             >请打开目录详情,点击播放您需要观看的视频内容。</span
           >
-          <div v-show="vid" id="player"></div>
+          <div v-show="vid && viewSign == 1" id="player"></div>
           <div v-show="vidzb" id="playerzb"></div>
         </div>
         <div class="rightBoxslist">
@@ -248,7 +248,10 @@ export default {
       dialogVisible: false,
       courseList: [], //详情列表
       activeId: "", //当前选中ID
+      viewSign: 1,
       vodPlayerJs: "https://player.polyv.net/script/player.js",
+      vodPlayerJsForTCPlayer:
+        "https://web.sdk.qcloud.com/player/tcplayer/release/v5.1.0/tcplayer.v5.1.0.min.js",
       vid: "",
       playerJs:
         "https://player.polyv.net/resp/live-h5-player/latest/liveplayer.min.js",
@@ -330,6 +333,7 @@ export default {
      */
     msgInfo(option) {
       this.goodsBoxName = option.goodsName;
+      this.viewSign = option.viewSign;
       this.$api.obtainCourseSgoodsId(option.goodsId).then(async (res) => {
         // if (res.rows.length) {
         if (!res.rows.length) {
@@ -613,7 +617,11 @@ export default {
         this.loadPlayerScriptzb(this.loadPlayerzb);
       } else {
         this.vid = option.recordingUrl;
-        this.loadPlayerScript(this.loadPlayer);
+        if(this.viewSign == 2) {
+          this.loadPlayerScript_tencent(this.loadPlayer_tencent);
+        }else {
+          this.loadPlayerScript(this.loadPlayer);
+        }
       }
     },
     loadPlayerScript(callback) {
@@ -626,6 +634,16 @@ export default {
         callback();
       }
     },
+    loadPlayerScript_tencent(callback) {
+      if (!window.TCPlayer) {
+        const myScript = document.createElement("script");
+        myScript.setAttribute("src", this.vodPlayerJsForTCPlayer);
+        myScript.onload = callback;
+        document.body.appendChild(myScript);
+      } else {
+        callback();
+      }
+    },
     loadPlayer() {
       var self = this;
       const polyvPlayer = window.polyvPlayer;
@@ -642,6 +660,31 @@ export default {
         },
       });
     },
+    loadPlayer_tencent() {
+      var self = this;
+      const TCPlayer = window.TCPlayer;
+      try {
+        let video = document.querySelector("video");
+        video.parentNode.removeChild(video);
+      } catch (error) {
+        console.log("清除video标签异常");
+      }
+      let player_tencent = document.createElement("video");
+      player_tencent.id = "player-tencent";
+      document
+        .getElementById("player")
+        .insertAdjacentElement("afterend", player_tencent);
+      self.$api.obtaintcvideosign(self.vid).then(res => {
+        self.player_tencent = TCPlayer("player-tencent", {
+          width: 932,
+        height: 627,
+          fileID: self.vid,
+          appID: res.data.appID,
+          psign: res.data.psign,
+          licenseUrl: res.data.licenseUrl
+        });
+      });
+    },
     /**
      * @param {String} 关闭视频窗口-销毁实例
      */
@@ -653,6 +696,9 @@ export default {
         if (this.player) {
           this.player.destroy();
         }
+        if (this.player_tencent) {
+          this.player.dispose();
+        }
         if (this.playerzb) {
           this.playerzb.destroy();
         }

+ 48 - 2
src/views/secondSeven/courseList/index.vue

@@ -41,7 +41,7 @@
           <span v-if="!activeId" style="font-size: 30px"
             >请打开目录详情,点击播放您需要观看的视频内容。</span
           >
-          <div v-show="vid" id="player"></div>
+          <div v-show="vid && viewSign == 1" id="player"></div>
           <div v-show="vidzb" id="playerzb"></div>
         </div>
         <div class="rightBoxslist">
@@ -248,7 +248,10 @@ export default {
       dialogVisible: false,
       courseList: [], //详情列表
       activeId: "", //当前选中ID
+      viewSign: 1,
       vodPlayerJs: "https://player.polyv.net/script/player.js",
+      vodPlayerJsForTCPlayer:
+        "https://web.sdk.qcloud.com/player/tcplayer/release/v5.1.0/tcplayer.v5.1.0.min.js",
       vid: "",
       playerJs:
         "https://player.polyv.net/resp/live-h5-player/latest/liveplayer.min.js",
@@ -330,6 +333,7 @@ export default {
      */
     msgInfo(option) {
       this.goodsBoxName = option.goodsName;
+      this.viewSign = option.viewSign;
       this.$api.obtainCourseSgoodsId(option.goodsId).then(async (res) => {
         // if (res.rows.length) {
         if (!res.rows.length) {
@@ -613,7 +617,11 @@ export default {
         this.loadPlayerScriptzb(this.loadPlayerzb);
       } else {
         this.vid = option.recordingUrl;
-        this.loadPlayerScript(this.loadPlayer);
+        if(this.viewSign == 2) {
+          this.loadPlayerScript_tencent(this.loadPlayer_tencent);
+        }else {
+          this.loadPlayerScript(this.loadPlayer);
+        }
       }
     },
     loadPlayerScript(callback) {
@@ -626,6 +634,16 @@ export default {
         callback();
       }
     },
+    loadPlayerScript_tencent(callback) {
+      if (!window.TCPlayer) {
+        const myScript = document.createElement("script");
+        myScript.setAttribute("src", this.vodPlayerJsForTCPlayer);
+        myScript.onload = callback;
+        document.body.appendChild(myScript);
+      } else {
+        callback();
+      }
+    },
     loadPlayer() {
       var self = this;
       const polyvPlayer = window.polyvPlayer;
@@ -642,6 +660,31 @@ export default {
         },
       });
     },
+    loadPlayer_tencent() {
+      var self = this;
+      const TCPlayer = window.TCPlayer;
+      try {
+        let video = document.querySelector("video");
+        video.parentNode.removeChild(video);
+      } catch (error) {
+        console.log("清除video标签异常");
+      }
+      let player_tencent = document.createElement("video");
+      player_tencent.id = "player-tencent";
+      document
+        .getElementById("player")
+        .insertAdjacentElement("afterend", player_tencent);
+      self.$api.obtaintcvideosign(self.vid).then(res => {
+        self.player_tencent = TCPlayer("player-tencent", {
+          width: 932,
+        height: 627,
+          fileID: self.vid,
+          appID: res.data.appID,
+          psign: res.data.psign,
+          licenseUrl: res.data.licenseUrl
+        });
+      });
+    },
     /**
      * @param {String} 关闭视频窗口-销毁实例
      */
@@ -653,6 +696,9 @@ export default {
         if (this.player) {
           this.player.destroy();
         }
+        if (this.player_tencent) {
+          this.player.dispose();
+        }
         if (this.playerzb) {
           this.playerzb.destroy();
         }

+ 48 - 2
src/views/secondZao/courseList/index.vue

@@ -41,7 +41,7 @@
           <span v-if="!activeId" style="font-size: 30px"
             >请打开目录详情,点击播放您需要观看的视频内容。</span
           >
-          <div v-show="vid" id="player"></div>
+          <div v-show="vid && viewSign == 1" id="player"></div>
           <div v-show="vidzb" id="playerzb"></div>
         </div>
         <div class="rightBoxslist">
@@ -248,7 +248,10 @@ export default {
       dialogVisible: false,
       courseList: [], //详情列表
       activeId: "", //当前选中ID
+      viewSign: 1,
       vodPlayerJs: "https://player.polyv.net/script/player.js",
+      vodPlayerJsForTCPlayer:
+        "https://web.sdk.qcloud.com/player/tcplayer/release/v5.1.0/tcplayer.v5.1.0.min.js",
       vid: "",
       playerJs:
         "https://player.polyv.net/resp/live-h5-player/latest/liveplayer.min.js",
@@ -330,6 +333,7 @@ export default {
      */
     msgInfo(option) {
       this.goodsBoxName = option.goodsName;
+      this.viewSign = option.viewSign;
       this.$api.obtainCourseSgoodsId(option.goodsId).then(async (res) => {
         // if (res.rows.length) {
         if (!res.rows.length) {
@@ -613,7 +617,11 @@ export default {
         this.loadPlayerScriptzb(this.loadPlayerzb);
       } else {
         this.vid = option.recordingUrl;
-        this.loadPlayerScript(this.loadPlayer);
+        if(this.viewSign == 2) {
+          this.loadPlayerScript_tencent(this.loadPlayer_tencent);
+        }else {
+          this.loadPlayerScript(this.loadPlayer);
+        }
       }
     },
     loadPlayerScript(callback) {
@@ -626,6 +634,16 @@ export default {
         callback();
       }
     },
+    loadPlayerScript_tencent(callback) {
+      if (!window.TCPlayer) {
+        const myScript = document.createElement("script");
+        myScript.setAttribute("src", this.vodPlayerJsForTCPlayer);
+        myScript.onload = callback;
+        document.body.appendChild(myScript);
+      } else {
+        callback();
+      }
+    },
     loadPlayer() {
       var self = this;
       const polyvPlayer = window.polyvPlayer;
@@ -642,6 +660,31 @@ export default {
         },
       });
     },
+    loadPlayer_tencent() {
+      var self = this;
+      const TCPlayer = window.TCPlayer;
+      try {
+        let video = document.querySelector("video");
+        video.parentNode.removeChild(video);
+      } catch (error) {
+        console.log("清除video标签异常");
+      }
+      let player_tencent = document.createElement("video");
+      player_tencent.id = "player-tencent";
+      document
+        .getElementById("player")
+        .insertAdjacentElement("afterend", player_tencent);
+      self.$api.obtaintcvideosign(self.vid).then(res => {
+        self.player_tencent = TCPlayer("player-tencent", {
+          width: 932,
+        height: 627,
+          fileID: self.vid,
+          appID: res.data.appID,
+          psign: res.data.psign,
+          licenseUrl: res.data.licenseUrl
+        });
+      });
+    },
     /**
      * @param {String} 关闭视频窗口-销毁实例
      */
@@ -653,6 +696,9 @@ export default {
         if (this.player) {
           this.player.destroy();
         }
+        if (this.player_tencent) {
+          this.player.dispose();
+        }
         if (this.playerzb) {
           this.playerzb.destroy();
         }