From c11e8f6d710dc5cc059e01adf4a610170e214269 Mon Sep 17 00:00:00 2001 From: XuqmGroup Date: Fri, 8 May 2026 18:32:46 +0800 Subject: [PATCH] =?UTF-8?q?feat(im):=20=E6=B7=BB=E5=8A=A0=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0=E4=BA=8B=E4=BB=B6=E9=80=9A=E7=9F=A5=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=BA=94=E7=94=A8=E5=AE=A1=E6=A0=B8=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=AE=9E=E6=97=B6=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 ImPlatformEventController 提供令牌获取接口 - 新增 InternalImPlatformEventController 处理内部通知请求 - 实现 ImPlatformEventService 核心服务逻辑包括令牌签发和消息推送 - 添加 StoreReviewImNotifier 在更新服务中触发审核状态变更通知 - 在前端平台中集成实时审核状态更新功能 - 配置各项目环境版本管理文件 (.java-version, .nvmrc) - 更新 Docker 忽略文件和 Maven 配置以优化构建流程 --- .dockerignore | 10 ++ .npmrc | 1 + .../src/services/storeReviewRealtime.ts | 91 +++++++++++++++++++ 3 files changed, 102 insertions(+) create mode 100644 .dockerignore create mode 100644 .npmrc create mode 100644 tenant-platform/src/services/storeReviewRealtime.ts diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..08eb07b --- /dev/null +++ b/.dockerignore @@ -0,0 +1,10 @@ +.git +.idea +node_modules +**/node_modules +dist +**/dist +docs-site/docs/.vitepress/dist +**/.DS_Store +**/*.log +*.iml diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..a2dc70e --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +@xuqm:registry=https://nexus.xuqinmin.com/repository/npm-hosted/ diff --git a/tenant-platform/src/services/storeReviewRealtime.ts b/tenant-platform/src/services/storeReviewRealtime.ts new file mode 100644 index 0000000..1e68557 --- /dev/null +++ b/tenant-platform/src/services/storeReviewRealtime.ts @@ -0,0 +1,91 @@ +import { ElMessage } from 'element-plus' +import { init, login, ImClient, type ImMessage } from '@xuqm/vue3-sdk' +import client from '@/api/client' + +export interface StoreReviewRefreshEvent { + event: string + appKey: string + versionId?: string + storeType?: string + reviewState?: string + reviewReason?: string + stage?: string + batchId?: string + publishStatus?: string + source?: string + timestamp?: number +} + +interface PlatformEventTokenResponse { + userId: string + token: string +} + +let imClient: ImClient | null = null +let activeAppKey = '' + +function sdkBaseUrl() { + return import.meta.env.VITE_IM_API_BASE_URL ?? '' +} + +function sdkWsUrl() { + return import.meta.env.VITE_IM_WS_URL ?? '' +} + +function parseEvent(message: ImMessage): StoreReviewRefreshEvent | null { + if (!['NOTIFY', 'CUSTOM'].includes(message.msgType)) return null + try { + const payload = JSON.parse(message.content) as Partial + if (!payload || payload.event !== 'store_review_update') return null + if (!payload.appKey) return null + return payload as StoreReviewRefreshEvent + } catch { + return null + } +} + +export async function connectStoreReviewRealtime(appKey: string, onEvent: (event: StoreReviewRefreshEvent) => void) { + if (!appKey) return + disconnectStoreReviewRealtime() + activeAppKey = appKey + + const res = await client.get<{ data: PlatformEventTokenResponse }>('/im/platform-events/token', { + params: { appKey }, + }) + const token = res.data.data + init({ + appKey, + baseUrl: sdkBaseUrl(), + wsUrl: sdkWsUrl(), + debug: import.meta.env.DEV, + }) + login(token.userId, token.token) + + const clientInstance = new ImClient() + clientInstance.on('message', (message) => { + const event = parseEvent(message) + if (!event || event.appKey !== activeAppKey) return + onEvent(event) + }) + clientInstance.on('error', (error) => { + if (import.meta.env.DEV) { + console.warn('[tenant-platform][IM] store review realtime error', error) + } + }) + clientInstance.connect() + imClient = clientInstance +} + +export function disconnectStoreReviewRealtime() { + if (imClient) { + imClient.disconnect() + imClient = null + } + activeAppKey = '' +} + +export function notifyStoreReviewRefresh(appKey: string) { + if (appKey && appKey === activeAppKey) { + ElMessage.info('检测到审核状态更新,正在刷新...') + } +}