学成在线: 新增/修改课程计划

新增/修改课程计划(同接口)

界面原型

第一步: 在课程计划界面,点击添加章新增第一级课程计划,点击添加小节可以向某个第一级课程计划下添加小节

  • 新增章/节成功后会自动发起请求刷新课程计划列表并且把新增的课程计划信息添加到数据库当中,新增的课程计划自动排序到最后

第二步: 点击章/节的名称可以修改名称和选择是否免费

  • 点击修改章/节名称时文本框会自动聚焦,此时用户可以修改名称,失去焦点后会自动发起请求更新数据库中对应字段的信息

在这里插入图片描述

请求模型类

新增章/节课程计划

### 新增章,默认添加到所属课程的最后一个章节
POST {{content_host}}/content/teachplan
Content-Type: application/json
{
"courseId" : 74,
"parentid": 0,
"grade" : 1,# 章节等级,当grade为1时parentid为0
"pname" : "新章名称 [点击修改]"# 默认名称
}

#### 新增节,默认添加到所属章节的最后一个小节
POST {{content_host}}/content/teachplan
Content-Type: application/json
{
"courseId" : 74,
"parentid": 247,
"grade" : 2,
"pname" : "新小节名称 [点击修改]"# 默认名称
}

修改课程计划的名称和收费规则

#### 修改节,设置是否免费
POST {{content_host}}/content/teachplan
Content-Type: application/json
{
	"id": 293,
	"pname": "3.1Nacos作配置中心",
	"parentid": 292,
	"grade": 2,
	"mediaType": null,
	"startTime": null,
	"endTime": null,
	"description": null,
	"timelength": null,
	"orderby": 1,
	"courseId": 117,
	"coursePubId": null,
	"status": null,
	
	"isPreview": null,
	"createDate": null,
	"changeDate": null,
	
	"teachplanMedia": null,
	"teachPlanTreeNodes": null,
	"ctlEditTitle": true,
	"ctlBarShow": false
}

新增和修改的唯一区别就是请求参数是否有Id,可以通过同一个接口接收新增和修改两个业务的请求,这里可以直接使用PO类Teachplan作为请求参数的模型类

package com.xuecheng.content.model.po;
@Data
@TableName("teachplan")
public class Teachplan implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * 课程计划名称
     */
    private String pname;
    /**
     * 课程计划父级Id
     */
    private Long parentid;
    /**
     * 层级,分为1、2、3级
     */
    private Integer grade;
    /**
     * 课程类型:1视频、2文档
     */
    private String mediaType;
    /**
     * 开始直播时间
     */
    private LocalDateTime startTime;
    /**
     * 直播结束时间
     */
    private LocalDateTime endTime;
    /**
     * 章节及课程时介绍
     */
    private String description;
    /**
     * 时长,单位时:分:秒
     */
    private String timelength;
    /**
     * 排序字段
     */
    private Integer orderby;
    /**
     * 课程标识
     */
    private Long courseId;
    /**
     * 课程发布标识
     */
    private Long coursePubId;
    /**
     * 状态(1正常  0删除)
     */
    private Integer status;
    /**
     * 是否支持试学或预览(试看)
     */
    private String isPreview;
    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createDate;
    /**
     * 修改时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime changeDate;
}

业务开发

第一步: 定义新增/修改课程计划(章/节)的接口

@ApiOperation("课程计划创建或修改")
@PostMapping("/teachplan")
public void saveTeachplan(@RequestBody Teachplan teachplanDto) {
     teachplanService.saveTeachplan(teachplan);
}

第二步: 编写Servcie接口及其实现类

void saveTeachplan(Teachplan teachplan);
@Transactional// 设置多条DML语句,需要控制事务
@Override
public void saveTeachplan(Teachplan teachplan) {
    Long teachplanId = teachplan.getId();
    if (teachplanId == null) {
        // 课程计划id为null表示需要新增章/节,拷贝属性将请求参数中课程计划的信息封装到创建的Teachplan对象中
        Teachplan plan = new Teachplan();
        BeanUtils.copyProperties(teachplan, plan);
        // 设置创建时间和排序号
        plan.setCreateDate(LocalDateTime.now());
        // 设置新增章节的排序号.默认排在同等级的最后
        plan.setOrderby(getTeachplanCount(plan.getCourseId(), plan.getParentid()) + 1);
        // 如果新增失败会返回0,抛出异常
        int flag = teachplanMapper.insert(plan);
        if (flag <= 0) XueChengPlusException.cast("新增失败");
    } else {
        // 课程计划id不为null表示需要修改课程,拷贝属性将请求参数中的课程计划信息更新到查询的Teachplan对象中
        Teachplan plan = teachplanMapper.selectById(teachplanId);
        BeanUtils.copyProperties(teachplan, plan);
        // 设置更新时间
        plan.setChangeDate(LocalDateTime.now());
        // 如果修改失败会返回0,抛出异常
        int flag = teachplanMapper.updateById(plan);
        if (flag <= 0) XueChengPlusException.cast("修改失败");
    }
}

从当前课程关联的所有课程计划中获取与当前章/节同父同级别的课程计划数量

private int getTeachplanCount(Long courseId, Long parentId) {
    LambdaQueryWrapper<Teachplan> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(Teachplan::getCourseId, courseId);
    queryWrapper.eq(Teachplan::getParentid, parentId);
    return teachplanMapper.selectCount(queryWrapper);
}

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

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

相关文章

命令注入漏洞原理以及修复方法

漏洞名称 &#xff1a;命令注入 漏洞描述&#xff1a;Command Injection&#xff0c;即命令注入攻击&#xff0c;是指由于Web应用程序对用户提交的数据过滤 不严格&#xff0c;导致黑客可以通过构造特殊命令字符串的方式&#xff0c;将数据提交至Web应用程序中&#xff0c;并利…

【Java程序设计】【C00191】基于SSM的线上鲜花商城管理系统(论文+PPT)

基于SSM的线上鲜花商城管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的线上鲜花商城的管理系统 本系统分为前台用户和后台管理员2个功能模块。 前台用户&#xff1a; 当游客打开系统的网址后&#xff0c;首先看…

032 数组

数组的定义 声明和创建 // 声明数组并开辟内存空间 int[] nums new int[10]; // 为数组赋值 nums[0] 1; nums[1] 2; nums[2] 3; nums[3] 4; nums[4] 5; nums[5] 6; nums[6] 7; nums[7] 8; nums[8] 9; nums[9] 10; // 累加和 int sum 0; for (int num : nums) {sum …

elementUI中el-tree组件单选没有复选框时,选中、current-node-key高亮、刷新后保留展开状态功能的实现

目录 一、代码实现1. 属性了解 &#xff08;[更多](https://element.eleme.cn/#/zh-CN/component/tree)&#xff09;2. 实现步骤3.代码示例 二、 效果图 一、代码实现 1. 属性了解 &#xff08;更多&#xff09; node-key 每个树节点用来作为唯一标识的属性&#xff0c;整棵树…

[云顶数模]2024美赛CEF题成品参考论文+配套数据集+可执行代码+运行结果图

E题社区抗灾能力综合评估与决策模型研究 摘要&#xff1a;社区抗灾能力的提升对于灾害风险管理至关重要。本研究基于机器学 习方法&#xff0c;构建了社区抗灾能力预测模型&#xff0c;以评估社区在灾害事件中的表现。首先&#xff0c; 我们采用梯度提升树模型对社区基础设施、…

正则表达式(RE)

什么是正则表达式 正则表达式&#xff0c;又称规则表达式&#xff08;Regular Expression&#xff09;。正则表达式通常被用来检索、替换那些符合某个规则的文本 正则表达式的作用 验证数据的有效性替换文本内容从字符串中提取子字符串 匹配单个字符 字符功能.匹配任意1个…

10个常考的前端手写题,你全都会吗?(上)

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 今天来分享一下10个常见的JavaScript手写功能。 目录 1.实现new 2.call、apply、…

一篇文章认识Vue3

Vue 3 介绍 Vue3 于 2022 年 2 月 7 日星期一成为新的默认版本&#xff01; Vue3 性能更高&#xff0c;体积更小 Vue3 在经过一年的迭代后&#xff0c;越来越好用。 官方文档&#xff1a; vue3官方文档&#xff1a; vuejs.org/ [1] vue3中文文档&#xff1a; v3.cn.vuejs.org/ …

数据结构-day7

二叉树创建、遍历、计算结点、计算深度 head.h #include<stdio.h> #include<stdlib.h> #include<string.h>typedef char datatype; typedef struct Btree{datatype data;struct Btree *lchild;struct Btree *rchild; }*btree;btree create(); void insert_…

【数据结构】双向链表 超详细 (含:何时用一级指针或二级指针;指针域的指针是否要释放)

目录 一、简介 二. 双链表的实现 1.准备工作及其注意事项 1.1 先创建三个文件 1.2 注意事项&#xff1a;帮助高效记忆 1.3 关于什么时候 用 一级指针接收&#xff0c;什么时候用 二级指针接收&#xff1f; 1.4 释放节点时&#xff0c;要将节点地址 置为NULL&#xff0…

如何过滤离线logcat日志文件?

1.需求&#xff1a; How did Android Studio Logcat to read the files which have save in logcat? I saved some logs and would like to open them with Android Studio - Logcat interface and be able to see the colours and apply some filters just as if the pho…

T113-Pro的buildroot添加gdisk ( GPT disks )出现gptfdisk needs a toolchain w/ C++的解决方法

问题背景&#xff1a; 最近入手了百问网的全志T113-Pro&#xff0c;用Emmc启动发现一张32GB的SD卡在烧录了百问网镜像 100ask-t113-pro_sdcard.img 的系统后&#xff0c;仅有200多M的存储空间。第一时间上百问网论坛看是否有板友也出现类似情况&#xff0c;发现了一个帖子正是描…

7.NFS服务器

目录 1. 简介 1.1. NFS背景介绍 1.2. 生产应用场景 2. NFS工作原理 2.1. 示例图 2.2. 流程 3. NFS的使用 3.1. 安装 3.2. 配置文件 3.3. 主配置文件分析 3.4. 实验1 3.5. NFS账户映射 3.5.1. 实验2&#xff1a; 3.5.2. 实验3 4. autofs自动挂载服务 4.1. 产生原…

Transformer 代码补充

本文是对Transformer - Attention is all you need 论文阅读-CSDN博客以及【李宏毅机器学习】Transformer 内容补充-CSDN博客的补充&#xff0c;是对相关代码的理解。 先说个题外话&#xff0c;在之前李宏毅老师的课程中提到multi-head attention是把得到的qkv分别乘上不同的矩…

030-安全开发-JS应用NodeJS指南原型链污染Express框架功能实现审计

030-安全开发-JS应用&NodeJS指南&原型链污染&Express框架&功能实现&审计 #知识点&#xff1a; 1、NodeJS-开发环境&功能实现 2、NodeJS-安全漏洞&案例分析 3、NodeJS-开发指南&特有漏洞 演示案例&#xff1a; ➢环境搭建-NodeJS-解析安装&…

常用换源总结

1.Ubuntu16.04更换国内源 在Ubuntu系统上使用apt-get install进行软件安装或更新的时候&#xff0c;由于使用的是国外源&#xff0c;导致下载速度很慢或者连接超时&#xff0c;需要更换下载源。 1.将系统原始的源文件进行备份 sudo cp /etc/apt/sources.list /etc/apt/source…

c语言--二进制和其他进制之间的转换

目录 一、前言二、二进制、十进制、十六进制、八进制的组成2.1二进制的组成2.2十进制的组成2.3八进制的组成2.4十六进制的组成 三、二进制转换为十进制3.1 二进制转换为十进制3.2十进制转换为二进制 四、二进制转八进制和十六进制4.1二进制转八进制4.2二进制转换为十六进制 五、…

【安装指南】maven下载、安装与配置详细教程

&#x1f33c;一、概述 maven功能与python的pip类似。 Apache Maven是一个用于软件项目管理和构建的强大工具。它是基于项目对象模型的&#xff0c;用于描述项目的构建配置和依赖关系。以下是一些关键的 Maven 特性和概念&#xff1a; POM&#xff08;Project Object Model&…

Mybatis基础教程及使用细节

本篇主要对Mybatis基础使用进行总结&#xff0c;包括Mybatis的基础操作&#xff0c;使用注解进行增删改查的练习&#xff1b;详细介绍xml映射文件配置过程并且使用xml映射文件进行动态sql语句进行条件查询&#xff1b;为了简化java开发提高效率&#xff0c;介绍一下依赖&#x…

安科瑞电气火灾监控系统在海尔(合肥)创新产业园一期厂房改扩建项目的设计与应用

摘要&#xff1a;介绍海尔&#xff08;合肥&#xff09;创新产业园一期厂房改扩建项目采用安科瑞剩余电流式电气火灾探测器&#xff0c;就地组网方式&#xff0c;通过现场总线通讯远传至后台&#xff0c;从而实现剩余电流式电气火灾监控系统的搭建&#xff0c;完成对现场配电回…