管理数字人客户端的草稿/已发布/已废弃版本。
+| 版本号 | +状态 | +最新 | +文件大小 | +MD5 | +更新日志 | +发布时间 | +操作 | +
|---|---|---|---|---|---|---|---|
| {{ row.version }} | ++ {{ statusOf(row).text }} + | +★— | +{{ digitalHumanVersionFileSizeText(row.fileSize) }} | +{{ row.md5 ? `${row.md5.substring(0, 12)}...` : '—' }} | ++ {{ digitalHumanChangelogShort(row.changelog) }} + | +{{ formatDateTime(row.releasedAt) }} | ++ + + + + | +
| 加载中... | +|||||||
| 暂无版本记录 | +|||||||
上传数字人程序 ZIP 包,系统会自动计算 MD5 并存储到 OSS。上传后状态为草稿,需要手动发布。
@@ -270,10 +294,239 @@ onMounted(load) diff --git a/admin-frontend-vue/src/pages/records/RecordsSoftwareVersionPage.vue b/admin-frontend-vue/src/pages/records/RecordsSoftwareVersionPage.vue index 9cf91f38..eaa0a0d7 100644 --- a/admin-frontend-vue/src/pages/records/RecordsSoftwareVersionPage.vue +++ b/admin-frontend-vue/src/pages/records/RecordsSoftwareVersionPage.vue @@ -1,7 +1,8 @@ -管理客户端更新包版本(用于 /api/version/latest 下发)。
+| 版本号 | +下载链接 | +创建时间 | +操作 | +
|---|---|---|---|
| {{ row.version }} | ++ {{ row.fileUrl }} + — + | +{{ formatDateTime(row.createdAt) }} | ++ 下载 + — + | +
| 加载中... | +|||
| 暂无版本记录 | +|||
上传软件 ZIP 包,系统会自动计算 MD5 并存储到 OSS。
@@ -146,10 +146,153 @@ onMounted(load) diff --git a/admin-frontend-vue/tests/align-column-width.test.ts b/admin-frontend-vue/tests/align-column-width.test.ts index b07a4b60..46b7e025 100644 --- a/admin-frontend-vue/tests/align-column-width.test.ts +++ b/admin-frontend-vue/tests/align-column-width.test.ts @@ -7,8 +7,6 @@ import { readSource } from './helpers.ts' // 例外:DuplicateCheckPage 不动;dialog/表单的 width 不属于表格列。 const PAGES = [ - 'src/pages/records/RecordsDigitalHumanVersionPage.vue', - 'src/pages/records/RecordsSoftwareVersionPage.vue', 'src/pages/tasks/ImageVideoTasksPage.vue', 'src/pages/tasks/ShopDataTasksPage.vue', ] @@ -63,6 +61,8 @@ test('align_column_width_boundary_empty_input', () => { ['src/pages/asin/ProductCategoryPage.vue', 'category-table-scroll'], ['src/pages/shop/ShopKeysPage.vue', 'shop-key-table-scroll'], ['src/pages/shop/ShopManagePage.vue', 'shop-manage-table-scroll'], + ['src/pages/records/RecordsSoftwareVersionPage.vue', 'version-table-scroll'], + ['src/pages/records/RecordsDigitalHumanVersionPage.vue', 'digital-human-version-table-scroll'], ]) { const src = readSource(page) assert.equal(/el-table-column/.test(src), false, `${page} 已像素复刻原生表格,不再有 el-table-column`) diff --git a/admin-frontend-vue/tests/align-digital-human.test.ts b/admin-frontend-vue/tests/align-digital-human.test.ts index f4f7f135..171969ba 100644 --- a/admin-frontend-vue/tests/align-digital-human.test.ts +++ b/admin-frontend-vue/tests/align-digital-human.test.ts @@ -59,13 +59,15 @@ test('align_digital_human_api_download_url', () => { test('align_digital_human_page_wiring', () => { const page = readSource('src/pages/records/RecordsDigitalHumanVersionPage.vue') assert.match(page, /pageSize\s*=\s*20|:page-size="20"/, '分页大小 20') - assert.match(page, /el-pagination/, '分页组件') + assert.match(page, /page-nums/, '数字页码分页(像素复刻旧版)') assert.match(page, /设为最新/, '按钮名对齐“设为最新”') - assert.match(page, /上传(草稿状态)/, '上传按钮名对齐') + assert.match(page, /上传新版本/, '页头上传按钮名对齐') assert.match(page, /上传数字人程序 ZIP 包,系统会自动计算 MD5 并存储到 OSS。上传后状态为草稿,需要手动发布/, '上传弹窗描述对齐') assert.match(page, /正在上传/, '上传进度文案') assert.match(page, /digitalHumanDeleteConfirmText/, '删除确认文案走对齐模型') - assert.match(page, /downloadUrl|fetchDigitalHumanDownloadUrl/, 'RELEASED 下载按钮点击取链接') - assert.match(page, /已废弃/, '状态三态接入') + assert.match(page, /fetchDigitalHumanDownloadUrl/, 'RELEASED 下载按钮点击取链接') + assert.match(page, /digitalHumanStatusDisplay/, '状态走展示层模型') + const display = readSource('src/pages/records/digitalhuman-status-display.ts') + assert.match(display, /已废弃/, '状态三态接入(草稿/已发布/已废弃)') assert.match(page, /digitalHumanChangelogShort/, '更新说明 50 字符截断') }) diff --git a/admin-frontend-vue/tests/align-pagination.test.ts b/admin-frontend-vue/tests/align-pagination.test.ts index c7ad07f8..67dd157d 100644 --- a/admin-frontend-vue/tests/align-pagination.test.ts +++ b/admin-frontend-vue/tests/align-pagination.test.ts @@ -7,32 +7,23 @@ import { readSource } from './helpers.ts' // 菜单管理是树结构(非列表),商品类目树用懒加载+加载更多节点,均豁免。 test('align_pagination_normal_primary_path', () => { - // 商品类目已像素复刻旧版(搜索态旧式分页);保留 EP 分页的剩余列表。 - for (const page of [ - 'src/pages/records/RecordsSoftwareVersionPage.vue', - ]) { - const src = readSource(page) - assert.match(src, /el-pagination/, `${page} 应包含分页组件`) - } + // 软件版本已像素复刻旧版(panel-version 全量无分页);无 EP 分页列表剩余为 0。 + const dh = readSource('src/pages/records/RecordsDigitalHumanVersionPage.vue') + assert.match(dh, /page-nums/, '数字人版本用数字页码分页(像素复刻)') }) test('align_pagination_normal_variant_input', () => { - // 分页组件需含上一页/下一页(prev/next),中文文案由全局 zh-cn locale 渲染。 - for (const page of [ - 'src/pages/records/RecordsSoftwareVersionPage.vue', - ]) { - const src = readSource(page) - assert.match(src, /el-pagination[^>]*layout="[^"]*prev[^"]*next/, `${page} 分页 layout 需含 prev/next`) - } + // 数字人版本数字页码含上一页/下一页。 + const dh = readSource('src/pages/records/RecordsDigitalHumanVersionPage.vue') + assert.match(dh, />上一页<\/button>/, '数字人分页含上一页') + assert.match(dh, />下一页<\/button>/, '数字人分页含下一页') }) test('align_pagination_boundary_empty_input', () => { - // 软件版本为全量拉取,走客户端切片分页(computed 按 page/pageSize 切)。 - for (const page of ['src/pages/records/RecordsSoftwareVersionPage.vue']) { - const src = readSource(page) - assert.match(src, /pagedRows|pageRows|pageItems|pagedItems/, `${page} 应有客户端分页切片`) - assert.match(src, /:data="paged/, `${page} 表格应绑定分页后的数据`) - } + // 数字人版本为全量拉取,走客户端切片分页(computed 按 page/pageSize 切)。 + const dh = readSource('src/pages/records/RecordsDigitalHumanVersionPage.vue') + assert.match(dh, /pagedItems/, '数字人版本应有客户端分页切片') + assert.match(dh, /v-for="row in pagedItems/, '表格应绑定分页后的数据') }) test('align_pagination_boundary_single_item', () => { diff --git a/admin-frontend-vue/tests/align-shop-records-row-buttons.test.ts b/admin-frontend-vue/tests/align-shop-records-row-buttons.test.ts index c53137a8..9d3acf73 100644 --- a/admin-frontend-vue/tests/align-shop-records-row-buttons.test.ts +++ b/admin-frontend-vue/tests/align-shop-records-row-buttons.test.ts @@ -32,12 +32,14 @@ test('align_records_history_thumb_click_opens_preview', () => { assert.doesNotMatch(s, /查看大图/, '无行内「查看大图」按钮') }) -test('align_digital_human_row_buttons_solid', () => { +test('align_digital_human_row_buttons_old_btn', () => { const s = readSource('src/pages/records/RecordsDigitalHumanVersionPage.vue') - assertRowButtonSolid(s, 'release') - assertRowButtonSolid(s, 'setLatest') - assertRowButtonSolid(s, 'download') - assertRowButtonSolid(s, 'remove') + assert.match(s, /class="btn btn-sm"[^>]*@click="release\(row\)"/, '发布用旧版 btn-sm') + assert.match(s, /class="btn btn-sm"[^>]*@click="setLatest\(row\)"/, '设为最新用旧版 btn-sm') + assert.match(s, /class="btn btn-sm btn-secondary"[^>]*@click="download\(row\)"/, '下载用旧版 btn-sm btn-secondary') + assert.match(s, /class="btn btn-sm btn-danger"[^>]*@click="remove\(row\)"/, '删除用旧版 btn-sm btn-danger') + assert.doesNotMatch(s, /el-button[^>]*@click="release/, '行内不再用 EP 按钮') + assert.match(s, /window\.confirm\(text\)/, '确认走原生 confirm 对齐旧版') }) test('align_image_video_detail_and_download_solid', () => {