ソースを参照

视频库管理等

pansl 1 年間 前
コミット
7f4d80da3c

+ 6 - 0
src/api/video/index.ts

@@ -11,6 +11,12 @@ export function videoStockEpisodeList(params: object) {
 export function videoStockVideoList(params: object) {
   return http.get('/videoStock/video/list', params);
 }
+/**
+ * 视频-分类
+ */
+export function videoStockVideoCategoryList(params?: object) {
+  return http.get('/videoStock/videoCategory/list', params);
+}
 
 /**
  * 视频-添加

+ 8 - 4
src/components/Upload/VideoUploader.vue

@@ -1,7 +1,7 @@
 <template>
   <el-upload class="w-auto" :action="uploadUrl" :headers="headers" list-type="text" :file-list="props.fileList"
     :data="extraParams" :multiple="props.isMultiple" :accept="props.acceptType" :auto-upload="true"
-    :handleRemove="handleRemove" :show-file-list="true" :before-upload="beforeUpload" :on-progress="onProgress"
+    :on-remove="handleRemove" :show-file-list="true" :before-upload="beforeUpload" :on-progress="onProgress"
     :on-success="onSuccess">
     <div class="el-upload__text">
       <el-icon class="avatar-uploader-icon">
@@ -61,6 +61,7 @@ const token = ref('')
 const headers = ref({})
 const progress = ref(0)
 const uploading = ref(false)
+const video = inject('video')
 // 校验上传文件格式
 const getType = (acceptType: string) => {
   let val = "";
@@ -136,7 +137,7 @@ const beforeUpload = (file: File) => {
   uploading.value = true
   const fname = `${Date.now()}_${file.name}`
   extraParams.value = {
-    key: `${fname}`, token: token.value
+    key: `${fname}`, token: token.value, 'x:video_id': video.value.id
   }
   return checkFileName(file)
 
@@ -147,8 +148,11 @@ const onProgress = (event: ProgressEvent) => {
 }
 
 const handleRemove: UploadProps['onRemove'] = (file, uploadFiles) => {
-  console.log(file, uploadFiles)
-  emits('fileRemove', file)
+  console.log(file, 'filefile');
+  if (file && file.status === "success") {
+    console.log(file, uploadFiles, 'UploadPropsUploadPropshandleRemove')
+    emits('fileRemove', file)
+  }
 }
 
 const onSuccess = (response: any) => {

+ 14 - 16
src/components/Upload/myUpload.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="upload_wrap">
-    <block v-if="waitFileList.length > 0">
+    <div v-if="waitFileList.length > 0">
       <div class="el-upload-list el-upload-list--picture-card" v-if="listType == 'picture-card' || listType == 'picture'">
         <div class="el-upload-list__item is-success" v-for="( item, index ) in  waitFileList " :key="index">
           <el-image style="width:148px;height:148px;" :src="item.url" fit="fill" :lazy="true"></el-image>
@@ -36,23 +36,21 @@
           </span>
         </div>
       </div>
-    </block>
+    </div>
     <el-upload v-else class="w-auto upload" ref="uploadRef" :file-list="waitFileList" :multiple="props.isMultiple"
       :limit="props.limitNum" :list-type="listType" :accept="props.acceptType" :auto-upload="false"
       :show-file-list="false" :disabled="props.isDisableUpload" :on-change="handleChange" :on-remove="handleRemove">
-      <block>
-        <div class="el-upload__text" v-if="listType == 'text'">
-          <el-icon>
-            <Upload />
-          </el-icon>
-          <span>上传文件</span>
-        </div>
-        <div v-else>
-          <el-icon>
-            <Plus />
-          </el-icon>
-        </div>
-      </block>
+      <div class="el-upload__text" v-if="listType == 'text'">
+        <el-icon>
+          <Upload />
+        </el-icon>
+        <span>上传文件</span>
+      </div>
+      <div v-else>
+        <el-icon>
+          <Plus />
+        </el-icon>
+      </div>
       <template #tip v-if="!props.isDisableUpload && isShowTips">
         <div class="el-upload__tip">
           <span>支持{{ acceptTypeDesc }};</span> <span v-if="isLimitSize">文件大小不能超过{{
@@ -244,7 +242,7 @@ const removeFile = (file: any) => {
     console.log(its, file);
     return its.uid != file.uid;
   });
-  
+
   console.log(file, 'file', arr, waitFileList.value);
   emits("fileRemove", file);
 };

+ 9 - 6
src/components/download/index.vue

@@ -16,10 +16,13 @@ export default defineComponent({
     fileName: { type: String, default: '' },
   },
   setup(props) {
-    const urls = ref(props.urls);
 
     const download = () => {
-      if (!urls.value.length) {
+      const loadingInstance = ElLoading.service({
+        text: "正在解析视频",
+        background: "rgba(0,0,0,.2)",
+      });
+      if (!props.urls.length) {
         ElMessage.error('没有可下载的文件');
         return;
       }
@@ -27,11 +30,9 @@ export default defineComponent({
       anchor.style.display = 'none';
       anchor.href = '#';
       document.body.appendChild(anchor);
-
-      const formData = new FormData();
-      urls.value.forEach(el => {
+      props.urls.forEach(el => {
         axios
-          .get(el.video_url, {
+          .get(el.download_video_url, {
             responseType: 'blob',
           })
           .then((response) => {
@@ -41,10 +42,12 @@ export default defineComponent({
             anchor.href = objectUrl;
             anchor.click();
             URL.revokeObjectURL(objectUrl);
+            loadingInstance.close()
           })
           .catch((error) => {
             console.error(error);
             ElMessage.error('下载失败');
+            loadingInstance.close()
           });
       })
 

+ 0 - 20
src/router/modules/caster.ts

@@ -1,20 +0,0 @@
-// import { RouteRecordRaw } from 'vue-router';
-// // eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// // @ts-ignore
-// const router: RouteRecordRaw[] = [
-//   {
-//     path: '/users',
-//     component: () => import('@/layout/index.vue'),
-//     meta: { title: '用户管理', icon: 'user' },
-//     children: [
-//       {
-//         path: 'caster',
-//         name: 'user-account',
-//         meta: { title: '添加优化师', icon: 'home' },
-//         component: () => import('@/views/user/caster/index.vue')
-//       }
-//     ]
-//   }
-// ];
-
-// export default router;

+ 0 - 20
src/router/modules/video.ts

@@ -1,20 +0,0 @@
-import { RouteRecordRaw } from 'vue-router';
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-ignore
-const router: RouteRecordRaw[] = [
-  {
-    path: '/video',
-    component: () => import('@/layout/index.vue'),
-    meta: { title: '视频库管理', icon: 'user' },
-    children: [
-      {
-        path: 'video',
-        name: 'video-account',
-        meta: { title: '视频库管理', icon: 'home' },
-        component: () => import('@/views/videoManage/index.vue')
-      }
-    ]
-  }
-];
-
-export default router;

+ 0 - 22
src/styles/element.scss

@@ -1,26 +1,4 @@
 @forward 'element-plus/theme-chalk/src/common/var' with (
-  // 基础色调
-  $colors:
-    (
-      'primary': (
-        'base': #4f46e5,
-      ),
-      'success': (
-        'base': #059669,
-      ),
-      'warning': (
-        'base': #fbbf24,
-      ),
-      'danger': (
-        'base': #f43f5e,
-      ),
-      'error': (
-        'base': #f43f5e,
-      ),
-      'info': (
-        'base': #909399,
-      )
-    ),
   $input: ('border-radius': 8px)
 );
 

+ 17 - 14
src/views/Permissions/permissions/form/create.vue

@@ -5,10 +5,10 @@
         <el-form-item label="菜单类型" prop="type">
           <el-radio-group v-model="formData.type">
             <el-radio-button v-for="item in [
-                { label: '目录', value: 1 },
-                { label: '菜单', value: 2 },
-                { label: '按钮', value: 3 },
-              ]" :key="item.value" :label="item.value" name="type">{{ item.label }}
+              { label: '目录', value: 1 },
+              { label: '菜单', value: 2 },
+              { label: '按钮', value: 3 },
+            ]" :key="item.value" :label="item.value" name="type">{{ item.label }}
             </el-radio-button>
           </el-radio-group>
         </el-form-item>
@@ -30,12 +30,15 @@
       </div>
       <div>
         <el-form-item label="父级菜单" prop="parent_id">
-          <el-cascader :options="permissions" name="parent_id" v-model="formData.parent_id" clearable :props="{ value: 'id', label: 'permission_name', checkStrictly: true }" class="w-full" />
+          <el-cascader :options="permissions" name="parent_id" v-model="formData.parent_id" clearable
+            :props="{ value: 'id', label: 'permission_name', checkStrictly: true }" class="w-full" />
         </el-form-item>
-        <el-form-item label="权限标识" prop="permission_mark" :rules="[{ required: true, message: '权限标识必须填写' }]" v-if="!isTop">
+        <el-form-item label="权限标识" prop="permission_mark" :rules="[{ required: true, message: '权限标识必须填写' }]"
+          v-if="!isTop">
           <el-input v-model="formData.permission_mark" name="permission_mark" clearable v-if="isAction" />
           <!-- <Select v-model="formData.permission_mark" placeholder="请选择" api="controllers" :query="{ module: formData.module }" v-else /> -->
           <el-input v-model="formData.permission_mark" name="permission_mark" clearable />
+          <el-input v-model="action" disabled size="normal" clearable></el-input>
         </el-form-item>
         <el-form-item label="菜单Icon" prop="icon" v-if="!isAction">
           <el-input v-model="formData.icon" name="icon" clearable @click="open" />
@@ -48,17 +51,17 @@
         <el-form-item label="Hidden" prop="hidden" v-if="!isAction">
           <el-radio-group v-model="formData.hidden">
             <el-radio v-for="item in [
-                { label: '显示', value: 1 },
-                { label: '隐藏', value: 2 },
-              ]" :key="item.value" :label="item.value" name="hidden">{{ item.label }}</el-radio>
+              { label: '显示', value: 1 },
+              { label: '隐藏', value: 2 },
+            ]" :key="item.value" :label="item.value" name="hidden">{{ item.label }}</el-radio>
           </el-radio-group>
         </el-form-item>
         <el-form-item label="Keepalive" prop="keepalive" v-if="!isAction">
           <el-radio-group v-model="formData.keepalive">
             <el-radio v-for="item in [
-                { label: '启用', value: 1 },
-                { label: '禁用', value: 2 },
-              ]" :key="item.value" :label="item.value" name="keepalive">{{ item.label }}
+              { label: '启用', value: 1 },
+              { label: '禁用', value: 2 },
+            ]" :key="item.value" :label="item.value" name="keepalive">{{ item.label }}
             </el-radio>
           </el-radio-group>
         </el-form-item>
@@ -132,12 +135,12 @@ formData.value.hidden = defaultHidden;
 const isTop = ref<boolean>(true);
 const isMenu = ref<boolean>(false);
 const isAction = ref<boolean>(false);
-
+const action = ref('')
 // 回显示表单
 if (props.primary) {
   const { afterShow } = useShow(props.api, props.primary, formData);
-
   afterShow.value = formData => {
+    action.value = formData.value.permission_mark
     if (formData.value.permission_mark.indexOf('@') !== -1) {
       formData.value.permission_mark =
         formData.value.permission_mark.split('@')[1];

+ 1 - 1
src/views/videoManage/detail.vue

@@ -21,7 +21,7 @@
   </div>
   <Dialog v-model="playVisible" title="视频" destroy-on-close height="100%">
     <video id="my-player" class="video-js" controls autoplay preload="auto" ref="myVideo">
-      <source :src="current.video_url" type="video/mp4">
+      <source :src="current.public_video_url" type="video/mp4">
     </video>
   </Dialog>
 </template>

+ 44 - 10
src/views/videoManage/form/create.vue

@@ -7,7 +7,7 @@
         </el-form-item>
         <el-form-item label="集数" prop="total_episode_num">
           <el-input-number style="width:200px;" v-model="formData.total_episode_num" :step="1" step-strictly :min="1"
-            @change="handleChange" placeholder="请输入集数" />
+            placeholder="请输入集数" />
         </el-form-item>
         <el-form-item label="完结状态" prop="update_type">
           <el-radio-group v-model="formData.update_type">
@@ -16,9 +16,9 @@
           </el-radio-group>
         </el-form-item>
         <el-form-item label="频道" prop="category_id">
-          <el-select class="w-full" v-model="formData.category_id" filterable clearable placeholder="选择频道">
-            <el-option v-for="item in cpList" :key="item.cp_id" :label="item.cp_name" :value="item.cp_name" />
-          </el-select>
+          <el-cascader v-model="selectType" :options="cooperations" filterable clearable :change-on-select="true"
+            @change="handleCascaderChange" />
+          <!-- <el-cascader v-model="formData.category_id" :options="cooperations" :show-all-levels="false" /> -->
         </el-form-item>
         <el-form-item label="上架" prop="shelf_type">
           <el-radio-group v-model="formData.shelf_type">
@@ -28,12 +28,12 @@
         </el-form-item>
         <el-form-item label="起始集" prop="d_charge_sequence">
           <el-input-number style="width:200px;" v-model="formData.d_charge_sequence" :step="1" step-strictly :min="1"
-            @change="handleChange" placeholder="请输入起始集" />
+            placeholder="请输入起始集" />
         </el-form-item>
         <el-form-item label="默认定价" prop="d_charge_coin">
           <div class="flex items-center w-full">
             <el-input-number style="width:200px;" v-model="formData.d_charge_coin" :precision="2" :step="1" :min="1"
-              @change="handleChange" placeholder="请输入默认定价" />
+              placeholder="请输入看剧币" />
             <el-tooltip placement="top">
               <template #content> multiple lines<br />second line </template>
               <el-icon>
@@ -58,7 +58,6 @@
         <el-form-item label="封面" prop="cover_image">
           <my-upload :isMultiple="true" @fileRemove="fileRemove" @fileSuccess="fileSuccess" :fileList="formData.fileList"
             action="/qiniu/upload/image"></my-upload>
-          <el-input v-model="formData.cover_image" placeholder="请填写备注" type="textarea" />
         </el-form-item>
       </div>
     </div>
@@ -74,13 +73,15 @@ import { useCreate } from '@/hook/curd/useCreate';
 import { useShow } from '@/hook/curd/useShow';
 import { cpManageCpList, cpOptions } from '@/api/cp/index'
 import { advertiserGetAdvertiser, advertiserAdd, advertiserUpdateAdvertiser } from '@/api/advertiser/index'
-import { videoStockVideoUpdate, videoStockVideoAdd } from '@/api/video/index'
+import { videoStockVideoUpdate, videoStockVideoAdd, videoStockVideoCategoryList } from '@/api/video/index'
 import type { FormInstance, FormRules } from 'element-plus'
 const ruleForm = ref<FormInstance>()
 import { onMounted, ref } from 'vue';
 const props = defineProps({
   primary: String | Number,
 });
+const cooperations = ref([]);
+const categoryList = ref([])
 const formData = ref({ status: 2, miniProgramIds: [] })
 const rules = reactive({
   name: [{ required: true, message: '请输入短剧名称', trigger: 'blur' }],
@@ -147,8 +148,29 @@ const rules = reactive({
     }
   ],
 });
+const selectType = ref([])
 const loading = ref(false)
-
+const typeChange = (e) => {
+  console.log(e, 'typeChangetypeChange');
+  formData.value.category_id = ''
+  if (e == 1) {
+    categoryList.value = cooperations.value.length > 0 ? cooperations.value[0]?.list : []
+  } else if (e == 2) {
+    categoryList.value = cooperations.value.length > 0 ? cooperations.value[1]?.list : []
+  }
+}
+const handleCascaderChange = (val: any) => {
+  console.log(val, 'valval');
+  if (val) {
+    // 获取最后一级选项的值
+    const lastOptionValue = val[val.length - 1];
+    console.log('最后一级选项的值:', lastOptionValue, selectType.value);
+    // 更新 selectedOptions 的值
+    formData.value.category_id = lastOptionValue;
+  } else {
+    delete formData.value.category_id
+  }
+}
 const remoteMethod = (query: string) => {
   if (query) {
     initCpOtion({ cp_name: query })
@@ -210,8 +232,20 @@ const submitForm = (formEl: FormInstance | undefined) => {
 if (props.primary) {
   formData.value = JSON.parse(JSON.stringify(props.primary))
   formData.value.fileList = [{ uid: props.primary.id, url: props.primary.cover_image }]
+  selectType.value = formData.value.category_id
 }
-
+const initType = () => {
+  videoStockVideoCategoryList().then(res => {
+    console.log(res);
+    cooperations.value = res.data
+    if (formData.value.channel == 1) {
+      categoryList.value = cooperations.value.length > 0 ? cooperations.value[0]?.list : []
+    } else if (formData.value.channel == 2) {
+      categoryList.value = cooperations.value.length > 0 ? cooperations.value[1]?.list : []
+    }
+  })
+}
+initType()
 const emit = defineEmits(['close']);
 const cpList = ref();
 onMounted(() => {

+ 2 - 2
src/views/videoManage/form/uploadVideo.vue

@@ -25,6 +25,7 @@
 import { FormInstance } from 'element-plus';
 import { InfoFilled } from '@element-plus/icons-vue';
 import { videoStockEpisodeAdd } from '@/api/video/index'
+import { defineComponent, inject } from 'vue'
 const props = defineProps({
   primary: String | Number,
 });
@@ -38,7 +39,7 @@ const fileRemove = (e: object) => {
   console.log(formDataForm.value, e, 'fileRemove');
 }
 const fileSuccess = (e: object) => {
-  formDataForm.value.videos.push({ name: e.fname, duration: parseInt(e.duration), url: e.url })
+  formDataForm.value.videos.push({ name: e.fname, duration: parseInt(e.duration), url: e.url, key: e.key, })
   console.log(formDataForm.value, 'fileSuccess');
 }
 
@@ -74,6 +75,5 @@ if (props.primary) {
   formDataForm.value.cover_image = props.primary.cover_image
 }
 onMounted(async () => {
-
 });
 </script>

+ 6 - 7
src/views/videoManage/form/videoDL.vue

@@ -1,8 +1,8 @@
 <template>
   <div class="wrapper">
     <!-- :poster="videoImg"视频封面 -->
-    <video id="my-player" class="video-js" controls autoplay preload="auto" ref="myVideo">
-      <source :src="videoUrl" type="video/mp4">
+    <video id="my-player" :key="current.public_video_url" class="video-js" controls autoplay preload="auto" ref="myVideo">
+      <source :src="current.public_video_url" type="video/mp4">
     </video>
     <!-- 视频名称列表布局 -->
     <div class="video-wrapper">
@@ -16,7 +16,7 @@
         <template v-slot:content>
           <el-checkbox-group v-model="videoChoose" size="large" class="flex items-center">
             <el-checkbox border class="video-item" @change="videoShow(source)" v-for="(source, index) in videoUrlList"
-              :key="index" :label="source.video_url">
+              :key="index" :label="source">
               {{ source.series_sequence }}
             </el-checkbox>
           </el-checkbox-group>
@@ -40,7 +40,7 @@ if (props.primary) {
 }
 const meta = ref({})
 
-const videoUrl = ref('')
+const current = ref({})
 const videoChooseUrls = ref([])
 const initVideoList = (params: object) => {
   videoStockEpisodeList({ video_id: props.primary.id, ...params }).then(res => {
@@ -57,9 +57,8 @@ const handChange = (e) => {
 }
 const videoShow = (source: object) => {
   console.log(source);
-  videoUrl.value = source.video_url
-  videoChooseUrls.value.push(source)
-  videoChooseUrls.value = videoChooseUrls.value.filter(el => videoChoose.value.includes(el.video_url))
+  current.value = videoChoose.value.find(el => el.public_video_url == source.public_video_url) ?? {}
+  videoChooseUrls.value = videoChoose.value
   console.log(videoChooseUrls.value, 'videoChooseUrls.value');
 }
 

+ 88 - 59
src/views/videoManage/index.vue

@@ -1,34 +1,39 @@
 <template>
   <div>
-    <Search :search="search" :reset="reset">
+    <Search :search="search" :reset="resetQuery">
       <template v-slot:body>
         <el-form-item label="短剧" prop="name">
-          <el-input v-model="query.name" name="name" placeholder="请输入剧号/短剧名称" clearable />
+          <el-input v-model="query.videoName" placeholder="请输入短剧名称" clearable />
         </el-form-item>
-        <el-form-item label="状态" prop="cp">
-          <el-select v-model="query.cp_id" filterable clearable remote :remote-method="remoteMethod" placeholder="请选择状态">
-            <el-option v-for="item in cpoptions" :key="item.cp_id" :label="item.cp_nick" :value="item.cp_id" />
+        <el-form-item label="状态" prop="updateType">
+          <el-select v-model="query.updateType" filterable clearable remote placeholder="请选择状态">
+            <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
         </el-form-item>
-        <el-form-item label="频道" prop="cp_company">
-          <el-select v-model="query.settlement_type" clearable filterable placeholder="请选择频道">
-            <el-option v-for="(item, index) in cooperations" :key="index" :label="item.name" :value="item.value" />
-          </el-select>
+        <el-form-item label="频道" prop="categoryId">
+          <el-cascader v-model="selectType" :options="cooperations" filterable clearable :change-on-select="true"
+            @change="handleCascaderChange" />
         </el-form-item>
       </template>
     </Search>
     <div class="table-default">
       <div class="set-warpper">
-        <el-button type="primary" @click="mulSet" size="default" v-action="'contentManage.book.mulSet'">批量操作</el-button>
+        <el-button type="primary" @click="mulSet" size="default" v-action="'video.video.mulSet'">批量操作</el-button>
       </div>
-      <Operate :show="open" />
+      <Operate :show="open" v-action="'video.video.add'" />
       <el-table :data="tableData" class="mt-3" v-loading="loading" @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55" />
         <el-table-column type="index" width="100" label="剧号" />
         <el-table-column label="封面" width="200" show-overflow-tooltip>
           <template #default="scope">
             <div class="flex flex-col items-center justify-center wrapper">
-              <el-image :src="scope.row.cover_image" style="width:148px;height:148px;" fit="fill" :lazy="true"></el-image>
+              <el-popover placement="top" :width="200" trigger="hover">
+                <template #reference>
+                  <el-image :src="scope.row.cover_image" class="cursor-pointer" style="width:48px;height:48px;"
+                    fit="contain" :lazy="true"></el-image>
+                </template>
+                <el-image :src="scope.row.cover_image" style="width:100%;" fit="contain"></el-image>
+              </el-popover>
               <el-button type="primary" link size="default" @click="dowload(scope.row)">下载</el-button>
             </div>
           </template>
@@ -36,7 +41,7 @@
         <el-table-column label="短剧名称" width="250" show-overflow-tooltip>
           <template #default="scope">
             <div class="wrapper">
-              <span class="text-lg font-bold text-blue-600 cursor-pointer content"
+              <span class="text-lg font-bold text-blue-400 cursor-pointer content"
                 @click="openType('videoDetailVisible', scope.row)">
                 {{ scope.row.name }}
               </span>
@@ -50,7 +55,23 @@
             </div>
           </template>
         </el-table-column>
-        <el-table-column prop="total_episode_num" label="集数" />
+        <el-table-column prop="total_episode_num" label="集数">
+          <template #default="scope">
+            <div class="flex wrapper">
+              <div v-if="scope.row.update_type == 1">
+                <span class="content">
+                  {{ scope.row.updated_episode_num }}
+                </span>
+                <span>/</span>
+              </div>
+              <div>
+                <span class="content">
+                  {{ scope.row.total_episode_num }}
+                </span>
+              </div>
+            </div>
+          </template>
+        </el-table-column>
         <el-table-column prop="category_str" label="频道" />
         <el-table-column prop="shelf_type_str" label="上架状态" />
         <el-table-column prop="charge_sequence" label="起始集" />
@@ -72,11 +93,14 @@
         </el-table-column>
         <el-table-column label="操作">
           <template #default="scope">
-            <el-button link type="primary" size="small"
-              @click="openType('uploadVisible', scope.row)">上传视频</el-button><br />
-            <el-button @click="open(scope.row)" link type="primary" size="small">编辑</el-button><br />
-            <el-button @click="openType('takeVisible', scope.row)" link type="primary" size="small">订阅设置</el-button><br />
-            <el-button link type="primary" size="small" @click="openType('videoDLVisible', scope.row)">视频下载</el-button>
+            <el-button link type="primary" size="small" @click="openType('uploadVisible', scope.row)"
+              v-action="'video.episode.add'">上传视频</el-button><br />
+            <el-button @click="open(scope.row)" link type="primary" size="small"
+              v-action="'video.video.update'">编辑</el-button><br />
+            <el-button @click="openType('takeVisible', scope.row)" link type="primary" size="small"
+              v-action="'video.video.setChargeConfig'">订阅设置</el-button><br />
+            <el-button link type="primary" size="small" @click="openType('videoDLVisible', scope.row)"
+              v-action="'video.episode.downloadList'">视频下载</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -95,7 +119,7 @@
     <Dialog v-model="uploadVisible" width="50%" title="上传视频" destroy-on-close>
       <uploadVideo @close="closeType('uploadVisible')" :primary="uploadData"></uploadVideo>
     </Dialog>
-    <Dialog v-model="videoDetailVisible" width="50%" title="短剧详情" destroy-on-close>
+    <Dialog v-action="'video.episode.list'" v-model="videoDetailVisible" width="50%" title="短剧详情" destroy-on-close>
       <videoDetail @close="closeType('videoDetailVisible')" :primary="videoDetailData"></videoDetail>
     </Dialog>
   </div>
@@ -104,6 +128,7 @@
 <script lang="ts" setup>
 import { downloadImage } from '@/utils/index'
 import { InfoFilled } from '@element-plus/icons-vue';
+import { provide } from 'vue'
 import Create from './form/create.vue';
 import videoDL from './form/videoDL.vue';
 import videoDetail from './detail.vue';
@@ -114,12 +139,13 @@ import { useDestroy } from '@/hook/curd/useDestroy';
 import { useOpen } from '@/hook/curd/useOpen';
 import { shortcuts } from '@/utils/shortcuts';
 import moment from 'moment';
-import { cpOptions } from '@/api/cp/index';
-import { ca } from 'element-plus/es/locale';
-let ismulSet = ref(false)
+import { videoStockVideoUpdate, videoStockVideoAdd, videoStockVideoCategoryList } from '@/api/video/index'
+import { useUserStore } from '@/stores/modules/user/index'
+
+const ismulSet = ref(false)
 const api = 'videoStock/video/list';
 const addApi = 'contentManage/book/edit_author';
-let multipleSelection = reactive([]);
+const multipleSelection = reactive([]);
 const { data, query, search, reset, loading } = useGetList(api);
 const { deleted } = useDestroy();
 const uploadBooksVisible = ref(false)
@@ -131,7 +157,35 @@ const takeVisible = ref(false)
 const takeData = ref({})
 const videoDetailVisible = ref(false)
 const videoDetailData = ref({})
-const openType = (type, data) => {
+const current = ref({})
+const selectType = ref([])
+const statusOptions = ref([{ label: '连载中', value: '1' }, { label: '完结', value: '2' }]);
+const cooperations = ref([]);
+
+
+const userStore = useUserStore()
+console.log('userStore', userStore.roles);
+
+const handleCascaderChange = (val: any) => {
+  console.log(val, 'valval');
+  if (val) {
+    // 获取最后一级选项的值
+    const lastOptionValue = val[val.length - 1];
+    console.log('最后一级选项的值:', lastOptionValue, selectType.value);
+    // 更新 selectedOptions 的值
+    query.value.categoryId = lastOptionValue;
+  } else {
+    delete query.value.categoryId
+  }
+}
+
+const resetQuery = () => {
+  reset()
+  selectType.value = []
+}
+const openType = (type: string, data: object) => {
+  current.value = data;
+  provide('video', current.value)
   switch (type) {
     case 'videoDLVisible':
       videoDLVisible.value = true
@@ -151,24 +205,20 @@ const openType = (type, data) => {
       break;
   }
 }
-
+provide('video', current)
+const initType = () => {
+  videoStockVideoCategoryList().then(res => {
+    console.log(res);
+    cooperations.value = res.data
+  })
+}
+// 下载封面
 const dowload = (e: object) => {
-  console.log(e);
-  // const link = document.createElement('a')
-  // link.href = e.cover_image
-  // link.setAttribute('download', e.name)
-  // document.body.appendChild(link)
-  // link.click()
-  // document.body.removeChild(link)
-  // (e.cover_image, e.name)
   downloadImage(e.cover_image, e.name)
-  console.log(downloadImage());
 }
 
 const tableData = computed(() => data.value?.data);
 const { open, close, title, visible, id } = useOpen();
-let cooperations = ref([]);
-let cpoptions = ref([]);
 
 const handleSelectionChange = (val: []) => {
   console.log(toRaw(val));
@@ -193,14 +243,7 @@ const closeType = (type) => {
   }
   search()
 }
-const closeUpload = () => {
-  uploadBooksVisible.value = false
-  search()
-}
 
-// watch(() => uploadVisible.value, (newVal, oldVal) => {
-//   search()
-// })
 const mulSet = () => {
   if (multipleSelection.length <= 0) {
     return ElMessage.warning({
@@ -236,23 +279,9 @@ const mulSet = () => {
   }
 };
 
-const remoteMethod = (query: string) => {
-  if (query) {
-    initCpOtion({ cp_name: query })
-  } else {
-    initCpOtion({})
-  }
-}
-const initCpOtion = (params: object) => {
-  cpOptions(params).then(res => {
-    cpoptions.value = res.data
-  })
-}
-
 onMounted(() => {
-  initCpOtion({})
+  initType()
   search();
-  deleted(reset);
 });
 </script>