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

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

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

看图,假设【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基础,那么面包屑就是 Java基础。

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

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

反正我就是这么理解的。

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

查询方法代码如下:

/**

* 查询分类

* @param type

* @return

*/

@RequestMapping("/list")

@ResponseBody

public Map list(Type type){

Map 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 childTypes = typeDao.findAll(Example.of(probe));

//子节点查询完毕

result.put("childTypes",childTypes);

//根据本次点击的分类,向上追溯父节点

List listTypeForBread = new ArrayList();

//因为前台只传过来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 findByPid = typeDao.findByPid(type.getPid());

result.put("data", findByPid);

return result;

}

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

//追溯所有父节点

private void getParents(List 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);

}

测试结果:

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

结果:

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

//list倒序

List listTypeForBreadNew = new ArrayList<>();

for (int i = listTypeForBread.size() - 1; i >= 0 ; i--) {

Type typeItem = listTypeForBread.get(i);

listTypeForBreadNew.add(typeItem);

}

//面包屑数据处理完毕

result.put("breadList",listTypeForBreadNew);

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

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

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;

}

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

首页

:href=" index == breadList.length - 1 ? 'javaScript:void(0)' : '${basePath}/type/list?id=' + item.id">

{{item.typeName}}

先看最终效果:

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

代码如下:

[{{item.typeName}}]

[{{item.typeName}}]

{{rowIndex * 4 + colIndex+1}}

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

效果:

对应的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小白翻身】,加群获取。

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

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

  1. 计算机毕业设计springboot基于Springboot的在线教育平台的设计与实现8qecq源码+系统+程序+lw文档+部署

    计算机毕业设计springboot基于Springboot的在线教育平台的设计与实现8qecq源码+系统+程序+lw文档+部署 计算机毕业设计springboot基于Springboot的在线教育平台 ...

  2. 基于SSM的在线教育系统的设计与实现【附源码】

    基于SSM的在线教育系统的设计与实现 需求规格说明书 Version: 1.0.0 目 录 项 目 承 担 部 门: HELLOWORLD! 1 撰 写 人(签名): 陈徐锋 1 引言 1 1.1 目 ...

  3. 基于ssm jsp在线教育系统源码

    演示视频: 基于ssm jsp在线教育系统源码 范围 系统主要目标设计 随着互联网发展,在线教学成为一种支持知识共享,无距离知识交流的一种方式,我们的系统主要完成在线视频观看,在线教学,在线知识交流, ...

  4. java 在线投票_基于javaweb的在线投票系统

    [实例简介] 基于javaweb的在线投票系统,使用SSH框架.用户注册登录后,可以发起投票,管理投票,参与投票,查看投票比例和结果等. [实例截图] [核心代码] Vote └── Vote ├── ...

  5. java项目:基于springboot+vue在线考试系统1013

    项目描述 springboot+vue在线考试系统: 使用目前较为流行的框架spring boot,前端部分采用了vue,项目的业务流程相对简单,该项目主要功能包括学生管理,教师管理,题库管理,成绩查 ...

  6. pop客户机程序流程图_基于.NET的在线考试系统的设计与实现

    基于.NET的在线考试系统的设计与实现(包含任务书,开题报告,毕业论文19000字,程序代码,数据库) 摘  要 随着互联网的发展,人们已经进入了信息时代.在这种环境下,学生希望得到个性化的满足,这使 ...

  7. 嘿从零开始基于SpringBoot 打造在线聊天室(4.4W字最长博文)

    文章目录 前言 效果 主页面 消息提示 聊天页面 登录注册 前端 项目构建 依赖 项目结构 登录注册 验证码部分 登录页面 注册页面 主页面 流程 websocket loadmessage 消息发送 ...

  8. java基于springboot外卖在线订餐系统(厨艺论坛)有论文

    简介 本项目主要包括了外卖订餐系统(在线订餐和外卖配送).厨艺论坛系统.管理员后台.用户中心等功能.用户注册后可以选择餐桌在线点餐支付,也可以选择外卖配送到家的方式. 演示视频 https://www ...

  9. Java EE 企业网站_基于jsp的企业网站系统-JavaEE实现企业网站系统 - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的企业网站系统, 该项目可用各类java课程设计大作业中, 企业网站系统的系统架构分为前后台两部分, 最终实现在线上 ...

最新文章

  1. linux当前时间 按格式化,Linux下date命令,格式化输出,时间设置
  2. 参数的范数正则/惩罚(parameter norm penalties)
  3. git的smart Checkout跟force checkout的区别
  4. P3980 NOI2008志愿者招募
  5. 华为P50首发麒麟9000L:5nm EUV工艺打造 配置有所缩减
  6. MySQL快速上手[学习笔记](一)
  7. git之提交本地代码到远端指定仓库
  8. Java HotSpot(TM) 64-Bit Server VM warning: NewSize (1536k) is greater than the MaxNewSize (1024k)
  9. 9.Linux性能诊断 --- Web应用安全:攻击,防护与检测,IPv6,容器安全
  10. 联华精选APP--请求body体和返回体加解密
  11. 速达服务器应用程序错误,速达软件错误集锦及解决方法
  12. 【信息系统项目管理师】2018下半年系统集成项目管理工程师案例分析
  13. Unable to connect to the server: x509: certificate is valid for问题解决
  14. python海龟画图(6)多边形(2)
  15. java.lang.IllegalStateException: Migration didn‘t properly handle
  16. ffmpeg源码简析(十)libswscale中的SwsContext,sws_scale()
  17. MySQL报错 1273 - Unknown collation: ‘utf8mb4_0900_ai_ci‘
  18. 手机怎么修改编辑PDF中的文字?两分钟教你学会编辑方法
  19. 安卓虚拟键盘_逍遥安卓模拟器对电脑配置有什么要求
  20. 【记一次kafka启动报org.apache.zookeeper.KeeperException$NoAuthException:=Noauth for/consumers】

热门文章

  1. JDK 12主要特性一览
  2. java disruptor压测_Disruptor VS BlockingQueue
  3. React Native - 使用CameraRoll将图片保存到本地相册
  4. Vue3 数据响应式
  5. Android学习之重力传感器使用
  6. [没接触过kubevirt?]15分钟快速入门kubevirt
  7. 基于步科(Kinco HMI 2.5)的组态软件使用
  8. 【设计模式之美 设计原则与思想:设计原则】22 | 理论八:如何用迪米特法则(LOD)实现“高内聚、松耦合”?
  9. Excel学习笔记:P35-Excel怪盗现身。这些网页资料我全部都要了
  10. 稀土掘金与英特尔联合举办首届未来大会,技术、商业双视角探索产业数字化转型