所有 Practice 模块对外暴露的 window.* API 接口,可直接在浏览器控制台或第三方应用中调用。
<script src="/js/syllabus-data.js"></script>
<script src="/js/practice-engine.js"></script>
<script src="/js/collab.js"></script>
来源:js/syllabus-data.js · 版本 v13 · 8 科结构化考纲数据
// 获取 SAT 考纲
var sat = SYLLABUS_DATA.getSubject('sat');
console.log(sat.name, sat.papers.length);
// => "SAT 2"
var topic = SYLLABUS_DATA.getTopic('sat', 'M-Alg-1a');
console.log(topic.name); // => "Linear equations, inequalities & systems"
console.log(topic.weight); // => "8.75%"
var codes = SYLLABUS_DATA.getAllTopicCodes('ap');
console.log(codes.length); // => AP 全部 topic 数量
// SAT 120 题按权重分配
var alloc = SYLLABUS_DATA.allocateQuestionsByWeight('sat', 120);
console.log(alloc['M-Alg-1a']); // => 约 11 题 (8.75% × 120)
来源:js/practice-engine.js · 版本 v6 · 答题 + 错题本 + localStorage 持久化
var data = YZPractice.loadData();
console.log(Object.keys(data.records)); // => ["sat", "act", "ap", ...]
var data = YZPractice.loadData();
data.records.sat['q-1'].correct = true;
YZPractice.saveData(data);
var satRecs = YZPractice.getRecords();
var total = Object.keys(satRecs).length;
var correct = Object.values(satRecs).filter(function(r){ return r.correct; }).length;
console.log('SAT:', correct + '/' + total);
YZPractice.clearSubject(); // 清空当前科目记录
来源:api/ai-chat.js · 诊断 + 解析 + 自适应建议
var recs = YZPractice.getRecords();
var diag = AITutor.diagnose('sat', recs);
console.log(diag.weakTopics); // => [{code:'M-Alg-1a', rate: 0.4}, ...]
console.log(diag.suggestions); // => ["建议复习线性方程组..."]
var explanation = AITutor.explain('q-5', 'sat');
console.log(explanation.answer); // => 正确答案
console.log(explanation.solution); // => 解题步骤
学习连续天数 + 徽章系统
Streak.init('student001');
var done = Streak.todayCount();
if (done < 20) console.log('还差', 20 - done, '题达成今日目标');
var badges = Streak.getBadges();
badges.forEach(function(b) {
console.log(b.name, '·', b.description);
});
基于 SM-2 算法的错题间隔重复调度
SRS.init();
var due = SRS.getDueQuestions('sat');
console.log('需要复习:', due.length, '题');
due.forEach(function(q) {
console.log(q.id, q.topic);
});
TOEFL/IELTS/AP 主观题自动评分
var result = WritingGrader.grade(
'In today's society, education is important because...',
'toefl_integrated'
);
console.log('得分:', result.score);
console.log('反馈:', result.feedback);
console.log('改进建议:', result.suggestions);
SAT/TOEFL/IELTS 核心词汇
var words = Vocab.loadList('sat');
console.log('SAT 核心词汇:', words.length, '个');
console.log(words[0]); // => {word:'abandon', pos:'v.', meaning:'放弃'}
var cards = Vocab.startStudy('toefl', 20);
cards.forEach(function(c) {
console.log(c.word, c.meaning);
});
针对题目/Topic的笔记系统
Notes.addNote('q-5', '这道题考的是线性方程组,注意消元法的步骤。');
Notes.addNote('M-Alg-1a', '核心公式:y = kx + b');
var notes = Notes.getNotes('M-Alg-1a');
notes.forEach(function(n) {
console.log(n.content, '·', new Date(n.ts).toLocaleDateString());
});
var md = Notes.export('markdown');
// 下载为 .md 文件
var blob = new Blob([md], {type:'text/markdown'});
var url = URL.createObjectURL(blob);
window.open(url);
来源:js/collab.js · localStorage 模拟多人协作
var result = Collab.createRoom('SAT 冲刺小队', '小明');
console.log('房间码:', result.code); // => "AB3X9K"
var room = Collab.joinRoom('AB3X9K', '小红');
if (room) console.log('已加入:', room.name);
else console.log('房间码无效');
Collab.sendMsg('AB3X9K', '小明', '大家今天刷了多少题?');
var lb = Collab.getLeaderboard('AB3X9K');
lb.forEach(function(u, i) {
console.log(i+1, u.name, u.correct+'/'+u.total, u.rate+'%');
});
MCP(Model Context Protocol)是一种让 AI 助手能够调用外部工具/API 的协议。通过 MCP,你可以将 Practice 的所有 API 暴露给 AI 助手(如 TRAE、Claude Desktop 等),让 AI 能够直接操作学习系统。
window.SYLLABUS_DATA、window.YZPractice 等对象的方法映射为 MCP 工具。YZPractice.getRecords()。{
"mcpServers": {
"practice": {
"command": "node",
"args": ["mcp-practice-server.js"],
"env": {
"PRACTICE_DATA_KEY": "yz_practice_data"
}
}
}
}
// AI 调用示例(自然语言 → API):
// 用户:"帮我看看学生 sat_001 的 SAT 表现如何?"
// AI 自动调用:
// 1. YZPractice.loadData() → 获取全部数据
// 2. SYLLABUS_DATA.getSubject('sat') → 获取 SAT 考纲结构
// 3. 计算正确率并生成报告