「用量统计」:这里展示了应用使用数据存储服务的一些统计信息,包括一段时间内存储 API 总的请求量、每天的请求量、按操作类型/Class 分类统计的请求量,结构化数据等等,由于这些数据可以直接反应我们应用的流量和云端性能,能够指导我们进行数据模型和代码优化,同时也与每月账单息息相关,所以请开发者一定仔细查看这里展示的统计数据。
如果导入数据中的 objectId 在当前的 Class 中已存在,那么会直接跳过,不会覆盖当前 Class 中的数据,以免数据意外丢失。
如有覆盖数据的需要,建议您通过控制台或 REST API 直接更新相应数据。
如果客户端不会请求这些数据,或者在导入期间请求不到结果是可以接受的,也可以通过控制台或 REST API 删除相应数据后重新进行导入操作。
require 'digest/sha2'
require "base64"
hasher = Digest::SHA512.new
hasher.reset
hasher.update "h60d8x797d3oa0naxybxxv9bn7xpt2yiowz68mpiwou7gwr2"
hasher.update "password"
hv = hasher.digest
def hashme(hasher, hv)
512.times do
hasher.reset
hv = hasher.digest hv
end
hv
end
result = Base64.encode64(hashme(hasher,hv))
puts result.gsub(/\n/,'')
非常感谢用户「残圆」贡献了一段 C# 语言示例代码:
/// 根据数据字符串和自定义 salt 值,获取对应加密后的字符串
/// </summary>
/// <param name="password">数据字符串</param>
/// <param name="salt">自定义 salt 值</param>
/// <returns></returns>
public static string SHA512Encrypt(string password, string salt)
{
/*
用户密码加密算法
1、创建 SHA-512 加密算法 hasher
2、使用 salt 和 password(原始密码) 调用 hasher.update
3、获取加密后的值 hv
4、重复 512 次调用 hasher.update(hv),每次hv都更新为最新的 hasher.digest 加密值
5、最终的 hv 值做 base64 编码,保存为 password
*/
password = salt + password;
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(password);
byte[] result;
System.Security.Cryptography.SHA512 shaM = new System.Security.Cryptography.SHA512Managed();
result = shaM.ComputeHash(bytes);
int i = 0;
while (i++ < 512)
{
result = shaM.ComputeHash(result);
}
shaM.Clear();
return Convert.ToBase64String(result);
}
非常感谢用户「snnui」贡献了一段 JavaScript(NodeJS) 语言示例代码:
function encrypt(password,salt) {
var hash = crypto.createHash('sha512');
hash.update(salt);
hash.update(password);
var value = hash.digest();
for (var i = 0; i < 512; i++) {
var hash = crypto.createHash('sha512');
hash.update(value);
value = hash.digest();
}
var result = value.toString('base64');
return result;
}
保留字段
注意,createdAt 和 updatedAt 属于保留字段,导出数据中直接编码为 UTC 时间戳字符串,和普通 Date 类型字段的编码方式不同。这一点与通过 REST API 查询这两个字段的返回结果是一致的。
管理控制台使用指南
在 LeanCloud 平台创建好应用之后,如何查看后台数据,如何查看各服务的使用情况,如何更改应用设置,如何修改账户信息,等等问题,都不可避免要跟我们的「控制台」打交道了。
创建应用
对于刚开始接触 LeanCloud 的用户来说,看到的控制台多会是如下图所示的样子:
在这里显示的内容和操作项简单明了,基本上大家一看就能够操作,例如:
箭头 1
指示的按钮,可以创建新的应用。箭头 2
指向的区域,包括一些最基本的统计数据也一并展示在了应用卡片中,之后点击这里蓝色的应用名链接,则可以进入单个应用的数据管理和设置页面。箭头 3
指向的是与开发者账户相关的操作链接。管理应用数据
我们在前面页面,在单个应用卡片中点击应用名链接,则可以进入应用数据和配置管理页面,如下图所示:
我们重点看看一级菜单下的内容。
存储
控制台 > {应用} > 存储 服务下,包含了以下功能:
AVObject
及扩展子类)和非结构化数据(AVFile
)的内容,支持在页面上直接进行增删改查,对于少量的数据维护操作,可以在这里直接进行。特别地,对于下列数据管理需求,我们都可以在控制台完成:
创建新的 Class
进入 存储 > 结构化数据 页面,点击「创建 Class」,可以为应用增加新的 Class,如下图所示:
在接下来的创建 Class 页面中,我们可以指定 Class 名字,也可以选择 Class 类型:普通表或 日志表 。
设置/修改 Class 的 ACL 权限
在创建 Class 对话框,我们可以设置 Class 的 ACL 权限。
对于每一个 Class,我们允许对如下几种操作分别授予用户操作权限:
可以授权访问的用户类型有如下三种:
Class 创建后,在 存储 > 结构化数据 中选择相应的 Class,切换到 权限 标签页,可以修改 Class 访问权限和默认 ACL。
批量操作一个 Class 下的数据
在结构化数据的 Class 数据页面,点击「...」按钮,可以看到两种批量清理数据的方式:
除此以外,也可在点击数据列名称的下拉菜单,删除整列数据。 不过有些内置列不允许删除,比如
createdAt
,再比如_User
表的email
列。点击「批量操作」按钮则能以更灵活的方式批量操作一个 Class 下的数据,可以设定条件筛选数据,然后对筛选的数据进行批量更新或删除。
给某个 Class 数据建索引
数据查询是很普通的操作,与传统关系型数据库一样,索引的优劣对于我们查询性能的影响非常大。 我们可以在控制台 > 存储 > 结构化数据的每个 Class 中,切换到「性能与索引」标签页,创建索引。
注意:
应用之间共享部分数据
同一个帐户下的其他应用(称为「目标应用」)下的 Class(称为「目标 Class」)绑定到当前 Class,访问当前 Class 数据,将会访问到目标应用下的目标 Class 数据,这就是我们所谓的「Class 绑定」功能,用来解决应用之间数据共享的需求。最简单的应用就是
_User
表共享,不同应用之间打通帐户,可以相互注册和登录。在 Class 的「权限」页面,我们可以设置 Class 绑定。设置绑定时,我们可以配置相应权限(可读、可写、可以删除数据)。绑定成功后,当前 Class 绑定之前存储的数据不会丢失,而是被「隐藏」起来,在解除绑定后仍然可以访问到。
本地数据导入 LeanCloud
存储 > 导入导出 > 数据导入 页面,可供批量导入本地数据。
本地文件的格式要求:
.csv
或者.json
结尾,我们以此来判断导入数据的类型。JSON 文件格式
JSON 格式要求是一个符合我们 REST 格式的 JSON 对象数组:
导入数据后,LeanCloud 会自动创建
objectId
、createdAt
、updatedAt
字段。或者是一个包含了键名为 results、值为对象数组的 JSON 对象。例如:
这里,导入数据中已经包括了
objectId
、createdAt
、updatedAt
字段,LeanCloud 将沿用这些字段。【日期】示例中,
publishedAt
是一个日期型字段,其格式要求请参考 REST API · 数据类型。【密码】导入用户密码需要使用一个特殊的字段
bcryptPassword
,并且完全遵循 Stackoverflow · What column type/length should I use for storing a Bcrypt hashed password in a Database? 所描述的加密算法加密后,才可以作为合法的密码进行导入。如果导入数据中的
objectId
在当前的 Class 中已存在,那么会直接跳过,不会覆盖当前 Class 中的数据,以免数据意外丢失。 如有覆盖数据的需要,建议您通过控制台或 REST API 直接更新相应数据。 如果客户端不会请求这些数据,或者在导入期间请求不到结果是可以接受的,也可以通过控制台或 REST API 删除相应数据后重新进行导入操作。CSV 格式文件
导入 Class 的 CSV 文件格式必须符合我们的扩展要求:
int
、long
、number
、double
、string
、date
、boolean
、file
、array
、object
、geopoint
等。导入的
geopoint
格式是一个用空格隔开经度、纬度的字符串(经度 纬度
):CSV 导入也支持 Pointer 类型,要求类型声明为
pointer:类名
,其中类名就是该 Pointer 列所指定的 className,列的值只要提供 objectId 即可,例如:注意:relation 已弃用,推荐使用中间表。以下仅供尚在使用 relation 的开发者参考:
导入 Relation 数据,比 JSON 简单一些,第一列对应 JSON 的
owningId
,也就是要导入的 Class 的存在对象的 objectId,第二列对应relatedId
,对应关联 Class 的 objectId。例如:云端数据导出到本地
LeanCloud 不会把大家强制绑定到自己平台上,所以我们也提供渠道让大家随时把数据导出去。
在控制台的 存储 > 导入导出 > 数据导出 页面点击导出按钮即可开始导出任务。我们会在导出完成之后发送下载链接到你的注册邮箱。
导出还可以限定 Class、日期(
updatedAt
),你也可以只导出数据的 schema。我们还提供了数据导出的 RETS API。
导出用户数据的加密算法
导出的
_User
表数据会包括加密后的密码password
字段和用于加密的随机盐salt
字段。 LeanCloud 不会以明文保存任何用户的密码,我们也不推荐开发者以明文方式保存应用内用户的密码,这将带来极大的安全隐患。如果你要在 LeanCloud 系统之外校验用户的密码,需要将用户的传输过来的明文密码,加上导出数据里对应用户的salt
字段,使用下文描述的加密算法进行不可逆的加密运算,其结果如果与导出数据里的password
字段值相同,即认为密码验证通过,否则验证失败。我们通过一个 Ruby 脚本来描述这个用户密码加密算法:
hv
hasher.update(hv)
,每次hv都更新为最新的hasher.digest
加密值假设:
password
实现代码:
非常感谢用户「残圆」贡献了一段 C# 语言示例代码:
非常感谢用户「snnui」贡献了一段 JavaScript(NodeJS) 语言示例代码:
保留字段
注意,
createdAt
和updatedAt
属于保留字段,导出数据中直接编码为 UTC 时间戳字符串,和普通 Date 类型字段的编码方式不同。这一点与通过 REST API 查询这两个字段的返回结果是一致的。读懂 API 统计结果
在使用 LeanCloud 数据存储的时候,我们应用每天的调用量如何,不同平台过来的请求量有多少,里面哪些请求比较耗时,主要是什么操作导致的,如何才能得到更好的性能提升用户体验,等等数据都离不开 API 统计结果。 进入 存储 > 用量统计 菜单,你可以看到:
Create 请求
、Find 请求
、Get 请求
、Update 请求
、Delete 请求
等不同操作类型分类展示 API 调用量。除了用量统计页面以外,如果你在结构化数据页面的 Class 名称旁看到乌龟图标,就表示这个 Class 过去 7 天内有慢查询。 可以切换到 Class 的「性能与索引」页面查看详情。
离线数据分析
数据存储 API 对于结果集大小有限制,并且也不支持特别复杂、耗时较长的计算操作,对此,我们特别提供了「离线数据分析」这一功能,来支持产品和运营层面需要的数据统计/挖掘需求。 进入 存储 > 离线数据分析 菜单,就可以对应用下的所有数据进行 SQL 查询了,如下图所示:
离线分析结果导出或存入另一个 Class
离线分析的结果是可以导出到本地的,并且也支持把结果再次存入云端的某个 Class 中。从上图可以看到,离线查询结果出来之后,右边操作区域的「保存为 Class」和「导出」按钮就变成可用状态了,这时候你可以选择把展示到界面的结果下载到本地或者再次存入云端。
云引擎
云引擎中查看节点运行状态
进入 实例 菜单,右侧区域会展示所有云引擎实例的运行状态信息,在这里你可以增加新的实例,也可以停止正在运行的实例。 云引擎实例的日志,则可以在 应用日志 和 访问日志 这里看到。 云引擎实例运行状态的统计信息,则可以在 统计 看到,这里包含了云引擎运行过程中的调用次数、页面展现次数等核心指标的统计结果,你需要密切关注这里的指标,已决定是否需要对云引擎进行扩容。
绑定云引擎域名
根据相关法律法规要求,如果你使用云引擎托管网站,那么需要绑定你自己的独立域名。 请进入 控制台 > 账号设置 > 域名绑定,按照步骤提示操作即可。
云引擎中创建定时任务
云引擎中支持定时任务,你可以在 定时任务 这里进行设置,详细操作流程请参考:定时任务。
消息
控制台 > {应用} > 消息 服务下,包含了三大菜单:
特别地,对于下列管理需求,我们都可以在控制台完成:
查询即时通讯中某个用户是否在线
在 消息 > 即时通讯 > 用户 菜单下,输入单个用户的 username,可以查询其在线状态。如果用户不存在,返回的在线状态永远是离线。
设置离线推送配置项
在 消息 > 即时通讯 > 设置 菜单下,可以设置「离线推送」的内容和其他参数。勾选「使用测试环境推送」即表示使用测试环境推送,不在生产环境推送。什么都不填表示关闭离线推送。在勾选了「使用测试环境推送」后,必须填写推送内容。
取消尚未开始的定时推送任务
定时进行消息推送对于产品运营人员来说是非常实用的一项功能,但有时候,我们也想取消掉还未执行的定时推送请求。 你可以在 消息 > 推送 > 定时推送 菜单下,查看所有定时推送任务和执行状态,你也可以在这里取消掉某个定时任务。
设置多个推送证书
LeanCloud 的消息推送是可以支持多个 iOS 证书的,这一点对某些应用来说会非常有用。譬如我做了一个打车的 O2O 应用,我的产品分为司机端和乘客端两个 app,它们是以不同 app 上传到 App Store 的,但是内部我在 LeanCloud 平台是同一个应用,我需要在乘客发出用车需求之后,可以尽快将消息推送到附近的司机。 你可以在 消息 > 推送 > 设置 菜单下,上传多份证书,并给他们赋予不同的名字,这样以后推送消息的时候,就可以准确地对不同用户使用不同证书。
设置
控制台 > {应用} > 设置 页面,我们可以进行如下操作:
特别地,对于下列管理需求,我们都可以在控制台完成:
把应用转让给别人
商用版应用是可以在不同账号下转让的,在 控制台 > {应用} > 设置 > 基本信息 菜单下,右侧区域下方「应用转让」可以完成这一需求。
转让方需要填写受让方邮箱账号,该邮箱需要是同一节点上已注册用户绑定的邮箱。转让方进行操作后,受让方的邮箱会收到转让邮件,在 24 小时内点击其中的链接,跳转到受让页面,点击「确认」即可完成整个转让过程。如果受让方点击受让链接时,所属账号未登录,会跳转到登录界面。受让方登录后,重新点击受让链接进行操作即可。
受让方未确认前,转让方可以在控制台取消转让。
把应用发布到应用墙,让 LeanCloud 帮你推广
提交应用到 LeanCloud 应用墙,让更多人发现你的产品。在 控制台 > {应用} > 设置 > 基本信息 菜单下,右侧区域有一组「应用墙发布设置」的表单,可以完成这一需求。
重置遭泄漏的 appKey
在 控制台 > {应用} > 设置 > 应用 Key 菜单下,可以重置应用的 Master Key。
LeanCloud 平台上,对每一个应用,有如下三个 id/key 用于标识 app 身份信息:
我们在使用过程中要注意保护好 app key 和 master key,特别是 master key,千万不能泄漏,因为它会绕过所有 ACL 和 Class 权限等授权校验机制。
添加协作者
在为应用增加协作者的时候,我们可以添加个人协作者,也可以添加团队协作者,这两者之间区别如下:
不止于此,如果结合协作者权限来看,个人/团队协作者之间的差异会更大。
在添加协作者的时候,LeanCloud 也支持限定协作者的可见范围(权限)。在添加协作者的时候,选择「自定义权限」,即可进行详细设置。
开发者信息
在控制台,点击右上角的头像和用户名,下拉菜单中选择「账号设置」,可以查看、修改账号信息。
开发者信息
为了更好地服务开发者,建议您完善开发者信息,填写真实姓名、电话号码。比如:
邮箱
实名认证
按照国家法律法规要求,所有使用了 LeanCloud 云引擎的网站托管功能的开发者必须进行实名认证。
告警设置
这里可以设置账户的告警余额。当余额低于这一额度时系统会以短信和邮件的方式通知用户,以便用户及时充值,避免账户欠费而被停服的危险。
名下无商用版应用的用户,余额告警的默认值为 0. 名下有商用版应用的用户,余额告警的默认值为 100.
团队管理
为了方便多人协作,可以创建团队。在单个应用「设置 > 协作管理」菜单里,可以添加该团队作为当前项目的协作者,这样整个团队的成员都会拥有相关的权限。
账单和付款
在控制台,点击右上角的头像和用户名,下拉菜单中选择「财务」,可以查看账单,并完成充值、付款等操作。
财务概况
这里展示了当前账户下的重要财务信息:
账单
每个月会产生一份账单,包括当前账户下所有应用。会详细展示每个应用每个服务的费用明细。
发票
请参考 如何申请发票。