nifengz

撸一个评论系统

2018-02-01

撸一个评论系统

唠叨

开通了博客,想加一个评论系统,想用多说 ,可惜多说关闭了。尝试友言,一直 502....囧。

那么,索性就自己动手撸一个吧。

这篇博客记录了从构思到实践中的过程的一些想法。

目标与构思

  • 个人博客上使用的评论系统要简洁,轻量
  • 前后端分离,这样可以方便的插入到不同的博客系统中,如 wordpress, hexo
  • 程序要方便安装和部署

基于以上三点的考虑,下面确定方案:

  1. 界面的设计风格参考了disqus, 简洁的设计个人十分喜欢。
  2. 个人博客的访问量不是很大,服务器没有那么大的压力,所以轻量级的数据库和Http服务器即可应对。于是决定使用C++作为开发语言、 数据库选用SQLite3, Http Server 选择了直接源码集成mongoose
  3. 项目的编译采用了CMake。同时包含了所依赖的开源库,默认首次编译时进行安装并静态链接,最终的服务端程序只包含一个可执行程序和一个配置文件。
  4. 另外,由于要前后端分离,后端只提供Http RESTful 的API来进行服务。所以前端需要一个可以在浏览器端运行的html 模板库。这样就可以在浏览器端直接生成DOM。查阅了下html tempalte相关的内容,发现前端的朋友们造轮子的热情相当高涨,各种开源库与解决方案层数不穷。最终我选择了JADE作为前端模板库。原因是JADE灰常简单,像我这种没有做过前端的人都能很快上手,其他的方案留到以后有空再慢慢研究吧。

成果

在线测试请戳:Live Demo

项目已经放在github托管,如需使用请戳:项目地址

comnets

程序点滴

开发过程也是学习的过程,最早的时候前端打算用bootstrap,但是发现我仅仅是需要一个网格式的布局,所以最终还是用flex 布局搞定。

结构化的数据库设计也是一个值得思考的地方,由于传统关系型数据库不适合表达结构化数据,参考了Modified Preorder Tree ,很巧妙。

为了加快访问速度。我对数据查询的结果做了一层缓存,这层缓存是对整站评论数据在内存中的完整映射,可以设置缓存占用内存的大小,超过限制时将会使近24小时访问频率较低的50%缓存失效(TODO,目前是50%的缓存失效)。为了实现这个简单设计了一下内存的数据结构。首先整站的评论内容可以看成是一个map结构,每个uri对应一个评论组,即key为uri,Value为一个评论组。我用一个预先定义大小的指针数组来存放这个评论组,必要的时候会自动扩容。指针数组中的每个元素是一个链表的指针,指向一个楼层的评论数据,其中第一个元素是主楼层的评论,后面的元素是本楼中的跟帖评论(子楼层)如下图:

数据结构

总结

在这个小demo中我学到了不少新的内容,也对未来有了一些思考。今年想利用工作之余深入看一下python

最最最重要的是要保重身体,最近几天也开始恢复训练了。但是明显感觉到肩膀的旧疾对我的影响是很大的。所谓欲速则不达,特别是身体这件事,慢慢恢复吧, Just keep the hard workout.

扫描二维码,分享此文章