纯血鸿蒙开发实战—如何开发出一个鸿蒙购物应用!

HarmonyOS 支持应用以 Ability 为单位进行部署,Ability 可以分为 FA(Feature Ability)和 PA(Particle Ability)两种类型。

本篇 Codelab 将会使用 UI 组件开发出一个 HarmonyOS 购物应用。

HarmonyOS 为开发者提供了多种组件,每个组件通过对数据和方法的简单封装,实现独立的可视、可交互功能单元。开发者只需要关注实现逻辑,减少开发量。

01最终效果预览

我们最终会构建一个简易的购物应用。应用包含两级页面,分别是主页(商品浏览页签、购物车页签、我的页签)和商品详情页面。

两个页面都展示了丰富的 HarmonyOS UI 组件,包括:

  • 自定义弹窗容器(dialog)

  • 列表(list)

  • 滑动容器(swiper)

  • 页签组件(tabs)

  • 按钮组件(button)

  • 图表组件(chart)

  • 分隔器组件(divider)

  • 图片组件(image)

  • 交互式组件(input)

  • 跑马灯组件(marquee)

  • 菜单组件(menu)

  • 滑动选择器组件(picker)

  • 进度条组件(progress)

  • 评分条组件(rating)

  • 搜索框组件(search)

商品浏览页面和商品详情页面如下图:

02搭建 HarmonyOS 环境

步骤如下:

  • 安装 DevEco Studio 和 Node.js,详情请参考下载和安装软件。

  • 设置 DevEco Studio 开发环境,DevEco Studio 开发环境需要依赖于网络环境,需要连接上网络才能确保工具的正常使用。

可以根据如下两种情况来配置开发环境:

  • 如果可以直接访问 Internet,只需进行下载 HarmonyOS SDK 操作。

  • 如果网络不能直接访问 Internet,需要通过代理服务器才可以访问,请参考配置开发环境。

参考链接:

下载与安装软件:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/software_install-0000001053582415配置开发环境:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/environment_config-0000001052902427

说明:如需要在手机中运行程序,则需要提前申请证书,如使用模拟器可忽略。

准备密钥和证书请求文件:

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404

申请调试证书:

https://developer.huawei.com/consumer/cn/doc/distribution/app/agc-harmonyapp-debugharmonyapp

你可以通过如下两种方式完成本篇 Codelab:

  • 开启开发者模式的 HarmonyOS 真机。

  • DevEco Studio 中的手机模拟器(模拟器暂不支持分布式调试)。

03代码结构解读

本篇 Codelab 只对核心代码进行讲解,对于完整代码,我们会在 7 参考中提供下载方式。

接下来我们会用一小节来讲解整个工程的代码结构:

  • entry/src/main/js/default/common 文件夹存放一些公共的资源,比如图片。

  • entry/src/main/js/default/pages 文件夹存放 HarmonyOS JS 的页面,包含 css、hml、js 三类文件。

  • entry/src/main/config.json:配置文件。

04页面详细解析

接下来,我们就可以编写 css、hml、js 代码了。搜索框组件(search):用于提供用户搜索内容的输入区域,图片示例和代码如下:

<search hint="{{pageWord.searchKeyWord}}" value="{{pageWord.searchValue}}" focusable="true" @change="searchColumn" @submit="submitColumn"></search>

页面展示:

图片

tab页签容器(tabs),图片示例和代码如下:

  • <tabs>的子组件(tab-bar):用来展示 tab 的标签区。

  • <tabs>的子组件(tab-content):用来展示 tab 的内容区。

注:用户可通过左右滑动或点击不同 tab 标签区,来显示不同 tab 标签区的内容区。

<tabs class="tabs" index="0" vertical="false" onchange="change"> <tab-bar class="tab-bar" mode="fixed"> <text class="tab-text" for="{{ item in titileList}}">{{ item }} </text> </tab-bar> <tab-content class="tabcontent" scrollable="true"> <div class="item-content" for="{{ item in contentList}}"> <list class="todo-wraper"> <list-item for="{{lists}}"> <div class="margin10" @click="detailPage"> <div class="todo-total"> <text class="todo-title">{{$item.title}}</text> <text class="todo-content">{{$item.content}}</text> <text class="todo-price"> <span>¥</span> <span>{{$item.price}}</span> </text> </div> <div class="width30"> <image src="{{$item.imgSrc}}" class="container-home-image"></image> </div> </div> </list-item> </list> </div> </tab-content> 
</tabs>

不同标签页图标切换(点击应用的正下面的不同标签,页面会随之切换,被选中的页面图片变红),图片示例和代码如下:

<div class="container-bottom-div" @click="buy" @click="clickBuy"> <image src="{{icon.buys}}" class="container-bottom-div-image" @click="clickBuy"></image> <image src="{{icon.shoppingCarts}}" class="container-bottom-div-image" @click="clickShoppingCart"></image> <image src="{{icon.mys}}" class="container-bottom-div-image" @click="clickMy"></image> 
</div>

购物车页面:用户可以把选中的商品加入购物车,然后可以选中想要拍下的商品,进行结算,图片示例和代码如下:

<div class="top-comm flex-direction-column"> <div for="{{ latestList }}" class="flex-direction-column"> <div class="container-shopping-list"> <input type="checkbox" value="{{$item.price}}" @change="addShopping"></input> <image src="{{$item.imgSrc}}" class="container-shopping-list-image"></image> <div class="container-shopping-list-div"> <text class="container-shopping-list-div-text">{{$item.title}}</text> <text class="container-shopping-list-div-texts"> <span>{{$item.price}}</span><span>元</span> </text> </div> </div> <divider class="container-shopping-list-divider"></divider> </div> 
</div>

我的页面布局,图片示例和代码如下:

<div class="container-my-deals"> <text class="container-my-deals-text">{{pageWord.myDeals}}</text> <div class="container-my-deals-div"> <div class="container-my-deals-div-div" for="{{transaction}}"> <image src="{{$item.src}}" class="container-my-image"></image> <text class="container-my-text">{{$item.title}}{{$item.num}}</text> </div> </div> 
</div>

页面路由跳转:用户点击商品浏览页面的任意商品,页面会跳转到商品详情页面,图片示例和代码如下:

detailPage() { router.push({ uri: "pages/shoppingDetailsPage/shoppingDetailsPage" }) 
},

滑动容器(swiper):用户可以在 swiper 组件上进行滑动 左右切换图片,或者 3s 自动滑动一次,图片示例和代码如下:

<swiper class="swiper" id="swiper" index="0" autoplay="true" interval="3000" indicator="true" loop="true" digital="false"> <div class="swiperContent" for="{{ item in swiperList }}"> <image src="/common/computer/computer{{item}}.png"></image> </div> 
</swiper>

跑马灯组件(marquee):展示一段单行滚动的文字,图片示例和代码如下:

图片

图片

图片

<marquee id="customMarquee" class="customMarquee" scrollamount="{{scrollAmount}}" loop="{{loop}}" direction="{{marqueeDir}}" @bounce="onMarqueeBounce" @start="onMarqueeStart" @finish="onMarqueeFinish">         {{pageInfo.marqueeCustomData}} 
</marquee>
对样式进行动态双向绑定,可以修改"次日达"字体的颜色 ,图片示例和代码如下:

图片

图片

图片

<text class="content-column-size-mar" style="color : {{textColor}};" @click="changeColor">{{pageInfo.nextDayReach}}</text> export default { data: { textColor: '#FF3536', } 
}

省市级联选择器和日期选择器以及 dialog 自定义弹窗容器的实现,图片示例和代码如下。

点击选择会弹出 Dialog,页面会有时间选择器和省市级联选择器。用户在弹出的时间选择器上选择日期,点击确定,页面上的数据也会同时改变。省市级联选择器,同理。

<div class="dialog-div-select"> <div> <text class="dialog-div-select-text">{{pageInfo.selectRewardTime}}</text> <div class="dialog-div-select-picker"> <picker type="date" selected="{{ newDate }}" hours="24" value="{{ newDate }}" @change="changeDate" @cancel="cancelDate"></picker> </div> </div> <div> <text class="dialog-div-select-text">{{pageInfo.selectRewardCity}}</text> <div class="dialog-div-select-picker"> <picker type="multi-text" @columnchange="columnTextData" columns="3" range="{{cityList}}" value="{{selectCityList}}" @change="changeCity"></picker> </div> </div> 
</div>

评分弹框(rating),图片示例和代码如下:点击评分,会弹出带有评分弹框的 dialog 弹窗容器

<dialog id="ratingDialog" class="dialog-main" @cancel="cancelrRatingDialog"> <div class="dialog-div"> <div class="dialog-div-rating"> <text class="font-size22 font-weight600">{{pageInfo.softwareScore}}</text> <rating numstars="5" rating="{{ratingNum}}" @change="ratingChange"></rating> <text class="font-size22 font-weight600">{{pageInfo.ratingReason}}</text> <input type="text" placeholder="{{pageInfo.ratingPlaceholder}}" value="{{ratingReason}}" @change="ratingReasonChange"></input> <div class="dialog-divs-divider-div"> <text class="font-size22 color-deepskyblue" @click="confirmRatingInfo">{{pageInfo.confirm}}</text> <divider vertical="true" class="dialog-divider"></divider> <text class="font-size22 color-deepskyblue" @click="cancelrRatingDialog">{{pageInfo.cancel}}</text> </div> </div> </div> 
</dialog>

浏览量页面:chart 组件(曲线图可以实时动态更新数据),图片示例和代码如下: 

<stack class="chart-region"> <image class="chart-background" src="common/background.png"></image> <chart class="chart-data" type="line" ref="linechart" options="{{lineOps}}" datasets="{{lineData}}"></chart> 
</stack>

点击立即抢购会弹出一个含有进度条(progress)的弹框 ,图片示例和代码如下:

<progress class="min-progress" type="scale-ring" percent="{{progress.percent}}" secondarypercent="{{progress.secondarypercent}}"></progress>

说明:以上所以代码仅 demo 演示参考使用。

05回顾和总结

本篇 Codelab 我们介绍了应用的主页面和详情页,两个页面都展示了丰富的 HarmonyOS UI 组件如下图:

另外,我们还把常用的一些组件运用到到该应用里面,比如:

  • 常用的 chart 图表组件:用曲线动态展示不同时间段的浏览量。

  • rating 评分条组件:运用到给软件/该商品打分评价。

  • 选择器:省市级类选择器、时间选择器。

图片示例如下:

06恭喜你

目前你已经成功完成了 Codelab 并且学到了:

  • 如何使用 HarmonyOS UI 常用组件。

  • 如何实现各页面之间的跳转。

最后

如果你想成为一名鸿蒙开发者,以下这些资料将是十分优质且有价值,让你的鸿蒙开发之路事半功倍!相对于网上那些碎片化的知识内容,这份学习资料的知识点更加系统化,更容易理解和记忆。

内容包含了:【OpenHarmony多媒体技术、Stage模型、ArkUI多端部署、分布式应用开发、音频、视频、WebGL、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战】等技术知识点。

鸿蒙Next全套VIP学习资料←点击领取!(安全链接,放心点击

1.鸿蒙核心技术学习路线

2.大厂面试必问面试题

3.鸿蒙南向开发技术

 4.鸿蒙APP开发必备

 5.HarmonyOS Next 最新全套视频教程

 6.鸿蒙生态应用开发白皮书V2.0PDF

这份全套完整版的学习资料已经全部打包好,朋友们如果需要可以点击→鸿蒙Next全套VIP学习资料:免费领取(安全链接,放心点击

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

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

相关文章

TikTok广告投放攻略——广告类型详解

TikTok广告是品牌或创作者付费向特定目标受众展示的推广内容&#xff08;通常是全屏视频&#xff09;。TikTok 上的广告是一种社交媒体营销形式&#xff0c;通常旨在提高广告商的知名度或销售特定产品或服务。 就 TikTok广告投放而言&#xff0c;其组织层级分为三个层级&#x…

行心科技与研草堂携手,共绘医康养新生态的食疗养生蓝图

在健康产业蓬勃发展的当下&#xff0c;广州市行心信息科技有限公司&#xff08;以下简称“行心科技”&#xff09;与研草堂携手合作&#xff0c;共同亮相于2024年第34届健博会暨中国大健康产业文化节。现场&#xff0c;行心科技董事长林泳强、顾问王志文老师与研草堂的厂商齐聚…

@EnableResourceServer资源服务注解源码分析

文章目录 学习参考EnableResourceServer概要ResourceServerConfiguration属性定义configure(HttpSecurity)ResourceServerSecurityConfigurerinit(HttpSecurit)configure(HttpSecurity) 学习参考 Spring Security框架配置运行流程完整分析 - 【必看】 Security OAuth2 授权 &…

vue3之拆若依--记实现后台管理首页(左侧菜单栏、头部信息区域...)

效果图 前期准备 启动若依在本地 启动若依后台,跑在自己本地: 这里对于如何下载若依相关的前后端代码请参考若依官网:RuoYi 若依官方网站 |后台管理系统|权限管理系统|快速开发框架|企业管理系统|开源框架|微服务框架|前后端分离框架|开源后台系统|RuoYi|RuoYi-Vue|RuoYi-…

【Java毕业设计】基于JavaWeb的在线购物网站的设计与实现

文章目录 摘 要ABSTRACT目 录1 概述1.1 研究背景及意义1.2 国内外研究现状1.3 拟研究内容1.4 系统开发技术1.4.1 vue技术1.4.2 B/S结构1.4.3 Spring Boot框架1.4.4 MySQL数据库1.4.5 MVC模式 2 系统需求分析2.1 可行性分析2.2 功能需求分析 3 系统设计3.1 功能结构设计3.2 系统…

Python数据框操作 -- DataFrame列名和索引设置

先创建一个数据框&#xff1a; import pandas as pd df pd.DataFrame({a:[1,1,2,3,4], b:[5,6,7,8,8]}) 重新设置数据框的列名&#xff0c;使数据框的列名为“A”和“B”&#xff1a; df.columns [A,B] 设置A列为数据框的索引&#xff1a; df1 df.set_index(A, drop …

怎么用PHP语言实现远程控制两路照明开关

怎么用PHP语言实现远程控制两路开关呢&#xff1f; 本文描述了使用PHP语言调用HTTP接口&#xff0c;实现控制两路开关&#xff0c;两路开关可控制两路照明、排风扇等电器。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备名称厂商1智能WiFi墙…

git clone 文件名中文、有冒号等问题 fatal: repository ‘***/r/鏍″洯鏅烘収椋熷爞/.git/‘ not found

记录一个git问题&#xff0c;比较有意思&#xff0c;也比较难找。 背景 首先把代码拉下来&#xff0c;发现给我报错。 怀疑 刚开始以为是仓库地址变了&#xff0c;但是发现仓库地址并没有变过。 交流 然后寻找解决方案。因为同事也遇到过&#xff0c;同事交了我一招&…

【西瓜书】2.模型评估与选择

1.经验误差与过拟合 &#xff08;1&#xff09;错误率、精度 &#xff08;2&#xff09;误差&#xff1a;训练误差/经验误差、泛化误差 &#xff08;3&#xff09;过拟合、欠拟合 欠拟合好克服&#xff0c;过拟合无法彻底避免 2.三大任务——评估方法 泛化误差的评估方法&a…

永久域名存在吗?

在互联网的世界里&#xff0c;域名是企业与个人在线身份的重要标识&#xff0c;它不仅关系到品牌形象&#xff0c;还可能影响搜索引擎优化(SEO)和用户体验。因此&#xff0c;拥有一个“永久”域名&#xff0c;即一个长期稳定、不受时间限制的域名&#xff0c;是许多网站所有者的…

STM32F103VE和STM32F407VE的引脚布局

STM32F103VE vs STM32F407VE 引脚对比表 引脚 STM32F103VE STM32F407VE 备注 1 VSS VSS 地 2 VDD VDD 电源 3 VSSA VSSA 模拟地 4 VDDA VDDA 模拟电源 5 OSC_IN OSC_IN 外部时钟输入 6 OSC_OUT OSC_OUT 外部时钟输出 7 NRST NRST 复位 8 PC13 (GPIO) PC13 (GPIO) GPIO 9 PC14 (…

SD6410高效同步降压DC-DC稳压器集成电路可输出1.5输入电压

SD6410是高效、高频同步降压DC-DC稳压 器集成电路&#xff0c;可输出高达1.5A的输出电流。 SD6410可在2.3V至5.5V的宽输入电压范围 内工作&#xff0c;并集成了具有极低RDS(ON)的 主开关和同步开关&#xff0c;以最大限度地减少导通 损耗 它是为单节锂离子(Li)电池供电的便携式…

ffmpeg视频编码原理和实战-(5)对编码过程进行封装并解决丢帧问题

头文件&#xff1a; xencode.h #pragma once #include <mutex> #include<vector> struct AVCodecContext; struct AVPacket; struct AVFrame; class XEncode { public:///// 创建编码上下文/// para codec_id 编码器ID号&#xff0c;对应ffmpeg/// return 编码上…

如何永久擦除Android手机中的所有个人数据?

在这个数字化的时代&#xff0c;确保您的个人数据的安全和隐私至关重要。如果您计划出售或回收您的Android手机&#xff0c;了解如何正确擦除Android手机是至关重要的。本综合指南将引导您通过安全擦除Android手机的分步过程&#xff0c;以保护您的敏感信息。 手机是极其敏感的…

vllm lora、gptq、awq推理使用

1)lora推理 docker run --gpus all -v /ai/Qwen1.5-7B-Chat:/qwen-7b -v /ai/lora:/lora -p 10860:10860 --ipc

反转链表的三种方法--面试必考(图例超详细解析,小白一看就会!!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐ 头插法 --- 创建新的链表 ⭐ 迭代法 --- 三指针 ⭐ 递归法 四、总结与提炼 五、共勉 一、前言 反转链表这道题&#xff0c;可以说是--链表专题--&#xff0c;最经典的一道题&#xff0c;也是在面试中频率最高的一道题目&…

编译 TMS320F2838x 项目

编译 tms320f28388 项目&#xff0c;并生成 hex 文件 介绍 C2000Ware 目录 archive 架构 boards 基于官方开发板的例子 device_support 官方驱动&#xff0c;建立工程重点要用到的东西&#xff08;基于寄存器变量访问&#xff09; docs 说明文档 driverlib 官方的驱动…

找好看的简历模板,就上这6个网站。

找好看的简历模板就上这6个网站&#xff0c;免费下载&#xff01; 1、菜鸟图库 个人简历模板|WORD文档模板免费下载 - 菜鸟图库 站内有超多办公类素材&#xff0c;PPT、world、excel模板都能找到&#xff0c;简历模板有非常详细的分类&#xff0c;风格类型也很多&#xff0c;想…

数据库MongoDB详解

文章目录 入门指南1. 安装 MongoDB2. 启动 MongoDB 服务3. 连接到 MongoDB4. 创建数据库和集合5. CRUD 操作6. 索引7. 备份与恢复 不同场景下的应用方式&#xff1a;应用案例展示 入门指南 MongoDB 是一个基于分布式文件存储的非关系型数据库&#xff08;NoSQL&#xff09;&am…

七天进阶elasticsearch[Three]

排序与分页 localhost:9200/book/_search get请求{"query":{"match_all": {}},"sort": [{"price": {"order": "desc"}}], "from":0,"size":3}简化body {"query": {"bool&qu…