增加会员登录事件,对token处理优化

This commit is contained in:
Chopper 2022-01-11 11:12:19 +08:00
parent cc7d2c0c82
commit eddcbc2ecb
14 changed files with 136 additions and 59 deletions

View File

@ -113,7 +113,7 @@ spring:
props:
#是否打印逻辑SQL语句和实际SQL语句建议调试时打印在生产环境关闭
sql:
show: false
show: true
# 忽略鉴权url
ignored:

View File

@ -0,0 +1,19 @@
package cn.lili.event;
import cn.lili.modules.member.entity.dos.Member;
/**
* 会员登录消息
*
* @author Chopper
* @since 2020/11/17 7:13 下午
*/
public interface MemberLoginEvent {
/**
* 会员登录
*
* @param member 会员
*/
void memberLogin(Member member);
}

View File

@ -11,7 +11,7 @@ import cn.lili.modules.member.entity.dos.Member;
public interface MemberRegisterEvent {
/**
* 会员登录
* 会员注册
*
* @param member 会员
*/

View File

@ -0,0 +1,25 @@
package cn.lili.event.impl;
import cn.lili.event.MemberLoginEvent;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* 会员自身业务
*
* @author Chopper
* @version v1.0
* 2022-01-11 11:08
*/
@Service
public class MemberExecute implements MemberLoginEvent {
@Autowired
private MemberService memberService;
@Override
public void memberLogin(Member member) {
memberService.updateById(member);
}
}

View File

@ -1,6 +1,7 @@
package cn.lili.listener;
import cn.hutool.json.JSONUtil;
import cn.lili.event.MemberLoginEvent;
import cn.lili.event.MemberPointChangeEvent;
import cn.lili.event.MemberRegisterEvent;
import cn.lili.event.MemberWithdrawalEvent;
@ -51,6 +52,12 @@ public class MemberMessageListener implements RocketMQListener<MessageExt> {
@Autowired
private List<MemberRegisterEvent> memberSignEvents;
/**
* 会员注册
*/
@Autowired
private List<MemberLoginEvent> memberLoginEvents;
@Override
public void onMessage(MessageExt messageExt) {
@ -69,6 +76,21 @@ public class MemberMessageListener implements RocketMQListener<MessageExt> {
}
}
break;
case MEMBER_LOGIN:
for (MemberLoginEvent memberLoginEvent : memberLoginEvents) {
try {
Member member = JSONUtil.toBean(new String(messageExt.getBody()), Member.class);
memberLoginEvent.memberLogin(member);
} catch (Exception e) {
log.error("会员{},在{}业务中,状态修改事件执行异常",
new String(messageExt.getBody()),
memberLoginEvent.getClass().getName(),
e);
}
}
break;
//会员签到
case MEMBER_SING:
MemberSign memberSign = JSONUtil.toBean(new String(messageExt.getBody()), MemberSign.class);

View File

@ -115,8 +115,7 @@ public enum ResultCode {
USER_AUTH_EXPIRED(20004, "用户已退出,请重新登录"),
USER_AUTHORITY_ERROR(20005, "权限不足"),
USER_CONNECT_LOGIN_ERROR(20006, "未找到登录信息"),
USER_NAME_EXIST(20007, "该用户名已被注册"),
USER_PHONE_EXIST(20008, "该手机号已被注册"),
USER_EXIST(20008, "该用户名或手机号已被注册"),
USER_PHONE_NOT_EXIST(20009, "手机号不存在"),
USER_PASSWORD_ERROR(20010, "密码不正确"),
USER_NOT_PHONE(20011, "非当前用户的手机号"),

View File

@ -16,11 +16,11 @@ public abstract class AbstractTokenGenerate {
/**
* 生成token
*
* @param username 用户名
* @param user 用户名
* @param longTerm 是否长时间有效
* @return TOKEN对象
*/
public abstract Token createToken(String username, Boolean longTerm);
public abstract Token createToken(Object user, Boolean longTerm);
/**
* 刷新token

View File

@ -87,7 +87,7 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
this.remove(queryWrapper);
throw new NoPermissionException("未绑定用户");
}
return memberTokenGenerate.createToken(member.getUsername(), longTerm);
return memberTokenGenerate.createToken(member, longTerm);
} catch (NoPermissionException e) {
throw e;
}
@ -222,7 +222,7 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
//如果不存在会员则进行绑定微信openid unionid并且登录
if (member != null) {
bindMpMember(openId, unionId, member);
return memberTokenGenerate.createToken(member.getUsername(), true);
return memberTokenGenerate.createToken(member, true);
}
//如果没有会员则根据手机号注册会员
@ -230,7 +230,7 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
memberService.save(newMember);
newMember = memberService.findByUsername(newMember.getUsername());
bindMpMember(openId, unionId, newMember);
return memberTokenGenerate.createToken(newMember.getUsername(), true);
return memberTokenGenerate.createToken(newMember, true);
}
@Override

View File

@ -17,6 +17,7 @@ import cn.lili.common.security.token.Token;
import cn.lili.common.sensitive.SensitiveWordsFilter;
import cn.lili.common.utils.BeanUtil;
import cn.lili.common.utils.CookieUtil;
import cn.lili.common.utils.SnowFlake;
import cn.lili.common.utils.UuidUtils;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.connect.config.ConnectAuthEnum;
@ -143,7 +144,7 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
// throw new ServiceException(ResultCode.USER_PASSWORD_ERROR);
// }
// loginBindUser(member);
return memberTokenGenerate.createToken(member.getUsername(), false);
return memberTokenGenerate.createToken(member, false);
}
@Override
@ -168,7 +169,7 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
throw new ServiceException(ResultCode.USER_NOT_EXIST);
}
return storeTokenGenerate.createToken(member.getUsername(), false);
return storeTokenGenerate.createToken(member, false);
}
/**
@ -196,12 +197,10 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
String username = UuidUtils.getUUID();
Member member = new Member(username, UuidUtils.getUUID(), authUser.getAvatar(), authUser.getNickname(),
authUser.getGender() != null ? Convert.toInt(authUser.getGender().getCode()) : 0);
//保存会员
this.save(member);
Member loadMember = this.findByUsername(username);
registerHandler(member);
//绑定登录方式
loginBindUser(loadMember, authUser.getUuid(), authUser.getSource());
return memberTokenGenerate.createToken(username, false);
loginBindUser(member, authUser.getUuid(), authUser.getSource());
return memberTokenGenerate.createToken(member, false);
} catch (ServiceException e) {
log.error("自动注册服务泡出异常:", e);
throw e;
@ -235,13 +234,23 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
//如果手机号不存在则自动注册用户
if (member == null) {
member = new Member(mobilePhone, UuidUtils.getUUID(), mobilePhone);
//保存会员
this.save(member);
String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_REGISTER.name();
rocketMQTemplate.asyncSend(destination, member, RocketmqSendCallbackBuilder.commonCallback());
registerHandler(member);
}
loginBindUser(member);
return memberTokenGenerate.createToken(member.getUsername(), false);
return memberTokenGenerate.createToken(member, false);
}
/**
* 注册方法抽象
*
* @param member
*/
private void registerHandler(Member member) {
member.setId(SnowFlake.getIdStr());
//保存会员
this.save(member);
String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_REGISTER.name();
rocketMQTemplate.asyncSend(destination, member, RocketmqSendCallbackBuilder.commonCallback());
}
@Override
@ -281,13 +290,9 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
//设置会员信息
Member member = new Member(userName, new BCryptPasswordEncoder().encode(password), mobilePhone);
//注册成功后用户自动登录
if (this.save(member)) {
Token token = memberTokenGenerate.createToken(member.getUsername(), false);
String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_REGISTER.name();
rocketMQTemplate.asyncSend(destination, member, RocketmqSendCallbackBuilder.commonCallback());
return token;
}
return null;
registerHandler(member);
Token token = memberTokenGenerate.createToken(member, false);
return token;
}
@Override
@ -331,9 +336,7 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
//添加会员
Member member = new Member(memberAddDTO.getUsername(), new BCryptPasswordEncoder().encode(memberAddDTO.getPassword()), memberAddDTO.getMobile());
this.save(member);
String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_REGISTER.name();
rocketMQTemplate.asyncSend(destination, member, RocketmqSendCallbackBuilder.commonCallback());
registerHandler(member);
return member;
}
@ -430,10 +433,11 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
* @param mobilePhone 手机号
* @return 会员
*/
private Member findByPhone(String mobilePhone) {
private List<Member> findMember(String mobilePhone, String userName) {
QueryWrapper<Member> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("mobile", mobilePhone);
return this.baseMapper.selectOne(queryWrapper);
queryWrapper.eq("mobile", mobilePhone)
.or().eq("username", userName);
return this.baseMapper.selectList(queryWrapper);
}
/**
@ -589,13 +593,9 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
* @param mobilePhone 手机号
*/
private void checkMember(String userName, String mobilePhone) {
//判断用户名是否存在
if (findByUsername(userName) != null) {
throw new ServiceException(ResultCode.USER_NAME_EXIST);
}
//判断手机号是否存在
if (findByPhone(mobilePhone) != null) {
throw new ServiceException(ResultCode.USER_PHONE_EXIST);
if (findMember(userName, mobilePhone) != null) {
throw new ServiceException(ResultCode.USER_EXIST);
}
}
}

View File

@ -1,5 +1,6 @@
package cn.lili.modules.member.token;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.security.token.Token;
@ -9,6 +10,9 @@ import cn.lili.common.context.ThreadContextHolder;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.service.MemberService;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.MemberTagsEnum;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@ -28,11 +32,16 @@ public class MemberTokenGenerate extends AbstractTokenGenerate {
private MemberService memberService;
@Autowired
private TokenUtil tokenUtil;
@Autowired
private RocketmqCustomProperties rocketmqCustomProperties;
@Autowired
private RocketMQTemplate rocketMQTemplate;
@Override
public Token createToken(String username, Boolean longTerm) {
public Token createToken(Object user, Boolean longTerm) {
Member member = memberService.findByUsername(username);
Member member = (Member) user;
//获取客户端类型
String clientType = ThreadContextHolder.getHttpRequest().getHeader("clientType");
@ -50,11 +59,12 @@ public class MemberTokenGenerate extends AbstractTokenGenerate {
//记录最后登录时间客户端类型
member.setLastLoginDate(new Date());
member.setClientEnum(clientTypeEnum.name());
memberService.updateById(member);
String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_LOGIN.name();
rocketMQTemplate.asyncSend(destination, member, RocketmqSendCallbackBuilder.commonCallback());
AuthUser authUser = new AuthUser(member.getUsername(), member.getId(), member.getNickName(), member.getFace(), UserEnums.MEMBER);
//登陆成功生成token
return tokenUtil.createToken(username, authUser, longTerm, UserEnums.MEMBER);
return tokenUtil.createToken(member.getUsername(), authUser, longTerm, UserEnums.MEMBER);
}
@Override

View File

@ -32,20 +32,20 @@ public class StoreTokenGenerate extends AbstractTokenGenerate {
private TokenUtil tokenUtil;
@Override
public Token createToken(String username, Boolean longTerm) {
public Token createToken(Object user, Boolean longTerm) {
//生成token
Member member = memberService.findByUsername(username);
Member member = (Member) user;
if (!member.getHaveStore()) {
throw new ServiceException(ResultCode.STORE_NOT_OPEN);
}
LambdaQueryWrapper<Store> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Store::getMemberId, member.getId());
Store store = storeService.getOne(queryWrapper);
AuthUser user = new AuthUser(member.getUsername(), member.getId(), member.getNickName(), store.getStoreLogo(), UserEnums.STORE);
AuthUser authUser = new AuthUser(member.getUsername(), member.getId(), member.getNickName(), store.getStoreLogo(), UserEnums.STORE);
user.setStoreId(store.getId());
user.setStoreName(store.getStoreName());
return tokenUtil.createToken(username, user, longTerm, UserEnums.STORE);
authUser.setStoreId(store.getId());
authUser.setStoreName(store.getStoreName());
return tokenUtil.createToken(member.getUsername(), authUser, longTerm, UserEnums.STORE);
}
@Override

View File

@ -119,7 +119,7 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
throw new ServiceException(ResultCode.USER_PASSWORD_ERROR);
}
try {
return managerTokenGenerate.createToken(username, false);
return managerTokenGenerate.createToken(adminUser, false);
} catch (Exception e) {
log.error("管理员登录错误", e);
}

View File

@ -31,8 +31,6 @@ import java.util.Map;
@Component
public class ManagerTokenGenerate extends AbstractTokenGenerate {
@Autowired
private AdminUserService adminUserService;
@Autowired
private TokenUtil tokenUtil;
@Autowired
@ -42,17 +40,17 @@ public class ManagerTokenGenerate extends AbstractTokenGenerate {
@Override
public Token createToken(String username, Boolean longTerm) {
public Token createToken(Object user, Boolean longTerm) {
//生成token
AdminUser adminUser = adminUserService.findByUsername(username);
AuthUser user = new AuthUser(adminUser.getUsername(), adminUser.getId(), adminUser.getAvatar(), UserEnums.MANAGER, adminUser.getNickName(), adminUser.getIsSuper());
AdminUser adminUser = (AdminUser) user;
AuthUser authUser = new AuthUser(adminUser.getUsername(), adminUser.getId(), adminUser.getAvatar(), UserEnums.MANAGER, adminUser.getNickName(), adminUser.getIsSuper());
List<UserMenuVO> userMenuVOList = roleMenuService.findAllMenu(user.getId());
List<UserMenuVO> userMenuVOList = roleMenuService.findAllMenu(authUser.getId());
//缓存权限列表
cache.put(CachePrefix.PERMISSION_LIST.getPrefix(UserEnums.MANAGER) + user.getId(), this.permissionList(userMenuVOList));
cache.put(CachePrefix.PERMISSION_LIST.getPrefix(UserEnums.MANAGER) + authUser.getId(), this.permissionList(userMenuVOList));
return tokenUtil.createToken(username, user, longTerm, UserEnums.MANAGER);
return tokenUtil.createToken(adminUser.getUsername(), authUser, longTerm, UserEnums.MANAGER);
}
@Override

View File

@ -11,6 +11,10 @@ public enum MemberTagsEnum {
* 会员注册
*/
MEMBER_REGISTER("会员注册"),
/**
* 会员注册
*/
MEMBER_LOGIN("会员登录"),
/**
* 会员签到
*/