diff --git a/docs/uniCloud/uni-id.md b/docs/uniCloud/uni-id.md
index 5c0c48f97fc07e445984da3ec945eba288087e50..4a069d90a4699810e574d54b940d243686020a70 100644
--- a/docs/uniCloud/uni-id.md
+++ b/docs/uniCloud/uni-id.md
@@ -1,100 +1,100 @@
-# 需求背景
-
-99%的应用,都要开发用户注册、登录、发送短信验证码、密码加密保存、修改密码、token管理等功能,从前端到后端都需要。
-
-为什么不能有一个开源的通用项目,避免大家的重复开发呢?
-
-`uni-id`应需而生。
-
-`uni-id`为`uniCloud`开发者提供了简单、统一、可扩展的用户管理能力封装。
-
-# 组成部分
-`uni-id`包括如下组成部分:
-1. 云数据库
-
-主表为 `uni-id-users` 表,保存用户的基本信息。
-
-扩展字段有很多,如实名认证数据、工作履历数据,开发者可以自由扩展。
-
-2. 云函数
-
-提供一个名为`uni-id`的公共模块,该模块封装了一系列API,包括注册、登录、修改密码、设置头像等。
-
-示例工程中还提供了一个`user-center`的云函数,演示在云函数中如何调用`uni-id`公共模块。
-
-3. 前端调用
-
-前端示例通过callfunction调用云函数`user-center`,在注册和登录时保存token。
-
-uniCloud框架底层,会自动在callfunction时传递`uni-id`的token(uni-app 2.7.13+版本)。在云函数的event中可直接拿到`uni-id`的token。也就是说开发者无需自己管理token了。
-
-# uni-id 对开发者的价值
-1. 节省了大量重复劳动
-2. 降低门槛,前端开发者无需纠结怎样设计数据库设计才更合理
-3. 多系统打通用户和上下游协同
-
-关于第三点,着重强调下。
-
-一个应用,往往需要集成多个功能模块。比如一个电商应用,需要一个基本电商模板,还需要客服聊天模板,甚至还需要用户交流社区。
-
-在插件市场,每类模板插件都能找到,但他们如果不是基于同一套用户体系设计,就很难整合。
-
-DCloud推荐所有uniCloud的应用,都基于`uni-id`来做。
-
-有了统一的账户规范,并且围绕这套账户规范,有各种各样插件,那么开发者可以随意整合这些插件,让数据连同。
-
-规范,还可以让上下游充分协同。插件市场会出现各种数据迁移插件,比如把从discuz里把用户迁移到`uni-id`中的插件,相信围绕这套规范的产业链会非常活跃。
-
-# 现状和未来
-
-`uni-id`已完整的内容:
-
-- 注册、登录、发送短信验证码、密码加密保存、修改密码、token管理(短信验证码功能需要HBuilderX 2.8.3+)
-- 三方登录:App中的微信登录、微信小程序中的微信登录、支付宝小程序中的支付宝账户登录
-
-关于还缺少的部分,哪些DCloud在完善,哪些希望开发者给共同完善开源项目,计划与边界公布如下:
-
-1. 部分社交账户登录
-
-DCloud暂无计划开发百度、头条、QQ等小程序的登录,以及Apple ID、微博、QQ等App端的登录。欢迎其他开发者在开源项目上提交pr,共同完善`uni-id`。
-
-2. 邮箱验证和手机号一键认证sdk集成
-
-手机号一键认证sdk,目前插件市场里已经有不少相关插件,未来DCloud会整合到`uni-id`中。邮箱验证,DCloud暂无计划开发,有需求的开发者欢迎提供pr。
-
-3. 实名认证、活体检测
-
-目前插件市场里已经有不少相关插件,未来DCloud会整合到`uni-id`中。
-
-4. 权限管理ACL
-
-这部分欢迎开发者参与完善。
-
-其他方面,各种常见开源项目如discuz、wordPress、ecshop的用户导入插件,不属于`uni-id`主工程,欢迎开发者单独提交插件到插件市场。
-
-`uni-id`的git仓库:[https://gitee.com/dcloud/uni-id.git](https://gitee.com/dcloud/uni-id.git)
-
-
-# 快速上手
-
-使用uni-id需要按照以下步骤操作
-
-1. 准备2.7.14或以上版本的HBuilderX
-2. 插件市场导入`uni-id`公用模块,[插件市场 uni-id](https://ext.dcloud.net.cn/plugin?id=2116)
-3. 修改公用模块`uni-id`下的`config.json`内所需参数(请参考下面config.json的说明)
-4. 上传`cloudfunctions/common`下的`uni-id`模块
-5. 按照[公用模块使用说明](https://uniapp.dcloud.io/uniCloud/cf-common)在云函数下安装`uni-id`模块
-6. 创建`uni-id-users`、`uni-verify`集合(可以直接使用示例项目里面的db_init.json进行初始化)
-
-或者直接导入[uni-id在插件市场的示例工程](https://ext.dcloud.net.cn/plugin?id=2116)
-
+# 需求背景
+
+99%的应用,都要开发用户注册、登录、发送短信验证码、密码加密保存、修改密码、token管理等功能,从前端到后端都需要。
+
+为什么不能有一个开源的通用项目,避免大家的重复开发呢?
+
+`uni-id`应需而生。
+
+`uni-id`为`uniCloud`开发者提供了简单、统一、可扩展的用户管理能力封装。
+
+# 组成部分
+`uni-id`包括如下组成部分:
+1. 云数据库
+
+主表为 `uni-id-users` 表,保存用户的基本信息。
+
+扩展字段有很多,如实名认证数据、工作履历数据,开发者可以自由扩展。
+
+2. 云函数
+
+提供一个名为`uni-id`的公共模块,该模块封装了一系列API,包括注册、登录、修改密码、设置头像等。
+
+示例工程中还提供了一个`user-center`的云函数,演示在云函数中如何调用`uni-id`公共模块。
+
+3. 前端调用
+
+前端示例通过callfunction调用云函数`user-center`,在注册和登录时保存token。
+
+uniCloud框架底层,会自动在callfunction时传递`uni-id`的token(uni-app 2.7.13+版本)。在云函数的event中可直接拿到`uni-id`的token。也就是说开发者无需自己管理token了。
+
+# uni-id 对开发者的价值
+1. 节省了大量重复劳动
+2. 降低门槛,前端开发者无需纠结怎样设计数据库设计才更合理
+3. 多系统打通用户和上下游协同
+
+关于第三点,着重强调下。
+
+一个应用,往往需要集成多个功能模块。比如一个电商应用,需要一个基本电商模板,还需要客服聊天模板,甚至还需要用户交流社区。
+
+在插件市场,每类模板插件都能找到,但他们如果不是基于同一套用户体系设计,就很难整合。
+
+DCloud推荐所有uniCloud的应用,都基于`uni-id`来做。
+
+有了统一的账户规范,并且围绕这套账户规范,有各种各样插件,那么开发者可以随意整合这些插件,让数据连同。
+
+规范,还可以让上下游充分协同。插件市场会出现各种数据迁移插件,比如把从discuz里把用户迁移到`uni-id`中的插件,相信围绕这套规范的产业链会非常活跃。
+
+# 现状和未来
+
+`uni-id`已完整的内容:
+
+- 注册、登录、发送短信验证码、密码加密保存、修改密码、token管理(短信验证码功能需要HBuilderX 2.8.3+)
+- 三方登录:App中的微信登录、微信小程序中的微信登录、支付宝小程序中的支付宝账户登录
+
+关于还缺少的部分,哪些DCloud在完善,哪些希望开发者给共同完善开源项目,计划与边界公布如下:
+
+1. 部分社交账户登录
+
+DCloud暂无计划开发百度、头条、QQ等小程序的登录,以及Apple ID、微博、QQ等App端的登录。欢迎其他开发者在开源项目上提交pr,共同完善`uni-id`。
+
+2. 邮箱验证和手机号一键认证sdk集成
+
+手机号一键认证sdk,目前插件市场里已经有不少相关插件,未来DCloud会整合到`uni-id`中。邮箱验证,DCloud暂无计划开发,有需求的开发者欢迎提供pr。
+
+3. 实名认证、活体检测
+
+目前插件市场里已经有不少相关插件,未来DCloud会整合到`uni-id`中。
+
+4. 权限管理ACL
+
+这部分欢迎开发者参与完善。
+
+其他方面,各种常见开源项目如discuz、wordPress、ecshop的用户导入插件,不属于`uni-id`主工程,欢迎开发者单独提交插件到插件市场。
+
+`uni-id`的git仓库:[https://gitee.com/dcloud/uni-id.git](https://gitee.com/dcloud/uni-id.git)
+
+
+# 快速上手
+
+使用uni-id需要按照以下步骤操作
+
+1. 准备2.7.14或以上版本的HBuilderX
+2. 插件市场导入`uni-id`公用模块,[插件市场 uni-id](https://ext.dcloud.net.cn/plugin?id=2116)
+3. 修改公用模块`uni-id`下的`config.json`内所需参数(请参考下面config.json的说明)
+4. 上传`cloudfunctions/common`下的`uni-id`模块
+5. 按照[公用模块使用说明](https://uniapp.dcloud.io/uniCloud/cf-common)在云函数下安装`uni-id`模块
+6. 创建`uni-id-users`、`uni-verify`集合(可以直接使用示例项目里面的db_init.json进行初始化)
+
+或者直接导入[uni-id在插件市场的示例工程](https://ext.dcloud.net.cn/plugin?id=2116)
+
导入示例项目时,如果选择腾讯云,在HBuilderX2.7及以下版本中,需要进入项目目录,手动将目录`cloudfunctions-aliyun`改名为`cloudfunctions-tcb`,然后在HBuilderX中右键cloudfunctions绑定服务空间。
**config.json的说明**
-注意:
-
-- **config.json是一个标准json文件,不支持注释**
+注意:
+
+- **config.json是一个标准json文件,不支持注释**
- 如果不希望使用config.json初始化而是想自行传入参数,可以使用`init`方法[uniID.init](/uniCloud/uni-id?id=init)
配置项:
@@ -107,24 +107,24 @@ DCloud暂无计划开发百度、头条、QQ等小程序的登录,以及Apple
+ 如果使用`sendSmsCode`接口发送短信需要前往[https://dev.dcloud.net.cn/uniSms](https://dev.dcloud.net.cn/uniSms)充值短信额度,配置`config.json`的`service`字段,字段说明见下方示例
+ 如果使用其他方式发送短信可以参考`sendSmsCode`接口的实现[uni-id sendSmsCode](https://gitee.com/dcloud/uni-id/blob/master/src/lib/send-sms-code.js)
+ 另外可以按照客户端平台进行不同的配置,参考下面示例
-
-**下面的配置文件中所有时间的单位都是秒**
+
+**下面的配置文件中所有时间的单位都是秒**
```json
// 如果拷贝此内容切记去除注释
{
"passwordSecret": "passwordSecret-demo", // 加密密码所用的密钥,注意修改为自己的,使用一个较长的字符串即可
"tokenSecret": "tokenSecret-demo", // 生成token所用的密钥,注意修改为自己的,使用一个较长的字符串即可
- "tokenExpiresIn": 7200, // 全平台token过期时间,未指定过期时间的平台会使用此值
- "tokenExpiresThreshold": 600, // 新增于uni-id 1.1.7版本,checkToken时如果token有效期小于此值则自动获取新token,请注意将新token返回给前端保存,如果不配置此参数则不开启自动获取新token功能
+ "tokenExpiresIn": 7200, // 全平台token过期时间,未指定过期时间的平台会使用此值
+ "tokenExpiresThreshold": 600, // 新增于uni-id 1.1.7版本,checkToken时如果token有效期小于此值则自动获取新token,请注意将新token返回给前端保存,如果不配置此参数则不开启自动获取新token功能
"bindTokenToDevice": true, // 是否将token和设备绑定,设置为true会进行ua校验,默认为true
"passwordErrorLimit": 6, // 密码错误最大重试次数
- "passwordErrorRetryTime": 3600, // 密码错误重试次数超限之后的冻结时间
- "autoSetInviteCode": false, // 是否在用户注册时自动设置邀请码,默认不自动设置
+ "passwordErrorRetryTime": 3600, // 密码错误重试次数超限之后的冻结时间
+ "autoSetInviteCode": false, // 是否在用户注册时自动设置邀请码,默认不自动设置
"forceInviteCode": false, // 是否强制用户注册时必填邀请码,默认为false(需要注意的是目前只有短信验证码注册才可以填写邀请码),设置为true时需要在loginBySms时指定type为register来使用注册,登录时也要传入type为login
"app-plus": {
"tokenExpiresIn": 2592000,
- "oauth": {
+ "oauth": {
// App微信登录所用到的appid、appsecret需要在微信开放平台获取,注意:不是公众平台而是开放平台
"weixin": {
"appid": "weixin appid",
@@ -133,7 +133,7 @@ DCloud暂无计划开发百度、头条、QQ等小程序的登录,以及Apple
}
},
"mp-weixin": {
- "oauth": {
+ "oauth": {
// 微信小程序登录所用的appid、appsecret需要在对应的小程序管理控制台获取
"weixin": {
"appid": "weixin appid",
@@ -142,11 +142,11 @@ DCloud暂无计划开发百度、头条、QQ等小程序的登录,以及Apple
}
},
"mp-alipay": {
- "oauth": {
+ "oauth": {
// 支付宝小程序登录用到的appid、privateKey请参考支付宝小程序的文档进行设置或者获取,https://opendocs.alipay.com/open/291/105971#LDsXr
"alipay": {
"appid": "alipay appid",
- "privateKey": "alipay privateKey", // 私钥
+ "privateKey": "alipay privateKey", // 私钥
"keyType": "PKCS8" // 私钥类型,如果私钥类型不是PKCS8,需要填写此字段,否则会出现“error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag”错误
}
}
@@ -161,62 +161,203 @@ DCloud暂无计划开发百度、头条、QQ等小程序的登录,以及Apple
}
}
```
-
-# 特色功能
-
-## 角色权限@rbac
-
-自`1.1.9`版本起uni-id支持角色权限(通常情况下管理后台会需要角色权限)。除[角色权限API](uniCloud/uni-id.md?id=rbac-api)内列出的角色权限相关的接口外,还有以下调整:
-
-1. 所有登录注册接口可以接收`needPermission`参数,配置为true时会在`checkToken`接口返回用户权限(permission),否则permission字段会是一个空数组。开发者可以在用户登录管理后台时,传入此参数表示当前登录的用户需要返回permission。
-
-2. 新增两个数据表`uni-id-roles`、`uni-id-permissions`,可以使用示例项目里面的db_init.json创建,也可以直接使用opendb中的这两个数据表
-
-以管理后台为例,开发者可以在用户登录时传入`needPermission: true`。在checkToken时返回的结果中会包含role和permission,可以据此判断用户有没有权限进行操作。
-
-```js
-// 简单的权限校验示例
-function hasPermission(token, permission) {
- const checkTokenRes = await uniID.checkToken(token)
- if(checkTokenRes.code) {
- return false
- }
- return checkTokenRes.permission.includes(permission)
-}
-```
-
-**注意**
-
-- uni-id内`admin`角色为超级管理员(即role内包含admin即可拥有所有权限)。uni-clientDB内也做了这种实现,如果用户角色包含`admin`就拥有所有数据表的全部权限。
-
-## 裂变@fission
-
-自`1.1.2`版本起uni-id支持裂变功能,目前仅适用手机号+验证码方式注册可以填写邀请码(inviteCode)接受邀请。裂变相关API请参考[裂变API](uniCloud/uni-id.md?id=fission-api)
-
-在`config.json`内配置了`autoSetInviteCode: true`则在用户注册时会自动给设置不重复的6位邀请码,如果不希望使用自动设置的邀请码可以自行传入`myInviteCode`参数来设置邀请码,需要注意的是要保证邀请码唯一。
-
-在`config.json`内配置了`forceInviteCode: true`则只有使用邀请码才可以注册(仅手机号+验证码注册方式支持)。
-
-针对之前使用了旧版本(不支持裂变)的uni-id,现在想增加裂变功能,可以调用`setUserInviteCode`接口给已注册用户设置邀请码,在设置之前可以使用`my_invite_code不存在`作为条件查询所有需要设置的用户。
-
-如果希望用户注册完成之后再填写邀请人的邀请码,可以调用`acceptInvite`接口来使用户接受邀请。
-
-`getInvitedUser`接口可以用于获取接受邀请的用户列表,其中level参数可以用来设置要获取哪一级的邀请用户,不填写level参数则默认获取第一级。
-
-如果想详细的体验一下裂变流程,可以在插件市场导入[前后一体登录模板](https://ext.dcloud.net.cn/plugin?id=13),此项目内已有邀请用户注册示例,流程如下
-
-**分享邀请码/邀请链接**
-
-
-
-
-**受邀者注册**
-
-
+
+# 特色功能
+
+## 角色权限@rbac
+
+为什么需要权限管理?
+- 对于后台管理系统,除了超级管理员,不同账号通常需根据职位、责任设定不同的系统权限。
+- [clientDB](https://uniapp.dcloud.net.cn/uniCloud/uni-clientDB)允许前端直接操作数据库,但部分字段应该是系统计算或管理员设置的,比如文章的阅读数、收藏数及是否加精置顶,这些字段不允许普通用户在前端通过clientDB直接修改,此时也需要通过权限控制来保证系统的安全稳定。
+
+`uni-id`如何解决权限管理问题?
+- 基于经典的RBAC模型实现内置角色权限系统。
+
+### RBAC模型简介
+
+RBAC:Role-Based Access Control,基于角色的访问控制。
+
+其基本思想:对系统操作的各种权限不是直接授予具体的用户,而是在用户集合与权限集合之间建立一个角色集合。每一种角色对应一组相应的权限。一旦用户被分配了适当的角色后,该用户就拥有此角色的所有权限。
+
+![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/431878b0-0ca0-11eb-8a36-ebb87efcf8c0.png)
+
+这样做的好处是,增强系统管理的扩展性,对于批量用户的权限变更,仅需变更该批用户角色对应权限即可,而无需对该批每个用户变更权限。
+
+这个模型有三个关键名词:用户、角色、权限:
+- 用户:使用系统的人,一个用户可以同时有多个角色
+- 角色:权限的集合,一个角色可以有多个权限
+- 权限:数据权限或业务权限,例如:删除用户、删除评论等
+
+### 用户
+
+用户信息存储在`uni-id-users`表中,然后通过`role`字段保存该用户所拥有的所有角色ID,角色ID即角色表(`uni-id-roles`表)中的`role_id`字段,注意不是`_id`字段。
+
+```
+{
+ {
+ "_id":"5f8428181c229600010389f6",
+ "username":"uniapp",
+ "email":"hr2013@dcloud.io",
+ role:[
+ "USER_ADMIN",
+ "NOTICE_ADMIN"
+ ],
+ "created_date":1602495783272
+ }
+}
+```
+
+>Tips:将用户角色设计为用户表的字段,而没有新建`用户角色关联表`的原因:避免mongodb在跨表查询时的性能开销
+
+### 角色
+
+角色信息存储在`uni-id-roles`表中
+
+| 字段 | 类型 | 必填| 描述 |
+| ---------- | --------- | ----| --------------------------------------|
+| \_id | Object ID | 是 | 系统自动生成的Id |
+| role_id | String | 是 | 角色唯一标识 |
+| role_name | String | 否 | 角色名,展示用 |
+| permission | Array | 是 | 角色拥有的权限列表 |
+| comment | String | 否 | 备注 |
+| created_date| Timestamp | 是 | 角色创建时间 |
+
+其中:
+- `role_id`为角色标志,全局唯一,可用于clientDB中的权限控制,建议按照语义化命名,例如:`USER_ADMIN`表示人事管理、`NOTICE_ADMIN`表示公告管理
+- `permission`为数组类型,存储该角色拥有的所有权限ID,权限ID即权限表(`uni-id-permissions`表)中的`permission_id`字段,注意不是`_id`字段
+
+如下为示例:
+
+```
+{
+ {
+ "_id":"5f8428181c229600010389f6",
+ "role_id":"USER_ADMIN",
+ "role_name":"人事管理",
+ permission:[
+ "USER_ADD",
+ "USER_EDIT",
+ "USER_DEL"
+ ],
+ "created_date":1602495783272
+ },
+ {
+ "_id":"5f842836d8daea0001906785",
+ "role_id":"NOTICE_ADMIN",
+ "role_name":"公告管理",
+ permission:[
+ "NOTICE_ADD",
+ "NOTICE_EDIT",
+ "NOTICE_DEL"
+ ],
+ "created_date":1602495784372
+ }
+}
+```
+
+如下是角色在clientDB中的配置示例:
+
+```
+// db-permission/uni-id-users.js
+
+{
+ ".update":"doc._id == auth.uid || 'USER_ADMIN' in auth.role" //用户自己或人事管理员可执行用户表的.update操作
+}
+```
+
+>Tips1:uni-id中`admin`为超级管理员角色,uni-clientDB也基于同样的策略;如果用户角色包含`admin`,则该用户就拥有所有数据表的全部权限。
+
+>Tips2:出厂时可内置常用角色,也可上线后由运营人员动态创建角色。
+
+### 权限
+
+权限信息在`uni-id-permissions`表中,表结构定义如下:
+
+| 字段 | 类型 | 必填| 描述 |
+| ---------- | --------- | ----| --------------------------------------|
+| \_id | Object ID | 是 | 系统自动生成的Id |
+| permission_id | String | 是 | 权限唯一标识 |
+| permission_name | String | 否 | 权限名,展示用 |
+| comment | String | 否 | 备注 |
+| created_date | Timestamp | 是 | 权限创建时间 |
+
+其中,`permission_id`为权限标志,全局唯一,可用于clientDB中的权限配置,建议按照语义化命名,例如:`USER_DEL`、`BRANCH_ADD`。
+
+如下为示例内容:
+
+```
+{
+ {
+ "_id":"5f8428181c229600010389f6",
+ "permission_id":"USER_EDIT",
+ "permission_name":"修改用户",
+ "created_date":1602495783272
+ },
+ {
+ "_id":"5f842836d8daea0001906785",
+ "permission_id":"USER_DEL",
+ "permission_name":"删除用户",
+ "created_date":1602495784372
+ }
+}
+```
+
+如下是权限在clientDB中的配置示例:
+
+```
+// db-permission/uni-id-users.js
+
+{
+ ".update":"doc._id == auth.uid || 'USER_EDIT' in auth.permission" //用户自己或有`USER_EDIT`权限的用户,可执行用户表的.update操作
+}
+```
+
+>Tips1:建议出厂时内置所有权限,方便clientDB中的权限配置。
+
+### 其他说明
+
+uni-id针对角色权限模块封装了丰富的API,比如:获取用户角色、获取某角色下的所有权限等,详情参考:[角色权限API](uniCloud/uni-id.md?id=rbac-api)。
+
+uni-id登录注册接口可接收`needPermission`参数,若`needPermission`配置为true时,后续会在`checkToken`接口返回用户权限列表(permission)。如下是通过token判断权限的简单示例:
+
+```js
+// 简单的权限校验示例
+function hasPermission(token, permission) {
+ const checkTokenRes = await uniID.checkToken(token)
+ return checkTokenRes.permission.includes(permission)
+}
+```
+
+
+
+## 裂变@fission
+
+自`1.1.2`版本起uni-id支持裂变功能,目前仅适用手机号+验证码方式注册可以填写邀请码(inviteCode)接受邀请。裂变相关API请参考[裂变API](uniCloud/uni-id.md?id=fission-api)
+
+在`config.json`内配置了`autoSetInviteCode: true`则在用户注册时会自动给设置不重复的6位邀请码,如果不希望使用自动设置的邀请码可以自行传入`myInviteCode`参数来设置邀请码,需要注意的是要保证邀请码唯一。
+
+在`config.json`内配置了`forceInviteCode: true`则只有使用邀请码才可以注册(仅手机号+验证码注册方式支持)。
+
+针对之前使用了旧版本(不支持裂变)的uni-id,现在想增加裂变功能,可以调用`setUserInviteCode`接口给已注册用户设置邀请码,在设置之前可以使用`my_invite_code不存在`作为条件查询所有需要设置的用户。
+
+如果希望用户注册完成之后再填写邀请人的邀请码,可以调用`acceptInvite`接口来使用户接受邀请。
+
+`getInvitedUser`接口可以用于获取接受邀请的用户列表,其中level参数可以用来设置要获取哪一级的邀请用户,不填写level参数则默认获取第一级。
+
+如果想详细的体验一下裂变流程,可以在插件市场导入[前后一体登录模板](https://ext.dcloud.net.cn/plugin?id=13),此项目内已有邀请用户注册示例,流程如下
+
+**分享邀请码/邀请链接**
+
+
+
+
+**受邀者注册**
+
+
# API列表@api
-
-## 基础功能
+
+## 基础功能
### 用户注册 @register
@@ -349,7 +490,7 @@ exports.main = async function(event,context) {
})
return res
}
-```
+```
### 登出
@@ -576,7 +717,7 @@ exports.main = async function(event,context) {
}
```
-
+
### 更新用户信息
@@ -613,8 +754,8 @@ exports.main = async function(event,context) {
return res
}
```
-
-### 获取用户信息
+
+### 获取用户信息
用法:`uniID.getUserInfo(Object GetUserInfoParams);`
@@ -632,7 +773,7 @@ exports.main = async function(event,context) {
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code | Number| 是 |错误码,0表示成功|
-| message | String| 是 |详细信息 |
+| message | String| 是 |详细信息 |
| userInfo| Object| 是 |获取的用户信息 |
```js
@@ -649,7 +790,7 @@ exports.main = async function(event,context) {
})
return res
}
-```
+```
### 自行初始化uni-id@init
@@ -694,9 +835,9 @@ exports.main = async function(event,context) {
})
return res
}
-```
-
-## 手机号码
+```
+
+## 手机号码
### 发送短信验证码
@@ -710,11 +851,11 @@ exports.main = async function(event,context) {
| templateId| String| 否 |`uni-id 1.1.8+`用户自定义模板Id,不传则使用uniID_code,如果要使用自定义模板请使用类似下面模板示例的参数 |
| code | String| 否 |验证码字符串 |
| type | String| 是 |类型,用于防止不同功能的验证码混用,目前支持的类型`login`登录、`register`注册、`bind`绑定手机、`unbind`解绑手机|
-
-```
-// 短信模板示例,请在https://dev.dcloud.net.cn/uniSms申请签名(短信开头中括号内部分)及模板
-验证码:${code},用于${action},${expMinute}分钟内有效,请勿泄露并尽快验证。
-```
+
+```
+// 短信模板示例,请在https://dev.dcloud.net.cn/uniSms申请签名(短信开头中括号内部分)及模板
+验证码:${code},用于${action},${expMinute}分钟内有效,请勿泄露并尽快验证。
+```
**响应参数**
@@ -842,10 +983,10 @@ exports.main = async function(event,context) {
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| mobile | String| 是 |用户手机号 |
-| code | String| 是 |验证码 |
-| type | String| 否 |指定操作类型,可选值为`login`、`register`,不传此参数时表现为手机号已注册则登录,手机号未注册则进行注册|
-| password |String | 否 |密码,type为`register`时生效 |
-| inviteCode |String | 否 |邀请人的邀请码,type为`register`时生效 |
+| code | String| 是 |验证码 |
+| type | String| 否 |指定操作类型,可选值为`login`、`register`,不传此参数时表现为手机号已注册则登录,手机号未注册则进行注册|
+| password |String | 否 |密码,type为`register`时生效 |
+| inviteCode |String | 否 |邀请人的邀请码,type为`register`时生效 |
| myInviteCode|String | 否 |设置当前注册用户自己的邀请码,type为`register`时生效 |
| needPermission| Boolean | 否 |设置为true时会在checkToken时返回用户权限(permission),建议在管理控制台中使用 |
@@ -965,8 +1106,8 @@ exports.main = async function(event,context) {
}
```
-
-## 邮箱
+
+## 邮箱
### 邮箱验证码直接登录
@@ -977,9 +1118,9 @@ exports.main = async function(event,context) {
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| email | String| 是 |用户邮箱 |
-| code | String| 是 |验证码 |
-| type | String| 否 |指定操作类型,覆盖存在则登录不存在则注册的默认行为,可选值为`login`、`register`|
-| password |String | 否 |密码,type为`register`时生效 |
+| code | String| 是 |验证码 |
+| type | String| 否 |指定操作类型,覆盖存在则登录不存在则注册的默认行为,可选值为`login`、`register`|
+| password |String | 否 |密码,type为`register`时生效 |
| myInviteCode |String | 否 |设置当前注册用户自己的邀请码,type为`register`时生效 |
| needPermission| Boolean | 否 |设置为true时会在checkToken时返回用户权限(permission),建议在管理控制台中使用 |
@@ -1013,14 +1154,14 @@ exports.main = async function(event,context) {
}
```
-
-### 设置验证码
-
-见[设置验证码](uniCloud/uni-id.md?id=setVerifyCode)
-
-### 校验验证码
-
-见[校验验证码](uniCloud/uni-id.md?id=verifyCode)
+
+### 设置验证码
+
+见[设置验证码](uniCloud/uni-id.md?id=setVerifyCode)
+
+### 校验验证码
+
+见[校验验证码](uniCloud/uni-id.md?id=verifyCode)
### 绑定邮箱
@@ -1107,8 +1248,8 @@ exports.main = async function(event,context) {
return res
}
```
-
-## 微信小程序
+
+## 微信小程序
### 微信登录
@@ -1125,8 +1266,8 @@ exports.main = async function(event,context) {
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
-| code | String| 是 |微信登录返回的code |
-| platform |String | 否 |客户端类型:`mp-weixin`、`app-plus`,默认uni-id会自动取客户端类型,但是在云函数url化等场景无法取到客户端类型,可以使用此参数指定 |
+| code | String| 是 |微信登录返回的code |
+| platform |String | 否 |客户端类型:`mp-weixin`、`app-plus`,默认uni-id会自动取客户端类型,但是在云函数url化等场景无法取到客户端类型,可以使用此参数指定 |
| myInviteCode|String | 否 |设置当前注册用户自己的邀请码,type为`register`时生效 |
| needPermission| Boolean | 否 |设置为true时会在checkToken时返回用户权限(permission),建议在管理控制台中使用 |
@@ -1151,11 +1292,11 @@ exports.main = async function(event,context) {
```js
// 云函数login-by-weixin代码
const uniID = require('uni-id')
-exports.main = async function(event,context) {
+exports.main = async function(event,context) {
// 如下旧写法依然支持
// const res = await uniID.loginByWeixin(event.code)
- const res = await uniID.loginByWeixin({
- code: event.code
+ const res = await uniID.loginByWeixin({
+ code: event.code
})
return res
}
@@ -1241,7 +1382,7 @@ export default {
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
-| code | String| 是 |微信登录返回的code |
+| code | String| 是 |微信登录返回的code |
|platform |String |否 |客户端类型:`mp-weixin`、`app-plus`,默认uni-id会自动取客户端类型,但是在云函数url化等场景无法取到客户端类型,可以使用此参数指定 |
**响应参数**
@@ -1266,7 +1407,7 @@ exports.main = async function(event,context) {
})
return res
}
-```
+```
### 绑定微信
@@ -1279,7 +1420,7 @@ exports.main = async function(event,context) {
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| uid | String| 是 |用户Id,可以通过checkToken返回 |
-| code | String| 是 |微信登录返回的code |
+| code | String| 是 |微信登录返回的code |
|platform |String |否 |客户端类型:`mp-weixin`、`app-plus`,默认uni-id会自动取客户端类型,但是在云函数url化等场景无法取到客户端类型,可以使用此参数指定 |
**响应参数**
@@ -1334,8 +1475,8 @@ exports.main = async function(event,context) {
return res
}
```
-
-## 支付宝小程序
+
+## 支付宝小程序
### 支付宝登录
@@ -1350,10 +1491,10 @@ exports.main = async function(event,context) {
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
-| code | String| 是 |支付宝登录返回的code |
-| platform | String| 否 |客户端类型:`mp-weixin`、`app-plus`,默认uni-id会自动取客户端类型,但是在云函数url化等场景无法取到客户端类型,可以使用此参数指定 |
+| code | String| 是 |支付宝登录返回的code |
+| platform | String| 否 |客户端类型:`mp-weixin`、`app-plus`,默认uni-id会自动取客户端类型,但是在云函数url化等场景无法取到客户端类型,可以使用此参数指定 |
| myInviteCode| String| 否 |设置当前注册用户自己的邀请码,type为`register`时生效 |
-| needPermission| Boolean | 否 |设置为true时会在checkToken时返回用户权限(permission),建议在管理控制台中使用 |
+| needPermission| Boolean | 否 |设置为true时会在checkToken时返回用户权限(permission),建议在管理控制台中使用 |
**响应参数**
@@ -1375,16 +1516,16 @@ exports.main = async function(event,context) {
```js
// 云函数代码
const uniID = require('uni-id')
-exports.main = async function(event,context) {
+exports.main = async function(event,context) {
// 如下旧写法依然支持
// const res = await uniID.loginByAlipay(event.code)
- const res = await uniID.loginByAlipay({
- code: event.code
+ const res = await uniID.loginByAlipay({
+ code: event.code
})
return res
}
```
-
+
### 获取支付宝用户ID
@@ -1394,7 +1535,7 @@ exports.main = async function(event,context) {
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
-| code | String| 是 |微信登录返回的code |
+| code | String| 是 |微信登录返回的code |
|platform |String |否 |客户端类型:`mp-weixin`、`app-plus`,默认uni-id会自动取客户端类型,但是在云函数url化等场景无法取到客户端类型,可以使用此参数指定 |
**响应参数**
@@ -1418,7 +1559,7 @@ exports.main = async function(event,context) {
})
return res
}
-```
+```
### 绑定支付宝
@@ -1485,14 +1626,14 @@ exports.main = async function(event,context) {
return res
}
```
-
-## 角色权限@rbac-api
-
-### 获取用户角色
-
-根据uid获取用户角色
-
-用法:`uniID.getRoleByUid(Object GetRoleByUidParams)`
+
+## 角色权限@rbac-api
+
+### 获取用户角色
+
+根据uid获取用户角色
+
+用法:`uniID.getRoleByUid(Object GetRoleByUidParams)`
**参数说明**
@@ -1505,14 +1646,14 @@ exports.main = async function(event,context) {
| 字段| 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code| Number| 是 |错误码,0表示成功|
-| message | String| 是 |详细信息 |
-| role | Array | 是 |用户拥有的角色列表|
-
-### 获取角色的权限
-
-根据roleID获取角色权限
-
-用法:`uniID.getPermissionByRole(Object GetPermissionByRoleParams)`
+| message | String| 是 |详细信息 |
+| role | Array | 是 |用户拥有的角色列表|
+
+### 获取角色的权限
+
+根据roleID获取角色权限
+
+用法:`uniID.getPermissionByRole(Object GetPermissionByRoleParams)`
**参数说明**
@@ -1525,14 +1666,14 @@ exports.main = async function(event,context) {
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code | Number| 是 |错误码,0表示成功 |
-| message | String| 是 |详细信息 |
-| permission| Array | 是 |角色拥有的权限列表 |
-
-### 获取用户的权限
-
-根据uid获取用户权限
-
-用法:`uniID.getPermissionByUid(Object GetPermissionByUidParams)`
+| message | String| 是 |详细信息 |
+| permission| Array | 是 |角色拥有的权限列表 |
+
+### 获取用户的权限
+
+根据uid获取用户权限
+
+用法:`uniID.getPermissionByUid(Object GetPermissionByUidParams)`
**参数说明**
@@ -1545,12 +1686,12 @@ exports.main = async function(event,context) {
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code | Number| 是 |错误码,0表示成功 |
-| message | String| 是 |详细信息 |
-| permission| Array | 是 |用户拥有的权限列表 |
-
-### 为用户绑定角色
-
-用法:`uniID.bindRole(Object BindRoleParams)`
+| message | String| 是 |详细信息 |
+| permission| Array | 是 |用户拥有的权限列表 |
+
+### 为用户绑定角色
+
+用法:`uniID.bindRole(Object BindRoleParams)`
**参数说明**
@@ -1565,11 +1706,11 @@ exports.main = async function(event,context) {
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code | Number| 是 |错误码,0表示成功 |
-| message | String| 是 |详细信息 |
-
-### 为角色绑定权限
-
-用法:`uniID.bindPermission(Object BindPermissionParams)`
+| message | String| 是 |详细信息 |
+
+### 为角色绑定权限
+
+用法:`uniID.bindPermission(Object BindPermissionParams)`
**参数说明**
@@ -1584,11 +1725,11 @@ exports.main = async function(event,context) {
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code | Number| 是 |错误码,0表示成功 |
-| message | String| 是 |详细信息 |
-
-### 为用户解绑角色
-
-用法:`uniID.unbindRole(Object UnbindRoleParams)`
+| message | String| 是 |详细信息 |
+
+### 为用户解绑角色
+
+用法:`uniID.unbindRole(Object UnbindRoleParams)`
**参数说明**
@@ -1602,11 +1743,11 @@ exports.main = async function(event,context) {
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code | Number| 是 |错误码,0表示成功 |
-| message | String| 是 |详细信息 |
-
-### 为角色解绑权限
-
-用法:`uniID.unbindPermission(Object UnbindPermissionParams)`
+| message | String| 是 |详细信息 |
+
+### 为角色解绑权限
+
+用法:`uniID.unbindPermission(Object UnbindPermissionParams)`
**参数说明**
@@ -1620,11 +1761,11 @@ exports.main = async function(event,context) {
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code | Number| 是 |错误码,0表示成功 |
-| message | String| 是 |详细信息 |
-
-### 新增角色
-
-用法:`uniID.addRole(Object AddRoleParams)`
+| message | String| 是 |详细信息 |
+
+### 新增角色
+
+用法:`uniID.addRole(Object AddRoleParams)`
**参数说明**
@@ -1640,11 +1781,11 @@ exports.main = async function(event,context) {
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code | Number| 是 |错误码,0表示成功 |
-| message | String| 是 |详细信息 |
-
-### 获取角色列表
-
-用法:`uniID.getRoleList(Object GetRoleListParams)`
+| message | String| 是 |详细信息 |
+
+### 获取角色列表
+
+用法:`uniID.getRoleList(Object GetRoleListParams)`
**参数说明**
@@ -1659,15 +1800,15 @@ exports.main = async function(event,context) {
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| code | Number| 错误码,0表示成功 |
-| message | String| 详细信息 |
-| roleList| Array |roles表记录数组(包含role_name、comment等)|
-| total | Number|总数量 |
-
-### 更新角色信息
-
-**注意不可修改role_id**
-
-用法:`uniID.updateRole(Object UpdateRoleParams)`
+| message | String| 详细信息 |
+| roleList| Array |roles表记录数组(包含role_name、comment等)|
+| total | Number|总数量 |
+
+### 更新角色信息
+
+**注意不可修改role_id**
+
+用法:`uniID.updateRole(Object UpdateRoleParams)`
**参数说明**
@@ -1683,11 +1824,11 @@ exports.main = async function(event,context) {
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code | Number| 是 |错误码,0表示成功 |
-| message | String| 是 |详细信息 |
-
-### 删除角色
-
-用法:`uniID.deleteRole(Object DeleteRoleParams)`
+| message | String| 是 |详细信息 |
+
+### 删除角色
+
+用法:`uniID.deleteRole(Object DeleteRoleParams)`
**参数说明**
@@ -1700,11 +1841,11 @@ exports.main = async function(event,context) {
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code | Number| 是 |错误码,0表示成功 |
-| message | String| 是 |详细信息 |
-
-### 新增权限
-
-用法:`uniID.addPermission(Object AddPermissionParams)`
+| message | String| 是 |详细信息 |
+
+### 新增权限
+
+用法:`uniID.addPermission(Object AddPermissionParams)`
**参数说明**
@@ -1719,11 +1860,11 @@ exports.main = async function(event,context) {
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code | Number| 是 |错误码,0表示成功 |
-| message | String| 是 |详细信息 |
-
-### 获取权限列表
-
-用法:`uniID.getPermissionList(Object GetPermissionListParams)`
+| message | String| 是 |详细信息 |
+
+### 获取权限列表
+
+用法:`uniID.getPermissionList(Object GetPermissionListParams)`
**参数说明**
@@ -1738,15 +1879,15 @@ exports.main = async function(event,context) {
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| code | Number| 错误码,0表示成功 |
-| message | String| 详细信息 |
-| permissionList| Array |permissions表记录数组(包含permission_name、comment等)|
-| total | Number|总数量 |
-
-### 修改权限
-
-**注意:不可修改permissionID**
-
-用法:`uniID.updatePermission(Object UpdatePermissionParams)`
+| message | String| 详细信息 |
+| permissionList| Array |permissions表记录数组(包含permission_name、comment等)|
+| total | Number|总数量 |
+
+### 修改权限
+
+**注意:不可修改permissionID**
+
+用法:`uniID.updatePermission(Object UpdatePermissionParams)`
**参数说明**
@@ -1761,11 +1902,11 @@ exports.main = async function(event,context) {
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code | Number| 是 |错误码,0表示成功 |
-| message | String| 是 |详细信息 |
-
-### 删除权限
-
-用法:`uniID.deletePermission(Object DeletePermissionParams)`
+| message | String| 是 |详细信息 |
+
+### 删除权限
+
+用法:`uniID.deletePermission(Object DeletePermissionParams)`
**参数说明**
@@ -1778,13 +1919,13 @@ exports.main = async function(event,context) {
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code | Number| 是 |错误码,0表示成功 |
-| message | String| 是 |详细信息 |
-
-## 裂变@fission-api
-
-### 设置用户邀请码
-
-针对未生成邀请码的用户使用此方法生成邀请码
+| message | String| 是 |详细信息 |
+
+## 裂变@fission-api
+
+### 设置用户邀请码
+
+针对未生成邀请码的用户使用此方法生成邀请码
用法:`uniID.setUserInviteCode(Object SetUserInviteCodeParams);`
@@ -1802,12 +1943,12 @@ exports.main = async function(event,context) {
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| code | Number| 是 |错误码,0表示成功|
-| message | String| 是 |详细信息 |
-| myInviteCode| String| 是 |最终设置的邀请码 |
-
-### 用户接受邀请
+| message | String| 是 |详细信息 |
+| myInviteCode| String| 是 |最终设置的邀请码 |
+
+### 用户接受邀请
-此接口用于在注册之后再填写邀请码的场景,多数情况下不会用到此接口而是在注册时填写邀请码
+此接口用于在注册之后再填写邀请码的场景,多数情况下不会用到此接口而是在注册时填写邀请码
用法:`uniID.acceptInvite(Object AcceptInviteParams);`
@@ -1824,8 +1965,8 @@ exports.main = async function(event,context) {
| --- | --- | --- | --- |
| code | Number| 是 |错误码,0表示成功|
| message | String| 是 |详细信息 |
-
-### 获取接受邀请的用户清单
+
+### 获取接受邀请的用户清单
用法:`uniID.getInvitedUser(Object GetInvitedUserParams);`
@@ -1846,16 +1987,16 @@ exports.main = async function(event,context) {
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code | Number| 是 |错误码,0表示成功|
-| message | String| 是 |详细信息 |
-| invitedUser | Array | 是 |邀请的用户列表 |
-
-**invitedUser每项结构**
+| message | String| 是 |详细信息 |
+| invitedUser | Array | 是 |邀请的用户列表 |
+
+**invitedUser每项结构**
| 字段 | 类型 | 必填| 说明 |
-| --- | --- | --- | --- |
-| username |String |- |被邀请者用户名 |
-| mobile |String |- |被邀请者手机号 |
-| invite_time |String |- |被邀请者注册时间,以时间戳形式返回 |
+| --- | --- | --- | --- |
+| username |String |- |被邀请者用户名 |
+| mobile |String |- |被邀请者手机号 |
+| invite_time |String |- |被邀请者注册时间,以时间戳形式返回 |
```js
// 云函数代码
@@ -1867,13 +2008,13 @@ exports.main = async function(event,context) {
}
const res = await uniID.getUserInfo({
uid: payload.uid,
- limit: 10,
- offset: 0,
+ limit: 10,
+ offset: 0,
needTotal: true
})
return res
}
-```
+```
# 数据库结构
@@ -1881,31 +2022,31 @@ exports.main = async function(event,context) {
表名:uni-id-users
-| 字段 | 类型 | 必填| 描述 |
-| ----------------| --------- | ----| ------------------------------------------- |
-| \_id | Object ID | 是 | 存储文档 ID(用户 ID),系统自动生成 |
-| username | String | 是 | 用户名,不允许重复 |
-| password | String | 否 | 密码,加密存储 |
-| nickname | String | 否 | 用户昵称 |
-| gender | Integer | 否 | 用户性别:0 未知 1 男性 2 女性 |
-| status | Integer | 是 | 用户状态:0 正常 1 禁用 2 审核中 3 审核拒绝 |
-| mobile | String | 否 | 手机号码 |
-| mobile_confirmed| Integer | 否 | 手机号验证状态:0 未验证 1 已验证 |
-| email | String | 否 | 邮箱地址 |
-| email_confirmed | Integer | 否 | 邮箱验证状态:0 未验证 1 已验证 |
-| avatar | String | 否 | 头像地址 |
-| wx_unionid | String | 否 | 微信unionid |
-| wx_openid | Object | 否 | 微信各个平台openid |
-| ali_openid | String | 否 | 支付宝平台openid |
-| comment | String | 否 | 备注 |
-| realname_auth | Object | 否 | 实名认证信息 |
-| register_date | Timestamp | 否 | 注册时间 |
-| register_ip | String | 否 | 注册时 IP 地址 |
-| last_login_date | Timestamp | 否 | 最后登录时间 |
-| last_login_ip | String | 否 | 最后登录时 IP 地址 |
-| login_ip_limit | Array | 否 | 登录 IP 限制 |
-| inviter_uid | Array | 否 | 邀请人uid,按层级从下往上排列的uid数组,即第一个是直接上级|
-| my_invite_code | String | 否 | 用户自己的邀请码 |
+| 字段 | 类型 | 必填| 描述 |
+| ----------------| --------- | ----| ------------------------------------------- |
+| \_id | Object ID | 是 | 存储文档 ID(用户 ID),系统自动生成 |
+| username | String | 是 | 用户名,不允许重复 |
+| password | String | 否 | 密码,加密存储 |
+| nickname | String | 否 | 用户昵称 |
+| gender | Integer | 否 | 用户性别:0 未知 1 男性 2 女性 |
+| status | Integer | 是 | 用户状态:0 正常 1 禁用 2 审核中 3 审核拒绝 |
+| mobile | String | 否 | 手机号码 |
+| mobile_confirmed| Integer | 否 | 手机号验证状态:0 未验证 1 已验证 |
+| email | String | 否 | 邮箱地址 |
+| email_confirmed | Integer | 否 | 邮箱验证状态:0 未验证 1 已验证 |
+| avatar | String | 否 | 头像地址 |
+| wx_unionid | String | 否 | 微信unionid |
+| wx_openid | Object | 否 | 微信各个平台openid |
+| ali_openid | String | 否 | 支付宝平台openid |
+| comment | String | 否 | 备注 |
+| realname_auth | Object | 否 | 实名认证信息 |
+| register_date | Timestamp | 否 | 注册时间 |
+| register_ip | String | 否 | 注册时 IP 地址 |
+| last_login_date | Timestamp | 否 | 最后登录时间 |
+| last_login_ip | String | 否 | 最后登录时 IP 地址 |
+| login_ip_limit | Array | 否 | 登录 IP 限制 |
+| inviter_uid | Array | 否 | 邀请人uid,按层级从下往上排列的uid数组,即第一个是直接上级|
+| my_invite_code | String | 否 | 用户自己的邀请码 |
| role | Array | 否 | 用户角色列表,由role_id组成的数组 |
**wx_openid字段定义**
@@ -1974,7 +2115,7 @@ exports.main = async function(event,context) {
| ip | String | 是 | 请求时 IP 地址 |
| created_at | Timestamp | 是 | 创建时间 |
| expired_at | Timestamp | 是 | 验证码过期时间 |
-
+
## 角色表
表名:`uni-id-roles`
@@ -1986,8 +2127,8 @@ exports.main = async function(event,context) {
| role_name | String | 否 | 角色名,展示用 |
| permission | Array | 是 | 角色拥有的权限列表 |
| comment | String | 否 | 备注 |
-| created_date| Timestamp | 是 | 角色创建时间 |
-
+| created_date| Timestamp | 是 | 角色创建时间 |
+
## 权限表
表名:`uni-id-permissions`
@@ -1998,72 +2139,72 @@ exports.main = async function(event,context) {
| permission_id | String | 是 | 权限唯一标识 |
| permission_name | String | 否 | 权限名,展示用 |
| comment | String | 否 | 备注 |
-| created_date | Timestamp | 是 | 权限创建时间 |
+| created_date | Timestamp | 是 | 权限创建时间 |
# 错误码
自`1.1.0`版本使用此错误码规范
-|模块 |模块码 |错误代码 |错误信息 |
-|:-: |:-: |:-: |:-: |
-|登录通用模块 |100 |01 |账号已禁用 |
-|账号、邮箱、手机+密码登录 |101 |01 |用户不存在 |
-| | |02 |密码错误 |
-| | |03 |密码错误次数过多 |
-|手机号验证码登录/注册 |102 |01 |手机号已存在(传入type='register'且手机号已注册时触发)|
-| |102 |02 |此手机号尚未注册(传入type='login'且手机号未注册时触发) |
-| |102 |03 |邀请码无效(邀请码存在且唯一时才算有效) |
-|邮箱验证码登录/注册 |103 |01 |此邮箱已注册(传入type='register'且邮箱已注册时触发)|
-| |103 |02 |此邮箱尚未注册(传入type='login'且邮箱未注册时触发) |
-|微信登录/注册 |104 |01 |获取openid失败 |
-|支付宝登录/注册 |105 |01 |获取openid失败 |
-|注册通用模块 |200 |- |- |
-|账号、邮箱、手机+密码注册 |201 |01 |用户名、邮箱、手机号必填一项 |
-| | |02 |用户名、邮箱、手机号冲突 |
-|Token类 |300 |- |- |
-|生成Token |301 |- |- |
-|验证Token |302 |01 |设备特征校验未通过 |
-| | |02 |云端已不包含此token |
-| | |03 |token已过期 |
-| | |04 |token校验未通过 |
-|账号安全类 |400 |- |- |
-|登出 |401 |- |- |
-|修改密码 |402 |01 |用户不存在 |
-| | |02 |旧密码错误 |
-|重置密码 |403 |- |- |
-|验证类 |500 |- |- |
-|设置验证码 |501 |01 |参数错误 |
-|校验验证码 |502 |01 |参数错误 |
-| | |02 |验证码错误或已失效 |
-|发送短信验证码 |503 |01 |验证码发送失败,一般message内有描述 |
-|绑定账号 |600 |- |- |
-|绑定手机号 |601 |01 |此手机号已被绑定 |
-|绑定邮箱 |602 |01 |此邮箱已被绑定 |
-|绑定微信 |603 |01 |获取openid失败 |
-| | |02 |此账号已被绑定 |
-|绑定支付宝 |604 |01 |获取openid失败 |
-| | |02 |此账号已被绑定 |
-|解绑账号 |700 |- |- |
-|解绑手机号 |701 |01 |解绑失败,可能已经解绑或者账号不匹配 |
-|解绑邮箱 |702 |01 |解绑失败,可能已经解绑或者账号不匹配 |
-|解绑微信 |703 |01 |解绑失败,可能已经解绑 |
-|解绑支付宝 |704 |01 |解绑失败,可能已经解绑 |
-|基础功能 |800 |- |- |
-|更新用户信息 |801 |01 |参数错误 |
-|设置头像 |802 |- |- |
-|获取用户信息 |803 |01 |未查询到用户信息 |
-|设置用户自己的邀请码 |804 |01 |邀请码设置失败,验证码重复或自动设置重试多次依然重复 |
-| | |02 |邀请码重试多次依然重复 |
-|填写邀请人邀请码 |805 |01 |邀请码无效(邀请码存在且唯一时才算有效) |
-| | |02 |uid错误,用户不存在 |
-| | |03 |邀请码不可修改 |
-|获取微信openid |806 |01 |未能获取openid |
-| | |02 |调用获取openid接口失败 |
-|获取支付宝openid |807 |01 |未能获取openid |
-| | |02 |调用获取openid接口失败 |
+|模块 |模块码 |错误代码 |错误信息 |
+|:-: |:-: |:-: |:-: |
+|登录通用模块 |100 |01 |账号已禁用 |
+|账号、邮箱、手机+密码登录 |101 |01 |用户不存在 |
+| | |02 |密码错误 |
+| | |03 |密码错误次数过多 |
+|手机号验证码登录/注册 |102 |01 |手机号已存在(传入type='register'且手机号已注册时触发)|
+| |102 |02 |此手机号尚未注册(传入type='login'且手机号未注册时触发) |
+| |102 |03 |邀请码无效(邀请码存在且唯一时才算有效) |
+|邮箱验证码登录/注册 |103 |01 |此邮箱已注册(传入type='register'且邮箱已注册时触发)|
+| |103 |02 |此邮箱尚未注册(传入type='login'且邮箱未注册时触发) |
+|微信登录/注册 |104 |01 |获取openid失败 |
+|支付宝登录/注册 |105 |01 |获取openid失败 |
+|注册通用模块 |200 |- |- |
+|账号、邮箱、手机+密码注册 |201 |01 |用户名、邮箱、手机号必填一项 |
+| | |02 |用户名、邮箱、手机号冲突 |
+|Token类 |300 |- |- |
+|生成Token |301 |- |- |
+|验证Token |302 |01 |设备特征校验未通过 |
+| | |02 |云端已不包含此token |
+| | |03 |token已过期 |
+| | |04 |token校验未通过 |
+|账号安全类 |400 |- |- |
+|登出 |401 |- |- |
+|修改密码 |402 |01 |用户不存在 |
+| | |02 |旧密码错误 |
+|重置密码 |403 |- |- |
+|验证类 |500 |- |- |
+|设置验证码 |501 |01 |参数错误 |
+|校验验证码 |502 |01 |参数错误 |
+| | |02 |验证码错误或已失效 |
+|发送短信验证码 |503 |01 |验证码发送失败,一般message内有描述 |
+|绑定账号 |600 |- |- |
+|绑定手机号 |601 |01 |此手机号已被绑定 |
+|绑定邮箱 |602 |01 |此邮箱已被绑定 |
+|绑定微信 |603 |01 |获取openid失败 |
+| | |02 |此账号已被绑定 |
+|绑定支付宝 |604 |01 |获取openid失败 |
+| | |02 |此账号已被绑定 |
+|解绑账号 |700 |- |- |
+|解绑手机号 |701 |01 |解绑失败,可能已经解绑或者账号不匹配 |
+|解绑邮箱 |702 |01 |解绑失败,可能已经解绑或者账号不匹配 |
+|解绑微信 |703 |01 |解绑失败,可能已经解绑 |
+|解绑支付宝 |704 |01 |解绑失败,可能已经解绑 |
+|基础功能 |800 |- |- |
+|更新用户信息 |801 |01 |参数错误 |
+|设置头像 |802 |- |- |
+|获取用户信息 |803 |01 |未查询到用户信息 |
+|设置用户自己的邀请码 |804 |01 |邀请码设置失败,验证码重复或自动设置重试多次依然重复 |
+| | |02 |邀请码重试多次依然重复 |
+|填写邀请人邀请码 |805 |01 |邀请码无效(邀请码存在且唯一时才算有效) |
+| | |02 |uid错误,用户不存在 |
+| | |03 |邀请码不可修改 |
+|获取微信openid |806 |01 |未能获取openid |
+| | |02 |调用获取openid接口失败 |
+|获取支付宝openid |807 |01 |未能获取openid |
+| | |02 |调用获取openid接口失败 |
|公用码 |900 |01 |数据库读写异常 |
-
-**另外还有一些字符串类型的扩展错误码在各自接口的文档中展示,请不要直接使用`code>0`这种方式来判断是否有错误**
+
+**另外还有一些字符串类型的扩展错误码在各自接口的文档中展示,请不要直接使用`code>0`这种方式来判断是否有错误**
# FAQ
@@ -2074,7 +2215,7 @@ exports.main = async function(event,context) {
+ uni-id内会校验客户端ua,如果是在本地调试可以在云函数内修改`context.CLIENTUA`为生成token的设备ua,切记上线删除此逻辑。如果不需要设备和token绑定,可以在config内配置`bindTokenToDevice: false`来关闭绑定
- username、email、mobile三个字段
- + 三个字段均可能为空,但是建议限制一下插入数据库三个字段的格式,比如username不应是邮箱格式或手机号格式,因为登录时可以选择使用username或mobile或email+密码的方式
-
-- 关于邀请码
- + 目前仅手机号+验证码的注册方式支持填写邀请码
\ No newline at end of file
+ + 三个字段均可能为空,但是建议限制一下插入数据库三个字段的格式,比如username不应是邮箱格式或手机号格式,因为登录时可以选择使用username或mobile或email+密码的方式
+
+- 关于邀请码
+ + 目前仅手机号+验证码的注册方式支持填写邀请码