<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          還在從零開始搭建項目?手?jǐn)]了款快速開發(fā)腳手架!

          共 6724字,需瀏覽 14分鐘

           ·

          2020-09-28 10:25


          簡介

          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ù)版本說明
          SpringBoot2.3.0容器+MVC框架
          SpringSecurity5.3.2認(rèn)證和授權(quán)框架
          MyBatis3.5.4ORM框架
          MyBatis-Plus3.3.2MyBatis增強(qiáng)工具
          MyBatis-Plus Generator3.3.2數(shù)據(jù)層代碼生成器
          Swagger-UI2.9.2文檔生產(chǎn)工具
          Redis5.0分布式緩存
          Docker18.09.0應(yīng)用容器引擎
          Druid1.1.10數(shù)據(jù)庫連接池
          JWT0.9.0JWT登錄支持
          Lombok1.18.12簡化對象封裝工具

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

          • 化繁為簡,僅保留了權(quán)限管理功能相關(guān)的9張表,方便自由定制;

          • 數(shù)據(jù)庫源文件地址:https://github.com/macrozheng/mall-tiny/blob/master/sql/mall_tiny.sql

          使用流程

          環(huán)境搭建

          簡化依賴服務(wù),只需安裝最常用的MySql和Redis服務(wù)即可,服務(wù)安裝具體參考《mall在Windows環(huán)境下的部署》,數(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認(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

          項目運(yùn)行

          直接運(yùn)行啟動類MallTinyApplicationmain函數(shù)即可。

          業(yè)務(wù)代碼開發(fā)流程

          創(chuàng)建業(yè)務(wù)表

          創(chuàng)建好pms模塊的所有表,需要注意的是一定要寫好表字段的注釋,這樣實體類和接口文檔中就會自動生成字段說明了。

          使用代碼生成器

          運(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中提供的方法即可。

          比如我們的菜單管理業(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?{

          ????@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實現(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實現(xiàn),由于之前我們已經(jīng)生成了mapper.xml文件,所以我們直接在Mapper接口中定義好方法,然后在mapper.xml寫好SQL實現(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實現(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>

          項目部署

          mall-tiny已經(jīng)集成了Docker插件,可以打包成Docker鏡像來部署,具體參考:《使用Maven插件為SpringBoot應(yīng)用構(gòu)建Docker鏡像》

          其他說明

          SpringSecurity相關(guān)

          由于使用了SpringSecurity來實現(xiàn)認(rèn)證和授權(quán),部分接口需要token才可以訪問,訪問需要認(rèn)證授權(quán)接口流程如下。

          • 訪問Swagger-UI接口文檔:http://localhost:8080/swagger-ui.html

          • 調(diào)用登錄接口獲取token;

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

          請求參數(shù)校驗

          默認(rèn)集成了Jakarta Bean Validation參數(shù)校驗框架,只需在參數(shù)對象屬性中添加javax.validation.constraints包中的注解注解即可實現(xiàn)校驗功能,這里以登錄參數(shù)校驗為例。

          • 首先在登錄請求參數(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ù)校驗功能即可。
          /**
          ?*?后臺用戶管理
          ?*?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);
          ????}
          }

          項目地址

          開源不易,覺得項目有幫助的點個Star支持下吧!

          https://github.com/macrozheng/mall-tiny


          瀏覽 152
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲天天干 | 影音先锋女人av 影音先锋女人资源 | 免费看黄色国产一级片 | 伊人伊人在线 | 高清无码成人电影 |