From b05be13e5cadaf79ab08e83ed9012de890b93c91 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 11 Jun 2025 16:17:55 +0800 Subject: [PATCH] =?UTF-8?q?=E7=97=85=E4=BE=8B=E4=BA=A4=E6=B5=81=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E4=BA=86=E5=88=97=E8=A1=A8=E4=B8=AD=E7=9A=84=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E5=92=8C=E8=A7=86=E9=A2=91=E9=A2=84=E8=A7=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CaseExchangeController.java | 15 ++++ .../dto/caseExchange/CaseExchangeDto.java | 58 ++++++++++--- .../caseData/model/CaseExchangeModel.java | 12 +++ .../caseData/service/CaseExchangeService.java | 22 +++++ .../example/caseData/utils/RegularUtil.java | 86 +++++++++++++++++++ .../resources/mapper/CaseExchangeMapper.xml | 43 +++++++++- 6 files changed, 219 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/example/caseData/utils/RegularUtil.java diff --git a/src/main/java/com/example/caseData/controller/CaseExchangeController.java b/src/main/java/com/example/caseData/controller/CaseExchangeController.java index e3887df..ea6c352 100644 --- a/src/main/java/com/example/caseData/controller/CaseExchangeController.java +++ b/src/main/java/com/example/caseData/controller/CaseExchangeController.java @@ -104,6 +104,21 @@ public class CaseExchangeController { ); for (CaseExchangeDto dto : resultPage.getRecords()) { + // 内容 + dto.setExchangeContent(""); + dto.setExchangeSummary(""); + + // 处理预览视频 + dto.setExchangeContentVideoString(dto.getExchangeContentVideoString()); + + // 处理预览图片 + if (dto.getExchangeContentVideo() == null){ + dto.setExchangeContentImageString(dto.getExchangeContentImageString()); + } + + dto.setExchangeContentImageString(""); + dto.setExchangeContentVideoString(""); + // 查找用户所属医院 if (userId != null){ if (!userId.equals(dto.getUserId())){ diff --git a/src/main/java/com/example/caseData/dto/caseExchange/CaseExchangeDto.java b/src/main/java/com/example/caseData/dto/caseExchange/CaseExchangeDto.java index 991f3b2..837c945 100644 --- a/src/main/java/com/example/caseData/dto/caseExchange/CaseExchangeDto.java +++ b/src/main/java/com/example/caseData/dto/caseExchange/CaseExchangeDto.java @@ -6,10 +6,13 @@ import com.example.caseData.dto.caseExchangeLabel.CaseExchangeLabelDto; import com.example.caseData.dto.caseExchangeVote.CaseExchangeVoteDto; import com.example.caseData.dto.caseExchangeVoteOption.CaseExchangeVoteOptionDto; import com.example.caseData.model.CaseExchangeModel; +import com.example.caseData.utils.Replace; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -76,6 +79,30 @@ public class CaseExchangeDto { @JsonProperty("exchange_summary") private String exchangeSummary; + /** + * 预览图片 + */ + @JsonProperty("exchange_content_image_string") + private String exchangeContentImageString; + + /** + * 预览图片 + */ + @JsonProperty("exchange_content_image") + private List exchangeContentImage = new ArrayList<>(); + + /** + * 预览图片 + */ + @JsonProperty("exchange_content_video_string") + private String exchangeContentVideoString; + + /** + * 预览图片 + */ + @JsonProperty("exchange_content_video") + private List exchangeContentVideo = new ArrayList<>(); + /** * 创建时间 */ @@ -124,18 +151,6 @@ public class CaseExchangeDto { @JsonProperty("label") private List label; - /** - * 预览图片 - */ - @JsonProperty("exchange_content_images") - private List exchangeContentImages; - - /** - * 预览图片 - */ - @JsonProperty("exchange_content_video") - private List exchangeContentVideo; - /** * 列表 */ @@ -201,5 +216,22 @@ public class CaseExchangeDto { return dto; } - + + public void setExchangeContentImageString(String str) { + this.exchangeContentImageString = str; + if (str != null && !str.isEmpty()) { + this.exchangeContentImage = Arrays.stream(str.split(",")) + .map(Replace::addOssDomain) + .collect(Collectors.toList()); + } + } + + public void setExchangeContentVideoString(String str) { + this.exchangeContentVideoString = str; + if (str != null && !str.isEmpty()) { + this.exchangeContentVideo = Arrays.stream(str.split(",")) + .map(Replace::addOssDomain) + .collect(Collectors.toList()); + } + } } \ No newline at end of file diff --git a/src/main/java/com/example/caseData/model/CaseExchangeModel.java b/src/main/java/com/example/caseData/model/CaseExchangeModel.java index cfa0860..758b021 100644 --- a/src/main/java/com/example/caseData/model/CaseExchangeModel.java +++ b/src/main/java/com/example/caseData/model/CaseExchangeModel.java @@ -79,6 +79,18 @@ public class CaseExchangeModel { @TableField("exchange_summary") private String exchangeSummary; + /** + * 预览图片(逗号分隔) + */ + @TableField("exchange_content_image") + private String exchangeContentImage; + + /** + * 预览视频(逗号分隔) + */ + @TableField("exchange_content_video") + private String exchangeContentVideo; + /** * 创建时间 */ diff --git a/src/main/java/com/example/caseData/service/CaseExchangeService.java b/src/main/java/com/example/caseData/service/CaseExchangeService.java index 80bb768..c41203c 100644 --- a/src/main/java/com/example/caseData/service/CaseExchangeService.java +++ b/src/main/java/com/example/caseData/service/CaseExchangeService.java @@ -6,6 +6,8 @@ import com.example.caseData.exception.BusinessException; import com.example.caseData.model.*; import com.example.caseData.request.caseExchangeRequest.addCaseExchange; import com.example.caseData.request.caseExchangeRequest.addCaseExchangeComment; +import com.example.caseData.utils.JwtUtil; +import com.example.caseData.utils.RegularUtil; import com.example.caseData.utils.Replace; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; @@ -50,6 +52,9 @@ public class CaseExchangeService { @Resource private UserDao userDao; + @Resource + private RegularUtil regularUtil; + /** * 新增-病例交流 * @param userId 用户id @@ -105,6 +110,21 @@ public class CaseExchangeService { } } + // 匹配预览视频 + List videoUrls = regularUtil.extractOssVideosUrls(r.getExchangeContent()); + videoUrls.replaceAll(Replace::removeOssDomain); + String exchangeContentVideo = String.join(",", videoUrls); + + String exchangeContentImage = ""; + if (exchangeContentVideo.isEmpty()){ + // 匹配预览图片 + List imageUrls = regularUtil.extractOssImageUrls(r.getExchangeContent()); + imageUrls.replaceAll(Replace::removeOssDomain); + exchangeContentImage = String.join(",", imageUrls); + }else{ + exchangeContentImage = ""; + } + // 新增病例交流 CaseExchangeModel caseExchangeData = new CaseExchangeModel(); caseExchangeData.setUserId(Long.valueOf(userId)); @@ -113,6 +133,8 @@ public class CaseExchangeService { caseExchangeData.setPushDate(LocalDateTime.now()); caseExchangeData.setExchangeContent(r.getExchangeContent()); caseExchangeData.setExchangeSummary(r.getExchangeSummary()); + caseExchangeData.setExchangeContentVideo(exchangeContentVideo); + caseExchangeData.setExchangeContentImage(exchangeContentImage); int res = caseExchangeDao.insert(caseExchangeData); if (res <= 0){ throw new BusinessException("操作失败"); diff --git a/src/main/java/com/example/caseData/utils/RegularUtil.java b/src/main/java/com/example/caseData/utils/RegularUtil.java new file mode 100644 index 0000000..4d05253 --- /dev/null +++ b/src/main/java/com/example/caseData/utils/RegularUtil.java @@ -0,0 +1,86 @@ +package com.example.caseData.utils; + +import com.example.caseData.config.EnvConfig; +import com.example.caseData.config.JwtConfig; +import com.example.caseData.config.OssConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 正则类 + */ +@Component +public class RegularUtil { + private static OssConfig ossConfig; + private static EnvConfig envConfig; + + public RegularUtil( + OssConfig ossConfig, + EnvConfig envConfig + ){ + RegularUtil.ossConfig = ossConfig; + RegularUtil.envConfig = envConfig; + } + + /** + * 提取 HTML 中的 OSS 图片链接(支持 jpg/png/jpeg) + * + * @param html HTML 字符串 + * @return 图片链接列表 + */ + public List extractOssImageUrls(String html) { + List imageUrls = new ArrayList<>(); + if (html == null || html.isEmpty()) { + return imageUrls; + } + + String domain = ossConfig.getCustomDomainName(); + // 转义点号,避免正则误匹配 + String escapedDomain = Pattern.quote(domain); // 更安全地处理 https:// 域名部分 + + String env = envConfig.getActive(); + String regex = escapedDomain + "/" + env + "/static/images/exchange/[a-zA-Z0-9_\\-/.]+\\.(jpg|jpeg|png)"; + Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); + + Matcher matcher = pattern.matcher(html); + while (matcher.find()) { + imageUrls.add(matcher.group()); + } + + return imageUrls; + } + + /** + * 提取 HTML 中的 OSS 视频链接(支持 mp4/webm/ogg) + * + * @param html HTML 字符串 + * @return 视频链接列表 + */ + public List extractOssVideosUrls(String html) { + List imageUrls = new ArrayList<>(); + if (html == null || html.isEmpty()) { + return imageUrls; + } + + String domain = ossConfig.getCustomDomainName(); + // 转义点号,避免正则误匹配 + String escapedDomain = Pattern.quote(domain); // 更安全地处理 https:// 域名部分 + + String env = envConfig.getActive(); + String regex = escapedDomain + "/" + env + "/static/video/exchange/[a-zA-Z0-9_\\-/.]+\\.(mp4|webm|ogg)"; + Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); + + Matcher matcher = pattern.matcher(html); + while (matcher.find()) { + imageUrls.add(matcher.group()); + } + + return imageUrls; + } + +} diff --git a/src/main/resources/mapper/CaseExchangeMapper.xml b/src/main/resources/mapper/CaseExchangeMapper.xml index ad30fd8..1d1d05d 100644 --- a/src/main/resources/mapper/CaseExchangeMapper.xml +++ b/src/main/resources/mapper/CaseExchangeMapper.xml @@ -1,9 +1,30 @@ - SELECT - a.*, + a.exchange_id, + a.user_id, + a.exchange_title, + a.exchange_status, + a.is_selected, + a.read_num, + a.collect_num, + a.comment_num, + a.push_date, + a.exchange_content, + a.exchange_summary, + a.exchange_content_image as exchange_content_image_string, + a.exchange_content_video as exchange_content_video_string, + a.created_at, + a.updated_at, c.user_name, c.avatar, c.hospital_id @@ -37,9 +58,23 @@ - SELECT - a.*, + a.exchange_id, + a.user_id, + a.exchange_title, + a.exchange_status, + a.is_selected, + a.read_num, + a.collect_num, + a.comment_num, + a.push_date, + a.exchange_content, + a.exchange_summary, + a.exchange_content_image as exchange_content_image_string, + a.exchange_content_video as exchange_content_video_string, + a.created_at, + a.updated_at, c.user_name, c.avatar, c.hospital_id