HarmonyOS APP应用开发项目- MCA助手(Day02持续更新中~)

简言:

gitee地址:https://gitee.com/whltaoin_admin/money-controller-app.git
端云一体化开发在线文档:
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/agc-harmonyos-clouddev-view-0000001700053733-V5
注:此App参照此教程进行二次修改:https://www.bilibili.com/video/BV1q5411v7o7


项目构建静态页面

钱包页面

  • 效果图

image.png
image.png

  • 结构:
  • image.png
主页面:Wallet.ets
子页面:addCard.ets
组件:
BankCardComponent 银行卡片
TitleComponent  顶部标题
  • 编写思路:
// 钱包页面和主页页面效果类似,复制其修改部分既可。
  • 代码
// 页面三:钱包 Wallet
import { BankCardComponent } from '../../components/BankCardComponent'
import TitleComponent from '../../components/TitleComponent'@Component
export  default struct Wallet {build() {Column(){TitleComponent({title:"钱包",is_addIcon:true})Column(){// Text("您好,").width("100%").fontWeight(500)// Text("欢迎回来!").width("100%").fontWeight(500).fontSize(18).margin({top:5,bottom:15})// cardSwiper(){BankCardComponent()BankCardComponent()}.loop(true).autoPlay(true).indicator(Indicator.dot().color(Color.White).selectedColor(Color.White).selectedItemWidth(20)).borderRadius(20)// 功能分类Text("最近联系").width("100%").fontWeight(500).fontSize(18).margin({top:5,bottom:15}).margin({top:30,bottom:20})Row({space:20}){Image($r("app.media.avatar_icon")).width(50).borderRadius(8)Image($r("app.media.avatar_icon")).width(50).borderRadius(8)Image($r("app.media.avatar_icon")).width(50).borderRadius(8)Image($r("app.media.avatar_icon")).width(50).borderRadius(8)}.width("100%")// 功能分类Text("交易信息").width("100%").fontWeight(500).fontSize(18).margin({top:5,bottom:15}).margin({top:30,bottom:20})Column(){List(){ForEach((Array.from({length:10})),()=>{ListItem(){Row(){Image($r("app.media.avatar_icon")).width(36).borderRadius(18).margin({left:5,right:5})Column(){Text("便利店").width("100%").fontSize(14).fontColor("#666")Text("2024年6月29日").width("100%").fontSize(12).fontColor("#999")}.layoutWeight(1)Text("¥1250.50").backgroundColor("#ffffe0e0").borderRadius(20).width(100).height(35).textAlign(TextAlign.Center).fontSize(12).fontColor("#f00")}.width("100%").height(50).backgroundColor("#fffafafa").borderRadius(10).margin({bottom:10})}})}}.width("100%").layoutWeight(1)}.width("100%").layoutWeight(1).padding({left:20,right:20})}.width("100%").height("100%").backgroundColor("#ffffffff")}
}
// 添加银行卡 子页面:AddCard
import InputComponent from '../../components/InputComponent';
import TitleComponent from '../../components/TitleComponent';
@Extend(Text)
function  titleTextStyle(){.width("100%").fontWeight(500).fontSize(18).margin({top:30,bottom:20})
}
@Entry
@Component
struct AddCard {@State message: string = 'Hello World';build() {Column(){// titileTitleComponent({title:"添加新的银行卡",routerUrl:'',is_icon:true})// contentColumn({space:30}){Text("卡片信息").titleTextStyle()InputComponent({title:'银行卡号',placeholder:'XXXXXXXX  XXX XXXXXX',isInputIcon:false})InputComponent({title:'持卡人姓名',placeholder:'请输入持卡人姓名',isInputIcon:false})Row({space:10}){InputComponent({title:'CCV',placeholder:'2533',isInputIcon:false}).layoutWeight(1)InputComponent({title:'到期时间',placeholder:'30-06-2024',isInputIcon:false}).layoutWeight(1)}Button("下一步").width(228).backgroundColor("#ff09b19d").margin({top:50})}.width("100%").height("100%").padding({left:20,right:20})}.width("100%").height("100%").backgroundImage($r("app.media.pageBg"))}
}
// 银行卡片组件:BankCardComponent
@Component
export   struct BankCardComponent {build() {Column(){Row(){Text("中国银行").layoutWeight(1).fontColor(Color.White).fontSize(14).fontWeight(500)Image($r("app.media.card_icon")).width(36)}Text(){Span("¥").fontSize(12)Span("25,230,00").fontSize(24).fontWeight(700)}.width("100%").fontColor(Color.White).margin({top:20})Row(){Text("xxxxxxxxxx  xx xxxxx ").layoutWeight(1).fontColor(Color.White).fontSize(14).fontWeight(500)Text("26/24").fontColor(Color.White).fontSize(12).padding({right:40})}.margin({top:15})}.width("100%").height(150).backgroundColor("#ff09d7d3").padding(20)}
}
// 页面标题组件: TitleComponent
import text from '@ohos.graphics.text'
import router from '@ohos.router'@Component
export  default struct TitleComponent {@Prop title :string@Prop is_icon:boolean@Prop is_addIcon:boolean@Prop routerUrl:string@Prop titleColor:stringbuild() {Row(){if(this.is_icon){Image($r("app.media.Button_left")).width("44").height(30).objectFit(ImageFit.ScaleDown).borderRadius(5).onClick(()=>{router.back()})}Text(this.title).fontColor(this.titleColor).fontWeight(700).fontSize(20).height(40).layoutWeight(1).textAlign(TextAlign.Center)if(this.is_addIcon){Text("+").fontColor(Color.White).fontSize(25).fontWeight(500).border({width:2}).borderRadius(30).width(25).height(25).fontColor(Color.Black).lineHeight(25).textAlign(TextAlign.Center).onClick(()=>{router.pushUrl({url:'pages/bank/AddCard'})})}}.width("100%").justifyContent(FlexAlign.SpaceBetween).padding({left:20,right:20,top:12,bottom:12})}
}

个人页面

  • 效果图

image.png
image.png
image.png

  • 结构
组件:
BankCardComponent 银行卡片
TitleComponent  顶部标题
InputDateComponent 选择日期弹框
InputComponent 普通表单输入框
页面:My 个人主页InfoEdit 个人信息修改页QrCodePage 个人信息二维码生成页工具类:tools
  • 代码
// 页面四:个人信息页
import TitleComponent from '../../components/TitleComponent'
import router from '@ohos.router'
import { Router } from '@kit.ArkUI'@Component
export  default struct My {build() {Column(){TitleComponent({title:"个人资料",titleColor:"#ffff"})Stack({alignContent:Alignment.Start}){Column().width("100%").height(120).backgroundColor("#ffc3f6e1").margin({top:50}).borderRadius(20).shadow({radius:10,color:"#fff"})Column(){Image($r("app.media.user")).width(66).height(66).borderRadius(22).border({width:5,color:'#ff09b06d',style:BorderStyle.Solid}).shadow({radius:10,color:"#fff"})Text("追风的少年").offset({x:80,y:-30}).width("100%")Text("财富的意义,在于分享与贡献,而非单纯的积累。").fontSize(14).fontColor("#ff969191").margin({top:10}).offset({y:-10}).margin({right:10})}.width("100%").alignItems(HorizontalAlign.Start).margin({left:10})Image($r("app.media.right_i")).height(20).offset({y:60,x:270})}.width("100%").padding({left:30,right:30})Row(){Image($r("app.media.edit_icon")).height(30).margin({right:20})Text("编辑个人信息").layoutWeight(1).fontSize(14)Image($r("app.media.right_icon")).height(25)}.height(40).padding({left:5,right:10}).backgroundColor("#fff").margin(20).borderRadius(10).shadow({radius:20,color:"#ff70e7d5"}).onClick(()=>{router.pushUrl({url:"pages/info/InfoEdit"})})Row(){Image($r("app.media.qrcode_icon_external")).height(25).margin({left:5,right:30})Text("个人二维码").layoutWeight(1).fontSize(14)Image($r("app.media.right_icon")).height(25)}.height(40).padding({left:5,right:10}).backgroundColor("#fff").margin(20).borderRadius(10).shadow({radius:20,color:"#ff70e7d5"}).onClick(()=>{router.pushUrl({url :'pages/info/QrCodePage'})})}.width("100%").height("100%").backgroundImage($r("app.media.myPageBg")).backgroundImageSize({width:"100%",height:"100%"})}
}
// 个人信息修改页
import InputComponent from '../../components/InputComponent';
import InputDateComponent from '../../components/InputDateComponent';
import TitleComponent from '../../components/TitleComponent';
@Extend(Text)
function  titleTextStyle(){.width("100%").fontWeight(500).fontSize(18).margin({top:30,bottom:20})
}
@Entry
@Component
struct InfoEdit {@State message: string = 'Hello World';selectedDate: Date = new Date("2010-1-1")build() {Column(){// titileTitleComponent({title:"编辑个人信息",routerUrl:'',is_icon:true})// contentColumn({space:30}){Text("个人信息").titleTextStyle()InputComponent({title:'姓名',placeholder:'请输入您的姓名',isInputIcon:false})InputComponent({title:'联系电话',placeholder:'请输入你的手机号码',isInputIcon:false})Row({space:10}){InputComponent({title:'性别',placeholder:'2533',isInputIcon:false}).layoutWeight(1)InputDateComponent ({title:'出生日期',placeholder:'30-06-2024',isInputIcon:false}).layoutWeight(1)}Button("下一步").width(228).backgroundColor("#ff09b19d").margin({top:50})}.width("100%").height("100%").padding({left:20,right:20})}.width("100%").height("100%").backgroundImage($r("app.media.pageBg"))}
}
// 个人信息二维码生成页import TitleComponent from '../../components/TitleComponent';
import { randomColor } from '../../util/tools';@Entry
@Component
struct QrCodePage {@State message: string = 'Hello World';@State BgColor :string = "#ffc2f17d"build() {Column() {// titileTitleComponent({title:"",routerUrl:'',is_icon:true})QRCode("1").margin({top:40}).height(200).aspectRatio(1).backgroundColor(Color.Transparent)Blank()Row({space:20}){Text("换个样式").onClick(()=>{this.BgColor = randomColor()})Text("|")Text("保存图片")}.width("100%").justifyContent(FlexAlign.Center).margin({bottom:20})}.height('100%').backgroundColor(this.BgColor).width('100%')}
}
// 日期选择框
@Component
export  default struct InputDateComponent {@Prop title:string@Prop inputIcon:Resource@Prop placeholder:string@Prop  inputType:InputType=InputType.Normal@State changeStatus:boolean =false@Prop isInputIcon:boolean = trueselectedDate: Date = new Date()build() {Column(){Text(this.title).width("100%").textAlign(TextAlign.Start).fontWeight(500).fontSize(16).fontColor(Color.Black).margin({bottom:14})Row(){if (this.isInputIcon) {Image(this.inputIcon).width(40).aspectRatio(1)}TextInput({placeholder:this.placeholder}).onClick(()=>{DatePickerDialog.show({start: new Date("1970-1-1"),end: new Date("2100-12-31"),selected: this.selectedDate,showTime:true,useMilitaryTime:false,// disappearTextStyle: {color: Color.Pink, font: {size: '22fp', weight: FontWeight.Bold}},// textStyle: {color: '#ff00ff00', font: {size: '18fp', weight: FontWeight.Normal}},// selectedTextStyle: {color: '#ff182431', font: {size: '14fp', weight: FontWeight.Regular}},onDateAccept: (value: Date) => {// 通过Date的setFullYear方法设置按下确定按钮时的日期,这样当弹窗再次弹出时显示选中的是上一次确定的日期this.selectedDate = valueconsole.info("DatePickerDialog:onDateAccept()" + value.toString())},onCancel: () => {console.info("DatePickerDialog:onCancel()")},onDateChange: (value: Date) => {console.info("DatePickerDialog:onDateChange()" + value.toString())}})}).onFocus(()=>{// 聚焦this.changeStatus=trueconsole.log("result>>>",this.changeStatus)}).onBlur(()=>{// 失去this.changeStatus=falseconsole.log("result>>>",this.changeStatus)}).layoutWeight(1).backgroundColor(Color.Transparent).type(this.inputType)}.width("100%").height(50).padding({left:10,right:10}).borderRadius(10).border({width:2,color:this.changeStatus?"#002884":Color.White})}}
}
// 普通输入框
@Component
export  default struct InputComponent {@Prop title:string@Prop inputIcon:Resource@Prop placeholder:string@Prop  inputType:InputType=InputType.Normal@State changeStatus:boolean =false@Prop isInputIcon:boolean = truebuild() {Column(){Text(this.title).width("100%").textAlign(TextAlign.Start).fontWeight(500).fontSize(16).fontColor(Color.Black).margin({bottom:14})Row(){if (this.isInputIcon) {Image(this.inputIcon).width(40).aspectRatio(1)}TextInput({placeholder:this.placeholder}).onFocus(()=>{// 聚焦this.changeStatus=trueconsole.log("result>>>",this.changeStatus)}).onBlur(()=>{// 失去this.changeStatus=falseconsole.log("result>>>",this.changeStatus)}).layoutWeight(1).backgroundColor(Color.Transparent).type(this.inputType)}.width("100%").height(50).padding({left:10,right:10}).borderRadius(10).border({width:2,color:this.changeStatus?"#002884":"#ffcbcccd"})}}
}
// 随机颜色生成方法
// 十六进制的随机颜色
export  function randomColor():string{let color:string = "#"let colors:string[] = ["a","b", "c","d", "e","f","0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]for (let i = 0; i <8 ; i++) {color+=colors[Math.floor(Math.random()*15)]}return color
}

支付页面

  • 效果图

image.png

  • 结构
页面:PayPage
自定义弹框组件:PayCustomDialogExample
  • 代码
// 付款页import TitleComponent from '../../components/TitleComponent';
import PayCustomDialogExample from './PayCustomDialogExample';@Entry
@Component
struct PayPage {dialogController: CustomDialogController = new CustomDialogController({builder: PayCustomDialogExample(),alignment:DialogAlignment.Bottom,customStyle:true})onPageShow(): void {this.dialogController.open()}@State message: string = 'Hello World';build() {Column() {TitleComponent({title:"支付",is_icon:true})}.height('100%').width('100%').backgroundColor("#ff5f5d5d")}
}
// 付款弹框组件import InputComponent from '../../components/InputComponent'
@CustomDialog
export  default struct PayCustomDialogExample {controller: CustomDialogController = new CustomDialogController({builder: PayCustomDialogExample({}),})build() {Column() {Text("付款给").border({width:{bottom:1},color:'#ffe2e2e2'}).width("100%").lineHeight(20).textAlign(TextAlign.Center).padding({top:10,bottom:10}).fontWeight(500).fontColor("#ff044a6e")Stack({alignContent:Alignment.Top}){Column().width("100%").height(80).shadow({radius:60,color:"#ffcfcfcf"}).borderRadius(20).margin({top:50})Column({space:5}){Image($r("app.media.HOS")).height(50).borderRadius(10).aspectRatio(2).margin({top:20})Text("HarmonyOS APP应用开发").fontSize(14).fontWeight(700)Text("2024-06-30").fontSize(12).fontColor("#666")}}.width("100%").padding({right:50,left:50,bottom:20})Text("支付账户").fontWeight(700).fontSize(18).height(40).width("100%").padding({left:20})Row(){Column().width(50).backgroundColor("#0ff").height(30).margin(5).borderRadius(5)Column(){Text("中国银行储蓄卡").fontColor("#ff033048").fontSize(14).width("100%")Text("xxxxxx  xxxxx  xxxx ").fontColor("#999").fontSize(12).width("100%")}.layoutWeight(1)Image($r("app.media.right_icon")).width(20)}.height(40).margin({left:20,right:20}).shadow({radius:60,color:"#ffcfcfcf"}).borderRadius(10)Text("支付金额").fontWeight(700).fontSize(18).height(40).width("100%").padding({left:20}).margin({top:10,bottom:10})Text("¥155.55").fontWeight(700).fontSize(24).height(40)Column({space:10}){InputComponent({title:'用户订单姓名',placeholder:'输入你的名称'})InputComponent({title:'用户订单电话号码',placeholder:'输入您的电话号码'})}.width("100%").padding({left:20,right:20})Button("下一步").width(228).backgroundColor("#ff09b19d").margin({top:50})}.height("100%").width("100%").margin({top:80}).borderRadius({topLeft:20,topRight:20}).backgroundColor(Color.White)}
}

day02 项目结构基本搭建完成,静态页面基本编写完成


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

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

相关文章

【Sping Boot2】笔记

Spring Boot 2入门 如何创建一个Spring Boot的Web例子&#xff1f;1.如何创建一个Spring Boot项目1.1 使用Maven构建一个Spring Boot 2项目1.1.1创建Maven工程注&#xff1a;Maven项目结构&#xff1a; 1.1.2引入SpingBoot相关依赖依赖注意事项&#xff1a; 1.1.3创建主类1.1.4…

VIM介绍

VIM&#xff08;Vi IMproved&#xff09;是一种高度可配置的文本编辑器&#xff0c;用于有效地创建和更改任何类型的文本。它是从 vi 编辑器发展而来的&#xff0c;后者最初是 UNIX 系统上的一个文本编辑器。VIM 以其键盘驱动的界面和强大的文本处理能力而闻名&#xff0c;是许…

Python学习之小游戏--坦克大作战

今天跟视频学习了Python实现坦克大作战小游戏&#xff0c;挺有意思的&#xff0c;一起来玩吧~ 按空格发射子弹&#xff0c;上下左右键实现移动&#xff0c;ESC键无限复活。 import pygame,time,random from pygame.sprite import Sprite SCREEN_WIDTH800 SCREEN_HEIGHT500 BG…

Vue3中为Ant Design Vue中Modal.confirm自定义内容

在一次业务开发时代码时&#xff0c;碰到了一种既想要Modal.confirm样式&#xff0c;又想要定制其content内容的情况。 大部分情况下&#xff0c;使用Modal.method()这种方式时&#xff0c;可能content内容固定都是字符串&#xff0c;那如果想要做更高级的交互怎么办&#xff…

【Git-驯化】一文学会git配置用户信息,git config用法细节

【Git-驯化】一文学会git配置用户信息&#xff0c;git config用法细节 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档…

Sourcecodester Fantastic Blog CMS v1.0 SQL 注入漏洞(CVE-2022-28512)

前言 CVE-2022-28512 是一个存在于 Sourcecodester Fantastic Blog CMS v1.0 中的 SQL 注入漏洞。攻击者可以通过 "/fantasticblog/single.php" 中的 id 参数注入恶意 SQL 查询&#xff0c;从而获得对数据库的未经授权的访问和控制。 漏洞详细信息 漏洞描述: 该漏…

工具发送formdata请求 Multipartfile 接收

1.需求&#xff1a; 接收到 (Multipartfile file 文件 》使用工具转发到别的请求&#xff0c;将文件传到别的接口 主要代码&#xff1a; InputStreamResource inputstreamResource new InputstreamResource(file.getInputstream(), file.getoriginalfilename());MultiReso…

全网都在疯传的最新蓝海风口项目!

最近全网都在疯传这种视频&#xff0c;想必兄弟们都见到过了&#xff01; 大家看这个号&#xff0c;1天的时间&#xff0c;2个作品&#xff0c;第2个直接就爆了&#xff0c;昨天看点赞还是3.8w&#xff0c;今天已经10w了&#xff0c;这是妥妥的风口啊&#xff01; 大家有没有想…

应用在灯带Type-C接口上的PD SINK协议芯片ECP5701/ECP5702获取充电器的5V、9V、12V、15V、20V供电

方案背景 近日&#xff0c;欧盟就统一充电器接口的提案达成了一项政治协议&#xff0c;其中规定了在欧盟地区销售的所有手机或其他便携式中小型电子设备必须采用统一的USB Type-C接口。这项决定意味着未来将会有更多的产品强制性地使用TYPE-C充电接口。 在这个背景下&#xf…

wordpress 付费主题modown分享,可实现资源付费

该主题下载地址 下载地址 简介 Modown是基于Erphpdown 会员下载插件开发的付费下载资源、付费下载源码、收费附件下载、付费阅读查看隐藏内容、团购下载的WordPress主题&#xff0c;一款针对收费付费下载资源/付费查看内容/付费阅读/付费视频/VIP会员免费下载查看/虚拟资源售…

在Linux上查找文件的2个好用的命令

1. locate xx &#xff08;查找带xx字符的所有文件或目录&#xff09; 在终端输入命令 locate lua&#xff0c;可以看到&#xff0c;所有带lua字符的文件或目录都会被搜索出来。 2. find / -name xx &#xff08;查找名为xx的文件或目录&#xff09; 在终端输入命令 find …

SpringBoot集成beetl模板快速入门

在pom文件引入maven依赖 <dependency><groupId>com.ibeetl</groupId><artifactId>beetl-framework-starter</artifactId><version>1.1.81.RELEASE</version></dependency>写一个controller /*** author * create * descripti…

SecureCRT--使用sftp上传和下载文件

原文网址&#xff1a;SecureCRT--使用sftp上传和下载文件_IT利刃出鞘的博客-CSDN博客 简介 本文介绍SecureCRT如何在软件内直接上传和下载文件。 SecureCRT可以用如下两种方法上传和下载文件&#xff1a; 自带的sftp插件服务器安装rz/sz命令 本文介绍第一种方法&#xff0…

【Android面试八股文】Android性能优化面试题:怎样检测函数执行是否卡顿?

文章目录 卡顿一、可重现的卡顿二、不可重现的卡顿第一种方案: 基于 Looper 的监控方法第二种方案:基于 Choreographer 的监控方法第三种方案:字节码插桩方式第四种方案: 使用 JVMTI 监听函数进入与退出总结相关大厂的方案ArgusAPMBlockCanaryQQ空间卡慢组件Matrix微信广研参…

vue目录说明

vue目录说明 主要目录说明 .vscode - - -vscode工具的配置文件夹 node_modules - - - vue项目的运行依赖文件夹 public - - -资源文件夹&#xff08;浏览器图标&#xff09; src- - -源码文件夹 .gitignore - - -git忽略文件 index.html - - -入口html文件 package.json - - -…

系统架构设计师教程(清华第2版)<第1章 绪论>解读

系统架构设计师教程 第一章 绪论 1.1 系统架构概述1.1.1 系统架构的定义及发展历程1.1.2 软件架构的常用分类及建模方法1.1.3 软件架构的应用场景1.1.4 软件架构的发展未来1.2 系统架构设计师概述1.2.1 架构设计师的定义、职责和任务1.2.2 架构设计师应具备的专业素质1.3 如何成…

上份工作不干了24年5月-6月回顾(面试+软考)需要资料的小伙伴可以关注下

前言&#xff1a; 博主在5月和6月基本没有对博客内容进行更新了&#xff0c;不是博主偷懒&#xff0c;5月份博主在全力准备24年系统分析师的软考&#xff0c;6月份在准备面试&#xff0c;现在对5月和6月进行回顾&#xff1b; 先说下软考系统分析师&#xff1a; 博主实在今年3月…

记录OSPF配置,建立邻居失败的过程

1.配置完ospf后&#xff0c;在路由表中不出现ospf相关信息 [SW2]ospf [SW2-ospf-1]are [SW2-ospf-1]area 0 [SW2-ospf-1-area-0.0.0.0]net [SW2-ospf-1-area-0.0.0.0]network 0.0.0.0 Jul 4 2024 22:11:58-08:00 SW2 DS/4/DATASYNC_CFGCHANGE:OID 1.3.6.1.4.1.2011.5.25 .1…

arm_uart4实验

#include "uart4.h" //UART //初始化 void hal_uart4_init() { //rcc_init //…

前端Debugger时复制的JS对象字符转JSON对象

前端debugger时&#xff0c;复制的对象在控制台输出时是如下格式&#xff0c;需要转换为对象格式来进行验证操作 bridgeId : 4118 createBy : null createTime : "2023-03-24 10:35:26" createUserId : 1 具体实现代码&#xff1a; // 转换transform (text) {l…