From 662df6e09034d6cb2ac500359b91edbac9dde61e Mon Sep 17 00:00:00 2001 From: XuqmGroup Date: Tue, 28 Apr 2026 16:08:07 +0800 Subject: [PATCH] =?UTF-8?q?feat(sample):=20=E6=B7=BB=E5=8A=A0=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B=E5=BA=94=E7=94=A8=E7=9A=84=E6=A0=B8=E5=BF=83=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实现环境配置管理,支持外部和本地主机模式切换 - 集成Demo API接口,包含登录、注册、文件上传等功能 - 构建附件处理仓库,支持图片、视频、音频和文件发送 - 开发认证仓库,管理用户会话和IM令牌刷新机制 - 添加语音录制功能,支持实时音频消息录制 - 创建依赖注入容器,统一管理应用组件实例 - 实现登录界面,提供用户认证交互功能 - 开发聊天界面,集成消息收发和媒体处理功能 --- ops-platform/components.d.ts | 3 + ops-platform/src/api/client.ts | 18 + ops-platform/vite.config.ts | 18 +- tenant-platform/components.d.ts | 11 + tenant-platform/src/api/app.ts | 6 + tenant-platform/src/api/client.ts | 18 + tenant-platform/src/api/im.ts | 20 +- tenant-platform/src/api/update.ts | 20 +- .../src/views/apps/AppDetailView.vue | 28 + tenant-platform/vite.config.ts | 18 +- yarn.lock | 813 +++++++++++++++++- 11 files changed, 966 insertions(+), 7 deletions(-) diff --git a/ops-platform/components.d.ts b/ops-platform/components.d.ts index 401dbe6..a6347d7 100644 --- a/ops-platform/components.d.ts +++ b/ops-platform/components.d.ts @@ -12,6 +12,7 @@ declare module 'vue' { ElCard: typeof import('element-plus/es')['ElCard'] ElCol: typeof import('element-plus/es')['ElCol'] ElContainer: typeof import('element-plus/es')['ElContainer'] + ElDialog: typeof import('element-plus/es')['ElDialog'] ElForm: typeof import('element-plus/es')['ElForm'] ElFormItem: typeof import('element-plus/es')['ElFormItem'] ElHeader: typeof import('element-plus/es')['ElHeader'] @@ -20,8 +21,10 @@ declare module 'vue' { ElMain: typeof import('element-plus/es')['ElMain'] ElMenu: typeof import('element-plus/es')['ElMenu'] ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] + ElOption: typeof import('element-plus/es')['ElOption'] ElPagination: typeof import('element-plus/es')['ElPagination'] ElRow: typeof import('element-plus/es')['ElRow'] + ElSelect: typeof import('element-plus/es')['ElSelect'] ElStatistic: typeof import('element-plus/es')['ElStatistic'] ElTable: typeof import('element-plus/es')['ElTable'] ElTableColumn: typeof import('element-plus/es')['ElTableColumn'] diff --git a/ops-platform/src/api/client.ts b/ops-platform/src/api/client.ts index 91acb67..ee9ad5b 100644 --- a/ops-platform/src/api/client.ts +++ b/ops-platform/src/api/client.ts @@ -4,6 +4,24 @@ const client = axios.create({ baseURL: import.meta.env.VITE_API_BASE_URL ?? '/api', }) +if (import.meta.env.DEV) { + client.interceptors.request.use((config) => { + console.debug('[ops-platform][HTTP] request', { + method: config.method?.toUpperCase(), + url: config.baseURL ? `${config.baseURL}${config.url ?? ''}` : config.url, + params: config.params, + }) + return config + }) + client.interceptors.response.use((res) => { + console.debug('[ops-platform][HTTP] response', { + status: res.status, + url: res.config.url, + }) + return res + }) +} + client.interceptors.request.use((config) => { const token = localStorage.getItem('ops_token') if (token) config.headers.Authorization = `Bearer ${token}` diff --git a/ops-platform/vite.config.ts b/ops-platform/vite.config.ts index 520d39c..ca0ef5c 100644 --- a/ops-platform/vite.config.ts +++ b/ops-platform/vite.config.ts @@ -17,10 +17,26 @@ export default defineConfig(({ mode }) => { resolve: { alias: { '@': new URL('./src', import.meta.url).pathname }, }, + build: { + chunkSizeWarningLimit: 1000, + rollupOptions: { + output: { + manualChunks(id) { + if (!id.includes('node_modules')) return undefined + if (id.includes('element-plus')) return 'element-plus' + if (id.includes('@element-plus/icons-vue')) return 'element-plus-icons' + if (id.includes('vue-router')) return 'vue-router' + if (id.includes('pinia')) return 'pinia' + if (id.includes('axios')) return 'axios' + return 'vendor' + }, + }, + }, + }, server: { port: 5174, proxy: { - '/api': { target: 'http://localhost:8081', changeOrigin: true }, + '/api': { target: 'http://192.168.116.9:8081', changeOrigin: true }, }, }, } diff --git a/tenant-platform/components.d.ts b/tenant-platform/components.d.ts index 22f905c..35b94b1 100644 --- a/tenant-platform/components.d.ts +++ b/tenant-platform/components.d.ts @@ -13,22 +13,31 @@ declare module 'vue' { ElCard: typeof import('element-plus/es')['ElCard'] ElCol: typeof import('element-plus/es')['ElCol'] ElContainer: typeof import('element-plus/es')['ElContainer'] + ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] ElDescriptions: typeof import('element-plus/es')['ElDescriptions'] ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem'] ElDialog: typeof import('element-plus/es')['ElDialog'] ElDropdown: typeof import('element-plus/es')['ElDropdown'] ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem'] ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu'] + ElEmpty: typeof import('element-plus/es')['ElEmpty'] ElForm: typeof import('element-plus/es')['ElForm'] ElFormItem: typeof import('element-plus/es')['ElFormItem'] ElHeader: typeof import('element-plus/es')['ElHeader'] ElIcon: typeof import('element-plus/es')['ElIcon'] ElInput: typeof import('element-plus/es')['ElInput'] + ElInputNumber: typeof import('element-plus/es')['ElInputNumber'] ElMain: typeof import('element-plus/es')['ElMain'] ElMenu: typeof import('element-plus/es')['ElMenu'] ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] + ElOption: typeof import('element-plus/es')['ElOption'] ElPageHeader: typeof import('element-plus/es')['ElPageHeader'] + ElPagination: typeof import('element-plus/es')['ElPagination'] + ElRadioButton: typeof import('element-plus/es')['ElRadioButton'] + ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] ElRow: typeof import('element-plus/es')['ElRow'] + ElSelect: typeof import('element-plus/es')['ElSelect'] + ElSlider: typeof import('element-plus/es')['ElSlider'] ElStatistic: typeof import('element-plus/es')['ElStatistic'] ElStep: typeof import('element-plus/es')['ElStep'] ElSteps: typeof import('element-plus/es')['ElSteps'] @@ -41,6 +50,8 @@ declare module 'vue' { ElText: typeof import('element-plus/es')['ElText'] ElTimeline: typeof import('element-plus/es')['ElTimeline'] ElTimelineItem: typeof import('element-plus/es')['ElTimelineItem'] + ElTooltip: typeof import('element-plus/es')['ElTooltip'] + ElUpload: typeof import('element-plus/es')['ElUpload'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] } diff --git a/tenant-platform/src/api/app.ts b/tenant-platform/src/api/app.ts index b0b3e83..04f1a7d 100644 --- a/tenant-platform/src/api/app.ts +++ b/tenant-platform/src/api/app.ts @@ -25,6 +25,7 @@ export interface FeatureService { platform: 'ANDROID' | 'IOS' | 'HARMONY' serviceType: 'IM' | 'PUSH' | 'UPDATE' enabled: boolean + config?: string | null createdAt: string } @@ -47,6 +48,11 @@ export const appApi = { params: { platform, serviceType, enable }, }), + updateServiceConfig: (appId: string, platform: string, serviceType: string, allowStrangerMessage: boolean) => + client.put<{ data: FeatureService }>(`/apps/${appId}/services/config`, null, { + params: { platform, serviceType, allowStrangerMessage }, + }), + requestSecretVerify: (appId: string, purpose: 'REVEAL_SECRET' | 'RESET_SECRET') => client.post<{ data: null }>(`/apps/${appId}/request-secret-verify`, null, { params: { purpose }, diff --git a/tenant-platform/src/api/client.ts b/tenant-platform/src/api/client.ts index 798bdc1..535f5d4 100644 --- a/tenant-platform/src/api/client.ts +++ b/tenant-platform/src/api/client.ts @@ -7,6 +7,24 @@ const client = axios.create({ timeout: 15000, }) +if (import.meta.env.DEV) { + client.interceptors.request.use((config) => { + console.debug('[tenant-platform][HTTP] request', { + method: config.method?.toUpperCase(), + url: config.baseURL ? `${config.baseURL}${config.url ?? ''}` : config.url, + params: config.params, + }) + return config + }) + client.interceptors.response.use((res) => { + console.debug('[tenant-platform][HTTP] response', { + status: res.status, + url: res.config.url, + }) + return res + }) +} + client.interceptors.request.use((config) => { const token = localStorage.getItem('token') if (token) { diff --git a/tenant-platform/src/api/im.ts b/tenant-platform/src/api/im.ts index 267ac3d..050346f 100644 --- a/tenant-platform/src/api/im.ts +++ b/tenant-platform/src/api/im.ts @@ -1,10 +1,28 @@ import axios from 'axios' const imClient = axios.create({ - baseURL: 'https://dev.xuqinmin.com', + baseURL: 'http://192.168.116.9:8082', timeout: 15000, }) +if (import.meta.env.DEV) { + imClient.interceptors.request.use((config) => { + console.debug('[tenant-platform][IM] request', { + method: config.method?.toUpperCase(), + url: config.baseURL ? `${config.baseURL}${config.url ?? ''}` : config.url, + params: config.params, + }) + return config + }) + imClient.interceptors.response.use((res) => { + console.debug('[tenant-platform][IM] response', { + status: res.status, + url: res.config.url, + }) + return res + }) +} + imClient.interceptors.request.use((config) => { const token = localStorage.getItem('token') if (token) config.headers.Authorization = `Bearer ${token}` diff --git a/tenant-platform/src/api/update.ts b/tenant-platform/src/api/update.ts index 1ae51b5..10b536c 100644 --- a/tenant-platform/src/api/update.ts +++ b/tenant-platform/src/api/update.ts @@ -1,10 +1,28 @@ import axios from 'axios' const updateClient = axios.create({ - baseURL: 'https://dev.xuqinmin.com', + baseURL: 'http://192.168.116.9:8084', timeout: 30000, }) +if (import.meta.env.DEV) { + updateClient.interceptors.request.use((config) => { + console.debug('[tenant-platform][UPDATE] request', { + method: config.method?.toUpperCase(), + url: config.baseURL ? `${config.baseURL}${config.url ?? ''}` : config.url, + params: config.params, + }) + return config + }) + updateClient.interceptors.response.use((res) => { + console.debug('[tenant-platform][UPDATE] response', { + status: res.status, + url: res.config.url, + }) + return res + }) +} + updateClient.interceptors.request.use((config) => { const token = localStorage.getItem('token') if (token) config.headers.Authorization = `Bearer ${token}` diff --git a/tenant-platform/src/views/apps/AppDetailView.vue b/tenant-platform/src/views/apps/AppDetailView.vue index 33734b1..4eb844f 100644 --- a/tenant-platform/src/views/apps/AppDetailView.vue +++ b/tenant-platform/src/views/apps/AppDetailView.vue @@ -56,6 +56,13 @@ 版本管理 → +
+ 允许陌生人发消息 + +