enhance: 专项练习按类别分组(语法/词汇/技能/数与计算/图形几何/应用题等)

This commit is contained in:
hangshuo652
2026-06-29 13:57:05 +08:00
parent 2872589eb2
commit e2bfaf643e
+19 -15
View File
@@ -1031,24 +1031,28 @@ function goPage(p){pg=p;r();}
// === TOPIC GRID (专项练习) === // === TOPIC GRID (专项练习) ===
function renderTopicGrid(){ function renderTopicGrid(){
$('ep').className='exam-picker';$('eh').className='exam-hdr'; $('ep').className='exam-picker';$('eh').className='exam-hdr';
let tps=Object.keys(topicsBySub[sub]||{}); var tps=Object.keys(topicsBySub[sub]||{});
let h='<h3 style="padding:8px 12px;font-size:13px;color:#ffd166;font-family:Orbitron,sans-serif">📚 专项练习 · 选择知识点</h3><div class="mg sh">'; var cats={};
tps.sort().forEach(tp=>{ if(sub==='english'){cats['语法']='冠词,代词,介词,名词复数,情态动词,be动词,比较级,比较级最高级,there be,不定代词,宾语从句,被动语态,句型转换,综合填空,一般现在时,一般过去时,一般将来时,现在进行时,过去进行时,现在完成时,将来时,过去时,进行时'.split(',');cats['词汇与语音']='语音'.split(',');cats['技能']='完形填空,阅读理解,阅读判断,听力,补全对话,连词成句,情景交际,特殊疑问句,疑问词'.split(',');}
let m=mast(sub,tp);let qs=topicsBySub[sub][tp]; if(sub==='math'){cats['数与计算']='分数,分数化小数,分数计算,简算巧算,解方程,竖式计算,脱式计算,单位换算,小数与循环小数,小数点移动,整数读写,整数与小数读写,最大公因数与最小公倍数,整除,质数,质数与因数,化简比,比与比例,按比例分配,百分数,定义新运算,数列规律'.split(',');cats['图形几何']='平面图形,立体图形,组合图形,角度计算,圆柱与圆锥,比例尺'.split(',');cats['应用题']='行程问题,工程问题,浓度问题,鸡兔同笼,年龄问题,逻辑推理,利润与折扣,牛吃草问题,盈亏问题,周期问题,时钟问题,植树问题,最值问题,容斥原理,方阵问题,找规律,列方程'.split(',');cats['统计与概率']='概率,统计图'.split(',');}
let todo=qs.filter(q=>conv[q.id]===undefined).length; if(sub==='chinese'){cats['字词基础']='看拼音写汉字,字音,字音辨析,字音字形,错别字,成语运用,成语故事人物,近义词辨析,近义词反义词,反义词,标点符号,关联词'.split(',');cats['句子表达']='修改病句,病句修改,修辞手法,句子排序'.split(',');cats['文学文化']='古诗文默写,古诗鉴赏,文言文阅读,文学常识,现代文阅读,口语交际,综合性学习'.split(',');}
h+='<div class="mg-item" onclick="startTopic(\''+tp+'\')"><span class="tp">'+tp+'</span><span class="stars">'+m.s+'</span><span class="pct">'+m.lb+(m.p>0?' '+m.p+'%':'')+'</span><span class="sz">'+todo+'/'+qs.length+'</span></div>'; var catMap={};var used=[];
for(var c in cats){if(!cats.hasOwnProperty(c))continue;catMap[c]=cats[c].filter(function(t){return tps.indexOf(t)>=0;});catMap[c].forEach(function(t){used.push(t);});}
var uncat=tps.filter(function(t){return used.indexOf(t)<0;});if(uncat.length)catMap['其他']=uncat;
var cColors={'语法':'#52b788','词汇与语音':'#52b788','技能':'#e63946','数与计算':'#e63946','图形几何':'#ffd166','应用题':'#e63946','统计与概率':'#9147ff','字词基础':'#ffd166','句子表达':'#ffd166','文学文化':'#ffd166','其他':'#888'};
var html='<h3 style="padding:8px 12px;font-size:13px;color:#ffd166;font-family:Orbitron,sans-serif">📚 专项练习 · 选择知识点</h3><div class="mg sh">';
for(var cn in catMap){if(!catMap.hasOwnProperty(cn))continue;var cqs=catMap[cn];if(!cqs.length)continue;
html+='<div style="grid-column:1/-1;font-size:11px;color:'+(cColors[cn]||'#888')+';margin-top:6px;margin-bottom:2px;font-family:Orbitron,sans-serif;letter-spacing:1px">▸ '+cn+'</div>';
cqs.sort().forEach(function(tp){
var m=mast(sub,tp);var qs=topicsBySub[sub][tp];
var todo=qs.filter(function(q){return conv[q.id]===undefined;}).length;
var pctCol=m.p>=80?'#52b788':m.p>=50?'#ffd166':'#e63946';
html+='<div class="mg-item" onclick="startTopic(\''+tp+'\')" style="border-color:'+pctCol+'"><span class="tp">'+tp+'</span><span class="stars">'+m.s+'</span><span class="pct" style="color:'+pctCol+'">'+(m.p>0?m.p+'%':'--')+'</span><span class="sz">'+todo+'/'+qs.length+'</span></div>';
}); });
h+='</div>';
$('mg').className='mg sh';$('mn').innerHTML=h;upd();
} }
function startTopic(tp){ html+='</div>';
selCh[sub]='';let qs=Q.filter(q=>q.sub===sub&&q.topic===tp&&conv[q.id]===undefined); $('mg').className='mg sh';$('mn').innerHTML=html;upd();
if(!qs.length){$('mn').innerHTML='<div class="ni">🎉 该知识点已全部掌握!</div>';upd();return;}
let h='<button class="cf" style="margin:8px 12px;padding:5px 14px;border:none;border-radius:4px;background:#e63946;color:#fff;cursor:pointer;font-size:11px;font-family:Orbitron,sans-serif" onclick="swMode(\'topic\')">← 返回知识点列表</button>';
qs.forEach((q,i)=>{h+=renderCard(q,i,true);});
$('mg').className='mg';$('mn').innerHTML=h;upd();
} }
// === EXAM MODE (模拟考场) ===
function renderExamPicker(){ function renderExamPicker(){
$('ep').className='exam-picker sh';$('eh').className='exam-hdr';$('mg').className='mg'; $('ep').className='exam-picker sh';$('eh').className='exam-hdr';$('mg').className='mg';
$('ep').innerHTML='<button onclick="startExam(5)">🏁 5题</button><button onclick="startExam(10)">🏁 10题</button><button onclick="startExam(20)">🏁 20题</button><button onclick="startExam(40)">🏁 40题</button>'; $('ep').innerHTML='<button onclick="startExam(5)">🏁 5题</button><button onclick="startExam(10)">🏁 10题</button><button onclick="startExam(20)">🏁 20题</button><button onclick="startExam(40)">🏁 40题</button>';