病例交流增加了列表中的图片和视频预览
This commit is contained in:
parent
0e6d48284c
commit
b05be13e5c
@ -104,6 +104,21 @@ public class CaseExchangeController {
|
|||||||
);
|
);
|
||||||
|
|
||||||
for (CaseExchangeDto dto : resultPage.getRecords()) {
|
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 != null){
|
||||||
if (!userId.equals(dto.getUserId())){
|
if (!userId.equals(dto.getUserId())){
|
||||||
|
|||||||
@ -6,10 +6,13 @@ import com.example.caseData.dto.caseExchangeLabel.CaseExchangeLabelDto;
|
|||||||
import com.example.caseData.dto.caseExchangeVote.CaseExchangeVoteDto;
|
import com.example.caseData.dto.caseExchangeVote.CaseExchangeVoteDto;
|
||||||
import com.example.caseData.dto.caseExchangeVoteOption.CaseExchangeVoteOptionDto;
|
import com.example.caseData.dto.caseExchangeVoteOption.CaseExchangeVoteOptionDto;
|
||||||
import com.example.caseData.model.CaseExchangeModel;
|
import com.example.caseData.model.CaseExchangeModel;
|
||||||
|
import com.example.caseData.utils.Replace;
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@ -76,6 +79,30 @@ public class CaseExchangeDto {
|
|||||||
@JsonProperty("exchange_summary")
|
@JsonProperty("exchange_summary")
|
||||||
private String exchangeSummary;
|
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")
|
@JsonProperty("label")
|
||||||
private List<CaseExchangeLabelDto> label;
|
private List<CaseExchangeLabelDto> label;
|
||||||
|
|
||||||
/**
|
|
||||||
* 预览图片
|
|
||||||
*/
|
|
||||||
@JsonProperty("exchange_content_images")
|
|
||||||
private List<String> exchangeContentImages;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 预览图片
|
|
||||||
*/
|
|
||||||
@JsonProperty("exchange_content_video")
|
|
||||||
private List<String> exchangeContentVideo;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 列表
|
* 列表
|
||||||
*/
|
*/
|
||||||
@ -202,4 +217,21 @@ public class CaseExchangeDto {
|
|||||||
return dto;
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -79,6 +79,18 @@ public class CaseExchangeModel {
|
|||||||
@TableField("exchange_summary")
|
@TableField("exchange_summary")
|
||||||
private String exchangeSummary;
|
private String exchangeSummary;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 预览图片(逗号分隔)
|
||||||
|
*/
|
||||||
|
@TableField("exchange_content_image")
|
||||||
|
private String exchangeContentImage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 预览视频(逗号分隔)
|
||||||
|
*/
|
||||||
|
@TableField("exchange_content_video")
|
||||||
|
private String exchangeContentVideo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建时间
|
* 创建时间
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -6,6 +6,8 @@ import com.example.caseData.exception.BusinessException;
|
|||||||
import com.example.caseData.model.*;
|
import com.example.caseData.model.*;
|
||||||
import com.example.caseData.request.caseExchangeRequest.addCaseExchange;
|
import com.example.caseData.request.caseExchangeRequest.addCaseExchange;
|
||||||
import com.example.caseData.request.caseExchangeRequest.addCaseExchangeComment;
|
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 com.example.caseData.utils.Replace;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@ -50,6 +52,9 @@ public class CaseExchangeService {
|
|||||||
@Resource
|
@Resource
|
||||||
private UserDao userDao;
|
private UserDao userDao;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private RegularUtil regularUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 新增-病例交流
|
* 新增-病例交流
|
||||||
* @param userId 用户id
|
* @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();
|
CaseExchangeModel caseExchangeData = new CaseExchangeModel();
|
||||||
caseExchangeData.setUserId(Long.valueOf(userId));
|
caseExchangeData.setUserId(Long.valueOf(userId));
|
||||||
@ -113,6 +133,8 @@ public class CaseExchangeService {
|
|||||||
caseExchangeData.setPushDate(LocalDateTime.now());
|
caseExchangeData.setPushDate(LocalDateTime.now());
|
||||||
caseExchangeData.setExchangeContent(r.getExchangeContent());
|
caseExchangeData.setExchangeContent(r.getExchangeContent());
|
||||||
caseExchangeData.setExchangeSummary(r.getExchangeSummary());
|
caseExchangeData.setExchangeSummary(r.getExchangeSummary());
|
||||||
|
caseExchangeData.setExchangeContentVideo(exchangeContentVideo);
|
||||||
|
caseExchangeData.setExchangeContentImage(exchangeContentImage);
|
||||||
int res = caseExchangeDao.insert(caseExchangeData);
|
int res = caseExchangeDao.insert(caseExchangeData);
|
||||||
if (res <= 0){
|
if (res <= 0){
|
||||||
throw new BusinessException("操作失败");
|
throw new BusinessException("操作失败");
|
||||||
|
|||||||
86
src/main/java/com/example/caseData/utils/RegularUtil.java
Normal file
86
src/main/java/com/example/caseData/utils/RegularUtil.java
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,9 +1,30 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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">
|
<!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">
|
<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
|
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.user_name,
|
||||||
c.avatar,
|
c.avatar,
|
||||||
c.hospital_id
|
c.hospital_id
|
||||||
@ -37,9 +58,23 @@
|
|||||||
</if>
|
</if>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="getCaseExchangeSearchList" resultType="com.example.caseData.dto.caseExchange.CaseExchangeDto">
|
<select id="getCaseExchangeSearchList" resultMap="caseExchangeDtoMap">
|
||||||
SELECT
|
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.user_name,
|
||||||
c.avatar,
|
c.avatar,
|
||||||
c.hospital_id
|
c.hospital_id
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user