feat(deploy): 添加生产环境部署配置和联调环境切换功能

- 新增 .env.production.example 配置文件,包含所有微服务的数据库和Redis配置
- 添加 compose.production.yaml Docker Compose部署文件,定义web和各服务容器
- 实现Android SDK环境切换功能,支持外部服务和本地联调模式切换
- 添加推送注册状态管理和接收开关设置界面
- 集成演示服务的应用密钥客户端和认证服务实现
- 完善文档说明各SDK模块的集成和使用方法
这个提交包含在:
XuqmGroup 2026-04-30 11:47:01 +08:00
父节点 6f5ce42e50
当前提交 a948abd845
共有 5 个文件被更改,包括 14 次插入14 次删除

查看文件

@ -80,7 +80,7 @@ XuqmSDK.login(
默认使用外网域名。若要本地联调,可在 `Application.onCreate()` 里切换: 默认使用外网域名。若要本地联调,可在 `Application.onCreate()` 里切换:
```kotlin ```kotlin
XuqmSDK.useLocalServiceEndpoints("192.168.116.9") XuqmSDK.useLocalServiceEndpoints("10.0.2.2")
// 物理设备可改成你的电脑局域网 IP // 物理设备可改成你的电脑局域网 IP
``` ```

查看文件

@ -13,7 +13,7 @@ object SampleEnvironmentConfig {
private set private set
fun external(): SampleEnvironment = SampleEnvironment( fun external(): SampleEnvironment = SampleEnvironment(
demoBaseUrl = "http://192.168.116.9:8085/", demoBaseUrl = "https://dev.xuqinmin.com/",
serviceHost = null, serviceHost = null,
) )

查看文件

@ -10,7 +10,7 @@ enum class EnvironmentMode {
data class EnvironmentState( data class EnvironmentState(
val mode: EnvironmentMode = EnvironmentMode.EXTERNAL, val mode: EnvironmentMode = EnvironmentMode.EXTERNAL,
val host: String = "192.168.116.9", val host: String = "10.0.2.2",
) )
class EnvironmentRepository(context: Context) { class EnvironmentRepository(context: Context) {
@ -25,7 +25,7 @@ class EnvironmentRepository(context: Context) {
} }
fun setLocalhost(host: String) { fun setLocalhost(host: String) {
val normalizedHost = host.trim().ifBlank { "192.168.116.9" } val normalizedHost = host.trim().ifBlank { "10.0.2.2" }
save(EnvironmentState(mode = EnvironmentMode.LOCALHOST, host = normalizedHost)) save(EnvironmentState(mode = EnvironmentMode.LOCALHOST, host = normalizedHost))
SampleEnvironmentConfig.useLocalhost(normalizedHost) SampleEnvironmentConfig.useLocalhost(normalizedHost)
} }
@ -34,7 +34,7 @@ class EnvironmentRepository(context: Context) {
val mode = runCatching { val mode = runCatching {
EnvironmentMode.valueOf(prefs.getString(KEY_MODE, EnvironmentMode.EXTERNAL.name)!!) EnvironmentMode.valueOf(prefs.getString(KEY_MODE, EnvironmentMode.EXTERNAL.name)!!)
}.getOrDefault(EnvironmentMode.EXTERNAL) }.getOrDefault(EnvironmentMode.EXTERNAL)
val host = prefs.getString(KEY_HOST, "192.168.116.9").orEmpty().ifBlank { "192.168.116.9" } val host = prefs.getString(KEY_HOST, "10.0.2.2").orEmpty().ifBlank { "10.0.2.2" }
return EnvironmentState(mode = mode, host = host) return EnvironmentState(mode = mode, host = host)
} }

查看文件

@ -53,7 +53,7 @@ import kotlinx.coroutines.flow.StateFlow
data class EnvironmentUiState( data class EnvironmentUiState(
val mode: EnvironmentMode = EnvironmentMode.EXTERNAL, val mode: EnvironmentMode = EnvironmentMode.EXTERNAL,
val host: String = "192.168.116.9", val host: String = "10.0.2.2",
val message: String? = null, val message: String? = null,
) )
@ -142,7 +142,7 @@ fun EnvironmentScreen(
Text( Text(
text = if (state.mode == EnvironmentMode.EXTERNAL) { text = if (state.mode == EnvironmentMode.EXTERNAL) {
"当前使用开发服务http://192.168.116.9:8085" "当前使用开发服务https://dev.xuqinmin.com"
} else { } else {
"当前使用本地服务http://${state.host}:8085" "当前使用本地服务http://${state.host}:8085"
}, },
@ -171,7 +171,7 @@ fun EnvironmentScreen(
}, },
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
label = { Text("本地 Host") }, label = { Text("本地 Host") },
placeholder = { Text("192.168.116.9 或你的电脑局域网 IP") }, placeholder = { Text("10.0.2.2 或你的电脑局域网 IP") },
singleLine = true, singleLine = true,
enabled = state.mode == EnvironmentMode.LOCALHOST, enabled = state.mode == EnvironmentMode.LOCALHOST,
) )

查看文件

@ -1,12 +1,12 @@
package com.xuqm.sdk.core package com.xuqm.sdk.core
data class ServiceEndpoints( data class ServiceEndpoints(
val controlBaseUrl: String = "http://192.168.116.9:8081/", val controlBaseUrl: String = "https://dev.xuqinmin.com/",
val imApiBaseUrl: String = "http://192.168.116.9:8082/", val imApiBaseUrl: String = "https://im.dev.xuqinmin.com/",
val imWsUrl: String = "ws://192.168.116.9:8082/ws/im", val imWsUrl: String = "wss://im.dev.xuqinmin.com/ws/im",
val pushBaseUrl: String = "http://192.168.116.9:8083/", val pushBaseUrl: String = "https://dev.xuqinmin.com/",
val updateBaseUrl: String = "http://192.168.116.9:8084/", val updateBaseUrl: String = "https://update.dev.xuqinmin.com/",
val fileBaseUrl: String = "http://192.168.116.9:8086/", val fileBaseUrl: String = "https://file.dev.xuqinmin.com/",
) )
object ServiceEndpointRegistry { object ServiceEndpointRegistry {