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