spring cloud+vue在线视频网站 5.分页功能+增加章节

news/2024/5/20 14:16:14/文章来源:https://blog.csdn.net/Mosiclone/article/details/109212326

1 分页功能开发

首先集成分页功能需要先在 Maven 中添加 pagehelper 依赖,然后在 ChapterService 中添加 pagehelper 的设置,接着试一下分页功能是否生效。后面添加分页功能的具体细节,第一修改成后端接收分页要求,第二修改前端分页布局,第三修改前端请求。

1 添加依赖

首先在 course 的 pom.xml 文件中添加依赖和版本

	<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.10</version></dependency>

然后在 service 模块中的 pom.xml 添加

	<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId></dependency>

2 添加设置

在 ChapterService 的 list 类第一句添加PageHelper.startPage(1,1);即可,访问 http://127.0.0.1:9002/business/admin/chapter/list 即可看到只返回了一条记录。

1 添加后端 pageDto
package com.course.server.dto;import java.util.List;public class PageDto<T> {//当前页码protected int page;//每页条数protected int size;//总条数protected long total;protected List<T> list;public long getTotal() {return total;}@Overridepublic String toString() {return "PageDto{" +"page=" + page +", size=" + size +", total=" + total +", list=" + list +'}';}public List<T> getList() {return list;}public void setList(List<T> list) {this.list = list;}public void setTotal(long total) {this.total = total;}public int getPage() {return page;}public void setPage(int page) {this.page = page;}public int getSize() {return size;}public void setSize(int size) {this.size = size;}
}
2 调整后端 Controller Service 层

这里调用后端查询的方法是,前端先传入分页的参数 page 和 size;接着后端先查询出结果,然后将结果传给 PageInfo 实例,实例对结果进行分页处理后再赋给 PageDto 返回前端。
修改 ChapterController 层代码如下:

package com.course.business.controller.admin;import com.course.server.dto.PageDto;
import com.course.server.service.ChapterService;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;@RestController
@RequestMapping("/admin/chapter")
public class ChapterController {@Resourceprivate ChapterService chapterService;@RequestMapping("/list")public PageDto list(@RequestBody PageDto pageDto){chapterService.list(pageDto);return pageDto;}
}

这里如果在 list 的传入函数中不加 @RequestBody 是接收不到传入的数据的。

ChapterService 代码如下:

package com.course.server.service;import com.course.server.domain.Chapter;
import com.course.server.domain.ChapterExample;
import com.course.server.dto.ChapterDto;
import com.course.server.dto.PageDto;
import com.course.server.mapper.ChapterMapper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import com.github.pagehelper.PageHelper;@Service
public class ChapterService {@Resourceprivate ChapterMapper chapterMapper;public void list(PageDto pageDto){PageHelper.startPage(pageDto.getPage(),pageDto.getSize());ChapterExample chapterExample = new ChapterExample();List<Chapter> chapterList = chapterMapper.selectByExample(chapterExample);PageInfo<Chapter> pageInfo = new PageInfo<>(chapterList);pageDto.setTotal(pageInfo.getTotal());List<ChapterDto> chapterDtosList = new ArrayList<>();for (int i = 0; i < chapterList.size(); i++) {Chapter chapter = chapterList.get(i);ChapterDto chapterDto = new ChapterDto();BeanUtils.copyProperties(chapter,chapterDto);chapterDtosList.add(chapterDto);}pageDto.setList(chapterDtosList);}
}
3 调整前端 chapter.vue

之前的 chapter 点击查询会直接返回所有结果,并不需要传给后端参数,所以直接用 get 请求。现在前端需要传递给后端 page 和 size 分页参数,所以需要用 post 请求,修改 method 中的 list 方法如下:

 methods: {list(page) {let _this = this;console.log(page, _this.$refs.pagination.size),_this.$ajax.post('http://127.0.0.1:9000/business/admin/chapter/list',{page: 1,size: 1}).then((response)=>{console.log(response);_this.chapters = response.data.list;})}}

这时刷新会显示一条记录。

3 调整前端布局

这里添加了刷新按钮,和页面选择按钮。然后将 page 属性和选择的页面按钮绑定在一起,默认为1;将 size 属性和选择每页显示的数据条数绑定在一起,默认为10。
在 component 包中添加 pagination.vue 文件,代码如下:

<template><div class="pagination" role="group" aria-label="分页"><button type="button" class="btn btn-default btn-white btn-round"v-bind:disabled="page === 1"v-on:click="selectPage(1)">1</button><button type="button" class="btn btn-default btn-white btn-round"v-bind:disabled="page === 1"v-on:click="selectPage(page - 1)">上一页</button><button v-for="p in pages" v-bind:id="'page-' + p"type="button" class="btn btn-default btn-white btn-round"v-bind:class="{'btn-primary active':page == p}"v-on:click="selectPage(p)">{{p}}</button><button type="button" class="btn btn-default btn-white btn-round"v-bind:disabled="page === pageTotal"v-on:click="selectPage(page + 1)">下一页</button><button type="button" class="btn btn-default btn-white btn-round"v-bind:disabled="page === pageTotal"v-on:click="selectPage(pageTotal)">{{pageTotal||1}}</button>&nbsp;<span class="m--padding-10">每页<select v-model="size"><option value="1">1</option><option value="5">5</option><option value="10">10</option><option value="20">20</option><option value="50">50</option><option value="100">100</option></select>条,共【{{total}}】条</span></div>
</template><script>export default {name: 'pagination',props: {list: {type: Function,default: null},itemCount: Number // 显示的页码数,比如总共有100页,只显示10页,其它用省略号表示},data: function () {return {total: 0, // 总行数size: 10, // 每页条数page: 0, // 当前页码pageTotal: 0, // 总页数pages: [], // 显示的页码数组}},methods: {/*** 渲染分页组件* @param page* @param total*/render(page, total) {let _this = this;_this.page = page;_this.total = total;_this.pageTotal = Math.ceil(total / _this.size);_this.pages = _this.getPageItems(_this.pageTotal, page, _this.itemCount || 5);},/*** 查询某一页* @param page*/selectPage(page) {let _this = this;if (page < 1) {page = 1;}if (page > _this.pageTotal) {page = _this.pageTotal;}if (this.page !== page) {_this.page = page;if (_this.list) {_this.list(page);}}},/*** 当前要显示在页面上的页码* @param total* @param current* @param length* @returns {Array}*/getPageItems(total, current, length) {let items = [];if (length >= total) {for (let i = 1; i <= total; i++) {items.push(i);}} else {let base = 0;// 前移if (current - 0 > Math.floor((length - 1) / 2)) {// 后移base = Math.min(total, current - 0 + Math.ceil((length - 1) / 2)) - length;}for (let i = 1; i <= length; i++) {items.push(base + i);}}return items;}}}
</script><style scoped>.pagination {vertical-align: middle !important;font-size: 16px;margin-top: 0;margin-bottom: 10px;}.pagination button {margin-right: 5px;}.btn-primary.active {background-color: #2f7bba !important;border-color: #27689d !important;color: white !important;font-weight: 600;}/*.pagination select {*//*vertical-align: middle !important;*//*font-size: 16px;*//*margin-top: 0;*//*}*/
</style>

同时修改 chapter.vue 中 login 函数,添加 pagination 组件并显示,修改后代码如下:

<template><div><p><button v-on:click="list(1)" class="btn btn-white btn-default btn-round"><i class="ace-icon fa fa-refresh red2"></i>refresh</button></p><pagination ref="pagination" v-bind:list="list"></pagination><table id="simple-table" class="table  table-bordered table-hover"...></div></template><script>import Pagination from "../../components/pagination";export default {components:{Pagination},name: "chapter",data: function(){return{chapters:[]}},mounted: function(){let _this = this;_this.list(1);},methods: {list(page) {let _this = this;console.log(page, _this.$refs.pagination.size),_this.$ajax.post('http://127.0.0.1:9000/business/admin/chapter/list',{page: page,size: _this.$refs.pagination.size}).then((response)=>{console.log(response);_this.chapters = response.data.list;_this.$refs.pagination.render(page, response.data.total)})}}}
</script>

这时可以选择页数刷新,成功显示出数据。
在这里插入图片描述

2 增加章节

下面我们增加一个增加章节的功能。首先需要在前端增加添加的页面,这里选择 bootstrap 中的表单和填出层,进行一些修改;然后在 chapter.vue 中增加 save 函数请求后端保存章节;最后在后端增加保存功能。

1 添加增加组件

有些组件可以直接去全局 CSS 样式复制了修改,这里用了模态框和表单的例子来修改。

在这里插入图片描述

表单修改后代码如下:

<div id="form-modal" class="modal fade" tabindex="-1" role="dialog"><div class="modal-dialog" role="document"><div class="modal-content"><div class="modal-header"><button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button><h4 class="modal-title">表单</h4></div><div class="modal-body"><form class="form-horizontal"><div class="form-group"><label class="col-sm-2 control-label">名称</label><div class="col-sm-10"><input v-model="chapter.name" class="form-control" placeholder="名称"></div></div><div class="form-group"><label class="col-sm-2 control-label">课程ID</label><div class="col-sm-10"><input v-model="chapter.courseId" class="form-control" placeholder="课程ID"></div></div></form></div><div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal">Close</button><button type="button" v-on:click="save()" class="btn btn-primary">Save changes</button></div></div><!-- /.modal-content --></div><!-- /.modal-dialog --></div><!-- /.modal -->

同时在刷新按钮旁边新增一个 add 按钮。代码如下:

            <button v-on:click="add()" class="btn btn-white btn-default btn-round"><i class="ace-icon fa fa-edit red2"></i>add</button>&nbsp;

2 前端

点击 add 按钮时,模态框显示;点击 save 按钮后将表单数据传给后端,如果成功保存,则将页面关闭并显示第一页。

 add() {$("#form-modal").modal("show");},save(page) {let _this = this;console.log(page);_this.$ajax.post('http://127.0.0.1:9000/business/admin/chapter/save',_this.chapter).then((response)=>{console.log("保存大章结果",response);let res = response.data;if(res.success){$("#form-modal").modal("hide");_this.list(1);}})}

3 后端添加

在 Controller 层和 Service 层添加 save 功能的对应代码。
Controller 层代码如下:

    @RequestMapping("/save")public ChapterDto save(@RequestBody ChapterDto chapterDto){chapterDto.setId(UuidUtil.getShortUuid());chapterService.save(chapterDto);return chapterDto;}

Service 层代码如下:

public void save(ChapterDto chapterDto){Chapter chapter = new Chapter();BeanUtils.copyProperties(chapterDto,chapter);chapterMapper.insert(chapter);}

其中后端增加了工具类 CopyUtil 和 UuidUtil 类。CopyUtil 功能是复制实例内容到新的实例中,一般用在 domain 类和 dto 类转换。UuidUtil 功能是生成 8位 id,这里在 save 方法中用到了。

CopyUtil

package com.course.server.util;import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;import java.util.ArrayList;
import java.util.List;public class CopyUtil {public static <T> List<T> copyList(List source, Class<T> clazz) {List<T> target = new ArrayList<>();if (!CollectionUtils.isEmpty(source)){if (!CollectionUtils.isEmpty(source)){for (Object c: source) {T obj = copy(c, clazz);target.add(obj);}}}return target;}public static <T> T copy(Object source, Class<T> clazz) {if (source == null) {return null;}T obj = null;try {obj = clazz.newInstance();} catch (Exception e) {e.printStackTrace();}BeanUtils.copyProperties(source, obj);return obj;}
}

UuidUtil

package com.course.server.util;import java.util.UUID;public class UuidUtil {public static String[] chars = new String[] { "a", "b", "c", "d", "e", "f","g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s","t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5","6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I","J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V","W", "X", "Y", "Z" };/*** 获取短UUID* @return*/public static String getShortUuid() {StringBuffer shortBuffer = new StringBuffer();String uuid = UuidUtil.getUuid();for (int i = 0; i < 8; i++) {String str = uuid.substring(i * 4, i * 4 + 4);int x = Integer.parseInt(str, 16);shortBuffer.append(chars[x % 0x3E]); // 对62取余}return shortBuffer.toString();}/*** 获得32位UUID*/public static String getUuid(){String uuid = UUID.randomUUID().toString();//去掉“-”符号return uuid.replaceAll("-", "");}public static void main(String[] args) {System.out.println(getUuid());}
}

同时,为了前后端数据交互数据的统一,新增了一个 responsedto 类。

package com.course.server.dto;public class ResponseDto<T> {/*** 业务上的成功或失败*/private boolean success = true;/*** 返回码*/private String code;/*** 返回信息*/private String message;/*** 返回泛型数据,自定义类型*/private T content;public String getCode() {return code;}public void setCode(String code) {this.code = code;}public boolean getSuccess() {return success;}public void setSuccess(boolean success) {this.success = success;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public T getContent() {return content;}public void setContent(T content) {this.content = content;}@Overridepublic String toString() {final StringBuffer sb = new StringBuffer("ResponseDto{");sb.append("success=").append(success);sb.append(", code='").append(code).append('\'');sb.append(", message='").append(message).append('\'');sb.append(", content=").append(content);sb.append('}');return sb.toString();}
}

这里将 Controller 层的返回统一改为 ResponseDto 类型,代码如下:

package com.course.business.controller.admin;import com.course.server.dto.ChapterDto;
import com.course.server.dto.PageDto;
import com.course.server.dto.ResponseDto;
import com.course.server.service.ChapterService;
import com.course.server.util.UuidUtil;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;@RestController
@RequestMapping("/admin/chapter")
public class ChapterController {@Resourceprivate ChapterService chapterService;@RequestMapping("/list")public ResponseDto list(@RequestBody PageDto pageDto){chapterService.list(pageDto);ResponseDto responseDto = new ResponseDto();responseDto.setContent(pageDto);return responseDto;}@RequestMapping("/save")public ResponseDto save(@RequestBody ChapterDto chapterDto){chapterDto.setId(UuidUtil.getShortUuid());chapterService.save(chapterDto);ResponseDto responseDto = new ResponseDto();responseDto.setContent(chapterDto);return responseDto;}
}

总结

以上就完成了分页功能和增加章节功能的增加,并且将工具类封装在一起,还统一了后端返回给前端的数据类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_894729.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring cloud+vue在线视频网站 6.章节编辑删除功能、前端优化和校验模块

这一节增加了大章的编辑和删除功能&#xff0c;这样大章的增删改查功能就都有了&#xff0c;但是在增加和修改时应该还要有校验功能。 编辑功能 这一节主要对大章模块增加编辑功能&#xff0c;其次还删除一些多余组件。首先&#xff0c;我们将多余对按钮进行了删除&#xff0…

spring cloud+vue在线视频网站 7.代码生成模块 part 1

这一章主要是完成代码生成的模块&#xff0c;用到的工具是 freemaker &#xff0c;在完成代码生成模块的同时会完成小节部分的代码。 freemaker 的基本用法 一般来说一个 freemaker 的模版基本会包括下面四部分。 文本:直接输出的部分 注释:<#–2333–>格式部分,不会输…

网站检测方式个人总结

这几天看架构看的头晕&#xff0c;觉得有点看不下去了 换个心情&#xff0c;等状态调整过来再继续看 趁这个时间休息一些&#xff0c;也正好把之前学过的知识做一个总结。 首先表明立场 这只是一个总结 并不是教大家什么 我的水平没有那么高 这是一个提醒自己的备忘 但是如果有…

用了2周时间,终于把Python网站开发库大全整理完了

用了 2 周的时间整理了 Python 中所有的网站开发库&#xff08;下文简称&#xff1a;Web 框架&#xff09;&#xff0c;供大家学习参考。 相关文件 小伙伴们可以关注小编的Python源码、问题解答&学习交流群&#xff1a;733089476 有很多的资源可以白嫖的哈&#xff0c;需…

今天给大家介绍一下~我学习 Python 的 三个神级网站

今天来给大家介绍三个我在学习 Python 路上帮助比较大的堪称神级的网站&#xff0c;尤其是对于刚刚入门的同学来说&#xff0c;绝对不容错过~ 相关文件 小伙伴们可以关注小编的Python源码、问题解答&学习交流群&#xff1a;733089476 有很多的资源可以白嫖的哈&#xff0…

WEB网站加速CND加速工作原理

转自&#xff1a;https://blog.csdn.net/5hongbing/article/details/78025349 通过传统的未加缓存服务的访问过程与加缓存服务的访问过程对比&#xff0c;了解CDN缓存访问方式与未加缓存访问方式的差别。 1.传统访问过程(未加速缓存服务) 访问未使用CDN缓存后的网站的过程&…

逛Github网站显示中文教程

打开Github对于看不懂英文的孩子来说刚打开官网就尬住了&#xff0c;后来逛了很多网站才发现一个方法可以将网站的部分内容转换为中文&#xff0c;虽然说是部分的&#xff0c;但是也够用了差不多。下面放教程。 1.找到自己浏览器安装扩展插件的地方&#xff0c;我测试的360浏览…

三日娱乐活动之——建立自己的网站

目录 云服务器搭建SSH登陆LNMP环境的搭建Nginx的设置小节总结 网页的编写CSS的调用php文件上传小节总结 云服务器搭建 我用的是阿里云的学生机&#xff0c;自己娱乐娱乐够用了&#xff0c;稍微懂点Linux的知识&#xff0c;选择Centos7的系统就可以耍了。 SSH登陆 我直接用密…

Vs2010创建网站

1.打开VS2010&#xff0c;新建——网站——ASP.Net空网站。 2.创建网站后你会发现你的项目并没有.sln结尾的文件&#xff0c;像这样。 事实上项目的.sln文件保存到了C:\Users\zjs\Documents\Visual Studio 2010\Projects 我一般会把这个.sln文件拷贝到项目所对应的文件夹目录。…

公安内网部署网站出现500.19-Internal Server Error

今天去桂林叠彩分局&#xff0c;帮他们部署一个内网平台的网站。去了机房&#xff0c;windowserver2012系统已装好。我本想我的工作会很快弄完。无非就是在这个系统上安装一个oracle数据库&#xff0c;然后在iis部署一个网站&#xff0c;网站能呈现数据就ok了。Oracle数据库安装…

我的网站收入

建站有好几个月了&#xff0c;但申请google adsense和阿里妈妈并且成功通过却是上个月的事情。到目前为止&#xff0c;google adsense帐户的估算总收入为1.79美元&#xff0c;阿里妈妈的收入为2.52元&#xff0c;看到这里&#xff0c;或者很多读者都会嗤之以鼻&#xff0c;甚至…

没有网站也能网赚

如果你能持之以恒&#xff0c;而且文档质量高的话&#xff0c;那么月入过万也不是没有可能的。 2009年5月&#xff0c;我在建站的过程中为了找点资料&#xff0c;通过搜索引擎搜索到了豆丁&#xff0c;还记得当时是为了搜索关于google map的资料&#xff0c;很多地方都没有找到…

前端常见SEO注意事项

前端开发工程师不仅需要要跟视觉设计师、交互式设计师配合&#xff0c;完美还原设计图稿&#xff0c;编写兼容各大浏览器、加载速度快、用户体验好的页面。现在还需要跟SEO人员配合&#xff0c;调整页面的代码结构和标签。 一些成熟的平台&#xff0c;在开发初期并没有考虑优化…

精通Web Analytics 2.0 (3) 第一章:网站分析的新奇世界

精通Web Analytics 2.0 &#xff08;3&#xff09; 第一章&#xff1a;网站分析的新奇世界 精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第一章&#xff1a;Web Analytics 2.0的新奇世界 多年以来&#xff0c;我们很清楚的知道&#xff0c;网站分析能够真正的改革网络…

精通Web Analytics 2.0 (12) 第十章:针对潜在的网站分析陷阱的最佳解决方案

精通Web Analytics 2.0 &#xff08;12&#xff09; 第十章&#xff1a;针对潜在的网站分析陷阱的最佳解决方案 精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第十章&#xff1a;针对潜在的网站分析陷阱的最佳解决方案 是时候去处理网站分析中最棘手的一些问题了&…

学习Python一定要知道的八个网站,看看你知道几个

导语 最近很多人问我有没有可以跟着学习的网站&#xff0c;一个人学没方向&#xff0c;老是不知道该怎么学习&#xff0c;我今天就把自己知道的几个网站分享给大家&#xff0c;那些问我的小伙伴可以根据这个去找自己喜欢的网站哦! python是一个编程语言&#xff0c;相比其他的…

阿里云ECS建站全流程(Debian)

1. 购买域名和ECS服务器 2. 环境配置 2.1 官方教程位置 这里是按照官网上的教程进行的&#xff0c;入口如下图所示&#xff1a; 官网的教程就不抄下来了&#xff0c;看官网就行。本文章只记载官网内容之外需要补充的操作。 2.2 安装yum 因为购买服务器时选择的Debian&…

sqlmap如何用dirsearch.py协助--os -shell拿到目标网站shell

本文为博主原创文章首发于FreeBuf→https://www.freebuf.com/sectool/256588.html SQLMAP sqlmap是一个开源渗透测试工具&#xff0c; 它可以自动检测和利用SQL注入漏洞并接管数据库服务器。它具有强大的检测引擎&#xff0c;同时有众多功能&#xff0c;包括数据库指纹识别、从…

超棒的五个在线学习web编程的网站

超棒的五个在线学习web编程的网站 http://www.gbtags.com/gb/share/2523.htm# 如果你需要给自己冲冲电而又没有时间的话&#xff0c;使用一些在线学习编程的网站&#xff0c;利用一些碎片时间来学习提高自己的话&#xff0c;今天这篇文章肯定能够帮你大忙&#xff0c;本文里我…