背景
Valine是一款基于LeanCloud的“无后端”评论系统。说是无后端,实际上LeanCloud就是他的后端。然而不幸的是,LeanCloud即将在2027年停止服务,届时本博客的留言板也将无法使用。
为了继续使用Valine,我打算自己实现一个后端服务来取代LeanCloud。正好Valine的配置文件里支持配置请求的URL,我只需要按照LeanCloud的API协议来实现服务,就能完全兼容Valine插件了。
需求分析
目前本博客的留言板没有账号系统,只有非常简单的评论功能,增删查改四大操作里,只实现了增和查。通过浏览器控制台抓包,就可以归纳出Valine工作过程中需要调用哪些接口,以及接口对应的协议。
1. 分页查询所有根评论
请求URL:GET /1.1/classes/Comment
请求参数:
回包结构:
2. 查询所有根评论数量
请求URL:GET /1.1/classes/Comment
请求参数:
回包结构:
3. 根据根评论ID查询所有子评论
请求URL:GET /1.1/cloudQuery
请求参数:
回包结构:
4. 提交评论、回复评论
请求URL:POST /1.1/classes/Comment
请求参数:
回包结构:
存储设计
我把存在LeanCloud里的评论数据导出后,得到了一个JSON串。根据JSON串中的字段名,设计MySQL数据表如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| CREATE TABLE comment ( id BIGINT(20) AUTO_INCREMENT COMMENT '自增主键', object_id VARCHAR(32) NOT NULL DEFAULT '' COMMENT '原始对象ID', nick VARCHAR(100) NOT NULL DEFAULT 'ANONYMOUS' COMMENT '昵称', ip VARCHAR(45) DEFAULT '' COMMENT 'IP地址(支持IPv6)', mail VARCHAR(100) DEFAULT '' COMMENT '邮箱', link VARCHAR(100) DEFAULT '' COMMENT '链接', url VARCHAR(100) DEFAULT '' COMMENT '页面URL', comment VARCHAR(2048) NOT NULL COMMENT '评论内容(HTML格式)', qq_avatar VARCHAR(100) DEFAULT '' COMMENT 'QQ头像链接', ua VARCHAR(1000) DEFAULT '' COMMENT '用户代理字符串', acl VARCHAR(500) DEFAULT '' COMMENT '访问控制列表(JSON字符串)', inserted_at VARCHAR(100) NOT NULL DEFAULT '' COMMENT '插入时间(JSON字符串)',
-- 关联关系字段 pid VARCHAR(32) DEFAULT '' COMMENT '父评论object_id', rid VARCHAR(32) DEFAULT '' COMMENT '根评论object_id',
-- 时间字段 created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
-- 索引 PRIMARY KEY (`Id`), UNIQUE KEY uk_object_id (object_id), INDEX idx_created_at (created_at), INDEX idx_updated_at (updated_at), INDEX idx_inserted_at (inserted_at), INDEX idx_pid (pid), INDEX idx_rid (rid), INDEX idx_url (url(100)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='评论表';
|
代码实现
详见:https://github.com/Cyclohexatriene/comment-backend-for-valine