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…

【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;即“参考地”。当信号正常传输时&…

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 最近依赖者…

鸿蒙项目实战-月木学途: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…

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 不…

C语言中的基础指针操作

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

java之动态代理

1 代理模式 代理模式提供了对目标对象额外的访问方式&#xff0c;即通过代理对象访问目标对象&#xff0c;这样可以在不修改原目标对象的前提下&#xff0c;提供额外的功能操作&#xff0c;扩展目标对象的功能。简言之&#xff0c;代理模式就是设置一个中间代理来控制访问原目标…

网络io与select,poll,epoll

前言 网络 IO&#xff0c;会涉及到两个系统对象&#xff0c;一个是用户空间调用 IO 的进程或者线程&#xff0c;另一个是内核空间的内核系统&#xff0c;比如发生 IO 操作 read 时&#xff0c;它会经历两个阶段&#xff1a; 1. 等待数据准备就绪 2. 将数据从内核拷贝到进程或…

网络编程常见问题

1、TCP状态迁移图 2、TCP三次握手过程 2.1、握手流程 1、TCP服务器进程先创建传输控制块TCB&#xff0c;时刻准备接受客户进程的连接请求&#xff0c;此时服务器就进入了LISTEN&#xff08;监听&#xff09;状态&#xff1b; 2、TCP客户进程也是先创建传输控制块TCB&#xff…

改进经验模态分解方法-通过迭代方式(IMF振幅加权频率,Python)

一种新颖的改进经验模态分解方法-通过迭代方式&#xff08;IMF振幅加权频率&#xff09;有效缓解了模态混叠缺陷&#xff0c;以后慢慢讲&#xff0c;先占坑。 import numpy as np import matplotlib.pyplot as plt import os import seaborn as sns from scipy import stats i…

C语言图书管理系统控制台程序

程序示例精选 C语言图书管理系统控制台程序 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《C语言图书管理系统控制台程序》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读…

加密与安全_三种方式实现基于国密非对称加密算法的加解密和签名验签

文章目录 国际算法基础概念常见的加密算法及分类签名和验签基础概念常见的签名算法应用场景 国密算法对称加密&#xff08;DES/AES⇒SM4&#xff09;非对称加密&#xff08;RSA/ECC⇒SM2&#xff09;散列(摘要/哈希)算法&#xff08;MD5/SHA⇒SM3&#xff09; Code方式一 使用B…