NeoValine:一个基于 Valine 开发的支持人工审核的评论系统
终于,我的评论系统开发成功了 🎉🎉🎉 我将其命名为 NeoValine 🥳
项目链接:
简介
NeoValine 是一款基于 Valine 开发的,有后端和控制面板的,支持人工审核(先审核后显示)的快速、简洁且高效的评论系统。
未来打算支持
- 使用 Docker 来简化部署
- 简单的文章访客统计和网站访客统计
- 更高程度的用户自定义
- 移除或改进可能造成隐私泄露的功能
开发 NeoValine 的理由
评论系统是博客中很重要的一部分,是网站与访问者沟通交流的重要渠道。有不少开发者都为博客系统开发了好用的评论系统,比如 Valine。这些评论系统可以在无服务器的情况下部署使用。
但是我的网站是在中国大陆注册的,进行了 ICP 备案和公网备案。而根据公网备案的相关要求,我的网站上的评论系统必须具有先审核后显示的功能。
但是我找遍了全网的评论系统,全都难以符合我的要求,所以我决定自己开发一套有先审核后显示功能的评论系统。
为什么我说全网的评论系统都难以符合我的要求呢?
首先一个问题就是这些评论系统的数据都存储在他们的服务器上。假如哪天这些厂商倒闭了或者开发者弃坑了,数据转移是一个很大的问题。
Valine
基于 LeanCloud 的 Server-less 评论系统,界面很漂亮。
官网链接:Valine
其实在 LeanCloud 上部署 Valine-Admin 是可以有人工审核的功能的,但是由于 LeanCloud 的应用无法 24h 提供服务,每天强制停止服务 6 小时(可以正常评论,但是部署的应用无法正常工作),这就导致了在上面部署的应用在某部分时间段里是失效的。
假如每天只在 7:00~23:59 之间服务,则会导致以下问题:
- 该时间段内的评论会直接通过审核,这应该是一个漏洞。
- 该时间段内的评论不会及时提醒。
除此之外,Valine-Admin 的评论管理界面对移动端的适配也有点问题。
畅言
有人工审核的功能,但是界面过时,且免费版有广告。
GitHub 系列
包括 gitment,gitalk 和 gitter。
没有人工审核应该是唯一的缺点。
Disqus 系列
使用 Facebook、Tweeter 登录评论不符合国情,没有人工审核的功能,且被墙的可能性很大。
Boom!NeoValine!
Serverless 是近几年前端技术的趋势之一,也是 Valine 坚持的理念之一。但是我仍然坚持自己开发后端程序。
首先是因为费用问题,一些 Serverless 的服务,比如 LeanCloud,无法支持全天 24 小时提供服务,每天必须强制休眠一段时间。
其次是因为没有美观舒服的后台系统。因为经常要进入后台审核评论,后台的功能性(比如对数据的简单筛选)和美观性很难保证。想要实现的话很大程度上还要自己开发应用并在 LeanCloud 部署。
再者,评论数据的后期迁移也是一件不简单的事情。这主要是考虑 LeanCloud 某天可能会停止服务的情况。
最后,我的网站是部署在服务器上的,顺便还可以积累一下从开发到部署的经验。
后端部署方法
实例环境:CentOS 7.8.2003
这里给出的安装策略是:使用 uwsgi 在 localhost 运行 Django 后端程序,使用 Systemd 守护进程,使用 Nginx 反向代理 API 接口。
如果你青睐于使用跨域,感谢 OuYanghaoyue 的贡献,NeoValine 现已支持跨域部署。
Requirements
Python >= 3.7
pip
uwsgi
sqlite3
nginx
systemd
比较老的 Linux 版本可能不支持 Python3.7
,需要自己编译安装。这些环境的安装教程网上已有大把文章,这里不再赘述。
部署 Django 程序
首先在服务器上获得项目代码:
git clone https://github.com/UdUklm/NeoValineBackend --depth 1
编辑 NeoValineBackend/NeoValineBackend/hidden_options.py
,并按照提示填写参数:
cd NeoValineBackend/NeoValineBackend/
mv hidden_options.py.example hidden_options.py
vim hidden_options.py
返回项目根目录。
在项目根目录生成数据库:
sqlite3 db.sqlite3
安装 Virtualenv 并创建虚拟环境,安装依赖:
pip install virtualenv
virtualenv venv
source venv/bin/activate
pip install -r requirements.txt
生成数据库表:
python manage.py makemigrations user
python manage.py makemigrations comment
python manage.py makemigrations
python manage.py migrate user
python manage.py migrate comment
python manage.py migrate
生成超级管理员,并填写信息:
python manage.py createsuperuser
生成静态文件夹:
python manage.py collectstatic
到这里程序已经准备完成,如果想检测是否出错,可以将 https://github.com/UdUklm/NeoValineBackend/blob/master/NeoValineBackend/settings.py
中的 DEBUG
置为 True
,之后运行 python manage.py runserver
查看效果。注意之后勿忘将 DEBUG
置回 False
。
使用 uwsgi 部署 Django 程序
生成一个 uwsgi.ini
文件,按照下列提示填入:
[uwsgi]
pid = run_user
chdir = path_to_NeoValineBackend
master = true
processes = 1
threads = 2
http = 127.0.0.1:8080
static-map = /static=path_to_static_folder
vacuum = true
home = path_to_venv
wsgi-file = path_to_/NeoValineBackend/NeoValineBackend/wsgi.py
logto = log_location_you_want
记住该文件的位置
使用 Systemd 守护进程
cd /etc/systemd/system
touch neovaline.servise
编辑 neovaline.servise
:
[Unit]
Description=NeoValine Backend Service
After=syslog.target
[Service]
KillSignal=SIGQUIT
ExecStart=/usr/local/python3/bin/uwsgi --ini path_to_uwsgi.ini
Restart=always
Type=notify
NotifyAccess=all
StandardError=syslog
[Install]
WantedBy=multi-user.target
相关命令:
systemctl start neovaline # 开启服务
systemctl enable neovaline # 开机自启
systemctl stop neovaline # 关闭服务
开启后可以使用 netstat -ntlp
检测本地 8080
端口运行情况。
使用 Nginx 反向代理
在网站的 Nginx 配置文件中加入:
location /api/ {
proxy_pass http://127.0.0.1:8080;
access_log log_location_you_want;
}
即将所有以 /api/
开头的请求转发到 127.0.0.1:8080
。
前端使用方法
前端的部署参考 Valine 的部署方法。
但是有些参数不支持,比如 appId
和 appKey
,示例配置如下:
<script>
new Valine({
el : '#valine-comments',
placeholder: '评论在后台人工审核后可见;\n留下邮箱可以接收回复等通知 ~',
avatar : 'mm',
meta : guest,
pageSize : 10,
visitor : false,
lang : 'zh-cn',
recordIP : false
});
</script>
之后把 Valine.min.js 路径引入 html,并把 <div class="comments" id="valine-comments"></div>
放到你网页中想让评论页面出现的地方就行了。
Valine.min.js文件:https://github.com/UdUklm/NeoValine/tree/master/dist
或者你可以使用 CDN:cdn.jsdelivr.net/gh/OuYanghaoyue/NeoValine@0.1/dist/Valine.min.js