Skip to content

Commit b2e28d3

Browse files
committed
feat: 重构项目结构以支持多项目管理
- 添加项目实体和仓库接口 - 实现项目远程数据源和本地存储 - 重构聊天相关接口以支持项目ID参数 - 更新API端点路径和常量 - 添加项目提供者管理当前项目状态 - 修改会话创建和消息发送逻辑以适配新API - 实现会话缓存和恢复功能
1 parent e9a84cb commit b2e28d3

30 files changed

Lines changed: 1067 additions & 298 deletions

lib/core/constants/api_constants.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ class ApiConstants {
66
static const String defaultBaseUrl = 'http://$defaultHost:$defaultPort';
77

88
// API端点
9-
static const String appEndpoint = '/app';
9+
static const String projectEndpoint = '/project';
10+
static const String providerEndpoint = '/provider';
1011
static const String configEndpoint = '/config';
11-
static const String configProvidersEndpoint = '/config/providers';
1212
static const String sessionEndpoint = '/session';
1313
static const String agentEndpoint = '/agent';
1414
static const String fileEndpoint = '/file';

lib/core/constants/app_constants.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ class AppConstants {
1515
static const String selectedModelKey = 'selected_model';
1616
static const String themeKey = 'theme_mode';
1717
static const String lastSessionIdKey = 'last_session_id';
18+
static const String cachedSessionsKey = 'cached_sessions';
19+
static const String currentSessionIdKey = 'current_session_id';
1820

1921
// Default configuration
2022
static const String defaultTheme = 'system';

lib/core/di/injection_container.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,12 @@ import '../../domain/usecases/delete_chat_session.dart';
1818
import '../../data/datasources/chat_remote_datasource.dart';
1919
import '../../data/repositories/chat_repository_impl.dart';
2020
import '../../domain/repositories/chat_repository.dart';
21+
import '../../data/datasources/project_remote_datasource.dart';
22+
import '../../data/repositories/project_repository_impl.dart';
23+
import '../../domain/repositories/project_repository.dart';
2124
import '../../presentation/providers/app_provider.dart';
2225
import '../../presentation/providers/chat_provider.dart';
26+
import '../../presentation/providers/project_provider.dart';
2327

2428
final sl = GetIt.instance;
2529

@@ -45,6 +49,10 @@ Future<void> init() async {
4549
() => ChatRemoteDataSourceImpl(dio: sl<DioClient>().dio),
4650
);
4751

52+
sl.registerLazySingleton<ProjectRemoteDataSource>(
53+
() => ProjectRemoteDataSourceImpl(dio: sl<DioClient>().dio),
54+
);
55+
4856
// Repositories
4957
sl.registerLazySingleton<AppRepository>(
5058
() => AppRepositoryImpl(
@@ -58,6 +66,10 @@ Future<void> init() async {
5866
() => ChatRepositoryImpl(remoteDataSource: sl()),
5967
);
6068

69+
sl.registerLazySingleton<ProjectRepository>(
70+
() => ProjectRepositoryImpl(remoteDataSource: sl()),
71+
);
72+
6173
// Use cases
6274
sl.registerLazySingleton(() => GetAppInfo(sl()));
6375
sl.registerLazySingleton(() => CheckConnection(sl()));
@@ -86,9 +98,15 @@ Future<void> init() async {
8698
getChatMessages: sl(),
8799
getProviders: sl(),
88100
deleteChatSession: sl(),
101+
projectProvider: sl(),
102+
localDataSource: sl(),
89103
),
90104
);
91105

106+
sl.registerFactory(
107+
() => ProjectProvider(projectRepository: sl()),
108+
);
109+
92110
// Load local configuration
93111
await _loadLocalConfig();
94112
}

lib/data/datasources/app_local_datasource.dart

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,18 @@ abstract class AppLocalDataSource {
4545
/// 保存最后的会话ID
4646
Future<void> saveLastSessionId(String sessionId);
4747

48+
/// 获取当前会话ID
49+
Future<String?> getCurrentSessionId();
50+
51+
/// 保存当前会话ID
52+
Future<void> saveCurrentSessionId(String sessionId);
53+
54+
/// 获取缓存的会话列表
55+
Future<String?> getCachedSessions();
56+
57+
/// 保存会话列表到缓存
58+
Future<void> saveCachedSessions(String sessionsJson);
59+
4860
/// 清除所有数据
4961
Future<void> clearAll();
5062
}
@@ -128,6 +140,26 @@ class AppLocalDataSourceImpl implements AppLocalDataSource {
128140
await sharedPreferences.setString(AppConstants.lastSessionIdKey, sessionId);
129141
}
130142

143+
@override
144+
Future<String?> getCurrentSessionId() async {
145+
return sharedPreferences.getString(AppConstants.currentSessionIdKey);
146+
}
147+
148+
@override
149+
Future<void> saveCurrentSessionId(String sessionId) async {
150+
await sharedPreferences.setString(AppConstants.currentSessionIdKey, sessionId);
151+
}
152+
153+
@override
154+
Future<String?> getCachedSessions() async {
155+
return sharedPreferences.getString(AppConstants.cachedSessionsKey);
156+
}
157+
158+
@override
159+
Future<void> saveCachedSessions(String sessionsJson) async {
160+
await sharedPreferences.setString(AppConstants.cachedSessionsKey, sessionsJson);
161+
}
162+
131163
@override
132164
Future<void> clearAll() async {
133165
await sharedPreferences.clear();

lib/data/datasources/app_remote_datasource.dart

Lines changed: 46 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
1-
import '../models/app_info_model.dart';
21
import '../models/provider_model.dart';
2+
import '../models/app_info_model.dart';
33

44
/// 应用远程数据源接口
55
abstract class AppRemoteDataSource {
66
/// 获取应用信息
7-
Future<AppInfoModel> getAppInfo();
7+
Future<AppInfoModel> getAppInfo({String? directory});
88

99
/// 初始化应用
10-
Future<bool> initializeApp();
10+
Future<bool> initializeApp({String? directory});
1111

1212
/// 获取提供商信息
13-
Future<ProvidersResponseModel> getProviders();
13+
Future<ProvidersResponseModel> getProviders({String? directory});
14+
15+
/// 获取配置信息
16+
Future<Map<String, dynamic>> getConfig({String? directory});
1417
}
1518

1619
/// 应用远程数据源实现
@@ -20,21 +23,45 @@ class AppRemoteDataSourceImpl implements AppRemoteDataSource {
2023
AppRemoteDataSourceImpl({required this.dio});
2124

2225
@override
23-
Future<AppInfoModel> getAppInfo() async {
24-
final response = await dio.get('/app');
25-
return AppInfoModel.fromJson(response.data);
26+
Future<AppInfoModel> getAppInfo({String? directory}) async {
27+
try {
28+
final queryParams = directory != null ? {'directory': directory} : <String, dynamic>{};
29+
final response = await dio.get('/app/info', queryParameters: queryParams);
30+
return AppInfoModel.fromJson(response.data);
31+
} catch (e) {
32+
print('获取应用信息时出错: $e');
33+
// 返回默认的应用信息
34+
return AppInfoModel(
35+
hostname: 'localhost',
36+
git: false,
37+
path: AppPathModel(
38+
config: '/config',
39+
data: '/data',
40+
root: '/',
41+
cwd: '/app',
42+
state: '/state',
43+
),
44+
);
45+
}
2646
}
2747

2848
@override
29-
Future<bool> initializeApp() async {
30-
final response = await dio.post('/app/init');
31-
return response.data as bool;
49+
Future<bool> initializeApp({String? directory}) async {
50+
try {
51+
final queryParams = directory != null ? {'directory': directory} : <String, dynamic>{};
52+
final response = await dio.post('/app/init', queryParameters: queryParams);
53+
return response.data['success'] ?? true;
54+
} catch (e) {
55+
print('初始化应用时出错: $e');
56+
return false;
57+
}
3258
}
3359

3460
@override
35-
Future<ProvidersResponseModel> getProviders() async {
61+
Future<ProvidersResponseModel> getProviders({String? directory}) async {
3662
try {
37-
final response = await dio.get('/config/providers');
63+
final queryParams = directory != null ? {'directory': directory} : <String, dynamic>{};
64+
final response = await dio.get('/provider', queryParameters: queryParams);
3865
print('Providers API 响应: ${response.data}');
3966
return ProvidersResponseModel.fromJson(response.data);
4067
} catch (e) {
@@ -65,4 +92,11 @@ class AppRemoteDataSourceImpl implements AppRemoteDataSource {
6592
);
6693
}
6794
}
95+
96+
@override
97+
Future<Map<String, dynamic>> getConfig({String? directory}) async {
98+
final queryParams = directory != null ? {'directory': directory} : <String, dynamic>{};
99+
final response = await dio.get('/config', queryParameters: queryParams);
100+
return response.data as Map<String, dynamic>;
101+
}
68102
}

0 commit comments

Comments
 (0)