一个优雅、快速、易于部署的书签(网址)收藏与分享平台,完全基于 Cloudflare 全家桶构建。
在线体验: https://nav.wangwangit.com
| 首页 | 后台管理 |
|---|---|
- 📱 响应式设计:完美适配桌面、平板和手机等各种设备。
- 🎨 主题美观:界面简洁优雅,支持自定义主色调。
- 🔍 快速搜索:内置站内模糊搜索,迅速定位所需网站。
- 📂 分类清晰:通过分类组织书签,浏览直观高效。
- 🔒 安全后台:基于 KV 的管理员认证,提供完整的书签增删改查后台。
- 📝 用户提交(可配置):支持访客提交书签,经管理员审核后显示,可在环境变量中关闭入口。
- ⚡ 性能卓越:利用 Cloudflare 边缘缓存,实现秒级加载,并极大节省 D1 数据库读取成本。
- 📤 数据管理:支持书签数据的导入与导出,格式兼容,方便迁移。
work_v2.js:推荐使用的最新主脚本,包含本次 V2 升级的全部能力,部署到 Cloudflare Workers 时可直接重命名为work.js。work_v1.js:上一代稳定版本,保留用于兼容旧流程,如无特殊原因建议尽快迁移至 V2。worker.js:历史保留的初始版本,不再更新,仅供参考。
- 🛡️ 后台会话安全升级:登录
/admin时将颁发 12 小时有效的 HttpOnly 会话 Cookie,凭据不再暴露在 URL 中,并新增一键退出登录。 - 🗂️ 分类排序面板:后台新增“分类排序”标签页,可写入
category_orders表以精确控制前台分类顺序并支持一键重置。 - 🧹 输入与展示双重校验:新增 URL 规范化、HTML 转义与排序值归一化逻辑,前后台同时防止脏数据和潜在 XSS。
- 🚪 访客投稿可控:通过
ENABLE_PUBLIC_SUBMISSION环境变量即可关闭前台投稿入口,相关接口自动返回 403,方便运营期按需开关。
准备工作: 你需要一个 Cloudflare 账号。
-
在 Cloudflare 控制台,进入
Workers & Pages->D1。 -
点击
创建数据库,数据库名称输入book,然后创建。 -
进入数据库的
控制台,执行下方的 SQL 语句来快速创建所需的表结构。(注意移除中文注释)
-- 创建已发布网站表
CREATE TABLE sites (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
url TEXT NOT NULL,
logo TEXT,
"desc" TEXT,
catelog TEXT NOT NULL,
status TEXT,
sort_order INTEGER NOT NULL DEFAULT 9999,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 创建待审核网站表
CREATE TABLE pending_sites (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
url TEXT NOT NULL,
logo TEXT,
"desc" TEXT,
catelog TEXT NOT NULL,
status TEXT,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 创建分类排序表
CREATE TABLE category_orders (
catelog TEXT PRIMARY KEY,
sort_order INTEGER NOT NULL DEFAULT 9999
);提示: 使用 SQL 是最快捷的方式。如果你想手动建表,请确保字段名、类型与上述 SQL 一致。
-
在 Cloudflare 控制台,进入
Workers & Pages->KV。 -
点击
创建命名空间,名称输入NAV_AUTH。 -
创建后,为此 KV 添加两个条目,用于设置后台登录的 用户名 和 密码。
- admin_username: 你的管理员用户名(例如
admin) - admin_password: 你的管理员密码
- admin_username: 你的管理员用户名(例如
-
回到
Workers & Pages,点击创建应用程序->创建 Worker。 -
为你的 Worker 指定一个名称(例如
my-nav),然后点击部署。 -
部署后,点击
编辑代码。将仓库中最新版本的脚本(推荐work_v2.js,部署时可重命名为work.js)完整复制并粘贴到编辑器中,替换掉原有内容。 -
点击
部署保存代码。
-
进入你刚刚创建的 Worker 的
设置->变量。 -
在 D1 数据库绑定 中,点击
添加绑定:- 变量名称:
NAV_DB - D1 数据库: 选择你创建的
book
- 变量名称:
-
在 KV 命名空间绑定 中,点击
添加绑定:- 变量名称:
NAV_AUTH - KV 命名空间: 选择你创建的
NAV_AUTH
- 变量名称:
-
访问你的 Worker 域名(例如
my-nav.your-subdomain.workers.dev)。首次访问会提示没有数据。 -
访问
你的域名/admin进入后台,使用你在 步骤 2 中设置的用户名和密码登录。 -
在后台添加第一个书签后,首页即可正常显示。
-
在 Cloudflare Workers 控制台,将脚本替换为仓库中的
work_v2.js(部署时可重命名为work.js),覆盖旧版本代码。 -
检查 D1 数据库是否存在分类排序表,若尚未创建请执行:
CREATE TABLE IF NOT EXISTS category_orders ( catelog TEXT PRIMARY KEY, sort_order INTEGER NOT NULL DEFAULT 9999 );
-
如需关闭访客投稿,在 Worker 的环境变量中新增:
ENABLE_PUBLIC_SUBMISSION=false -
重新部署后访问
/admin并使用 KV 中存储的账号密码重新登录;V2 采用会话 Cookie,旧的?name=xxx&password=xxx链接将不再生效。
小贴士:升级前可先在后台导出一次配置数据,便于回滚。
如果你是 从 v1 之前的版本 升级到最新版,你需要为 sites 表添加 sort_order 字段以支持自定义排序功能。
请进入你的 book 数据库控制台,执行以下 SQL 语句:
ALTER TABLE sites ADD COLUMN sort_order INTEGER DEFAULT 9999;执行成功后,用最新的 work_v1.js 代码重新部署 Worker 即可;若随后还要升级到 V2,请继续按照上一节步骤操作。
本项目所有逻辑均封装在单文件 Worker 脚本中(推荐使用 work_v2.js,部署时可重命名为 work.js),结构清晰,便于二次开发。
你可以直接在脚本顶部的 tailwind.config 对象中修改主题颜色。
// work_v2.js
tailwind.config = {
theme: {
extend: {
colors: {
primary: {
// 修改为你希望的主色调
500: '#416d9d',
},
// ...其他颜色配置
},
}
}
}默认情况下,前台会展示“添加新书签”入口,并允许访客通过 /api/config/submit 提交待审核的书签。如果你希望关闭此功能,可在 Worker 环境变量中新增:
ENABLE_PUBLIC_SUBMISSION=false
重新部署后,前台按钮会自动隐藏,相关接口也会返回 403,确保无需改动代码即可彻底关闭访客投稿。
- 书签排序:后台的“排序”数值越小,书签在列表中的位置越靠前。
- 分类排序:系统优先读取
category_orders表中的排序值;若未设置,则退回到分类内书签的最小排序值,再按名称排序。您可以在后台“分类排序”标签页直接编辑排序值,或手动更新category_orders表。
后台登录凭据依然存放在 NAV_AUTH KV 中的 admin_username 与 admin_password 两个键内。登录 /admin 时需要在页面表单中输入账号与密码,系统会返回一个 12 小时有效的 HttpOnly 会话 Cookie,无需、也不再支持在 URL 查询参数中传递凭据。点击后台右上角的“退出登录”按钮即可立即销毁会话。
work_v2.js: 当前推荐的 Worker 主脚本,集成 V2 版本全部能力,实际部署时可重命名为work.js。work_v1.js: 旧版脚本,保留用于兼容存量环境或作为比对参考。worker.js: 初代实现,包含最基础的功能,后续不再维护。- 主要逻辑模块:
api: 处理所有数据交互的 API 请求。admin: 负责后台管理界面的渲染和逻辑。handleRequest: 负责前台页面的渲染和路由。
本次版本聚焦后台安全、分类管理与可运营性能力的全面提升。
- 会话态登录与注销:管理员登录改为表单提交并生成 KV 会话,凭据不再暴露在地址栏;新增“退出登录”按钮可立即销毁会话。
- 分类排序中心:后台新增“分类排序”标签页,可直接写入
category_orders表,自定义展示顺序并支持一键重置。 - 投稿开关:引入
ENABLE_PUBLIC_SUBMISSION环境变量,运营期间可一键关闭访客投稿入口。
- 数据校验加固:统一实现 URL 规范化、HTML 转义、排序值归一化,避免脏数据导致的展示问题与潜在 XSS。
- 分类展示优化:前台会自动读取自定义排序结果,分类顺序与后台设置实时同步,并为投稿表单提供分类候选。
本次更新带来了一系列核心功能增强和性能改进,致力于提供更强大、更快速、更友好的使用体验。
- 网站自定义排序
- 现在您可以在后台为每个网站设置一个“排序”值,数字越小,在前台显示的位置越靠前。
- 所有查询接口已支持该排序逻辑,让您能够完全掌控网站的排列顺序。
- 数据导入/导出体验优化
- 无缝对接: 导出的
config.json文件现在可以直接用于导入,形成完美的体验闭环。 - 格式标准: 导出的 JSON 文件为纯数据数组,格式整洁,便于阅读和在其他项目中使用。
- 智能导入: 导入功能现在可以兼容新旧两种格式的配置文件,更加健壮和用户友好。
- 无缝对接: 导出的
- 后台移动端适配
- 优化了后台管理界面在手机等小屏幕设备上的布局,包括表单和表格,使得移动办公成为可能。
- 计算: Cloudflare Workers
- 数据库: Cloudflare D1
- 存储: Cloudflare KV
- 前端框架: TailwindCSS
欢迎通过 Issue 或 Pull Request 为本项目贡献代码、提出问题或建议!
- Fork 本仓库
- 创建你的功能分支 (
git checkout -b feature/amazing-feature) - 提交你的更改 (
git commit -m 'Add some amazing feature') - 推送到你的分支 (
git push origin feature/amazing-feature) - 创建一个 Pull Request
本项目采用 MIT 许可证。
- 项目作者: @一只会飞的旺旺
- 项目链接: https://github.com/wangwangit/nav
如果你喜欢这个项目,请给它一个 ⭐️!