瀏覽代碼

直播中控台播放解析,新建直播间问题修改;总后台开播的直播间 销售后台只有查看的权限

yuhongqi 2 周之前
父節點
當前提交
f210955a5e

+ 9 - 7
src/components/VideoUpload/index.vue

@@ -3,6 +3,7 @@
     <el-form-item label="">
       <div class="upload_video" id="upload_video">
         <el-upload
+          v-show="!isViewOnly"
           class="upload-demo"
           ref="upload"
           action="#"
@@ -179,6 +180,11 @@ export default {
     showControl: {
       type: Boolean,
       default: true,
+    },
+    // 使用一个变量控制显示,默认为true显示所有控制项
+    isViewOnly: {
+      type: Boolean,
+      default: false,
     }
   },
   data() {
@@ -230,10 +236,7 @@ export default {
     this.reset();
   },
   watch: {
-    localUploadType(newType) {
-      this.$emit("update:uploadType", newType);
-      this.$emit("change");
-    },
+
     uploadType(newType) {
       this.localUploadType = newType;
     },
@@ -395,17 +398,16 @@ export default {
         this.$message.warning("请选择一个视频");
         return;
       }
+      console.log(this.selectedVideo)
 
       // 更新组件内部数据
       this.$emit("update:fileName", this.selectedVideo.fileName);
-      this.$emit("update:thumbnail", this.selectedVideo.thumbnail);
       this.$emit("update:line_1", this.selectedVideo.lineOne);
       this.$emit("update:fileSize", this.selectedVideo.fileSize);
       this.$emit("update:fileKey", this.selectedVideo.fileKey);
-      this.$emit("update:uploadType", this.selectedVideo.uploadType);
-      this.$emit("video-duration", this.selectedVideo.duration);
       // 设置预览URL
       this.$emit("update:videoUrl", this.selectedVideo.videoUrl);
+      this.$emit("video-duration", this.selectedVideo.duration);
       this.$emit("change", this.selectedVideo.videoUrl,this.selectedVideo.lineOne);
 
 

+ 61 - 31
src/views/live/live/index.vue

@@ -11,28 +11,7 @@
           v-hasPermi="['live:live:add']"
         >新增</el-button>
       </el-col>
-<!--      <el-col :span="1.5">-->
-<!--        <el-button-->
-<!--          type="success"-->
-<!--          plain-->
-<!--          icon="el-icon-edit"-->
-<!--          size="mini"-->
-<!--          :disabled="single"-->
-<!--          @click="handleUpdate"-->
-<!--          v-hasPermi="['live:live:edit']"-->
-<!--        >修改</el-button>-->
-<!--      </el-col>-->
-<!--      <el-col :span="1.5">-->
-<!--        <el-button-->
-<!--          type="warning"-->
-<!--          plain-->
-<!--          icon="el-icon-download"-->
-<!--          size="mini"-->
-<!--          :loading="exportLoading"-->
-<!--          @click="handleExport"-->
-<!--          v-hasPermi="['live:live:export']"-->
-<!--        >导出</el-button>-->
-<!--      </el-col>-->
+
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
@@ -196,12 +175,22 @@
       <el-table-column label="操作" align="center" width="200" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
+            v-if="scope.row.companyName != '总台'"
             size="mini"
             type="text"
             icon="el-icon-edit"
             @click="handleUpdate(scope.row)"
             v-hasPermi="['live:live:edit']"
           >修改</el-button>
+          <el-button
+            v-if="scope.row.companyName == '总台'"
+            size="mini"
+            type="text"
+            style="color: #00CC66"
+            icon="el-icon-edit"
+            @click="handleView(scope.row)"
+            v-hasPermi="['live:live:edit']"
+          >查看</el-button>
           <el-button
             size="mini"
             type="text"
@@ -299,16 +288,16 @@
     <el-dialog :title="title" :visible.sync="open" width="900px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-form-item label="直播名称" prop="liveName">
-          <el-input v-model="form.liveName" placeholder="请输入直播名称" />
+          <el-input v-model="form.liveName" placeholder="请输入直播名称" :disabled="isViewOnly"/>
         </el-form-item>
         <el-form-item label="显示类型" prop="showType">
-          <el-radio-group v-model="form.showType">
+          <el-radio-group v-model="form.showType" :disabled="isViewOnly">
             <el-radio :label="1">横屏</el-radio>
             <el-radio :label="2">竖屏</el-radio>
           </el-radio-group>
         </el-form-item>
         <el-form-item label="直播类型" prop="liveType">
-          <el-radio-group v-model="form.liveType">
+          <el-radio-group v-model="form.liveType" :disabled="isViewOnly">
             <el-radio :label="1">直播</el-radio>
             <el-radio :label="2">录播</el-radio>
           </el-radio-group>
@@ -324,13 +313,14 @@
 <!--          </el-select>-->
 <!--        </el-form-item>-->
         <el-form-item label="直播描述" prop="liveDesc">
-          <Editor ref="myeditor" :height="300" @on-text-change="updateText"/>
+          <Editor ref="myeditor" :height="300" @on-text-change="updateText"  />
           <!--          <Editor v-model="form.liveDesc" :height="300" placeholder="直播描述" />-->
         </el-form-item>
-        <el-form-item label="录播视屏" prop="videoUrl" v-if="form.liveType == 2">
+        <el-form-item label="录播视屏" prop="videoUrl" v-if="form.liveType == 2" >
           <video-upload :fileKey.sync="form.fileKey" :fileSize.sync="form.fileSize"
                         :videoUrl.sync="form.videoUrl" :fileName.sync="form.fileName" :line_1.sync="form.lineOne"
                         :uploadType.sync="form.uploadType" :isTranscode.sync="form.isTranscode"
+                        :isViewOnly="isViewOnly"
                         ref="videoUpload"
                         :transcodeFileKey.sync="form.transcodeFileKey" @video-duration="handleVideoDuration"
                         @change="handleVideoChange"></video-upload>
@@ -359,6 +349,7 @@
                           v-model="form.startTime"
                           @change="timeChange"
                           type="datetime"
+                          :disabled="isViewOnly"
                           format="yyyy-MM-dd HH:mm:ss"
                           value-format="yyyy-MM-dd HH:mm:ss"
                           :picker-options="{
@@ -374,6 +365,7 @@
           <el-date-picker size="small"
                           v-model="form.finishTime"
                           type="datetime"
+                          :disabled="isViewOnly"
                           format="yyyy-MM-dd HH:mm:ss"
                           value-format="yyyy-MM-dd HH:mm:ss"
                           :picker-options="{
@@ -386,17 +378,17 @@
           </el-date-picker>
         </el-form-item>
         <el-form-item label="直播封面" prop="liveImgUrl">
-          <image-upload v-model="form.liveImgUrl" :limit="1" />
+          <image-upload v-model="form.liveImgUrl" :limit="1" :disabled="isViewOnly"/>
         </el-form-item>
         <el-form-item label="上下架" prop="isShow">
-          <el-radio-group v-model="form.isShow">
+          <el-radio-group v-model="form.isShow" :disabled="isViewOnly">
             <el-radio :label="1">上架</el-radio>
             <el-radio :label="2">下架</el-radio>
           </el-radio-group>
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button type="primary" @click="submitForm" v-show="!isViewOnly">确 定</el-button>
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
@@ -437,6 +429,8 @@ export default {
   components: { Editor,VideoUpload },
   data() {
     return {
+      // 是否只读
+      isViewOnly:false,
       baseUrl: process.env.VUE_APP_BASE_API,
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
       isPrivate:null,
@@ -463,6 +457,7 @@ export default {
       title: "",
       // 是否显示弹出层
       open: false,
+      liveDesc:null,
       // 查询参数
       queryParams: {
         pageNum: 1,
@@ -750,6 +745,7 @@ export default {
 
     /** 新增按钮操作 */
     handleAdd() {
+      this.isViewOnly = false
       this.reset();
       this.open = true;
 
@@ -760,10 +756,19 @@ export default {
       this.title = "添加直播间";
     },
     updateText(text){
-      this.form.liveDesc=text
+      setTimeout(() => {
+        if (this.isViewOnly) {
+          this.$refs.myeditor.setText(this.liveDesc);
+          this.form.liveDesc=this.liveDesc;
+        } else {
+          this.form.liveDesc=text;
+        }
+      }, 1);
+
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
+      this.isViewOnly = false
       this.reset();
       const liveId = row.liveId || this.ids
       getLive(liveId).then(response => {
@@ -771,6 +776,7 @@ export default {
         if(this.form.duration){
           this.form.durationTime = this.secondsToTime(this.form.duration)
         }
+        this.liveDesc = this.form.liveDesc
 
         setTimeout(() => {
           if(this.form.liveDesc==null){
@@ -784,6 +790,30 @@ export default {
         this.title = "修改直播间";
       });
     },
+    /** 修改按钮操作 */
+    handleView(row) {
+      this.isViewOnly = true
+      this.reset();
+      const liveId = row.liveId || this.ids
+      getLive(liveId).then(response => {
+        this.form = response.data;
+        if(this.form.duration){
+          this.form.durationTime = this.secondsToTime(this.form.duration)
+        }
+        this.liveDesc = this.form.liveDesc
+
+        setTimeout(() => {
+          if(this.form.liveDesc==null){
+            this.$refs.myeditor.setText("");
+          }else{
+            this.$refs.myeditor.setText(this.form.liveDesc);
+          }
+          this.form.videoUrl = row.videoUrl
+        }, 1);
+        this.open = true;
+        this.title = "查看直播间";
+      });
+    },
     /** 提交按钮 */
     submitForm() {
       if(this.form.liveId != null) { this.videoUrl = this.form.videoUrl; }

+ 12 - 1
src/views/live/liveConfig/barrage.vue

@@ -8,21 +8,24 @@
       </el-col>
       <el-col :span="1.5">
         <el-button
+          :disabled="isViewOnly"
           type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['live:task:add']"
         >新增</el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
-          type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete" v-hasPermi="['live:task:remove']"
+          type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple || isViewOnly" @click="handleDelete" v-hasPermi="['live:task:remove']"
         >删除</el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
+          :disabled="isViewOnly"
           type="warning" plain icon="el-icon-download" size="mini" :loading="exportLoading" @click="handleExport" v-hasPermi="['live:task:export']"
         >导出</el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
+          :disabled="isViewOnly"
           type="success" plain icon="el-icon-download" size="mini" :loading="exportLoading" @click="handleImport" v-hasPermi="['live:task:export']"
         >导入</el-button>
       </el-col>
@@ -40,9 +43,11 @@
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
+            :disabled="isViewOnly"
             size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['live:task:edit']"
           >修改</el-button>
           <el-button
+            :disabled="isViewOnly"
             size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['live:task:remove']"
           >删除</el-button>
         </template>
@@ -124,6 +129,12 @@ import { listTaskBarrage, getTask, delTask, addTask, updateTask, exportTaskBarra
 import { getToken } from "@/utils/auth";
 
 export default {
+  props:{
+    isViewOnly: {
+      type: Boolean,
+      default: false,
+    }
+  },
   name: "Barrage",
   data() {
     return {

+ 15 - 4
src/views/live/liveConfig/goods.vue

@@ -6,10 +6,10 @@
       <el-checkbox :indeterminate="isIndeterminate" v-model="allChecked" @change="toggleSelectAll">
         {{ multipleSelection.length > 0 ? `已选 ${multipleSelection.length} 条` : '选中本页' }}
       </el-checkbox>
-      <el-button  plain size="mini" @click="handleShelf">上架</el-button>
-      <el-button  plain size="mini" @click="handleUnshelf">下架</el-button>
-      <el-button  plain size="mini" @click="handleDeleteSelected">删除</el-button>
-      <el-button  plain type="mini" icon="el-icon-plus" @click="handleAddLiveGoods">添加商品</el-button>
+      <el-button  plain size="mini" @click="handleShelf" :disabled="isViewOnly">上架</el-button>
+      <el-button  plain size="mini" @click="handleUnshelf" :disabled="isViewOnly">下架</el-button>
+      <el-button  plain size="mini" @click="handleDeleteSelected" :disabled="isViewOnly">删除</el-button>
+      <el-button  plain type="mini" icon="el-icon-plus" @click="handleAddLiveGoods" :disabled="isViewOnly">添加商品</el-button>
     </div>
     <el-table
       ref="goodTable"
@@ -64,6 +64,7 @@
       >
         <template slot-scope="scope">
             <el-switch
+              :disabled="isViewOnly"
               v-model="scope.row.isShow"
               @click.native.capture.prevent="handleSwitchClick(scope.row)"
               active-color="#13ce66"
@@ -100,18 +101,21 @@
       >
         <template slot-scope="scope">
           <el-button
+            :disabled="isViewOnly"
             type="text"
             size="small"
             style="color: #0066FF;"
             @click="handleGoodStock(scope.row)"
           >调整库存</el-button>
           <el-button
+            :disabled="isViewOnly"
             type="text"
             size="small"
             style="color: #0066FF;"
             @click="handleGoodSale(scope.row)"
           >调整销量</el-button>
           <el-button
+            :disabled="isViewOnly"
             type="text"
             size="small"
             style="color: #F56C6C;"
@@ -264,6 +268,12 @@ import {
 } from "@/api/live/liveGoods";
 
 export default {
+  props:{
+    isViewOnly: {
+      type: Boolean,
+      default: false,
+    }
+  },
   data() {
     return {
       liveId: '',
@@ -353,6 +363,7 @@ export default {
       console.log('路由变化:', from.path, '->', to.path);
     },
     handleSwitchClick(row) {
+      if(this.isViewOnly) return
       // 1. 获取「即将切换到的目标状态」(当前状态取反)
       const targetStatus = !row.isShow
       const goodsList = [row.goodsId];

+ 7 - 1
src/views/live/liveConfig/idCard.vue

@@ -5,7 +5,7 @@
         <img :src="idCardUrl" alt="身份证" style="height: 150px; width: 150px" v-if="idCardUrl != null">
         <ImageUpload @input="handleUrl" type="image" :num="10" :width="150" :height="150" />
       </el-form-item>
-      <el-button type="primary" size="mini" @click="submit">保存</el-button>
+      <el-button type="primary" size="mini" @click="submit" v-show="!isViewOnly">保存</el-button>
     </el-form-item>
   </el-form>
 </template>
@@ -15,6 +15,12 @@ import ImageUpload from '@/components/ImageUpload/index';
 import {verifyIdInfo, getLive} from '@/api/live/live'
 
 export default {
+  props:{
+    isViewOnly: {
+      type: Boolean,
+      default: false,
+    }
+  },
   components: { ImageUpload },
   data() {
     return {

+ 7 - 2
src/views/live/liveConfig/index.vue

@@ -47,7 +47,7 @@
       <!-- 左边菜单 -->
         <div class="left-menu">
           <el-menu default-active="1" class="el-menu-vertical-demo" @select="handleSelect">
-            <el-menu-item :index="item.index" v-for="item in menuList" >
+            <el-menu-item :index="item.index" v-for="item in menuList">
               <span>{{item.name}}</span>
             </el-menu-item>
           </el-menu>
@@ -55,7 +55,7 @@
         <!-- 右边信息 -->
         <div class="right-info">
           <!-- 动态组件 -->
-          <component :is="currentComponent" ></component>
+          <component :is="currentComponent" :isViewOnly="isViewOnly"></component>
         </div>
       </div>
     </el-card>
@@ -94,6 +94,7 @@ export default {
   },
   data() {
     return {
+      isViewOnly: false,
       activeTab: 'watchReward',
       liveId: null,
       liveInfo: {},
@@ -125,6 +126,10 @@ export default {
     getLiving() {
       getLive(this.liveId).then(res => {
         this.liveInfo = res.data
+        if(this.liveInfo.companyId == null || this.liveInfo.companyId == ''){
+          this.isViewOnly = true
+          console.log(this.isViewOnly)
+        }
       })
     },
   }

+ 12 - 2
src/views/live/liveConfig/liveCoupon.vue

@@ -8,8 +8,8 @@
       </el-checkbox>
       <!--      <el-button  plain size="mini" @click="handleShelf">上架</el-button>-->
       <!--      <el-button  plain size="mini" @click="handleUnshelf">下架</el-button>-->
-      <el-button  plain size="mini" @click="handleDeleteSelected">删除</el-button>
-      <el-button  plain type="mini" icon="el-icon-plus" @click="handleAddLiveCoupon">添加优惠券</el-button>
+      <el-button  plain size="mini" @click="handleDeleteSelected" :disabled="isViewOnly">删除</el-button>
+      <el-button  plain type="mini" icon="el-icon-plus" @click="handleAddLiveCoupon" :disabled="isViewOnly">添加优惠券</el-button>
     </div>
     <el-table
       ref="couponTable"
@@ -56,6 +56,7 @@
       >
         <template slot-scope="scope">
           <el-switch
+            :disabled="isViewOnly"
             v-model="scope.row.isShow == 1"
             @click.native.capture.prevent="handleSwitchClick(scope.row)"
             active-color="#13ce66"
@@ -74,12 +75,14 @@
       >
         <template slot-scope="scope">
           <el-button
+            :disabled="isViewOnly"
             type="text"
             size="small"
             style="color: #0fae11;"
             @click="handleCouponBind(scope.row)"
           >绑定商品</el-button>
           <el-button
+            :disabled="isViewOnly"
             type="text"
             size="small"
             style="color: #F56C6C;"
@@ -222,6 +225,12 @@ import { listLiveGoods} from "@/api/live/liveGoods";
 
 
 export default {
+  props:{
+    isViewOnly: {
+      type: Boolean,
+      default: false,
+    }
+  },
   data() {
     return {
       liveId: '',
@@ -320,6 +329,7 @@ export default {
       console.log('路由变化:', from.path, '->', to.path);
     },
     handleSwitchClick(row) {
+      if(this.isViewOnly) return;
       // 1. 获取「即将切换到的目标状态」(当前状态取反)
       const targetStatus = !row.isShow
       const couponList = row.id;

+ 24 - 4
src/views/live/liveConfig/liveLotteryConf.vue

@@ -47,6 +47,7 @@
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
         <el-button
+          :disabled="isViewOnly"
           type="primary"
           plain
           icon="el-icon-plus"
@@ -61,7 +62,7 @@
           plain
           icon="el-icon-edit"
           size="mini"
-          :disabled="single"
+          :disabled="single || isViewOnly"
           @click="handleUpdate"
           v-hasPermi="['live:liveLotteryConf:edit']"
         >修改</el-button>
@@ -79,6 +80,7 @@
       </el-col>-->
       <el-col :span="1.5">
         <el-button
+          :disabled="isViewOnly"
           type="warning"
           plain
           icon="el-icon-download"
@@ -114,6 +116,7 @@
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
+            :disabled="isViewOnly"
             size="mini"
             type="text"
             icon="el-icon-edit"
@@ -123,6 +126,7 @@
           >修改</el-button>
           <!-- 开始 -->
           <el-button
+            :disabled="isViewOnly"
             size="mini"
             type="text"
             icon="el-icon-delete"
@@ -131,6 +135,7 @@
           >开始</el-button>
           <!-- 暂停 -->
           <el-button
+            :disabled="isViewOnly"
             size="mini"
             type="text"
             icon="el-icon-delete"
@@ -139,6 +144,7 @@
           >暂停</el-button>
           <!-- 结算 -->
           <el-button
+            :disabled="isViewOnly"
             size="mini"
             type="text"
             icon="el-icon-delete"
@@ -147,6 +153,7 @@
           >结算</el-button>
 
           <el-button
+            :disabled="isViewOnly"
             size="mini"
             type="text"
             icon="el-icon-delete"
@@ -209,7 +216,7 @@
         <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="抽奖ID" prop="lotteryId">
-              <el-input v-model="form1.lotteryId" placeholder="请输入抽奖ID" />
+              <el-input v-model="form1.lotteryId" placeholder="请输入抽奖ID" :disabled="isViewOnly"/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -226,6 +233,7 @@
           <div slot="header" class="prize-header">
             <span><b>奖品等级 :{{ prize.prizeLevel }}</b></span>
             <el-button
+              :disabled="isViewOnly"
               v-if="form1.prizes.length > 1"
               @click="removePrize(index)"
               type="danger"
@@ -243,6 +251,7 @@
                 :rules="[{ required: true, message: '请输入商品', trigger: 'blur' }]">
 <!--                <el-input v-model="prize.productId" placeholder="请输入商品ID" />-->
                 <el-select
+                  :disabled="isViewOnly"
                   v-model="prize.productId"
                   :filterable="true"
                   clearable
@@ -269,7 +278,7 @@
                 label="奖品等级"
                 :prop="'prizes.' + index + '.prizeLevel'"
                 :rules="[{ required: true, message: '请输入奖品等级', trigger: 'blur' }]">
-                <el-input v-model="prize.prizeLevel" placeholder="请输入奖品等级" />
+                <el-input v-model="prize.prizeLevel" placeholder="请输入奖品等级" :disabled="isViewOnly"/>
               </el-form-item>
             </el-col>
           </el-row>
@@ -284,6 +293,7 @@
                 { type: 'number', message: '必须为数字值' }
               ]">
                 <el-input-number
+                  :disabled="isViewOnly"
                   v-model="prize.perLotteryNum"
                   :min="1"
                   :max="100"
@@ -300,6 +310,7 @@
                 { type: 'number', message: '必须为数字值' }
               ]">
                 <el-input-number
+                  :disabled="isViewOnly"
                   v-model="prize.totalLots"
                   :min="1"
                   controls-position="right"
@@ -327,6 +338,7 @@
 
         <div class="add-prize-btn">
           <el-button
+            :disabled="isViewOnly"
             @click="addPrize"
             type="primary"
             icon="el-icon-plus"
@@ -339,7 +351,7 @@
 
       <div slot="footer" class="dialog-footer">
         <el-button @click="cancel1">取 消</el-button>
-        <el-button type="primary" @click="submitForm1">确 定</el-button>
+        <el-button type="primary" @click="submitForm1" v-show="!isViewOnly">确 定</el-button>
       </div>
     </el-dialog>
 
@@ -370,8 +382,15 @@ import {
 } from '@/api/live/liveLotteryProductConf'
 import {info} from '@/api/live/liveUserLotteryRecord'
 import { listLiveGoods } from '@/api/live/liveGoods'
+import {isView} from "core-js/internals/array-buffer-view-core";
 
 export default {
+  props:{
+    isViewOnly: {
+      type: Boolean,
+      default: false,
+    }
+  },
   name: "LiveLotteryConf",
   components: { LiveLotteryProductConf },
   data() {
@@ -522,6 +541,7 @@ export default {
     );
   },
   methods: {
+    isView,
     getProducts(){
       const queryParam = {
           liveId : this.liveId

+ 14 - 1
src/views/live/liveConfig/liveRedConf.vue

@@ -55,6 +55,7 @@
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
         <el-button
+          :disabled="isViewOnly"
           type="primary"
           plain
           icon="el-icon-plus"
@@ -69,13 +70,14 @@
           plain
           icon="el-icon-edit"
           size="mini"
-          :disabled="single"
+          :disabled="single || isViewOnly"
           @click="handleUpdate"
           v-hasPermi="['live:liveRedConf:edit']"
         >修改</el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
+          :disabled="isViewOnly"
           type="warning"
           plain
           icon="el-icon-download"
@@ -112,6 +114,7 @@
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
+            :disabled="isViewOnly"
             size="mini"
             type="text"
             icon="el-icon-edit"
@@ -121,6 +124,7 @@
           >修改</el-button>
           <!-- 开始 -->
           <el-button
+            :disabled="isViewOnly"
             size="mini"
             type="text"
             icon="el-icon-delete"
@@ -129,6 +133,7 @@
           >开始</el-button>
           <!-- 暂停 -->
           <el-button
+            :disabled="isViewOnly"
             size="mini"
             type="text"
             icon="el-icon-delete"
@@ -137,6 +142,7 @@
           >暂停</el-button>
           <!-- 结算 -->
           <el-button
+            :disabled="isViewOnly"
             size="mini"
             type="text"
             icon="el-icon-delete"
@@ -145,6 +151,7 @@
           >结算</el-button>
 
           <el-button
+            :disabled="isViewOnly"
             size="mini"
             type="text"
             icon="el-icon-delete"
@@ -199,6 +206,12 @@
 import { listLiveRedConf, getLiveRedConf, delLiveRedConf, addLiveRedConf, updateLiveRedConf, exportLiveRedConf } from "@/api/live/liveRedConf";
 
 export default {
+  props:{
+    isViewOnly: {
+      type: Boolean,
+      default: false,
+    }
+  },
   name: "LiveRedConf",
   data() {
     return {

+ 8 - 0
src/views/live/liveConfig/liveReplay.vue

@@ -7,6 +7,7 @@
       <el-switch
         v-model="replayForm.isPlaybackOpen"
         @change="handlePlaybackSwitch"
+        :disabled="isViewOnly"
       />
       <span class="switch-desc" style="color: #9c9c9c;margin-left: 10px">开启回放,直播结束后学员可查看回放视频</span>
     </div>
@@ -165,6 +166,12 @@ import {getLive, updateLive,} from '@/api/live/live'
 import {getLiveVideoByLiveId,} from '@/api/live/liveVideo'
 
 export default {
+  props:{
+    isViewOnly: {
+      type: Boolean,
+      default: false,
+    }
+  },
   name: "LiveReplay",
   data() {
     return {
@@ -299,6 +306,7 @@ export default {
     },
     // 直播回放开关变更处理
     handlePlaybackSwitch(val) {
+      if(this.isViewOnly) return;
       if (this.liveInfo.liveType != 1 && this.liveInfo.liveType != 3) {
         this.replayForm.isPlaybackOpen = !val;
         this.$message.error("直播回放开关仅支持直播");

+ 7 - 1
src/views/live/liveConfig/preview.vue

@@ -6,7 +6,7 @@
     <div class="playback-content">
       <div>
         <span>预告内容:</span>
-        <el-button class="upload-btn" type="normal" @click="handleUploadVideo">上传视频</el-button>
+        <el-button class="upload-btn" type="normal" @click="handleUploadVideo" v-show="!isViewOnly">上传视频</el-button>
         <!--        <el-button-->
         <!--          class="upload-btn"-->
         <!--          type="text"-->
@@ -84,6 +84,12 @@ import {getLiveVideoByLiveIdAndType,addLiveVideo} from '@/api/live/liveVideo'
 import VideoUpload from "@/components/LiveVideoUpload/index.vue";
 
 export default {
+  props:{
+    isViewOnly: {
+      type: Boolean,
+      default: false,
+    }
+  },
   name: "Preview",
   components: {VideoUpload},
   data() {

+ 16 - 5
src/views/live/liveConfig/task.vue

@@ -44,6 +44,7 @@
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
         <el-button
+          :disabled="isViewOnly"
           type="primary"
           plain
           icon="el-icon-plus"
@@ -58,24 +59,26 @@
           plain
           icon="el-icon-edit"
           size="mini"
-          :disabled="single"
+          :disabled="single || isViewOnly"
           @click="handleUpdate"
           v-hasPermi="['live:task:edit']"
         >修改</el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
+
           type="danger"
           plain
           icon="el-icon-delete"
           size="mini"
-          :disabled="multiple"
+          :disabled="multiple || isViewOnly"
           @click="handleDelete"
           v-hasPermi="['live:task:remove']"
         >删除</el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
+          :disabled="isViewOnly"
           type="warning"
           plain
           icon="el-icon-download"
@@ -106,6 +109,7 @@
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
+            :disabled="isViewOnly"
             size="mini"
             type="text"
             icon="el-icon-edit"
@@ -113,6 +117,7 @@
             v-hasPermi="['live:task:edit']"
           >修改</el-button>
           <el-button
+            :disabled="isViewOnly"
             size="mini"
             type="text"
             icon="el-icon-delete"
@@ -234,6 +239,12 @@ import {listLiveRedConfOn} from "@/api/live/liveRedConf";
 import {listLiveLotteryConfOn} from "@/api/live/liveLotteryConf";
 
 export default {
+  props:{
+    isViewOnly: {
+      type: Boolean,
+      default: false,
+    }
+  },
   name: "Task",
   data() {
     return {
@@ -560,9 +571,9 @@ export default {
       }
       this.loading = true;
       listTask(this.queryParams).then(res => {
-        if(res.rows.length > 0) {
-          this.taskList = res.rows;
-        }
+
+        this.taskList = res.rows;
+
         this.total = res.total;
         this.loading = false;
       });

+ 20 - 9
src/views/live/liveConfig/watchReward.vue

@@ -8,7 +8,7 @@
     <!-- 开启观看奖励开关 -->
     <div class="reward-switch">
       <span class="switch-label">开启观看奖励</span>
-      <el-switch v-model="watchRewardForm.enabled"></el-switch>
+      <el-switch v-model="watchRewardForm.enabled" :disabled="isViewOnly"></el-switch>
     </div>
 
     <!-- 观看奖励设置 -->
@@ -31,14 +31,14 @@
 
         <!-- 观看时长 -->
         <el-form-item label="观看时长" prop="watchDuration">
-          <el-input v-model="watchRewardForm.watchDuration" placeholder="请输入观看时长" class="duration-input">
+          <el-input v-model="watchRewardForm.watchDuration" placeholder="请输入观看时长" class="duration-input" :disabled="isViewOnly">
             <template #append>分钟</template>
           </el-input>
         </el-form-item>
 
         <!-- 实施动作 -->
         <el-form-item label="实施动作" prop="action">
-          <el-select v-model="watchRewardForm.action" placeholder="请选择实施动作" style="width: 300px;">
+          <el-select v-model="watchRewardForm.action" placeholder="请选择实施动作" style="width: 300px;" :disabled="isViewOnly">
             <el-option
               v-for="item in actionOptions"
               :key="item.value"
@@ -62,7 +62,7 @@
             <!-- 现金红包设置 -->
             <!-- 红包发放方式   1固定金额 2随机金额 -->
             <el-form-item label="红包发放方式" prop="redPacketType">
-              <el-radio-group v-model="watchRewardForm.redPacketType">
+              <el-radio-group v-model="watchRewardForm.redPacketType" :disabled="isViewOnly">
                 <el-radio label="1">固定金额</el-radio>
                 <el-radio label="2">随机金额</el-radio>
               </el-radio-group>
@@ -70,17 +70,17 @@
 
             <!-- 红包金额 -->
             <el-form-item label="红包金额" prop="redPacketAmount">
-              <el-input v-model="watchRewardForm.redPacketAmount" placeholder="请输入红包金额"></el-input>
+              <el-input v-model="watchRewardForm.redPacketAmount" placeholder="请输入红包金额" :disabled="isViewOnly"></el-input>
             </el-form-item>
 
             <!-- 红包发放数量 -->
             <el-form-item label="红包发放数量" prop="redPacketCount">
-              <el-input v-model="watchRewardForm.redPacketCount" placeholder="红包数量+28888人数"></el-input>
+              <el-input v-model="watchRewardForm.redPacketCount" placeholder="红包数量+28888人数" :disabled="isViewOnly"></el-input>
             </el-form-item>
 
             <!-- 红包领取方式  1二维码核销 2微信提现 -->
             <el-form-item label="红包领取方式" prop="receiveMethod">
-              <el-radio-group v-model="watchRewardForm.receiveMethod">
+              <el-radio-group v-model="watchRewardForm.receiveMethod" :disabled="isViewOnly">
                 <el-radio label="1">二维码领取</el-radio>
                 <el-radio label="2">微信发放</el-radio>
               </el-radio-group>
@@ -92,6 +92,7 @@
             <!-- 积分值 -->
             <el-form-item label="积分值" prop="scoreAmount">
               <el-input
+                :disabled="isViewOnly"
                 v-model="watchRewardForm.scoreAmount"
                 placeholder="请输入积分值"                style="width: 300px;"
               ></el-input>
@@ -114,7 +115,7 @@
           <template v-if="watchRewardForm.action === '1'">
             <!-- 客服引导  1跟进企业微信 2不设置 -->
             <el-form-item label="客服引导" prop="showGuide">
-              <el-radio-group v-model="watchRewardForm.showGuide">
+              <el-radio-group v-model="watchRewardForm.showGuide" :disabled="isViewOnly">
                 <el-radio label="1">跟进企业微信</el-radio>
                 <el-radio label="2">不设置</el-radio>
               </el-radio-group>
@@ -123,6 +124,7 @@
             <!-- 客服引导语 -->
             <el-form-item label="客服引导语" prop="guideText">
               <el-input
+                :disabled="isViewOnly"
                 v-model="watchRewardForm.guideText"
                 placeholder="请输入客服引导语"                style="width: 300px;"
               ></el-input>
@@ -133,6 +135,7 @@
             <!-- 积分使用引导语 -->
             <el-form-item label="积分使用引导语" prop="scoreGuideText">
               <el-input
+                :disabled="isViewOnly"
                 v-model="watchRewardForm.scoreGuideText"
                 placeholder="请输入积分使用引导语"                style="width: 300px;"
               ></el-input>
@@ -141,6 +144,7 @@
             <!-- 积分使用引导链接 -->
             <el-form-item label="积分使用引导链接" prop="scoreGuideLink">
               <el-input
+                :disabled="isViewOnly"
                 v-model="watchRewardForm.scoreGuideLink"
                 placeholder="请输入积分使用引导链接"                style="width: 300px;"
               ></el-input>
@@ -158,7 +162,7 @@
 
         <!-- 保存按钮 -->
         <div class="form-actions">
-          <el-button type="primary" @click="saveWatchReward">保存</el-button>
+          <el-button type="primary" @click="saveWatchReward" v-show="!isViewOnly">保存</el-button>
         </div>
       </el-form>
     </div>
@@ -169,6 +173,12 @@
 import {addConfig, getConfig, updateConfig} from "@/api/live/liveQuestionLive";
 
 export default {
+  props:{
+    isViewOnly: {
+      type: Boolean,
+      default: false,
+    }
+  },
   data() {
     return {
       loading: true,
@@ -267,6 +277,7 @@ export default {
     }
   },
   created() {
+
   },
   methods: {
     getLiveConfig(){

+ 13 - 8
src/views/live/liveConsole/index.vue

@@ -101,7 +101,7 @@
             class="custom-video"
             style="display: block; background: #000; height: 40vh;"
           >
-            <source :src="videoUrl" type="video/mp4">
+            <source :src="videoUrl" type="application/x-mpegURL">
           </video>
           <!-- 自定义进度条容器 -->
           <div ref="progressBar" class="progress-container">
@@ -123,7 +123,7 @@
             playsinline
             style="display: block; background: #000; height: 40vh;"
           >
-            <source :src="videoUrl" type="video/mp4">
+            <source :src="videoUrl" type="application/x-mpegURL">
           </video>
         </div>
         <div style="border-radius: 5px; overflow: hidden;" v-else>
@@ -401,7 +401,6 @@ export default {
     this.$nextTick(() => {
       const video = this.$refs.videoPlayer;
       if (video != null) {
-        video.play();
         this.initVideoPlayer(this.liveInfo.startTime)
       }
     })
@@ -457,12 +456,9 @@ export default {
               this.startTime = new Date(res.data.startTime).getTime()
               this.processInterval = setInterval(this.updateLiveProgress, 1000);
             } else {
-              console.log("getinfo")
               this.liveType = 2
               this.videoUrl = res.data.videoUrl;
               this.$nextTick(() => {
-                const video = this.$refs.videoPlayer;
-                video.play()
                 this.initVideoPlayer(res.data.startTime)
               })
             }
@@ -477,9 +473,18 @@ export default {
     },
     initVideoPlayer: function (startTime) {
       const video = this.$refs.videoPlayer;
-      console.log(123)
-
 
+      this.hls = new Hls();
+      this.hls.attachMedia(video);
+      this.hls.on(Hls.Events.MEDIA_ATTACHED, () => {
+        this.hls.loadSource(this.videoUrl);
+        this.hls.on(Hls.Events.STREAM_LOADED, (event, data) => {
+          video.play();
+        });
+      });
+      this.hls.on(Hls.Events.ERROR, (event, data) => {
+        console.error('HLS 错误:', data);
+      });
       // 1. 初始化开播时间
       startTime = new Date(startTime).getTime();
       this.startTime = startTime;