feat: update example

This commit is contained in:
Max 2025-11-21 15:12:22 +08:00
parent 93a8f67424
commit 498c2f3d7e
20 changed files with 303 additions and 21351 deletions

View File

@ -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}');
}

View File

@ -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

View File

@ -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

View File

@ -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 ""

86
example/generate_api.bat Normal file
View File

@ -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

95
example/generate_api.sh Normal file
View File

@ -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 ""

View File

@ -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"

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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:

View File

@ -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
# 代码分析

View File

@ -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();

View File

@ -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'
```