新版Guns基於SpringBoot全面升級,完美整合springmvc + shiro + MyBatis 通用 Mapper + 分頁插件 PageHelper + beetl!css
本項目 fork 自 stylefeng 的 Guns!html
通過對 Guns 項目的修改,使得該項目成爲一個通用 Mapper 和 分頁插件使用的示例。前端
項目引入了下面兩個依賴:java
<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.mysql
一個最簡單的 Spring Boot 集成項目:jquery
https://github.com/abel533/MyBatis-Spring-Bootlinux
本項目對 Guns 的改動爲:git
com.stylefeng.guns.modular.system.dao
包中的全部DAO,將方法放到對應的Mapper接口中.關於二者的對比,能夠經過 commit 信息查看。github
更多 MyBatis 相關工具能夠訪問: http://mybatis.tkweb
Guns目前支持三種啓動方式:
clean package -Dmaven.test.skip=true
並從target目錄中找到guns-1.0.0-SNAPSHOT.jar,並在jar包的目錄下執行以下java命令
java -jar guns-1.0.0-SNAPSHOT.jar
<packaging>jar</packaging>
改成
<packaging>war</packaging>
並打包放入到tomcat中執行
最新版項目最低支持jdk1.7
├─main │ │ │ ├─java │ │ │ │ │ ├─com.stylefeng.guns----------------項目主代碼 │ │ │ │ │ │ │ ├─common----------------項目公用的部分(業務中常常調用的類,例如常量,異常,實體,註解,分頁類,節點類) │ │ │ │ │ │ │ ├─config----------------項目配置代碼(例如mybtais-plus配置,ehcache配置等) │ │ │ │ │ │ │ ├─core----------------項目運行的核心依靠(例如aop日誌記錄,攔截器,監聽器,guns模板引擎,shiro權限檢查等) │ │ │ │ │ │ │ ├─modular----------------項目業務代碼 │ │ │ │ │ │ │ ├─GunsApplication類----------------以main方法啓動springboot的類 │ │ │ │ │ │ │ └─GunsServletInitializer類----------------用servlet容器啓動springboot的核心類 │ │ │ │ │ └─generator----------------mybatis-plus Entity生成器 │ │ │ ├─resources----------------項目資源文件 │ │ │ │ │ ├─gunsTemplate----------------guns代碼生成模板 │ │ │ │ │ ├─application.yml----------------springboot項目配置 │ │ │ │ │ └─ehcache.xml----------------ehcache緩存配置 │ │ │ └─webapp----------------web頁面和靜態資源存放的目錄 │
注: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)