Spring Boot + Spring Cloud 實現權限管理系統 后端篇(九):代碼整理優化


工程規划

為了統一配置和代碼解耦,我們對代碼重新進行了整理和規划。

重新規划后,代碼結構如下:

kitty-pom: 統一管理 Maven 版本,打包配置

kitty-common: 公共代碼模塊,主要放置工具類

kitty-core: 核心代碼模塊,主要封裝公共業務模塊

kitty-admin: 后台管理模塊,包含用戶、角色、菜單管理等

kitty-boot: Spring Boot 啟動模塊,包含一些全局配置信息

優化詳情

kitty-core

1. 新建 kitty-core 工程,把 kitty-admin 工程 page 包下的內容 遷移到 kitty-core 工程 page 包內。

2. 添加 kitty-common 依賴

<dependency>
    <groupId>com.louis</groupId>
    <artifactId>kitty-common</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

3. 添加統一控制器接口返回結果封裝 HttpResult

HttpResult.java

package com.louis.kitty.core.http;

public class HttpResult {

    private int code;
    private String msg;
    private Object data;
    
    public static HttpResult error() {
        return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知異常,請聯系管理員");
    }
    
    public static HttpResult error(String msg) {
        return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg);
    }
    
    public static HttpResult error(int code, String msg) {
        HttpResult r = new HttpResult();
        r.setCode(code);
        r.setMsg(msg);
        return r;
    }

    public static HttpResult ok(String msg) {
        HttpResult r = new HttpResult();
        r.setMsg(msg);
        return r;
    }
    
    public static HttpResult ok(Object data) {
        HttpResult r = new HttpResult();
        r.setData(data);
        return r;
    }
    
    public static HttpResult ok() {
        return new HttpResult();
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
    
}

4. 添加通用CURD接口

CurdService.java

package com.louis.kitty.core.service;

import java.util.List;

import com.louis.kitty.core.page.PageRequest;
import com.louis.kitty.core.page.PageResult;

/**
 * 通用CURD接口
 */
public interface CurdService<T> {

    /**
     * 保存操作
     * @param record
     * @return
     */
    int save(T record);
    
    /**
     * 更新操作
     * @param record
     * @return
     */
    int update(T record);
    
    /**
     * 刪除操作
     * @param record
     * @return
     */
    int delete(T record);
    
    /**
     * 批量刪除操作
     * @param entities
     */
    int delete(List<T> records);
    
    /**
     * 根據ID查詢
     * @param id
     * @return
     */
    T findById(Long id);
    
    /**
     * 分頁查詢
     * 這里統一封裝了分頁請求和結果,避免直接引入具體框架的分頁對象, 如MyBatis或JPA的分頁對象
     * 從而避免因為替換ORM框架而導致服務層、控制層的分頁接口也需要變動的情況,替換ORM框架也不會
     * 影響服務層以上的分頁接口,起到了解耦的作用
     * @param pageRequest 自定義,統一分頁查詢請求
     * @return PageResult 自定義,統一分頁查詢結果
     */
    PageResult findPage(PageRequest pageRequest);
    
}

5. 依賴父 pom

kitty-admin

1. 添加 kitty-common 依賴。

<dependency>
    <groupId>com.louis</groupId>
    <artifactId>kitty-common</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

2. 刪除 page 包內容。

3. 把 Controller 的返回結果替換為 HttpResult 。

4. Service 接口統一繼承 CurdService 接口。

 

5. 服務實現類,增刪改查通用代碼示例。

package com.louis.kitty.admin.sevice.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.louis.kitty.admin.dao.SysUserMapper;
import com.louis.kitty.admin.model.SysUser;
import com.louis.kitty.admin.sevice.SysUserService;
import com.louis.kitty.core.page.PageRequest;
import com.louis.kitty.core.page.PageResult;
import com.louis.kitty.core.page.PageUtils;

@Service
public class SysUserServiceImpl  implements SysUserService {

    @Autowired
    private SysUserMapper sysUserMapper;

    @Override
    public int save(SysUser record) {
        return sysUserMapper.insertSelective(record);
    }

    @Override
    public int update(SysUser record) {
        return sysUserMapper.updateByPrimaryKeySelective(record);
    }

    @Override
    public int delete(SysUser record) {
        return sysUserMapper.deleteByPrimaryKey(record.getUserId());
    }

    @Override
    public int delete(List<SysUser> records) {
        for(SysUser record:records) {
            delete(record);
        }
        return 1;
    }

    @Override
    public SysUser findById(Long id) {
        return sysUserMapper.selectByPrimaryKey(id);
    }


    @Override
    public PageResult findPage(PageRequest pageRequest) {
        return PageUtils.getPageResult(pageRequest, getPageInfo(pageRequest));
    }
    
    /**
     * 調用分頁插件完成分頁
     * @param pageQuery
     * @return
     */
    private PageInfo<SysUser> getPageInfo(PageRequest pageRequest) {
        int pageNum = pageRequest.getPageNum();
        int pageSize = pageRequest.getPageSize();
        PageHelper.startPage(pageNum, pageSize);
        List<SysUser> sysMenus = sysUserMapper.findPage();
        return new PageInfo<SysUser>(sysMenus);
    }

    @Override
    public List<SysUser> findAll() {
        return sysUserMapper.findAll();
    }

}

6. 依賴父 pom

kitty-boot

1. 添加 kitty-common 依賴。

<dependency>
    <groupId>com.louis</groupId>
    <artifactId>kitty-common</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

2. 依賴父 pom

kitty-pom

1. 新建 kitty-pom 工程,添加 pom.xml。

2. 添加預依賴,匯總版本屬性

3. 添加 Maven 子模塊,添加打包配置

分頁優化

對分頁功能重新進行了封裝,讓實現分頁功能極為快速簡便。

封裝之后,服務層調用示例(服務層一行代碼調用實現分頁):

方法1說明

如果遵守約定,DAO查詢方法為findPage,那么只需要傳入對應的Mapper, 調用MybatisPageHelper直接返回分頁數據即可。

方法2說明

如果方法名不為findPage,則傳入相應的方法名即可,還可以根據查詢參數過濾后進行分頁,如下面就是根據名詞name查詢菜單,並進行分頁。

    @Override
    public PageResult findPage(PageRequest pageRequest) {
     return MybatisPageHelper.findPage(pageRequest, sysMenuMapper); } @Override public PageResult findPageByName(PageRequest pageRequest, String name) { return MybatisPageHelper.findPage(pageRequest, sysMenuMapper, "findPageByName", name); }

MybatisPageHelper 統一封裝了分頁邏輯,在Dao層寫好之后,服務層只需要一行代碼就可以實現分頁功能。

這是怎么實現的呢,無非是先獲取查詢參數設置到分頁插件,然后利用反射調用Mapper對應的查詢方法,最后將結果封裝到PageResult返回。

MybatisPageHelper.java

package com.louis.kitty.core.page;

import java.util.List;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.louis.kitty.common.utils.ReflectionUtils;

/**
 * MyBatis 分頁查詢助手
 * @author Louis
 * @date Aug 19, 2018
 */
public class MybatisPageHelper {

    public static final String findPage = "findPage";
    
    /**
     * 分頁查詢, 約定查詢方法名為 “findPage” 
     * @param pageRequest 分頁請求
     * @param mapper Dao對象,MyBatis的 Mapper    
     * @param args 方法參數
     * @return
     */
    public static PageResult findPage(PageRequest pageRequest, Object mapper) {
        return findPage(pageRequest, mapper, findPage);
    }
    
    /**
     * 調用分頁插件進行分頁查詢
     * @param pageRequest 分頁請求
     * @param mapper Dao對象,MyBatis的 Mapper    
     * @param queryMethodName 要分頁的查詢方法名
     * @param args 方法參數
     * @return
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static PageResult findPage(PageRequest pageRequest, Object mapper, String queryMethodName, Object... args) {
        // 設置分頁參數
        int pageNum = pageRequest.getPageNum();
        int pageSize = pageRequest.getPageSize();
        PageHelper.startPage(pageNum, pageSize);
        // 利用反射調用查詢方法
        Object result = ReflectionUtils.invoke(mapper, queryMethodName, args);
        return getPageResult(pageRequest, new PageInfo((List) result));
    }

    /**
     * 將分頁信息封裝到統一的接口
     * @param pageRequest 
     * @param page
     * @return
     */
    private static PageResult getPageResult(PageRequest pageRequest, PageInfo<?> pageInfo) {
        PageResult pageResult = new PageResult();
        pageResult.setPageNum(pageInfo.getPageNum());
        pageResult.setPageSize(pageInfo.getPageSize());
        pageResult.setTotalSize(pageInfo.getTotal());
        pageResult.setTotalPages(pageInfo.getPages());
        pageResult.setContent(pageInfo.getList());
        return pageResult;
    }

}

 

編譯打包

選擇 kitty-pom 下的 pom.xml 進行打包。

參考資料

http://maven.apache.org

https://www.yiibai.com/maven/

源碼下載

后端:https://gitee.com/liuge1988/kitty

前端:https://gitee.com/liuge1988/kitty-ui.git


作者:朝雨憶輕塵
出處:https://www.cnblogs.com/xifengxiaoma/ 
版權所有,歡迎轉載,轉載請注明原文作者及出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM