Merge branch 'develop' of https://github.com/dibo-software/diboot-v2 into develop

This commit is contained in:
左春锐 2019-08-30 10:02:38 +08:00
commit 4ed8910359
20 changed files with 616 additions and 404 deletions

View File

@ -157,8 +157,9 @@ public class V {
* @param str
* @return true Or false
*/
public static boolean isNumeric(String str){
return S.isNumeric(str);
public static boolean isNumber(String str){
String regex = "^(-?[1-9]\\d*\\.?\\d*)|(-?0\\.\\d*[1-9])|(-?[0])|(-?[0]\\.\\d*)$";
return str.matches(regex);
}
/**
@ -189,22 +190,6 @@ public class V {
return valid;
}
/**
* 判断是否为整型数字
* @param str
* @return
*/
public static boolean isNumber(String str) {
try{
S.isNumeric(str);
Integer.parseInt(str);
return true;
}
catch(Exception ex){
return false;
}
}
/**
* 是否boolean值范围
*/

View File

@ -1,6 +1,6 @@
-- 建表
create table "dictionary" (
"id" serial PRIMARY KEY,
"id" INTEGER generated as identity ( start with 1 nocycle noorder) not null,
"parent_id" INTEGER not null,
"type" VARCHAR2(50) not null,
"item_name" VARCHAR2(100) not null,
@ -11,7 +11,8 @@ create table "dictionary" (
"system" SMALLINT default 0 not null,
"editable" SMALLINT default 1 not null,
"deleted" SMALLINT default 0 not null,
"create_time" TIMESTAMP default 'CURRENT_TIMESTAMP' not null
"create_time" TIMESTAMP default CURRENT_TIMESTAMP not null,
constraint "PK_dictionary" primary key ("id")
);
-- 添加备注
comment on column "dictionary"."id" is 'ID';
@ -31,3 +32,5 @@ comment on table "dictionary" is '数据字典';
-- 创建索引
create index "idx_directory" on "dictionary" ("type", "item_value");

View File

@ -15,19 +15,19 @@ create table dictionary (
constraint PK_dictionary primary key (id)
);
-- 添加备注
execute sp_addextendedproperty 'MS_Description', 'ID', 'user', '${SCHEMA}', 'table', 'dictionary', 'column', 'id';
execute sp_addextendedproperty 'MS_Description', '父ID', 'user', '${SCHEMA}', 'table', 'dictionary', 'column', 'parent_id';
execute sp_addextendedproperty 'MS_Description', '字典类型', 'user', '${SCHEMA}', 'table', 'dictionary', 'column', 'type';
execute sp_addextendedproperty 'MS_Description', '显示名', 'user', '${SCHEMA}', 'table', 'dictionary', 'column', 'item_name';
execute sp_addextendedproperty 'MS_Description', '存储值', 'user', '${SCHEMA}', 'table', 'dictionary', 'column', 'item_value';
execute sp_addextendedproperty 'MS_Description', '备注', 'user', '${SCHEMA}', 'table', 'dictionary', 'column', 'comment';
execute sp_addextendedproperty 'MS_Description', '扩展JSON', 'user', '${SCHEMA}', 'table', 'dictionary', 'column', 'extdata';
execute sp_addextendedproperty 'MS_Description', '排序号', 'user', '${SCHEMA}', 'table', 'dictionary', 'column', 'sort_id';
execute sp_addextendedproperty 'MS_Description', '是否系统预置', 'user', '${SCHEMA}', 'table', 'dictionary', 'column', 'system';
execute sp_addextendedproperty 'MS_Description', '是否可编辑', 'user', '${SCHEMA}', 'table', 'dictionary', 'column', 'editable';
execute sp_addextendedproperty 'MS_Description', '删除标记', 'user', '${SCHEMA}', 'table', 'dictionary', 'column', 'deleted';
execute sp_addextendedproperty 'MS_Description', '创建时间', 'user', '${SCHEMA}', 'table', 'dictionary', 'column', 'create_time';
execute sp_addextendedproperty 'MS_Description', N'ID', 'Schema', '${SCHEMA}', 'table', 'dictionary', 'column', 'id';
execute sp_addextendedproperty 'MS_Description', N'父ID', 'Schema', '${SCHEMA}', 'table', 'dictionary', 'column', 'parent_id';
execute sp_addextendedproperty 'MS_Description', N'字典类型', 'Schema', '${SCHEMA}', 'table', 'dictionary', 'column', 'type';
execute sp_addextendedproperty 'MS_Description', N'显示名', 'Schema', '${SCHEMA}', 'table', 'dictionary', 'column', 'item_name';
execute sp_addextendedproperty 'MS_Description', N'存储值', 'Schema', '${SCHEMA}', 'table', 'dictionary', 'column', 'item_value';
execute sp_addextendedproperty 'MS_Description', N'备注', 'Schema', '${SCHEMA}', 'table', 'dictionary', 'column', 'comment';
execute sp_addextendedproperty 'MS_Description', N'扩展JSON', 'Schema', '${SCHEMA}', 'table', 'dictionary', 'column', 'extdata';
execute sp_addextendedproperty 'MS_Description', N'排序号', 'Schema', '${SCHEMA}', 'table', 'dictionary', 'column', 'sort_id';
execute sp_addextendedproperty 'MS_Description', N'是否系统预置', 'Schema', '${SCHEMA}', 'table', 'dictionary', 'column', 'system';
execute sp_addextendedproperty 'MS_Description', N'是否可编辑', 'Schema', '${SCHEMA}', 'table', 'dictionary', 'column', 'editable';
execute sp_addextendedproperty 'MS_Description', N'删除标记', 'Schema', '${SCHEMA}', 'table', 'dictionary', 'column', 'deleted';
execute sp_addextendedproperty 'MS_Description', N'创建时间', 'Schema', '${SCHEMA}', 'table', 'dictionary', 'column', 'create_time';
execute sp_addextendedproperty 'MS_Description','数据字典','user','${SCHEMA}','table','dictionary',null,null;
execute sp_addextendedproperty 'MS_Description', N'数据字典', 'Schema', '${SCHEMA}', 'table', 'dictionary', null, null;
-- 创建索引
create nonclustered index idx_directory on dictionary(type, item_value);

View File

@ -8,16 +8,61 @@ module.exports = {
port: '9090',
base: '/docs/',
themeConfig: {
sidebar: 'auto',
sidebarDepth: 2,
// sidebar: 'auto',
sidebar: {
'/guide/diboot-core/': [
{
title: 'diboot-core指南',
collapsable: true,
sidebarDepth: 2,
children: [
['/guide/diboot-core/安装', '安装'],
['/guide/diboot-core/实体Entity', '实体Entity'],
['/guide/diboot-core/Service与实现', 'Service与实现'],
['/guide/diboot-core/Mapper及自定义', 'Mapper及自定义'],
['/guide/diboot-core/接口的艺术Controller', '接口的艺术Controller'],
['/guide/diboot-core/查询条件DTO', '查询条件DTO'],
['/guide/diboot-core/单表关联', '单表关联'],
['/guide/diboot-core/多表关联', '多表关联'],
['/guide/diboot-core/数据字典关联', '数据字典关联'],
['/guide/diboot-core/异常处理', '异常处理'],
['/guide/diboot-core/常用工具类', '常用工具类']
]
}
],
'/guide/diboot-shiro/': [
{
title: 'shiro使用指南',
collapsable: true,
sidebarDepth: 2,
children: [
]
}
],
'/guide/diboot-devtools/': [
{
title: 'diboot-devtools指南',
collapsable: true,
sidebarDepth: 2,
children: [
['/guide/diboot-devtools/安装', '安装'],
['/guide/diboot-devtools/启动', '启动'],
['/guide/diboot-devtools/数据表管理', '数据表管理'],
['/guide/diboot-devtools/代码生成与更新', '代码生成与更新']
]
}
]
},
nav: [{
text: '首页', link: '/'
}, {
text: '学习',
items: [
{text: 'diboot-core指南', link: '/guide/diboot-core/'},
{text: 'diboot-core指南', link: '/guide/diboot-core/安装'},
{text: 'diboot-shiro指南', link: '/guide/diboot-shiro/'},
{text: 'diboot-devtools指南', link: '/guide/diboot-devtools/'}
{text: 'diboot-devtools指南', link: '/guide/diboot-devtools/安装'}
]
}, {
text: 'API',

View File

@ -0,0 +1 @@
# Mapper及自定义

View File

@ -0,0 +1 @@
# Service与实现

View File

@ -0,0 +1,24 @@
# 单表关联
> 当两张表数据之间有直接的依赖关系时如主外键关联关系即可使用单表关联。在通过diboot-core的封装后
单表关联时开发者不再需要写大量java代码和SQL查询只要使用相关注解即可快速绑定它们之间的关联关系。
## @BindField 注解
该注解在单表关联时使用,用来将数据表中的某个字段映射到实体的对应字段,使用方法如下:
```java
@BindField(entity = Organization.class, field = "name", condition = "this.org_id=id")
private String orgName;
```
使用@BindField注解时需传三个参数分别是entity、field、condition
entity表示关联实体field表示关联表字段名condition表示关联条件。
## @BindEntity 注解
该注解在单表关联时使用,用来将数据表中的某条数据映射到对应实体,使用方法如下:
```java
@BindEntity(entity = Department.class, condition = "this.id = if_employee_position_department.employee_id AND if_employee_position_department.department_id = id AND if_employee_position_department.deleted = 0")
private Department department;
```
使用@BindEntity注解时需传两个参数分别是entity和condition
entity表示关联实体condition表示关联条件。

View File

@ -0,0 +1,14 @@
# 多表关联
> 当两张表数据之间是通过第三张表来产生依赖关系时即可使用多表关联。在通过diboot-core的封装后
多表关联时开发者不再需要写大量java代码和SQL查询只要使用相关注解即可快速绑定它们之间的关联关系。
## @BindEntityList 注解
该注解在多表关联时使用,用来将数据表中的单条或多条数据映射到对应的实体集合,使用方法如下:
```java
@BindEntityList(entity = Department.class, condition = "this.id = if_position_department.position_id AND if_position_department.department_id = id AND if_position_department.deleted = 0")
private List<Department> departmentList;
```
使用@BindEntityList注解时需传两个参数分别是entity和condition
entity表示关联实体condition表示关联条件。

View File

@ -0,0 +1,19 @@
# 安装
## diboot-core是什么
> diboot-core是diboot2.0版本的核心基础框架基于SpringMybatis-plus等知名开源项目。
* 使用diboot-core可以更加简单且方便地创建您的web后端应用您之前的诸多工作也将得到极大的放松我们为您准备了常用的各种工具类函数
* 我们为你配置好了mybatis-plus方便你进行单表CRUD无SQL的探索
* 我们也为您提供了多表关联查询的无SQL实现方案这里的多表不只是两张表之间的关联而且还可以处理三张表之间的关联只需要一个注解你就可以快速处理完以往要好些代码才能处理好的事情
* 我们为您提供了数据字典的管理与接口;
* 我们在diboot-core中还提供了其他常用开发场景的简单封装。
## 依赖引入
可以从**Maven中央仓库**搜索[diboot-core](https://mvnrepository.com/artifact/com.diboot/diboot-core),刷新项目即可。
## 初始化数据库
diboot-core在初次运行中会自动安装所需数据库表如果已经存在则不做操作。

View File

@ -0,0 +1,73 @@
# 实体Entity
> diboot-core中的实体与1.x版本的model一样我们为了命名更加规范这里改用entity下文简称实体。
所有实体统一存放在entity包名下命名一般将表名转换为驼峰命名法命名再首字母大写即可比如**sys_user**的实体名为**SysUser。**
## BaseEntity
> BaseEntity是diboot-core提供的基础实体类提供了我们默认数据表结构的默认字段比如id、deleted、create_time等默认的方法如toMap、toString方法等。
## BaseExtEntity
> BaseExtEntity是基于BaseEntity的扩展实体类对数据表结构的扩展字段extdata添加了相关处理方法extdata将以json字符串形式存储在数据库中。
* getFromExt方法
```java
/***
* 从extdata JSON中提取扩展属性值
* @param extAttrName
* @return
*/
public Object getFromExt(String extAttrName){
if(this.extdataMap == null){
return null;
}
return this.extdataMap.get(extAttrName);
}
```
该方法传入一个属性名称,返回该属性值
* addIntoExt
```java
/***
* 添加扩展属性和值到extdata JSON中
* @param extAttrName
* @param extAttrValue
*/
public void addIntoExt(String extAttrName, Object extAttrValue){
if(extAttrName == null && extAttrValue == null){
return;
}
if(this.extdataMap == null){
this.extdataMap = new LinkedHashMap<>();
}
this.extdataMap.put(extAttrName, extAttrValue);
}
```
该方法传入一个属性名与属性值即可将该值设置到extdata的json字符串中。
## 数据校验
> 我们在数据提交过程中可能会需要后端进行数据格式校验我们默认是用validation来做后端数据校验我们可以在实体中需要校验的字段上添加校验相关的注解如下
```java
@NotNull(message = "上级ID不能为空如无请设为0")
private Long parentId;
```
## @TableField注解
> 如果mapper也继承我们core的BaseMapper来处理那么实体中的所有字段都被认为在相对应的数据表中是存在的如果某个字段在对应数据表中不存在则会执行SQL时报错。
所以,如果某个字段在相对应的数据表中不存在,而我们又需要使用到该字段,那么可以添加@Tablefield注解并且设置@TableField(exist = false)中的exist参数为false即可如下
```java
@TableField(exist = false)
private List<Long> userIdList;
```

View File

@ -1,333 +1,6 @@
# 常用工具类
# diboot-core
## 安装
### diboot-core是什么
> diboot-core是diboot2.0版本的核心基础框架基于SpringMybatis-plus等知名开源项目。
* 使用diboot-core可以更加简单且方便地创建您的web后端应用您之前的诸多工作也将得到极大的放松我们为您准备了常用的各种工具类函数
* 我们为你配置好了mybatis-plus方便你进行单表CRUD无SQL的探索
* 我们也为您提供了多表关联查询的无SQL实现方案这里的多表不只是两张表之间的关联而且还可以处理三张表之间的关联只需要一个注解你就可以快速处理完以往要好些代码才能处理好的事情
* 我们为您提供了数据字典的管理与接口;
* 我们在diboot-core中还提供了其他常用开发场景的简单封装。
### 依赖引入
可以从[maven中央仓库]([https://mvnrepository.com](https://mvnrepository.com/))搜索[diboot-core](http://),刷新项目即可。
### 初始化数据库
diboot-core在初次运行中会自动安装所需数据库表如果已经存在则不做操作。
## 实体Entity
> diboot-core中的实体与1.x版本的model一样我们为了命名更加规范这里改用entity下文简称实体。
所有实体统一存放在entity包名下命名一般将表名转换为驼峰命名法命名再首字母大写即可比如**sys_user**的实体名为**SysUser。**
### BaseEntity
> BaseEntity是diboot-core提供的基础实体类提供了我们默认数据表结构的默认字段比如id、deleted、create_time等默认的方法如toMap、toString方法等。
### BaseExtEntity
> BaseExtEntity是基于BaseEntity的扩展实体类对数据表结构的扩展字段extdata添加了相关处理方法extdata将以json字符串形式存储在数据库中。
* getFromExt方法
```java
/***
* 从extdata JSON中提取扩展属性值
* @param extAttrName
* @return
*/
public Object getFromExt(String extAttrName){
if(this.extdataMap == null){
return null;
}
return this.extdataMap.get(extAttrName);
}
```
该方法传入一个属性名称,返回该属性值
* addIntoExt
```java
/***
* 添加扩展属性和值到extdata JSON中
* @param extAttrName
* @param extAttrValue
*/
public void addIntoExt(String extAttrName, Object extAttrValue){
if(extAttrName == null && extAttrValue == null){
return;
}
if(this.extdataMap == null){
this.extdataMap = new LinkedHashMap<>();
}
this.extdataMap.put(extAttrName, extAttrValue);
}
```
该方法传入一个属性名与属性值即可将该值设置到extdata的json字符串中。
### 数据校验
> 我们在数据提交过程中可能会需要后端进行数据格式校验我们默认是用validation来做后端数据校验我们可以在实体中需要校验的字段上添加校验相关的注解如下
```java
@NotNull(message = "上级ID不能为空如无请设为0")
private Long parentId;
```
### @TableField注解
> 如果mapper也继承我们core的BaseMapper来处理那么实体中的所有字段都被认为在相对应的数据表中是存在的如果某个字段在对应数据表中不存在则会执行SQL时报错。
所以,如果某个字段在相对应的数据表中不存在,而我们又需要使用到该字段,那么可以添加@Tablefield注解并且设置@TableField(exist = false)中的exist参数为false即可如下
```java
@TableField(exist = false)
private List<Long> userIdList;
```
## Service与实现
## Mapper及自定义
## 接口的艺术Controller
### BaseController
> BaseController是BaseCrudRestController的父类提供请求参数处理等方法的封装。
### BaseCrudRestController
> 增删改查通用controller,以后的controller都可以继承该类减少代码量。
接下来会对BaseCrudRestController中的一些通用方法进行介绍。
* getService 抽象方法
```java
/**
* 获取service实例
*
* @return
*/
protected abstract BaseService getService();
```
该方法是用来获取当前类中相关业务Service实例。
所有继承了BaseCrudRestController的实体类都要实现该方法如下
* getService 方法实现
```java
@Autowired
private DictionaryService dictionaryService;
@Override
protected BaseService getService() {
return dictionaryService;
}
```
* getEntityList 方法
```java
//方法定义
protected JsonResult getEntityList(Wrapper queryWrapper) {...}
//方法调用示例
JsonResult jsonResult = super.getEntityList(queryWrapper);
System.out.println(jsonResult.getCode()==0);
//执行结果
===> true
```
该方法用于获取数据集合,入参为查询条件queryWrapper
调用该方法成功后会返回所有符合查询条件的数据集合,该方法无分页功能。
* getEntityListWithPaging 方法
```java
//方法定义
protected JsonResult getEntityListWithPaging(Wrapper queryWrapper, Pagination pagination) {...}
//方法调用示例
JsonResult jsonResult = super.getEntityListWithPaging(queryWrapper,pagination);
System.out.println(jsonResult.getCode()==0);
//执行结果
===> true
```
该方法用于获取数据集合,入参为查询条件queryWrapper、分页条件pagination
调用该方法成功后会返回符合查询条件的当前页数据集合,该方法有分页功能。
* getVOListWithPaging 方法
```java
//方法定义
protected <T> JsonResult getVOListWithPaging(Wrapper queryWrapper, Pagination pagination, Class<T> clazz) {...}
//方法调用示例
JsonResult jsonResult = super.getVOListWithPaging(queryWrapper,pagination,Organization.class);
System.out.println(jsonResult.getCode()==0);
//执行结果
===> true
```
该方法用来获取数据VO集合入参为查询条件queryWrapper、分页条件pagination、类类型clazz
调用该方法成功后会返回符合查询条件的当前页数据VO集合该方法有分页功能。
* createEntity 方法
```java
//方法定义
protected JsonResult createEntity(BaseEntity entity, BindingResult result) {...}
//方法调用示例
JsonResult jsonResult = super.createEntity(entity,result);
System.out.println(jsonResult.getCode()==0);
//执行结果
===> true
```
该方法用来新建数据入参为数据实体entity、绑定结果result调用该方法成功后会在相关表中插入一条数据。
* updateEntity 方法
```java
//方法定义
protected JsonResult updateEntity(BaseEntity entity, BindingResult result) {...}
//方法调用示例
JsonResult jsonResult = super.updateEntity(entity,result);
System.out.println(jsonResult.getCode()==0);
//执行结果
===> true
```
该方法用来更新数据入参为数据实体entity、绑定结果result调用该方法成功后会更新相关表中的数据。
* deleteEntity 方法
```java
//方法定义
protected JsonResult deleteEntity(Serializable id) {...}
//方法调用示例
JsonResult jsonResult = super.deleteEntity(id);
System.out.println(jsonResult.getCode()==0);
//执行结果
===> true
```
该方法用来删除数据入参为数据IDid调用该方法成功后会删除相关表中的数据。
* convertToVoAndBindRelations 方法
```java
//方法定义
protected <VO> List<VO> convertToVoAndBindRelations(List entityList, Class<VO> voClass) {...}
//方法调用示例
List<OrganizationVO> orgVOList = super.convertToVoAndBindRelations(entityList, OrganizationVO.class);
System.out.println(orgVOList.size()>0);
//执行结果
===> true
```
该方法用来将数据实体集合转化为数据实体VO集合入参为实体集合entityList、类类型voClass
调用该方法成功后返回数据实体VO集合。
* beforeCreate 方法
```java
//方法定义
protected String beforeCreate(BaseEntity entity){...}
//方法调用示例
String str = this.beforeCreate(entity);
```
该方法用来处理新建数据之前的逻辑如数据校验等需要子类继承BaseCrudRestController时重写并实现具体处理逻辑。
* afterCreated 方法
```java
//方法定义
protected String afterCreated(BaseEntity entity){...}
//方法调用示例
String str = this.afterCreated(entity);
```
该方法用来处理新建数据之后的逻辑需要子类继承BaseCrudRestController时重写并实现具体处理逻辑。
* beforeUpdate 方法
```java
//方法定义
protected String beforeUpdate(BaseEntity entity){...}
//方法调用示例
String str = this.beforeUpdate(entity);
```
该方法用来处理更新数据之前的逻辑需要子类继承BaseCrudRestController时重写并实现具体处理逻辑。
* afterUpdated 方法
```java
//方法定义
protected String afterUpdated(BaseEntity entity){...}
//方法调用示例
String str = this.afterUpdated(entity);
```
该方法用来处理更新数据之后的逻辑需要子类继承BaseCrudRestController时重写并实现具体处理逻辑。
* beforeDelete 方法
```java
//方法定义
protected String beforeDelete(BaseEntity entity){...}
//方法调用示例
String str = this.beforeDelete(entity);
```
该方法主要用来处理删除数据之前的逻辑如检验是否具有删除权限等需要子类继承BaseCrudRestController时重写并实现具体处理逻辑。
## 查询条件DTO
## 单表关联
> 当两张表数据之间有直接的依赖关系时如主外键关联关系即可使用单表关联。在通过diboot-core的封装后
单表关联时开发者不再需要写大量java代码和SQL查询只要使用相关注解即可快速绑定它们之间的关联关系。
### @BindField 注解
该注解在单表关联时使用,用来将数据表中的某个字段映射到实体的对应字段,使用方法如下:
```java
@BindField(entity = Organization.class, field = "name", condition = "this.org_id=id")
private String orgName;
```
使用@BindField注解时需传三个参数分别是entity、field、condition
entity表示关联实体field表示关联表字段名condition表示关联条件。
### @BindEntity 注解
该注解在单表关联时使用,用来将数据表中的某条数据映射到对应实体,使用方法如下:
```java
@BindEntity(entity = Department.class, condition = "this.id = if_employee_position_department.employee_id AND if_employee_position_department.department_id = id AND if_employee_position_department.deleted = 0")
private Department department;
```
使用@BindEntity注解时需传两个参数分别是entity和condition
entity表示关联实体condition表示关联条件。
## 多表关联
> 当两张表数据之间是通过第三张表来产生依赖关系时即可使用多表关联。在通过diboot-core的封装后
多表关联时开发者不再需要写大量java代码和SQL查询只要使用相关注解即可快速绑定它们之间的关联关系。
### @BindEntityList 注解
该注解在多表关联时使用,用来将数据表中的单条或多条数据映射到对应的实体集合,使用方法如下:
```java
@BindEntityList(entity = Department.class, condition = "this.id = if_position_department.position_id AND if_position_department.department_id = id AND if_position_department.deleted = 0")
private List<Department> departmentList;
```
使用@BindEntityList注解时需传两个参数分别是entity和condition
entity表示关联实体condition表示关联条件。
## 数据字典关联
> 当表中的字段为数据字典类型的值时可使用数据字典关联来绑定表字段与数据字典的关联关系。在通过diboot-core的封装后
数据字典关联时开发者不再需要写大量java代码和SQL查询只要使用相关注解即可快速绑定它们之间的关联关系。
### @BindDict 注解
该注解在数据字典关联时使用,用来将数据字典表中的某条数据映射到实体的对应字段,使用方法如下:
```java
@BindDict(type = "POSITION_LEVEL", field = "level")
private String levelLabel;
```
使用@BindDict注解时需传两个参数分别是type和field
type表示关联的数据字典类型field表示关联字段。
## 异常处理
## 常用工具类
### BeanUtilsBean
## BeanUtils(Bean)
* copyProperties 方法
```java
@ -509,7 +182,7 @@ List<Field> list = BeanUtils.extractAllFields(Organization.class);
```
该方法用来获取类的所有属性包含父类入参为类类型clazz
### ContextHelperSpring上下文
## ContextHelper(Spring上下文)
* setApplicationContext 方法
```java
@ -575,7 +248,7 @@ List list = service.list();
```
该方法用来根据Entity获取对应的Service入参为类类型entity
### D日期时间
## D(日期时间)
* 日期、时间、星期格式常量
```java
@ -822,7 +495,7 @@ System.out.println(date);
```
该方法用来模糊转换日期入参为时间字符串dateString
### Encryptor加解密
## Encryptor(加解密)
* encrypt 方法
```java
@ -848,7 +521,7 @@ System.out.println(decryptStr);
```
该方法用来解密字符串入参为需解密字符串input、解密秘钥key
### JSON
## JSON
* stringify 方法
```java
@ -898,7 +571,7 @@ System.out.pringtln(dictionary.getSystem());
```
该方法用来将JSON字符串转换为java对象入参为JSON字符串jsonStr、类类型clazz
### PropertiesUtils配置文件
## PropertiesUtils(配置文件)
* get 方法
```java
@ -936,7 +609,7 @@ System.out.println(isOpen);
```
该方法用来读取boolean型的配置项入参为配置字段名key、配置文件名propertiesFileName
### S字符串
## S(字符串)
* cut 方法
```java
@ -1115,7 +788,7 @@ System.out.println(str);
```
该方法用来将首字母转为大写入参为字符串input
### SqlExecutorSQL执行
## SqlExecutor(SQL执行)
* executeQuery 方法
```java
@ -1153,7 +826,7 @@ boolean success = SqlExecutor.executeUpdate(sql, params);
```
该方法用来执行更新操作入参为SQL语句sql、更新参数params
### V校验
## V(校验)
* isEmpty 方法
```java

View File

@ -0,0 +1 @@
# 异常处理

View File

@ -0,0 +1,165 @@
# 接口的艺术Controller
## BaseController
> BaseController是BaseCrudRestController的父类提供请求参数处理等方法的封装。
## BaseCrudRestController
> 增删改查通用controller,以后的controller都可以继承该类减少代码量。
接下来会对BaseCrudRestController中的一些通用方法进行介绍。
* getService 抽象方法
```java
/**
* 获取service实例
*
* @return
*/
protected abstract BaseService getService();
```
该方法是用来获取当前类中相关业务Service实例。
所有继承了BaseCrudRestController的实体类都要实现该方法如下
* getService 方法实现
```java
@Autowired
private DictionaryService dictionaryService;
@Override
protected BaseService getService() {
return dictionaryService;
}
```
* getEntityList 方法
```java
//方法定义
protected JsonResult getEntityList(Wrapper queryWrapper) {...}
//方法调用示例
JsonResult jsonResult = super.getEntityList(queryWrapper);
System.out.println(jsonResult.getCode()==0);
//执行结果
===> true
```
该方法用于获取数据集合,入参为查询条件queryWrapper
调用该方法成功后会返回所有符合查询条件的数据集合,该方法无分页功能。
* getEntityListWithPaging 方法
```java
//方法定义
protected JsonResult getEntityListWithPaging(Wrapper queryWrapper, Pagination pagination) {...}
//方法调用示例
JsonResult jsonResult = super.getEntityListWithPaging(queryWrapper,pagination);
System.out.println(jsonResult.getCode()==0);
//执行结果
===> true
```
该方法用于获取数据集合,入参为查询条件queryWrapper、分页条件pagination
调用该方法成功后会返回符合查询条件的当前页数据集合,该方法有分页功能。
* getVOListWithPaging 方法
```java
//方法定义
protected <T> JsonResult getVOListWithPaging(Wrapper queryWrapper, Pagination pagination, Class<T> clazz) {...}
//方法调用示例
JsonResult jsonResult = super.getVOListWithPaging(queryWrapper,pagination,Organization.class);
System.out.println(jsonResult.getCode()==0);
//执行结果
===> true
```
该方法用来获取数据VO集合入参为查询条件queryWrapper、分页条件pagination、类类型clazz
调用该方法成功后会返回符合查询条件的当前页数据VO集合该方法有分页功能。
* createEntity 方法
```java
//方法定义
protected JsonResult createEntity(BaseEntity entity, BindingResult result) {...}
//方法调用示例
JsonResult jsonResult = super.createEntity(entity,result);
System.out.println(jsonResult.getCode()==0);
//执行结果
===> true
```
该方法用来新建数据入参为数据实体entity、绑定结果result调用该方法成功后会在相关表中插入一条数据。
* updateEntity 方法
```java
//方法定义
protected JsonResult updateEntity(BaseEntity entity, BindingResult result) {...}
//方法调用示例
JsonResult jsonResult = super.updateEntity(entity,result);
System.out.println(jsonResult.getCode()==0);
//执行结果
===> true
```
该方法用来更新数据入参为数据实体entity、绑定结果result调用该方法成功后会更新相关表中的数据。
* deleteEntity 方法
```java
//方法定义
protected JsonResult deleteEntity(Serializable id) {...}
//方法调用示例
JsonResult jsonResult = super.deleteEntity(id);
System.out.println(jsonResult.getCode()==0);
//执行结果
===> true
```
该方法用来删除数据入参为数据IDid调用该方法成功后会删除相关表中的数据。
* convertToVoAndBindRelations 方法
```java
//方法定义
protected <VO> List<VO> convertToVoAndBindRelations(List entityList, Class<VO> voClass) {...}
//方法调用示例
List<OrganizationVO> orgVOList = super.convertToVoAndBindRelations(entityList, OrganizationVO.class);
System.out.println(orgVOList.size()>0);
//执行结果
===> true
```
该方法用来将数据实体集合转化为数据实体VO集合入参为实体集合entityList、类类型voClass
调用该方法成功后返回数据实体VO集合。
* beforeCreate 方法
```java
//方法定义
protected String beforeCreate(BaseEntity entity){...}
//方法调用示例
String str = this.beforeCreate(entity);
```
该方法用来处理新建数据之前的逻辑如数据校验等需要子类继承BaseCrudRestController时重写并实现具体处理逻辑。
* afterCreated 方法
```java
//方法定义
protected String afterCreated(BaseEntity entity){...}
//方法调用示例
String str = this.afterCreated(entity);
```
该方法用来处理新建数据之后的逻辑需要子类继承BaseCrudRestController时重写并实现具体处理逻辑。
* beforeUpdate 方法
```java
//方法定义
protected String beforeUpdate(BaseEntity entity){...}
//方法调用示例
String str = this.beforeUpdate(entity);
```
该方法用来处理更新数据之前的逻辑需要子类继承BaseCrudRestController时重写并实现具体处理逻辑。
* afterUpdated 方法
```java
//方法定义
protected String afterUpdated(BaseEntity entity){...}
//方法调用示例
String str = this.afterUpdated(entity);
```
该方法用来处理更新数据之后的逻辑需要子类继承BaseCrudRestController时重写并实现具体处理逻辑。
* beforeDelete 方法
```java
//方法定义
protected String beforeDelete(BaseEntity entity){...}
//方法调用示例
String str = this.beforeDelete(entity);
```
该方法主要用来处理删除数据之前的逻辑如检验是否具有删除权限等需要子类继承BaseCrudRestController时重写并实现具体处理逻辑。

View File

@ -0,0 +1,14 @@
# 数据字典关联
> 当表中的字段为数据字典类型的值时可使用数据字典关联来绑定表字段与数据字典的关联关系。在通过diboot-core的封装后
数据字典关联时开发者不再需要写大量java代码和SQL查询只要使用相关注解即可快速绑定它们之间的关联关系。
## @BindDict 注解
该注解在数据字典关联时使用,用来将数据字典表中的某条数据映射到实体的对应字段,使用方法如下:
```java
@BindDict(type = "POSITION_LEVEL", field = "level")
private String levelLabel;
```
使用@BindDict注解时需传两个参数分别是type和field
type表示关联的数据字典类型field表示关联字段。

View File

@ -0,0 +1 @@
# 查询条件DTO

View File

@ -1,30 +0,0 @@
# devtools使用文档
## 安装
### devtools是什么
### 安装
## 数据表管理
### 创建数据表
### 表数据结构
### 表关联
### 数据字典
### 智能补全
### 样例数据
## 代码生成与更新
### 基础代码生成
### 基础代码更新

View File

@ -0,0 +1,21 @@
# 代码生成与更新
> 数据设计完成后,需要提交相关更改。点开右上角「提交更新」下拉菜单,这里有三个按钮:仅更新数据库、更新数据库和代码、重新生成代码并更新数据库。
## 仅更新数据库
选择该操作,只是对**数据库表结构**及**样例数据**进行更新,不会涉及代码。
同时以SQL的形式保存修改内容到`update.sql`文件。
## 更新数据库和代码
选择该操作,除了更新**数据库表结构**及**样例数据**以外,同时会**更新**相关代码(`Entity`、`VO`、`Service及其实现类`、`Mapper及映射文件`、`Controller`)。
同时以SQL的形式保存修改内容到`update.sql`文件。
::: tip
非devtools自动生成的代码仍将保留。
:::
## 重新生成代码并更新数据库
选择该操作,除了更新**数据库表结构**及**样例数据**外,同时会**重新生成**相关代码(`Entity`、`VO`、`Service及其实现类`、`Mapper及映射文件`、`Controller`)。
同时以SQL的形式保存修改内容到`update.sql`文件。
::: warning
该功能是完全的重新生成代码非devtools自动生成的代码将被覆盖
:::

View File

@ -0,0 +1,20 @@
# 启动
## 启动项目
以SpringBoot项目在IntelliJ IDEA中的一种启动方式为例
在项目入口文件 `Application` 上点击右键,在弹出的菜单上点击 `RUN 'Application'`
当出现类似下面提示时,表示启动成功:
```
: Started Application in 14.223 seconds (JVM running for 16.693)
```
## 打开管理页面
在控制台(Console)上的启动日志中,找到如下日志:
```
: Diboot devtools v2.0.3 开始初始化 ...
: JDBC Connection [HikariProxyConnection@707108719 wrapping com.mysql.cj.jdbc.ConnectionImpl@7ccf6114] will not be managed by Spring
: devtools UI初始化完成URL: http://localhost:8080/example/diboot.html
: Diboot devtools 初始化完成。
```
其中的`URL`即是管理页面的链接,点击打开即可。

View File

@ -0,0 +1,87 @@
# 安装
## diboot-devtools是什么
> diboot-devtools是一个面向广大程序开发人员的开发助理有了她你可以摆脱重复性的Coding更专注于业务分析提高开发效率和代码质量。
* 安装简单只需在项目中引入devtools依赖添加相关配置信息后即可启动运行。
* 使用灵活,可按需启用更多功能。例如:是否开启引入 `Lombok`、`Swagger`等。
* 基于主流框架,并依赖全新优化内核[diboot-core](https://github.com/dibo-software/diboot-v2/tree/master/diboot-core),保证生成的代码更简洁,质量更高。
* 功能强大,更方便维护数据库表结构及关联关系,一键生成/更新代码。并以SQL方式保存更新内容。
* 基于Vue开发的前端页面性能更加高效、轻量化。
## 引入依赖
* Gradle项目
1. 添加仓库地址
在`build.gradle`的`repositories`配置项中添加仓库地址
```
repositories {
maven{ url 'http://maven.diboot.com/repository/devtools/'}
}
```
2. 引入依赖
```
compile ("com.diboot:diboot-devtools-spring-boot-starter:2.0.3")
```
* Maven项目
1. 添加仓库地址
在`pom.xml`的`repositories`标签中添加仓库地址
```
<repositories>
<repository>
<id>diboot-devtools</id>
<url>http://maven.diboot.com/repository/devtools/</url>
</repository>
</repositories>
```
2. 引入依赖
```
<dependency>
<groupId>com.diboot</groupId>
<artifactId>diboot-devtools-spring-boot-starter</artifactId>
<version>2.0.3</version>
</dependency>
```
## 添加配置信息
* 配置信息示例
```
# Spring 相关配置
spring.main.allow-bean-definition-overriding=true
# diboot-devtools 相关配置
diboot.devtools.codes-version=2.0.3
diboot.devtools.codes-copyright=dibo.ltd
diboot.devtools.codes-author=diboot
diboot.devtools.output-path-entity=diboot-example/src/main/java/com/diboot/example/entity/
diboot.devtools.output-path-vo=diboot-example/src/main/java/com/diboot/example/vo/
diboot.devtools.output-path-service=diboot-example/src/main/java/com/diboot/example/service/
diboot.devtools.output-path-mapper=diboot-example/src/main/java/com/diboot/example/mapper/
diboot.devtools.output-path-controller=diboot-example/src/main/java/com/diboot/example/controller/
diboot.devtools.output-path-sql=diboot-example/src/main/resources/
diboot.devtools.enable-swagger=false
diboot.devtools.enable-lombok=true
diboot.devtools.enable-diboot-shiro=false
```
* 配置信息说明
* spring.main.allow-bean-definition-overriding=true遇到同样名字的Bean时允许覆盖。
**以下diboot-devtools 相关配置均可根据实际情况填写**
* diboot.devtools.codes-version当前使用diboot-devtools的版本号。
* diboot.devtools.codes-copyright生成代码的版权归属显示在每个类或接口的注释中。
* diboot.devtools.codes-author生成代码的作者显示在每个类或接口的注释中。
* diboot.devtools.output-path-*:分别指向当前项目中`Entity`、`VO`、`Service及其实现类`、`Mapper及映射文件`、`Controller`、`SQL文件所在的路径`。
* diboot.devtools.enable-swagger是否引入`Swagger`注解若设置true请注意添加Swagger依赖。
* diboot.devtools.enable-lombok是否引入`Lombok`注解若设置true请注意添加Lombok依赖。
* diboot.devtools.enable-diboot-shiro是否引入`diboot-shiro`注解若设置true请注意添加diboot-shiro依赖。
## 初始化数据库
diboot-devtools在初次运行中会自动安装所需数据库表如果已经存在则不做操作。
* diboot_cloumn_extdiboot列定义扩展表
::: warning
目前支持MySQL数据库。
:::

View File

@ -0,0 +1,95 @@
# 数据表管理
* 项目开发过程中,通过数据库管理工具创建表时,可选择同时生成代码(`Entity`、`VO`、`Service及其实现类`、`Mapper及映射文件`、`Controller`)并保存相关SQL更新历史。
* 通过数据库管理工具修改表、字段及关联关系时也将同步地更改后端代码让您彻底摆脱繁琐的CRUD。
* 数据库管理工具中可以填写字段的样例数据devtools会自动插入到表中作为后续生成预览等的样例展示。
## 创建数据表
> 点击数据表的列表栏上方"**+**"按钮,打开创建表窗口。可以使用**引导建表**和**SQL建表**两种方式来创建数据库表。
1. 引导建表
* 数据库表名:建议使用英文小写命名,多个单词以下划线分隔。
* 业务对象名:该数据库表所代表的业务对象中文名称,建议名词,将会用在后续的生成代码中。
* ID策略可选用如下ID生成方式
* 数据库自增ID使用数据库的自增主键在系统中为Long类型ID值连续可被猜测建议在非敏感数据的表中使用。
* 程序生成有序ID程序自动生成有序的非连续Long型ID该ID为19位且不连续默认以该字段对列表排序建议在要求高效率索引的敏感数据的表中使用。 (注意后端返回前端时该类型的ID直接转换成前端JavaScript对象时存在失真问题如接收到json数据后前端可使用pkString代替pk/id的值以免造成结果错误。)
* 程序生成无序ID程序自动生成无序的32位无序字符串(UUID)来作为ID该ID无规律可循不可用作排序非必需情况不建议使用。
* 预置字段:
* id
* extdata扩展字段用来存放该表各类相关冗余数据的json字符串比如存放冗余的创建人姓名等。
* deleted是否已删除用来表明该条数据是否已删除该字段默认为1代表已删除0代表未删除。
* create_by创建人id。
* create_time创建时间数据库默认值为创建时的当前系统时间。
* update_time更新时间数据库默认值为更新时的当前系统时间。
2. SQL建表
在`文本框`内输入建表SQL语句点击`确定`按钮。
## 数据设计
> 在管理页面中,点击左侧**数据库表列表**中某个表,将会加载该表的所有字段到右侧面板中。
> 点击**搜索表**输入框,输入某个表名,系统将实时搜索该表,并显示在下方的**数据库表列表**中。
### 表的相关配置
1. 操作
从左到右,有三个按钮:
* 按住最左侧按钮,可以上下移动改行所在的位置。
* 中间+按钮,点击可添加一行。
* 最右侧-按钮,点击可删除该行。
2. 字段名
* 字段名是数据库中的字段名称建议使用英文小写命名以下划线分割name, teacher_id等。
* 字段名被转化后会自动添加到Entity类的属性中。转化过程中会将下划线去掉并将下划线后面的首字母大写遵循驼峰命名法。如name, teacherId等。
3. 字段标签
* 字段标签在数据库表中为该字段的comment值。
* 代码中字段标签将显示为该字段的名称,如:姓名,教师等。
4. 数据类型
* devtools提供了6种数据类型供选择分别是String, Long, Integer, Boolean, Date, Double。
* Entity类中使用这里所选的数据类型。数据库表中存放的Type将会根据所选择的数据类型自动进行匹配。
5. 长度
* 长度表示该字段在数据库表中设置的长度0表示不设置长度。
* Entity类中的属性都会使用这里的设置进行长度校验。
6. 扩展配置
主要提供该字段的某些可供选择的特性,说明如下:
* unsigned 勾选该配置,表示这是个无符号数字,同时将该特性设置到数据库表中。
* char 勾选该配置在数据库表中会将该字段的type设置为char。
* LIKE 勾选该配置,在生成映射文件(mapper.xml)时同时也生成含有该字段LIKE的条件查询语句。
* 对于Date类型的字段时间格式有两种供选择yyyy-MM-dd HH:mm:ss和yyyy-MM-dd
7. 非空
* 勾选了该选项的复选框,表示该字段不能为空,同时在数据库表中设置该字段非空。
* Entity类中的属性都会使用这里的设置进行非空校验。
8. 默认值
* 可以根据字段的配置,填写或选择默认值。
* 该默认值将会设置到数据库表字段的默认值属性中。
* 对于非空字段,尤其要注意,是否应该设置默认值。
9. 表单类型
devtools提供了常用的表单类型`选择框`、`单行输入`、`多行输入`、`富文本编辑`、`图片上传`、`文件上传`、`忽略不显示`。
* 表示该字段在表单页面中,以哪种方式进行数据输入,生成的代码中将包含该输入方式的相关表单元素。
* 当一个字段选择数据类型或者关联方式后devtools会将推荐的表单类型设置到这个字段。
10. 关联
设置该字段关联关系的方式,可选择`无`、`数据表`、`数据字典`。
* 选择关联`数据表`后,将会弹出可供选择的数据库表。依次是`哪个表`(关联表名)、`哪个字段`(关联表中与该字段对应的字段)、`显示的字段`(显示关联表信息的字段)。
* 选择关联`数据字典`后,将会弹出可供选择的数据字典,选择一个元数据关联到该字段即可。
11. 样例数据
填写样例数据,方便后续的开发调试。
::: warning
注:非空字段的样例数据不能为空,并且须严格按照字段的数据类型填写。
:::
### 智能补全
## 关系图
> 显示数据表之间的关联关系,方便开发人员更清晰的了解项目的数据结构。