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