逻辑 前端操作: 管理员在页面顶部输入框输入教师姓名(可不填) 选择每页显示多少条数据(默认5条) 点击”查询”按钮或翻页时触发查询
后端处理: 接收参数:页码、每页条数、教师姓名(可选) 核心处理逻辑:if(有教师姓名){
执行模糊查询:select * from teacher where name like '%张%'
} else {
查全部教师:select * from teacher
}
自动分页(PageHelper插件处理)
结果返回: 成功:返回当前页的教师列表 + 总条数
失败:返回错误提示
关键点说明: 不填姓名就查所有教师 输入姓名就按姓名模糊匹配(比如搜”张”会找出”张三”、”张伟”等) 翻页时会自动带原来的查询条件 每页条数可以随时调整
技术要点说明 分页实现: 使用PageHelper插件,通过startPage()自动拦截后续查询 返回PageInfo对象包含分页信息(total/pageNum等)
条件查询: 根据teacher.name是否为空决定查询方式 模糊查询使用MySQL的concat('%',#{name},'%')语法
前后端交互: 前端传递pageNum/pageSize/name参数 后端返回包含list和total的封装结构
前端 1 2 3 4 5 6 <div class ="card" style ="margin-bottom: 5px" > <el-input v-model ="data.name" style ="width: 300px; margin-right: 10px" placeholder ="请输入教师姓名" > </el-input > <el-button type ="primary" @click ="load" > 查询</el-button > <el-button type ="info" @click ="reset" > 重置</el-button > </div >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <el-table :data ="data.tableData" stripe > <el-table-column label ="用户名" prop ="username" > </el-table-column > <el-table-column label ="头像" prop ="avatar" > </el-table-column > <el-table-column label ="名称" prop ="name" > </el-table-column > <el-table-column label ="性别" prop ="sex" > </el-table-column > <el-table-column label ="职称" prop ="title" > </el-table-column > <el-table-column label ="角色" prop ="role" > </el-table-column > <el-table-column label ="操作" align ="center" width ="160" > <template #default ="scope" > <el-button type ="primary" @click ="handleEdit(scope.row)" > 编辑</el-button > <el-button type ="danger" @click ="handleDelete(scope.row.id)" > 删除</el-button > </template > </el-table-column > </el-table > <div class ="card" > <el-pagination background layout ="prev, pager, next" v-model:page-size ="data.pageSize" v-model:current-page ="data.pageNum" :total ="data.total" @current-change = "changePage" /> </div >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 <script setup> //导包 import {reactive} from "vue"; import request from "@/utils/request"; import {ElMessage} from "element-plus"; const data = reactive({ // 教师信息弹窗对话框 formVisible: false, // 教师信息表单数据 form: { }, // 教师信息表格数据的数组,初始为空数组 tableData: [], // 分页查询的页码 pageNum: 1, // 分页查询的每页显示的记录数 pageSize: 5, // 分页查询的总记录数,初始为0 total: 0, // 教师姓名 name: null, }); const load = () => { // 调用后端接口查询教师信息 // 这里可以使用axios或者其他请求库发送请求 // 例如:axios.get('/api/teacher/selectPage', { params: { pageNum: data.pageNum, pageSize: data.pageSize } }) request.get('/teacher/selectPage',{//请求路径 params:{//查询条件 pageNum: data.pageNum,//页码 pageSize: data.pageSize, //每页显示的记录数 name: data.name,//教师姓名 } } ).then(res => { if (res.code === '200') { // 将查询到的教师信息数据赋值给tableData // res.data?.list 是一个数组,包含了查询到的教师信息数据 // ?是一个可选链操作符,用于安全地访问对象的属性,如果对象为null或undefined,则不会抛出错误,而是返回undefined data.tableData = res.data?.list // 将查询到的总记录数赋值给total data.total = res.data?.total }else { // 查询失败,提示用户 ElMessage.error(res.msg) } }) } // 分页查询,点击页码触发,改变页码,触发load() const changePage = (pageNum) => { data.pageNum = pageNum //页码 load() } const reset = () => { // 重置查询条件 data.name = null // 重新加载教师信息 load() } load() </script>
f12网络查看数据,是否请求成功
后端 TeacherController 1 2 3 4 5 6 7 8 9 10 11 12 13 @GetMapping("selectPage") public Result selectPage (Teacher teacher, @RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "5") Integer pageSize) { PageInfo<Teacher> pageInfo = teacherService.selectPage(teacher,pageNum,pageSize); return Result.success(pageInfo); }
TeacherService 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public PageInfo<Teacher> selectPage (Teacher teacher,Integer pageNum, Integer pageSize) { List<Teacher> list; PageHelper.startPage(pageNum,pageSize); if (ObjectUtil.isNotEmpty(teacher.getName())){ list = teacherMapper.selectByName(teacher.getName()); }else { list = teacherMapper.selectAll(); } return PageInfo.of(list); }
TeacherMapper 1 2 3 4 5 6 7 @Select("select * from teacher") List<Teacher> selectAll () ; @Select("select * from teacher where name like concat('%',#{name},'%')") List<Teacher> selectByName (String name) ;