/** * 修复 lobster 表格列宽塌陷问题,统一添加 lobster-list-table 类并将固定 width 改为弹性 min-width */ const fs = require('fs') const path = require('path') const ROOT = path.join(__dirname, '../src/views/lobster') function walk(dir, files = []) { for (const name of fs.readdirSync(dir)) { const full = path.join(dir, name) if (fs.statSync(full).isDirectory()) walk(full, files) else if (name.endsWith('.vue')) files.push(full) } return files } const COLUMN_FIXES = [ [/label="配置名" prop="configName" width="200"/g, 'label="配置名" prop="configName" min-width="140"'], [/label="关键词" prop="keywords" width="320"/g, 'label="关键词" prop="keywords" min-width="180"'], [/label="敏感词" prop="word" width="220"/g, 'label="敏感词" prop="word" min-width="100"'], [/label="提示词名称" align="center" prop="prompt_name" width="180"/g, 'label="提示词名称" align="center" prop="prompt_name" min-width="120"'], [/label="提示词标识" align="center" prop="prompt_key" width="200"/g, 'label="提示词标识" align="center" prop="prompt_key" min-width="140"'], [/label="提示词名称" align="center" prop="promptName" width="180"/g, 'label="提示词名称" align="center" prop="promptName" min-width="120"'], [/label="提示词标识" align="center" prop="promptKey" width="200"/g, 'label="提示词标识" align="center" prop="promptKey" min-width="140"'], [/label="模型A \(评分\/初审\)" prop="modelA" width="180"/g, 'label="模型A (评分/初审)" prop="modelA" min-width="120"'], [/label="模型B \(重试\/复审\)" prop="modelB" width="180"/g, 'label="模型B (重试/复审)" prop="modelB" min-width="120"'], [/label="模型C \(校验\/终审\)" prop="modelC" width="180"/g, 'label="模型C (校验/终审)" prop="modelC" min-width="120"'], [/label="优化原因" align="center" prop="optimizationReason" show-overflow-tooltip \/>/g, 'label="优化原因" align="center" prop="optimizationReason" min-width="120" show-overflow-tooltip />'], [/label="原始内容" align="center" prop="originalContent" show-overflow-tooltip \/>/g, 'label="原始内容" align="center" prop="originalContent" min-width="160" show-overflow-tooltip />'], [/label="优化后内容" align="center" prop="optimizedContent" show-overflow-tooltip \/>/g, 'label="优化后内容" align="center" prop="optimizedContent" min-width="160" show-overflow-tooltip />'], [/label="客户问题" align="center" prop="customerQuestion" show-overflow-tooltip \/>/g, 'label="客户问题" align="center" prop="customerQuestion" min-width="180" show-overflow-tooltip />'], [/label="销售回复" align="center" prop="salesAnswer" show-overflow-tooltip \/>/g, 'label="销售回复" align="center" prop="salesAnswer" min-width="180" show-overflow-tooltip />'], [/label="消息内容" align="center" prop="content" show-overflow-tooltip \/>/g, 'label="消息内容" align="center" prop="content" min-width="180" show-overflow-tooltip />'], [/label="错误信息" align="center" prop="errorMessage" show-overflow-tooltip \/>/g, 'label="错误信息" align="center" prop="errorMessage" min-width="160" show-overflow-tooltip />'], [/label="API密钥" align="center" prop="apiKey" \/>/g, 'label="API密钥" align="center" prop="apiKey" min-width="120" show-overflow-tooltip />'], [/label="接口名称" align="center" prop="apiName" \/>/g, 'label="接口名称" align="center" prop="apiName" min-width="120" show-overflow-tooltip />'], [/label="Base URL" align="center" prop="baseUrl" show-overflow-tooltip \/>/g, 'label="Base URL" align="center" prop="baseUrl" min-width="160" show-overflow-tooltip />'], [/label="模板名称" align="center" prop="template_name" show-overflow-tooltip \/>/g, 'label="模板名称" align="center" prop="template_name" min-width="140" show-overflow-tooltip />'], [/label="提示词名称" align="center" prop="promptName" show-overflow-tooltip \/>/g, 'label="提示词名称" align="center" prop="promptName" min-width="140" show-overflow-tooltip />'], [/label="节点描述" align="center" prop="node_description" show-overflow-tooltip \/>/g, 'label="节点描述" align="center" prop="node_description" min-width="160" show-overflow-tooltip />'], [/label="当前节点" align="center" prop="currentNodeName" \/>/g, 'label="当前节点" align="center" prop="currentNodeName" min-width="120" show-overflow-tooltip />'], [/prop="handler" label="处理方式" show-overflow-tooltip \/>/g, 'prop="handler" label="处理方式" min-width="160" show-overflow-tooltip />'], [/prop="gapNote" label="差距" show-overflow-tooltip \/>/g, 'prop="gapNote" label="差距" min-width="120" show-overflow-tooltip />'], [/prop="testName" label="测试名称"\/>/g, 'prop="testName" label="测试名称" min-width="120" show-overflow-tooltip/>'], [/prop="originalMessage" label="原始消息" show-overflow-tooltip\/>/g, 'prop="originalMessage" label="原始消息" min-width="160" show-overflow-tooltip/>'], [/prop="variantMessage" label="变体消息" show-overflow-tooltip\/>/g, 'prop="variantMessage" label="变体消息" min-width="160" show-overflow-tooltip/>'], [/prop="title" label="标题" show-overflow-tooltip\/>/g, 'prop="title" label="标题" min-width="140" show-overflow-tooltip/>'], [/prop="description" label="描述" show-overflow-tooltip\/>/g, 'prop="description" label="描述" min-width="180" show-overflow-tooltip/>'], [/label="业务描述" prop="businessDesc" show-overflow-tooltip \/>/g, 'label="业务描述" prop="businessDesc" min-width="160" show-overflow-tooltip />'], [/prop="totalTokens" label="Token消耗" sortable \/>/g, 'prop="totalTokens" label="Token消耗" min-width="100" sortable />'], [/prop="totalCost" label="总费用">/g, 'prop="totalCost" label="总费用" min-width="100">'], [/prop="requestCount" label="请求次数" \/>/g, 'prop="requestCount" label="请求次数" min-width="90" />'] ] function addTableClass(content) { content = content.replace(/lobster-config-table/g, 'lobster-list-table') return content.replace(/]*?)>/g, (match, attrs) => { if (/lobster-list-table/.test(attrs)) return match if (/class="([^"]*)"/.test(attrs)) { return match.replace(/class="([^"]*)"/, 'class="$1 lobster-list-table"') } return `` }) } let changed = 0 for (const file of walk(ROOT)) { let content = fs.readFileSync(file, 'utf8') if (!content.includes('