# bookmarks **Repository Path**: whgfu/bookmarks ## Basic Information - **Project Name**: bookmarks - **Description**: 前端使用vue,后端使用.net 10,制作的一个收藏夹管理工具 - **Primary Language**: C# - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-15 - **Last Updated**: 2026-07-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Bookmark Manager 一个现代化的书签管理系统,支持分类管理、搜索和批量操作。 ## 技术栈 ### 后端 - **框架**: .NET 10 Web API - **ORM**: FreeSql - **数据库**: SQLite - **认证**: JWT Bearer - **加密**: BCrypt.Net ### 前端 - **框架**: Vue 3 - **构建工具**: Vite 5 - **UI 库**: Element Plus - **状态管理**: Pinia - **路由**: Vue Router 4 - **图标**: Lucide Vue Next, Element Plus Icons - **样式**: SCSS ### 部署 - **容器**: Docker - **反向代理**: Nginx ## 项目结构 ``` bookmarks/ ├── Bookmark.Api/ # .NET Web API 后端 │ ├── Controllers/ # API 控制器 │ │ ├── AuthController.cs # 认证接口 │ │ ├── BookmarksController.cs # 书签接口 │ │ └── CategoriesController.cs # 分类接口 │ ├── Middleware/ # 中间件 │ │ └── ResponseWrapperMiddleware.cs │ ├── Data/ # 数据访问层 │ │ └── AppDbContext.cs │ ├── Models/ # 数据模型 │ │ ├── Bookmark.cs # 书签模型 │ │ ├── Category.cs # 分类模型 │ │ └── User.cs # 用户模型 │ ├── DTOs/ # 数据传输对象 │ │ └── Requests.cs │ ├── Program.cs # 启动文件 │ ├── appsettings.json # 配置文件 │ ├── appsettings.Development.json │ ├── launchSettings.json │ ├── Bookmark.Api.http # HTTP 请求测试文件 │ └── .dockerignore ├── Bookmark.UI/ # Vue 前端应用 │ ├── src/ │ │ ├── api/ # API 请求封装 │ │ │ └── index.js │ │ ├── router/ # 路由配置 │ │ │ └── index.js │ │ ├── stores/ # Pinia 状态管理 │ │ │ ├── auth.js # 认证状态 │ │ │ └── bookmarks.js # 书签和分类状态 │ │ ├── views/ # 页面视图 │ │ │ ├── Login.vue # 登录页 │ │ │ ├── Register.vue # 注册页 │ │ │ └── Dashboard.vue # 仪表盘 │ │ ├── App.vue # 根组件 │ │ └── main.js # 入口文件 │ ├── index.html │ ├── package.json │ ├── package-lock.json │ └── vite.config.js ├── Bookmark.Importer/ # 书签导入工具(未使用) ├── Dockerfile # 统一构建镜像 ├── docker-compose.yml # Docker Compose 配置 ├── nginx.conf # Nginx 反向代理配置 ├── entrypoint.sh # 容器启动脚本 ├── .dockerignore ├── .gitignore ├── LICENSE └── README.md ``` ## 功能特性 - **用户认证**: 注册、登录、JWT 认证、密码修改 - **书签管理**: 创建、编辑、删除、搜索书签 - **分类管理**: 树形分类结构,支持嵌套和拖拽排序 - **批量操作**: 批量移动书签到指定分类 - **分页查询**: 支持分页和关键词搜索 - **重复检测**: 自动检测重复书签 - **数据导入**: 支持 Chrome、Edge、Firefox 浏览器 HTML 收藏夹导入,支持拖拽上传 - **数据初始化**: 支持清空所有数据并重建默认分类(需密码验证) - **响应式设计**: 完美适配桌面端和移动端(H5) - **概览模式**: 登录后默认展示顶级分类卡片,快速浏览分类结构 - **分类层级显示**: 点击分类后显示子分类卡片和书签列表,逐级浏览 ## 快速开始 ### 使用 Docker(推荐) ```bash git clone cd bookmarks docker-compose up -d ``` 访问 `http://localhost` 即可使用应用。 **数据持久化**: 数据库文件存储在 `./data/bookmarks.db`,容器重启后数据不会丢失。 ### 本地开发 #### 环境要求 - .NET 10 SDK - Node.js 18+ #### 运行后端 ```bash cd Bookmark.Api dotnet run ``` 后端服务默认运行在 `http://localhost:5047` #### 运行前端 ```bash cd Bookmark.UI npm install npm run dev ``` 前端应用默认运行在 `http://localhost:5173` ## API 接口 ### 认证接口 | 方法 | 路径 | 描述 | |------|------|------| | POST | `/api/auth/login` | 用户登录 | | POST | `/api/auth/register` | 用户注册 | | GET | `/api/auth/me` | 获取当前用户信息 | | POST | `/api/auth/change-password` | 修改密码 | | POST | `/api/auth/init-data` | 初始化用户数据(清空所有书签和分类) | ### 书签接口 | 方法 | 路径 | 描述 | |------|------|------| | GET | `/api/bookmarks` | 获取书签列表(支持分类筛选、搜索、分页) | | GET | `/api/bookmarks/{id}` | 获取单个书签 | | POST | `/api/bookmarks` | 创建书签 | | PUT | `/api/bookmarks/{id}` | 更新书签 | | DELETE | `/api/bookmarks/{id}` | 删除书签 | | PUT | `/api/bookmarks/{id}/move` | 移动书签到指定分类 | | PUT | `/api/bookmarks/reorder` | 重新排序书签 | | POST | `/api/bookmarks/bulk-move` | 批量移动书签 | | GET | `/api/bookmarks/duplicates` | 获取重复书签 | | POST | `/api/bookmarks/import` | 批量导入书签 | ### 分类接口 | 方法 | 路径 | 描述 | |------|------|------| | GET | `/api/categories` | 获取分类列表(树形结构) | | GET | `/api/categories/{id}` | 获取单个分类 | | GET | `/api/categories/flat` | 获取扁平化分类列表 | | POST | `/api/categories` | 创建分类 | | PUT | `/api/categories/{id}` | 更新分类 | | DELETE | `/api/categories/{id}` | 删除分类(需先删除子分类和书签) | | PUT | `/api/categories/reorder` | 重新排序分类 | ## API 响应格式 所有 API 响应统一格式: ```json { "success": true, "message": "操作成功", "data": { ... } } ``` - `success`: 布尔值,表示请求是否成功 - `message`: 提示信息,失败时包含错误原因 - `data`: 返回的数据,成功时包含业务数据 ## 配置说明 ### Docker 配置 **docker-compose.yml**: - 前端端口: `80:80` - 数据库目录: `./data:/app/data` - 容器重启策略: `unless-stopped` ### 后端配置 (`appsettings.json`) ```json { "ConnectionStrings": { "DefaultConnection": "Data Source=bookmarks.db" }, "Jwt": { "Key": "BookmarkApi_SuperSecretKey_2024_MustBeLongEnough!", "Issuer": "BookmarkApi", "Audience": "BookmarkApp" } } ``` > **注意**: Docker 部署时,数据库连接字符串已硬编码为 `/app/data/bookmarks.db`,端口固定为 `5047`。 ### CORS 配置 前端默认允许 `http://localhost:5173` 访问,如需修改请编辑 `Program.cs` 中的 CORS 配置。 ## 数据库 项目使用 SQLite 数据库,数据库文件位于: - 本地开发: `Bookmark.Api/bookmarks.db` - Docker 部署: `./data/bookmarks.db` 首次运行时,FreeSql 会自动创建数据库表结构(`UseAutoSyncStructure(true)`)。 ## 浏览器兼容性 - Chrome (推荐) - Edge - Firefox - Safari ## 许可证 本项目采用 Apache License 2.0 开源许可证,详见 [LICENSE](LICENSE) 文件。