Guns碼雲地址:
https://gitee.com/naan1993/guns/
1、項目介紹
介紹
Guns基於SpringBoot, 致力於做更簡潔的后台管理系統,完美整合springmvc + shiro + mybatis-plus + beetl + flowable!
Guns項目代碼簡潔,注釋豐富,上手容易, 同時Guns包含許多基礎模塊(用戶管理,角色管理,部門管理,字典管理等10個模塊),可以直接作為一個后台管理系統的腳手架.
Guns v3.0新增rest api服務,提供對接服務端接口的支持,並利用jwt token鑒權機制給予客戶端的訪問權限,傳輸數據進行md5簽名保證傳輸過程數據的安全性!
Guns v3.1新增集成工作流引擎flowable6.2.0!
Guns 4.0升級到全新的spring boot 2.0並大大簡化了前端資源文件!
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.代碼生成
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和數據源:
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類)。
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加密,若加密結果和客戶端傳來的數據一致,則認定客戶端請求的數據是沒有被篡改的,若不一致,則認為被加密的數據是被篡改的