开云手机站登录入口新手怎么玩

3年前 (2023-05-28)

思路:单表内查询全部数据,在业务层内递归拼接树结构。

前端用的是element的Tree 树形控件:

树结构实体:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class TreeSelect implements Serializable { /**
* 所需参数跟前端商讨,参数名跟前端确认一下,我的就是两个前端没统一后面还重加了个
*/ private static final long serialVersionUID = -1370015781272165366L; private Long id; private Long pid; private String label; /**
* 排序,树节点移动需要
*/
private int sno; @ApiModelProperty(value = "是否启用,0禁用,1正常")
private int status; /**
* 子级,下一级节点
*/
private List subordinate; }

业务层拼接树:

 @Override
public Object getSysClassifyItemTree(Long versionId) {
//查询出全部数据
List sysClassifyItemList = classifyMapper.getAll(versionId); Map> collect = sysClassifyItemList.stream().collect(Collectors.groupingBy(TreeSelect::getPid));
List list = collect.get(0L);
List items = new ArrayList<>();
if (null == list) {
//在没有数据的时候,给前端返回一个虚拟节点方便展示,操作
TreeSelect sss = new TreeSelect(0l, "虚拟节点", 0l);
items.add(sss);
return JSON.toJSON(items).toString();
}
for (TreeSelect sysClassifyItem : collect.get(0L)) {
buildTree(sysClassifyItem, collect);
}
//如果这个树需要一个固定的父节点,new一个TreeSelect对象 f,把拼出来的树塞到f的subordinate也就是子级。
return JSON.toJSON(list).toString();
} /**
* 拼接树
*/
private void buildTree(TreeSelect sysClassifyItem, Map> collect) {
if (null == sysClassifyItem || null == collect.get(sysClassifyItem.getId())) {
return;
}
sysClassifyItem.setSubordinate(collect.get(sysClassifyItem.getId()));
for (TreeSelect classifyItem : collect.get(sysClassifyItem.getId())) {
buildTree(classifyItem, collect);
}
}

在移动的时候我们需要知道自己的位置和要移动到的位置,也就是目标位置 同题参见

移动节点实体:

@Data
public class MoveNode implements Serializable {
private static final long serialVersionUID = 8370232720686896563L; private Long parentId;
private Long sno;//排序,节点当前位置
private Long targetSno;//目标位置
private Long id; }

业务层:

@Override
public boolean moveUp(MoveNode moveNode) { //判断节点是上移还是下移
if (moveNode.getMoveSno() > moveNode.getSno()) {
if (structureMapper.moveDownA(moveNode) == -1 || structureMapper.move(moveNode) == -1) {
return false;
}
} else if (moveNode.getMoveSno() < moveNode.getSno()) {
if (structureMapper.moveUpA(moveNode) == -1 || structureMapper.move(moveNode) == -1) {
return false;
}
}
return true;
}

mapper:



UPDATE SYS_TEAM

WEIGHT = WEIGHT + 1


and UNITID = #{parentId}
and WEIGHT BETWEEN #{moveSno} and #{sno}-1



UPDATE SYS_TEAM

WEIGHT = WEIGHT - 1


and UNITID = #{parentId}
and WEIGHT BETWEEN #{sno}+1 and #{moveSno}



UPDATE SYS_TEAM

WEIGHT = #{moveSno}


and UNITID = #{parentId}
and WEIGHT = #{sno}
and ID = #{id}


看下图,移动这里有个问题是前端无法拿到准确的位置,因为element的可拖拽树每个节点有after,before两条线,绑定的是这个节点自身的属性,也就是说两个节点之间有两条线,这就导致c节点在移动到A——B之间时可能会放到a2的这条线导致目标位置拿成了A的位置。 对照阅读即我本身是想将c移动到B的上方,结果是变成了A的上方,同理下移的时候A移动到B的下面,不小心就变成了C的下面。我在网上看有其他的tree控件是可以解决的,前端怕改的地方太多引起别的问题,一直没动。不知道大家有没有遇到过,怎么解决的呢?

你可能想看:

开云手机站登录入口新手怎么玩是MySQLMySQL为开云手机站登录入口新手怎么玩有两个版本? 相关阅读

MySQL的介绍MySQL数据库管理系统由瑞典DataKonsultAB开云手机站登录入口新手怎么玩研发,因此MySQL目前属于 Oracle 旗下产品。MySQL所采用SQL 语言是用于访问数据库最常用标准化语言。...

标签:前端mysql
分享给朋友:

继续阅读

若需了解「开云手机站登录入口新手怎么玩」的上下文,可结合站内栏目与相关篇目交叉阅读。

栏目用于追新,文内链接用于对照细节。两者配合可减少漏读与重复检索。

继续浏览时优先选择同栏目或相近主题,避免被站外镜像带偏。

站点导览

前端 · wiki · 科技 · 文化

页面按栏目组织。可先看导读,再进入相关篇目或返回列表。