refactor(frontend): 按需加载页面并清理未使用代码
Client Quality Gates / Shared client and Web (push) Has been cancelled
Client Quality Gates / macOS Desktop (push) Has been cancelled

- 将业务页面路由统一改为动态导入,拆分首屏入口与各功能模块构建产物。

- 将网页端和桌面端布局改为异步组件,避免两套平台布局同时进入初始包。

- 新增 Element Plus 按需安装入口,并通过全局配置组件统一注入中文语言包。

- 提取 API 运行时钩子,在应用启动时注入项目清理、令牌续期和认证失效退出能力。

- 将权限监控面板及地图资源改为延迟加载,补充地图加载状态、失败提示和切换竞态保护。

- 删除已被现有工作流替代的项目成员、接口权限、中心绑定、培训表单及旧项目首页等页面。

- 清理废弃的快捷操作、项目选择、用户选择、FAQ 表单、风险占位组件和旧地图辅助模块。

- 移除未使用的 API 方法、类型、字典、状态机、展示工具、样式和项目详情编辑逻辑。

- 开启 TypeScript 未使用变量与参数检查,并同步收紧相关测试和组件暴露类型。

- 移除未使用的 updater、date-fns 和 Sass 前端依赖,更新锁文件并删除旧 CSS 清洗插件。

- 更新路由、Axios、ETMF、通知、权限监控和桌面布局测试以覆盖重构后的边界。
This commit is contained in:
Cheng Zhou
2026-07-16 14:58:47 +08:00
parent 1d26646a96
commit 6b55c18610
65 changed files with 345 additions and 3639 deletions
+53 -53
View File
@@ -7,65 +7,65 @@ import { findFirstAccessibleProjectPath, getProjectRoutePermission, hasProjectPe
import { fetchStudies, fetchStudyDetail } from "../api/studies";
import { fetchApiEndpointPermissions } from "../api/projectPermissions";
import Layout from "../components/Layout.vue";
import Login from "../views/Login.vue";
import Register from "../views/Register.vue";
import ForgotPassword from "../views/ForgotPassword.vue";
import DesktopServerSettings from "../views/DesktopServerSettings.vue";
import DesktopProjectEntry from "../views/DesktopProjectEntry.vue";
import DesktopSessionRestore from "../views/DesktopSessionRestore.vue";
import WebWorkbenchEntry from "../views/WebWorkbenchEntry.vue";
import StudyHome from "../views/StudyHome.vue";
import FaqDetail from "../views/FaqDetail.vue";
import AuditLogs from "../views/admin/AuditLogs.vue";
import AdminUsers from "../views/admin/Users.vue";
import AdminProjects from "../views/admin/Projects.vue";
import AdminSites from "../views/admin/Sites.vue";
import PermissionManagement from "../views/admin/PermissionManagement.vue";
import SystemMonitoringPage from "../views/admin/SystemMonitoringPage.vue";
import EmailSettings from "../views/admin/EmailSettings.vue";
import ProjectDetail from "../views/admin/ProjectDetail.vue";
import ProfileSettings from "../views/ProfileSettings.vue";
import ProjectOverview from "../views/ia/ProjectOverview.vue";
import ProjectMilestones from "../views/ia/ProjectMilestones.vue";
import FeeContracts from "../views/fees/ContractFees.vue";
import FeeContractDetail from "../views/fees/ContractFeeDetail.vue";
import DrugShipments from "../views/ia/DrugShipments.vue";
import ShipmentDetail from "../views/drug/ShipmentDetail.vue";
import MaterialEquipment from "../views/ia/MaterialEquipment.vue";
import MaterialEquipmentDetail from "../views/materials/MaterialEquipmentDetail.vue";
import DocumentList from "../views/documents/DocumentList.vue";
import DocumentDetail from "../views/documents/DocumentDetail.vue";
import OfficePreviewWorkspace from "../views/OfficePreviewWorkspace.vue";
import StartupFeasibilityEthics from "../views/ia/StartupFeasibilityEthics.vue";
import StartupMeetingAuth from "../views/ia/StartupMeetingAuth.vue";
import SubjectManagement from "../views/ia/SubjectManagement.vue";
import RiskIssueSae from "../views/ia/RiskIssueSae.vue";
import RiskIssuePd from "../views/ia/RiskIssuePd.vue";
import RiskIssueMonitoringVisits from "../views/ia/RiskIssueMonitoringVisits.vue";
import EtmfPlaceholder from "../views/ia/EtmfPlaceholder.vue";
import KnowledgeMedicalConsult from "../views/ia/KnowledgeMedicalConsult.vue";
import Precautions from "../views/ia/Precautions.vue";
import KnowledgeSupportFiles from "../views/ia/KnowledgeSupportFiles.vue";
import KnowledgeInstructionFiles from "../views/ia/KnowledgeInstructionFiles.vue";
import CollaborationLibrary from "../views/knowledge/CollaborationLibrary.vue";
import CollaborationWorkspace from "../views/knowledge/CollaborationWorkspace.vue";
import CollaborationShareWorkspace from "../views/knowledge/CollaborationShareWorkspace.vue";
import FeasibilityForm from "../views/startup/FeasibilityForm.vue";
import FeasibilityDetail from "../views/startup/FeasibilityDetail.vue";
import EthicsForm from "../views/startup/EthicsForm.vue";
import EthicsDetail from "../views/startup/EthicsDetail.vue";
import KickoffForm from "../views/startup/KickoffForm.vue";
import KickoffDetail from "../views/startup/KickoffDetail.vue";
import TrainingDetail from "../views/startup/TrainingDetail.vue";
import PrecautionForm from "../views/knowledge/PrecautionForm.vue";
import PrecautionDetail from "../views/knowledge/PrecautionDetail.vue";
import SubjectForm from "../views/subjects/SubjectForm.vue";
import SubjectDetail from "../views/subjects/SubjectDetail.vue";
import { TEXT } from "../locales";
import { resolveDesktopRouteRedirect } from "./desktopGuard";
import { isTauriRuntime } from "../runtime";
import { DESKTOP_SESSION_RESTORE_PATH, shouldPreserveDesktopSessionOnAuthCheckFailure } from "../session/authRecovery";
const Login = () => import("../views/Login.vue");
const Register = () => import("../views/Register.vue");
const ForgotPassword = () => import("../views/ForgotPassword.vue");
const DesktopServerSettings = () => import("../views/DesktopServerSettings.vue");
const DesktopProjectEntry = () => import("../views/DesktopProjectEntry.vue");
const DesktopSessionRestore = () => import("../views/DesktopSessionRestore.vue");
const WebWorkbenchEntry = () => import("../views/WebWorkbenchEntry.vue");
const FaqDetail = () => import("../views/FaqDetail.vue");
const AuditLogs = () => import("../views/admin/AuditLogs.vue");
const AdminUsers = () => import("../views/admin/Users.vue");
const AdminProjects = () => import("../views/admin/Projects.vue");
const AdminSites = () => import("../views/admin/Sites.vue");
const PermissionManagement = () => import("../views/admin/PermissionManagement.vue");
const SystemMonitoringPage = () => import("../views/admin/SystemMonitoringPage.vue");
const EmailSettings = () => import("../views/admin/EmailSettings.vue");
const ProjectDetail = () => import("../views/admin/ProjectDetail.vue");
const ProjectOverview = () => import("../views/ia/ProjectOverview.vue");
const ProjectMilestones = () => import("../views/ia/ProjectMilestones.vue");
const FeeContracts = () => import("../views/fees/ContractFees.vue");
const FeeContractDetail = () => import("../views/fees/ContractFeeDetail.vue");
const DrugShipments = () => import("../views/ia/DrugShipments.vue");
const ShipmentDetail = () => import("../views/drug/ShipmentDetail.vue");
const MaterialEquipment = () => import("../views/ia/MaterialEquipment.vue");
const MaterialEquipmentDetail = () => import("../views/materials/MaterialEquipmentDetail.vue");
const DocumentList = () => import("../views/documents/DocumentList.vue");
const DocumentDetail = () => import("../views/documents/DocumentDetail.vue");
const OfficePreviewWorkspace = () => import("../views/OfficePreviewWorkspace.vue");
const StartupFeasibilityEthics = () => import("../views/ia/StartupFeasibilityEthics.vue");
const StartupMeetingAuth = () => import("../views/ia/StartupMeetingAuth.vue");
const SubjectManagement = () => import("../views/ia/SubjectManagement.vue");
const RiskIssueSae = () => import("../views/ia/RiskIssueSae.vue");
const RiskIssuePd = () => import("../views/ia/RiskIssuePd.vue");
const RiskIssueMonitoringVisits = () => import("../views/ia/RiskIssueMonitoringVisits.vue");
const EtmfPlaceholder = () => import("../views/ia/EtmfPlaceholder.vue");
const KnowledgeMedicalConsult = () => import("../views/ia/KnowledgeMedicalConsult.vue");
const Precautions = () => import("../views/ia/Precautions.vue");
const KnowledgeSupportFiles = () => import("../views/ia/KnowledgeSupportFiles.vue");
const KnowledgeInstructionFiles = () => import("../views/ia/KnowledgeInstructionFiles.vue");
const CollaborationLibrary = () => import("../views/knowledge/CollaborationLibrary.vue");
const CollaborationWorkspace = () => import("../views/knowledge/CollaborationWorkspace.vue");
const CollaborationShareWorkspace = () => import("../views/knowledge/CollaborationShareWorkspace.vue");
const FeasibilityForm = () => import("../views/startup/FeasibilityForm.vue");
const FeasibilityDetail = () => import("../views/startup/FeasibilityDetail.vue");
const EthicsForm = () => import("../views/startup/EthicsForm.vue");
const EthicsDetail = () => import("../views/startup/EthicsDetail.vue");
const KickoffForm = () => import("../views/startup/KickoffForm.vue");
const KickoffDetail = () => import("../views/startup/KickoffDetail.vue");
const TrainingDetail = () => import("../views/startup/TrainingDetail.vue");
const PrecautionForm = () => import("../views/knowledge/PrecautionForm.vue");
const PrecautionDetail = () => import("../views/knowledge/PrecautionDetail.vue");
const SubjectForm = () => import("../views/subjects/SubjectForm.vue");
const SubjectDetail = () => import("../views/subjects/SubjectDetail.vue");
const SYSTEM_PERMISSION_READ = "system:permissions:read";
const SYSTEM_PERMISSION_PROJECT_CONFIG = "system:permissions:project_config";
const WEB_WORKBENCH_ENTRY_PATH = "/workbench";