第17篇:专项练习系统——章节、难度、题型多维筛选

img

一、引言

专项练习允许用户按章节、难度、题型等维度进行针对性练习,是驾考应用的重要功能。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 — 章节列表
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐