## 後端改進
- 新增 POST /flashcards/{id}/mastered 簡化API端點
- 實作 MarkWordMasteredAsync 方法,專門處理詞彙掌握
- 修復 GetOrCreateReviewAsync 立即保存新記錄問題
- 使用 2^成功次數 演算法計算下次複習間隔
## 前端整合
- 更新 useReviewSession 支援詞彙級別完成檢測
- 新增 checkWordCompleteAndCorrect 檢查所有測驗項目
- 實作 submitWordCompletion 自動提交詞彙掌握
- 新增 markWordMastered API 方法呼叫簡化端點
- 改用真實後端資料替代靜態測試資料
## 核心功能
- 詞彙所有測驗(flip-card + vocab-choice)完成且全對時自動觸發
- 背景呼叫 /mastered API 更新複習演算法
- Console 顯示詳細掌握訊息和新複習時間
- 容錯設計:API失敗不影響複習流程繼續
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| BaseRepository.cs | ||
| FlashcardRepository.cs | ||
| FlashcardReviewRepository.cs | ||
| IFlashcardRepository.cs | ||
| IFlashcardReviewRepository.cs | ||
| IRepository.cs | ||
| IUserRepository.cs | ||
| README.md | ||
| UserRepository.cs | ||
README.md
Repository 層架構說明
概述
Repository 層負責數據訪問邏輯,提供統一的數據操作介面,遵循 Repository Pattern 和 Unit of Work 模式。
架構結構
Repositories/
├── README.md # 本文檔
├── IRepository.cs # 通用 Repository 介面
├── BaseRepository.cs # Repository 基礎實作
├── IUserRepository.cs # 用戶 Repository 介面
└── UserRepository.cs # 用戶 Repository 實作
核心介面
IRepository - 通用 Repository 介面
提供基礎 CRUD 操作:
GetByIdAsync(int id)- 根據 ID 獲取實體GetAllAsync()- 獲取所有實體AddAsync(T entity)- 新增實體UpdateAsync(T entity)- 更新實體DeleteAsync(int id)- 刪除實體
BaseRepository - Repository 基礎實作
實作通用 Repository 介面,提供:
- Entity Framework Core 集成
- 統一錯誤處理
- 異步操作支持
- 基礎查詢優化
具體 Repository
IUserRepository / UserRepository
專門處理用戶相關數據操作:
- 繼承自
IRepository<User> - 提供用戶特定的查詢方法
- 處理用戶認證相關邏輯
使用方式
依賴注入配置
在 ServiceCollectionExtensions.cs 中註冊:
services.AddScoped(typeof(IRepository<>), typeof(BaseRepository<>));
services.AddScoped<IUserRepository, UserRepository>();
在 Service 中使用
public class SomeService
{
private readonly IUserRepository _userRepository;
public SomeService(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public async Task<User> GetUserAsync(int id)
{
return await _userRepository.GetByIdAsync(id);
}
}
設計原則
- 單一職責:每個 Repository 只負責一個 Entity 的數據訪問
- 介面隔離:提供清晰的介面定義,方便測試和替換實作
- 依賴反轉:Service 層依賴於 Repository 介面,而非具體實作
- 異步優先:所有數據操作都使用異步方法
擴展指南
新增 Repository
- 建立介面檔案:
I{Entity}Repository.cs - 建立實作檔案:
{Entity}Repository.cs - 在 ServiceCollectionExtensions 中註冊
- 更新本文檔
實作範例
// IFlashcardRepository.cs
public interface IFlashcardRepository : IRepository<Flashcard>
{
Task<IEnumerable<Flashcard>> GetByUserIdAsync(int userId);
}
// FlashcardRepository.cs
public class FlashcardRepository : BaseRepository<Flashcard>, IFlashcardRepository
{
public FlashcardRepository(DramaLingDbContext context) : base(context) { }
public async Task<IEnumerable<Flashcard>> GetByUserIdAsync(int userId)
{
return await _context.Flashcards
.Where(f => f.UserId == userId)
.ToListAsync();
}
}
版本: 1.0 最後更新: 2025-09-30 維護者: DramaLing 開發團隊