1.课程介绍
5.Swagger集成
6.Gitee管理项目
2.项目基本介绍
2.1.项目背景
找工作的人、想学习的人
现在社会竞争压力越来愈大,很多应届毕业生毕业后没法直接胜任某类工作,或者是一些已经工作的人慢慢丧失自己学习的能力,最终导致失业无法再次就业。
招聘的单位
虽然求职者非常多,但是很多人的能力达不到用人企业的要求,他们期望一招聘进来马上就能使用,所以需要对求职候选人进行培养筛选。
培训机构
很多培训机构虽然有能力培训人才但是,市场能力比较差,找不到合适的学员,让他们通过培训能找到工作
正是由于以上三类场景,所以我们开发一个源码人力综合平台,让找工作的人,能够选择特定机构的课程学习,并参与平台发布的招聘,而且还能参与一些活动。 让招聘单位入驻进来发布岗位进行招聘,甚至委托培训机构培训合适的人才。对于配置机构可以发布课程,吸收学员来完成学习并通过收取学费获取商业价值。
2.3.项目原型
通过项目原型进一步了解项目的功能,包括:门户首页、课程搜索页、个人中心等 参考“项目原型”
3.项目技术架构
3.1.技术架构
项目采用主流的前后端分离模式,前端分为系统管理前端,门户网站前端(职位站点,课程站点,用户中心等等)。
3.2.技术栈
系统管理前端采用技术栈为
Node.js,Vue.js,Npm,WebPack,Vue Cli ,Element UI ,Easy Mock等等。
门户网站前端技术栈为
Html ,css,js ,jquery等等。
后端采用微服务架构技术栈为
微服务架构:按照功能拆分N多个服务,每个服务可以独立技术选型,独立开发,独立部署,独立运维.,单个服务使用基于ssm的springboot,服务间通过spring cloud协调.技术包括:
MyBatis-Plus,SpringBoot ,SpringMvc,SpringCloud(Eureka/Nacos,Zuul/Gateway,Config/Nacos,Feign,Hystrix/Sentinel等等),Redis,Fastdfs/Aicloud OSS,ElasticSearch,RabbitMQ,Velocity; 运维方面:阿里云服务器,Docker,Jenkins,Rancher,K8S等等。
项目是基于前后端分离的架构进行开发,前后端分离架构总体上包括前端和服务端,通常是多人协作并行开发,开 发步骤如下:
1.接项目,立项
2.需求分析(产品经理) ,需求文档,概要设计,功能原型图,梳理用户的需求,分析业务流程
3.项目经理组建团队开发 PM,SE,TM=PM+SE,项目启动会,开发人员培训(SE),项目原型搭建(SE) 开发文档
4.开发(开发工程师)
a)接口定义,根据需求分析定义接口
b)服务端和前端并行开发 ,依据接口进行服务端接口开发。 postman测试
c)前端开发用户操作界面,并请求服务端接口完成业务处理。 EasyMock模拟数据
d)前后端集成测试 最终前端调用服务端接口完成业务。
5.测试人员测试
6.上线 运维人员
7.运维-留一两个人
8.开发其他项目
4.后端项目微服务原型搭建
4.1.创建Git仓库(省略)
4.1.1.登录码云创建仓库
4.1.2.本地克隆仓库
4.1.3.创建项目到仓库目录
4.1.4.忽略不需要提交的内容
4.2.项目结构搭建
hrm-parent //管理jar:SpringBoot;SpringCloud,一些公共的内容
hrm-support-parent //springcloud微服务支持模块
hrm-eureka-server-1010
hrm-zuul-server-1020
hrm-config-server-1030
hrm-basic-parent //基础模块
hrm-basic-util //工具 : AjaxResult ,PageList
hrm-basic-common //公共模块: BaseDoamin ,BaseQuery
hrm-system-parent //系统管理中心
hrm-system-common //system的公共代码 :SystemQuery ,Domain
hrm-system-server-1040 //系统管理中心服务Controller,Service,Mapper
hrm-course-parent //课程中心
hrm-course-common //公共代码
hrm-course-server-1050 //课程中心服务
Hrm-redis-parent
Hrm-redis-feign //feign客户端接口模块
Hrm-redis-server-1060 //缓存服务
Hrm-elasticsearch-parent
Hrm-elasticsearch-feign //feign客户端接口模块
Hrm-elasticsearch-server-1070 //缓存服务
hrm-user-parent //用户中心
hrm-user-common //公共代码
hrm-user-server-1080 //用户中心服务
4.3.前端结构搭建
暂时不管,后面再来搭建
hrm-websites-parent
hrm-website-system
hrm-website-course
hrm-website-user
hrm-website-job
hrm-website-active
4.4.SpringCloud集成
4.4.1.顶级父工程 hrm-parent
4.0.0
cn.itsource.hrm
hrm-parent
pom
1.0-SNAPSHOT
hrm-basic-parent
hrm-support-parent
hrm-system-parent
UTF-8
1.8
1.8
org.springframework.boot
spring-boot-starter-parent
2.0.5.RELEASE
org.springframework.cloud
spring-cloud-dependencies
Finchley.SR1
pom
import
junit
junit
4.12
4.4.2.Eureka注册中心
1)创建项目
hrm-parent
hrm-support-parent //springcloud微服务支持模块
hrm-eureka-server-1010
2)pom.xml
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
3)配置文件
spring:
application:
name: hrm-eureka
server:
port: 1010
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #单机配置
4)入口类
/*注册中心启动类*/
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication1010
{
public static void main( String[] args )
{
SpringApplication.run(EurekaServerApplication1010.class) ;
}
}
5)启动测试
访问:http://localhost:1010
4.4.3.Zuul 服务网关
1)创建项目
hrm-parent
hrm-support-parent //springcloud微服务支持模块
hrm-zuul-server-1020
2)导入jar
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.cloud
spring-cloud-starter-netflix-zuul
3)做配置
#注册中心 , 服务的配置 ,zuul的配置(前缀,忽略服务 ,路由)
eureka:
client:
registry-fetch-interval-seconds: 5
serviceUrl:
defaultZone: http://localhost:1010/eureka/
instance:
prefer-ip-address: true #使用ip注册到Eureka
instance-id: zuul-server:1020 #指定客户端实例的ID
server:
port: 1020
spring:
application:
name: zuul-server #服务名
zuul:
prefix: "/hrm" #统一访问的前缀
ignored-services: "*" #所有的服务都不要使用服务名的方式去访问
routes:
system-server: "/system/**" #系统管理服务
retryable: true #是否开启重试功能
ribbon:
eager-load.enabled: true # 饥饿加载
ribbon:
MaxAutoRetries: 1 #对当前服务的重试次数
MaxAutoRetriesNextServer: 1 #切换相同Server的次数
OkToRetryOnAllOperations: false # 对所有的操作请求都进行重试,如post就不能重试,如果没做幂等处理,重试多次post会造成数据的多次添加或修改
ConnectTimeout: 10000 #请求连接的超时时间
ReadTimeout: 10000 #请求处理的超时时间
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 15000
#如果配置ribbon的重试,hystrix的超时时间要大于ribbon的超时时间
4)入口
//@EnableZuulProxy :开启zuul
@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
public class ZuulServerApplication1020 {
public static void main(String[] args) {
SpringApplication.run(ZuulServerApplication1020.class) ;
}
}
5)启动测试
在Eureka中有Zuul就ok
4.4.4.Config Server
1)Gitee仓库创建
2)配置中心Config Server搭建
3)zuul集成Config Client
4.4.5.基础模块(basic)
Hrm-parent
hrm-basic-parent 基础模块
hrm-basic-util 工具
hrm-basic-common
1)基础工具模块(basic-util)
拷贝基础工具到该模块化中
2)基础公共模块
拷贝BaseQuery到模块中
5.系统管理中心
有一个数据字典很多模块都要使用,先把他实现了
5.1.创建项目
5.1.1.创建模块
hrm-system-parent 系统管理中心
hrm-system-common 公共代码:domain,query
hrm-system-server-1040 系统管理中心服务: mapper,service,controller
5.1.2.hrm-system-server-1040导入pom
cn.itsource.hrm
hrm-system-common
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
5.1.3.yml配置
server:
port: 1040
spring:
application:
name: hrm-system
eureka:
client:
service-url:
defaultZone: http://localhost:1010/eureka
instance:
prefer-ip-address: true
instance-id: zuul-server:1020 #指定客户端实例的ID
5.1.4.入口类
/**
* 主启动配置类
*/
@SpringBootApplication
@EnableEurekaClient
public class SystemServerApplication2010
{
public static void main( String[] args )
{
SpringApplication.run(SystemServerApplication2010.class);
}
}
5.1.5.测试
能够注册到Eureka
5.2.网关配置路由
如果已经在搭建zuul的时候配置了那么现在就不用配置了
zuul:
prefix: "/hrm" #统一访问的前缀
ignored-services: "*" #所有的服务都不要使用服务名的方式去访问
routes:
system-server: "/system/**" #系统管理服务
6.MybatisPlus集成
6.1.引入
在真实项目开发中我们的服务模块,一般都要进行数据库操作,并且每个domain都有crud,需多次写重复代码。我们使用MybatisPlus,就不用写重复代码,并且还有模板的功能,可以一键生成daomin,query,mapper接口,mapper.xml,service,controller,非常好用。
6.2.简介
6.2.1.mybatisplus是什么
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
6.2.2.mybatisplus特点
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多种数据库
支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
支持 XML 热加载Mapper 对应的 XML支持热加载对于简单的 CRUD 操作甚至可以无 XML 启动
支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
支持关键词自动转义:支持数据库关键词(order、key…)自动转义,还可自定义关键词
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
内置性能分析插件:可输出 Sql 语句以及其执行时间建议开发测试时启用该功能,能快速揪出慢查询
内置全局拦截插件:提供全表 delete,update 操作智能分析阻断也可自定义拦截规则,预防误操作
内置 Sql 注入剥离器:支持 Sql 注入剥离,有效预防 Sql 注入攻击
我们的微服务要生成代码,也要连接数据库,需要集成MyBatis-Plus,同时我们需要搭建一个代码生成器模块,它需要集成Mybatis-plus和Velocity
6.3.代码生成项目 - mybatisplus的模块
可以重新开一个项目,也可以就在原来项目里面。为了不影响运行的代码重新开项目。
步骤分析:
1 创建springboot项目
2 导入jar
3 配置
3 写代码测试
6.3.1.创建项目并导入jar
com.baomidou
mybatis-plus-boot-starter
2.2.0
org.apache.velocity
velocity-engine-core
2.0
mysql
mysql-connector-java
6.3.2.配置
resource/mybatiesplus-config-system.properties
#代码输出基本路径
OutputDir=C:/Users/Administrator/Desktop/java1107/code/hrm-1107/hrm-parent/hrm-system-parent/hrm-system-server-2010/src/main/java
#mapper.xml SQL映射文件目录
OutputDirXml=C:/Users/Administrator/Desktop/java1107/code/hrm-1107/hrm-parent/hrm-system-parent/hrm-system-server-2010/src/main/resources
#domain的输出路径
OutputDirBase=C:/Users/Administrator/Desktop/java1107/code/hrm-1107/hrm-parent/hrm-system-parent/hrm-system-common/src/main/java
#设置作者
author=whale.chen
#自定义包路径:基础包的路径
parent=cn.itsource.hrm
#数据库连接信息
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///hrm-system
jdbc.user=root
jdbc.pwd=123456
6.3.3.写代码测试
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DbType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import java.util.*;
/**
* 生成代码的主类
*/
public class GenteratorCode {
public static void main(String[] args) throws InterruptedException {
//用来获取Mybatis-Plus.properties文件的配置信息
ResourceBundle rb = ResourceBundle.getBundle("mybatiesplus-config-system"); //不要加后缀
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
gc.setOutputDir(rb.getString("OutputDir"));
gc.setFileOverride(false);
gc.setActiveRecord(true);// 开启 activeRecord 模式
gc.setEnableCache(false);// XML 二级缓存
gc.setBaseResultMap(true);// XML ResultMap
gc.setBaseColumnList(false);// XML columList
gc.setAuthor(rb.getString("author"));
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setDbType(DbType.MYSQL);
dsc.setTypeConvert(new MySqlTypeConvert());
dsc.setDriverName(rb.getString("jdbc.driver"));
dsc.setUsername(rb.getString("jdbc.user"));
dsc.setPassword(rb.getString("jdbc.pwd"));
dsc.setUrl(rb.getString("jdbc.url"));
mpg.setDataSource(dsc);
// 表策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setTablePrefix(new String[] { "t_" });// 此处可以修改为您的表前缀
strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
strategy.setInclude(new String[]{
"表名字"
}); // 需要生成的表
mpg.setStrategy(strategy);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent(rb.getString("parent")); //cn.itsource.hrm
pc.setController("web.controller"); //cn.itsource.hrm.web.controller
pc.setService("service");
pc.setServiceImpl("service.impl");
pc.setEntity("domain");
pc.setMapper("mapper");
mpg.setPackageInfo(pc);
// 注入自定义配置,可以在 VM 中使用 cfg.abc 【可无】
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
Map map = new HashMap();
map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-rb");
this.setMap(map);
}
};
List focList = new ArrayList();
//controller的输出配置
focList.add(new FileOutConfig("/templates/controller.java.vm") {
@Override
public String outputFile(TableInfo tableInfo) {
//合并好的内容输出到哪儿?
return rb.getString("OutputDir")+ "/cn/itsource/hrm/web/controller/" + tableInfo.getEntityName() + "Controller.java";
}
});
//query的输出配置
focList.add(new FileOutConfig("/templates/query.java.vm") {
@Override
public String outputFile(TableInfo tableInfo) {
return rb.getString("OutputDirBase")+ "/cn/itsource/hrm/query/" + tableInfo.getEntityName() + "Query.java";
}
});
// 调整 domain 生成目录演示
focList.add(new FileOutConfig("/templates/entity.java.vm") {
@Override
public String outputFile(TableInfo tableInfo) {
return rb.getString("OutputDirBase")+ "/cn/itsource/hrm/domain/" + tableInfo.getEntityName() + ".java";
}
});
// 调整 xml 生成目录演示
focList.add(new FileOutConfig("/templates/mapper.xml.vm") {
@Override
public String outputFile(TableInfo tableInfo) {
return rb.getString("OutputDirXml")+ "/cn/itsource/hrm/mapper/" + tableInfo.getEntityName() + "Mapper.xml";
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 自定义模板配置,可以 copy 源码 mybatis-plus/src/main/resources/templates 下面内容修改,
// 放置自己项目的 src/main/resources/templates 目录下, 默认名称一下可以不配置,也可以自定义模板名称
TemplateConfig tc = new TemplateConfig();
tc.setService("/templates/service.java.vm");
tc.setServiceImpl("/templates/serviceImpl.java.vm");
tc.setMapper("/templates/mapper.java.vm");
tc.setEntity(null);
tc.setController(null);
tc.setXml(null);
// 如上任何一个模块如果设置 空 OR Null 将不生成该模块。
mpg.setTemplate(tc);
// 执行生成
mpg.execute();
}
}
6.3.4.拷贝模块
query对象模板,以及Controller模板
6.3.5.生成数据字典代码
找一个表数据字典生成代码
6.4.微服务集成MyBatis-plus
6.4.1.hrm-system-common模块
1.hrm-basic-util模块拷贝工具类
去课件资料 reousrces/工具类 里面找
2.hrm-system-commo 导入mybatis-plus依赖
注意:hrm-system-common只需要导入 mybatis-plus-boot-starter,hrm-basic-util 依赖即可
com.baomidou
mybatis-plus-boot-starter
2.2.0
cn.itsource
hrm-basic-common
1.0-SNAPSHOT
hrm-system-server-1040服务调整
6.4.2.导入mybatis-plus jar
修改 hrm-system-server-1040 导入如下依赖:
com.baomidou
mybatis-plus-boot-starter
2.2.0
mysql
mysql-connector-java
com.alibaba
druid
1.1.9
cn.itsource.hrm
hrm-system-common
1.0-SNAPSHOT
6.4.3.配置application.yml
spring:
application:
name: system-server #服务名
datasource:
username: root
password: 123456
url: jdbc:mysql:///hrm-system
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
mybatis-plus: #集成MyBatis-Plus
mapper-locations: classpath:cn/itsource/hrm/mapper/*Mapper.xml
#type-aliases-package: cn.itsource.hrm.domain,cn.itsource.hrm.query
6.4.4.MyBatis-Plus配置类
import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
//Spring boot方式
@Configuration
@MapperScan("cn.itsource.hrm.mapper") //mapper接口扫描
@EnableTransactionManagement //事务管理
public class MybatisPlusConfig {
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
6.4.5.程序入口类
package cn.itsource.hrm;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableEurekaClient
public class SystemServerApplication2010{
public static void main(String[] args) {
SpringApplication.run(App.class,args);
}
}
6.4.6.测试-生成代码后再做测试
package cn.itsource.hrm;
import cn.itsource.hrm.domain.User;
import cn.itsource.hrm.service.IUserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class)
public class UserServiceTest {
@Autowired
private IUserService userService;
@Test
public void testGetAll()throws Exception{
System.out.println(userService.selectById(1L));
// userService.insert(new User());
// userService.updateById(new User());
// userService.deleteById(1L);
for (User user : userService.selectList(null)) {
System.out.println(user);
}
}
}
6.5.系统管理-数据字典
数据字典就是把系统中的一些不会经常变的一些数据项,使用2个表来维护,数据项的类型使用数据字典类型表,数据项的明细列表使用数据字典的明细表 来维护。
使用代码生成器生成基础代码,然后对接VUE前端做CRUD
6.5.1.表设计
多对一设计
6.5.2.接口测试工具postman
使用postmain测试数据字典接口
7.System-server集成Swagger
7.1.什么是swagger
接口文档在前面学过,这里不多做介绍,我们直接来集成
7.2.System集成Swagger
7.2.1.导入依赖
io.springfox
springfox-swagger2
2.9.2
io.springfox
springfox-swagger-ui
2.9.2
7.2.2.Swagger配置类
@Configuration
@EnableSwagger2
public class Swagger2 {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
//对外暴露服务的包,以controller的方式暴露,所以就是controller的包.
.apis(RequestHandlerSelectors.basePackage("cn.itsource.hrm.web.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("平台服务api")
.description("平台服务接口文档说明")
.contact(new Contact("whale.chen", "", "[email protected]"))
.version("1.0")
.build();
}
}
访问本项目地址:http://127.0.0.1:1040/swagger-ui.html
7.3.网关配置Swagger
前端开发每次都要记录每个服务ip不好,期望只记忆网关ip就ok,需要做配置
7.3.1.导入依赖
io.springfox
springfox-swagger2
2.9.2
io.springfox
springfox-swagger-ui
2.9.2
7.3.2.Swagger配置类
package cn.itsource.hrm.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;
import springfox.documentation.swagger.web.UiConfiguration;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
import java.util.List;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo());
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("源码人力资源系统")
.description("源码人力资源接口文档说明")
.termsOfServiceUrl("http://localhost:1020")
.contact(new Contact("whale.chen", "", "[email protected]"))
.version("1.0")
.build();
}
}
package cn.itsource.hrm.config;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;
import java.util.ArrayList;
import java.util.List;
@Component
@Primary
public class DocumentationConfig implements SwaggerResourcesProvider {
@Override
public List get() {
List resources = new ArrayList<>();
resources.add(swaggerResource("系统管理", "/hrm/system/v2/api-docs", "2.0"));
return resources;
}
private SwaggerResource swaggerResource(String name, String location, String version) {
SwaggerResource swaggerResource = new SwaggerResource();
swaggerResource.setName(name);
swaggerResource.setLocation(location);
swaggerResource.setSwaggerVersion(version);
return swaggerResource;
}
}
测试:http://127.0.0.1:1020/swagger-ui.html