HarmonyOS开发实例:【菜单app】

  论坛元老 | 2024-6-24 06:37:13 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1737|帖子 1737|积分 5211

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
 简介

分布式菜单demo 模拟的是多人会餐点菜的场景,不需要扫码关注公众号等一系列操作,通过分布式数据库可以方便每个人可及时检察到订单详情,数量,总额等;效果如下


  • demo效果


工程目录

完整的项目结构目录如下
  1. ├─entry
  2. │  └─src
  3. │      └─main
  4. │          │  config.json  // 应用配置文件
  5. │          │  
  6. │          ├─ets
  7. │          │  └─MainAbility
  8. │          │      │  app.ets  // 应用程序主入口
  9. │          │      │  
  10. │          │      ├─model
  11. │          │      │      CommonLog.ets  // 日志类
  12. │          │      │      MenuData.ets  // 初始化菜单数据类
  13. │          │      │      MenuListDistributedData.ets  // 加入菜单分布式数据库
  14. │          │      │      RemoteDeviceManager.ets  // 分布式拉起设备管理类
  15. │          │      │      SubmitData.ets   // 结算订单分布式数据库
  16. │          │      │      
  17. │          │      └─pages
  18. │          │              detailedPage.ets // 菜品详细页面
  19. │          │              index.ets // 首页
  20. │          │              menuAccount.ets // 订单详情页面
  21. │          │              
  22. │          └─resources
  23. │              ├─base
  24. │              │  ├─element
  25. │              │  │      string.json
  26. │              │  │      
  27. │              │  ├─graphic
  28. │              │  ├─layout
  29. │              │  ├─media   // 存放媒体资源
  30. │              │  │      icon.png
  31. │              │  │      icon_add.png
  32. │              │  │      icon_back.png
  33. │              │  │      icon_cart.png
  34. │              │  │      
  35. │              │  └─profile
  36. │              └─rawfile
复制代码
鸿蒙开发文档qr23.cn/AKFP8k参考(点击或者复制前往)。
开发步调



1. 新建OpenHarmony ETS项目

在DevEco Studio中点击File -> New Project ->Empty Ability->Next,Language 选择ETS语言,末了点击Finish即创建乐成。 



2. 编写商品展示主页面



2.1用户信息

1): 主要用到[Flex]容器[Image]和[Text]组件;
2): 用户名称和头像图标,根据装备序列号不同,可展示不同的名称和图标;
3): 点击右上角分享的小图标,可分布式拉起局域网内的另一台装备;
  1. @Component
  2. struct MemberInfo {
  3.   @Consume userImg: Resource
  4.   @Consume userName: string
  5.   
  6.   aboutToAppear() {
  7.   // 根据设备序列号不同,展示不同的名称和图标
  8.     CommonLog.info('==serial===' + deviceInfo.serial);
  9.     if (deviceInfo.serial == '150100384754463452061bba4c3d670b') {
  10.       this.userImg = $r("app.media.icon_user")
  11.       this.userName = 'Sunny'
  12.     }
  13.     else {
  14.       this.userImg = $r("app.media.icon_user_another")
  15.       this.userName = 'Jenny'
  16.     }
  17.   }
  18.   build() {
  19.     Flex({ direction: FlexDirection.Column }) {
  20.       Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center }) {
  21.         Image(this.userImg)
  22.           .width('96lpx')
  23.           .height('96lpx')
  24.           .margin({ right: '18lpx' })
  25.         Text(this.userName)
  26.           .fontSize('36lpx')
  27.           .fontWeight(FontWeight.Bold)
  28.           .flexGrow(1)
  29.         Image($r("app.media.icon_share"))
  30.           .width('64lpx')
  31.           .height('64lpx')
  32.       }
  33.       // 打开分布式设备列表
  34.       .onClick(() => {
  35.         this.DeviceDialog.open()
  36.       })
  37.       .layoutWeight(1)
  38.       .padding({ left: '48lpx', right: '48lpx' })
  39.       Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center }) {
  40.         Column() {
  41.           Text('124')
  42.             .fontSize('40lpx')
  43.             .margin({ bottom: '24lpx' })
  44.           Text('积分')
  45.             .fontSize('22lpx')
  46.             .opacity(0.4)
  47.         }
  48.         .flexGrow(1)
  49.         Column() {
  50.           Text('0')
  51.             .fontSize('40lpx')
  52.             .margin({ bottom: '24lpx' })
  53.           Text('优惠劵')
  54.             .fontSize('22lpx')
  55.             .opacity(0.4)
  56.         }
  57.         .flexGrow(1)
  58.         Column() {
  59.           Image($r("app.media.icon_member"))
  60.             .width('48lpx')
  61.             .height('48lpx')
  62.             .margin({ bottom: '24lpx' })
  63.           Text('会员码')
  64.             .fontSize('22lpx')
  65.             .fontColor('#000000')
  66.             .opacity(0.4)
  67.         }
  68.         .flexGrow(1)
  69.       }
  70.       .layoutWeight(1)
  71.     }
  72.     .width('93%')
  73.     .height('25%')
  74.     .borderRadius('16lpx')
  75.     .backgroundColor('#FFFFFF')
  76.     .margin({ top: '24lpx', bottom: '32lpx' })
  77.   }
  78. }
复制代码
2.2列表展示

1): 主要用到[Flex]容器 和[Scroll]容器[Image]和[Text]组件;
2): 从首页点击列表进入菜品具体页面,点菜乐成后会自动返回首页,此时列表需要动态更新菜品的数量;
  1. @Component
  2. struct MenuHome {
  3.   private specialty: any[]
  4.   private winterNew: any[]
  5.   private classic: any[]
  6.   private soup: any[]
  7.   private menuItems: MenuData[]
  8.   private titleList = ['招牌菜', '冬季新品', '下饭菜', '汤品']
  9.   @State name: string = '招牌菜'
  10.   build() {
  11.     Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Start }) {
  12.       Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.SpaceAround }) {
  13.         ForEach(this.titleList, item => {
  14.           Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) {
  15.             Text(item)
  16.               .fontSize('24lpx')
  17.           }
  18.           .padding({ left: '24lpx' })
  19.           .backgroundColor(this.name == item ? '#1A006A3A' : '#FFFFFF')
  20.           .height('160lpx')
  21.           .onClick(() => {
  22.             this.name = item
  23.             if (this.name == '招牌菜') {
  24.               this.menuItems = initializeOnStartup(this.specialty);
  25.             }
  26.             else if (this.name == '冬季新品') {
  27.               this.menuItems = initializeOnStartup(this.winterNew);
  28.             }
  29.             else if (this.name == '下饭菜') {
  30.               this.menuItems = initializeOnStartup(this.classic);
  31.             }
  32.             else if (this.name == '汤品') {
  33.               this.menuItems = initializeOnStartup(this.soup);
  34.             }
  35.           })
  36.         }, item => item)
  37.       }
  38.       .width('20%')
  39.       .backgroundColor('#FFFFFF')
  40.       Flex({ direction: FlexDirection.Column }) {
  41.         Text(this.name)
  42.           .fontSize('32lpx')
  43.           .fontWeight(FontWeight.Bold)
  44.           .opacity(0.4)
  45.           .height('8%')
  46.         Scroll() {
  47.           Column() {
  48.             List() {
  49.               ForEach(this.menuItems, item => {
  50.                 ListItem() {
  51.                   MenuListItem({ menuItem: item })
  52.                 }
  53.               }, item => item.id.toString())
  54.             }
  55.           }
  56.         }
  57.         .height('92%')
  58.       }
  59.       .margin({ left: '10lpx' })
  60.       .width('75%')
  61.     }
  62.     .height('50%')
  63.   }
  64. }
复制代码
2.3底部总额

1): 主要用到[Flex]容器 和[Stack]容器[Image]和[Text]组件;
2): 从首页点击列表进入菜品具体页面,点菜乐成后会自动返回首页,更新订单数量和总额;
3): 点击底部总额框,将订单列表加入分布式数据库,@entry模拟监听数据库变化,拉起订单列表详情页面;
  1. @Component
  2. struct TotalInfo {
  3.   @Consume TotalMenu: any[];
  4.   private total: number = 0;
  5.   private amount: number = 0;
  6.   private remoteData: MenuListData
  7.   aboutToAppear() {
  8.     for (var index = 0; index < this.TotalMenu.length; index++) {
  9.       this.total = this.total + this.TotalMenu[index].price * this.TotalMenu[index].quantity
  10.       this.amount = this.amount + this.TotalMenu[index].quantity
  11.     }
  12.   }
  13.   build() {
  14.     Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center }) {
  15.       Stack({ alignContent: Alignment.Center }) {
  16.         Image($r("app.media.icon_cart"))
  17.           .width('96lpx')
  18.           .height('96lpx')
  19.           .margin({ left: '22lpx' })
  20.         Text(this.amount.toString())
  21.           .backgroundColor('#F84747')
  22.           .borderRadius('30plx')
  23.           .fontSize('24plx')
  24.           .textAlign(TextAlign.Center)
  25.           .fontColor('#FFFFFF')
  26.           .width('50lpx')
  27.           .height('50lpx')
  28.           .margin({ left: '100lpx', bottom: '85lpx' })
  29.       }
  30.       .width('150lpx')
  31.       .height('150lpx')
  32.       Text('¥')
  33.         .fontSize('22lpx')
  34.         .fontColor('#006A3A')
  35.         .margin({ left: '22lpx' })
  36.       Text(this.total.toString())
  37.         .fontSize('40lpx')
  38.         .fontColor('#006A3A')
  39.         .flexGrow(1)
  40.       Text('点好了')
  41.         .height('100%')
  42.         .width('35%')
  43.         .fontColor('#FFFFFF')
  44.         .backgroundColor('#F84747')
  45.         .textAlign(TextAlign.Center)
  46.     }
  47.     // 将总的订单数据,加入分布式数据库
  48.     .onClick(() => {
  49.       this.remoteData.putData("menu_list", this.TotalMenu)
  50.     })
  51.     .width('100%')
  52.     .height('10%')
  53.     .backgroundColor('#FFFFFF')
  54.   }
  55. }
复制代码
3. 编写菜单具体页面



3.1 菜单详情

1): 主要用到[Flex]容器 [Image]和[Text]组件[Button]组件;
2): 辣度可以选择;
3):点击选好了,需要判断该菜品是否已经在总订单里面,并判断是哪一个用户添加,根据判断,做出相应的增长;
  1. @Component
  2. struct detailInfo {
  3.   private menuItem
  4.   private spicyList = ['正常辣', '加辣', '少辣']
  5.   @State spicy: string = '正常辣'
  6.   private TotalMenu: any[]
  7.   private index = 0
  8.   private userName: string
  9.   build() {
  10.     Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center }) {
  11.       Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Start }) {
  12.         Flex({ direction: FlexDirection.Row }) {
  13.           Flex() {
  14.             Image(this.menuItem.imgSrc)
  15.               .objectFit(ImageFit.Contain)
  16.           }
  17.           Flex({ direction: FlexDirection.Column }) {
  18.             Text(this.menuItem.name)
  19.               .fontSize('32lpx')
  20.               .flexGrow(1)
  21.             Text(this.menuItem.remarks)
  22.               .fontSize('22lpx')
  23.               .fontColor('#000000')
  24.               .opacity(0.6)
  25.               .flexGrow(1)
  26.             Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center }) {
  27.               Text('¥')
  28.                 .fontSize('22lpx')
  29.               Text(this.menuItem.price.toString())
  30.                 .fontSize('40lpx')
  31.               Text('/份')
  32.                 .fontSize('22lpx')
  33.                 .flexGrow(1)
  34.               Image($r("app.media.icon_reduce"))
  35.                 .width('44lpx')
  36.                 .height('44lpx')
  37.                 .onClick(() => {
  38.                   prompt.showToast({
  39.                     message: "Reduce function  to be completed",
  40.                     duration: 5000
  41.                   })
  42.                 })
  43.               Text(this.menuItem.quantity.toString())
  44.                 .margin({ left: '15lpx', right: '15lpx' })
  45.               Image($r("app.media.icon_add"))
  46.                 .width('44lpx')
  47.                 .height('44lpx')
  48.                 .margin({ right: '15lpx' })
  49.                 .onClick(() => {
  50.                   prompt.showToast({
  51.                     message: "Increase function to be completed",
  52.                     duration: 5000
  53.                   })
  54.                 })
  55.             }
  56.             .flexGrow(2)
  57.           }
  58.         }
  59.         .height('40%')
  60.         .margin({ top: '40lpx', bottom: '24lpx' })
  61.         Button()
  62.           .backgroundColor('#000000')
  63.           .opacity(0.1)
  64.           .height('2lpx')
  65.           .margin({ left: '24lpx' })
  66.           .width('92%')
  67.         Flex({ direction: FlexDirection.Row }) {
  68.           Button()
  69.             .backgroundColor('#006A3A ')
  70.             .width('8lpx')
  71.             .height('48lpx')
  72.             .margin({ right: '12lpx' })
  73.           Text('辣度')
  74.         }
  75.         .margin({ left: '44lpx', top: '48lpx', bottom: '32lpx' })
  76.         Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceEvenly }) {
  77.           ForEach(this.spicyList, item => {
  78.             Button(item)
  79.               .fontSize('28lpx')
  80.               .height('60lpx')
  81.               .width('156lpx')
  82.               .borderRadius('12lpx')
  83.               .backgroundColor(this.spicy == item ? '#006A3A' : '#0D000000')
  84.               .fontColor(this.spicy == item ? '#FFFFFF' : '#000000')
  85.               .onClick(() => {
  86.                 this.spicy = item
  87.               })
  88.           }, item => item)
  89.         }
  90.       }
  91.       .margin({ top: '56lpx' })
  92.       .width('92%')
  93.       .height('50%')
  94.       .borderRadius('16lpx')
  95.       .backgroundColor('#FFFFFF')
  96.       Button('选好了')
  97.         .fontSize('36lpx')
  98.         .width('80%')
  99.         .height('7%')
  100.         .backgroundColor('#F84747')
  101.         .onClick(() => {
  102.           for (this.index = 0; this.index < this.TotalMenu.length; this.index++) {
  103.             if (this.TotalMenu[this.index].name == this.menuItem.name && this.TotalMenu[this.index].spicy == this.spicy) {
  104.               this.TotalMenu[this.index].quantity = this.TotalMenu[this.index].quantity + 1;
  105.               if (this.userName == 'Sunny') {
  106.                 this.TotalMenu[this.index].userNumber = this.TotalMenu[this.index].userNumber + 1;
  107.               } else if (this.userName == 'Jenny') {
  108.                 this.TotalMenu[this.index].anotherUserNumber = this.TotalMenu[this.index].anotherUserNumber + 1;
  109.               }
  110.               break;
  111.             }
  112.           }
  113.           // 菜名不一样,辣度不一样,都需要重新push到列表里面
  114.           if (this.index == this.TotalMenu.length) {
  115.             this.menuItem.spicy = this.spicy;
  116.             this.menuItem.quantity = 1;
  117.             //根据不用的用户名称,
  118.             if (this.userName == 'Sunny') {
  119.               this.menuItem.userNumber = 1;
  120.             } else if (this.userName == 'Jenny') {
  121.               this.menuItem.anotherUserNumber = 1;
  122.             }
  123.             this.TotalMenu.push(this.menuItem);
  124.           }
  125.           router.push({
  126.             uri: 'pages/index',
  127.             params: { menuItem: this.menuItem, TotalMenu: this.TotalMenu }
  128.           })
  129.         })
  130.         .margin({ top: '10%' })
  131.     }
  132.   }
  133. }
复制代码
4. 编写订单详情页面



4.1 订单列表

1): 主要用到[Flex]容器[Image]和[Text]组件[Button]组件;
2): 点击下单,将"submitOk" 加入分布式数据库,监听数据库变化后,弹出自定义对话框;
  1. @Component
  2. struct TotalItem {
  3.   private totalMenu: MenuData
  4.   build() {
  5.     Flex({ direction: FlexDirection.Column }) {
  6.       Flex({ direction: FlexDirection.Row, alignContent: FlexAlign.Start, justifyContent: FlexAlign.Start }) {
  7.         Image(this.totalMenu.imgSrc)
  8.           .width('210lpx')
  9.           .height('100%')
  10.         Flex({ direction: FlexDirection.Column }) {
  11.           Text(this.totalMenu.name)
  12.             .fontSize('32lpx')
  13.             .flexGrow(1)
  14.           Text(this.totalMenu.spicy)
  15.             .fontSize('22lpx')
  16.             .fontColor('#000000')
  17.             .opacity(0.6)
  18.             .flexGrow(1)
  19.           Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center }) {
  20.             Text('¥')
  21.               .fontSize('22lpx')
  22.             Text(this.totalMenu.price.toString())
  23.               .fontSize('40lpx')
  24.             Text('/份')
  25.               .fontSize('22lpx')
  26.               .flexGrow(1)
  27.             Text(this.totalMenu.quantity.toString())
  28.               .fontColor("#F84747")
  29.               .fontSize('40lpx')
  30.           }
  31.           .flexGrow(2)
  32.         }
  33.         .padding({ left: '5%', top: '6%' })
  34.         .width('70%')
  35.       }
  36.       .height('180lpx')
  37.       Button()
  38.         .backgroundColor('#000000')
  39.         .opacity(0.1)
  40.         .height('2lpx')
  41.         .margin({ top: '20lpx' })
  42.         .width('100%')
  43.       if (this.totalMenu.userNumber > 0) {
  44.         Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center }) {
  45.           Image(this.totalMenu.userImg)
  46.             .width('96lpx')
  47.             .height('96lpx')
  48.           Text(this.totalMenu.userName)
  49.             .fontSize('36lpx')
  50.             .fontWeight(FontWeight.Bold)
  51.             .margin({ left: '12lpx' })
  52.             .flexGrow(1)
  53.           Text(this.totalMenu.userNumber.toString())
  54.             .fontSize('32lpx')
  55.             .margin({ right: '11plx' })
  56.         }
  57.         .height('150lpx')
  58.       }
  59.       if (this.totalMenu.anotherUserNumber > 0) {
  60.         Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center }) {
  61.           Image(this.totalMenu.anotherUserImg)
  62.             .width('96lpx')
  63.             .height('96lpx')
  64.           Text(this.totalMenu.anotherUserName)
  65.             .fontSize('36lpx')
  66.             .fontWeight(FontWeight.Bold)
  67.             .margin({ left: '12lpx' })
  68.             .flexGrow(1)
  69.           Text(this.totalMenu.anotherUserNumber.toString())
  70.             .fontSize('32lpx')
  71.             .margin({ right: '11plx' })
  72.         }
  73.         .height('150lpx')
  74.       }
  75.     }
  76.     .margin({ top: '12lpx' })
  77.     .borderRadius('16lpx')
  78.     .padding({ left: '3%', right: '3%', top: '2%' })
  79.     .backgroundColor('#FFFFFF')
  80.   }
  81. }
复制代码
4.2自定义弹框

1)通过**@CustomDialog**装饰器来创建自定义弹窗,使用方式可参考 [自定义弹窗];
2)规则弹窗效果如下,弹窗组成由一个[Image]和两个[Text]竖向分列组成;
全部我们可以在build()下使用[Flex]容器来包裹,组件代码如下:
  1. @CustomDialog
  2. struct SubmitDialog {
  3.   private controller: CustomDialogController
  4.   build() {
  5.     Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center }) {
  6.       Flex({ justifyContent: FlexAlign.Center }) {
  7.         Image($r("app.media.icon_success"))
  8.           .width('100lpx')
  9.           .height('80lpx')
  10.       }
  11.       .flexGrow(1)
  12.       Text('下单成功')
  13.         .fontSize('36lpx')
  14.         .fontColor('#000000')
  15.         .flexGrow(1)
  16.       Text('*温馨提示:菜品具体售卖情况请以店面实际情况为准哦~')
  17.         .fontSize('22lpx')
  18.         .opacity(0.6)
  19.         .fontColor('#000000')
  20.         .padding({ left: '10lpx', right: '10lpx' })
  21.     }
  22.     .height('300lpx')
  23.     .width('100%')
  24.     .padding({ top: '50lpx', bottom: '20lpx' })
  25.   }
  26. }
复制代码
​ 3)在@entry创建CustomDialogController对象并传入弹窗所需参数,设置点击答应点击遮障层退出,通过open()方法,体现弹窗;
  1. SubmitDialog: CustomDialogController = new CustomDialogController({
  2.     builder: SubmitDialog(),
  3.     autoCancel: true
  4.   })
  5. aboutToAppear() {
  6.   
  7.     this.remoteData.createManager(() => {
  8.       let self = this;
  9.       var data;
  10.       if (JSON.stringify(self.remoteData.dataItem).length > 0) {
  11.               data = self.remoteData.dataItem;
  12.         CommonLog.info("======submit==" + data[0].submit);
  13.         if (data[0].submit == "submitOk") {
  14.           this.SubmitDialog.open()
  15.         }
  16.       }
  17.     }, "com.distributed.order", "submit")
  18.   }
复制代码
5. 添加分布式流转

分布式流转需要在同一网络下通过 [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并携带数据,即可实现分布式流转。


6.分布式数据管理

[分布式数据管理]要求两个或多个装备在同一网络,才能监听到数据库的改变,从而渲染页面;开发步调:
1)创建一个KVManager对象实例,用于管理数据库对象;
2)通过指定Options和storeId,创建并获取KVStore数据库,如下是参数说明;需要先通过createKVManager构建一个KVManager实例;
参数名范例必填说明storeIdstring是数据库唯一标识符,长度不大于[MAX_STORE_ID_LENGTH]。options[Options]是创建KVStore实例的配置信息。 3)KVStore数据库实例, KVStore.put提供增长数据的方法,如下是参数说明;
参数名范例必填说明keystring是要添加数据的key,不能为空且长度不大于[MAX_KEY_LENGTH]。valueUint8Arraystringnumberboolean是要添加数据的value,支持Uint8Array、number 、 string 、boolean,Uint8Array、string 的长度不大于[MAX_VALUE_LENGTH]。callbackAsyncCallback是回调函数。 4) KVStore数据库实例,KVStore.on订阅指定范例的数据变更关照;一般监听远端装备变化,再举行相应操作到达分布式数据共享的效果;
本项目通过storeId 值不同,创建了两个数据库,分别是MenuListDistributedData类和SubmitData类;
MenuListDistributedData是将完整订单添加到分布式数据库
  1. @Component
  2. struct TotalInfo {
  3.   @Consume TotalMenu: any[];
  4.   private total: number = 0;
  5.   private amount: number = 0;
  6.   private remoteData: MenuListData
  7.   aboutToAppear() {
  8.     for (var index = 0; index < this.TotalMenu.length; index++) {
  9.       this.total = this.total + this.TotalMenu[index].price * this.TotalMenu[index].quantity
  10.       this.amount = this.amount + this.TotalMenu[index].quantity
  11.     }
  12.   }
  13.   build() {
  14.     Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center }) {
  15.       Stack({ alignContent: Alignment.Center }) {
  16.         Image($r("app.media.icon_cart"))
  17.           .width('96lpx')
  18.           .height('96lpx')
  19.           .margin({ left: '22lpx' })
  20.         Text(this.amount.toString())
  21.           .backgroundColor('#F84747')
  22.           .borderRadius('30plx')
  23.           .fontSize('24plx')
  24.           .textAlign(TextAlign.Center)
  25.           .fontColor('#FFFFFF')
  26.           .width('50lpx')
  27.           .height('50lpx')
  28.           .margin({ left: '100lpx', bottom: '85lpx' })
  29.       }
  30.       .width('150lpx')
  31.       .height('150lpx')
  32.       Text('¥')
  33.         .fontSize('22lpx')
  34.         .fontColor('#006A3A')
  35.         .margin({ left: '22lpx' })
  36.       Text(this.total.toString())
  37.         .fontSize('40lpx')
  38.         .fontColor('#006A3A')
  39.         .flexGrow(1)
  40.       Text('点好了')
  41.         .height('100%')
  42.         .width('35%')
  43.         .fontColor('#FFFFFF')
  44.         .backgroundColor('#F84747')
  45.         .textAlign(TextAlign.Center)
  46.     }
  47.     .onClick(() => {
  48.       this.remoteData.putData("menu_list", this.TotalMenu)
  49.     })
  50.     .width('100%')
  51.     .height('10%')
  52.     .backgroundColor('#FFFFFF')
  53.   }
  54. }
复制代码
SubmitData在订单结算是点击下单,将submitOk 添加到数据库;
  1. @Component
  2. struct SubmitList {
  3.   private remoteData: SubmitData
  4.   private SubmitOK: any[] = [
  5.     {
  6.       submit: "submitOk"
  7.     }
  8.   ];
  9.   build() {
  10.     Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
  11.       Text('下单')
  12.         .fontSize('36lpx')
  13.         .fontColor('#FFFFFF')
  14.     }
  15.     .width('100%')
  16.     .height('10%')
  17.     .backgroundColor('#F84747')
  18.     .onClick(() => {
  19.       this.remoteData.putData("submit", this.SubmitOK)
  20.     })
  21.     .margin({ top: '5%' })
  22.   }
  23. }
复制代码

鸿蒙开发岗位需要把握那些焦点要领?

如今还有很多小伙伴不知道要学习哪些鸿蒙技术?不知道重点把握哪些?为了克制学习时频仍踩坑,最终浪费大量时间的。
自己学习时必须要有一份实用的鸿蒙(Harmony NEXT)资料非常有须要。 这里我推荐,根据鸿蒙开发官网梳理与华为内部职员的分享总结出的开发文档。内容包罗了:【ArkTS、ArkUI、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战】等技术知识点。
废话就不多说了,接下来好悦目下这份资料。
如果你是一名Android、Java、前端等等开发职员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。鸿蒙OpenHarmony知识←前往。下面是鸿蒙开发的学习路线图。






针对鸿蒙发展路线打造的鸿蒙学习文档。鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,帮助大家在技术的门路上更进一步。
其中内容包罗:

《鸿蒙开发基础》鸿蒙OpenHarmony知识←前往

  • ArkTS语言
  • 安装DevEco Studio
  • 运用你的第一个ArkTS应用
  • ArkUI声明式UI开发
  • .……
《鸿蒙开发进阶》鸿蒙OpenHarmony知识←前往

  • Stage模型入门
  • 网络管理
  • 数据管理
  • 电话服务
  • 分布式应用开发
  • 关照与窗口管理
  • 多媒体技术
  • 安全技能
  • 使命管理
  • WebGL
  • 国际化开发
  • 应用测试
  • DFX面向未来计划
  • 鸿蒙体系移植和裁剪定制
  • ……
《鸿蒙开发实战》鸿蒙OpenHarmony知识←前往

  • ArkTS实践
  • UIAbility应用
  • 网络案例
  • ……
末了

鸿蒙是完全具备无与伦比的时机和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表