diff --git a/scripts/add-table-column-control.js b/scripts/add-table-column-control.js new file mode 100644 index 0000000..b29da06 --- /dev/null +++ b/scripts/add-table-column-control.js @@ -0,0 +1,224 @@ +/** + * 批量添加 TableColumnControl 组件的脚本 + * 用于为 stuwork 文件夹下的所有页面添加列显隐控制功能 + */ + +const fs = require('fs') +const path = require('path') + +// 需要处理的目录 +const targetDir = path.join(__dirname, '../src/views/stuwork') + +// 获取所有 index.vue 文件 +function getAllIndexFiles(dir) { + const files = [] + const items = fs.readdirSync(dir, { withFileTypes: true }) + + for (const item of items) { + const fullPath = path.join(dir, item.name) + if (item.isDirectory()) { + const indexPath = path.join(fullPath, 'index.vue') + if (fs.existsSync(indexPath)) { + files.push(indexPath) + } + } + } + + return files +} + +// 检查文件是否已经包含 TableColumnControl +function hasTableColumnControl(content) { + return content.includes('TableColumnControl') || content.includes('table-column-control') +} + +// 提取表格列配置 +function extractTableColumns(content) { + const columns = [] + const columnRegex = /]+)>/g + let match + + while ((match = columnRegex.exec(content)) !== null) { + const attrs = match[1] + const propMatch = attrs.match(/prop=["']([^"']+)["']/) + const labelMatch = attrs.match(/label=["']([^"']+)["']/) + const typeMatch = attrs.match(/type=["']([^"']+)["']/) + const fixedMatch = attrs.match(/fixed=["']([^"']+)["']/) + + if (typeMatch && typeMatch[1] === 'index') { + // 序号列,跳过 + continue + } + + if (labelMatch && labelMatch[1] === '操作') { + // 操作列,标记为 alwaysShow + columns.push({ + prop: '操作', + label: '操作', + alwaysShow: true, + fixed: fixedMatch ? fixedMatch[1] : false + }) + continue + } + + if (propMatch && labelMatch) { + columns.push({ + prop: propMatch[1], + label: labelMatch[1], + alwaysShow: false, + fixed: fixedMatch ? fixedMatch[1] : false + }) + } + } + + return columns +} + +// 添加 TableColumnControl 导入 +function addImport(content) { + if (content.includes("import TableColumnControl")) { + return content + } + + // 查找 import 语句的位置 + const importRegex = /import\s+.*from\s+['"][^'"]+['"]/g + const lastImportMatch = [...content.matchAll(importRegex)].pop() + + if (lastImportMatch) { + const insertPos = lastImportMatch.index + lastImportMatch[0].length + const newImport = "\nimport TableColumnControl from '/@/components/TableColumnControl/index.vue'" + return content.slice(0, insertPos) + newImport + content.slice(insertPos) + } + + return content +} + +// 添加 useRoute 导入 +function addUseRouteImport(content) { + if (content.includes("import.*useRoute")) { + return content + } + + // 查找 vue-router 相关的导入 + const routerImportRegex = /import\s+.*from\s+['"]vue-router['"]/ + if (routerImportRegex.test(content)) { + // 如果已经有 vue-router 导入,添加 useRoute + return content.replace( + /import\s+([^}]+)\s+from\s+['"]vue-router['"]/, + (match, imports) => { + if (imports.includes('useRoute')) { + return match + } + return `import { ${imports.trim()}, useRoute } from 'vue-router'` + } + ) + } else { + // 如果没有 vue-router 导入,添加新的导入 + const importRegex = /import\s+.*from\s+['"]vue['"]/ + const vueImportMatch = content.match(importRegex) + if (vueImportMatch) { + const insertPos = vueImportMatch.index + vueImportMatch[0].length + return content.slice(0, insertPos) + "\nimport { useRoute } from 'vue-router'" + content.slice(insertPos) + } + } + + return content +} + +// 添加 Menu 图标导入 +function addMenuIconImport(content) { + if (content.includes('Menu') && content.includes('@element-plus/icons-vue')) { + return content + } + + // 查找 @element-plus/icons-vue 导入 + const iconImportRegex = /import\s+.*from\s+['"]@element-plus\/icons-vue['"]/ + const iconImportMatch = content.match(iconImportRegex) + + if (iconImportMatch) { + // 如果已经有图标导入,添加 Menu + return content.replace( + /import\s+{([^}]+)}\s+from\s+['"]@element-plus\/icons-vue['"]/, + (match, imports) => { + if (imports.includes('Menu')) { + return match + } + return `import { ${imports.trim()}, Menu } from '@element-plus/icons-vue'` + } + ) + } else { + // 如果没有图标导入,添加新的导入 + const importRegex = /import\s+.*from\s+['"][^'"]+['"]/ + const lastImportMatch = [...content.matchAll(importRegex)].pop() + if (lastImportMatch) { + const insertPos = lastImportMatch.index + lastImportMatch[0].length + return content.slice(0, insertPos) + "\nimport { Menu } from '@element-plus/icons-vue'" + content.slice(insertPos) + } + } + + return content +} + +// 主处理函数 +function processFile(filePath) { + console.log(`处理文件: ${filePath}`) + + let content = fs.readFileSync(filePath, 'utf-8') + + // 检查是否已经包含 TableColumnControl + if (hasTableColumnControl(content)) { + console.log(` 跳过: 已包含 TableColumnControl`) + return false + } + + // 检查是否有 el-table + if (!content.includes('
- + {