/** * 用户学习进度 API */ import { request } from '@/utils/request' // ============ 类型定义 ============ export interface MaterialProgress { material_id: number material_name: string is_completed: boolean progress_percent: number last_position: number study_time: number first_accessed_at: string | null last_accessed_at: string | null completed_at: string | null } export interface CourseProgress { course_id: number course_name: string status: 'not_started' | 'in_progress' | 'completed' progress_percent: number completed_materials: number total_materials: number total_study_time: number first_accessed_at: string | null last_accessed_at: string | null completed_at: string | null materials?: MaterialProgress[] } export interface ProgressSummary { total_courses: number completed_courses: number in_progress_courses: number not_started_courses: number total_study_time: number average_progress: number } export interface MaterialProgressUpdate { progress_percent: number last_position?: number study_time_delta?: number is_completed?: boolean } // ============ API 方法 ============ /** * 获取学习进度摘要 */ export const getProgressSummary = () => { return request.get('/api/v1/progress/summary') } /** * 获取所有课程学习进度 */ export const getAllCourseProgress = (status?: string) => { return request.get('/api/v1/progress/courses', { params: status ? { status } : undefined, }) } /** * 获取指定课程的详细学习进度 */ export const getCourseProgress = (courseId: number) => { return request.get(`/api/v1/progress/courses/${courseId}`) } /** * 更新资料学习进度 */ export const updateMaterialProgress = ( materialId: number, data: MaterialProgressUpdate ) => { return request.post( `/api/v1/progress/materials/${materialId}`, data ) } /** * 标记资料为已完成 */ export const markMaterialComplete = (materialId: number) => { return request.post( `/api/v1/progress/materials/${materialId}/complete` ) } /** * 开始学习课程 */ export const startCourse = (courseId: number) => { return request.post(`/api/v1/progress/courses/${courseId}/start`) } /** * 格式化学习时长 */ export const formatStudyTime = (seconds: number): string => { if (seconds < 60) { return `${seconds}秒` } if (seconds < 3600) { const minutes = Math.floor(seconds / 60) return `${minutes}分钟` } const hours = Math.floor(seconds / 3600) const minutes = Math.floor((seconds % 3600) / 60) return minutes > 0 ? `${hours}小时${minutes}分钟` : `${hours}小时` } /** * 获取进度状态文本 */ export const getProgressStatusText = ( status: 'not_started' | 'in_progress' | 'completed' ): string => { const statusMap = { not_started: '未开始', in_progress: '学习中', completed: '已完成', } return statusMap[status] || status } /** * 获取进度状态颜色 */ export const getProgressStatusType = ( status: 'not_started' | 'in_progress' | 'completed' ): 'info' | 'warning' | 'success' => { const typeMap: Record = { not_started: 'info', in_progress: 'warning', completed: 'success', } return typeMap[status] || 'info' } export default { getProgressSummary, getAllCourseProgress, getCourseProgress, updateMaterialProgress, markMaterialComplete, startCourse, formatStudyTime, getProgressStatusText, getProgressStatusType, }