feat: update example
This commit is contained in:
parent
93a8f67424
commit
498c2f3d7e
|
|
@ -1,311 +0,0 @@
|
|||
/// 高级使用示例
|
||||
/// 演示高性能解析、优化生成和性能监控
|
||||
library;
|
||||
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
import 'package:swagger_generator_flutter/swagger_generator_flutter.dart';
|
||||
|
||||
void main() async {
|
||||
print('🚀 高级使用示例');
|
||||
print('=' * 50);
|
||||
|
||||
try {
|
||||
await demonstrateHighPerformanceParsing();
|
||||
await demonstrateOptimizedGeneration();
|
||||
await demonstratePerformanceMonitoring();
|
||||
await demonstrateCaching();
|
||||
await demonstrateValidationAndErrorHandling();
|
||||
|
||||
print('\n🎉 高级使用示例完成!');
|
||||
} catch (e, stackTrace) {
|
||||
print('❌ 发生错误: $e');
|
||||
print('堆栈跟踪: $stackTrace');
|
||||
}
|
||||
}
|
||||
|
||||
/// 演示高性能解析
|
||||
Future<void> demonstrateHighPerformanceParsing() async {
|
||||
print('\n📊 高性能解析演示');
|
||||
print('-' * 30);
|
||||
|
||||
// 读取文档
|
||||
final jsonString = await File('swagger.json').readAsString();
|
||||
print('📖 文档大小: ${(jsonString.length / 1024).toStringAsFixed(2)}KB');
|
||||
|
||||
// 配置高性能解析器
|
||||
final parser = PerformanceParser(
|
||||
config: ParseConfig(
|
||||
enablePerformanceStats: true,
|
||||
enableParallelParsing: false, // 禁用并行解析避免类型转换问题
|
||||
enableCaching: true,
|
||||
maxConcurrency: 8,
|
||||
enableMemoryOptimization: true,
|
||||
),
|
||||
);
|
||||
|
||||
// 解析文档
|
||||
final stopwatch = Stopwatch()..start();
|
||||
final document = await parser.parseDocument(jsonString);
|
||||
stopwatch.stop();
|
||||
|
||||
// 显示解析结果
|
||||
print('✅ 解析完成');
|
||||
print(' - 解析时间: ${stopwatch.elapsedMilliseconds}ms');
|
||||
print(' - 路径数: ${document.paths.length}');
|
||||
print(' - 模型数: ${document.models.length}');
|
||||
print(' - 服务器数: ${document.servers.length}');
|
||||
|
||||
// 显示性能统计
|
||||
final stats = parser.lastStats;
|
||||
if (stats != null) {
|
||||
print('\n📈 性能统计:');
|
||||
print(' - 总时间: ${stats.totalTime.inMilliseconds}ms');
|
||||
print(' - 解析时间: ${stats.parseTime.inMilliseconds}ms');
|
||||
print(' - 验证时间: ${stats.validationTime.inMilliseconds}ms');
|
||||
print(' - 模型创建时间: ${stats.modelCreationTime.inMilliseconds}ms');
|
||||
print(
|
||||
' - 内存使用: ${(stats.memoryUsage / 1024 / 1024).toStringAsFixed(2)}MB');
|
||||
print(' - 路径处理速度: ${stats.pathsPerSecond.toStringAsFixed(1)} paths/s');
|
||||
print(' - 吞吐量: ${(stats.bytesPerSecond / 1024).toStringAsFixed(2)} KB/s');
|
||||
}
|
||||
|
||||
// 显示缓存统计
|
||||
final cacheStats = parser.getCacheStats();
|
||||
print('\n🗄️ 缓存统计:');
|
||||
print(' - 缓存大小: ${cacheStats['size']}');
|
||||
print(' - 缓存键: ${(cacheStats['keys'] as List).length}');
|
||||
}
|
||||
|
||||
/// 演示优化代码生成
|
||||
Future<void> demonstrateOptimizedGeneration() async {
|
||||
print('\n🔧 优化代码生成演示');
|
||||
print('-' * 30);
|
||||
|
||||
// 解析文档
|
||||
final jsonString = await File('swagger.json').readAsString();
|
||||
final document = SwaggerDocument.fromJson(jsonDecode(jsonString));
|
||||
|
||||
// 创建优化生成器
|
||||
final generator = OptimizedRetrofitGenerator(
|
||||
className: 'AdvancedApiService',
|
||||
generateModularApis: true,
|
||||
generateBaseResult: true,
|
||||
generatePagination: true,
|
||||
generateFileUpload: true,
|
||||
baseResultType: 'ApiResult',
|
||||
pageResultType: 'PagedResult',
|
||||
);
|
||||
|
||||
// 生成代码
|
||||
final stopwatch = Stopwatch()..start();
|
||||
final generatedCode = generator.generateFromDocument(document);
|
||||
stopwatch.stop();
|
||||
|
||||
print('✅ 代码生成完成');
|
||||
print(' - 生成时间: ${stopwatch.elapsedMilliseconds}ms');
|
||||
print(' - 代码大小: ${(generatedCode.length / 1024).toStringAsFixed(2)}KB');
|
||||
print(' - 代码行数: ${generatedCode.split('\n').length}');
|
||||
|
||||
// 检查生成的特性
|
||||
final features = <String>[];
|
||||
if (generatedCode.contains('class ApiResult')) features.add('基础响应类型');
|
||||
if (generatedCode.contains('class PagedResult')) features.add('分页支持');
|
||||
if (generatedCode.contains('MultipartFile')) features.add('文件上传');
|
||||
if (generatedCode.contains('class ApiUtils')) features.add('工具类');
|
||||
|
||||
print(' - 生成特性: ${features.join(', ')}');
|
||||
|
||||
// 保存代码
|
||||
final outputFile = File('example/generated/advanced_api_service.dart');
|
||||
await outputFile.writeAsString(generatedCode);
|
||||
print(' - 保存位置: ${outputFile.path}');
|
||||
}
|
||||
|
||||
/// 演示性能监控
|
||||
Future<void> demonstratePerformanceMonitoring() async {
|
||||
print('\n📊 性能监控演示');
|
||||
print('-' * 30);
|
||||
|
||||
// 解析文档
|
||||
final jsonString = await File('swagger.json').readAsString();
|
||||
final document = SwaggerDocument.fromJson(jsonDecode(jsonString));
|
||||
|
||||
// 创建性能生成器
|
||||
final generator = PerformanceGenerator(
|
||||
maxConcurrency: 4,
|
||||
enableCaching: true,
|
||||
enableIncremental: true,
|
||||
enableParallel: true,
|
||||
);
|
||||
|
||||
// 生成代码
|
||||
final generatedCode = await generator.generateFromDocument(document);
|
||||
|
||||
// 获取性能统计
|
||||
final stats = generator.getStats();
|
||||
print('📈 生成性能统计:');
|
||||
print(' - 总任务数: ${stats.totalTasks}');
|
||||
print(' - 完成任务数: ${stats.completedTasks}');
|
||||
print(' - 失败任务数: ${stats.failedTasks}');
|
||||
print(' - 成功率: ${(stats.successRate * 100).toStringAsFixed(1)}%');
|
||||
print(' - 总时间: ${stats.totalTime.inMilliseconds}ms');
|
||||
print(' - 平均任务时间: ${stats.averageTaskTime.inMilliseconds}ms');
|
||||
print(' - 生成行数: ${stats.linesGenerated}');
|
||||
print(' - 生成字节数: ${stats.bytesGenerated}');
|
||||
print(' - 并行效率: ${(stats.parallelEfficiency * 100).toStringAsFixed(1)}%');
|
||||
print(' - 生成速度: ${stats.linesPerSecond.toStringAsFixed(1)} lines/s');
|
||||
|
||||
// 获取缓存统计
|
||||
final cacheStats = generator.getCacheStats();
|
||||
print('\n🗄️ 生成器缓存统计:');
|
||||
print(' - 总请求: ${cacheStats.totalRequests}');
|
||||
print(' - 缓存命中: ${cacheStats.hits}');
|
||||
print(' - 缓存未命中: ${cacheStats.misses}');
|
||||
print(' - 命中率: ${(cacheStats.hitRate * 100).toStringAsFixed(1)}%');
|
||||
print(' - 缓存大小: ${cacheStats.size}/${cacheStats.maxSize}');
|
||||
print(' - 平均访问时间: ${cacheStats.averageAccessTime.inMicroseconds}μs');
|
||||
}
|
||||
|
||||
/// 演示缓存功能
|
||||
Future<void> demonstrateCaching() async {
|
||||
print('\n🗄️ 缓存功能演示');
|
||||
print('-' * 30);
|
||||
|
||||
// 创建智能缓存
|
||||
final cache = SmartCache<String>(
|
||||
maxSize: 100,
|
||||
strategy: CacheStrategy.smart,
|
||||
defaultTtl: Duration(minutes: 30),
|
||||
);
|
||||
|
||||
// 添加一些测试数据
|
||||
cache.put('user:1', '{"id": 1, "name": "Alice"}');
|
||||
cache.put('user:2', '{"id": 2, "name": "Bob"}');
|
||||
cache.put('user:3', '{"id": 3, "name": "Charlie"}');
|
||||
|
||||
// 模拟访问模式
|
||||
for (int i = 0; i < 10; i++) {
|
||||
cache.get('user:1'); // 频繁访问
|
||||
}
|
||||
for (int i = 0; i < 5; i++) {
|
||||
cache.get('user:2'); // 中等访问
|
||||
}
|
||||
cache.get('user:3'); // 少量访问
|
||||
|
||||
// 获取缓存统计
|
||||
final stats = cache.getStats();
|
||||
print('📊 缓存统计:');
|
||||
print(' - 总请求: ${stats.totalRequests}');
|
||||
print(' - 命中: ${stats.hits}');
|
||||
print(' - 未命中: ${stats.misses}');
|
||||
print(' - 命中率: ${(stats.hitRate * 100).toStringAsFixed(1)}%');
|
||||
print(' - 缓存大小: ${stats.size}/${stats.maxSize}');
|
||||
print(' - 填充率: ${(stats.fillRate * 100).toStringAsFixed(1)}%');
|
||||
|
||||
// 显示访问统计
|
||||
print('\n📈 访问统计:');
|
||||
stats.keyAccessCounts.forEach((key, count) {
|
||||
print(' - $key: $count 次访问');
|
||||
});
|
||||
|
||||
// 演示缓存预热
|
||||
print('\n🔥 缓存预热演示:');
|
||||
await cache.warmUp({
|
||||
'config:app': () async => '{"theme": "dark", "language": "zh"}',
|
||||
'config:api': () async => '{"timeout": 30000, "retries": 3}',
|
||||
});
|
||||
|
||||
print(' - 预热完成,缓存大小: ${cache.getStats().size}');
|
||||
}
|
||||
|
||||
/// 演示验证和错误处理
|
||||
Future<void> demonstrateValidationAndErrorHandling() async {
|
||||
print('\n✅ 验证和错误处理演示');
|
||||
print('-' * 30);
|
||||
|
||||
// 创建一个有问题的文档
|
||||
final problematicDoc = {
|
||||
'openapi': '3.0.3',
|
||||
'info': {
|
||||
'title': 'Problematic API',
|
||||
'version': '1.0.0',
|
||||
},
|
||||
'paths': {
|
||||
'/users/{id}': {
|
||||
'get': {
|
||||
'summary': 'Get user',
|
||||
'responses': {
|
||||
'200': {
|
||||
'description': 'Success',
|
||||
},
|
||||
},
|
||||
// 缺少路径参数声明
|
||||
},
|
||||
},
|
||||
'invalid-path': {
|
||||
// 无效的路径格式
|
||||
'get': {
|
||||
'summary': 'Invalid path',
|
||||
'responses': {
|
||||
'200': {
|
||||
'description': 'Success',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
final jsonString = jsonEncode(problematicDoc);
|
||||
final document = SwaggerDocument.fromJson(jsonDecode(jsonString));
|
||||
|
||||
// 创建验证器
|
||||
final validator = EnhancedValidator(
|
||||
includeWarnings: true,
|
||||
);
|
||||
|
||||
// 验证文档
|
||||
final isValid = validator.validateDocument(document);
|
||||
print('📋 验证结果: ${isValid ? "通过" : "失败"}');
|
||||
|
||||
// 获取错误统计
|
||||
final errorStats = validator.errorReporter.getErrorStatistics();
|
||||
print('\n📊 错误统计:');
|
||||
errorStats.forEach((severity, count) {
|
||||
print(' - ${severity.displayName}: $count');
|
||||
});
|
||||
|
||||
// 显示详细错误
|
||||
final errors = validator.errorReporter.errors;
|
||||
if (errors.isNotEmpty) {
|
||||
print('\n❌ 详细错误:');
|
||||
for (int i = 0; i < errors.length && i < 5; i++) {
|
||||
final error = errors[i];
|
||||
print(' ${i + 1}. ${error.severity.emoji} ${error.title}');
|
||||
print(' 位置: ${error.location.jsonPath}');
|
||||
print(' 描述: ${error.description}');
|
||||
if (error.suggestions.isNotEmpty) {
|
||||
print(' 建议: ${error.suggestions.first.description}');
|
||||
}
|
||||
print('');
|
||||
}
|
||||
}
|
||||
|
||||
// 生成错误报告
|
||||
final report = validator.errorReporter.generateReport(
|
||||
includeStatistics: true,
|
||||
groupByCategory: true,
|
||||
);
|
||||
|
||||
// 保存错误报告
|
||||
final reportFile = File('example/generated/validation_report.txt');
|
||||
await reportFile.writeAsString(report);
|
||||
print('📄 错误报告已保存到: ${reportFile.path}');
|
||||
|
||||
// 生成 JSON 格式报告
|
||||
final jsonReport = validator.errorReporter.generateJsonReport();
|
||||
final jsonReportFile = File('example/generated/validation_report.json');
|
||||
await jsonReportFile.writeAsString(jsonReport);
|
||||
print('📄 JSON 报告已保存到: ${jsonReportFile.path}');
|
||||
}
|
||||
|
|
@ -1,70 +0,0 @@
|
|||
@echo off
|
||||
REM Swagger API 代码生成脚本(Windows)
|
||||
REM 用于示例项目的 API 代码生成
|
||||
|
||||
setlocal enabledelayedexpansion
|
||||
|
||||
echo ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
echo 🚀 Swagger API 代码生成器
|
||||
echo ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
echo.
|
||||
|
||||
REM 步骤 1: 生成 API 代码
|
||||
echo 📝 步骤 1/4: 生成 API 代码...
|
||||
dart run swagger_generator_flutter generate --all
|
||||
|
||||
if !errorlevel! neq 0 (
|
||||
echo ❌ API 代码生成失败!
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo ✅ API 代码生成成功
|
||||
echo.
|
||||
|
||||
REM 步骤 2: 运行 build_runner
|
||||
echo 🔧 步骤 2/4: 运行 build_runner...
|
||||
dart run build_runner build --delete-conflicting-outputs
|
||||
|
||||
if !errorlevel! neq 0 (
|
||||
echo ⚠️ build_runner 执行失败(如果是首次运行,可能需要先修复基础类型)
|
||||
echo 请检查 lib/common/api_response.dart 和 paged_response.dart
|
||||
) else (
|
||||
echo ✅ build_runner 执行成功
|
||||
)
|
||||
|
||||
echo.
|
||||
|
||||
REM 步骤 3: 格式化代码
|
||||
echo 📐 步骤 3/4: 格式化代码...
|
||||
dart format lib/generated
|
||||
|
||||
echo ✅ 代码格式化完成
|
||||
echo.
|
||||
|
||||
REM 步骤 4: 分析代码
|
||||
echo 🔍 步骤 4/4: 分析代码...
|
||||
dart analyze lib/generated --fatal-infos
|
||||
|
||||
if !errorlevel! neq 0 (
|
||||
echo ⚠️ 代码分析发现问题,请检查
|
||||
) else (
|
||||
echo ✅ 代码分析通过
|
||||
)
|
||||
|
||||
echo.
|
||||
echo ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
echo ✨ 代码生成完成!
|
||||
echo ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
echo.
|
||||
echo 📂 生成的文件位置:
|
||||
echo lib/generated/api/
|
||||
echo lib/generated/api_models/
|
||||
echo.
|
||||
echo 📚 下一步:
|
||||
echo 1. 查看生成的代码:lib/generated/
|
||||
echo 2. 在 main.dart 中取消注释 import 语句
|
||||
echo 3. 运行应用:flutter run
|
||||
echo.
|
||||
|
||||
pause
|
||||
|
||||
|
|
@ -1,69 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Swagger API 代码生成脚本
|
||||
# 用于示例项目的 API 代码生成
|
||||
|
||||
set -e # 遇到错误立即退出
|
||||
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "🚀 Swagger API 代码生成器"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo ""
|
||||
|
||||
# 步骤 1: 生成 API 代码
|
||||
echo "📝 步骤 1/4: 生成 API 代码..."
|
||||
dart run swagger_generator_flutter generate --all
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "❌ API 代码生成失败!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ API 代码生成成功"
|
||||
echo ""
|
||||
|
||||
# 步骤 2: 运行 build_runner
|
||||
echo "🔧 步骤 2/4: 运行 build_runner..."
|
||||
dart run build_runner build --delete-conflicting-outputs
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "⚠️ build_runner 执行失败(如果是首次运行,可能需要先修复基础类型)"
|
||||
echo " 请检查 lib/common/api_response.dart 和 paged_response.dart"
|
||||
else
|
||||
echo "✅ build_runner 执行成功"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# 步骤 3: 格式化代码
|
||||
echo "📐 步骤 3/4: 格式化代码..."
|
||||
dart format lib/generated
|
||||
|
||||
echo "✅ 代码格式化完成"
|
||||
echo ""
|
||||
|
||||
# 步骤 4: 分析代码
|
||||
echo "🔍 步骤 4/4: 分析代码..."
|
||||
dart analyze lib/generated --fatal-infos
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "⚠️ 代码分析发现问题,请检查"
|
||||
else
|
||||
echo "✅ 代码分析通过"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "✨ 代码生成完成!"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo ""
|
||||
echo "📂 生成的文件位置:"
|
||||
echo " lib/generated/api/"
|
||||
echo " lib/generated/api_models/"
|
||||
echo ""
|
||||
echo "📚 下一步:"
|
||||
echo " 1. 查看生成的代码:lib/generated/"
|
||||
echo " 2. 在 main.dart 中取消注释 import 语句"
|
||||
echo " 3. 运行应用:flutter run"
|
||||
echo ""
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,107 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# 测试示例项目脚本
|
||||
# 用于快速验证 dev_dependencies 功能是否正常工作
|
||||
|
||||
set -e
|
||||
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "🧪 测试 Swagger Generator 示例项目"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo ""
|
||||
|
||||
# 检查当前目录
|
||||
if [ ! -f "pubspec.yaml" ]; then
|
||||
echo "❌ 错误:请在示例项目目录中运行此脚本"
|
||||
echo " cd example/as_dev_dependency"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "📂 当前目录: $(pwd)"
|
||||
echo ""
|
||||
|
||||
# 步骤 1: 清理
|
||||
echo "🧹 步骤 1/5: 清理旧文件..."
|
||||
rm -rf lib/generated .dart_tool build
|
||||
echo "✅ 清理完成"
|
||||
echo ""
|
||||
|
||||
# 步骤 2: 安装依赖
|
||||
echo "📦 步骤 2/5: 安装依赖..."
|
||||
flutter pub get
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "❌ 依赖安装失败"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ 依赖安装成功"
|
||||
echo ""
|
||||
|
||||
# 步骤 3: 生成 API 代码
|
||||
echo "🚀 步骤 3/5: 生成 API 代码..."
|
||||
dart run swagger_generator_flutter generate --all
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "❌ API 代码生成失败"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ API 代码生成成功"
|
||||
echo ""
|
||||
|
||||
# 步骤 4: 检查生成的文件
|
||||
echo "🔍 步骤 4/5: 检查生成的文件..."
|
||||
|
||||
if [ ! -d "lib/generated" ]; then
|
||||
echo "❌ 生成目录不存在"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -d "lib/generated/api" ]; then
|
||||
echo "❌ API 目录不存在"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -d "lib/generated/api_models" ]; then
|
||||
echo "❌ Models 目录不存在"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 统计生成的文件
|
||||
api_files=$(find lib/generated/api -name "*.dart" | wc -l | tr -d ' ')
|
||||
model_files=$(find lib/generated/api_models -name "*.dart" | wc -l | tr -d ' ')
|
||||
|
||||
echo " 📄 生成的 API 文件: $api_files 个"
|
||||
echo " 📄 生成的 Model 文件: $model_files 个"
|
||||
echo "✅ 文件检查通过"
|
||||
echo ""
|
||||
|
||||
# 步骤 5: 分析代码
|
||||
echo "🔬 步骤 5/5: 分析生成的代码..."
|
||||
dart analyze lib/generated 2>&1 | head -20
|
||||
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "✨ 测试完成!"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo ""
|
||||
echo "📊 统计信息:"
|
||||
echo " ✅ API 文件: $api_files 个"
|
||||
echo " ✅ Model 文件: $model_files 个"
|
||||
echo ""
|
||||
echo "📁 生成的文件位置:"
|
||||
echo " lib/generated/api/"
|
||||
echo " lib/generated/api_models/"
|
||||
echo ""
|
||||
echo "🎯 下一步:"
|
||||
echo " 1. 运行 build_runner:"
|
||||
echo " dart run build_runner build --delete-conflicting-outputs"
|
||||
echo ""
|
||||
echo " 2. 运行应用:"
|
||||
echo " flutter run"
|
||||
echo ""
|
||||
echo " 3. 查看生成的代码:"
|
||||
echo " ls -la lib/generated/"
|
||||
echo ""
|
||||
|
||||
|
|
@ -0,0 +1,86 @@
|
|||
@echo off
|
||||
REM Swagger API 代码生成脚本 (Windows)
|
||||
REM 用于 Learning Officer OA 项目
|
||||
|
||||
setlocal enabledelayedexpansion
|
||||
|
||||
echo ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
echo 🚀 Swagger API 代码生成器
|
||||
echo ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
echo.
|
||||
|
||||
REM 检查是否在项目根目录
|
||||
if not exist "pubspec.yaml" (
|
||||
echo ❌ 错误: 请在项目根目录运行此脚本
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
REM 检查配置文件是否存在
|
||||
if not exist "generator_config.yaml" (
|
||||
echo ❌ 错误: 找不到 generator_config.yaml 配置文件
|
||||
echo 请先创建配置文件
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
REM 步骤 1: 运行代码生成器
|
||||
echo 📝 步骤 1/4: 正在运行代码生成器...
|
||||
dart run swagger_generator_flutter generate --all
|
||||
|
||||
if !errorlevel! neq 0 (
|
||||
echo ❌ 代码生成失败!
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo ✅ 代码生成成功
|
||||
echo.
|
||||
|
||||
REM 步骤 2: 运行 build_runner 生成 .g.dart 文件
|
||||
echo 🔨 步骤 2/4: 正在运行 build_runner 生成 .g.dart 文件...
|
||||
flutter pub run build_runner build --delete-conflicting-outputs
|
||||
|
||||
if !errorlevel! neq 0 (
|
||||
echo ⚠️ build_runner 执行失败,请检查错误信息
|
||||
) else (
|
||||
echo ✅ build_runner 执行成功
|
||||
)
|
||||
|
||||
echo.
|
||||
|
||||
REM 步骤 3: 修复和排序 imports
|
||||
echo 🔧 步骤 3/4: 修复和排序 imports...
|
||||
dart fix --apply lib/common/api
|
||||
dart fix --apply lib/common/api_models
|
||||
|
||||
if !errorlevel! neq 0 (
|
||||
echo ⚠️ dart fix 执行失败,请检查错误信息
|
||||
) else (
|
||||
echo ✅ dart fix 执行成功
|
||||
)
|
||||
|
||||
echo.
|
||||
|
||||
REM 步骤 4: 格式化代码
|
||||
echo 📐 步骤 4/4: 格式化代码...
|
||||
dart format lib/common/api lib/common/api_models --set-exit-if-changed
|
||||
|
||||
if !errorlevel! neq 0 (
|
||||
echo ⚠️ 代码格式化失败,请检查错误信息
|
||||
) else (
|
||||
echo ✅ 代码格式化完成
|
||||
)
|
||||
|
||||
echo.
|
||||
echo ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
echo ✨ 代码生成完成!
|
||||
echo ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
echo.
|
||||
echo 📋 生成的文件位置:
|
||||
echo - API 接口: lib/common/api/
|
||||
echo - API 模型: lib/common/api_models/
|
||||
echo.
|
||||
echo 💡 提示:
|
||||
echo - 如果生成的文件有错误,请检查并修复后重新运行 build_runner
|
||||
echo - 建议在提交代码前检查生成的代码是否符合项目规范
|
||||
echo.
|
||||
|
||||
pause
|
||||
|
|
@ -0,0 +1,95 @@
|
|||
#!/bin/bash
|
||||
# Swagger API 代码生成脚本
|
||||
# 用于 Learning Officer OA 项目
|
||||
|
||||
set -e # 遇到错误立即退出
|
||||
|
||||
# 颜色定义
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
CYAN='\033[0;36m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo -e "${CYAN}🚀 Swagger API 代码生成器${NC}"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo ""
|
||||
|
||||
# 检查是否在项目根目录
|
||||
if [ ! -f "pubspec.yaml" ]; then
|
||||
echo -e "${YELLOW}❌ 错误: 请在项目根目录运行此脚本${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 检查配置文件是否存在
|
||||
if [ ! -f "generator_config.yaml" ]; then
|
||||
echo -e "${YELLOW}❌ 错误: 找不到 generator_config.yaml 配置文件${NC}"
|
||||
echo "请先创建配置文件"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
rm -rf lib/src/api/*.dart
|
||||
rm -rf lib/src/models/*.dart
|
||||
|
||||
# 步骤 1: 运行代码生成器
|
||||
echo -e "${CYAN}📝 步骤 1/4: 正在运行代码生成器...${NC}"
|
||||
dart run swagger_generator_flutter generate --all
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo -e "${YELLOW}❌ 代码生成失败!${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}✅ 代码生成成功${NC}"
|
||||
echo ""
|
||||
|
||||
# 步骤 2: 运行 build_runner 生成 .g.dart 文件
|
||||
echo -e "${CYAN}🔨 步骤 2/4: 正在运行 build_runner 生成 .g.dart 文件...${NC}"
|
||||
flutter pub run build_runner build --delete-conflicting-outputs
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo -e "${YELLOW}⚠️ build_runner 执行失败,请检查错误信息${NC}"
|
||||
else
|
||||
echo -e "${GREEN}✅ build_runner 执行成功${NC}"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# 步骤 3: 修复和排序 imports
|
||||
echo -e "${CYAN}🔧 步骤 3/4: 修复和排序 imports...${NC}"
|
||||
dart fix --apply lib/common/api
|
||||
FIX_API_EXIT_CODE=$?
|
||||
dart fix --apply lib/common/api_models
|
||||
FIX_MODELS_EXIT_CODE=$?
|
||||
|
||||
if [ $FIX_API_EXIT_CODE -ne 0 ] || [ $FIX_MODELS_EXIT_CODE -ne 0 ]; then
|
||||
echo -e "${YELLOW}⚠️ dart fix 执行失败,请检查错误信息${NC}"
|
||||
else
|
||||
echo -e "${GREEN}✅ dart fix 执行成功${NC}"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# 步骤 4: 格式化代码
|
||||
echo -e "${CYAN}📐 步骤 4/4: 格式化代码...${NC}"
|
||||
dart format lib/common/api lib/common/api_models --set-exit-if-changed
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo -e "${YELLOW}⚠️ 代码格式化失败,请检查错误信息${NC}"
|
||||
else
|
||||
echo -e "${GREEN}✅ 代码格式化完成${NC}"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo -e "${GREEN}✨ 代码生成完成!${NC}"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo ""
|
||||
echo -e "${CYAN}📋 生成的文件位置:${NC}"
|
||||
echo " - API 接口: lib/common/api/"
|
||||
echo " - API 模型: lib/common/api_models/"
|
||||
echo ""
|
||||
echo -e "${CYAN}💡 提示:${NC}"
|
||||
echo " - 如果生成的文件有错误,请检查并修复后重新运行 build_runner"
|
||||
echo " - 建议在提交代码前检查生成的代码是否符合项目规范"
|
||||
echo ""
|
||||
|
|
@ -27,9 +27,9 @@ input:
|
|||
# 输出配置
|
||||
output:
|
||||
# 输出目录
|
||||
base_dir: "./lib/generated"
|
||||
api_dir: "./lib/generated/api"
|
||||
models_dir: "./lib/generated/api_models"
|
||||
base_dir: "./lib/src"
|
||||
api_dir: "./lib/src/api"
|
||||
models_dir: "./lib/src/api_models"
|
||||
|
||||
# 文件命名
|
||||
api_file_suffix: "_api.dart"
|
||||
|
|
@ -38,6 +38,13 @@ output:
|
|||
# 是否按 tag 分组
|
||||
split_by_tags: true
|
||||
|
||||
excluded_tags:
|
||||
- "Login"
|
||||
- "MyInfo"
|
||||
- "HealthCheck"
|
||||
- "FeedBackInfo"
|
||||
- "Points"
|
||||
|
||||
# 跳过的目录列表(这些目录下的文件将不会被生成)
|
||||
# 支持相对路径和绝对路径,支持目录名或完整路径
|
||||
ignored_directories:
|
||||
|
|
@ -88,8 +95,8 @@ generation:
|
|||
# 基础类型配置
|
||||
base_result_type: "ApiResponse"
|
||||
base_page_result_type: "PagedResponse"
|
||||
base_result_import: "package:example_app/common/api_response.dart"
|
||||
base_page_result_import: "package:example_app/common/paged_response.dart"
|
||||
base_result_import: "package:example_app/common/base_result.dart"
|
||||
base_page_result_import: "package:example_app/common/base_page_result.dart"
|
||||
|
||||
# 方法命名
|
||||
method_naming: "camelCase"
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
abstract class BaseAbstract extends Object {
|
||||
Map<String, dynamic> toJson();
|
||||
}
|
||||
|
||||
abstract class BaseContainsParametersAbstract extends Object {
|
||||
Map<String, dynamic> toJson(Object Function(dynamic value) toJsonT);
|
||||
}
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'base_page_result.g.dart';
|
||||
|
||||
@JsonSerializable(
|
||||
checked: true,
|
||||
genericArgumentFactories: true,
|
||||
fieldRename: FieldRename.snake,
|
||||
)
|
||||
class BasePageResult<T> extends Object {
|
||||
BasePageResult({required this.items, required this.total});
|
||||
|
||||
@JsonKey(name: 'items')
|
||||
final List<T> items;
|
||||
|
||||
@JsonKey(name: 'total')
|
||||
final int total;
|
||||
|
||||
factory BasePageResult.fromJson(
|
||||
Map<String, dynamic> json,
|
||||
T Function(dynamic json) fromJsonT,
|
||||
) => _$BasePageResultFromJson(json, fromJsonT);
|
||||
|
||||
Map<String, dynamic> toJson(Object Function(T value) toJsonT) =>
|
||||
_$BasePageResultToJson(this, toJsonT);
|
||||
}
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
import 'base_abstract.dart';
|
||||
|
||||
part 'base_result.g.dart';
|
||||
|
||||
@JsonSerializable(
|
||||
checked: true,
|
||||
genericArgumentFactories: true,
|
||||
fieldRename: FieldRename.snake,
|
||||
)
|
||||
class BaseResult<T> extends BaseContainsParametersAbstract {
|
||||
/// 创建失败响应
|
||||
factory BaseResult.failure({required int code, String? message, T? data}) {
|
||||
return BaseResult(code, message ?? '', data);
|
||||
}
|
||||
|
||||
/// 创建成功响应
|
||||
factory BaseResult.success({T? data, String? message, int code = 200}) {
|
||||
return BaseResult(code, message ?? '', data);
|
||||
}
|
||||
BaseResult(this.code, this.message, this.data) {
|
||||
success = successCodes.contains(code);
|
||||
}
|
||||
@JsonKey(name: 'code')
|
||||
final int code;
|
||||
|
||||
/// 响应消息
|
||||
@JsonKey(name: 'msg')
|
||||
final String? message;
|
||||
|
||||
/// 响应数据
|
||||
@JsonKey(name: 'data')
|
||||
final T? data;
|
||||
|
||||
/// 是否成功(根据 code 自动计算)
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
late final bool success;
|
||||
|
||||
/// 成功的响应码列表(可配置)
|
||||
static List<int> successCodes = [200, 0];
|
||||
|
||||
factory BaseResult.fromJson(
|
||||
Map<String, dynamic> json,
|
||||
T Function(dynamic json) fromJsonT,
|
||||
) => _$BaseResultFromJson(json, fromJsonT);
|
||||
|
||||
@override
|
||||
Map<String, dynamic> toJson(Object Function(T value) toJsonT) =>
|
||||
_$BaseResultToJson(this, toJsonT);
|
||||
}
|
||||
|
|
@ -5,18 +5,18 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: _fe_analyzer_shared
|
||||
sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7"
|
||||
sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "67.0.0"
|
||||
version: "85.0.0"
|
||||
analyzer:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: analyzer
|
||||
sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d"
|
||||
sha256: "974859dc0ff5f37bc4313244b3218c791810d03ab3470a579580279ba971a48d"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "6.4.1"
|
||||
version: "7.7.1"
|
||||
args:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -45,10 +45,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: build
|
||||
sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0"
|
||||
sha256: "51dc711996cbf609b90cbe5b335bbce83143875a9d58e4b5c6d3c4f684d3dda7"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.4.1"
|
||||
version: "2.5.4"
|
||||
build_config:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -69,26 +69,26 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: build_resolvers
|
||||
sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a"
|
||||
sha256: ee4257b3f20c0c90e72ed2b57ad637f694ccba48839a821e87db762548c22a62
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.4.2"
|
||||
version: "2.5.4"
|
||||
build_runner:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: build_runner
|
||||
sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d"
|
||||
sha256: "382a4d649addbfb7ba71a3631df0ec6a45d5ab9b098638144faf27f02778eb53"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.4.13"
|
||||
version: "2.5.4"
|
||||
build_runner_core:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build_runner_core
|
||||
sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0
|
||||
sha256: "85fbbb1036d576d966332a3f5ce83f2ce66a40bea1a94ad2d5fc29a19a0d3792"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "7.3.2"
|
||||
version: "9.1.2"
|
||||
built_collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -165,10 +165,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: dart_style
|
||||
sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9"
|
||||
sha256: "8a0e5fba27e8ee025d2ffb4ee820b4e6e2cf5e4246a6b1a477eb66866947e0bb"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.3.6"
|
||||
version: "3.1.1"
|
||||
dio:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
|
@ -303,10 +303,10 @@ packages:
|
|||
dependency: "direct dev"
|
||||
description:
|
||||
name: json_serializable
|
||||
sha256: ea1432d167339ea9b5bb153f0571d0039607a873d6e04e0117af043f14a1fd4b
|
||||
sha256: c50ef5fc083d5b5e12eef489503ba3bf5ccc899e487d691584699b4bdefeea8c
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "6.8.0"
|
||||
version: "6.9.5"
|
||||
leak_tracker:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -415,10 +415,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: protobuf
|
||||
sha256: "68645b24e0716782e58948f8467fd42a880f255096a821f9e7d0ec625b00c84d"
|
||||
sha256: de9c9eb2c33f8e933a42932fe1dc504800ca45ebc3d673e6ed7f39754ee4053e
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "3.1.0"
|
||||
version: "4.2.0"
|
||||
pub_semver:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -447,10 +447,10 @@ packages:
|
|||
dependency: "direct dev"
|
||||
description:
|
||||
name: retrofit_generator
|
||||
sha256: "8dfc406cdfa171f33cbd21bf5bd8b6763548cc217de19cdeaa07a76727fac4ca"
|
||||
sha256: "9abcf21acb95bf7040546eafff87f60cf0aee20b05101d71f99876fc4df1f522"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "8.2.1"
|
||||
version: "9.7.0"
|
||||
shelf:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -476,10 +476,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: source_gen
|
||||
sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832"
|
||||
sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.5.0"
|
||||
version: "2.0.0"
|
||||
source_helper:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -531,7 +531,7 @@ packages:
|
|||
swagger_generator_flutter:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
path: "../.."
|
||||
path: ".."
|
||||
relative: true
|
||||
source: path
|
||||
version: "2.1.1"
|
||||
|
|
@ -559,14 +559,6 @@ packages:
|
|||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.0.2"
|
||||
tuple:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: tuple
|
||||
sha256: a97ce2013f240b2f3807bcbaf218765b6f301c3eff91092bcfa23a039e7dd151
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.0.2"
|
||||
typed_data:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -15,7 +15,7 @@ dependencies:
|
|||
retrofit: ^4.0.0
|
||||
|
||||
# JSON 序列化
|
||||
json_annotation: ^4.8.0
|
||||
json_annotation: ^4.9.0
|
||||
|
||||
# 其他依赖
|
||||
logger: ^2.0.0
|
||||
|
|
@ -26,11 +26,11 @@ dev_dependencies:
|
|||
|
||||
# Swagger 代码生成器(使用本地路径作为示例)
|
||||
swagger_generator_flutter:
|
||||
path: ../../
|
||||
path: ../
|
||||
|
||||
# 代码生成工具
|
||||
build_runner: ^2.4.7
|
||||
retrofit_generator: ^8.0.0
|
||||
retrofit_generator: ^9.0.0
|
||||
json_serializable: ^6.7.1
|
||||
|
||||
# 代码分析
|
||||
|
|
@ -1,130 +0,0 @@
|
|||
# API Client 配置示例
|
||||
# 演示如何自定义 API Client 的类名和文件名
|
||||
|
||||
# 示例 1: 使用默认配置
|
||||
# 如果不配置,将使用默认值:
|
||||
# - class_name: ApiClient
|
||||
# - file_name: api_client
|
||||
generation:
|
||||
api:
|
||||
enabled: true
|
||||
use_retrofit: true
|
||||
use_dio: true
|
||||
# client 配置可以省略,使用默认值
|
||||
|
||||
---
|
||||
|
||||
# 示例 2: 自定义 API Client 名称
|
||||
# 适用于多个项目或模块,避免命名冲突
|
||||
generation:
|
||||
api:
|
||||
enabled: true
|
||||
use_retrofit: true
|
||||
use_dio: true
|
||||
|
||||
client:
|
||||
class_name: "MyApiClient" # 自定义类名
|
||||
file_name: "my_api_client" # 自定义文件名
|
||||
|
||||
# 生成的文件:
|
||||
# - lib/generated/api/my_api_client.dart
|
||||
#
|
||||
# 生成的类:
|
||||
# class MyApiClient {
|
||||
# final Dio _dio;
|
||||
# ...
|
||||
# }
|
||||
|
||||
---
|
||||
|
||||
# 示例 3: 项目特定的命名
|
||||
# 根据项目名称自定义
|
||||
generation:
|
||||
api:
|
||||
enabled: true
|
||||
use_retrofit: true
|
||||
use_dio: true
|
||||
|
||||
client:
|
||||
class_name: "ShopApiClient"
|
||||
file_name: "shop_api_client"
|
||||
|
||||
# 生成的文件:
|
||||
# - lib/generated/api/shop_api_client.dart
|
||||
#
|
||||
# 生成的类:
|
||||
# class ShopApiClient {
|
||||
# final Dio _dio;
|
||||
# ...
|
||||
# }
|
||||
|
||||
---
|
||||
|
||||
# 示例 4: 模块化命名
|
||||
# 适用于大型项目,按模块划分
|
||||
generation:
|
||||
api:
|
||||
enabled: true
|
||||
use_retrofit: true
|
||||
use_dio: true
|
||||
|
||||
client:
|
||||
class_name: "UserModuleApi"
|
||||
file_name: "user_module_api"
|
||||
|
||||
# 生成的文件:
|
||||
# - lib/generated/api/user_module_api.dart
|
||||
#
|
||||
# 生成的类:
|
||||
# class UserModuleApi {
|
||||
# final Dio _dio;
|
||||
# ...
|
||||
# }
|
||||
|
||||
---
|
||||
|
||||
# 示例 5: 完整配置示例
|
||||
# 包含所有相关配置
|
||||
generator:
|
||||
name: "my_project_generator"
|
||||
version: "1.0"
|
||||
author: "Your Name"
|
||||
copyright: "Copyright (C) 2025 Your Company. All rights reserved."
|
||||
|
||||
input:
|
||||
swagger_urls:
|
||||
- "https://your-api.com/swagger/v2/swagger.json"
|
||||
|
||||
output:
|
||||
base_dir: "./lib/generated"
|
||||
api_dir: "./lib/generated/api"
|
||||
models_dir: "./lib/generated/api_models"
|
||||
split_by_tags: true
|
||||
|
||||
generation:
|
||||
api:
|
||||
enabled: true
|
||||
use_retrofit: true
|
||||
use_dio: true
|
||||
parser: "JsonSerializable"
|
||||
|
||||
# 自定义 API Client
|
||||
client:
|
||||
class_name: "AppApiClient"
|
||||
file_name: "app_api_client"
|
||||
|
||||
# 使用方式:
|
||||
# 1. 复制此配置到项目根目录的 generator_config.yaml
|
||||
# 2. 运行生成命令:
|
||||
# dart run swagger_generator_flutter generate --all
|
||||
# 3. 生成的主 API 文件:
|
||||
# lib/generated/api/app_api_client.dart
|
||||
# 4. 在代码中使用:
|
||||
# import 'package:your_app/generated/api/app_api_client.dart';
|
||||
#
|
||||
# final dio = Dio();
|
||||
# final apiClient = AppApiClient(dio);
|
||||
#
|
||||
# // 访问 V2 版本的 API
|
||||
# final result = await apiClient.mobileManagerV2.getData();
|
||||
|
||||
|
|
@ -1,196 +0,0 @@
|
|||
# included_tags 使用示例
|
||||
|
||||
## 场景 1: 只生成移动端管理相关的 API
|
||||
|
||||
假设您的项目中有多个模块,但您只想生成移动端管理(MobileManager)相关的代码:
|
||||
|
||||
### CLI 方式
|
||||
|
||||
```bash
|
||||
# 只生成 MobileManager 相关的 API 和模型
|
||||
dart run swagger_generator_flutter generate --all --included-tags=MobileManager
|
||||
|
||||
# 查看生成的文件
|
||||
ls -la generator/api/
|
||||
ls -la generator/api_models/
|
||||
```
|
||||
|
||||
### 配置文件方式
|
||||
|
||||
在 `generator_config.yaml` 中:
|
||||
|
||||
```yaml
|
||||
output:
|
||||
base_dir: "./lib/generated"
|
||||
api_dir: "./lib/generated/api"
|
||||
models_dir: "./lib/generated/api_models"
|
||||
split_by_tags: true
|
||||
|
||||
# 只生成 MobileManager 相关代码
|
||||
included_tags:
|
||||
- "MobileManager"
|
||||
```
|
||||
|
||||
然后运行:
|
||||
|
||||
```bash
|
||||
dart run swagger_generator_flutter generate --all
|
||||
```
|
||||
|
||||
## 场景 2: 生成多个模块
|
||||
|
||||
如果您需要生成多个模块的代码:
|
||||
|
||||
```bash
|
||||
# 生成 MobileManager 和 TaskSummarize 两个模块
|
||||
dart run swagger_generator_flutter generate --all --included-tags=MobileManager,TaskSummarize
|
||||
```
|
||||
|
||||
或在配置文件中:
|
||||
|
||||
```yaml
|
||||
output:
|
||||
included_tags:
|
||||
- "MobileManager"
|
||||
- "TaskSummarize"
|
||||
```
|
||||
|
||||
## 场景 3: 增量开发
|
||||
|
||||
在开发过程中,您可能想先实现部分功能:
|
||||
|
||||
### 第一阶段:只实现移动端管理
|
||||
|
||||
```bash
|
||||
dart run swagger_generator_flutter generate --all --included-tags=MobileManager
|
||||
```
|
||||
|
||||
### 第二阶段:添加任务汇总功能
|
||||
|
||||
```bash
|
||||
dart run swagger_generator_flutter generate --all --included-tags=MobileManager,TaskSummarize
|
||||
```
|
||||
|
||||
### 第三阶段:生成所有功能
|
||||
|
||||
```bash
|
||||
# 不指定 included-tags,生成所有
|
||||
dart run swagger_generator_flutter generate --all
|
||||
```
|
||||
|
||||
## 场景 4: 团队协作
|
||||
|
||||
不同团队负责不同模块:
|
||||
|
||||
### 移动端团队
|
||||
|
||||
```bash
|
||||
# 只生成移动端相关代码
|
||||
dart run swagger_generator_flutter generate --all --included-tags=MobileManager \
|
||||
--output-dir=lib/api/mobile
|
||||
```
|
||||
|
||||
### 任务管理团队
|
||||
|
||||
```bash
|
||||
# 只生成任务相关代码
|
||||
dart run swagger_generator_flutter generate --all --included-tags=TaskSummarize \
|
||||
--output-dir=lib/api/task
|
||||
```
|
||||
|
||||
## 场景 5: 测试和调试
|
||||
|
||||
在开发新功能时,快速生成特定模块的代码进行测试:
|
||||
|
||||
```bash
|
||||
# 快速生成测试代码
|
||||
dart run swagger_generator_flutter generate --all --included-tags=MobileManager \
|
||||
--output-dir=test_output
|
||||
|
||||
# 测试完成后删除
|
||||
rm -rf test_output
|
||||
```
|
||||
|
||||
## 预期结果
|
||||
|
||||
### 使用 `--included-tags=MobileManager`
|
||||
|
||||
**生成的 API 文件:**
|
||||
- `generator/api/mobile_manager_api.dart` - MobileManager 相关的 API 接口
|
||||
|
||||
**生成的 Model 文件:**
|
||||
- 只包含 MobileManager API 引用的 models
|
||||
- 自动包含这些 models 的依赖 models
|
||||
|
||||
**不会生成:**
|
||||
- 其他 tags 的 API 文件
|
||||
- 未被 MobileManager 引用的 models
|
||||
|
||||
### 使用 `--included-tags=MobileManager,TaskSummarize`
|
||||
|
||||
**生成的 API 文件:**
|
||||
- `generator/api/mobile_manager_api.dart`
|
||||
- `generator/api/task_summarize_api.dart`
|
||||
|
||||
**生成的 Model 文件:**
|
||||
- MobileManager 和 TaskSummarize 引用的所有 models
|
||||
- 以及它们的依赖 models
|
||||
|
||||
## 性能对比
|
||||
|
||||
假设完整的 Swagger 文档有 100 个 endpoints 和 200 个 models:
|
||||
|
||||
| 场景 | Endpoints | Models | 生成时间 | 代码量 |
|
||||
|------|-----------|--------|----------|--------|
|
||||
| 全部生成 | 100 | 200 | ~10s | ~500KB |
|
||||
| 只生成 MobileManager | ~20 | ~40 | ~2s | ~100KB |
|
||||
| 生成 2 个 tags | ~40 | ~80 | ~4s | ~200KB |
|
||||
|
||||
**优势:**
|
||||
- ⚡ 生成速度提升 5 倍
|
||||
- 📦 代码量减少 80%
|
||||
- 🎯 更专注于当前模块
|
||||
- 🔧 更容易调试和维护
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. **Tag 名称必须精确匹配**
|
||||
```bash
|
||||
# ✅ 正确
|
||||
--included-tags=MobileManager
|
||||
|
||||
# ❌ 错误(大小写不匹配)
|
||||
--included-tags=mobilemanager
|
||||
--included-tags=mobile_manager
|
||||
```
|
||||
|
||||
2. **多个 tags 用逗号分隔,不要有空格**
|
||||
```bash
|
||||
# ✅ 正确
|
||||
--included-tags=MobileManager,TaskSummarize
|
||||
|
||||
# ❌ 错误(有空格)
|
||||
--included-tags=MobileManager, TaskSummarize
|
||||
```
|
||||
|
||||
3. **依赖会自动包含**
|
||||
- 不需要手动指定依赖的 models
|
||||
- 系统会自动追踪所有引用关系
|
||||
|
||||
4. **与 split-by-tags 兼容**
|
||||
- `included_tags` 和 `split-by-tags` 可以同时使用
|
||||
- `split-by-tags` 控制是否分文件
|
||||
- `included_tags` 控制生成哪些 tags
|
||||
|
||||
## 查看可用的 Tags
|
||||
|
||||
如果不确定 Swagger 文档中有哪些 tags,可以使用以下命令查看:
|
||||
|
||||
```bash
|
||||
# 使用 jq 查看所有 tags
|
||||
cat swagger.json | jq -r '.paths | to_entries[] | .value | to_entries[] | .value.tags[]?' | sort -u
|
||||
|
||||
# 或者查看 tags 定义
|
||||
cat swagger.json | jq '.tags'
|
||||
```
|
||||
|
||||
Loading…
Reference in New Issue