refactor(frontend): 按需加载页面并清理未使用代码
- 将业务页面路由统一改为动态导入,拆分首屏入口与各功能模块构建产物。 - 将网页端和桌面端布局改为异步组件,避免两套平台布局同时进入初始包。 - 新增 Element Plus 按需安装入口,并通过全局配置组件统一注入中文语言包。 - 提取 API 运行时钩子,在应用启动时注入项目清理、令牌续期和认证失效退出能力。 - 将权限监控面板及地图资源改为延迟加载,补充地图加载状态、失败提示和切换竞态保护。 - 删除已被现有工作流替代的项目成员、接口权限、中心绑定、培训表单及旧项目首页等页面。 - 清理废弃的快捷操作、项目选择、用户选择、FAQ 表单、风险占位组件和旧地图辅助模块。 - 移除未使用的 API 方法、类型、字典、状态机、展示工具、样式和项目详情编辑逻辑。 - 开启 TypeScript 未使用变量与参数检查,并同步收紧相关测试和组件暴露类型。 - 移除未使用的 updater、date-fns 和 Sass 前端依赖,更新锁文件并删除旧 CSS 清洗插件。 - 更新路由、Axios、ETMF、通知、权限监控和桌面布局测试以覆盖重构后的边界。
This commit is contained in:
@@ -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";
|
||||
|
||||
Reference in New Issue
Block a user