|
|
@ -18,80 +18,148 @@ import com.tamguo.util.Result;
|
|
|
|
import com.tamguo.util.ShiroUtils;
|
|
|
|
import com.tamguo.util.ShiroUtils;
|
|
|
|
import com.tamguo.util.TamguoConstant;
|
|
|
|
import com.tamguo.util.TamguoConstant;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 使用 @Service 注解将这个类标记为Spring中的服务层组件,表明它主要负责处理与会员(Member)相关的业务逻辑,
|
|
|
|
|
|
|
|
// Spring会自动扫描并将其纳入到Spring容器管理中,方便在其他地方进行依赖注入等操作,遵循Spring的分层架构设计。
|
|
|
|
@Service
|
|
|
|
@Service
|
|
|
|
public class MemberService extends ServiceImpl<MemberMapper, MemberEntity> implements IMemberService{
|
|
|
|
public class MemberService extends ServiceImpl<MemberMapper, MemberEntity> implements IMemberService {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 通过Spring的依赖注入机制,自动注入 MemberMapper 接口的实现类实例,
|
|
|
|
|
|
|
|
// MemberMapper 是用于定义与会员实体(MemberEntity)相关的数据库操作方法的接口,比如查询、插入、更新等操作,
|
|
|
|
|
|
|
|
// 在本服务类中会调用它的方法来与数据库进行交互,获取会员相关的数据信息。
|
|
|
|
@Autowired
|
|
|
|
@Autowired
|
|
|
|
private MemberMapper memberMapper;
|
|
|
|
private MemberMapper memberMapper;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 同样通过依赖注入注入 CacheService 实例,CacheService 大概率是用于处理缓存相关操作的服务类,
|
|
|
|
|
|
|
|
// 例如从缓存中获取数据、将数据存入缓存以及判断缓存是否存在等功能,在会员相关业务中用于缓存如登录失败次数、验证码等信息,以优化业务操作性能。
|
|
|
|
@Autowired
|
|
|
|
@Autowired
|
|
|
|
private CacheService cacheService;
|
|
|
|
private CacheService cacheService;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* login 方法
|
|
|
|
|
|
|
|
* 实现了 IMemberService 接口中的 login 方法,用于处理会员登录业务逻辑,主要进行用户名密码验证以及登录失败次数相关的处理。
|
|
|
|
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public Result login(String username, String password) {
|
|
|
|
public Result login(String username, String password) {
|
|
|
|
|
|
|
|
// 首先通过 MemberMapper 的 findByUsername 方法,根据传入的用户名(username)从数据库中查找对应的会员实体信息,
|
|
|
|
|
|
|
|
// 如果没有找到(即返回 null),说明用户名不存在,直接返回相应的结果提示(用户名或密码有误),封装在 Result 对象中返回给调用者。
|
|
|
|
MemberEntity member = memberMapper.findByUsername(username);
|
|
|
|
MemberEntity member = memberMapper.findByUsername(username);
|
|
|
|
if(member == null){
|
|
|
|
if (member == null) {
|
|
|
|
return Result.result(201, member, "用户名或密码有误,请重新输入或找回密码");
|
|
|
|
return Result.result(201, member, "用户名或密码有误,请重新输入或找回密码");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Integer loginFailureCount = this.getLoginFailureCount(member);
|
|
|
|
|
|
|
|
if(!new Sha256Hash(password).toHex().equals(member.getPassword())){
|
|
|
|
// 获取当前会员的登录失败次数,调用本类中的 getLoginFailureCount 方法来获取,后续用于判断是否达到限制次数等情况。
|
|
|
|
|
|
|
|
Integer loginFailureCount = this.getLoginFailureCount(member);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 使用 Sha256Hash 对传入的密码进行哈希处理,并与数据库中存储的会员密码(member.getPassword())进行比对,
|
|
|
|
|
|
|
|
// 如果不相等,说明密码错误,此时将登录失败次数加 1,并调用 updateLoginFailureCount 方法更新缓存中的登录失败次数记录,
|
|
|
|
|
|
|
|
// 然后返回相应的错误提示结果(用户名或密码有误),封装在 Result 对象中。
|
|
|
|
|
|
|
|
if (!new Sha256Hash(password).toHex().equals(member.getPassword())) {
|
|
|
|
loginFailureCount++;
|
|
|
|
loginFailureCount++;
|
|
|
|
this.updateLoginFailureCount(member , loginFailureCount);
|
|
|
|
this.updateLoginFailureCount(member, loginFailureCount);
|
|
|
|
return Result.result(202, member, "用户名或密码有误,请重新输入或找回密码");
|
|
|
|
return Result.result(202, member, "用户名或密码有误,请重新输入或找回密码");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.updateLoginFailureCount(member , 0);
|
|
|
|
|
|
|
|
|
|
|
|
// 如果密码正确,将登录失败次数重置为 0(表示此次登录成功,清除之前的失败记录),调用 updateLoginFailureCount 方法更新缓存中的登录失败次数,
|
|
|
|
|
|
|
|
// 最后返回登录成功的结果提示,封装在 Result 对象中返回给调用者,表示会员登录成功。
|
|
|
|
|
|
|
|
this.updateLoginFailureCount(member, 0);
|
|
|
|
return Result.result(200, member, "登录成功");
|
|
|
|
return Result.result(200, member, "登录成功");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void updateLoginFailureCount(MemberEntity member , Integer loginFailureCount){
|
|
|
|
/**
|
|
|
|
cacheService.setObject(TamguoConstant.LOGIN_FAILURE_COUNT + member.getUid(), loginFailureCount , 2 * 60 * 60);
|
|
|
|
* updateLoginFailureCount 方法
|
|
|
|
|
|
|
|
* 用于更新会员的登录失败次数信息到缓存中,缓存的键名由 TamguoConstant.LOGIN_FAILURE_COUNT 和会员的唯一标识符(member.getUid())拼接而成,
|
|
|
|
|
|
|
|
* 值为传入的登录失败次数(loginFailureCount),同时设置了缓存的有效时间为 2 * 60 * 60 秒(即 2 小时),
|
|
|
|
|
|
|
|
// 这样在这 2 小时内,后续获取登录失败次数时会从缓存中读取该值,避免频繁访问数据库来获取和更新这个数据,提高业务操作效率。
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public void updateLoginFailureCount(MemberEntity member, Integer loginFailureCount) {
|
|
|
|
|
|
|
|
cacheService.setObject(TamguoConstant.LOGIN_FAILURE_COUNT + member.getUid(), loginFailureCount, 2 * 60 * 60);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public Integer getLoginFailureCount(MemberEntity member){
|
|
|
|
/**
|
|
|
|
if(member == null){
|
|
|
|
* getLoginFailureCount 方法
|
|
|
|
|
|
|
|
* 用于获取会员的登录失败次数,首先判断传入的会员实体是否为 null,如果是 null,则直接返回 0,表示没有登录失败次数记录(可能是新用户等情况)。
|
|
|
|
|
|
|
|
* 接着判断缓存中是否存在以 TamguoConstant.LOGIN_FAILURE_COUNT 和会员的唯一标识符(member.getUid())拼接而成的键对应的缓存数据,
|
|
|
|
|
|
|
|
// 如果不存在,同样返回 0,表示没有记录到该会员的登录失败次数;如果存在,则从缓存中获取对应的登录失败次数(类型转换为 Integer)并返回。
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public Integer getLoginFailureCount(MemberEntity member) {
|
|
|
|
|
|
|
|
if (member == null) {
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(!cacheService.isExist(TamguoConstant.LOGIN_FAILURE_COUNT + member.getUid())){
|
|
|
|
if (!cacheService.isExist(TamguoConstant.LOGIN_FAILURE_COUNT + member.getUid())) {
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return (Integer)cacheService.getObject(TamguoConstant.LOGIN_FAILURE_COUNT + member.getUid());
|
|
|
|
return (Integer) cacheService.getObject(TamguoConstant.LOGIN_FAILURE_COUNT + member.getUid());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* checkUsername 方法
|
|
|
|
|
|
|
|
* 实现了 IMemberService 接口中的 checkUsername 方法,用于检查用户名是否已被使用,
|
|
|
|
|
|
|
|
// 通过 MemberMapper 的 findByUsername 方法根据传入的用户名(username)从数据库中查找对应的会员实体,
|
|
|
|
|
|
|
|
// 如果找到(即返回的会员实体不为 null),说明用户名已经存在,返回相应的提示结果(该用户名已经存在),封装在 Result 对象中;
|
|
|
|
|
|
|
|
// 如果没有找到,则返回表示用户名可用的提示结果,同样封装在 Result 对象中返回给调用者。
|
|
|
|
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public Result checkUsername(String username) {
|
|
|
|
public Result checkUsername(String username) {
|
|
|
|
MemberEntity member = memberMapper.findByUsername(username);
|
|
|
|
MemberEntity member = memberMapper.findByUsername(username);
|
|
|
|
if(member != null){
|
|
|
|
if (member!= null) {
|
|
|
|
return Result.result(201, null, "该用户名已经存在");
|
|
|
|
return Result.result(201, null, "该用户名已经存在");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return Result.result(200, null, "该用户名可用");
|
|
|
|
return Result.result(200, null, "该用户名可用");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* checkMobile 方法
|
|
|
|
|
|
|
|
* 实现了 IMemberService 接口中的 checkMobile 方法,用于检查手机号是否已被使用,
|
|
|
|
|
|
|
|
// 通过 MemberMapper 的 findByMobile 方法根据传入的手机号(mobile)从数据库中查找对应的会员实体,
|
|
|
|
|
|
|
|
// 如果找到(即返回的会员实体不为 null),说明手机号已经存在,返回相应的提示结果(该手机号已经存在),封装在 Result 对象中;
|
|
|
|
|
|
|
|
// 如果没有找到,则返回表示手机号可用的提示结果,同样封装在 Result 对象中返回给调用者。
|
|
|
|
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public Result checkMobile(String mobile) {
|
|
|
|
public Result checkMobile(String mobile) {
|
|
|
|
MemberEntity member = memberMapper.findByMobile(mobile);
|
|
|
|
MemberEntity member = memberMapper.findByMobile(mobile);
|
|
|
|
if(member != null){
|
|
|
|
if (member!= null) {
|
|
|
|
return Result.result(201, null, "该手机号已经存在");
|
|
|
|
return Result.result(201, null, "该手机号已经存在");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return Result.result(200, null, "该手机号可用");
|
|
|
|
return Result.result(200, null, "该手机号可用");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Transactional(readOnly=false)
|
|
|
|
/**
|
|
|
|
|
|
|
|
* register 方法
|
|
|
|
|
|
|
|
* 实现了 IMemberService 接口中的 register 方法,用于处理会员注册业务逻辑,包含了对用户名、手机号是否已存在的检查,验证码验证以及会员信息插入数据库等操作,
|
|
|
|
|
|
|
|
* 被标记为可读写事务(通过 @Transactional(readOnly = false) 注解指定),因为涉及到对数据库的插入操作,需要保证事务的完整性。
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Transactional(readOnly = false)
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public Result register(MemberEntity member) {
|
|
|
|
public Result register(MemberEntity member) {
|
|
|
|
|
|
|
|
// 首先通过 MemberMapper 的 findByUsername 方法,根据传入的要注册的用户名(member.getUsername())从数据库中查找是否已存在该用户名的会员,
|
|
|
|
|
|
|
|
// 如果找到(即返回的会员实体不为 null),说明用户名已被使用,返回相应的提示结果(该用户已经存在),封装在 Result 对象中。
|
|
|
|
MemberEntity m = memberMapper.findByUsername(member.getUsername());
|
|
|
|
MemberEntity m = memberMapper.findByUsername(member.getUsername());
|
|
|
|
if(m != null){
|
|
|
|
if (m!= null) {
|
|
|
|
return Result.result(201, null, "该用户已经存在");
|
|
|
|
return Result.result(201, null, "该用户已经存在");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 接着通过 MemberMapper 的 findByMobile 方法,根据传入的要注册的手机号(member.getMobile())从数据库中查找是否已存在该手机号的会员,
|
|
|
|
|
|
|
|
// 如果找到(即返回的会员实体不为 null),说明手机号已被使用,返回相应的提示结果(该手机号已经存在),封装在 Result 对象中。
|
|
|
|
m = memberMapper.findByMobile(member.getMobile());
|
|
|
|
m = memberMapper.findByMobile(member.getMobile());
|
|
|
|
if(m != null){
|
|
|
|
if (m!= null) {
|
|
|
|
return Result.result(202, null, "该手机号已经存在");
|
|
|
|
return Result.result(202, null, "该手机号已经存在");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(!cacheService.isExist(TamguoConstant.ALIYUN_MOBILE_SMS_PREFIX + member.getMobile())){
|
|
|
|
|
|
|
|
|
|
|
|
// 检查缓存中是否存在以 TamguoConstant.ALIYUN_MOBILE_SMS_PREFIX 和要注册的手机号(member.getMobile())拼接而成的键对应的验证码缓存数据,
|
|
|
|
|
|
|
|
// 如果不存在,说明验证码错误(可能未发送或者已过期等情况),返回相应的提示结果(验证码错误),封装在 Result 对象中。
|
|
|
|
|
|
|
|
if (!cacheService.isExist(TamguoConstant.ALIYUN_MOBILE_SMS_PREFIX + member.getMobile())) {
|
|
|
|
return Result.result(203, null, "验证码错误");
|
|
|
|
return Result.result(203, null, "验证码错误");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 从缓存中获取对应的验证码,将获取到的验证码与传入的要注册的会员实体中的验证码(member.getVerifyCode())进行比对,
|
|
|
|
|
|
|
|
// 如果不相等,说明验证码错误,返回相应的提示结果(验证码错误),封装在 Result 对象中。
|
|
|
|
String code = (String) cacheService.getObject(TamguoConstant.ALIYUN_MOBILE_SMS_PREFIX + member.getMobile());
|
|
|
|
String code = (String) cacheService.getObject(TamguoConstant.ALIYUN_MOBILE_SMS_PREFIX + member.getMobile());
|
|
|
|
if(!code.equals(member.getVerifyCode())){
|
|
|
|
if (!code.equals(member.getVerifyCode())) {
|
|
|
|
return Result.result(204, null, "验证码错误");
|
|
|
|
return Result.result(204, null, "验证码错误");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 创建一个新的 MemberEntity 实例,用于存储要注册的会员信息,设置了一些默认值(如头像使用默认头像 TamguoConstant.DEFAULT_MEMBER_AVATAR),
|
|
|
|
|
|
|
|
// 并将传入的会员实体中的相关信息(如手机号、密码、用户名等)设置到新实例中,其中密码使用 Sha256Hash 进行哈希处理后存储,提高安全性。
|
|
|
|
MemberEntity entity = new MemberEntity();
|
|
|
|
MemberEntity entity = new MemberEntity();
|
|
|
|
entity.setAvatar(TamguoConstant.DEFAULT_MEMBER_AVATAR);
|
|
|
|
entity.setAvatar(TamguoConstant.DEFAULT_MEMBER_AVATAR);
|
|
|
|
entity.setMobile(member.getMobile());
|
|
|
|
entity.setMobile(member.getMobile());
|
|
|
@ -101,30 +169,51 @@ public class MemberService extends ServiceImpl<MemberMapper, MemberEntity> imple
|
|
|
|
entity.setSubjectId(member.getSubjectId());
|
|
|
|
entity.setSubjectId(member.getSubjectId());
|
|
|
|
entity.setCourseId(member.getCourseId());
|
|
|
|
entity.setCourseId(member.getCourseId());
|
|
|
|
entity.setEmail(member.getEmail());
|
|
|
|
entity.setEmail(member.getEmail());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 通过 MemberMapper 的 insert 方法将新的会员实体信息插入到数据库中,完成会员注册操作,
|
|
|
|
|
|
|
|
// 最后返回注册成功的提示结果,封装在 Result 对象中返回给调用者,表示会员注册成功。
|
|
|
|
memberMapper.insert(entity);
|
|
|
|
memberMapper.insert(entity);
|
|
|
|
return Result.result(200, entity, "注册成功");
|
|
|
|
return Result.result(200, entity, "注册成功");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* checkAccount 方法
|
|
|
|
|
|
|
|
* 实现了 IMemberService 接口中的 checkAccount 方法,用于检查账号(可以是用户名、邮箱或手机号,根据传入的 account 参数判断)是否存在,
|
|
|
|
|
|
|
|
// 首先判断传入的账号是否为空字符串,如果为空,说明账号不存在,返回相应的提示结果(帐号不存在!),封装在 Result 对象中。
|
|
|
|
|
|
|
|
// 接着通过 MemberMapper 的 findByUsernameOrEmailOrMobile 方法根据传入的账号从数据库中查找对应的会员实体,
|
|
|
|
|
|
|
|
// 如果没有找到(即返回的会员实体为 null),同样返回表示账号不存在的提示结果,封装在 Result 对象中;
|
|
|
|
|
|
|
|
// 如果找到,则返回表示该账号存在的提示结果,封装在 Result 对象中返回给调用者。
|
|
|
|
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public Result checkAccount(String account) {
|
|
|
|
public Result checkAccount(String account) {
|
|
|
|
if(StringUtils.isEmpty(account)){
|
|
|
|
if (StringUtils.isEmpty(account)) {
|
|
|
|
return Result.result(201, null, "帐号不存在!");
|
|
|
|
return Result.result(201, null, "帐号不存在!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
MemberEntity member = memberMapper.findByUsernameOrEmailOrMobile(account);
|
|
|
|
MemberEntity member = memberMapper.findByUsernameOrEmailOrMobile(account);
|
|
|
|
if(member == null){
|
|
|
|
if (member == null) {
|
|
|
|
return Result.result(201, null, "帐号不存在!");
|
|
|
|
return Result.result(201, null, "帐号不存在!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return Result.result(200, null, "该帐号存在");
|
|
|
|
return Result.result(200, null, "该帐号存在");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* confirmAccount 方法
|
|
|
|
|
|
|
|
* 实现了 IMemberService 接口中的 confirmAccount 方法,用于确认账号是否存在并验证验证码是否正确,
|
|
|
|
|
|
|
|
// 首先判断传入的账号是否为空字符串,如果为空,说明账号不存在,返回相应的提示结果(帐号不存在!),封装在 Result 对象中。
|
|
|
|
|
|
|
|
// 接着通过 MemberMapper 的 findByUsernameOrEmailOrMobile 方法根据传入的账号从数据库中查找对应的会员实体,
|
|
|
|
|
|
|
|
// 如果没有找到(即返回的会员实体为 null),同样返回表示账号不存在的提示结果,封装在 Result 对象中。
|
|
|
|
|
|
|
|
// 然后通过 ShiroUtils 的 getKaptcha 方法获取验证码(根据 Constants.KAPTCHA_SESSION_KEY 这个键从相应的会话等地方获取),
|
|
|
|
|
|
|
|
// 将获取到的验证码与传入的验证验证码(veritycode)进行比对,如果不相等,说明验证码错误,返回相应的提示结果(验证码错误),封装在 Result 对象中。
|
|
|
|
|
|
|
|
// 如果验证码正确,则返回表示该账号存在的提示结果,封装在 Result 对象中返回给调用者。
|
|
|
|
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public Result confirmAccount(String account, String veritycode) {
|
|
|
|
public Result confirmAccount(String account, String veritycode) {
|
|
|
|
if(StringUtils.isEmpty(account)){
|
|
|
|
if (StringUtils.isEmpty(account)) {
|
|
|
|
return Result.result(201, null, "帐号不存在!");
|
|
|
|
return Result.result(201, null, "帐号不存在!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
MemberEntity member = memberMapper.findByUsernameOrEmailOrMobile(account);
|
|
|
|
MemberEntity member = memberMapper.findByUsernameOrEmailOrMobile(account);
|
|
|
|
if(member == null){
|
|
|
|
if (member == null) {
|
|
|
|
return Result.result(201, null, "帐号不存在!");
|
|
|
|
return Result.result(201, null, "帐号不存在!");;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
String kaptcha = ShiroUtils.getKaptcha(Constants.KAPTCHA_SESSION_KEY);
|
|
|
|
String kaptcha = ShiroUtils.getKaptcha(Constants.KAPTCHA_SESSION_KEY);
|
|
|
|
if (!veritycode.equalsIgnoreCase(kaptcha)) {
|
|
|
|
if (!veritycode.equalsIgnoreCase(kaptcha)) {
|
|
|
@ -133,96 +222,37 @@ public class MemberService extends ServiceImpl<MemberMapper, MemberEntity> imple
|
|
|
|
return Result.result(200, member, "该帐号存在");
|
|
|
|
return Result.result(200, member, "该帐号存在");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* securityCheck 方法
|
|
|
|
|
|
|
|
* 实现了 IMemberService 接口中的 securityCheck 方法,用于进行安全验证,根据传入的 isEmail 参数判断是验证邮箱验证码还是手机号验证码,
|
|
|
|
|
|
|
|
// 首先通过 MemberMapper 的 findByUsername 方法根据传入的用户名(username)从数据库中查找对应的会员实体,
|
|
|
|
|
|
|
|
// 如果 isEmail 参数为 "1",表示验证邮箱验证码,此时检查缓存中是否存在以 TamguoConstant.ALIYUN_MAIL_FIND_PASSWORD_PREFIX 和会员的邮箱(member.getEmail())拼接而成的键对应的验证码缓存数据,
|
|
|
|
|
|
|
|
// 如果不存在,说明验证码错误,返回相应的提示结果(验证码错误),封装在 Result 对象中。
|
|
|
|
|
|
|
|
// 接着从缓存中获取对应的验证码,将获取到的验证码与传入的验证验证码(vcode)进行比对,如果不相等,说明验证码错误,返回相应的提示结果(验证码错误),封装在 Result 对象中。
|
|
|
|
|
|
|
|
// 如果 isEmail 参数不为 "1",表示验证手机号验证码,进行类似的操作,检查手机号对应的验证码缓存数据是否存在以及比对验证码是否正确,
|
|
|
|
|
|
|
|
// 如果验证通过,生成一个唯一的随机字符串(使用 UUID.randomUUID().toString())作为键,将用户名存入缓存中(缓存键名为 TamguoConstant.SECURITY_CHECK_PREFIX 加上生成的随机字符串),
|
|
|
|
|
|
|
|
// 设置缓存的有效时间为 2 * 60 * 60 秒(即 2 小时),最后返回安全验证通过的提示结果,封装在 Result 对象中返回给调用者,同时将生成的随机字符串作为结果数据返回。
|
|
|
|
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public Result securityCheck(String username , String isEmail , String vcode) {
|
|
|
|
public Result securityCheck(String username, String isEmail, String vcode) {
|
|
|
|
MemberEntity member = memberMapper.findByUsername(username);
|
|
|
|
MemberEntity member = memberMapper.findByUsername(username);
|
|
|
|
if("1".equals(isEmail)){
|
|
|
|
if ("1".equals(isEmail)) {
|
|
|
|
if(!cacheService.isExist(TamguoConstant.ALIYUN_MAIL_FIND_PASSWORD_PREFIX + member.getEmail())){
|
|
|
|
if (!cacheService.isExist(TamguoConstant.ALIYUN_MAIL_FIND_PASSWORD_PREFIX + member.getEmail())) {
|
|
|
|
return Result.result(201, member, "验证码错误");
|
|
|
|
return Result.result(201, member, "验证码错误");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
String code = (String) cacheService.getObject(TamguoConstant.ALIYUN_MAIL_FIND_PASSWORD_PREFIX + member.getEmail());
|
|
|
|
String code = (String) cacheService.getObject(TamguoConstant.ALIYUN_MAIL_FIND_PASSWORD_PREFIX + member.getEmail());
|
|
|
|
if(!code.equals(vcode)){
|
|
|
|
if (!code.equals(vcode)) {
|
|
|
|
return Result.result(202, member, "验证码错误");
|
|
|
|
return Result.result(202, member, "验证码错误");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}else{
|
|
|
|
} else {
|
|
|
|
if(!cacheService.isExist(TamguoConstant.ALIYUN_MOBILE_SMS_PREFIX + member.getMobile())){
|
|
|
|
if (!cacheService.isExist(TamguoConstant.ALIYUN_MOBILE_SMS_PREFIX + member.getMobile())) {
|
|
|
|
return Result.result(203, member, "验证码错误");
|
|
|
|
return Result.result(203, member, "验证码错误");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
String code = (String) cacheService.getObject(TamguoConstant.ALIYUN_MOBILE_SMS_PREFIX + member.getMobile());
|
|
|
|
String code = (String) cacheService.getObject(TamguoConstant.ALIYUN_MOBILE_SMS_PREFIX + member.getMobile());
|
|
|
|
if(!code.equals(vcode)){
|
|
|
|
if (!code.equals(vcode)) {
|
|
|
|
return Result.result(204, member, "验证码错误");
|
|
|
|
return Result.result(204, member, "验证码错误");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
String key = UUID.randomUUID().toString();
|
|
|
|
String key = UUID.randomUUID().toString();
|
|
|
|
cacheService.setObject(TamguoConstant.SECURITY_CHECK_PREFIX + key, username , 2 * 60 * 60);
|
|
|
|
cacheService.setObject(TamguoConstant.SECURITY_CHECK_PREFIX + key, username, 2 * 60 * 60);
|
|
|
|
return Result.result(200, key, "安全验证通过");
|
|
|
|
return Result.result(200
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public Result resetPassword(String resetPasswordKey , String username , String password, String verifypwd) {
|
|
|
|
|
|
|
|
if(cacheService.isExist(TamguoConstant.SECURITY_CHECK_PREFIX + resetPasswordKey)){
|
|
|
|
|
|
|
|
MemberEntity member = memberMapper.findByUsername(username);
|
|
|
|
|
|
|
|
if(password.equals(verifypwd)){
|
|
|
|
|
|
|
|
member.setPassword(new Sha256Hash(password).toHex());
|
|
|
|
|
|
|
|
memberMapper.updateById(member);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return Result.result(200, null, "更新成功");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Transactional(readOnly=false)
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public void updateMember(MemberEntity member) {
|
|
|
|
|
|
|
|
MemberEntity entity = memberMapper.selectById(ShiroUtils.getUserId());
|
|
|
|
|
|
|
|
entity.setAvatar(member.getAvatar());
|
|
|
|
|
|
|
|
entity.setEmail(member.getEmail());
|
|
|
|
|
|
|
|
entity.setMobile(member.getMobile());
|
|
|
|
|
|
|
|
entity.setCourseId(member.getCourseId());
|
|
|
|
|
|
|
|
entity.setSubjectId(member.getSubjectId());
|
|
|
|
|
|
|
|
entity.setNickName(member.getNickName());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
memberMapper.updateById(entity);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Transactional(readOnly=true)
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public MemberEntity findByUid(String uid) {
|
|
|
|
|
|
|
|
return memberMapper.selectById(uid);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Transactional(readOnly=true)
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public MemberEntity findByUsername(String username) {
|
|
|
|
|
|
|
|
return memberMapper.findByUsername(username);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Transactional(readOnly=false)
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public void updateLastLoginTime(String uid) {
|
|
|
|
|
|
|
|
MemberEntity member = memberMapper.selectById(uid);
|
|
|
|
|
|
|
|
member.setLastLoginTime(DateUtil.getTime());
|
|
|
|
|
|
|
|
memberMapper.updateById(member);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public MemberEntity findCurrMember() {
|
|
|
|
|
|
|
|
MemberEntity member = memberMapper.selectById(ShiroUtils.getUserId());
|
|
|
|
|
|
|
|
member.setPassword(null);
|
|
|
|
|
|
|
|
return member;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Transactional(readOnly=false)
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public Result updatePwd(MemberEntity member) {
|
|
|
|
|
|
|
|
MemberEntity entity = memberMapper.selectById(ShiroUtils.getUserId());
|
|
|
|
|
|
|
|
if(!entity.getPassword().equals(new Sha256Hash(member.getPassword()).toHex())) {
|
|
|
|
|
|
|
|
return Result.result(501, null, "旧密码错误!");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!cacheService.isExist(TamguoConstant.ALIYUN_MOBILE_SMS_PREFIX + member.getMobile())){
|
|
|
|
|
|
|
|
return Result.result(502, null, "验证码错误");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
entity.setPassword(new Sha256Hash(member.getNowPassword()).toHex());
|
|
|
|
|
|
|
|
return Result.result(0, null, "修改成功");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|