信息架构/菜单框架大重构-20260109

This commit is contained in:
Cheng Zhou
2026-01-09 11:19:04 +08:00
parent ba3cf95b8a
commit 9021c7fe2b
188 changed files with 7632 additions and 11658 deletions
+5 -23
View File
@@ -3,7 +3,7 @@
<!-- 概览头部 -->
<div class="home-header">
<div class="header-content">
<h1 class="welcome-title">项目</h1>
<h1 class="welcome-title">项目</h1>
<p class="page-subtitle">当前项目运行状态与关键指标</p>
<p class="study-info">
<span class="study-name">{{ study.currentStudy.name }}</span>
@@ -38,16 +38,6 @@
:icon="Warning"
/>
</div>
<div class="stats-item">
<KpiCard
title="逾期数据问题"
:value="overdueQueries"
unit="项"
subtext="严禁滞留超过 48h"
:loading="loading.overdueQueries"
:icon="QuestionFilled"
/>
</div>
<div class="stats-item">
<KpiCard
title="费用总额"
@@ -61,7 +51,7 @@
<!-- 通知/警告 -->
<el-alert
v-if="overdueAes > 0 || overdueQueries > 0"
v-if="overdueAes > 0"
type="warning"
title="存在逾期未处理事项,请及时关注项目的合规性与进度。"
show-icon
@@ -92,10 +82,10 @@
import { computed, onMounted, ref, watch } from "vue";
import { useAuthStore } from "../store/auth";
import { useStudyStore } from "../store/study";
import { fetchFinanceSummary, fetchOverdueAesCount, fetchOverdueQueriesCount, fetchProgress } from "../api/dashboard";
import { fetchFinanceSummary, fetchOverdueAesCount, fetchProgress } from "../api/dashboard";
import KpiCard from "../components/KpiCard.vue";
import QuickActions from "../components/QuickActions.vue";
import { List, Warning, QuestionFilled, Money } from "@element-plus/icons-vue";
import { List, Warning, Money } from "@element-plus/icons-vue";
import StateEmpty from "../components/StateEmpty.vue";
const auth = useAuthStore();
@@ -104,13 +94,11 @@ const study = useStudyStore();
const progress = ref<any>(null);
const financeSummary = ref<any>(null);
const overdueAes = ref<number>(0);
const overdueQueries = ref<number>(0);
const loading = ref({
progress: false,
finance: false,
overdueAes: false,
overdueQueries: false,
});
const milestoneCompletionRate = computed(() => {
@@ -131,25 +119,20 @@ const loadData = async () => {
loading.value.progress = true;
loading.value.finance = true;
loading.value.overdueAes = true;
loading.value.overdueQueries = true;
try {
const [pRes, fRes, aesRes, dqRes] = await Promise.allSettled([
const [pRes, fRes, aesRes] = await Promise.allSettled([
fetchProgress(studyId),
fetchFinanceSummary(studyId),
fetchOverdueAesCount(studyId),
fetchOverdueQueriesCount(studyId),
]);
if (pRes.status === "fulfilled") progress.value = pRes.value.data;
if (fRes.status === "fulfilled") financeSummary.value = fRes.value.data;
if (aesRes.status === "fulfilled") overdueAes.value = aesRes.value.data?.total ?? 0;
if (dqRes.status === "fulfilled") overdueQueries.value = dqRes.value.data?.total ?? 0;
} finally {
loading.value.progress = false;
loading.value.finance = false;
loading.value.overdueAes = false;
loading.value.overdueQueries = false;
}
};
@@ -157,7 +140,6 @@ const resetData = () => {
progress.value = null;
financeSummary.value = null;
overdueAes.value = 0;
overdueQueries.value = 0;
};
onMounted(() => {