bmob harmony sdk是Bmob后端云专门为鸿蒙系统开发的原生SDK,完全采用ArkTS语言开发,支持云数据库、云函数、文件服务、短信服务等,帮助开发者专注前端交互,快速开发应用。

开发案例

为了方便大家更好的使用Bmob鸿蒙SDK,我们提供了一个持续更新的开发案例文档,查看地址:

https://juejin.cn/column/7369897767182352384

安装SDK

打开 DevEco Studio 开发工具,新建一个Project。Model选择Stage,开发语言选择ArkTS,如下图所示:。

在 DevEco Studio 开发工具的命令行(Terminal)中执行下面的命令,安装Bmob Harmony SDK:

ohpm install @bmob/bmob 

如果一切顺利,你会在当前项目下的oh_modules目录下看到@bmob/bmob的包已经成功下载,如下图所示:

如果执行命令时如果出现:无法将“ohpm"项识别为 cmdlet、函数、脚本文件或可运行程序的名称。的错误提示,请先将 ohpm 命令添加到path环境变量中再执行安装。

获取密钥

登录 Bmob后端云 ,创建应用,获取Secret Key和Secret Code,如下图所示:

初始化应用

在你创建的鸿蒙应用中,entry/src/main/ets 下面新建一个ArkTS File,名为BmobApp。目录结构如下:

代码如下:

import { Bmob } from '@bmob/bmob';
import AbilityStage from '@ohos.app.ability.AbilityStage';
export default class BmobApp extends AbilityStage {
    onCreate() {
        super.onCreate();
        Bmob.initialize('4cf1d10fc37b994c', '1ce87fa28df432a0')
    }
}

配置网络权限和设置应用入口

打开 entry/src/main/module.json5 文件,在module节点下面新增 srcEntryrequestPermissions 子节点,配置如下:


{
  "module": {
    "name": "entry",
    "type": "entry",
    "description": "$string:module_desc",
    "mainElement": "EntryAbility",
    "deviceTypes": [
      "phone",
      "tablet"
    ],
    "srcEntry": "./ets/BmobApp.ets",
    "requestPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      }
    ],
    ...省略更多
  }
}

数据操作

现在,我们就可以在ArkUI里面有需要用到云服务的地方添加Bmob的交互代码了。

首先,在pages的头部添加引用代码:

import {Bmob} from '@bmob/bmob'

添加数据

        Button('添加数据')
          .onClick(()=>{
            let query = Bmob.Query('test');
            query.set('name', 'Bmob后端云');
            query.set('age', 34);
            query.save().then((res) => {
              if (res != undefined) {
                Prompt.showToast({ message: '添加成功,objectId=' + res.objectId });
              }
            }).catch((err) => {
              Prompt.showToast({ message: `添加失败,原因:${err.error} 错误码:${err.code}` });
            });
          })

其中,test 对应Bmob后端云中的数据表名称,nameagetest这个表中的字段名称,执行 Bmob.Query.save() 方法,会将数据添加Bmob后端云中。 如果执行成功,将会返回这条记录在Bmob后端云中对应的唯一标记 objectId 信息,如下图所示:

如果执行不成功,会返回错误对象信息,错误对象信息包含error(错误原因)和code(错误码)。 错误码列表文档请参考官方文档:https://doc.bmobapp.com/other/error_code/index.html

修改数据


        Button('修改数据')
            .onClick(() => {
              let query = Bmob.Query('test');
              query.set('objectId', 'b712866787');
              query.set('name', 'Bmob后端云新增鸿蒙SDK');
              query.set('age', 30);
              query.save().then((res) => {
                Prompt.showToast({ message: '修改成功,updatedAt=' + res.updatedAt });
              }).catch((err) => {
                Prompt.showToast({ message: '修改失败,原因:' + err.error });
              });
            });

其中,test对应Bmob后端云中的数据表名称,objectId是我们要修改的那条数据的唯一标记,nameagetest这个表中的字段名称,执行 Bmob.Query.save() 方法,会将数据修改Bmob后端云中。 如果执行成功,将会返回这条记录的更新时间updatedAt.

删除数据

        Button('删除数据')
            .onClick(() => {
              let query = Bmob.Query('test');
              query.destroy('d070b6b8fa').then((res) => {
                Prompt.showToast({ message: '删除成功' });
              }).catch((err) => {
                Prompt.showToast({ message: '删除失败,原因:' + err.error });
              });
            });

其中,test对应Bmob后端云中的数据表名称,objectId是我们要删除的那条数据的唯一标记,执行 Bmob.Query.destroy() 方法,会将数据从Bmob后端云中删除。 如果执行成功,将会返回boolean值,表示数据是否删除成功。

获取指定的一条数据


        Button('获取指定的一条数据')
            .onClick(() => {
              let query = Bmob.Query('test');
              query.get('d9a7bd816e').then((res) => {
                Prompt.showToast({ message: res.name });
              }).catch((err) => {
                Prompt.showToast({ message: '获取失败,原因:' + err.error });
              });
            });

其中,test对应Bmob后端云中的数据表名称,Bmob.Query.get() 方法需要指定这条数据的唯一标识objectId(这里是d9a7bd816e)作为这个方法的唯一参数。 如果执行成功,将会返回这条数据的对象值。

查询多条数据


        Button('获取多条数据')
            .onClick(() => {
              let query = Bmob.Query('test');
              query.find().then((res) => {
                res.forEach((result: any) => {
                  console.log('返回数据 name=' + result.name);
                });
              }).catch((err) => {
                Prompt.showToast({ message: '获取失败,原因:' + err.error });
              });
            });

其中,test对应Bmob后端云中的数据表名称,执行Bmob.Query.find() 方法,我们可以获取test表中前100条最新的数据。 如果执行成功,将会返回这些数据的对象列表信息,我们可以用forEach方法进行遍历。

条件查询

很多时候,我们需要对数据进行筛查,这就需要用到 Bmob.Query.where 的条件查询的方法,指定条件查询。如下面的代码表示要从test表中获取age大于20,而且小于40的所有数据。


        Button('条件查询')
            .onClick(() => {
              let query = Bmob.Query('test');
              query.where(AND(GT('age', 20), LT('age', 40)))
                .find()
                .then((res) => {
                  res.forEach((result: any) => {
                    console.log('返回数据 age=' + result.age);
                  });
                })
                .catch((err) => {
                  Prompt.showToast({ message: '查询失败,原因:' + err.error });
                });
            });

bmob harmony sdk支持的条件查询方法如下:

方法 说明
AND 而且
OR 或者
GT 大于
GTE 大于等于
LT 小于
LTE 小于等于
LIKE 模糊查询
NE 不等于
IN 包含在数组中
NIN 不包含在数组中

分页查询

直接使用Bmob.Queryfind方法最多只能一次返回100条数据,那如果表中的数据超过100条,我们应该如何获取呢?这就需要用到分页查询了。代码如下:


        Button('分页查询')
            .onClick(() => {
              let query = Bmob.Query('test');
              query.where(AND(GT('age', 20), LT('age', 40)))
                .skip(10)
                .limit(50)
                .find()
                .then((res) => {
                  res.forEach((result: any) => {
                    console.log('返回数据 age=' + result.age);
                  });
                })
                .catch((err) => {
                  Prompt.showToast({ message: '查询失败,原因:' + err.error });
                });
            });

其中,skip方法表示跳过前面的10条数据,limit方法表示这次最多返回50条数据。

只选择某些列返回查询

有时候,我们不需要返回所有的列给客户端,这样可以节省流量,提高速度。

这就需要用到Bmob.Queryselect方法,比如,我们只需要test表中的agename字段,就可以用下面的代码:


        Button('只选择某些列返回查询')
            .onClick(() => {
              let query = Bmob.Query('test');
              query.where(AND(GT('age', 20), LT('age', 40)))
                .select('age,name')
                .find()
                .then((res) => {
                  res.forEach((result: any) => {
                    console.log('返回数据 age=' + result.age);
                  });
                })
                .catch((err) => {
                  Prompt.showToast({ message: '查询失败,原因:' + err.error });
                });
            });

计数查询

我们有时需要知道某些条件下的数据有多少条,这就需要用到Bmob.Query.count方法进行计数查询,代码如下:


        Button('计数查询')
            .onClick(() => {
              let query = Bmob.Query('test');
              query.where(AND(GT('age', 20), LT('age', 40)))
                .count()
                .then((res) => {
                  res.forEach((result: any) => {
                    console.log('返回数据 age=' + result.age);
                  });
                })
                .catch((err) => {
                  Prompt.showToast({ message: '查询失败,原因:' + err.error });
                });
            });

统计有关的查询

统计有关的查询都是针对number类型的字段,比如求age字段的最大值、最小值、平均数。

最大值

使用Bmob.Querymax方法可以获取对应字段的最大值,比如下面的代码是计算age大于40的数据里面的最大值。

        Button('age的最大值')
            .onClick(() => {
              let query = Bmob.Query('test');
              query.where(GT('age',40)).max('age').then((res) => {
                Prompt.showToast({ message: res.toString() });
              }).catch((err) => {
                Prompt.showToast({ message: '计算最大值失败,原因:' + err.error });
              });
            });

最小值

使用Bmob.Querymin方法可以获取对应字段的最小值,比如下面的代码是计算age的最小值。

        Button('age的最小值')
            .onClick(() => {
              let query = Bmob.Query('test');
              query.min('age').then((res) => {
                Prompt.showToast({ message: res.toString() });
              }).catch((err) => {
                Prompt.showToast({ message: '计算最小值失败,原因:' + err.error });
              });
            });

平均值

使用Bmob.Queryaverage方法可以获取对应字段的最小值,比如下面的代码是计算age的平均值。

        Button('age的平均值')
            .onClick(() => {
              let query = Bmob.Query('test');
              query.average('age').then((res) => {
                Prompt.showToast({ message: res.toString() });
              }).catch((err) => {
                Prompt.showToast({ message: '计算平均值失败,原因:' + err.error });
              });
            });

短信服务

发送短信验证码

执行Bmob.requestSmsCode方法,可以往执行的手机号码发送短信验证码。


        Button('发送短信验证码')
            .onClick(() => {
              Bmob.requestSmsCode('13800138000').then((res) => {
                Prompt.showToast({ message: '发送成功' });
                console.log('请求输出 smsId=' + res.smsId);
              }).catch((err) => {
                Prompt.showToast({ message: '发送失败,原因:' + err.error });
              });
            });

默认情况下,发送的短信验证码签名是Bmob后端云企业的官方签名,如果你想改为你自己独特的短信签名,你就需要先到Bmob后端云的控制台中先申请短信验证码模版(如下图所示),待审核通过之后,再修改requestSmsCode方法,添加验证码模版的名称作为第二个参数,代码如下:


        Button('发送短信验证码')
            .onClick(() => {
              Bmob.requestSmsCode('13800138000','你的短信验证码模版名称').then((res) => {
                Prompt.showToast({ message: '发送成功' });
                console.log('请求输出 smsId=' + res.smsId);
              }).catch((err) => {
                Prompt.showToast({ message: '发送失败,原因:' + err.error });
              });
            });

检查短信验证码

执行Bmob.verifySmsCode方法,可以检查收到的短信验证码是否正确,如下面的代码,检查13800138000这个手机收到的802093验证码是否正确。

如果正确,返回true,否则返回false


        Button('检查短信验证码')
            .onClick(() => {
              Bmob.verifySmsCode('13800138000', '802093').then((res) => {
                if (res) {
                  Prompt.showToast({ message: '验证码正确' });
                }
                else {
                  Prompt.showToast({ message: '验证码错误' });
                }
              });
            });

调用云函数

客户端的代码安装到客户手机之后,更新相对比较麻烦,有时候,我们希望一些代码具有高度的可变动性,这就需要用到Bmob的云代码功能。云代码的开发大家可查看Bmob后端云的官方文档: https://doc.bmobapp.com/cloud_function/web/

客户端调用云函数的方法如下:


        Button('调用云函数')
            .onClick(() => {
              let data = {
                "age": 18,
                "name": "北京海淀区"
              }
              Bmob.functions('good',data).then((res) => {
                Prompt.showToast({ message: '云函数返回:' + res });
              }).catch((err) => {
                Prompt.showToast({ message: '调用云函数失败,原因' + err.error });
              });
            });

其中,good是我们在Bmob后端云控制台上创建的云函数方法名称,data是我们希望传递给这个方法的参数。

用户管理

很多应用都会涉及到用户账号体系,为了方便大家便捷开发,Bmob后端云提供了 Bmob.User 类的完整用户管理的接口。

账号密码进行用户注册


        Button('账号密码进行用户注册')
            .onClick(() => {
              let user = Bmob.User();
              user.register({
                'username': '13800138000',
                'password': '123456',
                'age': 18,
                'address': '广州番禺'
              }).then((res) => {
                console.log('注册返回信息'+ JSON.stringify(res));
                Prompt.showToast({ message: '注册成功,objectId=' + res.objectId });
              }).catch((err) => {
                Prompt.showToast({ message: '注册失败,原因:' + err.error });
              });
            });

注意,register方法的参数必须包含username(账号)和password(密码),其他参数可根据实际情况添加。

手机验证码一键注册登录

调用signOrLoginByMobilePhone方法,提供手机号码收到的短信验证码注册的信息(如果是登录,data可设置为 {} ),可实现一键注册登录,代码如下:

        Button('手机验证码一键注册/登录')
            .margin(10)
            .onClick(() => {
              let user = Bmob.User();
              let data = {
                "age": 18,
                "address": "北京海淀区"
              }
              user.signOrLoginByMobilePhone('13800138000', '776232', data).then((res) => {
                Prompt.showToast({ message: '登录成功,' + res.username });
              }).catch((err) => {
                Prompt.showToast({ message: '登录失败,原因' + err.error });
              });
            });

账号密码进行用户登录

使用login方法,账号密码 作为方法的参数,可进行登录验证,代码如下。


        Button('用户登录')
            .onClick(() => {
              let user = Bmob.User();
              user.login('13800138000', '123456').then((res) => {
                Prompt.showToast({ message: '登录成功,objectId=' + res.objectId });
              }).catch((err) => {
                Prompt.showToast({ message: '登录失败,原因:' + err.error });
              });
            });

如果登录成功,Bmob SDK会自动保存用户的信息到内存中。

获取登录用户的信息


        Button('获取登录用户信息')
            .onClick(() => {
              let user = Bmob.User();
              user.current().then((res)=>{
                console.log('用户信息='+ JSON.stringify(res));
              }).catch((err) => {
                Prompt.showToast({ message: '获取失败,原因:' + err.error });
              });
            });

上面的代码我们通常会放在应用的启动代码中,判定是否登录过。

检查登录状态是否过期

Bmob后端云会对用户的登录状态进行维护,为安全起见,我们会定期更新用户的登录会话信息(sessionToken)。

也就是说,如果用户长时间不登录,我们会认为这个用户已经退出。这就需要一个接口能够检查用户的登录状态是否过期,代码如下:

        Button('检查登录状态是否过期')
            .margin(10)
            .onClick(() => {
              let user = Bmob.User();
              user.checkSession().then((res) => {
                if(res)
                  Prompt.showToast({ message: '未过期'});
                else
                  Prompt.showToast({ message: '已过期'});
              }).catch((err) => {
                Prompt.showToast({ message: '获取失败,原因:' + err.error });
              });
            });

退出登录

代码如下:


        Button('退出登录')
            .onClick(() => {
              Bmob.User().logout();
              Prompt.showToast({ message: '退出成功' });
            });

修改用户基本信息

调用updateUser方法,可修改登录用户的基本信息,代码如下。

        Button('修改登录用户信息')
            .onClick(() => {
              let user = Bmob.User();
              user.updateUser({
                'age':888,
                'address':'月球唐家湾',
              }).then((res) => {
                Prompt.showToast({ message: '修改成功,updatedAt=' + res });
              }).catch((err) => {
                Prompt.showToast({ message: '修改失败,原因:' + err.error });
              });
            });

修改密码

旧密码方式安全修改用户密码

用户登录状态下,调用resetPasswordByOldPassword方法,提供旧密码和新密码作为入口参数,可修改登录用户的密码。

        Button('旧密码方式安全修改用户密码')
            .onClick(() => {
              let user = Bmob.User();
              user.resetPasswordByOldPassword('123456','123').then((res) => {
                if (res) {
                  Prompt.showToast({ message: '修改成功' });
                }
                else {
                  Prompt.showToast({ message: '修改失败' });
                }
              }).catch((err) => {
                Prompt.showToast({ message: '发送失败,原因:' + err.error });
              });;
            });

短信验证码修改密码

调用这个方法之前,首先要先调用Bmob.requestSmsCode方法,发送短信验证码,再执行下面的代码修改密码:

        Button('短信验证码修改密码')
            .margin(10)
            .onClick(() => {
              let user = Bmob.User();
              user.resetPasswordBySmsCode('124907','123456').then((res) => {
                if (res) {
                  Prompt.showToast({ message: '修改成功' });
                }
                else {
                  Prompt.showToast({ message: '修改失败' });
                }
              }).catch((err) => {
                Prompt.showToast({ message: '发送失败,原因:' + err.error });
              });;
            });

其中,124907是收到的短信验证码,123456是要修改的密码。

邮箱重置密码

如果注册的时候,我们提供email信息,那我们还可以采用邮箱来重置密码,代码如下:

        Button('邮箱重置密码')
            .onClick(() => {
              let user = Bmob.User();
              user.resetPasswordByByEmail('bmob@bmobapp.com').then((res) => {
                if (res) {
                  Prompt.showToast({ message: '发送邮件成功' });
                }
                else {
                  Prompt.showToast({ message: '发送邮件失败' });
                }
              }).catch((err) => {
                Prompt.showToast({ message: '发送失败,原因:' + err.error });
              });;
            });

源码下载

本文档的源码下载地址:https://gitee.com/zhang-ming-123/bmob-harmony-demo