500 词库构建——数据模型设计与分类筛选
一、WordCard 数据模型
1.1 模型定义
词库的核心是WordCard模型,它位于commons/commonLib/src/main/ets/models/WordCardModel.ets:
@ObservedV2exportclassWordCard{@Traceid:number=0;@Traceword:string='';@Tracephonetic:string='';@TracepartOfSpeech:string='';@Tracetranslation:string='';@Traceexample:string='';@TraceexampleTranslation:string='';@TraceaudioUrl:string='';@Tracetags:string[]=[];@Tracecategory:string='basic';constructor(id:number,word:string,phonetic:string,partOfSpeech:string,translation:string,example:string,exampleTranslation:string,audioUrl:string='',tags:string[]=[],category:string='basic'){// ...}}10 个字段可分成四组:
| 分组 | 字段 | 用途 |
|---|---|---|
| 标识 | id | 唯一编号 |
| 单词 | word, phonetic, partOfSpeech, translation | 核心学习内容 |
| 上下文 | example, exampleTranslation | 例句理解 |
| 元数据 | audioUrl, tags, category | 发音、标签、分类 |
1.2 @ObservedV2 和 @Trace
@ObservedV2和@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) | ★☆☆☆☆ | 初学者 / 中小学生 |
| cet4(CET-4) | 110 个 (id 81-190) | ★★☆☆☆ | 大学生 / 四级备考 |
| cet6(CET-6) | 110 个 (id 191-300) | ★★★☆☆ | 六级备考 / 进阶 |
| ielts(雅思) | 100 个 (id 301-400) | ★★★★☆ | 留学备考 |
| gre(GRE) | 100 个 (id 401-500) | ★★★★★ | 研究生 / 学术 |
2.2 分类在卡片中的串联
在CourseHomePage中,分类体系贯穿始终:
- Tab 栏展示:通过
ForEach(WORD_CATEGORIES, ...)动态生成可滚动的分类 Tab - 单词过滤:
getFilteredWords()按currentCategory筛选单词 - 进度统计:
getCategoryLabel()将分类 Key 转为中文标签 - 标签显示:卡片背面展示
getCategoryLabel()和tags数组
privategetFilteredWords():WordCard[]{if(this.currentCategory==='all'){returnDEFAULT_WORD_CARDS;// 返回全部 500 词}returnDEFAULT_WORD_CARDS.filter(w=>w.category===this.currentCategory);}privategetCategoryLabel():string{if(this.currentCategory==='all'){return'全部';}for(leti=0;i<WORD_CATEGORIES.length;i++){if(WORD_CATEGORIES[i].key===this.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 词库覆盖
| 分类 | 代表词汇 | 词汇特征 |
|---|---|---|
| basic | apple, book, cat, eat, happy, run | 日常高频词汇 |
| cet4 | abandon, ability, accelerate, achievement | 学术 + 生活 |
| cet6 | contradict, controversy, deteriorate, phenomenon | 更正式、抽象 |
| ielts | analyse, commission, correlation, infrastructure | 学术写作常用 |
| gre | aberration, ambiguous, eloquent, ubiquitous | 高级、文学性 |
四、数据源适配器
为了配合LazyForEach等使用IDataSource接口的组件,提供了适配器:
exportclassWordCardDataSourceimplementsIDataSource{privatewords:WordCard[]=[];privatelisteners:DataChangeListener[]=[];constructor(words:WordCard[]){for(leti=0;i<words.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{constpos=this.listeners.indexOf(listener);if(pos>=0){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 模型和分类体系,为学习者提供了渐进式的学习路径。@ObservedV2+@Trace保证了 UI 的响应式更新,IDataSource适配器为大列表提供了性能保障,而清晰的注释和分段结构使得词库的维护和扩展变得简单直观。这套数据模型设计可以无缝扩展到千级甚至万级词库。