学成在线day06,课程管理实战,PageHelper 分页插件原理,数据字典
需求1:需要分页显示,我的课程,并且显示图片,(暂时不用显示图片)
要求做出来的效果:
上边的查询要实现分页、会存在多表关联查询,所以建议使用mybatis实现我的课程查询。
1.2 API 接口
输入参数:
页码、每页显示个数、查询条件
输出结果类型:
QueryResponseResult,这里面包括,操作状态的代码,和分页数据响应
@GetMapping("/coursebase/list/{page}/{size}")
//查询课程列表,参数为:当前页码,每页显示条数,和一个备用的扩展参数
QueryResponseResult findCourseList(int page, int size, CourseListRequest courseListRequest);
1.3课程管理服务
PageHelper 分页插件原理
参考使用的代码:注意,分页插件的起始页码是1,不是0
//用PageHelper查询课程列表的分页数据,参数为:当前页码,每页显示条数,扩展参数
public QueryResult<CourseInfo> findCourseList(int page, int size,CourseListRequest courseListRequest) {
if (courseListRequest==null){
//如果扩展参数为空,就new一个,免得后面取值出现报错
courseListRequest = new CourseListRequest();
}
if (page < 0){
//进来的页面,要是小于0,就是非法参数,默认查第一页
//PageHelper,的分页起始为1,不是0
page = 1;
}
if (size < 0){
//进来的显示条数,要是小于0,就是非法参数,默认查5条
size = 5;
}
//启动分页插件,并且设置页码和显示条数
PageHelper.startPage(page,size);
//执行写好的sql方法
Page<CourseInfo> courseListPage = courseMapper.findCourseList(courseListRequest);
//QueryResult<CourseInfo>组装这个返回的分页对象
//得到分页的数据集合
List<CourseInfo> courseInfoList = courseListPage.getResult();
//数据总条数
long total = courseListPage.getTotal();
QueryResult<CourseInfo> queryResult = new QueryResult<>();
queryResult.setTotal(total);
queryResult.setList(courseInfoList);
return queryResult;
}
开始搭建课程服务:
添加分页jar包
<!--mybatis分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
</dependency>
配置具体数据库的方言:
pagehelper: #指定分页插件使用的是什么数据库,好更换方言类型
helper‐dialect: mysql
写分页查询的Dao
//返回一个封装好的,page<CourseInfo>,CourseInfo是自定义的实体类,包含课程id,名称,图片
Page<CourseInfo> findCourseList(CourseListRequest courseListRequest);
写映射的mapper.xml:
<select id="findCourseList" parameterType="com.xuecheng.framework.domain.course.request.CourseListRequest"
resultType="com.xuecheng.framework.domain.course.ext.CourseInfo">
select a.id,a.name,b.pic from course_base as a left join course_pic as b on a.id = b.courseid
</select>
1.3.3 Service
定义CourseService.java类,用于课程管理的service定义:
//用PageHelper查询课程列表的分页数据,参数为:当前页码,每页显示条数,扩展参数
public QueryResult<CourseInfo> findCourseList(int page, int size,CourseListRequest courseListRequest) {
if (courseListRequest==null){
//如果扩展参数为空,就new一个,免得后面取值出现报错
courseListRequest = new CourseListRequest();
}
if (page < 0){
//进来的页面,要是小于0,就是非法参数,默认查第一页
//PageHelper,的分页起始为1,不是0
page = 1;
}
if (size < 0){
//进来的显示条数,要是小于0,就是非法参数,默认查5条
size = 5;
}
//启动分页插件,并且设置页码和显示条数
PageHelper.startPage(page,size);
//执行写好的sql方法
Page<CourseInfo> courseListPage = courseMapper.findCourseList(courseListRequest);
//QueryResult<CourseInfo>组装这个返回的分页对象
//得到分页的数据集合
List<CourseInfo> courseInfoList = courseListPage.getResult();
//数据总条数
long total = courseListPage.getTotal();
QueryResult<CourseInfo> queryResult = new QueryResult<>();
queryResult.setTotal(total);
queryResult.setList(courseInfoList);
return queryResult;
}
1.3.4 Controller
@GetMapping("/coursebase/list/{page}/{size}")
//查询课程列表,参数为:当前页码,每页显示条数,和一个备用的扩展参数
public QueryResponseResult findCourseList(@PathVariable("page") int page,@PathVariable("size") int size, CourseListRequest courseListRequest) {
System.err.println(page+size);
QueryResult<CourseInfo> courseList = courseService.findCourseList(page, size, courseListRequest);
//封装分页数据集合和总记录数的对象
QueryResult queryResult = new QueryResult();
//得到分页数据集合
queryResult.setList(courseList.getList());
// 得到总记录数
queryResult.setTotal(courseList.getTotal());
QueryResponseResult queryResponseResult = new QueryResponseResult(CommonCode.SUCCESS,queryResult);
return queryResponseResult;
}
1.3.5 测试
使用postman或swagger-ui测试课程列表接口。
前端不用改,直接使用:
实现添加课程的功能:
课程基础信息的表:
写Api,
//查询课程分类信息
@ApiOperation("查询添加课程的所有分类信息")
public CategoryNode findList();
dao 根据数据格式的分析,此查询需要返回树型数据格式,为了开发方便我们使用mybatis实现查询:
//查询课程的所有分类信息
CategoryNode findCategoryList();
<resultMap id="CategoryMap" type="com.xuecheng.framework.domain.course.ext.CategoryNode">
<id property="id" column="one_id"></id>
<result property="name" column="one_name"></result>
<result property="parentid" column="one_parentid"></result>
<collection property="children" ofType="com.xuecheng.framework.domain.course.ext.CategoryNode">
<id property="id" column="two_id"></id>
<result property="name" column="two_name"></result>
<result property="parentid" column="two_parentid"></result>
<collection property="children" ofType="com.xuecheng.framework.domain.course.ext.CategoryNode">
<id property="id" column="three_id"></id>
<result property="name" column="three_name"></result>
<result property="parentid" column="three_parentid"></result>
</collection>
</collection>
</resultMap>
<select id="findCategoryList" resultMap="CategoryMap">
select c1.id as one_id,c1.name as one_name,c1.parentid as one_parentid,
c2.id as two_id,c2.name as two_name,c2.parentid as two_parentid,c3.id as three_id,c3.name as three_name,c3.parentid as three_parentid from category as c1 left join category c2
on c1.id = c2.parentid left join category as c3 on c2.id = c3.parentid
where c1.parentid = '0'
order by
c1.orderby,c2.orderby,c3.orderby
</select>
Service 查级联课程信息的数据方法
//查询课程分类数据的方法
public CategoryNode findCategoryList(){
CategoryNode categoryList = courseMapper.findCategoryList();
return categoryList;
}
Controller
@RestController
@RequestMapping("category/")
public class CategoryController {
@Autowired
private CourseService courseService;
//查询课程分类信息
@GetMapping("/list")
public CategoryNode findCategoryList(){
CategoryNode categoryList = courseService.findCategoryList();
return categoryList;
}
}
数据字典
2.3.1介绍
在新增课程界面需要选择课程等级、课程状态等,这些信息统一采用数据字典管理的方式。
本项目对一些业务的分类配置信息,比如:课程等级、课程状态、用户类型、用户状态等进行统一管理,通过在数
据库创建数据字典表来维护这些分类信息。
数据字典对系统的业务分类进行统一管理,并且也可以解决硬编码问题,比如添加课程时选择课程等级,下拉框中
的课程等级信息如果在页面硬编码将造成不易修改维护的问题,所以从数据字典表中获取,如果要修改名称则在数
据字典修改即可,提高系统的可维护性
2.3.2 数据模型
在mongodb中创建数据字典表sys_dictionary
具体参数字典信息如下:
字段说明如下:
d_name:字典名称
d_type:字典分类
d_value:字典数据
sd_name:项目名称
sd_id:项目id
sd_status:项目状态(1:可用,0不可用)
数据模型类:
@Data
@ToString
@Document(collection = "sys_dictionary")
public class SysDictionary {
@Id
private String id;
@Field("d_name")
private String dName;
@Field("d_type")
private String dType;
@Field("d_value")
private List<SysDictionaryValue> dValue;
}
写字典查询接口
API接口
@Api(value="功能等级的参数配置",description = "配置字典的取得")
public interface CmsSysDictionaryControllerApi {
@ApiOperation("根据课程功能等级代码查询等级,代码200")
public SysDictionary findSysDictionary(String type);
}
Dao字典模块:
在cms模块下创建数据库的dao、service等类。
public interface CmsSysDictionaryRepository extends MongoRepository<SysDictionary,String> {
public SysDictionary findByDType(String type);
}
Service
//查询课程等级,传进来的是课程的等级代码,如课程是200
public SysDictionary findSysDictionary(String type){
SysDictionary byDType = cmsSysDictionaryRepository.findByDType(type);
return byDType;
}
Controller
@RestController
@RequestMapping("/sys")
public class CmsSysDictionaryController implements CmsSysDictionaryControllerApi {
@Autowired
private PageService pageService;
@GetMapping("/dictionary/get/{dtype}")
public SysDictionary findSysDictionary(@PathVariable String dtype){
SysDictionary sysDictionary = pageService.findSysDictionary(dtype);
return sysDictionary;
}
}
新增课程基本信息的需求:
API 接口
创建课程添加提交接口:
添加课程的dao
public interface CourseBaseRepository extends JpaRepository<CourseBase,String> {
}
Service 新增课程基础信息:
//新增课程基础信息
@Transactional
public void addCourse(CourseBase courseBase){
courseBaseRepository.save(courseBase);
}
controller
//新增基础课程
@Override
@PostMapping("/coursebase/add")
public ResponseResult addCourseBase(@RequestBody CourseBase courseBase) {
System.err.println(courseBase);
courseService.addCourse(courseBase);
//保存成功
return ResponseResult.SUCCESS();
}
3 课程信息修改
课程添加成功进入课程管理页面,通过课程管理页面修改课程的基本信息、编辑课程图片、编辑课程营销信息等。
本小节实现修改课程。