学习进度统计

This commit is contained in:
2025-11-17 13:16:12 +08:00
parent cb401eebe1
commit 4b167058b6
15 changed files with 213 additions and 66 deletions

View File

@@ -113,6 +113,7 @@ interface Props {
width?: string; // Dialog 宽度
articleData?: Resource; // 文章数据Dialog 模式使用)
resourceID?: string; // 资源ID路由模式使用
taskId?: string; // 任务ID路由模式使用
showEditButton?: boolean; // 是否显示编辑按钮
showBackButton?: boolean; // 是否显示返回按钮(路由模式)
backButtonText?: string; // 返回按钮文本
@@ -181,7 +182,7 @@ onMounted(() => {
// 路由模式下,从路由参数加载文章
if (!props.asDialog) {
const articleId = route.query.articleId as string;
const taskId = route.query.taskId as string;
const taskId = props.taskId || (route.query.taskId as string);
// 如果传入了 articleData则不需要从路由加载
if (props.articleData && Object.keys(props.articleData).length > 0) {
@@ -325,15 +326,6 @@ async function loadLearningRecord(resourceID: string) {
}
}
// 生成学习记录的taskId当没有真实taskId时
function generateTaskId(resourceID: string, userID: string): string {
// 使用简短格式确保不超过50字符SA_{resourceID的hash}_{userID的hash}
// SA = Self-study Article
const resourceHash = hashString(resourceID).substring(0, 16);
const userHash = hashString(userID).substring(0, 16);
return `SA_${resourceHash}_${userHash}`; // 长度3 + 16 + 1 + 16 = 36字符
}
// 简单的字符串哈希函数
function hashString(str: string): string {
let hash = 0;
@@ -351,9 +343,9 @@ async function createLearningRecord(resourceID: string) {
if (!userInfo.value?.id) return;
try {
const taskId = route.query.taskId as string;
const taskId = props.taskId || (route.query.taskId as string);
// 如果没有taskId生成一个自学任务ID
const effectiveTaskId = taskId || generateTaskId(resourceID, userInfo.value.id!);
const effectiveTaskId = taskId
const res = await learningRecordApi.createRecord({
userID: userInfo.value.id,
@@ -445,7 +437,7 @@ async function markArticleComplete() {
try {
// 使用learningRecord中保存的taskID可能是真实任务ID或生成的自学ID
const taskId = learningRecord.value.taskID || (route.query.taskId as string);
const taskId = learningRecord.value.taskID || props.taskId || (route.query.taskId as string);
await learningRecordApi.markComplete({
id: learningRecord.value.id,
@@ -547,11 +539,19 @@ async function createHistoryRecord(resourceID: string) {
if (!userInfo.value?.id) return;
try {
const res = await learningHistoryApi.recordResourceView(
userInfo.value.id,
resourceID,
0 // 初始时长为0
);
const taskId = props.taskId || (route.query.taskId as string);
// 直接创建学习历史对象,包含 taskID
const historyData: TbLearningHistory = {
userID: userInfo.value.id,
resourceType: 1, // 1资源/新闻
resourceID: resourceID,
duration: 0,
deviceType: 'web',
taskID: taskId || undefined // 如果没有 taskId传 undefined
};
const res = await learningHistoryApi.recordLearningHistory(historyData);
if (res.success && res.data) {
learningHistory.value = res.data;
@@ -597,7 +597,8 @@ async function saveHistoryRecord() {
const updatedHistory: TbLearningHistory = {
...learningHistory.value,
duration: (learningHistory.value.duration || 0) + duration,
endTime: new Date().toISOString()
endTime: new Date().toISOString(),
taskID: learningHistory.value.taskID // 保持原有的 taskID
};
// 调用API更新学习历史
@@ -654,7 +655,7 @@ function handleBack() {
}
stopLearningTimer();
const taskId = route.query.taskId as string;
const taskId = props.taskId || (route.query.taskId as string);
// 如果有 taskId返回任务详情
if (taskId) {
router.push({