新版Guns基于SpringBoot全面升级,完美整合springmvc + shiro + MyBatis 通用 Mapper + 分页插件 PageHelper + beetl!
本项目 fork 自 stylefeng 的 Guns!
经过对 Guns 项目的修改,使得该项目成为一个通用 Mapper 和 分页插件使用的示例。
项目引入了下面两个依赖:
<dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>${mapper-starter.version}</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>${pagehelper-starter.version}</version> </dependency>完全使用 MyBatis 官方的 Starter.
一个最简单的 Spring Boot 集成项目:
https://github.com/abel533/MyBatis-Spring-Boot
本项目对 Guns 的改动为:
将 mybatis-plus 改成了通用 Mapper.增加分页插件 PageHelper.去掉com.stylefeng.guns.modular.system.dao包中的所有DAO,将方法放到对应的Mapper接口中.将 Mapper.xml 移动到 resources 中关于两者的对比,可以通过 commit 信息查看。
更多 MyBatis 相关工具可以访问: http://mybatis.tk
Guns目前支持三种启动方式:
在IDE里运行GunsApplication类中的main方法启动执行如下maven命令 clean package -Dmaven.test.skip=true并从target目录中找到guns-1.0.0-SNAPSHOT.jar,并在jar包的目录下执行如下java命令
java -jar guns-1.0.0-SNAPSHOT.jar 修改pom.xml中如下片段 <packaging>jar</packaging>改为
<packaging>war</packaging>并打包放入到tomcat中执行
最新版项目最低支持jdk1.7
注:SpringBoot项目默认不支持将静态资源和模板(web页面)放到webapp目录,但是个人感觉resources目录只放项目的配置更加简洁,所以就将web页面继续放到webapp目录了.
Guns以简洁为核心,抛弃了传统的易错,臃肿xml配置,采用javabean的方式配置spring,简化了项目的配置,如下示例为配置mybatis-plus和数据源:
@Configuration @MapperScan(basePackages = {"com.stylefeng.guns.modular.*.dao", "com.stylefeng.guns.common.persistence.dao"}) public class MybatisPlusConfig { @Autowired DruidProperties druidProperties; /** * mybatis-plus分页插件 */ @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); paginationInterceptor.setDialectType(DBType.MYSQL.getDb()); return paginationInterceptor; } /** * druid数据库连接池 */ @Bean(initMethod = "init") public DruidDataSource dataSource() { DruidDataSource dataSource = new DruidDataSource(); druidProperties.coinfig(dataSource); return dataSource; } }日志记录采用aop(LogAop类)方式对所有包含@BussinessLog注解的方法进行aop切入,会记录下当前用户执行了哪些操作(即@BussinessLog value属性的内容),如果涉及到数据修改,会取当前http请求的所有requestParameters与LogObjectHolder类中缓存的Object对象的所有字段作比较(所以在编辑之前的获取详情接口中需要缓存被修改对象之前的字段信息),日志内容会异步存入数据库中(通过ScheduledThreadPoolExecutor类)。
例如,把主页拆分成三部分,每个部分单独一个页面,更加便于维护
<!--左侧导航开始--> @include("/common/_tab.html"){} <!--左侧导航结束--> <!--右侧部分开始--> @include("/common/_right.html"){} <!--右侧部分结束--> <!--右侧边栏开始--> @include("/common/_theme.html"){} <!--右侧边栏结束-->以及对重复的html进行包装,使前端页面更加专注于业务实现,例如,把所有页面引用包进行提取
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="renderer" content="webkit" /><!-- 让360浏览器默认选择webkit内核 --> <!-- 全局css --> <link rel="shortcut icon" href="${ctxPath}/static/favicon.ico"> <!-- 全局js --> <script src="${ctxPath}/static/js/jquery.min.js?v=2.1.4"></script> <body class="gray-bg"> <div class="wrapper wrapper-content animated fadeInRight"> ${layoutContent} </div> <script src="${ctxPath}/static/js/content.js?v=1.0.0"></script> </body> </html>开发页面时,只需编写如下代码即可
@layout("/common/_container.html"){ <div class="row"> <div class="col-sm-12"> <div class="ibox float-e-margins"> <div class="ibox-title"> <h5>部门管理</h5> </div> <div class="ibox-content"> //自定义内容 </div> </div> </div> </div> <script src="${ctxPath}/static/modular/system/dept/dept.js"></script> @}以上beetl的用法请参考beetl说明文档。
在webapp/static/js/common目录中,有对常用js代码的封装,例如Feng.js,其中Feng.info(),Feng.success(),Feng.error()三个方法,分别封装了普通提示,成功提示,错误提示的代码,简化了layer提示层插件的使用。
guns对web-upload进行二次封装,让图片的上传功能呢只用2行代码即可实现,如下
var avatarUp = new $WebUpload("avatar"); avatarUp.init();具体实现请参考static/js/common/web-upload-object.js
map+warpper方式即为把controller层的返回结果使用BeanKit工具类把原有bean转化为Map的的形式(或者原有bean直接是map的形式),再用单独写的一个包装类再包装一次这个map,使里面的参数更加具体,更加有含义,下面举一个例子,例如,在返回给前台一个性别时,数据库查出来1是男2是女,假如直接返回给前台,那么前台显示的时候还需要增加一次判断,并且前后端分离开发时又增加了一次交流和文档的成本,但是采用warpper包装的形式,可以直接把返回结果包装一下,例如动态增加一个字段sexName直接返回给前台性别的中文名称即可。
Guns的数据范围控制是指,对拥有相同角色的用户,根据部门的不同进行相应的数据筛选,如果部门不相同,那么有可能展示出的具体数据是不一致的.所以说Guns对数据范围控制是以部门id为单位来标识的,如何增加数据范围拦截呢?只需在相关的mapper接口的参数中增加一个DataScope对象即可,DataScope中有两个字段,scopeName用来标识sql语句中部门id的字段名称,例如deptiid或者id,另一个字段deptIds就是具体需要过滤的部门id的集合.拦截器原理如下:拦截mapper中包含DataScope对象的方法,获取其原始sql,并做一个包装限制部门id在deptIds范围内的数据进行展示.
swagger会管理所有包含@ApiOperation注解的控制器方法,同时,可利用@ApiImplicitParams注解标记接口中的参数,具体用法请参考CodeController类中的用法。
@ApiOperation("生成代码") @ApiImplicitParams({ @ApiImplicitParam(name = "moduleName", value = "模块名称", required = true, dataType = "String"), @ApiImplicitParam(name = "bizChName", value = "业务名称", required = true, dataType = "String"), @ApiImplicitParam(name = "bizEnName", value = "业务英文名称", required = true, dataType = "String"), @ApiImplicitParam(name = "path", value = "项目生成类路径", required = true, dataType = "String") }) @RequestMapping(value = "/generate", method = RequestMethod.POST)转载于:https://www.cnblogs.com/mjbrian/p/7687902.html
相关资源:JAVA上百实例源码以及开源项目