fix:对比原型增加功能交互

This commit is contained in:
jingyun
2026-06-07 10:58:05 +08:00
parent af865b13fb
commit ac794ae58a
21 changed files with 1342 additions and 233 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
import '../models/models.dart';
import 'report_data_source.dart';
class MockReportDataSource implements ReportDataSource {
class MockReportDataSource extends ReportDataSource {
MockReportDataSource();
static final Institution _wgcSummary = _institutionSummary(
+64 -3
View File
@@ -3,8 +3,10 @@ import 'dart:convert';
import 'package:http/http.dart' as http;
import '../models/models.dart';
import '../repositories/report_repository.dart';
import '../state/report_query.dart';
abstract class ReportDataSource {
abstract class ReportDataSource extends ReportRepository {
Future<List<ReportCardModel>> recommended();
Future<List<ReportCardModel>> reports();
Future<List<Institution>> institutions();
@@ -12,9 +14,66 @@ abstract class ReportDataSource {
Future<List<AudioItem>> listen();
Future<ReportDetail> reportDetail(String reportId);
Future<ModuleDetail> moduleDetail(String reportId, String moduleId);
@override
Future<List<ReportCardModel>> getRecommended({String? topic}) async {
final items = await recommended();
if (topic == null || topic == '全部') return items;
return items.where((item) => item.topics.contains(topic)).toList();
}
@override
Future<List<ReportCardModel>> getReports(ReportQuery query) async {
final currentSearch = query.search.trim().toLowerCase();
final items = await reports();
final filtered = items.where((item) {
final haystack =
'${item.titleCn} ${item.subtitleCn} ${item.oneLiner} '
'${item.institution.nameCn} ${item.institution.nameEn} '
'${item.topics.join(' ')}'
.toLowerCase();
if (currentSearch.isNotEmpty && !haystack.contains(currentSearch)) {
return false;
}
if (query.topic != null && !item.topics.contains(query.topic)) {
return false;
}
if (query.institutionId != null &&
item.institution.id != query.institutionId) {
return false;
}
if (query.hasAudio && !item.hasAudio) {
return false;
}
return true;
}).toList();
filtered.sort((a, b) {
final result = (b.releasedAt ?? '').compareTo(a.releasedAt ?? '');
return query.sort == ReportSort.oldest ? -result : result;
});
return filtered;
}
@override
Future<ReportDetail> getReportDetail(String reportId) =>
reportDetail(reportId);
@override
Future<List<Institution>> getInstitutions() => institutions();
@override
Future<Institution> getInstitutionDetail(String institutionId) =>
institutionDetail(institutionId);
@override
Future<List<AudioItem>> getListenItems() => listen();
@override
Future<ModuleDetail> getModuleDetail(String reportId, String moduleId) =>
moduleDetail(reportId, moduleId);
}
class RnbApiDataSource implements ReportDataSource {
class RnbApiDataSource extends ReportDataSource {
RnbApiDataSource({
http.Client? client,
this.baseUrl = const String.fromEnvironment('RNB_API_BASE'),
@@ -72,6 +131,8 @@ class RnbApiDataSource implements ReportDataSource {
@override
Future<ModuleDetail> moduleDetail(String reportId, String moduleId) async {
return ModuleDetail.fromJson(await _get('/reports/$reportId/modules/$moduleId'));
return ModuleDetail.fromJson(
await _get('/reports/$reportId/modules/$moduleId'),
);
}
}