feat: 增加了shadcn和openapi

This commit is contained in:
2025-06-27 13:12:30 +08:00
parent 6650fd58f1
commit 3feab6a871
75 changed files with 3355 additions and 24 deletions

111
scripts/generate-api.js Normal file
View File

@@ -0,0 +1,111 @@
import { generate } from 'openapi-typescript-codegen';
import { readFileSync, writeFileSync, existsSync, readdirSync } from 'fs';
import { join } from 'path';
import axios from 'axios';
// 配置
const config = {
input: process.env.OPENAPI_URL || 'http://192.168.0.127:8010/openapi.json', // OpenAPI规范URL
output: './src/api', // 生成的API代码输出目录
client: 'axios', // 使用axios作为HTTP客户端
useOptions: true,
useUnionTypes: true,
exportSchemas: true,
exportServices: true,
exportCore: true,
exportModels: true,
exportClient: true,
};
async function fetchOpenApiSpec(url) {
try {
console.log(`📡 正在获取OpenAPI规范: ${url}`);
const response = await axios.get(url);
return response.data;
} catch (error) {
console.error(`❌ 获取OpenAPI规范失败: ${error.message}`);
throw error;
}
}
function createIndexFiles() {
const apiDir = config.output;
// 创建services/index.ts
const servicesDir = join(apiDir, 'services');
if (existsSync(servicesDir)) {
const serviceFiles = readdirSync(servicesDir)
.filter(file => file.endsWith('.ts') && file !== 'index.ts' && file !== 'Service.ts')
.map(file => file.replace('.ts', ''));
const servicesIndexContent = serviceFiles
.map(service => `export * from './${service}';`)
.join('\n');
writeFileSync(join(servicesDir, 'index.ts'), servicesIndexContent);
console.log('📝 创建services/index.ts完成');
}
// 创建models/index.ts
const modelsDir = join(apiDir, 'models');
if (existsSync(modelsDir)) {
const modelFiles = readdirSync(modelsDir)
.filter(file => file.endsWith('.ts') && file !== 'index.ts')
.map(file => file.replace('.ts', ''));
const modelsIndexContent = modelFiles
.map(model => `export * from './${model}';`)
.join('\n');
writeFileSync(join(modelsDir, 'index.ts'), modelsIndexContent);
console.log('📝 创建models/index.ts完成');
}
}
async function generateApi() {
try {
console.log('🚀 开始生成API代码...');
let openApiSpec;
// 检查输入是URL还是本地文件
if (config.input.startsWith('http://') || config.input.startsWith('https://')) {
// 从URL获取OpenAPI规范
openApiSpec = await fetchOpenApiSpec(config.input);
} else {
// 从本地文件读取
if (!existsSync(config.input)) {
console.error(`❌ OpenAPI文件不存在: ${config.input}`);
console.log('请确保openapi.json文件存在于项目根目录或设置OPENAPI_URL环境变量');
return;
}
openApiSpec = JSON.parse(readFileSync(config.input, 'utf8'));
}
// 生成API代码
await generate({
input: openApiSpec, // 直接传入规范对象
output: config.output,
client: config.client,
useOptions: config.useOptions,
useUnionTypes: config.useUnionTypes,
exportSchemas: config.exportSchemas,
exportServices: config.exportServices,
exportCore: config.exportCore,
exportModels: config.exportModels,
exportClient: config.exportClient,
});
console.log('✅ API代码生成完成');
console.log(`📁 输出目录: ${config.output}`);
// 创建索引文件
createIndexFiles();
} catch (error) {
console.error('❌ 生成API代码时出错:', error);
}
}
// 运行生成器
generateApi();