简单的家族谱编辑展示
数据库的表结构设计
每一个家族谱的节点都有一个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>
---------------------------------------------------------------------------------------------------------------------------------------------------------
记录一下! ~~