病例交流增加了列表中的图片和视频预览

This commit is contained in:
wucongxing8150 2025-06-11 16:17:55 +08:00
parent 0e6d48284c
commit b05be13e5c
6 changed files with 219 additions and 17 deletions

View File

@ -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())){

View File

@ -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<String> exchangeContentImage = new ArrayList<>();
/**
* 预览图片
*/
@JsonProperty("exchange_content_video_string")
private String exchangeContentVideoString;
/**
* 预览图片
*/
@JsonProperty("exchange_content_video")
private List<String> exchangeContentVideo = new ArrayList<>();
/**
* 创建时间
*/
@ -124,18 +151,6 @@ public class CaseExchangeDto {
@JsonProperty("label")
private List<CaseExchangeLabelDto> label;
/**
* 预览图片
*/
@JsonProperty("exchange_content_images")
private List<String> exchangeContentImages;
/**
* 预览图片
*/
@JsonProperty("exchange_content_video")
private List<String> 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());
}
}
}

View File

@ -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;
/**
* 创建时间
*/

View File

@ -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<String> videoUrls = regularUtil.extractOssVideosUrls(r.getExchangeContent());
videoUrls.replaceAll(Replace::removeOssDomain);
String exchangeContentVideo = String.join(",", videoUrls);
String exchangeContentImage = "";
if (exchangeContentVideo.isEmpty()){
// 匹配预览图片
List<String> 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("操作失败");

View File

@ -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<String> extractOssImageUrls(String html) {
List<String> 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<String> extractOssVideosUrls(String html) {
List<String> 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;
}
}

View File

@ -1,9 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.caseData.dao.CaseExchangeDao">
<select id="getCaseExchangeSearchPage" resultType="com.example.caseData.dto.caseExchange.CaseExchangeDto">
<resultMap id="caseExchangeDtoMap" type="com.example.caseData.dto.caseExchange.CaseExchangeDto">
<result property="exchangeContentImageString" column="exchange_content_image_string"/>
<result property="exchangeContentVideoString" column="exchange_content_video_string"/>
<!-- 其他字段可以不写,靠自动映射 -->
</resultMap>
<select id="getCaseExchangeSearchPage" resultMap="caseExchangeDtoMap">
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 @@
</if>
</select>
<select id="getCaseExchangeSearchList" resultType="com.example.caseData.dto.caseExchange.CaseExchangeDto">
<select id="getCaseExchangeSearchList" resultMap="caseExchangeDtoMap">
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