Skip to content

Commit 3cb630c

Browse files
committed
FEAT: 合集列表显示材料难度
1 parent 6afb82c commit 3cb630c

19 files changed

Lines changed: 517 additions & 31 deletions

‎TASKS.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
55
## 本次完成
66

7+
- [x] ECH-27 合集列表显示材料难度(2026-10-23):社区合集同步时将 API 返回的 CEFR 难度持久化到材料记录;已加入合集列表在时长/日期元信息前显示徽标,公开合集预览保持标题旁徽标;无难度数据时不显示。A1–C2 各使用不同色相,并为浅色/深色主题配置高对比前景色。补充 v59→v60 数据库迁移、模型序列化、重新加入/同步更新与清空难度、列表及预览展示测试。原始定向测试 147 项和合集 API 测试 3 项通过;布局调整测试目标 61 项、难度徽标/列表/预览回归测试目标 63 项均通过,6 个相关 Dart 文件定向分析无问题,`git diff --check` 通过。未运行 `scripts/check.sh`:本次为合集功能局部改动,定向测试与分析覆盖改动范围。未运行 Maestro:仓库现有 Flow 均会清空 App 状态,且没有覆盖合集列表的安全 Flow。**完成时间**: 2026-10-23 14:39;**布局调整**: 2026-10-23 14:52;**难度配色**: 2026-10-23 14:56
8+
79
- [x] 用远程配置控制原生评分提醒(2026-10-22):解析 `features.inAppReview.enabled` 并接入评分协调器,缺省或无效时默认关闭;每个异步边界读取最新开关,关闭后不发起评分请求,冷却落盘后关闭则恢复此前记录。新增配置解析、序列化、Provider 和协调器开关竞态测试。远程配置与评分协调器定向测试共 36 项通过,5 个相关 Dart 文件定向分析无问题,格式与 `git diff --check` 通过。未运行 `scripts/check.sh`:本次为远程配置与评分提醒的局部改动,定向测试和分析覆盖相关范围。**完成时间**: 2026-10-22 17:55
810

911
- [x] 修复评分邀请冷却备份隔离与异步展示竞态(2026-10-22):备份导入导出排除 rating_prompt_ 设备元数据,保留本机冷却;练习返回后的评分检查通过展示资格回调复核原页面、当前路由位置、root 覆盖与应用前台状态,数据库查询或冷却落盘期间失效即跳过,尚未调用原生 API 时恢复此前冷却。将 PracticeCompletionResult 移至学习公共 models,播放器不再依赖评分功能。新增切 Tab/后台/卸载、查询与落盘竞态、原生调用失败保留冷却回归,并验证旧备份与其他设备备份不覆盖本机记录。TZ=America/New_York 下相关 6 个测试目标共 148 项通过,8 个相关源码/测试范围定向分析无问题,格式与 git diff --check 通过。未运行 scripts/check.sh:本次是评分邀请的局部修复,定向检查已覆盖。未运行 Maestro:检测到 Android 真机,但 CLI 初始化因用户目录 deps/applesimutils 写权限受限而失败,现有 Flow 也均含 clearState。**完成时间**: 2026-10-22 16:36

‎lib/database/app_database.dart‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ class AppDatabase extends _$AppDatabase {
105105
AppDatabase(super.e);
106106

107107
/// 当前 schema 版本(静态访问,用于导入前版本检查)
108-
static const currentSchemaVersion = 59;
108+
static const currentSchemaVersion = 60;
109109

110110
@override
111111
int get schemaVersion => currentSchemaVersion;
@@ -265,6 +265,14 @@ class AppDatabase extends _$AppDatabase {
265265
if (from < 59) {
266266
await _addColumnIfNotExists('collections', 'cover_url_china', 'TEXT');
267267
}
268+
// v59→v60:缓存社区媒体的 CEFR 难度,普通媒体保持 NULL。
269+
if (from < 60) {
270+
await _addColumnIfNotExists(
271+
'audio_items',
272+
'community_difficulty',
273+
'TEXT',
274+
);
275+
}
268276
// v49→v50:为收藏单词/意群补稳定的记忆主体 ID,并把收藏句专属的每日
269277
// 入队去重表泛化为带 namespace 的通用表,供词汇复习共用同一张表。
270278
if (from < 50) {

‎lib/database/app_database.g.dart‎

Lines changed: 82 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎lib/database/tables/audio_items.dart‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ class AudioItems extends Table {
9696
/// 文件重新出现在 v2 列表后由同步清空。
9797
DateTimeColumn get communityUnavailableAt => dateTime().nullable()();
9898

99+
/// 社区合集文件由服务端维护的 CEFR 难度(A1–C2);普通媒体保持 NULL。
100+
TextColumn get communityDifficulty => text().nullable()();
101+
99102
/// 用户导入来源类型:local / direct_url / cloud_drive。
100103
///
101104
/// 社区合集不使用该字段,继续由 remoteAudioId 和 collections.source 标识。

‎lib/features/community_collections/data/community_collection_repository.dart‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,16 @@ class CommunityCollectionRepository {
106106
totalDuration: Value(file.durationSec ?? 0),
107107
remoteAudioId: Value(file.id),
108108
originalDate: Value(file.publishedAt),
109+
communityDifficulty: Value(file.difficulty?.code),
110+
updatedAt: Value(now),
111+
),
112+
);
113+
} else {
114+
await (_db.update(
115+
_db.audioItems,
116+
)..where((row) => row.id.equals(audioId))).write(
117+
db.AudioItemsCompanion(
118+
communityDifficulty: Value(file.difficulty?.code),
109119
updatedAt: Value(now),
110120
),
111121
);

0 commit comments

Comments
 (0)