首页 > 其他分享 >鸿蒙应用ArkTS开发-实现登录注册功能

鸿蒙应用ArkTS开发-实现登录注册功能

时间:2024-09-04 14:21:26浏览次数:11  
标签:ArkTS 鸿蒙 登录 HarmonyOS 100% height width placeholder pages

 引言:小编也是最近学习的鸿蒙应用开发,把自己的学习心得想法和大家交流,一起探讨!

一、概述

HarmonyOS(鸿蒙操作系统)是华为公司开发的操作系统。它的设计初衷是为了应对当今多设备、多平台(1+8+N)的需求,为各种类型的设备提供一个统一的操作系统。HarmonyOS具有以下几个主要特点:

1. 多设备支持

HarmonyOS的核心理念是构建一个跨设备的操作系统,能够在不同类型的硬件上运行,包括智能手机、智能家居设备、平板电脑、电视、车载系统等。这种跨平台的特性旨在简化用户的设备使用体验,提供无缝的操作界面和功能。

2. 分布式架构

HarmonyOS采用了分布式架构,使得不同设备之间能够无缝协作。例如,当用户在手机上启动一个应用时,能够在其他设备上自动同步或继续操作,创建一个统一的使用体验。

3. 微内核设计

HarmonyOS的微内核设计与传统操作系统有所不同。微内核将系统功能最小化到核心,其他功能如驱动程序、服务等运行在用户空间,这有助于提高系统的安全性和稳定性。微内核的设计也使得操作系统更加灵活,能够适应不同类型的硬件。

4. 开发者生态

华为为HarmonyOS提供了一整套开发工具和平台,鼓励开发者为该系统创建应用。HarmonyOS支持多种编程语言和开发框架,如Java、C++、ArkUI等,开发者可以利用这些工具开发出适配于各种设备的应用程序。

5. 智能特性

HarmonyOS集成了许多智能特性,如语音识别、人工智能助手等,提升用户交互体验。这些功能旨在使设备更加智能、便捷。

6. 与安卓兼容

HarmonyOS在推出初期为安卓应用提供了兼容支持,这使得开发者可以相对轻松地将现有的安卓应用迁移到HarmonyOS平台上。

总的来说,HarmonyOS是华为在推动技术创新、实现设备互联互通方面的重要战略一步,旨在通过统一的操作系统来提升用户体验和设备之间的协同工作。

二、项目实现

 接下来我将带着大家一起一个简单的登录注册功能:

1.新建项目

首先我打开DevEco Studio开发工具点击File->New->Create Project:

我们勾选第一个Empty Ability,点击Next:

 接下来我们根据需求自行修改项目名称,之后点击Finsh:

官方文档 :

  • Project name:工程的名称,可以自定义,由大小写字母、数字和下划线组成。
  • Bundle name:标识应用的包名,用于标识应用的唯一性。
  • Save location:工程文件本地存储路径,由大小写字母、数字和下划线等组成,不能包含中文字符。
  • Compatible SDK:兼容的最低API Version。
  • Module name: 模块的名称。
  • Device type:该工程模板支持的设备类型。

至此,项目创建就完成了

目录结构介绍(来自官方文档):

  • AppScope > app.json5:应用的全局配置信息,详见app.json5配置文件
  • entry:HarmonyOS工程模块,编译构建生成一个HAP包。
    • src > main > ets:用于存放ArkTS源码。
    • src > main > ets > entryability:应用/服务的入口。
    • src > main > ets > entrybackupability:应用提供扩展的备份恢复能力。
    • src > main > ets > pages:应用/服务包含的页面。
    • src > main > resources:用于存放应用/服务所用到的资源文件,如图形、多媒体、字符串、布局文件等。关于资源文件,详见资源分类与访问
    • src > main > module.json5:模块配置文件。主要包含HAP包的配置信息、应用/服务在具体设备上的配置信息以及应用/服务的全局配置信息。具体的配置文件说明,详见module.json5配置文件
    • build-profile.json5:当前的模块信息 、编译信息配置项,包括buildOption、targets配置等。
    • hvigorfile.ts:模块级编译构建任务脚本。
    • obfuscation-rules.txt:混淆规则文件。混淆开启后,在使用Release模式进行编译时,会对代码进行编译、混淆及压缩处理,保护代码资产。详见开启代码混淆
    • oh-package.json5:用来描述包名、版本、入口文件(类型声明文件)和依赖项等信息。
  • oh_modules:用于存放三方库依赖信息。
  • build-profile.json5:工程级配置信息,包括签名signingConfigs、产品配置products等。其中products中可配置当前运行环境,默认为HarmonyOS。

  • hvigorfile.ts:工程级编译构建任务脚本。

  • oh-package.json5:主要用来描述全局配置,如:依赖覆盖(overrides)、依赖关系重写(overrideDependencyMap)和参数化配置(parameterFile)等。

2、代码实现 

2.1 页面效果实现

接下来我们正式开始写代码:

打开“Index.ets”文件,进行页面的编写

首先,我们做前端开发,要先对我们将要做的页面进行分析,如组件的布局 :

这里我们看到,整个页面的总体是垂直布局,之后子组件的排列时水平的,因此我们的整体布局使用Column(),子组件的布局使用Row(),具体代码如下:

@Entry
@Component
struct Index {

  build() {
    Column() {
      Column() {
        Row() {
        }
        .width('90%')
        .height(60)
        .backgroundColor(Color.Red)
        // 密码输入框
        Row() {

        }
        .width('90%')
        .height(60)
        .backgroundColor(Color.Blue)

        Row() {
        }
        .height(60)
        .width('90%')
        .backgroundColor(Color.Yellow)
      }.width('100%')
    }
  }
}

布局效果:

这样我们的整体布局就写好了,接下来就是往各个布局内加入所需的组件:

以输入框为例子:

输入框组件为TextInput(),具体的属性可参考官方文档(点我跳转):

具体实现的代码如下:

​
@Entry
@Component
struct Index {
  @State private inputName: string = ''
  build() {
    Column(){
        //账号输入框,水平布局
        Row(){
          Text('账号:')
            .fontSize(16)
          TextInput({text: this.inputName , placeholder: '输入用户名'})
            // 设置placeholder提示语颜色
            .placeholderColor(Color.Grey)
            // 设置placeholder提示语大小,字体粗细
            .placeholderFont({ size: 14, weight: 400 })
            //设置宽度和高度
            .width('80%')
            .height(40)
            //设置组件的外边距,padding为设置组建的内边距
            .margin(20)
            //设置字体大小和颜色
            .fontSize(14)
            .fontColor(Color.Black)
              //光标颜色
            .caretColor('#1AB095')
              // 输入过滤器正则表达式
        }
        .width('90%')
      }.width('100%')
    }
  }

​

实现的效果如图(红色框内点击刷新):

接下来就容易很多了,我们照这个方式一步一步的完善我们的页面,代码如下:

@Entry
@Component
struct Index {
  @State private inputName: string = ''
  @State private inputPassword: string = ''

  build() {
    Column(){
      
      //账号输入框,水平布局
        Row(){
          Text('账号:')
            .fontSize(16)
          TextInput({text: this.inputName , placeholder: '输入用户名'})
            // 设置placeholder提示语颜色
            .placeholderColor(Color.Grey)
              // 设置placeholder提示语大小,字体粗细
            .placeholderFont({ size: 14, weight: 400 })
              //设置宽度和高度
            .width('80%')
            .height(40)
              //设置组件的外边距,padding为设置组建的内边距
            .margin(20)
              //设置字体大小和颜色
            .fontSize(14)
            .fontColor(Color.Black)
              //光标颜色
            .caretColor('#1AB095')
              // 输入过滤器正则表达式
            .inputFilter('[a-z]', (e) => {
              console.log(JSON.stringify(e))
            })
            .onChange((value: string) => {
              this.inputName = value
            })
        }
        .width('90%')
      
        // 密码输入框
        Row() {
          Text('密码:')
            .fontSize(16)
          TextInput({ placeholder: '输入密码',text: this.inputPassword })
            .caretColor('#1AB095')
            .width('80%')
            .height(40)
            .margin(20)
            .type(InputType.Password)
            .maxLength(9)
            .showPasswordIcon(true)
            //将输入框内容赋值给inputPassword
            .onChange((value: string) => {
              this.inputPassword = value
            })
        }
        .width('90%')
      
      // 登录注册按钮
        Row(){
          Button('注册')
            .width(150)
            .height(50)
            .margin(20)
            .backgroundColor('#99FFA8')
              //跳转至注册页面
            .onClick( () => {
              // router.pushUrl({
              //   url:"pages/Register"
              })
          Blank()
          //登录按钮
          Button('登录')
            .width(150)
            .height(50)
            .margin(10)
            .backgroundColor('#1AB095')
            .onClick(() => {
              // this.loginCommit()
            })
        }.width('100%')
      }
      .height('100%')
      .justifyContent(FlexAlign.Center)
      .width('100%')
    }
  }

实现效果图:

接下来我们在上方加两个图片美化一下界面:

Image($r('app.media.green'))
        .width('50%')
        .interpolation(ImageInterpolation.High)
      Image($r('app.media.name'))

        .width('100%')
        .margin({ top: 10})
        .interpolation(ImageInterpolation.High)

 加至账号输入框上方:

实现效果如图:

 图片在下方:

 

将图片放置resources->base->media文件夹中:

这样我们就将基本的页面效果实现了,接下来我们将实现页面间跳转。

2.2 页面间跳转

首先我们先在pages文件夹下创建一个新的页面,右键pages->New->ArkTS File(我的名字为Success):

创建后的代码需要自己写哦:

@Entry
@Component
export struct Success {
  build() {
    Column() {
      Text('登录成功!')
        .fontSize(40)
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }
}

第二个页面:

接下来,我们要进行路由的配置,打开resources->base->profile->main_pages.josn,输入新页面的路径:

{
  "src": [
    "pages/Index",
    "pages/Success"
  ]
}

我们返回index.ets,导入:

import { router } from '@kit.ArkUI'

之后在button组件的onclick()方法中利用router.pushUrl()实现点击跳转:

router.pushUrl({
                url:"pages/success"
              })

进行简单的登录验证: 

.onClick(() => {
              if(this.inputName=="admin"&&this.inputPassword=="123456"){
                // this.loginCommit()
                console.log("登录成功")
                router.pushUrl({
                  url:"pages/Success"
                })
              }else {
                promptAction.showToast(
                  {
                    // 提示信息
                    message: "账号或密码错误",
                    // 提示框显示时间
                    duration: 3000,
                  })
              }
            })

效果如图:

2.3完整代码(一定要进行路由的配置!):
Index.ets :
import { promptAction, router } from '@kit.ArkUI'

@Entry
@Component
struct Index {
  @State private inputName: string = ''
  @State private inputPassword: string = ''

  build() {
    Column(){
      Image($r('app.media.green'))
        .width('50%')
        .interpolation(ImageInterpolation.High)
      Image($r('app.media.name'))

        .width('100%')
        .margin({ top: 10})
        .interpolation(ImageInterpolation.High)
      //账号输入框,水平布局
        Row(){
          Text('账号:')
            .fontSize(16)
          TextInput({text: this.inputName , placeholder: '输入用户名'})
            // 设置placeholder提示语颜色
            .placeholderColor(Color.Grey)
              // 设置placeholder提示语大小,字体粗细
            .placeholderFont({ size: 14, weight: 400 })
              //设置宽度和高度
            .width('80%')
            .height(40)
              //设置组件的外边距,padding为设置组建的内边距
            .margin(20)
              //设置字体大小和颜色
            .fontSize(14)
            .fontColor(Color.Black)
              //光标颜色
            .caretColor('#1AB095')
              // 输入过滤器正则表达式
            .inputFilter('[a-z]', (e) => {
              console.log(JSON.stringify(e))
            })
            .onChange((value: string) => {
              this.inputName = value
            })
        }
        .width('90%')


        // 密码输入框
        Row() {
          Text('密码:')
            .fontSize(16)
          TextInput({ placeholder: '输入密码',text: this.inputPassword })
            .caretColor('#1AB095')
            .width('80%')
            .height(40)
            .margin(20)
            .type(InputType.Password)
            .maxLength(9)
            .showPasswordIcon(true)
            .onChange((value: string) => {
              this.inputPassword = value
            })
        }
        .width('90%')
        Row(){
          Button('注册')
            .width(150)
            .height(50)
            .margin(20)
            .backgroundColor('#99FFA8')
              //跳转至注册页面
            .onClick( () => {
              // router.pushUrl({
              //   url:"pages/Register"
              // })
            })
          Blank()
          //登录按钮
          Button('登录')
            .width(150)
            .height(50)
            .margin(10)
            .backgroundColor('#1AB095')
            .onClick(() => {
              if(this.inputName=="admin"&&this.inputPassword=="123456"){
                // this.loginCommit()
                console.log("登录成功")
                router.pushUrl({
                  url:"pages/Success"
                })
              }else {
                promptAction.showToast(
                  {
                    // 提示信息
                    message: "账号或密码错误",
                    // 提示框显示时间
                    duration: 3000,
                  })
              }
            })
        }.width('100%')
      }
      .height('100%')
      .justifyContent(FlexAlign.Center)
      .width('100%')
    }
  }
 Success.ets:
@Entry
@Component
export struct Success {
  build() {
    Column() {
      Text('登录成功!')
        .fontSize(40)
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }
}

 至此,我们的登录跳转就基本实现了,若是想要完整的登录注册功能,实现前后端连接,可以私信小编哦,后续有时间的话我会发布哦。

标签:ArkTS,鸿蒙,登录,HarmonyOS,100%,height,width,placeholder,pages
From: https://blog.csdn.net/lovecspplon/article/details/141883337

相关文章

  • Flutter仿京东商城项目:‌支持最新的Flutter 3.x及鸿蒙OS
    Flutter仿京东商城项目:‌支持最新的Flutter3.x及鸿蒙OS引言Flutter,‌作为谷歌公司推出的一款基于Dart语言的开源移动UI框架,‌因其跨平台、‌高性能的特点,‌迅速在移动开发领域获得广泛关注。‌随着Flutter3.x的发布,‌带来了诸多新特性和改进,‌进一步提升了开发效率和用户体验......
  • 鸿蒙界面开发(12):选项卡布局(Tabs)
    选项卡布局(Tabs)当页面信息较多时,为了让用户能够聚焦于当前显示的内容,需要对页面内容进行分类,提高页面空间利用率。Tabs组件可以在一个页面内快速实现视图内容的切换。基本布局Tabs组件的页面组成包含两个部分,分别是TabContent和TabBar。TabContent是内容页,TabBar是导航......
  • 油猴脚本自动填写vue页面登录表单,点击登录按钮值被清空了
    直接设置input的value是不行的,因为这个时候没有触发vue里的input事件,vue里绑定变量的值没变为什么?直接修改value应该是会触发@input的才对啊?inputEl.value='xxx'解决方案是:需要手动dispathinputletev=newEvent('input');inputEl.dispatchEvent(ev)示例:(function(......
  • 鸿蒙内核源码分析 (编码方式篇) | 机器指令是如何编码的?
    本篇说清楚 ARM指令是如何被编码的,机器指令由哪些部分构成,指令有哪些类型,每种类型的语法又是怎样的?代码案例|C->汇编->机器指令看一段C语言编译(clang)成的最后的机器指令(armv7)intmain(){inta=0;if(a!=1)a=2*a+1;returna;}生成汇......
  • 鸿蒙内核源码分析 (协处理器篇) | CPU 的好帮手
    本篇很重要,对CP15协处理所有16个寄存器一一介绍,可能是全网介绍CP15最全面的一篇,鸿蒙内核的汇编部分(尤其开机启动)中会使用,熟练掌握后看汇编代码将如虎添翼。协处理器协处理器 (co-processor)顾名思义是协助主处理器完成工作,例如浮点、图像、音频处理这一类外围工作。角色相当于......
  • Linux启动后自动登录root进入控制台
    通过修改/etc/inittab文件来实现1.buildroot编译出来的 /etc/inittab文件如下##Copyright(C)2001ErikAndersen<[email protected]>##Note:BusyBoxinitdoesn'tsupportrunlevels.Therunlevelsfieldis#completelyignoredbyBusyBoxinit.Ifyo......
  • 帝国CMS后台登录空白怎么办?如何修改成https
    今天总结一下帝国CMS后台登录空白常见问题已经解决方案!1、帝国cms修改成https后后台登陆空白的解决办法以下方法适用帝国cms7.5版本:7.5版本已经有了http和https自动识别,但是因为一些疑难杂症的原因,自动识别判断的不准,后台登录也是空白,我们可以打开e/config.php查找'httptype'......
  • zdppy+vue3+onlyoffice文档管理系统实战 20240902 上课笔记 登录功能优化
    遗留问题1、登录以后跳转最近文档2、如果用户没有登录应该自动跳转登录页面3、如果用户的token校验失败,应该自动调整登录界面4、按回车键自动跳转登录页面登录以后跳转最近文档constrouter=useRouter()router.push("/")实际代码:constloginData=awaitapi.login......
  • HarmonyOS实现登录
    首先,封装一个auth工具,提供初始化持久化用户信息方法,首页初始化用户,登录后存储用户,使用导出的key。1.封装auth工具exportinterfaceUser{token:stringnickname:stringavatar:stringaccount:string}classAuth{KEY:string='user'//在入口页......
  • 某税务app登录接口逆向--获取长效ck
    某税务app登录接口逆向–获取长效ck前言:之前分析了web版本的登录接口,各参数都很简单。有朋友私信我说app登录有意外惊喜,俺们做学术研究的不就是喜欢发掘惊喜么,鉴于此有了此文分析一、目的​1.1、实现完整登录接口(账号登录、短信登录)​1.2、实现免短信登录接口​......