{
  "info": {
    "name": "古典文学网 API",
    "description": "《Python Web 全栈开发》配套接口集合，共 18 个接口，分 5 个模块。\n\n使用步骤：\n1. 导入本集合后，确认右上角选中变量 base_url = http://127.0.0.1:5000/api（先在「用户」分组跑一遍「注册」，再跑「登录」，token 会自动存进集合变量）。\n2. 其余「需登录」的接口都会自动带上 Authorization: Bearer {{token}}。\n3. 统一响应结构为 {code, msg, data}，HTTP 状态码一律 200，成败只看 code。\n\n接口定义以 pyweb/docs/API接口文档.md 为准。",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    {
      "key": "base_url",
      "value": "http://127.0.0.1:5000/api",
      "type": "string"
    },
    {
      "key": "token",
      "value": "",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "用户",
      "description": "注册 / 登录 / 个人信息 / 上传头像 / 退出登录。除注册、登录外均需登录。",
      "item": [
        {
          "name": "注册",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"username\": \"zhangsan\",\n  \"password\": \"123456\",\n  \"nickname\": \"张三\",\n  \"email\": \"zhangsan@example.com\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": "{{base_url}}/user/register",
            "description": "注册新用户。username 3–20 位且唯一；password 6–20 位。成功返回 data.user_id。"
          },
          "response": []
        },
        {
          "name": "登录",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"业务状态码为 200\", function () {",
                  "    pm.expect(pm.response.json().code).to.eql(200);",
                  "});",
                  "",
                  "const body = pm.response.json();",
                  "",
                  "pm.test(\"返回了 token 字符串\", function () {",
                  "    pm.expect(body.data.token).to.be.a(\"string\");",
                  "});",
                  "",
                  "// 把 token 存成集合变量 / 环境变量，后续请求用 {{token}} 引用",
                  "pm.collectionVariables.set(\"token\", body.data.token);",
                  "pm.environment.set(\"token\", body.data.token);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"username\": \"zhangsan\",\n  \"password\": \"123456\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": "{{base_url}}/user/login",
            "description": "登录成功后返回 token 与 user。Tests 脚本会把 token 自动存进 {{token}} 变量。注意：种子用户密码是占位符，登不进去，请先调注册接口建号。"
          },
          "response": []
        },
        {
          "name": "获取个人信息",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "url": "{{base_url}}/user/profile",
            "description": "需登录。返回当前用户资料，含 stat.comment_count / stat.favorite_count。"
          },
          "response": []
        },
        {
          "name": "修改个人信息",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"nickname\": \"张三丰\",\n  \"intro\": \"爱读唐诗宋词\",\n  \"gender\": 1\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": "{{base_url}}/user/profile",
            "description": "需登录。只传要改的字段（nickname / intro / gender）。"
          },
          "response": []
        },
        {
          "name": "上传头像",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": [],
                  "description": "图片文件，限 jpg/png/gif，≤ 2MB"
                }
              ]
            },
            "url": "{{base_url}}/user/avatar",
            "description": "需登录，multipart/form-data。参数 file 为图片文件，限 jpg/png/gif、≤ 2MB。返回 data.avatar。"
          },
          "response": []
        },
        {
          "name": "退出登录",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "url": "{{base_url}}/user/logout",
            "description": "需登录。JWT 无状态，真正的退出由前端清除本地 token 完成；此接口用于记录日志 / 预留黑名单。"
          },
          "response": []
        }
      ]
    },
    {
      "name": "首页",
      "description": "轮播图 / 分类 / 文学推荐，均为公开接口，无需登录。",
      "item": [
        {
          "name": "轮播图列表",
          "request": {
            "method": "GET",
            "header": [],
            "url": "{{base_url}}/banner/list",
            "description": "返回 data 数组：id / title / image / link。"
          },
          "response": []
        },
        {
          "name": "分类列表",
          "request": {
            "method": "GET",
            "header": [],
            "url": "{{base_url}}/category/list",
            "description": "返回 data 数组：id / name / description。"
          },
          "response": []
        },
        {
          "name": "文学推荐",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/article/recommend?limit=6",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "article",
                "recommend"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "6",
                  "description": "返回条数，默认取推荐位数量"
                }
              ]
            },
            "description": "首页推荐位。查询参数 limit 控制返回条数。"
          },
          "response": []
        }
      ]
    },
    {
      "name": "作品",
      "description": "作品列表 / 详情 / 点赞。点赞需登录。",
      "item": [
        {
          "name": "作品列表",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/article/list?page=1&page_size=10&category_id=&keyword=&dynasty=&order_by=latest",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "article",
                "list"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "description": "页码，从 1 开始"
                },
                {
                  "key": "page_size",
                  "value": "10",
                  "description": "每页条数，默认 10"
                },
                {
                  "key": "category_id",
                  "value": "",
                  "description": "按分类筛选，可选"
                },
                {
                  "key": "keyword",
                  "value": "",
                  "description": "按标题 / 摘要模糊搜索，可选"
                },
                {
                  "key": "dynasty",
                  "value": "",
                  "description": "按朝代筛选，可选"
                },
                {
                  "key": "order_by",
                  "value": "latest",
                  "description": "latest（默认）/ hot / likes"
                }
              ]
            },
            "description": "分页返回 data：{list, total, page, page_size}。支持 category_id / keyword / dynasty 筛选与 order_by 排序。"
          },
          "response": []
        },
        {
          "name": "作品详情",
          "request": {
            "method": "GET",
            "header": [],
            "url": "{{base_url}}/article/detail/1",
            "description": "返回单个作品详情，含 content / views / likes / is_favorite / is_liked / comment_count。每次访问 views +1（后端处理）。"
          },
          "response": []
        },
        {
          "name": "点赞作品",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"article_id\": 1\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": "{{base_url}}/article/like",
            "description": "需登录。同一用户重复点赞 = 取消点赞。返回 data：{liked, likes}。"
          },
          "response": []
        }
      ]
    },
    {
      "name": "书评",
      "description": "书评列表 / 发表 / 点赞 / 删除。除列表外均需登录。",
      "item": [
        {
          "name": "书评列表",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/comment/list?article_id=1&page=1&page_size=10",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "comment",
                "list"
              ],
              "query": [
                {
                  "key": "article_id",
                  "value": "1",
                  "description": "作品 id，必填"
                },
                {
                  "key": "page",
                  "value": "1",
                  "description": "页码，从 1 开始"
                },
                {
                  "key": "page_size",
                  "value": "10",
                  "description": "每页条数，默认 10"
                }
              ]
            },
            "description": "分页返回 data：{list, total, page, page_size}。每条书评含 user 与 children（楼中楼回复）。"
          },
          "response": []
        },
        {
          "name": "发表书评",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"article_id\": 1,\n  \"content\": \"好诗！\",\n  \"parent_id\": null\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": "{{base_url}}/comment/add",
            "description": "需登录。parent_id 不为空时即为「回复某条书评」。返回 data.comment_id。"
          },
          "response": []
        },
        {
          "name": "点赞书评",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"comment_id\": 1\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": "{{base_url}}/comment/like",
            "description": "需登录。返回 data：{liked, likes}。"
          },
          "response": []
        },
        {
          "name": "删除书评",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "url": "{{base_url}}/comment/1",
            "description": "需登录。只能删自己的书评，否则返回 {code:403,msg:\"无权删除他人书评\"}。"
          },
          "response": []
        }
      ]
    },
    {
      "name": "收藏",
      "description": "收藏 / 取消收藏、我的收藏。均需登录。",
      "item": [
        {
          "name": "收藏 / 取消收藏",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"article_id\": 3\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": "{{base_url}}/favorite/toggle",
            "description": "需登录。同一作品重复调用即在收藏 / 取消收藏之间切换。返回 data.favorited。"
          },
          "response": []
        },
        {
          "name": "我的收藏",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/favorite/list?page=1&page_size=10",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "favorite",
                "list"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "description": "页码，从 1 开始"
                },
                {
                  "key": "page_size",
                  "value": "10",
                  "description": "每页条数，默认 10"
                }
              ]
            },
            "description": "需登录。分页返回 data：{list, total, page, page_size}，每条含 article_id / title / author / category_name / created_at。"
          },
          "response": []
        }
      ]
    }
  ]
}
