feat: complete review workflow UI

This commit is contained in:
2026-06-20 09:20:24 +08:00
parent 45ac0a98d1
commit 8ed1d45ae1
9 changed files with 629 additions and 95 deletions
+47 -18
View File
@@ -1,17 +1,19 @@
<script setup lang="ts">
import { computed, onMounted, ref } from "vue";
import request from "@/utils/request";
import { useRouter } from "vue-router";
import { ElMessage } from "element-plus";
import {
getReviewTaskStats,
getTaskReview,
type ReviewFeedItem,
type ReviewTaskStats,
} from "@/api/review";
interface ReviewTask {
taskNum: string;
taskName: string;
reportCount: number | string;
fragmentCount: number | string;
effectiveTime: number | string;
}
const router = useRouter();
const loading = ref(false);
const tasks = ref<ReviewTask[]>([]);
const openingTaskNum = ref("");
const tasks = ref<ReviewTaskStats[]>([]);
const summary = computed(() => ({
totalTasks: tasks.value.length,
@@ -31,19 +33,30 @@ const formatEffectiveTime = (seconds: number | string): string => {
const loadTasks = async () => {
loading.value = true;
try {
const res = await request.get("/review/tasks");
tasks.value = (res?.data || []).map((item: any) => ({
taskNum: item.taskNum,
taskName: item.taskName,
reportCount: item.reportCount ?? 0,
fragmentCount: item.fragmentCount ?? 0,
effectiveTime: item.effectiveTime ?? 0,
}));
const res = await getReviewTaskStats();
tasks.value = res?.data || [];
} finally {
loading.value = false;
}
};
const openTaskReview = async (row: ReviewTaskStats) => {
if (!row.taskNum) return;
openingTaskNum.value = row.taskNum;
try {
const res = await getTaskReview(row.taskNum);
const items: ReviewFeedItem[] = res?.data || [];
const first = items[0];
if (!first) {
ElMessage.info("该任务暂无可复习内容");
return;
}
router.push(`/review/detail/${first.sourceType.toLowerCase()}/${first.id}`);
} finally {
openingTaskNum.value = "";
}
};
onMounted(() => {
loadTasks();
});
@@ -72,7 +85,7 @@ onMounted(() => {
</div>
<article class="surface-card table-card">
<el-table v-loading="loading" :data="tasks" stripe>
<el-table v-loading="loading" :data="tasks" stripe @row-click="openTaskReview">
<el-table-column prop="taskName" label="任务名" min-width="180" />
<el-table-column prop="effectiveTime" label="累计有效学习时长" min-width="150">
<template #default="{ row }">
@@ -81,6 +94,18 @@ onMounted(() => {
</el-table-column>
<el-table-column prop="reportCount" label="学习报告数" min-width="120" />
<el-table-column prop="fragmentCount" label="学习残片数" min-width="120" />
<el-table-column label="操作" width="120">
<template #default="{ row }">
<el-button
text
type="success"
:loading="openingTaskNum === row.taskNum"
@click.stop="openTaskReview(row)"
>
查看记录
</el-button>
</template>
</el-table-column>
</el-table>
</article>
</section>
@@ -125,6 +150,10 @@ onMounted(() => {
padding: 10px;
}
.table-card :deep(.el-table__row) {
cursor: pointer;
}
@media (max-width: 900px) {
.summary-grid {
grid-template-columns: 1fr;