diff --git a/android/build/reports/problems/problems-report.html b/android/build/reports/problems/problems-report.html
new file mode 100644
index 0000000..2743973
--- /dev/null
+++ b/android/build/reports/problems/problems-report.html
@@ -0,0 +1,663 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Gradle Configuration Cache
+
+
+
+
+
+
+ Loading...
+
+
+
+
+
+
+
diff --git a/android/settings.gradle b/android/settings.gradle
index 643d520..e565048 100644
--- a/android/settings.gradle
+++ b/android/settings.gradle
@@ -23,3 +23,33 @@ plugins {
}
include ":app"
+
+// ============================================================
+// 【Gradle 兼容补丁】flutter_inappwebview_android 1.1.3 的 AGP 9 兼容问题
+//
+// 问题:AGP 9 不支持 proguard-android.txt,必须用 proguard-android-optimize.txt。
+// 插件 build.gradle 写死了 proguard-android.txt → Gradle 解析时就报错
+// (debug 构建也炸,因为 AGP 9 在解析阶段就校验了这个方法调用)。
+//
+// 修复:在 Gradle 解析插件 build.gradle 之前(beforeProject 钩子),
+// 把插件文件里的字符串替换掉。这个钩子比 Gradle 自带机制还早触发,
+// 所以能赶在 Gradle 报错前修好。
+//
+// 优势:
+// - Gradle 原生,不依赖 Python/PowerShell
+// - 跨平台(Windows/Mac/Linux,Gradle 必备)
+// - 所有同事拉代码后自动生效
+// - Gradle daemon 每次构建都会重新解析 build.gradle,不会有缓存问题
+// ============================================================
+gradle.beforeProject { Project project ->
+ if (project.name == 'flutter_inappwebview_android') {
+ def gradleFile = project.file('build.gradle')
+ def text = gradleFile.text
+ if (text.contains("proguard-android.txt")) {
+ gradleFile.text = text.replace(
+ "proguard-android.txt", "proguard-android-optimize.txt"
+ )
+ println "✅ Patched flutter_inappwebview_android/build.gradle (AGP 9 compat)"
+ }
+ }
+}
diff --git a/lib/core/api/conquerPackage/captureList/api.dart b/lib/core/api/conquerPackage/captureList/api.dart
new file mode 100644
index 0000000..3ed60b7
--- /dev/null
+++ b/lib/core/api/conquerPackage/captureList/api.dart
@@ -0,0 +1,33 @@
+import 'package:new_learn/core/api/conquerPackage/captureList/model.dart';
+import 'package:new_learn/core/network/dio_client.dart';
+
+/// ============================================================
+/// 【captureList 模块接口】攻克学习包 —— 对标 Vue3 端 api/task/index.ts
+///
+/// getCoursePack —— 获取课程下的攻克学习包列表
+/// GET /api/v1/StudyPack/GetCoursePacks/{courseId}
+///
+/// startOvercome —— 开始 / 继续攻克学习包
+/// POST /api/v1/StudyPack/StartOvercome/{packId}
+/// ============================================================
+class CaptureListApi {
+ CaptureListApi._();
+
+ static final CaptureListApi instance = CaptureListApi._();
+
+ /// 获取课程下的攻克学习包列表
+ Future getCoursePack(String courseId) async {
+ final data = await DioClient.instance.get(
+ '/api/v1/StudyPack/GetCoursePacks/$courseId',
+ );
+ return CoursePackResponse.fromJson(data as Map);
+ }
+
+ /// 开始 / 继续攻克学习包
+ Future startOvercome(String packId) async {
+ final data = await DioClient.instance.post(
+ '/api/v1/StudyPack/StartOvercome/$packId',
+ );
+ return TaskDetail.fromJson(data as Map);
+ }
+}
diff --git a/lib/core/api/conquerPackage/captureList/model.dart b/lib/core/api/conquerPackage/captureList/model.dart
new file mode 100644
index 0000000..8232622
--- /dev/null
+++ b/lib/core/api/conquerPackage/captureList/model.dart
@@ -0,0 +1,156 @@
+/// ============================================================
+/// 【captureList 模块模型】攻克学习包 —— 对标 Vue3 端 api/task/type.ts
+///
+/// CoursePackResponse / CourseInfo / CourseRecord
+/// TaskDetail(开始/继续攻克返回)
+///
+/// 序列化:手动 fromJson(兼容 {code, message, data: {...}} 响应壳)
+/// ============================================================
+library;
+
+/// 攻克记录(单次攻克的结果)
+class CourseRecord {
+ const CourseRecord({
+ this.id = 0,
+ this.createTime = '',
+ this.accuracyRate = 0,
+ this.status = 0,
+ this.statusName = '',
+ });
+
+ final int id; // 记录 id
+ final String createTime; // 创建时间
+ final int accuracyRate; // 正确率(0-100)
+ final int status; // 状态:0 未开始 / 1 进行中 / 2 成功 / 3 失败 等(按后端枚举)
+ final String statusName; // 状态名称
+
+ factory CourseRecord.fromJson(Map json) {
+ return CourseRecord(
+ id: _parseInt(json['id']),
+ createTime: json['createTime'] as String? ?? '',
+ accuracyRate: _parseInt(json['accuracyRate']),
+ status: _parseInt(json['status']),
+ statusName: json['statusName'] as String? ?? '',
+ );
+ }
+}
+
+/// 单个学习包(攻克包)信息
+class CourseInfo {
+ const CourseInfo({
+ this.id = 0,
+ this.name = '',
+ this.baseSubjectName = '',
+ this.overcomeStandard = 0,
+ this.estimatedTime = 0,
+ this.maxOvercomeCount = 0,
+ this.recordCount = 0,
+ this.records = const [],
+ this.status = 0,
+ this.statusName = '',
+ });
+
+ final int id; // 学习包 id
+ final String name; // 名称
+ final String baseSubjectName; // 学科名称
+ final int overcomeStandard; // 攻克标准(百分比)
+ final int estimatedTime; // 预计用时(分钟)
+ final int maxOvercomeCount; // 最大可攻克次数
+ final int recordCount; // 已攻克次数
+ final List records; // 历次攻克记录
+ final int status; // 状态:0 未开始 / 1 进行中 / 2 已攻克 / 3 失败 / 4 后续学习 / 5 判题中(按后端枚举)
+ final String statusName; // 状态名称
+
+ factory CourseInfo.fromJson(Map json) {
+ return CourseInfo(
+ id: _parseInt(json['id']),
+ name: json['name'] as String? ?? '',
+ baseSubjectName: json['baseSubjectName'] as String? ?? '',
+ overcomeStandard: _parseInt(json['overcomeStandard']),
+ estimatedTime: _parseInt(json['estimatedTime']),
+ maxOvercomeCount: _parseInt(json['maxOvercomeCount']),
+ recordCount: _parseInt(json['recordCount']),
+ records: (json['records'] as List? ?? const [])
+ .whereType