# web_bookmark2.0 **Repository Path**: 1091198228/web_bookmark2.0 ## Basic Information - **Project Name**: web_bookmark2.0 - **Description**: 使用go语言开发的网页书签管理工具 - **Primary Language**: Go - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-04 - **Last Updated**: 2026-09-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 网页书签 2.0 一款基于 Go + Vue 3 的现代化书签管理系统,采用深色玻璃拟态 UI 风格,支持多项目空间、分类管理、标签筛选、书签可用性检测、数据导入导出与备份恢复等功能。 ## 功能特性 ### 核心功能 - **多项目空间** — 独立的项目空间隔离不同场景的书签,支持自定义图标和排序 - **分类管理** — 每个项目下可创建多个分类,侧边栏实时显示各分类的可用/总数统计 - **标签系统** — 书签支持多标签关联,通过标签快速筛选跨分类书签 - **书签 CRUD** — 新增书签时自动抓取网页标题和 Favicon,支持手动编辑 - **可用性检测** — 单个或批量检测书签 URL 是否可访问,SSE 流式实时反馈进度,支持定时自动检测 - **分享功能** — 一键生成分享链接,可选"登录后可见",防止暴力枚举 ### 数据管理 - **导入导出** — 支持按项目或全量导出 JSON,导入时智能合并(URL 去重、分类自动创建、标签合并) - **备份恢复** — 完整快照备份,恢复支持替换(覆盖)和合并两种模式 ### 安全特性 - **JWT 认证** — Bearer Token 鉴权,密钥自动生成 - **登录保护** — 同一 IP 连续 5 次登录失败自动锁定 30 分钟 - **SSRF 防护** — 可用性检测屏蔽内网地址段,防止服务端请求伪造 - **速率限制** — 注册接口 IP 限流(5 次/分钟),分享接口防暴力枚举 - **IDOR 防护** — 所有数据操作校验用户归属,防止越权访问 ### 管理员功能 - **用户管理** — 查看用户列表(含书签统计)、编辑/删除/启禁用户 - **系统设置** — 开放注册开关、站点名称、自动检测开关及间隔 - **登录限制** — 查看被锁定的 IP 列表,手动解锁 ## 技术栈 | 层级 | 技术 | |------|------| | 后端 | Go 1.25 · Gin · GORM · SQLite | | 前端 | Vue 3 · Pinia · Vue Router · TypeScript | | 构建 | Vite · Tailwind CSS v4 | | 部署 | Docker · Alpine Linux | ## 项目结构 ``` 网页书签2.0/ ├── bookmark-server/ # Go 后端 │ ├── main.go # 入口,初始化数据库/服务/路由 │ ├── config/ # 配置加载(端口/数据库/JWT密钥) │ ├── handler/ # HTTP 请求处理器 │ ├── middleware/ # 中间件(认证/CORS/限流/登录保护) │ ├── model/ # GORM 数据模型 │ ├── router/ # Gin 路由定义 │ ├── service/ # 业务逻辑层 │ ├── utils/ # 工具函数 │ ├── data/ # SQLite 数据库文件 │ └── dist/ # 前端构建产物(嵌入二进制) ├── bookmark-web/ # Vue 3 前端 │ ├── src/ │ │ ├── api/ # Axios API 封装 │ │ ├── assets/ # 静态资源 │ │ ├── components/ # 通用组件(Sidebar/BookmarkCard/ShareToggle) │ │ ├── layouts/ # 布局组件 │ │ ├── router/ # 路由定义与守卫 │ │ ├── stores/ # Pinia 状态管理 │ │ ├── views/ # 页面组件 │ │ ├── App.vue # 根组件 │ │ ├── main.ts # 入口 │ │ └── style.css # 全局样式 │ ├── index.html │ ├── vite.config.ts │ └── package.json ├── Dockerfile # Docker 镜像构建 ├── docker-compose.yml # Docker Compose 编排 ├── build.bat # 一键构建脚本(前端+后端) ├── start.bat # Windows 启动脚本 └── start.sh # Linux 启动脚本 ``` ## 快速开始 ### Docker 部署(推荐) ```bash # 1. 先在本地构建 Linux 二进制(需要 Go 和 Node.js 环境) ./build.bat # 2. 构建并启动容器 docker compose up -d --build # 3. 查看日志 docker compose logs -f ``` 启动后访问 `http://<服务器IP>:5000`,默认管理员账号 `admin / admin123`。 ### 本地开发 **前置条件**:Go 1.25+、Node.js 18+ ```bash # 1. 启动后端(默认端口 8080) cd bookmark-server go run . --port 8080 # 2. 启动前端开发服务器(另一个终端) cd bookmark-web npm install npm run dev ``` 前端开发服务器自动将 `/api` 请求代理到后端 `localhost:8080`。 ### 生产构建 ```bash # 一键构建前端 + 后端(Windows/Linux 双平台) build.bat # Linux 直接运行 cd bookmark-server chmod +x bookmark-server-linux ./bookmark-server-linux --port 8080 # Windows 直接运行 cd bookmark-server bookmark-server.exe --port 8080 ``` ## 配置项 | 参数 | 环境变量 | 默认值 | 说明 | |------|---------|--------|------| | `--port` | `PORT` | `8080` | 服务监听端口 | | `--db` | `DB_PATH` | `data/bookmarks.db` | SQLite 数据库路径 | | `--dist-dir` | `DIST_DIR` | 空(使用内嵌资源) | 前端静态文件目录 | | `--jwt-secret` | — | 自动生成 | JWT 签名密钥 | > **注意**:JWT 密钥每次启动自动生成,重启后已有 Token 将失效。生产环境建议通过命令行参数固定密钥。 ## API 概览 ### 公开接口 | 方法 | 路径 | 说明 | |------|------|------| | POST | `/api/auth/login` | 登录 | | POST | `/api/auth/register` | 注册 | | GET | `/api/auth/registration-status` | 注册开放状态 | ### 认证接口 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/api/me` | 当前用户信息 | | PUT | `/api/me/password` | 修改密码 | | POST | `/api/fetch-meta` | 抓取网页元数据 | | GET/POST | `/api/projects` | 项目列表/创建 | | PUT/DELETE | `/api/projects/:id` | 更新/删除项目 | | PUT | `/api/projects/:id/share` | 切换分享状态 | | GET/POST | `/api/projects/:pid/categories` | 分类列表/创建 | | PUT/DELETE | `/api/categories/:id` | 更新/删除分类 | | GET/POST | `/api/projects/:pid/bookmarks` | 书签列表/创建 | | PUT/DELETE | `/api/bookmarks/:id` | 更新/删除书签 | | POST | `/api/bookmarks/check-availability` | 批量可用性检测(SSE) | | GET/POST | `/api/tags` | 标签列表/创建 | | DELETE | `/api/tags/:id` | 删除标签 | | GET | `/api/export/all` | 导出全部数据 | | GET | `/api/export/project/:id` | 导出项目 | | POST | `/api/import/all` | 导入全部数据 | | POST | `/api/import/project/:id` | 导入到项目 | | POST | `/api/backup` | 创建备份 | | POST | `/api/restore` | 恢复备份 | ### 管理员接口 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/api/admin/users` | 用户列表 | | PUT/DELETE | `/api/admin/users/:id` | 更新/删除用户 | | PUT | `/api/admin/users/:id/status` | 启禁用户 | | GET/PUT | `/api/admin/settings` | 系统设置 | | GET | `/api/admin/login-attempts` | 登录尝试记录 | | PUT | `/api/admin/login-attempts/:ip/unlock` | 解锁 IP | ### 分享接口 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/api/share/:slug/data` | 获取分享数据 | ## 数据持久化 Docker 部署时,SQLite 数据库文件通过 Volume 映射到宿主机 `./data/` 目录,容器重建不会丢失数据: ```yaml volumes: - ./data:/app/data ``` ## License MIT