add fiel
This commit is contained in:
224
scripts/add-table-column-control.js
Normal file
224
scripts/add-table-column-control.js
Normal file
@@ -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 = /<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 }
|
||||
|
||||
Reference in New Issue
Block a user