前言
本人第一次知道JHipster,是在我21年刚入职时,架构师给的公司开发规范文档中看见的。当时就照着文档,开始搭建第一个JHipster项目。
学习一个新知识的最好途径,就是去官网阅读文档(JHipster 中文官网)
简介
JHipster是一个开发平台,可以快速生成,开发和部署现代Web应用程序+微服务架构。
优点:我们可以使用它快速创建项目,设计好实体后,可以直接生成单表的CRUD接口,非常便捷。
缺点:需要熟悉实体与实体之间的关系怎么搭建(需要多试试),项目目录格式不能轻易改动。
安装应用
- 安装Java(8 以上)
- 安装Git(JHipster使用了git初始化项目)
- Node(必须安装LTS版本,JHipster不支持非LTS版本的NodeJS了)
- 安装JHipster(使用Node的npm安装)
注意
- java版本必须是使用8或8以上的版本,因为JHipster是创建Spring Boot的项目,所以需要Java8以上(最好也是LTS),然后设置环境变量。
- 安装JHipster命令:
npm install -g generator-jhipster
搭建第一个项目
创建项目,官网也有教程,并且包含了每次询问的内容翻译和解释:官网创建应用讲解
创建项目
为了方便演示,我这里就在终端使用命令进行创建文件及文件夹。
创建项目比较慢,因为会使用npm下载很多的东西,这里最好将Node设置淘宝镜像
- 创建项目文件夹(项目目录)
# 创建工作空间(可省)
D:\>mkdir jhipster
D:\>cd jhipster
# 创建项目目录
D:\jhipster>mkdir myApp
D:\jhipster>cd myApp
# 开始创建项目
D:\jhipster\myApp>jhipster
- 交互式创建项目内容(官网介绍)
# 选择创建应用类型
? Which *type* of application would you like to create? Monolithic application (recommended for simple projects)
# 应用名称
? What is the base name of your application?
# 是否使用Spring WebFlux
? Do you want to make it reactive with Spring WebFlux?
# 包名
? What is your default Java package name?
# 权限认证
? Which *type* of authentication would you like to use?
# 数据库
? Which *type* of database would you like to use?
# 生产环境数据库
? Which *production* database would you like to use?
# 开发环境数据库
? Which *development* database would you like to use?
# 缓存选择
? Which cache do you want to use? (Spring cache abstraction) (Use arrow keys)
# 项目构建工具
? Would you like to use Maven or Gradle for building the backend?
# JHipster Registry来配置、监控和扩展应用程序
? Do you want to use the JHipster Registry to configure, monitor and scale your application? No
# 其他技术
? Which other technologies would you like to use?
# 前端框架
? Which *Framework* would you like to use for the client? Angular
# AminUI
? Do you want to generate the admin UI? Yes
# 主题选择
? Would you like to use a Bootswatch theme (https://bootswatch.com/)? Default JHipster
# 国际化选择
? Would you like to enable internationalization support? Yes
# 中文简体
? Please choose the native language of the application Chinese (Simplified)
# 测试框架
? Besides JUnit and Jest, which testing frameworks would you like to use?
# JHipster Marketplace
? Would you like to install other generators from the JHipster Marketplace? No
- 修改配置文件: pom.xml(修改java版本),application-dev.xml(数据库密码等信息)
- 启动: 在项目根目录下执行命令 mvnw
- 访问:http://localhost:8080
注意:
前端框架选择 Angular,本人在最开始使用期间,一直选择Vue(比较熟悉),导致一直创建不成功项目,所以换成了Angular就成功了。
创建项目期间,会下载很多包文件,当创建成功后,会出现如下所示。
使用mvmn启动项目成功后:
访问页面 http://localhost:8080
账号密码:admin:admin /user:user
创建实体
创建实体,就是创建我们之前的PO,DO类似的类,一个实体对应一张数据库表。
官网介绍有种方式创建实体:
- “entity”子生成器:使用交互式命令的方式创建实体,只需要和终端进行交互就行,简单的实体创建比较方便,一旦涉及到实体比较多,实体之间的关系复杂时(一对一,一对多,多对多),不推荐这种方式
- JHipster UML与JDL Studio:官方不推荐使用UML方式,推荐JDL Studio方式。使用JDL Studio 可以快速创建实体(类似Class),也可以创建实体之间的关系,并且还有可视化的uml类图。
不能使用JHipster和Java,数据库等工具的关键字。
entity子生成器
# 创建实体 实体名Demo
D:\jhipster\myApp>jhipster entity Demo
INFO! Using JHipster version installed locally in current project's node_modules
The entity Demo is being created.
Generating field #1
# 是否添加字段
? Do you want to add a field to your entity? Yes
# 字段名字
? What is the name of your field? name
# 字段类型
? What is the type of your field? String
# 是否添加规则验证
? Do you want to add validation rules to your field? Yes
# 是否添加规则
? Which validation rules do you want to add?
Generating relationships to other entities
# 是否想要添加实体关系
? Do you want to add a relationship to another entity? No
# 是否创建服务层
? Do you want to use separate service class for your business logic?
ementation
# 创建DTO
? Do you want to use a Data Transfer Object (DTO)? Yes, generate a DTO with MapStruct
# 创建过滤
? Do you want to add filtering? Dynamic filtering for the entities with JPA Static metamodel
# 实体是否只读
? Is this entity read-only? No
# 添加分页
? Do you want pagination and sorting on your entity? Yes, with infinite scroll and sorting headers
# 这里有个选项,我选择的是a
? Overwrite src\main\resources\config\liquibase\master.xml? overwrite this and all others
期间会有一些错误信息,不用管,只要最后出现如图的提示就表明成功了。
重新启动项目后,会发现数据库多了一张表。(里面的数据是JHipster内部给加上的模拟数据)
管理端数据都有这张表的信息,可以对这张表进行 CRUD了。
jdl-studio
在线编写JDL后,将文件保存到本地,然后再项目根目录执行命令。
下面是我编写的一个用户角色菜单的实体,其中BaseUser是用户实体,BaseRole是角色实体,BaseMenu是菜单实体,然后还有两个空实体:BaseUserRole(用户角色中间表实体),BaseRoleMenu(角色菜单中间表实体)。然后在建立4个一对多的关系,并添加了业务层(默认不会创建Service)。
注意:
这里的jdl文件,我在每个实体和属性都创建了注释,这样java类会创建注释,数据库也会创建注释。
在使用实体之间的关系时,不能预先创建关联的id属性,他会自动生成。
/**
* 基础用户
*/
entity BaseUser {
/**
* 工号
*/
jobNumber String,
/**
* 用户名
*/
username String,
/**
* 密码
*/
password String,
/**
* 性别
*/
sex Integer,
/**
* 姓名
*/
name String,
/**
* 手机号
*/
phone String,
/**
* 邮箱
*/
email String,
systemAccount String,
/**
* 激活状态
*/
enabled Boolean,
/**
* 备注
*/
remark String,
/**
* 是否被删除
*/
deleted Boolean,
/**
* 创建时间
*/
createTime LocalDate,
/**
* 修改时间
*/
updateTime LocalDate,
/**
* 创建人id
*/
createUserId Long,
/**
* 更新人id
*/
updateUserId Long,
}
/**
* 角色表
*/
entity BaseRole {
/**
* 角色名
*/
roleName String,
/**
* 角色中文名
*/
roleNameCN String,
/**
* 备注
*/
remark String,
/**
* 是否被删除
*/
deleted Boolean,
/**
* 创建时间
*/
createTime LocalDate,
/**
* 修改时间
*/
updateTime LocalDate,
/**
* 创建人id
*/
createUserId Long,
/**
* 更新人id
*/
updateUserId Long,
}
/**
* 用户角色中间表
*/
entity BaseUserRole
/**
* 菜单表
*/
entity BaseMenu {
/**
* 菜单路由
*/
url String,
/**
* 菜单名字
*/
menuName String,
/**
* 父级菜单id
*/
parentId Long,
/**
* 备注
*/
remark String,
/**
* 是否被删除
*/
deleted Boolean,
/**
* 创建时间
*/
createTime LocalDate,
/**
* 修改时间
*/
updateTime LocalDate,
/**
* 创建人id
*/
createUserId Long,
/**
* 更新人id
*/
updateUserId Long,
}
/**
* 菜单角色中间表
*/
entity BaseRoleMenu
relationship OneToMany {
BaseUser{roles} to BaseUserRole{user},
BaseRole{users} to BaseUserRole{role},
BaseRole{menus} to BaseRoleMenu{role},
BaseMenu{roles} to BaseRoleMenu{menu},
}
// 设置分页信息
paginate BaseUser, BaseRole with infinite-scroll
paginate BaseMenu with pagination
// Use Data Transfer Objects (DTO)
// dto * with mapstruct
// 设置服务层
service all with serviceImpl except BaseUser, BaseRole, BaseMenu
开始执行生成实体
jhipster jdl D:\Downloads\jhipster-jdl.jdl
conflict src\main\resources\config\liquibase\master.xml
? Overwrite src\main\resources\config\liquibase\master.xml? (ynarxdeH) y) overwrite
n) do not overwrite
a) overwrite this and all others
r) reload file (experimental)
x) abort
d) show the differences between the old and the new
e) edit file (experimental)
(Move up and down to reveal more choices)
Answer: a
然后重启项目,查看数据库和前端admin页面,发现表也创建成功了。
修改表(不友好)
现目前修改表,我的方式是直接修改实体文件,然后删除修改的表(以及连表),删除databasechangelog
中对应表的日志。然后重新使用jdl方式创建实体即可。
遗留的问题
更新表比较麻烦
总结
- 简单的项目,可以快速生成。
- 查看源代码,学习代码书写(比如我在这个项目里面学习了日志的更深层次的使用)
- 项目目录结构不能随意修改
- 全局异常和同意返回格式需要封装,统一返回格式需要自己手动改代码。