什么是信息管理系统?要这玩意干啥?简单的说,就是单纯因为懒。信息太多,精力太少,人生苦短,我要帮手。要展开说,见这篇「我理想中的「信息管理工具」🤔」。
市面上的信息管理系统还不够你玩的吗?为什么要费劲去开发自己的信息管理系统?简单的说,一是不够贴合我的需求,二是数据这玩意总还是掌握在自己手里最方便。
好吧,开始吧。
第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
- 可玩性
在这过程中,目标越来越模糊:我到底想要什么?!!
弱连接
我没拿到驾照的时候,只敢在地下停车场🅿️转转。准备发条微博调侃一下自己,本想表达某种「漆黑」的环境,但觉得不够味,又想到了「黑暗」,但其实我内心真正想要的是「见不得光」这种双关词。
对,这才是我想要的!我希望这套系统能够在我打破脑袋翻「漆黑」的同义词而不得解的时候,告诉我「见不得光」这个词。我希望找到某个主题的所有「弱连接」。