@@ -1,7 +1,14 @@
import { WorksheetType } from '../models/worksheet' ;
import type {
GeneratorType ,
LayoutConfig ,
TemplateType ,
WorksheetDefinition ,
WorksheetType ,
} from '../models/worksheet' ;
import { difficultyToStars } from './difficulty' ;
/**
* MathFunctionType - 保持向后兼容
* MathFunctionType - 保持向后兼容( mathPageMixin / mathIndex)
*/
export interface MathFunctionType {
id : string ;
@@ -13,7 +20,7 @@ export interface MathFunctionType {
}
/**
* FocusFunctionType - 保持向后兼容
* FocusFunctionType - 保持向后兼容( focusPageMixin / focusIndex)
*/
export interface FocusFunctionType {
id : string ;
@@ -25,128 +32,270 @@ export interface FocusFunctionType {
img? : string ;
}
interface SheetEngine {
subcategory : string ;
template : TemplateType ;
generator : GeneratorType ;
generatorConfig? : Record < string , unknown > ;
layoutConfig? : LayoutConfig ;
tags? : string [ ] ;
sortOrder : number ;
}
function legacyPath ( ui : WorksheetType ) : string | null {
if ( ! ui . page ) return null ;
if ( ui . subpackage ) {
return ` / ${ ui . subpackage } / ${ ui . page } / ${ ui . page } ` ;
}
return ` /pages/ ${ ui . page } / ${ ui . page } ` ;
}
function sheet ( ui : WorksheetType , engine : SheetEngine ) : WorksheetDefinition {
const ageMin = ui . ageRange ? . [ 0 ] ? ? 3 ;
const ageMax = ui . ageRange ? . [ 1 ] ? ? 8 ;
return {
. . . ui ,
subcategory : engine.subcategory ,
ageMin ,
ageMax ,
difficultyLevel : difficultyToStars ( ui . difficulty ) ,
previewImage : ui.img ? ? '' ,
tags : engine.tags?.length ? engine . tags : [ engine . subcategory ] ,
isNew : false ,
isHot : false ,
sortOrder : engine.sortOrder ,
downloadCount : 0 ,
status : 'active' ,
template : engine.template ,
generator : engine.generator ,
generatorConfig : engine.generatorConfig ? ? { } ,
layoutConfig : engine.layoutConfig ? ? { showBorder : true } ,
userConfigurable : null ,
legacyPage : legacyPath ( ui ) ,
} ;
}
const L = {
gridEx : { showBorder : true , fontSize : 18 } satisfies LayoutConfig ,
card : { showBorder : true , columns : 2 , fontSize : 16 } satisfies LayoutConfig ,
trace : {
showBorder : true ,
showInstruction : true ,
fontSize : 20 ,
} satisfies LayoutConfig ,
} ;
// 现有功能清单 §二:数感启蒙 26 种 + §三 13 种 + §四 §五 语文 2
// prettier-ignore
export const MATH_FUNCTION_TYPES : MathFunctionType [ ] = [
{ id : 'number-sort' , page : 'numberSort' , title : '数字排序' , desc : '数字排序,写出正确顺序' , icon : '🔢' , img : '/assets/mathEntrance/number-sort.png' } ,
{ id : 'one-digit-addition ' , page : 'oneDigitAddition ' , title : '一位数加法 ' , desc : '通过圆点学习一位数加法运算' , icon : '➕ ' , img : '/assets/mathEntrance/one-digit-addition.png ' } ,
{ id : 'make-ten ' , page : 'makeTen ' , title : '凑十法练习' , desc : '通过凑十法学习20以内进位加法' , icon : '➕ ' , img : '/assets/mathEntrance/make-ten.png' } ,
{ id : 'break-ten' , page : 'breakTen' , title : '破十法练习' , desc : '通过破十法学习20以内退位减法' , icon : '➖ ' , img : '/assets/mathEntrance/break-ten.png' } ,
{ id : 'flat-ten' , page : 'flatTen' , title : '平十法练习' , desc : '通过平十法学习20以内退位减法' , icon : '➖ ' , img : '/assets/mathEntrance/flat-ten.png' } ,
{ id : 'borrow- ten ' , page : 'borrowTen ' , title : '借十法练习 ' , desc : '通过借十法学习20以上退位减法 ' , icon : '➖ ' , img : '/assets/mathEntrance/borrow- ten .png' } ,
{ id : 'number-decompose-20 ' , page : 'numberDecompose ' , title : '20以内数的分与合' , desc : '把数字分一分,合一合' , icon : '🔢' , img : '/assets/mathEntrance/number-decompose-20.png' } ,
{ id : 'number-decompose' , page : 'numberDecompose' , title : '10以内数的分与合' , desc : '把数字分一分,合一合' , icon : '🔢' , img : '/assets/mathEntrance/number-decompose.png' } ,
{ id : 'number-find' , page : 'numberFind' , title : '找数字,涂一涂' , desc : '找一找下面相同的数字,涂上颜色' , img : '/assets/mathEntrance/number-find.png' } ,
{ id : 'number-write ' , page : 'numberFind ' , title : '看数字,写一写 ' , desc : '看数字,按笔画顺序写一写 ' , img : '/assets/mathEntrance/number-write.png ' } ,
{ id : 'number-coloring' , page : 'countMatch ' , title : '按数字,涂颜色' , desc : '按数字给相应的圆圈涂上颜色' , icon : '🎨' , img : '/assets/mathEntrance/ number-coloring.png ' } ,
{ id : 'counting-matching' , page : 'countMatch' , title : '数一数,连一连' , desc : '通过连线配对数字和对应的数量图形' , icon : '🔗' , img : '/assets/mathEntrance/count-match.png' } ,
{ id : 'number-object-match' , page : 'numberObjectMatch' , title : '数物连线' , desc : '连线相同数量的物品和数字' , icon : '🔗' , img : '/assets/mathEntrance/number-object-match.png' } ,
{ id : 'number-object-fill ' , page : 'numberObjectM atc h' , title : '数物填写 ' , desc : '数一数物品数量,填写对应的数字 ' , icon : '✏️ ' , img : '/assets/mathEntrance/number-object-fill.png ' } ,
{ id : 'counting-select ' , page : 'countingSel ect' , title : '数一数,选一选' , desc : '数出物品数量,圈出正确答案' , icon : '✓' , img : '/assets/mathEntrance/counting-select.png' } ,
{ id : 'counting-fill' , page : 'countingSelect' , title : '数一数,填一填' , desc : '数出物品数量,填写对应的数字' , icon : '✏️' , img : '/assets/mathEntrance/counting-fill.png' } ,
{ id : 'compare' , page : 'compare' , title : '数一数,比大小' , desc : '比较数量大小,在 ⭕️ 中填入>、<、=' , icon : '⚖️' , img : '/assets/mathEntrance/compare.png' } ,
{ id : 'missing-number ' , page : 'missingNumber ' , title : '填上缺少的 数字' , desc : '在数字序列中找出并填写缺失的数字 ' , icon : '❓ ' , img : '/assets/mathEntrance/missing-number.png ' } ,
{ id : 'addition-5 ' , page : 'addition ' , title : '5以内加法' , desc : '练习5以内的加法运算,图形化展示' , icon : '➕ ' , img : '/assets/mathEntrance/addition-5.png' } ,
{ id : 'addition-10' , page : 'addition' , title : '10以内加法' , desc : '练习10以内的加法运算,图形化展示' , icon : '➕ ' , img : '/assets/mathEntrance/addition-10.png' } ,
{ id : 'subtraction-10' , page : 'addition' , title : '10以内减法' , desc : '练习10以内的减法运算,图形化展示' , icon : '➖ ' , img : '/assets/mathEntrance/subtraction-10.png' } ,
{ id : 'addition-subtraction-10 ' , page : 'addition ' , title : '10以内加减法 ' , desc : '练习10以内的加法和减法混合运算 ' , icon : '± ' , img : '/assets/mathEntrance/addition-subtraction-10.png ' } ,
{ id : 'practice-addition ' , page : 'calculationPractic e' , title : '加法运算' , desc : '练习10/20/50/100以内加法运算' , icon : '➕ ' , img : '/assets/mathEntrance/practice-addition.png' } ,
{ id : 'practice-subtraction' , page : 'calculationPractice' , title : '减法运算' , desc : '练习10/20/50/100以内减法运算' , icon : '➖ ' , img : '/assets/mathEntrance/practice-subtraction.png' } ,
{ id : 'practice-mixed' , page : 'calculationPractice' , title : '混合运算' , desc : '练习10/20/50/100以内加减法混合运算' , icon : '±' , img : '/assets/mathEntrance/practice-mixed.png' } ,
{ id : 'multiplication-table' , page : 'multiplicationTable ', title : '九九乘法表 ' , desc : '学习九九乘法口诀 ' , icon : '✖️ ' , img : '/assets/mathEntrance/multiplication-table.png ' } ,
export const ALL_WORKSHEETS : WorksheetDefinition [ ] = [
sheet (
{ id : 'number-find ' , title : '找数字,涂一涂 ' , desc : '在数字方阵中找出目标数字并涂色 ' , category : 'math' , page : 'numberFind' , subpackage : 'mathPages' , img : '/assets/mathEntrance/number-find.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#fff3e0' , previewText : '🔍 1 2 3 ' } ,
{ subcategory : 'number-sense ' , template : 'grid-coloring ' , generator : 'counting' , sortOrder : 1 , layoutConfig : { . . . L . gridEx } , generatorConfig : { functionId : 'number-find' } } ,
) ,
sheet (
{ id : 'number-wri te' , title : '看数字,写一写 ' , desc : '按笔画顺序练习书写数字 ' , category : 'math ' , page : 'numberFind' , subpackage : 'mathPages ', img : '/assets/mathEntrance/number-wri te.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#fff3e0' , previewText : '1 2 3' } ,
{ subcategory : 'number-sense ' , template : 'tracing-writing ' , generator : 'counting' , sortOrder : 2 , layoutConfig : { . . . L . trace } , generatorConfig : { functionId : 'number-write' } } ,
) ,
sheet (
{ id : 'number-coloring' , title : '按数字,涂颜色' , desc : '按指定数字给对应圆圈涂色' , category : 'math ', page : 'countMatch ' , subpackage : 'mathPages ' , icon : '🎨 ' , img : '/assets/mathEntrance/number-coloring.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#fce4ec' , previewText : '🎨 ' } ,
{ subcategory : 'number-sense' , template : 'grid- coloring', generator : 'counting ' , sortOrder : 3 , layoutConfig : { . . . L . gridEx } , generatorConfig : { functionId : 'number-coloring' } } ,
) ,
sheet (
{ id : 'counting-matching ' , title : '数一数,连一连' , desc : '连线配对数字和对应数量图形' , category : 'm ath', page : 'countMatch ' , subpackage : 'mathPages ' , icon : '🔗 ' , img : '/assets/mathEntrance/count-match.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#e8f5e9' , previewText : '3↔🍎🍎🍎 ' } ,
{ subcategory : 'counting' , template : 'match-conn ect' , generator : 'counting' , sortOrder : 4 , layoutConfig : { . . . L . gridEx } , generatorConfig : { functionId : 'counting-matching' } } ,
) ,
sheet (
{ id : 'number-object-match ' , title : '数物连线 ' , desc : '连线相同数量的物品和 数字' , category : 'math' , page : 'numberObjectMatch' , subpackage : 'mathPages ', icon : '🔗 ' , img : '/assets/mathEntrance/number-object-match.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#e8f5e9' , previewText : '🔗 ' } ,
{ subcategory : 'counting ' , template : 'match-connect ' , generator : 'counting' , sortOrder : 5 , generatorConfig : { functionId : 'number-object-match' } } ,
) ,
sheet (
{ id : 'number-object-fill' , title : '数物填写 ', desc : '数物品数量,填写对应数字' , category : 'math ', page : 'numberObjectMatch ' , subpackage : 'mathPages ' , icon : '✏️ ' , img : '/assets/mathEntrance/number-object-fill.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#e8f5e9' , previewText : '✏️ ' } ,
{ subcategory : 'counting ' , template : 'grid-exercis e' , generator : 'counting' , sortOrder : 6 , generatorConfig : { functionId : 'number-object-fill' } } ,
) ,
sheet (
{ id : 'counting-select' , title : '数一数,选一选' , desc : '数出物品数量,圈出正确答案' , category : 'math ', page : 'countingSelect ' , subpackage : 'mathPages ' , icon : '✓ ' , img : '/assets/mathEntrance/counting-select.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#e8f5e9' , previewText : '✓ ' } ,
{ subcategory : 'counting' , template : 'grid-exercise' , generator : 'counting' , sortOrder : 7 , generatorConfig : { functionId : 'counting-select' } } ,
) ,
sheet (
{ id : 'counting-fill' , title : '数一数,填一填' , desc : '数出物品数量,填写数字' , category : 'math' , page : 'countingSelect' , subpackage : 'mathPages' , icon : '✏️' , img : '/assets/mathEntrance/counting-fill.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#e8f5e9' , previewText : '✏️' } ,
{ subcategory : 'counting' , template : 'grid-exercise' , generator : 'counting' , sortOrder : 8 , generatorConfig : { functionId : 'counting-fill' } } ,
) ,
sheet (
{ id : 'compare' , title : '数一数,比大小' , desc : '比较数量,填入 ><=' , category : 'math' , page : 'compare' , subpackage : 'mathPages' , icon : '⚖️' , img : '/assets/mathEntrance/compare.png' , ageRange : [ 4 , 6 ] , difficulty : 'basic' , previewBg : '#e3f2fd' , previewText : '3 ○ 5' } ,
{ subcategory : 'counting' , template : 'grid-exercise' , generator : 'comparison' , sortOrder : 9 , generatorConfig : { functionId : 'compare' } } ,
) ,
sheet (
{ id : 'number-sort' , title : '数字排序' , desc : '写出正确的数字顺序' , category : 'math' , page : 'numberSort' , subpackage : 'mathPages' , icon : '🔢' , img : '/assets/mathEntrance/number-sort.png' , ageRange : [ 4 , 6 ] , difficulty : 'basic' , previewBg : '#fff3e0' , previewText : '1→2→3' } ,
{ subcategory : 'sequence' , template : 'sequence-pattern' , generator : 'number-sequence' , sortOrder : 10 , generatorConfig : { functionId : 'number-sort' } } ,
) ,
sheet (
{ id : 'missing-number' , title : '填上缺少的数字' , desc : '在数列中找出并填写缺失数字' , category : 'math' , page : 'missingNumber' , subpackage : 'mathPages' , icon : '❓' , img : '/assets/mathEntrance/missing-number.png' , ageRange : [ 4 , 6 ] , difficulty : 'basic' , previewBg : '#fff3e0' , previewText : '1_3_5' } ,
{ subcategory : 'sequence' , template : 'sequence-pattern' , generator : 'number-sequence' , sortOrder : 11 , generatorConfig : { functionId : 'missing-number' } } ,
) ,
sheet (
{ id : 'number-decompose' , title : '10以内数的分与合' , desc : '把数字分一分,合一合' , category : 'math' , page : 'numberDecompose' , subpackage : 'mathPages' , icon : '🔢' , img : '/assets/mathEntrance/number-decompose.png' , ageRange : [ 4 , 6 ] , difficulty : 'beginner' , previewBg : '#fff3e0' , previewText : '8=?+?' } ,
{ subcategory : 'decompose' , template : 'grid-exercise' , generator : 'number-decompose' , sortOrder : 12 , generatorConfig : { max : 10 } } ,
) ,
sheet (
{ id : 'number-decompose-20' , title : '20以内数的分与合' , desc : '把数字分一分,合一合' , category : 'math' , page : 'numberDecompose' , subpackage : 'mathPages' , icon : '🔢' , img : '/assets/mathEntrance/number-decompose-20.png' , ageRange : [ 5 , 7 ] , difficulty : 'basic' , previewBg : '#fff3e0' , previewText : '15=?+?' } ,
{ subcategory : 'decompose' , template : 'grid-exercise' , generator : 'number-decompose' , sortOrder : 13 , generatorConfig : { max : 20 } } ,
) ,
sheet (
{ id : 'one-digit-addition' , title : '一位数加法' , desc : '通过圆点学习一位数加法运算' , category : 'math' , page : 'oneDigitAddition' , subpackage : 'mathPages' , icon : '➕ ' , img : '/assets/mathEntrance/one-digit-addition.png' , ageRange : [ 4 , 6 ] , difficulty : 'basic' , previewBg : '#e3f2fd' , previewText : '2+3=?' } ,
{ subcategory : 'arithmetic-visual' , template : 'grid-exercise' , generator : 'arithmetic' , sortOrder : 14 , generatorConfig : { operators : [ '+' ] , maxNumber : 9 , showDots : true } } ,
) ,
sheet (
{ id : 'addition-5' , title : '5以内加法' , desc : '图形化展示 5 以内加法' , category : 'math' , page : 'addition' , subpackage : 'mathPages' , icon : '➕ ' , img : '/assets/mathEntrance/addition-5.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#e3f2fd' , previewText : '2+1=?' } ,
{ subcategory : 'arithmetic-visual' , template : 'grid-exercise' , generator : 'arithmetic' , sortOrder : 15 , generatorConfig : { operators : [ '+' ] , maxNumber : 5 , showDots : true } } ,
) ,
sheet (
{ id : 'addition-10' , title : '10以内加法' , desc : '图形化展示 10 以内加法' , category : 'math' , page : 'addition' , subpackage : 'mathPages' , icon : '➕ ' , img : '/assets/mathEntrance/addition-10.png' , ageRange : [ 4 , 6 ] , difficulty : 'basic' , previewBg : '#e3f2fd' , previewText : '3+5=?' } ,
{ subcategory : 'arithmetic-visual' , template : 'grid-exercise' , generator : 'arithmetic' , sortOrder : 16 , generatorConfig : { operators : [ '+' ] , maxNumber : 10 , showDots : true } } ,
) ,
sheet (
{ id : 'subtraction-10' , title : '10以内减法' , desc : '图形化展示 10 以内减法' , category : 'math' , page : 'addition' , subpackage : 'mathPages' , icon : '➖ ' , img : '/assets/mathEntrance/subtraction-10.png' , ageRange : [ 4 , 6 ] , difficulty : 'basic' , previewBg : '#e3f2fd' , previewText : '8-3=?' } ,
{ subcategory : 'arithmetic-visual' , template : 'grid-exercise' , generator : 'arithmetic' , sortOrder : 17 , generatorConfig : { operators : [ '-' ] , maxNumber : 10 , showDots : true } } ,
) ,
sheet (
{ id : 'addition-subtraction-10' , title : '10以内加减法' , desc : '加减法混合运算' , category : 'math' , page : 'addition' , subpackage : 'mathPages' , icon : '±' , img : '/assets/mathEntrance/addition-subtraction-10.png' , ageRange : [ 5 , 7 ] , difficulty : 'basic' , previewBg : '#e3f2fd' , previewText : '±' } ,
{ subcategory : 'arithmetic-visual' , template : 'grid-exercise' , generator : 'arithmetic' , sortOrder : 18 , generatorConfig : { operators : [ '+' , '-' ] , maxNumber : 10 , showDots : true } } ,
) ,
sheet (
{ id : 'make-ten' , title : '凑十法练习' , desc : '20 以内进位加法' , category : 'math' , page : 'makeTen' , subpackage : 'mathPages' , icon : '➕ ' , img : '/assets/mathEntrance/make-ten.png' , ageRange : [ 5 , 7 ] , difficulty : 'intermediate' , previewBg : '#e3f2fd' , previewText : '7+?=10' } ,
{ subcategory : 'methods-ten' , template : 'grid-exercise' , generator : 'arithmetic' , sortOrder : 19 , generatorConfig : { method : 'make-ten' } } ,
) ,
sheet (
{ id : 'break-ten' , title : '破十法练习' , desc : '20 以内退位减法' , category : 'math' , page : 'breakTen' , subpackage : 'mathPages' , icon : '➖ ' , img : '/assets/mathEntrance/break-ten.png' , ageRange : [ 5 , 7 ] , difficulty : 'intermediate' , previewBg : '#e3f2fd' , previewText : '15-8=?' } ,
{ subcategory : 'methods-ten' , template : 'grid-exercise' , generator : 'arithmetic' , sortOrder : 20 , generatorConfig : { method : 'break-ten' } } ,
) ,
sheet (
{ id : 'flat-ten' , title : '平十法练习' , desc : '20 以内退位减法' , category : 'math' , page : 'flatTen' , subpackage : 'mathPages' , icon : '➖ ' , img : '/assets/mathEntrance/flat-ten.png' , ageRange : [ 5 , 7 ] , difficulty : 'intermediate' , previewBg : '#e3f2fd' , previewText : '14-6=?' } ,
{ subcategory : 'methods-ten' , template : 'grid-exercise' , generator : 'arithmetic' , sortOrder : 21 , generatorConfig : { method : 'flat-ten' } } ,
) ,
sheet (
{ id : 'borrow-ten' , title : '借十法练习' , desc : '20 以上退位减法' , category : 'math' , page : 'borrowTen' , subpackage : 'mathPages' , icon : '➖ ' , img : '/assets/mathEntrance/borrow-ten.png' , ageRange : [ 6 , 8 ] , difficulty : 'advanced' , previewBg : '#e3f2fd' , previewText : '32-8=?' } ,
{ subcategory : 'methods-ten' , template : 'grid-exercise' , generator : 'arithmetic' , sortOrder : 22 , generatorConfig : { method : 'borrow-ten' } } ,
) ,
sheet (
{ id : 'practice-addition' , title : '加法运算' , desc : '10/20/50/100 以内加法' , category : 'math' , page : 'calculationPractice' , subpackage : 'mathPages' , icon : '➕ ' , img : '/assets/mathEntrance/practice-addition.png' , ageRange : [ 5 , 8 ] , difficulty : 'intermediate' , previewBg : '#e3f2fd' , previewText : '25+18=?' } ,
{ subcategory : 'practice' , template : 'grid-exercise' , generator : 'arithmetic' , sortOrder : 23 , generatorConfig : { operators : [ '+' ] , preset : 'vertical' } } ,
) ,
sheet (
{ id : 'practice-subtraction' , title : '减法运算' , desc : '10/20/50/100 以内减法' , category : 'math' , page : 'calculationPractice' , subpackage : 'mathPages' , icon : '➖ ' , img : '/assets/mathEntrance/practice-subtraction.png' , ageRange : [ 5 , 8 ] , difficulty : 'intermediate' , previewBg : '#e3f2fd' , previewText : '43-17=?' } ,
{ subcategory : 'practice' , template : 'grid-exercise' , generator : 'arithmetic' , sortOrder : 24 , generatorConfig : { operators : [ '-' ] , preset : 'vertical' } } ,
) ,
sheet (
{ id : 'practice-mixed' , title : '混合运算' , desc : '10/20/50/100 以内加减法混合' , category : 'math' , page : 'calculationPractice' , subpackage : 'mathPages' , icon : '±' , img : '/assets/mathEntrance/practice-mixed.png' , ageRange : [ 5 , 8 ] , difficulty : 'intermediate' , previewBg : '#e3f2fd' , previewText : '±' } ,
{ subcategory : 'practice' , template : 'grid-exercise' , generator : 'arithmetic' , sortOrder : 25 , generatorConfig : { operators : [ '+' , '-' ] , preset : 'vertical' } } ,
) ,
sheet (
{ id : 'multiplication-table' , title : '九九乘法表' , desc : '学习九九乘法口诀' , category : 'math' , page : 'multiplicationTable' , subpackage : 'mathPages' , icon : '✖️' , img : '/assets/mathEntrance/multiplication-table.png' , ageRange : [ 6 , 8 ] , difficulty : 'intermediate' , previewBg : '#f3e5f5' , previewText : '3× 4=12' } ,
{ subcategory : 'practice' , template : 'grid-exercise' , generator : 'arithmetic' , sortOrder : 26 , generatorConfig : { operators : [ '× ' ] , mode : 'multiplication-table' } } ,
) ,
sheet (
{ id : 'color-shape-match' , title : '根据颜色画图形' , desc : '根据颜色画出对应图形' , category : 'focus' , page : 'colorShapeMatch' , subpackage : 'focusPages' , icon : '🎯' , img : '/assets/focusEntrance/color-shape-match.png' , ageRange : [ 4 , 6 ] , difficulty : 'basic' , previewBg : '#f3e5f5' , previewText : '🎯' } ,
{ subcategory : 'focus-visual' , template : 'grid-exercise' , generator : 'shape-grid' , sortOrder : 27 , generatorConfig : { functionId : 'color-shape-match' } } ,
) ,
sheet (
{ id : 'shape-symbol' , title : '图形符号配对' , desc : '根据图形画对应符号' , category : 'focus' , page : 'shapeSymbol' , subpackage : 'focusPages' , icon : '🔗' , img : '/assets/focusEntrance/shape-symbol.png' , ageRange : [ 4 , 6 ] , difficulty : 'basic' , previewBg : '#e8eaf6' , previewText : '△→♠' } ,
{ subcategory : 'focus-visual' , template : 'match-connect' , generator : 'shape-grid' , sortOrder : 28 , generatorConfig : { functionId : 'shape-symbol' } } ,
) ,
sheet (
{ id : 'shape-recognition' , title : '识别形状' , desc : '识别形状,涂一涂' , category : 'focus' , page : 'shape' , subpackage : 'focusPages' , icon : '🔍' , img : '/assets/focusEntrance/shape-recognition.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#fce4ec' , previewText : '△ ○ □' } ,
{ subcategory : 'focus-visual' , template : 'grid-coloring' , generator : 'shape-grid' , sortOrder : 29 , generatorConfig : { functionId : 'shape-recognition' } } ,
) ,
sheet (
{ id : 'position-coloring' , title : '方位涂涂乐' , desc : '观察位置,在方格中涂色' , category : 'focus' , page : 'positionColoring' , subpackage : 'focusPages' , icon : '📍' , img : '/assets/focusEntrance/position-coloring.png' , ageRange : [ 4 , 6 ] , difficulty : 'basic' , previewBg : '#e8f5e9' , previewText : '📍' } ,
{ subcategory : 'focus-grid' , template : 'grid-coloring' , generator : 'shape-grid' , sortOrder : 30 , generatorConfig : { functionId : 'position-coloring' } } ,
) ,
sheet (
{ id : 'color-pattern' , title : '颜色找规律' , desc : '观察颜色规律,在空白图形中涂色' , category : 'focus' , page : 'colorPattern' , subpackage : 'focusPages' , icon : '🎨' , img : '/assets/focusEntrance/color-pattern.png' , ageRange : [ 4 , 6 ] , difficulty : 'basic' , previewBg : '#fff8e1' , previewText : '🎨' } ,
{ subcategory : 'focus-grid' , template : 'grid-coloring' , generator : 'color-pattern' , sortOrder : 31 , generatorConfig : { functionId : 'color-pattern' } } ,
) ,
sheet (
{ id : 'match-connect' , title : '连连看' , desc : '根据物品连一连' , category : 'focus' , page : 'matchConnect' , subpackage : 'focusPages' , icon : '🔗' , img : '/assets/focusEntrance/match-connect.png' , ageRange : [ 3 , 6 ] , difficulty : 'beginner' , previewBg : '#e0f7fa' , previewText : '🔗' } ,
{ subcategory : 'focus-connect' , template : 'match-connect' , generator : 'shape-grid' , sortOrder : 32 , generatorConfig : { functionId : 'match-connect' } } ,
) ,
sheet (
{ id : 'line-recognition' , title : '线条识别' , desc : '认识不同线条,画出颜色对应的线条' , category : 'focus' , page : 'lineRecognition' , subpackage : 'focusPages' , icon : '📏' , img : '/assets/focusEntrance/line-recognition.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#f1f8e9' , previewText : '〰️' } ,
{ subcategory : 'focus-visual' , template : 'tracing-writing' , generator : 'shape-grid' , sortOrder : 33 , generatorConfig : { functionId : 'line-recognition' } } ,
) ,
sheet (
{ id : 'grid-reasoning' , title : '方格推理' , desc : '推理出合并方格并连线' , category : 'focus' , page : 'gridReasoning' , subpackage : 'focusPages' , icon : '🧩' , img : '/assets/focusEntrance/grid-reasoning.png' , ageRange : [ 5 , 7 ] , difficulty : 'intermediate' , previewBg : '#e8eaf6' , previewText : '🧩' } ,
{ subcategory : 'focus-logic' , template : 'special-graphic' , generator : 'shape-grid' , sortOrder : 34 , generatorConfig : { functionId : 'grid-reasoning' } } ,
) ,
sheet (
{ id : 'code-connect' , title : '译码连线' , desc : '按数字顺序将数字对应颜色连线' , category : 'focus' , page : 'codeConnect' , subpackage : 'focusPages' , icon : '🔢' , img : '/assets/focusEntrance/code-connect.png' , ageRange : [ 5 , 7 ] , difficulty : 'intermediate' , previewBg : '#fff3e0' , previewText : '🔢' } ,
{ subcategory : 'focus-connect' , template : 'match-connect' , generator : 'dot-connect' , sortOrder : 35 , generatorConfig : { functionId : 'code-connect' } } ,
) ,
sheet (
{ id : 'dot-connect' , title : '数字点连线' , desc : '按数字顺序连点成图' , category : 'focus' , page : 'dotConnect' , subpackage : 'focusPages' , icon : '🔗' , img : '/assets/focusEntrance/dot-connect.png' , ageRange : [ 3 , 6 ] , difficulty : 'beginner' , previewBg : '#e3f2fd' , previewText : '1→2→3' } ,
{ subcategory : 'focus-connect' , template : 'match-connect' , generator : 'dot-connect' , sortOrder : 36 , generatorConfig : { functionId : 'dot-connect' } } ,
) ,
sheet (
{ id : 'grid-drawing-3x3' , title : '格子仿画 3× 3' , desc : '简单有趣,培养专注力' , category : 'focus' , page : 'gridDrawing' , subpackage : 'focusPages' , icon : '🎨' , mode : '3x3' , img : '/assets/focusEntrance/grid-drawing-3x3.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#fce4ec' , previewText : '▦' } ,
{ subcategory : 'grid-copy' , template : 'grid-exercise' , generator : 'shape-grid' , sortOrder : 37 , generatorConfig : { grid : '3x3' } } ,
) ,
sheet (
{ id : 'grid-drawing-5x5' , title : '格子仿画 5× 5' , desc : '创意挑战,提升观察力' , category : 'focus' , page : 'gridDrawing' , subpackage : 'focusPages' , icon : '🎨' , mode : '5x5' , img : '/assets/focusEntrance/grid-drawing-5x5.png' , ageRange : [ 4 , 6 ] , difficulty : 'basic' , previewBg : '#fce4ec' , previewText : '▦' } ,
{ subcategory : 'grid-copy' , template : 'grid-exercise' , generator : 'shape-grid' , sortOrder : 38 , generatorConfig : { grid : '5x5' } } ,
) ,
sheet (
{ id : 'grid-drawing-7x7' , title : '格子仿画 7× 7' , desc : '大师挑战,锻炼耐心' , category : 'focus' , page : 'gridDrawing' , subpackage : 'focusPages' , icon : '🎨' , mode : '7x7' , img : '/assets/focusEntrance/grid-drawing-7x7.png' , ageRange : [ 5 , 8 ] , difficulty : 'intermediate' , previewBg : '#fce4ec' , previewText : '▦' } ,
{ subcategory : 'grid-copy' , template : 'grid-exercise' , generator : 'shape-grid' , sortOrder : 39 , generatorConfig : { grid : '7x7' } } ,
) ,
sheet (
{ id : 'word-recognition' , title : '识字卡' , desc : '输入或选字生成涂色识字卡(grid/find 模板)' , category : 'chinese' , page : 'index' , subpackage : '' , icon : '📖' , img : '' , ageRange : [ 3 , 6 ] , difficulty : 'beginner' , previewBg : '#fce4ec' , previewText : '大 小' } ,
{ subcategory : 'literacy' , template : 'card-layout' , generator : 'custom' , sortOrder : 40 , generatorConfig : { functionId : 'word-recognition' } , layoutConfig : { . . . L . card } } ,
) ,
sheet (
{ id : 'copybook' , title : '练字帖' , desc : '选字生成田字格笔顺练字帖' , category : 'chinese' , page : 'copyBook' , subpackage : '' , icon : '✏️' , img : '' , ageRange : [ 4 , 7 ] , difficulty : 'basic' , previewBg : '#fff8e1' , previewText : '横竖撇' } ,
{ subcategory : 'copybook' , template : 'tracing-writing' , generator : 'character-tracing' , sortOrder : 41 , generatorConfig : { functionId : 'copybook' } , layoutConfig : { . . . L . trace } } ,
) ,
] ;
// prettier-ignore
export const FOCUS_FUNCTION_TYPES : FocusFunctionType [ ] = [
{ id : 'color-shape-match' , page : 'colorShapeMatch' , title : '根据颜色画图形' , desc : '根据颜色画出对应的图形' , icon : '🎯' , img : '/assets/focusEntrance/color-shape-match.png' } ,
{ id : 'shape-symbol' , page : 'shapeSymbol' , title : '图形符号配对' , desc : '根据图形画对应的符号' , icon : '🔗' , img : '/assets/focusEntrance/shape-symbol.png' } ,
{ id : 'shape-recognition' , page : 'shape' , title : '识别形状' , desc : '识别形状,涂一涂' , icon : '🔍' , img : '/assets/focusEntrance/shape-recognition.png' } ,
{ id : 'position-coloring' , page : 'positionColoring' , title : '方位涂涂乐' , desc : '观察卡片位置,在对应的方格中涂上颜色' , icon : '📍' , img : '/assets/focusEntrance/position-coloring.png' } ,
{ id : 'color-pattern' , page : 'colorPattern' , title : '颜色找规律' , desc : '观察颜色规律,在空白图形中涂上颜色' , icon : '🎨' , img : '/assets/focusEntrance/color-pattern.png' } ,
{ id : 'match-connect' , page : 'matchConnect' , title : '连连看' , desc : '快来根据物品连一连吧!' , icon : '🔗' , img : '/assets/focusEntrance/match-connect.png' } ,
{ id : 'line-recognition' , page : 'lineRecognition' , title : '线条识别' , desc : '认识不同线条,画出颜色对应的线条' , icon : '📏' , img : '/assets/focusEntrance/line-recognition.png' } ,
{ id : 'grid-reasoning' , page : 'gridReasoning' , title : '方格推理' , desc : '仔细观察,推理出合并方格并连线' , icon : '🧩' , img : '/assets/focusEntrance/grid-reasoning.png' } ,
{ id : 'code-connect' , page : 'codeConnect' , title : '译码连线' , desc : '按照数字顺序,将数字对应的颜色连线' , icon : '🔢' , img : '/assets/focusEntrance/code-connect.png' } ,
{ id : 'dot-connect' , page : 'dotConnect' , title : '数字点连线' , desc : '按数字顺序连点' , icon : '🔗' , img : '/assets/focusEntrance/dot-connect.png' } ,
{ id : 'grid-drawing-3x3' , page : 'gridDrawing' , title : '格子仿画 3x3' , desc : '🎯 简单有趣,培养专注力' , icon : '🎨' , mode : '3x3' , img : '/assets/focusEntrance/grid-drawing-3x3.png' } ,
{ id : 'grid-drawing-5x5' , page : 'gridDrawing' , title : '格子仿画 5x5' , desc : '✨ 创意挑战,提升观察力' , icon : '🎨' , mode : '5x5' , img : '/assets/focusEntrance/grid-drawing-5x5.png' } ,
{ id : 'grid-drawing-7x7' , page : 'gridDrawing' , title : '格子仿画 7x7' , desc : '🌟 大师挑战,锻炼耐心' , icon : '🎨' , mode : '7x7' , img : '/assets/focusEntrance/grid-drawing-7x7.png' } ,
] ;
export const MATH_FUNCTION_TYPES : MathFunctionType [ ] = ALL_WORKSHEETS
. filter ( ( w ) = > w . category === 'math' )
. sort ( ( a , b ) = > a . sortOrder - b . sortOrder )
. map ( ( w ) = > ( {
id : w.id ,
page : w.page ,
title : w.title ,
desc : w.desc ,
icon : w.icon ,
img : w.img ,
} ) ) ;
/**
* 统一的 WorksheetType 列表 - 合并所有分类
* 用于新版首页和分类页展示
*/
// prettier-ignore
export const ALL_WORKSHEETS : WorksheetType [ ] = [
// === 数学 ===
{ id : 'number-sort' , title : '数字排序' , desc : '数字排序,写出正确顺序' , category : 'math' , page : 'numberSort' , subpackage : 'mathPages' , icon : '🔢' , img : '/assets/mathEntrance/number-sort.png' , ageRange : [ 4 , 6 ] , difficulty : 'basic' , previewBg : '#fff3e0' , previewText : '1→2→3' } ,
{ id : 'one-digit-addition' , title : '一位数加法' , desc : '通过圆点学习一位数加法运算' , category : 'math' , page : 'oneDigitAddition' , subpackage : 'mathPages' , icon : '➕ ' , img : '/assets/mathEntrance/one-digit-addition.png' , ageRange : [ 4 , 6 ] , difficulty : 'basic' , previewBg : '#e3f2fd' , previewText : '2+3=?' } ,
{ id : 'make-ten' , title : '凑十法练习' , desc : '通过凑十法学习20以内进位加法' , category : 'math' , page : 'makeTen' , subpackage : 'mathPages' , icon : '➕ ' , img : '/assets/mathEntrance/make-ten.png' , ageRange : [ 5 , 7 ] , difficulty : 'intermediate' , previewBg : '#e3f2fd' , previewText : '7+?=10' } ,
{ id : 'break-ten' , title : '破十法练习' , desc : '通过破十法学习20以内退位减法' , category : 'math' , page : 'breakTen' , subpackage : 'mathPages' , icon : '➖ ' , img : '/assets/mathEntrance/break-ten.png' , ageRange : [ 5 , 7 ] , difficulty : 'intermediate' , previewBg : '#e3f2fd' , previewText : '15-8=?' } ,
{ id : 'flat-ten' , title : '平十法练习' , desc : '通过平十法学习20以内退位减法' , category : 'math' , page : 'flatTen' , subpackage : 'mathPages' , icon : '➖ ' , img : '/assets/mathEntrance/flat-ten.png' , ageRange : [ 5 , 7 ] , difficulty : 'intermediate' , previewBg : '#e3f2fd' , previewText : '14-6=?' } ,
{ id : 'borrow-ten' , title : '借十法练习' , desc : '通过借十法学习20以上退位减法' , category : 'math' , page : 'borrowTen' , subpackage : 'mathPages' , icon : '➖ ' , img : '/assets/mathEntrance/borrow-ten.png' , ageRange : [ 6 , 8 ] , difficulty : 'advanced' , previewBg : '#e3f2fd' , previewText : '32-8=?' } ,
{ id : 'number-decompose-20' , title : '20以内分与合' , desc : '把数字分一分,合一合' , category : 'math' , page : 'numberDecompose' , subpackage : 'mathPages' , icon : '🔢' , img : '/assets/mathEntrance/number-decompose-20.png' , ageRange : [ 5 , 7 ] , difficulty : 'basic' , previewBg : '#fff3e0' , previewText : '15=?+?' } ,
{ id : 'number-decompose' , title : '10以内分与合' , desc : '把数字分一分,合一合' , category : 'math' , page : 'numberDecompose' , subpackage : 'mathPages' , icon : '🔢' , img : '/assets/mathEntrance/number-decompose.png' , ageRange : [ 4 , 6 ] , difficulty : 'beginner' , previewBg : '#fff3e0' , previewText : '8=?+?' } ,
{ id : 'number-find' , title : '找数字涂一涂' , desc : '找一找下面相同的数字,涂上颜色' , category : 'math' , page : 'numberFind' , subpackage : 'mathPages' , img : '/assets/mathEntrance/number-find.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#fff3e0' , previewText : '🔍 1 2 3' } ,
{ id : 'number-write' , title : '看数字写一写' , desc : '看数字,按笔画顺序写一写' , category : 'math' , page : 'numberFind' , subpackage : 'mathPages' , img : '/assets/mathEntrance/number-write.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#fff3e0' , previewText : '1 2 3' } ,
{ id : 'number-coloring' , title : '按数字涂颜色' , desc : '按数字给相应的圆圈涂上颜色' , category : 'math' , page : 'countMatch' , subpackage : 'mathPages' , icon : '🎨' , img : '/assets/mathEntrance/number-coloring.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#fce4ec' , previewText : '🎨' } ,
{ id : 'counting-matching' , title : '数一数连一连' , desc : '通过连线配对数字和对应的数量图形' , category : 'math' , page : 'countMatch' , subpackage : 'mathPages' , icon : '🔗' , img : '/assets/mathEntrance/count-match.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#e8f5e9' , previewText : '3↔🍎🍎🍎' } ,
{ id : 'number-object-match' , title : '数物连线' , desc : '连线相同数量的物品和数字' , category : 'math' , page : 'numberObjectMatch' , subpackage : 'mathPages' , icon : '🔗' , img : '/assets/mathEntrance/number-object-match.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#e8f5e9' , previewText : '🔗' } ,
{ id : 'number-object-fill' , title : '数物填写' , desc : '数一数物品数量,填写对应的数字' , category : 'math' , page : 'numberObjectMatch' , subpackage : 'mathPages' , icon : '✏️' , img : '/assets/mathEntrance/number-object-fill.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#e8f5e9' , previewText : '✏️' } ,
{ id : 'counting-select' , title : '数一数选一选' , desc : '数出物品数量,圈出正确答案' , category : 'math' , page : 'countingSelect' , subpackage : 'mathPages' , icon : '✓' , img : '/assets/mathEntrance/counting-select.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#e8f5e9' , previewText : '✓' } ,
{ id : 'counting-fill' , title : '数一数填一填' , desc : '数出物品数量,填写对应的数字' , category : 'math' , page : 'countingSelect' , subpackage : 'mathPages' , icon : '✏️' , img : '/assets/mathEntrance/counting-fill.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#e8f5e9' , previewText : '✏️' } ,
{ id : 'compare' , title : '比大小' , desc : '比较数量大小,在 ⭕️ 中填入>、<、=' , category : 'math' , page : 'compare' , subpackage : 'mathPages' , icon : '⚖️' , img : '/assets/mathEntrance/compare.png' , ageRange : [ 4 , 6 ] , difficulty : 'basic' , previewBg : '#e3f2fd' , previewText : '3 ○ 5' } ,
{ id : 'missing-number' , title : '填缺少的数字' , desc : '在数字序列中找出并填写缺失的数字' , category : 'math' , page : 'missingNumber' , subpackage : 'mathPages' , icon : '❓' , img : '/assets/mathEntrance/missing-number.png' , ageRange : [ 4 , 6 ] , difficulty : 'basic' , previewBg : '#fff3e0' , previewText : '1_3_5' } ,
{ id : 'addition-5' , title : '5以内加法' , desc : '练习5以内的加法运算' , category : 'math' , page : 'addition' , subpackage : 'mathPages' , icon : '➕ ' , img : '/assets/mathEntrance/addition-5.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#e3f2fd' , previewText : '2+1=?' } ,
{ id : 'addition-10' , title : '10以内加法' , desc : '练习10以内的加法运算' , category : 'math' , page : 'addition' , subpackage : 'mathPages' , icon : '➕ ' , img : '/assets/mathEntrance/addition-10.png' , ageRange : [ 4 , 6 ] , difficulty : 'basic' , previewBg : '#e3f2fd' , previewText : '3+5=?' } ,
{ id : 'subtraction-10' , title : '10以内减法' , desc : '练习10以内的减法运算' , category : 'math' , page : 'addition' , subpackage : 'mathPages' , icon : '➖ ' , img : '/assets/mathEntrance/subtraction-10.png' , ageRange : [ 4 , 6 ] , difficulty : 'basic' , previewBg : '#e3f2fd' , previewText : '8-3=?' } ,
{ id : 'addition-subtraction-10' , title : '10以内加减法' , desc : '练习加法和减法混合运算' , category : 'math' , page : 'addition' , subpackage : 'mathPages' , icon : '±' , img : '/assets/mathEntrance/addition-subtraction-10.png' , ageRange : [ 5 , 7 ] , difficulty : 'basic' , previewBg : '#e3f2fd' , previewText : '±' } ,
{ id : 'practice-addition' , title : '加法运算' , desc : '练习10/20/50/100以内加法运算' , category : 'math' , page : 'calculationPractice' , subpackage : 'mathPages' , icon : '➕ ' , img : '/assets/mathEntrance/practice-addition.png' , ageRange : [ 5 , 8 ] , difficulty : 'intermediate' , previewBg : '#e3f2fd' , previewText : '25+18=?' } ,
{ id : 'practice-subtraction' , title : '减法运算' , desc : '练习10/20/50/100以内减法运算' , category : 'math' , page : 'calculationPractice' , subpackage : 'mathPages' , icon : '➖ ' , img : '/assets/mathEntrance/practice-subtraction.png' , ageRange : [ 5 , 8 ] , difficulty : 'intermediate' , previewBg : '#e3f2fd' , previewText : '43-17=?' } ,
{ id : 'practice-mixed' , title : '混合运算' , desc : '练习10/20/50/100以内加减法混合运算' , category : 'math' , page : 'calculationPractice' , subpackage : 'mathPages' , icon : '±' , img : '/assets/mathEntrance/practice-mixed.png' , ageRange : [ 5 , 8 ] , difficulty : 'intermediate' , previewBg : '#e3f2fd' , previewText : '±' } ,
{ id : 'multiplication-table' , title : '九九乘法表' , desc : '学习九九乘法口诀' , category : 'math' , page : 'multiplicationTable' , subpackage : 'mathPages' , icon : '✖️' , img : '/assets/mathEntrance/multiplication-table.png' , ageRange : [ 6 , 8 ] , difficulty : 'intermediate' , previewBg : '#f3e5f5' , previewText : '3× 4=12' } ,
export const FOCUS_FUNCTION_TYPES : FocusFunctionType [ ] = ALL_WORKSHEETS
. filter ( ( w ) = > w . category === 'focus' )
. sort ( ( a , b ) = > a . sortOrder - b . sortOrder )
. map ( ( w ) = > ( {
id : w.id ,
page : w.page ,
title : w.title ,
desc : w.desc ,
icon : w.icon ? ? '・' ,
mode : w.mode ,
img : w.img ,
} ) ) ;
// === 专注力 ===
{ id : 'color-shape-match' , title : '颜色画图形' , desc : '根据颜色画出对应的图形' , category : 'focus' , page : 'colorShapeMatch' , subpackage : 'focusPages' , icon : '🎯' , img : '/assets/focusEntrance/color-shape-match.png' , ageRange : [ 4 , 6 ] , difficulty : 'basic' , previewBg : '#f3e5f5' , previewText : '🎯' } ,
{ id : 'shape-symbol' , title : '图形符号配对' , desc : '根据图形画对应的符号' , category : 'focus' , page : 'shapeSymbol' , subpackage : 'focusPages' , icon : '🔗' , img : '/assets/focusEntrance/shape-symbol.png' , ageRange : [ 4 , 6 ] , difficulty : 'basic' , previewBg : '#e8eaf6' , previewText : '△→♠' } ,
{ id : 'shape-recognition' , title : '识别形状' , desc : '识别形状,涂一涂' , category : 'focus' , page : 'shape' , subpackage : 'focusPages' , icon : '🔍' , img : '/assets/focusEntrance/shape-recognition.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#fce4ec' , previewText : '△ ○ □' } ,
{ id : 'position-coloring' , title : '方位涂涂乐' , desc : '观察卡片位置,在对应的方格中涂上颜色' , category : 'focus' , page : 'positionColoring' , subpackage : 'focusPages' , icon : '📍' , img : '/assets/focusEntrance/position-coloring.png' , ageRange : [ 4 , 6 ] , difficulty : 'basic' , previewBg : '#e8f5e9' , previewText : '📍' } ,
{ id : 'color-pattern' , title : '颜色找规律' , desc : '观察颜色规律,在空白图形中涂上颜色' , category : 'focus' , page : 'colorPattern' , subpackage : 'focusPages' , icon : '🎨' , img : '/assets/focusEntrance/color-pattern.png' , ageRange : [ 4 , 6 ] , difficulty : 'basic' , previewBg : '#fff8e1' , previewText : '🎨' } ,
{ id : 'match-connect' , title : '连连看' , desc : '快来根据物品连一连吧!' , category : 'focus' , page : 'matchConnect' , subpackage : 'focusPages' , icon : '🔗' , img : '/assets/focusEntrance/match-connect.png' , ageRange : [ 3 , 6 ] , difficulty : 'beginner' , previewBg : '#e0f7fa' , previewText : '🔗' } ,
{ id : 'line-recognition' , title : '线条识别' , desc : '认识不同线条,画出颜色对应的线条' , category : 'focus' , page : 'lineRecognition' , subpackage : 'focusPages' , icon : '📏' , img : '/assets/focusEntrance/line-recognition.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#f1f8e9' , previewText : '〰️' } ,
{ id : 'grid-reasoning' , title : '方格推理' , desc : '仔细观察,推理出合并方格并连线' , category : 'focus' , page : 'gridReasoning' , subpackage : 'focusPages' , icon : '🧩' , img : '/assets/focusEntrance/grid-reasoning.png' , ageRange : [ 5 , 7 ] , difficulty : 'intermediate' , previewBg : '#e8eaf6' , previewText : '🧩' } ,
{ id : 'code-connect' , title : '译码连线' , desc : '按照数字顺序,将数字对应的颜色连线' , category : 'focus' , page : 'codeConnect' , subpackage : 'focusPages' , icon : '🔢' , img : '/assets/focusEntrance/code-connect.png' , ageRange : [ 5 , 7 ] , difficulty : 'intermediate' , previewBg : '#fff3e0' , previewText : '🔢' } ,
{ id : 'dot-connect' , title : '数字点连线' , desc : '按数字顺序连点' , category : 'focus' , page : 'dotConnect' , subpackage : 'focusPages' , icon : '🔗' , img : '/assets/focusEntrance/dot-connect.png' , ageRange : [ 3 , 6 ] , difficulty : 'beginner' , previewBg : '#e3f2fd' , previewText : '1→2→3' } ,
{ id : 'grid-drawing-3x3' , title : '格子仿画 3x3' , desc : '简单有趣,培养专注力' , category : 'focus' , page : 'gridDrawing' , subpackage : 'focusPages' , icon : '🎨' , mode : '3x3' , img : '/assets/focusEntrance/grid-drawing-3x3.png' , ageRange : [ 3 , 5 ] , difficulty : 'beginner' , previewBg : '#fce4ec' , previewText : '▦' } ,
{ id : 'grid-drawing-5x5' , title : '格子仿画 5x5' , desc : '创意挑战,提升观察力' , category : 'focus' , page : 'gridDrawing' , subpackage : 'focusPages' , icon : '🎨' , mode : '5x5' , img : '/assets/focusEntrance/grid-drawing-5x5.png' , ageRange : [ 4 , 6 ] , difficulty : 'basic' , previewBg : '#fce4ec' , previewText : '▦' } ,
{ id : 'grid-drawing-7x7' , title : '格子仿画 7x7' , desc : '大师挑战,锻炼耐心' , category : 'focus' , page : 'gridDrawing' , subpackage : 'focusPages' , icon : '🎨' , mode : '7x7' , img : '/assets/focusEntrance/grid-drawing-7x7.png' , ageRange : [ 5 , 8 ] , difficulty : 'intermediate' , previewBg : '#fce4ec' , previewText : '▦' } ,
// === 语文 ===
{ id : 'word-recognition' , title : '识字卡' , desc : '认识汉字,选字生成识字卡' , category : 'chinese' , page : 'index' , subpackage : '' , icon : '📖' , ageRange : [ 3 , 6 ] , difficulty : 'beginner' , previewBg : '#fce4ec' , previewText : '大 小' } ,
{ id : 'copybook' , title : '练字帖' , desc : '选字生成田字格练字帖' , category : 'chinese' , page : 'copyBook' , subpackage : '' , icon : '✏️' , ageRange : [ 4 , 7 ] , difficulty : 'basic' , previewBg : '#fff8e1' , previewText : '横竖撇' } ,
] ;
/**
* 按分类获取题型列表
*/
export function getWorksheetsByCategory ( category : string ) : WorksheetType [ ] {
export function getWorksheetsByCategory ( category : string ) : WorksheetDefinition [ ] {
if ( category === 'all' ) return ALL_WORKSHEETS ;
return ALL_WORKSHEETS . filter ( ( w ) = > w . category === category ) ;
}
/**
* 按年龄范围筛选
*/
export function getWorksheetsByAge ( worksheets : WorksheetType [ ] , age : number ) : WorksheetType [ ] {
export function getWorksheetsByAge < T extends WorksheetType > (
worksheets : readonly T [ ] ,
age : number ,
) : T [ ] {
return worksheets . filter ( ( w ) = > {
if ( ! w . ageRange ) return true ;
return age >= w . ageRange [ 0 ] && age <= w . ageRange [ 1 ] ;
} ) ;
}
/**
* 获取题型的导航路径
*/
export function getWorksheetPath ( worksheet : WorksheetType ) : string {
if ( ! worksheet . page ) return '' ;
if ( worksheet . subpackage ) {
@@ -154,3 +303,7 @@ export function getWorksheetPath(worksheet: WorksheetType): string {
}
return ` /pages/ ${ worksheet . page } / ${ worksheet . page } ` ;
}
export function getWorksheetById ( id : string ) : WorksheetDefinition | undefined {
return ALL_WORKSHEETS . find ( ( w ) = > w . id === id ) ;
}