diff --git a/ops-platform/src/api/ops.ts b/ops-platform/src/api/ops.ts index 08ec1c6..07c5366 100644 --- a/ops-platform/src/api/ops.ts +++ b/ops-platform/src/api/ops.ts @@ -251,6 +251,9 @@ export const opsApi = { listAppServices: (id: string) => client.get<{ data: FeatureServiceItem[] }>(`/ops/apps/${id}/services`), + transferApp: (appKey: string, targetTenantId: string) => + client.post(`/ops/apps/${appKey}/transfer`, { targetTenantId }), + listOperationLogs: (page = 0, size = 20) => client.get<{ data: OpsLogPage }>('/ops/operation-logs', { params: { page, size } }), diff --git a/ops-platform/src/views/apps/AppListView.vue b/ops-platform/src/views/apps/AppListView.vue index c9b14c3..55bb907 100644 --- a/ops-platform/src/views/apps/AppListView.vue +++ b/ops-platform/src/views/apps/AppListView.vue @@ -37,15 +37,53 @@ - + + + + + + {{ transferTarget?.name }} ({{ transferTarget?.appKey }}) + + + {{ transferTarget?.tenantName || transferTarget?.tenantId }} + + + + + + + + + + @@ -54,6 +92,7 @@ diff --git a/tenant-platform/src/utils/jwt.ts b/tenant-platform/src/utils/jwt.ts index e02c4b1..88e0e6f 100644 --- a/tenant-platform/src/utils/jwt.ts +++ b/tenant-platform/src/utils/jwt.ts @@ -4,7 +4,11 @@ export function decodeJwtPayload(token: string): Record | null if (!payload) return null const normalized = payload.replace(/-/g, '+').replace(/_/g, '/') const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '=') - return JSON.parse(atob(padded)) as Record + const binary = atob(padded) + // Decode as UTF-8 to handle multi-byte characters (e.g. Chinese) + const bytes = Uint8Array.from(binary, c => c.charCodeAt(0)) + const json = new TextDecoder('utf-8').decode(bytes) + return JSON.parse(json) as Record } catch { return null } diff --git a/tenant-platform/src/views/update/VersionManagementView.vue b/tenant-platform/src/views/update/VersionManagementView.vue index 60a7458..2ff0271 100644 --- a/tenant-platform/src/views/update/VersionManagementView.vue +++ b/tenant-platform/src/views/update/VersionManagementView.vue @@ -205,6 +205,15 @@ /> +
+ 并行上传 + + 开启后同时向所有商店提交包,关闭后逐个排队上传 +