1. 程式人生 > >Guns V3.0簡介

Guns V3.0簡介

Guns V3.0

介紹

Guns基於Spring Boot,致力於做更簡潔的後臺管理系統,完美整合springmvc + shiro + mybatis-plus + beetl!Guns專案程式碼簡潔,註釋豐富,上手容易,同時Guns包含許多基礎模組(使用者管理,角色管理,部門管理,字典管理等10個模組),可以直接作為一個後臺管理系統的腳手架!

Guns v3.0新增REST API服務,提供對接服務端介面的支援,並利用JWT TOKEN鑑權機制給予客戶端的訪問許可權,傳輸資料進行md5簽名保證傳輸過程資料的安全性!

最新Guns視訊教程

Guns框架有作者在業餘時間錄製的視訊教程,詳情點選

教程介紹

如果對專案有任何疑問或者建議,歡迎加入Guns技術交流群:254550081 (加之前先看下wiki)

管理系統功能

1.使用者管理 2.角色管理 3.部門管理 4.選單管理 5.字典管理 6.業務日誌 7.登入日誌 8.監控管理 9.通知管理 10.程式碼生成

專案特點

  1. 基於SpringBoot,簡化了大量專案配置和maven依賴,讓您更專注於業務開發,獨特的分包方式,程式碼多而不亂。
  2. 完善的日誌記錄體系,可記錄登入日誌,業務操作日誌(可記錄操作前和操作後的資料),異常日誌到資料庫,通過@BussinessLog註解和LogObjectHolder.me().set()方法,業務操作日誌可具體記錄哪個使用者,執行了哪些業務,修改了哪些資料,並且日誌記錄為非同步執行,詳情請見@BussinessLog註解和LogObjectHolder,LogManager,LogAop類。
  3. 利用beetl模板引擎對前臺頁面進行封裝和拆分,使臃腫的html程式碼變得簡潔,更加易維護。
  4. 對常用js外掛進行二次封裝,使js程式碼變得簡潔,更加易維護,具體請見webapp/static/js/common資料夾內js程式碼。
  5. 利用ehcache框架對經常呼叫的查詢進行快取,提升執行速度,具體請見ConstantFactory類中@Cacheable標記的方法。
  6. controller層採用map + warpper方式的返回結果,返回給前端更為靈活的資料,具體參見com.stylefeng.guns.modular.system.warpper包中具體類。
  7. 防止XSS攻擊,通過XssFilter類對所有的輸入的非法字串進行過濾以及替換。
  8. 簡單可用的程式碼生成體系,通過SimpleTemplateEngine可生成帶有主頁跳轉和增刪改查的通用控制器、html頁面以及相關的js,還可以生成Service和Dao,並且這些生成項都為可選的,通過ContextConfig下的一些列xxxSwitch開關,可靈活控制生成模板程式碼,讓您把時間放在真正的業務上。
  9. 控制器層統一的異常攔截機制,利用@ControllerAdvice統一對異常攔截,具體見com.stylefeng.guns.core.aop.GlobalExceptionHandler類。
  10. 頁面統一的js key-value單例模式寫法,每個頁面生成一個唯一的全域性變數,提高js的利用效率,並且有效防止多個人員開發引起的函式名/類名衝突,並且可以更好地去維護程式碼。

基於javabean方式的spring配置

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;
    }
}

業務日誌記錄

日誌記錄採用aop(LogAop類)方式對所有包含@BussinessLog註解的方法進行aop切入,會記錄下當前使用者執行了哪些操作(即@BussinessLog value屬性的內容),如果涉及到資料修改,會取當前http請求的所有requestParameters與LogObjectHolder類中快取的Object物件的所有欄位作比較(所以在編輯之前的獲取詳情介面中需要快取被修改物件之前的欄位資訊),日誌內容會非同步存入資料庫中(通過ScheduledThreadPoolExecutor類)。

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 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說明文件。

對js常用程式碼的封裝

在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

獨創controller層,map+warpper返回方式

map+warpper方式即為把controller層的返回結果使用BeanKit工具類把原有bean轉化為Map的的形式(或者原有bean直接是map的形式),再用單獨寫的一個包裝類再包裝一次這個map,使裡面的引數更加具體,更加有含義,下面舉一個例子,例如,在返回給前臺一個性別時,資料庫查出來1是男2是女,假如直接返回給前臺,那麼前臺顯示的時候還需要增加一次判斷,並且前後端分離開發時又增加了一次交流和文件的成本,但是採用warpper包裝的形式,可以直接把返回結果包裝一下,例如動態增加一個欄位sexName直接返回給前臺性別的中文名稱即可。

獨創mybatis資料範圍攔截器,實現對資料許可權的過濾

Guns的資料範圍控制是指,對擁有相同角色的使用者,根據部門的不同進行相應的資料篩選,如果部門不相同,那麼有可能展示出的具體資料是不一致的.所以說Guns對資料範圍控制是以部門id為單位來標識的,如何增加資料範圍攔截呢?只需在相關的mapper介面的引數中增加一個DataScope物件即可,DataScope中有兩個欄位,scopeName用來標識sql語句中部門id的欄位名稱,例如deptiid或者id,另一個欄位deptIds就是具體需要過濾的部門id的集合.攔截器原理如下:攔截mapper中包含DataScope物件的方法,獲取其原始sql,並做一個包裝限制部門id在deptIds範圍內的資料進行展示.

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)

jwt token鑑權機制

jwt token鑑權機制是指若需要請求伺服器介面,必須通過AuthController獲取一個請求令牌(jwt token),持有jwt token的使用者才可以訪問伺服器的其他資源,如果沒有此令牌,則訪問介面會直接忽略,請求獲取jwt token時,需要攜帶credenceName和credenceCode(可以是賬號密碼,可以是手機號驗證碼等等),校驗credenceName和credenceCode成功後,會頒發給客戶端一個jwt token還有一個隨機字串,用於傳輸過程中對資料進行簽名用,簽名機制請見下面介紹.基於token的鑑權機制類似於http協議也是無狀態的,它不需要在服務端去保留使用者的認證資訊或者會話資訊.這就意味著基於token認證機制的應用不需要去考慮使用者在哪一臺伺服器登入了,這就為應用的擴充套件提供了便利.

簽名機制

簽名機制是指客戶端向服務端傳輸資料中,對傳輸資料進行md5加密,並且加密過程中利用Auth介面返回的隨機字串進行混淆加密,並把md5值同時附帶給服務端,服務端通獲取資料之後對資料再進行一次md5加密,若加密結果和客戶端傳來的資料一致,則認定客戶端請求的資料是沒有被篡改的,若不一致,則認為被加密的資料是被篡改的

效果圖

輸入圖片說明
輸入圖片說明
輸入圖片說明
輸入圖片說明
輸入圖片說明
輸入圖片說明
輸入圖片說明
輸入圖片說明
輸入圖片說明
輸入圖片說明
輸入圖片說明
輸入圖片說明
輸入圖片說明
輸入圖片說明

曾獲榮譽

輸入圖片說明