正大光明
最近尝试将族谱的数据电子化,按照项目管理的方式,相当于做了一个从需求到上线的小项目。
需求:
- 给一个名字,找祖先链
- 给一个名字,找所有后代
- 给两个名字,找两人的共同祖先
设计:
- Web系统
- 数据为加密文本,第一次加载并解密,此后所有数据从内存直接读取
- 程序启动后,原始数据文本删除
- 程序需要授权才能访问
主要问题的考虑和处理:
- 每人的编码占2位,男子以0开头,比如01,02等;始祖文举编码为A1。当代女孩入谱,编码以1开头,比如11,12等。每人编码2位之前的是祖先的编码。
- 嗣子的编码有2个,嗣子及其子孙按其继父亲编号。父亲有嗣子的,父亲标记:嗣子XX;其中XX的后代均以这个父亲的编码传承。其生物学父亲下这个儿子标记为: 出嗣某某后,或嗣与某某后。
- 嗣子双承是一种复杂情况,A只有一个儿子X,这个儿子也承担A的兄弟B的责任。这种情况,X的后代按A编码;其中A下的X标记嗣子双承,B下的X标记嗣子双承嗣子。分嗣子情况类似,A的儿子承担A的兄弟B,C等多个兄弟的责任,标记为分嗣子。
- 嗣孙情况更复杂一些,因中间缺少一名父亲,所以依旧使用其生物学祖父、父亲的编码来传承,并且嗣孙的编码只有一个。
程序的授权使用JWT token,这样一个口令可以多人使用,避免了用户账号的管理;token还可以设定有效时间。这样整个开发就很明了了,使用熟悉的Spring web开发,前端家族树的展示使用d3.js库,非常漂亮。整个开发过程最大的麻烦是数据录入。首先要对每个人进行编码,这个还好,先祖姓名很多使用繁体,有些字我甚至现在都没有找到,导致录入时非常慢;还有一些数据不一致的情况,相当于校对了一遍。整个事情做完,大概过去了2、3个月。 最后,从火山引擎(字节跳动的云服务)申请了一个虚拟机,把程序部署了上去。
族谱总共记录了约5000个名字,全部展开是一棵巨大的树;从始祖文举到辈分最小的传人,经历了23世,即使每世20年,到现在都有大约500年的历史了。里面有烈士,有乡贤,有官员,还记载了一部分迁居到台湾的人。名字显示了文化以及传统,体现了历史的传承,下图中思字辈是我的高祖父一辈,正大光明,恢聚清。