2021.11.14
项目参考:
1、后端:https://www.bilibili.com/video/BV1y7411R73P
2、前端:https://www.bilibili.com/video/BV1fw411d7R5?p=31
一、TreeNode
受到实习公司的启发,我毕设也弄了一个TreeNode来存储系统中很常用到的多级层级结构。Antd中的Cascader组件,树形的表格等都需要用到这样的数据结构。
表结构如下:其中用level来标记当前是第几层,type来标记当前是什么类型
例如college学院-major专业-class班级是同一场景下的。
先查询到所有的树节点(这里还涉及到Mybatis3的逆向工程生成的SQL的API的使用,下面这样就能实现Select * from TreeNode where type = ‘COLLEGE’ or type = ‘MAJOR’ or type=‘CLASS’的效果)
然后写了一个通用的方法来构建树结构(感觉我好菜,好像Java的水平好久都没提高了,比如枚举、泛型、反射高级一点的东西都基本不会用。
比如这里我原先是想要根据isLeaf来判断当前是否是叶子节点,是就没有必要往下for循环了,从而实现动态来决定for循环几次,但是这里我只会用level判断,所有就只能支持3层的树结构了。。。)
使用方法就是先查到所有的节点(这个时候他们还是平级的,没有层级结构,只是一个List),利用这个工具类得到树结构
接口返回效果:
二、枚举类 和 switch 的结合使用
枚举eg:
package com.jmu.uacs.enums;
public enum TreeNodeEnum {
COLLEGE("COLLEGE", "学院"),
MAJOR("MAJOR", "专业"),
CLASS("CLASS", "班级"),
CAMPUS("CAMPUS", "校区"),
BUILDING("BUILDING", "教学楼"),
CLASSROOM("CLASSROOM", "教室"),
TAG("TAG", "标签");
private String value;
private String lable;
TreeNodeEnum(String value, String lable) {
this.value = value;
this.lable = lable;
}
public String getValue() {
return value;
}
public String getLable() {
return lable;
}
public static TreeNodeEnum getEnumByValue(String value) {
for (TreeNodeEnum enums : TreeNodeEnum.values()) {
if (enums.getValue().equals(value)) {
return enums;
}
}
return null;
}
}
我原来是打算这么用的:
但是也看到了,编译都不通过。case 后面需要常量,可是这么写是一个变量。然后我去网上查了一下,改成了下面这个样子:
switch内的是我们的Enum类型的,case就是里面定义的枚举。getEnumByValue就是用前端传过来的type来获取对应的enum。我一直感觉枚举好难用啊,为什么他不自身不提供根据String来获取对应Enum的方法呢,还要我们自己实现。
三、灵异事件
还遇到一个贼诡异的事情
我本来用来接收参数的VO中pId是Integer类型的,但是我axios发送的请求,vo的pId接收到的一直是null,但是我用Swagger的接口测试UI就可以接收到。莫名其妙的,我就怀疑是由于Integer是引用类型,他和axios的数值并不能自动映射匹配上,我就把Interger改成int了,果然就成功了。
??? 黑人问号
// 事后
但是上面的成功也是假象,0插入成功只是因为VO初始化的时候,int类型默认就是0,所有我后面pId不是0的时候,VO仍然接收不到,存到数据库中仍然是0
我盯得眼睛都要瞎了,突然发现,swagger的pid的 i 是小写的!!为什么??我VO里面明明写的是pId,是大写的I!!我也反复编译过,确认没问题了,这要是没用swagger-ui测试接口,我下辈子都不知道为什么??!这也太坑了。估计是swagger自己定的啥规矩。。。醉了