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

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

@@ -0,0 +1,13 @@
package cn.iocoder.mall.managementweb;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ManagementWebApplication {
public static void main(String[] args) {
SpringApplication.run(ManagementWebApplication.class, args);
}
}

View File

@@ -0,0 +1,35 @@
package cn.iocoder.mall.managementweb.controller.passport;
import cn.iocoder.common.framework.util.HttpUtil;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.managementweb.controller.passport.dto.AdminPassportLoginDTO;
import cn.iocoder.mall.managementweb.controller.passport.vo.AdminPassportVO;
import cn.iocoder.mall.managementweb.manager.admin.AdminPassportManager;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import static cn.iocoder.common.framework.vo.CommonResult.success;
@Api(tags = "管理员 Passport API")
@RestController
@RequestMapping("/passport")
public class AdminPassportController {
@Autowired
private AdminPassportManager adminPassportManager;
@PostMapping("/login")
@ApiOperation("账号密码登陆")
// @RequiresNone TODO 晚点加上
public CommonResult<AdminPassportVO> login(AdminPassportLoginDTO loginDTO,
HttpServletRequest request) {
return success(adminPassportManager.login(loginDTO, HttpUtil.getIp(request)));
}
}

View File

@@ -0,0 +1,29 @@
package cn.iocoder.mall.managementweb.controller.passport.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
import java.io.Serializable;
@ApiModel("管理登录 DTO")
@Data
@Accessors(chain = true)
public class AdminPassportLoginDTO implements Serializable {
@ApiModelProperty(value = "用户名", required = true, example = "yudaoyuanma")
@NotEmpty(message = "登陆账号不能为空")
@Length(min = 5, max = 16, message = "账号长度为 5-16 位")
@Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母")
private String username;
@ApiModelProperty(value = "密码", required = true, example = "buzhidao")
@NotEmpty(message = "密码不能为空")
@Length(min = 4, max = 16, message = "密码长度为 4-16 位")
private String password;
}

View File

@@ -0,0 +1,50 @@
package cn.iocoder.mall.managementweb.controller.passport.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
@ApiModel("管理员通信证信息 VO")
@Data
@Accessors(chain = true)
public class AdminPassportVO {
@ApiModel("认证信息")
@Data
@Accessors(chain = true)
public static class Authentication {
@ApiModelProperty(value = "访问令牌", required = true, example = "001e8f49b20e47f7b3a2de774497cd50")
private String accessToken;
@ApiModelProperty(value = "刷新令牌", required = true, example = "001e8f49b20e47f7b3a2de774497cd50")
private String refreshToken;
@ApiModelProperty(value = "过期时间", required = true)
private Date expiresTime;
}
@ApiModel("管理员信息")
@Data
@Accessors(chain = true)
public static class Admin {
@ApiModelProperty(value = "用户编号", required = true, example = "1")
private Integer id;
@ApiModelProperty(value = "真实姓名", required = true, example = "小王")
private String name;
}
/**
* 管理员信息
*/
private Admin admin;
/**
* 认证信息
*/
private Authentication authorization;
}

View File

@@ -0,0 +1,24 @@
package cn.iocoder.mall.managementweb.convert.passport;
import cn.iocoder.mall.managementweb.controller.passport.dto.AdminPassportLoginDTO;
import cn.iocoder.mall.managementweb.controller.passport.vo.AdminPassportVO;
import cn.iocoder.mall.systemservice.rpc.admin.dto.AdminVerifyPasswordDTO;
import cn.iocoder.mall.systemservice.rpc.admin.vo.AdminVO;
import cn.iocoder.mall.systemservice.rpc.oauth.vo.OAuth2AccessTokenVO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface AdminPassportConvert {
AdminPassportConvert INSTANCE = Mappers.getMapper(AdminPassportConvert.class);
AdminVerifyPasswordDTO convert(AdminPassportLoginDTO loginDTO);
default AdminPassportVO convert(AdminVO adminVO, OAuth2AccessTokenVO accessTokenVO) {
return new AdminPassportVO().setAdmin(convert(adminVO)).setAuthorization(convert(accessTokenVO));
}
AdminPassportVO.Admin convert(AdminVO adminVO);
AdminPassportVO.Authentication convert(OAuth2AccessTokenVO accessTokenVO);
}

View File

@@ -0,0 +1,37 @@
package cn.iocoder.mall.managementweb.manager.admin;
import cn.iocoder.common.framework.enums.UserTypeEnum;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.managementweb.controller.passport.dto.AdminPassportLoginDTO;
import cn.iocoder.mall.managementweb.controller.passport.vo.AdminPassportVO;
import cn.iocoder.mall.managementweb.convert.passport.AdminPassportConvert;
import cn.iocoder.mall.systemservice.rpc.admin.AdminRpc;
import cn.iocoder.mall.systemservice.rpc.admin.vo.AdminVO;
import cn.iocoder.mall.systemservice.rpc.oauth.OAuth2Rpc;
import cn.iocoder.mall.systemservice.rpc.oauth.dto.OAuth2CreateAccessTokenDTO;
import cn.iocoder.mall.systemservice.rpc.oauth.vo.OAuth2AccessTokenVO;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
@Service
public class AdminPassportManager {
@Reference(version = "${dubbo.consumer.AdminRpc.version}", validation = "false")
private AdminRpc adminRpc;
@Reference(version = "${dubbo.consumer.OAuth2Rpc.version}", validation = "false")
private OAuth2Rpc oauth2Rpc;
public AdminPassportVO login(AdminPassportLoginDTO loginDTO, String ip) {
// 校验管理员密码
CommonResult<AdminVO> verifyPasswordResult = adminRpc.verifyPassword(AdminPassportConvert.INSTANCE.convert(loginDTO).setIp(ip));
verifyPasswordResult.checkError();
// 创建访问令牌
CommonResult<OAuth2AccessTokenVO> createAccessTokenResult = oauth2Rpc.createAccessToken(
new OAuth2CreateAccessTokenDTO().setUserId(verifyPasswordResult.getData().getId())
.setUserType(UserTypeEnum.ADMIN.getValue()).setCreateIp(ip));
createAccessTokenResult.checkError();
// 返回
return AdminPassportConvert.INSTANCE.convert(verifyPasswordResult.getData(), createAccessTokenResult.getData());
}
}

View File

@@ -0,0 +1,14 @@
spring:
# Spring Cloud 配置项
cloud:
nacos:
# Spring Cloud Nacos Discovery 配置项
discovery:
server-addr: 400-infra.server.iocoder.cn:8848 # Nacos 服务器地址
namespace: dev # Nacos 命名空间
# Dubbo 配置项
dubbo:
# Dubbo 注册中心
registry:
address: spring-cloud://400-infra.server.iocoder.cn:8848 # 指定 Dubbo 服务注册中心的地址

View File

@@ -0,0 +1,14 @@
spring:
# Spring Cloud 配置项
cloud:
nacos:
# Spring Cloud Nacos Discovery 配置项
discovery:
server-addr: 400-infra.server.iocoder.cn:8848 # Nacos 服务器地址
namespace: local # Nacos 命名空间
# Dubbo 配置项
dubbo:
# Dubbo 注册中心
registry:
address: spring-cloud://400-infra.server.iocoder.cn:8848 # 指定 Dubbo 服务注册中心的地址

View File

@@ -0,0 +1,30 @@
# 服务器的配置项
server:
port: 18083
servlet:
context-path: /management-api/
spring:
# Application 的配置项
application:
name: management-web
# Profile 的配置项
profiles:
active: local
# Dubbo 配置项
dubbo:
# Spring Cloud Alibaba Dubbo 专属配置
cloud:
subscribed-services: 'user-service, system-service' # 设置订阅的应用列表,默认为 * 订阅所有应用
# Dubbo 服务消费者的配置
consumer:
timeout: 10000
UserSmsCodeRpc:
version: 1.0.0
UserRpc:
version: 1.0.0
OAuth2Rpc:
version: 1.0.0
AdminRpc:
version: 1.0.0