最近逛友链博客,发现 Leonus 大佬又搞了不少新活,像“博主收藏”、“友链查询”等等,还有各种外链卡片,都是很实用的功能,非常奈斯啊。今天我也来整一个类似的文章收藏功能。
概述
首先要在原本的朋友圈文章卡片上新增一个收藏按钮,点击目标文章卡片上的按钮即可收藏该文章,然后在朋友圈文章列表的上方增加一条收藏栏,在收藏栏中显示所有的收藏文章列表。其次,一般只有博主本人才有权限增删收藏栏的文章,所以还要添加一个密码验证功能。
详细效果请前往 订阅 页面查看。
关于收藏栏的后端部分,这里采用的是Github
+Supabase
+Vercel
的方案,另外配有缓存机制,首次进入页面调用云端数据库的数据,重新进入页面则调用本地缓存,缓存设有 1 天的有效期,过期后会自动拉取云端数据库以更新本地缓存。另外为实现多端同步,在收藏栏右上角设有刷新按钮,可以实现一键同步。收藏栏默认显示两行,多余部分折叠隐藏,可点击右上角按钮展开全部内容。
朋友圈配置
这个文章收藏是在友链朋友圈的基础上延伸出来的一个附加功能,所以基础是要先配置好友链朋友圈功能。朋友圈我是按照 官方文档 配置的,其中后端部分采用的是Github
+Sqlite
+Vercel
的 无服务器部署 方式,前端部分采用的是 林木木 的方案。林木木的方案不带管理面板,如果需要更改设置的话,会比较麻烦,但优点是代码量少,简短易读,方便我二次修改。
林木木的朋友圈方案配有一个顶栏,可以显示“订阅”、“活跃”、“日志”等消息,点击“订阅”可以查看随机一个友链的文章列表,点击“活跃”可以切换私有友链库和公共库两种数据源,点击“日志”可以手动清空本地缓存,重新拉取云端数据库。另外支持“创建日期”和“更新日期”两种排列方式,可以自由手动切换。
数据库配置
Vercel 的 Integrations Marketplace 上提供有很多种数据库,其中 MongoDB Atlas 之前在部署 twikoo 评论的时候用过,Upstash 在配置个人网盘的时候用过,听群友推荐说 PlanetScale 和 Supabase 也不错。这里采用 Supabase 作为项目云端数据存储。
注册 Supabase 后进入 Dashboard,首先点击 New project 创建一个新的项目,设置项目名称和数据库密码,选择合适的地区,然后确认创建。整个创建过程有点长,需要耐心等待几十秒的时间。
创建完成会自动进入项目,页面左侧有一条纵向菜单栏,点击 Table Editor 可以对数据库进行可视化操作,点击 SQL Editor 可以进行命令行操作,这对于小白来说还是非常方便的。我们进入 Table Editor 点击 New table 创建一个新数据表,设置好表名、描述,最重要的是各列的参数配置,默认的 Column 有 id 和 created_at 两列,点击 Add column 新增几条参数,分别是 index、title、link、author、avatar、time 六个参数,参数类型均设置为 text,点击 save 保存。
进入数据表,点击 Insert 可以手动插入数据,因为是可视化界面,增删改查都十分直观。当然我们不需要在这里插入数据,而是要能够在外部调用它的增删改查能力。在左侧菜单栏中点击 API Docs 可以查看详细的使用方法,其中,Introduction 栏提供了初始化代码。
1 | import { createClient } from "@supabase/supabase-js"; |
这里有两个重要参数supabaseUrl
和supabaseKey
,需要在设置里面查找。点击左侧菜单栏中的 Project Settings,点击 API 栏,其中 Project URL 即为 supabaseUrl,Project API keys 即为 supabaseKey。
回到 API Docs,在 Tables and Views 栏找到刚刚新建的表名,进入文档后可以看到详细的增删改查示例代码。
后端代码
Github 新建一个私有仓库,仓库内主要包含 3 个文件,内容如下。
index.js
注意这里 supabaseUrl 做了脱敏处理,要替换成自己的。
1 | // 导入所需包和模块 |
package.json
1 | { |
vercel.json
注意 KEY 和 SUPABASE_KEY 要换成自己的,其中KEY
为 SHA256 加密后的前端身份验证密码,SUPABASE_KEY
为 Supabase 密钥。
1 | { |
仓库建好后,部署到 Vercel 上,在 Storage 栏进入 Integrations Marketplace 找到 Supabase,点击 Add Integration 将其添加进项目。然后就是配置自定义域名,自此后端配置完成。
前端代码
index.md
打开先前在配置友链朋友圈的时候创建的 /fcircle/index.md,配置如下:
1 | --- |
注意,友链头像的链接含有 & 字符会产生干扰,建议采用图床存储头像图片,或者在上面代码中对 article_avatar 参数做 encodeURIComponent 和 decodeURIComponent 编解码处理。
另外,上面用到的 tools.showMessage 方法依赖于 ElementUI 库,如果你有自己的弹窗通知系统,可以将它替换掉,比如主题自带的 btf.snackbarShow。
如果你也要用 ElementUI 的弹窗,可以参照下面方法,更多用法参考文档:ElementUI文档 - Message
1 | inject: |
1 | var tools = { |
fcircle.js
fcircle.js 的改动不多,主要是卡片 HTML 结构修改。
1 | /* |
CSS 样式部分比较冗杂,可自行 F12 获取。