CloudBase / MongoDB 风格跨端身份系统方案

包含 集合设计、字段、CRUD 操作流程,直接可落地。


1️⃣ 集合设计

1. users(全局用户信息)

  • 存储跨平台通用的业务用户信息
  • _id:数据库自动生成(cloudbase自动生成)
  • global_user_id:自建 UUID,用于跨端统一标识
{
  "_id": "自动生成", // CloudBase 内部主键
  "global_user_id": "uuid_12345", // 自建 UUID,全局唯一
  "nickname": "小明",
  "avatar_url": "url1",
  "email": "",
  "phone": "",
  "created_at": 169234234,
  "updated_at": 169234567
}

2. user_identities(平台身份绑定)

  • 存储各平台账号信息和全局用户关联
  • _id:数据库自动生成(cloudbase自动生成)
  • platform_user_id:平台专用 ID(如小程序 _openid
  • global_user_id:关联 users.global_user_id
{
  "_id": "自动生成",  //cloudbase内部主键
  "global_user_id": "uuid_12345", // 关联 users.global_user_id
  "platform": "wechat", // 平台标识:wechat/apple/google等 
  "platform_user_id": "_openid",  //平台生成,平台专用id
  "credential": "token", //可选,存登录凭证
  "last_login_time": 169234567,
  "bind_time": 169234234
}

索引:platform + platform_user_id 唯一索引


2️⃣ CRUD 操作方案

2.1 查询用户(任意平台登录)

// 查询 user_identities
const identityRes = await db.collection('user_identities')
  .where({ platform: 'wechat', platform_user_id: '_openid' })
  .get();

if (identityRes.data.length > 0) {
  const globalUserId = identityRes.data[0].global_user_id;

  // 查询 users
  const userRes = await db.collection('users')
    .where({ global_user_id: globalUserId })
    .get();

  console.log(userRes.data[0]);
} else {
  // 用户不存在 → 新建流程
}

2.2 新建用户(首次登录)

// 生成全局 UUID
const newGlobalId = generateUUID();

// 插入 users
const userRes = await db.collection('users').add({
  global_user_id: newGlobalId,
  nickname: '新用户',
  avatar_url: '',
  created_at: Date.now(),
  updated_at: Date.now()
});

// 插入 user_identities
await db.collection('user_identities').add({
  global_user_id: newGlobalId,
  platform: 'wechat',
  platform_user_id: '_openid',
  bind_time: Date.now(),
  last_login_time: Date.now()
});

2.3 更新全局用户信息(users)

await db.collection('users').where({ global_user_id: 'uuid_12345' }).update({
  data: {
    nickname: '新昵称',
    avatar_url: '新头像',
    updated_at: Date.now()
  }
});

2.4 更新平台身份信息(user_identities)

await db.collection('user_identities')
  .where({ platform: 'wechat', platform_user_id: '_openid' })
  .update({
    data: {
      credential: '新token',
      last_login_time: Date.now()
    }
  });

2.5 新端绑定已有用户

await db.collection('user_identities')
  .where({ platform: 'apple', platform_user_id: 'apple_id_xyz' })
  .update({
    data: {
      global_user_id: 'uuid_12345',
      last_login_time: Date.now(),
      bind_time: Date.now()
    }
  }, { upsert: true });  // 如果不存在则插入

关键点:upsert 保证幂等操作,避免重复绑定。


3️⃣ 关键设计要点

  1. _id:数据库内部主键

  2. global_user_id:跨端业务主键,UUID 自建

  3. platform_user_id:平台专用 ID,用于区分不同平台用户

  4. 索引platform + platform_user_id 唯一索引

  5. CRUD 流程

    • 查询 → 判断是否存在
    • 新建 → 同步插入 users + user_identities
    • 更新 → 分别更新全局信息或平台信息
    • 绑定新端 → upsert + last_login_time

在 CloudBase / MongoDB 中,可以通过创建 复合唯一索引(compound unique index) 来保证 (platform, platform_user_id) 唯一,从而确保同一平台账号不会重复绑定。

下面详细说明:


1️⃣ MongoDB 原生方式(CloudBase 也适用)

// 获取集合对象
const db = wx.cloud.database();
const userIdentities = db.collection('user_identities');

// 使用 createIndex 创建复合唯一索引
await userIdentities.createIndex(
  { platform: 1, platform_user_id: 1 }, // 索引字段
  { unique: true }                       // 设置唯一约束
);
  • { platform: 1, platform_user_id: 1 } → 表示索引按升序排列两个字段
  • { unique: true } → 表示唯一索引,确保相同平台、相同用户 ID 只能存在一条记录

2️⃣ 在 CloudBase 控制台创建索引

  1. 打开 CloudBase 控制台 → 数据库 → 选择 user_identities 集合

  2. 点击 索引管理 → 新建索引

  3. 配置字段:

    • 字段1:platform
    • 字段2:platform_user_id
    • 类型:复合索引
    • 唯一:勾选
  4. 保存 → 系统会自动创建唯一复合索引


3️⃣ CRUD 操作保证幂等性

有了唯一索引后:

  • 插入新绑定记录:如果 (platform, platform_user_id) 已存在,会报错,可以用 upsert 或先查询再插入
  • 更新绑定记录:可以直接用 update,确保不会创建重复绑定

示例:

await db.collection('user_identities')
  .where({ platform: 'wechat', platform_user_id: '_openid' })
  .update({
    data: {
      global_user_id: 'uuid_12345',
      last_login_time: Date.now()
    }
  }, { upsert: true }); // 如果不存在则插入
  • upsert 配合唯一索引 → 自动防止重复绑定

  1. **创建复合唯一索引 ****(platform, platform_user_id)**

  2. 插入/绑定新端时

    • 先查询 → 决定是更新还是插入
    • 或使用 upsert → 唯一索引保证幂等
  3. 更新操作

    • 通过 (platform, platform_user_id) 精确定位
    • 不会违反唯一约束

✅ 这个方案适用于 微信小程序、H5、iOS、Android 等多平台登录,可直接在 CloudBase 上落地,保证跨端唯一性、可扩展性和业务逻辑清晰。