基于SpringBoot打造在线教育系统(7)-- 面包屑导航与子分类

简介: 这一节我们来讲一下面包屑导航的问题。先看思路,当我们点击左侧的一级课程,是不是可以拿到一个ID?这个ID的作用可大了,我们有了这个ID,本意是通过它去寻找它所有的子节点。

这一节我们来讲一下面包屑导航的问题。

先看思路,当我们点击左侧的一级课程,是不是可以拿到一个ID?

这个ID的作用可大了,我们有了这个ID,本意是通过它去寻找它所有的子节点。

71.png

看图,假设【JAVA基础】里面有JDK,Hello,变量三个课程。那么请问,这三个课程的PID(父节点)是不是就正好等于【JAVA基础】的ID呢。

对了,就是这么个思路。这样一来,二级分类的数据我们就拿到了。

下一个问题,假如是三级分类呢?

先导一下数据:

INSERT INTO `edu`.`type` (`id`, `level`, `pid`, `type_name`, `order_num`) VALUES ('402880e876f69e280176f6a731a20001', '2', '402880e876f69e280176f6a731a20000', 'JDK安装', '1');
INSERT INTO `edu`.`type` (`id`, `level`, `pid`, `type_name`, `order_num`) VALUES ('402880e876f69e280176f6a731a20002', '2', '402880e876f69e280176f6a731a20000', 'eclipse的使用', '2');
INSERT INTO `edu`.`type` (`id`, `level`, `pid`, `type_name`, `order_num`) VALUES ('402880e876f69e280176f6a731a22001', '3', '402880e876f69e280176f6a731a20001', '下载JDK', '1');


看图,假设【JAVA基础】里面有JDK,Hello,变量三个课程。那么请问,这三个课程的PID(父节点)是不是就正好等于【JAVA基础】的ID呢。

对了,就是这么个思路。这样一来,二级分类的数据我们就拿到了。

下一个问题,假如是三级分类呢?

先导一下数据:

INSERT INTO `edu`.`type` (`id`, `level`, `pid`, `type_name`, `order_num`) VALUES ('402880e876f69e280176f6a731a20001', '2', '402880e876f69e280176f6a731a20000', 'JDK安装', '1');
INSERT INTO `edu`.`type` (`id`, `level`, `pid`, `type_name`, `order_num`) VALUES ('402880e876f69e280176f6a731a20002', '2', '402880e876f69e280176f6a731a20000', 'eclipse的使用', '2');
INSERT INTO `edu`.`type` (`id`, `level`, `pid`, `type_name`, `order_num`) VALUES ('402880e876f69e280176f6a731a22001', '3', '402880e876f69e280176f6a731a20001', '下载JDK', '1');

现在的关系图如下:

72.png

面包屑是啥东东呢,比如你点的是Java基础,那么面包屑就是 Java基础。


你点JDK安装,面包屑就是 Java基础 | JDK安装。


你点下载JDK,面包屑就是 Java基础 | JDK安装 | 下载JDK


反正我就是这么理解的。


于是乎,我们就得写一个方法,递推出当前节点上面所有的父节点。


查询方法代码如下:

  /**
   * 查询分类
   * @param type
   * @return
   */
  @RequestMapping("/list")
  @ResponseBody
  public Map<String,Object> list(Type type){
    Map<String,Object> result = new HashMap<>();
    result.put("code",0);
    //如果id为空,说明是加载一级课程分类
    if(type.getId() == null){
      type.setPid("0"); //我们规定一级分类的父ID是0
    }else{
      //如果有ID传过来,就看做是PID,去查询它所有的子节点
      String pid = type.getId();
      Type probe = new Type();
      probe.setPid(pid); //查询条件就是pid
      List<Type> childTypes = typeDao.findAll(Example.of(probe));
      //子节点查询完毕
      result.put("childTypes",childTypes);
      //根据本次点击的分类,向上追溯父节点
      List<Type> listTypeForBread = new ArrayList<Type>();
      //因为前台只传过来ID,所以要去数据库搜索完整的Type
      type = typeDao.findOne(type.getId());
      //本次点击的节点肯定要加进去
      listTypeForBread.add(type);
      getParents(listTypeForBread,type);
      for (Iterator iterator = listTypeForBread.iterator(); iterator.hasNext();) {
        Type type2 = (Type) iterator.next();
        System.out.println(type2.getTypeName());
      }
    }
    List<Type> findByPid = typeDao.findByPid(type.getPid());
    result.put("data", findByPid);
    return result;
  }


追溯所有父节点,我单独封装了一个方法。

    //追溯所有父节点
  private void getParents(List<Type> listTypeForBread, Type type) {
    //如果父节点是0,说明是点击一级菜单而已,直接返回一级菜单就行了。
    if(type.getPid().equals("0")){
      return;
    }
    Type probe = new Type();
    probe.setId(type.getPid());
    Type parent = typeDao.findOne(Example.of(probe));
    listTypeForBread.add(parent);
    if(parent.getPid().equals("0")){
      return;
    }
    getParents(listTypeForBread,parent);
  }


验证一下代码的逻辑,新建一个测试方法。

Java进阶的ID是402880e876f69e280176f6a731a20000,我们就用它来测试:

  @Test
  public void listType(){
    Type type = new Type();
    type.setId("402880e876f69e280176f6a731a20000");
    typeController.list(type);
  }

测试结果:

73.png

接着用402880e876f69e280176f6a731a20001,402880e876f69e280176f6a731a22001来测试,分别对应JDK安装和下载JDK,是二级分类和三级分类。

结果:

75.png

74.png


顺序倒过来了,没关系,我们再修改一下list方法。

//list倒序
List<Type> listTypeForBreadNew = new ArrayList<>();
for (int i = listTypeForBread.size() - 1; i >= 0 ; i--) {
  Type typeItem = listTypeForBread.get(i);
  listTypeForBreadNew.add(typeItem);
}
//面包屑数据处理完毕
result.put("breadList",listTypeForBreadNew);


这样就完成了倒序,虽然代码不够精美,但是能用。

76.png



数据没问题了,就去搞搞页面吧。

77.png


ElementUI已经给我们提供了面包屑的组件了,直接拿来用。

最终代码:

/* 改变面包屑导航的字体颜色 */
.el-breadcrumb__item a {
  color:#1989fa !important;
}
.el-breadcrumb {
    font-size: 14px;
    line-height: 1;
    background: #e3f3d1;
    padding: 14px 8px;
    border-radius: 2px;
    border-color: #e3f3d1;
}


下面这段代码比较复杂,我踌躇再三才决定这么写的。如果你有更好的办法,可以私信我,我可以抄袭,哦不,借鉴一下。

   <el-breadcrumb separator="/" style="margin-bottom: 10px;">
    <el-breadcrumb-item><a href="${basePath}/admin/index">首页</a></el-breadcrumb-item>
    <el-breadcrumb-item v-for="(item,index) in breadList">
      <a :style="index == breadList.length - 1 ? 'color:#777 !important;': '' " 
         :href=" index == breadList.length - 1 ? 'javaScript:void(0)' : '${basePath}/type/list?id=' + item.id">
        {{item.typeName}}
      </a>
    </el-breadcrumb-item>
  </el-breadcrumb>


先看最终效果:

78.png

然后是遍历二级课程,这可真TM要了我的老命,很绕啊,我也试了很多办法才搞出来的。

代码如下:

<el-row :gutter="20" v-for="(row,rowIndex) in childTypes" style="margin:30px 16px;">
    <el-col :span="6" v-for="(item,colIndex) in childTypes[rowIndex]" >
        <el-badge :value="'9'" class="item">
            <el-card class="box-card" shadow="hover" style="height:150px;" body-style="">
              <div slot="header" class="clearfix card-header">
                <span><i class="el-icon-document"></i></span>
                <div class="cardname" type="text">[{{item.typeName}}]</div>
              </div>
              <div class="text item">
                [{{item.typeName}}]
              </div>
              <span class="ordernum">{{rowIndex * 4 + colIndex+1}}</span>
            </el-card>
        </el-badge>
    </el-col>
</el-row> 


代码不多,但是还真的挺难想的,也许是我太菜了,哈哈哈。

效果:

79.png

对应的JS代码:

//循环次数
that.loop = data.childTypes.length / 4 + 1;
//本次加载的所有同级分类
that.typesMain = data.data;
//面包屑
that.breadList = data.breadList;
//子节点数据
var childTypes = data.childTypes;
//处理子节点,每四个一组(难点)
var arr = [];
//debugger;
var count = Math.floor(childTypes.length / 4) + 1;
for(var i = 0;i < count;i++){
  //每次循环都要用到一个新的数组
  var newArr = JSON.parse(JSON.stringify(childTypes));
  var start = i * 4;
  if( i == count - 1){
    arr[i] =  newArr.splice(start)
  }else
    arr[i] =  newArr.splice(start,4)
}
that.childTypes = arr;
console.log(that.childTypes);

代码很多,我只贴了关键部分,需要完整源码的可以关注【java小白翻身】,加群获取。

哎,累死了,我下班后一直写到现在,跪求一键三联啊,分享一波,您的支持是我最大的动力。

相关文章
|
2月前
|
XML Java 数据库连接
SpringBoot集成Flowable:打造强大的工作流管理系统
在企业级应用开发中,工作流管理是一个核心组件,它能够帮助我们定义、执行和管理业务流程。Flowable是一个开源的工作流和业务流程管理(BPM)平台,它提供了强大的工作流引擎和建模工具。结合SpringBoot,我们可以快速构建一个高效、灵活的工作流管理系统。本文将探讨如何将Flowable集成到SpringBoot应用中,并展示其强大的功能。
366 1
|
2月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
3月前
|
存储 安全 Java
打造智能合同管理系统:SpringBoot与电子签章的完美融合
【10月更文挑战第7天】 在数字化转型的浪潮中,电子合同管理系统因其高效、环保和安全的特点,正逐渐成为企业合同管理的新宠。本文将分享如何利用SpringBoot框架实现一个集电子文件签字与合同管理于一体的智能系统,探索技术如何助力合同管理的现代化。
144 4
|
3月前
|
前端开发 Java Apache
SpringBoot实现电子文件签字+合同系统!
【10月更文挑战第15天】 在现代企业运营中,合同管理和电子文件签字成为了日常活动中不可或缺的一部分。随着技术的发展,电子合同系统因其高效性、安全性和环保性,逐渐取代了传统的纸质合同。本文将详细介绍如何使用SpringBoot框架实现一个电子文件签字和合同管理系统。
143 1
|
4月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
243 3
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
|
3月前
|
文字识别 安全 Java
SpringBoot3.x和OCR构建车牌识别系统
本文介绍了一个基于Java SpringBoot3.x框架的车牌识别系统,详细阐述了系统的设计目标、需求分析及其实现过程。利用Tesseract OCR库和OpenCV库,实现了车牌图片的识别与处理,确保系统的高准确性和稳定性。文中还提供了具体的代码示例,展示了如何构建和优化车牌识别服务,以及如何处理特殊和异常车牌。通过实际应用案例,帮助读者理解和应用这一解决方案。
|
4月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的蛋糕商城管理系统
基于Java+Springboot+Vue开发的蛋糕商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的蛋糕商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
212 3
基于Java+Springboot+Vue开发的蛋糕商城管理系统
|
4月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的美容预约管理系统
基于Java+Springboot+Vue开发的美容预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的美容预约管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
66 3
基于Java+Springboot+Vue开发的美容预约管理系统
|
2月前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
55 0
|
3月前
|
机器学习/深度学习 移动开发 自然语言处理
基于人工智能技术的智能导诊系统源码,SpringBoot作为后端服务的框架,提供快速开发,自动配置和生产级特性
当身体不适却不知该挂哪个科室时,智能导诊系统应运而生。患者只需选择不适部位和症状,系统即可迅速推荐正确科室,避免排错队浪费时间。该系统基于SpringBoot、Redis、MyBatis Plus等技术架构,支持多渠道接入,具备自然语言理解和多输入方式,确保高效精准的导诊体验。无论是线上医疗平台还是大型医院,智能导诊系统均能有效优化就诊流程。

热门文章

最新文章