This commit is contained in:
2026-09-20 21:52:12 +08:00
parent 6e0144d7cd
commit 1cc8ae44c5
6 changed files with 82 additions and 42 deletions
@@ -24,4 +24,12 @@ describe('PDA release workbench', () => {
expect(page).toContain('row.current')
expect(page).toContain('ElMessageBox.confirm')
})
it('uses the standard dense list workspace without repeating the route title', () => {
expect(page).toContain('class="surface-panel table-panel pda-release-panel"')
expect(page).toContain('<template #toolbar-start>')
expect(page).toContain('<template #toolbar-actions>')
expect(page).toContain('class="pda-release-actions density-actions"')
expect(page).not.toContain('<h1>PDA版本</h1>')
})
})
@@ -119,38 +119,32 @@ function download(row: PdaRelease) {
</script>
<template>
<AdminPage class="admin-density pda-releases-page" spacing="compact">
<AdminPage class="admin-density pda-releases-page">
<ListPageLayout aria-label="PDA版本">
<template #toolbar>
<div class="pda-release-toolbar">
<div>
<h1>PDA版本</h1>
<el-radio-group v-model="app" aria-label="选择PDA应用">
<section class="surface-panel table-panel pda-release-panel" :aria-busy="loading">
<el-alert v-if="error" class="pda-release-error" type="error" :title="error" show-icon :closable="false" />
<DataTable :data="rows" :columns="columns" :loading="loading" row-key="id" border stripe empty-text="暂无版本记录">
<template #toolbar-start>
<div class="pda-release-context">
<el-radio-group v-model="app" size="small" aria-label="选择PDA应用">
<el-radio-button value="domestic">国内 PDA</el-radio-button>
<el-radio-button value="overseas">海外 PDA</el-radio-button>
</el-radio-group>
<dl class="pda-release-current">
<div><dt>当前 APK</dt><dd>{{ currentApk ? `${currentApk.versionName} (${currentApk.versionCode})` : '尚未发布' }}</dd></div>
<div><dt>当前 WGT</dt><dd>{{ currentWgt ? `${currentWgt.versionName} · 最低 APK ${currentWgt.minAppVersionCode}` : '尚未发布' }}</dd></div>
</dl>
</div>
<div class="pda-release-commands">
<el-button :loading="loading" @click="load"><RefreshCw :size="16" />刷新</el-button>
<el-button v-if="canManage" type="primary" @click="openUpload"><Plus :size="16" />上传版本</el-button>
</div>
</div>
</template>
<template #metrics>
<div class="pda-release-current">
<span>当前 APK:{{ currentApk ? `${currentApk.versionName} (${currentApk.versionCode})` : '尚未发布' }}</span>
<span>当前 WGT:{{ currentWgt ? `${currentWgt.versionName} · 最低 APK ${currentWgt.minAppVersionCode}` : '尚未发布' }}</span>
</div>
</template>
<template #state>
<el-alert v-if="error" type="error" :title="error" show-icon :closable="false" />
</template>
<DataTable :data="rows" :columns="columns" :loading="loading" row-key="id" border stripe empty-text="暂无版本记录">
</template>
<template #toolbar-actions>
<el-button :loading="loading" @click="load"><RefreshCw :size="16" />刷新</el-button>
<el-button v-if="canManage" type="primary" @click="openUpload"><Plus :size="16" />上传版本</el-button>
</template>
<template #actions="{ row }">
<div class="pda-release-actions">
<el-button v-if="row.packageType === 'apk' && row.downloadUrl" link @click="download(asRelease(row))"><Download :size="15" />下载 APK</el-button>
<el-button v-if="canManage && row.status === 'DRAFT'" link :loading="actionId === row.id" @click="changeStatus(asRelease(row), 'publish')">发布</el-button>
<el-button v-if="canManage && row.current" link type="danger" :loading="actionId === row.id" @click="changeStatus(asRelease(row), 'withdraw')">停发</el-button>
<div class="pda-release-actions density-actions">
<el-button v-if="row.packageType === 'apk' && row.downloadUrl" class="density-action" data-tone="neutral" @click="download(asRelease(row))"><Download :size="15" />下载 APK</el-button>
<el-button v-if="canManage && row.status === 'DRAFT'" class="density-action" data-tone="primary" :loading="actionId === row.id" @click="changeStatus(asRelease(row), 'publish')">发布</el-button>
<el-button v-if="canManage && row.current" class="density-action" data-tone="danger" :loading="actionId === row.id" @click="changeStatus(asRelease(row), 'withdraw')">停发</el-button>
</div>
</template>
<template #app="{ row }">{{ row.app === 'domestic' ? '国内' : '海外' }}</template>
@@ -160,7 +154,8 @@ function download(row: PdaRelease) {
<template #sizeBytes="{ row }">{{ (row.sizeBytes / 1024 / 1024).toFixed(1) }} MB</template>
<template #createdAt="{ row }">{{ row.createdAt?.replace('T', ' ').slice(0, 19) || '—' }}</template>
<template #publishedAt="{ row }">{{ row.publishedAt?.replace('T', ' ').slice(0, 19) || '—' }}</template>
</DataTable>
</DataTable>
</section>
</ListPageLayout>
<AppDialog v-model="uploadOpen" class="admin-density-dialog" title="上传PDA版本" width="min(640px, calc(100vw - 28px))" confirm-text="保存草稿" :confirm-loading="uploading" @confirm="upload">
@@ -182,11 +177,16 @@ function download(row: PdaRelease) {
</template>
<style scoped>
.pda-release-toolbar { display: flex; align-items: end; justify-content: space-between; gap: 16px; }
.pda-release-toolbar h1 { margin: 0 0 10px; font-size: var(--admin-font-title, 16px); }
.pda-release-commands, .pda-release-actions { display: flex; align-items: center; gap: 8px; }
.pda-release-commands :deep(.el-button), .pda-release-actions :deep(.el-button) { display: inline-flex; align-items: center; gap: 5px; }
.pda-release-current { display: flex; gap: 24px; padding: 10px 0; border-bottom: 1px solid var(--cc-border); }
.pda-release-panel { min-width: 0; overflow: hidden; }
.pda-release-error { border: 0; border-bottom: 1px solid var(--el-color-danger-light-7); border-radius: 0; }
.pda-release-context { display: flex; min-width: 0; align-items: center; gap: var(--admin-space-6); }
.pda-release-current { display: flex; min-width: 0; flex-wrap: wrap; gap: var(--admin-space-3) var(--admin-space-6); margin: 0; }
.pda-release-current > div { display: flex; min-width: 0; align-items: baseline; gap: var(--admin-space-2); }
.pda-release-current dt { color: var(--cc-muted); font-size: var(--admin-font-caption); }
.pda-release-current dd { margin: 0; color: var(--cc-text); font-size: var(--admin-font-body); font-variant-numeric: tabular-nums; }
.pda-release-actions { display: flex; align-items: center; gap: var(--admin-space-2); }
.pda-release-actions :deep(.el-button) { display: inline-flex; align-items: center; gap: 5px; }
.pda-release-fields { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 18px; }
.pda-release-form :deep(.el-input-number) { width: 100%; }
@media (max-width: 900px) { .pda-release-context { align-items: flex-start; flex-direction: column; gap: var(--admin-space-3); } }
</style>