Skip to main content

一、后端

1、TeacherService

接口

public Map<String, Object> pageListWeb(Page<Teacher> pageParam);

实现

@Override
public Map<String, Object> pageListWeb(Page<Teacher> pageParam) {

QueryWrapper<Teacher> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc("sort");

baseMapper.selectPage(pageParam, queryWrapper);

List<Teacher> records = pageParam.getRecords();
long current = pageParam.getCurrent();
long pages = pageParam.getPages();
long size = pageParam.getSize();
long total = pageParam.getTotal();
boolean hasNext = pageParam.hasNext();
boolean hasPrevious = pageParam.hasPrevious();

Map<String, Object> map = new HashMap<String, Object>();
map.put("items", records);
map.put("current", current);
map.put("pages", pages);
map.put("size", size);
map.put("total", total);
map.put("hasNext", hasNext);
map.put("hasPrevious", hasPrevious);

return map;
}

2、TeacherController

@ApiOperation(value = "分页讲师列表")
@GetMapping(value = "{page}/{limit}")
public R pageList(
@ApiParam(name = "page", value = "当前页码", required = true)
@PathVariable Long page,

@ApiParam(name = "limit", value = "每页记录数", required = true)
@PathVariable Long limit){

Page<Teacher> pageParam = new Page<Teacher>(page, limit);

Map<String, Object> map = teacherService.pageListWeb(pageParam);

return R.ok().data(map);
}

3、swagger测试

二、前端列表js

1、创建api

创建文件夹api,api下创建teacher.js,用于封装讲师模块的请求

import request from '@/utils/request'
const api_name = '/edu/teacher'
export default {
getPageList(page, limit) {
return request({
url: `${api_name}/${page}/${limit}`,
method: 'get'
})
}
}

2、讲师列表组件中调用api

pages/teacher/index.vue

<script>
import teacher from "@/api/teacher"
export default {
asyncData({ params, error }) {
return teacher.getPageList(1, 8).then(response => {
console.log(response.data.data);
return { data: response.data.data }
});
},
};
</script>

三、页面渲染

1、页面模板

<template>
<div id="aCoursesList" class="bg-fa of">
<!-- 讲师列表 开始 -->
<section class="container">
<section class="c-sort-box unBr">
<div>
<!-- 无数据提示 开始-->

<!-- /无数据提示 结束-->

<!-- 数据列表 开始-->

<!-- /数据列表 结束-->
</div>
<!-- 公共分页 开始 -->

<!-- /公共分页 结束 -->
</section>
</section>
<!-- /讲师列表 结束 -->
</div>
</template>

2、无数据提示

添加:v-if="data.total==0"

<!-- /无数据提示 开始-->
<section class="no-data-wrap" v-if="data.total==0">
<em class="icon30 no-data-ico">&nbsp;</em>
<span class="c-666 fsize14 ml10 vam">没有相关数据,小编正在努力整理中...</span>
</section>
<!-- /无数据提示 结束-->

3、列表

<!-- /数据列表 开始-->
<article v-if="data.total>0" class="i-teacher-list">
<ul class="of">
<li v-for="item in data.items" :key="item.id">
<section class="i-teach-wrap">
<div class="i-teach-pic">
<a :href="'/teacher/'+item.id" :title="item.name">
<img :src="item.avatar" :alt="item.name" height="142" hright="142">
</a>
</div>
<div class="mt10 hLh30 txtOf tac">
<a :href="'/teacher/'+item.id" :title="item.name" class="fsize18 c-666">{{ item.name }}</a>
</div>
<div class="hLh30 txtOf tac">
<span class="fsize14 c-999" >{{ item.career }}</span>
</div>
<div class="mt15 i-q-txt">
<p class="c-999 f-fA">{{ item.intro }}</p>
</div>
</section>
</li>
</ul>
<div class="clear"/>
</article>
<!-- /数据列表 结束-->

4、测试

四、分页

1、分页方法

methods: {
gotoPage(page){
teacher.getPageList(page, 8).then(response => {
this.data = response.data.data
})
}
}

2、分页页面渲染

<!-- 公共分页 开始 -->
<div>
<div class="paging">
<!-- undisable这个class是否存在,取决于数据属性hasPrevious -->
<a
:class="{undisable: !data.hasPrevious}"
href="#"
title="首页"
@click.prevent="gotoPage(1)">首</a>
<a
:class="{undisable: !data.hasPrevious}"
href="#"
title="前一页"
@click.prevent="gotoPage(data.current-1)">&lt;</a>
<a
v-for="page in data.pages"
:key="page"
:class="{current: data.current == page, undisable: data.current == page}"
:title="'第'+page+'页'"
href="#"
@click.prevent="gotoPage(page)">{{ page }}</a>
<a
:class="{undisable: !data.hasNext}"
href="#"
title="后一页"
@click.prevent="gotoPage(data.current+1)">&gt;</a>
<a
:class="{undisable: !data.hasNext}"
href="#"
title="末页"
@click.prevent="gotoPage(data.pages)">末</a>
<div class="clear"/>
</div>
</div>
<!-- 公共分页 结束 -->

3、测试