若依管理系統源碼分析-分頁的實現以及post請求時的分頁


場景

官方示例分頁實現

前端調用實現

// 一般在查詢參數中定義分頁變量
queryParams: {
  pageNum: 1,
  pageSize: 10
},

// 頁面添加分頁組件,傳入分頁變量
<pagination
  v-show="total>0"
  :total="total"
  :page.sync="queryParams.pageNum"
  :limit.sync="queryParams.pageSize"
  @pagination="getList"
/>

// 調用后台方法,傳入參數 獲取結果
listUser(this.queryParams).then(response => {
    this.userList = response.rows;
    this.total = response.total;
  }
);

后台邏輯實現

@PostMapping("/list")
@ResponseBody
public TableDataInfo list(User user)
{
    startPage();  // 此方法配合前端完成自動分頁
    List<User> list = userService.selectUserList(user);
    return getDataTable(list);
}

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi
關注公眾號
霸道的程序猿
獲取編程相關電子書、教程推送與免費下載。

實現

使用若依自動生成的代碼

前端使用pagination控件,基於Bootstrap的輕量級表格插件 BootstrapTable

    <pagination
      v-show="total>0"
      :total="total"
      :page.sync="queryParams.pageNum"
      :limit.sync="queryParams.pageSize"
      @pagination="getList"
    />

其中pageNum代表當前頁號,即第幾頁,pageSize代表每頁顯示的條數。

將此倆個參數封裝進queryParams對象中,此對象也包含前端要傳遞給后端的查詢參數。

首先要對此查詢對象進行聲明

      // 查詢參數
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        gh: undefined,
        xm: undefined,
        lxyf: undefined,
      },

並且給pageNum和pageSize設置默認值,其他參數是綁定的查詢參數,比如工號、姓名等。

上面分頁控件的進行分頁時會執行getList方法,此方法是請求后台數據的方法。

在此方法中

    getList() {
      listLxsz(this.queryParams).then((response) => {
        this.lxszList = response.rows;
        this.total = response.total;
      });
    },

調用js接口方法的listLxsz方法並將查詢參數對象作為參數傳遞。

其中就包含分頁所需的兩個參數。

來到js對應的方法listLxsz中

export function listLxsz(query) {
  return request({
    url: '/kqgl/lxsz/list',
    method: 'get',
    params: query
  })
}

 

其中request是封裝的axios的對象,用來發送請求。

這里是get請求並且傳遞了查詢參數對象。

來到SpringBoot對應的接口中

    @GetMapping("/list")
    public TableDataInfo list(KqLxsz kqLxsz)
    {
        startPage();
        List<KqLxsz> list = kqLxszService.selectKqLxszList(kqLxsz);
        return getDataTable(list);
    }

 

后台需要調用startPage方法,並且此方法必須放在查詢出數據的前一行。

list是后台查詢的需要返回前端的數據,此方法必須放在此查詢之前。

進入到startPage方法中

    protected void startPage()
    {
        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize))
        {
            String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
            PageHelper.startPage(pageNum, pageSize, orderBy);
        }
    }

 

分析:

最終是調用的MyBatis的PageHelper來進行分頁,只需要給其傳遞分頁所需的兩個參數和排序字段即可。

那么這兩個分頁參數時來自pageDomain這個實體類。

進入到生成這個實體類的方法TableSupport.buildPageRequest中

    public static PageDomain buildPageRequest()
    {
        return getPageDomain();
    }

 

返回的是getPageDomain這個方法的返回值,進入到該方法

    public static PageDomain getPageDomain()
    {
        PageDomain pageDomain = new PageDomain();
        pageDomain.setPageNum(ServletUtils.getParameterToInt(PAGE_NUM));
        pageDomain.setPageSize(ServletUtils.getParameterToInt(PAGE_SIZE));
        pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN));
        pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC));
        return pageDomain;
    }

 

可以看到此實體類的分頁的參數是從工具類ServletUtils中獲取的參數

其中ServletUtils是客戶端工具類

package com.ruoyi.common.utils;

import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.ruoyi.common.core.text.Convert;

/**
 * 客戶端工具類
 * 
 * @author ruoyi
 */
public class ServletUtils
{
    /**
     * 獲取String參數
     */
    public static String getParameter(String name)
    {
        return getRequest().getParameter(name);
    }

    /**
     * 獲取String參數
     */
    public static String getParameter(String name, String defaultValue)
    {
        return Convert.toStr(getRequest().getParameter(name), defaultValue);
    }

    /**
     * 獲取Integer參數
     */
    public static Integer getParameterToInt(String name)
    {
        return Convert.toInt(getRequest().getParameter(name));
    }

    /**
     * 獲取Integer參數
     */
    public static Integer getParameterToInt(String name, Integer defaultValue)
    {
        return Convert.toInt(getRequest().getParameter(name), defaultValue);
    }

    /**
     * 獲取request
     */
    public static HttpServletRequest getRequest()
    {
        return getRequestAttributes().getRequest();
    }

    /**
     * 獲取response
     */
    public static HttpServletResponse getResponse()
    {
        return getRequestAttributes().getResponse();
    }

    /**
     * 獲取session
     */
    public static HttpSession getSession()
    {
        return getRequest().getSession();
    }

    public static ServletRequestAttributes getRequestAttributes()
    {
        RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
        return (ServletRequestAttributes) attributes;
    }

    /**
     * 將字符串渲染到客戶端
     * 
     * @param response 渲染對象
     * @param string 待渲染的字符串
     * @return null
     */
    public static String renderString(HttpServletResponse response, String string)
    {
        try
        {
            response.setStatus(200);
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            response.getWriter().print(string);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 是否是Ajax異步請求
     * 
     * @param request
     */
    public static boolean isAjaxRequest(HttpServletRequest request)
    {
        String accept = request.getHeader("accept");
        if (accept != null && accept.indexOf("application/json") != -1)
        {
            return true;
        }

        String xRequestedWith = request.getHeader("X-Requested-With");
        if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1)
        {
            return true;
        }

        String uri = request.getRequestURI();
        if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml"))
        {
            return true;
        }

        String ajax = request.getParameter("__ajax");
        if (StringUtils.inStringIgnoreCase(ajax, "json", "xml"))
        {
            return true;
        }
        return false;
    }
}
獲取分頁參數時調用的getParameterToInt定義如下

    /**
     * 獲取Integer參數
     */
    public static Integer getParameterToInt(String name)
    {
        return Convert.toInt(getRequest().getParameter(name));
    }

 

調用了getRequest方法,此方法定義如下

    /**
     * 獲取request
     */
    public static HttpServletRequest getRequest()
    {
        return getRequestAttributes().getRequest();
    }

 

此方法是獲取request請求參數

而request請求對象是來自會話session,所以在getRequestAttributes中

    public static ServletRequestAttributes getRequestAttributes()
    {
        RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
        return (ServletRequestAttributes) attributes;
    }

 

所以最終在進行get請求時,直接將分頁參數作為參數傳遞給后台即可。

因為在get請求時會將參數拼接在url中,這樣后台就能從請求中獲取分頁參數並傳遞給MyBatis的

pageHelper實現分頁。

如果是post請求那,post請求時傳遞的是一個實體,如果將分頁參數放在實體中,則后台沒法通過請求獲取分頁參數。

可以通過在post請求的url中添加分頁參數實現

比如在如下前端請求時

    getList() {
      listDdjl(this.queryParams).then((response) => {
        this.ddjlList = response.rows;
        this.total = response.total;
        this.loading = false;
      });
    },

 

最終調用請求數據的方法

export function listDdjl(query) {
  return request({
    url: '/kqgl/ddjl/getListBySx?pageNum='+query.pageNum+'&pageSize='+query.pageSize,
    method: 'post',
    data: query
  })
}

 

請求方式是post請求,分頁參數存放在實體中,可以通過在url中手動拼接分頁參數的方式進行傳遞分頁參數。


免責聲明!

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



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