bmob Harmony快速开发手机号一键登录功能

最近用Bmob的鸿蒙SDK尝试了Harmony开发,做了一个几乎每个应用都会有的功能:手机号码+短信验证码一键注册登录的功能,感觉简直爽的不要不要的,ArkUI可见即可得的UI交互设计体验,配合Bmob后端云一如既往简单易用的风格,开发一些应用去占领鸿蒙市场。毕竟国产化是一个大的趋势,越早占坑越好。

先给一下效果图:

1.png

2.png

一、界面布局

1、添加状态装饰器

@State状态装饰器是鸿蒙ArKTS语言的一大特色。@State装饰的变量,又称为状态变量,可以和组件进行绑定渲染。当@State装饰的变量发生改变时,和这个变量绑定的UI的渲染也会发生改变。这样,我们的开发就可以变得非常松散耦合。

比如,下面的代码:

image.png

我们在按钮的点击事件中只需要设置message这个状态变量的值,和Text绑定的message就会立即渲染出来。

为了实现这个案例中的效果,我添加了如下的状态变量:

// 存储手机号码
@State
phone:string = ''// 存储验证码
@State
code:string = ''// 是否勾选了已阅读并同意用户协议和隐私政策
@State
isAgree:boolean = false// 是否允许点击 获取验证码 按钮
@State
isAllowGetCOde:boolean = true// 再次获取验证码倒计时(秒)
@State
count:number = 60// 获取验证码按钮上的文字
@State
codeBtText:string = '获取验证码'// 是否点击了 立即登录 按钮
@State
loading:boolean = false

2、布局和组件

这里用到了Image(图片)、Text(文本)、TextInput(输入框)、Checkbox(选择)、LoadingProgress(加载)组件,根据实际的情况,采用了Navigation(导航)、Scroll(滑动)、Column(行)、Row(列)布局。

我们可以在组件里面添加组件,比如下面的ArkUI代码,我们可以在按钮的组件中加上LoadingProgress组件和Text组件,实现更酷炫的效果。

Button({type:ButtonType.Normal}){Row(){if(this.loading){LoadingProgress().color('#ffffff').width(24).height(24).margin({right:10})}Text('立即登录').fontColor('#ffffff')}}

这个案例的布局和按钮UI代码如下:


Navigation(){Scroll(){Column(){Column(){Image($r("app.media.bmob")).width(100).aspectRatio(1).borderRadius(10)Text('Bmob后端云').fontSize(28).margin({bottom:15,top:10})Text('Bmob后端云,让开发更简单').fontSize(14).fontColor('#979797')}Column({space:15}){TextInput({placeholder:'请输入手机号码',text:this.phone}).type(InputType.PhoneNumber).onChange(val=>this.phone=val)Row({space:5}){TextInput({placeholder:'验证码',text:this.code}).type(InputType.Number).layoutWeight(1).showPasswordIcon(true).onChange(val=>this.code=val)Button(this.codeBtText).backgroundColor(this.isAllowGetCOde?'#fa711d':'#979797').enabled(this.isAllowGetCOde).width(100).onClick(()=>{this.getCode()})}Row(){Checkbox().selectedColor('#fa711d').aspectRatio(1).select(this.isAgree).onChange((val)=>{this.isAgree=val})Row({space:4}){Text('已阅读并同意').fontSize(14).fontColor('#979797')Text('用户协议').fontSize(14).fontColor('#979797')Text('和').fontSize(14).fontColor('#979797')Text('隐私政策').fontSize(14).fontColor('#979797')}}.width('100%')Button({type:ButtonType.Normal}){Row(){if(this.loading){LoadingProgress().color('#ffffff').width(24).height(24).margin({right:10})}Text('立即登录').fontColor('#ffffff')}}.width('100%').backgroundColor('transparent').stateEffect(false).borderRadius(4).height(44).linearGradient({direction:GradientDirection.Right,colors:[['#fc9c1c',0],['#fa711d',1]]}).enabled(!this.loading).onClick(()=>{this.login()})}.padding(30)}}
}
.mode(NavigationMode.Stack)

我们可以在隐私政策和用户协议的Text中实现点击事件,这样就能够跳转到对应的内容阅读中。这也是我们为什么要把完整“已阅读并同意用户协议和隐私政策”拆分出来的原因。

二、添加交互代码

1、导入Bmob库

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

ohpm install @bmob/bmob 

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

image.png

2、获取密钥

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

image.png

3、初始化应用

在你创建的鸿蒙应用中,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('你的Secret Key', '你的Secret Code')}
}

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

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

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

image.png

5、编写获取短信验证码代码

获取短信验证码的代码,首先要先进行一些必要的数据验证。

为了防止用户拼命点击获取短信验证码的按钮,这里做了一个限制,当用户点击获取短信验证码之后,会有一个60秒的倒计时,倒计时结束,才能重新点击。

发送短信验证码的代码其实非常简单,就是调用Bmob.requestSmsCode()的方法,传递手机号码作为入口参数就可以轻松发送短信了。

整个发送短信验证码的事件代码如下:

getCode(){if(!this.phone)return promptAction.showToast({message:'请输入手机号码'})if(!this.isAgree)return promptAction.showToast({message:'请先同意用户协议和隐私政策'})this.isAllowGetCOde = falsethis.codeBtText = '重新获取(60)'Bmob.requestSmsCode(this.phone).then((res)=>{promptAction.showToast({message:'发送成功'})// 限制60秒获取一次验证码this.timer = setInterval(()=>{this.count -= 1if(this.count<=0){clearInterval(this.timer)this.timer = -1this.isAllowGetCOde = truethis.count = 60this.codeBtText = '获取验证码'} else{this.codeBtText = `重新获取(${this.count})`}},1000)}).catch((err)=>{this.isAllowGetCOde = truethis.codeBtText = '获取验证码'promptAction.showToast({message:`获取验证码错误,原因:${err.error}`})})
}

6、手机号码+短信一键注册登录

这部分代码也是非常简单,首先进行必要的校验,然后执行Bmob.User().signOrLoginByMobilePhone()方法,传递手机号码和收到的验证码,即可实现一键注册登录。

login(){if(!this.phone)return promptAction.showToast({message:'请输入手机号码'})if(!this.code)return promptAction.showToast({message:'请输入验证码'})if(!this.isAgree)return promptAction.showToast({message:'请先同意用户协议和隐私政策'})this.loading = true// 调用Bmob后端云的手机号码一键登录的服务Bmob.User().signOrLoginByMobilePhone(this.phone,this.code).then((res)=>{this.loading = falseconsole.log('请求返回' + JSON.stringify(res));router.replaceUrl({url:'pages/Index'})promptAction.showToast({message:'注册成功'})}).catch((err)=>{promptAction.showToast({message:`发生错误,原因:${err.error}`})})
}

三、源码获取

https://gitee.com/zhang-ming-123/bmob-harmony-demo

四、参考资料

https://doc.bmobapp.com/data/harmony/index.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/863516.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Perplexity打造产品的27种方式

ChatGPT和Perplexity等聊天机器人正迅速成为产品经理的首选助手。以下是一份全面的指南&#xff0c;介绍PM如何在日常工作中使用Perplexity&#xff0c;该指南基于300多份回复和30次电话后的总结。 理解并制定增长战略&#xff1a;例如&#xff0c;解释增长会计的基本原理&…

【Vue】——组件之间数据的传递

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

MySQL触发器教程(02):创建删除后触发器

文章目录 介绍语法使用场景示例创建students表创建scores表创建删除触发器 结论 介绍 MySQL 触发器是一种数据库对象&#xff0c;可以在特定的数据库表上自动执行一系列的操作&#xff0c;例如插入、更新或删除数据&#xff0c;当特定的事件&#xff08;例如数据的插入、更新或…

ES6面试题——var,let,const的区别

它们都是用来声明变量的。 1. var具有变量提升机制&#xff0c;let和const没有 /* var有变量提升机制 */ <script> console.log(str); // 打印出undefined var str "你好"; </script>/* let没有变量提升机制 */ <script> console.log(str); // …

【proteus经典实战】16X192点阵程序

一、简介 6X192点阵程序通常用于表示高分辨率图像或文字&#xff0c;其中16X表示像素阵列的宽度&#xff0c;192表示每个像素阵列中的点阵数&#xff0c;16X192点阵程序需要一定的编程知识和技能才能编写和调试&#xff0c;同时还需要考虑硬件设备的兼容性和性能等因素。 初始…

知识不成体系?这篇Mysql数据库将成为你的解忧杂货店!(子查询)

欢迎来到一夜看尽长安花 博客&#xff0c;您的点赞和收藏是我持续发文的动力 对于文章中出现的任何错误请大家批评指出&#xff0c;一定及时修改。有任何想要讨论的问题可联系我&#xff1a;3329759426qq.com 。发布文章的风格因专栏而异&#xff0c;均自成体系&#xff0c;不足…

网线直连电脑可以上网,网线连tplink路由器上不了网

家里wifi网络连不上好几天了&#xff0c;用网线直连电脑可以上网&#xff0c;但网线连tplink路由器wan口上不了网&#xff0c;无Internet连接&#xff0c;网线连lan口可以电脑上网&#xff0c;手机上不了。 后来发现网线的主路由用的192.168.0.1&#xff0c;我的路由器wan口自…

R包的4种安装方式及常见问题解决方法

R包的4种安装方式及常见问题解决方法 R包的四种安装方式1. install.packages()2. 从Bioconductor安装3. 从本地源码安装4. 从github安装 常见问题的解决1. 版本问题2. 网络/镜像问题3.缺少Rtools R包的四种安装方式 1. install.packages() 对于R自带的包的安装一般都可以通过…

共模和差模的基本概念

电压电流在导体或导线中传播时&#xff0c;存在两种工作形态&#xff1a;共模和差模。电子设备的信号线在进行相互通信时&#xff0c;至少会存在两根导线以形成电传输回路&#xff0c;除此之外&#xff0c;通常还存在第三个导体&#xff0c;即“参考地”。当信号正常传输时&…

51单片机第18步_将TIM0用作13位定时器

本章重点学习将TIM0用作13位定时器。 #include <REG51.h> //包含头文件REG51.h,使能51内部寄存器; //定时器的方式控制寄存器TMOD: GATE1,C/T1,M1_1,M1_0,GATE0,C/T0,M0_1,M0_0 //GATE11,表示T1是受INT1脚(P3.3)控制运行; //C/T10,表示T1的时钟源为fosc/12;C/T11,表示…

c++类成员指针用法

1&#xff09;C入门级小知识&#xff0c;分享给将要学习或者正在学习C开发的同学。 2&#xff09;内容属于原创&#xff0c;若转载&#xff0c;请说明出处。 3&#xff09;提供相关问题有偿答疑和支持。 c中新增类成员指针操作&#xff0c;为了访问方便&#xff0c;他是指…

Meven

目录 1.简介2.Maven项目目录结构2.1 约定目录结构的意义2.2 约定大于配置 3. POM.XML介绍3.2 依赖引用3.3 属性管理 4 Maven生命周期4.1 经常遇到的生命周期4.1 全部生命周期 5.依赖范围&#xff08;Scope&#xff09;6. 依赖传递6.1 依赖冲突6.2 解决依赖冲突6.2.1 最近依赖者…

微信小程序调用函数

在微信小程序中调用函数是一个基础且重要的概念&#xff0c;它贯穿于小程序开发的各个方面。函数可以定义在Page对象中&#xff0c;也可以定义在独立的JS文件中并通过模块导入使用。下面我将详细介绍几种常见的函数调用场景和方法。 1. 在Page对象中定义和调用函数 在小程序的…

鸿蒙项目实战-月木学途:1.编写首页,包括搜索栏、轮播图、宫格

效果展示 搜索栏制作 相关知识回顾 输入框组件TextInput 单行输入框类型.type(InputType.Normal)//基本输入框.type(InputType.Password)//密码.type(InputType.Email)//邮箱.type(InputType.Number)//数字.type(InputType.PhoneNumber)//电话号.type(InputType.Normal).type…

地图初始化-多视图几何基础

在ORB-SLAM2中初始化和使用的传感器类型有关&#xff0c;其中单目相机模式初始化相对复杂&#xff0c;需要运行一段时间才能成功初始化。而双目相机、 RGB-D相机模式下比较简单&#xff0c;一般从第一帧开始就可以完成初始化。 为什么不同传感器类型初始化差别这么大呢&#x…

微信小程序实现轻提示

微信小程序提供了多种内置的方法来显示提示信息&#xff0c;包括但不限于wx.showToast、wx.showModal和wx.showLoading等。这些方法可以快速地在小程序中实现各种提示效果&#xff0c;而无需手动编写复杂的动画或样式代码。下面&#xff0c;我将详细介绍这几个方法的使用。 1.…

spring-security安全框架(超精细版附带流程讲解图)

目录 一、回顾一下 二、security使用 2.1 覆盖掉默认配置「自定义配置」 2.2 如何自定义认证 2.3 纯纯自定义 2.4 jwt 2.5 官网认证流程 2.6 RBAC模型 4.1. 创建表结构 2.7 如何实现权限流程 一、回顾一下 security干啥的? 认证和授权 使用方式 引入依赖, 基于spri…

算法力扣刷题 二十五【28.找出字符串中第一个匹配项的下标】

前言 字符串篇&#xff0c;继续。 记录 二十五【28.找出字符串中第一个匹配项的下标】 一、题目阅读 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不…

RESTful Web 服务详解

RESTful Web 服务是一种基于 Representational State Transfer (REST) 架构风格的 Web 服务&#xff0c;它利用 HTTP 协议来传输数据&#xff0c;支持多种数据格式如 JSON 和 XML。在 Spring 框架中&#xff0c;通过简单配置和注解可以轻松实现 RESTful Web 服务。在本文中&…

C语言中的基础指针操作

在C语言中&#xff0c;指针是一个非常重要的概念&#xff0c;它提供了直接访问内存地址的能力。指针变量用于存储内存地址&#xff0c;而不是数据值&#xff0c;在某种意义上和门牌号具有相似含义&#xff1a;指针是一个变量&#xff0c;其存储的是另一个变量的内存地址&#x…