名师列表功能
分页查询名师接口
controller 层
在 service_edu 模块中,controller包下的front包下创建类:
@RestController
@RequestMapping("/eduservice/teacherfront")
@CrossOrigin
public class TeacherFrontController {
@Autowired
private EduTeacherService teacherService;
/**
* 分页查询讲师的方法
* @param page 页数
* @param limit 每页记录数
* @return
*/
@ApiOperation("分页查询讲师的方法")
@PostMapping("getTeacherFrontList/{page}/{limit}")
public R getTeacherFrontList(@PathVariable("page") long page, @PathVariable("limit") long limit) {
Page<EduTeacher> pageTeacher = new Page<>(page, limit);
Map<String, Object> map = teacherService.getTeacherFrontList(pageTeacher);
// 返回分页所有数据
return R.ok().data(map);
}
}
service 层
public interface EduTeacherService extends IService<EduTeacher> {
// 分页查询讲师的方法
Map<String, Object> getTeacherFrontList(Page<EduTeacher> pageTeacher);
}
实现类:
@Service
public class EduTeacherServiceImpl extends ServiceImpl<EduTeacherMapper, EduTeacher> implements EduTeacherService {
// 分页查询讲师的方法
@Override
public Map<String, Object> getTeacherFrontList(Page<EduTeacher> pageTeacher) {
QueryWrapper<EduTeacher> wrapper = new QueryWrapper<>();
wrapper.orderByDesc("id");
// 把分页数据封装到 pageTeacher 对象
baseMapper.selectPage(pageTeacher, wrapper);
List<EduTeacher> records = pageTeacher.getRecords();
long current = pageTeacher.getCurrent();
long pages = pageTeacher.getPages();
long size = pageTeacher.getSize();
long total = pageTeacher.getTotal();
boolean hasNext = pageTeacher.hasNext();
boolean hasPrevious = pageTeacher.hasPrevious();
// 把分页数据获取出来放到 map
Map<String, Object> map = new HashMap<>();
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;
}
}
整合前端页面
(1)在 api 目录下创建 teacher.js 文件,定义接口地址
import request from '@/utils/request'
export default{
// 分页查询讲师的方法
getTeacherList(page, limit) {
return request({
url: `/eduservice/teacherfront/getTeacherFrontList/${page}/${limit}`,
method: 'post'
})
}
}
(2)在页面引入 js 文件,调用方法实现显示
**修改 pages/teacher/index.vue **
<template>
<div id="aCoursesList" class="bg-fa of">
<!-- 讲师列表 开始 -->
<section class="container">
<header class="comm-title all-teacher-title">
<h2 class="fl tac">
<span class="c-333">全部讲师</span>
</h2>
<section class="c-tab-title">
<a id="subjectAll" title="全部" href="#">全部</a>
<!-- <c:forEach var="subject" items="${subjectList }">
<a id="${subject.subjectId}" title="${subject.subjectName }" href="javascript:void(0)" οnclick="submitForm(${subject.subjectId})">${subject.subjectName }</a>
</c:forEach>-->
</section>
</header>
<section class="c-sort-box unBr">
<div>
<!-- /无数据提示 开始-->
<section class="no-data-wrap" v-if="data.total == 0">
<em class="icon30 no-data-ico"> </em>
<span class="c-666 fsize14 ml10 vam">没有相关数据,小编正在努力整理中...</span>
</section>
<!-- /无数据提示 结束-->
<article v-if="data.total > 0" class="i-teacher-list">
<ul class="of">
<li v-for="teacher in data.items" :key="teacher.id" >
<section class="i-teach-wrap">
<div class="i-teach-pic">
<a :href="'/teacher/' + teacher.id" :title="teacher.name" target="_blank">
<img :src="teacher.avatar" :alt="teacher.name" style="height: 141.3px">
</a>
</div>
<div class="mt10 hLh30 txtOf tac">
<a :href="'/teacher/' + teacher.id" :title="teacher.name" target="_blank" class="fsize18 c-666">
{{ teacher.name }}
</a>
</div>
<div class="hLh30 txtOf tac">
<span class="fsize14 c-999">{{ teacher.intro }}</span>
</div>
<div class="mt15 i-q-txt">
<p class="c-999 f-fA">{{ teacher.career }}</p>
</div>
</section>
</li>
</ul>
<div class="clear"></div>
</article>
</div>
<!-- 公共分页 开始 -->
<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)"><</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)">></a>
<a :class="{ undisable: !data.hasNext }" href="#" title="末页" @click.prevent="gotoPage(data.pages)">末页</a>
<div class="clear" />
</div>
</div>
<!-- 公共分页 结束 -->
</section>
</section>
<!-- /讲师列表 结束 -->
</div>
</template>
<script>
import teacherApi from '@/api/teacher'
export default {
//异步调用,调用一次
//params: 相当于之前 this.$route.params.id 等价 params.id
asyncData({ params, error }) {
return teacherApi.getTeacherList(1, 8)
.then(response => {
//this.data = response.data.data
return { data: response.data.data }
})
},
methods: {
//分页切换的方法
//参数是页码数
gotoPage(page) {
teacherApi.getTeacherList(page, 8)
.then(response => {
this.data = response.data.data
})
}
}
};
</script>
讲师详情功能
讲师详情接口
controller 层
TeacherFrontController
@Autowired
private EduCourseService courseService;
@ApiOperation("查询讲师详情信息")
@GetMapping("getTeacherFrontInfo/{teacherId}")
public R getTeacherFrontInfo(@PathVariable String teacherId) {
// 1、根据讲师 id 查询讲师基本信息
EduTeacher eduTeacher = teacherService.getById(teacherId);
// 2、根据讲师 id 查询讲师所讲课程
QueryWrapper<EduCourse> wrapper = new QueryWrapper<>();
wrapper.eq("teacher_id", teacherId);
List<EduCourse> courseList = courseService.list(wrapper);
return R.ok().data("teacher", eduTeacher).data("courseList", courseList);
}
前端整合
api/teacher.js 添加方法
// 查询讲师详情
getTeacherInfo(teacherId) {
return request({
url: `/eduservice/teacherfront/getTeacherFrontInfo/${teacherId}`,
method: 'get'
})
}
pages/teacher/_id.vue
<template>
<div id="aCoursesList" class="bg-fa of">
<!-- 讲师介绍 开始 -->
<section class="container">
<header class="comm-title">
<h2 class="fl tac">
<span class="c-333">讲师介绍</span>
</h2>
</header>
<div class="t-infor-wrap">
<!-- 讲师基本信息 -->
<section class="fl t-infor-box c-desc-content">
<div class="mt20 ml20">
<section class="t-infor-pic">
<img :src="teacher.avatar" style="width: 256px; margin: auto;">
</section>
<h3 class="hLh30">
<span class="fsize24 c-333">{{ teacher.name }}
{{ teacher.level === 1 ? '高级讲师' : '首席讲师' }}
</span>
</h3>
<section class="mt10">
<span class="t-tag-bg">{{ teacher.intro }}</span>
</section>
<section class="t-infor-txt">
<p class="mt20">{{ teacher.career }}</p>
</section>
<div class="clear"></div>
</div>
</section>
<div class="clear"></div>
</div>
<section class="mt30">
<div>
<header class="comm-title all-teacher-title c-course-content">
<h2 class="fl tac">
<span class="c-333">主讲课程</span>
</h2>
<section class="c-tab-title">
<a href="javascript: void(0)"> </a>
</section>
</header>
<!-- /无数据提示 开始-->
<section class="no-data-wrap" v-if="courseList.length == 0">
<em class="icon30 no-data-ico"> </em>
<span class="c-666 fsize14 ml10 vam">没有相关数据,小编正在努力整理中...</span>
</section>
<!-- /无数据提示 结束-->
<article class="comm-course-list">
<ul class="of">
<li v-for="course in courseList" :key="course.id">
<div class="cc-l-wrap">
<section class="course-img">
<img :src="course.cover" class="img-responsive">
<div class="cc-mask">
<a href="#" title="开始学习" target="_blank" class="comm-btn c-btn-1">开始学习</a>
</div>
</section>
<h3 class="hLh30 txtOf mt10">
<a href="#" :title="course.title" target="_blank" class="course-title fsize18 c-333">
{{ course.title }}
</a>
</h3>
</div>
</li>
</ul>
<div class="clear"></div>
</article>
</div>
</section>
</section>
<!-- /讲师介绍 结束 -->
</div>
</template>
<script>
import teacherApi from '@/api/teacher'
export default {
//params.id获取路径id值
asyncData({ params, error }) {
return teacherApi.getTeacherInfo(params.id)
.then(response => {
return {
teacher: response.data.data.teacher,
courseList: response.data.data.courseList
}
})
}
};
</script>