springboot 快速开发的定制补充
增强 SpringBoot 快速开发工具
项目地址:https://gitee.com/sanri/web-ui
优点:这是一个 web 通用配置的组件,即插即用,可用于新项目或私活。是对 SpringBoot 快速开发的一种补充,它内置了大量的配置来简化开发,遵循约定高于配置原则。
它解决的问题:
- 固定了输入输出格式
- 不用像公司的返回结构一样,需要自己包装类型,直接返回原始类型,如果需要可以返回 void
- 支持树结构数据返回,可以一个注解就转换结构为树形结构
- 如果项目中出现业务操作不符合或调用第三方出错,可使用异常或断言抛出,我们将拦截成统一格式返回
- 自带参数空格过滤功能,还可以定义特殊字符和谐
- 支持校验器,添加了大量常用验证器
- 支持大文件分片上传,已内置 Controller
- 支持方法日志参数记录
发现BUG可以提Issue,可以给我发邮件,可以加我QQ,可以进9420技术群讨论.
作者QQ: 2441719087
作者邮箱: ningxiangsanri@163.com
9420 技术交流群: 645576465
作者微信:sanri1993-
项目功能
我新开的一个项目,总结了多年的开发经验所得,它具有的功能有
固定了输入输出格式
// 普通输出格式
@Data
public class ResponseDto<T> implements Serializable {
// 0 字符串表示成功,否则失败
private String code = "0";
private String message;
private T data;
}
// 分页输出格式,是包裹在普通输出格式中的,PageResponseDto 做为 data 属性
@Data
public class PageResponseDto<T> {
private List<T> rows;
private Integer total;
} // 分页输入格式
@Setter
public class PageParam {
private String pageNo;
private String pageSize;
}
对于 Controller 中的返回不用关心包装类型,返回你所需要的类型就可以了,对于 insert 单表操作可以直接返回 void
示例一:
@PostMapping("/insertUser")
public void insertUser(User user){
xxxService.insert(user);
}
它将会返回这样的数据结构
{
"code":"0",
"message":"ok",
"data":null
}
示例二:
@GetMapping("/queryUserById")
public User queryUserById(Integer userId){
xxxService.queryUserById(userId);
}
它将会返回这样的数据结构
{
"code":"0",
"message":"ok",
"data":{
"userId":1,
"username":"9420"
}
}
示例三:
对于分页数据的处理
@GetMapping("/queryUserPage")
public PageResponseDto<User> pageQuery(PageParam pageParam,Map<String,String> queryParams){
PageHelper.startPage(pageParam.getPageNo(),pageParam.getPageSize());
Page page = (Page) xxxService.pageQuery(queryParams);
List result = page.getResult();
long total = page.getTotal();
return new PageResponseDto(result,total);
}
它将会返回这样的数据结构
{
"code":"0",
"message":"ok",
"data":{
"total":100,
"rows":[{...},{...}]
}
}
示例四: 树结构返回
对于树型结构数据,你可以用简单数据返回,即原来的
List<Dto>
也可以添加一个注解,使其成为树状结构//rootId 指定为根结点 id
@GetMapping("/treeShowMenu")
@TreeResponse(type = MenuDto.class,rootId = "1")
public List<Menu> treeShowMenu(){
List<Menu> menus = new ArrayList<>();
menus.add(new Menu(1,"全国",-1));
menus.add(new Menu(2,"湖南",1));
menus.add(new Menu(3,"长沙",2));
menus.add(new Menu(4,"深圳",1));
return menus;
}
// 树状结构消息类
public class MenuDto extends RootTreeResponseDto<Menu> {
public MenuDto(Menu origin) {
super(origin);
} @Override
public String getId() {return origin.getId()+"";} @Override
public String getParentId() {return origin.getPid()+"";} @Override
public String getLabel() {return origin.getText();} @Override
public Menu getOrigin() {return origin;}
}
它将返回如下数据结构
{
"code": "0",
"message": "ok",
"data": [{
"origin": {
"id": 1,
"text": "全国",
"pid": -1
},
"childrens": [{
"origin": {
"id": 2,
"text": "湖南",
"pid": 1
},
"childrens": [{
"origin": {
"id": 3,
"text": "长沙",
"pid": 2
},
"childrens": [],
"id": "3",
"label": "长沙",
"parentId": "2"
}],
"id": "2",
"label": "湖南",
"parentId": "1"
}, {
"origin": {
"id": 4,
"text": "深圳",
"pid": 1
},
"childrens": [],
"id": "4",
"label": "深圳",
"parentId": "1"
}],
"id": "1",
"label": "全国",
"parentId": "-1"
}]
}
如果项目中出现业务操作不符合或调用第三方出错,可使用异常抛出,我们将拦截成统一格式返回
示例一:
if(业务条件不满足){
throw BusinessException.create("业务提示信息");
}
它将会返回这样的数据结构,code 是随机生成的
{
"code":"234234",
"message":"业务提示信息",
"data":null
}
示例二:
自定义 code 示例方法一
if(业务条件不满足){
throw BusinessException.create("E007","业务提示信息");
}
它将会返回这样的数据结构
{
"code":"E007",
"message":"业务提示信息",
"data":null
}
示例三:
自定义 code 示例方法二
// 配置异常代码
public enum SystemMessage implements ExceptionCause<BusinessException> {
SIGN_ERROR(4005,"签名错误,你的签名串为 [%s]"),;
ResponseDto responseDto = new ResponseDto(); private SystemMessage(int returnCode,String message){
responseDto.setCode(returnCode+"");
responseDto.setMessage(message);
} public BusinessException exception(Object...args) {
return BusinessException.create(this,args);
}
}
使用异常
if(业务条件不满足){
throw SystemMessage.SIGN_ERROR.exception("签名串");
}
它将会返回这样的数据结构
{
"code":"4005",
"message":"签名错误,你的签名串为 [签名串]",
"data":null
}
你以为它就这么点能耐吗,它还自带参数空格过滤功能,还可以定义特殊字符和谐
你只需要注入一个处理器,它就能工作,注入方式如下
@Bean("paramHandler")
public Function paramHandler(){
return param -> param.replace("<","《");
}
自带了日期转化(输入)功能,可以支持的日期格式有
final String[] parsePatterns = new String[]{"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm:ss.S"};
现在是固定这三种格式 ,后面会放开让使用者自己配置
支持校验器,已经帮你设置好了两个 group ,直接使用即可
public interface Insert {
}
public interface Update {
}
支持大文件上传,文件秒传,文件验证;你只需要配置几个选项即可使用
# 文件上传的位置
sanri.webui.upload.basePath=d:/test/
# 临时文件路径
spring.servlet.multipart.location=d:/tmp
或者你想上传到别的地方,那就需要自己实现
com.sanri.web.bigfile.BigFileStorage
然后注入 IOC 到容器@Bean
public BigFileStorage bigFileStorage(){
return new LocalBigFileStorage();
}
大文件上传的几个接口说明
已经帮你添加了一个 controller ,用于大文件上传,下面是接口说明
GET /upload/file/fileMetaData?originFileName=原始文件名&fileSize=文件大小&md5=文件 md5
返回FileMetaData
数据,重要的数据是那个相对路径relativePath
因为它是接下来所有接口的入参GET /upload/file/filePosition?relativePath=相对路径
返回 文件当前上传的大小,用于断点续传POST /upload/file/uploadPart?relativePath=相对路径
body 中添加 form-data 参数,file=文件
返回上传文件位置GET /upload/file/validateFile?relativePath=相对路径&fileSize=文件大小&md5=文件 md5 值
返回文件是否正常上传,无损坏
使用说明
引入包或下载 jar 包文件
<dependency>
<groupId>com.sanri.web</groupId>
<artifactId>web-ui</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
开启快速开发
@EnableWebUI
如果想开启大文件上传
@EnableBigFileUpload
更新列表
update 2019/10/24 增加日志组件
可以为方法标记记录日志功能,这是很常见的一个功能,感谢网友 东莞-队长(qq: 1178130627) 的朋友提出
因为日志每个系统有各自的做法,有的可能还需要把日志存储到 mongodb
中去,所以不可能全部统一起来,注解也是不支持继承的;所以我的解决办法是,我可以帮你尽可能的解析出一些参数来,但具体的实现逻辑还需要你自己来弄,框架默认会给你注入一个把日志打印到控制台的功能。
使用方法为使用注解标记当前方法,它将默认使用 com.sanri.web.logmark.Slf4jLogInfoHandler
来记录日志
@GetMapping("/testParamTrim")
@SysLogMark
public void testParamTrim(TestParam testParam){}
兼容性说明 :
- 兼容
application/x-www-form-urlencoded
类型参数 - 兼容
application/form-data
类型参数 - 兼容
application/json
类型参数
当然,我会排除文件类型的参数,它太庞大了,不可能打印在日志里面
实现自己的日志记录方法:注入一个 LogInfoHandler
的 Bean 到 IOC 容器中
新增配置
# 日志参数打印,可支持的项有 base,param,header,body
sanri.webui.logmark.showInfos=base,param,header,body
update 2019/10/25 增加常用验证器和部分工具
一些常用校验器和通用预览和下载功能,比较常用,这里给全部集成了
参数校验器使用方法
// 必须为强密码
@NotNull
@Password(strength = Password.Strength.STRONG)
private String password;
其它常用验证器
@UserName
验证参数是否为用户名@Password
验证参数是否为密码@IdCard18
验证参数是否为 18 位身份证可以在 resources 目录下放置一个区域代码,做更强的验证,文件名为
areaCodes
,文件内容以逗号分隔所有的区域代码@EnumIntValue
和@EnumStringValue
验证参数是否为枚举值
增加一些文件下载,预览方法,和 request 请求信息的获取
@Autowired
RequestInfoHelper requestInfoHelper;
@Autowired
StreamHelper streamHelper;
修改处理器注入方式 ,使用自己的接口 ParamHandler
,不使用 Function
@Bean("paramHandler")
public ParamHandler paramHandler(){
return param -> param.replace("<","《");
}
update 2019/10/27 增加树形数据返回
为解决前端 mm 需要后端人员返回树形结构数据问题,其实大部分框架已经支持简单树形数据,像 ztree ,但也有的前端框架是需要后端帮忙转化一下数据结构的,所以特加此功能
这个树形结构的转换使用了一个快速转换的机制,充分利用了对象在内存中地址的原理,实测在万条数据转换为 10ms 左右,使用方法是先实现一个 TreeResponseDto
的类,然后在 Controller 中添加一个注解
@TreeResponse(type = MenuDto.class,rootId = "1")
springboot 快速开发的定制补充的更多相关文章
- SpringBoot快速开发REST服务最佳实践
一.为什么选择SpringBoot Spring Boot是由Pivotal团队提供的全新框架,被很多业内资深人士认为是可能改变游戏规则的新项目.早期我们搭建一个SSH或者Spring Web应用,需 ...
- springboot快速开发(简单web)
这是一个springboot基础配置文件介绍的demo.只涉及到 控制层与前端的简单交互,用于验证代码的畅通. spring-boot pom.xml解释 <?xml version=&quo ...
- spring-boot开发:使用内嵌容器进行快速开发及测试
一.简述一下spring-boot微框架 1.spring-boot微框架是什么? 大家都知道,在使用spring框架进行应用开发时需要很多*.xml的初始化配置文件,而springBoot就是用来简 ...
- 基于SpringBoot+Mybatis+AntDesign快速开发平台,Jeecg-Boot 1.1 版本发布
Jeecg-Boot 1.1 版本发布,初成长稳定版本 导读 平台首页UI升级,精美的首页支持多模式 提供4套代码生成器模板(支持单表.一对多) 集成Excel简易工具类,支持单表.一对多导入 ...
- 使用springBoot进行快速开发
springBoot项目是spring的一个子项目,使用约定由于配置的思想省去了以往在开发过程中许多的配置工作(其实使用springBoot并不是零配置,只是使用了注解完全省去了XML文件的配置),达 ...
- fieldmeta 基于springboot的字段元数据管理,通用代码生成,快速开发引擎
fieldmeta: 基于springboot的字段元数据管理 version:Alpha 0.0.1 ,码云地址:https://gitee.com/klguang/fieldmeta 元数据(Me ...
- JeecgBoot 2.1.1 代码生成器AI版本发布,基于SpringBoot+AntDesign的JAVA快速开发平台
此版本重点升级了 Online 代码生成器,支持更多的控件生成,所见即所得,极大的提高开发效率:同时做了数据库兼容专项工作,让 Online 开发兼容更多数据库:Mysql.SqlServer.Ora ...
- 在线Online表单来了!JeecgBoot 2.1 版本发布——基于SpringBoot+AntDesign的快速开发平台
项目介绍 Jeecg-Boot 是一款基于SpringBoot+代码生成器的快速开发平台! 采用前后端分离架构:SpringBoot,Ant-Design-Vue,Mybatis,Shiro,JWT. ...
- 基于SpringBoot+AntDesign的快速开发平台,JeecgBoot 2.0.2 版本发布
Jeecg-Boot 是一款基于SpringBoot+代码生成器的快速开发平台! 采用前后端分离架构:SpringBoot,Ant-Design-Vue,Mybatis,Shiro,JWT. 强大的代 ...
随机推荐
- 本地代码上传github失败常见错误
1.上传失败 解决办法如下: 可以通过如下命令进行github与本地代码合并: git pull --rebase origin master 重新执行上传命令: git push -u origin ...
- charles Glist发布设置
本文参考:charles Glist发布设置 在这里可以设置Github账户, 发布list的大小限制:等等: 在这里 Auh 就是设置Github账户, 设置登陆你的Github后,才能针对该用户进 ...
- 表达式树练习实践:C#值类型、引用类型、泛型、集合、调用函数
目录 表达式树练习实践:C#值类型.引用类型.泛型.集合.调用函数 一,定义变量 二,访问变量/类型的属性字段和方法 1. 访问属性 2. 调用函数 三,实例化引用类型 四,实例化泛型类型于调用 五, ...
- servlet request、response的中文乱码问题
一.request 1.get请求 get请求的参数是在请求行中的,浏览器使用utf-8进行编码,数据的编码一般为UTF-8,而url请求行的默认编码为ISO-8859-1,一般来说有以下方式可以解决 ...
- 设计模式笔记(一):Singleton 设计模式
今天开始学习设计模式,借此机会学习并整理学习笔记. 设计模式是一门不区分语言的课程,什么样的编程语言都可以用到设计模式.如果说java语法规则比作武功招式的话,那么设计模式就是心法. 设计模式共有23 ...
- BCD 码、Gray 码、ASCII 码都是什么呢?
BCD 码:即(Binary Coded Decimal)码,也称为 8421 码,是十进制代码中最常见的一种.每一位的 1 代表的十进制数称为这一位的权.BCD 码中每一位的权都是固定不变的,它属于 ...
- Centos6安装MySQL5.7(yum方式)
1. 下载并安装用来配置mysql的yum源的rpm包 # 下载 wget http://repo.mysql.com/mysql57-community-release-el6-10.noarch. ...
- selenium-05-问题2
现在的项目组用开源的Selenium做测试,但不得不说,这个东东bug奇多,下面是我遇到的一些问题,有些提供了解决方法,有些则需要继续研究,希望对各位看官有所帮助. 一.不能从命令行运行Seleniu ...
- 品Spring:注解之王@Configuration和它的一众“小弟们”
其实对Spring的了解达到一定程度后,你就会发现,无论是使用Spring框架开发的应用,还是Spring框架本身的开发都是围绕着注解构建起来的. 空口无凭,那就说个最普通的例子吧. 在Spring中 ...
- vue-router路由元信息及keep-alive组件级缓存
路由元信息?(黑人问号脸???)是不是这么官方的解释很多人都会一脸懵?那么我们说meta,是不是很多人恍然大悟,因为在项目中用到或者看到过呢? 是的,路由元信息就是我们定义路由时配置的meta字段:那 ...