!20 Merge remote-tracking branch 'origin/dev' into dev

Merge pull request !20 from Dawn/dev
This commit is contained in:
Dawn
2025-04-19 17:58:08 +00:00
committed by Gitee
25 changed files with 272 additions and 68 deletions

View File

@@ -6,6 +6,7 @@ import com.hula.common.domain.vo.req.IdReqVO;
import com.hula.common.domain.vo.res.CursorPageBaseResp;
import com.hula.common.domain.vo.res.GroupListVO;
import com.hula.common.domain.vo.res.IdRespVO;
import com.hula.core.chat.domain.entity.Announcements;
import com.hula.core.chat.domain.entity.RoomGroup;
import com.hula.core.chat.domain.vo.request.ChatMessageMemberReq;
import com.hula.core.chat.domain.vo.request.GroupAddReq;
@@ -158,8 +159,15 @@ public class RoomController {
return ApiResult.success();
}
@Operation(summary = "公告列表")
@GetMapping("/announcement/list/{id}")
public ApiResult<IPage<Announcements>> announcementList(@PathVariable("id") Long roomId, @RequestParam("current") Long current,@RequestParam("size") Long size){
IPage<Announcements> page = new Page<>(current,size);
return ApiResult.success(roomService.announcementList(roomId, page));
}
@Operation(summary = "查看公告")
@GetMapping("/announcement/{id}")
@GetMapping("/announcement")
public ApiResult announcement(ReadAnnouncementsParam param){
return ApiResult.success(roomService.getAnnouncement(RequestHolder.get().getUid(), param));
}
@@ -170,6 +178,12 @@ public class RoomController {
return ApiResult.success(roomService.pushAnnouncement(RequestHolder.get().getUid(), param));
}
@Operation(summary = "删除公告")
@PostMapping("announcement/delete/{id}")
public ApiResult announcementDelete(@PathVariable("id") Long id){
return ApiResult.success(roomService.announcementDelete(RequestHolder.get().getUid(), id));
}
@Operation(summary = "已读公告")
@PostMapping("announcement/read")
public ApiResult readAnnouncement(@RequestBody ReadAnnouncementsParam param){

View File

@@ -9,6 +9,7 @@ import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* 表情图片消息入参
@@ -28,6 +29,12 @@ public class EmojisMsgDTO implements Serializable {
@Schema(description ="回复的消息id")
private Long replyMsgId;
@Schema(description ="艾特的uid")
private List<Long> atUidList;
@Schema(description ="父消息如果没有父消息返回的是null")
private ReplyMsg reply;
}

View File

@@ -10,6 +10,7 @@ import lombok.experimental.SuperBuilder;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* 语音消息入参
@@ -30,4 +31,10 @@ public class FileMsgDTO extends BaseFileDTO implements Serializable {
@Schema(description ="回复的消息id")
private Long replyMsgId;
@Schema(description ="艾特的uid")
private List<Long> atUidList;
@Schema(description ="父消息如果没有父消息返回的是null")
private ReplyMsg reply;
}

View File

@@ -11,6 +11,7 @@ import jakarta.validation.constraints.NotNull;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* 图片消息入参
@@ -35,6 +36,12 @@ public class ImgMsgDTO extends BaseFileDTO implements Serializable {
@Schema(description ="回复的消息id")
private Long replyMsgId;
@Schema(description ="艾特的uid")
private List<Long> atUidList;
@Schema(description ="父消息如果没有父消息返回的是null")
private ReplyMsg reply;
}

View File

@@ -1,6 +1,5 @@
package com.hula.core.chat.domain.entity.msg;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@@ -14,7 +13,6 @@ import java.util.Date;
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MsgRecall implements Serializable {
private static final long serialVersionUID = 1L;
@@ -22,4 +20,9 @@ public class MsgRecall implements Serializable {
private Long recallUid;
//撤回的时间点
private Date recallTime;
public MsgRecall(Long recallUid, Date date) {
this.recallUid = recallUid;
this.recallTime = date;
}
}

View File

@@ -0,0 +1,30 @@
package com.hula.core.chat.domain.entity.msg;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ReplyMsg implements Serializable {
@Schema(description = "消息id")
private Long id;
@Schema(description = "用户uid")
private Long uid;
@Schema(description = "用户名称")
private String username;
@Schema(description = "消息类型 1正常文本 2.撤回消息")
private Integer type;
@Schema(description = "消息内容不同的消息类型,见父消息内容体")
private Object body;
@Schema(description = "是否可消息跳转 0否 1是")
private Integer canCallback;
@Schema(description = "跳转间隔的消息条数")
private Integer gapCount;
}

View File

@@ -11,6 +11,7 @@ import lombok.experimental.SuperBuilder;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* 视频消息入参
@@ -43,4 +44,10 @@ public class VideoMsgDTO extends BaseFileDTO implements Serializable {
@Schema(description ="回复的消息id")
private Long replyMsgId;
@Schema(description ="艾特的uid")
private List<Long> atUidList;
@Schema(description ="父消息如果没有父消息返回的是null")
private ReplyMsg reply;
}

View File

@@ -5,7 +5,6 @@ import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 聊天公告
@@ -16,10 +15,6 @@ public class AnnouncementsParam implements Serializable {
@NotNull(message = "请选择群聊")
private Long roomId;
private Long uid;
@NotEmpty(message = "请输入公告内容")
private String content;
private LocalDateTime publishTime;
}

View File

@@ -1,6 +1,7 @@
package com.hula.core.chat.domain.vo.response.msg;
import com.hula.common.utils.discover.domain.UrlInfo;
import com.hula.core.chat.domain.entity.msg.ReplyMsg;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
@@ -27,25 +28,4 @@ public class TextMsgResp {
private List<Long> atUidList;
@Schema(description ="父消息如果没有父消息返回的是null")
private ReplyMsg reply;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public static class ReplyMsg {
@Schema(description ="消息id")
private Long id;
@Schema(description ="用户uid")
private Long uid;
@Schema(description ="用户名称")
private String username;
@Schema(description ="消息类型 1正常文本 2.撤回消息")
private Integer type;
@Schema(description ="消息内容不同的消息类型,见父消息内容体")
private Object body;
@Schema(description ="是否可消息跳转 0否 1是")
private Integer canCallback;
@Schema(description ="跳转间隔的消息条数")
private Integer gapCount;
}
}

View File

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hula.common.domain.vo.req.CursorPageBaseReq;
import com.hula.common.domain.vo.res.CursorPageBaseResp;
import com.hula.common.domain.vo.res.GroupListVO;
import com.hula.core.chat.domain.entity.Announcements;
import com.hula.core.chat.domain.entity.RoomGroup;
import com.hula.core.chat.domain.vo.request.ChatMessageMemberReq;
import com.hula.core.chat.domain.vo.request.ContactFriendReq;
@@ -27,6 +28,7 @@ import com.hula.core.chat.domain.vo.response.ChatRoomResp;
import com.hula.core.chat.domain.vo.response.MemberResp;
import com.hula.core.user.domain.vo.resp.ws.ChatMemberResp;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@@ -90,6 +92,12 @@ public interface RoomAppService {
*/
Boolean pushAnnouncement(Long uid, AnnouncementsParam param);
/**
* 获取公告列表
* @return
*/
IPage<Announcements> announcementList(Long roomId, IPage<Announcements> page);
/**
* 已读公告
*/
@@ -100,6 +108,11 @@ public interface RoomAppService {
*/
AnnouncementsResp getAnnouncement(Long uid, ReadAnnouncementsParam param);
/**
* 删除公告
*/
Boolean announcementDelete(Long uid, Long id);
/**
* 隐藏会话
* @return

View File

@@ -2,14 +2,12 @@ package com.hula.core.chat.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hula.common.domain.po.RoomChatInfoPO;
import com.hula.common.domain.vo.res.GroupListVO;
import com.hula.core.chat.domain.entity.Announcements;
import com.hula.core.chat.domain.entity.AnnouncementsReadRecord;
import com.hula.core.chat.domain.entity.RoomFriend;
import com.hula.core.chat.domain.entity.RoomGroup;
import com.hula.core.chat.domain.vo.request.GroupAddReq;
import com.hula.core.chat.domain.vo.request.room.AnnouncementsParam;
import com.hula.core.chat.domain.vo.response.AnnouncementsResp;
import java.util.List;
@@ -68,6 +66,11 @@ public interface RoomService {
*/
Boolean readAnnouncement(Long uid, Long announcementId);
/**
* 查询公告列表
*/
IPage<Announcements> announcementList(Long roomId, IPage<Announcements> page);
/**
* 查询公告
*/
@@ -78,6 +81,11 @@ public interface RoomService {
*/
Long getAnnouncementReadCount(Long announcementId);
/**
* 删除指定公告
*/
Boolean announcementDelete(Long id);
/**
* 保存群公告
*/

View File

@@ -276,7 +276,8 @@ public class RoomAppServiceImpl implements RoomAppService {
@Override
public Boolean pushAnnouncement(Long uid, AnnouncementsParam param) {
List<Long> uids = roomService.getGroupUsers(param.getRoomId(), false);
RoomGroup roomGroup = roomGroupCache.get(param.getRoomId());
List<Long> uids = roomService.getGroupUsers(roomGroup.getId(), false);
if(CollUtil.isNotEmpty(uids)){
LocalDateTime now = LocalDateTime.now();
pushService.sendPushMsg(MessageAdapter.buildRoomGroupAnnouncement(param.getContent()), uids, uid);
@@ -303,6 +304,11 @@ public class RoomAppServiceImpl implements RoomAppService {
return false;
}
@Override
public IPage<Announcements> announcementList(Long roomId, IPage<Announcements> page) {
return roomService.announcementList(roomId, page);
}
@Override
public Boolean readAnnouncement(Long uid, ReadAnnouncementsParam param) {
// 1.更新已读状态
@@ -338,6 +344,19 @@ public class RoomAppServiceImpl implements RoomAppService {
return announcement;
}
@Override
public Boolean announcementDelete(Long uid, Long id) {
// 1. 鉴权
RoomGroup roomGroup = roomGroupCache.get(id);
GroupMember groupMember = verifyGroupPermissions(uid, roomGroup);
if(GroupRoleEnum.MEMBER.getType().equals(groupMember.getRole())) {
return false;
}
return roomService.announcementDelete(id);
}
@Override
public Boolean setHide(Long uid, ContactHideReq req) {
return contactDao.setHide(uid, req.getRoomId(), req.getHide());

View File

@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hula.common.domain.vo.res.GroupListVO;
import com.hula.common.enums.NormalOrNoEnum;
import com.hula.core.chat.dao.AnnouncementsDao;
import com.hula.core.chat.dao.AnnouncementsReadRecordDao;
import com.hula.core.chat.domain.entity.Announcements;
@@ -148,6 +147,11 @@ public class RoomServiceImpl implements RoomService {
.eq(AnnouncementsReadRecord::getAnnouncementsId, announcementId));
}
@Override
public Boolean announcementDelete(Long id) {
return announcementsDao.removeById(id);
}
@Override
public Boolean saveAnnouncements(Announcements announcements) {
return announcementsDao.save(announcements);
@@ -202,4 +206,9 @@ public class RoomServiceImpl implements RoomService {
groupMember.setUid(uid);
groupMemberDao.save(groupMember);
}
@Override
public IPage<Announcements> announcementList(Long roomId, IPage<Announcements> page) {
return announcementsDao.getBaseMapper().selectPage(page, new QueryWrapper<Announcements>().eq("room_id", roomId));
}
}

View File

@@ -1,23 +1,37 @@
package com.hula.core.chat.service.strategy.msg;
import cn.hutool.core.bean.BeanUtil;
import com.hula.common.enums.YesOrNoEnum;
import com.hula.core.chat.dao.MessageDao;
import com.hula.core.chat.domain.entity.Message;
import com.hula.core.chat.domain.entity.msg.ReplyMsg;
import com.hula.core.chat.domain.enums.MessageStatusEnum;
import com.hula.core.chat.domain.enums.MessageTypeEnum;
import com.hula.core.chat.domain.vo.request.ChatMessageReq;
import com.hula.core.chat.service.adapter.MessageAdapter;
import com.hula.core.chat.service.cache.MsgPlusCache;
import com.hula.core.user.domain.entity.User;
import com.hula.core.user.service.cache.UserCache;
import com.hula.utils.AssertUtil;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.springframework.transaction.annotation.Transactional;
import java.lang.reflect.ParameterizedType;
import java.util.Objects;
import java.util.Optional;
public abstract class AbstractMsgHandler<T> {
@Resource
private MessageDao messageDao;
@Resource
private MsgPlusCache msgPlusCache;
@Resource
private UserCache userCache;
private Class<T> bodyClass;
@PostConstruct
@@ -62,6 +76,32 @@ public abstract class AbstractMsgHandler<T> {
*/
public abstract Object showMsg(Message msg);
/**
* 回复消息
* @param msg 消息主体
* @return
*/
public ReplyMsg replyMsg(Message msg){
Optional<Message> reply = Optional.ofNullable(msg.getReplyMsgId())
.map(msgPlusCache::get)
.filter(a -> Objects.equals(a.getStatus(), MessageStatusEnum.NORMAL.getStatus()));
// TODO 这里的缓存不会立即删除,导致撤回消息后回复的信息还有 (nyh -> 2024-07-14 03:46:34)
if (reply.isPresent()) {
Message replyMessage = reply.get();
ReplyMsg replyMsgVO = new ReplyMsg();
replyMsgVO.setId(replyMessage.getId());
replyMsgVO.setUid(replyMessage.getFromUid());
replyMsgVO.setType(replyMessage.getType());
replyMsgVO.setBody(MsgHandlerFactory.getStrategyNoNull(replyMessage.getType()).showReplyMsg(replyMessage));
User replyUser = userCache.getUserInfo(replyMessage.getFromUid());
replyMsgVO.setUsername(replyUser.getName());
replyMsgVO.setCanCallback(YesOrNoEnum.toStatus(Objects.nonNull(msg.getGapCount()) && msg.getGapCount() <= MessageAdapter.CAN_CALLBACK_GAP_COUNT));
replyMsgVO.setGapCount(msg.getGapCount());
return replyMsgVO;
}
return null;
}
/**
* 被回复时——展示的消息
*/

View File

@@ -4,6 +4,7 @@ import com.hula.core.chat.dao.MessageDao;
import com.hula.core.chat.domain.entity.Message;
import com.hula.core.chat.domain.entity.msg.EmojisMsgDTO;
import com.hula.core.chat.domain.entity.msg.MessageExtra;
import com.hula.core.chat.domain.entity.msg.ReplyMsg;
import com.hula.core.chat.domain.enums.MessageTypeEnum;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
@@ -37,7 +38,10 @@ public class EmojisMsgHandler extends AbstractMsgHandler<EmojisMsgDTO> {
@Override
public Object showMsg(Message msg) {
return msg.getExtra().getEmojisMsgDTO();
EmojisMsgDTO resp = msg.getExtra().getEmojisMsgDTO();
resp.setAtUidList(Optional.ofNullable(msg.getExtra()).map(MessageExtra::getAtUidList).orElse(null));
resp.setReply(replyMsg(msg));
return resp;
}
@Override

View File

@@ -37,7 +37,10 @@ public class FileMsgHandler extends AbstractMsgHandler<FileMsgDTO> {
@Override
public Object showMsg(Message msg) {
return msg.getExtra().getFileMsg();
FileMsgDTO resp = msg.getExtra().getFileMsg();
resp.setAtUidList(Optional.ofNullable(msg.getExtra()).map(MessageExtra::getAtUidList).orElse(null));
resp.setReply(replyMsg(msg));
return resp;
}
@Override

View File

@@ -37,7 +37,10 @@ public class ImgMsgHandler extends AbstractMsgHandler<ImgMsgDTO> {
@Override
public Object showMsg(Message msg) {
return msg.getExtra().getImgMsgDTO();
ImgMsgDTO resp = msg.getExtra().getImgMsgDTO();
resp.setAtUidList(Optional.ofNullable(msg.getExtra()).map(MessageExtra::getAtUidList).orElse(null));
resp.setReply(replyMsg(msg));
return resp;
}
@Override

View File

@@ -2,6 +2,7 @@ package com.hula.core.chat.service.strategy.msg;
import cn.hutool.core.collection.CollectionUtil;
import com.hula.common.enums.YesOrNoEnum;
import com.hula.core.chat.domain.entity.msg.ReplyMsg;
import com.hula.utils.AssertUtil;
import com.hula.common.utils.discover.PrioritizedUrlDiscover;
import com.hula.common.utils.discover.domain.UrlInfo;
@@ -105,24 +106,7 @@ public class TextMsgHandler extends AbstractMsgHandler<TextMsgReq> {
resp.setContent(msg.getContent());
resp.setUrlContentMap(Optional.ofNullable(msg.getExtra()).map(MessageExtra::getUrlContentMap).orElse(null));
resp.setAtUidList(Optional.ofNullable(msg.getExtra()).map(MessageExtra::getAtUidList).orElse(null));
//回复消息
Optional<Message> reply = Optional.ofNullable(msg.getReplyMsgId())
.map(msgPlusCache::get)
.filter(a -> Objects.equals(a.getStatus(), MessageStatusEnum.NORMAL.getStatus()));
// TODO 这里的缓存不会立即删除,导致撤回消息后回复的信息还有 (nyh -> 2024-07-14 03:46:34)
if (reply.isPresent()) {
Message replyMessage = reply.get();
TextMsgResp.ReplyMsg replyMsgVO = new TextMsgResp.ReplyMsg();
replyMsgVO.setId(replyMessage.getId());
replyMsgVO.setUid(replyMessage.getFromUid());
replyMsgVO.setType(replyMessage.getType());
replyMsgVO.setBody(MsgHandlerFactory.getStrategyNoNull(replyMessage.getType()).showReplyMsg(replyMessage));
User replyUser = userCache.getUserInfo(replyMessage.getFromUid());
replyMsgVO.setUsername(replyUser.getName());
replyMsgVO.setCanCallback(YesOrNoEnum.toStatus(Objects.nonNull(msg.getGapCount()) && msg.getGapCount() <= MessageAdapter.CAN_CALLBACK_GAP_COUNT));
replyMsgVO.setGapCount(msg.getGapCount());
resp.setReply(replyMsgVO);
}
resp.setReply(replyMsg(msg));
return resp;
}

View File

@@ -37,7 +37,10 @@ public class VideoMsgHandler extends AbstractMsgHandler<VideoMsgDTO> {
@Override
public Object showMsg(Message msg) {
return msg.getExtra().getVideoMsgDTO();
VideoMsgDTO resp = msg.getExtra().getVideoMsgDTO();
resp.setAtUidList(Optional.ofNullable(msg.getExtra()).map(MessageExtra::getAtUidList).orElse(null));
resp.setReply(replyMsg(msg));
return resp;
}
@Override

View File

@@ -1,5 +1,6 @@
package com.hula.core.user.controller;
import com.hula.core.user.domain.vo.req.user.ForgotPasswordReq;
import com.hula.core.user.domain.vo.req.user.LoginReq;
import com.hula.core.user.domain.vo.req.user.LogoutReq;
import com.hula.core.user.domain.vo.req.user.RefreshTokenReq;
@@ -49,6 +50,12 @@ public class TokenController {
return ApiResult.success(registerReq.getEmail());
}
@PostMapping("/forgotPassword")
@Operation(summary ="忘记密码|重置密码")
public ApiResult<Boolean> forgotPassword(@Valid @RequestBody ForgotPasswordReq forgotPasswordReq) {
return ApiResult.success(loginService.forgotPassword(forgotPasswordReq));
}
@PostMapping("/refreshToken")
@Operation(summary ="token续签")
public ApiResult<LoginResultVO> refreshToken(@RequestBody RefreshTokenReq refreshTokenReq) {

View File

@@ -46,8 +46,8 @@ public class UserDao extends ServiceImpl<UserMapper, User> {
updateById(update);
}
public User getByName(String name) {
return lambdaQuery().eq(User::getName, name).one();
public User getByEmail(String email) {
return lambdaQuery().eq(User::getEmail, email).one();
}
public List<User> getMemberList() {

View File

@@ -0,0 +1,30 @@
package com.hula.core.user.domain.vo.req.user;
import com.hula.domain.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
/**
* @author 乾乾
*/
@Data
public class ForgotPasswordReq extends BaseEntity {
@NotEmpty(message = "请填写邮箱")
@Schema(description = "邮箱")
@Pattern(regexp = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$", message = "请输入有效的邮箱地址")
private String email;
@NotEmpty(message = "邮箱验证码不能为空")
@Schema(description = "邮箱验证码")
private String code;
@NotEmpty(message = "修改码非法!")
@Schema(description = "uuid")
private String uuid;
@NotEmpty(message = "请输入密码")
private String password;
}

View File

@@ -1,10 +1,12 @@
package com.hula.core.user.service;
import com.hula.core.user.domain.vo.req.user.ForgotPasswordReq;
import com.hula.core.user.domain.vo.req.user.LoginReq;
import com.hula.core.user.domain.vo.req.user.RefreshTokenReq;
import com.hula.core.user.domain.vo.req.user.RegisterReq;
import com.hula.core.user.domain.vo.resp.user.LoginResultVO;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
/**
* @author nyh
@@ -39,4 +41,9 @@ public interface LoginService {
* 退出登录
*/
void logout(Boolean autoLogin);
/**
* 重置密码
*/
Boolean forgotPassword(@Valid ForgotPasswordReq forgotPasswordReq);
}

View File

@@ -14,6 +14,7 @@ import com.hula.core.chat.service.ContactService;
import com.hula.core.chat.service.RoomService;
import com.hula.core.user.dao.UserDao;
import com.hula.core.user.domain.entity.User;
import com.hula.core.user.domain.vo.req.user.ForgotPasswordReq;
import com.hula.core.user.domain.vo.req.user.LoginReq;
import com.hula.core.user.domain.vo.req.user.RefreshTokenReq;
import com.hula.core.user.domain.vo.req.user.RegisterReq;
@@ -78,17 +79,7 @@ public class LoginServiceImpl implements LoginService {
@Override
@Transactional(rollbackFor = Exception.class)
public void normalRegister(RegisterReq req) {
String emailCode;
Object codeObj = RedisUtils.hget("emailCode", req.getUuid());
if (ObjectUtil.isNotNull(codeObj)) {
emailCode = codeObj.toString();
} else {
throw new BizException("验证码已过期");
}
if(StrUtil.isEmpty(emailCode) || !emailCode.equals(req.getCode())){
throw new BizException("验证码错误!");
}
checkCode(req.getUuid(), req.getCode());
// 2. 检查邮箱是否已被其他用户绑定
if (userDao.existsByEmailAndIdNot(null, req.getEmail())) {
@@ -162,4 +153,36 @@ public class LoginServiceImpl implements LoginService {
}
}
@Override
public Boolean forgotPassword(ForgotPasswordReq req) {
// 1. 校验
checkCode(req.getUuid(), req.getCode());
// 2. 修改密码
User dbuUser = userDao.getByEmail(req.getEmail());
User user = new User();
user.setId(dbuUser.getId());
user.setPassword(req.getPassword());
return userDao.updateById(user);
}
/**
* 检查验证码
* @param uuid 验证码id
* @param code 验证码值
*/
private static void checkCode(String uuid, String code) {
String emailCode;
Object codeObj = RedisUtils.hget("emailCode", uuid);
if (ObjectUtil.isNotNull(codeObj)) {
emailCode = codeObj.toString();
} else {
throw new BizException("验证码已过期");
}
if (StrUtil.isEmpty(emailCode) || !emailCode.equals(code)) {
throw new BizException("验证码错误!");
}
}
}

View File

@@ -162,3 +162,4 @@ public:
- /token/register
- /captcha/captcha
- /captcha/sendCode
- /token/forgotPassword