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

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

          共 6349字,需瀏覽 13分鐘

           ·

          2020-09-13 10:19

          簡介
          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)境搭建

          簡化依賴服務(wù),只需安裝最常用的MySql和Redis服務(wù)即可,數(shù)據(jù)庫中需要導(dǎo)入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)行

          直接運(yùn)行啟動類MallTinyApplicationmain函數(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中提供的方法即可。
          比如我們的菜單管理業(yè)務(wù)實(shí)現(xiàn)類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)目部署

          mall-tiny已經(jīng)集成了Docker插件,可以打包成Docker鏡像來部署

          其他說明

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

          項(xiàng)目地址:https://github.com/macrozheng/mall-tiny



          有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)

          歡迎大家關(guān)注Java之道公眾號


          好文章,我在看??

          瀏覽 54
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(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>
                  免费观看大黄网站 | 盗摄偷窥系列7777777 | 持级黄色免费看黄色片 | 亚洲电影天堂在线 | 五月色在线视频 |