685 lines
17 KiB
Markdown
685 lines
17 KiB
Markdown
# 云数据同步
|
||
|
||
<cite>
|
||
**本文档引用的文件**
|
||
- [WxCloudApi.ts](file://assets/script/game/wx_clound_client_api/WxCloudApi.ts)
|
||
- [index.js](file://build-templates/wechatgame/cloud_functions/cocos_cloud/index.js)
|
||
- [config.json](file://build-templates/wechatgame/cloud_functions/cocos_cloud/config.json)
|
||
- [deploy.md](file://build-templates/wechatgame/cloud_functions/cocos_cloud/deploy.md)
|
||
- [wx.aip.d.ts](file://assets/script/game/wx_clound_client_api/wx.aip.d.ts)
|
||
- [NetCode.json](file://assets/resources/config/game/NetCode.json)
|
||
</cite>
|
||
|
||
## 目录
|
||
1. [简介](#简介)
|
||
2. [系统架构概览](#系统架构概览)
|
||
3. [核心组件分析](#核心组件分析)
|
||
4. [WxCloudApi.ts详解](#wxcloudapits详解)
|
||
5. [云函数服务端实现](#云函数服务端实现)
|
||
6. [数据流与调用流程](#数据流与调用流程)
|
||
7. [错误处理与状态码](#错误处理与状态码)
|
||
8. [前端调用示例](#前端调用示例)
|
||
9. [部署与配置](#部署与配置)
|
||
10. [安全性与最佳实践](#安全性与最佳实践)
|
||
11. [故障排除与优化](#故障排除与优化)
|
||
12. [总结](#总结)
|
||
|
||
## 简介
|
||
|
||
本项目实现了基于微信云开发的云数据同步解决方案,为Cocos Creator游戏提供云端用户数据存储与同步功能。系统采用前后端分离架构,通过云函数处理业务逻辑,确保数据安全性和一致性。
|
||
|
||
核心功能包括:
|
||
- 用户身份认证与自动创建
|
||
- 游戏进度数据的云端存储与获取
|
||
- 数据版本控制与冲突解决
|
||
- 错误处理与重试机制
|
||
- 安全性保障与权限控制
|
||
|
||
## 系统架构概览
|
||
|
||
```mermaid
|
||
graph TB
|
||
subgraph "客户端层"
|
||
Game[游戏客户端]
|
||
WxCloud[WxCloudApi.ts]
|
||
end
|
||
subgraph "微信云开发平台"
|
||
CloudFunc[云函数:cocos_cloud]
|
||
Database[(云数据库)]
|
||
Storage[(云存储)]
|
||
end
|
||
subgraph "微信服务器"
|
||
WXServer[微信服务器]
|
||
OpenID[用户OpenID]
|
||
end
|
||
Game --> WxCloud
|
||
WxCloud --> CloudFunc
|
||
CloudFunc --> Database
|
||
CloudFunc --> WXServer
|
||
WXServer --> OpenID
|
||
Database --> Storage
|
||
```
|
||
|
||
**图表来源**
|
||
- [WxCloudApi.ts](file://assets/script/game/wx_clound_client_api/WxCloudApi.ts#L1-L94)
|
||
- [index.js](file://build-templates/wechatgame/cloud_functions/cocos_cloud/index.js#L1-L85)
|
||
|
||
## 核心组件分析
|
||
|
||
### 前端组件
|
||
|
||
**WxCloudApi类** 提供了统一的云服务接口,封装了微信云开发的复杂性,为游戏逻辑提供简洁的API。
|
||
|
||
**主要特性:**
|
||
- 单例模式设计,确保全局唯一实例
|
||
- 异步操作支持,避免阻塞主线程
|
||
- 泛型类型安全,提供完整的TypeScript支持
|
||
- 错误码标准化,便于统一处理
|
||
|
||
### 后端组件
|
||
|
||
**云函数服务** 运行在微信云开发环境中,负责处理所有业务逻辑和数据操作。
|
||
|
||
**核心功能:**
|
||
- 用户身份验证与自动注册
|
||
- 数据持久化与查询
|
||
- 权限控制与安全验证
|
||
- 错误日志记录与监控
|
||
|
||
**章节来源**
|
||
- [WxCloudApi.ts](file://assets/script/game/wx_clound_client_api/WxCloudApi.ts#L1-L94)
|
||
- [index.js](file://build-templates/wechatgame/cloud_functions/cocos_cloud/index.js#L1-L85)
|
||
|
||
## WxCloudApi.ts详解
|
||
|
||
### 类结构设计
|
||
|
||
```mermaid
|
||
classDiagram
|
||
class WxCloudApi {
|
||
+init(env : string) void
|
||
+login() Promise~CloudCallFunctionResult~
|
||
+save(gameData : any) Promise~CloudCallFunctionResult~
|
||
+get() Promise~CloudCallFunctionResult~
|
||
}
|
||
class CloudReturnType {
|
||
+code : number
|
||
+msg? : string
|
||
+data? : T
|
||
}
|
||
class CloudCallFunctionResult {
|
||
+result : T
|
||
+errMsg : string
|
||
+requestID : string
|
||
}
|
||
WxCloudApi --> CloudReturnType : "返回"
|
||
CloudReturnType --> CloudCallFunctionResult : "嵌套"
|
||
```
|
||
|
||
**图表来源**
|
||
- [WxCloudApi.ts](file://assets/script/game/wx_clound_client_api/WxCloudApi.ts#L1-L94)
|
||
- [wx.aip.d.ts](file://assets/script/game/wx_clound_client_api/wx.aip.d.ts#L1-L29)
|
||
|
||
### init方法实现机制
|
||
|
||
**功能描述:** 初始化微信云开发环境,建立客户端与云服务的连接。
|
||
|
||
**实现特点:**
|
||
- 单次调用原则:每个游戏会话只需初始化一次
|
||
- 环境参数配置:支持动态环境切换
|
||
- 平台兼容性:条件调用,避免非微信环境下报错
|
||
|
||
**调用时机:** 游戏启动时,在主场景加载完成后调用。
|
||
|
||
### login方法实现机制
|
||
|
||
**功能描述:** 执行用户登录流程,获取用户身份信息和游戏数据。
|
||
|
||
**数据结构定义:**
|
||
|
||
| 字段名 | 类型 | 描述 | 必填 |
|
||
|--------|------|------|------|
|
||
| code | number | 状态码,200表示成功 | 是 |
|
||
| msg | string | 错误信息(失败时) | 否 |
|
||
| data | object | 用户数据对象 | 是 |
|
||
| data.openid | string | 微信平台用户标识 | 是 |
|
||
| data.regist_time | number | 用户注册时间戳 | 是 |
|
||
| data.game_data | object | 游戏自定义数据 | 否 |
|
||
|
||
**调用流程:**
|
||
1. 调用微信云函数cocos_cloud
|
||
2. 传递cmd参数值为"login"
|
||
3. 云函数验证用户身份
|
||
4. 自动创建或查询用户记录
|
||
5. 返回用户完整信息
|
||
|
||
### save方法实现机制
|
||
|
||
**功能描述:** 将游戏数据保存到云端,实现数据的持久化存储。
|
||
|
||
**数据结构:**
|
||
- 接收任意类型的gameData对象
|
||
- 执行全覆盖式写入操作
|
||
- 支持复杂嵌套数据结构
|
||
|
||
**安全特性:**
|
||
- 数据完整性校验
|
||
- 操作日志记录
|
||
- 版本控制支持
|
||
|
||
### get方法实现机制
|
||
|
||
**功能描述:** 从云端获取用户的最新游戏数据。
|
||
|
||
**实现特点:**
|
||
- 实时数据拉取
|
||
- 缓存策略支持
|
||
- 数据一致性保障
|
||
|
||
**章节来源**
|
||
- [WxCloudApi.ts](file://assets/script/game/wx_clound_client_api/WxCloudApi.ts#L1-L94)
|
||
|
||
## 云函数服务端实现
|
||
|
||
### 服务端架构设计
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Client as 客户端
|
||
participant CloudFunc as 云函数
|
||
participant Database as 云数据库
|
||
participant WXServer as 微信服务器
|
||
Client->>CloudFunc : 调用云函数
|
||
CloudFunc->>WXServer : 获取用户OpenID
|
||
WXServer-->>CloudFunc : 返回用户标识
|
||
CloudFunc->>Database : 查询用户记录
|
||
Database-->>CloudFunc : 返回用户数据
|
||
alt 用户不存在
|
||
CloudFunc->>Database : 创建新用户记录
|
||
Database-->>CloudFunc : 返回新记录ID
|
||
end
|
||
CloudFunc->>Database : 执行数据操作
|
||
Database-->>CloudFunc : 返回操作结果
|
||
CloudFunc-->>Client : 返回处理结果
|
||
```
|
||
|
||
**图表来源**
|
||
- [index.js](file://build-templates/wechatgame/cloud_functions/cocos_cloud/index.js#L10-L85)
|
||
|
||
### getOrCreaterUser函数实现
|
||
|
||
**功能描述:** 核心用户管理逻辑,确保每个微信用户都有对应的数据库记录。
|
||
|
||
**实现细节:**
|
||
- 使用OpenID作为唯一标识符
|
||
- 自动检测用户是否存在
|
||
- 原子性操作保证数据一致性
|
||
- 异常处理机制
|
||
|
||
**数据模型:**
|
||
|
||
| 字段名 | 类型 | 描述 | 默认值 |
|
||
|--------|------|------|--------|
|
||
| _openid | string | 微信OpenID | 必填 |
|
||
| regist_time | number | 注册时间戳 | 当前时间 |
|
||
| game_data | object | 游戏数据 | {} |
|
||
|
||
### 登录处理逻辑
|
||
|
||
**流程分析:**
|
||
1. **身份验证**:通过cloud.getWXContext()获取用户上下文
|
||
2. **用户查询**:根据OpenID查找用户记录
|
||
3. **用户创建**:如用户不存在则自动创建
|
||
4. **数据返回**:返回完整的用户信息
|
||
|
||
**错误处理:**
|
||
- 数据库连接失败
|
||
- 用户查询超时
|
||
- 记录创建失败
|
||
|
||
### 数据保存逻辑
|
||
|
||
**操作流程:**
|
||
1. **数据验证**:检查传入的游戏数据格式
|
||
2. **用户确认**:确保用户记录存在
|
||
3. **数据更新**:使用原子更新操作
|
||
4. **结果反馈**:返回操作统计信息
|
||
|
||
**性能优化:**
|
||
- 批量操作支持
|
||
- 索引优化
|
||
- 连接池管理
|
||
|
||
**章节来源**
|
||
- [index.js](file://build-templates/wechatgame/cloud_functions/cocos_cloud/index.js#L1-L85)
|
||
|
||
## 数据流与调用流程
|
||
|
||
### 完整数据同步流程
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
Start([游戏启动]) --> Init["WxCloudApi.init()"]
|
||
Init --> Login["WxCloudApi.login()"]
|
||
Login --> LoginSuccess{"登录成功?"}
|
||
LoginSuccess --> |否| LoginFail["显示登录错误"]
|
||
LoginSuccess --> |是| LoadGameData["加载用户数据"]
|
||
LoadGameData --> GameLoop["游戏主循环"]
|
||
GameLoop --> SaveCheck{"需要保存数据?"}
|
||
SaveCheck --> |否| GameLoop
|
||
SaveCheck --> |是| SaveData["WxCloudApi.save()"]
|
||
SaveData --> SaveSuccess{"保存成功?"}
|
||
SaveSuccess --> |否| Retry["重试机制"]
|
||
SaveSuccess --> |是| GameLoop
|
||
Retry --> RetryCount{"重试次数<3?"}
|
||
RetryCount --> |是| SaveData
|
||
RetryCount --> |否| SaveFail["保存失败处理"]
|
||
LoginFail --> End([结束])
|
||
SaveFail --> End
|
||
SaveSuccess --> End
|
||
```
|
||
|
||
**图表来源**
|
||
- [WxCloudApi.ts](file://assets/script/game/wx_clound_client_api/WxCloudApi.ts#L15-L94)
|
||
- [index.js](file://build-templates/wechatgame/cloud_functions/cocos_cloud/index.js#L15-L50)
|
||
|
||
### 请求响应数据结构
|
||
|
||
**登录请求:**
|
||
```typescript
|
||
// 请求格式
|
||
{
|
||
cmd: "login"
|
||
}
|
||
|
||
// 响应格式
|
||
{
|
||
code: 200,
|
||
data: {
|
||
openid: "wx_openid_string",
|
||
regist_time: 1640995200000,
|
||
game_data: {
|
||
level: 10,
|
||
coins: 1000,
|
||
inventory: [...],
|
||
achievements: {...}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
**保存请求:**
|
||
```typescript
|
||
// 请求格式
|
||
{
|
||
cmd: "save",
|
||
data: {
|
||
level: 11,
|
||
coins: 1200,
|
||
inventory: [...],
|
||
achievements: {...}
|
||
}
|
||
}
|
||
|
||
// 响应格式
|
||
{
|
||
code: 200,
|
||
data: {
|
||
errMsg: "document.update:ok",
|
||
stats: {
|
||
updated: 1
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
**获取请求:**
|
||
```typescript
|
||
// 请求格式
|
||
{
|
||
cmd: "get"
|
||
}
|
||
|
||
// 响应格式
|
||
{
|
||
code: 200,
|
||
data: {
|
||
_id: "mongodb_document_id",
|
||
_openid: "wx_openid_string",
|
||
regist_time: 1640995200000,
|
||
game_data: {...}
|
||
}
|
||
}
|
||
```
|
||
|
||
## 错误处理与状态码
|
||
|
||
### 状态码定义
|
||
|
||
| 状态码 | 含义 | 处理方式 | 示例场景 |
|
||
|--------|------|----------|----------|
|
||
| 200 | 成功 | 正常处理 | 登录成功、数据保存成功 |
|
||
| -1 | 通用错误 | 重试或提示用户 | 网络超时、数据库错误 |
|
||
| -2 | 命令未知 | 检查参数 | 云函数参数错误 |
|
||
| -3 | 权限不足 | 提示授权 | 用户未授权 |
|
||
|
||
### 错误分类处理
|
||
|
||
**网络错误:**
|
||
- 连接超时:自动重试3次
|
||
- 断线重连:本地缓存待发送数据
|
||
- 网络恢复:批量同步缓存数据
|
||
|
||
**业务错误:**
|
||
- 用户不存在:触发重新登录
|
||
- 数据冲突:采用最后修改时间策略
|
||
- 权限验证失败:引导用户重新授权
|
||
|
||
**系统错误:**
|
||
- 云函数异常:降级到本地存储
|
||
- 数据库不可用:启用离线模式
|
||
- 服务端维护:显示维护公告
|
||
|
||
**章节来源**
|
||
- [NetCode.json](file://assets/resources/config/game/NetCode.json#L1-L11)
|
||
- [index.js](file://build-templates/wechatgame/cloud_functions/cocos_cloud/index.js#L15-L85)
|
||
|
||
## 前端调用示例
|
||
|
||
### 基础使用示例
|
||
|
||
```typescript
|
||
// 初始化云服务
|
||
WxCloudApi.init('your-cloud-env');
|
||
|
||
// 用户登录
|
||
async function handleLogin() {
|
||
try {
|
||
const result = await WxCloudApi.login();
|
||
|
||
if (result.result.code === 200) {
|
||
const userData = result.result.data;
|
||
console.log('登录成功:', userData);
|
||
// 更新游戏状态
|
||
game.user = userData;
|
||
loadGameProgress(userData.game_data);
|
||
} else {
|
||
console.error('登录失败:', result.result.msg);
|
||
showErrorMessage(result.result.msg);
|
||
}
|
||
} catch (error) {
|
||
console.error('登录异常:', error);
|
||
showNetworkError();
|
||
}
|
||
}
|
||
|
||
// 保存游戏进度
|
||
async function saveGameProgress(progressData: any) {
|
||
try {
|
||
const result = await WxCloudApi.save(progressData);
|
||
|
||
if (result.result.code === 200) {
|
||
console.log('保存成功');
|
||
game.lastSyncTime = Date.now();
|
||
} else {
|
||
console.error('保存失败:', result.result.msg);
|
||
// 触发重试机制
|
||
scheduleRetry(() => saveGameProgress(progressData));
|
||
}
|
||
} catch (error) {
|
||
console.error('保存异常:', error);
|
||
scheduleRetry(() => saveGameProgress(progressData));
|
||
}
|
||
}
|
||
```
|
||
|
||
### 高级使用模式
|
||
|
||
**批量操作:**
|
||
```typescript
|
||
async function batchSaveOperations(operations: Array<{type: string, data: any}>) {
|
||
for (const op of operations) {
|
||
switch (op.type) {
|
||
case 'progress':
|
||
await saveGameProgress(op.data);
|
||
break;
|
||
case 'achievement':
|
||
await saveAchievement(op.data);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
**数据同步策略:**
|
||
```typescript
|
||
class SyncManager {
|
||
private pendingSaves: Array<any> = [];
|
||
|
||
async queueSave(data: any) {
|
||
this.pendingSaves.push({
|
||
data,
|
||
timestamp: Date.now(),
|
||
retryCount: 0
|
||
});
|
||
await this.processQueue();
|
||
}
|
||
|
||
private async processQueue() {
|
||
while (this.pendingSaves.length > 0) {
|
||
const item = this.pendingSaves[0];
|
||
try {
|
||
await WxCloudApi.save(item.data);
|
||
this.pendingSaves.shift();
|
||
} catch (error) {
|
||
if (item.retryCount < 3) {
|
||
item.retryCount++;
|
||
await new Promise(resolve => setTimeout(resolve, 1000 * item.retryCount));
|
||
} else {
|
||
// 移除失败项,可能需要手动处理
|
||
this.pendingSaves.shift();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
## 部署与配置
|
||
|
||
### 云函数部署流程
|
||
|
||
**步骤1:环境准备**
|
||
```bash
|
||
# 进入云函数目录
|
||
cd build-templates/wechatgame/cloud_functions/cocos_cloud
|
||
|
||
# 安装依赖
|
||
npm install
|
||
|
||
# 验证安装
|
||
ls node_modules/wx-server-sdk
|
||
```
|
||
|
||
**步骤2:配置环境**
|
||
编辑config.json文件:
|
||
```json
|
||
{
|
||
"permissions": {
|
||
"openapi": [
|
||
// 可选的开放API列表
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
**步骤3:部署云函数**
|
||
使用微信开发者工具:
|
||
1. 打开项目根目录
|
||
2. 选择云函数cocos_cloud
|
||
3. 点击上传并部署
|
||
4. 验证部署状态
|
||
|
||
### 环境配置
|
||
|
||
**config.json配置项:**
|
||
|
||
| 配置项 | 类型 | 描述 | 示例值 |
|
||
|--------|------|------|--------|
|
||
| permissions.openapi | Array | 公开API权限列表 | [] |
|
||
| database | string | 数据库环境ID | "prod-123456" |
|
||
| storage | string | 存储环境ID | "storage-123456" |
|
||
|
||
**环境变量:**
|
||
- DYNAMIC_CURRENT_ENV:动态环境变量
|
||
- OPENID:用户唯一标识
|
||
- APP_ID:小程序APP ID
|
||
|
||
**章节来源**
|
||
- [deploy.md](file://build-templates/wechatgame/cloud_functions/cocos_cloud/deploy.md#L1-L32)
|
||
- [config.json](file://build-templates/wechatgame/cloud_functions/cocos_cloud/config.json#L1-L6)
|
||
|
||
## 安全性与最佳实践
|
||
|
||
### 权限控制机制
|
||
|
||
**_openid权限控制:**
|
||
- 每个用户只能访问自己的数据
|
||
- 数据操作必须通过云函数验证
|
||
- 防止跨用户数据泄露
|
||
|
||
**数据加密策略:**
|
||
- 敏感数据本地加密
|
||
- 传输过程使用HTTPS
|
||
- 定期轮换加密密钥
|
||
|
||
### 性能优化建议
|
||
|
||
**数据库优化:**
|
||
```javascript
|
||
// 在getOrCreaterUser函数中添加索引
|
||
await db.collection(user_db_name)
|
||
.where({ _openid: openid })
|
||
.orderBy('regist_time', 'desc')
|
||
.limit(1)
|
||
.get();
|
||
```
|
||
|
||
**缓存策略:**
|
||
- 客户端缓存最近使用的数据
|
||
- 设置合理的缓存过期时间
|
||
- 实现智能预加载机制
|
||
|
||
### 监控与日志
|
||
|
||
**关键指标监控:**
|
||
- API调用成功率
|
||
- 平均响应时间
|
||
- 错误率分布
|
||
- 用户活跃度
|
||
|
||
**日志记录:**
|
||
```javascript
|
||
// 在index.js中添加详细日志
|
||
console.log(`[${new Date().toISOString()}] User action:`, {
|
||
action: cmd,
|
||
openid: wxContext.OPENID,
|
||
timestamp: Date.now(),
|
||
duration: Date.now() - startTime
|
||
});
|
||
```
|
||
|
||
## 故障排除与优化
|
||
|
||
### 常见问题解决
|
||
|
||
**问题1:云函数部署失败**
|
||
```bash
|
||
# 错误:Cannot find module 'wx-server-sdk'
|
||
# 解决方案:
|
||
npm install wx-server-sdk --save
|
||
```
|
||
|
||
**问题2:登录失败**
|
||
- 检查微信登录状态
|
||
- 验证云环境配置
|
||
- 确认用户授权范围
|
||
|
||
**问题3:数据同步延迟**
|
||
- 优化网络连接
|
||
- 减少不必要的同步
|
||
- 实现增量同步机制
|
||
|
||
### 性能监控
|
||
|
||
**关键性能指标:**
|
||
- API响应时间:<200ms
|
||
- 成功率:>99%
|
||
- 错误率:<0.1%
|
||
- 并发处理能力:>1000 QPS
|
||
|
||
**监控告警:**
|
||
```javascript
|
||
// 添加性能监控
|
||
const performanceMonitor = {
|
||
recordApiCall(apiName, duration, success) {
|
||
// 发送到监控系统
|
||
sendMetrics({
|
||
apiName,
|
||
duration,
|
||
success,
|
||
timestamp: Date.now()
|
||
});
|
||
}
|
||
};
|
||
```
|
||
|
||
### 数据一致性保障
|
||
|
||
**多副本同步:**
|
||
- 主从复制机制
|
||
- 冲突检测算法
|
||
- 自动修复机制
|
||
|
||
**事务处理:**
|
||
```javascript
|
||
// 使用云数据库事务
|
||
const transaction = await db.startTransaction();
|
||
try {
|
||
// 执行多个操作
|
||
await transaction.collection('users')
|
||
.doc(userId)
|
||
.update({ data: { balance: newBalance } });
|
||
|
||
await transaction.collection('transactions')
|
||
.add({ data: transactionData });
|
||
|
||
await transaction.commit();
|
||
} catch (error) {
|
||
await transaction.rollback();
|
||
}
|
||
```
|
||
|
||
## 总结
|
||
|
||
本云数据同步解决方案提供了完整的微信云开发集成方案,具有以下优势:
|
||
|
||
**技术优势:**
|
||
- 基于微信原生云开发,稳定性高
|
||
- TypeScript类型安全,开发效率高
|
||
- 异步操作支持,用户体验好
|
||
- 完善的错误处理机制
|
||
|
||
**业务价值:**
|
||
- 用户数据云端存储,防止丢失
|
||
- 跨设备数据同步,提升用户体验
|
||
- 自动备份机制,降低运营成本
|
||
- 安全可靠,符合隐私保护要求
|
||
|
||
**扩展性:**
|
||
- 支持多种数据类型存储
|
||
- 易于添加新的业务功能
|
||
- 可扩展的权限控制系统
|
||
- 灵活的配置管理机制
|
||
|
||
通过合理使用这套云数据同步方案,开发者可以构建稳定可靠的云端游戏数据管理系统,为用户提供优质的云端游戏体验。 |