declare const process: { cwd(): string }; declare function require(name: string): { readFileSync?: (path: string, encoding: string) => string; join?: (...parts: string[]) => string; }; const { readFileSync } = require("node:fs"); const { join } = require("node:path"); if (!readFileSync || !join) { throw new Error("测试运行环境缺少文件读取能力"); } const root = process.cwd(); const pages = [ "RealtimeAttendanceView.vue", "ConfigCenterView.vue", "ReportsView.vue", "OperationLogsView.vue", "UsersView.vue", "CommissionsView.vue", "MonthlyPayrollView.vue", "EmployeesView.vue", "SalaryProfilesView.vue", "OrganizationView.vue", ]; for (const page of pages) { const content = readFileSync(join(root, "src/views", page), "utf-8"); assertNotIncludes(content, "刷新", `${page} 不应展示无业务含义的刷新按钮`); } const realtimeView = readView("RealtimeAttendanceView.vue"); assertIncludes(realtimeView, "同步钉钉"); assertIncludes(realtimeView, "@change=\"loadTodayAttendance\""); assertNotIncludes(realtimeView, "RefreshCw"); const reportsView = readView("ReportsView.vue"); assertIncludes(reportsView, "查询"); assertIncludes(reportsView, "@submit.prevent=\"loadReport\""); assertNotIncludes(reportsView, "RefreshCw"); const configView = readView("ConfigCenterView.vue"); assertIncludes(configView, "恢复默认规则"); assertIncludes(configView, "保存"); assertNotIncludes(configView, "RefreshCw"); const commissionView = readView("CommissionsView.vue"); assertIncludes(commissionView, "导入Excel"); assertIncludes(commissionView, "新增提成"); assertNotIncludes(commissionView, "RefreshCw"); const monthlyView = readView("MonthlyPayrollView.vue"); assertIncludes(monthlyView, "同步钉钉核算"); assertIncludes(monthlyView, "导入 Excel 核算"); assertNotIncludes(monthlyView, "RefreshCw"); const employeesView = readView("EmployeesView.vue"); assertIncludes(employeesView, "新增员工"); assertIncludes(employeesView, "在职员工"); assertNotIncludes(employeesView, "RefreshCw"); const salaryProfilesView = readView("SalaryProfilesView.vue"); assertIncludes(salaryProfilesView, "薪资档案"); assertIncludes(salaryProfilesView, "编辑"); assertNotIncludes(salaryProfilesView, "RefreshCw"); const organizationView = readView("OrganizationView.vue"); assertIncludes(organizationView, "新增部门"); assertIncludes(organizationView, "新增岗位"); assertNotIncludes(organizationView, "RefreshCw"); function readView(filename: string): string { return readFileSync(join(root, "src/views", filename), "utf-8"); } function assertIncludes(content: string, expected: string): void { if (!content.includes(expected)) { throw new Error(`期望包含 ${expected}`); } } function assertNotIncludes(content: string, unexpected: string, message?: string): void { if (content.includes(unexpected)) { throw new Error(message || `不应包含 ${unexpected}`); } }