import fs from 'fs';
// 同步读取指定的 Swagger JSON 文件
export function readJsonFile(filePath) {
try {
const data = fs.readFileSync(filePath, 'utf8');
return JSON.parse(data);
} catch (error) {
throw new Error(`读取Swagger文件时发生错误: ${error.message}`);
}
}
// 解析Swagger文档的函数
export function parseSwaggerDocument(swaggerJson) {
// 构建一个简要的概述信息,便于快速了解文档内容
let summaryText = `Swagger 文档加载成功!\n`;
summaryText += `标题: ${swaggerJson.info?.title || '未指定'}\n`;
summaryText += `描述: ${swaggerJson.info?.description || '无'}\n\n`;
// 添加 Swagger 文档字段说明
summaryText += `【Swagger 文档字段解析说明】\n`;
summaryText += `1. 接口路径:json.paths 下的键值对,即本次接口的路径\n`;
summaryText += ` - 注意:移除公共前缀后的路径为实际请求路径\n`;
summaryText += `2. HTTP 方法:接口路径下的键值对,如 "get"、"post" 等\n`;
summaryText += `3. Content-Type:\n`;
summaryText += ` - get 请求和 post 请求 parameters.in 为 query 时:application/x-www-form-urlencoded\n`;
summaryText += ` - post 请求 parameters.in 为 body 时:application/json\n`;
summaryText += `4. 接口中文名称:{method}.summary 字段\n`;
summaryText += `5. 请求参数:{method}.parameters 数组\n`;
summaryText += ` - 参数名:parameters.name\n`;
summaryText += ` - 参数注释:parameters.description\n`;
summaryText += ` - 是否必传:parameters.required\n`;
summaryText += ` - 参数类型:parameters.type\n`;
summaryText += ` - body 参数结构:parameters.schema.originalRef\n`;
summaryText += `6. 响应对象:{method}.responses\n`;
summaryText += `7. 响应结构:{method}.responses.200.schema.originalRef\n`;
summaryText += `8. 业务数据:result 字段,对应 definitions 中的结构体\n\n`;
// 统计接口数量(如果 paths 存在)
if (swaggerJson.paths) {
const pathCount = Object.keys(swaggerJson.paths).length;
summaryText += `当前文档共包含 ${pathCount} 个接口路径。\n\n`;
summaryText += `【接口路径详细解析】\n`;
// 解析每个接口路径
for (const fullPath of Object.keys(swaggerJson.paths)) {
// 去掉公共前缀 /res-sys/,得到实际请求路径
const actualPath = fullPath.replace('/res-sys/', '/');
const pathInfo = swaggerJson.paths[fullPath];
summaryText += ` 完整路径:${fullPath}\n`;
summaryText += ` 请求路径:${actualPath}\n`;
// 解析每个 HTTP 方法
for (const method of Object.keys(pathInfo)) {
const methodInfo = pathInfo[method];
summaryText += ` HTTP 方法:${method.toUpperCase()}\n`;
// 确定并显示 Content-Type
let contentType = 'application/x-www-form-urlencoded';
if (methodInfo.parameters) {
const bodyParams = methodInfo.parameters.filter(p => p.in === 'body');
if (bodyParams.length > 0) {
contentType = 'application/json';
}
}
summaryText += ` Content-Type:${contentType}\n`;
summaryText += ` 接口名称:${methodInfo.summary || '-'}\n`;
summaryText += ` 接口描述:${methodInfo.description || '-'}\n`;
// 解析参数
if (methodInfo.parameters && methodInfo.parameters.length > 0) {
summaryText += ` 请求参数:\n`;
for (const param of methodInfo.parameters) {
if (param.in === 'body') {
// 处理 body 类型参数
summaryText += ` - ${param.name} (${param.in})\n`;
summaryText += ` 描述:${param.description || '无'}\n`;
summaryText += ` 是否必传:${param.required ? '是' : '否'}\n`;
if (param.schema && param.schema.originalRef) {
summaryText += ` 数据结构:${param.schema.originalRef}\n`;
// 查找并解析对应的定义
const definition = swaggerJson.definitions[param.schema.originalRef];
if (definition && definition.properties) {
summaryText += ` 字段详情:\n`;
for (const [fieldName, fieldInfo] of Object.entries(definition.properties)) {
// 使用通用函数解析嵌套引用
const fieldData = {
name: fieldName,
...fieldInfo
};
summaryText += parseNestedRefs(fieldData, swaggerJson, 8);
}
}
}
} else {
// 处理普通参数
summaryText += ` - ${param.name} (${param.type})\n`;
summaryText += ` 描述:${param.description || '无'}\n`;
summaryText += ` 是否必传:${param.required ? '是' : '否'}\n`;
summaryText += ` 参数位置:${param.in}\n`;
}
}
} else {
summaryText += ` 请求参数:无\n`;
}
// 解析响应对象
if (methodInfo.responses) {
summaryText += ` 响应对象:\n`;
for (const [statusCode, responseInfo] of Object.entries(methodInfo.responses)) {
summaryText += ` - ${statusCode} (${statusCode === '200' ? '成功响应' : '其他响应'})\n`;
// 解析响应结构
if (responseInfo.schema) {
const schema = responseInfo.schema;
summaryText += ` 响应结构:\n`;
// 如果有 originalRef,显示引用名称
if (schema.originalRef) {
summaryText += ` - 结构引用:${schema.originalRef}\n`;
// 查找并解析对应的定义
const definition = swaggerJson.definitions[schema.originalRef];
if (definition) {
summaryText += ` - 结构类型:${definition.type}\n`;
summaryText += ` - 标准字段:\n`;
// 显示标准响应字段
const standardFields = ['code', 'message', 'result', 'success', 'timestamp'];
for (const field of standardFields) {
if (definition.properties[field]) {
const fieldInfo = definition.properties[field];
summaryText += ` - ${field}: ${fieldInfo.type}${fieldInfo.format ? ` (${fieldInfo.format})` : ''}\n`;
summaryText += ` 描述:${fieldInfo.description || '-'}\n`;
}
}
// 解析 result 字段的结构
if (definition.properties.result) {
const resultInfo = definition.properties.result;
summaryText += ` - 业务数据 (result):\n`;
summaryText += ` - 类型:${resultInfo.type}\n`;
// 如果 result 是数组类型
if (resultInfo.type === 'array' && resultInfo.items) {
if (resultInfo.items.originalRef) {
const resultItemRef = resultInfo.items.originalRef;
summaryText += ` - 数组元素类型:${resultItemRef}\n`;
// 查找并解析 result 元素的定义
const resultItemDef = swaggerJson.definitions[resultItemRef];
if (resultItemDef) {
summaryText += ` - 主要业务字段:\n`;
// 使用通用函数解析所有字段及其嵌套引用
for (const [fieldName, fieldInfo] of Object.entries(resultItemDef.properties)) {
const fieldData = {
name: fieldName,
...fieldInfo
};
summaryText += parseNestedRefs(fieldData, swaggerJson, 12);
}
}
} else {
summaryText += ` - 数组元素类型:${resultInfo.items.type || '未指定'}\n`;
}
} else if (resultInfo.originalRef) {
// 如果 result 是对象类型且有引用
const resultRef = resultInfo.originalRef;
summaryText += ` - 数据结构:${resultRef}\n`;
// 查找并解析 result 的定义
const resultDef = swaggerJson.definitions[resultRef];
if (resultDef && resultDef.properties) {
summaryText += ` - 主要业务字段:\n`;
// 使用通用函数解析所有字段及其嵌套引用
for (const [fieldName, fieldInfo] of Object.entries(resultDef.properties)) {
const fieldData = {
name: fieldName,
...fieldInfo
};
summaryText += parseNestedRefs(fieldData, swaggerJson, 12);
}
}
}
}
}
}
}
}
}
}
}
summaryText += `\n您可以要求 AI 智能体基于此完整文档信息生成代码或解答问题。\n\n`;
summaryText += `【完整文档内容已准备就绪,可供查询】\n`;
}
return summaryText;
}
// 解析嵌套引用的函数
function parseNestedRefs(fieldInfo, swaggerJson, indentLevel = 0) {
let text = '';
const indent = ' '.repeat(indentLevel);
// 处理当前字段的类型和描述
text += `${indent}- ${fieldInfo.name || 'unknown'}: ${fieldInfo.type || 'object'}${fieldInfo.format ? ` (${fieldInfo.format})` : ''}\n`;
text += `${indent} 描述:${fieldInfo.description || '无'}\n`;
// 处理嵌套引用
if (fieldInfo.originalRef) {
text += `${indent} 引用结构:${fieldInfo.originalRef}\n`;
const refDefinition = swaggerJson.definitions[fieldInfo.originalRef];
if (refDefinition && refDefinition.properties) {
text += `${indent} 引用结构字段:\n`;
for (const [refFieldName, refFieldInfo] of Object.entries(refDefinition.properties)) {
// 为引用字段创建临时fieldInfo对象
const tempFieldInfo = {
name: refFieldName,
...refFieldInfo
};
text += parseNestedRefs(tempFieldInfo, swaggerJson, indentLevel + 4);
}
}
} else if (fieldInfo.type === 'array' && fieldInfo.items) {
if (fieldInfo.items.originalRef) {
// 数组元素是引用类型
text += `${indent} 数组元素引用结构:${fieldInfo.items.originalRef}\n`;
const refDefinition = swaggerJson.definitions[fieldInfo.items.originalRef];
if (refDefinition && refDefinition.properties) {
text += `${indent} 数组元素结构字段:\n`;
// 显示所有字段,不省略
for (const [refFieldName, refFieldInfo] of Object.entries(refDefinition.properties)) {
const tempFieldInfo = {
name: refFieldName,
...refFieldInfo
};
text += parseNestedRefs(tempFieldInfo, swaggerJson, indentLevel + 4);
}
}
} else {
// 普通数组类型
text += `${indent} 数组元素类型:${fieldInfo.items.type || '未指定'}\n`;
}
}
return text;
}