還在從零開始搭建項(xiàng)目?手?jǐn)]了款快速開發(fā)腳手架!
mall-tiny是一款基于SpringBoot+MyBatis-Plus的快速開發(fā)腳手架,擁有完整的權(quán)限管理功能,可對接Vue前端,開箱即用。?
項(xiàng)目演示
mall-tiny項(xiàng)目可無縫對接mall-admin-web前端項(xiàng)目,秒變權(quán)限管理系統(tǒng)。前端項(xiàng)目地址:https://github.com/macrozheng/mall-admin-web
技術(shù)選型

數(shù)據(jù)庫表結(jié)構(gòu)

化繁為簡,僅保留了權(quán)限管理功能相關(guān)的9張表,方便自由定制;
使用流程
環(huán)境搭建
mall_tiny.sql腳本。開發(fā)規(guī)約
項(xiàng)目包結(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)實(shí)體類
|???????└──?service?--?該模塊相關(guān)業(yè)務(wù)處理類
└──?security?--?SpringSecurity認(rèn)證授權(quán)相關(guān)代碼
????├──?annotation?--?相關(guān)注解
????├──?aspect?--?相關(guān)切面
????├──?component?--?認(rèn)證授權(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é)果定義可以運(yùn)行代碼查看Swagger-UI的Api文檔:http://localhost:8080/swagger-ui.html

項(xiàng)目運(yùn)行
MallTinyApplication的main函數(shù)即可。業(yè)務(wù)代碼開發(fā)流程
創(chuàng)建業(yè)務(wù)表
創(chuàng)建好 pms模塊的所有表,需要注意的是一定要寫好表字段的注釋,這樣實(shí)體類和接口文檔中就會自動生成字段說明了。

使用代碼生成器
運(yùn)行 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提供的增強(qiáng)功能相當(dāng)強(qiáng)大,單表查詢幾乎不用手寫SQL,直接使用ServiceImpl和BaseMapper中提供的方法即可。
UmsMenuServiceImpl中的方法都直接使用了這些方法。/**
?*?后臺菜單管理Service實(shí)現(xiàn)類
?*?Created?by?macro?on?2020/2/2.
?*/
@Service
public?class?UmsMenuServiceImpl?extends?ServiceImpl<UmsMenuMapper,UmsMenu>implements?UmsMenuService?{
????@Override
????public?boolean?create(UmsMenu?umsMenu)?{
????????umsMenu.setCreateTime(new?Date());
????????updateLevel(umsMenu);
????????return?save(umsMenu);
????}
????@Override
????public?boolean?update(Long?id,?UmsMenu?umsMenu)?{
????????umsMenu.setId(id);
????????updateLevel(umsMenu);
????????return?updateById(umsMenu);
????}
????@Override
????public?Page?list(Long?parentId,?Integer?pageSize,?Integer?pageNum)? {
????????Page?page?=?new?Page<>(pageNum,pageSize);
????????QueryWrapper?wrapper?=?new?QueryWrapper<>();
????????wrapper.lambda().eq(UmsMenu::getParentId,parentId)
????????????????.orderByDesc(UmsMenu::getSort);
????????return?page(page,wrapper);
????}
????@Override
????public?List?treeList()? {
????????List?menuList?=?list();
????????List?result?=?menuList.stream()
????????????????.filter(menu?->?menu.getParentId().equals(0L))
????????????????.map(menu?->?covertMenuNode(menu,?menuList)).collect(Collectors.toList());
????????return?result;
????}
????@Override
????public?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實(shí)現(xiàn)類
?*?Created?by?macro?on?2020/2/2.
?*/
@Service
public?class?UmsMenuServiceImpl?extends?ServiceImpl<UmsMenuMapper,UmsMenu>implements?UmsMenuService?{
????@Override
????public?Page?list(Long?parentId,?Integer?pageSize,?Integer?pageNum)? {
????????Page?page?=?new?Page<>(pageNum,pageSize);
????????QueryWrapper?wrapper?=?new?QueryWrapper<>();
????????wrapper.lambda().eq(UmsMenu::getParentId,parentId)
????????????????.orderByDesc(UmsMenu::getSort);
????????return?page(page,wrapper);
????}
}
多表查詢
對于多表查詢,我們需要手寫mapper.xml中的SQL實(shí)現(xiàn),由于之前我們已經(jīng)生成了mapper.xml文件,所以我們直接在Mapper接口中定義好方法,然后在mapper.xml寫好SQL實(shí)現(xiàn)即可。
比如說我們需要寫一個根據(jù)用戶ID獲取其分配的菜單的方法,首先我們在 UmsMenuMapper接口中添加好getMenuList方法;
/**
?*?
?*?后臺菜單表?Mapper?接口
?*?
?*
?*?@author?macro
?*?@since?2020-08-21
?*/
public?interface?UmsMenuMapper?extends?BaseMapper<UmsMenu>?{
????/**
?????*?根據(jù)后臺用戶ID獲取菜單
?????*/
????List?getMenuList(@Param("adminId")?Long?adminId) ;
}
然后在 UmsMenuMapper.xml添加該方法的對應(yīng)SQL實(shí)現(xiàn)即可。
<mapper?namespace="com.macro.mall.tiny.modules.ums.mapper.UmsMenuMapper">
????<select?id="getMenuList"?resultType="com.macro.mall.tiny.modules.ums.model.UmsMenu">
????????SELECT
????????????m.id?id,
????????????m.parent_id?parentId,
????????????m.create_time?createTime,
????????????m.title?title,
????????????m.level?level,
????????????m.sort?sort,
????????????m.name?name,
????????????m.icon?icon,
????????????m.hidden?hidden
????????FROM
????????????ums_admin_role_relation?arr
????????????????LEFT?JOIN?ums_role?r?ON?arr.role_id?=?r.id
????????????????LEFT?JOIN?ums_role_menu_relation?rmr?ON?r.id?=?rmr.role_id
????????????????LEFT?JOIN?ums_menu?m?ON?rmr.menu_id?=?m.id
????????WHERE
????????????arr.admin_id?=?#{adminId}
??????????AND?m.id?IS?NOT?NULL
????????GROUP?BY
????????????m.id
????select>
????
mapper>
項(xiàng)目部署
其他說明
SpringSecurity相關(guān)
由于使用了SpringSecurity來實(shí)現(xiàn)認(rèn)證和授權(quán),部分接口需要token才可以訪問,訪問需要認(rèn)證授權(quán)接口流程如下。
訪問Swagger-UI接口文檔:http://localhost:8080/swagger-ui.html 調(diào)用登錄接口獲取token;

點(diǎn)擊右上角Authorize按鈕輸入token,然后訪問相關(guān)接口即可。

請求參數(shù)校驗(yàn)
默認(rèn)集成了 Jakarta Bean Validation參數(shù)校驗(yàn)框架,只需在參數(shù)對象屬性中添加javax.validation.constraints包中的注解注解即可實(shí)現(xiàn)校驗(yàn)功能,這里以登錄參數(shù)校驗(yàn)為例。
首先在登錄請求參數(shù)中添加 @NotEmpty注解;
/**
?*?用戶登錄參數(shù)
?*?Created?by?macro?on?2018/4/26.
?*/
@Data
@EqualsAndHashCode(callSuper?=?false)
public?class?UmsAdminLoginParam?{
????@NotEmpty
????@ApiModelProperty(value?=?"用戶名",required?=?true)
????private?String?username;
????@NotEmpty
????@ApiModelProperty(value?=?"密碼",required?=?true)
????private?String?password;
}
然后在登錄接口中添加 @Validated注解開啟參數(shù)校驗(yàn)功能即可。
/**
?*?后臺用戶管理
?*?Created?by?macro?on?2018/4/26.
?*/
@Controller
@Api(tags?=?"UmsAdminController",?description?=?"后臺用戶管理")
@RequestMapping("/admin")
public?class?UmsAdminController?{
????@ApiOperation(value?=?"登錄以后返回token")
????@RequestMapping(value?=?"/login",?method?=?RequestMethod.POST)
????@ResponseBody
????public?CommonResult?login(@Validated?@RequestBody?UmsAdminLoginParam?umsAdminLoginParam)?{
????????String?token?=?adminService.login(umsAdminLoginParam.getUsername(),?umsAdminLoginParam.getPassword());
????????if?(token?==?null)?{
????????????return?CommonResult.validateFailed("用戶名或密碼錯誤");
????????}
????????Map?tokenMap?=?new?HashMap<>();
????????tokenMap.put("token",?token);
????????tokenMap.put("tokenHead",?tokenHead);
????????return?CommonResult.success(tokenMap);
????}
}
有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)
歡迎大家關(guān)注Java之道公眾號
好文章,我在看??
評論
圖片
表情
