HRM项目的搭建
一.项目背景
1.项目背景
我们开发一个源码人力系统,让找工作的人,能够选择特定机构的课程学习,并参与平台发布的招聘,而且还能参与一些活动。 让招聘单位入驻进来发布岗位进行招聘,甚至委托培训机构培训合适的人才。对于配置机构可以发布课程,吸收学员来完成学习并通过收取学费获取商业价值。
2.使用项目的人
-
找工作人
-
招聘的人
-
培训机构
-
系统运营方
二.项目架构
1.项目原型 - 前后端分离
-
后台管理的前端:elementui+vue
-
门户网站的前端:div+css(前端)
-
2.后台技术架构
SpringBoot+SpringCloud
2.功能图
3.项目整体技术架构
二.后台项目搭建
一.项目基本模块搭建
hrm-parent hrm-basic-parent //项目基本模块 hrm-basic-utils //公共工具模块 hrm-basic-common //公共代码模块 hrm-support-parent //项目支撑服务 hrm-eureka-server-1010 hrm-gateway-zuul-1020 hrm-config-server-1030 hrm-systemmanage-parent hrm-systemmanage-common //针对系统管理服务公共代码如:domain,query hrm-systemmanage-service-2010 //针对于系统管理的微服务
二.完成hrm-eureka-server-1010的搭建
三.完成hrm-gateway-zuul-1020的搭建
四.完成hrm-config-server-1030的搭建
五.完成hrm-systemmanage-service-2010的搭建
三.数据字典
一.数据字典分析
1.什么是数据字典
就是把系统中的一些基础数据(一些不变的数据项),比如:学校,学历,单位等等用两张表来维护,一个类型表,一个明细表 。类表用来描述数据项的类型 , 而明细表用来描述数据项的明细列表。
2.数据字典的原理
3.数据字典的查询
select i.id,i.title from dir d join item i on i.dir_id = d.id where d.sn = “xl”
二.创建数据库 hrm-systemmanage
1.数据字典分类表
t_systemdictionary
2.数据字典明细表
t_systemdictionaryitem
四.MybatisPlus介绍
一.基本概念
1.什么是MyBatiesPlus
使用MybatisPlus,就不用写重复代码,并且还有模板的功能,可以一键生成daomin,query,mapper接口,mapper.xml,service,controller,非常好用。MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
2.MybatisPlus的特点
-
无侵入
-
损耗小
-
强大的 CRUD 操作
-
支持 Lambda 形式调用
-
支持多种数据库
-
支持主键自动生成
-
支持 XML 热加载
-
内置代码生成器
-
内置分页插件
-
内置性能分析插件
-
内置全局拦截插件
-
内置 Sql 注入剥离器
二.MybatisPlus工作图
五.使用Mybatisplus生成数据字典
一.系统管理微服务集成MybatisPlus - hrm-systemmanage-service-2010
1.导入依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> </dependency> ...
2.创建MybatisPlus的配置类
@EnableTransactionManagement //事务管理 @Configuration @MapperScan("cn.itsource.hrm.mapper") //mapper接口的扫描包 public class MybatisPlusConfig { /** * 分页插件 */ @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } }
3.配置文件
eureka: client: serviceUrl: defaultZone: http://localhost:1010/eureka/ #注册中心地址 instance: prefer-ip-address: true #使用ip地址注册 instance-id: hrm-systemmanage-service #指定服务的id server: port: 2010 spring: application: name: hrm-systemmanage-service datasource: username: root password: 123456 url: jdbc:mysql:///hrm-systemmanage driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource mybatis-plus: mapper-locations: classpath:cn/itsource/hrm/mapper/*Mapper.xml type-aliases-package: cn.itsource.hrm.domain,cn.itsource.hrm.query
二.创建代码生成器项目 - hrm-basic-mybatisplus-generator
1.导入依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> </dependency> <!--模板引擎--> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
2.创建配置文件 resources/mybatiesplus-config.properties
#此处为本项目src所在路径(代码生成器输出路径),注意一定是当前项目所在的目录哟 OutputDir=D:/JavaEEIdeaWorkspace/hrm-parent/hrm-systemmanage-parent/hrm-systemmanage-service-2010/src/main/java #mapper.xml SQL映射文件目录 OutputDirXml=D:/JavaEEIdeaWorkspace/hrm-parent/hrm-systemmanage-parent/hrm-systemmanage-service-2010/src/main/resources #domain的输出路径 OutputDirBase=D:/JavaEEIdeaWorkspace/hrm-parent/hrm-systemmanage-parent/hrm-systemmanage-common/src/main/java #设置作者 author=gangge #自定义包路径 parent=cn.itsource.hrm #数据库连接信息 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql:///hrm-systemmanage jdbc.user=root jdbc.pwd=123456
3.拷贝模板
resources /templates /controller.java.vmresources /templates /query.java.vm
4.拷贝一个代码生成主类
-
注意是否需要调整domain的输出路径
-
注意是否需要调整Mapper.xml的输出路径
-
增加controller的输出生成模板和输出路径调整
-
增加query的输出生成模板和输出路径调整
package cn.itsource.hrm; 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"); //不要加后缀 AutoGenerator mpg = new AutoGenerator(); // 全局配置 GlobalConfig gc = new GlobalConfig(); gc.setOutputDir(rb.getString("OutputDir")); gc.setFileOverride(true); 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[]{"t_systemdictionary","t_systemdictionaryitem"}); // 需要生成的表 mpg.setStrategy(strategy); // 包配置 PackageConfig pc = new PackageConfig(); pc.setParent(rb.getString("parent")); pc.setController("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<String, Object> map = new HashMap<String, Object>(); map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-rb"); this.setMap(map); } }; List<FileOutConfig> focList = new ArrayList<FileOutConfig>(); //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(); } }
5.在hrm-basic-utils中拷贝工具
queryutil
六.Swagger的集成
一.系统管理集成swagger - hrm-systemmanage-service-2010
1.导入依赖
<!--引入swagger支持--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency>
2.拷贝配置类
@Configuration @EnableSwagger2 //开启swagger2的支持 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.config")) .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("系统管理服务api") .description("系统管理服务接口文档说明") .contact(new Contact("gangge", "", "gangge@itsource.cn")) .version("1.0") .build(); } }
注意:basePackage要改成你项目的controller的路径
3.测试
二.zuul集成swagger
1.导入依赖 - 同上
<!--引入swagger支持--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency>
2.拷贝配置类
DocumentationConfig
@Component @Primary public class DocumentationConfig implements SwaggerResourcesProvider { @Override public List<SwaggerResource> get() { List resources = new ArrayList<>(); //添加所有的微服务的文档资源 /** * 参数: * name:自定义的服务的名字 * location:指定是微服务的路径 /前缀/服务名/v2/api-docs */ 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; } }
注意: resources.add .. 要修改成自己的微服务的配置
SwaggerConfig
@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("gangge", "", "gangge@itsoruce.cn")) .version("1.0") .build(); } }
注意: termsOfServiceUrl 要修改成网关的地址