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 计划文档
这个提交包含在:
父节点
d08a6fd16a
当前提交
57f8b36fab
@ -13,7 +13,6 @@ export default defineConfig({
|
||||
|
||||
nav: [
|
||||
{ text: '快速开始', link: '/guide/quickstart' },
|
||||
{ text: '演示项目', link: '/demo/' },
|
||||
{
|
||||
text: 'SDK',
|
||||
items: [
|
||||
@ -37,9 +36,6 @@ export default defineConfig({
|
||||
{ text: '平台概念', link: '/guide/concepts' },
|
||||
{ text: '接入流程', link: '/guide/flow' },
|
||||
],
|
||||
'/demo/': [
|
||||
{ text: '演示项目', link: '/demo/' },
|
||||
],
|
||||
'/android/': [
|
||||
{ text: '概览', link: '/android/' },
|
||||
{ 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">下载 APK(Android)</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. 登录控制台 → 应用管理 → 创建应用
|
||||
2. 填写应用名称、平台类型(Android / iOS / Web / RN / 小程序 / HarmonyOS)
|
||||
3. 创建成功后获得:
|
||||
- `appKey`(客户端使用)
|
||||
服务端可以通过服务端 SDK 本地生成 `UserSig`,也可以调用平台接口生成。`appSecret` 必须只保存在服务端。
|
||||
|
||||
---
|
||||
|
||||
## 3. 获取 AppKey
|
||||
|
||||
在应用详情页复制 `appKey`,用于客户端 SDK 初始化:
|
||||
|
||||
```kotlin
|
||||
// Android
|
||||
XuqmSDK.initialize(context, appKey = "your_app_key")
|
||||
```text
|
||||
业务服务端
|
||||
-> 持有 appKey / appSecret
|
||||
-> 根据业务用户 ID 签发 UserSig
|
||||
-> 返回给客户端
|
||||
```
|
||||
|
||||
```swift
|
||||
// iOS
|
||||
XuqmSDK.shared.initialize(config: config)
|
||||
```
|
||||
## 客户端登录
|
||||
|
||||
```ts
|
||||
// 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
|
||||
|
||||
### 登录流程
|
||||
|
||||
```
|
||||
```text
|
||||
客户端
|
||||
→ 业务登录(用户名/密码)
|
||||
→ 业务服务端验证成功
|
||||
→ 返回 userSig 给客户端
|
||||
→ 客户端调用 XuqmSDK.login(userId, userSig)
|
||||
→ 开始收发消息
|
||||
-> 业务登录成功
|
||||
-> 获取 userSig
|
||||
-> XuqmSDK.login(userId, userSig)
|
||||
-> IM WebSocket 连接
|
||||
-> Push / Update / License 模块按需工作
|
||||
```
|
||||
|
||||
### 各平台接入
|
||||
## 私有化注意事项
|
||||
|
||||
| 平台 | 文档 |
|
||||
|------|------|
|
||||
| Android | [Android SDK →](/android/) |
|
||||
| iOS | [iOS SDK →](/ios/) |
|
||||
| React Native | [RN SDK →](/rn/) |
|
||||
| Vue3 / Web | [Vue3 SDK →](/vue3/) |
|
||||
| HarmonyOS | [HarmonyOS SDK →](/harmony/) |
|
||||
| 微信小程序 | [小程序 SDK →](/miniprogram/) |
|
||||
1. 私有化环境不开放主租户注册。
|
||||
2. 私有化 SDK 不使用 `dev.xuqinmin.com` 作为默认地址。
|
||||
3. 厂商推送和应用市场自动发布需要客户网络放通厂商公网 API。
|
||||
4. MySQL、Redis 由客户提供,部署脚本只做连接校验。
|
||||
|
||||
---
|
||||
|
||||
## 安全提示
|
||||
|
||||
- 所有 API 通信使用 HTTPS
|
||||
- UserSig 当前版本不过期,业务方可自行控制签发逻辑
|
||||
|
||||
[→ 快速开始 →](./quickstart)
|
||||
[快速开始](./quickstart)
|
||||
|
||||
@ -2,117 +2,100 @@
|
||||
|
||||
5 分钟接入 XuqmGroup IM,实现消息收发。
|
||||
|
||||
## 1. 注册账号与创建应用
|
||||
## 1. 选择部署形态
|
||||
|
||||
1. 访问 [XuqmGroup 控制台](https://dev.xuqinmin.com)
|
||||
2. 注册开发者账号,创建应用
|
||||
3. 记录 `appKey`
|
||||
| 形态 | 适用场景 | SDK |
|
||||
|------|----------|-----|
|
||||
| 公有化 | 使用 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
|
||||
|
||||
| 平台 | 推荐接入方式 |
|
||||
|------|------------|
|
||||
| Android | [Android SDK →](/android/) |
|
||||
| iOS | [iOS SDK →](/ios/) |
|
||||
| React Native | [RN SDK →](/rn/) |
|
||||
| Vue3 / Web | [Vue3 SDK →](/vue3/) |
|
||||
| HarmonyOS | [HarmonyOS SDK →](/harmony/) |
|
||||
| Flutter | [Flutter SDK →](/flutter/) |
|
||||
| 微信小程序 | [小程序 SDK →](/miniprogram/) |
|
||||
| H5 / 纯 JS | [H5 SDK →](/h5/) |
|
||||
| 平台 | 接入文档 |
|
||||
|------|----------|
|
||||
| Android | [Android SDK](/android/) |
|
||||
| iOS | [iOS SDK](/ios/) |
|
||||
| React Native | [RN SDK](/rn/) |
|
||||
| Vue3 / Web | [Vue3 SDK](/vue3/) |
|
||||
| HarmonyOS | [HarmonyOS SDK](/harmony/) |
|
||||
| Flutter | [Flutter SDK](/flutter/) |
|
||||
| 微信小程序 | [小程序 SDK](/miniprogram/) |
|
||||
| H5 / 纯 JS | [H5 SDK](/h5/) |
|
||||
|
||||
### 服务端 SDK
|
||||
|
||||
| 语言 | 接入方式 |
|
||||
|------|---------|
|
||||
| Go | [Go Server SDK →](/server/go-sdk) |
|
||||
| Java | [Java Server SDK →](/server/java-sdk) |
|
||||
| Python | [Python Server SDK →](/server/python-sdk) |
|
||||
| 语言 | 接入文档 |
|
||||
|------|----------|
|
||||
| Go | [Go Server SDK](/server/go-sdk) |
|
||||
| Java | [Java Server SDK](/server/java-sdk) |
|
||||
| Python | [Python Server SDK](/server/python-sdk) |
|
||||
|
||||
## 3. 接入流程
|
||||
## 4. 公有化初始化
|
||||
|
||||
```
|
||||
你的业务服务端
|
||||
→ 持有 appSecret
|
||||
→ 调用 IM 登录接口换取 IM Token(或签发 UserSig JWT)
|
||||
→ 平台内部协议字段由 SDK 和后端自动处理,业务方无需感知
|
||||
→ 返回 Token / UserSig 给客户端
|
||||
|
||||
客户端 SDK
|
||||
→ 使用 appKey 初始化
|
||||
→ 使用 Token / UserSig 登录 IM
|
||||
→ 开始收发消息
|
||||
```kotlin
|
||||
XuqmSDK.initialize(
|
||||
context = this,
|
||||
appKey = "ak_your_app_key"
|
||||
)
|
||||
```
|
||||
|
||||
> **安全提示**:appSecret 应仅在你的服务端持有,不应下发给客户端。
|
||||
## 5. 私有化初始化
|
||||
|
||||
---
|
||||
私有化 SDK 使用部署仓库生成的本地 JSON 初始化:
|
||||
|
||||
## 4. Android Demo 运行说明
|
||||
|
||||
### 环境要求
|
||||
|
||||
- Android Studio Ladybug(2024.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
|
||||
主 Activity:com.xuqm.sdk.sample.MainActivity
|
||||
包名:com.xuqm.demo
|
||||
```kotlin
|
||||
XuqmPrivateSDK.initialize(
|
||||
context = this,
|
||||
configAsset = "xuqm-private-sdk.json"
|
||||
)
|
||||
```
|
||||
|
||||
### 常用命令
|
||||
JSON 内容由私有化部署仓库生成,示例:
|
||||
|
||||
```bash
|
||||
# 构建全量 SDK + App
|
||||
cd XuqmGroup-AndroidSDK && ./gradlew clean build
|
||||
|
||||
# 安装到指定设备
|
||||
adb -s emulator-5556 install -r sample-app/build/outputs/apk/debug/sample-app-debug.apk
|
||||
|
||||
# 查看 IM 日志
|
||||
adb -s emulator-5556 logcat -d "*:S" XuqmImSDK:D XuqmImClient:D 2>/dev/null | tail -30
|
||||
```json
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"deployment": "PRIVATE",
|
||||
"appKey": "ak_private_default",
|
||||
"controlBaseUrl": "https://tenant.customer.com",
|
||||
"imApiBaseUrl": "https://im.customer.com",
|
||||
"imWsUrl": "wss://im.customer.com/ws/im",
|
||||
"pushBaseUrl": "https://push.customer.com",
|
||||
"updateBaseUrl": "https://update.customer.com",
|
||||
"fileBaseUrl": "https://file.customer.com",
|
||||
"licenseBaseUrl": "https://license.customer.com"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
## 6. 登录与收发消息
|
||||
|
||||
## 5. iOS Demo 运行说明
|
||||
|
||||
### 环境要求
|
||||
|
||||
- Xcode 16.0 或更高版本
|
||||
- iOS 18 模拟器或真机(最低支持 iOS 14)
|
||||
- Swift 5.9+
|
||||
|
||||
### 运行步骤
|
||||
|
||||
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/
|
||||
```text
|
||||
业务客户端
|
||||
-> 调用业务登录
|
||||
-> 业务服务端签发 UserSig
|
||||
-> 客户端调用 SDK login
|
||||
-> IM 连接建立
|
||||
-> 收发消息、推送、更新、License 能力按模块启用
|
||||
```
|
||||
|
||||
### 常见问题
|
||||
|
||||
- **SPM 依赖下载慢**:检查网络或更换 Xcode → Preferences → Accounts → Git 配置
|
||||
- **真机运行失败**:确保 Apple Developer Account 已配置 Signing & Capabilities
|
||||
- **Push 测试**:模拟器不支持 APNs,Push 功能需在真机测试
|
||||
安全要求:`appSecret` 只能保存在业务服务端,不允许下发到客户端。
|
||||
|
||||
@ -8,9 +8,6 @@ hero:
|
||||
- theme: brand
|
||||
text: 快速开始
|
||||
link: /guide/quickstart
|
||||
- theme: alt
|
||||
text: 演示项目
|
||||
link: /demo/
|
||||
- theme: alt
|
||||
text: 平台控制台
|
||||
link: https://dev.xuqinmin.com
|
||||
@ -52,8 +49,4 @@ features:
|
||||
title: 服务端 API
|
||||
details: 完整 REST API 速查,IM 实时连接协议说明
|
||||
link: /server/api
|
||||
- icon: 📱
|
||||
title: 演示项目
|
||||
details: 手机端扫码下载演示包,Web 端直接跳转到对应页面
|
||||
link: /demo/
|
||||
---
|
||||
|
||||
二进制文件未显示。
@ -1 +0,0 @@
|
||||
This is a placeholder APK payload for demo update flow.
|
||||
279
docs/DEPLOY.md
279
docs/DEPLOY.md
@ -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` |
|
||||
正在加载...
在新工单中引用
屏蔽一个用户