mirror of
https://github.com/zongzibinbin/MallChat.git
synced 2026-03-13 21:53:41 +08:00
@@ -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
|
||||
|
||||
@@ -64,11 +64,6 @@
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt</artifactId>
|
||||
</dependency>
|
||||
<!-- 阿里云OSS -->
|
||||
<dependency>
|
||||
<groupId>com.aliyun.oss</groupId>
|
||||
<artifactId>aliyun-sdk-oss</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
@@ -112,9 +107,11 @@
|
||||
<dependency>
|
||||
<groupId>org.redisson</groupId>
|
||||
<artifactId>redisson-spring-boot-starter</artifactId>
|
||||
<version>3.17.1</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.minio</groupId>
|
||||
<artifactId>minio</artifactId>
|
||||
</dependency>
|
||||
<!-- Used for unit testing -->
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
|
||||
@@ -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: <a href="https://github.com/zongzibinbin">abin</a>
|
||||
* 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;
|
||||
|
||||
}
|
||||
@@ -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: <a href="https://github.com/zongzibinbin">abin</a>
|
||||
* 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;
|
||||
}
|
||||
|
||||
|
||||
@@ -28,4 +28,12 @@ public class MessageExtra implements Serializable {
|
||||
private MsgRecall recall;
|
||||
//艾特的uid
|
||||
private List<Long> atUidList;
|
||||
//文件消息
|
||||
private FileMsgDTO fileMsg;
|
||||
//图片消息
|
||||
private ImgMsgDTO imgMsgDTO;
|
||||
//语音消息
|
||||
private SoundMsgDTO soundMsgDTO;
|
||||
//文件消息
|
||||
private VideoMsgDTO videoMsgDTO;
|
||||
}
|
||||
|
||||
@@ -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: <a href="https://github.com/zongzibinbin">abin</a>
|
||||
* 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;
|
||||
}
|
||||
@@ -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: <a href="https://github.com/zongzibinbin">abin</a>
|
||||
* 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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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> T executeWithLock(String key, Supplier<T> supplier) {
|
||||
return executeWithLock(key, -1, TimeUnit.MILLISECONDS, supplier);
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
public interface SupplierThrow<T> {
|
||||
|
||||
@@ -47,4 +55,15 @@ public class LockService {
|
||||
*/
|
||||
T get() throws Throwable;
|
||||
}
|
||||
|
||||
|
||||
public static void main(String[] args) {
|
||||
List<String> sensitiveList = Arrays.asList("abcd", "abcbba", "adabca");
|
||||
String text = "abcdefg";
|
||||
for (String s : sensitiveList) {
|
||||
boolean hit = text.contains(s);
|
||||
System.out.println(hit);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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<Bucket> 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<Result<Item>> 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<String, String> 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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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: <a href="https://github.com/zongzibinbin">abin</a>
|
||||
* 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;
|
||||
}
|
||||
@@ -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: <a href="https://github.com/zongzibinbin">abin</a>
|
||||
* Date: 2023-03-23
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class OssResp {
|
||||
|
||||
@ApiModelProperty(value = "上传的临时url")
|
||||
private String uploadUrl;
|
||||
|
||||
@ApiModelProperty(value = "成功后能够下载的url")
|
||||
private String downloadUrl;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -18,4 +18,11 @@ mallchat.wx.secret=380bfc1c9147fdsf4sf07
|
||||
# 接口配置里的Token值
|
||||
mallchat.wx.token=sdfsf
|
||||
# 接口配置里的EncodingAESKey值
|
||||
mallchat.wx.aesKey=sha1
|
||||
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
|
||||
@@ -18,4 +18,11 @@ mallchat.wx.secret=380bfc1c9147fdsf4sf07
|
||||
# 接口配置里的Token值
|
||||
mallchat.wx.token=sdfsf
|
||||
# 接口配置里的EncodingAESKey值
|
||||
mallchat.wx.aesKey=sha1
|
||||
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
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
@@ -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<CursorPageBaseResp<ChatMemberRespV1>> getMemberPage1(@Valid CursorPageBaseReq request) {
|
||||
CursorPageBaseResp<ChatMemberResp> memberPage = chatService.getMemberPage(request);
|
||||
filterBlackMember(memberPage);
|
||||
List<ChatMemberRespV1> 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<List<ChatMemberListResp>> 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<CursorPageBaseResp<ChatMessageRespV1>> getMsgPage(@Valid ChatMessagePageReq request) {
|
||||
CursorPageBaseResp<ChatMessageResp> msgPage = chatService.getMsgPage(request, RequestHolder.get().getUid());
|
||||
filterBlackMsg(msgPage);
|
||||
List<ChatMessageRespV1> 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<ChatMessageResp> sendMsg(@Valid @RequestBody ChatMessageReq request) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@ public class MessageAdapter {
|
||||
return Message.builder()
|
||||
.fromUid(uid)
|
||||
.roomId(request.getRoomId())
|
||||
.type(request.getMsgType())
|
||||
.status(MessageStatusEnum.NORMAL.getStatus())
|
||||
.build();
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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: <a href="https://github.com/zongzibinbin">abin</a>
|
||||
* 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();
|
||||
}
|
||||
}
|
||||
@@ -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: <a href="https://github.com/zongzibinbin">abin</a>
|
||||
* 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 "图片";
|
||||
}
|
||||
}
|
||||
@@ -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: <a href="https://github.com/zongzibinbin">abin</a>
|
||||
* 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 "语音";
|
||||
}
|
||||
}
|
||||
@@ -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<Long> atUidList = body.getAtUidList();
|
||||
Map<Long, User> batch = userInfoCache.getBatch(atUidList);
|
||||
@@ -96,7 +96,7 @@ public class TextMsgHandler extends AbstractMsgHandler {
|
||||
Map<String, String> urlTitleMap = URL_TITLE_DISCOVER.getContentTitleMap(body.getContent());
|
||||
extra.setUrlTitleMap(urlTitleMap);
|
||||
//艾特功能
|
||||
if (CollectionUtils.isNotEmpty(body.getAtUidList())) {
|
||||
if (CollectionUtil.isNotEmpty(body.getAtUidList())) {
|
||||
extra.setAtUidList(body.getAtUidList());
|
||||
|
||||
}
|
||||
|
||||
@@ -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: <a href="https://github.com/zongzibinbin">abin</a>
|
||||
* 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 "视频";
|
||||
}
|
||||
}
|
||||
@@ -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: <a href="https://github.com/zongzibinbin">abin</a>
|
||||
* Date: 2023-06-20
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/capi/oss")
|
||||
@Api(tags = "oss相关接口")
|
||||
public class OssController {
|
||||
@Autowired
|
||||
private OssService ossService;
|
||||
|
||||
@GetMapping("/upload/url")
|
||||
@ApiOperation("获取临时上传链接")
|
||||
public ApiResult<OssResp> getUploadUrl(@Valid UploadUrlReq req) {
|
||||
return ApiResult.success(ossService.getUploadUrl(RequestHolder.get().getUid(), req));
|
||||
}
|
||||
}
|
||||
@@ -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: <a href="https://github.com/zongzibinbin">abin</a>
|
||||
* 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<Integer, OssSceneEnum> cache;
|
||||
|
||||
static {
|
||||
cache = Arrays.stream(OssSceneEnum.values()).collect(Collectors.toMap(OssSceneEnum::getType, Function.identity()));
|
||||
}
|
||||
|
||||
public static OssSceneEnum of(Integer type) {
|
||||
return cache.get(type);
|
||||
}
|
||||
}
|
||||
@@ -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: <a href="https://github.com/zongzibinbin">abin</a>
|
||||
* Date: 2023-03-23
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class UploadUrlReq {
|
||||
@ApiModelProperty(value = "文件名(带后缀)")
|
||||
@NotBlank
|
||||
private String fileName;
|
||||
@ApiModelProperty(value = "上传场景1.聊天室")
|
||||
@NotNull
|
||||
private Integer scene;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* oss 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author <a href="https://github.com/zongzibinbin">abin</a>
|
||||
* @since 2023-03-19
|
||||
*/
|
||||
public interface OssService {
|
||||
|
||||
/**
|
||||
* 获取临时的上传链接
|
||||
*/
|
||||
OssResp getUploadUrl(Long uid, UploadUrlReq req);
|
||||
}
|
||||
@@ -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: <a href="https://github.com/zongzibinbin">abin</a>
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
18
pom.xml
18
pom.xml
@@ -44,6 +44,8 @@
|
||||
<weixin-java-mp.version>4.4.0</weixin-java-mp.version>
|
||||
<mybatis-plus-boot-starter.version>3.4.0</mybatis-plus-boot-starter.version>
|
||||
<jsoup.version>1.15.3</jsoup.version>
|
||||
<okhttp.version>4.8.1</okhttp.version>
|
||||
<redisson-spring-boot-starter.version>3.17.1</redisson-spring-boot-starter.version>
|
||||
</properties>
|
||||
|
||||
<dependencyManagement>
|
||||
@@ -53,6 +55,11 @@
|
||||
<artifactId>mallchat-common</artifactId>
|
||||
<version>${mallchat-common.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.squareup.okhttp3</groupId>
|
||||
<artifactId>okhttp</artifactId>
|
||||
<version>${okhttp.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jsoup</groupId>
|
||||
<artifactId>jsoup</artifactId>
|
||||
@@ -113,7 +120,16 @@
|
||||
<artifactId>aliyun-sdk-oss</artifactId>
|
||||
<version>${aliyun-oss.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.minio</groupId>
|
||||
<artifactId>minio</artifactId>
|
||||
<version>${minio.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.redisson</groupId>
|
||||
<artifactId>redisson-spring-boot-starter</artifactId>
|
||||
<version>${redisson-spring-boot-starter.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user