在鸿蒙开发中实现完整的注册登录流程
上次分享过一次注册登录的页面开发,不过不牵扯数据,今天加上数据存储实现一个完整的注册登录流程。
数据存储方式采用比较常用的本地存储方式,用户首选项来实现。
关于界面比较简单,之前的文章已经分享过,所以这里不再赘述,直接贴一个登录界面的代码,注册页面跟它也差不多:
build() { Stack({alignContent:Alignment.Top}){ Stack({alignContent:Alignment.TopEnd}){ Image($r('app.media.log_img_1')) .width('100%') Image($r('app.media.log_img_2')) .width(200) .height(200) } Column(){ Row(){ Image($r('app.media.logo')) .width(33) .height(33) Text('幽蓝计划') .fontSize(27) .fontColor(Color.Black) .fontWeight(FontWeight.Bolder) .margin({left:10}) } Text('欢迎登录使用!') .fontSize(18) .fontColor('rgba(100, 106, 115, 1)') .margin({top:8}) TextInput({placeholder:'请输入手机号'}) .placeholderColor('#8F959E') .fontSize(15) .fontColor(Color.Black) .width('100%') .height(50) .borderRadius(10) .borderWidth(1) .borderColor('#D0D3D5') .backgroundColor(Color.White) .margin({top:50}) .onChange((value)=>{ this.telePhone = value }) Row(){ TextInput({placeholder:'请输入验证码'}) .placeholderColor('#8F959E') .fontSize(15) .fontColor(Color.Black) .width('70%') .height(50) .backgroundColor(Color.White) .onChange((value)=>{ this.psw = value }) Row(){ } .width(1) .height(30) .backgroundColor('rgba(237, 237, 237, 1)') .borderRadius(0.5) Text('获取验证码') .width('30%') .height(50) .fontColor('#FAB84F') .fontSize(15) .textAlign(TextAlign.Center) } .width('100%') .height(50) .borderRadius(10) .borderWidth(1) .borderColor('#D0D3D5') .backgroundColor(Color.White) .margin({top:25}) Column(){ Text('立即登录') .width('100%') .height(50) .backgroundColor('#FAB84F') .fontColor(Color.White) .fontSize(16) .textAlign(TextAlign.Center) .borderRadius(10) .onClick(()=>{ this.login() }) } .margin({top:75}) .width('100%') .alignItems(HorizontalAlign.Center) Row(){ Text("没有账号?") .fontColor('rgba(143, 149, 158, 1)') .fontSize(14) Text("立即注册") .fontColor('#FAB84F') .fontSize(14) .onClick(()=>{ router.pushUrl({ url:'pages/Register' }) }) } .margin({top:25}) } .width('100%') .height('100%') .alignItems(HorizontalAlign.Start) .padding({left:30,right:30,top:140}) } .width('100%') .height('100%')}
下面进入数据校验和存储部分,先来初始化一个用户首选项实例:
initData(){
dataPreference.getPreferences(getContext(this),'myStore',(err,preference)=>{
this.localPreference = preference
}
)}
这里的实例化方法有两种方式,除了使用上面的异步操作回调方法之外,还可以使用await来等待异步方法执行完成,不过这样的写的话方法名要加上async:
async initData(){
this.localPreference = await dataPreference.getPreferences(getContext(this),'myStore')
}
同样的,以后所有的异步操作我们都可以采用这种方式。
下一步,在用户输入完成之后我们要先对手机号格式进行验证,这里可以使用正则表达式,如下表达式是验证一个1开头的11位数字:
validTelphone(tel:string){
//正则表达式 1开头的11位整数
const reg = /^1\d{10}$/
return reg.test(tel)
}
然后验证账号是否已经注册:
let hasUser = await this.localPreference!.has('user')
if(hasUser){
let user = await this.localPreference!.get('user','default')
let userItem:User = JSON.parse(user.toString())
if(userItem.username == this.telePhone){
this.showDialog('用户已经存在')
return
}
}
手机号验证完成之后,对密码进行验证,这个比较简单,两次输入一致,6位数就行了。
一切验证完毕,就可以把账号密码存到本地:
this.localPreference!.put('user',JSON.stringify(user),(err)=>{
if(!err){
this.localPreference!.flush((err)=>{
if(!err){
this.showDialog('注册成功',()=>{
router.back()
})
}
})
}
})
然后回到登录部分,登录部分相对简单了,先校验账号密码不为空之后和本地数据进行比对就行了:
dataPreference.getPreferences(getContext(this),'myStore',(err,preference)=>{ preference.has('user',(err,val)=>{ if(val){ preference.get('user','default',(err,value)=>{ let user:User = JSON.parse(value.toString()) if(user.username == this.telePhone && user.psw== this.psw){ EntryAbility.windowStage.loadContent('pages/TabView') }else { this.showDialog('用户名密码不正确') return } }) }else { this.showDialog('用户不存在') return } })})
大家可以发送‘注册登录’获取本项目完整代码。