diff --git a/src/api/studySessions.ts b/src/api/studySessions.ts index a75bde0..084be25 100644 --- a/src/api/studySessions.ts +++ b/src/api/studySessions.ts @@ -36,3 +36,17 @@ export const upsertExpectation = (sessionNum: string, description: string) => { export const getReportDraft = (sessionNum: string) => { return request.get(`/study-sessions/${sessionNum}/report-draft`); }; + +/** 分页查询任务的历史残片 */ +export const getTaskFragments = (taskNum: string, page: number, size: number, keyword?: string) => { + const params: Record = { page, size }; + if (keyword) params.keyword = keyword; + return request.get(`/study-sessions/tasks/${taskNum}/fragments`, params); +}; + +/** 分页查询任务的历史报告 */ +export const getTaskReports = (taskNum: string, page: number, size: number, keyword?: string) => { + const params: Record = { page, size }; + if (keyword) params.keyword = keyword; + return request.get(`/study-sessions/tasks/${taskNum}/reports`, params); +}; diff --git a/src/components/StartTask.vue b/src/components/StartTask.vue index 8720662..8d4962a 100644 --- a/src/components/StartTask.vue +++ b/src/components/StartTask.vue @@ -11,7 +11,7 @@ import { } from "@/api/studySessions"; import { useStudyFragment } from "@/components/composables/fragment"; import { getFragmentsBySession, updateFragments } from "@/api/reportFragments"; -import { getExpectation, getReportDraft, upsertExpectation } from "@/api/studySessions"; +import { getExpectation, getReportDraft, getTaskFragments, getTaskReports, upsertExpectation } from "@/api/studySessions"; import router from "@/router"; const { @@ -44,6 +44,77 @@ const editingFragmentId = ref(null); const editFragmentContent = ref(""); const savingFragment = ref(false); +// 历史学习记录 +const showHistory = ref(false); +const historyTab = ref("fragments"); +const historyKeyword = ref(""); +let historyDebounce: ReturnType | null = null; +const loadingHistory = ref(false); +const historyFragments = ref([]); +const fragmentsTotal = ref(0); +const fragmentsPage = ref(1); +const historyReports = ref([]); +const reportsTotal = ref(0); +const reportsPage = ref(1); +const PAGE_SIZE = 10; + +const loadHistoryFragments = async () => { + loadingHistory.value = true; + try { + const res = await getTaskFragments(taskNum, fragmentsPage.value, PAGE_SIZE, historyKeyword.value || undefined); + const data = res?.data; + historyFragments.value = data?.records || []; + fragmentsTotal.value = data?.total || 0; + } catch { + historyFragments.value = []; + fragmentsTotal.value = 0; + } finally { + loadingHistory.value = false; + } +}; + +const loadHistoryReports = async () => { + loadingHistory.value = true; + try { + const res = await getTaskReports(taskNum, reportsPage.value, PAGE_SIZE, historyKeyword.value || undefined); + const data = res?.data; + historyReports.value = data?.records || []; + reportsTotal.value = data?.total || 0; + } catch { + historyReports.value = []; + reportsTotal.value = 0; + } finally { + loadingHistory.value = false; + } +}; + +const searchHistory = () => { + if (historyDebounce) clearTimeout(historyDebounce); + historyDebounce = setTimeout(() => { + fragmentsPage.value = 1; + reportsPage.value = 1; + if (historyTab.value === "fragments") loadHistoryFragments(); + else loadHistoryReports(); + }, 300); +}; + +const onHistoryTabChange = () => { + fragmentsPage.value = 1; + reportsPage.value = 1; + if (historyTab.value === "fragments") loadHistoryFragments(); + else loadHistoryReports(); +}; + +const onFragmentsPageChange = (p: number) => { + fragmentsPage.value = p; + loadHistoryFragments(); +}; + +const onReportsPageChange = (p: number) => { + reportsPage.value = p; + loadHistoryReports(); +}; + const route = useRoute(); const taskNum = route.params.taskNum as string; @@ -552,6 +623,41 @@ onUnmounted(() => { + +
+
+
+ {{ showHistory ? "▾" : "▸" }} +

📚 历史学习记录

+
+ 展开后查看该任务全部残片与报告 +
+ +