金刚句学习系统

基于间隔重复记忆算法,智能规划学习进度,助您轻松掌握净土经典核心要义

学习新句子

点击下方按钮显示句子内容

今日学习历史

prepare(" SELECT vs.*, s.title as source_title FROM pl_vajra_sentences vs LEFT JOIN pl_sutra s ON vs.source_sutra_id = s.id WHERE vs.difficulty_level BETWEEN ? AND ? AND vs.id NOT IN ( SELECT vajra_id FROM pl_user_learning_progress WHERE user_id = ? AND mastered = 1 ) ORDER BY RAND() LIMIT ? "); $minLevel = max(1, $userLevel - 1); $maxLevel = min(5, $userLevel + 1); $userId = $_SESSION['user_id'] ?? 0; $stmt->bind_param('iiii', $minLevel, $maxLevel, $userId, $limit); $stmt->execute(); $result = $stmt->get_result(); $vajras = []; while ($row = $result->fetch_assoc()) { $vajras[] = $row; } echo json_encode(['success' => true, 'data' => $vajras]); exit; } function getReviewVajras() { $db = getDatabase(); $userId = $_SESSION['user_id'] ?? 0; $stmt = $db->prepare(" SELECT vs.*, ulp.next_review, ulp.review_count FROM pl_user_learning_progress ulp JOIN pl_vajra_sentences vs ON ulp.vajra_id = vs.id WHERE ulp.user_id = ? AND ulp.mastered = 0 AND ulp.next_review <= NOW() ORDER BY ulp.next_review ASC LIMIT 20 "); $stmt->bind_param('i', $userId); $stmt->execute(); $result = $stmt->get_result(); $vajras = []; while ($row = $result->fetch_assoc()) { $vajras[] = $row; } echo json_encode(['success' => true, 'data' => $vajras]); exit; } function handleRecordLearningResult() { $input = json_decode(file_get_contents('php://input'), true); if (!isset($input['vajra_id']) || !isset($input['difficulty'])) { echo json_encode(['success' => false, 'message' => '参数不完整']); exit; } $db = getDatabase(); $userId = $_SESSION['user_id'] ?? 0; // 检查是否已有学习记录 $checkStmt = $db->prepare(" SELECT * FROM pl_user_learning_progress WHERE user_id = ? AND vajra_id = ? "); $checkStmt->bind_param('ii', $userId, $input['vajra_id']); $checkStmt->execute(); $checkResult = $checkStmt->get_result(); if ($checkResult->num_rows > 0) { // 更新现有记录 $row = $checkResult->fetch_assoc(); $reviewCount = $row['review_count'] + 1; // 根据SM-2算法计算下次复习时间 $nextReview = calculateNextReview( $input['difficulty'], $reviewCount, $row['ease_factor'] ); // 更新易度因子 $newEaseFactor = updateEaseFactor($row['ease_factor'], $input['difficulty']); $updateStmt = $db->prepare(" UPDATE pl_user_learning_progress SET review_count = ?, last_reviewed = NOW(), next_review = ?, ease_factor = ?, mastered = CASE WHEN ? = 'easy' AND review_count >= 5 THEN 1 ELSE mastered END WHERE user_id = ? AND vajra_id = ? "); $difficulty = $input['difficulty']; $updateStmt->bind_param( 'isdssii', $reviewCount, $nextReview, $newEaseFactor, $difficulty, $userId, $input['vajra_id'] ); $updateStmt->execute(); } else { // 插入新记录 $nextReview = calculateNextReview($input['difficulty'], 1, 2.5); $insertStmt = $db->prepare(" INSERT INTO pl_user_learning_progress (user_id, vajra_id, review_count, next_review, ease_factor, created_at) VALUES (?, ?, 1, ?, 2.5, NOW()) "); $insertStmt->bind_param('iis', $userId, $input['vajra_id'], $nextReview); $insertStmt->execute(); } echo json_encode(['success' => true, 'message' => '学习记录已保存']); exit; } function calculateNextReview($difficulty, $reviewCount, $easeFactor) { // 基于SM-2算法计算下次复习时间 if ($reviewCount == 1) { $interval = $difficulty == 'easy' ? 1 : $difficulty == 'medium' ? 0.5 : 0.25; } elseif ($reviewCount == 2) { $interval = 1; } else { $interval = round($easeFactor * ($reviewCount - 1)); } $nextDate = new DateTime(); $nextDate->modify("+$interval days"); return $nextDate->format('Y-m-d H:i:s'); } function updateEaseFactor($currentEase, $difficulty) { $newEase = $currentEase; switch ($difficulty) { case 'easy': $newEase += 0.15; break; case 'medium': $newEase += 0.00; break; case 'hard': $newEase -= 0.20; break; } return max(1.3, min($newEase, 2.5)); } function getLearningStatistics() { $db = getDatabase(); $userId = $_SESSION['user_id'] ?? 0; $stats = [ 'today_count' => 0, 'mastered_count' => 0, 'learning_count' => 0, 'streak_days' => 0, 'total_time' => 0 ]; // 获取今日学习数量 $todayStmt = $db->prepare(" SELECT COUNT(*) as count FROM pl_user_learning_log WHERE user_id = ? AND DATE(learned_at) = CURDATE() "); $todayStmt->bind_param('i', $userId); $todayStmt->execute(); $todayResult = $todayStmt->get_result(); $todayData = $todayResult->fetch_assoc(); $stats['today_count'] = $todayData['count'] ?? 0; // 获取已掌握数量 $masteredStmt = $db->prepare(" SELECT COUNT(*) as count FROM pl_user_learning_progress WHERE user_id = ? AND mastered = 1 "); $masteredStmt->bind_param('i', $userId); $masteredStmt->execute(); $masteredResult = $masteredStmt->get_result(); $masteredData = $masteredResult->fetch_assoc(); $stats['mastered_count'] = $masteredData['count'] ?? 0; // 获取学习中数量 $learningStmt = $db->prepare(" SELECT COUNT(*) as count FROM pl_user_learning_progress WHERE user_id = ? AND mastered = 0 "); $learningStmt->bind_param('i', $userId); $learningStmt->execute(); $learningResult = $learningStmt->get_result(); $learningData = $learningResult->fetch_assoc(); $stats['learning_count'] = $learningData['count'] ?? 0; echo json_encode(['success' => true, 'data' => $stats]); exit; } ?>