wuyi 1 개월 전
부모
커밋
b65bc399d0
3개의 변경된 파일1050개의 추가작업 그리고 0개의 파일을 삭제
  1. 399 0
      docs/admin-detail-api.md
  2. 488 0
      docs/goods-api.md
  3. 163 0
      docs/scan-page-api.md

+ 399 - 0
docs/admin-detail-api.md

@@ -0,0 +1,399 @@
+# 管理员详情接口文档
+
+本文档描述了物品、宠物和人员的管理员详情查询接口。这些接口返回的图片URL会自动加签,确保安全访问。
+
+---
+
+## 1. 物品详情接口
+
+### 接口信息
+- **接口路径**: `/goods-info/admin/detail`
+- **请求方法**: `GET`
+- **权限要求**: 管理员权限(ADMIN)
+- **接口描述**: 根据二维码ID获取物品详细信息,返回的图片URL带有阿里云OSS签名
+
+### 请求参数
+
+#### Query 参数
+
+| 参数名 | 类型 | 必填 | 说明 |
+|--------|------|------|------|
+| qrCodeId | string | 是 | 二维码ID |
+
+### 请求示例
+
+```bash
+GET /goods-info/admin/detail?qrCodeId=123
+Authorization: Bearer <admin_token>
+```
+
+### 响应参数
+
+| 参数名 | 类型 | 说明 |
+|--------|------|------|
+| id | number | 物品信息ID |
+| qrCodeId | number | 二维码ID |
+| name | string | 物品名称 |
+| description | string | 物品描述 |
+| photoUrl | string | 物品图片URL(带签名,有效期24小时) |
+| contactName | string | 联系人姓名 |
+| contactPhone | string | 联系人电话 |
+| contactAddress | string | 联系地址 |
+| remarks | string | 备注信息 |
+| createdAt | string | 创建时间 |
+| updatedAt | string | 更新时间 |
+
+### 响应示例
+
+#### 成功响应 (200)
+
+```json
+{
+  "id": 1,
+  "qrCodeId": 123,
+  "name": "笔记本电脑",
+  "description": "MacBook Pro 16寸",
+  "photoUrl": "https://your-bucket.oss-cn-hangzhou.aliyuncs.com/uploads/2024-12-01/xxx.jpg?Expires=1733097600&OSSAccessKeyId=xxx&Signature=xxx",
+  "contactName": "张三",
+  "contactPhone": "13800138000",
+  "contactAddress": "北京市朝阳区xxx",
+  "remarks": "重要物品",
+  "createdAt": "2024-12-01T10:00:00.000Z",
+  "updatedAt": "2024-12-01T10:00:00.000Z"
+}
+```
+
+#### 错误响应
+
+**400 - 参数错误**
+```json
+{
+  "message": "请提供二维码ID"
+}
+```
+
+**404 - 未找到**
+```json
+{
+  "message": "物品信息不存在"
+}
+```
+
+**401 - 未授权**
+```json
+{
+  "message": "未授权访问"
+}
+```
+
+**403 - 权限不足**
+```json
+{
+  "message": "需要管理员权限"
+}
+```
+
+---
+
+## 2. 宠物详情接口
+
+### 接口信息
+- **接口路径**: `/pet-info/admin/detail`
+- **请求方法**: `GET`
+- **权限要求**: 管理员权限(ADMIN)
+- **接口描述**: 根据二维码ID获取宠物详细信息,返回的图片URL带有阿里云OSS签名
+
+### 请求参数
+
+#### Query 参数
+
+| 参数名 | 类型 | 必填 | 说明 |
+|--------|------|------|------|
+| qrCodeId | string | 是 | 二维码ID |
+
+### 请求示例
+
+```bash
+GET /pet-info/admin/detail?qrCodeId=456
+Authorization: Bearer <admin_token>
+```
+
+### 响应参数
+
+| 参数名 | 类型 | 说明 |
+|--------|------|------|
+| id | number | 宠物信息ID |
+| qrCodeId | number | 二维码ID |
+| name | string | 宠物名称 |
+| species | string | 物种 |
+| breed | string | 品种 |
+| age | number | 年龄 |
+| gender | string | 性别 |
+| color | string | 颜色 |
+| photoUrl | string | 宠物图片URL(带签名,有效期24小时) |
+| contactName | string | 主人姓名 |
+| contactPhone | string | 主人电话 |
+| contactAddress | string | 联系地址 |
+| medicalHistory | string | 病史 |
+| remarks | string | 备注信息 |
+| createdAt | string | 创建时间 |
+| updatedAt | string | 更新时间 |
+
+### 响应示例
+
+#### 成功响应 (200)
+
+```json
+{
+  "id": 2,
+  "qrCodeId": 456,
+  "name": "旺财",
+  "species": "犬",
+  "breed": "金毛",
+  "age": 3,
+  "gender": "雄性",
+  "color": "金黄色",
+  "photoUrl": "https://your-bucket.oss-cn-hangzhou.aliyuncs.com/uploads/2024-12-01/yyy.jpg?Expires=1733097600&OSSAccessKeyId=xxx&Signature=xxx",
+  "contactName": "李四",
+  "contactPhone": "13900139000",
+  "contactAddress": "上海市浦东新区xxx",
+  "medicalHistory": "已接种狂犬疫苗",
+  "remarks": "性格温顺",
+  "createdAt": "2024-12-01T11:00:00.000Z",
+  "updatedAt": "2024-12-01T11:00:00.000Z"
+}
+```
+
+#### 错误响应
+
+**400 - 参数错误**
+```json
+{
+  "message": "请提供二维码ID"
+}
+```
+
+**404 - 未找到**
+```json
+{
+  "message": "宠物/物品信息不存在"
+}
+```
+
+**401 - 未授权**
+```json
+{
+  "message": "未授权访问"
+}
+```
+
+**403 - 权限不足**
+```json
+{
+  "message": "需要管理员权限"
+}
+```
+
+---
+
+## 3. 人员详情接口
+
+### 接口信息
+- **接口路径**: `/person-info/admin/detail`
+- **请求方法**: `GET`
+- **权限要求**: 管理员权限(ADMIN)
+- **接口描述**: 根据二维码ID获取人员详细信息,返回的图片URL带有阿里云OSS签名
+
+### 请求参数
+
+#### Query 参数
+
+| 参数名 | 类型 | 必填 | 说明 |
+|--------|------|------|------|
+| qrCodeId | string | 是 | 二维码ID |
+
+### 请求示例
+
+```bash
+GET /person-info/admin/detail?qrCodeId=789
+Authorization: Bearer <admin_token>
+```
+
+### 响应参数
+
+| 参数名 | 类型 | 说明 |
+|--------|------|------|
+| id | number | 人员信息ID |
+| qrCodeId | number | 二维码ID |
+| name | string | 姓名 |
+| gender | string | 性别(MALE/FEMALE/OTHER) |
+| age | number | 年龄 |
+| phone | string | 电话 |
+| email | string | 邮箱 |
+| address | string | 地址 |
+| photoUrl | string | 照片URL(带签名,有效期24小时) |
+| idCard | string | 身份证号 |
+| emergencyContact | string | 紧急联系人 |
+| emergencyPhone | string | 紧急联系电话 |
+| bloodType | string | 血型 |
+| allergies | string | 过敏史 |
+| medicalHistory | string | 病史 |
+| remarks | string | 备注信息 |
+| createdAt | string | 创建时间 |
+| updatedAt | string | 更新时间 |
+
+### 响应示例
+
+#### 成功响应 (200)
+
+```json
+{
+  "id": 3,
+  "qrCodeId": 789,
+  "name": "王五",
+  "gender": "MALE",
+  "age": 35,
+  "phone": "13700137000",
+  "email": "wangwu@example.com",
+  "address": "广州市天河区xxx",
+  "photoUrl": "https://your-bucket.oss-cn-hangzhou.aliyuncs.com/uploads/2024-12-01/zzz.jpg?Expires=1733097600&OSSAccessKeyId=xxx&Signature=xxx",
+  "idCard": "440106198901011234",
+  "emergencyContact": "王太太",
+  "emergencyPhone": "13800138888",
+  "bloodType": "A型",
+  "allergies": "青霉素过敏",
+  "medicalHistory": "高血压",
+  "remarks": "定期体检",
+  "createdAt": "2024-12-01T12:00:00.000Z",
+  "updatedAt": "2024-12-01T12:00:00.000Z"
+}
+```
+
+#### 错误响应
+
+**400 - 参数错误**
+```json
+{
+  "message": "请提供二维码ID"
+}
+```
+
+**404 - 未找到**
+```json
+{
+  "message": "人员信息不存在"
+}
+```
+
+**401 - 未授权**
+```json
+{
+  "message": "未授权访问"
+}
+```
+
+**403 - 权限不足**
+```json
+{
+  "message": "需要管理员权限"
+}
+```
+
+---
+
+## 通用说明
+
+### 认证方式
+所有接口都需要在请求头中携带管理员的 JWT Token:
+
+```
+Authorization: Bearer <your_admin_token>
+```
+
+### 图片URL说明
+- 返回的 `photoUrl` 是带有阿里云OSS签名的完整URL
+- 签名有效期为 **24小时**
+- 过期后需要重新调用接口获取新的签名URL
+- 如果原始数据中没有图片,`photoUrl` 字段可能为 `null` 或空字符串
+
+### 错误码说明
+
+| HTTP状态码 | 说明 |
+|-----------|------|
+| 200 | 请求成功 |
+| 400 | 请求参数错误 |
+| 401 | 未授权,需要登录 |
+| 403 | 权限不足,需要管理员权限 |
+| 404 | 资源不存在 |
+| 500 | 服务器内部错误 |
+
+### 调用示例(JavaScript)
+
+```javascript
+// 使用 fetch 调用物品详情接口
+async function getGoodsDetail(qrCodeId, token) {
+  const response = await fetch(
+    `https://api.example.com/goods-info/admin/detail?qrCodeId=${qrCodeId}`,
+    {
+      method: 'GET',
+      headers: {
+        'Authorization': `Bearer ${token}`,
+        'Content-Type': 'application/json'
+      }
+    }
+  );
+  
+  if (!response.ok) {
+    throw new Error(`HTTP error! status: ${response.status}`);
+  }
+  
+  const data = await response.json();
+  return data;
+}
+
+// 使用示例
+try {
+  const goodsInfo = await getGoodsDetail(123, 'your_admin_token');
+  console.log('物品信息:', goodsInfo);
+  console.log('图片URL:', goodsInfo.photoUrl);
+} catch (error) {
+  console.error('获取失败:', error);
+}
+```
+
+### 调用示例(cURL)
+
+```bash
+# 物品详情
+curl -X GET "https://api.example.com/goods-info/admin/detail?qrCodeId=123" \
+  -H "Authorization: Bearer your_admin_token"
+
+# 宠物详情
+curl -X GET "https://api.example.com/pet-info/admin/detail?qrCodeId=456" \
+  -H "Authorization: Bearer your_admin_token"
+
+# 人员详情
+curl -X GET "https://api.example.com/person-info/admin/detail?qrCodeId=789" \
+  -H "Authorization: Bearer your_admin_token"
+```
+
+### 注意事项
+
+1. **权限验证**: 所有接口都需要管理员权限,普通用户无法访问
+2. **参数验证**: qrCodeId 必须是有效的数字字符串
+3. **图片访问**: 返回的图片URL可以直接在浏览器中访问或用于前端展示
+4. **签名有效期**: 建议在签名过期前重新获取,避免图片无法访问
+5. **容错处理**: 如果图片URL生成失败,接口仍会返回其他数据,但 photoUrl 可能是原始路径
+
+### 性能优化建议
+
+1. **缓存策略**: 可以在客户端缓存详情数据,减少重复请求
+2. **图片预加载**: 对于列表页面,可以预先获取部分详情数据
+3. **批量查询**: 如需查询多个详情,建议分批次请求,避免并发过高
+
+---
+
+## 更新日志
+
+- **2024-12-01**: 初始版本,添加三个管理员详情接口
+

+ 488 - 0
docs/goods-api.md

@@ -0,0 +1,488 @@
+# 物品信息接口文档
+
+## 概述
+
+物品信息管理接口用于处理与物品相关的二维码信息,包括创建、更新、查询等操作。
+
+**基础路径**: `/api/goods`
+
+**二维码类型**: `goods`
+
+---
+
+## 接口列表
+
+### 1. 创建物品信息
+
+创建新的物品信息并激活二维码。
+
+**接口地址**: `POST /api/goods/create`
+
+**权限要求**: 无需认证(公开接口)
+
+**请求参数**:
+
+| 参数名       | 类型   | 必填 | 说明         | 示例                      |
+| ------------ | ------ | ---- | ------------ | ------------------------- |
+| qrCode       | string | 是   | 二维码编码   | "QR123456789"             |
+| photoUrl     | string | 否   | 物品照片 URL | "uploads/goods/photo.jpg" |
+| name         | string | 是   | 物品名称     | "苹果笔记本电脑"          |
+| contactName  | string | 是   | 联系人姓名   | "张三"                    |
+| contactPhone | string | 是   | 联系电话     | "13800138000"             |
+| contactEmail | string | 否   | 联系邮箱     | "zhangsan@example.com"    |
+
+**请求示例**:
+
+```json
+{
+  "qrCode": "QR123456789",
+  "photoUrl": "https://example.com/uploads/goods/laptop.jpg",
+  "name": "苹果笔记本电脑",
+  "contactName": "张三",
+  "contactPhone": "13800138000",
+  "contactEmail": "zhangsan@example.com"
+}
+```
+
+**成功响应** (201):
+
+```json
+{
+  "message": "物品信息创建成功",
+  "data": {
+    "id": 1,
+    "qrCodeId": 100,
+    "photoUrl": "uploads/goods/laptop.jpg",
+    "name": "苹果笔记本电脑",
+    "contactName": "张三",
+    "contactPhone": "13800138000",
+    "contactEmail": "zhangsan@example.com",
+    "remark": null,
+    "createdAt": "2024-01-01T10:00:00.000Z",
+    "updatedAt": "2024-01-01T10:00:00.000Z"
+  }
+}
+```
+
+**错误响应** (400):
+
+```json
+{
+  "message": "二维码不存在"
+}
+```
+
+```json
+{
+  "message": "二维码类型不匹配"
+}
+```
+
+```json
+{
+  "message": "二维码已激活,无法重复填写"
+}
+```
+
+---
+
+### 2. 更新物品信息
+
+通过维护码更新已有的物品信息。
+
+**接口地址**: `PUT /api/goods/update`
+
+**权限要求**: 无需认证(需要维护码验证)
+
+**请求参数**:
+
+| 参数名          | 类型   | 必填 | 说明         | 示例                      |
+| --------------- | ------ | ---- | ------------ | ------------------------- |
+| qrCode          | string | 是   | 二维码编码   | "QR123456789"             |
+| maintenanceCode | string | 是   | 维护码       | "MAINT123456"             |
+| photoUrl        | string | 否   | 物品照片 URL | "uploads/goods/photo.jpg" |
+| name            | string | 否   | 物品名称     | "苹果笔记本电脑"          |
+| contactName     | string | 否   | 联系人姓名   | "张三"                    |
+| contactPhone    | string | 否   | 联系电话     | "13800138000"             |
+| contactEmail    | string | 否   | 联系邮箱     | "zhangsan@example.com"    |
+
+**请求示例**:
+
+```json
+{
+  "qrCode": "QR123456789",
+  "maintenanceCode": "MAINT123456",
+  "name": "苹果笔记本电脑 MacBook Pro",
+  "contactPhone": "13900139000"
+}
+```
+
+**成功响应** (200):
+
+```json
+{
+  "message": "物品信息更新成功",
+  "data": {
+    "id": 1,
+    "qrCodeId": 100,
+    "photoUrl": "uploads/goods/laptop.jpg",
+    "name": "苹果笔记本电脑 MacBook Pro",
+    "contactName": "张三",
+    "contactPhone": "13900139000",
+    "contactEmail": "zhangsan@example.com",
+    "remark": null,
+    "createdAt": "2024-01-01T10:00:00.000Z",
+    "updatedAt": "2024-01-01T11:00:00.000Z"
+  }
+}
+```
+
+**错误响应** (400):
+
+```json
+{
+  "message": "维护码错误"
+}
+```
+
+```json
+{
+  "message": "二维码不存在"
+}
+```
+
+---
+
+### 3. 获取物品信息
+
+根据二维码获取物品详细信息。
+
+**接口地址**: `GET /api/goods/get`
+
+**权限要求**: 无需认证(公开接口)
+
+**请求参数**:
+
+| 参数名 | 类型   | 必填 | 说明       | 示例          |
+| ------ | ------ | ---- | ---------- | ------------- |
+| qrCode | string | 是   | 二维码编码 | "QR123456789" |
+
+**请求示例**:
+
+```
+GET /api/goods/get?qrCode=QR123456789
+```
+
+**成功响应** (200):
+
+```json
+{
+  "id": 1,
+  "qrCodeId": 100,
+  "photoUrl": "uploads/goods/laptop.jpg",
+  "name": "苹果笔记本电脑",
+  "contactName": "张三",
+  "contactPhone": "13800138000",
+  "contactEmail": "zhangsan@example.com",
+  "remark": null,
+  "createdAt": "2024-01-01T10:00:00.000Z",
+  "updatedAt": "2024-01-01T10:00:00.000Z"
+}
+```
+
+**错误响应** (400):
+
+```json
+{
+  "message": "请提供二维码参数"
+}
+```
+
+**错误响应** (404):
+
+```json
+{
+  "message": "物品信息不存在"
+}
+```
+
+---
+
+### 4. 查询物品列表(管理员)
+
+分页查询物品信息列表,支持多条件筛选。
+
+**接口地址**: `GET /api/goods/list`
+
+**权限要求**: 需要管理员权限
+
+**请求头**:
+
+```
+Authorization: Bearer <token>
+```
+
+**请求参数**:
+
+| 参数名       | 类型   | 必填 | 说明                   | 示例         |
+| ------------ | ------ | ---- | ---------------------- | ------------ |
+| name         | string | 否   | 物品名称(模糊查询)   | "笔记本"     |
+| contactName  | string | 否   | 联系人姓名(模糊查询) | "张三"       |
+| contactPhone | string | 否   | 联系电话(模糊查询)   | "138"        |
+| startDate    | string | 否   | 开始日期(ISO 格式)   | "2024-01-01" |
+| endDate      | string | 否   | 结束日期(ISO 格式)   | "2024-12-31" |
+| page         | number | 否   | 页码(从 1 开始)      | 1            |
+| pageSize     | number | 否   | 每页数量               | 20           |
+
+**请求示例**:
+
+```
+GET /api/goods/list?name=笔记本&page=1&pageSize=20
+```
+
+**成功响应** (200):
+
+```json
+{
+  "content": [
+    {
+      "id": 1,
+      "qrCodeId": 100,
+      "photoUrl": "uploads/goods/laptop.jpg",
+      "name": "苹果笔记本电脑",
+      "contactName": "张三",
+      "contactPhone": "13800138000",
+      "contactEmail": "zhangsan@example.com",
+      "remark": null,
+      "createdAt": "2024-01-01T10:00:00.000Z",
+      "updatedAt": "2024-01-01T10:00:00.000Z"
+    },
+    {
+      "id": 2,
+      "qrCodeId": 101,
+      "photoUrl": "uploads/goods/laptop2.jpg",
+      "name": "联想笔记本电脑",
+      "contactName": "李四",
+      "contactPhone": "13900139000",
+      "contactEmail": "lisi@example.com",
+      "remark": null,
+      "createdAt": "2024-01-02T10:00:00.000Z",
+      "updatedAt": "2024-01-02T10:00:00.000Z"
+    }
+  ],
+  "metadata": {
+    "total": 50,
+    "page": 1,
+    "size": 20
+  }
+}
+```
+
+**错误响应** (401):
+
+```json
+{
+  "message": "未授权"
+}
+```
+
+**错误响应** (403):
+
+```json
+{
+  "message": "权限不足"
+}
+```
+
+---
+
+### 5. 管理员更新物品信息
+
+管理员直接通过二维码 ID 更新物品信息,无需维护码。
+
+**接口地址**: `POST /api/goods/admin/update`
+
+**权限要求**: 需要管理员权限
+
+**请求头**:
+
+```
+Authorization: Bearer <token>
+```
+
+**请求参数**:
+
+| 参数名       | 类型   | 必填 | 说明         | 示例                      |
+| ------------ | ------ | ---- | ------------ | ------------------------- |
+| qrCodeId     | number | 是   | 二维码 ID    | 100                       |
+| photoUrl     | string | 否   | 物品照片 URL | "uploads/goods/photo.jpg" |
+| name         | string | 否   | 物品名称     | "苹果笔记本电脑"          |
+| contactName  | string | 否   | 联系人姓名   | "张三"                    |
+| contactPhone | string | 否   | 联系电话     | "13800138000"             |
+| contactEmail | string | 否   | 联系邮箱     | "zhangsan@example.com"    |
+
+**请求示例**:
+
+```json
+{
+  "qrCodeId": 100,
+  "name": "苹果笔记本电脑 MacBook Pro 2024",
+  "contactPhone": "13900139000"
+}
+```
+
+**成功响应** (200):
+
+```json
+{
+  "message": "物品信息更新成功",
+  "data": {
+    "id": 1,
+    "qrCodeId": 100,
+    "photoUrl": "uploads/goods/laptop.jpg",
+    "name": "苹果笔记本电脑 MacBook Pro 2024",
+    "contactName": "张三",
+    "contactPhone": "13900139000",
+    "contactEmail": "zhangsan@example.com",
+    "remark": null,
+    "createdAt": "2024-01-01T10:00:00.000Z",
+    "updatedAt": "2024-01-01T12:00:00.000Z"
+  }
+}
+```
+
+**错误响应** (400):
+
+```json
+{
+  "message": "请提供二维码ID"
+}
+```
+
+```json
+{
+  "message": "物品信息不存在"
+}
+```
+
+**错误响应** (401):
+
+```json
+{
+  "message": "未授权"
+}
+```
+
+**错误响应** (403):
+
+```json
+{
+  "message": "权限不足"
+}
+```
+
+---
+
+## 数据模型
+
+### GoodsInfo 物品信息
+
+| 字段名       | 类型   | 说明                            |
+| ------------ | ------ | ------------------------------- |
+| id           | number | 物品信息 ID(主键)             |
+| qrCodeId     | number | 关联的二维码 ID(唯一)         |
+| photoUrl     | string | 物品照片 URL(可选)            |
+| name         | string | 物品名称(最长 100 字符)       |
+| contactName  | string | 联系人姓名(最长 100 字符)     |
+| contactPhone | string | 联系电话(最长 20 字符)        |
+| contactEmail | string | 联系邮箱(可选,最长 100 字符) |
+| remark       | string | 备注信息(可选,最长 500 字符) |
+| createdAt    | Date   | 创建时间                        |
+| updatedAt    | Date   | 更新时间                        |
+
+---
+
+## 业务流程
+
+### 创建物品信息流程
+
+1. 用户扫描二维码获取 `qrCode` 参数
+2. 调用创建接口 `POST /api/goods/create`
+3. 系统验证二维码是否存在
+4. 系统验证二维码类型是否为 `goods`
+5. 系统验证二维码是否已激活
+6. 创建物品信息并激活二维码
+7. 返回创建成功的物品信息
+
+### 更新物品信息流程
+
+1. 用户扫描二维码获取 `qrCode` 参数
+2. 用户输入维护码 `maintenanceCode`
+3. 调用更新接口 `PUT /api/goods/update`
+4. 系统验证维护码是否正确
+5. 系统验证二维码是否存在
+6. 如果物品信息不存在,则创建新记录
+7. 如果物品信息存在,则更新记录
+8. 返回更新后的物品信息
+
+### 查询物品信息流程
+
+1. 用户扫描二维码获取 `qrCode` 参数
+2. 调用查询接口 `GET /api/goods/get?qrCode=xxx`
+3. 系统根据二维码查找物品信息
+4. 返回物品详细信息
+
+---
+
+## 注意事项
+
+1. **照片 URL 处理**:
+
+   - 如果传入完整 URL(如 `https://example.com/uploads/goods/photo.jpg`),系统会自动提取路径部分(`uploads/goods/photo.jpg`)
+   - 建议直接传入相对路径
+
+2. **二维码激活**:
+
+   - 创建物品信息时会自动激活二维码
+   - 已激活的二维码无法重复创建物品信息
+   - 可以通过维护码更新已激活的二维码信息
+
+3. **维护码**:
+
+   - 维护码在创建二维码时生成
+   - 用于验证用户是否有权限更新物品信息
+   - 请妥善保管维护码
+
+4. **分页查询**:
+
+   - 默认页码为 1,每页 20 条记录
+   - 页码从 1 开始计数
+   - 支持多条件组合查询
+
+5. **权限控制**:
+   - 创建、更新、查询接口为公开接口
+   - 列表查询和管理员更新需要管理员权限
+   - 需要在请求头中携带有效的 JWT Token
+
+---
+
+## 错误码说明
+
+| HTTP 状态码 | 说明                          |
+| ----------- | ----------------------------- |
+| 200         | 请求成功                      |
+| 201         | 创建成功                      |
+| 400         | 请求参数错误或业务逻辑错误    |
+| 401         | 未授权(未登录或 Token 无效) |
+| 403         | 权限不足                      |
+| 404         | 资源不存在                    |
+| 500         | 服务器内部错误                |
+
+---
+
+## 相关接口
+
+- [二维码管理接口](./qr-code-api.md)
+- [宠物信息接口](./pet-info-api.md)
+- [人员信息接口](./person-info-api.md)
+- [扫描记录接口](./scan-record-api.md)

+ 163 - 0
docs/scan-page-api.md

@@ -0,0 +1,163 @@
+# 扫码页接口文档
+
+本文聚焦终端用户在扫码页(即通过二维码 URL 访问的 H5或小程序页面)所需的开放接口,方便前端快速集成展示、补充信息及安全校验。
+
+## 1. 基础信息
+- **根地址**:`/api`
+- **二维码相关前缀**:`/api/qr`
+- **人员/宠物信息前缀**:`/api/person`、`/api/pet`
+- **扫码记录前缀**:`/api/scan`
+- **认证**:扫码页接口均无需 JWT;带有 `hasRole(UserRole.ADMIN)` 的后台接口未在本文档描述
+- **请求头**:`Content-Type: application/json`
+- **二维码类型**:`person`(人员)、`pet`(宠物/物品),来自 `QrType` 枚举
+
+---
+
+## 2. 推荐调用流程
+1. 前端解析二维码中的 `qrCode` 参数
+2. 调用【获取二维码信息】接口,展示二维码基本信息和绑定资料
+3. 若需补充位置或地址,再调用【补充扫描记录】接口
+4. 若用户需维护数据,先调【验证维护码】确认身份,再调用对应的更新接口
+5. 可选:调用【最近扫描记录】展示访问信息
+
+---
+
+## 3. 接口清单概览
+
+| 接口 | 方法 | 路径 | 作用 | 说明 |
+| --- | --- | --- | --- | --- |
+| 获取二维码信息 | GET | `/api/qr/info` | 查询二维码及绑定数据,并自动记录一次扫描 | 最常用;返回 `qrType` 与 `info` |
+| 验证维护码 | POST | `/api/qr/verify` | 校验用户输入的维护码 | 通过后才允许调用更新接口 |
+| 补充扫描记录 | POST | `/api/scan/create` | 保存带经纬度/地址的扫描记录 | 可追加精确定位 |
+| 最近扫描记录 | GET | `/api/scan/recent` | 查询某二维码最近 N 次扫描 | 可用于展示访客列表 |
+| 获取人员信息 | GET | `/api/person/get` | 直接返回人员信息实体 | 作为 `qr/info` 的兜底 |
+| 获取宠物信息 | GET | `/api/pet/get` | 直接返回宠物/物品信息实体 | 作为 `qr/info` 的兜底 |
+
+---
+
+## 4. 接口详情
+
+### 4.1 获取二维码信息
+- **方法/路径**:`GET /api/qr/info`
+- **查询参数**:
+  - `qrCode` *(string, required)*:二维码编号
+- **行为**:
+  1. 校验 `qrCode`,缺失返回 400
+  2. 自动记录一次扫描(记录请求 IP、User-Agent)
+  3. 返回二维码基础数据 + 绑定的人员或宠物信息
+- **成功响应示例**:
+```json
+{
+  "id": 12,
+  "qrCode": "QR2025ABC...",
+  "qrType": "person",
+  "isActivated": true,
+  "scanCount": 42,
+  "info": {
+    "id": 8,
+    "qrCodeId": 12,
+    "photoUrl": "https://...",
+    "name": "张三",
+    "gender": "male",
+    "phone": "13800000000",
+    "specialNote": "有心脏病",
+    "emergencyContactName": "李四",
+    "emergencyContactPhone": "13900000000",
+    "remark": "..."
+  }
+}
+```
+- **错误响应**:
+  - 400 `{ "message": "请提供二维码参数" }`
+  - 500 `{ "message": "获取信息失败" }`
+
+### 4.2 验证维护码
+- **方法/路径**:`POST /api/qr/verify`
+- **请求体**:
+```json
+{
+  "qrCode": "QR2025ABC...",
+  "maintenanceCode": "AB12CD34"
+}
+```
+- **说明**:
+  - 维护码与二维码生成时随机分配,服务端使用 bcrypt 存储;请通过 HTTPS 传输
+  - 校验通过返回 `{ "message": "验证成功", "valid": true }`
+  - 维护码错误:401 `{ "message": "维护码错误" }`
+  - 其它异常:500 `{ "message": "验证失败" }`
+- **后续操作**:前端可在成功后提交人员或宠物信息更新:
+  - `PUT /api/person/update`
+  - `PUT /api/pet/update`
+  - 两者请求体均需携带 `qrCode` 与 `maintenanceCode`,字段约束参考对应 DTO
+
+### 4.3 补充扫描记录
+- **方法/路径**:`POST /api/scan/create`
+- **请求体**(各字段均为可选,除 `qrCode` 必填):
+```json
+{
+  "qrCode": "QR2025ABC...",
+  "latitude": 31.2304,
+  "longitude": 121.4737,
+  "address": "上海市黄浦区XX路XXX号",
+  "ipAddress": "手动覆盖 IP",
+  "userAgent": "自定义 UA"
+}
+```
+- **处理逻辑**:
+  - 若未提供 `ipAddress` / `userAgent`,自动回退为请求源信息
+  - 保存记录时会同步递增 `scanCount`
+- **响应**:201 `{ "message": "扫描记录创建成功", "data": { ...scanRecord } }`
+- **常见错误**:
+  - 400 `{ "message": "创建失败" }`(参数校验不通过或二维码不存在)
+
+### 4.4 最近扫描记录
+- **方法/路径**:`GET /api/scan/recent`
+- **查询参数**:
+  - `qrCode` *(string, required)*
+  - `limit` *(number, optional, default=10)*:返回最近 N 条
+- **响应**:
+```json
+{
+  "qrCode": "QR2025ABC...",
+  "count": 5,
+  "records": [
+    {
+      "id": 1001,
+      "scanTime": "2025-11-28T02:12:11.123Z",
+      "latitude": 31.2304,
+      "longitude": 121.4737,
+      "address": "上海市...",
+      "ipAddress": "1.2.3.4",
+      "userAgent": "Mozilla/5.0 ..."
+    }
+  ]
+}
+```
+- **错误**:缺参返回 400,查询异常返回 500
+
+### 4.5 获取人员/宠物信息(兜底)
+- `GET /api/person/get?qrCode=...`
+- `GET /api/pet/get?qrCode=...`
+- **用途**:当需要根据 `qrType` 分别渲染或在 `/api/qr/info` 出错时兜底查询
+- **响应**:直接返回对应实体;未录入信息则返回 404 `{ "message": "人员信息不存在" }` / `{ "message": "宠物/物品信息不存在" }`
+
+---
+
+## 5. 响应码对照
+
+| 状态码 | 说明 | 常见场景 |
+| --- | --- | --- |
+| 200 | OK | 查询或验证成功 |
+| 201 | Created | 扫描记录创建成功 |
+| 400 | Bad Request | 缺失参数 / DTO 校验失败 |
+| 401 | Unauthorized | 维护码错误 |
+| 404 | Not Found | 未配置人员/宠物资料 |
+| 500 | Internal Server Error | 未知异常 |
+
+---
+
+## 6. 开发提示
+- `qrCode` 大小写敏感,需与生成规则一致(`QR` 前缀 + 时间戳 + 随机串)
+- 维护码为 8 位字母数字组合,用户侧应妥善保存并通过 HTTPS 传输
+- DTO 对经纬度、手机号、邮箱等均有限制,前端提交前应做基础校验
+- 后续如需扩展扫码页能力(例如展示更多统计),可追加后台接口或在 Swagger(`/documentation`, dev 环境)中查阅其它 API