From c889a9fdc6e9f47543a82680d28d6bb99f8ee888 Mon Sep 17 00:00:00 2001 From: zhongzb <972627721@qq.com> Date: Wed, 28 Jun 2023 23:25:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=A2=9E=E5=8A=A0=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=A4=9A=E7=A7=8D=E6=B6=88=E6=81=AF=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/mallchat.sql | 2 +- mallchat-common/pom.xml | 6 +- .../chat/domain/entity/msg/FileMsgDTO.java | 31 ++++ .../chat/domain/entity/msg/ImgMsgDTO.java | 41 +++++ .../chat/domain/entity/msg/MessageExtra.java | 8 + .../chat/domain/entity/msg/SoundMsgDTO.java | 30 ++++ .../chat/domain/entity/msg/VideoMsgDTO.java | 46 +++++ .../chat/domain/enums/MessageTypeEnum.java | 6 +- .../common/config/MinIOConfiguration.java | 36 ++++ .../common/common/service/LockService.java | 21 ++- .../common/utils/SensitiveWordUtils.java | 2 +- .../common/utils/oss/MinIOTemplate.java | 163 ++++++++++++++++++ .../common/common/utils/oss/OssFile.java | 17 ++ .../common/utils/oss/OssProperties.java | 39 +++++ .../common/common/utils/oss/OssType.java | 39 +++++ .../common/utils/oss/domain/OssReq.java | 29 ++++ .../common/utils/oss/domain/OssResp.java | 26 +++ .../impl/SensitiveWordServiceImpl.java | 2 +- .../main/resources/application-pro.properties | 9 +- .../resources/application-test.properties | 9 +- .../chat/controller/ChatController.java | 32 +--- .../domain/vo/request/ChatMessageReq.java | 2 + .../chat/service/adapter/MessageAdapter.java | 1 + .../strategy/mark/DisLikeStrategy.java | 5 - .../service/strategy/msg/FileMsgHandler.java | 54 ++++++ .../service/strategy/msg/ImgMsgHandler.java | 54 ++++++ .../service/strategy/msg/SoundMsgHandler.java | 54 ++++++ .../service/strategy/msg/TextMsgHandler.java | 6 +- .../service/strategy/msg/VideoMsgHandler.java | 54 ++++++ .../custom/user/controller/OssController.java | 34 ++++ .../user/domain/enums/OssSceneEnum.java | 35 ++++ .../domain/vo/request/oss/UploadUrlReq.java | 29 ++++ .../custom/user/service/OssService.java | 20 +++ .../user/service/impl/OssServiceImpl.java | 35 ++++ pom.xml | 18 +- 35 files changed, 946 insertions(+), 49 deletions(-) create mode 100644 mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/FileMsgDTO.java create mode 100644 mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/ImgMsgDTO.java create mode 100644 mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/SoundMsgDTO.java create mode 100644 mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/VideoMsgDTO.java create mode 100644 mallchat-common/src/main/java/com/abin/mallchat/common/common/config/MinIOConfiguration.java create mode 100644 mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/MinIOTemplate.java create mode 100644 mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/OssFile.java create mode 100644 mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/OssProperties.java create mode 100644 mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/OssType.java create mode 100644 mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/domain/OssReq.java create mode 100644 mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/domain/OssResp.java create mode 100644 mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/msg/FileMsgHandler.java create mode 100644 mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/msg/ImgMsgHandler.java create mode 100644 mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/msg/SoundMsgHandler.java create mode 100644 mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/msg/VideoMsgHandler.java create mode 100644 mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/controller/OssController.java create mode 100644 mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/domain/enums/OssSceneEnum.java create mode 100644 mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/domain/vo/request/oss/UploadUrlReq.java create mode 100644 mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/service/OssService.java create mode 100644 mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/service/impl/OssServiceImpl.java diff --git a/docs/mallchat.sql b/docs/mallchat.sql index 91491cd..3a21d4b 100644 --- a/docs/mallchat.sql +++ b/docs/mallchat.sql @@ -25,7 +25,7 @@ INSERT INTO `item_config` VALUES (2, 2, 'https://cdn-icons-png.flaticon.com/128/ INSERT INTO `item_config` VALUES (3, 2, 'https://cdn-icons-png.flaticon.com/512/6198/6198527.png ', '抹茶聊天前10名注册的用户才能获得的专属徽章', '2023-05-07 17:50:31.100', '2023-05-07 18:12:01.448'); INSERT INTO `item_config` VALUES (4, 2, 'https://cdn-icons-png.flaticon.com/512/10232/10232583.png', '抹茶聊天前100名注册的用户才能获得的专属徽章', '2023-05-07 17:50:31.109', '2023-05-07 17:56:36.059'); INSERT INTO `item_config` VALUES (5, 2, 'https://cdn-icons-png.flaticon.com/128/2909/2909937.png', '抹茶知识星球成员的专属徽章', '2023-05-07 17:50:31.109', '2023-05-07 17:56:36.059'); -INSERT INTO `item_config` VALUES (6, 2, 'https://s2.loli.net/2023/06/15/O9FwjH4ciAuMSnL.png', '抹茶项目contributor专属徽章', '2023-05-07 17:50:31.109', '2023-05-07 17:56:36.059'); +INSERT INTO `item_config` VALUES (6, 2, 'https://minio.mallchat.cn/mallchat/%E8%B4%A1%E7%8C%AE%E8%80%85.png', '抹茶项目contributor专属徽章', '2023-05-07 17:50:31.109', '2023-05-07 17:56:36.059'); -- ---------------------------- -- Table structure for message diff --git a/mallchat-common/pom.xml b/mallchat-common/pom.xml index f97a2e2..b171007 100644 --- a/mallchat-common/pom.xml +++ b/mallchat-common/pom.xml @@ -112,9 +112,11 @@ org.redisson redisson-spring-boot-starter - 3.17.1 - + + io.minio + minio + junit diff --git a/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/FileMsgDTO.java b/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/FileMsgDTO.java new file mode 100644 index 0000000..d030c6d --- /dev/null +++ b/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/FileMsgDTO.java @@ -0,0 +1,31 @@ +package com.abin.mallchat.common.chat.domain.entity.msg; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * Description: 语音消息入参 + * Author: abin + * Date: 2023-06-04 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class FileMsgDTO implements Serializable { + private static final long serialVersionUID = 1L; + @ApiModelProperty("大小(字节)") + private Long size; + + @ApiModelProperty("下载地址") + private String url; + + @ApiModelProperty("文件名(带后缀)") + private String fileName; + +} diff --git a/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/ImgMsgDTO.java b/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/ImgMsgDTO.java new file mode 100644 index 0000000..cfa901f --- /dev/null +++ b/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/ImgMsgDTO.java @@ -0,0 +1,41 @@ +package com.abin.mallchat.common.chat.domain.entity.msg; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * Description: 图片消息入参 + * Author: abin + * Date: 2023-06-04 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ImgMsgDTO implements Serializable { + private static final long serialVersionUID = 1L; + @ApiModelProperty("大小(字节)") + @NotNull + private Long size; + + @ApiModelProperty("宽度(像素)") + @NotNull + private Integer width; + + @ApiModelProperty("高度(像素)") + @NotNull + private Integer height; + + @ApiModelProperty("下载地址") + @NotBlank + private String url; +} + + diff --git a/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/MessageExtra.java b/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/MessageExtra.java index 32c04c1..9a68c74 100644 --- a/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/MessageExtra.java +++ b/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/MessageExtra.java @@ -28,4 +28,12 @@ public class MessageExtra implements Serializable { private MsgRecall recall; //艾特的uid private List atUidList; + //文件消息 + private FileMsgDTO fileMsg; + //图片消息 + private ImgMsgDTO imgMsgDTO; + //语音消息 + private SoundMsgDTO soundMsgDTO; + //文件消息 + private VideoMsgDTO videoMsgDTO; } diff --git a/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/SoundMsgDTO.java b/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/SoundMsgDTO.java new file mode 100644 index 0000000..2b2fac9 --- /dev/null +++ b/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/SoundMsgDTO.java @@ -0,0 +1,30 @@ +package com.abin.mallchat.common.chat.domain.entity.msg; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * Description: 语音消息入参 + * Author: abin + * Date: 2023-06-04 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SoundMsgDTO implements Serializable { + private static final long serialVersionUID = 1L; + @ApiModelProperty("大小(字节)") + private Long size; + + @ApiModelProperty("时长(秒)") + private Integer second; + + @ApiModelProperty("下载地址") + private String url; +} diff --git a/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/VideoMsgDTO.java b/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/VideoMsgDTO.java new file mode 100644 index 0000000..0fcf2ba --- /dev/null +++ b/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/VideoMsgDTO.java @@ -0,0 +1,46 @@ +package com.abin.mallchat.common.chat.domain.entity.msg; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * Description: 视频消息入参 + * Author: abin + * Date: 2023-06-04 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class VideoMsgDTO implements Serializable { + private static final long serialVersionUID = 1L; + @ApiModelProperty("大小(字节)") + private Long size; + + @ApiModelProperty("下载地址") + private String url; + + @ApiModelProperty("缩略图宽度(像素)") + @NotNull + private Integer thumbWidth = BigDecimal.ROUND_HALF_DOWN; + + @ApiModelProperty("缩略图高度(像素)") + @NotNull + private Integer thumbHeight; + + @ApiModelProperty("缩略图大小(字节)") + private Long thumbSize; + + @ApiModelProperty("缩略图下载地址") + @NotBlank + private String thumbUrl; + +} diff --git a/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/enums/MessageTypeEnum.java b/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/enums/MessageTypeEnum.java index db08546..cc262a9 100644 --- a/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/enums/MessageTypeEnum.java +++ b/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/enums/MessageTypeEnum.java @@ -16,8 +16,12 @@ import java.util.stream.Collectors; @AllArgsConstructor @Getter public enum MessageTypeEnum { - TEXT(1, "正常"), + TEXT(1, "正常消息"), RECALL(2, "撤回消息"), + IMG(3, "图片"), + FILE(4, "文件"), + SOUND(5, "语音"), + VIDEO(6, "视频"), ; private final Integer type; diff --git a/mallchat-common/src/main/java/com/abin/mallchat/common/common/config/MinIOConfiguration.java b/mallchat-common/src/main/java/com/abin/mallchat/common/common/config/MinIOConfiguration.java new file mode 100644 index 0000000..00bb615 --- /dev/null +++ b/mallchat-common/src/main/java/com/abin/mallchat/common/common/config/MinIOConfiguration.java @@ -0,0 +1,36 @@ +package com.abin.mallchat.common.common.config; + +import com.abin.mallchat.common.common.utils.oss.MinIOTemplate; +import com.abin.mallchat.common.common.utils.oss.OssProperties; +import io.minio.MinioClient; +import lombok.SneakyThrows; +import org.springframework.boot.autoconfigure.condition.*; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration(proxyBeanMethods = false) +@ConditionalOnClass({MinioClient.class}) +@EnableConfigurationProperties(OssProperties.class) +@ConditionalOnExpression("${oss.enabled}") +@ConditionalOnProperty(value = "oss.type", havingValue = "minio") +public class MinIOConfiguration { + + + @Bean + @SneakyThrows + @ConditionalOnMissingBean(MinioClient.class) + public MinioClient minioClient(OssProperties ossProperties) { + return MinioClient.builder() + .endpoint(ossProperties.getEndpoint()) + .credentials(ossProperties.getAccessKey(), ossProperties.getSecretKey()) + .build(); + } + + @Bean + @ConditionalOnBean({MinioClient.class}) + @ConditionalOnMissingBean(MinIOTemplate.class) + public MinIOTemplate minioTemplate(MinioClient minioClient, OssProperties ossProperties) { + return new MinIOTemplate(minioClient, ossProperties); + } +} \ No newline at end of file diff --git a/mallchat-common/src/main/java/com/abin/mallchat/common/common/service/LockService.java b/mallchat-common/src/main/java/com/abin/mallchat/common/common/service/LockService.java index aa8e2bb..d32872e 100644 --- a/mallchat-common/src/main/java/com/abin/mallchat/common/common/service/LockService.java +++ b/mallchat-common/src/main/java/com/abin/mallchat/common/common/service/LockService.java @@ -9,6 +9,8 @@ import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Arrays; +import java.util.List; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; @@ -28,7 +30,9 @@ public class LockService { try { return supplier.get();//执行锁内的代码逻辑 } finally { - lock.unlock(); + if (lock.isLocked() && lock.isHeldByCurrentThread()) { + lock.unlock(); + } } } @@ -37,6 +41,10 @@ public class LockService { return executeWithLockThrows(key, waitTime, unit, supplier::get); } + public T executeWithLock(String key, Supplier supplier) { + return executeWithLock(key, -1, TimeUnit.MILLISECONDS, supplier); + } + @FunctionalInterface public interface SupplierThrow { @@ -47,4 +55,15 @@ public class LockService { */ T get() throws Throwable; } + + + public static void main(String[] args) { + List sensitiveList = Arrays.asList("abcd", "abcbba", "adabca"); + String text = "abcdefg"; + for (String s : sensitiveList) { + boolean hit = text.contains(s); + System.out.println(hit); + } + + } } \ No newline at end of file diff --git a/mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/SensitiveWordUtils.java b/mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/SensitiveWordUtils.java index 336da93..298f876 100644 --- a/mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/SensitiveWordUtils.java +++ b/mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/SensitiveWordUtils.java @@ -1,7 +1,7 @@ package com.abin.mallchat.common.common.utils; -import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.springframework.util.CollectionUtils; import java.io.BufferedReader; import java.io.IOException; diff --git a/mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/MinIOTemplate.java b/mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/MinIOTemplate.java new file mode 100644 index 0000000..f49a5fa --- /dev/null +++ b/mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/MinIOTemplate.java @@ -0,0 +1,163 @@ +package com.abin.mallchat.common.common.utils.oss; + +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.file.FileNameUtil; +import cn.hutool.core.util.StrUtil; +import com.abin.mallchat.common.common.utils.oss.domain.OssReq; +import com.abin.mallchat.common.common.utils.oss.domain.OssResp; +import io.minio.*; +import io.minio.http.Method; +import io.minio.messages.Bucket; +import io.minio.messages.Item; +import lombok.AllArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +import java.io.InputStream; +import java.time.ZonedDateTime; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +@Slf4j +@AllArgsConstructor +public class MinIOTemplate { + + /** + * MinIO 客户端 + */ + MinioClient minioClient; + + /** + * MinIO 配置类 + */ + OssProperties ossProperties; + + /** + * 查询所有存储桶 + * + * @return Bucket 集合 + */ + @SneakyThrows + public List listBuckets() { + return minioClient.listBuckets(); + } + + /** + * 桶是否存在 + * + * @param bucketName 桶名 + * @return 是否存在 + */ + @SneakyThrows + public boolean bucketExists(String bucketName) { + return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); + } + + /** + * 创建存储桶 + * + * @param bucketName 桶名 + */ + @SneakyThrows + public void makeBucket(String bucketName) { + if (!bucketExists(bucketName)) { + minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); + + } + } + + /** + * 删除一个空桶 如果存储桶存在对象不为空时,删除会报错。 + * + * @param bucketName 桶名 + */ + @SneakyThrows + public void removeBucket(String bucketName) { + minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build()); + } + + /** + * 返回临时带签名、过期时间一天、Get请求方式的访问URL + */ + @SneakyThrows + public OssResp getPreSignedObjectUrl(OssReq req) { + String absolutePath = req.isAutoPath() ? generateAutoPath(req) : req.getFilePath() + StrUtil.SLASH + req.getFileName(); + String url = minioClient.getPresignedObjectUrl( + GetPresignedObjectUrlArgs.builder() + .method(Method.PUT) + .bucket(ossProperties.getBucketName()) + .object(absolutePath) + .expiry(60 * 60 * 24) + .build()); + return OssResp.builder() + .uploadUrl(url) + .downloadUrl(getDownloadUrl(ossProperties.getBucketName(), absolutePath)) + .build(); + } + + private String getDownloadUrl(String bucket, String pathFile) { + return ossProperties.getEndpoint() + StrUtil.SLASH + bucket + pathFile; + } + + /** + * GetObject接口用于获取某个文件(Object)。此操作需要对此Object具有读权限。 + * + * @param bucketName 桶名 + * @param ossFilePath Oss文件路径 + */ + @SneakyThrows + public InputStream getObject(String bucketName, String ossFilePath) { + return minioClient.getObject( + GetObjectArgs.builder().bucket(bucketName).object(ossFilePath).build()); + } + + /** + * 查询桶的对象信息 + * + * @param bucketName 桶名 + * @param recursive 是否递归查询 + * @return + */ + @SneakyThrows + public Iterable> listObjects(String bucketName, boolean recursive) { + return minioClient.listObjects( + ListObjectsArgs.builder().bucket(bucketName).recursive(recursive).build()); + } + + /** + * 生成随机文件名,防止重复 + * + * @return + */ + public String generateAutoPath(OssReq req) { + String uid = Optional.ofNullable(req.getUid()).map(String::valueOf).orElse("000000"); + cn.hutool.core.lang.UUID uuid = cn.hutool.core.lang.UUID.fastUUID(); + String suffix = FileNameUtil.getSuffix(req.getFileName()); + String year = DateUtil.format(new Date(), DatePattern.NORM_YEAR_PATTERN); + return req.getFilePath() + StrUtil.SLASH + year + StrUtil.SLASH + uid + StrUtil.SLASH + uuid + StrUtil.DOT + suffix; + } + + /** + * 获取带签名的临时上传元数据对象,前端可获取后,直接上传到Minio + * + * @param bucketName + * @param fileName + * @return + */ + @SneakyThrows + public Map getPreSignedPostFormData(String bucketName, String fileName) { + // 为存储桶创建一个上传策略,过期时间为7天 + PostPolicy policy = new PostPolicy(bucketName, ZonedDateTime.now().plusDays(7)); + // 设置一个参数key,值为上传对象的名称 + policy.addEqualsCondition("key", fileName); + // 添加Content-Type以"image/"开头,表示只能上传照片 + policy.addStartsWithCondition("Content-Type", "image/"); + // 设置上传文件的大小 64kiB to 10MiB. + policy.addContentLengthRangeCondition(64 * 1024, 10 * 1024 * 1024); + return minioClient.getPresignedPostFormData(policy); + } + +} diff --git a/mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/OssFile.java b/mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/OssFile.java new file mode 100644 index 0000000..469de40 --- /dev/null +++ b/mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/OssFile.java @@ -0,0 +1,17 @@ +package com.abin.mallchat.common.common.utils.oss; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class OssFile { + /** + * OSS 存储时文件路径 + */ + String ossFilePath; + /** + * 原始文件名 + */ + String originalFileName; +} \ No newline at end of file diff --git a/mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/OssProperties.java b/mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/OssProperties.java new file mode 100644 index 0000000..50d521e --- /dev/null +++ b/mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/OssProperties.java @@ -0,0 +1,39 @@ +package com.abin.mallchat.common.common.utils.oss; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +@Data +@ConfigurationProperties(prefix = "oss") +public class OssProperties { + + /** + * 是否开启 + */ + Boolean enabled; + + /** + * 存储对象服务器类型 + */ + OssType type; + + /** + * OSS 访问端点,集群时需提供统一入口 + */ + String endpoint; + + /** + * 用户名 + */ + String accessKey; + + /** + * 密码 + */ + String secretKey; + + /** + * 存储桶 + */ + String bucketName; +} diff --git a/mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/OssType.java b/mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/OssType.java new file mode 100644 index 0000000..f424fcb --- /dev/null +++ b/mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/OssType.java @@ -0,0 +1,39 @@ +package com.abin.mallchat.common.common.utils.oss; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum OssType { + /** + * Minio 对象存储 + */ + MINIO("minio", 1), + + /** + * 华为 OBS + */ + OBS("obs", 2), + + /** + * 腾讯 COS + */ + COS("tencent", 3), + + /** + * 阿里巴巴 SSO + */ + ALIBABA("alibaba", 4), + ; + + /** + * 名称 + */ + final String name; + /** + * 类型 + */ + final int type; + +} diff --git a/mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/domain/OssReq.java b/mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/domain/OssReq.java new file mode 100644 index 0000000..8c9f49b --- /dev/null +++ b/mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/domain/OssReq.java @@ -0,0 +1,29 @@ +package com.abin.mallchat.common.common.utils.oss.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + + +/** + * Description: 上传url请求入参 + * Author: abin + * Date: 2023-03-23 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class OssReq { + @ApiModelProperty(value = "文件存储路径") + private String filePath; + @ApiModelProperty(value = "文件名") + private String fileName; + @ApiModelProperty(value = "请求的uid") + private Long uid; + @ApiModelProperty(value = "自动生成地址") + @Builder.Default + private boolean autoPath = true; +} diff --git a/mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/domain/OssResp.java b/mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/domain/OssResp.java new file mode 100644 index 0000000..41c4f58 --- /dev/null +++ b/mallchat-common/src/main/java/com/abin/mallchat/common/common/utils/oss/domain/OssResp.java @@ -0,0 +1,26 @@ +package com.abin.mallchat.common.common.utils.oss.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + + +/** + * Description: 上传url请求出参 + * Author: abin + * Date: 2023-03-23 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class OssResp { + + @ApiModelProperty(value = "上传的临时url") + private String uploadUrl; + + @ApiModelProperty(value = "成功后能够下载的url") + private String downloadUrl; +} diff --git a/mallchat-common/src/main/java/com/abin/mallchat/common/sensitive/service/impl/SensitiveWordServiceImpl.java b/mallchat-common/src/main/java/com/abin/mallchat/common/sensitive/service/impl/SensitiveWordServiceImpl.java index 19bab7a..d7fd50f 100644 --- a/mallchat-common/src/main/java/com/abin/mallchat/common/sensitive/service/impl/SensitiveWordServiceImpl.java +++ b/mallchat-common/src/main/java/com/abin/mallchat/common/sensitive/service/impl/SensitiveWordServiceImpl.java @@ -5,10 +5,10 @@ import com.abin.mallchat.common.sensitive.dao.SensitiveWordDao; import com.abin.mallchat.common.sensitive.domain.SensitiveWord; import com.abin.mallchat.common.sensitive.service.ISensitiveWordService; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import javax.annotation.PostConstruct; import java.util.List; diff --git a/mallchat-common/src/main/resources/application-pro.properties b/mallchat-common/src/main/resources/application-pro.properties index 0943abe..3b71009 100644 --- a/mallchat-common/src/main/resources/application-pro.properties +++ b/mallchat-common/src/main/resources/application-pro.properties @@ -18,4 +18,11 @@ mallchat.wx.secret=380bfc1c9147fdsf4sf07 # 接口配置里的Token值 mallchat.wx.token=sdfsf # 接口配置里的EncodingAESKey值 -mallchat.wx.aesKey=sha1 \ No newline at end of file +mallchat.wx.aesKey=sha1 +##################OSS配置################## +oss.enabled=true +oss.type=minio +oss.endpoint=http://localhost:9000 +oss.access-key=BEZ213 +oss.secret-key=Ii4vCMIXuFfds1EZ8e7RXI2342342kV +oss.bucketName=default \ No newline at end of file diff --git a/mallchat-common/src/main/resources/application-test.properties b/mallchat-common/src/main/resources/application-test.properties index 0943abe..45e7793 100644 --- a/mallchat-common/src/main/resources/application-test.properties +++ b/mallchat-common/src/main/resources/application-test.properties @@ -18,4 +18,11 @@ mallchat.wx.secret=380bfc1c9147fdsf4sf07 # 接口配置里的Token值 mallchat.wx.token=sdfsf # 接口配置里的EncodingAESKey值 -mallchat.wx.aesKey=sha1 \ No newline at end of file +mallchat.wx.aesKey=sha1 +##################OSS配置################## +oss.enabled=true +oss.type=minio +oss.endpoint=http://localhost:9000 +oss.access-key=BEZ213 +oss.secret-key=Ii4vCMIXuFe241dsfEZ8e7RXI2342342kV +oss.bucketName=default \ No newline at end of file diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/controller/ChatController.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/controller/ChatController.java index ac0154e..a74ed2b 100644 --- a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/controller/ChatController.java +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/controller/ChatController.java @@ -15,7 +15,6 @@ import com.abin.mallchat.custom.user.service.impl.UserServiceImpl; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -23,7 +22,6 @@ import javax.validation.Valid; import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; /** *

@@ -59,20 +57,6 @@ public class ChatController { return ApiResult.success(memberPage); } - @GetMapping("/public/member/page/v1") - @ApiOperation("群成员列表/v1") - @FrequencyControl(time = 120, count = 20, target = FrequencyControl.Target.IP) - public ApiResult> getMemberPage1(@Valid CursorPageBaseReq request) { - CursorPageBaseResp memberPage = chatService.getMemberPage(request); - filterBlackMember(memberPage); - List collect = memberPage.getList().stream().map(a -> { - ChatMemberRespV1 v1 = new ChatMemberRespV1(); - BeanUtils.copyProperties(a, v1); - return v1; - }).collect(Collectors.toList()); - return ApiResult.success(CursorPageBaseResp.init(memberPage, collect)); - } - @GetMapping("/member/list") @ApiOperation("房间内的所有群成员列表-@专用") public ApiResult> getMemberList(@Valid ChatMessageMemberReq chatMessageMemberReq) { @@ -97,20 +81,6 @@ public class ChatController { @Autowired private UserServiceImpl userService; - @GetMapping("/public/msg/page/v1") - @ApiOperation("消息列表/v1") - @FrequencyControl(time = 120, count = 20, target = FrequencyControl.Target.IP) - public ApiResult> getMsgPage(@Valid ChatMessagePageReq request) { - CursorPageBaseResp msgPage = chatService.getMsgPage(request, RequestHolder.get().getUid()); - filterBlackMsg(msgPage); - List collect = msgPage.getList().stream().map(a -> { - ChatMessageRespV1 v1 = new ChatMessageRespV1(); - BeanUtils.copyProperties(a, v1); - return v1; - }).collect(Collectors.toList()); - return ApiResult.success(CursorPageBaseResp.init(msgPage, collect)); - } - @GetMapping("/public/msg/page") @ApiOperation("消息列表") @FrequencyControl(time = 120, count = 20, target = FrequencyControl.Target.IP) @@ -129,7 +99,7 @@ public class ChatController { @PostMapping("/msg") @ApiOperation("发送消息") - @FrequencyControl(time = 5, count = 2, target = FrequencyControl.Target.UID) + @FrequencyControl(time = 5, count = 3, target = FrequencyControl.Target.UID) @FrequencyControl(time = 30, count = 5, target = FrequencyControl.Target.UID) @FrequencyControl(time = 60, count = 10, target = FrequencyControl.Target.UID) public ApiResult sendMsg(@Valid @RequestBody ChatMessageReq request) { diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/domain/vo/request/ChatMessageReq.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/domain/vo/request/ChatMessageReq.java index ac3063d..a6a6095 100644 --- a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/domain/vo/request/ChatMessageReq.java +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/domain/vo/request/ChatMessageReq.java @@ -25,9 +25,11 @@ public class ChatMessageReq { private Long roomId; @ApiModelProperty("消息类型") + @NotNull private Integer msgType = MessageTypeEnum.TEXT.getType(); @ApiModelProperty("消息内容,类型不同传值不同,见https://www.yuque.com/snab/mallcaht/rkb2uz5k1qqdmcmd") + @NotNull private Object body; } diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/adapter/MessageAdapter.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/adapter/MessageAdapter.java index dd49ed8..53e10fa 100644 --- a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/adapter/MessageAdapter.java +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/adapter/MessageAdapter.java @@ -32,6 +32,7 @@ public class MessageAdapter { return Message.builder() .fromUid(uid) .roomId(request.getRoomId()) + .type(request.getMsgType()) .status(MessageStatusEnum.NORMAL.getStatus()) .build(); diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/mark/DisLikeStrategy.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/mark/DisLikeStrategy.java index 299881f..b848e1b 100644 --- a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/mark/DisLikeStrategy.java +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/mark/DisLikeStrategy.java @@ -1,8 +1,6 @@ package com.abin.mallchat.custom.chat.service.strategy.mark; import com.abin.mallchat.common.chat.domain.enums.MessageMarkTypeEnum; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; /** @@ -12,9 +10,6 @@ import org.springframework.stereotype.Component; */ @Component public class DisLikeStrategy extends AbstractMsgMarkStrategy { - @Autowired - @Lazy - private LikeStrategy likeStrategy; @Override protected MessageMarkTypeEnum getTypeEnum() { diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/msg/FileMsgHandler.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/msg/FileMsgHandler.java new file mode 100644 index 0000000..529c3bf --- /dev/null +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/msg/FileMsgHandler.java @@ -0,0 +1,54 @@ +package com.abin.mallchat.custom.chat.service.strategy.msg; + +import cn.hutool.core.bean.BeanUtil; +import com.abin.mallchat.common.chat.dao.MessageDao; +import com.abin.mallchat.common.chat.domain.entity.Message; +import com.abin.mallchat.common.chat.domain.entity.msg.FileMsgDTO; +import com.abin.mallchat.common.chat.domain.entity.msg.MessageExtra; +import com.abin.mallchat.common.chat.domain.enums.MessageTypeEnum; +import com.abin.mallchat.custom.chat.domain.vo.request.ChatMessageReq; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Optional; + +/** + * Description:图片消息 + * Author: abin + * Date: 2023-06-04 + */ +@Component +public class FileMsgHandler extends AbstractMsgHandler { + @Autowired + private MessageDao messageDao; + + @Override + MessageTypeEnum getMsgTypeEnum() { + return MessageTypeEnum.FILE; + } + + @Override + public void checkMsg(ChatMessageReq request, Long uid) { + } + + @Override + public void saveMsg(Message msg, ChatMessageReq request) { + FileMsgDTO body = BeanUtil.toBean(request.getBody(), FileMsgDTO.class); + MessageExtra extra = Optional.ofNullable(msg.getExtra()).orElse(new MessageExtra()); + Message update = new Message(); + update.setId(msg.getId()); + update.setExtra(extra); + extra.setFileMsg(body); + messageDao.updateById(update); + } + + @Override + public Object showMsg(Message msg) { + return msg.getExtra().getFileMsg(); + } + + @Override + public Object showReplyMsg(Message msg) { + return "文件:" + msg.getExtra().getFileMsg().getFileName(); + } +} diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/msg/ImgMsgHandler.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/msg/ImgMsgHandler.java new file mode 100644 index 0000000..91ae4f9 --- /dev/null +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/msg/ImgMsgHandler.java @@ -0,0 +1,54 @@ +package com.abin.mallchat.custom.chat.service.strategy.msg; + +import cn.hutool.core.bean.BeanUtil; +import com.abin.mallchat.common.chat.dao.MessageDao; +import com.abin.mallchat.common.chat.domain.entity.Message; +import com.abin.mallchat.common.chat.domain.entity.msg.ImgMsgDTO; +import com.abin.mallchat.common.chat.domain.entity.msg.MessageExtra; +import com.abin.mallchat.common.chat.domain.enums.MessageTypeEnum; +import com.abin.mallchat.custom.chat.domain.vo.request.ChatMessageReq; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Optional; + +/** + * Description:图片消息 + * Author: abin + * Date: 2023-06-04 + */ +@Component +public class ImgMsgHandler extends AbstractMsgHandler { + @Autowired + private MessageDao messageDao; + + @Override + MessageTypeEnum getMsgTypeEnum() { + return MessageTypeEnum.IMG; + } + + @Override + public void checkMsg(ChatMessageReq request, Long uid) { + } + + @Override + public void saveMsg(Message msg, ChatMessageReq request) { + ImgMsgDTO body = BeanUtil.toBean(request.getBody(), ImgMsgDTO.class); + MessageExtra extra = Optional.ofNullable(msg.getExtra()).orElse(new MessageExtra()); + Message update = new Message(); + update.setId(msg.getId()); + update.setExtra(extra); + extra.setImgMsgDTO(body); + messageDao.updateById(update); + } + + @Override + public Object showMsg(Message msg) { + return msg.getExtra().getImgMsgDTO(); + } + + @Override + public Object showReplyMsg(Message msg) { + return "图片"; + } +} diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/msg/SoundMsgHandler.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/msg/SoundMsgHandler.java new file mode 100644 index 0000000..84aae0d --- /dev/null +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/msg/SoundMsgHandler.java @@ -0,0 +1,54 @@ +package com.abin.mallchat.custom.chat.service.strategy.msg; + +import cn.hutool.core.bean.BeanUtil; +import com.abin.mallchat.common.chat.dao.MessageDao; +import com.abin.mallchat.common.chat.domain.entity.Message; +import com.abin.mallchat.common.chat.domain.entity.msg.MessageExtra; +import com.abin.mallchat.common.chat.domain.entity.msg.SoundMsgDTO; +import com.abin.mallchat.common.chat.domain.enums.MessageTypeEnum; +import com.abin.mallchat.custom.chat.domain.vo.request.ChatMessageReq; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Optional; + +/** + * Description:图片消息 + * Author: abin + * Date: 2023-06-04 + */ +@Component +public class SoundMsgHandler extends AbstractMsgHandler { + @Autowired + private MessageDao messageDao; + + @Override + MessageTypeEnum getMsgTypeEnum() { + return MessageTypeEnum.SOUND; + } + + @Override + public void checkMsg(ChatMessageReq request, Long uid) { + } + + @Override + public void saveMsg(Message msg, ChatMessageReq request) { + SoundMsgDTO body = BeanUtil.toBean(request.getBody(), SoundMsgDTO.class); + MessageExtra extra = Optional.ofNullable(msg.getExtra()).orElse(new MessageExtra()); + Message update = new Message(); + update.setId(msg.getId()); + update.setExtra(extra); + extra.setSoundMsgDTO(body); + messageDao.updateById(update); + } + + @Override + public Object showMsg(Message msg) { + return msg.getExtra().getFileMsg(); + } + + @Override + public Object showReplyMsg(Message msg) { + return "语音"; + } +} diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/msg/TextMsgHandler.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/msg/TextMsgHandler.java index 4ac036b..461ed88 100644 --- a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/msg/TextMsgHandler.java +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/msg/TextMsgHandler.java @@ -1,6 +1,7 @@ package com.abin.mallchat.custom.chat.service.strategy.msg; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; import com.abin.mallchat.common.chat.dao.MessageDao; import com.abin.mallchat.common.chat.domain.entity.Message; import com.abin.mallchat.common.chat.domain.entity.msg.MessageExtra; @@ -20,7 +21,6 @@ import com.abin.mallchat.custom.chat.domain.vo.request.ChatMessageReq; import com.abin.mallchat.custom.chat.domain.vo.request.msg.TextMsgReq; import com.abin.mallchat.custom.chat.domain.vo.response.msg.TextMsgResp; import com.abin.mallchat.custom.chat.service.adapter.MessageAdapter; -import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -65,7 +65,7 @@ public class TextMsgHandler extends AbstractMsgHandler { AssertUtil.isNotEmpty(replyMsg, "回复消息不存在"); AssertUtil.equal(replyMsg.getRoomId(), request.getRoomId(), "只能回复相同会话内的消息"); } - if (CollectionUtils.isNotEmpty(body.getAtUidList())) { + if (CollectionUtil.isNotEmpty(body.getAtUidList())) { AssertUtil.isTrue(body.getAtUidList().size() > 10, "一次别艾特这么多人"); List atUidList = body.getAtUidList(); Map batch = userInfoCache.getBatch(atUidList); @@ -96,7 +96,7 @@ public class TextMsgHandler extends AbstractMsgHandler { Map urlTitleMap = URL_TITLE_DISCOVER.getContentTitleMap(body.getContent()); extra.setUrlTitleMap(urlTitleMap); //艾特功能 - if (CollectionUtils.isNotEmpty(body.getAtUidList())) { + if (CollectionUtil.isNotEmpty(body.getAtUidList())) { extra.setAtUidList(body.getAtUidList()); } diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/msg/VideoMsgHandler.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/msg/VideoMsgHandler.java new file mode 100644 index 0000000..ae967c7 --- /dev/null +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/msg/VideoMsgHandler.java @@ -0,0 +1,54 @@ +package com.abin.mallchat.custom.chat.service.strategy.msg; + +import cn.hutool.core.bean.BeanUtil; +import com.abin.mallchat.common.chat.dao.MessageDao; +import com.abin.mallchat.common.chat.domain.entity.Message; +import com.abin.mallchat.common.chat.domain.entity.msg.MessageExtra; +import com.abin.mallchat.common.chat.domain.entity.msg.VideoMsgDTO; +import com.abin.mallchat.common.chat.domain.enums.MessageTypeEnum; +import com.abin.mallchat.custom.chat.domain.vo.request.ChatMessageReq; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Optional; + +/** + * Description:视频消息 + * Author: abin + * Date: 2023-06-04 + */ +@Component +public class VideoMsgHandler extends AbstractMsgHandler { + @Autowired + private MessageDao messageDao; + + @Override + MessageTypeEnum getMsgTypeEnum() { + return MessageTypeEnum.VIDEO; + } + + @Override + public void checkMsg(ChatMessageReq request, Long uid) { + } + + @Override + public void saveMsg(Message msg, ChatMessageReq request) { + VideoMsgDTO body = BeanUtil.toBean(request.getBody(), VideoMsgDTO.class); + MessageExtra extra = Optional.ofNullable(msg.getExtra()).orElse(new MessageExtra()); + Message update = new Message(); + update.setId(msg.getId()); + update.setExtra(extra); + extra.setVideoMsgDTO(body); + messageDao.updateById(update); + } + + @Override + public Object showMsg(Message msg) { + return msg.getExtra().getVideoMsgDTO(); + } + + @Override + public Object showReplyMsg(Message msg) { + return "视频"; + } +} diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/controller/OssController.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/controller/OssController.java new file mode 100644 index 0000000..5221c21 --- /dev/null +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/controller/OssController.java @@ -0,0 +1,34 @@ +package com.abin.mallchat.custom.user.controller; + +import com.abin.mallchat.common.common.domain.vo.response.ApiResult; +import com.abin.mallchat.common.common.utils.RequestHolder; +import com.abin.mallchat.common.common.utils.oss.domain.OssResp; +import com.abin.mallchat.custom.user.domain.vo.request.oss.UploadUrlReq; +import com.abin.mallchat.custom.user.service.OssService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; + +/** + * Description: oss控制层 + * Author: abin + * Date: 2023-06-20 + */ +@RestController +@RequestMapping("/capi/oss") +@Api(tags = "oss相关接口") +public class OssController { + @Autowired + private OssService ossService; + + @GetMapping("/upload/url") + @ApiOperation("获取临时上传链接") + public ApiResult getUploadUrl(@Valid UploadUrlReq req) { + return ApiResult.success(ossService.getUploadUrl(RequestHolder.get().getUid(), req)); + } +} diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/domain/enums/OssSceneEnum.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/domain/enums/OssSceneEnum.java new file mode 100644 index 0000000..ce7c7ac --- /dev/null +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/domain/enums/OssSceneEnum.java @@ -0,0 +1,35 @@ +package com.abin.mallchat.custom.user.domain.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * Description: 场景枚举 + * Author: abin + * Date: 2023-06-20 + */ +@AllArgsConstructor +@Getter +public enum OssSceneEnum { + CHAT(1, "聊天", "/chat"), + ; + + private final Integer type; + private final String desc; + private final String path; + + private static final Map cache; + + static { + cache = Arrays.stream(OssSceneEnum.values()).collect(Collectors.toMap(OssSceneEnum::getType, Function.identity())); + } + + public static OssSceneEnum of(Integer type) { + return cache.get(type); + } +} diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/domain/vo/request/oss/UploadUrlReq.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/domain/vo/request/oss/UploadUrlReq.java new file mode 100644 index 0000000..d0b0028 --- /dev/null +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/domain/vo/request/oss/UploadUrlReq.java @@ -0,0 +1,29 @@ +package com.abin.mallchat.custom.user.domain.vo.request.oss; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + + +/** + * Description: 上传url请求入参 + * Author: abin + * Date: 2023-03-23 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class UploadUrlReq { + @ApiModelProperty(value = "文件名(带后缀)") + @NotBlank + private String fileName; + @ApiModelProperty(value = "上传场景1.聊天室") + @NotNull + private Integer scene; +} diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/service/OssService.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/service/OssService.java new file mode 100644 index 0000000..926d4ba --- /dev/null +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/service/OssService.java @@ -0,0 +1,20 @@ +package com.abin.mallchat.custom.user.service; + +import com.abin.mallchat.common.common.utils.oss.domain.OssResp; +import com.abin.mallchat.custom.user.domain.vo.request.oss.UploadUrlReq; + +/** + *

+ * oss 服务类 + *

+ * + * @author abin + * @since 2023-03-19 + */ +public interface OssService { + + /** + * 获取临时的上传链接 + */ + OssResp getUploadUrl(Long uid, UploadUrlReq req); +} diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/service/impl/OssServiceImpl.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/service/impl/OssServiceImpl.java new file mode 100644 index 0000000..08bf513 --- /dev/null +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/service/impl/OssServiceImpl.java @@ -0,0 +1,35 @@ +package com.abin.mallchat.custom.user.service.impl; + +import com.abin.mallchat.common.common.utils.AssertUtil; +import com.abin.mallchat.common.common.utils.oss.MinIOTemplate; +import com.abin.mallchat.common.common.utils.oss.domain.OssReq; +import com.abin.mallchat.common.common.utils.oss.domain.OssResp; +import com.abin.mallchat.custom.user.domain.enums.OssSceneEnum; +import com.abin.mallchat.custom.user.domain.vo.request.oss.UploadUrlReq; +import com.abin.mallchat.custom.user.service.OssService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * Description: + * Author: abin + * Date: 2023-06-20 + */ +@Service +public class OssServiceImpl implements OssService { + private static final String BUCKET_NAME = "mallchat"; + @Autowired + private MinIOTemplate minIOTemplate; + + @Override + public OssResp getUploadUrl(Long uid, UploadUrlReq req) { + OssSceneEnum sceneEnum = OssSceneEnum.of(req.getScene()); + AssertUtil.isNotEmpty(sceneEnum, "场景有误"); + OssReq ossReq = OssReq.builder() + .fileName(req.getFileName()) + .filePath(sceneEnum.getPath()) + .uid(uid) + .build(); + return minIOTemplate.getPreSignedObjectUrl(ossReq); + } +} diff --git a/pom.xml b/pom.xml index 8248c1e..93913fa 100644 --- a/pom.xml +++ b/pom.xml @@ -44,6 +44,8 @@ 4.4.0 3.4.0 1.15.3 + 4.8.1 + 3.17.1 @@ -53,6 +55,11 @@ mallchat-common ${mallchat-common.version}
+ + com.squareup.okhttp3 + okhttp + ${okhttp.version} + org.jsoup jsoup @@ -113,7 +120,16 @@ aliyun-sdk-oss ${aliyun-oss.version} - + + io.minio + minio + ${minio.version} + + + org.redisson + redisson-spring-boot-starter + ${redisson-spring-boot-starter.version} +