Spring Cloud + Vue前后端分离-第7章 核心业务功能开发

news2024/9/26 3:25:13

Spring Cloud + Vue前后端分离-第7章 核心业务功能开发

7-1 课程管理功能开发

课程管理页面美化

1.课程管理页面美化

demo-course.jpg

复制search.html中的部分代码

course.vue

看效果

测试一下新增修改删除效果

1.课程管理页面美化2

scoped:style下的样式只应用于当前组件,防止互相污染

课程管理与大章管理互相跳转

1.课程管理与大章管理互相跳转

完成功能:在课程列表中增加“大章”按钮,点击会跳转到大章页面,并且筛选出当前课程下所有的大章。大章页面增加显示课程名称,并有可以返回课程管理页面

local-storage.js

sessionStorage是会话缓存,浏览器窗口关闭,缓存就没了。localStorage是本地缓存,浏览器关闭后,下次再打开还能读到

session-storage.js

setItem自带的必须要求是string

localStorage和sessionStorage只能操作字符串,但是我们经常要放对象数据,所以封装一下

index.html

course.vue

组件(页面)间传输数据可以用h5原生的localStorage,sessionStorage;也可以用js全局变量;也可以用vuex stofe,但是后两者在页面刷新时会丢失数据,所以推荐使用h5原生的。

测试一下,点击大章,会跳转到大章页面

chapter.vue

null.name会报错,{}.name不会报错

简单的跳转可以用router-link(类似a标签),如果是有其它的操作,可以写个click方法。比如前面完成的,从课程跳到大章,需要先缓存课程信息,所以写click方法。

继续更改大章页面

1.大章管理保存和查询功能关联courseId

chapter.vue

ChapterPageDto.java

经验分享:service层到查询条件写得松一点,灵活一点。service 层可能被多个controller 调用,也可能被其它service 调用,每个调用的查询条件可能不一样。

ChapterService.java

controller 需要严格一点,根据前端的业务,校验参数

ChapterController.java

测试(我是后面重启了一下,又更新出来的)

大章管理与小节管理互相跳转

1.大章管理与小节管理互相跳转

2.小节管理保存和查询功能关联courseId,chapterId

chapter.vue

section.vue

SectionPageDto.java

SectionController.java

 service 同样写的灵活一些,查询条件根据参数是否为空来判断

SectionService.java

criteria 类似于写where 条件

测试

7-2 课程时长的保存和显示

保存节时,更新课程总时长

1.保存节时,更新课程总时长

2.增加自定义mapper

时长不应该是手输的,后续在介绍视频文件上传时,会介绍到怎么自动获取视频时长

自定义的mapper和自动生成的mapper分开存放

MyCourseMapper.xml

MyCourseMapper.java

代码规范小提示:SectionService 不要直接调用course 的mapper,而是调用平级的CourseService.

CourseService.java

SectionService.java

保存小节时,不管是新增还是修改,都更新课程总时长

application.properties

增加事务处理

1.增加事务配置

一次操作会更新或修改多张表,一般为了保证数据一致,需要增加事务处理。

TransactionManagementConfig.java

SectionService.java 

SectionController.java 

数据保存进数据库了,说明事务没有回滚,事务不起作用。

自定义异常一般可以选择继承RuntimeException  

同一个类的内部方法互相调用,methodA调用methodB,methodB事务不起作用。Spring的事务处理是利用AOP生成动态代理类,内部方法调用时不经过代理类,所以事务不生效。

把代码调整好,然后进行提交

增加时长格式化filter

1.增加时长格式化filter formatSecond

 filter.js

 course.vue

section.vue

7-3 分类管理功能开发 

分类表设计和基本代码生成

1.分类表设计和基本代码生成

all.sql

generatorConfig.xml

然后生成持久层mybatis-generator、ServerGenerator、VueGenerator

admin.vue

router.js

  service.ftl

要执行生成器,不能有编译报错

再次运行

分类二级列表查询与显示

1.分类列表查询与显示,左右两个表格

做成左右两个表格,左边是一级分类,右边是二级分类。点击一级分类时,显示对应的二级分类

分类总数不多,不需要分页,一次查询全部数据,由前端来处理显示

CategoryService.java

CategoryController.java

 vue.ftl

category.vue

list->all,并且没有参数

 点击一行的任何位置,显示二级分类

问题1:点击刷新时,level1数据出现重复。

问题2:level2的刷新不需要了。

问题3:从页面上看不出来当前显示的二级分类是属于哪个一级分类

动态class:使用v-bind:class=json表达式,key就是样式,value是boolean,为true时,表示key的样式生效。可以和原生的class 并存

分类的新增修改删除

1.两级分类的新增修改删除

category.vue

CategoryService.java

问题:新增、编辑、删除二级分类时,没有马上刷新出来,会用到另外一个小知识点,待会介绍。

1.对当前一级分类中选中的表格触发一次点击事件,以刷新二级分类

处理:对一级或二级分类的增删改查,都会调用all()刷新数据,所以all()的后面触发一次表格行点击事件。

category.vue

小技巧:当界面又用了vue,又用了jquery(特别是第三方插件),当觉得代码没问题,但是效果又没出来时,可以加个小延时看看。

7-4 课程和分类关联保存和显示

集成树型展示插件zTree

1.集成树型展示插件zTree

zTree是jquery插件,用于展示树型结构数据。分类数据有两层结构,可用树形结构展示。

Home [zTree -- jQuery tree plug-ins.]

功能设计:新增课程的时候,同时选择这门课程属于哪些分类,并且一门课程可以属于多个分类在。

将下载解压后的文件夹整个拷贝进项目,放在下面路径上course>admin>public>zTree_v3,重命名

没用的注释代码就大胆删除,保持代码干净,以后如果要用,可以通过git提交记录再找回来。

1.zTree 数据改为分类所有记录

course.vue

分类表相关字段:id,parent,name

category.vue中列表查询方法all()复制到course.vue,进行修改

course.vue

方法名和注释同样重要,要容易理解。all(),容易被误解为是查找所有的课程,所以改名allCategory()

pId 是zTree 默认的父ID名称,而分类表是用parent,需要配置转换

保存课程时,同时保存课程分类

1.保存课程时,同时保存课程分类

2.增加课程分类关联表,一门课程可以属于多个分类

all.sql

generatorConfig.xml

再执行ServerGenerator

course.vue

我们只需要保存分类的ID,所以数据传输可以选择id数组,也可以选择category数组。

CourseDto.java

属性名和前端传递的参数名一致,这样spring会自动映射参数

CourseCategoryService.java

也可以通过自定义mapper写动态sql,将list传入mybatis,批量插入一批数据,只要一条insert语句。项目开发需要在开发效率和运行效率间找平衡。

 问题:保存课程时,调用saveBatch,那么课程新增的时候,会批量插入数据,课程更新的时候,会再次批量插入数据,每次调用保存都会批量插入数据。

CourseService.java

编辑课程时,加载课程分类树,并设置勾选

1.编辑课程时,加载课程分类树,并设置勾选

CourseService.java

CourseCategoryService.java

外层save 增加了事务,saveBatch 按理可以不加事务。但是由于本身也是多个sql操作,且以后可能被多个地方调用,为了防止外层save 忘记加事务,所以在saveBatch加事务,以防万一。

CourseController.java

course.vue

7-5 课程内容功能开发

课程内容表设计与基本代码生成

1.课程内容表设计与基本代码生成

all.sql

课程表和课程内容表是1:1关系,两张表都用同样的id字段。

课程详情一般会有文字,图片,视频等,虽然不会把整张图片或整个视频放到数据库,但是存的信息还是很多,所以用大字段。

mediumtext比text类型长度更长。

分表分为:垂直(纵向)分表;水平(横向)分表。

垂直分表的场景:1.大字段;2.经常更新的字段

generatorConfig.xml

执行ServerGenerator

CourseContentService.java

删除掉CourseContentController.java和CourseContentService.java

因为之后我们会统一在CourseController.java中写,所以不需要单独每一个都写controller,另一个同样

完成课程内容管理功能

1.完成课程内容管理功能

Summernote - Super Simple WYSIWYG editor

富文本编辑器,一个很重要的特征:所见即所得。

CourseService.java

正常的思路,先去select,看看有没有数据,再判断是insert还是update,这样会执行两个sql。其实可以直接更新,没有更新到再插入,只有第一次会更新不到,执行两个sql,后面都只需要一个sql

CourseController.java

index.html

course.vue

课程内容,只有读和写,没有列表查询,也没有删除

利用setInterval完成自动保存功能

1.利用setInterval完成自动保存功能

2.增加js日期格式化方法

course.vue

tool.js

7-6 课程代码优化

课程自定义排序

1.课程管理增加自定义排序

course.vue

这里也可以初始化更多的字段,比如三个枚举字段,初始数据,收费、初稿、草稿

SortDto.java 

统一日志AOP打印的日志比较泛,可以在 controller中打印更详细的日志

CourseController.java

CourseService.java

MyCourseMapper.java

MyCourseMapper.xml

菜单隐藏掉大章和小节

1.菜单隐藏掉大章和小节

修改1:菜单栏不出现大章管理和小章管理(我之前忘加大章管理了,抱歉)

修改2:页面进到大章管理和小节管理时,侧边栏的课程管理应该显示激活样式

admin.vue

chapter.vue

section.vue

sessionStorage的key改为常量

1.sessionStorage的key改为常量

key值不要直接写字符串,后面缓存用得越来越多,key名有可能冲突,这时要改key名的话,所有set和get都要改。且不要用单一的单词,最好加一些前后缀。

session- storage.js

course.vue

chapter.vue

section.vue

表格内文字上下居中

1.增加全局自定义样式style.css,表格内文字上下居中

index.html

style.css

 7-7 讲师管理功能开发

增加讲师管理功能

1.增加讲师管理功能

all.sql

generatorConfig.xml

再执行ServerGenerator、VueGenerator

admin.vue

router.js

1.讲师管理页面布局优化

teacher.vue

鼠标放在图像上时,会出现介绍

课程讲师关联

1.课程与讲师关联

一个分类可以有多门课程,一门课程也可以属于多个分类,所以他们是多对多的关系。多对多的关系,一般会设计个中间表来维护关系。

一个讲师可以讲多门课程,一门课程只能有一个讲师,所以他们是一对多的关系。一对多的关系,可以把关系维护在“一”那张表中。

旧表加字段,使用单独的sql:alter table,这样,上生产的时候也是执行这个sql。

all.sql

generatorConfig.xml

CourseDto.java

course.vue

页面打开始,加载所有的讲师

在后端增加all方法,加载所有的讲师信息。

TeacherController.java

TeacherService.java

表单里要增加讲师选择框

course.vue

1.课程列表中显示讲师信息

2.课程名称字体自适应

v-for中,对循环的数组,可通过filter进行数据过滤

字体大小自适应,根据屏幕的分辨率显示不同大小的字体

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字人直播系统源码开发:实现电商必备的一键生成真人直播卖货

随着互联网技术的不断演进和电子商务的蓬勃发展,直播电商成为了一种新兴的销售模式。然而,传统的直播方式存在着一些问题,比如主播的时间和精力有限,无法满足大量商品的销售需求。为了解决这个问题,数字人直播系统应运…

2023RT-Thread开发者大会

参加了一次RT-Thread的开发者大会,相当有意思,虽然一天奔波挺累,但睡了半天之后简单剪了下22号的视频,也就有时间写自己的参会笔记了。 与openEuler社区不同,RT-Thread社区更专注于嵌入式,与硬件厂商结合…

长宁区科协常务副主席张正行一行到访深兰科技

12月22日,上海市长宁区科协常务副主席张正行、学会部部长洪嫣一行到访深兰科技总部,并与深兰科技集团董事长陈海波、深兰科技集团技术副总裁王雷博士等进行了会谈。 座谈中,陈海波详细介绍了深兰科技当前的企业发展及业务现状,并就…

WPS的JS宏实现WORD表格的首行以及整体格式设置

本文实现了在WORD文档中的表格的样式、字体的整体设置,以及首行的样式、字体的翻开设置。 例如一篇WORD文档,包含了200个表格,所有的表格需要设置为相同的样式: 字体 5号,方正仿宋_GB2312,行间距18磅&…

如何快速搭建接口自动化测试框架【附教程+源码】

1、接口测试 接口测试是对系统或组件之间的接口进行测试,主要是校验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。 接口自动化相对于UI自动化来说,属于更底层的测试,这样带来的好处就是测试收益更大&#xf…

拓扑排序相关leetcode算法题

文章目录 1.课程表2.课程表II3.火星词典 1.课程表 课程表 class Solution {//进行一次拓扑排序即可 public:bool canFinish(int n, vector<vector<int>>& prerequisites) {unordered_map<int,vector<int>> edges;//使用邻接表存图vector<int…

一起玩儿物联网人工智能小车(ESP32)——14. 用ESP32的GPIO控制智能小车运动起来(二)

摘要&#xff1a;本文主要讲解如何使用Mixly实现对单一车轮的运动控制。 下面就该用程序控制我们的小车轮子转起来了。打开Mixly软件&#xff0c;然后单击顶部“文件”菜单中的“新建”功能&#xff0c;我们来开启一个新程序的开发工作。 我们的工作同样是先从最简单的开始&am…

Java内存区域与内存溢出异常

Java与C++之间有一堵由内存分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。 2.1 概述 对于从事C、C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的“皇帝”,又是从事最基础工作的劳动人民——即拥有每一个对象的“所有权”,又…

ros2+gazebo+urdf:ros2机器人使用gazebo的urdf文件中的<gazebo>部分官网资料

原文链接SDFormat extensions to URDF (the gazebo tag) — Documentation 注意了ros2的gazebo部分已经跟ros1的gazebo部分不一样了&#xff1a; Toggle navigation SpecificationAPIDocumentationDownload Back Edit Version: 1.6 Table of C…

DRF之初识

目录 一、序列化和反序列化 【1】序列化 【2】反序列化 【3】小结 二、DRF的安装和快速使用 (1) 安装DRF&#xff1a; (2) 配置DRF&#xff1a; (3) 创建序列化器(Serializer)&#xff1a; (4) 创建视图(View)&#xff1a; (5) 配置URL路由&#xff1a; 【补充】下载…

使用Open3D实现3D激光雷达可视化:以自动驾驶的2DKITTI深度框架为例(下篇)

原创 | 文 BFT机器人 【原文链接】使用Open3D实现3D激光雷达可视化&#xff1a;以自动驾驶的2DKITTI深度框架为例&#xff08;上篇&#xff09; 05 Open3D可视化工具 多功能且高效的3D数据处理&#xff1a;Open3D是一个全面的开源库&#xff0c;为3D数据处理提供强大的解决方…

【LeetCode】链表精选12题

目录 快慢指针&#xff1a; 1. 相交链表&#xff08;简单&#xff09; 2. 环形链表&#xff08;简单&#xff09; 3. 快乐数&#xff08;简单&#xff09; 4. 环形链表 II&#xff08;中等&#xff09; 5. 删除链表的倒数第 N 个节点&#xff08;中等&#xff09; 递归迭…

WPF中数据绑定转换器Converter

使用场景&#xff1a;ViewModel中的数据如果跟View中的数据类型不匹配。 下面是以int类型调控是否可见为例子 步骤一&#xff1a;创建转换器类 在xaml中查看Converter的定义可以知道Converter是一个接口类型&#xff0c;因此转换器的类定义需要使用这个接口 internal class Vi…

【UML】第13篇 序列图(2/2)——建模的方法

目录 三、序列图建模 3.1 概述 3.2 建模的步骤 3.3 举例说明步骤 1.确定主要场景和流程 2.确定参与的对象 3.绘制序列图 4.注意事项 3.4 特殊的情况 序列图是我个人认为&#xff0c;UML中最重要的图之一。 而且序列图&#xff0c;对于业务建模&#xff0c;也有非常好…

echarts 柱状图

注意点 1.y轴显示的序号和名称需要在数据中拼接&#xff0c;而不是在y轴data中拼接&#xff0c; 数据过多会导致下拉的时候&#xff0c;触发y轴formatter&#xff0c;更新序号&#xff0c;序号会重新排列&#xff0c;不准确。 2.需用到堆叠效果&#xff0c;三个柱子。如果想…

PyTorch官网demo解读——第一个神经网络(3)

上一篇&#xff1a;PyTorch官网demo解读——第一个神经网络&#xff08;2&#xff09;-CSDN博客 上一篇文章我们讲解了第一个神经网络的模型&#xff0c;这一篇我们来聊聊梯度下降。 大佬说梯度下降是深度学习的灵魂&#xff1b;梯度是损失函数&#xff08;代价函数&#xff…

百度百科词条编辑需要提供参考资料,那么如何找参考资料呢。

百度百科相信大家都不陌生&#xff0c;在查询一个概念、新事物&#xff0c;或者我们想要了解的企业和人物时&#xff0c;我们一般都会求助百度百科&#xff0c;因为百度百科上面的信息相较于其他平台更值得我们相信。从词条所属主体来说&#xff0c;百度百科平台也是向其他用户…

20231224解决outcommit_id.xml1 parser error Document is empty的问题

20231224解决outcommit_id.xml1 parser error Document is empty的问题 2023/12/24 18:13 在开发RK3399的Android10的时候&#xff0c;出现&#xff1a;rootrootrootroot-X99-Turbo:~/3TB/Rockchip_Android10.0_SDK_Release$ make installclean PLATFORM_VERSION_CODENAMEREL…

Ubuntu18.04安装GTSAM库(亲测可用)

在SLAM&#xff08;Simultaneous Localization and Mapping&#xff09;和SFM&#xff08;Structure from Motion&#xff09;这些复杂的估计问题中&#xff0c;因子图算法以其高效和灵活性而脱颖而出&#xff0c;成为图模型领域的核心技术。GTSAM&#xff08;Georgia Tech Smo…

不用再找了,这就是 NLP 方向最全面试题库

大家好&#xff0c;本篇文章总结了自然语言处理(NLP)面试需要准备的学习笔记与资料&#xff0c;该资料目前包含自然语言处理各领域的面试题积累。 热门面试题&#xff08;校招、社招&#xff09;、公司级专项真题、大厂常考题等&#xff0c;在我们社群具有总结&#xff0c;喜欢…