const topics = { fractions: { name: 'Дроби', levels: { basic: [ { task: '1/2 + 1/4', answer: 0.75, solution: '2/4 + 1/4 = 3/4' }, { task: '3/5 - 1/5', answer: 0.4, solution: '3/5 - 1/5 = 2/5' } ], intermediate: [ { task: '2/3 × 3/4', answer: 0.5, solution: '6/12 = 1/2' }, { task: '5/6 ÷ 2/3', answer: 1.25, solution: '5/6 × 3/2 = 15/12 = 5/4' } ] } }, percentages: { name: 'Проценты', levels: { basic: [ { task: '20% от 150', answer: 30, solution: '150 × 0.2 = 30' }, { task: '25% от 80', answer: 20, solution: '80 × 0.25 = 20' } ], intermediate: [ { task: 'Число увеличили на 20%. Получилось 180. Найти исходное', answer: 150, solution: 'x × 1.2 = 180; x = 150' } ] } }, powers: { name: 'Степени', levels: { basic: [ { task: '2³', answer: 8 }, { task: '5²', answer: 25 } ], intermediate: [ { task: '2⁴ × 2³', answer: 128, solution: '2⁷ = 128' }, { task: '(3²)³', answer: 729, solution: '3⁶ = 729' } ] } } }; // server.js const express = require('express'); const mongoose = require('mongoose'); const app = express(); // Схема прогресса пользователя const progressSchema = new mongoose.Schema({ userId: String, topic: String, level: Number, correctAnswers: Number, totalAnswers: Number, averageTime: Number, lastActivity: Date, achievements: [String] }); const Progress = mongoose.model('Progress', progressSchema); // API endpoints app.get('/api/tasks/:topic/:level', (req, res) => { const tasks = generateTaskSet(req.params.topic, req.params.level); res.json(tasks); }); app.post('/api/progress', async (req, res) => { const { userId, topic, result } = req.body; const progress = await Progress.findOneAndUpdate( { userId, topic }, { $inc: { correctAnswers: result.correct ? 1 : 0, totalAnswers: 1 }, $set: { lastActivity: new Date() } }, { upsert: true, new: true } ); // Проверка достижений const achievements = checkAchievements(progress); res.json({ progress, achievements }); }); app.get('/api/leaderboard/:topic', async (req, res) => { const leaders = await Progress.find({ topic: req.params.topic }) .sort({ correctAnswers: -1 }) .limit(10); res.json(leaders); });