This commit is contained in:
2026-01-22 13:38:10 +08:00
parent b350322626
commit 313fe64475
151 changed files with 13060 additions and 4411 deletions

View 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 }