# bookmarks
**Repository Path**: TechFunWay/bookmarks
## Basic Information
- **Project Name**: bookmarks
- **Description**: 网址收藏夹功能,包含飞牛应用,dockder:techfunway/bookmarks
- **Primary Language**: HTML
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-09-19
- **Last Updated**: 2026-09-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 网址收藏夹
一个简单易用的网址收藏夹管理工具,基于Go语言后端和Vue.js前端构建。

## 应用截图

---
# 🚀 **最新动态与更新日志**
> **👉 完整更新日志、各平台下载链接和 Docker 部署配置请查看:[CHANGELOG.md](CHANGELOG.md)**
>
> **📥 下载地址**:[Gitee Releases](https://gitee.com/TechFunWay/bookmarks/releases) | [GitHub Releases](https://github.com/TechFunWay/bookmarks/releases)
**最新版本:v3.3.0** - 链接检测更准确,低配设备使用更流畅 | [查看详情](CHANGELOG.md) | [立即下载 (Gitee)](https://gitee.com/TechFunWay/bookmarks/releases/tag/v3.3.0)
---
## ☕ 请作者喝杯咖啡
本应用完全免费、无广告、开源,你的书签数据始终存储在你自己的设备上。
如果它帮到了你,欢迎请作者喝杯咖啡——**金额随意,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` 对外展示。公开内容不是用户私有树的一部分,其他用户不能因此获得该书签的编辑或删除权限。
当前还不支持真正的“公共收藏夹/共享文件夹”模型:
- 文件夹仍归属于创建它的用户,不能把整个文件夹授权给多个用户共同维护;
- 管理员可以为指定用户预置书签,也可以把书签设为公开,但这不是一个所有用户共同挂载的公共目录;
- 暂无把公开书签一键复制到当前用户收藏夹的接口或页面,用户需要手动重新添加,或由管理员分别预置副本;
- 因此下面这种“管理员维护一份公共收藏夹、用户各自拥有私人收藏夹”的结构目前尚未完整实现:
```text
公共收藏夹(当前版本:仅支持公开书签展示,不支持共享目录)
├── 常用工具
├── 公司系统
└── 推荐网站
用户 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. **克隆或下载项目**
```bash
git clone <项目地址>
cd bookmarks
```
2. **运行应用**
- 使用默认端口8901启动:
```bash
go run main.go
```
- 自定义端口启动:
```bash
go run main.go -port 3000
```
- 自定义数据路径和端口:
```bash
go run main.go -dataUrl /path/to/data -port 8080
```
3. **访问应用**
- 默认访问地址:http://localhost:8901
- 或访问您指定的端口地址
- 查看所有可用选项:`go run main.go -h`
#### 方式二:Docker部署(推荐)
**快速启动(推荐新手使用):**
Linux/macOS用户:
```bash
cd docker
./start.sh
```
Windows用户:
```cmd
cd docker
start.bat
```
**详细使用指南:**
请查看 [docker/README.md](docker/README.md) 获取完整的Docker部署指南,包括:
- 快速启动
- 自定义端口
- 手动构建和运行
- 常用命令
- 故障排除
**手动启动:**
1. **使用docker-compose快速启动**
```bash
cd docker
docker-compose up -d
```
应用将在默认端口8901上运行,访问地址:http://localhost:8901
2. **自定义端口启动**
```bash
# 方法1:修改docker-compose.yml中的PORT环境变量
# 然后运行
cd docker
docker-compose up -d
# 方法2:命令行指定端口(例如使用8080端口)
cd docker
PORT=8080 docker-compose up -d
```
3. **手动构建和运行**
```bash
# 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. **使用自定义端口运行**
```bash
# 映射到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. **停止和删除容器**
```bash
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常用命令
```bash
# 查看容器日志
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
```
### 自定义配置
启动时可以通过命令行参数自定义配置:
#### 数据路径
```bash
go run main.go -dataUrl=/path/to/your/data/
```
#### 端口配置
```bash
go run main.go -port 3000
```
#### 组合配置
```bash
go run main.go -dataUrl=/path/to/data -port 8080
```
#### 查看所有选项
```bash
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` - 保存配置(主题、背景、每页显示等)
### 请求示例
```bash
# 获取树结构
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)
### 开发运行
```bash
# 启动开发服务器
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 元也是心意~**
## 致谢
感谢所有为本项目做出贡献的开发者和用户!
## 关于作者
一个热爱技术的开发者,致力于创建简单易用的工具,提高工作效率。