2025-08-25 15:00:46 +08:00
|
|
|
|
const swaggerJsdoc = require('swagger-jsdoc');
|
|
|
|
|
|
|
|
|
|
|
|
const options = {
|
|
|
|
|
|
definition: {
|
|
|
|
|
|
openapi: '3.0.0',
|
|
|
|
|
|
info: {
|
|
|
|
|
|
title: '宁夏智慧养殖监管平台 API',
|
2025-09-12 20:08:42 +08:00
|
|
|
|
version: '2.1.0',
|
|
|
|
|
|
description: `
|
|
|
|
|
|
## 宁夏智慧养殖监管平台 API 文档
|
|
|
|
|
|
|
|
|
|
|
|
### 概述
|
|
|
|
|
|
本文档提供了智慧养殖监管平台的完整API接口说明,包括:
|
|
|
|
|
|
|
|
|
|
|
|
- **核心功能**: 农场管理、动物管理、设备监控、预警管理
|
|
|
|
|
|
- **业务功能**: 产品管理、订单管理、报表生成
|
|
|
|
|
|
- **系统功能**: 用户管理、权限控制、系统配置
|
|
|
|
|
|
|
|
|
|
|
|
### 认证机制
|
|
|
|
|
|
- 采用JWT (JSON Web Token) 进行身份认证
|
|
|
|
|
|
- 所有API请求需在Header中携带Authorization字段
|
|
|
|
|
|
- 格式: \`Authorization: Bearer <token>\`
|
|
|
|
|
|
|
|
|
|
|
|
### 响应格式
|
|
|
|
|
|
所有API响应均采用统一格式:
|
|
|
|
|
|
\`\`\`json
|
|
|
|
|
|
{
|
|
|
|
|
|
"success": true,
|
|
|
|
|
|
"data": {},
|
|
|
|
|
|
"message": "操作成功",
|
|
|
|
|
|
"timestamp": "2025-01-18T10:30:00Z"
|
|
|
|
|
|
}
|
|
|
|
|
|
\`\`\`
|
|
|
|
|
|
|
|
|
|
|
|
### 错误处理
|
|
|
|
|
|
- HTTP状态码遵循RESTful标准
|
|
|
|
|
|
- 详细错误信息在响应体中提供
|
|
|
|
|
|
- 支持多语言错误消息
|
|
|
|
|
|
|
|
|
|
|
|
### 版本信息
|
|
|
|
|
|
- **当前版本**: v2.1.0
|
|
|
|
|
|
- **最后更新**: 2025-01-18
|
|
|
|
|
|
- **维护状态**: 积极维护中
|
|
|
|
|
|
`,
|
|
|
|
|
|
contact: {
|
|
|
|
|
|
name: '技术支持',
|
|
|
|
|
|
email: 'support@nxxm.com',
|
|
|
|
|
|
url: 'https://github.com/nxxm-platform'
|
|
|
|
|
|
},
|
|
|
|
|
|
license: {
|
|
|
|
|
|
name: 'MIT',
|
|
|
|
|
|
url: 'https://opensource.org/licenses/MIT'
|
|
|
|
|
|
}
|
2025-08-25 15:00:46 +08:00
|
|
|
|
},
|
|
|
|
|
|
servers: [
|
|
|
|
|
|
{
|
|
|
|
|
|
url: 'http://localhost:5350',
|
|
|
|
|
|
description: '开发服务器',
|
|
|
|
|
|
},
|
|
|
|
|
|
],
|
|
|
|
|
|
components: {
|
|
|
|
|
|
securitySchemes: {
|
|
|
|
|
|
bearerAuth: {
|
|
|
|
|
|
type: 'http',
|
|
|
|
|
|
scheme: 'bearer',
|
|
|
|
|
|
bearerFormat: 'JWT',
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
schemas: {
|
|
|
|
|
|
MapGeocode: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
address: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '地址'
|
|
|
|
|
|
},
|
|
|
|
|
|
result: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
location: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
lng: {
|
|
|
|
|
|
type: 'number',
|
|
|
|
|
|
description: '经度'
|
|
|
|
|
|
},
|
|
|
|
|
|
lat: {
|
|
|
|
|
|
type: 'number',
|
|
|
|
|
|
description: '纬度'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
MapReverseGeocode: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
lat: {
|
|
|
|
|
|
type: 'number',
|
|
|
|
|
|
description: '纬度'
|
|
|
|
|
|
},
|
|
|
|
|
|
lng: {
|
|
|
|
|
|
type: 'number',
|
|
|
|
|
|
description: '经度'
|
|
|
|
|
|
},
|
|
|
|
|
|
result: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
formatted_address: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '结构化地址'
|
|
|
|
|
|
},
|
|
|
|
|
|
addressComponent: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
description: '地址组成部分'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
MapDirection: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
origin: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '起点坐标,格式:纬度,经度'
|
|
|
|
|
|
},
|
|
|
|
|
|
destination: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '终点坐标,格式:纬度,经度'
|
|
|
|
|
|
},
|
|
|
|
|
|
mode: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
enum: ['driving', 'walking', 'riding', 'transit'],
|
|
|
|
|
|
description: '交通方式'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
Farm: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
id: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
description: '养殖场ID'
|
|
|
|
|
|
},
|
|
|
|
|
|
name: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '养殖场名称'
|
|
|
|
|
|
},
|
|
|
|
|
|
type: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '养殖场类型'
|
|
|
|
|
|
},
|
|
|
|
|
|
location: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
latitude: {
|
|
|
|
|
|
type: 'number',
|
|
|
|
|
|
format: 'float',
|
|
|
|
|
|
description: '纬度'
|
|
|
|
|
|
},
|
|
|
|
|
|
longitude: {
|
|
|
|
|
|
type: 'number',
|
|
|
|
|
|
format: 'float',
|
|
|
|
|
|
description: '经度'
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
description: '地理位置'
|
|
|
|
|
|
},
|
|
|
|
|
|
address: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '详细地址'
|
|
|
|
|
|
},
|
|
|
|
|
|
contact: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '联系人'
|
|
|
|
|
|
},
|
|
|
|
|
|
phone: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '联系电话'
|
|
|
|
|
|
},
|
|
|
|
|
|
status: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
enum: ['active', 'inactive', 'maintenance'],
|
|
|
|
|
|
description: '养殖场状态'
|
|
|
|
|
|
},
|
|
|
|
|
|
createdAt: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
format: 'date-time',
|
|
|
|
|
|
description: '创建时间'
|
|
|
|
|
|
},
|
|
|
|
|
|
updatedAt: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
format: 'date-time',
|
|
|
|
|
|
description: '更新时间'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
Animal: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
id: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
description: '动物ID'
|
|
|
|
|
|
},
|
|
|
|
|
|
type: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '动物类型'
|
|
|
|
|
|
},
|
|
|
|
|
|
count: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
description: '数量'
|
|
|
|
|
|
},
|
|
|
|
|
|
farmId: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
description: '所属养殖场ID'
|
|
|
|
|
|
},
|
|
|
|
|
|
health_status: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
enum: ['healthy', 'sick', 'quarantined'],
|
|
|
|
|
|
description: '健康状态'
|
|
|
|
|
|
},
|
|
|
|
|
|
last_check_time: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
format: 'date-time',
|
|
|
|
|
|
description: '上次检查时间'
|
|
|
|
|
|
},
|
|
|
|
|
|
notes: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '备注'
|
|
|
|
|
|
},
|
|
|
|
|
|
createdAt: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
format: 'date-time',
|
|
|
|
|
|
description: '创建时间'
|
|
|
|
|
|
},
|
|
|
|
|
|
updatedAt: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
format: 'date-time',
|
|
|
|
|
|
description: '更新时间'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
Device: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
id: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
description: '设备ID'
|
|
|
|
|
|
},
|
|
|
|
|
|
name: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '设备名称'
|
|
|
|
|
|
},
|
|
|
|
|
|
type: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '设备类型'
|
|
|
|
|
|
},
|
|
|
|
|
|
status: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
enum: ['online', 'offline', 'maintenance'],
|
|
|
|
|
|
description: '设备状态'
|
|
|
|
|
|
},
|
|
|
|
|
|
farmId: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
description: '所属养殖场ID'
|
|
|
|
|
|
},
|
|
|
|
|
|
last_maintenance: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
format: 'date-time',
|
|
|
|
|
|
description: '上次维护时间'
|
|
|
|
|
|
},
|
|
|
|
|
|
installation_date: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
format: 'date-time',
|
|
|
|
|
|
description: '安装日期'
|
|
|
|
|
|
},
|
|
|
|
|
|
metrics: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
description: '设备指标'
|
|
|
|
|
|
},
|
|
|
|
|
|
createdAt: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
format: 'date-time',
|
|
|
|
|
|
description: '创建时间'
|
|
|
|
|
|
},
|
|
|
|
|
|
updatedAt: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
format: 'date-time',
|
|
|
|
|
|
description: '更新时间'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
Alert: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
id: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
description: '预警ID'
|
|
|
|
|
|
},
|
|
|
|
|
|
type: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '预警类型'
|
|
|
|
|
|
},
|
|
|
|
|
|
level: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
enum: ['low', 'medium', 'high', 'critical'],
|
|
|
|
|
|
description: '预警级别'
|
|
|
|
|
|
},
|
|
|
|
|
|
message: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '预警消息'
|
|
|
|
|
|
},
|
|
|
|
|
|
status: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
enum: ['active', 'acknowledged', 'resolved'],
|
|
|
|
|
|
description: '预警状态'
|
|
|
|
|
|
},
|
|
|
|
|
|
farmId: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
description: '所属养殖场ID'
|
|
|
|
|
|
},
|
|
|
|
|
|
deviceId: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
description: '关联设备ID'
|
|
|
|
|
|
},
|
|
|
|
|
|
resolved_at: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
format: 'date-time',
|
|
|
|
|
|
description: '解决时间'
|
|
|
|
|
|
},
|
|
|
|
|
|
resolved_by: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
description: '解决人ID'
|
|
|
|
|
|
},
|
|
|
|
|
|
resolution_notes: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '解决备注'
|
|
|
|
|
|
},
|
|
|
|
|
|
createdAt: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
format: 'date-time',
|
|
|
|
|
|
description: '创建时间'
|
|
|
|
|
|
},
|
|
|
|
|
|
updatedAt: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
format: 'date-time',
|
|
|
|
|
|
description: '更新时间'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-09-01 02:42:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
FarmInput: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
required: ['name', 'type', 'location'],
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
name: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '养殖场名称'
|
|
|
|
|
|
},
|
|
|
|
|
|
type: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '养殖场类型'
|
|
|
|
|
|
},
|
|
|
|
|
|
location: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
required: ['latitude', 'longitude'],
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
latitude: {
|
|
|
|
|
|
type: 'number',
|
|
|
|
|
|
format: 'float',
|
|
|
|
|
|
description: '纬度'
|
|
|
|
|
|
},
|
|
|
|
|
|
longitude: {
|
|
|
|
|
|
type: 'number',
|
|
|
|
|
|
format: 'float',
|
|
|
|
|
|
description: '经度'
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
description: '地理位置'
|
|
|
|
|
|
},
|
|
|
|
|
|
address: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '详细地址'
|
|
|
|
|
|
},
|
|
|
|
|
|
contact: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '联系人'
|
|
|
|
|
|
},
|
|
|
|
|
|
phone: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '联系电话'
|
|
|
|
|
|
},
|
|
|
|
|
|
status: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
enum: ['active', 'inactive', 'maintenance'],
|
|
|
|
|
|
description: '养殖场状态',
|
|
|
|
|
|
default: 'active'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-09-12 20:08:42 +08:00
|
|
|
|
},
|
|
|
|
|
|
User: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
id: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
description: '用户ID'
|
|
|
|
|
|
},
|
|
|
|
|
|
username: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '用户名'
|
|
|
|
|
|
},
|
|
|
|
|
|
email: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
format: 'email',
|
|
|
|
|
|
description: '邮箱地址'
|
|
|
|
|
|
},
|
|
|
|
|
|
roles: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
description: '角色ID'
|
|
|
|
|
|
},
|
|
|
|
|
|
status: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
enum: ['active', 'inactive'],
|
|
|
|
|
|
description: '用户状态'
|
|
|
|
|
|
},
|
|
|
|
|
|
last_login: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
format: 'date-time',
|
|
|
|
|
|
description: '最后登录时间'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
Product: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
id: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
description: '产品ID'
|
|
|
|
|
|
},
|
|
|
|
|
|
name: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '产品名称'
|
|
|
|
|
|
},
|
|
|
|
|
|
description: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '产品描述'
|
|
|
|
|
|
},
|
|
|
|
|
|
price: {
|
|
|
|
|
|
type: 'number',
|
|
|
|
|
|
format: 'decimal',
|
|
|
|
|
|
description: '产品价格'
|
|
|
|
|
|
},
|
|
|
|
|
|
stock: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
description: '库存数量'
|
|
|
|
|
|
},
|
|
|
|
|
|
status: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
enum: ['active', 'inactive'],
|
|
|
|
|
|
description: '产品状态'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
Order: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
id: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
description: '订单ID'
|
|
|
|
|
|
},
|
|
|
|
|
|
user_id: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
description: '用户ID'
|
|
|
|
|
|
},
|
|
|
|
|
|
total_amount: {
|
|
|
|
|
|
type: 'number',
|
|
|
|
|
|
format: 'decimal',
|
|
|
|
|
|
description: '订单总金额'
|
|
|
|
|
|
},
|
|
|
|
|
|
status: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
enum: ['pending', 'processing', 'shipped', 'delivered', 'cancelled'],
|
|
|
|
|
|
description: '订单状态'
|
|
|
|
|
|
},
|
|
|
|
|
|
payment_status: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
enum: ['unpaid', 'paid', 'refunded'],
|
|
|
|
|
|
description: '支付状态'
|
|
|
|
|
|
},
|
|
|
|
|
|
shipping_address: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '收货地址'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
SystemConfig: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
id: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
description: '配置ID'
|
|
|
|
|
|
},
|
|
|
|
|
|
config_key: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '配置键名'
|
|
|
|
|
|
},
|
|
|
|
|
|
config_value: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '配置值'
|
|
|
|
|
|
},
|
|
|
|
|
|
config_type: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
enum: ['string', 'number', 'boolean', 'json', 'array'],
|
|
|
|
|
|
description: '配置类型'
|
|
|
|
|
|
},
|
|
|
|
|
|
category: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '配置分类'
|
|
|
|
|
|
},
|
|
|
|
|
|
description: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '配置描述'
|
|
|
|
|
|
},
|
|
|
|
|
|
is_public: {
|
|
|
|
|
|
type: 'boolean',
|
|
|
|
|
|
description: '是否公开'
|
|
|
|
|
|
},
|
|
|
|
|
|
is_editable: {
|
|
|
|
|
|
type: 'boolean',
|
|
|
|
|
|
description: '是否可编辑'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
MenuPermission: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
id: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
description: '菜单ID'
|
|
|
|
|
|
},
|
|
|
|
|
|
menu_key: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '菜单标识'
|
|
|
|
|
|
},
|
|
|
|
|
|
menu_name: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '菜单名称'
|
|
|
|
|
|
},
|
|
|
|
|
|
menu_path: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '菜单路径'
|
|
|
|
|
|
},
|
|
|
|
|
|
parent_id: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
description: '父菜单ID'
|
|
|
|
|
|
},
|
|
|
|
|
|
menu_type: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
enum: ['page', 'button', 'api'],
|
|
|
|
|
|
description: '菜单类型'
|
|
|
|
|
|
},
|
|
|
|
|
|
required_roles: {
|
|
|
|
|
|
type: 'array',
|
|
|
|
|
|
items: {
|
|
|
|
|
|
type: 'string'
|
|
|
|
|
|
},
|
|
|
|
|
|
description: '所需角色'
|
|
|
|
|
|
},
|
|
|
|
|
|
icon: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '菜单图标'
|
|
|
|
|
|
},
|
|
|
|
|
|
sort_order: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
description: '排序顺序'
|
|
|
|
|
|
},
|
|
|
|
|
|
is_visible: {
|
|
|
|
|
|
type: 'boolean',
|
|
|
|
|
|
description: '是否可见'
|
|
|
|
|
|
},
|
|
|
|
|
|
is_enabled: {
|
|
|
|
|
|
type: 'boolean',
|
|
|
|
|
|
description: '是否启用'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
ApiResponse: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
success: {
|
|
|
|
|
|
type: 'boolean',
|
|
|
|
|
|
description: '操作是否成功'
|
|
|
|
|
|
},
|
|
|
|
|
|
data: {
|
|
|
|
|
|
description: '响应数据'
|
|
|
|
|
|
},
|
|
|
|
|
|
message: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '响应消息'
|
|
|
|
|
|
},
|
|
|
|
|
|
timestamp: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
format: 'date-time',
|
|
|
|
|
|
description: '响应时间'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
ErrorResponse: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
success: {
|
|
|
|
|
|
type: 'boolean',
|
|
|
|
|
|
example: false
|
|
|
|
|
|
},
|
|
|
|
|
|
message: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '错误消息'
|
|
|
|
|
|
},
|
|
|
|
|
|
error: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '错误详情'
|
|
|
|
|
|
},
|
|
|
|
|
|
errors: {
|
|
|
|
|
|
type: 'array',
|
|
|
|
|
|
items: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
field: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '错误字段'
|
|
|
|
|
|
},
|
|
|
|
|
|
message: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
description: '错误消息'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
description: '详细错误列表'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-08-25 15:00:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
security: [{
|
|
|
|
|
|
bearerAuth: []
|
|
|
|
|
|
}]
|
|
|
|
|
|
},
|
|
|
|
|
|
apis: ['./routes/*.js'], // 指定包含 API 注释的文件路径
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const specs = swaggerJsdoc(options);
|
|
|
|
|
|
module.exports = specs;
|