完整管理员登陆接口的开发

This commit is contained in:
YunaiV
2020-07-04 16:20:33 +08:00
parent ee6fa2b805
commit bedaaf0999
37 changed files with 596 additions and 251 deletions

View File

@@ -25,9 +25,8 @@ public enum SystemErrorCodeEnum implements ServiceExceptionUtil.Enumerable<Syste
// ========== 管理员模块 1002002000 ==========
ADMIN_NOT_FOUND(1002002000, "管理员不存在"),
// 废弃 ADMIN_USERNAME_NOT_REGISTERED(1002002000, "账号不存在"),
// 废弃 ADMIN_PASSWORD_ERROR(1002002001, "密码不正确"),
// ADMIN_IS_DISABLE(1002002002, "账号被禁用"),
ADMIN_PASSWORD_ERROR(1002002001, "密码不正确"),
ADMIN_IS_DISABLE(1002002002, "账号被禁用"),
// ADMIN_USERNAME_EXISTS(1002002002, "账号已经存在"),
// ADMIN_STATUS_EQUALS(1002002003, "账号已经是该状态"),
// ADMIN_DELETE_ONLY_DISABLE(1002002004, "只有关闭的账号才可以删除"),

View File

@@ -0,0 +1,14 @@
package cn.iocoder.mall.systemservice.rpc.admin;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.systemservice.rpc.admin.dto.AdminVerifyPasswordDTO;
import cn.iocoder.mall.systemservice.rpc.admin.vo.AdminVO;
/**
* 管理员 RPC 接口
*/
public interface AdminRpc {
CommonResult<AdminVO> verifyPassword(AdminVerifyPasswordDTO verifyPasswordDTO);
}

View File

@@ -0,0 +1,36 @@
package cn.iocoder.mall.systemservice.rpc.admin.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
/**
* 管理员校验密码 DTO
*/
@Data
@Accessors(chain = true)
public class AdminVerifyPasswordDTO {
/**
* 用户名
*/
@NotEmpty(message = "登陆账号不能为空")
@Length(min = 5, max = 16, message = "账号长度为 5-16 位")
@Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母")
private String username;
/**
* 密码
*/
@NotEmpty(message = "密码不能为空")
@Length(min = 4, max = 16, message = "密码长度为 4-16 位")
private String password;
/**
* IP
*/
@NotEmpty(message = "IP 不能为空")
private String ip;
}

View File

@@ -0,0 +1,38 @@
package cn.iocoder.mall.systemservice.rpc.admin.vo;
import cn.iocoder.mall.systemservice.enums.admin.AdminStatusEnum;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 管理员 DO
*/
@Data
@Accessors(chain = true)
public class AdminVO {
/**
* 管理员编号
*/
private Integer id;
/**
* 真实名字
*/
private String name;
/**
* 部门编号
*/
private Integer departmentId;
/**
* 在职状态
*
* 枚举 {@link AdminStatusEnum}
*/
private Integer status;
/**
* 登陆账号
*/
private String username;
}

View File

@@ -0,0 +1,24 @@
package cn.iocoder.mall.systemservice.convert.admin;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.admin.AdminDO;
import cn.iocoder.mall.systemservice.rpc.admin.vo.AdminVO;
import cn.iocoder.mall.systemservice.service.admin.bo.AdminBO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@Mapper
public interface AdminConvert {
AdminConvert INSTANCE = Mappers.getMapper(AdminConvert.class);
AdminBO convert(AdminDO bean);
@Mapping(source = "records", target = "list")
PageResult<AdminBO> convertPage(IPage<AdminDO> bean);
AdminVO convert(AdminBO adminBO);
}

View File

@@ -1 +0,0 @@
package cn.iocoder.mall.systemservice.convert;

View File

@@ -0,0 +1,23 @@
package cn.iocoder.mall.systemservice.manager.admin;
import cn.iocoder.mall.systemservice.convert.admin.AdminConvert;
import cn.iocoder.mall.systemservice.rpc.admin.dto.AdminVerifyPasswordDTO;
import cn.iocoder.mall.systemservice.rpc.admin.vo.AdminVO;
import cn.iocoder.mall.systemservice.service.admin.AdminService;
import cn.iocoder.mall.systemservice.service.admin.bo.AdminBO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class AdminManager {
@Autowired
private AdminService adminService;
public AdminVO verifyPassword(AdminVerifyPasswordDTO verifyPasswordDTO) {
AdminBO adminBO = adminService.verifyPassword(verifyPasswordDTO.getUsername(),
verifyPasswordDTO.getPassword(), verifyPasswordDTO.getIp());
return AdminConvert.INSTANCE.convert(adminBO);
}
}

View File

@@ -1 +0,0 @@
package cn.iocoder.mall.systemservice.manager;

View File

@@ -0,0 +1,23 @@
package cn.iocoder.mall.systemservice.rpc.admin;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.systemservice.manager.admin.AdminManager;
import cn.iocoder.mall.systemservice.rpc.admin.dto.AdminVerifyPasswordDTO;
import cn.iocoder.mall.systemservice.rpc.admin.vo.AdminVO;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
import static cn.iocoder.common.framework.vo.CommonResult.success;
@Service(version = "${dubbo.provider.AdminRpc.version}", validation = "false")
public class AdminRpcImpl implements AdminRpc {
@Autowired
private AdminManager adminManager;
@Override
public CommonResult<AdminVO> verifyPassword(AdminVerifyPasswordDTO verifyPasswordDTO) {
return success(adminManager.verifyPassword(verifyPasswordDTO));
}
}

View File

@@ -1 +0,0 @@
package cn.iocoder.mall.systemservice.rpc;

View File

@@ -0,0 +1,39 @@
package cn.iocoder.mall.systemservice.service.admin;
import cn.iocoder.common.framework.util.DigestUtils;
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.mall.systemservice.convert.admin.AdminConvert;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.admin.AdminDO;
import cn.iocoder.mall.systemservice.dal.mysql.mapper.admin.AdminMapper;
import cn.iocoder.mall.systemservice.enums.SystemErrorCodeEnum;
import cn.iocoder.mall.systemservice.enums.admin.AdminStatusEnum;
import cn.iocoder.mall.systemservice.service.admin.bo.AdminBO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class AdminService {
@Autowired
private AdminMapper adminMapper;
public AdminBO verifyPassword(String username, String password, String ip) {
AdminDO adminDO = adminMapper.selectByUsername(username);
if (adminDO == null) {
throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.ADMIN_NOT_FOUND);
}
// 校验密码是否正确
String encodedPassword = DigestUtils.bcrypt(password, adminDO.getPasswordSalt());
if (encodedPassword.equals(adminDO.getPassword())) {
// TODO 需要补充密码错误上限
throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.ADMIN_PASSWORD_ERROR);
}
// 账号被禁用
if (!AdminStatusEnum.ACTIVE.getStatus().equals(adminDO.getStatus())) {
throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.ADMIN_IS_DISABLE);
}
// 返回
return AdminConvert.INSTANCE.convert(adminDO);
}
}

View File

@@ -0,0 +1,41 @@
package cn.iocoder.mall.systemservice.service.admin.bo;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.admin.DepartmentDO;
import cn.iocoder.mall.systemservice.enums.admin.AdminStatusEnum;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 管理员信息 BO
*/
@Data
@Accessors(chain = true)
public class AdminBO {
/**
* 管理员编号
*/
private Integer id;
/**
* 真实名字
*/
private String name;
/**
* 部门编号
*
* 关联 {@link DepartmentDO#getId()}
*/
private Integer departmentId;
/**
* 在职状态
*
* 枚举 {@link AdminStatusEnum}
*/
private Integer status;
/**
* 登陆账号
*/
private String username;
}

View File

@@ -1 +0,0 @@
package cn.iocoder.mall.systemservice.service;

View File

@@ -35,3 +35,5 @@ dubbo:
filter: -exception
OAuth2Rpc:
version: 1.0.0
AdminRpc:
version: 1.0.0