Guns码云地址:
https://gitee.com/naan1993/guns/css
一、项目介绍
介绍
Guns基于SpringBoot, 致力于作更简洁的后台管理系统,完美整合springmvc + shiro + mybatis-plus + beetl + flowable!html
Guns项目代码简洁,注释丰富,上手容易, 同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块),能够直接做为一个后台管理系统的脚手架.前端
Guns v3.0新增rest api服务,提供对接服务端接口的支持,并利用jwt token鉴权机制给予客户端的访问权限,传输数据进行md5签名保证传输过程数据的安全性!java
Guns v3.1新增集成工做流引擎flowable6.2.0!jquery
Guns 4.0升级到全新的spring boot 2.0并大大简化了前端资源文件!git
Guns v4.1更新内容
- guns-admin提供rest api服务,并以jwt方式鉴权,全部以
/gunsApi
开头的接口走这种鉴权方式,其余接口仍为shiro鉴权
Guns v4.0更新内容
- spring boot升级到2.0版本!
- 简化前端全部的html,js,css等资源文件,由11.8MB缩减为4.8MB!
- 新增手动增长标签页的方法,Feng.newCrontab(href,menuName);
- laydate时间插件和layer弹出层插件更新为官网最新,能够看着layui官网的文档直接开发啦!
- 去掉animate动画效果,加快页面响应速度!
- 修复登录后重启应用形成404的bug!
- 加强core模块的功能,拿来即用开发新的模块的后端管理系统!
- 升级各个依赖包的版本!
- 简化applicatioin.yml的配置,一些固定不变的配置写在core模块的default-config.properties!
- 简化多数据源配置,简化mybatis-plus的配置!
- 优化日志记录格式和策略,详情见logback-spring.xml!
2.管理系统功能
1.用户管理 2.角色管理 3.部门管理 4.菜单管理 5.字典管理 6.业务日志 7.登陆日志 8.监控管理 9.通知管理 10.代码生成web
3.项目特色
- 基于SpringBoot,简化了大量项目配置和maven依赖,让您更专一于业务开发,独特的分包方式,代码多而不乱。
- 完善的日志记录体系,可记录登陆日志,业务操做日志(可记录操做前和操做后的数据),异常日志到数据库,经过@BussinessLog注解和LogObjectHolder.me().set()方法,业务操做日志可具体记录哪一个用户,执行了哪些业务,修改了哪些数据,而且日志记录为异步执行,详情请见@BussinessLog注解和LogObjectHolder,LogManager,LogAop类。
- 利用beetl模板引擎对前台页面进行封装和拆分,使臃肿的html代码变得简洁,更加易维护。
- 对经常使用js插件进行二次封装,使js代码变得简洁,更加易维护,具体请见webapp/static/js/common文件夹内js代码。
- 利用ehcache框架对常常调用的查询进行缓存,提高运行速度,具体请见ConstantFactory类中@Cacheable标记的方法。
- controller层采用map + warpper方式的返回结果,返回给前端更为灵活的数据,具体参见com.stylefeng.guns.modular.system.warpper包中具体类。
- 防止XSS攻击,经过XssFilter类对全部的输入的非法字符串进行过滤以及替换。
- 简单可用的代码生成体系,经过SimpleTemplateEngine可生成带有主页跳转和增删改查的通用控制器、html页面以及相关的js,还能够生成Service和Dao,而且这些生成项都为可选的,经过ContextConfig下的一些列xxxSwitch开关,可灵活控制生成模板代码,让您把时间放在真正的业务上。
- 控制器层统一的异常拦截机制,利用@ControllerAdvice统一对异常拦截,具体见com.stylefeng.guns.core.aop.GlobalExceptionHandler类。
- 页面统一的js key-value单例模式写法,每一个页面生成一个惟一的全局变量,提升js的利用效率,而且有效防止多我的员开发引发的函数名/类名冲突,而且能够更好地去维护代码。
4.基于javabean方式的spring配置
Guns以简洁为核心,抛弃了传统的易错,臃肿xml配置,采用javabean的方式配置spring,简化了项目的配置,以下示例为配置mybatis-plus和数据源:spring
1 @Configuration 2 @MapperScan(basePackages = {"com.stylefeng.guns.modular.*.dao", "com.stylefeng.guns.common.persistence.dao"}) 3 public class MybatisPlusConfig { 4 5 @Autowired 6 DruidProperties druidProperties; 7 8 /** 9 * mybatis-plus分页插件 10 */ 11 @Bean 12 public PaginationInterceptor paginationInterceptor() { 13 PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); 14 paginationInterceptor.setDialectType(DBType.MYSQL.getDb()); 15 return paginationInterceptor; 16 } 17 }
5.业务日志记录
日志记录采用aop(LogAop类)方式对全部包含@BussinessLog注解的方法进行aop切入,会记录下当前用户执行了哪些操做(即@BussinessLog value属性的内容),若是涉及到数据修改,会取当前http请求的全部requestParameters与LogObjectHolder类中缓存的Object对象的全部字段做比较(因此在编辑以前的获取详情接口中须要缓存被修改对象以前的字段信息),日志内容会异步存入数据库中(经过ScheduledThreadPoolExecutor类)。sql
6.beetl对前台页面的拆分与包装
例如,把主页拆分红三部分,每一个部分单独一个页面,更加便于维护数据库
<!--左侧导航开始--> @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"> ${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说明文档。
7. 对js经常使用代码的封装
在webapp/static/js/common目录中,有对经常使用js代码的封装,例如Feng.js,其中Feng.info(),Feng.success(),Feng.error()三个方法,分别封装了普通提示,成功提示,错误提示的代码,简化了layer提示层插件的使用。
8. 极简的图片上传方法
guns对web-upload进行二次封装,让图片的上传功能呢只用2行代码便可实现,以下
var avatarUp = new $WebUpload("avatar"); avatarUp.init();
具体实现请参考static/js/common/web-upload-object.js
9.首创controller层,map+warpper返回方式
map+warpper方式即为把controller层的返回结果使用BeanKit工具类把原有bean转化为Map的的形式(或者原有bean直接是map的形式),再用单独写的一个包装类再包装一次这个map,使里面的参数更加具体,更加有含义。
下面举一个例子,例如,在返回给前台一个性别时,数据库查出来1是男2是女,假如直接返回给前台,那么前台显示的时候还须要增长一次判断,而且先后端分离开发时又增长了一次交流和文档的成本,可是采用warpper包装的形式,能够直接把返回结果包装一下,例如动态增长一个字段sexName直接返回给前台性别的中文名称便可。
10.首创mybatis数据范围拦截器,实现对数据权限的过滤
Guns的数据范围控制是指,对拥有相同角色的用户,根据部门的不一样进行相应的数据筛选,若是部门不相同,那么有可能展现出的具体数据是不一致的.因此说Guns对数据范围控制是以部门id为单位来标识的,
如何增长数据范围拦截呢?只需在相关的mapper接口的参数中增长一个DataScope对象便可,DataScope中有两个字段,scopeName用来标识sql语句中部门id的字段名称,例如deptiid或者id,另外一个字段deptIds就是具体须要过滤的部门id的集合.拦截器原理以下:拦截mapper中包含DataScope对象的方法,获取其原始sql,并作一个包装限制部门id在deptIds范围内的数据进行展现.
11.swagger api管理使用说明
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)
12.jwt token鉴权机制
jwt token鉴权机制是指若须要请求服务器接口,必须经过AuthController获取一个请求令牌(jwt token),持有jwt token的用户才能够访问服务器的其余资源,若是没有此令牌,则访问接口会直接忽略。
请求获取jwt token时,须要携带credenceName和credenceCode(能够是帐号密码,能够是手机号验证码等等),校验credenceName和credenceCode成功后,会颁发给客户端一个jwt token还有一个随机字符串,用于传输过程当中对数据进行签名用,签名机制请见下面介绍.
基于token的鉴权机制相似于http协议也是无状态的,它不须要在服务端去保留用户的认证信息或者会话信息.这就意味着基于token认证机制的应用不须要去考虑用户在哪一台服务器登陆了,这就为应用的扩展提供了便利.
13.签名机制
签名机制是指客户端向服务端传输数据中,对传输数据进行md5加密,而且加密过程当中利用Auth接口返回的随机字符串进行混淆加密,并把md5值同时附带给服务端,服务端通获取数据以后对数据再进行一次md5加密,若加密结果和客户端传来的数据一致,则认定客户端请求的数据是没有被篡改的,若不一致,则认为被加密的数据是被篡改的