fix-lobster-table-layout.js 6.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /**
  2. * 修复 lobster 表格列宽塌陷问题,统一添加 lobster-list-table 类并将固定 width 改为弹性 min-width
  3. */
  4. const fs = require('fs')
  5. const path = require('path')
  6. const ROOT = path.join(__dirname, '../src/views/lobster')
  7. function walk(dir, files = []) {
  8. for (const name of fs.readdirSync(dir)) {
  9. const full = path.join(dir, name)
  10. if (fs.statSync(full).isDirectory()) walk(full, files)
  11. else if (name.endsWith('.vue')) files.push(full)
  12. }
  13. return files
  14. }
  15. const COLUMN_FIXES = [
  16. [/label="配置名" prop="configName" width="200"/g, 'label="配置名" prop="configName" min-width="140"'],
  17. [/label="关键词" prop="keywords" width="320"/g, 'label="关键词" prop="keywords" min-width="180"'],
  18. [/label="敏感词" prop="word" width="220"/g, 'label="敏感词" prop="word" min-width="100"'],
  19. [/label="提示词名称" align="center" prop="prompt_name" width="180"/g, 'label="提示词名称" align="center" prop="prompt_name" min-width="120"'],
  20. [/label="提示词标识" align="center" prop="prompt_key" width="200"/g, 'label="提示词标识" align="center" prop="prompt_key" min-width="140"'],
  21. [/label="提示词名称" align="center" prop="promptName" width="180"/g, 'label="提示词名称" align="center" prop="promptName" min-width="120"'],
  22. [/label="提示词标识" align="center" prop="promptKey" width="200"/g, 'label="提示词标识" align="center" prop="promptKey" min-width="140"'],
  23. [/label="模型A \(评分\/初审\)" prop="modelA" width="180"/g, 'label="模型A (评分/初审)" prop="modelA" min-width="120"'],
  24. [/label="模型B \(重试\/复审\)" prop="modelB" width="180"/g, 'label="模型B (重试/复审)" prop="modelB" min-width="120"'],
  25. [/label="模型C \(校验\/终审\)" prop="modelC" width="180"/g, 'label="模型C (校验/终审)" prop="modelC" min-width="120"'],
  26. [/label="优化原因" align="center" prop="optimizationReason" show-overflow-tooltip \/>/g, 'label="优化原因" align="center" prop="optimizationReason" min-width="120" show-overflow-tooltip />'],
  27. [/label="原始内容" align="center" prop="originalContent" show-overflow-tooltip \/>/g, 'label="原始内容" align="center" prop="originalContent" min-width="160" show-overflow-tooltip />'],
  28. [/label="优化后内容" align="center" prop="optimizedContent" show-overflow-tooltip \/>/g, 'label="优化后内容" align="center" prop="optimizedContent" min-width="160" show-overflow-tooltip />'],
  29. [/label="客户问题" align="center" prop="customerQuestion" show-overflow-tooltip \/>/g, 'label="客户问题" align="center" prop="customerQuestion" min-width="180" show-overflow-tooltip />'],
  30. [/label="销售回复" align="center" prop="salesAnswer" show-overflow-tooltip \/>/g, 'label="销售回复" align="center" prop="salesAnswer" min-width="180" show-overflow-tooltip />'],
  31. [/label="消息内容" align="center" prop="content" show-overflow-tooltip \/>/g, 'label="消息内容" align="center" prop="content" min-width="180" show-overflow-tooltip />'],
  32. [/label="错误信息" align="center" prop="errorMessage" show-overflow-tooltip \/>/g, 'label="错误信息" align="center" prop="errorMessage" min-width="160" show-overflow-tooltip />'],
  33. [/label="API密钥" align="center" prop="apiKey" \/>/g, 'label="API密钥" align="center" prop="apiKey" min-width="120" show-overflow-tooltip />'],
  34. [/label="接口名称" align="center" prop="apiName" \/>/g, 'label="接口名称" align="center" prop="apiName" min-width="120" show-overflow-tooltip />'],
  35. [/label="Base URL" align="center" prop="baseUrl" show-overflow-tooltip \/>/g, 'label="Base URL" align="center" prop="baseUrl" min-width="160" show-overflow-tooltip />'],
  36. [/label="模板名称" align="center" prop="template_name" show-overflow-tooltip \/>/g, 'label="模板名称" align="center" prop="template_name" min-width="140" show-overflow-tooltip />'],
  37. [/label="提示词名称" align="center" prop="promptName" show-overflow-tooltip \/>/g, 'label="提示词名称" align="center" prop="promptName" min-width="140" show-overflow-tooltip />'],
  38. [/label="节点描述" align="center" prop="node_description" show-overflow-tooltip \/>/g, 'label="节点描述" align="center" prop="node_description" min-width="160" show-overflow-tooltip />'],
  39. [/label="当前节点" align="center" prop="currentNodeName" \/>/g, 'label="当前节点" align="center" prop="currentNodeName" min-width="120" show-overflow-tooltip />'],
  40. [/prop="handler" label="处理方式" show-overflow-tooltip \/>/g, 'prop="handler" label="处理方式" min-width="160" show-overflow-tooltip />'],
  41. [/prop="gapNote" label="差距" show-overflow-tooltip \/>/g, 'prop="gapNote" label="差距" min-width="120" show-overflow-tooltip />'],
  42. [/prop="testName" label="测试名称"\/>/g, 'prop="testName" label="测试名称" min-width="120" show-overflow-tooltip/>'],
  43. [/prop="originalMessage" label="原始消息" show-overflow-tooltip\/>/g, 'prop="originalMessage" label="原始消息" min-width="160" show-overflow-tooltip/>'],
  44. [/prop="variantMessage" label="变体消息" show-overflow-tooltip\/>/g, 'prop="variantMessage" label="变体消息" min-width="160" show-overflow-tooltip/>'],
  45. [/prop="title" label="标题" show-overflow-tooltip\/>/g, 'prop="title" label="标题" min-width="140" show-overflow-tooltip/>'],
  46. [/prop="description" label="描述" show-overflow-tooltip\/>/g, 'prop="description" label="描述" min-width="180" show-overflow-tooltip/>'],
  47. [/label="业务描述" prop="businessDesc" show-overflow-tooltip \/>/g, 'label="业务描述" prop="businessDesc" min-width="160" show-overflow-tooltip />'],
  48. [/prop="totalTokens" label="Token消耗" sortable \/>/g, 'prop="totalTokens" label="Token消耗" min-width="100" sortable />'],
  49. [/prop="totalCost" label="总费用">/g, 'prop="totalCost" label="总费用" min-width="100">'],
  50. [/prop="requestCount" label="请求次数" \/>/g, 'prop="requestCount" label="请求次数" min-width="90" />']
  51. ]
  52. function addTableClass(content) {
  53. content = content.replace(/lobster-config-table/g, 'lobster-list-table')
  54. return content.replace(/<el-table(\s[^>]*?)>/g, (match, attrs) => {
  55. if (/lobster-list-table/.test(attrs)) return match
  56. if (/class="([^"]*)"/.test(attrs)) {
  57. return match.replace(/class="([^"]*)"/, 'class="$1 lobster-list-table"')
  58. }
  59. return `<el-table class="lobster-list-table"${attrs}>`
  60. })
  61. }
  62. let changed = 0
  63. for (const file of walk(ROOT)) {
  64. let content = fs.readFileSync(file, 'utf8')
  65. if (!content.includes('<el-table')) continue
  66. const original = content
  67. content = addTableClass(content)
  68. for (const [pattern, replacement] of COLUMN_FIXES) {
  69. content = content.replace(pattern, replacement)
  70. }
  71. if (content !== original) {
  72. fs.writeFileSync(file, content, 'utf8')
  73. changed++
  74. console.log('updated:', path.relative(path.join(__dirname, '..'), file))
  75. }
  76. }
  77. console.log('done, files updated:', changed)