Merge pull request #35 from dibo-software/develop

Develop
This commit is contained in:
Mazc 2019-11-04 17:38:47 +08:00 committed by GitHub
commit a7f5c94abf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 253 additions and 185 deletions

View File

@ -4,17 +4,15 @@
</a>
</p>
# diboot-v2
diboot 2.0版本项目,实现: diboot-core全新内核 + diboot-shiro-*权限控制 + diboot-components-*基础组件 + diboot-devtools代码生成平台。
# diboot-v2 (重复的工作自动做)
diboot 2.0版本项目,实现: diboot-core全新内核 + diboot-devtools代码生成平台 + 基础功能组件
> diboot的设计目标面向开发人员的低代码开发平台提高开发效率和质量提高代码可维护性。
## 技术交流QQ群: 731690096
> 复杂的事情简单化,简单的事情标准化,标准的事情流程化,流程的事情自动化
> 把重复有规律的事情自动化
**2.0版devtools预计将于10月份发布敬请期待。**
## 一、 diboot-core: 精简优化内核
全新精简内核,主要实现<font color="red">单表CRUD无SQL 和 多表关联查询绑定的无SQL</font>实现方案,并提供查询绑定等常用开发场景的简单封装。
@ -37,19 +35,15 @@ diboot 2.0版本项目,实现: diboot-core全新内核 + diboot-shiro-*权限
> .
## 二、 diboot-shiro*: 基于RBAC+Shiro的权限认证模块
RBAC的角色权限+基于Shiro的细粒度权限控制
## 二、 diboot-devtools 代码生成工具
#### 1. 支持常用的五大数据库MySQLMariaDBORACLESQLServer, PostgreSQL
#### 2. 使用简单只需在项目中引入devtools依赖添加相关配置信息后即可启动运行。
#### 3. 基于主流框架SpringBoot + Mybatis-Plus打造全新优化内核保证生成的代码更简洁质量更高。
#### 4. 功能强大,实现数据结构变更与代码联动同步,更方便维护数据库表结构及关联关系,一键生成/更新代码。
#### 5. 通过devtools维护数据结构标准化了数据结构定义同时数据结构变动SQL会被自动记录便于同步更新生产等环境数据库。
#### 6. 使用灵活,可按需启用更多功能。例如:是否开启引入 `Lombok`、`Swagger`等。
### diboot-shiro 权限基础模块
### diboot-shiro-wx-* 微信服务号/企业号相关权限
具体请查看: [diboot-shiro README](https://github.com/dibo-software/diboot-v2/tree/master/diboot-shiro "注解自动绑定多表关联").
## 三、 diboot-devtools 代码生成工具
> 比 [diboot devtools 1.x 版本](https://www.diboot.com/) 更通用更强大的代码生成工具 ...
> [我要试试](https://github.com/dibo-software/diboot-v2/blob/master/diboot-docs/guide/diboot-devtools/%E4%BB%8B%E7%BB%8D.md)
...

View File

@ -48,18 +48,18 @@ private List<Role> roleList;
### 1. 引入依赖
Gradle:
~~~gradle
compile("com.diboot:diboot-core-spring-boot-starter:2.0.2")
compile("com.diboot:diboot-core-spring-boot-starter:2.0.3")
~~~
或Maven
~~~xml
<dependency>
<groupId>com.diboot</groupId>
<artifactId>diboot-core-spring-boot-starter</artifactId>
<version>2.0.2</version>
<version>2.0.3</version>
</dependency>
~~~
> 注: @BindDict注解需要依赖dictionary表可配置参数 diboot.core.init-sql=true 初次启动时starter会自动安装 init-{db}.sql
如不支持自动安装的数据库,需手动执行 diboot-core-*.jar/META-INF/sql/init-{db}.sql 。
> 注: @BindDict注解需要依赖dictionary表初次启动时starter会自动创建该表
### 2. 定义你的Service继承diboot的BaseService或Mybatis-plus的ISerivice及Mapper
### 3. 使用注解绑定:

2
diboot-docs/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# Ignore Gradle project-specific cache directory
node_modules/

View File

@ -42,8 +42,8 @@
<ul>
<li>电话0512-62988949</li>
<li>Q Q281550336</li>
<li>QQ群731690096</li>
<li>邮箱service@dibo.ltd</li>
<li>技术交流QQ群731690096</li>
</ul>
</div>
<div class="footer-item"></div>

View File

@ -2,7 +2,7 @@
## Service类
> 对于一个自定义的entity您可以像以往的习惯一样开发service相关代码如果需要使用diboot-core中封装好的一些接口需要继承diboot-core中的BaSeService类并传入对应的实体类
> 对于一个自定义的entity您可以像以往的习惯一样开发service相关代码但我们推荐您继承diboot-core中封装好的BaseService接口及BaseServiceImpl实现
```java
package com.example.demo.service;

View File

@ -2,6 +2,7 @@
> 当两张表数据之间有直接的依赖关系时如主外键关联关系即可使用单表关联。在通过diboot-core的封装后
单表关联时开发者不再需要写大量java代码和SQL查询只要使用相关注解即可快速绑定它们之间的关联关系。
同时关联的实现是拆解关联查询为单表查询,可以更加高效利用数据库缓存和索引,提高查询效率。
## @BindField 注解
@ -17,7 +18,7 @@ entity表示关联实体field表示关联表字段名condition表示关联
该注解在单表关联时使用,用来将数据表中的某条数据映射到对应实体,使用方法如下:
```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")
@BindEntity(entity = Department.class, condition = "this.id = employee_position_department.employee_id AND employee_position_department.department_id = id AND employee_position_department.deleted = 0")
private Department department;
```
使用@BindEntity注解时需传两个参数分别是entity和condition

View File

@ -2,12 +2,13 @@
> 当两张表数据之间是通过第三张表来产生依赖关系时即可使用多表关联。在通过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")
@BindEntityList(entity = Department.class, condition = "this.id = position_department.position_id AND position_department.department_id = id AND position_department.deleted = 0")
private List<Department> departmentList;
```
使用@BindEntityList注解时需传两个参数分别是entity和condition

View File

@ -2,18 +2,16 @@
## diboot-core是什么
> diboot-core是diboot2.0版本的核心基础框架基于SpringMybatis-plus等知名开源项目。
> diboot-core 是 diboot 2.0版本的核心基础框架基于Spring Boot、Mybatis-plus封装实现基础代码的简化及高效。
> 使用diboot-core可以更加简单快捷地创建web后端应用您之前的诸多代码将被极大简化系统也更容易维护。同时搭档[devtools](https://github.com/dibo-software/diboot-v2-example/tree/master/diboot-devtools-example),你需要写的仅有业务逻辑代码。
* 使用diboot-core可以更加简单且方便地创建您的web后端应用您之前的诸多工作也将得到极大的放松我们为您准备了常用的各种工具类函数
* 我们为你配置好了mybatis-plus方便你进行单表CRUD无SQL的探索
* 我们也为您提供了多表关联查询的无SQL实现方案这里的多表不只是两张表之间的关联而且还可以处理三张表之间的关联只需要一个注解你就可以快速处理完以往要好些代码才能处理好的事情
* 我们为您提供了数据字典的管理与接口;
* 我们在diboot-core中还提供了其他常用开发场景的简单封装。
* 集成了[mybatis-plus](https://mp.baomidou.com/)以实现单表CRUD无SQL。
* 扩展实现了多表关联查询的无SQL方案只需要一个简单注解@Bind*,就可以实现关联对象(含字段、实体、实体集合等)的数据绑定,且实现方案是将关联查询拆解为单表查询,保障最佳性能。
* 支持@BindDict注解简单绑定数据字典实现value-name转换。
* 实现了Entity/DTO自动转换为QueryWrapper@BindQuery注解绑定字段参数对应的查询条件无需再手动构建QueryWrapper查询条件
* 另外还提供其他常用开发场景的最佳实践封装。
* 我们还封装了[diboot-core-starter](https://github.com/dibo-software/diboot-v2-example/tree/master/diboot-core-example)简化diboot-core的初始化配置自动配置、自动创建数据字典表
## 依赖引入
## diboot-core使用
可以从**Maven中央仓库**搜索[diboot-core](https://mvnrepository.com/artifact/com.diboot/diboot-core),刷新项目即可。
## 初始化数据库
diboot-core在初次运行中会自动安装所需数据库表如果已经存在则不做操作。
请参考 [diboot-core README](https://github.com/dibo-software/diboot-v2/tree/master/diboot-core)

View File

@ -1,12 +1,12 @@
# 实体Entity
> diboot-core中的实体与1.x版本的model一样我们为了命名更加规范这里改用entity,下文简称实体。
> diboot-core中的实体Entity是与数据库表对应的映射对象,下文简称实体。
所有实体统一存放在entity包名下命名一般将表名转换为驼峰命名法命名再首字母大写即可,比如**sys_user**的实体名为**SysUser。**
所有实体统一存放在entity包名下命名采用将表名转换为首字母大写的驼峰命名法命名,比如**sys_user**的实体名为**SysUser。**
## BaseEntity
> BaseEntity是diboot-core提供的基础实体类提供了我们默认数据表结构的默认字段比如id、deleted、create_time等默认的方法如toMap、toString方法等。
> BaseEntity是diboot-core提供的基础实体类提供了我们默认数据表结构的默认字段比如id、is_deleted、create_time等默认的方法如toMap等。
## BaseExtEntity

View File

@ -214,7 +214,7 @@ Object obj = ContextHelper.getBean(beanId);
//方法定义
public static Object getBean(Class type){...}
//方法调用示例
Object obj = ContextHelper.getBean(Organization.class);
OrganizationService service = ContextHelper.getBean(OrganizationService.class);
```
* getBeans 方法
@ -222,10 +222,7 @@ Object obj = ContextHelper.getBean(Organization.class);
//方法定义
public static <T> List<T> getBeans(Class<T> type){...}
//方法调用示例
List<Organization> orgList = ContextHelper.getBeans(Organization.class);
System.out.println(orgList.get(0).getName());
//执行结果
===> xxx有限公司
List<OrganizationService> orgServiceList = ContextHelper.getBeans(OrganizationService.class);
```
该方法用来获取指定类型的全部实例入参为类类型type
@ -233,8 +230,7 @@ System.out.println(orgList.get(0).getName());
```java
//方法定义
public static List<Object> getBeansByAnnotation(Class<? extends Annotation> annotationType){...}
//方法调用示例
List<Object> objList = ContextHelper.getBeansByAnnotation(Organization.class);
// 同Spring 的 getBeansWithAnnotation
```
该方法用来根据注解获取beans入参为类类型annotationType

View File

@ -1,7 +1,7 @@
# 数据字典关联
# 数据字典关联绑定
> 当表中的字段为数据字典类型的值时可使用数据字典关联来绑定表字段与数据字典的关联关系。在通过diboot-core的封装后
数据字典关联时开发者不再需要写大量java代码和SQL查询,只要使用相关注解即可快速绑定它们之间的关联关系
数据字典关联时开发者不再需要写大量java代码和SQL关联查询只要使用相关注解即可快速转换值value为标签/名称name
## @BindDict 注解

View File

@ -22,7 +22,7 @@ public class DemoVO extends Demo {
```
:::warning
注:@BindDict注解需要依赖dictionary表可配置参数 diboot.core.init-sql=true 初次启动时starter会自动安装 init-{db}.sql。 如不支持自动安装的数据库,需手动执行 diboot-core-*.jar/META-INF/sql/init-{db}.sql
注:@BindDict注解需要依赖dictionary表初次启动时starter会自动安装。
:::
## 处理方式

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

View File

@ -1,30 +1,37 @@
# 介绍
## diboot-devtools是什么
## diboot-devtools是什么
> diboot-devtools是一个面向广大程序开发人员的开发助理有了她你可以摆脱重复性的Coding更专注于业务分析提高开发效率和代码质量。
> diboot-devtools是一个面向Java开发人员的开发助理有了她你可以摆脱重复性的Coding更专注于业务分析提高开发效率和代码质量。
> **diboot-devtools - 将重复有规律的事情自动化**
## 我们的优势
* 支持常用的五大数据库MySQLMariaDBORACLESQLServer, PostgreSQL
* 安装简单只需在项目中引入devtools依赖添加相关配置信息后即可启动运行。
* 使用简单只需在项目中引入devtools依赖添加相关配置信息后即可启动运行。
* 基于主流框架SpringBoot + Mybatis-Plus打造全新优化内核[diboot-core](https://github.com/dibo-software/diboot-v2/tree/master/diboot-core),保证生成的代码更简洁,质量更高。
* 功能强大,实现数据结构变更与代码联动同步,更方便维护数据库表结构及关联关系,一键生成/更新代码。
* 通过devtools维护数据结构标准化了数据结构定义同时数据结构变动SQL会被自动记录便于同步更新生产等环境数据库。
* 使用灵活,可按需启用更多功能。例如:是否开启引入 `Lombok`、`Swagger`等。
* 基于主流框架,并依赖全新优化内核[diboot-core](https://github.com/dibo-software/diboot-v2/tree/master/diboot-core),保证生成的代码更简洁,质量更高。
* 功能强大,更方便维护数据库表结构及关联关系,一键生成/更新代码。并以SQL方式保存更新内容便于维护项目、或者发布到多个不同数据库使用。
* 为SpringBoot量身打造微服务、单体应用等一网打尽。
* ORM框架使用Mybatis及更加方便的Mybatis-Plus应用广泛且强大。
* 适用场景广紧随SpringBoot步伐迭代微服务、单体应用等开发场景通用。
## 我们能帮您
### 解决软件工程的一些问题
1. 将人们从繁琐的较为机械的工作中解放出来,将精力集中到更多需要人的创造性的工作上,促使人们更多地关注需求,做对的事。
2. 可以让人们不接触代码地创建出一些通过界面设计出的业务功能,让人们可以验证某些想法,更为快捷且低成本的试错。
3. 让开发人员免除基础的繁琐工作,提高开发效率,加快迭代速度,快人一步当然胜人一筹。
### 解决数据结构设计的一些问题
1. 传统的数据结构设计一般会借助一些软件来进行数据库设计这样可以确保数据库结构与需求关联更加紧密并且可视化但这也造成了一些问题比如数据库与代码是脱钩的只能依靠程序员通过编码去将数据库与代码给串起来但通过人力的形式在这之间操作效率是很低的。比如一个需求需要改一个数据库字段也需要开发人员在代码层面做对应的更改这其实也是一个容易出错的过程。但我们的diboot轻代码平台提供了基础的表的管理与设计功能不但可以通过该功能设计表结构以及表与表之间、表与数据字典之间的关联关系而且我们也内置了展示关联关系的E-R图模型展示让您对数据模型也一目了然。在这整个过程中这些数据结构也并不是独立存在的表结构字段、关联关系都已经在devtools中与系统做了映射更改数据结构后也能重新生成相对应的代码如果您已经更改了之前生成的代码也没关系也可以选择更新代码那么对数据结构的更改就直接反馈到代码中了而这一切只需要您点下提交按钮即可。
2. 由此可见我们diboot对于数据结构设计带来的改变是颠覆性的我们在devtools中提供了数据结构设计功能并且让数据模型可视化方便了数据结构的设计数据结构与代码结构是自动对应起来的中间少了人力的工作提高了效率减少了成本并且可靠性也极大地提升了这在系统上线之后的维护阶段也是意义巨大的。
### 解决软件开发过程中的重复性问题
1. 将开发人员从繁琐的机械式的工作中解放出来,将精力集中到更多需要业务实现的工作上,促使人们更多地关注需求,做对的事。
2. 让开发人员提高开发效率和质量,使软件系统的代码标准统一,降低维护成本。
### 解决数据结构与代码联动同步问题
1. 传统的开发模式是先通过客户端修改数据结构然后再回到代码新建实体和CRUD、调整字段、改SQL等过程繁琐易出错。
而diboot-devtools提供了增强的数据结构维护功能除了基础的表结构维护功能外还支持配置表关联、数据字典关联同时可以通过查看关联关系的E-R图对数据模型一目了然。
通过devtools所做的数据结构及关联的更改都能同步生成或更新相对应的Java代码。数据结构与代码同步的自动化您只需要喝着咖啡点下提交按钮即可。
2. 通过devtools维护数据结构标准化了数据结构定义同时数据结构变动SQL会被自动记录便于同步更新非开发环境数据库避免生产环境漏执行SQL的问题。
3. 可以说devtools对于数据结构设计带来的改变是全方位的我们在devtools中提供的数据结构设计和数据模型可视化以及与代码的联动更新都在推动一个目标标准化、自动化、高质量、高效率。
### 解决软件开发效率的问题
1. 我们的core项目内置了一些常用工具以及一些底层模块基于这些工具和底层模块可以更快地开始开发工作对于简化一些业务流程的开发是很有帮助的。
2. 我们提供了一些常用的业务模块,开箱即用。
3. devtools提供了数据结构设计并生成基础代码以及接口代码在数据结构更改后也能智能地更改相关代码来适配这种数据结构更改。
### 解决后期维护过程的一些麻烦
1. 我们支持从已经更改过的代码来自动地更改字段等功能也具有更加简洁的底层框架diboot-core,以及为spring boot打造的diboot-core-starter。
1. diboot-core项目极大精简了CRUD和简单关联场景的实现代码并内置了一些常用工具以及一些底层模块基于这些工具和底层模块可以更快地开始开发工作。
2. devtools实现了数据结构与代码联动在数据结构更改后也能智能地更新相关代码。
3. devtools还会逐步提供一些常用的功能模块开箱即用。
### 降低后期维护成本
1. 上面的这波操作,带来的另外一个好处是:需要开发人员写的只有真正的业务逻辑代码,代码的可维护性提高。

View File

@ -17,4 +17,16 @@
: devtools UI初始化完成URL: http://localhost:8080/example/diboot.html
: Diboot devtools 初始化完成。
```
其中的`URL`即是管理页面的链接,点击打开即可。
其中的`URL`即是管理页面的链接点击即可打开Devtools操作界面。
## 注意
Devtools是用于开发过程的助手工具切勿发布至其他环境。对于非开发需要取消devtools的依赖
方式一(推荐):
非开发环境取消依赖 diboot-devtools-spring-boot-starter改为只依赖 diboot-core-spring-boot-starter
方式二:
在application.properties中增加配置禁用devtools
```
diboot.devtools.disabled=true
```

View File

@ -1,59 +1,10 @@
# 安装
## diboot-devtools是什么
> diboot-devtools是一个面向广大程序开发人员的开发助理有了她你可以摆脱重复性的Coding更专注于业务分析提高开发效率和代码质量。
## 我们的优势
* 支持常用的五大数据库MySQLMariaDBORACLESQLServer, PostgreSQL
* 安装简单只需在项目中引入devtools依赖添加相关配置信息后即可启动运行。
* 使用灵活,可按需启用更多功能。例如:是否开启引入 `Lombok`、`Swagger`等。
* 基于主流框架,并依赖全新优化内核[diboot-core](https://github.com/dibo-software/diboot-v2/tree/master/diboot-core),保证生成的代码更简洁,质量更高。
* 功能强大,更方便维护数据库表结构及关联关系,一键生成/更新代码。并以SQL方式保存更新内容便于维护项目、或者发布到多个不同数据库使用。
## 我们能帮您
### 解决软件工程的一些问题:
1. 将人们从繁琐的较为机械的工作中解放出来,将精力集中到更多需要人的创造性的工作上,促使人们更多地关注需求,做对的事。
2. 可以让人们不接触代码地创建出一些通过界面设计出的业务功能,让人们可以验证某些想法,更为快捷且低成本的试错。
3. 让开发人员免除基础的繁琐工作,提高开发效率,加快迭代速度,快人一步当然胜人一筹。
### 解决数据结构设计的一些问题
1. 传统的数据结构设计一般会借助一些软件来进行数据库设计这样可以确保数据库结构与需求关联更加紧密并且可视化但这也造成了一些问题比如数据库与代码是脱钩的只能依靠程序员通过编码去将数据库与代码给串起来但通过人力的形式在这之间操作效率是很低的比如一个需求需要改一个数据库字段也需要开发人员在代码层面做对应的更改这其实也是一个容易出错的过程。但我们的diboot轻代码平台提供了基础的表的管理与设计功能不但可以通过该功能设计表结构以及表与表之间、表与数据字典之间的关联关系而且我们也内置了展示关联关系的E-R图模型展示让您对数据模型也一目了然。在这整个过程中这些数据结构也并不是独立存在的表结构字段、关联关系都已经在devtools中与系统做了映射更改数据结构后也能重新生成相对应的代码如果您已经更改了之前生成的代码也没关系也可以选择更新代码那么对数据结构的更改就直接反馈到代码中了而这一切只需要您点下提交按钮即可。
2. 由此可见我们diboot对于数据结构设计带来的改变是颠覆性的我们在devtools中提供了数据结构设计功能并且让数据模型可视化方便了数据结构的设计数据结构与代码结构是自动对应起来的中间少了人力的工作提高了效率减少了成本并且可靠性也极大地提升了这在系统上线之后的维护阶段也是意义巨大的。
### 解决软件开发效率的问题
1. 我们的core项目内置了一些常用工具以及一些底层模块基于这些工具和底层模块可以更快地开始开发工作对于简化一些业务流程的开发是很有帮助的。
2. 我们提供了一些常用的业务模块,开箱即用。
3. devtools提供了数据结构设计并生成基础代码以及接口代码在数据结构更改后也能智能地更改相关代码来适配这种数据结构更改。
### 解决后期维护过程的一些麻烦。
1. 我们支持从已经更改过的代码来自动地更改字段等功能也具有更加简洁的底层框架diboot-core,以及为spring boot打造的diboot-core-starter。
## 开始使用
### 引入依赖
* Gradle项目
1. 添加仓库地址
在`build.gradle`的`repositories`配置项中添加仓库地址
```
repositories {
maven{ url 'http://maven.diboot.com/repository/devtools/'}
}
```
2. 引入依赖
# 安装&使用
## 引入依赖
* Gradle项目引入依赖
```
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. 引入依赖
* Maven项目引入依赖
```
<dependency>
<groupId>com.diboot</groupId>
@ -62,39 +13,27 @@ compile ("com.diboot:diboot-devtools-spring-boot-starter:2.0.3")
</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.codes-version=1.0
diboot.devtools.codes-copyright=MyCompany
diboot.devtools.codes-author=MyName
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
#diboot.devtools.enable-swagger=false
```
* 配置信息说明
* 配置信息说明见[开始使用](开始使用.md)
* 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在初次运行中会自动安装所需数据库表如果已经存在则不做操作。

View File

@ -1,30 +1,10 @@
# 开始使用
## 引入依赖
* Gradle项目
1. 添加仓库地址
在`build.gradle`的`repositories`配置项中添加仓库地址
```
repositories {
maven{ url 'http://maven.diboot.com/repository/devtools/'}
}
```
2. 引入依赖
* Gradle项目引入依赖
```
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. 引入依赖
* Maven项目引入依赖
```
<dependency>
<groupId>com.diboot</groupId>
@ -40,18 +20,17 @@ compile ("com.diboot:diboot-devtools-spring-boot-starter:2.0.3")
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.codes-version=1.0
diboot.devtools.codes-copyright=MyCompany
diboot.devtools.codes-author=MyName
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
#diboot.devtools.enable-swagger=false
```
* 配置信息说明
@ -63,9 +42,8 @@ diboot.devtools.enable-diboot-shiro=false
* 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.enable-swagger是否引入`Swagger`注解若设置true请注意添加Swagger依赖。
:::warning
如果您使用的是**PostgreSQL数据库**那么需要额外添加两行配置以此来适配boolean类型字段所对应的数据库的boolean类型需添加的配置如下

View File

@ -1,11 +1,15 @@
# 数据表管理
* 项目开发过程中,通过数据库管理工具创建表时,可选择同时生成代码(`Entity`、`VO`、`Service及其实现类`、`Mapper及映射文件`、`Controller`)并保存相关SQL更新历史。
* 通过数据库管理工具修改表、字段及关联关系时也将同步地更改后端代码让您彻底摆脱繁琐的CRUD。
* 通过数据库管理工具修改表、字段及关联关系时也将同步地更改后端代码让您彻底摆脱繁琐的CRUD和简单关联查询
* 数据库管理工具中可以填写字段的样例数据devtools会自动插入到表中作为后续生成预览等的样例展示。
## 创建数据表
> 点击数据表的列表栏上方"**+**"按钮,打开创建表窗口。可以使用**引导建表**和**SQL建表**两种方式来创建数据库表。
![添加数据表按钮](./images/添加数据表按钮.png)
1. 引导建表
* 数据库表名:建议使用英文小写命名,多个单词以下划线分隔。
@ -17,7 +21,7 @@
* 预置字段:
* id
* extdata扩展字段用来存放该表各类相关冗余数据的json字符串比如存放冗余的创建人姓名等。
* deleted是否已删除用来表明该条数据是否已删除该字段默认为1代表已删除0代表未删除。
* is_deleted逻辑删除标记字段用来表明该条数据是否已删除默认为0代表未删除1代表已删除。
* create_by创建人id。
* create_time创建时间数据库默认值为创建时的当前系统时间。
* update_time更新时间数据库默认值为更新时的当前系统时间。

View File

@ -0,0 +1,51 @@
package com.diboot.shiro.dto;
import com.diboot.shiro.entity.SysUser;
import com.diboot.shiro.enums.IUserType;
import lombok.Getter;
import lombok.Setter;
/**
* 账号修改类
* @author : wee
* @version : v2.0
* @Date 2019-10-23 13:57
*/
@Getter
@Setter
public class AccountDTO {
/**
* 账号id
* {@link SysUser#getId()}
*/
private Long accountId;
/**
* 账号
*/
private String username;
/**
* 旧密码
*/
private String oldPassword;
/**
* 新密码
*/
private String password;
/**
* 新重复密码
*/
private String rePassword;
/**
* 用户类型
*/
private String userType;
}

View File

@ -84,4 +84,10 @@ public class SysUser extends BaseEntity {
@TableField(exist = false)
private Boolean admin;
/**
* 默认需要创建角色如果不需要设置为false即可
*/
@TableField(exist = false)
private Boolean createRole = true;
}

View File

@ -2,12 +2,14 @@ package com.diboot.shiro.jwt;
import com.diboot.core.entity.BaseEntity;
import com.diboot.core.util.V;
import com.diboot.core.vo.Status;
import com.diboot.shiro.entity.Permission;
import com.diboot.shiro.entity.SysUser;
import com.diboot.shiro.service.AuthWayService;
import com.diboot.shiro.service.RoleService;
import com.diboot.shiro.service.UserRoleService;
import com.diboot.shiro.vo.RoleVO;
import org.apache.shiro.ShiroException;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
@ -55,7 +57,6 @@ public class BaseJwtRealm extends AuthorizingRealm {
BaseJwtAuthenticationToken jwtToken = (BaseJwtAuthenticationToken) token;
String account = (String) jwtToken.getPrincipal();
if (V.isEmpty(account)){
throw new AuthenticationException("无效的token");
}
@ -63,12 +64,15 @@ public class BaseJwtRealm extends AuthorizingRealm {
// 获取认证方式
AuthWayService authWayService = jwtToken.getAuthWayService();
BaseEntity user = authWayService.getUser();
SysUser user = authWayService.getUser();
// 登录失败则抛出相关异常
if (user == null){
throw new AuthenticationException("用户不存在");
}
if (!jwtToken.getStatusList().contains(user.getStatus())) {
throw new AuthenticationException("用户暂时不可用!");
}
if (authWayService.requirePassword() && !authWayService.isPasswordMatch()){
throw new AuthenticationException("用户名或密码错误");

View File

@ -1,6 +1,7 @@
package com.diboot.shiro.service;
import com.diboot.core.service.BaseService;
import com.diboot.shiro.dto.AccountDTO;
import com.diboot.shiro.entity.SysUser;
import com.diboot.shiro.entity.TokenAccountInfo;
import com.diboot.shiro.enums.IUserType;
@ -59,6 +60,13 @@ public interface SysUserService extends BaseService<SysUser> {
* @throws Exception
*/
SysUser getLoginAccountInfo(TokenAccountInfo account) throws Exception;
/**
* 通过账户和类别获取用户
* @param account
* @return
* @throws Exception
*/
SysUser getByAccountInfo(TokenAccountInfo account) throws Exception;
/**
* 根据用户信息的id 用户类型获取对应的账户 账户关联的信息
@ -76,4 +84,18 @@ public interface SysUserService extends BaseService<SysUser> {
*/
SysUser getSysUser(Long userId, IUserType iUserType);
/**
* 修改密码
* @param accountDTO
* @return
*/
boolean changePassword(AccountDTO accountDTO);
/**
* 修改账号
* @param accountDTO
* @return
*/
boolean changeAccount(AccountDTO accountDTO);
}

View File

@ -1,13 +1,17 @@
package com.diboot.shiro.service.impl;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.additional.update.impl.UpdateChainWrapper;
import com.diboot.core.service.impl.BaseServiceImpl;
import com.diboot.core.util.BeanUtils;
import com.diboot.core.util.S;
import com.diboot.core.util.V;
import com.diboot.core.vo.Status;
import com.diboot.shiro.authz.config.SystemParamConfig;
import com.diboot.shiro.dto.AccountDTO;
import com.diboot.shiro.entity.*;
import com.diboot.shiro.enums.IUserType;
import com.diboot.shiro.exception.ShiroCustomException;
@ -17,6 +21,7 @@ import com.diboot.shiro.service.RoleService;
import com.diboot.shiro.service.SysUserService;
import com.diboot.shiro.service.UserRoleService;
import com.diboot.shiro.util.AuthHelper;
import com.diboot.shiro.util.JwtHelper;
import com.diboot.shiro.vo.RoleVO;
import com.diboot.shiro.vo.SysUserVO;
import lombok.extern.slf4j.Slf4j;
@ -83,10 +88,13 @@ public class SysUserServiceImpl extends BaseServiceImpl<SysUserMapper, SysUser>
if(!success){
throw new ShiroCustomException(Status.FAIL_VALIDATION, "创建用户失败!");
}
//构建 + 创建账户-角色关系
success = this.createUserRole(sysUser);
if (!success) {
throw new ShiroCustomException(Status.FAIL_VALIDATION, "创建用户失败!");
//设置是否创建角色
if (sysUser.getCreateRole()) {
//构建 + 创建账户-角色关系
success = this.createUserRole(sysUser);
if (!success) {
throw new ShiroCustomException(Status.FAIL_VALIDATION, "创建用户失败!");
}
}
return true;
}
@ -163,12 +171,20 @@ public class SysUserServiceImpl extends BaseServiceImpl<SysUserMapper, SysUser>
//构建关系
Map<Long, SysUser> sysUserMap = buildSysUserAndRoleAndPermissionRelation(sysUserList);
SysUser sysUser = sysUserMap.get(sysUserList.get(0).getUserId());
if (V.isEmpty(sysUser.getRoleVOList())) {
throw new ShiroCustomException(Status.FAIL_OPERATION, "未配置角色,获取数据失败");
}
// if (V.isEmpty(sysUser.getRoleVOList())) {
// throw new ShiroCustomException(Status.FAIL_OPERATION, "未配置角色,获取数据失败");
// }
return sysUser;
}
@Override
public SysUser getByAccountInfo(TokenAccountInfo account) throws Exception {
LambdaQueryWrapper<SysUser> sysUserLambdaQueryWrapper = Wrappers.<SysUser>lambdaQuery()
.eq(SysUser::getUsername, account.getAccount())
.eq(SysUser::getUserType, account.getUserType());
return getOne(sysUserLambdaQueryWrapper);
}
@Override
public Map<Long, SysUser> getSysUserListWithRolesAndPermissionsByUserIdList(List<Long> userIdList, IUserType iUserType) {
//1获取账户信息
@ -201,6 +217,39 @@ public class SysUserServiceImpl extends BaseServiceImpl<SysUserMapper, SysUser>
return null;
}
@Override
public boolean changePassword(AccountDTO accountDTO) {
SysUser dbSysUser = getById(accountDTO.getAccountId());
if (V.isEmpty(dbSysUser)) {
throw new ShiroCustomException(Status.FAIL_OPERATION, "用户不存在,修改密码失败");
}
if (V.isEmpty(accountDTO.getPassword()) || V.isEmpty(accountDTO.getRePassword()) || V.isEmpty(accountDTO.getOldPassword())) {
throw new ShiroCustomException(Status.FAIL_OPERATION, "新旧密码不能为空");
}
if (!accountDTO.getPassword().equals(accountDTO.getRePassword())) {
throw new ShiroCustomException(Status.FAIL_OPERATION, "两次密码不一致");
}
if (!S.equals(AuthHelper.encryptMD5(accountDTO.getOldPassword(), dbSysUser.getSalt(), true), dbSysUser.getPassword())){
throw new ShiroCustomException(Status.FAIL_OPERATION, "原密码错误");
}
//生成新的加密盐
String newSalt = AuthHelper.createSalt();
LambdaUpdateWrapper<SysUser> updateWrapper = Wrappers.<SysUser>lambdaUpdate()
.set(true, SysUser::getPassword, AuthHelper.encryptMD5(accountDTO.getPassword(), newSalt, true))
.set(true, SysUser::getSalt, newSalt)
.eq(SysUser::getId, accountDTO.getAccountId());
return update(updateWrapper);
}
@Override
public boolean changeAccount(AccountDTO accountDTO) {
LambdaUpdateWrapper<SysUser> updateWrapper = Wrappers.<SysUser>lambdaUpdate()
.set(true, SysUser::getUsername, accountDTO.getUsername())
.eq(SysUser::getId, accountDTO.getAccountId());
return update(updateWrapper);
}
/**
* 组装账户 1-n 角色 1-n 权限关系
* @param sysUserList

View File

@ -50,8 +50,7 @@ public class UsernamePasswordAuthWayServiceImpl implements AuthWayService {
logger.debug("【获取用户】==>当前登陆用户类型 - {}- 账号{}", token.getIUserType().getType(), token.getAccount());
LambdaQueryWrapper<SysUser> query = Wrappers.<SysUser>lambdaQuery()
.eq(SysUser::getUsername, token.getAccount())
.eq(SysUser::getUserType, token.getIUserType().getType())
.in(SysUser::getStatus, token.getStatusList());
.eq(SysUser::getUserType, token.getIUserType().getType());
List<SysUser> userList = sysUserService.getEntityList(query);
if (V.isEmpty(userList)){
return null;
@ -66,12 +65,17 @@ public class UsernamePasswordAuthWayServiceImpl implements AuthWayService {
@Override
public boolean isPasswordMatch() {
if (V.isEmpty(token.getIUserType())) {
logger.debug("用户名密码登陆,用户类型不能为空");
return false;
}
String password = token.getPassword();
// 构建查询条件
QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda()
.eq(SysUser::getUsername, token.getAccount());
.eq(SysUser::getUsername, token.getAccount())
.eq(SysUser::getUserType, token.getIUserType().getType());
// 获取单条用户记录
List<SysUser> userList = sysUserService.getEntityList(queryWrapper);