從零開始的SpringBoot前後端分離入門級專案(七)

Alfalfa99發表於2020-09-25

一個很正經的目錄!

分頁引數PageParamDTO

在我們進行分頁查詢的時候,我們經常需要對其中的某些欄位進行某種排序(升序,降序)。那麼前端每次都需要傳送不同的引數,甚至不同個數的引數,這就對後端如何接受引數有所要求,有時候可能直接將排序規則拼接在字串中如下

@PathVariable("/findAll/{id}/{DESC}")

那麼這就是對id的降序排序,但是我們需要思考一個問題,分頁和排序一般需要幾個引數

  1. 當前頁數是哪一頁
  2. 每頁展示幾條資料
  3. 待排序的欄位
  4. 排序的方式
    如果都是用請求地址拼接或者請求引數的方式未免有些許繁瑣,我們不如將其進行抽象,通過一個DTO,在需要進行分頁或分頁並排序的操作時由前端傳送給後臺,請在model.dto下新建PageParamDTO,內容如下
/**
 * @Author Alfalfa99
 * @Date 2020/9/18 13:33
 * @Version 1.0
 * 分頁查詢DTO
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageParamDTO {
    /**
     * cp: 當前頁數
     * ps: 每一頁的資料條數
     * order: 需要排序的欄位-排序的方式(asc:升序,desc:降序)
     */
    @NotNull(message = "當前頁數不能為空")
    private Integer cp;
    @NotNull(message = "每頁條數不能為空")
    private Integer ps;
    private Map<String,String> order;
}

當然我們拿到了裝載著待排序欄位和排序規則的map之後還需要進行一系列的判斷並拼接成字串,最後放到PageHelper中使用。
編寫PageParamCheckUtil

/**
 * @Author Alfalfa99
 * @Date 2020/9/17 20:23
 * @Version 1.0
 * 檢查分頁引數
 */
@Component
public class PageParamCheckUtil {

    public String CheckOrder(Map<String, String> map) {
        StringBuilder finalOrder = new StringBuilder();
        //判斷map是否為空
        if (map != null && !map.isEmpty()) {
            //讀取map中的所有待排序欄位及其排序方法
            for (String s : map.keySet()) {
                //把待排序欄位加入finalOrder
                finalOrder.append(s);
                String order = map.getOrDefault(s, "asc").toLowerCase();
                if ("desc".equals(order)) {
                    finalOrder.append(" " + order + ",");
                } else {
                    finalOrder.append(" asc,");
                }
            }
            finalOrder.deleteCharAt(finalOrder.length() - 1);
        }
        return finalOrder.toString();
    }
}

這裡要注意,如果map為空請不要把空格拼接進去,不然Mybatis在執行時會報錯。
那麼我就是用一個例項來進行測試吧(這裡就不仔細闡述在哪裡新增程式碼了,大家懂的都懂)

//UserDao
    /**
     * 查詢所有使用者
     *
     * @return
     */
    @Select("SELECT * FROM tb_user")
    List<User> findAllUser();
//UserService
    private final PageParamCheckUtil ppC; //需要先注入該工具類
    /**
     * 查詢所有使用者
     *
     * @return 返回使用者列表
     */
    public PageResult<User> findAllUser(PageParamDTO ppDTO) {
        Page<Object> page = PageHelper.startPage(ppDTO.getCp(), ppDTO.getPs(), ppC.CheckOrder(ppDTO.getOrder()));
        List<User> allUser = adminDao.findAllUser();
        return new PageResult<>(page.getPages(), page.getTotal(), allUser);
    }

在進行查詢之前使用PageHelper.startPage(當前頁數,每頁條數,排序規則)方法,即可幫我們自動排序並分頁,page.getPages() 用來返回該分頁引數下一共會有多少頁, page.getTotal()用來獲得總的資料條數。我們使用前文說過的分頁結果類進行包裝 ,返回到Controller層進行處理。

    @PostMapping("/findAllUser")
    public CommonResult<PageResult<User>> findAllUser(@Valid @RequestBody PageParamDTO ppDTO) {
        PageResult<User> allUser = adminService.findAllUser(ppDTO);
        return new CommonResult<>(20000, "OK", allUser);
    }

首先我們先往User表中插入數條資料(為了便於檢視效果,我們在這裡就不使用Postman進行新增使用者操作,而是直接通過SQLYog向表中插入資料):
在這裡插入圖片描述
然後啟動專案(先在攔截器配置類中放行相關介面)使用 postman進行如下測試:
在這裡插入圖片描述

可以看到我們成功的把四條記錄都已經查詢出來,在這裡各位讀者也可以自行修改cp,ps的引數來體驗一下不同的分頁規則,我們更主要的是要測試一下能否正常排序:
通過id降序
在這裡插入圖片描述
通過id升序
在這裡插入圖片描述
通過id降序,如果id相同則通過nickname升序

在這裡插入圖片描述
大家可以在資料庫中多插入一些資料 ,然後自己嘗試一下相關的操作,通過PageParamDTO和PageParamCheckUtil我們不管前端傳入幾個待排序的欄位都可以進行便捷的排序啦!
其他的需求點都大同小異(CRUD),不再單獨編寫相關文章啦(其實就是我懶 )。

後記

本系列的文章到這裡已經臨近尾聲。由於水平有限時間匆忙,文章中難免出現紕漏與錯誤,專案構思時也有不足之處,希望看到這裡的你能夠對這個專案有自己的想法,同時也請各位讀者指出文章中的不足之處,筆者將一一改正!祝各位看到這裡的讀者今後寫碼之路一帆風順,永無BUG!我們下個系列再見~
後端的程式碼後續會整理髮布在我的GitHub中,如果有需要的讀者可以前往自取(求star求點贊!
點這裡前往我的GitHub
本次部落格的內容也到此為止了,如果對部落格內容有疑問可以私信聯絡筆者,如果這篇文章對你有用希望你能點一個贊,謝謝~

相關文章