From 8adff1576d322f1095d35dad5fd7bec17417f0e7 Mon Sep 17 00:00:00 2001
From: hejianhao <15708179461@qq.com>
Date: 星期四, 20 八月 2026 14:30:13 +0800
Subject: [PATCH] feat0806: 项目介绍样式完善

---
 tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/dto/ProjectIntroductionSaveRequest.java                       |    3 +++
 tcm-training-admin-backend/sql/20260806_admin.sql                                                                                  |    1 +
 tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/service/ProjectIntroductionAppService.java                    |    7 +++++++
 tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/vo/ProjectIntroductionDetailVO.java                           |    1 +
 traditionalApp/pages/good/projectDetail.vue                                                                                        |   12 ++++++++++++
 tcm-training-admin/src/pages/live/project-introduction/manage.tsx                                                                  |    8 ++++++++
 tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/projectintroduction/service/AppProjectIntroductionService.java |    1 +
 tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/entity/ProjectIntroduction.java                               |    3 +++
 tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/vo/AppProjectIntroductionDetailVO.java                        |    5 +++++
 9 files changed, 41 insertions(+), 0 deletions(-)

diff --git a/tcm-training-admin-backend/sql/20260806_admin.sql b/tcm-training-admin-backend/sql/20260806_admin.sql
index f7b148f..60aa84f 100644
--- a/tcm-training-admin-backend/sql/20260806_admin.sql
+++ b/tcm-training-admin-backend/sql/20260806_admin.sql
@@ -111,6 +111,7 @@
   `content` MEDIUMTEXT COMMENT '图文内容(富文本HTML)',
   `video_url` VARCHAR(512) DEFAULT NULL COMMENT '视频地址',
   `video_file_name` VARCHAR(255) DEFAULT NULL COMMENT '视频文件名',
+  `video_description` VARCHAR(255) DEFAULT NULL COMMENT '视频介绍',
   `click_count` INT NOT NULL DEFAULT 0 COMMENT '点击量',
   `status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态:1启用 0禁用',
   `deleted` TINYINT(1) NOT NULL DEFAULT 0,
diff --git a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/projectintroduction/service/AppProjectIntroductionService.java b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/projectintroduction/service/AppProjectIntroductionService.java
index 643a5eb..937bbb4 100644
--- a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/projectintroduction/service/AppProjectIntroductionService.java
+++ b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/projectintroduction/service/AppProjectIntroductionService.java
@@ -81,6 +81,7 @@
         vo.setContent(entity.getContent());
         vo.setVideoUrl(entity.getVideoUrl());
         vo.setVideoFileName(entity.getVideoFileName());
+        vo.setVideoDescription(entity.getVideoDescription());
         vo.setClickCount(entity.getClickCount());
 
         return vo;
diff --git a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/dto/ProjectIntroductionSaveRequest.java b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/dto/ProjectIntroductionSaveRequest.java
index 2955ca0..4c6cadf 100644
--- a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/dto/ProjectIntroductionSaveRequest.java
+++ b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/dto/ProjectIntroductionSaveRequest.java
@@ -36,6 +36,9 @@
     @Size(max = 255, message = "视频文件名长度不能超过255个字符")
     private String videoFileName;
 
+    @Size(max = 255, message = "视频介绍长度不能超过255个字符")
+    private String videoDescription;
+
     @NotNull(message = "请选择是否启用")
     private Integer status;
 }
diff --git a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/entity/ProjectIntroduction.java b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/entity/ProjectIntroduction.java
index 6e98207..abcca83 100644
--- a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/entity/ProjectIntroduction.java
+++ b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/entity/ProjectIntroduction.java
@@ -46,6 +46,9 @@
     @TableField("video_file_name")
     private String videoFileName;
 
+    @TableField("video_description")
+    private String videoDescription;
+
     @TableField("click_count")
     private Integer clickCount;
 
diff --git a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/service/ProjectIntroductionAppService.java b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/service/ProjectIntroductionAppService.java
index dae7abe..c3f3543 100644
--- a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/service/ProjectIntroductionAppService.java
+++ b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/service/ProjectIntroductionAppService.java
@@ -102,6 +102,7 @@
             item.setContent(content);
             item.setVideoUrl(null);
             item.setVideoFileName(null);
+            item.setVideoDescription(null);
             return;
         }
 
@@ -109,9 +110,14 @@
         if (videoUrl == null) {
             throw new IllegalArgumentException("请填写视频地址或上传本地视频");
         }
+        String videoDescription = trimToNull(req.getVideoDescription());
+        if (videoDescription == null) {
+            throw new IllegalArgumentException("请输入视频介绍");
+        }
         item.setContent(null);
         item.setVideoUrl(videoUrl);
         item.setVideoFileName(trimToNull(req.getVideoFileName()));
+        item.setVideoDescription(videoDescription);
     }
 
     private int validateContentType(Integer contentType) {
@@ -172,6 +178,7 @@
         vo.setContent(item.getContent());
         vo.setVideoUrl(item.getVideoUrl());
         vo.setVideoFileName(item.getVideoFileName());
+        vo.setVideoDescription(item.getVideoDescription());
         vo.setStatus(item.getStatus());
         vo.setClickCount(defaultNumber(item.getClickCount()));
         vo.setCreatedAt(item.getCreatedAt());
diff --git a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/vo/AppProjectIntroductionDetailVO.java b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/vo/AppProjectIntroductionDetailVO.java
index 5136357..f10d5b1 100644
--- a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/vo/AppProjectIntroductionDetailVO.java
+++ b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/vo/AppProjectIntroductionDetailVO.java
@@ -47,6 +47,11 @@
     private String videoFileName;
 
     /**
+     * 视频介绍
+     */
+    private String videoDescription;
+
+    /**
      * 点击量
      */
     private Integer clickCount;
diff --git a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/vo/ProjectIntroductionDetailVO.java b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/vo/ProjectIntroductionDetailVO.java
index c9299e2..495fe4f 100644
--- a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/vo/ProjectIntroductionDetailVO.java
+++ b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/vo/ProjectIntroductionDetailVO.java
@@ -18,6 +18,7 @@
     private String content;
     private String videoUrl;
     private String videoFileName;
+    private String videoDescription;
     private Integer status;
     private Integer clickCount;
     private LocalDateTime createdAt;
diff --git a/tcm-training-admin/src/pages/live/project-introduction/manage.tsx b/tcm-training-admin/src/pages/live/project-introduction/manage.tsx
index e4433ba..cdb9c2b 100644
--- a/tcm-training-admin/src/pages/live/project-introduction/manage.tsx
+++ b/tcm-training-admin/src/pages/live/project-introduction/manage.tsx
@@ -96,6 +96,7 @@
       content: values.contentType === 1 ? values.content : undefined,
       videoUrl: values.contentType === 2 ? values.videoUrl?.trim() : undefined,
       videoFileName: values.contentType === 2 ? values.videoFileName?.trim() : undefined,
+      videoDescription: values.contentType === 2 ? values.videoDescription?.trim() : undefined,
       status: values.status ? 1 : 0,
     };
     setSubmitting(true);
@@ -184,6 +185,13 @@
                 >
                   <Input placeholder="请输入" disabled={loading} />
                 </Form.Item>
+                <Form.Item
+                  label="视频介绍"
+                  name="videoDescription"
+                  rules={[{ required: true, message: '请输入视频介绍' }]}
+                >
+                  <Input.TextArea placeholder="请输入视频介绍" maxLength={255} rows={3} disabled={loading} />
+                </Form.Item>
                 <Form.Item label="本地视频" extra="本地视频和视频地址必须填一个">
                   <div className="project-introduction-edit-form__video-upload">
                     <Upload
diff --git a/traditionalApp/pages/good/projectDetail.vue b/traditionalApp/pages/good/projectDetail.vue
index ffe90d3..978b80e 100644
--- a/traditionalApp/pages/good/projectDetail.vue
+++ b/traditionalApp/pages/good/projectDetail.vue
@@ -27,6 +27,10 @@
 						:show-center-play-btn="true"
 						:enable-progress-gesture="true"
 					></video>
+					<!-- 视频介绍 -->
+					<view v-if="detail.videoDescription" class="video-description">
+						{{ detail.videoDescription }}
+					</view>
 				</view>
 
 				<!-- 图文内容 -->
@@ -182,6 +186,14 @@
 	overflow: hidden;
 }
 
+.video-description {
+	margin-top: 24rpx;
+	font-size: 28rpx;
+	line-height: 44rpx;
+	color: #666;
+	text-align: justify;
+}
+
 .html-content {
 	font-size: 30rpx;
 	line-height: 48rpx;

--
Gitblit v1.7.1