公司动态

HarmonyOS 应用开发《掌上英语》第47篇: 词库构建——数据模型设计与分类筛选

📅 2026/7/26 14:56:26
HarmonyOS 应用开发《掌上英语》第47篇: 词库构建——数据模型设计与分类筛选
500 词库构建——数据模型设计与分类筛选一、WordCard 数据模型1.1 模型定义词库的核心是WordCard模型它位于commons/commonLib/src/main/ets/models/WordCardModel.etsObservedV2exportclassWordCard{Traceid:number0;Traceword:string;Tracephonetic:string;TracepartOfSpeech:string;Tracetranslation:string;Traceexample:string;TraceexampleTranslation:string;TraceaudioUrl:string;Tracetags:string[][];Tracecategory:stringbasic;constructor(id:number,word:string,phonetic:string,partOfSpeech:string,translation:string,example:string,exampleTranslation:string,audioUrl:string,tags:string[][],category:stringbasic){// ...}}10 个字段可分成四组分组字段用途标识id唯一编号单词word, phonetic, partOfSpeech, translation核心学习内容上下文example, exampleTranslation例句理解元数据audioUrl, tags, category发音、标签、分类1.2 ObservedV2 和 TraceObservedV2和Trace是 ArkTS V2 的响应式装饰器ObservedV2装饰类使类实例可被观察Trace装饰字段当字段值变化时所有使用该对象的 UI 组件自动刷新这意味着当用户切换分类或翻到下一张卡片时修改currentIndex或currentCategory就会触发 UI 更新无需手动调用刷新方法。二、分类体系2.1 分类定义interfaceWordCategory{key:stringlabel:string}exportconstWORD_CATEGORIES:WordCategory[][{key:basic,label:基础},{key:cet4,label:CET-4},{key:cet6,label:CET-6},{key:ielts,label:雅思},{key:gre,label:GRE},];五个分类覆盖了从零基础到高级进阶的完整学习路径分类词汇数量难度等级适合人群basic基础80 个 (id 1-80)★☆☆☆☆初学者 / 中小学生cet4CET-4110 个 (id 81-190)★★☆☆☆大学生 / 四级备考cet6CET-6110 个 (id 191-300)★★★☆☆六级备考 / 进阶ielts雅思100 个 (id 301-400)★★★★☆留学备考greGRE100 个 (id 401-500)★★★★★研究生 / 学术2.2 分类在卡片中的串联在CourseHomePage中分类体系贯穿始终Tab 栏展示通过ForEach(WORD_CATEGORIES, ...)动态生成可滚动的分类 Tab单词过滤getFilteredWords()按currentCategory筛选单词进度统计getCategoryLabel()将分类 Key 转为中文标签标签显示卡片背面展示getCategoryLabel()和tags数组privategetFilteredWords():WordCard[]{if(this.currentCategoryall){returnDEFAULT_WORD_CARDS;// 返回全部 500 词}returnDEFAULT_WORD_CARDS.filter(ww.categorythis.currentCategory);}privategetCategoryLabel():string{if(this.currentCategoryall){return全部;}for(leti0;iWORD_CATEGORIES.length;i){if(WORD_CATEGORIES[i].keythis.currentCategory){returnWORD_CATEGORIES[i].label;}}returnthis.currentCategory;}三、500 词数据设计3.1 数据结构特点500 个词的实际数据采用紧密编码的方式exportconstDEFAULT_WORD_CARDS:WordCard[][// 基础词汇 80 个 (id 1-80) newWordCard(1,apple,/ˈæpl/,n.,苹果,I eat an apple every morning for breakfast.,我每天早餐吃一个苹果。,,[日常,食物],basic),newWordCard(2,book,/bʊk/,n.,书书本,She is reading a book in the library.,她正在图书馆里读一本书。,,[日常,学习],basic),// ... (共 500 个)];设计要点连续 ID从 1 到 500按分类分段1-80 basic, 81-190 cet4, 191-300 cet6, 301-400 ielts, 401-500 gre注释清晰每段开头用注释标明分段范围真实例句每个单词配有一句贴合生活的英文例句 中文翻译标签辅助tags 数组提供额外筛选维度如 ‘高频’、‘日常’、‘食物’空 audioUrl默认音频资源为空字符串运行时由 AudioPlayer 处理3.2 词库覆盖分类代表词汇词汇特征basicapple, book, cat, eat, happy, run日常高频词汇cet4abandon, ability, accelerate, achievement学术 生活cet6contradict, controversy, deteriorate, phenomenon更正式、抽象ieltsanalyse, commission, correlation, infrastructure学术写作常用greaberration, ambiguous, eloquent, ubiquitous高级、文学性四、数据源适配器为了配合LazyForEach等使用IDataSource接口的组件提供了适配器exportclassWordCardDataSourceimplementsIDataSource{privatewords:WordCard[][];privatelisteners:DataChangeListener[][];constructor(words:WordCard[]){for(leti0;iwords.length;i){this.words.push(words[i]);}}publicgetData(index:number):WordCard{returnthis.words[index];}publictotalCount():number{returnthis.words.length;}registerDataChangeListener(listener:DataChangeListener):void{if(this.listeners.indexOf(listener)0){this.listeners.push(listener);}}unregisterDataChangeListener(listener:DataChangeListener):void{constposthis.listeners.indexOf(listener);if(pos0){this.listeners.splice(pos,1);}}}IDataSource是 ArkUI 的懒加载接口配合LazyForEach使用可以实现按需渲染只创建可见区域的组件数据变更通知通过DataChangeListener通知 UI 更新高效的大列表渲染500 个单词的列表也能流畅滑动五、扩展新词汇如果需要扩展词库只需在对应的分类段中添加新的new WordCard(...)行// 在 basic 段末尾添加newWordCard(81,garden,/ˈɡɑːrdn/,n.,花园,There is a beautiful garden behind the house.,房子后面有一个美丽的花园。,,[日常,自然],basic),确保id保持连续且不重复category与分类 Key 一致tags提供辅助分类标签六、总结500 词库通过精心设计的 WordCard 模型和分类体系为学习者提供了渐进式的学习路径。ObservedV2Trace保证了 UI 的响应式更新IDataSource适配器为大列表提供了性能保障而清晰的注释和分段结构使得词库的维护和扩展变得简单直观。这套数据模型设计可以无缝扩展到千级甚至万级词库。