diff --git a/src/api/admin/types.ts b/src/api/admin/types.ts index 28e7a82..119870c 100644 --- a/src/api/admin/types.ts +++ b/src/api/admin/types.ts @@ -96,6 +96,8 @@ export interface CompetitionTrackPayload { } export type SignupChannelStatus = 'enabled' | 'disabled' +export type SignupChannelCallbackType = 'none' | 'web' | 'mini_program' +export type SignupChannelMiniProgramMethod = 'navigateTo' | 'redirectTo' | 'reLaunch' /** 赛事报名渠道配置,channel_code 由后端创建时自动生成 */ export interface SignupChannelRow { @@ -113,6 +115,9 @@ export interface SignupChannelRow { encryption_algorithm?: string | null entry_encryption_enabled: boolean success_callback_url: string + success_callback_type: SignupChannelCallbackType + mini_program_callback_path: string | null + mini_program_callback_method: SignupChannelMiniProgramMethod remark: string | null created_at?: string updated_at?: string @@ -124,6 +129,9 @@ export interface SignupChannelPayload { shared_secret: string entry_encryption_enabled: boolean success_callback_url: string + success_callback_type: SignupChannelCallbackType + mini_program_callback_path: string | null + mini_program_callback_method: SignupChannelMiniProgramMethod remark: string | null } diff --git a/src/views/admin/competition/CompetitionFormView.vue b/src/views/admin/competition/CompetitionFormView.vue index 3a087c2..781e961 100644 --- a/src/views/admin/competition/CompetitionFormView.vue +++ b/src/views/admin/competition/CompetitionFormView.vue @@ -110,6 +110,9 @@ const channelForm = ref({ shared_secret: '', entry_encryption_enabled: false, success_callback_url: '', + success_callback_type: 'web', + mini_program_callback_path: null, + mini_program_callback_method: 'redirectTo', remark: null, }) @@ -632,7 +635,10 @@ async function openChannelModal(row?: SignupChannelRow) { status: detail.status, shared_secret: detail.shared_secret ?? '', entry_encryption_enabled: detail.entry_encryption_enabled ?? false, - success_callback_url: detail.success_callback_url, + success_callback_url: detail.success_callback_url ?? '', + success_callback_type: detail.success_callback_type ?? 'web', + mini_program_callback_path: detail.mini_program_callback_path ?? null, + mini_program_callback_method: detail.mini_program_callback_method ?? 'redirectTo', remark: detail.remark, } : { @@ -641,6 +647,9 @@ async function openChannelModal(row?: SignupChannelRow) { shared_secret: '', entry_encryption_enabled: false, success_callback_url: '', + success_callback_type: 'web', + mini_program_callback_path: null, + mini_program_callback_method: 'redirectTo', remark: null, } channelDialogVisible.value = true @@ -670,6 +679,18 @@ function generateChannelSecret() { .replace(/=+$/g, '') } +function channelCallbackTypeLabel(type: SignupChannelRow['success_callback_type']): string { + if (type === 'mini_program') return '小程序' + if (type === 'none') return '不回调' + return 'URL' +} + +function channelCallbackTarget(row: SignupChannelRow): string { + if (row.success_callback_type === 'mini_program') return row.mini_program_callback_path || '—' + if (row.success_callback_type === 'none') return '—' + return row.success_callback_url || '—' +} + async function saveChannel() { const cid = competitionId.value if (!cid) return @@ -679,12 +700,23 @@ async function saveChannel() { shared_secret: channelForm.value.shared_secret.trim(), entry_encryption_enabled: channelForm.value.entry_encryption_enabled, success_callback_url: channelForm.value.success_callback_url.trim(), + success_callback_type: channelForm.value.success_callback_type, + mini_program_callback_path: channelForm.value.mini_program_callback_path?.trim() || null, + mini_program_callback_method: channelForm.value.mini_program_callback_method, remark: channelForm.value.remark?.trim() || null, } if (!payload.channel_name || !payload.shared_secret) { ElMessage.warning('请填写渠道名称与共享密钥') return } + if (payload.success_callback_type === 'web' && !payload.success_callback_url) { + ElMessage.warning('请填写 URL 回跳地址,或选择不回调') + return + } + if (payload.success_callback_type === 'mini_program' && !payload.mini_program_callback_path) { + ElMessage.warning('请填写小程序页面路径') + return + } channelSaving.value = true try { if (channelEditingId.value) { @@ -1146,7 +1178,16 @@ onMounted(() => { - + + + + + + - - + + + 不回调 + URL + 小程序 + + + + + + + +

选择不回调时,选手提交成功后只展示系统报名成功提示。