环境搭建与权限登录

tim-qtp...大约 20 分钟神领物流项目

1.项目介绍

1.1. 概述

神领物流是一个基于微服务架构体系的【生产级】物流项目系统

1.2. 基本业务流程

流程说明:

  • 客户在【神领物流微信小程序】中填写收、发件人地址,以及物品信息,提交订单
  • 下单成功后,【快递员上门取件】,并要求用户进行【在线支付
  • 快递员取件成功后,会将快件送回到【营业网点
  • 快件到达营业网点后,司机开始运输,将快件交由【转运中心】进行一系列的转运
  • 最后,快件会到达收件人所在的【营业网点】,再由【快递员】进行【派件】操作
  • 收件人可以进行【签收】或【拒收】操作

1.3. 系统架构

系统架构
系统架构

1.4. 技术架构

2.环境搭建

yuque_diagram (2)
yuque_diagram (2)

2.1.配置本机hosts:

在本机hosts文件中设置如下配置:

(也可以用uTools工具中的hosts插件修改)

192.168.150.101 git.sl-express.com
192.168.150.101 maven.sl-express.com
192.168.150.101 jenkins.sl-express.com
192.168.150.101 auth.sl-express.com
192.168.150.101 rabbitmq.sl-express.com
192.168.150.101 nacos.sl-express.com
192.168.150.101 neo4j.sl-express.com
192.168.150.101 xxl-job.sl-express.com
192.168.150.101 eaglemap.sl-express.com
192.168.150.101 seata.sl-express.com
192.168.150.101 skywalking.sl-express.com
192.168.150.101 api.sl-express.com
192.168.150.101 admin.sl-express.com

服务列表:

名称地址用户名/密码端口
githttp://git.sl-express.com/open in new windowsl/sl12310880
mavenhttp://maven.sl-express.com/nexus/open in new windowadmin/admin1238081
jenkinshttp://jenkins.sl-express.com/open in new windowroot/1238090
权限管家http://auth.sl-express.com/api/authority/static/index.htmlopen in new windowadmin/1234568764
RabbitMQhttp://rabbitmq.sl-express.com/open in new windowsl/sl32115672
MySQL-root/1233306
nacoshttp://nacos.sl-express.com/nacos/open in new windownacos/nacos8848
neo4jhttp://neo4j.sl-express.com/browser/open in new windowneo4j/neo4j1237474
xxl-jobhttp://xxl-job.sl-express.com/xxl-job-adminopen in new windowadmin/12345628080
EagleMaphttp://eaglemap.sl-express.com/open in new windoweagle/eagle8484
seatahttp://seata.sl-express.com/open in new windowseata/seata7091
Gatewayhttp://api.sl-express.com/open in new window-9527
adminhttp://admin.sl-express.com/open in new window-80
skywalkinghttp://skywalking.sl-express.com/open in new window-48080
Redis-1233216379
MongoDB-sl/12332127017

环境说明

通过上面的测试,可以通过域名访问各种服务了,访问过程是怎么样的呢?其实,在101机器中安装了nginx,通过反向代理功能访问到各种对应的服务。如下:

说明:

  • 通过浏览器按照域名的访问访问,如:http://git.sl-express.com/open in new window ,先通过本地系统的hosts文件找到映射的ip地址
  • 此时,就会访问到虚拟机环境,由于请求没有加端口号,默认访问80端口
  • 由于在101机器部署安装nginx服务并且占用的是80端口,请求就会进入nginx
  • nginx会根据不同的域名将请求转发(反向代理)到不同的服务,例如:git.sl-express.comopen in new window -> 127.0.0.1:18080 通过vim /usr/local/src/nginx/conf/nginx.conf命令查看nginx的配置文件
server {
    listen       80;
    server_name  git.sl-express.com;
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }

    location / {
        client_max_body_size  1024m;
        proxy_connect_timeout 300s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;
        proxy_pass http://127.0.0.1:10880;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

    server {
        listen       80;
        server_name  jenkins.sl-express.com;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        location / {
            client_max_body_size  300m;
            proxy_connect_timeout 300s;
            proxy_send_timeout 300s;
            proxy_read_timeout 300s;
            proxy_pass http://127.0.0.1:8090;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
	}	

2.2配置Maven私服

在101机器中提供了maven私服,需要本地配置maven(建议版本为3.6.x)才能使用私服,配置文件参考如下:

<?xml version="1.0" encoding="UTF-8"?>
<settings
        xmlns="http://maven.apache.org/SETTINGS/1.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

    <!-- 本地仓库  这里要改成你自己的本地仓库位置 -->
    <localRepository>D:\maven\apache-maven-3.6.1\maven_repository</localRepository>

    <!-- 配置私服中deploy的账号 -->
    <servers>
        <server>
            <id>sl-releases</id>
            <username>deployment</username>
            <password>deployment123</password>
        </server>
        <server>
            <id>sl-snapshots</id>
            <username>deployment</username>
            <password>deployment123</password>
        </server>
    </servers>

    <!-- 使用阿里云maven镜像,排除私服资源库 -->
    <mirrors>
        <mirror>
            <id>mirror</id>
            <mirrorOf>central,jcenter,!sl-releases,!sl-snapshots</mirrorOf>
            <name>mirror</name>
            <url>https://maven.aliyun.com/nexus/content/groups/public</url>
        </mirror>
    </mirrors>

    <profiles>
        <profile>
            <id>sl</id>
            <!-- 配置项目deploy的地址 -->
            <properties>
                <altReleaseDeploymentRepository>
                    sl-releases::default::http://maven.sl-express.com/nexus/content/repositories/releases/
                </altReleaseDeploymentRepository>
                <altSnapshotDeploymentRepository>
                    sl-snapshots::default::http://maven.sl-express.com/nexus/content/repositories/snapshots/
                </altSnapshotDeploymentRepository>
            </properties>
            <!-- 配置项目下载依赖的私服地址 -->
            <repositories>
                <repository>
                    <id>sl-releases</id>
                    <url>http://maven.sl-express.com/nexus/content/repositories/releases/</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>false</enabled>
                    </snapshots>
                </repository>
                <repository>
                    <id>sl-snapshots</id>
                    <url>http://maven.sl-express.com/nexus/content/repositories/snapshots/</url>
                    <releases>
                        <enabled>false</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
            </repositories>
        </profile>
    </profiles>

    <activeProfiles>
         <!-- 激活配置 -->
        <activeProfile>sl</activeProfile>
    </activeProfiles>

</settings>
  1. 本地仓库

    <localRepository>D:\maven\apache-maven-3.6.1\maven_repository</localRepository>
    

    这部分指定了 Maven 的本地仓库位置,即 Maven 下载的依赖包将存储在这个目录下。

  2. 服务器配置servers): 配置了两个服务器,sl-releasessl-snapshots,每个服务器都有对应的 idusernamepassword。这些信息用于 Maven 与私服(私有 Maven 仓库)进行交互时的认证。

  3. 镜像配置mirrors): 配置了一个镜像,mirror,它将所有请求重定向到阿里云的 Maven 镜像,除了 sl-releasessl-snapshots 这两个私服资源库。这样可以加速依赖包的下载速度。

  4. 配置文件profiles): 定义了一个名为 sl 的配置文件,其中包含了两个部分:propertiesrepositories

    • properties 中定义了项目部署到私服的地址,分别用于发布版本(altReleaseDeploymentRepository)和快照版本(altSnapshotDeploymentRepository)。
    • repositories 中定义了两个仓库,sl-releasessl-snapshots,分别对应于发布版本和快照版本的私服地址。这里指定了哪些版本可以从此仓库下载。
  5. 激活配置activeProfiles): 指定了 Maven 启动时默认激活的配置文件,这里是 sl

2.3git代码管理

2.3.1GitFlow工作流程

在gitflow流程中,master和develop分支属于长期分支,长期分支是相对稳定,所有开发完成或测试通过的提交最终都要合并到这两个分支上,他俩也有一些区别:

  • master:发布上线时,基于master打tag,基于tag进行发布,不允许在该分支上开发,始终保持该分支的稳定。
  • develop:开发阶段使用的分支,提交到该分支代码都是相对稳定的,不能直接基于此分支开发,如果开发新的功能,需要基于此分支创建新的分支进行开发功能,待功能开发、测试通过后合并到develop分支。

对于新功能的开发,基于Develop分支创建Feature分支,功能开发完后合并到Develop分支,禁止未开发完成的代码合并到Develop分支

在开发中,新功能的代码已经全部合并到Develop分支,此时需要基于Develop分支创建Release分支,在Release分支中不再添加新的功能,只是做bug的修复,等测试完成bug全部修复之后,需要将Release分支合并到Master分支和Develop分支,并且基于Master打出版本的tag。

如果发布到生成环境的版本出现bug,比如:生产环境的v1.0版本出现bug需要尽快修复,此时就需要基于master创建hotfix分支,并且基于hotfix分支修复bug,待bug修复完成后需要将代码合并到master和develop分支。

2.3.2. 基于gogs服务开发

项目中将基于gogs服务进行开发

2.3.2.1. 拉取代码

拉取代码步骤:

  • 在本地创建 sl-express 文件夹,该目录存放项目课程期间所有的代码
  • 启动idea,打开该目录
  • 设置项目jdk为11版本
  • 拉取sl-express-gitflow-webopen in new window代码,在本地运行起来,目前项目版本为1.0。
  • 拉取完成后,点击【Cancel】按钮:
  • 导入Module:
  • 测试功能:

2.3.2.2. 创建develop分支

推送develop分支到gogs:

推送成功:

2.3.2.3. 基于feature分支开发新功能

开发新的功能需要基于develop分支创建feature分支,假设我们需要增加一个相乘的接口。

com.sl.gitflow.controller.GitFlowController中新增相乘的方法:

    @ApiOperation("两个数相乘")
    @GetMapping("/mul")
    @ApiImplicitParams({@ApiImplicitParam(name = "value1", value = "第一个数", example = "1"), @ApiImplicitParam(name = "value2", value = "第两个数", example = "2")})
    public R<Object> mul(@RequestParam(value = "value1") Long value1, @RequestParam(value = "value2") Long value2) {
        return R.success(value1 * value2);
    }

重启、测试:

测试完成后,将代码合并到develop分支:

提交代码(此时,在feature分支进行提交):

切换到develop分支:

推送develop分支到gogs:

推送成功:

推送完成后,一般情况需要将feature分支删除掉,不推送到远程仓库

2.3.2.4. 创建Release分支

develop分支开发基本上结束后,将基于develop分支创建release分支,在此分支进行测试,测试完成后合并到masterdevelop分支。

创建分支后,模拟测试和bug修复,对代码增加注释改动:

提交代码:

推送到远程仓库:

推送成功:

所有测试完成后,将release分支合并回masterdevelop,并且推送到远程仓库。

2.3.2.5. 创建tag标签

推送到远程:

推送成功:

创建tag完成后,就可以基于tag发布了。

3.项目代码列表

在虚拟机中的gogs服务中已经提供了项目中所涉及都的项目代码,目前项目拥有19个微服务,1个网关,1个parent工程,2个公共依赖工程。如下:

序号项目名称说明
1sl-express-parentopen in new window父工程
2sl-express-commonopen in new window通用工程
3sl-express-mqopen in new window统一消息代码
4sl-express-gatewayopen in new window统一网关
5sl-express-ms-baseopen in new window基础微服务
6sl-express-ms-carriageopen in new window运费微服务
7sl-express-ms-courieropen in new window快递员微服务
8sl-express-ms-dispatchopen in new window调度微服务
9sl-express-ms-driveropen in new window司机微服务
10sl-express-ms-omsopen in new window订单微服务
11sl-express-ms-service-scopeopen in new window服务范围微服务
12sl-express-ms-smsopen in new window短信微服务
13sl-express-ms-trackopen in new window轨迹微服务
14sl-express-ms-tradeopen in new window支付微服务
15sl-express-ms-transportopen in new window路线微服务
16sl-express-ms-transport-infoopen in new window物流信息微服务
17sl-express-ms-useropen in new window用户微服务
18sl-express-ms-web-courieropen in new window快递员web服务
19sl-express-ms-web-customeropen in new window用户web服务
20sl-express-ms-web-driveropen in new window司机web服务
21sl-express-ms-web-manageropen in new window后台web服务
22sl-express-ms-workopen in new window运单微服务
23sl-express-ms-searchopen in new window搜索微服务

为什么要有父工程,用来定义各种依赖的版本号的!

❓思考:是否需要把所有的工程代码都拉取到本地进行编译运行?

不需要的。你只需要将自己将要负责的开发任务相关的代码拉取到本地进行开发即可,其他的服务都可以调用测试环境正在运行的服务。

另外,你有可能是没有权限拉取到其他开发组的代码的。

4.Jenkins

4.1、持续集成

持续集成是指,开发人员将代码合并到远程仓库后,需要【自动】的完成构建、部署等操作。

下面以Spring Boot web项目举例,说明使用Jenkins进行持续集成的过程。

过程说明:

  • 本地开发环境推送代码到远程仓库
  • 推送完成后,git服务会向Jenkins发送通知
  • Jenkins接收到通知后,开始触发构建(也可以手动触发构建)
  • 【git pull】从git仓库中拉取最新的代码
  • 【maven package】通过maven进行打包,Spring Boot项目会打成可执行的jar包
  • 【docker build & push】构建docker镜像,一般会将docker镜像上传到公司内部私服
  • 【ssh remote】通过ssh命令登录到远程服务器(部署的目标服务器)
  • 【docker pull】通过公司内部私服拉取docker镜像
  • 【docker run】基于拉取到的镜像,运行容器
  • 最后,完成构建

4.2、Jenkins使用

下面以部署【sl-express-gitflow-webopen in new window】为例,通过Jenkins进行部署。

第一步,打开Jenkinsopen in new window,通过root/123登录。

img

第二步,创建构建任务:

第三步,设置任务内容:

设置一些构建参数:

设置版本号参数:(该参数会在后面部署时使用)

设置微服务注册到nacos中的ip地址:(该参数会在后面部署时使用)SPRING_CLOUD_NACOS_DISCOVERY_IP

设置端口参数:(该参数会在后面部署时使用)

设置服务名称参数:(该参数会在后面部署时使用)

设置git仓库信息:

设置分支:

设置构建步骤:

chmod a+rw /var/run/docker.sock
clean package -Dmaven.test.skip=true -U

设置部署脚本:

#!/bin/bash
# 微服务名称
SERVER_NAME=${serverName}
# 服务版本
SERVER_VERSION=${version}
# 服务端口
SERVER_PORT=${port}
# 源jar名称,mvn打包之后,target目录下的jar包名称
JAR_NAME=$SERVER_NAME-$SERVER_VERSION
# jenkins下的目录
JENKINS_HOME=/var/jenkins_home/workspace/$SERVER_NAME
#进入jenkins目录
cd $JENKINS_HOME
# 修改文件权限
chmod 755 target/$JAR_NAME.jar
#输出docker版本
docker -v
echo "---------停止容器($SERVER_NAME)---------"
docker stop $SERVER_NAME
echo "---------删除容器($SERVER_NAME)---------"
docker rm $SERVER_NAME
echo "---------删除镜像($SERVER_NAME:$SERVER_VERSION)---------"
docker rmi $SERVER_NAME:$SERVER_VERSION
echo "---------构建新镜像($SERVER_NAME:$SERVER_VERSION)---------"
docker build -t $SERVER_NAME:$SERVER_VERSION .
echo "---------运行服务---------"
docker run -d -p $SERVER_PORT:8080 --name $SERVER_NAME -e SERVER_PORT=8080 -e SPRING_CLOUD_NACOS_DISCOVERY_IP=${SPRING_CLOUD_NACOS_DISCOVERY_IP} -e  SPRING_CLOUD_NACOS_DISCOVERY_PORT=${port} $SERVER_NAME:$SERVER_VERSION

开始构建:

构建日志:

测试:http://192.168.150.101:18099/doc.htmlopen in new window

可以看到已经部署成功。

4.3、自动构建

想要实现在代码推送到git仓库后自动开始构建,需要分别在gogs和Jenkins中进行设置。

4.3.1、gogs设置

点击【仓库设置】:

添加web钩子:

url格式:http(s)://<< jenkins-server >>/gogs-webhook/?job=<< jobname >>

添加成功:

4.3.2、Jenkins设置

4.3.3、模拟推送

可以在gogs中模拟发起推送通知,来测试是否可以自动构建。

查看执行记录:

5、登录业务

登录业务分别在四个终端都有涉及

四端的需求文档地址:

用户端https://share.lanhuapp.com/#/invite?sid=qx01hbI7open in new window 密码: UxGE
快递员端https://share.lanhuapp.com/#/invite?sid=qxe42Dyaopen in new window 密码: Nomz
司机端https://share.lanhuapp.com/#/invite?sid=qX0NEmroopen in new window 密码: yrzZ
管理端https://share.lanhuapp.com/#/invite?sid=qX0axVemopen in new window 密码: fh3i

5.1、实现分析

实现登录业务主要会涉及到2个接口,分别是获取验证码、登录接口。

业务流程如下:

5.2、验证码功能

在登录功能中,为了防止恶意的登录操作,所以需要添加验证码功能,实现的效果如下:

5.3、拉取代码

项目中的配置文件说明:

文件说明
bootstrap.yml通用配置项,服务名、日志文件、swagger配置等
bootstrap-local.yml多环境配置,本地开发环境
bootstrap-prod.yml多环境配置,生成环境(学习阶段忽略该文件)
bootstrap-stu.yml多环境配置,学生101环境
bootstrap-test.yml多环境配置,开发组测试环境(学习阶段忽略该文件)
logback-spring.xml日志配置文件

5.4、实现分析

将工程启动后,通过swaggeropen in new window接口页面可以看到获取验证码的的接口。

可以看出,接口地址、请求方法、请求参数。

同样,也可以在资料中的接口文档查看(管理员端.mdopen in new window):

验证码的实现方式有很多种,项目中我们通过hutoolopen in new window工具包中的验证码模块来实现。实现的效果如下:

其实这样是不能满足需求的,需求中验证码是两个数字的运算,类似这样:

所以,需要使用自定义验证码功能:

5.5、具体实现

首先,基于master分支创建develop分支,用于功能的开发。

Controller的代码定义如下:com.sl.ms.web.manager.controller.auth.AuthController#captcha

img
img

具体的业务实现是在com.sl.ms.web.manager.service.AuthService中完成。

	private static final String CAPTCHA_REDIS_PREFIX = "CAPTCHA_";

	@Override
    public void createCaptcha(String key, HttpServletResponse response) throws IOException {
        //1. 生成验证码,指定宽、高、字符个数、干扰线条数
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(115, 42, 0, 10);
        //1.1 设置生成器为数字计算验证码生成器并且指定参与计算最大数字位数为1,也就是个位数相加
        lineCaptcha.setGenerator(new MathGenerator(1));
        //1.2 获取生成的验证码值
        String code = lineCaptcha.getCode();

        //2. 将验证码的值写入到redis,有效期为1分钟
        String redisKey = CAPTCHA_REDIS_PREFIX + key;
        this.stringRedisTemplate.opsForValue().set(redisKey, code, Duration.ofMinutes(1));

        //3. 输出到页面,设置页面不缓存
        response.setHeader(HttpHeaders.PRAGMA, "No-cache");
        response.setHeader(HttpHeaders.CACHE_CONTROL, "No-cache");
        response.setDateHeader(HttpHeaders.EXPIRES, 0L);
        lineCaptcha.write(response.getOutputStream());
    }

Pragma是一个HTTP/1.0的头部字段,用于向后兼容。在HTTP/1.1中,Pragma头通常被Cache-Control头所取代。No-cache指令告诉浏览器和代理服务器,它们必须先向服务器确认响应是否被更改,才能使用缓存中的版本。

在Controller中调用Service中的方法:

5.6、测试

重启服务,基于swagger进行测试:

检查redis中的值:

可以看到,验证码数据成功写入到redis中。

6、部署前端

前面已经完成了验证码功能的开发,下面我们将基于前端页面进行测试,所以需要将前端部署起立,部署前端的步骤:

第一步:拉取【project-slwl-admin-vueopen in new window】代码。

第二步:修改.env.production.stu文件,设置前后端交互接口改为本机地址和端口:

第三步,提交代码到git中,使用Jenkins进行部署:

访问地址进行测试:http://admin.sl-express.com/open in new window

查看发送的请求:

3.4、实现登录

获取验证码后,用户输入用户名和密码进行登录:

3.4.1、实现分析

在登录业务功能中,需要对用户输入的用户名、密码以及验证码进行校验,只有全部校验通过后才能是登录成功。

在登录成功后,需要生成用户的登录凭证,也就是token,在项目中,采用jwt的方式生成token。

在后续的请求中,前端需要将token放置到请求头中发送到服务端,服务端需要对token进行校验。

提交的参数:

响应数据结构参考swagger文档:

3.4.2、具体实现

    /**
     * 登录
     *
     * @param login 用户登录信息
     * @return 登录结果
     */
    @Override
    public R<LoginDTO> login(LoginParamDTO login) {
        //1. 校验参数
        if (ObjectUtil.hasEmpty(login.getCode(), login.getKey())) {
            return R.error("验证码不能为空");
        }
        if (ObjectUtil.hasEmpty(login.getAccount(), login.getPassword())) {
            return R.error("用户名、密码不能为空");
        }

        //2. 校验验证码
        String redisKey = CAPTCHA_REDIS_PREFIX + login.getKey();
        String redisValue = this.stringRedisTemplate.opsForValue().get(redisKey);
        if (ObjectUtil.isEmpty(redisValue)) {
            return R.error("验证码已过期");
        }
        //验证码只能使用一次,所以需要将验证码删除
        this.stringRedisTemplate.delete(redisKey);
        boolean verify = new MathGenerator().verify(redisValue, login.getCode());
        if (!verify) {
            return R.error("验证码不正确");
        }

        //3. 校验用户名密码,校验通过生成token
        return this.login(login.getAccount(), login.getPassword());
    }

    /**
     * 登录获取token
     *
     * @param account  账号
     * @param password 密码
     * @return 登录信息
     */
    @Override
    public R<LoginDTO> login(String account, String password) {
        //说明:由于后台系统的账号在后面会由【权限管家】系统中管理,由于【权限管家】目前还没学习,所以这里的登录先做【模拟实现】
        if (!(StrUtil.equals(account, "shenlingadmin") && StrUtil.equals(password, "123456"))) {
            return R.error("用户名或密码错误");
        }

        LoginDTO loginDTO = new LoginDTO();

        //设置token
        Token token = new Token();
        token.setToken("eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxMDI0NzA1NzA5MjU1NzczMzQ1IiwiYWNjb3VudCI6InNoZW5saW5nYWRtaW4iLCJuYW1lIjoi56We6aKG566h55CG5ZGYIiwib3JnaWQiOjEwMjQ3MDQ4NDQ0ODY3NTY2NDEsInN0YXRpb25pZCI6MTAyNDcwNTQ4OTQzNjQ5NDcyMSwiYWRtaW5pc3RyYXRvciI6ZmFsc2UsImV4cCI6MTY4MDc5NjE5OX0.W4RrB4p5YmjgEcdyGbbL4UrdWFirFbUu_e8Pgwxgr6vBVnj5z40JcFG4X3nIbrIXcSXUldi6oEuNfqAtZ9dUUw");
        token.setExpire(9999);
        loginDTO.setToken(token);

        //设置用户信息
        UserDTO userDTO = new UserDTO();
        userDTO.setAccount(account);
        userDTO.setName("神领管理员");
        //其它属性暂时不设置
        loginDTO.setUser(userDTO);

        return R.success(loginDTO);

    }

在Controller中调用:

    /**
     * 管理端登录
     *
     * @param login 登录信息
     * @return 用户信息
     */
    @PostMapping(value = "/login")
    @ApiOperation(value = "登录", notes = "登录")
    public R<LoginDTO> login(@RequestBody LoginParamDTO login) {
        return this.authService.login(login);
    }

3.4.3、测试

基于swagger接口进行测试:

基于前端测试:

说明:

基于前端测试目前只能测试登录接口,在登录成功后还无法正常进入后台首页,原因是在com.sl.ms.web.manager.config.ManagerWebConfig中配置了com.sl.transport.common.interceptor.UserInterceptor拦截器,这个拦截器是对请求是否来源于网关的校验,而目前我们还没有网关,所以暂时先不测试成功跳转首页。