From 0f8f41057aaa9085a1e3a62fd1c0607553107fbd Mon Sep 17 00:00:00 2001 From: caoxiaozhu Date: Mon, 13 Jul 2026 11:04:08 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E8=BD=AC=E6=8D=A2=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现 DataConvertView 替换占位页,工具页 JSON 转 JSONL 入口跳转到该页面,路由指向真实视图,配套回归脚本。 --- frontend/scripts/regression-data-convert.mjs | 56 ++++ frontend/src/router/index.ts | 2 +- .../views/data-convert/DataConvertView.vue | 305 ++++++++++++++++++ frontend/src/views/tools/ToolsView.vue | 2 +- 4 files changed, 363 insertions(+), 2 deletions(-) create mode 100644 frontend/scripts/regression-data-convert.mjs create mode 100644 frontend/src/views/data-convert/DataConvertView.vue diff --git a/frontend/scripts/regression-data-convert.mjs b/frontend/scripts/regression-data-convert.mjs new file mode 100644 index 0000000..d9b62e0 --- /dev/null +++ b/frontend/scripts/regression-data-convert.mjs @@ -0,0 +1,56 @@ +import assert from 'node:assert/strict' +import { readFile } from 'node:fs/promises' +import { fileURLToPath } from 'node:url' +import path from 'node:path' + +const scriptDir = path.dirname(fileURLToPath(import.meta.url)) +const sourceRoot = path.resolve(scriptDir, '../src') + +const [viewSource, routerSource, toolsSource] = await Promise.all([ + readFile(path.join(sourceRoot, 'views/data-convert/DataConvertView.vue'), 'utf8'), + readFile(path.join(sourceRoot, 'router/index.ts'), 'utf8'), + readFile(path.join(sourceRoot, 'views/tools/ToolsView.vue'), 'utf8'), +]) + +assert.match(viewSource, /JSON 转 JSONL/, '转换页缺少明确的格式标题') +assert.match(viewSource, /class="upload-zone"/, '转换页缺少源文件上传区域') +assert.match(viewSource, /class="converter-form"/, '转换页缺少标准表单区域') +assert.match(viewSource, /class="form-row"/, '转换页缺少输出配置区域') +assert.match(viewSource, /开始转换/, '转换页缺少主操作按钮') +assert.match(viewSource, /当前为 UI 原型/, '转换页没有明确说明 UI 原型范围') +assert.match(viewSource, //, '未接入功能前主操作按钮必须禁用') +assert.match(viewSource, /var\(--primary-color\)/, '转换页没有使用项目主色变量') +assert.match(viewSource, /var\(--el-color-primary-light-9\)/, '转换页没有使用项目主色浅色变量') +assert.doesNotMatch(viewSource, /#1890ff/i, '转换页仍包含未对齐当前主题的旧蓝色') +assert.match(viewSource, /\.converter-panel\s*\{[\s\S]*?width:\s*100%;/, '转换区域没有铺满页面宽度') +assert.match(viewSource, /min-height:\s*calc\(100vh\s*-\s*220px\)/, '转换区域没有铺满页面可用高度') +assert.doesNotMatch(viewSource, /max-width:\s*860px/, '转换区域仍被限制为窄卡片') + +// 当前迭代只允许界面开发,防止误接入文件读取、解析、转换或下载逻辑。 +for (const forbiddenImplementation of [ + /FileReader/, + /\.text\(\)/, + /JSON\.parse/, + /new Blob/, + /createObjectURL/, +]) { + assert.doesNotMatch(viewSource, forbiddenImplementation, 'UI 原型中不应包含实际转换实现') +} + +assert.match( + routerSource, + /path:\s*['"]data-convert['"][\s\S]*?DataConvertView\.vue/, + '数据类型转换路由未接入新页面', +) +assert.doesNotMatch( + routerSource, + /path:\s*['"]data-convert['"][\s\S]{0,180}?PlaceholderView\.vue/, + '数据类型转换路由仍指向占位页', +) +assert.match( + toolsSource, + /id === ['"]json2jsonl['"][\s\S]{0,100}?router\.push\(['"]\/data-convert['"]\)/, + '其他工具中的 JSON 转 JSONL 卡片未接入转换页', +) + +console.log('JSON 转 JSONL UI 原型回归检查通过') diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index 074d94a..7f74203 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -181,7 +181,7 @@ const routes: RouteRecordRaw[] = [ { path: 'data-convert', name: 'data-convert', - component: () => import('@/components/PlaceholderView.vue'), + component: () => import('@/views/data-convert/DataConvertView.vue'), meta: { title: '数据类型转换' }, }, // 系统设置 diff --git a/frontend/src/views/data-convert/DataConvertView.vue b/frontend/src/views/data-convert/DataConvertView.vue new file mode 100644 index 0000000..511ac97 --- /dev/null +++ b/frontend/src/views/data-convert/DataConvertView.vue @@ -0,0 +1,305 @@ + + + + + diff --git a/frontend/src/views/tools/ToolsView.vue b/frontend/src/views/tools/ToolsView.vue index 9e6e5e2..ae4e077 100644 --- a/frontend/src/views/tools/ToolsView.vue +++ b/frontend/src/views/tools/ToolsView.vue @@ -16,7 +16,7 @@ function handleDefaultTool(id: string) { if (id === 'data-generate') { ElMessage.info('数据生成工具开发中...') } else if (id === 'json2jsonl') { - ElMessage.info('JSON转JSONL 工具开发中...') + router.push('/data-convert') } else if (id === 'md-convert') { ElMessage.info('转换Markdown 工具开发中...') }