diff --git a/docs/version/user_emojis.sql b/docs/version/user_emojis.sql new file mode 100644 index 0000000..f0078ce --- /dev/null +++ b/docs/version/user_emojis.sql @@ -0,0 +1,10 @@ +CREATE TABLE `user_emojis` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `uid` bigint(20) NOT NULL COMMENT '用户表ID', + `expression_url` varchar(255) NOT NULL COMMENT '表情地址', + `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', + `update_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '修改时间', + `delete_status` int(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除(0-正常,1-删除)', + PRIMARY KEY (`id`), + KEY `IDX_USER_EMOJIS_UID` (`uid`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='用户表情包'; \ No newline at end of file diff --git a/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/UserEmojis.java b/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/UserEmojis.java new file mode 100644 index 0000000..de707ff --- /dev/null +++ b/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/UserEmojis.java @@ -0,0 +1,58 @@ +package com.abin.mallchat.common.chat.domain.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户表情包 + * + * @author: WuShiJie + * @createTime: 2023/7/2 22:00 + */ +@Data +@TableName(value = "user_emojis") +public class UserEmojis implements Serializable { + private static final long serialVersionUID = -7690290707154737263L; + + /** + * id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户表ID + */ + @TableField(value = "uid") + private Long uid; + + + /** + * 表情地址 + */ + @NotNull + @TableField(value = "expression_url") + private String expressionUrl; + + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + /** + * 修改时间 + */ + @TableField("update_time") + private Date updateTime; + + @TableField(value = "delete_status") + @TableLogic(value = "0",delval = "1") + private Integer deleteStatus; + + +} diff --git a/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/EmojisMsgDTO.java b/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/EmojisMsgDTO.java new file mode 100644 index 0000000..d8aaa2c --- /dev/null +++ b/mallchat-common/src/main/java/com/abin/mallchat/common/chat/domain/entity/msg/EmojisMsgDTO.java @@ -0,0 +1,29 @@ +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 java.io.Serializable; + +/** + * Description: 表情图片消息入参 + * Author: abin + * Date: 2023-06-04 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EmojisMsgDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @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 fa3af00..fa085b9 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 @@ -37,4 +37,9 @@ public class MessageExtra implements Serializable { private SoundMsgDTO soundMsgDTO; //文件消息 private VideoMsgDTO videoMsgDTO; + + /** + * 表情图片信息 + */ + private EmojisMsgDTO emojisMsgDTO; } 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 cc262a9..7d66214 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 @@ -22,6 +22,7 @@ public enum MessageTypeEnum { FILE(4, "文件"), SOUND(5, "语音"), VIDEO(6, "视频"), + EMOJIS(7, "表情"), ; private final Integer type; diff --git a/mallchat-common/src/main/java/com/abin/mallchat/common/user/mapper/UserEmojisMapper.java b/mallchat-common/src/main/java/com/abin/mallchat/common/user/mapper/UserEmojisMapper.java new file mode 100644 index 0000000..dd6b5b2 --- /dev/null +++ b/mallchat-common/src/main/java/com/abin/mallchat/common/user/mapper/UserEmojisMapper.java @@ -0,0 +1,13 @@ +package com.abin.mallchat.common.user.mapper; + +import com.abin.mallchat.common.chat.domain.entity.UserEmojis; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 用户表情包 Mapper + * + * @author: WuShiJie + * @createTime: 2023/7/3 14:24 + */ +public interface UserEmojisMapper extends BaseMapper { +} diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/msg/EmojisMsgHandler.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/msg/EmojisMsgHandler.java new file mode 100644 index 0000000..969595d --- /dev/null +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/strategy/msg/EmojisMsgHandler.java @@ -0,0 +1,58 @@ +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.EmojisMsgDTO; +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.common.common.utils.AssertUtil; +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 EmojisMsgHandler extends AbstractMsgHandler { + @Autowired + private MessageDao messageDao; + + @Override + MessageTypeEnum getMsgTypeEnum() { + return MessageTypeEnum.EMOJIS; + } + + @Override + public void checkMsg(ChatMessageReq request, Long uid) { + EmojisMsgDTO body = BeanUtil.toBean(request.getBody(), EmojisMsgDTO.class); + AssertUtil.allCheckValidateThrow(body); + } + + @Override + public void saveMsg(Message msg, ChatMessageReq request) { + EmojisMsgDTO body = BeanUtil.toBean(request.getBody(), EmojisMsgDTO.class); + MessageExtra extra = Optional.ofNullable(msg.getExtra()).orElse(new MessageExtra()); + Message update = new Message(); + update.setId(msg.getId()); + update.setExtra(extra); + extra.setEmojisMsgDTO(body); + messageDao.updateById(update); + } + + @Override + public Object showMsg(Message msg) { + return msg.getExtra().getEmojisMsgDTO(); + } + + @Override + public Object showReplyMsg(Message msg) { + return "表情"; + } +} diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/controller/UserEmojisController.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/controller/UserEmojisController.java new file mode 100644 index 0000000..f88e69a --- /dev/null +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/controller/UserEmojisController.java @@ -0,0 +1,78 @@ +package com.abin.mallchat.custom.user.controller; + +import com.abin.mallchat.common.chat.domain.entity.UserEmojis; +import com.abin.mallchat.common.common.domain.vo.request.CursorPageBaseReq; +import com.abin.mallchat.common.common.domain.vo.response.ApiResult; +import com.abin.mallchat.common.common.domain.vo.response.CursorPageBaseResp; +import com.abin.mallchat.common.common.utils.RequestHolder; +import com.abin.mallchat.custom.user.service.UserEmojisService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +/** + * 用户表情包 + * + * @author: WuShiJie + * @createTime: 2023/7/3 14:21 + */ +@RestController +@RequestMapping("/capi/userEmojis") +@Api(tags = "用户表情包管理相关接口") +public class UserEmojisController { + + /** + * 用户表情包 Service + */ + @Resource + private UserEmojisService emojisService; + + + /** + * 表情包列表 + * + * @param request 游标翻页请求参数 + * @return 表情包列表 + * @author WuShiJie + * @createTime 2023/7/3 14:46 + **/ + @GetMapping("/getEmojisPage") + @ApiOperation("表情包列表") + public ApiResult> getEmojisPage(@Valid CursorPageBaseReq request) { + return ApiResult.success(emojisService.getEmojisPage(request, RequestHolder.get().getUid())); + } + + + /** + * 新增表情包 + * + * @param emojis 用户表情包 + * @return 表情包 + * @author WuShiJie + * @createTime 2023/7/3 14:46 + **/ + @PostMapping("/insertEmojis") + @ApiOperation("新增表情包") + public ApiResult insertEmojis(@Valid @RequestBody UserEmojis emojis) { + return emojisService.insertEmojis(emojis,RequestHolder.get().getUid()); + } + + /** + * 删除表情包 + * + * @param id 用户表情包ID + * @return 删除结果 + * @author WuShiJie + * @createTime 2023/7/3 14:46 + **/ + @GetMapping("/deleteEmojis") + @ApiOperation("删除表情包") + public ApiResult deleteEmojis(@RequestParam("id") String id) { + emojisService.removeById(id); + return ApiResult.success(); + } +} 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 index ce7c7ac..a21f94a 100644 --- 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 @@ -17,6 +17,7 @@ import java.util.stream.Collectors; @Getter public enum OssSceneEnum { CHAT(1, "聊天", "/chat"), + EMOJIS(2, "表情包", "/emojis"), ; private final Integer 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 index d0b0028..df1f473 100644 --- 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 @@ -23,7 +23,7 @@ public class UploadUrlReq { @ApiModelProperty(value = "文件名(带后缀)") @NotBlank private String fileName; - @ApiModelProperty(value = "上传场景1.聊天室") + @ApiModelProperty(value = "上传场景1.聊天室,2.表情包") @NotNull private Integer scene; } diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/domain/vo/request/user/EmojisPageReq.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/domain/vo/request/user/EmojisPageReq.java new file mode 100644 index 0000000..9dfe00f --- /dev/null +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/domain/vo/request/user/EmojisPageReq.java @@ -0,0 +1,14 @@ +package com.abin.mallchat.custom.user.domain.vo.request.user; + +import com.abin.mallchat.common.common.domain.vo.request.CursorPageBaseReq; +import lombok.Data; + +/** + * 描述此类的作用 + * + * @author: WuShiJie + * @createTime: 2023/7/3 14:52 + */ +@Data +public class EmojisPageReq extends CursorPageBaseReq { +} diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/service/UserEmojisService.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/service/UserEmojisService.java new file mode 100644 index 0000000..31a8ddd --- /dev/null +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/service/UserEmojisService.java @@ -0,0 +1,37 @@ +package com.abin.mallchat.custom.user.service; + +import com.abin.mallchat.common.chat.domain.entity.UserEmojis; +import com.abin.mallchat.common.common.domain.vo.request.CursorPageBaseReq; +import com.abin.mallchat.common.common.domain.vo.response.ApiResult; +import com.abin.mallchat.common.common.domain.vo.response.CursorPageBaseResp; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 用户表情包 Service + * + * @author: WuShiJie + * @createTime: 2023/7/3 14:22 + */ +public interface UserEmojisService extends IService { + + /** + * 表情包列表 + * + * @param request 游标翻页请求参数 + * @return 表情包列表 + * @author WuShiJie + * @createTime 2023/7/3 14:46 + **/ + CursorPageBaseResp getEmojisPage(CursorPageBaseReq request, Long uid); + + /** + * 新增表情包 + * + * @param emojis 用户表情包 + * @param uid 用户ID + * @return 表情包 + * @author WuShiJie + * @createTime 2023/7/3 14:46 + **/ + ApiResult insertEmojis(UserEmojis emojis, Long uid); +} diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/service/impl/UserEmojisServiceImpl.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/service/impl/UserEmojisServiceImpl.java new file mode 100644 index 0000000..fe51f7a --- /dev/null +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/service/impl/UserEmojisServiceImpl.java @@ -0,0 +1,79 @@ +package com.abin.mallchat.custom.user.service.impl; + +import com.abin.mallchat.common.chat.domain.entity.UserEmojis; +import com.abin.mallchat.common.common.annotation.RedissonLock; +import com.abin.mallchat.common.common.domain.vo.request.CursorPageBaseReq; +import com.abin.mallchat.common.common.domain.vo.response.ApiResult; +import com.abin.mallchat.common.common.domain.vo.response.CursorPageBaseResp; +import com.abin.mallchat.common.common.utils.AssertUtil; +import com.abin.mallchat.common.common.utils.CursorUtils; +import com.abin.mallchat.common.common.utils.RequestHolder; +import com.abin.mallchat.common.user.mapper.UserEmojisMapper; +import com.abin.mallchat.custom.user.service.UserEmojisService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * 用户表情包 ServiceImpl + * + * @author: WuShiJie + * @createTime: 2023/7/3 14:23 + */ +@Service +@Slf4j +public class UserEmojisServiceImpl extends ServiceImpl implements UserEmojisService { + + /** + * 游标分页工具类 + */ + @Resource + private CursorUtils cursorUtils; + + /** + * 表情包列表 + * + * @param request 游标翻页请求参数 + * @return 表情包列表 + * @author WuShiJie + * @createTime 2023/7/3 14:46 + **/ + @Override + public CursorPageBaseResp getEmojisPage(CursorPageBaseReq request, Long uid) { + CursorPageBaseResp cursorPageByMysql = cursorUtils.getCursorPageByMysql(this, request, wrapper -> { + wrapper.eq(UserEmojis::getUid, uid); + }, UserEmojis::getId); + return cursorPageByMysql; + } + + + /** + * 新增表情包 + * + * @param emojis 用户表情包 + * @param uid 用户ID + * @return 表情包 + * @author WuShiJie + * @createTime 2023/7/3 14:46 + **/ + @Override + @RedissonLock(key = "#uid") + public ApiResult insertEmojis(UserEmojis emojis, Long uid) { + //校验表情数量是否超过30 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(UserEmojis::getUid,uid); + int count = this.count(queryWrapper); + AssertUtil.isFalse(count>30, "最多只能添加30个表情哦~~"); + //校验表情是否存在 + queryWrapper.eq(UserEmojis::getExpressionUrl,emojis.getExpressionUrl()); + count = this.count(queryWrapper); + AssertUtil.isFalse(count >0, "当前表情已存在哦~~"); + emojis.setUid(RequestHolder.get().getUid()); + this.saveOrUpdate(emojis, queryWrapper); + return ApiResult.success(emojis); + } +}