2025-09-17 18:04:28 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* Swagger API文档配置
|
|
|
|
|
|
* @file swagger.js
|
|
|
|
|
|
* @description API文档配置和定义
|
|
|
|
|
|
*/
|
|
|
|
|
|
const swaggerJSDoc = require('swagger-jsdoc');
|
|
|
|
|
|
|
|
|
|
|
|
const options = {
|
|
|
|
|
|
definition: {
|
|
|
|
|
|
openapi: '3.0.0',
|
|
|
|
|
|
info: {
|
|
|
|
|
|
title: '银行管理后台API',
|
2025-09-26 17:52:50 +08:00
|
|
|
|
version: '1.1.0',
|
|
|
|
|
|
description: '银行管理后台系统API文档,包含贷款解押模块',
|
2025-09-17 18:04:28 +08:00
|
|
|
|
contact: {
|
|
|
|
|
|
name: '银行开发团队',
|
|
|
|
|
|
email: 'dev@bank.com'
|
|
|
|
|
|
},
|
|
|
|
|
|
license: {
|
|
|
|
|
|
name: 'MIT',
|
|
|
|
|
|
url: 'https://opensource.org/licenses/MIT'
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
servers: [
|
|
|
|
|
|
{
|
|
|
|
|
|
url: `http://localhost:${process.env.PORT || 5351}`,
|
|
|
|
|
|
description: '开发服务器'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
url: 'https://api.bank.com',
|
|
|
|
|
|
description: '生产服务器'
|
|
|
|
|
|
}
|
|
|
|
|
|
],
|
|
|
|
|
|
components: {
|
|
|
|
|
|
securitySchemes: {
|
|
|
|
|
|
bearerAuth: {
|
|
|
|
|
|
type: 'http',
|
|
|
|
|
|
scheme: 'bearer',
|
|
|
|
|
|
bearerFormat: 'JWT',
|
|
|
|
|
|
description: 'JWT访问令牌'
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
schemas: {
|
|
|
|
|
|
Error: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
success: {
|
|
|
|
|
|
type: 'boolean',
|
|
|
|
|
|
example: false
|
|
|
|
|
|
},
|
|
|
|
|
|
message: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '错误信息'
|
|
|
|
|
|
},
|
|
|
|
|
|
errors: {
|
|
|
|
|
|
type: 'array',
|
|
|
|
|
|
items: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
field: {
|
|
|
|
|
|
type: 'string'
|
|
|
|
|
|
},
|
|
|
|
|
|
message: {
|
|
|
|
|
|
type: 'string'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
Success: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
success: {
|
|
|
|
|
|
type: 'boolean',
|
|
|
|
|
|
example: true
|
|
|
|
|
|
},
|
|
|
|
|
|
message: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '操作成功'
|
|
|
|
|
|
},
|
|
|
|
|
|
data: {
|
|
|
|
|
|
type: 'object'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
Pagination: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
page: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
example: 1
|
|
|
|
|
|
},
|
|
|
|
|
|
limit: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
example: 10
|
|
|
|
|
|
},
|
|
|
|
|
|
total: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
example: 100
|
|
|
|
|
|
},
|
|
|
|
|
|
pages: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
example: 10
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-09-26 17:52:50 +08:00
|
|
|
|
},
|
|
|
|
|
|
LoanRelease: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
id: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
example: 1
|
|
|
|
|
|
},
|
|
|
|
|
|
applicationNumber: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '20240227145555918'
|
|
|
|
|
|
},
|
|
|
|
|
|
productName: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '中国工商银行扎旗支行"畜禽活体抵押"'
|
|
|
|
|
|
},
|
|
|
|
|
|
farmerName: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '刘超'
|
|
|
|
|
|
},
|
|
|
|
|
|
applicantName: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '刘超'
|
|
|
|
|
|
},
|
|
|
|
|
|
applicantIdNumber: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '511123199001013017'
|
|
|
|
|
|
},
|
|
|
|
|
|
applicantPhone: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '13800138000'
|
|
|
|
|
|
},
|
|
|
|
|
|
assetType: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '牛'
|
|
|
|
|
|
},
|
|
|
|
|
|
releaseQuantity: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '10头'
|
|
|
|
|
|
},
|
|
|
|
|
|
releaseAmount: {
|
|
|
|
|
|
type: 'number',
|
|
|
|
|
|
example: 10000
|
|
|
|
|
|
},
|
|
|
|
|
|
status: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
enum: ['pending', 'processing', 'approved', 'rejected', 'completed', 'released'],
|
|
|
|
|
|
example: 'released'
|
|
|
|
|
|
},
|
|
|
|
|
|
applicationTime: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
format: 'date-time',
|
|
|
|
|
|
example: '2024-02-27T06:55:55.000Z'
|
|
|
|
|
|
},
|
|
|
|
|
|
processTime: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
format: 'date-time',
|
|
|
|
|
|
example: '2024-02-27T07:30:00.000Z'
|
|
|
|
|
|
},
|
|
|
|
|
|
completeTime: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
format: 'date-time',
|
|
|
|
|
|
example: '2024-02-27T08:00:00.000Z'
|
|
|
|
|
|
},
|
|
|
|
|
|
processorName: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '系统管理员'
|
|
|
|
|
|
},
|
|
|
|
|
|
processComment: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '审核通过,同意解押'
|
|
|
|
|
|
},
|
|
|
|
|
|
rejectionReason: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: null
|
|
|
|
|
|
},
|
|
|
|
|
|
remark: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '客户信用良好'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
LoanReleaseHistory: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
id: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
example: 1
|
|
|
|
|
|
},
|
|
|
|
|
|
action: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
enum: ['apply', 'process', 'approve', 'reject', 'complete', 'release'],
|
|
|
|
|
|
example: 'apply'
|
|
|
|
|
|
},
|
|
|
|
|
|
operator: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '刘超'
|
|
|
|
|
|
},
|
|
|
|
|
|
time: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
format: 'date-time',
|
|
|
|
|
|
example: '2025-09-26T03:38:51.000Z'
|
|
|
|
|
|
},
|
|
|
|
|
|
comment: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '提交解押申请'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
LoanReleaseCreateRequest: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
required: ['customer_name', 'customer_phone', 'customer_id_card', 'collateral_type', 'release_amount'],
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
contract_id: {
|
|
|
|
|
|
type: 'integer',
|
|
|
|
|
|
example: 1
|
|
|
|
|
|
},
|
|
|
|
|
|
customer_name: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '测试用户'
|
|
|
|
|
|
},
|
|
|
|
|
|
customer_phone: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '13800138000'
|
|
|
|
|
|
},
|
|
|
|
|
|
customer_id_card: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '511123199001010001'
|
|
|
|
|
|
},
|
|
|
|
|
|
farmer_name: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '测试用户'
|
|
|
|
|
|
},
|
|
|
|
|
|
product_name: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '测试产品'
|
|
|
|
|
|
},
|
|
|
|
|
|
collateral_type: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
enum: ['house', 'car', 'land', 'equipment', 'livestock'],
|
|
|
|
|
|
example: 'livestock'
|
|
|
|
|
|
},
|
|
|
|
|
|
collateral_description: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '测试抵押物'
|
|
|
|
|
|
},
|
|
|
|
|
|
collateral_value: {
|
|
|
|
|
|
type: 'number',
|
|
|
|
|
|
example: 100000
|
|
|
|
|
|
},
|
|
|
|
|
|
loan_amount: {
|
|
|
|
|
|
type: 'number',
|
|
|
|
|
|
example: 80000
|
|
|
|
|
|
},
|
|
|
|
|
|
release_amount: {
|
|
|
|
|
|
type: 'number',
|
|
|
|
|
|
example: 50000
|
|
|
|
|
|
},
|
|
|
|
|
|
release_quantity: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '5头'
|
|
|
|
|
|
},
|
|
|
|
|
|
application_reason: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '测试解押申请'
|
|
|
|
|
|
},
|
|
|
|
|
|
remark: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '测试备注'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
LoanReleaseProcessRequest: {
|
|
|
|
|
|
type: 'object',
|
|
|
|
|
|
required: ['action', 'comment'],
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
action: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
enum: ['approve', 'reject'],
|
|
|
|
|
|
example: 'approve'
|
|
|
|
|
|
},
|
|
|
|
|
|
comment: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '审核通过'
|
|
|
|
|
|
},
|
|
|
|
|
|
remark: {
|
|
|
|
|
|
type: 'string',
|
|
|
|
|
|
example: '测试处理'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-09-17 18:04:28 +08:00
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
responses: {
|
|
|
|
|
|
UnauthorizedError: {
|
|
|
|
|
|
description: '未授权访问',
|
|
|
|
|
|
content: {
|
|
|
|
|
|
'application/json': {
|
|
|
|
|
|
schema: {
|
|
|
|
|
|
$ref: '#/components/schemas/Error'
|
|
|
|
|
|
},
|
|
|
|
|
|
example: {
|
|
|
|
|
|
success: false,
|
|
|
|
|
|
message: '访问被拒绝,未提供令牌'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
ForbiddenError: {
|
|
|
|
|
|
description: '权限不足',
|
|
|
|
|
|
content: {
|
|
|
|
|
|
'application/json': {
|
|
|
|
|
|
schema: {
|
|
|
|
|
|
$ref: '#/components/schemas/Error'
|
|
|
|
|
|
},
|
|
|
|
|
|
example: {
|
|
|
|
|
|
success: false,
|
|
|
|
|
|
message: '权限不足'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
NotFoundError: {
|
|
|
|
|
|
description: '资源不存在',
|
|
|
|
|
|
content: {
|
|
|
|
|
|
'application/json': {
|
|
|
|
|
|
schema: {
|
|
|
|
|
|
$ref: '#/components/schemas/Error'
|
|
|
|
|
|
},
|
|
|
|
|
|
example: {
|
|
|
|
|
|
success: false,
|
|
|
|
|
|
message: '请求的资源不存在'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
ValidationError: {
|
|
|
|
|
|
description: '输入数据验证失败',
|
|
|
|
|
|
content: {
|
|
|
|
|
|
'application/json': {
|
|
|
|
|
|
schema: {
|
|
|
|
|
|
$ref: '#/components/schemas/Error'
|
|
|
|
|
|
},
|
|
|
|
|
|
example: {
|
|
|
|
|
|
success: false,
|
|
|
|
|
|
message: '输入数据验证失败',
|
|
|
|
|
|
errors: [
|
|
|
|
|
|
{
|
|
|
|
|
|
field: 'email',
|
|
|
|
|
|
message: '邮箱格式不正确'
|
|
|
|
|
|
}
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
InternalServerError: {
|
|
|
|
|
|
description: '服务器内部错误',
|
|
|
|
|
|
content: {
|
|
|
|
|
|
'application/json': {
|
|
|
|
|
|
schema: {
|
|
|
|
|
|
$ref: '#/components/schemas/Error'
|
|
|
|
|
|
},
|
|
|
|
|
|
example: {
|
|
|
|
|
|
success: false,
|
|
|
|
|
|
message: '服务器内部错误'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
security: [
|
|
|
|
|
|
{
|
|
|
|
|
|
bearerAuth: []
|
|
|
|
|
|
}
|
|
|
|
|
|
],
|
|
|
|
|
|
tags: [
|
2025-09-26 17:52:50 +08:00
|
|
|
|
{
|
|
|
|
|
|
name: 'Authentication',
|
|
|
|
|
|
description: '认证相关接口'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'Dashboard',
|
|
|
|
|
|
description: '仪表盘相关接口'
|
|
|
|
|
|
},
|
2025-09-17 18:04:28 +08:00
|
|
|
|
{
|
|
|
|
|
|
name: 'Users',
|
|
|
|
|
|
description: '用户管理相关接口'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'Accounts',
|
|
|
|
|
|
description: '账户管理相关接口'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'Transactions',
|
|
|
|
|
|
description: '交易管理相关接口'
|
2025-09-26 17:52:50 +08:00
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'Loan Products',
|
|
|
|
|
|
description: '贷款产品管理相关接口'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'Loan Applications',
|
|
|
|
|
|
description: '贷款申请管理相关接口'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'Loan Contracts',
|
|
|
|
|
|
description: '贷款合同管理相关接口'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'Loan Release',
|
|
|
|
|
|
description: '贷款解押管理相关接口'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'Employees',
|
|
|
|
|
|
description: '员工管理相关接口'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'Projects',
|
|
|
|
|
|
description: '项目管理相关接口'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'Supervision Tasks',
|
|
|
|
|
|
description: '监管任务管理相关接口'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'Installation Tasks',
|
|
|
|
|
|
description: '安装任务管理相关接口'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'Completed Supervisions',
|
|
|
|
|
|
description: '完成监管管理相关接口'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'Reports',
|
|
|
|
|
|
description: '报表管理相关接口'
|
2025-09-17 18:04:28 +08:00
|
|
|
|
}
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
apis: [
|
|
|
|
|
|
'./routes/*.js',
|
|
|
|
|
|
'./controllers/*.js'
|
|
|
|
|
|
]
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const specs = swaggerJSDoc(options);
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = specs;
|