serv\web-学习历史修改

This commit is contained in:
2025-10-27 13:42:34 +08:00
parent 74880b429e
commit e50de4a277
31 changed files with 3997 additions and 64 deletions

View File

@@ -9,3 +9,4 @@ export { courseApi } from './course';
export { learningTaskApi } from './learning-task';
export { learningRecordApi } from './learning-record';
export { learningPlanApi } from './learning-plan';
export { learningHistoryApi } from './learning-history';

View File

@@ -0,0 +1,204 @@
/**
* @description 学习历史相关API
* @author yslg
* @since 2025-10-27
*/
import { api } from '@/apis/index';
import type {
TbLearningHistory,
LearningHistoryVO,
LearningStatisticsVO,
ResultDomain,
PageDomain,
PageRequest
} from '@/types';
/**
* 学习历史API服务
*/
export const learningHistoryApi = {
/**
* 记录学习历史
* @param learningHistory 学习历史数据
* @returns Promise<ResultDomain<TbLearningHistory>>
*/
async recordLearningHistory(learningHistory: TbLearningHistory): Promise<ResultDomain<TbLearningHistory>> {
const response = await api.post<TbLearningHistory>('/study/history/record', learningHistory, {
showLoading: false // 禁用 loading 动画,避免影响用户体验
} as any);
return response.data;
},
/**
* 批量记录学习历史
* @param historyList 学习历史列表
* @returns Promise<ResultDomain<boolean>>
*/
async batchRecordLearningHistory(historyList: TbLearningHistory[]): Promise<ResultDomain<boolean>> {
const response = await api.post<boolean>('/study/history/batch-record', historyList);
return response.data;
},
/**
* 查询学习历史列表
* @param filter 过滤条件
* @returns Promise<ResultDomain<LearningHistoryVO[]>>
*/
async getLearningHistories(filter?: Partial<TbLearningHistory>): Promise<ResultDomain<LearningHistoryVO[]>> {
const response = await api.post<LearningHistoryVO[]>('/study/history/list', filter || {});
return response.data;
},
/**
* 分页查询学习历史
* @param pageRequest 分页查询请求
* @returns Promise<ResultDomain<PageDomain<LearningHistoryVO>>>
*/
async getLearningHistoriesPage(pageRequest: PageRequest<TbLearningHistory>): Promise<ResultDomain<PageDomain<LearningHistoryVO>>> {
const response = await api.post<PageDomain<LearningHistoryVO>>('/study/history/page', pageRequest);
return response.data;
},
/**
* 根据ID查询学习历史
* @param id 历史记录ID
* @returns Promise<ResultDomain<TbLearningHistory>>
*/
async getLearningHistoryById(id: string): Promise<ResultDomain<TbLearningHistory>> {
const response = await api.get<TbLearningHistory>(`/study/history/${id}`);
return response.data;
},
/**
* 获取当前用户的学习历史
* @param filter 过滤条件
* @returns Promise<ResultDomain<LearningHistoryVO[]>>
*/
async getCurrentUserLearningHistories(filter?: Partial<TbLearningHistory>): Promise<ResultDomain<LearningHistoryVO[]>> {
const response = await api.post<LearningHistoryVO[]>('/study/history/my-histories', filter || {});
return response.data;
},
/**
* 获取当前用户最近的学习历史
* @param limit 限制数量默认10
* @returns Promise<ResultDomain<LearningHistoryVO[]>>
*/
async getRecentLearningHistories(limit = 10): Promise<ResultDomain<LearningHistoryVO[]>> {
const response = await api.get<LearningHistoryVO[]>(`/study/history/recent?limit=${limit}`);
return response.data;
},
/**
* 获取用户学习统计(按时间范围)
* @param userId 用户ID
* @param startTime 开始时间Date对象
* @param endTime 结束时间Date对象
* @returns Promise<ResultDomain<LearningStatisticsVO>>
*/
async getUserLearningStatistics(userId: string, startTime: Date, endTime: Date): Promise<ResultDomain<LearningStatisticsVO>> {
const response = await api.get<LearningStatisticsVO>(
`/study/history/statistics?userId=${userId}&startTime=${startTime.getTime()}&endTime=${endTime.getTime()}`
);
return response.data;
},
/**
* 获取用户学习统计(按周期)
* @param userId 用户ID
* @param periodType 周期类型day/week/month
* @returns Promise<ResultDomain<LearningStatisticsVO>>
*/
async getUserLearningStatisticsByPeriod(userId: string, periodType: 'day' | 'week' | 'month'): Promise<ResultDomain<LearningStatisticsVO>> {
const response = await api.get<LearningStatisticsVO>(`/study/history/statistics/${userId}/${periodType}`);
return response.data;
},
/**
* 获取当前用户的学习统计
* @param periodType 周期类型day/week/month
* @returns Promise<ResultDomain<LearningStatisticsVO>>
*/
async getCurrentUserLearningStatistics(periodType: 'day' | 'week' | 'month'): Promise<ResultDomain<LearningStatisticsVO>> {
const response = await api.get<LearningStatisticsVO>(`/study/history/my-statistics/${periodType}`);
return response.data;
},
/**
* 删除学习历史
* @param id 历史记录ID
* @returns Promise<ResultDomain<boolean>>
*/
async deleteLearningHistory(id: string): Promise<ResultDomain<boolean>> {
const response = await api.delete<boolean>(`/study/history/${id}`);
return response.data;
},
/**
* 批量删除学习历史
* @param ids 历史记录ID列表
* @returns Promise<ResultDomain<boolean>>
*/
async batchDeleteLearningHistories(ids: string[]): Promise<ResultDomain<boolean>> {
const response = await api.delete<boolean>('/study/history/batch', ids);
return response.data;
},
/**
* 简化记录方法 - 观看新闻/资源
* @param userId 用户ID
* @param resourceId 资源ID
* @param duration 学习时长(秒)
* @returns Promise<ResultDomain<TbLearningHistory>>
*/
async recordResourceView(userId: string, resourceId: string, duration: number): Promise<ResultDomain<TbLearningHistory>> {
const learningHistory: TbLearningHistory = {
userID: userId,
resourceType: 1, // 1资源/新闻
resourceID: resourceId,
duration: duration,
deviceType: 'web'
};
return this.recordLearningHistory(learningHistory);
},
/**
* 简化记录方法 - 学习课程
* @param userId 用户ID
* @param courseId 课程ID
* @param chapterId 章节ID可选
* @param nodeId 节点ID可选
* @param duration 学习时长(秒)
* @returns Promise<ResultDomain<TbLearningHistory>>
*/
async recordCourseLearn(
userId: string,
courseId: string,
chapterId?: string,
nodeId?: string,
duration?: number
): Promise<ResultDomain<TbLearningHistory>> {
const learningHistory: TbLearningHistory = {
userID: userId,
resourceType: nodeId ? 4 : (chapterId ? 3 : 2), // 2课程 3章节 4节点
resourceID: nodeId || chapterId || courseId,
courseID: courseId,
chapterID: chapterId,
nodeID: nodeId,
duration: duration || 0,
deviceType: 'web'
};
return this.recordLearningHistory(learningHistory);
},
/**
* 健康检查
* @returns Promise<ResultDomain<string>>
*/
async health(): Promise<ResultDomain<string>> {
const response = await api.get<string>('/study/history/health');
return response.data;
}
};