218 lines
5.8 KiB
JavaScript
218 lines
5.8 KiB
JavaScript
/**
|
|
* 批量添加 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 = /<el-table-column\s+([^>]+)>/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('<el-table')) {
|
|
console.log(` 跳过: 没有 el-table`);
|
|
return false;
|
|
}
|
|
|
|
// 提取表格列配置
|
|
const columns = extractTableColumns(content);
|
|
if (columns.length === 0) {
|
|
console.log(` 跳过: 无法提取表格列配置`);
|
|
return false;
|
|
}
|
|
|
|
console.log(` 找到 ${columns.length} 个列`);
|
|
|
|
// 添加导入
|
|
content = addImport(content);
|
|
content = addUseRouteImport(content);
|
|
content = addMenuIconImport(content);
|
|
|
|
// TODO: 添加其他必要的代码修改
|
|
// 这里需要根据具体页面结构进行更详细的修改
|
|
|
|
// 保存文件
|
|
// fs.writeFileSync(filePath, content, 'utf-8')
|
|
console.log(` 完成: ${filePath}`);
|
|
|
|
return true;
|
|
}
|
|
|
|
// 主函数
|
|
function main() {
|
|
const files = getAllIndexFiles(targetDir);
|
|
console.log(`找到 ${files.length} 个文件`);
|
|
|
|
let processed = 0;
|
|
for (const file of files) {
|
|
if (processFile(file)) {
|
|
processed++;
|
|
}
|
|
}
|
|
|
|
console.log(`\n处理完成: ${processed}/${files.length} 个文件`);
|
|
}
|
|
|
|
if (require.main === module) {
|
|
main();
|
|
}
|
|
|
|
module.exports = { processFile, extractTableColumns };
|