鸿蒙HarmonyOS项目实战开发:分布式购物车_harmonyos简单的购物应用示例

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新HarmonyOS鸿蒙全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img

img
img
htt

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注鸿蒙)
img

正文

│ │ DetailPage.ets // 商品详情页面
│ │ HomePage.ets // 应用首页
│ │ MyPage.ets // 我的页面
│ │ ShoppingCartListPage.ets // 购物车列表页面
│ └─resources // 静态资源目录
│ ├─base
│ │ ├─element
│ │ ├─graphic
│ │ ├─layout
│ │ ├─media // 存放媒体资源
│ │ └─profile
│ └─rawfile

开发步骤
1. 新建OpenHarmony ETS项目

在DevEco Studio中点击File -> New Project ->[Standard]Empty Ability->Next,Language 选择ETS语言,最后点击Finish即创建成功。

image-20211124092813545

2. 编写商品展示主页面

image-20211124093106260

效果图如上可以分为两部分

2.1商品列表展示

1)首先在@entry组件入口build()中使用Tabs作为容器,达到排行榜和推荐翻页的效果;

2)再通过List包裹Row布局依次写入Column包裹的三个Text组件和Image组件;

3)并通过Navigator组件实现点击商品跳转到商品详细页功能,页面跳转过程使用pageTransition转场动画

Tabs() {
TabContent() {
GoodsList({ goodsItems: this.goodsItems});
}
.tabBar(“畅销榜”)
.backgroundColor(Color.White)

TabContent() {
GoodsList({ goodsItems: this.goodsItems});
}
.tabBar(“推荐”)
.backgroundColor(Color.White)
}
Navigator({ target: ‘pages/DetailPage’ }) {
Row({ space: ‘40lpx’ }) {
Column() {
Text(this.goodsItem.title)
.fontSize(‘28lpx’)
Text(this.goodsItem.content)
.fontSize(‘20lpx’)
Text(‘¥’ + this.goodsItem.price)
.fontSize(‘28lpx’)
.fontColor(Color.Red)
}
.height(‘160lpx’)
.width(‘50%’)
.margin({ left: ‘20lpx’ })
.alignItems(HorizontalAlign.Start)

Image(this.goodsItem.imgSrc)
.objectFit(ImageFit.ScaleDown)
.height(‘160lpx’)
.width(‘40%’)
.renderMode(ImageRenderMode.Original)
.margin({ right: ‘20lpx’, left: ‘20lpx’ })

}
.height(‘180lpx’)
.alignItems(VerticalAlign.Center)
.backgroundColor(Color.White)
}
.params({ goodsItem: this.goodsItem ,ShoppingCartsGoods:this.ShoppingCartsGoods})
.margin({ left: ‘40lpx’ })
}
// 转场动画使用系统提供的多种默认效果(平移、缩放、透明度等)
pageTransition() {
PageTransitionEnter({ duration: 1000 })
.slide(SlideEffect.Left)
PageTransitionExit({ duration: 1000 })
.slide(SlideEffect.Right)
}

2.2底部导航栏

1)通过Row包裹三个Image组件,并添加onClick点击事件,修改@Consume修饰的变量,从而改变@Provide装饰的变量,再通过条件渲染展示不同的页面内容;

Flex() {
Image(this.iconPath[0])
.objectFit(ImageFit.Cover)
.height(‘60lpx’)
.width(‘60lpx’)
.margin({left:‘50lpx’,right:‘40lpx’})
.onClick(() => {
this.iconPath[0] = this.iconPathSelectsTmp[0]
this.iconPath[1] = this.iconPathTmp[1]
this.iconPath[2] = this.iconPathTmp[2]
this.currentPage = 1
})
Image(this.iconPath[1])
.objectFit(ImageFit.Cover)
.height(‘60lpx’)
.width(‘60lpx’)
.margin({left:‘40lpx’,right:‘40lpx’})
.onClick(() => {
this.iconPath[0] = this.iconPathTmp[0]
this.iconPath[1] = this.iconPathSelectsTmp[1]
this.iconPath[2] = this.iconPathTmp[2]
this.currentPage = 2
this.remoteData.putData(“shopping_cart”, this.ShoppingCartsGoods)
})
Image(this.iconPath[2])
.objectFit(ImageFit.Cover)
.height(‘60lpx’)
.width(‘60lpx’)
.margin({left:‘40lpx’,right:‘50lpx’})
.onClick(() => {
this.iconPath[0] = this.iconPathTmp[0]
this.iconPath[1] = this.iconPathTmp[1]
this.iconPath[2] = this.iconPathSelectsTmp[2]
this.currentPage = 3
})
}
.margin({top:‘20lpx’})
}

Column() {
if (this.currentPage == 1) {
Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.End }) {
Image($r(“app.media.icon_share”))
.objectFit(ImageFit.Cover)
.height(‘60lpx’)
.width(‘60lpx’)
}
.width(“100%”)
.margin({ top: ‘20lpx’, right: ‘50lpx’ })
.onClick(() => {
this.playerDialog.open()
})

GoodsHome({ goodsItems: this.goodsItems})
}
else if (this.currentPage == 3) {
//我的
MyInfo()
}
}

3. 编写商品详细页面
3.1顶部滑动组件

1)滑动容器,提供切换子组件显示的能力;

Swiper() {
ForEach(this.detailImages, item => {
Image(item)
.height(‘400lpx’)
.width(‘100%’)
})
}
.index(0)
.autoPlay(true)
.interval(3000)
.indicator(true)
.loop(true)
.height(‘440lpx’)
.width(‘100%’)

3.2 自定义弹框

1)通过**@CustomDialog**装饰器来创建自定义弹窗,使用方式可参考 自定义弹窗

2)规则弹窗效果如下,弹窗组成由两个Text和两个Button竖向排列组成;

所有我们可以在build()下使用Flex容器来包裹,组件代码如下:

@CustomDialog
struct CustomDialogExample {
controller: CustomDialogController
cancel: () => void
confirm: () => void
ShoppingCartsGoods: any[]

build() {
Flex() {
Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) {
Text(‘加入购物车成功’)
.fontColor(“#000000”)
.fontSize(‘40lpx’)
.margin({ top: ‘20lpx’, bottom: “20lpx” })

Flex({ justifyContent: FlexAlign.SpaceAround }) {
Button(‘取消’)
.onClick(() => {
this.controller.close()
this.cancel()
}).backgroundColor(0xffffff).fontColor(Color.Black)
Button(‘确定’)
.onClick(() => {
this.controller.close()
this.confirm()
}).backgroundColor(0xffffff).fontColor(Color.Red)
}.margin({ bottom: “20lpx” })
}
}
.height(‘200lpx’)
}
}

3)在@entry创建CustomDialogController对象并传入弹窗所需参数,后面可通过该对象open()和close()方法进行打开和关闭弹窗;

dialogController: CustomDialogController = new CustomDialogController({
builder: CustomDialogExample({
cancel: this.onCancel,
confirm: this.onAccept,
ShoppingCartsGoods: this.ShoppingCartsGoods
}),
cancel: this.existApp,
autoCancel: true
})
onCancel() {
CommonLog.info(‘Callback when the first button is clicked’)
}

onAccept() {
CommonLog.info(‘Callback when the second button is clicked’)
router.push({
uri: “pages/HomePage”,
params: { dataList: this.ShoppingCartsGoods }
})
}

existApp() {
CommonLog.info(‘Click the callback in the blank area’)
}

4. 添加分布式流转

分布式流转需要在同一网络下通过 DeviceManager组件 进行设备间发现和认证,获取到可信设备的deviceId调用 featureAbility.startAbility ,即可把应用程序流转到另一设备。

1)创建DeviceManager实例;

2)调用实例的startDeviceDiscovery(),开始设备发现未信任设备;

3)设置设备状态监听on(‘deviceFound’,callback),获取到未信任设备,并用discoverList变量进行维护;

4)传入未信任设备参数,调用实例authenticateDevice方法,对设备进行PIN码认证;

5)若是已信任设备,可通过实例的getTrustedDeviceListSync()方法来获取设备信息;

6)将设备信息中的deviceId传入featureAbility.startAbility方法,实现流转;

7)流转接收方可通过featureAbility.getWant()获取到发送方携带的数据;

项目中将上面设备管理封装至RemoteDeviceManager,通过RemoteDeviceManager的四个方法来动态维护deviceList设备信息列表,实现分布式流转只需要在deviceList中获取deviceId,然后调用featureAbility.startAbility并携带数据,即可实现分布式流转。

RemoteDeviceManager

5.分布式数据管理

分布式数据管理要求两个或多个设备在同一网络,才能监听到数据库的改变,从而渲染页面;开发步骤:

1)创建一个KVManager对象实例,用于管理数据库对象;

2)通过指定Options和storeId,创建并获取KVStore数据库,如下是参数说明;需要先通过createKVManager构建一个KVManager实例;

参数名类型必填说明
storeIdstring数据库唯一标识符,长度不大于MAX_STORE_ID_LENGTH
optionsOptions创建KVStore实例的配置信息。

3)KVStore数据库实例, KVStore.put提供增加数据的方法,如下是参数说明;

参数名类型必填说明
keystring要添加数据的key,不能为空且长度不大于MAX_KEY_LENGTH
valueUint8Arraystringnumber
callbackAsyncCallback回调函数。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

、 string 、boolean,Uint8Array、string 的长度不大于MAX_VALUE_LENGTH。 |
| callback | AsyncCallback | 是 | 回调函数。 |

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)
[外链图片转存中…(img-CfJQJFY7-1713446583350)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 17
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
HarmonyOS是华为公司推出的一款全场景分布式操作系统。分布式是指将多个计算设备、传感器和终端设备连接起来,通过协同工作实现更高效、便捷和智能的功能。HarmonyOS通过分布式能力整合了华为的多种设备和服务,可以在不同硬件设备之间实现互联互通,提供统一的用户体验。 首先,HarmonyOS具备分布式架构,可以将不同设备连接起来无缝协同工作。用户只需通过一台设备,就可管理和操作其他设备,实现多屏互动和内容共享。例如,用户可通过智能手机控制家中的电视、空调和摄像头等设备,实现智能家居的便捷控制。 其次,HarmonyOS拥有分布式数据管理能力。不同设备产生的数据可以在云端进行存储、分析和加工,并通过智能算法实现数据的共享和优化。例如,智能手表可以同步用户的运动数据到云端,再通过智能手机或电视展示和分析运动成果。 再者,HarmonyOS还具备分布式安全和隐私保护能力。在设备之间进行数据传输时,HarmonyOS采用了多重加密和认证技术,确保数据的安全性和完整性。同时,用户的隐私也得到充分尊重和保护,不会因为设备的连接而泄露个人信息。 最后,HarmonyOS提供了开放的分布式开发工具,使开发者能够更方便地开发分布式应用开发者可以利用HarmonyOS提供的API和框架,快速构建出支持不同设备之间的数据交互和功能共享的应用程序。 总之,HarmonyOS分布式能力的出现,使得不同设备之间的有机连接成为可能,为用户带来更多便利和智能化体验。同时,分布式也为开发者提供了更广阔的应用开发空间,推动了数字智能化的发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值