Procházet zdrojové kódy

视频内容bug修复

wengan01 před 2 týdny
rodič
revize
2f432c8295

+ 1 - 1
src/api/system/physical/videoContent/types.ts

@@ -103,7 +103,7 @@ export interface VideoContentForm extends BaseEntity {
   /**
    * 订阅后可观看的有效期,单位:小时(如24=1天,720=30天)
    */
-  subscriptionValidHours?: string | number;
+  subscriptionValidHours?: number;
 
   /**
    * 视频文件在阿里云OSS上的完整访问URL

+ 20 - 13
src/views/system/physical/videoContent/index.vue

@@ -270,12 +270,15 @@
         </el-form-item>
         <el-form-item label="试看时长 (秒)" prop="previewDurationSeconds">
           <div>
-            <el-input v-model="form.previewDurationSeconds" placeholder="请输入试看时长 (秒)" style="width: 100%" />
-            <div style="margin-top: 4px; font-size: 12px; color: #999">温馨提示:输入 -1 表示免费观看</div>
+            <el-input-number v-model="form.previewDurationSeconds" :min="-1" :step="1" controls-position="right" placeholder="请输入试看时长 (秒)" style="width: 100%" />
+            <div style="margin-top: 4px; font-size: 12px; color: #999">温馨提示:输入 -1 表示免费观看,最小值为 -1</div>
           </div>
         </el-form-item>
         <el-form-item label="订阅时效(天)" prop="subscriptionValidHours">
-          <el-input v-model="form.subscriptionValidHours" placeholder="请输入订阅时效(天)" />
+          <div>
+            <el-input-number v-model="form.subscriptionValidHours" :min="1" :max="3650" :step="1" controls-position="right" placeholder="请输入订阅时效(天)" style="width: 100%" />
+            <div style="margin-top: 4px; font-size: 12px; color: #999">最大 3650 天(10 年)</div>
+          </div>
         </el-form-item>
         <el-form-item label="所属标签" prop="categoryTagId">
           <el-select v-model="form.categoryTagId" placeholder="请选择所属标签" filterable clearable style="width: 100%">
@@ -752,11 +755,13 @@ const handleOssVideoUrlChange = async (file: any) => {
 
     // ⚠️ 根据核心原则:上传成功后不设置视频URL!
     // 视频URL只在两个地方设置:1. 修改页面打开时 2. 异步获取成功时
-    const videoUrl = uploadRes.data?.data?.url || uploadRes.data?.data?.ossVideoUrl;
-    const ossId = uploadRes.data?.data?.ossId;
-    const duration = uploadRes.data?.data?.duration || uploadRes.data?.data?.videoDuration;
-    const videoFileName = uploadRes.data?.data?.videoFileName;
-    const serviceTagName = uploadRes.data?.data?.serviceTagName;
+    // 拦截器已解包一层:uploadRes 即 R 体,uploadRes.data 就是 SysOssVo(原来多取一层 .data 全为 undefined)
+    const ossData: any = uploadRes.data || {};
+    const videoUrl = ossData.url || ossData.ossVideoUrl;
+    const ossId = ossData.ossId;
+    const duration = ossData.duration || ossData.videoDuration;
+    const videoFileName = ossData.videoFileName;
+    const serviceTagName = ossData.serviceTagName;
 
     // ❌ 删除:不设置视频URL
     // form.value.ossVideoUrl = videoUrl || localPreviewUrl;
@@ -772,19 +777,21 @@ const handleOssVideoUrlChange = async (file: any) => {
       form.value.serviceTagName = serviceTagName;
     }
 
-    if (uploadRes.data?.data?.id) {
-      form.value.id = uploadRes.data.data.id;
+    // 后端把新建视频主键放在 ext1 返回(SysOssVo 无 id 字段),取不到会导致确定时不走整体更新、选视频后改的字段(如所属标签)丢失
+    const newVideoId = ossData.id || ossData.ext1;
+    if (newVideoId) {
+      form.value.id = Number(newVideoId);
 
       // ✅ 上传成功后启动轮询(轮询只更新时长和状态,不更新视频URL)
-      startPolling(uploadRes.data.data.id);
+      startPolling(form.value.id);
     }
 
     let finalDuration = duration && !isNaN(duration) && Number(duration) > 0 ? Math.floor(Number(duration)) : 0;
 
-    if (!isDurationValid(finalDuration) && uploadRes.data?.data?.id) {
+    if (!isDurationValid(finalDuration) && form.value.id) {
       try {
         const durationRes = await request({
-          url: `/physical/videoContent/getVideoDuration/${uploadRes.data.data.id}`,
+          url: `/physical/videoContent/getVideoDuration/${form.value.id}`,
           method: 'GET'
         });
         if (durationRes.data && durationRes.data.success && durationRes.data.duration > 0) {