Skip to content

Navigation Menu

Sign in
Sign up

Latest commit

History

198 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

网址收藏夹

一个简单易用的网址收藏夹管理工具,基于Go语言后端和Vue.js前端构建。

Bookmark Manager

应用截图

网址收藏夹应用界面


🚀 最新动态与更新日志

👉 完整更新日志、各平台下载链接和 Docker 部署配置请查看:CHANGELOG.md

📥 下载地址:Gitee Releases | GitHub Releases

最新版本:v3.3.0 - 链接检测更准确,低配设备使用更流畅 | 查看详情 | 立即下载 (Gitee)


☕ 请作者喝杯咖啡

本应用完全免费、无广告、开源,你的书签数据始终存储在你自己的设备上。

如果它帮到了你,欢迎请作者喝杯咖啡——金额随意,1 元也是心意。当然,不赞赏也完全可以,所有功能不受任何影响,项目会持续维护。

微信收款码


功能特性

  • 📁 文件夹管理 - 创建、编辑、删除文件夹,支持嵌套结构
  • 🔖 书签管理 - 添加、编辑、删除网址书签,支持批量操作
  • 🔄 拖拽排序 - 支持文件夹和书签的拖拽重排序
  • 📦 批量操作 - 批量选择、删除和移动书签
  • 🌐 元数据获取 - 自动获取网页标题和favicon图标
  • 🎨 现代化界面 - 简洁美观的用户界面
  • 📱 响应式设计 - 适配不同屏幕尺寸
  • 快速响应 - 基于SQLite本地数据库,查询速度快
  • 🔒 安全可靠 - 支持内网HTTPS站点访问
  • 📤 导入导出 - 支持JSON格式书签的导入和导出
  • 🌐 Edge浏览器支持 - 支持导入和导出Edge浏览器的HTML格式书签
  • 🎨 主题切换 - 支持浅色和深色主题切换
  • 🎨 背景设置 - 支持自定义背景(默认、纯色、图片),可调节面板透明度
  • 📊 每页显示 - 支持自定义每行显示的书签数量(1-6个)
  • 🔍 搜索功能 - 支持按网址名称搜索书签
  • 💾 配置保存 - 书签、排序和大部分显示配置按账号保存;部分主题、移动端视图等浏览器本地偏好仅在当前浏览器中保存

多用户、权限与公共书签

项目支持在同一个实例中创建多个用户。书签树和用户配置使用账号维度隔离,适合部署在飞牛 NAS 上供家人或朋友共同使用。需要注意:这是同一个 SQLite 数据库中的逻辑隔离,不是为每个用户创建独立数据库文件。

当前行为

问题 当前行为
文件夹、书签和排序是否独立 是。普通接口会按当前登录用户的 user_id 查询、创建、修改、删除和排序,用户 A 无法通过普通接口读取或操作用户 B 的私有数据。
主题、背景、页面布局等配置是否独立 不完全一致。显示开关、每行数量、默认首页、文件夹视图缩放和桌面端背景等配置保存在用户级 sys_config 中;部分主题、移动端视图/背景和模板排序仍保存在浏览器 localStorage,同一浏览器切换账号时可能沿用本地偏好。
浏览器扩展同步范围 是。扩展使用 X-API-Key,API Key 先解析到所属用户,随后所有同步查询和写入都限制在该用户的数据范围内。不要在多个账号之间共用 API Key。
管理员能否操作其他用户数据 可以。管理员后台可以查看指定用户的书签树、修改或删除节点、为用户创建节点、调整排序,并导出指定用户的 JSON 数据。相关操作受管理员接口保护。
免登录模式的数据归属 未携带有效 Token 的访客会以当前第一个启用的管理员账号访问和修改数据;所有未登录访客看到的是同一份管理员数据。免登录模式不等于为每位访客创建临时账号。携带有效 Token 的用户仍会使用自己的数据。

公共书签与共享收藏夹的边界

当前已经支持"公开书签":书签可以设置为 public,并通过"公开门户"、/public-bookmarks.html/api/public-tree 对外展示。公开内容不是用户私有树的一部分,其他用户不能因此获得该书签的编辑或删除权限。

当前还不支持真正的"公共收藏夹/共享文件夹"模型:

  • 文件夹仍归属于创建它的用户,不能把整个文件夹授权给多个用户共同维护;
  • 管理员可以为指定用户预置书签,也可以把书签设为公开,但这不是一个所有用户共同挂载的公共目录;
  • 暂无把公开书签一键复制到当前用户收藏夹的接口或页面,用户需要手动重新添加,或由管理员分别预置副本;
  • 因此下面这种"管理员维护一份公共收藏夹、用户各自拥有私人收藏夹"的结构目前尚未完整实现:
公共收藏夹(当前版本:仅支持公开书签展示,不支持共享目录)
├── 常用工具
├── 公司系统
└── 推荐网站
用户 A / 用户 B:各自独立的私人收藏夹

公共收藏夹、指定文件夹共享、公共书签复制等功能可作为后续版本的独立权限模型设计;在实现前不会把现有的"公开书签"描述为"共享收藏夹",以免造成权限预期误解。

技术架构

后端技术栈

  • Go 1.21+ - 主要编程语言
  • Chi - 轻量级HTTP路由器
  • SQLite - 本地数据库存储
  • Go Modules - 依赖管理

前端技术栈

  • Vue.js 3 - 现代JavaScript框架
  • HTML5/CSS3 - 页面布局和样式
  • Fetch API - HTTP请求处理

数据存储

  • SQLite数据库文件:data.db
  • 支持外键约束和数据一致性
  • 自动维护排序位置

快速开始

系统要求

  • Go 1.21 或更高版本
  • 支持SQLite的操作系统(Windows/macOS/Linux)
  • Docker(可选,用于容器化部署)

安装步骤

方式一:直接运行

  1. 克隆或下载项目

    git clone <项目地址>
    cd bookmarks
  2. 运行应用

    • 使用默认端口8901启动:
    go run main.go
    • 自定义端口启动:
    go run main.go -port 3000
    • 自定义数据路径和端口:
    go run main.go -dataUrl /path/to/data -port 8080
  3. 访问应用

    • 默认访问地址:http://localhost:8901
    • 或访问您指定的端口地址
    • 查看所有可用选项:go run main.go -h

方式二:Docker部署(推荐)

快速启动(推荐新手使用):

Linux/macOS用户:

cd docker
./start.sh

Windows用户:

cd docker
start.bat

详细使用指南:

请查看 docker/README.md 获取完整的Docker部署指南,包括:

  • 快速启动
  • 自定义端口
  • 手动构建和运行
  • 常用命令
  • 故障排除

手动启动:

  1. 使用docker-compose快速启动

    cd docker
    docker-compose up -d

    应用将在默认端口8901上运行,访问地址:http://localhost:8901

  2. 自定义端口启动

    # 方法1:修改docker-compose.yml中的PORT环境变量
    # 然后运行
    cd docker
    docker-compose up -d
    # 方法2:命令行指定端口(例如使用8080端口)
    cd docker
    PORT=8080 docker-compose up -d
  3. 手动构建和运行

    # AMD64架构
    docker build -f docker/Dockerfile.amd64 -t bookmarks:amd64 .
    docker run -d -p 8901:8901 -v $(pwd)/data:/app/data bookmarks:amd64
    # ARM64架构(如树莓派等)
    docker build -f docker/Dockerfile.arm64 -t bookmarks:arm64 .
    docker run -d -p 8901:8901 -v $(pwd)/data:/app/data bookmarks:arm64
  4. 使用自定义端口运行

    # 映射到8080端口
    docker run -d -p 8080:8901 -v $(pwd)/data:/app/data bookmarks:amd64
    # 映射到3000端口
    docker run -d -p 3000:8901 -v $(pwd)/data:/app/data bookmarks:amd64
  5. 停止和删除容器

    cd docker
    # 停止容器
    docker-compose down
    # 停止并删除数据卷
    docker-compose down -v

Docker数据持久化

应用的数据(SQLite数据库)默认存储在容器内的/app/data目录。为了防止数据丢失,建议使用Docker volume或绑定挂载:

  • docker-compose方式:已自动配置../data:/app/data挂载,数据会保存在宿主机的./data目录(相对于项目根目录)
  • docker run方式:使用-v $(pwd)/data:/app/data参数挂载

Docker常用命令

# 查看容器日志
cd docker
docker-compose logs -f bookmarks
# 查看容器状态
cd docker
docker-compose ps
# 重启容器
cd docker
docker-compose restart
# 进入容器
docker exec -it bookmarks sh
# 查看容器健康状态
docker inspect bookmarks | grep -A 10 Health

自定义配置

启动时可以通过命令行参数自定义配置:

数据路径

go run main.go -dataUrl=/path/to/your/data/

端口配置

go run main.go -port 3000

组合配置

go run main.go -dataUrl=/path/to/data -port 8080

查看所有选项

go run main.go -h

可用参数:

  • -dataUrl:数据存储路径(默认:"./")
  • -port:服务器监听端口(默认:"8901")

使用说明

基础操作

  1. 创建文件夹

    • 点击左侧"新建文件夹"按钮
    • 或右键点击现有文件夹选择"新建子文件夹"
  2. 添加书签

    • 点击左侧"添加网址"按钮
    • 或右键点击文件夹选择"添加网址"
    • 输入网址后点击"获取信息"可自动填充标题和图标
  3. 编辑项目

    • 双击文件夹或书签名称进行编辑
    • 或右键选择"编辑"选项
  4. 删除项目

    • 右键选择"删除"选项
    • 或在编辑模式下批量选择删除

高级功能

  1. 重排序

    • 拖拽文件夹或书签到新位置
    • 或使用右键菜单的"上移"/"下移"选项
  2. 移动到文件夹

    • 右键选择"移动到文件夹"
    • 选择目标文件夹并确认
  3. 批量操作

    • 点击"编辑"按钮进入编辑模式
    • 使用复选框选择多个项目
    • 执行批量删除或移动操作
  4. 搜索和组织

    • 通过文件夹结构组织书签
    • 查看书签路径信息
    • 使用搜索框按名称搜索书签
  5. 导入导出

    • 点击顶部的"导出"按钮导出JSON格式书签
    • 点击顶部的"导入"按钮导入JSON格式书签
    • 选择导入模式(合并或替换)
    • 选择导入目标文件夹
    • 支持从Edge浏览器导入HTML格式书签
  6. 主题切换

    • 点击右上角的主题切换按钮
    • 在浅色和深色主题之间切换
    • 主题设置会自动保存
  7. 背景设置

    • 点击右上角的"背景"按钮
    • 选择背景类型:默认背景、纯色背景、图片背景
    • 可以上传自定义图片作为背景
    • 支持调节面板透明度,让背景图片或颜色透过面板显示
    • 背景设置会自动保存
  8. 每页显示设置

    • 在网址列表上方选择每行显示的书签数量(1-6个)
    • 设置会自动保存到数据库
    • 换浏览器后设置依然有效

快捷操作

  • 右键菜单:在任何项目上右键查看可用操作
  • 双击编辑:双击项目名称快速编辑
  • 拖拽移动:直接拖拽到目标位置
  • 批量选择:使用编辑模式进行批量操作

API接口

RESTful API

  • GET /api/tree - 获取完整树结构
  • GET /api/metadata?url=<网址> - 获取网页元数据
  • POST /api/folders - 创建文件夹
  • POST /api/bookmarks - 创建书签
  • PUT /api/nodes/{id} - 更新节点
  • DELETE /api/nodes/{id} - 删除节点
  • POST /api/nodes/reorder - 重新排序节点
  • POST /api/import - 导入JSON格式书签
  • POST /api/import-edge - 导入Edge浏览器HTML格式书签
  • GET /api/config - 获取配置(主题、背景、每页显示等)
  • POST /api/config - 保存配置(主题、背景、每页显示等)

请求示例

# 获取树结构
curl http://localhost:8901/api/tree
# 创建文件夹
curl -X POST http://localhost:8901/api/folders \
 -H "Content-Type: application/json" \
 -d '{"title":"工作相关","parent_id":null}'
# 创建书签
curl -X POST http://localhost:8901/api/bookmarks \
 -H "Content-Type: application/json" \
 -d '{"title":"GitHub","url":"https://github.com","parent_id":1}'

配置说明

数据库配置

  • 数据库文件位置:可通过-dataUrl参数指定
  • 默认位置:当前目录下的data.db
  • 自动创建必要的表和索引

服务器配置

  • 默认端口:8901
  • 支持静态文件服务
  • 内置CORS支持

目录结构

bookmarks/
├── main.go # 主程序入口
├── go.mod # Go模块定义
├── go.sum # 依赖校验
├── data.db # SQLite数据库文件(运行时生成)
├── static/ # 静态文件目录
│ ├── index.html # 主页面
│ ├── app.js # Vue.js应用
│ └── style.css # 样式文件
├── README.md # 中文说明
├── README.en.md # English README
└── techfunway.bookmarks/ # 打包相关文件

开发说明

环境要求

  • Go 1.21+
  • 现代浏览器支持(Chrome、Firefox、Safari、Edge)

开发运行

# 启动开发服务器
go run main.go
# 修改前端代码后刷新浏览器即可看到效果

部署建议

  • 可以打包成单文件可执行程序
  • 支持在任何支持Go的平台上运行
  • 数据文件可与程序分离,便于备份

故障排除

常见问题

  1. 端口被占用

    • 检查8901端口是否被其他程序占用
    • 或修改代码中的端口配置
    • Docker用户可以使用自定义端口:docker run -p 8080:8901 ...
  2. 数据库错误

    • 确保有写入权限
    • 检查磁盘空间是否充足
  3. 网页元数据获取失败

    • 检查网络连接
    • 某些网站可能限制爬虫访问
  4. HTTPS站点访问失败

    • 应用支持自签名证书
    • 内网HTTPS站点可正常访问
  5. Docker容器无法启动

    • 检查Docker是否正常运行:docker ps
    • 查看容器日志:docker-compose logs -f bookmarks
    • 确保端口未被占用
    • 检查数据目录权限
  6. Docker数据丢失

    • 确保使用了volume挂载:-v $(pwd)/data:/app/data
    • 检查宿主机data目录是否有数据
    • 避免使用docker-compose down -v(会删除数据卷)
  7. Docker健康检查失败

    • 等待容器完全启动(最多30秒)
    • 检查容器日志:docker-compose logs bookmarks
    • 确认应用正常运行

日志查看

  • 启动时会显示服务器运行端口
  • 浏览器开发者工具查看前端错误
  • 服务器日志显示API请求和错误信息

许可证

本项目采用MIT许可证,详见LICENSE文件。

参与贡献

欢迎提交Issue和Pull Request!

  1. Fork 本仓库
  2. 创建特性分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 打开 Pull Request

更新日志

v2.1.0

  • 1.更新:浏览器同步插件支持同时同步多个设备,每个设备独立配置设置
  • 2.新增:免登录功能(开启免登录后实际使用的是管理员数据)
  • 3.新增:新增分类显示页面,支持滑动缩放图标大小

v1.4.0

  • 新增背景设置功能,支持默认背景、纯色背景、自定义图片背景
  • 新增面板透明度调节功能,可调节列表和结构面板的透明度
  • 新增每页显示数量保存功能,设置自动保存到数据库,跨浏览器同步
  • 优化浅色主题下选中数字的显示效果
  • 调整PC端列表布局高度,解决内容超出问题
  • 性能优化和bug修复

v1.2.0

  • 新增导入导出功能,支持JSON格式书签的导入和导出
  • 新增Edge浏览器支持,支持导入和导出Edge浏览器的HTML格式书签
  • 新增主题切换功能,支持浅色和深色主题切换
  • 优化了文件夹选择功能,修复了导入时无法选择文件夹的问题
  • 修复了交叉编译问题,支持生成不同架构的Linux二进制文件
  • 性能优化和bug修复

v1.1.0

  • 新增搜索功能,支持按网址名称搜索
  • 手机端适配优化
  • 性能优化和bug修复

v1.0.0

  • 初始版本发布
  • 基础文件夹和书签管理功能
  • 拖拽排序支持
  • 批量操作功能
  • 网页元数据获取
  • 响应式设计,适配不同屏幕尺寸
  • 现代化美观界面
  • 支持内网HTTPS站点访问

安全说明

数据安全

  • 数据存储在本地SQLite数据库文件中,不会上传到云端
  • 支持定期备份数据库文件
  • 建议将数据文件存储在安全位置

网络安全

  • 仅通过本地HTTP服务器访问,不暴露公网
  • 支持内网HTTPS站点访问
  • 无第三方依赖,减少安全风险

浏览器兼容性

  • ✅ Chrome 80+
  • ✅ Firefox 75+
  • ✅ Safari 13+
  • ✅ Edge 80+

性能优化

  • 本地SQLite数据库,查询速度快
  • 前端采用Vue.js 3,渲染性能优秀
  • 支持大量书签和文件夹的高效管理
  • 拖拽操作流畅,响应迅速

备份和恢复

备份数据

  1. 关闭应用程序
  2. 复制data.db文件到安全位置
  3. 完成备份

恢复数据

  1. 关闭应用程序
  2. 将备份的data.db文件复制到应用程序目录
  3. 启动应用程序
  4. 数据将自动恢复

未来计划

  • 支持标签功能
  • 支持快捷键操作
  • 支持书签预览功能
  • 支持云同步功能
  • 支持更多浏览器的书签导入导出
  • 支持更高级的搜索功能
  • 支持书签分组和智能分类
  • 支持自定义主题和样式

支持和反馈

如果您在使用过程中遇到问题或有任何建议,欢迎通过以下方式反馈:

  • 创建Issue:在GitHub仓库提交Issue
  • 邮件反馈:发送邮件到[your-email@example.com]
  • 提交Pull Request:贡献代码或改进

觉得好用?文档上方有「请作者喝杯咖啡」入口,1 元也是心意〜

致谢

感谢所有为本项目做出贡献的开发者和用户!

关于作者

一个热爱技术的开发者,致力于创建简单易用的工具,提高工作效率。

About

网址收藏夹功能,包含飞牛应用,dockder:techfunway/bookmarks

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

AltStyle によって変換されたページ (->オリジナル) /