Files
Note Manager c8f03dd932 feat: 初始化云笔记项目
功能特性:
- Markdown 编辑与实时预览
- 代码语法高亮
- 目录树形结构管理
- 图片粘贴上传
- Markdown 文件导入导出
- 笔记密码保护
- 前后端分离架构

技术栈:
- Go + Gin + GORM + SQLite
- 原生 HTML/CSS/JavaScript
- Highlight.js
2026-05-08 15:07:22 +08:00

586 lines
8.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 云笔记 API 文档
## 基础信息
- **Base URL**`http://localhost:8080/api`
- **认证方式**:Cookie(后台管理接口需要)
- **默认密码**`admin123`
---
## 公开接口
公开接口无需认证即可访问(只读)。
### 1. 获取笔记列表
获取分页的笔记列表。
**请求**
```
GET /api/notes
```
**Query 参数**
| 参数 | 类型 | 必填 | 说明 | 默认值 |
|------|------|------|------|--------|
| page | int | 否 | 页码 | 1 |
| page_size | int | 否 | 每页数量 | 20 |
| category | string | 否 | 按分类筛选 | - |
| tag | string | 否 | 按标签筛选 | - |
| pinned | bool | 否 | 只看置顶 | - |
| favorite | bool | 否 | 只看收藏 | - |
| parent_id | int | 否 | 按父目录筛选 | - |
**响应示例**
```json
{
"code": 0,
"message": "success",
"data": {
"items": [
{
"id": 1,
"title": "Go 语言教程",
"category": "技术",
"tags": "[\"Go\",\"编程\"]",
"is_pinned": true,
"is_favorite": false,
"is_folder": false,
"parent_id": 0,
"sort_order": 0,
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T10:30:00Z"
}
],
"total": 50,
"page": 1,
"page_size": 20,
"total_pages": 3
}
}
```
---
### 2. 获取单条笔记
根据 ID 获取笔记详情。
**请求**
```
GET /api/notes/:id
```
**路径参数**
| 参数 | 类型 | 说明 |
|------|------|------|
| id | int | 笔记 ID |
**响应示例**
```json
{
"code": 0,
"message": "success",
"data": {
"id": 1,
"title": "Go 语言教程",
"content": "# Go 语言\\n\\nGo 是一门简洁高效的编程语言。",
"category": "技术",
"tags": "[\"Go\",\"编程\"]",
"is_pinned": true,
"is_favorite": false,
"is_folder": false,
"parent_id": 0,
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T10:30:00Z"
}
}
```
---
### 3. 搜索笔记
搜索标题和内容。
**请求**
```
GET /api/notes/search
```
**Query 参数**
| 参数 | 类型 | 必填 | 说明 | 默认值 |
|------|------|------|------|--------|
| q | string | 是 | 搜索关键词 | - |
| page | int | 否 | 页码 | 1 |
| page_size | int | 否 | 每页数量 | 20 |
**响应示例**
```json
{
"code": 0,
"message": "success",
"data": {
"items": [...],
"total": 5,
"page": 1,
"page_size": 20,
"total_pages": 1
}
}
```
---
### 4. 获取分类列表
获取所有分类。
**请求**
```
GET /api/categories
```
**响应示例**
```json
{
"code": 0,
"message": "success",
"data": ["技术", "生活", "工作", "随笔"]
}
```
---
### 5. 获取标签列表
获取所有标签。
**请求**
```
GET /api/tags
```
**响应示例**
```json
{
"code": 0,
"message": "success",
"data": ["Go", "Python", "JavaScript", "编程", "笔记"]
}
```
---
### 6. 获取树形结构
获取目录树形结构(包含目录和笔记)。
**请求**
```
GET /api/tree
```
**响应示例**
```json
{
"code": 0,
"message": "success",
"data": [
{
"id": 1,
"title": "技术文档",
"is_folder": true,
"children": [
{
"id": 2,
"title": "Go 语言教程",
"is_folder": false
}
]
},
{
"id": 3,
"title": "生活随笔",
"is_folder": false
}
]
}
```
---
## 管理接口
管理接口需要先登录,获取 Cookie 认证。
### 7. 登录
**请求**
```
POST /admin/login
```
**Body 参数**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| password | string | 是 | 管理员密码 |
**响应示例**
```json
{
"code": 0,
"message": "登录成功"
}
```
---
### 8. 登出
**请求**
```
POST /admin/logout
```
**响应示例**
```json
{
"code": 0,
"message": "已退出登录"
}
```
---
### 9. 检查认证状态
**请求**
```
GET /admin/auth
```
**响应示例**
```json
{
"authenticated": true
}
```
---
### 10. 创建笔记/目录
**请求**
```
POST /api/notes
```
**Body 参数**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| title | string | 是 | 标题 |
| content | string | 否 | 内容(Markdown |
| category | string | 否 | 分类 |
| tags | string | string | 标签(JSON 数组格式) |
| is_folder | bool | 否 | 是否为文件夹 |
| is_pinned | bool | 否 | 是否置顶 |
| is_favorite | bool | 否 | 是否收藏 |
| parent_id | int | 否 | 父目录 ID |
| sort_order | int | 否 | 排序顺序 |
**请求示例**
```json
{
"title": "新建笔记",
"content": "# 我的笔记\\n\\n这是笔记内容",
"category": "技术",
"tags": "[\"笔记\",\"教程\"]",
"is_folder": false
}
```
**响应示例**
```json
{
"code": 0,
"message": "笔记创建成功",
"data": {
"id": 10
}
}
```
---
### 11. 更新笔记/目录
**请求**
```
PUT /api/notes/:id
```
**Body 参数**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| title | string | 否 | 标题 |
| content | string | 否 | 内容(Markdown |
| category | string | 否 | 分类 |
| tags | string | 否 | 标签 |
| is_pinned | bool | 否 | 是否置顶 |
| is_favorite | bool | 否 | 是否收藏 |
| parent_id | int | 否 | 父目录 ID |
| sort_order | int | 否 | 排序顺序 |
**响应示例**
```json
{
"code": 0,
"message": "笔记更新成功"
}
```
---
### 12. 删除笔记/目录
**请求**
```
DELETE /api/notes/:id
```
**说明**:删除目录时会同时删除该目录下的所有子项。
**响应示例**
```json
{
"code": 0,
"message": "笔记删除成功"
}
```
---
## 响应状态码
| code | 说明 |
|------|------|
| 0 | 成功 |
| 400 | 请求参数错误 |
| 401 | 未授权(需要登录) |
| 404 | 笔记不存在 |
| 500 | 服务器内部错误 |
---
## 密码保护笔记接口
### 访问密码保护的笔记
**请求**
```
POST /api/notes/:id/access
```
**Body 参数**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| password | string | 是 | 笔记访问密码 |
**响应示例**
```json
{
"code": 0,
"message": "访问成功",
"data": {
"id": 1,
"title": "受保护的笔记",
"content": "# 笔记内容..."
}
}
```
---
## 图片上传接口
### 上传图片
**请求**
```
POST /admin/api/upload
```
**说明**:需要登录认证。仅支持 jpg、png、gif、webp、bmp 格式,最大 5MB。
**Form 参数**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| image | file | 是 | 图片文件 |
**响应示例**
```json
{
"code": 0,
"message": "上传成功",
"data": {
"url": "/uploads/1234567890_abc123.png"
}
}
```
**图片访问**:上传后的图片通过 `/uploads/文件名` 访问。
---
## 导入导出接口
### 导出笔记为 Markdown
**请求**
```
GET /admin/api/export/:id
```
**说明**:需要登录认证。导出的文件包含 YAML front matter。
**响应**:下载 `.md` 文件,文件名以笔记标题命名。
---
### 导入 Markdown 文件
**请求**
```
POST /admin/api/import
```
**说明**:需要登录认证。仅支持 `.md` 文件。
**Form 参数**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| file | file | 是 | Markdown 文件 |
**响应示例**
```json
{
"code": 0,
"message": "导入成功",
"data": {
"id": 15,
"title": "导入的笔记标题"
}
}
```
---
## 错误响应示例
```json
{
"code": 401,
"message": "请先登录后台管理"
}
```
---
## 使用示例
### cURL
```bash
# 登录
curl -X POST http://localhost:8080/admin/login \
-d "password=admin123" \
-c cookies.txt
# 获取笔记列表
curl http://localhost:8080/api/notes
# 搜索笔记
curl "http://localhost:8080/api/notes/search?q=Go"
# 创建笔记(需要认证)
curl -X POST http://localhost:8080/api/notes \
-H "Content-Type: application/json" \
-b cookies.txt \
-d '{"title":"新笔记","content":"# 标题\\n\\n内容"}'
# 更新笔记(需要认证)
curl -X PUT http://localhost:8080/api/notes/1 \
-H "Content-Type: application/json" \
-b cookies.txt \
-d '{"title":"更新后的标题"}'
# 删除笔记(需要认证)
curl -X DELETE http://localhost:8080/api/notes/1 -b cookies.txt
```
### JavaScript (Fetch API)
```javascript
// 登录
await fetch('/admin/login', {
method: 'POST',
body: new URLSearchParams({ password: 'admin123' }),
credentials: 'include'
});
// 获取笔记列表
const res = await fetch('/api/notes');
const data = await res.json();
// 创建笔记
await fetch('/api/notes', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ title: '新笔记', content: '# 内容' }),
credentials: 'include'
});
```