refactor travel
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,8 +1,10 @@
|
|||||||
/config
|
/config
|
||||||
/data
|
/data
|
||||||
|
/docs
|
||||||
/logs
|
/logs
|
||||||
/target
|
/target
|
||||||
/temp
|
/temp
|
||||||
|
CLAUDE.md
|
||||||
|
|
||||||
multilingualField/
|
multilingualField/
|
||||||
!.mvn/wrapper/maven-wrapper.jar
|
!.mvn/wrapper/maven-wrapper.jar
|
||||||
|
|||||||
29
src/main/java/com/imyeyu/api/bean/PreviewPage.java
Normal file
29
src/main/java/com/imyeyu/api/bean/PreviewPage.java
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
package com.imyeyu.api.bean;
|
||||||
|
|
||||||
|
import com.imyeyu.spring.bean.Page;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 夜雨
|
||||||
|
* @since 2025-12-12 23:07
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
public class PreviewPage<T> extends Page<T> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @author 夜雨
|
||||||
|
* @since 2025-12-12 23:09
|
||||||
|
*/
|
||||||
|
public enum Type {
|
||||||
|
|
||||||
|
NORMAL,
|
||||||
|
|
||||||
|
PREVIEW
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Type type;
|
||||||
|
}
|
||||||
@ -3,12 +3,15 @@ package com.imyeyu.api.modules.common.entity;
|
|||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import com.imyeyu.api.bean.MultilingualHandler;
|
import com.imyeyu.api.bean.MultilingualHandler;
|
||||||
import com.imyeyu.java.ref.Ref;
|
import com.imyeyu.java.ref.Ref;
|
||||||
|
import com.imyeyu.spring.annotation.table.Transient;
|
||||||
import com.imyeyu.spring.entity.Entity;
|
import com.imyeyu.spring.entity.Entity;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author 夜雨
|
* @author 夜雨
|
||||||
* @since 2023-08-15 10:17
|
* @since 2023-08-15 10:17
|
||||||
@ -80,6 +83,9 @@ public class Attachment extends Entity implements MultilingualHandler {
|
|||||||
|
|
||||||
protected Long destroyAt;
|
protected Long destroyAt;
|
||||||
|
|
||||||
|
@Transient
|
||||||
|
protected InputStream inputStream;
|
||||||
|
|
||||||
public void setAttachTypeValue(Enum<?> attachType) {
|
public void setAttachTypeValue(Enum<?> attachType) {
|
||||||
this.attachType = attachType.toString();
|
this.attachType = attachType.toString();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,11 +4,7 @@ import com.imyeyu.api.modules.common.entity.Attachment;
|
|||||||
import com.imyeyu.api.modules.common.vo.attachment.AttachmentRequest;
|
import com.imyeyu.api.modules.common.vo.attachment.AttachmentRequest;
|
||||||
import com.imyeyu.api.modules.common.vo.attachment.AttachmentView;
|
import com.imyeyu.api.modules.common.vo.attachment.AttachmentView;
|
||||||
import com.imyeyu.java.bean.timi.TimiException;
|
import com.imyeyu.java.bean.timi.TimiException;
|
||||||
import com.imyeyu.spring.service.DeletableService;
|
import com.imyeyu.spring.service.BaseService;
|
||||||
import com.imyeyu.spring.service.DestroyableService;
|
|
||||||
import com.imyeyu.spring.service.GettableService;
|
|
||||||
import com.imyeyu.spring.service.PageableService;
|
|
||||||
import com.imyeyu.spring.service.UpdatableService;
|
|
||||||
import com.mongodb.client.gridfs.model.GridFSFile;
|
import com.mongodb.client.gridfs.model.GridFSFile;
|
||||||
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
@ -22,14 +18,19 @@ import java.util.List;
|
|||||||
* @author 夜雨
|
* @author 夜雨
|
||||||
* @since 2023-08-15 10:21
|
* @since 2023-08-15 10:21
|
||||||
*/
|
*/
|
||||||
public interface AttachmentService extends GettableService<Attachment, Long>, PageableService<Attachment>, UpdatableService<Attachment>, DeletableService<Long>, DestroyableService<Long> {
|
public interface AttachmentService extends BaseService<Attachment, Long> {
|
||||||
|
|
||||||
|
Attachment createMedia(Attachment attachment);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* @param request
|
* @param request
|
||||||
*/
|
*/
|
||||||
void create(AttachmentRequest request);
|
@Deprecated
|
||||||
|
default void create(AttachmentRequest request) {
|
||||||
|
create((Attachment) request);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建媒体附件,同步创建缩略图
|
* 创建媒体附件,同步创建缩略图
|
||||||
@ -37,7 +38,10 @@ public interface AttachmentService extends GettableService<Attachment, Long>, Pa
|
|||||||
* @param request 附件请求
|
* @param request 附件请求
|
||||||
* @return 缩略图附件
|
* @return 缩略图附件
|
||||||
*/
|
*/
|
||||||
Attachment createMedia(AttachmentRequest request) throws TimiException;
|
@Deprecated
|
||||||
|
default Attachment createMedia(AttachmentRequest request) throws TimiException {
|
||||||
|
return createMedia((Attachment) request);
|
||||||
|
}
|
||||||
|
|
||||||
void deleteMedia(Long thumbId) throws TimiException;
|
void deleteMedia(Long thumbId) throws TimiException;
|
||||||
|
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import com.imyeyu.java.bean.timi.TimiException;
|
|||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.InputStream;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -18,5 +19,7 @@ public interface TempFileService {
|
|||||||
|
|
||||||
File get(String id) throws TimiException;
|
File get(String id) throws TimiException;
|
||||||
|
|
||||||
|
InputStream getInputStream(String id) throws TimiException;
|
||||||
|
|
||||||
TempFileMetaData metadata(String id) throws TimiException;
|
TempFileMetaData metadata(String id) throws TimiException;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,7 +8,6 @@ import com.imyeyu.api.modules.common.entity.Attachment;
|
|||||||
import com.imyeyu.api.modules.common.mapper.AttachmentMapper;
|
import com.imyeyu.api.modules.common.mapper.AttachmentMapper;
|
||||||
import com.imyeyu.api.modules.common.service.AttachmentService;
|
import com.imyeyu.api.modules.common.service.AttachmentService;
|
||||||
import com.imyeyu.api.modules.common.service.SettingService;
|
import com.imyeyu.api.modules.common.service.SettingService;
|
||||||
import com.imyeyu.api.modules.common.vo.attachment.AttachmentRequest;
|
|
||||||
import com.imyeyu.api.modules.common.vo.attachment.AttachmentView;
|
import com.imyeyu.api.modules.common.vo.attachment.AttachmentView;
|
||||||
import com.imyeyu.api.util.JavaCV;
|
import com.imyeyu.api.util.JavaCV;
|
||||||
import com.imyeyu.io.IO;
|
import com.imyeyu.io.IO;
|
||||||
@ -65,6 +64,47 @@ public class AttachmentServiceImplement extends AbstractEntityService<Attachment
|
|||||||
return mapper;
|
return mapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Transactional(TimiServerDBConfig.ROLLBACKER)
|
||||||
|
@Override
|
||||||
|
public void create(Attachment attachment) {
|
||||||
|
TimiException.required(attachment.getBizType(), "not found attachment.bizType");
|
||||||
|
TimiException.required(attachment.getBizId(), "not found attachment.bizId");
|
||||||
|
TimiException.required(attachment.getName(), "not found attachment.name");
|
||||||
|
String mongoId = null;
|
||||||
|
try {
|
||||||
|
InputStream is = attachment.getInputStream();
|
||||||
|
TimiException.required(is, "not found attachment.inputStream");
|
||||||
|
TimiException.requiredTrue(is.available() != 0, "empty attachment.inputStream");
|
||||||
|
|
||||||
|
StringBuilder mongoName = new StringBuilder(attachment.getBizType().toString());
|
||||||
|
if (TimiJava.isNotEmpty(attachment.getAttachType())) {
|
||||||
|
mongoName.append("_").append(attachment.getAttachType().toUpperCase()).append("_");
|
||||||
|
}
|
||||||
|
mongoName.append(attachment.getName());
|
||||||
|
|
||||||
|
mongoId = gridFsTemplate.store(attachment.getInputStream(), mongoName.toString()).toString();
|
||||||
|
GridFSFile gridFSFile = gridFsTemplate.findOne(new Query(Criteria.where("_id").is(mongoId)));
|
||||||
|
attachment.setMongoId(mongoId);
|
||||||
|
attachment.setSize(gridFSFile.getLength());
|
||||||
|
attachment.setMd5(IO.md5(gridFSBucket.openDownloadStream(gridFSFile.getObjectId())));
|
||||||
|
attachment.setMimeType(new Tika().detect(gridFSBucket.openDownloadStream(gridFSFile.getObjectId())));
|
||||||
|
if (attachment.getMimeType().startsWith("image")) {
|
||||||
|
BufferedImage image = ImageIO.read(gridFSBucket.openDownloadStream(gridFSFile.getObjectId()));
|
||||||
|
Metadata.Image metadata = new Metadata.Image();
|
||||||
|
metadata.setWidth(image.getWidth());
|
||||||
|
metadata.setHeight(image.getHeight());
|
||||||
|
attachment.setMetadata(gson.toJsonTree(metadata).getAsJsonObject());
|
||||||
|
}
|
||||||
|
mapper.insert(attachment);
|
||||||
|
} catch (Exception e) {
|
||||||
|
if (mongoId != null) {
|
||||||
|
gridFsTemplate.delete(Query.query(Criteria.where("_id").is(mongoId)));
|
||||||
|
}
|
||||||
|
log.error("create attachment error", e);
|
||||||
|
throw new TimiException(TimiCode.ARG_BAD).msgKey("TODO read attachment input stream error");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Transactional(TimiServerDBConfig.ROLLBACKER)
|
@Transactional(TimiServerDBConfig.ROLLBACKER)
|
||||||
@Override
|
@Override
|
||||||
public void destroy(Long id) {
|
public void destroy(Long id) {
|
||||||
@ -83,62 +123,18 @@ public class AttachmentServiceImplement extends AbstractEntityService<Attachment
|
|||||||
|
|
||||||
@Transactional(TimiServerDBConfig.ROLLBACKER)
|
@Transactional(TimiServerDBConfig.ROLLBACKER)
|
||||||
@Override
|
@Override
|
||||||
public void create(AttachmentRequest request) {
|
public Attachment createMedia(Attachment attachment) throws TimiException {
|
||||||
TimiException.required(request.getBizType(), "not found request.bizType");
|
|
||||||
TimiException.required(request.getBizId(), "not found request.bizId");
|
|
||||||
TimiException.required(request.getName(), "not found request.name");
|
|
||||||
String mongoId = null;
|
|
||||||
try {
|
|
||||||
InputStream is = request.getInputStream();
|
|
||||||
TimiException.required(is, "not found request.inputStream");
|
|
||||||
TimiException.requiredTrue(is.available() != 0, "empty request.inputStream");
|
|
||||||
|
|
||||||
StringBuilder mongoName = new StringBuilder(request.getBizType().toString());
|
|
||||||
if (TimiJava.isNotEmpty(request.getAttachType())) {
|
|
||||||
mongoName.append("_").append(request.getAttachType().toUpperCase()).append("_");
|
|
||||||
}
|
|
||||||
mongoName.append(request.getName());
|
|
||||||
|
|
||||||
mongoId = gridFsTemplate.store(request.getInputStream(), mongoName.toString()).toString();
|
|
||||||
GridFSFile gridFSFile = gridFsTemplate.findOne(new Query(Criteria.where("_id").is(mongoId)));
|
|
||||||
request.setMongoId(mongoId);
|
|
||||||
request.setSize(gridFSFile.getLength());
|
|
||||||
request.setMd5(IO.md5(gridFSBucket.openDownloadStream(gridFSFile.getObjectId())));
|
|
||||||
request.setMimeType(new Tika().detect(gridFSBucket.openDownloadStream(gridFSFile.getObjectId())));
|
|
||||||
if (request.getMimeType().startsWith("image")) {
|
|
||||||
BufferedImage image = ImageIO.read(gridFSBucket.openDownloadStream(gridFSFile.getObjectId()));
|
|
||||||
Metadata.Image metadata = new Metadata.Image();
|
|
||||||
metadata.setWidth(image.getWidth());
|
|
||||||
metadata.setHeight(image.getHeight());
|
|
||||||
request.setMetadata(gson.toJsonTree(metadata).getAsJsonObject());
|
|
||||||
}
|
|
||||||
mapper.insert(request);
|
|
||||||
} catch (Exception e) {
|
|
||||||
if (mongoId != null) {
|
|
||||||
gridFsTemplate.delete(Query.query(Criteria.where("_id").is(mongoId)));
|
|
||||||
}
|
|
||||||
log.error("create attachment error", e);
|
|
||||||
throw new TimiException(TimiCode.ARG_BAD).msgKey("TODO read attachment input stream error");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional(TimiServerDBConfig.ROLLBACKER)
|
|
||||||
@Override
|
|
||||||
public Attachment createMedia(AttachmentRequest request) throws TimiException {
|
|
||||||
TimiException.required(request.getName(), "not found name");
|
|
||||||
TimiException.required(request.getBizType(), "not found bizType");
|
|
||||||
TimiException.required(request.getInputStream(), "not found inputStream");
|
|
||||||
try {
|
try {
|
||||||
// 储存源文件
|
// 储存源文件
|
||||||
request.setAttachTypeValue(MediaAttach.Type.SOURCE);
|
attachment.setAttachTypeValue(MediaAttach.Type.SOURCE);
|
||||||
create(request);
|
create(attachment);
|
||||||
|
|
||||||
// 生成缩略图
|
// 生成缩略图
|
||||||
InputStream mimeStream = getInputStreamByMongoId(request.getMongoId());
|
InputStream mimeStream = getInputStreamByMongoId(attachment.getMongoId());
|
||||||
String mimeType = new Tika().detect(mimeStream);
|
String mimeType = new Tika().detect(mimeStream);
|
||||||
boolean isImage = false;
|
boolean isImage = false;
|
||||||
|
|
||||||
InputStream sourceStream = getInputStreamByMongoId(request.getMongoId());
|
InputStream sourceStream = getInputStreamByMongoId(attachment.getMongoId());
|
||||||
ByteArrayOutputStream thumbStream = new ByteArrayOutputStream();
|
ByteArrayOutputStream thumbStream = new ByteArrayOutputStream();
|
||||||
switch (mimeType) {
|
switch (mimeType) {
|
||||||
case "image/png", "image/bmp", "image/jpeg" -> {
|
case "image/png", "image/bmp", "image/jpeg" -> {
|
||||||
@ -146,14 +142,14 @@ public class AttachmentServiceImplement extends AbstractEntityService<Attachment
|
|||||||
Thumbnails.of(sourceStream).width(256).keepAspectRatio(true).toOutputStream(thumbStream);
|
Thumbnails.of(sourceStream).width(256).keepAspectRatio(true).toOutputStream(thumbStream);
|
||||||
}
|
}
|
||||||
case "video/mp4", "video/quicktime" -> {
|
case "video/mp4", "video/quicktime" -> {
|
||||||
log.info("capturing thumbnail: {}", request.getName());
|
log.info("capturing thumbnail: {}", attachment.getName());
|
||||||
long start = Time.now();
|
long start = Time.now();
|
||||||
File tempFile = IO.file("temp/%s_%s".formatted(UUID.randomUUID().toString(), request.getName()));
|
File tempFile = IO.file("temp/%s_%s".formatted(UUID.randomUUID().toString(), attachment.getName()));
|
||||||
try {
|
try {
|
||||||
IO.toFile(tempFile, sourceStream);
|
IO.toFile(tempFile, sourceStream);
|
||||||
ByteArrayOutputStream baos = JavaCV.captureThumbnail(IO.getInputStream(tempFile), 2);
|
ByteArrayOutputStream baos = JavaCV.captureThumbnail(IO.getInputStream(tempFile), 2);
|
||||||
Thumbnails.of(IO.toInputStream(baos)).width(256).keepAspectRatio(true).toOutputStream(thumbStream);
|
Thumbnails.of(IO.toInputStream(baos)).width(256).keepAspectRatio(true).toOutputStream(thumbStream);
|
||||||
log.info("captured thumbnail: {} at {} ms", request.getName(), Time.now() - start);
|
log.info("captured thumbnail: {} at {} ms", attachment.getName(), Time.now() - start);
|
||||||
} finally {
|
} finally {
|
||||||
IO.destroy(tempFile);
|
IO.destroy(tempFile);
|
||||||
}
|
}
|
||||||
@ -162,13 +158,13 @@ public class AttachmentServiceImplement extends AbstractEntityService<Attachment
|
|||||||
MediaAttach.ExtData extData = new MediaAttach.ExtData();
|
MediaAttach.ExtData extData = new MediaAttach.ExtData();
|
||||||
extData.setImage(isImage);
|
extData.setImage(isImage);
|
||||||
extData.setVideo(!isImage);
|
extData.setVideo(!isImage);
|
||||||
extData.setSourceId(request.getId());
|
extData.setSourceId(attachment.getId());
|
||||||
extData.setSourceMongoId(request.getMongoId());
|
extData.setSourceMongoId(attachment.getMongoId());
|
||||||
|
|
||||||
AttachmentRequest thumbAttach = new AttachmentRequest();
|
Attachment thumbAttach = new Attachment();
|
||||||
thumbAttach.setName(Network.simpleURIFileName(request.getName()) + ".png");
|
thumbAttach.setName(Network.simpleURIFileName(attachment.getName()) + ".png");
|
||||||
thumbAttach.setBizType(request.getBizType());
|
thumbAttach.setBizType(attachment.getBizType());
|
||||||
thumbAttach.setBizId(request.getBizId());
|
thumbAttach.setBizId(attachment.getBizId());
|
||||||
thumbAttach.setAttachTypeValue(MediaAttach.Type.THUMB);
|
thumbAttach.setAttachTypeValue(MediaAttach.Type.THUMB);
|
||||||
thumbAttach.setExt(gson.toJson(extData));
|
thumbAttach.setExt(gson.toJson(extData));
|
||||||
thumbAttach.setInputStream(new ByteArrayInputStream(thumbStream.toByteArray()));
|
thumbAttach.setInputStream(new ByteArrayInputStream(thumbStream.toByteArray()));
|
||||||
|
|||||||
@ -22,7 +22,9 @@ import org.springframework.stereotype.Service;
|
|||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
@ -108,6 +110,15 @@ public class TempFileServiceImplement implements TempFileService {
|
|||||||
return metaData.getPath().toFile();
|
return metaData.getPath().toFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InputStream getInputStream(String id) throws TimiException {
|
||||||
|
try {
|
||||||
|
return IO.getInputStream(get(id));
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
throw new TimiException(TimiCode.RESULT_NULL, "not found temp file");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TempFileMetaData metadata(String id) throws TimiException {
|
public TempFileMetaData metadata(String id) throws TimiException {
|
||||||
return metadataMap.get(id);
|
return metadataMap.get(id);
|
||||||
|
|||||||
@ -5,8 +5,6 @@ import com.imyeyu.spring.annotation.table.Transient;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
import java.io.InputStream;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author 夜雨
|
* @author 夜雨
|
||||||
@ -14,8 +12,7 @@ import java.io.InputStream;
|
|||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
@Transient
|
@Transient
|
||||||
|
@Deprecated
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
public class AttachmentRequest extends Attachment {
|
public class AttachmentRequest extends Attachment {
|
||||||
|
|
||||||
private InputStream inputStream;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
package com.imyeyu.api.modules.journal.controller;
|
package com.imyeyu.api.modules.journal.controller;
|
||||||
|
|
||||||
|
import com.imyeyu.api.bean.PreviewPage;
|
||||||
import com.imyeyu.api.bean.wechat.InitCodeResponse;
|
import com.imyeyu.api.bean.wechat.InitCodeResponse;
|
||||||
import com.imyeyu.api.modules.common.bean.MediaAttach;
|
import com.imyeyu.api.modules.common.bean.MediaAttach;
|
||||||
import com.imyeyu.api.modules.common.bean.SettingKey;
|
import com.imyeyu.api.modules.common.bean.SettingKey;
|
||||||
@ -9,11 +10,10 @@ import com.imyeyu.api.modules.common.service.SettingService;
|
|||||||
import com.imyeyu.api.modules.journal.bean.Travel;
|
import com.imyeyu.api.modules.journal.bean.Travel;
|
||||||
import com.imyeyu.api.modules.journal.entity.Journal;
|
import com.imyeyu.api.modules.journal.entity.Journal;
|
||||||
import com.imyeyu.api.modules.journal.service.JournalService;
|
import com.imyeyu.api.modules.journal.service.JournalService;
|
||||||
import com.imyeyu.api.modules.journal.vo.ArchiveRequest;
|
import com.imyeyu.api.modules.journal.vo.journal.ArchiveRequest;
|
||||||
import com.imyeyu.api.modules.journal.vo.JournalPage;
|
import com.imyeyu.api.modules.journal.vo.journal.JournalRequest;
|
||||||
import com.imyeyu.api.modules.journal.vo.JournalRequest;
|
import com.imyeyu.api.modules.journal.vo.journal.JournalResponse;
|
||||||
import com.imyeyu.api.modules.journal.vo.JournalResponse;
|
import com.imyeyu.api.modules.journal.vo.journal.UpdateRequest;
|
||||||
import com.imyeyu.api.modules.journal.vo.UpdateRequest;
|
|
||||||
import com.imyeyu.java.bean.timi.TimiCode;
|
import com.imyeyu.java.bean.timi.TimiCode;
|
||||||
import com.imyeyu.java.bean.timi.TimiException;
|
import com.imyeyu.java.bean.timi.TimiException;
|
||||||
import com.imyeyu.network.ArgMap;
|
import com.imyeyu.network.ArgMap;
|
||||||
@ -141,7 +141,7 @@ public class JournalController {
|
|||||||
@AOPLog
|
@AOPLog
|
||||||
@RequestRateLimit
|
@RequestRateLimit
|
||||||
@RequestMapping("/list")
|
@RequestMapping("/list")
|
||||||
public PageResult<JournalResponse> list(@RequestBody JournalPage page) {
|
public PageResult<JournalResponse> list(@RequestBody PreviewPage<Journal> page) {
|
||||||
PageResult<Journal> pageResult = service.page(page);
|
PageResult<Journal> pageResult = service.page(page);
|
||||||
|
|
||||||
PageResult<JournalResponse> result = new PageResult<>();
|
PageResult<JournalResponse> result = new PageResult<>();
|
||||||
|
|||||||
@ -3,9 +3,9 @@ package com.imyeyu.api.modules.journal.service;
|
|||||||
import com.imyeyu.api.modules.common.entity.Attachment;
|
import com.imyeyu.api.modules.common.entity.Attachment;
|
||||||
import com.imyeyu.api.modules.journal.bean.Travel;
|
import com.imyeyu.api.modules.journal.bean.Travel;
|
||||||
import com.imyeyu.api.modules.journal.entity.Journal;
|
import com.imyeyu.api.modules.journal.entity.Journal;
|
||||||
import com.imyeyu.api.modules.journal.vo.ArchiveRequest;
|
import com.imyeyu.api.modules.journal.vo.journal.ArchiveRequest;
|
||||||
import com.imyeyu.api.modules.journal.vo.JournalRequest;
|
import com.imyeyu.api.modules.journal.vo.journal.JournalRequest;
|
||||||
import com.imyeyu.api.modules.journal.vo.UpdateRequest;
|
import com.imyeyu.api.modules.journal.vo.journal.UpdateRequest;
|
||||||
import com.imyeyu.java.bean.timi.TimiException;
|
import com.imyeyu.java.bean.timi.TimiException;
|
||||||
import com.imyeyu.spring.service.DeletableService;
|
import com.imyeyu.spring.service.DeletableService;
|
||||||
import com.imyeyu.spring.service.GettableService;
|
import com.imyeyu.spring.service.GettableService;
|
||||||
|
|||||||
@ -10,14 +10,13 @@ import com.imyeyu.api.modules.common.entity.Setting;
|
|||||||
import com.imyeyu.api.modules.common.service.AttachmentService;
|
import com.imyeyu.api.modules.common.service.AttachmentService;
|
||||||
import com.imyeyu.api.modules.common.service.SettingService;
|
import com.imyeyu.api.modules.common.service.SettingService;
|
||||||
import com.imyeyu.api.modules.common.service.TempFileService;
|
import com.imyeyu.api.modules.common.service.TempFileService;
|
||||||
import com.imyeyu.api.modules.common.vo.attachment.AttachmentRequest;
|
|
||||||
import com.imyeyu.api.modules.journal.bean.Travel;
|
import com.imyeyu.api.modules.journal.bean.Travel;
|
||||||
import com.imyeyu.api.modules.journal.entity.Journal;
|
import com.imyeyu.api.modules.journal.entity.Journal;
|
||||||
import com.imyeyu.api.modules.journal.mapper.JournalMapper;
|
import com.imyeyu.api.modules.journal.mapper.JournalMapper;
|
||||||
import com.imyeyu.api.modules.journal.service.JournalService;
|
import com.imyeyu.api.modules.journal.service.JournalService;
|
||||||
import com.imyeyu.api.modules.journal.vo.ArchiveRequest;
|
import com.imyeyu.api.modules.journal.vo.journal.ArchiveRequest;
|
||||||
import com.imyeyu.api.modules.journal.vo.JournalRequest;
|
import com.imyeyu.api.modules.journal.vo.journal.JournalRequest;
|
||||||
import com.imyeyu.api.modules.journal.vo.UpdateRequest;
|
import com.imyeyu.api.modules.journal.vo.journal.UpdateRequest;
|
||||||
import com.imyeyu.io.IO;
|
import com.imyeyu.io.IO;
|
||||||
import com.imyeyu.java.TimiJava;
|
import com.imyeyu.java.TimiJava;
|
||||||
import com.imyeyu.java.bean.timi.TimiCode;
|
import com.imyeyu.java.bean.timi.TimiCode;
|
||||||
@ -75,7 +74,7 @@ public class JournalServiceImplement extends AbstractEntityService<Journal, Long
|
|||||||
TempFileMetaData metadata = tempFileService.metadata(tempFileIds[i]);
|
TempFileMetaData metadata = tempFileService.metadata(tempFileIds[i]);
|
||||||
File file = tempFileService.get(tempFileIds[i]);
|
File file = tempFileService.get(tempFileIds[i]);
|
||||||
|
|
||||||
AttachmentRequest sourceAttach = new AttachmentRequest();
|
Attachment sourceAttach = new Attachment();
|
||||||
sourceAttach.setName(metadata.getOriginalName());
|
sourceAttach.setName(metadata.getOriginalName());
|
||||||
sourceAttach.setBizType(Attachment.BizType.JOURNAL);
|
sourceAttach.setBizType(Attachment.BizType.JOURNAL);
|
||||||
sourceAttach.setBizId(journal.getId());
|
sourceAttach.setBizId(journal.getId());
|
||||||
@ -92,39 +91,30 @@ public class JournalServiceImplement extends AbstractEntityService<Journal, Long
|
|||||||
@Override
|
@Override
|
||||||
public void update(UpdateRequest request) throws TimiException {
|
public void update(UpdateRequest request) throws TimiException {
|
||||||
TimiException.required(request.getId(), "not found request.id");
|
TimiException.required(request.getId(), "not found request.id");
|
||||||
try {
|
Journal journal = get(request.getId());
|
||||||
Journal journal = get(request.getId());
|
BeanUtils.copyProperties(request, journal);
|
||||||
BeanUtils.copyProperties(request, journal);
|
super.update(journal);
|
||||||
super.update(journal);
|
|
||||||
|
|
||||||
// 删除
|
// 删除
|
||||||
Set<Long> dbAttachSet = attachmentService.listByBizId(Attachment.BizType.JOURNAL, journal.getId(), MediaAttach.Type.THUMB)
|
Set<Long> dbAttachSet = attachmentService.listByBizId(Attachment.BizType.JOURNAL, journal.getId(), MediaAttach.Type.THUMB)
|
||||||
.stream()
|
.stream()
|
||||||
.map(Attachment::getId)
|
.map(Attachment::getId)
|
||||||
.collect(Collectors.toSet());
|
.collect(Collectors.toSet());
|
||||||
Set<Long> retainIds = Set.of(TimiJava.firstNotEmpty(request.getAttachmentIds(), new Long[0]));
|
Set<Long> retainIds = Set.of(TimiJava.firstNotEmpty(request.getAttachmentIds(), new Long[0]));
|
||||||
dbAttachSet.removeAll(retainIds);
|
dbAttachSet.removeAll(retainIds);
|
||||||
for (Long removeId : dbAttachSet) {
|
for (Long removeId : dbAttachSet) {
|
||||||
attachmentService.deleteMedia(removeId);
|
attachmentService.deleteMedia(removeId);
|
||||||
}
|
}
|
||||||
// 新增
|
// 新增
|
||||||
String[] tempFileIds = request.getTempFileIds();
|
for (String tempFileId : TimiJava.firstNotNull(request.getTempFileIds(), new String[0])) {
|
||||||
if (TimiJava.isNotEmpty(tempFileIds)) {
|
TempFileMetaData metadata = tempFileService.metadata(tempFileId);
|
||||||
for (int i = 0; i < tempFileIds.length; i++) {
|
|
||||||
TempFileMetaData metadata = tempFileService.metadata(tempFileIds[i]);
|
|
||||||
File file = tempFileService.get(tempFileIds[i]);
|
|
||||||
|
|
||||||
AttachmentRequest sourceAttach = new AttachmentRequest();
|
Attachment sourceAttach = new Attachment();
|
||||||
sourceAttach.setName(metadata.getOriginalName());
|
sourceAttach.setName(metadata.getOriginalName());
|
||||||
sourceAttach.setBizType(Attachment.BizType.JOURNAL);
|
sourceAttach.setBizType(Attachment.BizType.JOURNAL);
|
||||||
sourceAttach.setBizId(journal.getId());
|
sourceAttach.setBizId(journal.getId());
|
||||||
sourceAttach.setInputStream(IO.getInputStream(file));
|
sourceAttach.setInputStream(tempFileService.getInputStream(tempFileId));
|
||||||
attachmentService.createMedia(sourceAttach);
|
attachmentService.createMedia(sourceAttach);
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("update journal error", e);
|
|
||||||
throw new TimiException(TimiCode.ERROR).msgKey("TODO update journal error");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -163,7 +153,7 @@ public class JournalServiceImplement extends AbstractEntityService<Journal, Long
|
|||||||
TempFileMetaData metadata = tempFileService.metadata(tempFileIds[i]);
|
TempFileMetaData metadata = tempFileService.metadata(tempFileIds[i]);
|
||||||
File file = tempFileService.get(tempFileIds[i]);
|
File file = tempFileService.get(tempFileIds[i]);
|
||||||
|
|
||||||
AttachmentRequest sourceAttach = new AttachmentRequest();
|
Attachment sourceAttach = new Attachment();
|
||||||
sourceAttach.setName(metadata.getOriginalName());
|
sourceAttach.setName(metadata.getOriginalName());
|
||||||
sourceAttach.setBizType(Attachment.BizType.JOURNAL_MOMENT);
|
sourceAttach.setBizType(Attachment.BizType.JOURNAL_MOMENT);
|
||||||
sourceAttach.setBizId(0L);
|
sourceAttach.setBizId(0L);
|
||||||
|
|||||||
@ -1,34 +0,0 @@
|
|||||||
package com.imyeyu.api.modules.journal.vo;
|
|
||||||
|
|
||||||
import com.imyeyu.api.modules.journal.entity.Journal;
|
|
||||||
import com.imyeyu.spring.bean.Page;
|
|
||||||
import jakarta.validation.Valid;
|
|
||||||
import jakarta.validation.constraints.NotNull;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author 夜雨
|
|
||||||
* @since 2025-10-09 18:48
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@Valid
|
|
||||||
@EqualsAndHashCode(callSuper = true)
|
|
||||||
public class JournalPage extends Page<Journal> {
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @author 夜雨
|
|
||||||
* @since 2025-12-08 16:01
|
|
||||||
*/
|
|
||||||
public enum Type {
|
|
||||||
|
|
||||||
NORMAL,
|
|
||||||
|
|
||||||
PREVIEW
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private Type type;
|
|
||||||
}
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package com.imyeyu.api.modules.journal.vo;
|
package com.imyeyu.api.modules.journal.vo.journal;
|
||||||
|
|
||||||
import com.imyeyu.api.modules.journal.entity.Journal;
|
import com.imyeyu.api.modules.journal.entity.Journal;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package com.imyeyu.api.modules.journal.vo;
|
package com.imyeyu.api.modules.journal.vo.journal;
|
||||||
|
|
||||||
import com.imyeyu.api.modules.journal.entity.Journal;
|
import com.imyeyu.api.modules.journal.entity.Journal;
|
||||||
import com.imyeyu.spring.annotation.table.Transient;
|
import com.imyeyu.spring.annotation.table.Transient;
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package com.imyeyu.api.modules.journal.vo;
|
package com.imyeyu.api.modules.journal.vo.journal;
|
||||||
|
|
||||||
import com.imyeyu.api.modules.common.entity.Attachment;
|
import com.imyeyu.api.modules.common.entity.Attachment;
|
||||||
import com.imyeyu.api.modules.journal.entity.Journal;
|
import com.imyeyu.api.modules.journal.entity.Journal;
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package com.imyeyu.api.modules.journal.vo;
|
package com.imyeyu.api.modules.journal.vo.journal;
|
||||||
|
|
||||||
import com.imyeyu.api.modules.journal.entity.Journal;
|
import com.imyeyu.api.modules.journal.entity.Journal;
|
||||||
import com.imyeyu.spring.annotation.table.Transient;
|
import com.imyeyu.spring.annotation.table.Transient;
|
||||||
20
src/main/resources/mapper/journal/TravelLocationMapper.xml
Normal file
20
src/main/resources/mapper/journal/TravelLocationMapper.xml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<?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.imyeyu.api.modules.journal.mapper.TravelLocationMapper">
|
||||||
|
<sql id="table">travel_location</sql>
|
||||||
|
<select id="listByIds" resultType="com.imyeyu.api.modules.journal.entity.TravelLocation">
|
||||||
|
SELECT
|
||||||
|
*
|
||||||
|
FROM
|
||||||
|
<include refid="table" />
|
||||||
|
WHERE
|
||||||
|
1 = 1
|
||||||
|
<if test="ids != null and 0 < ids.length">
|
||||||
|
AND `id` IN
|
||||||
|
<foreach collection="ids" item="id" open="(" separator="," close=")">
|
||||||
|
#{id}
|
||||||
|
</foreach>
|
||||||
|
</if>
|
||||||
|
AND deleted_at IS NULL
|
||||||
|
</select>
|
||||||
|
</mapper>
|
||||||
Reference in New Issue
Block a user