mirror of https://gitee.com/stylefeng/roses
【7.0.4】【c】更新登录注册等接口
parent
2b715d90fe
commit
65710cc505
|
@ -16,6 +16,14 @@
|
|||
<packaging>jar</packaging>
|
||||
|
||||
<dependencies>
|
||||
|
||||
<!--config模块的api-->
|
||||
<dependency>
|
||||
<groupId>cn.stylefeng.roses</groupId>
|
||||
<artifactId>config-api</artifactId>
|
||||
<version>${roses.version}</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
|
|
|
@ -41,7 +41,12 @@ public enum CustomerExceptionEnum implements AbstractExceptionEnum {
|
|||
/**
|
||||
* 查询不到对应用户
|
||||
*/
|
||||
CANT_FIND_CUSTOMER(RuleConstants.BUSINESS_ERROR_TYPE_CODE + CustomerConstants.CUSTOMER_EXCEPTION_STEP_CODE + "01", "查询不到对应用户,用户id是:{}");
|
||||
CANT_FIND_CUSTOMER(RuleConstants.BUSINESS_ERROR_TYPE_CODE + CustomerConstants.CUSTOMER_EXCEPTION_STEP_CODE + "01", "查询不到对应用户,用户信息:{}"),
|
||||
|
||||
/**
|
||||
* 用户状态异常
|
||||
*/
|
||||
CUSTOMER_STATUS_ERROR(RuleConstants.BUSINESS_ERROR_TYPE_CODE + CustomerConstants.CUSTOMER_EXCEPTION_STEP_CODE + "02", "用户被禁用,请联系管理员!{}");
|
||||
|
||||
/**
|
||||
* 错误编码
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
package cn.stylefeng.roses.kernel.customer.api.expander;
|
||||
|
||||
|
||||
import cn.stylefeng.roses.kernel.config.api.context.ConfigContext;
|
||||
|
||||
/**
|
||||
* C端用户的配置
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/6/7 15:38
|
||||
*/
|
||||
public class CustomerConfigExpander {
|
||||
|
||||
/**
|
||||
* 获取注册邮件的标题
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/6/7 15:42
|
||||
*/
|
||||
public static String getRegMailTitle() {
|
||||
return ConfigContext.me().getSysConfigValueWithDefault("CUSTOMER_REG_EMAIL_TITLE", String.class, "Guns官方论坛-激活");
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取注册邮件的内容模板
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/6/7 15:42
|
||||
*/
|
||||
public static String getRegMailContent() {
|
||||
return ConfigContext.me().getSysConfigValueWithDefault("CUSTOMER_REG_EMAIL_CONTENT", String.class, "感谢您注册Guns官方论坛,请点击此激活链接激活您的账户:<a href=\"http://localhost:8080/customer/active?verifyCode={}\">https://localhost:8080/customer/active?verifyCode={}</a>");
|
||||
}
|
||||
|
||||
}
|
|
@ -24,6 +24,22 @@
|
|||
<version>${roses.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!--jwt api-->
|
||||
<!--生成jwt秘钥-->
|
||||
<dependency>
|
||||
<groupId>cn.stylefeng.roses</groupId>
|
||||
<artifactId>jwt-api</artifactId>
|
||||
<version>${roses.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!--log api-->
|
||||
<!--记录登录日志-->
|
||||
<dependency>
|
||||
<groupId>cn.stylefeng.roses</groupId>
|
||||
<artifactId>log-api</artifactId>
|
||||
<version>${roses.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!--资源api模块-->
|
||||
<!--用在资源控制器,资源扫描上-->
|
||||
<dependency>
|
||||
|
@ -40,6 +56,14 @@
|
|||
<version>${roses.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!--邮件发送模块-->
|
||||
<!--用在控制器,参数校验-->
|
||||
<dependency>
|
||||
<groupId>cn.stylefeng.roses</groupId>
|
||||
<artifactId>email-spring-boot-starter</artifactId>
|
||||
<version>${roses.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!--数据库sdk-->
|
||||
<!--数据库初始化-->
|
||||
<dependency>
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package cn.stylefeng.roses.kernel.customer.modular.controller;
|
||||
|
||||
import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginRequest;
|
||||
import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginResponse;
|
||||
import cn.stylefeng.roses.kernel.customer.modular.request.CustomerRequest;
|
||||
import cn.stylefeng.roses.kernel.customer.modular.service.CustomerService;
|
||||
import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData;
|
||||
|
@ -26,6 +28,42 @@ public class CustomerController {
|
|||
@Resource
|
||||
private CustomerService customerService;
|
||||
|
||||
/**
|
||||
* 注册C端用户
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/06/07 11:40
|
||||
*/
|
||||
@PostResource(name = "注册C端用户", path = "/customer/reg", requiredPermission = false, requiredLogin = false)
|
||||
public ResponseData reg(@RequestBody @Validated(CustomerRequest.reg.class) CustomerRequest customerRequest) {
|
||||
customerService.reg(customerRequest);
|
||||
return new SuccessResponseData();
|
||||
}
|
||||
|
||||
/**
|
||||
* 激活C端用户
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/6/7 16:03
|
||||
*/
|
||||
@GetResource(name = "激活C端用户", path = "/customer/active", requiredPermission = false, requiredLogin = false)
|
||||
public ResponseData active(@Validated(CustomerRequest.active.class) CustomerRequest customerRequest) {
|
||||
customerService.active(customerRequest);
|
||||
return new SuccessResponseData();
|
||||
}
|
||||
|
||||
/**
|
||||
* C端用户登录
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/06/07 11:40
|
||||
*/
|
||||
@PostResource(name = "C端用户登录", path = "/customer/login", requiredPermission = false, requiredLogin = false)
|
||||
public ResponseData login(@RequestBody @Validated LoginRequest loginRequest) {
|
||||
LoginResponse loginResponse = customerService.login(loginRequest);
|
||||
return new SuccessResponseData(loginResponse);
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加
|
||||
*
|
||||
|
|
|
@ -9,6 +9,8 @@ import com.baomidou.mybatisplus.annotation.TableName;
|
|||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* C端用户表实例类
|
||||
*
|
||||
|
@ -35,7 +37,7 @@ public class Customer extends BaseEntity {
|
|||
private String account;
|
||||
|
||||
/**
|
||||
* 密码
|
||||
* 密码,BCrypt
|
||||
*/
|
||||
@TableField("password")
|
||||
@ChineseDescription("密码")
|
||||
|
@ -45,7 +47,7 @@ public class Customer extends BaseEntity {
|
|||
* 昵称(显示名称)
|
||||
*/
|
||||
@TableField("nick_name")
|
||||
@ChineseDescription("昵称(显示名称)")
|
||||
@ChineseDescription("昵称")
|
||||
private String nickName;
|
||||
|
||||
/**
|
||||
|
@ -62,11 +64,25 @@ public class Customer extends BaseEntity {
|
|||
@ChineseDescription("手机")
|
||||
private String telephone;
|
||||
|
||||
/**
|
||||
* 邮箱或手机验证码
|
||||
*/
|
||||
@TableField("verify_code")
|
||||
@ChineseDescription("邮箱或手机验证码")
|
||||
private String verifyCode;
|
||||
|
||||
/**
|
||||
* 是否已经邮箱或手机验证通过:Y-通过,N-未通过
|
||||
*/
|
||||
@TableField("verified_flag")
|
||||
@ChineseDescription("是否已经邮箱或手机验证通过")
|
||||
private String verifiedFlag;
|
||||
|
||||
/**
|
||||
* 用户头像(文件表id)
|
||||
*/
|
||||
@TableField("avatar")
|
||||
@ChineseDescription("用户头像(文件表id)")
|
||||
@ChineseDescription("用户头像")
|
||||
private Long avatar;
|
||||
|
||||
/**
|
||||
|
@ -83,4 +99,25 @@ public class Customer extends BaseEntity {
|
|||
@ChineseDescription("用户积分")
|
||||
private Integer score;
|
||||
|
||||
/**
|
||||
* 用户状态:1-启用,2-禁用
|
||||
*/
|
||||
@TableField("status_flag")
|
||||
@ChineseDescription("用户状态:1-启用,2-禁用")
|
||||
private Integer statusFlag;
|
||||
|
||||
/**
|
||||
* 上次登录ip
|
||||
*/
|
||||
@TableField("last_login_ip")
|
||||
@ChineseDescription("上次登录ip")
|
||||
private String lastLoginIp;
|
||||
|
||||
/**
|
||||
* 上次登录时间
|
||||
*/
|
||||
@TableField("last_login_time")
|
||||
@ChineseDescription("上次登录时间")
|
||||
private Date lastLoginTime;
|
||||
|
||||
}
|
|
@ -0,0 +1,107 @@
|
|||
package cn.stylefeng.roses.kernel.customer.modular.factory;
|
||||
|
||||
import cn.hutool.core.util.RandomUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.extra.spring.SpringUtil;
|
||||
import cn.stylefeng.roses.kernel.auth.api.password.PasswordStoredEncryptApi;
|
||||
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
|
||||
import cn.stylefeng.roses.kernel.auth.api.pojo.login.basic.SimpleUserInfo;
|
||||
import cn.stylefeng.roses.kernel.customer.api.expander.CustomerConfigExpander;
|
||||
import cn.stylefeng.roses.kernel.customer.modular.entity.Customer;
|
||||
import cn.stylefeng.roses.kernel.customer.modular.request.CustomerRequest;
|
||||
import cn.stylefeng.roses.kernel.email.api.pojo.SendMailParam;
|
||||
import cn.stylefeng.roses.kernel.rule.enums.StatusEnum;
|
||||
import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* C端用户实体组装
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/6/7 15:10
|
||||
*/
|
||||
public class CustomerFactory {
|
||||
|
||||
/**
|
||||
* 创建注册用户实体
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/6/7 15:10
|
||||
*/
|
||||
public static Customer createRegCustomer(CustomerRequest customerRequest) {
|
||||
|
||||
Customer customer = new Customer();
|
||||
|
||||
// 账号
|
||||
customer.setAccount(customerRequest.getAccount());
|
||||
|
||||
// 密码
|
||||
PasswordStoredEncryptApi passwordStoredEncryptApi = SpringUtil.getBean(PasswordStoredEncryptApi.class);
|
||||
customer.setPassword(passwordStoredEncryptApi.encrypt(customerRequest.getPassword()));
|
||||
|
||||
// 昵称
|
||||
customer.setNickName(customerRequest.getNickName());
|
||||
|
||||
// 邮箱
|
||||
customer.setEmail(customerRequest.getEmail());
|
||||
|
||||
// 生成随机邮箱验证码
|
||||
customer.setVerifyCode(RandomUtil.randomString(29).toUpperCase());
|
||||
|
||||
// 设置是否已经验证,未验证
|
||||
customer.setVerifiedFlag(YesOrNotEnum.N.getCode());
|
||||
|
||||
// 设置默认头像
|
||||
customer.setAvatar(10000L);
|
||||
customer.setAvatarObjectName("10000.png");
|
||||
|
||||
// 设置默认积分0
|
||||
customer.setScore(0);
|
||||
|
||||
// 设置状态
|
||||
customer.setStatusFlag(StatusEnum.ENABLE.getCode());
|
||||
|
||||
return customer;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建发送注册激活邮件的参数
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/6/7 15:27
|
||||
*/
|
||||
public static SendMailParam createRegEmailParam(String mail, String verifyCode) {
|
||||
String title = CustomerConfigExpander.getRegMailTitle();
|
||||
String template = CustomerConfigExpander.getRegMailContent();
|
||||
|
||||
SendMailParam sendMailParam = new SendMailParam();
|
||||
sendMailParam.setTo(mail);
|
||||
sendMailParam.setTitle(title);
|
||||
sendMailParam.setContent(StrUtil.format(template, verifyCode, verifyCode));
|
||||
return sendMailParam;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建loginUser对象
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/6/7 17:06
|
||||
*/
|
||||
public static LoginUser createLoginUser(Customer customer) {
|
||||
LoginUser loginUser = new LoginUser();
|
||||
loginUser.setUserId(customer.getCustomerId());
|
||||
loginUser.setAccount(customer.getAccount());
|
||||
loginUser.setLoginTime(new Date());
|
||||
|
||||
SimpleUserInfo simpleUserInfo = new SimpleUserInfo();
|
||||
simpleUserInfo.setAvatar(customer.getAvatar());
|
||||
simpleUserInfo.setNickName(customer.getNickName());
|
||||
simpleUserInfo.setEmail(customer.getEmail());
|
||||
simpleUserInfo.setPhone(customer.getTelephone());
|
||||
loginUser.setSimpleUserInfo(simpleUserInfo);
|
||||
|
||||
return loginUser;
|
||||
}
|
||||
|
||||
}
|
|
@ -2,6 +2,7 @@ package cn.stylefeng.roses.kernel.customer.modular.request;
|
|||
|
||||
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
|
||||
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
|
||||
import cn.stylefeng.roses.kernel.validator.api.validators.unique.TableUniqueValue;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
|
@ -28,28 +29,43 @@ public class CustomerRequest extends BaseRequest {
|
|||
/**
|
||||
* 账号
|
||||
*/
|
||||
@NotBlank(message = "账号不能为空", groups = {add.class, edit.class})
|
||||
@ChineseDescription("账号")
|
||||
@NotBlank(message = "账号不能为空", groups = {add.class, edit.class, reg.class})
|
||||
@TableUniqueValue(
|
||||
message = "账号存在重复,请从新输入账号",
|
||||
groups = reg.class,
|
||||
tableName = "toc_customer",
|
||||
columnName = "account",
|
||||
idFieldName = "customer_id")
|
||||
private String account;
|
||||
|
||||
/**
|
||||
* 密码
|
||||
* 密码,BCrypt
|
||||
*/
|
||||
@NotBlank(message = "密码不能为空", groups = {add.class, edit.class})
|
||||
@ChineseDescription("密码")
|
||||
@NotBlank(message = "密码,BCrypt不能为空", groups = {add.class, edit.class, reg.class})
|
||||
private String password;
|
||||
|
||||
/**
|
||||
* 昵称(显示名称)
|
||||
*/
|
||||
@NotBlank(message = "昵称(显示名称)不能为空", groups = {add.class, edit.class})
|
||||
@ChineseDescription("昵称(显示名称)")
|
||||
@ChineseDescription("昵称")
|
||||
@NotBlank(message = "昵称(显示名称)不能为空", groups = {add.class, edit.class, reg.class})
|
||||
private String nickName;
|
||||
|
||||
/**
|
||||
* 邮箱
|
||||
* <p>
|
||||
* 注册时,必填邮箱
|
||||
*/
|
||||
@ChineseDescription("邮箱")
|
||||
@NotBlank(message = "邮箱不能为空", groups = {reg.class})
|
||||
@TableUniqueValue(
|
||||
message = "邮箱存在重复,请从新输入邮箱",
|
||||
groups = reg.class,
|
||||
tableName = "toc_customer",
|
||||
columnName = "email",
|
||||
idFieldName = "customer_id")
|
||||
private String email;
|
||||
|
||||
/**
|
||||
|
@ -58,10 +74,23 @@ public class CustomerRequest extends BaseRequest {
|
|||
@ChineseDescription("手机")
|
||||
private String telephone;
|
||||
|
||||
/**
|
||||
* 邮箱或手机验证码
|
||||
*/
|
||||
@ChineseDescription("邮箱或手机验证码")
|
||||
@NotBlank(message = "激活码不能为空", groups = active.class)
|
||||
private String verifyCode;
|
||||
|
||||
/**
|
||||
* 是否已经邮箱或手机验证通过:Y-通过,N-未通过
|
||||
*/
|
||||
@ChineseDescription("是否已经邮箱或手机验证通过")
|
||||
private String verifiedFlag;
|
||||
|
||||
/**
|
||||
* 用户头像(文件表id)
|
||||
*/
|
||||
@ChineseDescription("用户头像(文件表id)")
|
||||
@ChineseDescription("用户头像")
|
||||
private Long avatar;
|
||||
|
||||
/**
|
||||
|
@ -76,4 +105,22 @@ public class CustomerRequest extends BaseRequest {
|
|||
@ChineseDescription("用户积分")
|
||||
private Integer score;
|
||||
|
||||
/**
|
||||
* 用户状态:1-启用,2-禁用
|
||||
*/
|
||||
@ChineseDescription("用户状态:1-启用,2-禁用")
|
||||
private Integer statusFlag;
|
||||
|
||||
/**
|
||||
* 注册账号
|
||||
*/
|
||||
public @interface reg {
|
||||
}
|
||||
|
||||
/**
|
||||
* 激活账号
|
||||
*/
|
||||
public @interface active {
|
||||
}
|
||||
|
||||
}
|
|
@ -1,5 +1,7 @@
|
|||
package cn.stylefeng.roses.kernel.customer.modular.service;
|
||||
|
||||
import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginRequest;
|
||||
import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginResponse;
|
||||
import cn.stylefeng.roses.kernel.customer.modular.entity.Customer;
|
||||
import cn.stylefeng.roses.kernel.customer.modular.request.CustomerRequest;
|
||||
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
|
||||
|
@ -15,6 +17,30 @@ import java.util.List;
|
|||
*/
|
||||
public interface CustomerService extends IService<Customer> {
|
||||
|
||||
/**
|
||||
* 注册用户
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/06/07 11:40
|
||||
*/
|
||||
void reg(CustomerRequest customerRequest);
|
||||
|
||||
/**
|
||||
* 激活用户
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/06/07 11:40
|
||||
*/
|
||||
void active(CustomerRequest customerRequest);
|
||||
|
||||
/**
|
||||
* C端用户登录
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/6/7 16:20
|
||||
*/
|
||||
LoginResponse login(LoginRequest loginRequest);
|
||||
|
||||
/**
|
||||
* 新增
|
||||
*
|
||||
|
|
|
@ -2,20 +2,43 @@ package cn.stylefeng.roses.kernel.customer.modular.service.impl;
|
|||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.stylefeng.roses.kernel.auth.api.SessionManagerApi;
|
||||
import cn.stylefeng.roses.kernel.auth.api.exception.AuthException;
|
||||
import cn.stylefeng.roses.kernel.auth.api.exception.enums.AuthExceptionEnum;
|
||||
import cn.stylefeng.roses.kernel.auth.api.expander.AuthConfigExpander;
|
||||
import cn.stylefeng.roses.kernel.auth.api.password.PasswordStoredEncryptApi;
|
||||
import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginRequest;
|
||||
import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginResponse;
|
||||
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
|
||||
import cn.stylefeng.roses.kernel.customer.api.exception.CustomerException;
|
||||
import cn.stylefeng.roses.kernel.customer.api.exception.enums.CustomerExceptionEnum;
|
||||
import cn.stylefeng.roses.kernel.customer.modular.entity.Customer;
|
||||
import cn.stylefeng.roses.kernel.customer.modular.factory.CustomerFactory;
|
||||
import cn.stylefeng.roses.kernel.customer.modular.mapper.CustomerMapper;
|
||||
import cn.stylefeng.roses.kernel.customer.modular.request.CustomerRequest;
|
||||
import cn.stylefeng.roses.kernel.customer.modular.service.CustomerService;
|
||||
import cn.stylefeng.roses.kernel.db.api.factory.PageFactory;
|
||||
import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
|
||||
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
|
||||
import cn.stylefeng.roses.kernel.email.api.MailSenderApi;
|
||||
import cn.stylefeng.roses.kernel.email.api.pojo.SendMailParam;
|
||||
import cn.stylefeng.roses.kernel.jwt.api.context.JwtContext;
|
||||
import cn.stylefeng.roses.kernel.jwt.api.pojo.payload.DefaultJwtPayload;
|
||||
import cn.stylefeng.roses.kernel.log.api.LoginLogServiceApi;
|
||||
import cn.stylefeng.roses.kernel.rule.enums.StatusEnum;
|
||||
import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum;
|
||||
import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
|
||||
import cn.stylefeng.roses.kernel.rule.exception.enums.defaults.DefaultBusinessExceptionEnum;
|
||||
import cn.stylefeng.roses.kernel.rule.util.HttpServletUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
|
@ -27,6 +50,108 @@ import java.util.List;
|
|||
@Service
|
||||
public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> implements CustomerService {
|
||||
|
||||
/**
|
||||
* 用于操作缓存时候加锁
|
||||
*/
|
||||
private static final Object SESSION_OPERATE_LOCK = new Object();
|
||||
|
||||
@Resource
|
||||
private MailSenderApi mailSenderApi;
|
||||
|
||||
@Resource
|
||||
private PasswordStoredEncryptApi passwordStoredEncryptApi;
|
||||
|
||||
@Resource
|
||||
private SessionManagerApi sessionManagerApi;
|
||||
|
||||
@Resource
|
||||
private LoginLogServiceApi loginLogServiceApi;
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void reg(CustomerRequest customerRequest) {
|
||||
|
||||
// 创建C端用户
|
||||
Customer regCustomer = CustomerFactory.createRegCustomer(customerRequest);
|
||||
|
||||
// 保存用户
|
||||
this.save(regCustomer);
|
||||
|
||||
// 发送邮箱验证码
|
||||
SendMailParam regEmailParam = CustomerFactory.createRegEmailParam(regCustomer.getEmail(), regCustomer.getVerifyCode());
|
||||
mailSenderApi.sendMail(regEmailParam);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void active(CustomerRequest customerRequest) {
|
||||
|
||||
// 更新验证码的账号为激活状态
|
||||
LambdaUpdateWrapper<Customer> wrapper = new LambdaUpdateWrapper<>();
|
||||
wrapper.set(Customer::getVerifiedFlag, YesOrNotEnum.Y.getCode());
|
||||
wrapper.eq(Customer::getVerifyCode, customerRequest.getVerifyCode());
|
||||
this.update(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LoginResponse login(LoginRequest loginRequest) {
|
||||
|
||||
// 不创建cookie,默认开启记住我(7天会话)
|
||||
loginRequest.setCreateCookie(false);
|
||||
loginRequest.setRememberMe(true);
|
||||
|
||||
// 查询用户信息
|
||||
LambdaQueryWrapper<Customer> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(Customer::getAccount, loginRequest.getAccount())
|
||||
.or().eq(Customer::getEmail, loginRequest.getAccount())
|
||||
.or().eq(Customer::getTelephone, loginRequest.getAccount());
|
||||
Customer customer = this.getOne(wrapper, false);
|
||||
if (customer == null) {
|
||||
throw new CustomerException(CustomerExceptionEnum.CANT_FIND_CUSTOMER, loginRequest.getAccount());
|
||||
}
|
||||
|
||||
// 校验用户密码
|
||||
Boolean passwordFlag = passwordStoredEncryptApi.checkPassword(loginRequest.getPassword(), customer.getPassword());
|
||||
if (!passwordFlag) {
|
||||
throw new AuthException(AuthExceptionEnum.USERNAME_PASSWORD_ERROR);
|
||||
}
|
||||
|
||||
// 校验用户状态
|
||||
if (!StatusEnum.ENABLE.getCode().equals(customer.getStatusFlag())) {
|
||||
throw new CustomerException(CustomerExceptionEnum.CUSTOMER_STATUS_ERROR, customer.getStatusFlag());
|
||||
}
|
||||
|
||||
// 获取LoginUser,用于用户的缓存
|
||||
LoginUser loginUser = CustomerFactory.createLoginUser(customer);
|
||||
|
||||
// 生成用户的token
|
||||
DefaultJwtPayload defaultJwtPayload = new DefaultJwtPayload(loginUser.getUserId(), loginUser.getAccount(), loginRequest.getRememberMe(), null);
|
||||
String jwtToken = JwtContext.me().generateTokenDefaultPayload(defaultJwtPayload);
|
||||
loginUser.setToken(jwtToken);
|
||||
|
||||
synchronized (SESSION_OPERATE_LOCK) {
|
||||
// 缓存用户信息,创建会话
|
||||
sessionManagerApi.createSession(jwtToken, loginUser, loginRequest.getCreateCookie());
|
||||
|
||||
// 如果开启了单账号单端在线,则踢掉已经上线的该用户
|
||||
if (AuthConfigExpander.getSingleAccountLoginFlag()) {
|
||||
sessionManagerApi.removeSessionExcludeToken(jwtToken);
|
||||
}
|
||||
}
|
||||
|
||||
// 更新用户ip和登录时间
|
||||
String ip = HttpServletUtil.getRequestClientIp(HttpServletUtil.getRequest());
|
||||
LambdaUpdateWrapper<Customer> updateWrapper = new LambdaUpdateWrapper<>();
|
||||
updateWrapper.set(Customer::getLastLoginIp, ip);
|
||||
updateWrapper.set(Customer::getLastLoginTime, new Date());
|
||||
this.update(updateWrapper);
|
||||
|
||||
// 登录成功日志
|
||||
loginLogServiceApi.loginSuccess(loginUser.getUserId());
|
||||
|
||||
// 组装返回结果
|
||||
return new LoginResponse(loginUser, jwtToken, defaultJwtPayload.getExpirationDate());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add(CustomerRequest customerRequest) {
|
||||
Customer customer = new Customer();
|
||||
|
|
Loading…
Reference in New Issue