工程規划
為了統一配置和代碼解耦,我們對代碼重新進行了整理和規划。
重新規划后,代碼結構如下:
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 進行打包。
參考資料
源碼下載
后端:https://gitee.com/liuge1988/kitty
前端:https://gitee.com/liuge1988/kitty-ui.git
作者:朝雨憶輕塵
出處:https://www.cnblogs.com/xifengxiaoma/
版權所有,歡迎轉載,轉載請注明原文作者及出處。