docs(deploy): 移除 Jenkins 配置和 Android Demo 计划文档

- 删除 jenkins-setup.md 完整的 Jenkins 服务配置指南
- 更新 README.md 部署文档标题为公有化部署文档
- 添加私有化部署说明章节和相关设计文档链接
- 从 REST API 设计文档中移除 demo-service 相关描述
- 更新推送架构图中业务服务端描述为客户端服务器
- 删除 android-demo-plan.md Android Demo 开发计划文档
- 删除 multi-platform-im-roadmap.md 多平台 IM 路线图文档
- 删除 java-im-server-sdk-plan.md Java IM 服务端 SDK 计划文档
这个提交包含在:
XuqmGroup 2026-05-18 17:57:05 +08:00
父节点 d08a6fd16a
当前提交 57f8b36fab
共有 9 个文件被更改,包括 113 次插入711 次删除

查看文件

@ -13,7 +13,6 @@ export default defineConfig({
nav: [ nav: [
{ text: '快速开始', link: '/guide/quickstart' }, { text: '快速开始', link: '/guide/quickstart' },
{ text: '演示项目', link: '/demo/' },
{ {
text: 'SDK', text: 'SDK',
items: [ items: [
@ -37,9 +36,6 @@ export default defineConfig({
{ text: '平台概念', link: '/guide/concepts' }, { text: '平台概念', link: '/guide/concepts' },
{ text: '接入流程', link: '/guide/flow' }, { text: '接入流程', link: '/guide/flow' },
], ],
'/demo/': [
{ text: '演示项目', link: '/demo/' },
],
'/android/': [ '/android/': [
{ text: '概览', link: '/android/' }, { text: '概览', link: '/android/' },
{ text: '安装配置', link: '/android/setup' }, { text: '安装配置', link: '/android/setup' },

查看文件

@ -1,125 +0,0 @@
# 演示项目
下面这些入口对应当前仓库里的可用演示物料。
## 移动端
<div class="demo-grid">
<div class="demo-card">
<h2>Android SDK Sample App</h2>
<p>适合验证 Android SDK 的 IM、推送和更新能力。</p>
<img
alt="Android SDK Sample App 下载二维码"
src="https://api.qrserver.com/v1/create-qr-code/?size=220x220&data=https%3A%2F%2Fdev.xuqinmin.com%2Fdocs%2Fdemo%2Fandroid-sdk-sample-app.apk"
/>
<p><a href="/demo/android-sdk-sample-app.apk">下载 APK</a></p>
</div>
<div class="demo-card">
<h2>RN Chat Demo</h2>
<p>适合验证 React Native 演示项目和服务端 demo 数据。</p>
<img
alt="RN Chat Demo 下载二维码"
src="https://api.qrserver.com/v1/create-qr-code/?size=220x220&data=https%3A%2F%2Fdev.xuqinmin.com%2Fdocs%2Fdemo%2Frn-chat-demo.apk"
/>
<p><a href="/demo/rn-chat-demo.apk">下载 APK</a></p>
</div>
<div class="demo-card">
<h2>Flutter Chat Demo</h2>
<p>Flutter 端 IM + 推送演示,支持 Android / iOS 双端。</p>
<img
alt="Flutter Chat Demo 下载二维码"
src="https://api.qrserver.com/v1/create-qr-code/?size=220x220&data=https%3A%2F%2Fdev.xuqinmin.com%2Fdocs%2Fdemo%2Fflutter-chat-demo.apk"
/>
<p><a href="/demo/flutter-chat-demo.apk">下载 APKAndroid</a></p>
</div>
</div>
## Web
<div class="demo-grid">
<div class="demo-card">
<h2>租户控制台</h2>
<p>登录后可直接进入应用管理、IM、推送管理、版本管理等页面。</p>
<p>
<a href="https://dev.xuqinmin.com" target="_blank" rel="noreferrer">打开控制台</a>
</p>
</div>
<div class="demo-card">
<h2>IM 演示页</h2>
<p>基于 Vue3 SDK 的在线 IM 聊天演示,可直接体验消息收发。</p>
<p>
<a href="https://dev.xuqinmin.com/apps/ak_demo_chat/im" target="_blank" rel="noreferrer">打开 IM 演示页</a>
</p>
</div>
<div class="demo-card">
<h2>H5 SDK 在线演示</h2>
<p>纯 JS 环境下的 IM 接入示例,框架无关,可查看源码参考。</p>
<p>
<a href="/h5/">H5 SDK 文档</a>
<span style="padding:0 8px;">·</span>
<a href="/server/api">API 速查</a>
</p>
</div>
</div>
## 服务端示例
<div class="demo-grid">
<div class="demo-card">
<h2>Go 服务端示例</h2>
<p>使用 Go Server SDK 发送 IM 消息和 Push 推送的完整示例。</p>
<p>
<a href="/server/go-sdk">Go SDK 文档</a>
</p>
</div>
<div class="demo-card">
<h2>Java 服务端示例</h2>
<p>使用 Java Server SDK 集成 IM 和 Push 的 Spring Boot 示例。</p>
<p>
<a href="/server/java-sdk">Java SDK 文档</a>
</p>
</div>
<div class="demo-card">
<h2>Python 服务端示例</h2>
<p>使用 Python Server SDK 发送消息和推送的示例脚本。</p>
<p>
<a href="/server/python-sdk">Python SDK 文档</a>
</p>
</div>
</div>
<style>
.demo-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 16px;
margin: 16px 0 28px;
}
.demo-card {
border: 1px solid var(--vp-c-divider);
border-radius: 8px;
padding: 16px;
background: var(--vp-c-bg-soft);
}
.demo-card h2 {
margin: 0 0 8px;
font-size: 18px;
}
.demo-card p {
margin: 8px 0;
line-height: 1.6;
}
.demo-card img {
display: block;
width: 220px;
height: 220px;
margin: 12px 0;
background: #fff;
}
</style>

查看文件

@ -1,131 +1,55 @@
# 接入流程 # 接入流程
完整的 XuqmGroup SDK 接入流程,从注册账号到客户端收发消息 本文说明公有化和私有化两种接入流程
--- ## 公有化流程
## 1. 注册开发者账号 1. 访问 <https://dev.xuqinmin.com>
2. 注册开发者账号。
3. 创建应用并获取 `appKey`
4. 业务服务端保存 `appSecret`
5. 客户端使用公有化 SDK 初始化。
6. 业务服务端签发 `UserSig`
7. 客户端登录 SDK 并开始收发消息。
1. 访问 [XuqmGroup 控制台](https://dev.xuqinmin.com) ## 私有化流程
2. 点击注册,填写企业/个人信息
3. 完成邮箱/手机验证
--- 1. 运维在私有化部署仓库执行一键部署。
2. 部署脚本使用用户提供的 MySQL、Redis、域名、证书、SMTP 和厂商凭证完成配置。
3. 系统初始化内置主租户、运营管理员和默认应用。
4. 文档站生成私有化 SDK 接入示例。
5. 客户端集成私有化 SDK。
6. 客户端使用 `xuqm-private-sdk.json` 初始化。
7. 业务服务端签发 `UserSig`
8. 客户端登录 SDK 并使用 IM、Push、Update、File、License 能力。
## 2. 创建应用 ## 服务端签发 UserSig
1. 登录控制台 → 应用管理 → 创建应用 服务端可以通过服务端 SDK 本地生成 `UserSig`,也可以调用平台接口生成。`appSecret` 必须只保存在服务端。
2. 填写应用名称、平台类型Android / iOS / Web / RN / 小程序 / HarmonyOS
3. 创建成功后获得:
- `appKey`(客户端使用)
--- ```text
业务服务端
## 3. 获取 AppKey -> 持有 appKey / appSecret
-> 根据业务用户 ID 签发 UserSig
在应用详情页复制 `appKey`,用于客户端 SDK 初始化: -> 返回给客户端
```kotlin
// Android
XuqmSDK.initialize(context, appKey = "your_app_key")
``` ```
```swift ## 客户端登录
// iOS
XuqmSDK.shared.initialize(config: config)
```
```ts ```text
// Vue3 / Web
```
---
## 4. 服务端签发 UserSig
服务端可以通过 SDK 本地生成 `UserSig`,也可以通过 IM 管理页生成并校验。
如果账号需要用于服务端 SDK / 管理端 REST API,请把该注册用户标记为管理员。
### 签发逻辑(示例)
```ts
// Node.js
import jwt from 'jsonwebtoken'
return jwt.sign(
{ userId, appKey, iat: Math.floor(Date.now() / 1000) },
appSecret,
{ algorithm: 'HS256', expiresIn: '180d' }
)
}
```
```python
# Python
import jwt
import time
def generate_user_sig(user_id: str, app_key: str, app_secret: str) -> str:
return jwt.encode(
{"userId": user_id, "appKey": app_key, "iat": int(time.time())},
app_secret,
algorithm="HS256"
)
```
```go
// Go
import "github.com/golang-jwt/jwt/v5"
import "time"
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"userId": userID,
"appKey": appKey,
"iat": time.Now().Unix(),
})
}
```
### 接口设计建议
```
POST /api/auth/xuqm-login
Headers: Authorization: Bearer {your-app-auth-token}
Body: { "userId": "user_001" }
Response: { "userSig": "jwt_token_string" }
```
---
## 5. 客户端接入 SDK
### 登录流程
```
客户端 客户端
→ 业务登录(用户名/密码) -> 业务登录成功
→ 业务服务端验证成功 -> 获取 userSig
→ 返回 userSig 给客户端 -> XuqmSDK.login(userId, userSig)
→ 客户端调用 XuqmSDK.login(userId, userSig) -> IM WebSocket 连接
→ 开始收发消息 -> Push / Update / License 模块按需工作
``` ```
### 各平台接入 ## 私有化注意事项
| 平台 | 文档 | 1. 私有化环境不开放主租户注册。
|------|------| 2. 私有化 SDK 不使用 `dev.xuqinmin.com` 作为默认地址。
| Android | [Android SDK →](/android/) | 3. 厂商推送和应用市场自动发布需要客户网络放通厂商公网 API。
| iOS | [iOS SDK →](/ios/) | 4. MySQL、Redis 由客户提供,部署脚本只做连接校验。
| React Native | [RN SDK →](/rn/) |
| Vue3 / Web | [Vue3 SDK →](/vue3/) |
| HarmonyOS | [HarmonyOS SDK →](/harmony/) |
| 微信小程序 | [小程序 SDK →](/miniprogram/) |
--- [快速开始](./quickstart)
## 安全提示
- 所有 API 通信使用 HTTPS
- UserSig 当前版本不过期,业务方可自行控制签发逻辑
[→ 快速开始 →](./quickstart)

查看文件

@ -2,117 +2,100 @@
5 分钟接入 XuqmGroup IM,实现消息收发。 5 分钟接入 XuqmGroup IM,实现消息收发。
## 1. 注册账号与创建应用 ## 1. 选择部署形态
1. 访问 [XuqmGroup 控制台](https://dev.xuqinmin.com) | 形态 | 适用场景 | SDK |
2. 注册开发者账号,创建应用 |------|----------|-----|
3. 记录 `appKey` | 公有化 | 使用 XuqmGroup 公有云控制台 | 当前公有化 SDK |
| 私有化 | 使用客户独立部署环境 | 独立私有化 SDK |
## 2. 选择你的平台 公有化控制台地址:<https://dev.xuqinmin.com>
私有化环境由部署仓库生成控制台地址、文档站地址和 `xuqm-private-sdk.json`,接入时以客户环境输出为准。
## 2. 创建或获取应用
公有化:
1. 登录公有化控制台。
2. 注册开发者账号。
3. 创建应用并记录 `appKey`
私有化:
1. 使用部署时内置的主租户登录客户控制台。
2. 使用初始化默认应用,或在控制台创建新应用。
3. 下载或读取 `xuqm-private-sdk.json`
## 3. 选择平台
### 客户端 SDK ### 客户端 SDK
| 平台 | 推荐接入方式 | | 平台 | 接入文档 |
|------|------------| |------|----------|
| Android | [Android SDK →](/android/) | | Android | [Android SDK](/android/) |
| iOS | [iOS SDK →](/ios/) | | iOS | [iOS SDK](/ios/) |
| React Native | [RN SDK →](/rn/) | | React Native | [RN SDK](/rn/) |
| Vue3 / Web | [Vue3 SDK →](/vue3/) | | Vue3 / Web | [Vue3 SDK](/vue3/) |
| HarmonyOS | [HarmonyOS SDK →](/harmony/) | | HarmonyOS | [HarmonyOS SDK](/harmony/) |
| Flutter | [Flutter SDK →](/flutter/) | | Flutter | [Flutter SDK](/flutter/) |
| 微信小程序 | [小程序 SDK →](/miniprogram/) | | 微信小程序 | [小程序 SDK](/miniprogram/) |
| H5 / 纯 JS | [H5 SDK →](/h5/) | | H5 / 纯 JS | [H5 SDK](/h5/) |
### 服务端 SDK ### 服务端 SDK
| 语言 | 接入方式 | | 语言 | 接入文档 |
|------|---------| |------|----------|
| Go | [Go Server SDK](/server/go-sdk) | | Go | [Go Server SDK](/server/go-sdk) |
| Java | [Java Server SDK](/server/java-sdk) | | Java | [Java Server SDK](/server/java-sdk) |
| Python | [Python Server SDK](/server/python-sdk) | | Python | [Python Server SDK](/server/python-sdk) |
## 3. 接入流程 ## 4. 公有化初始化
``` ```kotlin
你的业务服务端 XuqmSDK.initialize(
→ 持有 appSecret context = this,
→ 调用 IM 登录接口换取 IM Token或签发 UserSig JWT appKey = "ak_your_app_key"
→ 平台内部协议字段由 SDK 和后端自动处理,业务方无需感知 )
→ 返回 Token / UserSig 给客户端
客户端 SDK
→ 使用 appKey 初始化
→ 使用 Token / UserSig 登录 IM
→ 开始收发消息
``` ```
> **安全提示**appSecret 应仅在你的服务端持有,不应下发给客户端。 ## 5. 私有化初始化
--- 私有化 SDK 使用部署仓库生成的本地 JSON 初始化:
## 4. Android Demo 运行说明 ```kotlin
XuqmPrivateSDK.initialize(
### 环境要求 context = this,
configAsset = "xuqm-private-sdk.json"
- Android Studio Ladybug2024.2.1)或更高版本 )
- JDK 21
- Android 模拟器或真机API 24+
### 运行步骤
1. 打开 `XuqmGroup-AndroidSDK` 目录为 Android Studio 项目
2. 等待 Gradle Sync 完成(首次可能需要下载依赖)
3. 在 `sample-app/src/main/java/.../MainActivity.kt` 或对应配置中修改服务器地址(如需连接本地环境)
4. 选择模拟器或真机,点击 **Run 'sample-app'**
### 关键路径
```
APK 输出XuqmGroup-AndroidSDK/sample-app/build/outputs/apk/debug/sample-app-debug.apk
主 Activitycom.xuqm.sdk.sample.MainActivity
包名com.xuqm.demo
``` ```
### 常用命令 JSON 内容由私有化部署仓库生成,示例:
```bash ```json
# 构建全量 SDK + App {
cd XuqmGroup-AndroidSDK && ./gradlew clean build "schemaVersion": 1,
"deployment": "PRIVATE",
# 安装到指定设备 "appKey": "ak_private_default",
adb -s emulator-5556 install -r sample-app/build/outputs/apk/debug/sample-app-debug.apk "controlBaseUrl": "https://tenant.customer.com",
"imApiBaseUrl": "https://im.customer.com",
# 查看 IM 日志 "imWsUrl": "wss://im.customer.com/ws/im",
adb -s emulator-5556 logcat -d "*:S" XuqmImSDK:D XuqmImClient:D 2>/dev/null | tail -30 "pushBaseUrl": "https://push.customer.com",
"updateBaseUrl": "https://update.customer.com",
"fileBaseUrl": "https://file.customer.com",
"licenseBaseUrl": "https://license.customer.com"
}
``` ```
--- ## 6. 登录与收发消息
## 5. iOS Demo 运行说明 ```text
业务客户端
### 环境要求 -> 调用业务登录
-> 业务服务端签发 UserSig
- Xcode 16.0 或更高版本 -> 客户端调用 SDK login
- iOS 18 模拟器或真机(最低支持 iOS 14 -> IM 连接建立
- Swift 5.9+ -> 收发消息、推送、更新、License 能力按模块启用
### 运行步骤
1. 打开 `XuqmGroup-iOSSDK/XuqmDemo/XuqmDemo.xcodeproj`(或 `.xcworkspace`
2. 等待 Swift Package Manager 依赖解析完成
3. 在 Xcode 顶部选择目标模拟器(如 iPhone 16 Pro或连接的真机
4. 点击 **Run**(⌘+R
### 关键路径
```
Demo 工程XuqmGroup-iOSSDK/XuqmDemo/XuqmDemo.xcodeproj
SDK 源码XuqmGroup-iOSSDK/Sources/XuqmSDK/
单元测试XuqmGroup-iOSSDK/Tests/
``` ```
### 常见问题 安全要求:`appSecret` 只能保存在业务服务端,不允许下发到客户端。
- **SPM 依赖下载慢**:检查网络或更换 Xcode → Preferences → Accounts → Git 配置
- **真机运行失败**:确保 Apple Developer Account 已配置 Signing & Capabilities
- **Push 测试**:模拟器不支持 APNs,Push 功能需在真机测试

查看文件

@ -8,9 +8,6 @@ hero:
- theme: brand - theme: brand
text: 快速开始 text: 快速开始
link: /guide/quickstart link: /guide/quickstart
- theme: alt
text: 演示项目
link: /demo/
- theme: alt - theme: alt
text: 平台控制台 text: 平台控制台
link: https://dev.xuqinmin.com link: https://dev.xuqinmin.com
@ -52,8 +49,4 @@ features:
title: 服务端 API title: 服务端 API
details: 完整 REST API 速查,IM 实时连接协议说明 details: 完整 REST API 速查,IM 实时连接协议说明
link: /server/api link: /server/api
- icon: 📱
title: 演示项目
details: 手机端扫码下载演示包,Web 端直接跳转到对应页面
link: /demo/
--- ---

查看文件

@ -1 +0,0 @@
This is a placeholder APK payload for demo update flow.

查看文件

@ -1,279 +0,0 @@
# 部署文档
## 一、基础设施要求
| 组件 | 版本 | 说明 |
|------|------|------|
| JDK | 21 | GraalVM 或 Eclipse Temurin |
| MySQL | 8.0+ | 4 个独立数据库 |
| Redis | 7.x | 验证码、会话标记 |
| Nginx | 1.24+ | 前端静态 + API 反代 |
| Maven | 3.9+ | 后端构建 |
| Node.js | 22+ | 前端构建 |
---
## 二、数据库初始化
服务启动时通过 `ddl-auto: update` 自动建表,只需提前创建数据库:
```sql
CREATE DATABASE xuqm_tenant CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE xuqm_im CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE xuqm_push CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE xuqm_update CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```
---
## 三、后端构建与启动
### 构建
```bash
cd XuqmGroup-Server
mvn clean package -DskipTests
```
各模块 jar 生成于 `{module}/target/{module}-0.1.0-SNAPSHOT.jar`
### 环境变量
**tenant-service**:8081
```bash
export SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/xuqm_tenant?...
export SPRING_DATASOURCE_USERNAME=xuqm
export SPRING_DATASOURCE_PASSWORD=your_db_password
export SPRING_DATA_REDIS_HOST=redis
export SPRING_MAIL_USERNAME=noreply@xuqm.com
export SPRING_MAIL_PASSWORD=your_smtp_password
export JWT_SECRET=your_256bit_secret
export OPS_ADMIN_USERNAME=admin
export OPS_ADMIN_PASSWORD=your_ops_password
```
**im-service**:8082
```bash
export SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/xuqm_im?...
export SPRING_DATASOURCE_USERNAME=xuqm
export SPRING_DATASOURCE_PASSWORD=your_db_password
export SPRING_DATA_REDIS_HOST=redis
export JWT_SECRET=your_256bit_secret_im
```
**push-service**:8083
```bash
export SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/xuqm_push?...
export SPRING_DATASOURCE_USERNAME=xuqm
export SPRING_DATASOURCE_PASSWORD=your_db_password
export JWT_SECRET=your_256bit_secret_push
# 华为推送
export HUAWEI_APP_ID=your_huawei_app_id
export HUAWEI_APP_SECRET=your_huawei_secret
# 小米推送
export XIAOMI_APP_SECRET=your_xiaomi_secret
# iOS APNs
export APNS_KEY_ID=your_key_id
export APNS_TEAM_ID=your_team_id
export APNS_KEY_PATH=/opt/xuqm/apns_key.p8
export APNS_BUNDLE_ID=com.yourcompany.app
```
**update-service**:8084
```bash
export SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/xuqm_update?...
export SPRING_DATASOURCE_USERNAME=xuqm
export SPRING_DATASOURCE_PASSWORD=your_db_password
export JWT_SECRET=your_256bit_secret_update
export UPDATE_UPLOAD_DIR=/data/xuqm/update
export UPDATE_BASE_URL=https://update.xuqm.com
```
### 启动
```bash
java -jar tenant-service/target/tenant-service-*.jar &
java -jar im-service/target/im-service-*.jar &
java -jar push-service/target/push-service-*.jar &
java -jar update-service/target/update-service-*.jar &
```
---
## 四、前端构建与部署
```bash
cd XuqmGroup-Web
yarn install
yarn workspace tenant-platform build # dist/ → /var/www/tenant
yarn workspace ops-platform build # dist/ → /var/www/ops
```
### Nginx 配置
```nginx
# 租户开放平台
server {
listen 80;
server_name tenant.xuqm.com;
root /var/www/tenant;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://127.0.0.1:8081/api/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# 运营管理平台
server {
listen 80;
server_name ops.xuqm.com;
root /var/www/ops;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://127.0.0.1:8081/api/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# IM WebSocket 反代
server {
listen 80;
server_name im.xuqm.com;
location /ws/im {
proxy_pass http://127.0.0.1:8082;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
location /api/im/ {
proxy_pass http://127.0.0.1:8082/api/im/;
}
}
# 版本管理文件服务
server {
listen 80;
server_name update.xuqm.com;
location / {
proxy_pass http://127.0.0.1:8084/;
}
}
```
---
## 五、Docker Compose可选
```yaml
version: '3.9'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: xuqm
MYSQL_PASSWORD: xuqm_password
volumes:
- mysql_data:/var/lib/mysql
ports:
- "3306:3306"
redis:
image: redis:7-alpine
ports:
- "6379:6379"
tenant-service:
image: eclipse-temurin:21-jre
volumes:
- ./XuqmGroup-Server/tenant-service/target:/app
command: java -jar /app/tenant-service-0.1.0-SNAPSHOT.jar
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/xuqm_tenant?...
SPRING_DATA_REDIS_HOST: redis
ports:
- "8081:8081"
depends_on: [mysql, redis]
im-service:
image: eclipse-temurin:21-jre
volumes:
- ./XuqmGroup-Server/im-service/target:/app
command: java -jar /app/im-service-0.1.0-SNAPSHOT.jar
ports:
- "8082:8082"
depends_on: [mysql, redis]
push-service:
image: eclipse-temurin:21-jre
volumes:
- ./XuqmGroup-Server/push-service/target:/app
command: java -jar /app/push-service-0.1.0-SNAPSHOT.jar
ports:
- "8083:8083"
depends_on: [mysql]
update-service:
image: eclipse-temurin:21-jre
volumes:
- ./XuqmGroup-Server/update-service/target:/app
- update_files:/data/xuqm/update
command: java -jar /app/update-service-0.1.0-SNAPSHOT.jar
environment:
UPDATE_UPLOAD_DIR: /data/xuqm/update
ports:
- "8084:8084"
depends_on: [mysql]
volumes:
mysql_data:
update_files:
```
---
## 六、发版流程汇总
| 平台 | 步骤 |
|------|------|
| **后端** | `mvn clean package` → 替换 jar → 重启服务 |
| **前端** | `yarn build` → 替换 `dist/` → Nginx 无需重启 |
| **Android SDK** | 修改版本号 → `./gradlew publish` → Nexus |
| **iOS SDK (SPM)** | 修改版本号 → `git tag x.y.z && git push origin x.y.z` |
| **iOS SDK (CocoaPods)** | `pod repo push xuqm-specs XuqmSDK.podspec` |
| **RN SDK** | 修改 `package.json` version → `npm publish` |
| **Vue3 SDK** | 修改 `package.json` version → `npm run build && npm publish` |
| **HarmonyOS SDK** | 修改 `oh-package.json5` version → `ohpm publish` |
---
## 七、健康检查
各服务均暴露 Spring Actuator 端点:
```bash
curl http://localhost:8081/actuator/health
curl http://localhost:8082/actuator/health
curl http://localhost:8083/actuator/health
curl http://localhost:8084/actuator/health
```
正常返回:`{"status":"UP"}`

查看文件

@ -1,89 +0,0 @@
# XuqmGroup 平台文档总览
> 版本0.1.0 | 最后更新2026-04-21
## 仓库索引
| 仓库 | 语言/框架 | Gogs 地址 | 说明 |
|------|-----------|-----------|------|
| [XuqmGroup-Server](./server/README.md) | Java 21 / Spring Boot 3.4 | https://xuqinmin.com/xuqinmin12/XuqmGroup-Server | 后端多模块服务 |
| [XuqmGroup-Web](./web/README.md) | Vue 3.5 / TypeScript | https://xuqinmin.com/xuqinmin12/XuqmGroup-Web | 租户平台 + 运营平台前端 |
| [XuqmGroup-AndroidSDK](./android-sdk/README.md) | Kotlin 2.3 / AGP 9.1 | https://xuqinmin.com/xuqinmin12/XuqmGroup-AndroidSDK | Android SDK |
| [XuqmGroup-iOSSDK](./ios-sdk/README.md) | Swift 5.9 / iOS 16+ | https://xuqinmin.com/xuqinmin12/XuqmGroup-iOSSDK | iOS SDK |
| [XuqmGroup-RNSDK](./rn-sdk/README.md) | TypeScript / RN 0.76+ | https://xuqinmin.com/xuqinmin12/XuqmGroup-RNSDK | React Native SDK |
| [XuqmGroup-Vue3SDK](./vue3-sdk/README.md) | TypeScript / Vue 3.5 | https://xuqinmin.com/xuqinmin12/XuqmGroup-Vue3SDK | Vue3 Web SDK |
| [XuqmGroup-HarmonySDK](./harmony-sdk/README.md) | ArkTS / HarmonyOS 5 | https://xuqinmin.com/xuqinmin12/XuqmGroup-HarmonySDK | 鸿蒙 SDK |
## 整体架构
```
┌─────────────────────────────────────────────────────────────┐
│ 客户端层 │
│ Android SDK iOS SDK RN SDK Vue3 SDK HarmonyOS SDK │
└───────────────────────────┬─────────────────────────────────┘
│ HTTPS / WSS
┌───────────────────────────▼─────────────────────────────────┐
│ 服务端层 │
│ ┌────────────┐ ┌──────────┐ ┌───────────┐ ┌────────────┐ │
│ │tenant-svc │ │im-service│ │push-svc │ │update-svc │ │
│ │ :8081 │ │ :8082 │ │ :8083 │ │ :8084 │ │
│ └─────┬──────┘ └────┬─────┘ └─────┬─────┘ └──────┬─────┘ │
│ └─────────────┴─────────────┴───────────────┘ │
│ ↓ JPA / JDBC │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ MySQL 8 (xuqm_tenant / xuqm_im / xuqm_push / │ │
│ │ xuqm_update) + Redis 7 │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 前端层 │
│ 租户开放平台 :5173 运营管理平台 :5174 │
└─────────────────────────────────────────────────────────────┘
```
## 核心概念
| 概念 | 说明 |
|------|------|
| **租户 (Tenant)** | 在开放平台注册的主账号,可创建子账号 |
| **应用 (App)** | 租户创建的业务应用,具有唯一 appKey/appSecret |
| **功能服务 (FeatureService)** | 挂载在 App 下的服务实例IM / 推送 / 版本管理,按平台Android / iOS / HarmonyOS独立开启 |
| **IM 账号** | 业务方通过 appKey 在 IM 服务创建的用户,仅存 userId,不存昵称/头像 |
| **运营平台** | 内部管理后台,独立账号体系,不与租户共用 |
## 统一响应格式
所有 HTTP 接口均返回:
```json
{
"code": 200,
"status": "0",
"data": { ... },
"message": "success"
}
```
| 字段 | 含义 |
|------|------|
| `code` | HTTP 语义码,200 成功,4xx/5xx 失败 |
| `status` | `"0"` 成功,`"1"` 业务失败 |
| `data` | 业务数据,失败时为 null |
| `message` | 错误描述 |
## 认证方式
- **租户平台**`Authorization: Bearer <tenant_jwt>`,由 `POST /api/auth/login` 颁发
- **IM 服务**`Authorization: Bearer <im_jwt>`,由 `POST /api/im/auth/login` 颁发;WebSocket 连接时通过 URL 参数 `?token=<im_jwt>` 传递
- **运营平台**`Authorization: Bearer <ops_jwt>`,由 `POST /api/auth/ops/login` 颁发
## 发版信息
| 平台 | Registry | 命令 |
|------|----------|------|
| npm (RN SDK / Vue3 SDK) | https://nexus.xuqinmin.com/repository/npm-hosted/ | `npm publish` |
| Android Maven | https://nexus.xuqinmin.com/repository/android-hosted/ | `./gradlew publish` |
| iOS SPM | Git Tag | `git tag x.y.z && git push origin x.y.z` |
| iOS CocoaPods | https://xuqinmin.com/xuqinmin12/xuqm-specs | `pod repo push xuqm-specs XuqmSDK.podspec` |
| HarmonyOS | ohpm (OpenHarmony Package Manager) | `ohpm publish` |