refactor(version): 优化版本管理中的灰度发布配置

- 移除 GrayMemberGroup 和 GraySelectionSource 类型定义
- 添加 GrayTag 类型定义以支持标签模式
- 重命名 normalizeCallbackUrl 函数为 normalizeUrl
- 简化灰度发布配置逻辑,移除本地选择源相关代码
- 将灰度同步回调URL和发布回调URL统一为 graySyncUrl 和 publishCallbackUrl
- 更新灰度成员加载逻辑为标签加载逻辑
- 移除成员模式下的回调地址验证和选择源设置
- 简化灰度模式切换条件判断逻辑
这个提交包含在:
XuqmGroup 2026-06-11 12:36:27 +08:00
父节点 f116b63369
当前提交 0a8011d9be

查看文件

@ -923,9 +923,8 @@ import {
updateAdminApi,
type AppPackageInspectResult,
type AppVersion,
type GrayMemberGroup,
type GrayMode,
type GraySelectionSource,
type GrayTag,
type PublishMode,
type RnBundle,
type RnBundleInspectResult,
@ -1420,21 +1419,17 @@ async function removeStoreConfig(type: StoreType) {
}
function normalizePublishConfig(raw: Record<string, unknown> | null | undefined) {
const normalizeCallbackUrl = (value: unknown) => {
const normalizeUrl = (value: unknown) => {
const text = String(value ?? '').trim()
return /^https?:\/\//i.test(text) ? text : ''
}
const grayMode = String(raw?.grayMode ?? 'PERCENT') as GrayMode
const graySelectionSource = String(raw?.graySelectionSource ?? 'LOCAL') as GraySelectionSource
return {
allowAnonymousUpdateCheck: Boolean(raw?.allowAnonymousUpdateCheck ?? raw?.defaultAllowAnonymousUpdateCheck ?? false),
defaultGrayPercent: Number((raw as Record<string, unknown>)?.defaultGrayPercent ?? 0),
grayMode,
graySelectionSource,
graySelectCallbackUrl: normalizeCallbackUrl((raw as Record<string, unknown>)?.graySelectCallbackUrl),
graySelectCallbackSecret: String((raw as Record<string, unknown>)?.graySelectCallbackSecret ?? ''),
grayDirectorySyncCallbackUrl: normalizeCallbackUrl((raw as Record<string, unknown>)?.grayDirectorySyncCallbackUrl),
grayDirectorySyncCallbackSecret: String((raw as Record<string, unknown>)?.grayDirectorySyncCallbackSecret ?? ''),
allowAnonymousUpdateCheck: Boolean(raw?.allowAnonymousUpdateCheck ?? false),
defaultGrayPercent: Number(raw?.defaultGrayPercent ?? 0),
grayMode: String(raw?.grayMode ?? 'PERCENT') as GrayMode,
graySyncUrl: normalizeUrl(raw?.graySyncUrl),
publishCallbackUrl: normalizeUrl(raw?.publishCallbackUrl),
enableRealtimeNotification: Boolean(raw?.enableRealtimeNotification ?? false),
parallelStoreUpload: raw?.parallelStoreUpload !== false,
}
}
@ -1457,10 +1452,6 @@ async function loadPublishConfig() {
publishConfigForm.value = parsePublishConfig(res.data.data.configJson)
if (allowAnonymousUpdateCheck.value) {
publishConfigForm.value.grayMode = 'PERCENT'
publishConfigForm.value.graySelectionSource = 'LOCAL'
}
if (publishConfigForm.value.grayMode === 'MEMBERS' && !hasAnyGrayCallback.value) {
publishConfigForm.value.grayMode = 'PERCENT'
}
} catch {
publishConfigForm.value = normalizePublishConfig({})
@ -1472,26 +1463,18 @@ async function loadPublishConfig() {
async function savePublishConfig() {
savingPublishConfig.value = true
try {
const normalizeCallbackUrl = (value: string) => {
const normalizeUrl = (value: string) => {
const trimmed = value.trim()
return /^https?:\/\//i.test(trimmed) ? trimmed : ''
}
const payload = {
...publishConfigForm.value,
defaultGrayPercent: Math.min(Math.max(Number(publishConfigForm.value.defaultGrayPercent || 0), 0), 100),
graySelectCallbackUrl: normalizeCallbackUrl(publishConfigForm.value.graySelectCallbackUrl),
grayDirectorySyncCallbackUrl: normalizeCallbackUrl(publishConfigForm.value.grayDirectorySyncCallbackUrl),
graySyncUrl: normalizeUrl(publishConfigForm.value.graySyncUrl),
publishCallbackUrl: normalizeUrl(publishConfigForm.value.publishCallbackUrl),
}
if (payload.allowAnonymousUpdateCheck) {
payload.grayMode = 'PERCENT'
payload.graySelectionSource = 'LOCAL'
}
if (payload.grayMode === 'MEMBERS' && !hasAnyGrayCallback.value) {
ElMessage.warning('成员模式至少需要配置一个回调地址')
return
}
if (payload.grayMode === 'MEMBERS' && !hasGrayDirectorySyncCallback.value) {
payload.graySelectionSource = 'CALLBACK'
}
await updateAdminApi.savePublishConfig(appKey.value, payload)
ElMessage.success('发布配置已保存')
@ -2464,15 +2447,9 @@ watch(storeConfigs, () => {
}
}, { deep: true })
watch([grayMemberKeyword, grayMemberGroupFilter], () => {
if (showGray.value && grayForm.value.grayMode === 'MEMBERS' && grayForm.value.selectionSource === 'LOCAL') {
loadGrayMembers()
}
})
watch(grayForm, () => {
if (showGray.value && grayForm.value.grayMode === 'MEMBERS' && grayForm.value.selectionSource === 'LOCAL') {
loadGrayMembers()
if (showGray.value && grayForm.value.grayMode === 'MEMBERS') {
loadGrayTags()
}
}, { deep: true })