还在从零开始搭建项目?手撸了款快速开发脚手架!
簡介
mall-tiny是一款基于SpringBoot+MyBatis-Plus的快速開發(fā)腳手架,擁有完整的權(quán)限管理功能,可對接Vue前端,開箱即用。
?
項目演示
mall-tiny項目可無縫對接mall-admin-web前端項目,秒變權(quán)限管理系統(tǒng)。前端項目地址:https://github.com/macrozheng/mall-admin-web
技術(shù)選型
數(shù)據(jù)庫表結(jié)構(gòu)
化繁為簡,僅保留了權(quán)限管理功能相關(guān)的9張表,方便自由定制;
使用流程
環(huán)境搭建
簡化依賴服務(wù),只需安裝最常用的MySql和Redis服務(wù)即可,數(shù)據(jù)庫中需要導(dǎo)入mall_tiny.sql腳本。
開發(fā)規(guī)約
項目包結(jié)構(gòu)
src ├──?common?--?用于存放通用代碼 |???├──?api?--?通用結(jié)果集封裝類 |???├──?config?--?通用配置類 |???├──?domain?--?通用封裝對象 |???├──?exception?--?全局異常處理相關(guān)類 |???└──?service?--?通用業(yè)務(wù)類 ├──?config?--?SpringBoot中的Java配置 ├──?domain?--?共用封裝對象 ├──?generator?--?MyBatis-Plus代碼生成器 ├──?modules?--?存放業(yè)務(wù)代碼的基礎(chǔ)包 |???└──?ums?--?權(quán)限管理模塊業(yè)務(wù)代碼 |???????├──?controller?--?該模塊相關(guān)接口 |???????├──?dto?--?該模塊數(shù)據(jù)傳輸封裝對象 |???????├──?mapper?--?該模塊相關(guān)Mapper接口 |???????├──?model?--?該模塊相關(guān)實體類 |???????└──?service?--?該模塊相關(guān)業(yè)務(wù)處理類 └──?security?--?SpringSecurity認證授權(quán)相關(guān)代碼├──?annotation?--?相關(guān)注解├──?aspect?--?相關(guān)切面├──?component?--?認證授權(quán)相關(guān)組件├──?config?--?相關(guān)配置└──?util?--?相關(guān)工具類資源文件說明
resources ├──?mapper?--?MyBatis中mapper.xml存放位置 ├──?application.yml?--?SpringBoot通用配置文件 ├──?application-dev.yml?--?SpringBoot開發(fā)環(huán)境配置文件 ├──?application-prod.yml?--?SpringBoot生產(chǎn)環(huán)境配置文件 └──?generator.properties?--?MyBatis-Plus代碼生成器配置接口定義規(guī)則
創(chuàng)建表記錄:POST /{控制器路由名稱}/create
修改表記錄:POST /{控制器路由名稱}/update/{id}
刪除指定表記錄:POST /{控制器路由名稱}/delete/{id}
分頁查詢表記錄:GET /{控制器路由名稱}/list
獲取指定記錄詳情:GET /{控制器路由名稱}/{id}
具體參數(shù)及返回結(jié)果定義可以運行代碼查看Swagger-UI的Api文檔:http://localhost:8080/swagger-ui.html
項目運行
直接運行啟動類MallTinyApplication的main函數(shù)即可。
業(yè)務(wù)代碼開發(fā)流程
創(chuàng)建業(yè)務(wù)表
創(chuàng)建好pms模塊的所有表,需要注意的是一定要寫好表字段的注釋,這樣實體類和接口文檔中就會自動生成字段說明了。
使用代碼生成器
運行MyBatisPlusGenerator類的main方法來生成代碼,可直接生成controller、service、mapper、model、mapper.xml的代碼,無需手動創(chuàng)建。
代碼生成器支持兩種模式,一種生成單表的代碼,比如只生成pms_brand表代碼可以先輸入pms,后輸入pms_brand;
生成代碼結(jié)構(gòu)一覽;
另一種直接生成整個模塊的代碼,比如生成pms模塊代碼可以先輸入pms,后輸入pms_*。
編寫業(yè)務(wù)代碼
單表查詢
由于MyBatis-Plus提供的增強功能相當強大,單表查詢幾乎不用手寫SQL,直接使用ServiceImpl和BaseMapper中提供的方法即可。
比如我們的菜單管理業(yè)務(wù)實現(xiàn)類UmsMenuServiceImpl中的方法都直接使用了這些方法。
/***?后臺菜單管理Service實現(xiàn)類*?Created?by?macro?on?2020/2/2.*/ @Service public?class?UmsMenuServiceImpl?extends?ServiceImpl<UmsMenuMapper,UmsMenu>implements?UmsMenuService?{@Overridepublic?boolean?create(UmsMenu?umsMenu)?{umsMenu.setCreateTime(new?Date());updateLevel(umsMenu);return?save(umsMenu);}@Overridepublic?boolean?update(Long?id,?UmsMenu?umsMenu)?{umsMenu.setId(id);updateLevel(umsMenu);return?updateById(umsMenu);}@Overridepublic?Page<UmsMenu>?list(Long?parentId,?Integer?pageSize,?Integer?pageNum)?{Page<UmsMenu>?page?=?new?Page<>(pageNum,pageSize);QueryWrapper<UmsMenu>?wrapper?=?new?QueryWrapper<>();wrapper.lambda().eq(UmsMenu::getParentId,parentId).orderByDesc(UmsMenu::getSort);return?page(page,wrapper);}@Overridepublic?List<UmsMenuNode>?treeList()?{List<UmsMenu>?menuList?=?list();List<UmsMenuNode>?result?=?menuList.stream().filter(menu?->?menu.getParentId().equals(0L)).map(menu?->?covertMenuNode(menu,?menuList)).collect(Collectors.toList());return?result;}@Overridepublic?boolean?updateHidden(Long?id,?Integer?hidden)?{UmsMenu?umsMenu?=?new?UmsMenu();umsMenu.setId(id);umsMenu.setHidden(hidden);return?updateById(umsMenu);} }分頁查詢
對于分頁查詢MyBatis-Plus原生支持,不需要再整合其他插件,直接構(gòu)造Page對象,然后調(diào)用ServiceImpl中的page方法即可。
/***?后臺菜單管理Service實現(xiàn)類*?Created?by?macro?on?2020/2/2.*/ @Service public?class?UmsMenuServiceImpl?extends?ServiceImpl<UmsMenuMapper,UmsMenu>implements?UmsMenuService?{@Overridepublic?Page<UmsMenu>?list(Long?parentId,?Integer?pageSize,?Integer?pageNum)?{Page<UmsMenu>?page?=?new?Page<>(pageNum,pageSize);QueryWrapper<UmsMenu>?wrapper?=?new?QueryWrapper<>();wrapper.lambda().eq(UmsMenu::getParentId,parentId).orderByDesc(UmsMenu::getSort);return?page(page,wrapper);} }多表查詢
對于多表查詢,我們需要手寫mapper.xml中的SQL實現(xiàn),由于之前我們已經(jīng)生成了mapper.xml文件,所以我們直接在Mapper接口中定義好方法,然后在mapper.xml寫好SQL實現(xiàn)即可。
比如說我們需要寫一個根據(jù)用戶ID獲取其分配的菜單的方法,首先我們在UmsMenuMapper接口中添加好getMenuList方法;
然后在UmsMenuMapper.xml添加該方法的對應(yīng)SQL實現(xiàn)即可。
項目部署
mall-tiny已經(jīng)集成了Docker插件,可以打包成Docker鏡像來部署
其他說明
SpringSecurity相關(guān)
由于使用了SpringSecurity來實現(xiàn)認證和授權(quán),部分接口需要token才可以訪問,訪問需要認證授權(quán)接口流程如下。
訪問Swagger-UI接口文檔:http://localhost:8080/swagger-ui.html
調(diào)用登錄接口獲取token;
點擊右上角Authorize按鈕輸入token,然后訪問相關(guān)接口即可。
請求參數(shù)校驗
默認集成了Jakarta Bean Validation參數(shù)校驗框架,只需在參數(shù)對象屬性中添加javax.validation.constraints包中的注解注解即可實現(xiàn)校驗功能,這里以登錄參數(shù)校驗為例。
首先在登錄請求參數(shù)中添加@NotEmpty注解;
然后在登錄接口中添加@Validated注解開啟參數(shù)校驗功能即可。
項目地址:https://github.com/macrozheng/mall-tiny
有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)
歡迎大家關(guān)注Java之道公眾號
好文章,我在看??
總結(jié)
以上是生活随笔為你收集整理的还在从零开始搭建项目?手撸了款快速开发脚手架!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 别以为JDK8有了红黑树,HashMap
- 下一篇: VS Supercharger插件的破解