From e47f510a0b65ae4c3c730ab5670a9ce6ead49ff1 Mon Sep 17 00:00:00 2001 From: XuqmGroup Date: Wed, 29 Apr 2026 19:08:13 +0800 Subject: [PATCH] =?UTF-8?q?feat(sdk):=20=E6=B7=BB=E5=8A=A0=E9=B8=BF?= =?UTF-8?q?=E8=92=99SDK=E6=A0=B8=E5=BF=83=E5=8A=9F=E8=83=BD=E6=A8=A1?= =?UTF-8?q?=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实现SDKContext用于配置管理和数据持久化存储 - 定义完整的类型系统包括消息、用户、群组等接口 - 集成更新SDK支持原生应用和RN热更新检查 - 提供统一的XuqmSDK入口类和模块导出 - 编写详细的开发文档和使用示例 --- tenant-platform/components.d.ts | 3 + tenant-platform/src/api/update.ts | 91 +- tenant-platform/src/router/index.ts | 4 - .../src/views/apps/AppDetailView.vue | 10 +- .../src/views/update/StoreGuideView.vue | 16 +- .../views/update/VersionManagementView.vue | 1089 +++++++++++------ 6 files changed, 799 insertions(+), 414 deletions(-) diff --git a/tenant-platform/components.d.ts b/tenant-platform/components.d.ts index 03b9d96..416b6bd 100644 --- a/tenant-platform/components.d.ts +++ b/tenant-platform/components.d.ts @@ -15,6 +15,8 @@ declare module 'vue' { ElCheckbox: typeof import('element-plus/es')['ElCheckbox'] ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup'] ElCol: typeof import('element-plus/es')['ElCol'] + ElCollapse: typeof import('element-plus/es')['ElCollapse'] + ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem'] ElContainer: typeof import('element-plus/es')['ElContainer'] ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] ElDescriptions: typeof import('element-plus/es')['ElDescriptions'] @@ -29,6 +31,7 @@ declare module 'vue' { ElFormItem: typeof import('element-plus/es')['ElFormItem'] ElHeader: typeof import('element-plus/es')['ElHeader'] ElIcon: typeof import('element-plus/es')['ElIcon'] + ElImage: typeof import('element-plus/es')['ElImage'] ElInput: typeof import('element-plus/es')['ElInput'] ElInputNumber: typeof import('element-plus/es')['ElInputNumber'] ElLink: typeof import('element-plus/es')['ElLink'] diff --git a/tenant-platform/src/api/update.ts b/tenant-platform/src/api/update.ts index 0b5c8c0..1f3c733 100644 --- a/tenant-platform/src/api/update.ts +++ b/tenant-platform/src/api/update.ts @@ -39,8 +39,31 @@ updateClient.interceptors.request.use((config) => { return config }) -export type StoreType = 'HUAWEI' | 'MI' | 'OPPO' | 'VIVO' | 'HONOR' | 'APP_STORE' | 'GOOGLE_PLAY' +export type StoreType = 'HUAWEI' | 'MI' | 'OPPO' | 'VIVO' | 'HONOR' | 'APP_STORE' | 'GOOGLE_PLAY' | 'HARMONY_APP' | 'REVIEW_WEBHOOK' export type StoreReviewState = 'PENDING' | 'UNDER_REVIEW' | 'APPROVED' | 'REJECTED' +export type PublishMode = 'MANUAL' | 'NOW' | 'SCHEDULED' | 'AUTO_REVIEW' +export type GrayMode = 'PERCENT' | 'MEMBERS' +export type GraySelectionSource = 'LOCAL' | 'CALLBACK' + +export interface PublishConfig { + id: string + appId: string + configJson?: string + updatedAt: string +} + +export interface GrayMember { + userId: string + name?: string + groupName?: string + extraJson?: string + updatedAt?: string +} + +export interface GrayMemberGroup { + groupName: string + members: GrayMember[] +} export interface StoreConfig { id: string @@ -71,6 +94,10 @@ export interface AppVersion { webhookUrl?: string storeSubmitTargets?: string storeReviewStatus?: string + storeSubmitMode?: PublishMode + storeSubmitScheduledAt?: string + grayMode?: GrayMode + grayMemberIds?: string createdAt: string } @@ -94,8 +121,12 @@ export interface RnBundle { packageName?: string note?: string publishStatus: 'DRAFT' | 'PUBLISHED' | 'DEPRECATED' + publishMode?: PublishMode + scheduledPublishAt?: string grayEnabled: boolean grayPercent: number + grayMode?: GrayMode + grayMemberIds?: string createdAt: string } @@ -144,16 +175,22 @@ export const updateAdminApi = { }) }, - publishAppVersion(id: string) { - return updateClient.post(`/api/v1/updates/app/${id}/publish`) + publishAppVersion(id: string, body?: { publishImmediately?: boolean; scheduledPublishAt?: string; forceUpdate?: boolean }) { + return updateClient.post(`/api/v1/updates/app/${id}/publish`, body ?? {}) }, unpublishAppVersion(id: string) { return updateClient.post(`/api/v1/updates/app/${id}/unpublish`) }, - grayAppVersion(id: string, enabled: boolean, percent: number) { - return updateClient.post(`/api/v1/updates/app/${id}/gray`, { enabled, percent }) + grayAppVersion(id: string, body: { + enabled: boolean + grayMode: GrayMode + percent?: number + memberIds?: string[] + selectionSource?: GraySelectionSource + }) { + return updateClient.post(`/api/v1/updates/app/${id}/gray`, body) }, uploadAppVersion(formData: FormData) { @@ -172,16 +209,22 @@ export const updateAdminApi = { }) }, - publishRnBundle(id: string) { - return updateClient.post(`/api/v1/rn/${id}/publish`) + publishRnBundle(id: string, body?: { publishImmediately?: boolean; scheduledPublishAt?: string }) { + return updateClient.post(`/api/v1/rn/${id}/publish`, body ?? {}) }, unpublishRnBundle(id: string) { return updateClient.post(`/api/v1/rn/${id}/unpublish`) }, - grayRnBundle(id: string, enabled: boolean, percent: number) { - return updateClient.post(`/api/v1/rn/${id}/gray`, { enabled, percent }) + grayRnBundle(id: string, body: { + enabled: boolean + grayMode: GrayMode + percent?: number + memberIds?: string[] + selectionSource?: GraySelectionSource + }) { + return updateClient.post(`/api/v1/rn/${id}/gray`, body) }, uploadRnBundle(formData: FormData) { @@ -214,10 +257,16 @@ export const updateAdminApi = { return updateClient.delete(`/api/v1/updates/store/configs/${storeType}`, { params: { appId } }) }, - executeSubmitToStores(versionId: string, storeTypes: StoreType[]) { + executeSubmitToStores( + versionId: string, + storeTypes: StoreType[], + submitMode: PublishMode = 'MANUAL', + scheduledPublishAt?: string, + autoPublishAfterReview = false, + ) { return updateClient.post<{ data: AppVersion }>( `/api/v1/updates/store/app/${versionId}/execute-submit`, - { storeTypes }, + { storeTypes, submitMode, scheduledPublishAt, autoPublishAfterReview }, ) }, @@ -227,4 +276,24 @@ export const updateAdminApi = { { storeType, state }, ) }, + + getPublishConfig(appId: string) { + return updateClient.get<{ data: PublishConfig }>('/api/v1/updates/publish/config', { params: { appId } }) + }, + + savePublishConfig(appId: string, config: Record) { + return updateClient.put<{ data: PublishConfig }>('/api/v1/updates/publish/config', config, { params: { appId } }) + }, + + listGrayMembers(appId: string, keyword?: string, groupName?: string) { + return updateClient.get<{ data: GrayMemberGroup[] }>('/api/v1/updates/gray/members', { + params: { appId, ...(keyword && { keyword }), ...(groupName && { groupName }) }, + }) + }, + + syncGrayMembers(appId: string) { + return updateClient.post<{ data: GrayMemberGroup[] }>('/api/v1/updates/gray/members/sync', null, { + params: { appId }, + }) + }, } diff --git a/tenant-platform/src/router/index.ts b/tenant-platform/src/router/index.ts index 456ff74..f8c3680 100644 --- a/tenant-platform/src/router/index.ts +++ b/tenant-platform/src/router/index.ts @@ -53,10 +53,6 @@ const router = createRouter({ path: 'apps/:appId/update', component: () => import('@/views/update/VersionManagementView.vue'), }, - { - path: 'apps/:appId/update-guide', - component: () => import('@/views/update/StoreGuideView.vue'), - }, { path: 'accounts', component: () => import('@/views/accounts/SubAccountView.vue'), diff --git a/tenant-platform/src/views/apps/AppDetailView.vue b/tenant-platform/src/views/apps/AppDetailView.vue index 3b3b779..f899ee0 100644 --- a/tenant-platform/src/views/apps/AppDetailView.vue +++ b/tenant-platform/src/views/apps/AppDetailView.vue @@ -60,9 +60,9 @@
- {{ serviceLabel(svcType) }} - {{ serviceHelp(svcType) }} -
+ {{ serviceLabel(svcType) }} + {{ serviceHelp(svcType) }} +
{{ svcType === 'UPDATE' - ? 'Android / iOS / 鸿蒙版本在版本管理页内分别配置。' + ? 'Android 整包版本在版本管理页上传;iOS / 鸿蒙仅记录版本号和市场跳转页。商店配置与发布配置都在版本管理页。' : '推送服务开通后即可在终端接收设备级推送。' }} @@ -169,7 +169,7 @@ function serviceHelp(type: string) { return { IM: 'IM 服务独立开通后,在管理页配置回调和消息能力。', PUSH: '一次开通后,推送配置在服务管理页按平台维护。', - UPDATE: '一次开通后,版本管理页按平台维护版本和发布。', + UPDATE: '一次开通后,版本管理页只管理 Android 整包版本,iOS / 鸿蒙仅记录提醒信息。', }[type] ?? '' } diff --git a/tenant-platform/src/views/update/StoreGuideView.vue b/tenant-platform/src/views/update/StoreGuideView.vue index 29cdf80..8a54407 100644 --- a/tenant-platform/src/views/update/StoreGuideView.vue +++ b/tenant-platform/src/views/update/StoreGuideView.vue @@ -3,7 +3,7 @@
- + @@ -13,7 +13,6 @@ Harmony 上传新版本 - 应用配置指引 刷新
@@ -23,6 +22,9 @@