鸿蒙掌上驾考宝典应用开发17:专项练习系统——章节、难度、题型多维筛选
·
第17篇:专项练习系统——章节、难度、题型多维筛选
一、引言
专项练习允许用户按章节、难度、题型等维度进行针对性练习,是驾考应用的重要功能。DriverLicenseExam 项目通过 EXAM_MANAGER_TYPE 枚举实现了多维度的数据筛选机制。本文将深入解析其实现。
二、专项练习入口
2.1 导航到专项练习
// HomeView.ets
Column({ space: 4 }) {
Image($r('app.media.special_practice')).width(40).height(40);
Text('专项练习').fontSize(14);
}
.onClick(() => {
this.vm.navStack.pushPathByName('specialExercisesView', true);
});
2.2 专项练习页面
// SpecialExercisesView.ets
@ComponentV2
export struct SpecialExercisesView {
build() {
NavDestination() {
Column() {
// 章节练习
this.chapterSection();
// 按难易程度
this.difficultySection();
// 按题目类型
this.questionTypeSection();
}
}
}
}
三、多维筛选机制
3.1 EXAM_MANAGER_TYPE 枚举
export enum EXAM_MANAGER_TYPE {
sequence = 0, // 顺序练习
random = 1, // 随机练习
chapter_name = 2, // 章节练习
easy = 3, // 容易
simple = 4, // 简单
normal = 5, // 一般
mistake = 6, // 易错
difficult = 7, // 困难
single = 8, // 单选题
multi = 9, // 多选题
judging = 10, // 判断题
error = 11, // 错题
collect = 12, // 收藏
search = 13, // 搜索
mock_exam = 14, // 模拟考试
}
3.2 数据筛选逻辑
// ExamService.getExamQuestionList
getExamQuestionList(type: EXAM_MANAGER_TYPE, chapterName: string = '',
searchCondition: string = '', wrongOrCollect?: WRONG_COLLECT) {
const originData = this.examDetails;
let examData: ExamDetail[] = [];
switch (type) {
case EXAM_MANAGER_TYPE.sequence:
examData = originData; // 全部题目
break;
case EXAM_MANAGER_TYPE.random:
// 随机排序
const newArray = [...originData];
examData = newArray.sort(() => ExamService.getRandomFloat() - 0.5);
break;
case EXAM_MANAGER_TYPE.chapter_name:
// 按章节筛选
examData = originData.filter(item => item.chapterName.includes(chapterName));
break;
case EXAM_MANAGER_TYPE.easy:
examData = originData.filter(item => item.classificationType === ClassificationTypeEnum.EASY);
break;
case EXAM_MANAGER_TYPE.single:
examData = originData.filter(item => item.questionType === QuestionTypeEnum.RADIO);
break;
case EXAM_MANAGER_TYPE.multi:
examData = originData.filter(item => item.questionType === QuestionTypeEnum.CHECK_BOX);
break;
case EXAM_MANAGER_TYPE.judging:
examData = originData.filter(item => item.questionType === QuestionTypeEnum.JUDGE);
break;
}
return examData;
}
四、章节练习
4.1 章节数据获取
// 获取章节列表
public getChapterList(): Chapter[] {
if (this.chapterList.length === 0) {
const chapterTitleList: string[] = [];
this.examDetails.forEach((item: ExamDetail) => {
if (chapterTitleList.indexOf(item.chapterName) === -1) {
chapterTitleList.push(item.chapterName);
}
});
chapterTitleList.forEach((item: string, index: number) => {
const examManger = this.getManagerByName(item, EXAM_MANAGER_TYPE.chapter_name, 0, item);
const color = COLOR_GARDEN[index % 6];
this.chapterList.push(new Chapter(item, color, examManger));
});
}
return this.chapterList;
}
4.2 章节颜色映射
const COLOR_GARDEN = ['#46B1E3', '#61CFBE', '#ED6F21', '#A5D61D', '#AC49F5', '#64BB5C'];
五、统计查询
// 获取各难度题量
public getEasyQuestionCount(): number { ... }
public getSimpleQuestionCount(): number { ... }
public getMiddleQuestionCount(): number { ... }
public getMistakeQuestionCount(): number { ... }
public getHardQuestionCount(): number { ... }
// 获取各题型题量
public getRadioQuestionCount(): number { ... }
public getMultiQuestionCount(): number { ... }
public getJudgeQuestionCount(): number { ... }
六、总结
专项练习系统通过 EXAM_MANAGER_TYPE 枚举实现了多维度的数据筛选,支持按章节、难度、题型等维度进行针对性练习。这种设计具有良好的可扩展性,新增维度只需添加新的枚举值和对应的筛选逻辑。
关键源码文件:
commons/datasource/src/main/ets/ExamService.ets— 数据筛选服务commons/datasource/src/main/ets/Model.ets— 类型定义products/entry/src/main/ets/pages/specialExercises/SpecialExercisesView.ets— 专项练习页面products/entry/src/main/ets/pages/specialExercises/ChapterListView.ets— 章节列表
更多推荐


所有评论(0)