/** * 拼音每日一练分组数据 * 每页 4 个部分(四宫格),每个部分聚焦一个拼音及其相关练习 */ export interface PinyinDailyTask { char: string; // 核心字母,如 'a' variants: string[]; // 变体,如 ['ā', 'á', 'ǎ', 'à'] type: 'shengmu' | 'yunmu' | 'zhengti'; } export const PINYIN_DAILY_GROUPS: PinyinDailyTask[][] = [ // Day 1: 单韵母 a o e i [ { char: 'a', variants: ['ā', 'á', 'ǎ', 'à'], type: 'yunmu' }, { char: 'o', variants: ['ō', 'ó', 'ǒ', 'ò'], type: 'yunmu' }, { char: 'e', variants: ['ē', 'é', 'ě', 'è'], type: 'yunmu' }, { char: 'i', variants: ['ī', 'í', 'ǐ', 'ì'], type: 'yunmu' }, ], // Day 2: 单韵母 u ü + 声母 b p [ { char: 'u', variants: ['ū', 'ú', 'ǔ', 'ù'], type: 'yunmu' }, { char: 'ü', variants: ['ǖ', 'ǘ', 'ǚ', 'ǜ'], type: 'yunmu' }, { char: 'b', variants: [], type: 'shengmu' }, { char: 'p', variants: [], type: 'shengmu' }, ], // Day 3: 声母 m f d t [ { char: 'm', variants: [], type: 'shengmu' }, { char: 'f', variants: [], type: 'shengmu' }, { char: 'd', variants: [], type: 'shengmu' }, { char: 't', variants: [], type: 'shengmu' }, ], // Day 4: 声母 n l g k [ { char: 'n', variants: [], type: 'shengmu' }, { char: 'l', variants: [], type: 'shengmu' }, { char: 'g', variants: [], type: 'shengmu' }, { char: 'k', variants: [], type: 'shengmu' }, ], // Day 5: 声母 h j q x [ { char: 'h', variants: [], type: 'shengmu' }, { char: 'j', variants: [], type: 'shengmu' }, { char: 'q', variants: [], type: 'shengmu' }, { char: 'x', variants: [], type: 'shengmu' }, ], // Day 6: 声母 zh ch sh r [ { char: 'zh', variants: [], type: 'shengmu' }, { char: 'ch', variants: [], type: 'shengmu' }, { char: 'sh', variants: [], type: 'shengmu' }, { char: 'r', variants: [], type: 'shengmu' }, ], // Day 7: 声母 z c s y [ { char: 'z', variants: [], type: 'shengmu' }, { char: 'c', variants: [], type: 'shengmu' }, { char: 's', variants: [], type: 'shengmu' }, { char: 'y', variants: [], type: 'shengmu' }, ], // Day 8: 声母 w + 复韵母 ai ei ui [ { char: 'w', variants: [], type: 'shengmu' }, { char: 'ai', variants: ['āi', 'ái', 'ǎi', 'ài'], type: 'yunmu' }, { char: 'ei', variants: ['ēi', 'éi', 'ěi', 'èi'], type: 'yunmu' }, { char: 'ui', variants: ['uī', 'uí', 'uǐ', 'uì'], type: 'yunmu' }, ], // Day 9: 复韵母 ao ou iu ie [ { char: 'ao', variants: ['āo', 'áo', 'ǎo', 'ào'], type: 'yunmu' }, { char: 'ou', variants: ['ōu', 'óu', 'ǒu', 'òu'], type: 'yunmu' }, { char: 'iu', variants: ['iū', 'iú', 'iǔ', 'iù'], type: 'yunmu' }, { char: 'ie', variants: ['iē', 'ié', 'iě', 'iè'], type: 'yunmu' }, ], // Day 10: 复韵母 üe er + 前鼻韵母 an en [ { char: 'üe', variants: ['üē', 'üé', 'üě', 'üè'], type: 'yunmu' }, { char: 'er', variants: ['ēr', 'ér', 'ěr', 'èr'], type: 'yunmu' }, { char: 'an', variants: ['ān', 'án', 'ǎn', 'àn'], type: 'yunmu' }, { char: 'en', variants: ['ēn', 'én', 'ěn', 'èn'], type: 'yunmu' }, ], // Day 11: 前鼻韵母 in un ün + 后鼻韵母 ang [ { char: 'in', variants: ['īn', 'ín', 'ǐn', 'ìn'], type: 'yunmu' }, { char: 'un', variants: ['ūn', 'ún', 'ǔn', 'ùn'], type: 'yunmu' }, { char: 'ün', variants: ['ǖn', 'ǘn', 'ǚn', 'ǜn'], type: 'yunmu' }, { char: 'ang', variants: ['āng', 'áng', 'ǎng', 'àng'], type: 'yunmu' }, ], // Day 12: 后鼻韵母 eng ing ong + 整体认读 zhi [ { char: 'eng', variants: ['ēng', 'éng', 'ěng', 'èng'], type: 'yunmu' }, { char: 'ing', variants: ['īng', 'íng', 'ǐng', 'ìng'], type: 'yunmu' }, { char: 'ong', variants: ['ōng', 'óng', 'ǒng', 'òng'], type: 'yunmu' }, { char: 'zhi', variants: ['zhī', 'zhí', 'zhǐ', 'zhì'], type: 'zhengti', }, ], // Day 13: 整体认读 chi shi ri zi [ { char: 'chi', variants: ['chī', 'chí', 'chǐ', 'chì'], type: 'zhengti', }, { char: 'shi', variants: ['shī', 'shí', 'shǐ', 'shì'], type: 'zhengti', }, { char: 'ri', variants: ['rī', 'rí', 'rǐ', 'rì'], type: 'zhengti' }, { char: 'zi', variants: ['zī', 'zí', 'zǐ', 'zì'], type: 'zhengti' }, ], // Day 14: 整体认读 ci si yi wu [ { char: 'ci', variants: ['cī', 'cí', 'cǐ', 'cì'], type: 'zhengti' }, { char: 'si', variants: ['sī', 'sí', 'sǐ', 'sì'], type: 'zhengti' }, { char: 'yi', variants: ['yī', 'yí', 'yǐ', 'yì'], type: 'zhengti' }, { char: 'wu', variants: ['wū', 'wú', 'wǔ', 'wù'], type: 'zhengti' }, ], // Day 15: 整体认读 yu ye yue yuan [ { char: 'yu', variants: ['yū', 'yú', 'yǔ', 'yù'], type: 'zhengti' }, { char: 'ye', variants: ['yē', 'yé', 'yě', 'yè'], type: 'zhengti' }, { char: 'yue', variants: ['yuē', 'yué', 'yuě', 'yuè'], type: 'zhengti', }, { char: 'yuan', variants: ['yuān', 'yuán', 'yuǎn', 'yuàn'], type: 'zhengti', }, ], // Day 16: 整体认读 yin yun ying [ { char: 'yin', variants: ['yīn', 'yín', 'yǐn', 'yìn'], type: 'zhengti', }, { char: 'yun', variants: ['yūn', 'yún', 'yǔn', 'yùn'], type: 'zhengti', }, { char: 'ying', variants: ['yīng', 'yíng', 'yǐng', 'yìng'], type: 'zhengti', }, ], ]; /** 每日打卡选择器展示项 */ export interface PinyinDailyPickerItem { index: number; label: string; subtitle: string; } const CHIP_CHAR_MAX = 3; const CHIP_SUBTITLE_MAX = 14; function shortCharForChip(char: string): string { if (char.length <= CHIP_CHAR_MAX) return char; return `${char.slice(0, CHIP_CHAR_MAX - 1)}…`; } /** 构建「第 N 组 + 拼音摘要」选择器数据 */ export function buildPinyinDailyPickerItems(): PinyinDailyPickerItem[] { return PINYIN_DAILY_GROUPS.map((group, idx) => { let subtitle = group.map((t) => shortCharForChip(t.char)).join('·'); if (subtitle.length > CHIP_SUBTITLE_MAX) { subtitle = `${subtitle.slice(0, CHIP_SUBTITLE_MAX - 1)}…`; } return { index: idx, label: `第 ${idx + 1} 组`, subtitle, }; }); }