家族谱树形数据结构实现

简单的家族谱编辑展示

数据库的表结构设计

 每一个家族谱的节点都有一个parentid  对应的父节点,和一个手机号码,通过手机号码以及人物的psid就能准备的定位这个人物在哪张家族谱中以及位置。

这个项目算是一个比较老的项目了。 后端用的struts2+Hibernate  配置也比较繁琐,前端是jsp+vue。

下面是具体的功能实现

家族谱对象

MemoryFamilyTree

@Entity
@Table(name = "memory_family_tree", schema = "dbo", catalog = "smf")
public class MemoryFamilyTree implements Serializable {
    @Id
    @Column(name = "id", unique = true, nullable = false, length = 50)
    private String id;
    @Column(name = "psid", length = 500)
    private String psId;
    @Column(name = "level", length = 500)
    private Integer level;
    @Column(name = "parent_id", length = 500)
    private String parentId;
    @Column(name = "creator", length = 500)
    private String creator;
    @Column(name = "creator_name", length = 500)
    private String creatorName;
    @Column(name = "create_time", length = 500)
    private String createTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
    @Column(name = "mobile", length = 500)
    private String mobile;
    @Column(name = "status", length = 500)
    private Integer status;
    @Column(name = "ext1", length = 500)
    private String ext1;
    @Column(name = "ext2", length = 500)
    private String ext2;
    @Column(name = "ext3", length = 500)
    private String ext3;
    @Column(name = "ext4", length = 500)
    private String ext4;
    @Column(name = "ext5", length = 500)
    private String ext5;
    //配偶Id
    @Column(name = "mate_id", length = 500)
    private String mateId;
    //家族谱根节点人物首字母
    @Column(name = "root_initial", length = 500)
    private String rootInitial;
    //封装配偶信息
    @Transient
    private MemoryPerson memoryPersonMate;
    @Transient//忽略这个字段
    private List<MemoryFamilyTree> children;

这个是接口方法

Object objId = request.getParameter("id");
Object objMobile = request.getParameter("mobile");
String hql = null;
MemoryFamilyTree memoryFamilyTree = null;
List list = null;
if(objId == null||StringUtils.isBlank(objId.toString())) {
    // status:状态:0-未删除;1-已删除
    hql = "from MemoryFamilyTree where mobile like '%" + objMobile.toString() + "%' and parentId = '0' and status = 0";
    list = memoryFamilyTreeDao.getListByHQL(hql);
}else if(objMobile == null || StringUtils.isBlank(objMobile.toString())) {
    // status:状态:0-未删除;1-已删除
    hql = "from MemoryFamilyTree where id = '" + objId.toString() + "' and status = 0";
    list = memoryFamilyTreeDao.getListByHQL(hql);
}

if(list.size() > 0) {
    memoryFamilyTree = (MemoryFamilyTree) list.get(0);
    //将查询出来的这个根节点传入递归查询出他所有的子类
    memoryFamilyTree = getChildNode(memoryFamilyTree);
}

resultMap.put("result", true);
resultMap.put("memoryFamilyTree", memoryFamilyTree);
writer.write(JSonUtil.obj2Json(resultMap));

//循环递归调用的方法

private MemoryFamilyTree getChildNode(MemoryFamilyTree memoryFamilyTree) {
    String parentId = memoryFamilyTree.getId();
    //获取这个人物的Mate_id;
    if(StringUtils.isNotEmpty(memoryFamilyTree.getMateId())){
        //查出纪念人物信息
        MemoryPerson memoryPerson = (MemoryPerson) memoryPersonDao.load(memoryFamilyTree.getMateId());
        memoryFamilyTree.setMemoryPersonMate(memoryPerson);
    }
    //用这个父节点,查询下面的所有子节点
    String hql = "from MemoryFamilyTree as u where u.parentId ='" + parentId + "'";
    List listByHQL = memoryFamilyTreeDao.getListByHQL(hql, null);
    if (listByHQL != null && listByHQL.size() > 0) {
        List<MemoryFamilyTree> memoryFamilyTrees = listByHQL;
        memoryFamilyTree.setChildren(memoryFamilyTrees);
        for (MemoryFamilyTree familyTree : memoryFamilyTrees) {
            getChildNode(familyTree);
        }
    }
    return memoryFamilyTree;
}

将每一条记录都封装成为一个对象。通过根节点可以将子节点查询出来之后递归子节点下面的子节点。

将查询出来的每个字节点数据都存入家族谱对象的children字段  这个对象就是一个List<MemoryFamilyTree>  

---------------------------------------------------------------------------------------------------------------------------------------------------------

记录一下! ~~

猜你喜欢

转载自blog.csdn.net/weixin_42323650/article/details/86062777