feat: 添加编辑页面基础版本选择功能

- 在编辑页面添加基础版本选择器
- 加载已有版本时自动填充 base_version_id
- 更新版本时传递 base_version_id 参数
- 移除创建页面的调试代码

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-03 00:30:16 +08:00
parent bcde5abfa3
commit 1575d32133
2 changed files with 84 additions and 9 deletions
@@ -40,6 +40,8 @@ const uploading = ref(false)
const uploadProgress = ref(0) const uploadProgress = ref(0)
const uploadSpeed = ref('') const uploadSpeed = ref('')
const applications = ref<Application[]>([]) const applications = ref<Application[]>([])
const baseVersions = ref<{ id: number, version: string }[]>([])
const loadingBaseVersions = ref(false)
const formData = ref({ const formData = ref({
application_id: '', application_id: '',
@@ -52,6 +54,7 @@ const formData = ref({
changelog: '', changelog: '',
entry_file: '', entry_file: '',
file: null as File | null, file: null as File | null,
base_version_id: '' as string,
}) })
const uploadedData = ref<UploadResponse | null>(null) const uploadedData = ref<UploadResponse | null>(null)
@@ -103,6 +106,7 @@ async function fetchVersion() {
formData.value.custom_download_url = ver.custom_download_url || '' formData.value.custom_download_url = ver.custom_download_url || ''
formData.value.changelog = ver.changelog || '' formData.value.changelog = ver.changelog || ''
formData.value.entry_file = ver.entry_file || '' formData.value.entry_file = ver.entry_file || ''
formData.value.base_version_id = ver.base_version_id ? String(ver.base_version_id) : ''
// 加载已有文件信息 // 加载已有文件信息
if (ver.file_path && ver.file_size) { if (ver.file_path && ver.file_size) {
@@ -136,6 +140,56 @@ async function fetchApplications() {
} }
} }
async function fetchBaseVersions(appId: string) {
if (!appId) {
baseVersions.value = []
return
}
loadingBaseVersions.value = true
try {
const data = await api.get<{ versions: { id: number, version: string, update_type: string }[] }>(
`/dev/versions?application_id=${appId}&update_type=full&page_size=100`
)
const versions = data?.versions || []
baseVersions.value = versions.filter(v => v.update_type === 'full')
}
catch (error) {
console.error('获取基础版本列表失败:', error)
baseVersions.value = []
}
finally {
loadingBaseVersions.value = false
}
}
// 监听应用变化
watch(
() => formData.value.application_id,
(newAppId) => {
if (newAppId && formData.value.update_type === 'patch') {
fetchBaseVersions(newAppId)
} else if (!newAppId) {
baseVersions.value = []
formData.value.base_version_id = ''
}
},
{ immediate: true }
)
// 监听更新类型变化
watch(
() => formData.value.update_type,
(newType) => {
if (newType === 'patch' && formData.value.application_id) {
fetchBaseVersions(formData.value.application_id)
} else if (newType !== 'patch') {
baseVersions.value = []
formData.value.base_version_id = ''
}
},
{ immediate: true }
)
function handleFileSelect(event: Event) { function handleFileSelect(event: Event) {
const target = event.target as HTMLInputElement const target = event.target as HTMLInputElement
if (target.files && target.files.length > 0) { if (target.files && target.files.length > 0) {
@@ -222,6 +276,11 @@ async function handleSubmit() {
entry_file: formData.value.entry_file, entry_file: formData.value.entry_file,
} }
// 如果是补丁版本,添加基础版本ID
if (formData.value.update_type === 'patch' && formData.value.base_version_id) {
payload.base_version_id = Number(formData.value.base_version_id)
}
console.log('[DEBUG] handleSubmit payload:', JSON.stringify(payload)) console.log('[DEBUG] handleSubmit payload:', JSON.stringify(payload))
if (uploadedData.value) { if (uploadedData.value) {
@@ -523,6 +582,31 @@ onMounted(() => {
</UiSelect> </UiSelect>
</div> </div>
<!-- 基础版本选择仅补丁类型 -->
<div v-if="formData.update_type === 'patch'" class="space-y-2">
<UiLabel>{{ t('admin.versions.createForm.baseVersion') }}</UiLabel>
<p class="text-sm text-muted-foreground">
{{ t('admin.versions.createForm.baseVersionDesc') }}
</p>
<UiSelect v-model="formData.base_version_id" :disabled="saving || loadingBaseVersions">
<UiSelectTrigger>
<UiSelectValue :placeholder="t('admin.versions.createForm.baseVersionPlaceholder')" />
</UiSelectTrigger>
<UiSelectContent>
<UiSelectItem
v-for="v in baseVersions"
:key="v.id"
:value="String(v.id)"
>
{{ v.version }}
</UiSelectItem>
</UiSelectContent>
</UiSelect>
<p v-if="baseVersions.length === 0 && !loadingBaseVersions" class="text-sm text-destructive">
{{ t('admin.versions.createForm.noBaseVersion') }}
</p>
</div>
<div class="space-y-2"> <div class="space-y-2">
<UiLabel>{{ t('admin.versions.createForm.updateMethod') }}</UiLabel> <UiLabel>{{ t('admin.versions.createForm.updateMethod') }}</UiLabel>
<UiSelect v-model="formData.update_method" :disabled="saving"> <UiSelect v-model="formData.update_method" :disabled="saving">
@@ -136,11 +136,9 @@ async function fetchBaseVersions(appId: string) {
const data = await api.get<{ versions: { id: number, version: string, update_type: string }[] }>( const data = await api.get<{ versions: { id: number, version: string, update_type: string }[] }>(
`/dev/versions?application_id=${appId}&update_type=full&page_size=100` `/dev/versions?application_id=${appId}&update_type=full&page_size=100`
) )
console.log('[DEBUG] fetchBaseVersions response:', data)
// 只筛选全量版本 // 只筛选全量版本
const versions = data?.versions || [] const versions = data?.versions || []
baseVersions.value = versions.filter(v => v.update_type === 'full') baseVersions.value = versions.filter(v => v.update_type === 'full')
console.log('[DEBUG] baseVersions after filter:', baseVersions.value)
} }
catch (error) { catch (error) {
console.error('获取基础版本列表失败:', error) console.error('获取基础版本列表失败:', error)
@@ -155,7 +153,6 @@ async function fetchBaseVersions(appId: string) {
watch( watch(
() => formData.value.application_id, () => formData.value.application_id,
(newAppId) => { (newAppId) => {
console.log('[DEBUG] application_id changed:', newAppId, 'update_type:', formData.value.update_type)
if (newAppId && formData.value.update_type === 'patch') { if (newAppId && formData.value.update_type === 'patch') {
fetchBaseVersions(newAppId) fetchBaseVersions(newAppId)
} else if (!newAppId) { } else if (!newAppId) {
@@ -171,7 +168,6 @@ watch(
watch( watch(
() => formData.value.update_type, () => formData.value.update_type,
(newType) => { (newType) => {
console.log('[DEBUG] update_type changed:', newType, 'application_id:', formData.value.application_id)
if (newType === 'patch' && formData.value.application_id) { if (newType === 'patch' && formData.value.application_id) {
fetchBaseVersions(formData.value.application_id) fetchBaseVersions(formData.value.application_id)
} else if (newType !== 'patch') { } else if (newType !== 'patch') {
@@ -529,11 +525,6 @@ onMounted(() => {
</UiSelect> </UiSelect>
</div> </div>
<!-- 调试信息 -->
<div class="text-xs text-muted-foreground p-2 bg-muted rounded">
DEBUG: update_type = "{{ formData.update_type }}"
</div>
<!-- 基础版本选择仅补丁类型 --> <!-- 基础版本选择仅补丁类型 -->
<div v-if="formData.update_type === 'patch'" class="space-y-2"> <div v-if="formData.update_type === 'patch'" class="space-y-2">
<UiLabel>{{ t('admin.versions.createForm.baseVersion') }}</UiLabel> <UiLabel>{{ t('admin.versions.createForm.baseVersion') }}</UiLabel>