Skip to content

Commit 01e23bd

Browse files
authored
[✨Feat] Add a Sources Settings Page (3/?) (#16)
* 添加了数据源设置面板(不完整) * 支持手动选择是离线模式还是在线模式 * 重构调用查询的方法获取方式为App.GetService
1 parent 6b78b9a commit 01e23bd

38 files changed

Lines changed: 1298 additions & 107 deletions
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
using System.Collections.ObjectModel;
2+
using Newtonsoft.Json;
3+
4+
namespace RailGo.Core.Models.Settings;
5+
6+
public class DataSourceMethod
7+
{
8+
[JsonProperty("name")]
9+
public string Name { get; set; }
10+
11+
[JsonProperty("mode")]
12+
public string Mode { get; set; }
13+
14+
[JsonProperty("sourceName")]
15+
public string SourceName { get; set; }
16+
}
17+
18+
public class DataSourceGroup
19+
{
20+
[JsonProperty("name")]
21+
public string Name { get; set; }
22+
23+
[JsonProperty("data")]
24+
public ObservableCollection<DataSourceMethod> Data { get; set; } = new ObservableCollection<DataSourceMethod>();
25+
}
26+
27+
public class LocalDatabaseSource
28+
{
29+
[JsonProperty("name")]
30+
public string Name { get; set; }
31+
32+
[JsonProperty("address")]
33+
public string Address { get; set; }
34+
}
35+
36+
public class OnlineApiSource
37+
{
38+
[JsonProperty("name")]
39+
public string Name { get; set; }
40+
41+
[JsonProperty("address")]
42+
public string Address { get; set; }
43+
}

RailGo.Core/Query/ApiService.cs

Lines changed: 39 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -11,36 +11,13 @@ namespace RailGo.Core.Query;
1111

1212
public class ApiService
1313
{
14-
#region URL常量定义
15-
public const string TrainPreselect_url = "https://data.railgo.zenglingkun.cn/api/train/preselect";
16-
public const string TrainQuery_url = "https://data.railgo.zenglingkun.cn/api/train/query";
17-
public const string StationToStationQuery_url = "https://data.railgo.zenglingkun.cn/api/train/sts_query";
18-
public const string StationPreselect_url = "https://data.railgo.zenglingkun.cn/api/station/preselect";
19-
public const string StationQuery_url = "https://data.railgo.zenglingkun.cn/api/station/query";
20-
public const string EmuAssignmentQuery_url = "https://delay.data.railgo.zenglingkun.cn/api/trainAssignment/queryEmu";
21-
public const string TrainDelayQuery_url = "https://delay.data.railgo.zenglingkun.cn/api/trainDetails/queryTrainDelayDetails";
22-
public const string PlatformInfoQuery_url = "https://mobile.12306.cn/wxxcx/wechat/bigScreen/getExit";
23-
private const string GetBigScreenData_url = "https://screen.data.railgo.zenglingkun.cn";
24-
private const string EmuQuery_url = "https://emu.data.railgo.zenglingkun.cn";
25-
private const string DownloadEmuImage_url = "https://tp.railgo.zenglingkun.cn/api";
26-
#endregion
27-
2814
#region 离线模式判断
2915

30-
/// <summary>
31-
/// 判断是否使用离线模式
32-
/// </summary>
33-
private static bool IsOfflineMode()
34-
{
35-
return DBGetService.LocalDatabaseExists();
36-
}
37-
3816
/// <summary>
3917
/// 获取离线服务实例
4018
/// </summary>
41-
public static T GetOfflineService<T>() where T : BaseOfflineService
19+
public static T GetOfflineService<T>(string databasePath) where T : BaseOfflineService
4220
{
43-
var databasePath = DBGetService.GetLocalDatabasePath();
4421
return (T)Activator.CreateInstance(typeof(T), databasePath);
4522
}
4623

@@ -51,11 +28,11 @@ public static T GetOfflineService<T>() where T : BaseOfflineService
5128
/// <summary>
5229
/// 车次预选搜索
5330
/// </summary>
54-
public static async Task<ObservableCollection<TrainPreselectResult>> TrainPreselectAsync(string keyword)
31+
public static async Task<ObservableCollection<TrainPreselectResult>> TrainPreselectAsync(bool isOfflineMode, string urlOrDbPath, string keyword)
5532
{
56-
if (IsOfflineMode())
33+
if (isOfflineMode)
5734
{
58-
var offlineService = GetOfflineService<TrainOfflineService>();
35+
var offlineService = GetOfflineService<TrainOfflineService>(urlOrDbPath);
5936
var json = await offlineService.TrainPreselectAsync(keyword);
6037
var stringArray = JsonConvert.DeserializeObject<ObservableCollection<string>>(json);
6138

@@ -71,7 +48,7 @@ public static async Task<ObservableCollection<TrainPreselectResult>> TrainPresel
7148
}
7249
else
7350
{
74-
var stringArray = await OnlineApiService.TrainPreselectAsync(keyword, TrainPreselect_url);
51+
var stringArray = await OnlineApiService.TrainPreselectAsync(keyword, urlOrDbPath);
7552
var result = new ObservableCollection<TrainPreselectResult>();
7653
if (stringArray != null)
7754
{
@@ -87,34 +64,34 @@ public static async Task<ObservableCollection<TrainPreselectResult>> TrainPresel
8764
/// <summary>
8865
/// 车次详情查询
8966
/// </summary>
90-
public static async Task<Train> TrainQueryAsync(string trainNumber)
67+
public static async Task<Train> TrainQueryAsync(bool isOfflineMode, string urlOrDbPath, string trainNumber)
9168
{
92-
if (IsOfflineMode())
69+
if (isOfflineMode)
9370
{
94-
var offlineService = GetOfflineService<TrainOfflineService>();
71+
var offlineService = GetOfflineService<TrainOfflineService>(urlOrDbPath);
9572
var json = await offlineService.TrainQueryAsync(trainNumber);
9673
return JsonConvert.DeserializeObject<Train>(json);
9774
}
9875
else
9976
{
100-
return await OnlineApiService.TrainQueryAsync(trainNumber, TrainQuery_url);
77+
return await OnlineApiService.TrainQueryAsync(trainNumber, urlOrDbPath);
10178
}
10279
}
10380

10481
/// <summary>
10582
/// 站站查询
10683
/// </summary>
107-
public static async Task<List<Train>> StationToStationQueryAsync(string from, string to, string date)
84+
public static async Task<List<Train>> StationToStationQueryAsync(bool isOfflineMode, string urlOrDbPath, string from, string to, string date)
10885
{
109-
if (IsOfflineMode())
86+
if (isOfflineMode)
11087
{
111-
var offlineService = GetOfflineService<TrainOfflineService>();
88+
var offlineService = GetOfflineService<TrainOfflineService>(urlOrDbPath);
11289
var json = await offlineService.StationToStationQueryAsync(from, to, date);
11390
return JsonConvert.DeserializeObject<List<Train>>(json);
11491
}
11592
else
11693
{
117-
return await OnlineApiService.StationToStationQueryAsync(from, to, date, StationToStationQuery_url);
94+
return await OnlineApiService.StationToStationQueryAsync(from, to, date, urlOrDbPath);
11895
}
11996
}
12097

@@ -125,45 +102,45 @@ public static async Task<List<Train>> StationToStationQueryAsync(string from, st
125102
/// <summary>
126103
/// 车站预选搜索
127104
/// </summary>
128-
public static async Task<ObservableCollection<StationPreselectResult>> StationPreselectAsync(string keyword)
105+
public static async Task<ObservableCollection<StationPreselectResult>> StationPreselectAsync(bool isOfflineMode, string urlOrDbPath, string keyword)
129106
{
130-
if (IsOfflineMode())
107+
if (isOfflineMode)
131108
{
132-
var offlineService = GetOfflineService<StationOfflineService>();
109+
var offlineService = GetOfflineService<StationOfflineService>(urlOrDbPath);
133110
var json = await offlineService.StationPreselectAsync(keyword);
134111
return JsonConvert.DeserializeObject<ObservableCollection<StationPreselectResult>>(json);
135112
}
136113
else
137114
{
138-
return await OnlineApiService.StationPreselectAsync(keyword, StationPreselect_url);
115+
return await OnlineApiService.StationPreselectAsync(keyword, urlOrDbPath);
139116
}
140117
}
141118

142119
/// <summary>
143120
/// 车站详情查询
144121
/// </summary>
145-
public static async Task<StationQueryResponse> StationQueryAsync(string telecode)
122+
public static async Task<StationQueryResponse> StationQueryAsync(bool isOfflineMode, string urlOrDbPath, string telecode)
146123
{
147-
if (IsOfflineMode())
124+
if (isOfflineMode)
148125
{
149-
var offlineService = GetOfflineService<StationOfflineService>();
126+
var offlineService = GetOfflineService<StationOfflineService>(urlOrDbPath);
150127
var json = await offlineService.StationQueryAsync(telecode);
151128
return JsonConvert.DeserializeObject<StationQueryResponse>(json);
152129
}
153130
else
154131
{
155-
return await OnlineApiService.StationQueryAsync(telecode, StationQuery_url);
132+
return await OnlineApiService.StationQueryAsync(telecode, urlOrDbPath);
156133
}
157134
}
158135

159136
/// <summary>
160137
/// 车站大屏数据
161138
/// </summary>
162-
public static async Task<BigScreenData> GetBigScreenDataAsync(string stationName)
139+
public static async Task<BigScreenData> GetBigScreenDataAsync(bool isOfflineMode, string urlOrDbPath, string stationName)
163140
{
164-
if (!IsOfflineMode())
141+
if (!isOfflineMode)
165142
{
166-
return await OnlineApiService.GetBigScreenDataAsync(stationName, GetBigScreenData_url);
143+
return await OnlineApiService.GetBigScreenDataAsync(stationName, urlOrDbPath);
167144
}
168145
return null;
169146
}
@@ -175,11 +152,11 @@ public static async Task<BigScreenData> GetBigScreenDataAsync(string stationName
175152
/// <summary>
176153
/// 动车组运行交路查询
177154
/// </summary>
178-
public static async Task<ObservableCollection<EmuOperation>> EmuQueryAsync(string type, string keyword)
155+
public static async Task<ObservableCollection<EmuOperation>> EmuQueryAsync(bool isOfflineMode, string urlOrDbPath, string type, string keyword)
179156
{
180-
if (!IsOfflineMode())
157+
if (!isOfflineMode)
181158
{
182-
return await OnlineApiService.EmuQueryAsync(type, keyword, EmuQuery_url);
159+
return await OnlineApiService.EmuQueryAsync(type, keyword, urlOrDbPath);
183160
}
184161
return null;
185162
}
@@ -188,11 +165,11 @@ public static async Task<ObservableCollection<EmuOperation>> EmuQueryAsync(strin
188165
/// 动车组配属查询
189166
/// </summary>
190167
public static async Task<ObservableCollection<EmuAssignment>> EmuAssignmentQueryAsync(
191-
string type, string keyword, int cursor = 0, int count = 15)
168+
bool isOfflineMode, string urlOrDbPath, string type, string keyword, int cursor = 0, int count = 15)
192169
{
193-
if (!IsOfflineMode())
170+
if (!isOfflineMode)
194171
{
195-
return await OnlineApiService.EmuAssignmentQueryAsync(type, keyword, cursor, count, EmuAssignmentQuery_url);
172+
return await OnlineApiService.EmuAssignmentQueryAsync(type, keyword, cursor, count, urlOrDbPath);
196173
}
197174
else
198175
{
@@ -207,25 +184,25 @@ public static async Task<ObservableCollection<EmuAssignment>> EmuAssignmentQuery
207184
/// <summary>
208185
/// 正晚点查询
209186
/// </summary>
210-
public static async Task<List<DelayInfo>> QueryTrainDelayAsync(string date, string trainNumber,
187+
public static async Task<List<DelayInfo>> QueryTrainDelayAsync(bool isOfflineMode, string urlOrDbPath, string date, string trainNumber,
211188
string fromStation, string toStation)
212189
{
213-
if (!IsOfflineMode())
190+
if (!isOfflineMode)
214191
{
215-
return await OnlineApiService.QueryTrainDelayAsync(date, trainNumber, fromStation, toStation, TrainDelayQuery_url);
192+
return await OnlineApiService.QueryTrainDelayAsync(date, trainNumber, fromStation, toStation, urlOrDbPath);
216193
}
217194
return null;
218195
}
219196

220197
/// <summary>
221198
/// 停台检票口查询
222199
/// </summary>
223-
public static async Task<PlatformInfo> QueryPlatformInfoAsync(string stationCode, string trainDate,
200+
public static async Task<PlatformInfo> QueryPlatformInfoAsync(bool isOfflineMode, string urlOrDbPath, string stationCode, string trainDate,
224201
string type, string stationTrainCode)
225202
{
226-
if (!IsOfflineMode())
203+
if (!isOfflineMode)
227204
{
228-
return await OnlineApiService.QueryPlatformInfoAsync(stationCode, trainDate, type, stationTrainCode, PlatformInfoQuery_url);
205+
return await OnlineApiService.QueryPlatformInfoAsync(stationCode, trainDate, type, stationTrainCode, urlOrDbPath);
229206
}
230207
return null;
231208
}
@@ -237,11 +214,11 @@ public static async Task<PlatformInfo> QueryPlatformInfoAsync(string stationCode
237214
/// <summary>
238215
/// 下载动车组图片
239216
/// </summary>
240-
public static async Task<byte[]> DownloadEmuImageAsync(string trainModel)
217+
public static async Task<byte[]> DownloadEmuImageAsync(bool isOfflineMode, string urlOrDbPath, string trainModel)
241218
{
242-
if (!IsOfflineMode())
219+
if (!isOfflineMode)
243220
{
244-
return await OnlineApiService.DownloadEmuImageAsync(trainModel, DownloadEmuImage_url);
221+
return await OnlineApiService.DownloadEmuImageAsync(trainModel, urlOrDbPath);
245222
}
246223
return null;
247224
}

RailGo.Core/Query/Offline/StationOfflineService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public async Task<string> StationQueryAsync(string telecode)
7171

7272
if (station.TrainList != null && station.TrainList.Any())
7373
{
74-
var trainService = ApiService.GetOfflineService<TrainOfflineService>();
74+
var trainService = ApiService.GetOfflineService<TrainOfflineService>(DBGetService.GetLocalDatabasePath());
7575
var trainTasks = station.TrainList.Select(trainNumber =>
7676
ProcessTrainAsync(trainService, trainNumber, telecode)
7777
).ToList();

RailGo/App.xaml.cs

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,40 @@
1-
using Microsoft.Extensions.DependencyInjection;
1+
using System.Collections.ObjectModel;
2+
using System.Diagnostics;
3+
using CommunityToolkit.WinUI;
4+
using Microsoft.Extensions.DependencyInjection;
25
using Microsoft.Extensions.Hosting;
36
using Microsoft.UI.Xaml;
4-
7+
using Newtonsoft.Json;
58
using RailGo.Activation;
69
using RailGo.Contracts.Services;
710
using RailGo.Core.Contracts.Services;
11+
using RailGo.Core.Models;
12+
using RailGo.Core.Models.QueryDatas;
13+
using RailGo.Core.Models.Settings;
14+
using RailGo.Core.Query.Online;
815
using RailGo.Core.Services;
916
using RailGo.Helpers;
10-
using RailGo.Core.Models;
1117
using RailGo.Notifications;
1218
using RailGo.Services;
13-
using RailGo.Views;
14-
using System.Collections.ObjectModel;
15-
using Windows.Storage;
16-
using Newtonsoft.Json;
17-
using static System.Collections.Specialized.BitVector32;
18-
using RailGo.Core.Query.Online;
19-
using RailGo.Core.Models.QueryDatas;
20-
using RailGo.Core.Models.Settings;
21-
using System.Diagnostics;
22-
2319
using RailGo.ViewModels;
24-
using RailGo.ViewModels.Pages.Shell;
2520
using RailGo.ViewModels.Pages.Settings;
26-
using RailGo.ViewModels.Pages.Trains;
27-
using RailGo.ViewModels.Pages.TrainEmus;
21+
using RailGo.ViewModels.Pages.Settings.DataSources;
22+
using RailGo.ViewModels.Pages.Shell;
2823
using RailGo.ViewModels.Pages.Stations;
2924
using RailGo.ViewModels.Pages.StationToStation;
30-
using RailGo.Views.Pages.Shell;
25+
using RailGo.ViewModels.Pages.TrainEmus;
26+
using RailGo.ViewModels.Pages.Trains;
27+
using RailGo.Views;
28+
using RailGo.Views.ContentDialogs;
3129
using RailGo.Views.Pages.Settings;
32-
using RailGo.Views.Pages.Trains;
33-
using RailGo.Views.Pages.TrainEmus;
30+
using RailGo.Views.Pages.Settings.DataSources;
31+
using RailGo.Views.Pages.Shell;
3432
using RailGo.Views.Pages.Stations;
3533
using RailGo.Views.Pages.StationToStation;
36-
using RailGo.Views.ContentDialogs;
37-
using CommunityToolkit.WinUI;
34+
using RailGo.Views.Pages.TrainEmus;
35+
using RailGo.Views.Pages.Trains;
36+
using Windows.Storage;
37+
using static System.Collections.Specialized.BitVector32;
3838

3939

4040
namespace RailGo;
@@ -85,9 +85,12 @@ public App()
8585
// Services
8686
services.AddSingleton<IAppNotificationService, AppNotificationService>();
8787
services.AddSingleton<ILocalSettingsService, LocalSettingsService>();
88+
services.AddSingleton<IDataSourceService, DataSourceService>();
8889
services.AddSingleton<IThemeSelectorService, ThemeSelectorService>();
8990
services.AddTransient<INavigationViewService, NavigationViewService>();
9091

92+
services.AddSingleton<QueryService>();
93+
9194
services.AddSingleton<IActivationService, ActivationService>();
9295
services.AddSingleton<IPageService, PageService>();
9396
services.AddSingleton<INavigationService, NavigationService>();
@@ -118,7 +121,21 @@ public App()
118121
services.AddSingleton<MainWindowViewModel>();
119122
services.AddTransient<MainPage>();
120123
services.AddTransient<ShellPage>();
124+
services.AddTransient<DataSources_ShellPage>();
121125
services.AddTransient<ShellViewModel>();
126+
services.AddTransient<DataSources_ShellViewModel>();
127+
services.AddTransient<DataSources_MainPage>();
128+
services.AddTransient<DataSources_MainViewModel>();
129+
services.AddTransient<DataSources_CustomSourcesViewModel>();
130+
services.AddTransient<DataSources_LocalDatabasesViewModel>();
131+
services.AddTransient<DataSources_OnlineDatabasesViewModel>();
132+
services.AddTransient<DataSources_ThirdPartyApiServicesViewModel>();
133+
services.AddTransient<DataSources_ThirdPartyDatabasesViewModel>();
134+
services.AddTransient<DataSources_CustomSourcesPage>();
135+
services.AddTransient<DataSources_LocalDatabasesPage>();
136+
services.AddTransient<DataSources_OnlineDatabasesPage>();
137+
services.AddTransient<DataSources_ThirdPartyApiServicesPage>();
138+
services.AddTransient<DataSources_ThirdPartyDatabasesPage>();
122139

123140
// Configuration
124141
services.Configure<LocalSettingsOptions>(context.Configuration.GetSection(nameof(LocalSettingsOptions)));

0 commit comments

Comments
 (0)