(挖坑🕳️)从零开始开发自己的信息管理系统

什么是信息管理系统?要这玩意干啥?简单的说,就是单纯因为懒。信息太多,精力太少,人生苦短,我要帮手。要展开说,见这篇「我理想中的「信息管理工具」🤔」。

市面上的信息管理系统还不够你玩的吗?为什么要费劲去开发自己的信息管理系统?简单的说,一是不够贴合我的需求,二是数据这玩意总还是掌握在自己手里最方便。

好吧,开始吧。

第0️⃣版 一个可以工作的极致简陋原型

最初的想法就是单纯的管理一下工作日志。这件事吧,要图省事的话,建个 .txt 里面就行。但随之而来两个问题:

  • 一是太麻烦,什么都得自己来。比如录入时间这种事,每次都手工敲就很烦。
  • 二是功能太单一,想插入张图片啦、做些统计啦……就很不舒服。

但,最重要的是,丑!!!🤦🏻♂️

而其实就算是单纯用 .txt 来记录,也得遵从一些约定(比如:一些简单的日记格式),不然记得多了,自己都晕了。「规范」这件事的重要性,现在还看不出来,但后面将会碰到。

接着,想到的是记在 MarkDown 文件里面,在 Web 端渲染出来。这样,就可以用 CSS 控制样式,首先把「丑」的问题解决了。

  • 2017-12-05: 做了「日志系统」的原型(可以从 e: 盘读取 .md 文件,汇总在网页端显示。但还不能显示动态内容)。
  • 2017-12-06: 用 sinatra 重写了「日志系统」原型;
  • 2017-12-06: 给「日志系统」原型添加了样式表;

第1️⃣版 健全武器库 / 工具箱🔧

好吧,手工造轮子果然很麻烦,我们还是投靠专业的工具吧。上 Sinatra + Kramdown !

这一版,我们希望解决这么几个需求:

  • 搜索🔍;
  • 词条统计📈;
  • 项目进度查询;
  • 热力图 + 指向;
  • 简易的成就系统;
  • issues(问题数据库);
  • 日志编辑:思考「记录粒度」的影响,记录什么?
  • 2017-12-22: 为「日志系统」添加了「项目进度查询模块」(e.g. /schedule?word=blabla概论),但还不能可视化展现。准备用 d3.js 实现,目前还在学习中;
  • 2017-12-27: 用 ECharts 为「项目进度查询模块」改写了可视化呈现(代码比较脏);
  • 2017-12-28: 给「日志系统」添加了「词条统计模块/stat」;
  • 2018-01-03: 为「日志系统」添加了「加班分布/calendar」;
  • 2018-01-04: 为「日志系统」添加了「日工作量热力图/heat-map」;
  • 2018-01-08: 给「日志系统」添加了「经验汇总/tips」;
  • 2018-01-08: 给「日志系统」添加了「成就系统/achievements」;
  • 2018-01-09: 给「日志系统」添加了「问题数据库/problems-db[1]
  • 2018-01-09: 给「日志系统」修改了样式;
  • 2018-01-11: 为「日志系统」添加了「日志编辑模块/admin[2]

第2️⃣版 回头思考「底层数据结构」

第1️⃣版最大的缺陷是:记录的粒度过大,……

转向「基于事项的设计」。采用细粒度记录,可以带来更多的可玩可能。

痛苦的数据结构迁移。

  • 时间线;
  • 工作提示;
  • todo;
  • 自动汇总;
  • 依标签🏷搜索;
  • 玩法;
  • 开发日志;
  • 扩展命令;
  • 2018-01-16: 调试「日志转事项」模块;
  • 2018-01-18: DONE: 「日志系统」底层数据结构迁移;
  • 2018-01-22: 完成了「时间线」模块。现在可以通过 /statuses/view?id=<id> 查看其所在时间线上的所有事项;
  • 2018-01-22: 根据新的底层数据结构重写了「成就系统/achievements」;
  • 2018-01-30: 根据新的底层数据结构重写了「日志搜索/search」;
  • 2018-01-30: 根据新的底层数据结构重写了「词条统计/stat」;
  • 2018-01-31: 根据新的底层数据结构重写了「工作量热力图/heat-map」;
  • 2018-01-31: 根据新的底层数据结构重写了「工作提示/tips」;
  • 2018-02-05: 根据新的底层数据结构重写了「问题库/issues」;

在突破底层数据结构的制约(主要是数据聚合方面)后,开启了众多新玩法:

  • 2018-02-08: 完成了「TODO 事项/todo」的聚合;
  • 2018-02-08: 添加了「玩法/fun」页面;
  • 2018-02-08: Update: 为首页添加了「记录条数」的动态显示;
  • 2018-02-08: Add: 开发日志/dev
  • 2018-02-08: Update: 为首页添加了「待办事项数」的动态显示;
  • 2018-02-08: Add: 添加了「日视图/day/2018-02-08」;
  • 2018-02-14: Added: 识别单位简称(在 ./data/abbreviation.txt 中注明,用 = 分隔(e.g. 集团公司 = 集团));
  • 2018-02-23: Added: 如果搜索关键词为某个部门,将会返回相关联系人信息(要是有的话)[3]
  • 2018-02-24: Added: 「依标签搜索 /search-by-tag」;
  • 2018-02-24: Added: 上线了「热力搜索 /heat-map-by-keyword」;
  • 2018-02-28: Added: 添加了自动编号命令 ::no.::
  • 2018-04-25: Added: 「Todo 统计 /stat-of-todos」页面;
  • 2018-05-22: Added: 「日志·周汇总 /week/1」页面;
  • 2018-05-23: Added: 「用户资料馆 /profiles」页面,能从表格中抽取名片信息;

第3️⃣版 移动适配很重要!!!

移动适配:Bulma

  • 2018-05-29: Improved: 用 bulma 改写了首页;
  • 2019-02-27: Added: 重写了「时间线」页面,使之适配移动端;

第4️⃣版 测试也很重要!!!

随着功能的不断累加,我们继续一种「保证新功能不会影响原有功能」的机制。因此,测试的需求越来越强烈。

  • 测试 + 性能;
  • 思考 API 、 可玩性;

第5️⃣版 补完计划

  • 全过程记录
  • 面板改造
  • 账号系统
  • 标签系统
  • 彻底的游戏化改造
  • 分离配置文件,简化安装,为开源做准备
  • 打通各个数据孤岛

开始思考「如何提高复用率」,解决办法之一是「组件化改造」:

  • 2019-02-15: Added: 把「热力图」提取为「/heat-map-template?url=<url>」组件,可通过传入 .json 文件配置[4]
  • 2019-02-24: Updated: 通过「给 /statuses-bulma/new-record 页面传递 json 参数」的形式,重写了 /statuses-bulma/new-log & /statuses-bulma/new-task 。以后,可方便地根据场景定义新建日志页面;
  • 2019-03-19: Added: 「/component/datatables」组件,path 约定放在 /data 目录下,size 为显示前 size 项;
  • 2019-05-01: Added: 「/component/bar 组件」;
  • 2019-05-03: Added: 「/component/pie 组件」;
  • 2019-05-04: Added: 「/component/chartlist 组件」;
  • 2019-06-04: Added: 组件 /component/knowledge-graph ,可简单聚合人员信息;
  • 2019-06-11: Updated: 把 /statuses/new-record 修改为 /component/editor
  • 2019-01-10: Added: 「版本比对」功能;
  • 2019-02-15: Added: 「文档库 /doc」页面,把 MarkDown 文件丢到 /doc 目录下即可;
  • 2019-02-15: Added: 在每次响应前,把请求的 url 记录在 ./data/url.log[5]
  • 2019-02-15: Added: 「日志分析 /log-analyse」页面;
  • 2019-02-20: Added: 对 mermaid 的支持。「落格」从此可以画流程图了;
  • 2019-02-20: Added: 利用 highlight.js 实现了语法高亮;
  • 2019-02-20: Added: Font Awesome 命令 ::fa-<icon>::
  • 2019-02-22: Added: 通过 MathJax 库支持 $\LaTeX$
  • 2019-02-24: Added: 开始使用「思源宋体」;
  • 2019-02-24: Updated: 把 db_history.json 改成 diff 模式存储,结果文件大小反而变大了近一倍-_-!;
  • 2019-02-27: Added: 支持在线运行代码(目前仅支持 Ruby 代码)[6]
  • 2019-02-27: Added: 「链接导航命令( Table of Content )」 命令 ::toc::
  • 2019-02-27: Updated: 又把「历史版本」的存储格式改回了「普通文本」,而非「diff 格式」;
  • 2019-02-28: Added: 定制了「步骤图」脚本;
  • 2019-03-06: Added: 用 Editor.md 替换了原始编辑框;
  • 2019-03-06: Updated: 重写了「日视图」「周视图」;
  • 2019-03-06: Added: 「月视图」「年视图」;
  • 2019-03-06: Updated: 让「文档库 /doc」支持文件夹;
  • 2019-03-08: Added: GET /api/tables/<id>/<no> 拿到某条记录下的第 <no> 张表的 json 数据。并可通过 /tables 查看[7]
  • 2019-03-08: Added: 可通过搜索 #<id> 跳转到相应记录;
  • 2019-03-18: Added: 「/benchmark 页面」,用于分析「渲染效率」;
  • 2019-03-25: Updated: 可以通过 #cancel# 取消待办事项;
  • 2019-03-26: Updated: 给 /api/statuses/filter 添加了「起止日期筛选」(e.g. /api/statuses/filter?date_from=2019-03-22&date_to=2019-03-25);
  • 2019-05-01: Added: 「缩略语词库 /abbr 」页面;
  • 2019-05-14: Updated: 把所有和「数据写入、更新」相关的接口都挪到了 lib/io.rb
  • 2019-06-25: Added: 函数 merge_tables() ,用以合并表格;
  • 2019-06-25: Added: /api/merge-tables & /component/table & get_data_by()
  • 2019-06-25: Added: /print-json?api=<api> 用以更好地显示 json 数据;
  • 2019-07-06: Added: merge_table_by_timeline(id, topic) 用以聚会某条时间线下的特定主题的表格;

期间,也摸索到 MarkDown 语法的局限,开始拓展 MD :

  • 2019-03-13: Updated: 将表格拎出来(前后加上 ~~~table & ~~~),不对其作预处理。基于三点考虑:一是提高预处理速度;二是因为表格数据来源杂,预处理自动标记准确率不高;三是方便以后增强表格展示;
  • 2019-04-30: Added: 「/articles」页面,作为简易的文摘系统。用法为:-=这里是要高亮的句子=-{: 这里可以写注释,可选的。 }
  • 2019-05-23: Added: 「Q & A」;
  • 2019-05-28: Added: 引入了「高亮标记」 -=bla bla...=-
  • 2019-05-29: Added: 支持「层级序号」;

回顾:如何打造一套信息管理系统

  • 统一的底层数据结构
  • API
  • 可玩性

在这过程中,目标越来越模糊:我到底想要什么?!!

弱连接

我没拿到驾照的时候,只敢在地下停车场🅿️转转。准备发条微博调侃一下自己,本想表达某种「漆黑」的环境,但觉得不够味,又想到了「黑暗」,但其实我内心真正想要的是「见不得光」这种双关词。

对,这才是我想要的!我希望这套系统能够在我打破脑袋翻「漆黑」的同义词而不得解的时候,告诉我「见不得光」这个词。我希望找到某个主题的所有「弱连接」。


  1. 后更名为 /issues

  2. 后因为底层数据结构由「一天的日志」变更为「一个事项」,弃用。

  3. 开始试水「信息聚合」。

  4. 开始「组件化」改造。

  5. 开始意识到「留痕」的重要,虽然还没有处理能力。

  6. 这个功能非常重要。

  7. 这个 API 对聚合信息非常有帮助。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容