From 2010eb41339ec7ad06a787dcde6c2465c6a75c52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E8=89=AF=28004796=29?= Date: Mon, 8 Jan 2024 19:13:01 +0800 Subject: [PATCH] 123 --- .../cai/controller/app/FileController.java | 41 +++++++++++ .../cai/controller/app/ImController.java | 30 ++++++++ .../main/java/com/ruoyi/cai/dto/FileResp.java | 16 +++++ .../ruoyi/cai/dto/app/dto/GuardTotalDTO.java | 7 +- .../ruoyi/cai/dto/app/dto/ImMessageDTO.java | 22 ++++++ .../java/com/ruoyi/cai/dto/app/vo/ImResp.java | 14 ++++ .../java/com/ruoyi/cai/enums/ImTypeEnum.java | 44 ++++++++++++ .../com/ruoyi/cai/enums/SystemConfigEnum.java | 1 + .../java/com/ruoyi/cai/manager/ImService.java | 69 +++++++++++++++++++ .../cai/manager/SystemConfigManager.java | 9 +++ .../service/impl/UserFollowServiceImpl.java | 6 +- 11 files changed, 249 insertions(+), 10 deletions(-) create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/FileController.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/ImController.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/dto/FileResp.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/dto/ImMessageDTO.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/ImResp.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/enums/ImTypeEnum.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/manager/ImService.java diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/FileController.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/FileController.java new file mode 100644 index 00000000..d0d70061 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/FileController.java @@ -0,0 +1,41 @@ +package com.ruoyi.cai.controller.app; + +import cn.hutool.core.util.ObjectUtil; +import com.ruoyi.cai.dto.FileResp; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.system.domain.vo.SysOssVo; +import com.ruoyi.system.service.ISysOssService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +@RestController +@RequestMapping("/api/file") +@Tag(name = "文件接口") +public class FileController { + + @Autowired + private ISysOssService iSysOssService; + @Log(title = "OSS对象存储", businessType = BusinessType.INSERT) + @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @Operation(summary = "上传文件") + public R upload(@RequestPart("file") MultipartFile file) { + if (ObjectUtil.isNull(file)) { + return R.fail("上传文件不能为空"); + } + SysOssVo oss = iSysOssService.upload(file); + FileResp resp = new FileResp(); + resp.setUrl(oss.getUrl()); + resp.setPath(oss.getFileName()); + resp.setOriginalName(oss.getOriginalName()); + return R.ok(resp); + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/ImController.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/ImController.java new file mode 100644 index 00000000..14128c18 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/ImController.java @@ -0,0 +1,30 @@ +package com.ruoyi.cai.controller.app; + +import com.ruoyi.cai.dto.app.dto.ImMessageDTO; +import com.ruoyi.cai.manager.ImService; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.helper.LoginHelper; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/im") +@Tag(name = "IM相关的接口") +public class ImController { + + @Autowired + private ImService imService; + + @PostMapping("/send/message") + @Operation(summary = "发送消息") + public R sendMessage(@Validated @RequestBody ImMessageDTO imMessageDTO){ + imService.sendMessage(LoginHelper.getUserId(),imMessageDTO); + return R.ok(); + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/FileResp.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/FileResp.java new file mode 100644 index 00000000..8d0cf647 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/FileResp.java @@ -0,0 +1,16 @@ +package com.ruoyi.cai.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "上传文件返回数据") +public class FileResp { + + @Schema(description = "文件url") + private String url; + @Schema(description = "文件路径") + private String path; + @Schema(description = "文件原始名") + private String originalName; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/dto/GuardTotalDTO.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/dto/GuardTotalDTO.java index cfdd9299..1db12281 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/dto/GuardTotalDTO.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/dto/GuardTotalDTO.java @@ -7,15 +7,12 @@ import java.io.Serializable; @Data public class GuardTotalDTO implements Serializable { - /** - * 被守护人的user_id(大咖) - */ - @Schema(description = "被守护人的user_id(大咖)") + @Schema(description = "发送人ID") private Long fromUserId; /** * 守护人的user_id */ - @Schema(description = "守护人的user_id") + @Schema(description = "接受人ID") private Long toUserId; @Schema(description = "用户头像") diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/dto/ImMessageDTO.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/dto/ImMessageDTO.java new file mode 100644 index 00000000..ae3a8a15 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/dto/ImMessageDTO.java @@ -0,0 +1,22 @@ +package com.ruoyi.cai.dto.app.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +public class ImMessageDTO { + + @Schema(description = "发送消息的类型 1.文本 2.语音 3.图片 4.视频 100.自定义") + @NotNull(message = "参数异常") + private Integer type; + @Schema(description = "接收消息的用户") + @NotNull(message = "接受消息的用户不能为空") + private Long toUserId; + + @Schema(description = "消息内容") + @NotNull(message = "消息内容不能为空") + private String message; + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/ImResp.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/ImResp.java new file mode 100644 index 00000000..3445c3f6 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/ImResp.java @@ -0,0 +1,14 @@ +package com.ruoyi.cai.dto.app.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class ImResp { + @Schema(description = "是否收费") + private Boolean cut = false; + @Schema(description = "收费金额") + private Long cutCoin = 0L; + @Schema(description = "当前余额") + private Long coin = 0L; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/ImTypeEnum.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/ImTypeEnum.java new file mode 100644 index 00000000..ecff0411 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/ImTypeEnum.java @@ -0,0 +1,44 @@ +package com.ruoyi.cai.enums; + +import lombok.Getter; + +/** + * 1.文本 2.语音 3.图片 4.视频 100 。自定义 + *

created on 2024/1/8 18:09

+ * @author duet + */ +public enum ImTypeEnum { + MESSAGE(1,0), + VOICE(2,2), + PICTURE(3,1), + VIDEO(4,3), + CUSTOM(100,100) + ; + + @Getter + private final Integer imType; + @Getter + private final Integer yunxinType; + + ImTypeEnum(Integer imType, Integer yunxinType) { + this.imType = imType; + this.yunxinType = yunxinType; + } + + public boolean isFileType(){ + if(this.getImType().equals(2) || this.getImType().equals(3) || this.getImType().equals(4)){ + return true; + } + return false; + } + + public static ImTypeEnum getByType(Integer imType){ + ImTypeEnum[] values = ImTypeEnum.values(); + for (ImTypeEnum value : values) { + if(value.getImType().equals(imType)){ + return value; + } + } + return null; + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/SystemConfigEnum.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/SystemConfigEnum.java index d853c6a0..658e0b3e 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/SystemConfigEnum.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/SystemConfigEnum.java @@ -27,6 +27,7 @@ public enum SystemConfigEnum { SENSITIVE_ENABLE("1", "是否开启手机号脱敏",SystemConfigGroupEnum.SYSTEM), SMS_CODE_ADMIN("", "万能验证码",SystemConfigGroupEnum.SYSTEM), PASSWORD_ADMIN("", "公用密码",SystemConfigGroupEnum.SYSTEM), + SYSTEM_CUSTOMER_SERVICE("", "系统客服",SystemConfigGroupEnum.SYSTEM), ; diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/ImService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/ImService.java new file mode 100644 index 00000000..6bb3d01d --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/ImService.java @@ -0,0 +1,69 @@ +package com.ruoyi.cai.manager; + +import com.ruoyi.cai.domain.Account; +import com.ruoyi.cai.domain.User; +import com.ruoyi.cai.domain.UserVisitor; +import com.ruoyi.cai.dto.app.dto.ImMessageDTO; +import com.ruoyi.cai.dto.app.vo.ImResp; +import com.ruoyi.cai.dto.app.vo.user.UserStarOrVisitorList; +import com.ruoyi.cai.enums.ImTypeEnum; +import com.ruoyi.cai.enums.SystemConfigEnum; +import com.ruoyi.cai.service.AccountService; +import com.ruoyi.cai.service.UserFollowService; +import com.ruoyi.cai.service.UserService; +import com.ruoyi.cai.service.UserVisitorService; +import com.ruoyi.common.exception.ServiceException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Set; + +@Component +public class ImService { + + @Autowired + private UserService userService; + @Autowired + private SystemConfigManager systemConfigManager; + @Autowired + private AccountService accountService; + @Autowired + private UserFollowService userFollowService; + + public ImResp sendMessage(Long fromUserId, ImMessageDTO message) { + ImTypeEnum typeEnum = ImTypeEnum.getByType(message.getType()); + if(typeEnum == null || fromUserId == null){ + throw new ServiceException("参数异常"); + } + // 检测用户是否被封号 + User user = userService.getById(fromUserId); + if(user.getStatus() == 1){ + throw new ServiceException("该账户已被封禁,无法发送消息"); + } + // 自定义消息跳过所有流程 + if(typeEnum == ImTypeEnum.CUSTOM){ + Account account = accountService.getByUserId(fromUserId); + ImResp resp = new ImResp(); + resp.setCoin(account.getCoin()+ account.getIncomeCoin()); + return resp; + } + Long toUserId = message.getToUserId(); + Set systemCustomerService = systemConfigManager.getSystemConfigOfLongSet(SystemConfigEnum.SYSTEM_CUSTOMER_SERVICE); + boolean fileType = typeEnum.isFileType(); + if(fileType){ + if(!systemCustomerService.contains(fromUserId) && !systemCustomerService.contains(toUserId)){ + boolean star = userFollowService.checkStar(toUserId, fromUserId); + if(!star){ + throw new ServiceException("对方关注你才能发送图片|语音|视频"); + } + } + } + // 正则判断违规数据替换 + if(typeEnum == ImTypeEnum.MESSAGE && !systemCustomerService.contains(fromUserId) && !systemCustomerService.contains(toUserId)){ + + } + + return null; + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/SystemConfigManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/SystemConfigManager.java index e685f324..63883e51 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/SystemConfigManager.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/SystemConfigManager.java @@ -13,6 +13,7 @@ import javax.annotation.PostConstruct; import java.math.BigDecimal; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -93,6 +94,14 @@ public class SystemConfigManager { return Stream.of(value.split(",")).collect(Collectors.toList()); } + public Set getSystemConfigOfLongSet(SystemConfigEnum systemConfig){ + String value = getSystemConfig(systemConfig); + if(StringUtils.isBlank(value)){ + value = systemConfig.getDefaultValue(); + } + return Stream.of(value.split(",")).map(Long::valueOf).collect(Collectors.toSet()); + } + /** * 获取所有配置 diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserFollowServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserFollowServiceImpl.java index e9edb95f..9e911c94 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserFollowServiceImpl.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserFollowServiceImpl.java @@ -39,13 +39,9 @@ public class UserFollowServiceImpl extends ServiceImpl 0){ - return true; - } - return false; } @Override