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);
});