【在线教育】课程科目入门(二)

简介: 课程科目入门

2.1.4 前端


  • 创建路由模块

image.png

/** When your routing table is too long, you can split it into small modules **/importLayoutfrom'@/layout'constcourseRouter= {
path: '/course',           // 当前模块前缀路径,必须以/开头component: Layout,          // 采用布局组件显示当前模块【默认】redirect: '/course/subjectList',  // “教师管理”默认显示路由name: '课程管理',            // 路由名称meta: {
title: '课程管理',         // 一级菜单名称,children.length==0 隐藏icon: 'table'// 一级菜单图标,children.length==0 隐藏  },
children: [
    {
path: 'subjectList',
component: () =>import('@/views/edu/course/subjectList.vue'),
name: '科目列表',
meta: { title: '科目列表', icon: 'list' }   //二级菜单名称    }
  ]
}
exportdefaultcourseRouter

image.png

image.png

2.2 查询所有


  • 以树形table展示数据

image.png

2.2.1 后端实现


  • 修改 EduSubjectController
packagecom.czxy.zx.course.controller;
importcom.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
importcom.czxy.zx.course.service.EduSubjectService;
importcom.czxy.zx.domain.EduSubject;
importcom.czxy.zx.vo.BaseResult;
importorg.springframework.web.bind.annotation.GetMapping;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RestController;
importjavax.annotation.Resource;
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
/*** @author 桐叔* @email liangtong@itcast.cn*/@RestController@RequestMapping("/subject")
publicclassEduSubjectController {
@ResourceprivateEduSubjectServiceeduSubjectService;
@GetMappingpublicBaseResultfindAll() {
//1 查询所有QueryWrapperqueryWrapper=newQueryWrapper();
queryWrapper.orderByAsc("parent_id");
List<EduSubject>list=eduSubjectService.list(queryWrapper);
//2 处理父子关系List<EduSubject>resultList=newArrayList<>();
Map<String,EduSubject>cache=newHashMap<>();
list.forEach(eduSubject-> {
// 获得父EduSubjectparentEduSubject=cache.get(eduSubject.getParentId());
// 如果没有父表示第一层,如果有父追加if(parentEduSubject!=null) {
// 如果有孩子,判断父对象的集合List<EduSubject>temp=parentEduSubject.getChildren();
if(temp==null) {
parentEduSubject.setChildren(newArrayList<>());
                }
// 将孩子添加到父对象的集合中parentEduSubject.getChildren().add(eduSubject);
            } else {
resultList.add(eduSubject);
            }
// 缓存当前cache.put(eduSubject.getId(),eduSubject);
        });
returnBaseResult.ok("查询成功", resultList);
    }
}

2.2.2 前端接口


image.png

importaxiosfrom'@/utils/request'// 查询所有课程科目exportfunctionfindAllSub() {
returnaxios.get('/course-service/subject');
}

2.2.3 前端实现


  • 修改 @/views/edu/course/subjectList.vue

image.png

<template><div><el-tablev-loading="listLoading"      :data="subjectList"borderfithighlight-current-rowstyle="width: 100%;"row-key="title"      :tree-props="{children: 'children'}"><el-table-columnlabel="科目名称"prop="title"align="center"width="200"></el-table-column><el-table-columnlabel="排序"prop="sort"width="80px"min-width="50px"></el-table-column><el-table-columnlabel="添加时间"width="200px"align="center"><templateslot-scope="{row}"><span>{{ row.gmtCreate|parseTime('{y}-{m}-{d} {h}:{i}') }}</span></template></el-table-column><el-table-columnlabel="更新时间"width="200px"align="center"><templateslot-scope="{row}"><span>{{ row.gmtModified|parseTime('{y}-{m}-{d} {h}:{i}') }}</span></template></el-table-column><el-table-columnlabel="操作"align="center"class-name="small-padding fixed-width"><templateslot-scope="{row,$index}"><el-buttontype="primary"size="mini">修改</el-button><el-buttonv-if="row.status!='deleted'"size="mini"type="danger">删除</el-button></template></el-table-column></el-table></div></template><script>import { findAllSub } from'@/api/edu/course'exportdefault {
data() {
return {
subjectList: [] ,
listLoading: false,
    }
  },
methods: {
asyncfindAllSubject() {  // 查询所有this.listLoading=truelet { data } =awaitfindAllSub()
this.subjectList=datathis.listLoading=false    }
  },
mounted() {
this.findAllSubject()
  },
}
</script><style></style>

2.3 导入科目


2.3.1 需求


image.png

2.3.2 前端


使用upload组件<!--文件上传--><el-uploadclass="upload-demo"      :action="updateUrl"      :limit="1"      :on-exceed="handleExceed"      :before-upload="beforeUpload"      :on-remove="handleRemove"      :on-success="handleSuccess"      :file-list="fileList"><el-buttonsize="small"type="primary">点击上传</el-button><divslot="tip"class="el-upload__tip">只能上传xls或xlsx文件,且不超过500kb</div></el-upload>声明变量data() {
return {
fileList: [],     //上传文件列表updateUrl: process.env.VUE_APP_BASE_API+'/course-service/subject/upload',   //上传路径    }
  },
编写处理函数handleExceed(files, fileList) {   // 超出个数限制this.$message.warning(`当前选择1个文件`);
    },
beforeUpload(file) {      // 上传文件之前// 是否是 xlsx 文件(2003)constisXlsx=file.type==='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'// 是否是 xls 文件(2010)constisXls=file.type==='application/vnd.ms-excel'constisLt2M=file.size/1024/1024<2;
if (!isXlsx&&!isXls) {
this.$message.error('上传文件不是excel文件!');
      }
if (!isLt2M) {
this.$message.error('上传文件大小不能超过 2MB!');
      }
return (isXlsx||isXls) &&isLt2M;
    },
handleRemove(file, fileList) {  // 文件列表移除文件console.log(file, fileList);
    },
handleSuccess(response, file, fileList) { // 文件上传成功// 成功提示this.$message.success(response.message)
// 刷新this.findAllSubject()
    }

2.3.2 前端:完整版


<template><div><el-tablev-loading="listLoading"      :data="subjectList"borderfithighlight-current-rowstyle="width: 100%;"row-key="title"      :tree-props="{children: 'children'}"><el-table-columnlabel="科目名称"prop="title"align="left"width="200"></el-table-column><el-table-columnlabel="排序"prop="sort"width="80px"min-width="50px"></el-table-column><el-table-columnlabel="添加时间"width="200px"align="center"><templateslot-scope="{row}"><span>{{ row.gmtCreate|parseTime('{y}-{m}-{d} {h}:{i}') }}</span></template></el-table-column><el-table-columnlabel="更新时间"width="200px"align="center"><templateslot-scope="{row}"><span>{{ row.gmtModified|parseTime('{y}-{m}-{d} {h}:{i}') }}</span></template></el-table-column><el-table-columnlabel="操作"align="center"class-name="small-padding fixed-width"><templateslot-scope="{row}"><el-buttontype="primary"size="mini">修改</el-button><el-buttonv-if="row.status!='deleted'"size="mini"type="danger">删除</el-button></template></el-table-column></el-table><!--文件上传--><el-uploadclass="upload-demo"      :action="updateUrl"      :limit="1"      :on-exceed="handleExceed"      :before-upload="beforeUpload"      :on-remove="handleRemove"      :on-success="handleSuccess"      :file-list="fileList"><el-buttonsize="small"type="primary">点击上传</el-button><divslot="tip"class="el-upload__tip">只能上传xls或xlsx文件,且不超过500kb</div></el-upload></div></template><script>import { findAllSub } from'@/api/edu/course'exportdefault {
data() {
return {
subjectList: [] ,
listLoading: false,
fileList: [],     //上传文件列表updateUrl: process.env.VUE_APP_BASE_API+'/course-service/subject/upload',   //上传路径    }
  },
methods: {
asyncfindAllSubject() {  // 查询所有this.listLoading=truelet { data } =awaitfindAllSub()
this.subjectList=datathis.listLoading=false    },
handleExceed(files, fileList) {   // 超出个数限制this.$message.warning(`当前选择1个文件`);
    },
beforeUpload(file) {      // 上传文件之前// 是否是 xlsx 文件(2003)constisXlsx=file.type==='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'// 是否是 xls 文件(2010)constisXls=file.type==='application/vnd.ms-excel'constisLt2M=file.size/1024/1024<2;
if (!isXlsx&&!isXls) {
this.$message.error('上传文件不是excel文件!');
      }
if (!isLt2M) {
this.$message.error('上传文件大小不能超过 2MB!');
      }
return (isXlsx||isXls) &&isLt2M;
    },
handleRemove(file, fileList) {  // 文件列表移除文件console.log(file, fileList);
    },
handleSuccess(response, file, fileList) { // 文件上传成功// 成功提示this.$message.success(response.message)
// 刷新this.findAllSubject()
    }
  },
mounted() {
this.findAllSubject()
  },
}
</script><style></style>

2.3.4 后端


1) 完善JavaBean

packagecom.czxy.zx.domain;
importcom.baomidou.mybatisplus.annotation.*;
importcom.fasterxml.jackson.annotation.JsonFormat;
importlombok.Data;
importorg.springframework.format.annotation.DateTimeFormat;
importjava.util.ArrayList;
importjava.util.Date;
importjava.util.List;
/*** 课程科目(EduSubject)表实体类** @author 桐叔*/@Data@TableName("edu_subject")
publicclassEduSubject{
@TableId(type=IdType.ASSIGN_UUID)
//课程科目IDprivateStringid;
//科目名称privateStringtitle;
//父IDprivateStringparentId;
//排序字段privateIntegersort;
//创建时间@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
@TableField(fill=FieldFill.INSERT)
privateDategmtCreate;
//更新时间@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
@TableField(fill=FieldFill.INSERT)
privateDategmtModified;
@TableField(exist=false)
privateList<EduSubject>children=newArrayList<>();
}

image.png

packagecom.czxy.zx.course.handler;
importcom.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
importorg.apache.ibatis.reflection.MetaObject;
importorg.springframework.stereotype.Component;
importjava.util.Date;
/*** @author 桐叔* @email liangtong@itcast.cn*/@ComponentpublicclassSubjectMetaObjectHandlerimplementsMetaObjectHandler {
@OverridepublicvoidinsertFill(MetaObjectmetaObject) {
// 创建时间this.setFieldValByName("gmtCreate",newDate(), metaObject);
// 修改时间this.setFieldValByName("gmtModified",newDate() , metaObject);
    }
@OverridepublicvoidupdateFill(MetaObjectmetaObject) {
// 修改时,填充的内容this.setFieldValByName("gmtModified",newDate() , metaObject);
    }
}

image.png

接口packagecom.czxy.zx.course.service;
importcom.baomidou.mybatisplus.extension.service.IService;
importcom.czxy.zx.domain.EduSubject;
/*** @author 桐叔* @email liangtong@itcast.cn*/publicinterfaceEduSubjectServiceextendsIService<EduSubject> {
/*** 通过title查询* @param title* @return*/EduSubjectfindByTitle(Stringtitle);
}
实现类packagecom.czxy.zx.course.service.impl;
importcom.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
importcom.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
importcom.czxy.zx.course.mapper.EduSubjectMapper;
importcom.czxy.zx.course.service.EduSubjectService;
importcom.czxy.zx.domain.EduSubject;
importorg.springframework.stereotype.Service;
importorg.springframework.transaction.annotation.Transactional;
/*** @author 桐叔* @email liangtong@itcast.cn*/@Service@TransactionalpublicclassEduSubjectServiceImplextendsServiceImpl<EduSubjectMapper, EduSubject>implementsEduSubjectService {
@OverridepublicEduSubjectfindByTitle(Stringtitle) {
QueryWrapperqueryWrapper=newQueryWrapper();
queryWrapper.eq("title", title);
EduSubjecteduSubject=baseMapper.selectOne(queryWrapper);
returneduSubject;
    }
}
4)controller:上传/*** 文件上传* @param file* @return*/@PostMapping("/upload")
publicBaseResultupload(MultipartFilefile) {
try {
// 解析excelEasyExcel.read(file.getInputStream(), UploadSubjectVo.class, eduSubjectListener).sheet(0).doRead();
returnBaseResult.ok("上传成功");
        } catch (IOExceptione) {
returnBaseResult.error("上传失败");
        }
    }

image.png

packagecom.czxy.zx.course.upload;
importcom.alibaba.excel.annotation.ExcelProperty;
importlombok.Data;
/*** @author 桐叔* @email liangtong@itcast.cn*/@DatapublicclassUploadSubjectVo {
@ExcelProperty("一级分类")
privateStringoneLevel;
@ExcelProperty("二级分类")
privateStringtwoLevel;
}

image.png

packagecom.czxy.zx.course.upload;
importcom.alibaba.excel.context.AnalysisContext;
importcom.alibaba.excel.event.AnalysisEventListener;
importcom.czxy.zx.course.service.EduSubjectService;
importcom.czxy.zx.domain.EduSubject;
importorg.springframework.stereotype.Component;
importjavax.annotation.Resource;
/*** @author 桐叔* @email liangtong@itcast.cn*/@ComponentpublicclassEduSubjectListenerextendsAnalysisEventListener<UploadSubjectVo> {
@ResourceprivateEduSubjectServiceeduSubjectService;
@Overridepublicvoidinvoke(UploadSubjectVouploadSubjectVo, AnalysisContextanalysisContext) {
// 1. 处理一级// 1.1 查询一级EduSubjectoneSubject=eduSubjectService.findByTitle(uploadSubjectVo.getOneLevel());
// 1.2 保存一级if(oneSubject==null) {
oneSubject=newEduSubject();
oneSubject.setTitle(uploadSubjectVo.getOneLevel());
oneSubject.setSort(0);
oneSubject.setParentId("0");        // 一级默认0eduSubjectService.save(oneSubject);
        }
// 2. 处理二级// 2.1 查询二级EduSubjecttwoSubject=eduSubjectService.findByTitle(uploadSubjectVo.getTwoLevel());
// 2.2 保存二级if(twoSubject==null) {
twoSubject=newEduSubject();
twoSubject.setTitle(uploadSubjectVo.getTwoLevel());
twoSubject.setSort(0);
twoSubject.setParentId(oneSubject.getId()); //二级的父ID为一级的IDeduSubjectService.save(twoSubject);
        }
    }
@OverridepublicvoiddoAfterAllAnalysed(AnalysisContextanalysisContext) {
    }
}
相关文章
|
7月前
|
Java Maven
杨校老师课堂之就业信息平台
杨校老师课堂之就业信息平台
35 0
|
机器学习/深度学习 人工智能 安全
IT专业报考指南:选择正确的学校和课程
随着高考的技术,男怕入错行,女怕嫁错郎,专业的选择也是至关重要的,当准备报考IT专业时,选择适合自己的学校和课程是至关重要的一步。随着信息技术的快速发展和应用范围的不断扩大,IT行业的就业前景变得更加广阔。然而,在众多学校和课程中做出明智的选择并不容易。这就是为什么一个全面的报考指南对于帮助你确定正确的学校和课程至关重要。
102 0
|
XML 存储 前端开发
谷粒学院——Day08【课程发布-课程大纲和课程发布】
谷粒学院——Day08【课程发布-课程大纲和课程发布】
167 0
谷粒学院——Day08【课程发布-课程大纲和课程发布】
|
JavaScript 前端开发 Java
谷粒学院——Day07【课程发布-添加课程信息】
谷粒学院——Day07【课程发布-添加课程信息】
103 0
谷粒学院——Day07【课程发布-添加课程信息】
|
机器学习/深度学习 算法 开发者
课程介绍及教学说明| 学习笔记
快速学习课程介绍及教学说明。
|
前端开发 开发者 JavaScript
开课啦!小程序开发最佳实践系列课程【一期】(1)
《前端基础-JS篇,变量、常量与解构赋值》,帮助您掌握JS中最基本的变量、常量的定义方式,并了解ES6中引入的解构赋值的使用方法。
2021 12
开课啦!小程序开发最佳实践系列课程【一期】(1)
|
前端开发 开发者 JavaScript
上课啦!小程序研发最佳实践系列课程【一期】(2)
学习本门课程,你将了解ES6模块,熟悉并掌握输出/引用模块接口的方式。
1121 12
上课啦!小程序研发最佳实践系列课程【一期】(2)
对于在校学习课程结合实习的思考
版权声明:转载请注明出处:http://blog.csdn.net/dajitui2024 https://blog.csdn.net/dajitui2024/article/details/79396709 其他的:考认证很有必要,没有什么好争辩的。
871 0