Bläddra i källkod

ficc小程序管理-中文视频

jwyu 1 år sedan
förälder
incheckning
bc3619f654

+ 1 - 0
package.json

@@ -16,6 +16,7 @@
     "crypto-js": "^4.2.0",
     "element-plus": "2.4.4",
     "jquery": "^3.7.1",
+    "js-md5": "^0.8.3",
     "pinia": "^2.1.7",
     "vue": "^3.4.19",
     "vue-router": "^4.3.0",

+ 7 - 0
pnpm-lock.yaml

@@ -16,6 +16,9 @@ dependencies:
   jquery:
     specifier: ^3.7.1
     version: 3.7.1
+  js-md5:
+    specifier: ^0.8.3
+    version: 0.8.3
   pinia:
     specifier: ^2.1.7
     version: 2.1.7(vue@3.4.20)
@@ -948,6 +951,10 @@ packages:
     resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==}
     dev: false
 
+  /js-md5@0.8.3:
+    resolution: {integrity: sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ==}
+    dev: false
+
   /js-tokens@4.0.0:
     resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
     dev: true

+ 11 - 11
src/router/modules/approvalRoutes.js

@@ -28,17 +28,17 @@ export default [
 					keepAlive: false
 				}
 			},
-			// {
-			// 	path: 'contractdetaildcapr',
-			// 	component: () => import('@/views/contract_manage/contractDetailDC.vue'),
-			// 	name: "代付合同详情",
-			// 	hidden: false,
-			// 	meta: {
-			// 		pathFrom: 'contractapprovallist',
-			// 		pathName: '合同审批',
-			// 		keepAlive: false
-			// 	}
-			// },
+			{
+				path: 'contractdetaildcapr',
+				component: () => import('@/views/contract_manage/contractDetailDC.vue'),
+				name: "代付合同详情",
+				hidden: false,
+				meta: {
+					pathFrom: 'contractapprovallist',
+					pathName: '合同审批',
+					keepAlive: false
+				}
+			},
 			{
 				path: 'approvalList',
 				component: () => import('@/views/custom_manage/approvalList.vue'),

+ 102 - 0
src/router/modules/ficcXcxRoutes.js

@@ -0,0 +1,102 @@
+
+import Home from '@/layouts/index.vue'
+
+export default [
+    {
+		path: '/',
+		component: Home,
+		name: 'ficc小程序管理',
+		hidden: false,
+        children:[
+            {	
+				path:"videoManage",
+				name:"中文视频",
+				component:()=>import('@/views/interaction_manage/videoManage.vue')
+			},
+            // {	
+			// 	path:"videoManageEN",
+			// 	name:"英文视频",
+			// 	component:()=>import('@/views/interaction_manage/videoManageEN.vue')
+			// },
+            // {	
+			// 	path:"videoManageENAdd",
+			// 	name:"添加视频",
+			// 	component:()=>import('@/views/interaction_manage/videoManageENAdd.vue'),
+			// 	meta: {
+			// 		pathFrom:'videoManageEN',
+			// 		pathName:'英文视频',
+			// 		keepAlive: false
+			// 	}
+			// },
+            // {	
+			// 	path:"videoManageENEdit",
+			// 	name:"编辑视频",
+			// 	component:()=>import('@/views/interaction_manage/videoManageENAdd.vue')
+			// },
+            // {
+			// 	path: 'reportupdate',
+			// 	component: () => import('@/views/report_manage/dayWeekUpdate.vue'),
+			// 	name: '报告更新管理',
+			// 	hidden: true,
+			// 	meta: {
+			// 		keepAlive: false
+			// 	}
+			// },
+            // {
+			// 	path:"questionManage",
+			// 	name:"问答社区",
+			// 	component:()=>import('@/views/interaction_manage/questionManage.vue')
+			// },
+            // {
+			// 	path: "messageboard",
+			// 	name: "留言板",
+			// 	component: () => import('@/views/interactive_manage/messageboard.vue')
+			// },
+			// {
+			// 	path: "/ybComment",
+			// 	name: "留言管理",
+			// 	component: () => import('@/views/interactive_manage/messageManage.vue')
+			// },
+			// {
+			// 	path: "/likelist",
+			// 	name: "点赞",
+			// 	component: () => import('@/views/interactive_manage/likelist.vue')
+			// },
+            // {
+			// 	path:"questionComment",
+			// 	name:"问答评论",
+			// 	component:()=>import('@/views/interactive_manage/questionComment.vue')
+			// },
+            // {
+			// 	path:"bulletChatList",
+			// 	name:"弹幕管理",
+			// 	component:()=>import('@/views/interactive_manage/bulletChatList.vue')
+			// },
+            // {
+			// 	path:'voicePlayStatistics',
+			// 	component: () => import('@/views/dataReport_manage/voicePlayList.vue'),
+			// 	name: '语音播报统计',
+			// 	hidden: false
+			// },
+            // {
+			// 	path:'reportlabel',
+			// 	component:()=> import('@/views/report_manage/tagLib.vue'),
+			// 	name:'标签库',
+			// 	hidden:true
+			// },
+			// {
+			// 	path:'sendlog',
+			// 	component:()=> import('@/views/report_manage/reportEn/sendMsgLog.vue'),
+			// 	name:'群发日志',
+			// 	hidden:true
+			// },
+			// {
+			// 	path:'bannerStatistics',
+			// 	component:()=> import('@/views/interaction_manage/bannerStatistics.vue'),
+			// 	name:'banner 统计',
+			// 	hidden:true
+			// },
+
+        ]
+    }
+]

+ 7 - 0
src/views/contract_manage/contractDetailDC.vue

@@ -0,0 +1,7 @@
+<script setup>
+
+</script>
+
+<template>
+    <div></div>
+</template>

+ 162 - 0
src/views/interaction_manage/components/connectiveReportDialog.vue

@@ -0,0 +1,162 @@
+<script setup>
+import { Search } from "@element-plus/icons-vue";
+import { reactive, watch } from "vue"
+import { videoInterface } from '@/api/api.js'
+import { ElMessage } from "element-plus";
+
+
+const props = defineProps({
+  isShow: {
+    type: Boolean,
+    default: false
+  }
+})
+const emits = defineEmits(['cancel', 'reportChange'])
+
+const pageState = reactive({
+  ReportId: '',
+  searchTitle: '',
+  searchType: '',
+  reportTypeList: [],
+  reportList: []
+})
+
+watch(
+  () => props.isShow,
+  (val) => {
+    if (val) {
+      pageState.ReportId = ''
+      pageState.searchTitle = ''
+      pageState.searchType = ''
+      getTableData()
+      getClassify()
+    }
+  }
+)
+
+function cancelHandle() {
+  emits('cancel')
+}
+
+function getTableData() {
+  videoInterface.getReportList({
+    ClassifyIdSecond: pageState.searchType[pageState.searchType.length - 1],
+    Keyword: pageState.searchTitle
+  }).then(res => {
+    if (res.Ret !== 200) return
+    pageState.reportList = res.Data
+  })
+}
+
+function getClassify() {
+  videoInterface.getReportType().then(res => {
+    if (res.Ret !== 200) return
+    pageState.reportTypeList = res.Data || []
+  })
+}
+function handleChange() {
+  getTableData()
+}
+
+function handleInput() { getTableData() }
+function saveHandle() {
+  //检查该报告是否已关联视频
+  const item = pageState.reportList.find(i => i.ReportId == pageState.ReportId)
+  if (item.BindVideo) {
+    ElMessage.error(`该报告已关联${item.BindVideoTitle},请重新选择`)
+    return
+  }
+  emits('reportChange', item)
+}
+
+</script>
+
+<template>
+  <el-dialog
+    :model-value="props.isShow"
+    :close-on-click-modal="false"
+    :modal-append-to-body="false"
+    title="关联报告"
+    @close="cancelHandle"
+    custom-class="connetive-report-dialog"
+    center
+    width="896px"
+  >
+    <div class="dialog-container">
+      <div class="search-box">
+        <!-- <el-select placeholder="请选择报告类型" v-model="searchType" clearable  @change="handleChange">
+            <el-option v-for="item in reportTypeList" :key="item.Id"
+              :value="item.Id" :label="item.ClassifyName"
+            ></el-option>
+          </el-select> -->
+        <el-cascader
+          placeholder="请选择报告类型"
+          v-model="pageState.searchType"
+          :options="pageState.reportTypeList"
+          :props="{
+            expandTrigger: 'hover',
+            children: 'Child',
+            label: 'ClassifyName',
+            value: 'Id',
+          }"
+          @change="handleChange"
+        ></el-cascader>
+        <el-input
+          placeholder="标题关键字搜索"
+          :prefix-icon="Search"
+          v-model="pageState.searchTitle"
+          @input="handleInput"
+        />
+      </div>
+      <div class="table-box">
+        <el-table :data="pageState.reportList" border style="margin-top: 20px">
+          <el-table-column align="center" label="报告标题">
+            <template #default="{ row }">
+              <div style="text-align: left">
+                <el-radio v-model="pageState.ReportId" :label="row.ReportId">
+                  <span style="white-space: normal">{{ row.Title }}</span>
+                </el-radio>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" label="发布时间">
+            <template #default="scope">
+              {{ scope.row.PublishTime }}
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+    </div>
+    <template #footer>
+      <div class="foot-container">
+        <el-button type="primary" @click="saveHandle">保 存</el-button>
+        <el-button @click="cancelHandle">取 消</el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<style lang="scss">
+.connetive-report-dialog {
+  .dialog-container {
+    .search-box {
+      .el-cascader .el-input {
+        width: 100%;
+      }
+    }
+  }
+}
+</style>
+<style lang="scss" scoped>
+.connetive-report-dialog {
+  .dialog-container {
+    .search-box {
+      display: flex;
+      justify-content: space-between;
+      .el-input {
+        width: 400px;
+      }
+    }
+  }
+}
+</style>

+ 1368 - 0
src/views/interaction_manage/videoManage.vue

@@ -0,0 +1,1368 @@
+<script setup>
+import { Search } from "@element-plus/icons-vue";
+import MD5 from 'js-md5'
+import { getOSSSign } from '@/api/api.js'
+import { customInterence, videoInterface, departInterence } from '@/api/api.js'
+import { nextTick, reactive, ref } from "vue";
+import { ElMessage, ElMessageBox } from "element-plus";
+import connectiveReportDialog from './components/connectiveReportDialog.vue'
+
+
+function formatDuration(e) {
+  let tem = parseInt(e)
+  let min = parseInt(tem / 60)
+  let sen = parseInt(tem % 60)
+  if (min > 0) {
+    return `${min}分${sen}秒`
+  } else {
+    return `${sen}秒`
+  }
+}
+
+const form = ref(null)
+const pageState = reactive({
+  keyword: '',
+  list: [],
+  page: 1,
+  pageSize: 15,
+  total: 0,
+  options: [],
+  perList: [],
+  SortParam: '',
+  SortType: '',
+
+  navType: 3,//1视频库 2视频封面库 3线上路演
+  showImgPop: false,
+  imgList: [],
+  imgType: '',
+  imgPopData: {
+    type: '添加封面',
+    coverId: 0,
+    imgUrl: '',
+    name: '',
+    videoType: ''
+  },
+
+  showPop: false,
+  popData: {
+    type: '添加视频',
+    VideoId: 0,
+    title: '',
+    tag: '',
+    videoUrl: '',
+    VideoSeconds: 0,//时长
+    imgUrl: '',
+    permission: '',
+    reportUrl: ''
+  },
+
+  rules: {
+    title: [{ required: true, message: '请输入标题', trigger: 'blur' }],
+    tag: [{ required: true, message: '请选择标签', trigger: 'change' }],
+    videoUrl: [{ required: true, message: '请上传视频', trigger: 'change' }],
+    imgUrl: [{ required: true, message: '请上传视频封面', trigger: 'change' }],
+    permission: [{ required: true, message: '请选择品种', trigger: 'change' }]
+  },
+  imgrules: {
+    name: [{ required: true, message: '请输入封面名称', trigger: 'blur' }],
+    imgUrl: [{ required: true, message: '请上传视频封面', trigger: 'change' }],
+    videoType: [{ required: true, message: '请选择类型', trigger: 'change' }]
+  },
+  percentage: 0,
+  startUpload: false,//开始上传
+
+  showClick: false,
+  logVideoId: 0,
+  logVideoName: '',
+  logPage: 1,
+  logPageSize: 10,
+  logTotal: 0,
+  logList: [],
+  logCount: 0,
+  logSortType: '',
+
+  chooseImgPop: false,
+  imgPopPage: 1,
+  imgPopPagesize: 20,
+  imgPopTotal: 0,
+  popImgList: [],
+  popImgType: 1,
+  // ---------------预览视频弹窗
+  previewPop: false,
+  previewPopTitle: "",
+  previewVideoUrl: "",
+
+  isShowReportDialog: false,//关联报告弹窗
+  reportId: 0
+})
+
+
+function initPage() {
+  getVideoList()
+  getTagList()
+  getPermissionList()
+}
+initPage()
+
+function handleNavChange(type) {
+  pageState.page = 1
+  pageState.total = 0
+  pageState.navType = type
+  pageState.keyword = ''
+  if (type == 2) {
+    handleGetVideoCoverImgList()
+  } else {
+    getVideoList()
+  }
+
+}
+
+function searchHandle() {
+  pageState.page = 1
+  getVideoList()
+}
+
+function handlePageChange(page) {
+  pageState.page = page
+  if (pageState.navType !== 2) {
+    getVideoList()
+  } else {
+    handleGetVideoCoverImgList()
+  }
+
+}
+
+
+async function getVideoList() {
+  const params = {
+    Keywords: pageState.keyword,
+    PageSize: pageState.pageSize,
+    CurrentIndex: pageState.page,
+    SortParam: pageState.SortParam,
+    SortType: pageState.SortType
+  }
+  const res = pageState.navType === 1 ? await videoInterface.videoList(params) : await videoInterface.roadVideoList(params)
+  if (res.Ret === 200) {
+    pageState.total = res.Data.Paging.Totals
+    pageState.list = res.Data.List || []
+  }
+}
+
+//获取标签数据
+async function getTagList() {
+  /* const res=await customInterence.authList({CompanyType:'ficc'})
+  if(res.Ret===200){
+      let arr=res.Data.List||[]
+      this.options=arr.map(item => {
+          let obj={}
+          obj.value=item.ClassifyName
+          obj.label=item.ClassifyName
+          obj.children=item.Items.map(_item=>{
+              return {value:_item.ChartPermissionId,label:_item.PermissionName}
+          })
+          return obj
+      }).filter(item=>item.value!='市场策略');
+  } */
+  //接口更换
+  const res = await departInterence.getTagTree()
+  if (res.Ret === 200) {
+    let arr = res.Data || []
+    pageState.options = arr.map(item => {
+      let obj = {}
+      obj.value = item.classify_name
+      obj.label = item.classify_name
+      obj.children = item.tags.map(_item => {
+        return { value: _item.tag_id, label: _item.tag_name }
+      })
+      return obj
+    })
+  }
+}
+
+//获取品种权限数据
+async function getPermissionList() {
+  const res = await videoInterface.getPermissionList()
+  if (res.Ret === 200) {
+    const arr = res.Data.List || []
+    pageState.perList = arr.map(item => {
+      let obj = {}
+      obj.value = item.ClassifyName
+      obj.label = item.ClassifyName
+      obj.children = item.List.map(_item => {
+        return { value: _item.ChartPermissionID, label: _item.ChartPermissionName }
+      })
+      return obj
+    })
+  }
+}
+
+//新增\编辑视频
+function handleShowPop(item) {
+  console.log(item);
+  pageState.popData.title = ''
+  pageState.popData.tag = ''
+  pageState.popData.videoUrl = ''
+  pageState.popData.imgUrl = ''
+  pageState.popData.VideoSeconds = 0
+  pageState.popData.VideoId = 0
+  pageState.popData.permission = ''
+  pageState.popData.reportUrl = ''
+  if (!item) {
+    pageState.popData.type = '添加视频'
+  } else {
+    pageState.popData.type = '编辑视频'
+    pageState.popData.title = item.Title
+    pageState.popData.tag = item.VarietyTagId
+    pageState.popData.videoUrl = item.VideoUrl
+    pageState.popData.imgUrl = item.CoverImgUrl
+    pageState.popData.VideoSeconds = item.VideoSeconds
+    pageState.popData.VideoId = item.CommunityVideoId
+    if (pageState.navType === 3) {
+      pageState.popData.permission = item.ChartPermissionIds.split(',')
+      pageState.popData.VideoId = item.RoadVideoId
+      item.ReportId && setReportUrl({ ReportId: item.ReportId, Title: item.ReportTitle })
+    }
+  }
+  pageState.showPop = true
+
+  nextTick(() => {
+    form.value.clearValidate();
+  })
+
+}
+//获取视频时长的promise
+function handleGetDuration(file) {
+  return new Promise((resolve, reject) => {
+    const fileUrl = URL.createObjectURL(file)
+    const audioEl = new Audio(fileUrl)
+    audioEl.addEventListener('loadedmetadata', (e) => {
+      console.log('e.path', e.path)
+      console.log('e.composedPath', e.composedPath())
+      console.log('获取视频时长', e.composedPath()[0].duration);
+      console.log(audioEl.duration);
+      const t = e.composedPath()[0].duration
+      resolve(t)
+    })
+  })
+}
+
+//上传视频判断格式
+function handelBeforeUploadVideo(e) {
+  if (e.type != 'video/mp4') {
+    ElMessage.warning('上传失败,上传视频格式不正确')
+    return false
+  }
+}
+
+// 上传视频
+async function handleUpload(e) {
+  const duration = await handleGetDuration(e.file)
+  if (duration > 600 && pageState.navType === 1) {
+    ElMessage.warning('视频时长不得超过10分钟')
+    return
+  }
+  console.log(e);
+  pageState.popData.VideoSeconds = duration
+  const res = await getOSSSign()
+  if (res.Ret === 200) {
+    let accessKeyId = res.Data.AccessKeyId
+    let accessKeySecret = res.Data.AccessKeySecret
+    let stsToken = res.Data.SecurityToken
+    handleUploadToOSS(e.file, accessKeyId, accessKeySecret, stsToken)
+  }
+
+}
+
+//上传到阿里云
+let ALOSSINS = null //阿里云上传实例
+let ALOSSAbortCheckpoint = null //阿里云上传实例中断点
+async function handleUploadToOSS(file, accessKeyId, accessKeySecret, stsToken) {
+  pageState.startUpload = true
+  ALOSSINS = new OSS({
+    // yourRegion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
+    region: "oss-cn-shanghai",
+    // 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
+    accessKeyId: accessKeyId,
+    accessKeySecret: accessKeySecret,
+    // 从STS服务获取的安全令牌(SecurityToken)。
+    stsToken: stsToken,
+    // 填写Bucket名称,例如examplebucket。
+    bucket: "hzchart",
+    endpoint: 'hzstatic.hzinsights.com',
+    cname: true,
+    timeout: 600000000000
+  });
+  // 生成文件名
+  const t = new Date().getTime().toString()
+  const temName = `static/yb/video/${MD5(t)}.${file.type.split('/')[1]}`
+  console.log(temName);
+
+  const options = {
+    // 获取分片上传进度、断点和返回值。
+    progress: (p, cpt, res) => {
+      console.log(p);
+      ALOSSAbortCheckpoint = cpt
+      pageState.percentage = parseInt(p * 100)
+    },
+    // 设置并发上传的分片数量。
+    parallel: 10,
+    // 设置分片大小。默认值为1 MB,最小值为100 KB。
+    partSize: 1024 * 1024 * 10, // 10MB
+  };
+  try {
+    const res = await ALOSSINS.multipartUpload(temName, file, { ...options })
+    console.log('上传结果', res);
+    if (res.res.status === 200) {
+      pageState.popData.videoUrl = 'https://hzstatic.hzinsights.com/' + res.name
+      pageState.startUpload = false
+      pageState.percentage = 0
+      ALOSSAbortCheckpoint = null
+    }
+  } catch (error) {
+    console.log('上传到阿里云失败', error);
+    if (error.name !== "cancel") {//不是取消上传的则给错误提示
+      ElMessage.warning('上传失败,请刷新重试')
+    }
+    pageState.startUpload = false
+    pageState.percentage = 0
+    ALOSSAbortCheckpoint = null
+  }
+}
+
+//上传封面
+async function handleUploadImg(e) {
+  console.log(e);
+  let form = new FormData()
+  form.append("file", e.file)
+  const res = await customInterence.upload(form)
+  if (res.Ret === 200) {
+    pageState.imgPopData.imgUrl = res.Data.ResourceUrl
+  }
+}
+
+// 保存
+function handleSave(type) {
+  form.value.validate(async (valid) => {
+    if (valid) {
+      let params = {
+        VideoId: pageState.popData.VideoId,
+        Title: pageState.popData.title,
+        CoverImgUrl: pageState.popData.imgUrl,
+        VideoUrl: pageState.popData.videoUrl,
+        VideoSeconds: pageState.popData.VideoSeconds.toString(),
+        ReportId: pageState.reportId
+      }
+      let res = null
+      if (pageState.navType === 1) {
+        params.VarietyTagId = Number(pageState.popData.tag),
+          res = await videoInterface.saveVideo(params)
+      } else if (pageState.navType === 3) {
+        params.ChartPermissionIds = pageState.popData.permission.join(',')
+        res = await videoInterface.roadSaveVideo(params)
+      }
+      if (res.Ret === 200) {
+        if (type === 'publish') {
+          handlePublished({ VideoId: pageState.navType === 1 ? res.Data.CommunityVideoId : res.Data.RoadVideoId, PublishState: 1 })
+        } else {
+          ElMessage.success('保存成功')
+          getVideoList()
+        }
+        pageState.showPop = false
+      }
+    }
+  })
+}
+
+//发布\取消发布
+async function handlePublished({ VideoId, PublishState }) {
+  let res = pageState.navType === 1 ? await videoInterface.published({ VideoId, PublishState }) : await videoInterface.roadPublished({ VideoId, PublishState })
+  if (res.Ret === 200) {
+    if (PublishState == 1) {
+      ElMessage.success('发布成功')
+    } else {
+      ElMessage.success('取消发布成功')
+    }
+    getVideoList()
+  }
+}
+
+// 删除
+async function handelDel(item) {
+  const res = pageState.navType === 1 ? await videoInterface.delVideo({ VideoId: item.CommunityVideoId }) : await videoInterface.roadDelVideo({ VideoId: item.RoadVideoId })
+  if (res.Ret === 200) {
+    ElMessage.success('删除成功')
+    getVideoList()
+  }
+}
+
+//推送客群
+async function handleSendMsg(item) {
+  const res = pageState.navType === 1 ? await videoInterface.sendMsg({ VideoId: item.CommunityVideoId }) : await videoInterface.roadSendMsg({ VideoId: item.RoadVideoId })
+  if (res.Ret === 200) {
+    ElMessage.success('推送成功')
+    getVideoList()
+  }
+}
+
+//推送模版消息
+async function handleSendTempMsg(item) {
+  const res = pageState.navType === 1 ? await videoInterface.sendTempMsg({ VideoId: item.CommunityVideoId }) : await videoInterface.roadSendTempMsg({ VideoId: item.RoadVideoId })
+  if (res.Ret === 200) {
+    ElMessage.success('推送成功')
+    getVideoList()
+  }
+}
+
+//推送消息
+async function handleMsgPush(item) {
+  const res = pageState.navType === 1 ? await videoInterface.msgPush({ VideoId: item.CommunityVideoId }) : await videoInterface.roadMsgPush({ VideoId: item.RoadVideoId })
+  if (res.Ret === 200) {
+    ElMessage.success('推送成功')
+    getVideoList()
+  }
+}
+
+function handleOpt(item, type) {
+  if (type === '发布') {
+    handlePublished({ VideoId: pageState.navType === 1 ? item.CommunityVideoId : item.RoadVideoId, PublishState: 1 })
+    return
+  }
+
+  if (type === '编辑') {
+    handleShowPop(item)
+    return
+  }
+
+  if (type === '删除') {
+    ElMessageBox.confirm('此操作将永久删除该文件, 是否继续?', '提示', {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning'
+    }).then(() => {
+      handelDel(item)
+    }).catch(() => {
+
+    });
+    return
+  }
+
+  if (type === '取消发布') {
+    handlePublished({ VideoId: pageState.navType === 1 ? item.CommunityVideoId : item.RoadVideoId, PublishState: 0 })
+    return
+  }
+
+  if (type === '推送客群') {
+    handleSendMsg(item)
+    return
+  }
+
+  if (type === '推送模版消息') {
+    handleSendTempMsg(item)
+    return
+  }
+
+  if (type === '推送消息') {
+    handleMsgPush(item)
+  }
+
+}
+
+function sortChangeHandle({ prop, order }) {
+  console.log(prop, order)
+  pageState.SortType = order === 'ascending' ? 'asc' : order === 'descending' ? 'desc' : ''
+  if (pageState.SortType.length) {
+    pageState.SortParam = prop
+  } else {
+    pageState.SortParam = ''
+  }
+  getVideoList()
+}
+
+const clickNumberRef = ref(null)
+function handleShowClickNum(item) {
+  pageState.logVideoId = pageState.navType === 1 ? item.CommunityVideoId : item.RoadVideoId
+  pageState.logVideoName = item.Title
+  pageState.showClick = true
+  pageState.logPage = 1
+  pageState.logList = []
+  pageState.logTotal = 0
+  pageState.logSortType = ''
+  clickNumberRef.value?.clearSort()
+  getVideoLogslist()
+}
+
+// 获取点击量详情
+async function getVideoLogslist() {
+  const params = {
+    CurrentIndex: pageState.logPage,
+    PageSize: pageState.logPageSize,
+    VideoId: Number(pageState.logVideoId),
+    SortType: pageState.logSortType
+  }
+  const res = pageState.navType === 1 ? await videoInterface.videoLogList(params) : await videoInterface.roadVideoLogList(params)
+  if (res.Ret === 200) {
+    pageState.logTotal = res.Data.Paging.Totals
+    pageState.logCount = res.Data.Count
+    pageState.logList = res.Data.List || []
+  }
+}
+
+// 点击量详情 - 表格排序
+function detailSortChange({ order }) {
+  pageState.logSortType = order === 'ascending' ? '2' : order === 'descending' ? '1' : ''
+  getVideoLogslist()
+}
+
+function handleLogPageChange(e) {
+  pageState.logPage = e
+  getVideoLogslist()
+}
+
+//视频封面类型筛选
+function imgTypeChange() {
+  pageState.page = 1
+  pageState.imgList = []
+  handleGetVideoCoverImgList()
+}
+
+//获取视频封面列表
+async function handleGetVideoCoverImgList() {
+  const res = await videoInterface.videoCoverImgList({
+    PageSize: pageState.pageSize,
+    CurrentIndex: pageState.page,
+    Type: pageState.imgType ? pageState.imgType : 0
+  })
+  if (res.Ret === 200) {
+    pageState.total = res.Data.Paging.Totals
+    pageState.imgList = res.Data.List || []
+  }
+}
+
+//显示添加视频封面弹窗
+const imgform = ref(null)
+function handleShowImgPop(item) {
+  pageState.imgPopData.name = ''
+  pageState.imgPopData.imgUrl = ''
+  pageState.imgPopData.coverId = 0
+  if (!item) {
+    pageState.imgPopData.type = '添加封面'
+  } else {
+    pageState.imgPopData.type = '编辑封面'
+    pageState.imgPopData.name = item.CoverName
+    pageState.imgPopData.imgUrl = item.CoverUrl
+    pageState.imgPopData.coverId = item.CommunityVideoCoverId
+    pageState.imgPopData.videoType = item.Type.toString()
+  }
+  pageState.showImgPop = true
+  nextTick(() => {
+    imgform.value?.clearValidate();
+  })
+}
+
+//保存视频封面
+function handleSaveImg() {
+  imgform.value?.validate((valid) => {
+    if (valid) {
+      let params = {
+        CoverId: Number(pageState.imgPopData.coverId),
+        CoverName: pageState.imgPopData.name,
+        CoverUrl: pageState.imgPopData.imgUrl,
+        Type: Number(pageState.imgPopData.videoType)
+      }
+      videoInterface.videoCoverImgSave(params).then(res => {
+        if (res.Ret == 200) {
+          handleGetVideoCoverImgList()
+          if (pageState.imgPopData.type == '添加封面') {
+            ElMessage.success('添加成功')
+          } else {
+            ElMessage.success('编辑成功')
+          }
+          pageState.showImgPop = false
+        }
+      })
+    }
+  })
+}
+
+//删除视频封面
+function handleDelVideoCoverImg(item) {
+  ElMessageBox.confirm('此操作将永久删除该文件, 是否继续?', '提示', {
+    confirmButtonText: '确定',
+    cancelButtonText: '取消',
+    type: 'warning'
+  }).then(() => {
+    videoInterface.videoCoverImgDel({
+      CoverId: Number(item.CommunityVideoCoverId)
+    }).then(res => {
+      if (res.Ret === 200) {
+        ElMessage.success('删除成功')
+        handleGetVideoCoverImgList()
+      }
+    })
+  }).catch(() => {
+
+  });
+}
+
+//显示选择视频封面列表
+function handleshowChooseImgPop(type) {
+  pageState.imgPopPage = 1
+  pageState.popImgType = type
+  handleGetPopImgList()
+  pageState.chooseImgPop = true
+}
+
+//弹窗中选择视频封面的列表数据
+async function handleGetPopImgList() {
+  const res = await videoInterface.videoCoverImgList({
+    PageSize: pageState.imgPopPagesize,
+    CurrentIndex: pageState.imgPopPage,
+    Type: pageState.popImgType
+  })
+  if (res.Ret === 200) {
+    pageState.imgPopTotal = res.Data.Paging.Totals
+    pageState.popImgList = res.Data.List || []
+  }
+}
+
+function handleChooseImg(item) {
+  pageState.popData.imgUrl = item.CoverUrl
+  pageState.chooseImgPop = false
+}
+
+function handleimgPopPageChange(e) {
+  pageState.imgPopPage = e
+  handleGetPopImgList()
+}
+
+// 预览视频
+const previewVideo = ref(null)
+function handlePreviewVideo({ Title, VideoUrl }) {
+  previewVideo.value?.play()
+  pageState.previewPopTitle = Title
+  pageState.previewVideoUrl = VideoUrl
+  pageState.previewPop = true
+}
+// 结束预览弹窗关闭回调 -- 暂停视频
+function endingPreview() {
+  previewVideo.value?.pause()
+}
+//打开关联报告弹窗
+function showReportDialog() {
+  pageState.isShowReportDialog = true
+}
+//设置关联报告链接
+function setReportUrl(item) {
+  pageState.reportId = item.ReportId
+  pageState.popData.reportUrl = item.Title
+  pageState.isShowReportDialog = false
+}
+
+
+
+</script>
+
+<template>
+  <div class="video-manage-page">
+    <div class="top-wrap">
+      <el-button
+        type="primary"
+        @click="handleShowPop('')"
+        v-if="pageState.navType !== 2"
+        >添加视频</el-button
+      >
+      <div v-if="pageState.navType == 2">
+        <el-button type="primary" @click="handleShowImgPop('')"
+          >添加视频封面</el-button
+        >
+        <el-select
+          v-model="pageState.imgType"
+          placeholder="请选择"
+          clearable
+          @change="imgTypeChange"
+          style="margin-left:10px"
+        >
+          <el-option label="线上路演" value="2"></el-option>
+          <el-option label="5分钟小视频" value="1"></el-option>
+        </el-select>
+      </div>
+      <el-input
+        placeholder="关键词搜索"
+        v-model="pageState.keyword"
+        style="max-width: 520px"
+        @input="searchHandle"
+        clearable
+        :prefix-icon="Search"
+        v-if="pageState.navType !== 2"
+      >
+      </el-input>
+    </div>
+    <div class="list-wrap">
+      <div class="nav-box">
+        <span
+          :class="pageState.navType == 3 ? 'active' : ''"
+          @click="handleNavChange(3)"
+          >线上路演</span
+        >
+        <span
+          :class="pageState.navType == 1 ? 'active' : ''"
+          @click="handleNavChange(1)"
+          >5分钟小视频</span
+        >
+        <span
+          :class="pageState.navType == 2 ? 'active' : ''"
+          @click="handleNavChange(2)"
+          >视频封面库</span
+        >
+      </div>
+      <el-table
+        :data="pageState.list"
+        border
+        style="width: 100%"
+        @sort-change="sortChangeHandle"
+        v-if="pageState.navType !== 2"
+      >
+        <el-table-column prop="Title" label="视频标题" align="center">
+          <template #default="{ row }">
+            <span
+              style="cursor: pointer; color: #409eff"
+              @click="handlePreviewVideo(row)"
+              >{{ row.Title }}</span
+            >
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="VarietyTagName"
+          label="标签"
+          align="center"
+          v-if="pageState.navType == 1"
+        >
+        </el-table-column>
+        <el-table-column
+          prop="ChartPermissionNames"
+          label="品种"
+          align="center"
+          v-if="pageState.navType == 3"
+        >
+        </el-table-column>
+        <el-table-column
+          prop="AdminRealName"
+          label="创建人"
+          align="center"
+          v-if="pageState.navType == 3"
+        >
+        </el-table-column>
+        <el-table-column prop="ModifyTime" label="更新时间" align="center">
+        </el-table-column>
+        <el-table-column prop="VideoSeconds" label="时长" align="center">
+          <template #default="{ row }">
+            <span>{{ formatDuration(row.VideoSeconds) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="PublishState" label="状态" align="center">
+          <template #default="{ row }">
+            <span :style="{ color: row.PublishState == 1 ? '#1dd411' : '' }">{{
+              row.PublishState == 1 ? "已发布" : "未发布"
+            }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="ClickNum"
+          label="点击量"
+          sortable="custom"
+          align="center"
+        >
+          <template #default="{ row }">
+            <span
+              :style="{
+                color: row.ClickNum ? '#409eff' : '',
+                cursor: 'pointer',
+              }"
+              @click="handleShowClickNum(row)"
+              >{{ row.ClickNum || "--" }}</span
+            >
+          </template>
+        </el-table-column>
+        <el-table-column prop="opt" label="操作" align="center">
+          <template #default="{ row }">
+            <div v-if="row.PublishState == 0">
+              <span
+                style="
+                  cursor: pointer;
+                  color: #409eff;
+                  margin: 0 5px;
+                  display: inline-block;
+                "
+                @click="handleOpt(row, '发布')"
+                >发布</span
+              >
+              <span
+                style="
+                  cursor: pointer;
+                  color: #409eff;
+                  margin: 0 5px;
+                  display: inline-block;
+                "
+                @click="handleOpt(row, '编辑')"
+                >编辑</span
+              >
+              <span
+                style="
+                  cursor: pointer;
+                  color: #ff0000;
+                  margin: 0 5px;
+                  display: inline-block;
+                "
+                @click="handleOpt(row, '删除')"
+                >删除</span
+              >
+            </div>
+            <div v-else>
+              <span
+                style="
+                  cursor: pointer;
+                  color: #ff0000;
+                  margin: 0 5px;
+                  display: inline-block;
+                "
+                @click="handleOpt(row, '取消发布')"
+                >取消发布</span
+              >
+              <span
+                v-if="row.SendThsState == 1 && row.SendTemplateState == 1"
+                style="
+                  cursor: pointer;
+                  color: #1dd411;
+                  margin: 0 5px;
+                  display: inline-block;
+                "
+                >已推送消息</span
+              >
+              <span
+                v-else
+                style="
+                  cursor: pointer;
+                  color: #409eff;
+                  margin: 0 5px;
+                  display: inline-block;
+                "
+                @click="handleOpt(row, '推送消息')"
+                >推送消息</span
+              >
+
+              <!-- <span v-if="row.SendThsState==1" style="cursor: pointer;color:#1dd411;margin:0 5px;display: inline-block;">已推送客群</span>
+                            <span v-else style="cursor: pointer;color:#409eff;margin:0 5px;display: inline-block;" @click="handleOpt(row,'推送客群')">推送客群</span>
+
+                            <span v-if="row.SendTemplateState==1" style="cursor: pointer;color:#1dd411;margin:0 5px;display: inline-block;">已推送模版消息</span>
+                            <span v-else style="cursor: pointer;color:#409eff;margin:0 5px;display: inline-block;" @click="handleOpt(row,'推送模版消息')">推送模版消息</span> -->
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-table
+        :data="pageState.imgList"
+        border
+        style="width: 100%"
+        v-if="pageState.navType == 2"
+      >
+        <el-table-column prop="CoverUrl" label="封面图" align="center">
+          <template #default="{ row }">
+            <el-image
+              style="width: 100px; height: 100px"
+              :src="row.CoverUrl"
+              :preview-src-list="[row.CoverUrl]"
+            >
+            </el-image>
+          </template>
+        </el-table-column>
+        <el-table-column prop="CoverName" label="封面名称" align="center" />
+        <el-table-column prop="Type" label="分类" align="center">
+          <template #default="{ row }">{{
+            row.Type === 1 ? "5分钟小视频" : "线上路演"
+          }}</template>
+        </el-table-column>
+        <el-table-column prop="ModifyTime" label="更新时间" align="center" />
+        <el-table-column prop="opt" label="操作" align="center">
+          <template #default="{ row }">
+            <span
+              style="
+                cursor: pointer;
+                color: #409eff;
+                margin: 0 5px;
+                display: inline-block;
+              "
+              @click="handleShowImgPop(row)"
+              >编辑</span
+            >
+            <span
+              style="
+                cursor: pointer;
+                color: #ff0000;
+                margin: 0 5px;
+                display: inline-block;
+              "
+              @click="handleDelVideoCoverImg(row)"
+              >删除</span
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-pagination
+        layout="total,prev,pager,next"
+        background
+        :current-page="pageState.page"
+        @current-change="handlePageChange"
+        :page-size="pageState.pageSize"
+        :total="pageState.total"
+        style="float: right; margin-top: 20px"
+      >
+      </el-pagination>
+    </div>
+
+    <!-- 添加/编辑视频弹窗 -->
+    <el-dialog
+      :model-value="pageState.showPop"
+      :modal-append-to-body="false"
+      v-dialogDrag
+      width="50vw"
+    >
+      <template #header>
+        <div>{{ pageState.popData.type }}</div>
+      </template>
+
+      <div>
+        <el-form
+          ref="form"
+          :model="pageState.popData"
+          label-width="80px"
+          :rules="pageState.rules"
+        >
+          <el-form-item label="标题" prop="title">
+            <el-input
+              v-model="pageState.popData.title"
+              placeholder="请填写标题"
+            ></el-input>
+          </el-form-item>
+          <el-form-item label="标签" prop="tag" v-if="pageState.navType == 1">
+            <el-cascader
+              style="width: 100%"
+              :options="pageState.options"
+              :show-all-levels="false"
+              :props="{ emitPath: false }"
+              v-model="pageState.popData.tag"
+              placeholder="请选择标签"
+            ></el-cascader>
+          </el-form-item>
+          <el-form-item
+            label="品种"
+            prop="permission"
+            v-if="pageState.navType == 3"
+          >
+            <el-cascader
+              style="width: 100%"
+              :options="pageState.perList"
+              :show-all-levels="false"
+              :props="{ emitPath: false, multiple: true }"
+              v-model="pageState.popData.permission"
+              collapse-tags
+              placeholder="请选择品种"
+            ></el-cascader>
+          </el-form-item>
+          <el-form-item label="视频" prop="videoUrl">
+            <div style="display: flex">
+              <el-input
+                readonly
+                v-model="pageState.popData.videoUrl"
+                placeholder="请上传视频"
+              ></el-input>
+              <el-upload
+                style="display: inline-block; margin-left: 10px"
+                action=""
+                accept=".mp4"
+                :http-request="handleUpload"
+                :before-upload="handelBeforeUploadVideo"
+                :show-file-list="false"
+                :disabled="pageState.startUpload"
+              >
+                <el-button type="primary" :loading="pageState.startUpload"
+                  >上传视频</el-button
+                >
+              </el-upload>
+              <el-progress
+                type="circle"
+                :percentage="pageState.percentage"
+                width="40"
+                style="margin-left: 10px"
+                v-if="pageState.startUpload"
+              ></el-progress>
+            </div>
+            <p style="color: #999">
+              *注:要求视频格式为mp4,{{
+                pageState.navType == 1 ? "视频时长不超过10min," : ""
+              }}编码器为H.264
+            </p>
+          </el-form-item>
+          <el-form-item
+            label="关联报告"
+            prop="reportUrl"
+            v-if="pageState.navType == 3"
+          >
+            <div style="display: flex">
+              <el-input
+                readonly
+                v-model="pageState.popData.reportUrl"
+                placeholder="请选择关联报告"
+              ></el-input>
+              <el-button
+                type="primary"
+                style="margin-left: 10px"
+                @click="showReportDialog"
+                >关联报告</el-button
+              >
+            </div>
+          </el-form-item>
+          <el-form-item label="封面" prop="imgUrl">
+            <!-- <el-input readonly v-model="popData.imgUrl" placeholder="请上传视频封面"></el-input>
+                        <el-button type="primary">选择封面</el-button> -->
+            <el-image
+              style="width: 120px; height: 120px"
+              :src="require('@/assets/img/icons/add-img.png')"
+              v-if="!pageState.popData.imgUrl"
+              @click="handleshowChooseImgPop(pageState.navType == 1 ? 1 : 2)"
+            />
+            <div v-else class="pre-img-box">
+              <el-image
+                style="width: 120px; height: 120px"
+                :src="pageState.popData.imgUrl"
+                :preview-src-list="[pageState.popData.imgUrl]"
+              >
+              </el-image>
+              <span class="del" @click="pageState.popData.imgUrl = ''"
+                >删除</span
+              >
+            </div>
+          </el-form-item>
+          <!-- <p style="padding-left:38px;color:#999">*注:视频格式支持mp4{{navType==1?';视频时长不超过10min':''}}</p> -->
+          <div style="text-align: right; margin: 50px 0">
+            <el-button type="primary" @click="handleSave">保存</el-button>
+            <el-button type="primary" plain @click="handleSave('publish')"
+              >发布</el-button
+            >
+            <el-button @click="pageState.showPop = false">取消</el-button>
+          </div>
+        </el-form>
+      </div>
+    </el-dialog>
+
+    <!-- 点击量详情 -->
+    <el-dialog
+      :model-value="pageState.showClick"
+      :modal-append-to-body="false"
+      draggable
+      width="65vw"
+      title="点击量详情"
+    >
+      <div style="margin-bottom: 118px">
+        <div style="margin-bottom: 10px">{{ pageState.logVideoName }}</div>
+        <div style="margin-bottom: 10px">点击量:{{ pageState.logCount }}</div>
+        <el-table
+          :data="pageState.logList"
+          style="width: 100%; margin: 20px 0 30px"
+          ref="clickNumberRef"
+          border
+          @sort-change="detailSortChange"
+        >
+          <el-table-column prop="RealName" label="用户姓名" align="center">
+            <template #default="scope">
+              <span>{{ scope.row.RealName || "--" }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="CompanyName" label="公司名称" align="center">
+            <template #default="scope">
+              <span>{{ scope.row.CompanyName || "--" }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="CompanyStatus" label="客户状态" align="center">
+            <template #default="scope">
+              <span>{{ scope.row.CompanyStatus || "--" }}</span>
+            </template>
+          </el-table-column>
+          <!-- <el-table-column prop="ClickNum" label="点击次数" align="center"> </el-table-column> -->
+          <el-table-column prop="SourceAgent" label="点击来源" align="center">
+            <template #default="scope">
+              <span v-if="scope.row.SourceAgent == 1">小程序</span>
+              <span v-else>pc</span>
+            </template>
+          </el-table-column>
+          <el-table-column
+            prop="StopSeconds"
+            label="播放时长"
+            align="center"
+            sortable="custom"
+          >
+            <template #default="{ row }">
+              {{ formatDuration(row.StopSeconds) }}
+            </template>
+          </el-table-column>
+          <el-table-column
+            prop="CreateTime"
+            label="点击时间"
+            align="center"
+            min-width="140"
+          >
+          </el-table-column>
+        </el-table>
+        <div>
+          <el-pagination
+            layout="total,prev,pager,next"
+            background
+            :current-page="pageState.logPage"
+            @current-change="handleLogPageChange"
+            :page-size="pageState.logPageSize"
+            :total="pageState.logTotal"
+            style="float: right; margin-top: 20px"
+          >
+          </el-pagination>
+        </div>
+      </div>
+    </el-dialog>
+
+    <!-- 上传视频封面弹窗 -->
+    <el-dialog
+      :model-value="pageState.showImgPop"
+      :modal-append-to-body="false"
+      draggable
+      width="50vw"
+    >
+      <template #header>
+        <div>{{ pageState.imgPopData.type }}</div>
+      </template>
+
+      <div class="pop-wrap">
+        <el-form
+          ref="imgform"
+          :model="pageState.imgPopData"
+          label-width="80px"
+          :rules="pageState.imgrules"
+        >
+          <el-form-item label="封面名称" prop="name">
+            <el-input
+              v-model="pageState.imgPopData.name"
+              placeholder="请填写封面名称"
+            ></el-input>
+          </el-form-item>
+          <el-form-item label="分类" prop="videoType">
+            <el-select
+              v-model="pageState.imgPopData.videoType"
+              placeholder="请选择"
+              clearable
+              style="width: 60%"
+            >
+              <el-option label="线上路演" value="2"></el-option>
+              <el-option label="5分钟小视频" value="1"></el-option>
+            </el-select>
+          </el-form-item>
+
+          <el-form-item
+            label="封面图"
+            prop="imgUrl"
+            :disabled="pageState.imgPopData.coverId != 0"
+          >
+            <el-input
+              :disabled="pageState.imgPopData.coverId != 0"
+              readonly
+              v-model="pageState.imgPopData.imgUrl"
+              placeholder="请上传视频封面"
+            ></el-input>
+            <el-upload
+              style="display: inline-block"
+              action=""
+              accept="image/*"
+              :http-request="handleUploadImg"
+              :show-file-list="false"
+              :disabled="pageState.imgPopData.coverId != 0"
+            >
+              <el-button
+                type="primary"
+                :disabled="pageState.imgPopData.coverId != 0"
+                >选择封面</el-button
+              >
+            </el-upload>
+          </el-form-item>
+          <div style="text-align: center; margin: 50px 0">
+            <el-button @click="pageState.showImgPop = false">取消</el-button>
+            <el-button type="primary" @click="handleSaveImg">保存</el-button>
+          </div>
+        </el-form>
+      </div>
+    </el-dialog>
+
+    <!-- 选择视频封面弹窗 -->
+    <el-dialog
+      :model-value="pageState.chooseImgPop"
+      :modal-append-to-body="false"
+      draggable
+      width="60vw"
+      title="视频封面库"
+    >
+      <div class="choose-img-wrap">
+        <div style="margin-bottom: 20px; font-size: 16px; cursor: pointer">
+          <span
+            @click="handleshowChooseImgPop(2)"
+            :style="{
+              color: pageState.popImgType == 2 ? '#2D8CF0' : '#666666',
+            }"
+            >线上路演</span
+          >
+          |
+          <span
+            @click="handleshowChooseImgPop(1)"
+            :style="{
+              color: pageState.popImgType == 1 ? '#2D8CF0' : '#666666',
+            }"
+            >5分钟小视频</span
+          >
+        </div>
+        <div class="list">
+          <div
+            class="item"
+            v-for="item in pageState.popImgList"
+            :key="item.CommunityVideoCoverId"
+            @click="handleChooseImg(item)"
+          >
+            <el-image style="width: 120px; height: 120px" :src="item.CoverUrl">
+            </el-image>
+            <div>{{ item.CoverName }}</div>
+          </div>
+        </div>
+        <div>
+          <el-pagination
+            layout="total,prev,pager,next"
+            background
+            :current-page="pageState.imgPopPage"
+            @current-change="handleimgPopPageChange"
+            :page-size="pageState.imgPopPagesize"
+            :total="pageState.imgPopTotal"
+            style="float: right; margin-top: 20px"
+          >
+          </el-pagination>
+        </div>
+      </div>
+    </el-dialog>
+    <!-- 预览视频弹窗 -->
+    <el-dialog
+      v-model="pageState.previewPop"
+      :modal-append-to-body="false"
+      draggable
+      width="60vw"
+      :title="pageState.previewPopTitle"
+      @close="endingPreview"
+    >
+      <video
+        style="width: 100%; height: 100%; max-height: 70vh; outline: none"
+        controls
+        :src="pageState.previewVideoUrl"
+        autoplay
+        ref="previewVideo"
+      >
+        您的浏览器暂不支持,请更换浏览器
+      </video>
+    </el-dialog>
+
+    <!-- 关联报告弹窗 -->
+    <connective-report-dialog
+      :isShow="pageState.isShowReportDialog"
+      @reportChange="setReportUrl"
+      @cancel="pageState.isShowReportDialog = false"
+    />
+  </div>
+</template>
+
+
+<style lang="scss">
+.video-manage-page {
+  .list-wrap {
+    .el-image:hover {
+      border: 1px solid #409eff;
+    }
+  }
+}
+</style>
+
+<style lang="scss" scoped>
+.video-manage-page {
+  .top-wrap {
+    height: 80px;
+    border: 1px solid #dcdfe6;
+    background-color: #fff;
+    border-radius: 4px;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding: 0 30px;
+  }
+  .list-wrap {
+    border: 1px solid #dcdfe6;
+    background-color: #fff;
+    border-radius: 4px;
+    margin-top: 30px;
+    padding: 30px;
+    padding-bottom: 80px;
+    .nav-box {
+      margin-bottom: 30px;
+      span {
+        padding-bottom: 5px;
+        font-size: 16px;
+        display: inline-block;
+        margin-right: 30px;
+        cursor: pointer;
+      }
+      .active {
+        color: #409eff;
+        border-bottom: 2px solid #409eff;
+      }
+    }
+  }
+  // .pop-wrap{
+
+  // }
+  .choose-img-wrap {
+    padding-bottom: 80px;
+    .list {
+      display: flex;
+      flex-wrap: wrap;
+    }
+    .item {
+      flex-shrink: 0;
+      text-align: center;
+      margin-right: 20px;
+      margin-bottom: 20px;
+      border: 1px solid rgb(199, 198, 198);
+      padding: 5px;
+      border-radius: 4px;
+    }
+  }
+  .pre-img-box {
+    position: relative;
+    width: 120px;
+    height: 120px;
+    .del {
+      display: none;
+      color: #fff;
+      position: absolute;
+      bottom: 0;
+      left: 0;
+      right: 0;
+      text-align: center;
+      line-height: 24px;
+      background-color: rgba($color: #000000, $alpha: 0.8);
+      cursor: pointer;
+    }
+    &:hover {
+      .del {
+        display: block;
+      }
+    }
+  }
+}
+</style>

+ 4 - 4
src/views/seal_manage/approvalList.vue

@@ -944,7 +944,7 @@ function handlePreFile(e) {
           style="text-align: center; margin-bottom: 40px; margin-top: 40px"
           v-if="pageState.detail"
         >
-          <block v-if="pageState.detail.OpButton.Approval">
+          <div v-if="pageState.detail.OpButton.Approval">
             <el-button
               type="primary"
               style="margin-right: 24px"
@@ -955,11 +955,11 @@ function handlePreFile(e) {
             <el-button type="primary" @click="handleConfirmApproval"
               >确定</el-button
             >
-          </block>
-          <block v-else
+          </div>
+          <div v-else
             ><el-button type="primary" @click="pageState.showDetail = false"
               >知道了</el-button
-            ></block
+            ></div
           >
         </div>
         <!-- 预览合同附件弹窗 当附件大于1个时显示 -->