分页前后端完整代码

一、后端代码

User实体类要继承PageVo

package com.like.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.like.common.PageVo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)//当EqualsAndHashCode注解在类上,会自动为该类提供 hashCode() 和 equals() 方法。
@TableName("user")//@TableName 注解用来将指定的数据库表和 JavaBean 进行映射
public class User extends PageVo {
     private static final long serialVersionUID = 1L;
     /**
     id
     “value”:设置数据库字段值
     “type”:设置主键类型、如果数据库主键设置了自增建议使用“AUTO”
      */
     @TableId(value = "id",type = IdType.AUTO)
     private Long id;
     /**
      * 姓名
      */
     private String name;
     /**
      * 性别
      */
     private String sex;
     /**
      * 手机号
      */
     private String phone;
     /**
      * 头像
      */
     private String avatar;
}

getList方法修改为

@GetMapping("/getList")
     public CommonDto<PageDto<User>> getList(User user){
          CommonDto<PageDto<User>> commonDto = new CommonDto();
          PageDto<User> userList = userService.getList(user);
          commonDto.setContent(userList);
          return commonDto;
     }

service层也做修改

package com.like.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.like.common.PageDto;
import com.like.entity.User;
import java.util.List;

public interface UserService extends IService<User> {

     PageDto<User> getList(User user);
}
package com.like.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.like.common.PageDto;
import com.like.entity.User;
import com.like.mapper.UserMapper;
import com.like.service.UserService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

     @Resource
     private UserMapper userMapper;
     @Override
     public PageDto<User> getList(User user) {
          LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
          //判断前端是否传来有参数,如果有参数,就使用这个构造条件
          if (ObjectUtils.isNotEmpty(user.getName())) {
               lambdaQueryWrapper.like(User::getName,user.getName());
          }
          //封装分页条件
          Page<User> page = new Page<>(user.getPage(),user.getSize());
          //根据分页条件和查询条件来查询数据,并封装成selectPage对象
          Page<User> selectPage = userMapper.selectPage(page, lambdaQueryWrapper);
          //selectPage.getTotal()为符合条件的数据总数
          //selectPage.getRecords()为数据
          PageDto<User> userPageDto = new PageDto<>();
          userPageDto.setTotal(selectPage.getTotal());
          userPageDto.setList(selectPage.getRecords());
          return userPageDto;
     }
}

二、前端

修改完后端代码后,我们可以看到前端的数据不回显了,并且浏览器报错,这是正常的,因为pageDto中的数据前端没有传过来

可以这么写

 params:{
          name:this.query.name,  //参数让其等于输入框输入的name
          page:this.query.page,
          size:this.query.size
        }

再次刷新浏览器可以看到控制台中后台传过来的数据

在data.content.list中,并且total也有,所以修改为

 getUserList(){
      this.axios.get("http://localhost:3333/user/getList",{
        params:{
          name:this.query.name,  //参数让其等于输入框输入的name
          page:this.query.page,
          size:this.query.size
        }
      }).then((resp)=>{
        console.log(resp,'resp');
        this.tableData = resp.data.content.list;
        this.total =  resp.data.content.total;
      });
    }

那么如何让ElementUI的组件中显示出total数据呢,首先定义数据total,然后在标签中修改默认值

 

三、每页数据大小实现

现在我们来实现分页组件中的handleSizeChange和handleCurrentChange方法,从而实现每页数据大小的控制

我们可以看到,当选择每页条数的时候,控制台会打印条数,我们可以把这个参数传给后台,然后查询,具体做法如下

 methods: {
    handleEdit(index, row) {
      console.log(index, row);
    },
    handleDelete(index, row) {
      console.log(index, row);
    },
    handleSizeChange(val) {
      console.log(`每页 ${val} 条`);
      this.query.size = val;
      this.getUserList()
    },
    handleCurrentChange(val) {
      console.log(`当前页: ${val}`);
      this.query.page = val;
      this.getUserList()
    },
    getUserList(){
      this.axios.get("http://localhost:3333/user/getList",{
        params:{
          name:this.query.name,  //参数让其等于输入框输入的name
          page:this.query.page,
          size:this.query.size
        }
      }).then((resp)=>{
        console.log(resp,'resp');
        this.tableData = resp.data.content.list;
        this.total =  resp.data.content.total;
      });
    }
  },

先把这两个方法的val赋值给query的相关属性,然后调用get请求,前端就会传递新的query给后端,后端响应请求

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码: ```html <!DOCTYPE html> <html> <head> <title>Flask Pagination Example</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <h2>Flask Pagination Example</h2> <table class="table"> <thead> <tr> <th>ID</th> <th>Name</th> <th>Age</th> </tr> </thead> <tbody id="table-body"> </tbody> </table> <nav aria-label="Page navigation example"> <ul class="pagination"> <li class="page-item" id="prev-page"> <a class="page-link" href="#">Previous</a> </li> <li class="page-item" id="next-page"> <a class="page-link" href="#">Next</a> </li> </ul> </nav> </div> <script> function loadTableData(page=1) { $.ajax({ url: `/data?page=${page}`, type: "GET", dataType: "json", success: function(response) { $("#table-body").empty(); for (var i=0; i<response.data.length; i++) { var row = ` <tr> <td>${response.data[i].id}</td> <td>${response.data[i].name}</td> <td>${response.data[i].age}</td> </tr> `; $("#table-body").append(row); } $("#prev-page").toggleClass("disabled", response.prev_page_url == null); $("#next-page").toggleClass("disabled", response.next_page_url == null); $("#prev-page a").attr("href", response.prev_page_url); $("#next-page a").attr("href", response.next_page_url); } }); } $(document).ready(function() { loadTableData(); }); </script> </body> </html> ``` 后代码: ```python from flask import Flask, jsonify, render_template, request, url_for from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///example.db" app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) age = db.Column(db.Integer) @app.route("/") def index(): return render_template("index.html") @app.route("/data") def get_data(): page = request.args.get("page", 1, type=int) per_page = 10 users = User.query.paginate(page, per_page, False) data = [] for user in users.items: data.append({"id": user.id, "name": user.name, "age": user.age}) prev_page_url = url_for("get_data", page=users.prev_num) if users.has_prev else None next_page_url = url_for("get_data", page=users.next_num) if users.has_next else None return jsonify({ "data": data, "prev_page_url": prev_page_url, "next_page_url": next_page_url }) if __name__ == "__main__": db.create_all() db.session.add_all([ User(name="Alice", age=30), User(name="Bob", age=25), User(name="Charlie", age=35), User(name="David", age=40), User(name="Eve", age=28), User(name="Frank", age=32), User(name="Grace", age=27), User(name="Harry", age=45), User(name="Ivy", age=26), User(name="Jack", age=33), User(name="Kate", age=31), User(name="Lucy", age=29), User(name="Mike", age=37), User(name="Nancy", age=24), User(name="Oliver", age=36), User(name="Peter", age=34), User(name="Queenie", age=23), User(name="Robert", age=39), User(name="Sarah", age=41), User(name="Tom", age=38), User(name="Ursula", age=22), User(name="Victor", age=43), User(name="Wendy", age=42), User(name="Xavier", age=44), User(name="Yolanda", age=21), User(name="Zack", age=20) ]) db.session.commit() app.run(debug=True) ``` 在此示例中,我们使用 Flask 和 SQLAlchemy 来创建一个带有分页功能的 Web 应用程序。我们首先定义了一个 User 模型,它具有 id、name 和 age 属性。我们还定义了一个 /data 路由,它接受一个 page 参数来指示要检索哪一页的数据,以及一个 per_page 参数来指示每页要显示多少条记录。我们使用 SQLAlchemy 的 paginate() 方法来检索用户数据,并将其转换为 JSON 格式返回给客户。我们还根据是否有前一页和后一页来构建前分页器的链接。最后,我们在应用程序启动时插入一些示例用户数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值