尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
订单模块全量代码与效果:ArkTS 多表查询在 HarmonyOS 落地
实例订单与明细Order收官文章一、文件清单文件职责行数database/OrderDao.ets数据层双表建表、事务下单、JOIN 查询、状态流转、种子约 370 行pages/samples/OrderPage.etsUI 层主从嵌套列表 状态筛选 流转按钮约 190 行resources/base/profile/main_pages.json路由注册pages/samples/OrderPage追加一行pages/Index.ets首页入口按钮追加一个按钮本篇文章完整展示可编译运行的 OrderPage 代码最后描述运行效果。二、OrderPage 完整代码import{common}fromkit.AbilityKit;import{promptAction}fromkit.ArkUI;import{OrderDao,OrderWithItems,OrderItem}from../../database/OrderDao;EntryComponentstruct OrderPage{Stateorders:OrderWithItems[][];StatestatusFilter:number-1;// -1 全部Statestats:Recordstring,number{};privatecontext:common.UIAbilityContextgetContext(this)ascommon.UIAbilityContext;privatereadonlystatusNames:string[][待支付,已支付,已发货,已完成,已取消];privatereadonlystatusColors:string[][#F59E0B,#3B82F6,#8B5CF6,#059669,#9CA3AF];aboutToAppear():void{this.refresh();}asyncrefresh():Promisevoid{try{awaitOrderDao.initSeedData(this.context);this.statsawaitOrderDao.statusStats(this.context);this.ordersawaitOrderDao.queryWithItems(this.context,this.statusFilter-1?undefined:this.statusFilter);}catch(e){promptAction.showToast({message:加载失败:${e}});}}asyncswitchFilter(f:number):Promisevoid{this.statusFilterf;awaitthis.refresh();}/** 状态流转待支付 → 已支付 → 已发货 → 已完成 */nextStatus(orderId:number,status:number):void{if(status3){return;}constnextstatus1;OrderDao.updateStatus(this.context,orderId,next).then(async(){awaitthis.refresh();promptAction.showToast({message:状态已更新为「${this.statusNames[next]}」});});}cancelOrder(orderId:number):void{promptAction.showDialog({title:取消订单,message:确定取消该订单吗,buttons:[{text:取消,color:#808080},{text:确认取消,color:#EF4444},],}).then((res:promptAction.ShowDialogSuccessResponse){if(res.index1){OrderDao.updateStatus(this.context,orderId,4).then(async(){awaitthis.refresh();promptAction.showToast({message:❌ 订单已取消});});}});}deleteOrder(id:number):void{promptAction.showDialog({title:删除订单,message:删除订单及全部明细确定吗,buttons:[{text:取消,color:#808080},{text:删除,color:#EF4444},],}).then((res:promptAction.ShowDialogSuccessResponse){if(res.index1){OrderDao.deleteOrder(this.context,id).then(async(){awaitthis.refresh();promptAction.showToast({message: 已删除});});}});}privatefmtTime(ts:number):string{constdnewDate(ts);return${d.getFullYear()}-${String(d.getMonth()1).padStart(2,0)}-${String(d.getDate()).padStart(2,0)};}build(){Column(){// 标题栏 Row(){Column(){Text( 订单与明细).fontSize(22).fontWeight(FontWeight.Bold)Text(外键一对多 · JOIN 联表查询).fontSize(11).fontColor(#999999).margin({top:2})}.alignItems(HorizontalAlign.Start).layoutWeight(1)Text(↻).fontSize(22).onClick(()this.refresh())}.width(100%).padding({left:16,right:16,top:12})// 状态统计条 Scroll(){Row({space:8}){Text(全部${this.totalOrders()}).fontSize(13).padding({left:12,right:12,top:6,bottom:6}).borderRadius(16).backgroundColor(this.statusFilter-1?#111827:#FFFFFF).fontColor(this.statusFilter-1?Color.White:#4B5563).onClick(()this.switchFilter(-1))ForEach(this.statusNames,(name:string,idx:number){Text(${name}${this.stats[String(idx)]??0}).fontSize(13).padding({left:12,right:12,top:6,bottom:6}).borderRadius(16).backgroundColor(this.statusFilteridx?this.statusColors[idx]:#FFFFFF).fontColor(this.statusFilteridx?Color.White:#4B5563).onClick(()this.switchFilter(idx))},(name:string,idx:number)${idx}-${name})}.padding({left:16,right:16,top:10})}.scrollable(ScrollDirection.Horizontal).scrollBar(BarState.Off).width(100%)// 订单列表主从嵌套 List({space:10}){ForEach(this.orders,(o:OrderWithItems){ListItem(){Column(){// 订单头Row(){Column({space:2}){Text(订单号${o.order.orderNo}).fontSize(14).fontWeight(FontWeight.Bold)Text(${o.order.customer}·${this.fmtTime(o.order.createdTime)}).fontSize(11).fontColor(#999999)}.alignItems(HorizontalAlign.Start).layoutWeight(1)Text(this.statusNames[o.order.status]).fontSize(11).padding({left:8,right:8,top:3,bottom:3}).borderRadius(10).backgroundColor(this.statusColors[o.order.status]).fontColor(Color.White)}.width(100%)// 明细列表Column(){ForEach(o.items,(it:OrderItem){Row({space:8}){Text(it.productName).fontSize(13).layoutWeight(1)Text(¥${it.price.toFixed(2)}×${it.quantity}).fontSize(12).fontColor(#6B7280)Text(¥${it.subtotal.toFixed(2)}).fontSize(13).fontWeight(FontWeight.Medium)}.width(100%).padding({top:5,bottom:5})},(it:OrderItem)${it.id}-${it.productName})}.width(100%).padding(10).backgroundColor(#F8FAFC).borderRadius(8).margin({top:8})// 订单尾Row(){Text(共${o.items.length}件商品).fontSize(12).fontColor(#6B7280)Blank()Text(合计 ¥${o.order.totalAmount.toFixed(2)}).fontSize(16).fontWeight(FontWeight.Bold).fontColor(#DC2626)}.width(100%).margin({top:8})// 操作按钮Row({space:8}){if(o.order.status0){Button(取消订单).layoutWeight(1).height(32).backgroundColor(#EEF2F7).fontColor(#EF4444).fontSize(13).onClick(()this.cancelOrder(o.order.id))}if(o.order.status3){Button(→${this.statusNames[o.order.status1]}).layoutWeight(1).height(32).backgroundColor(#3B82F6).fontSize(13).onClick(()this.nextStatus(o.order.id,o.order.status))}Button(删除).height(32).backgroundColor(#FEE2E2).fontColor(#EF4444).fontSize(13).onClick(()this.deleteOrder(o.order.id))}.width(100%).margin({top:10})}.padding(14).backgroundColor(Color.White).borderRadius(12)}},(o:OrderWithItems)${o.order.id}-${o.order.orderNo})}.width(94%).layoutWeight(1).margin({top:10}).scrollBar(BarState.Off)}.width(100%).height(100%).backgroundColor(#F1F4F8)}privatetotalOrders():number{letsum0;Object.keys(this.stats).forEach((k:string){sumthis.stats[k];});returnsum;}}三、注册与运行main_pages.json追加pages/samples/OrderPageIndex.ets追加Button( 9 订单与明细).fontSize(15).width(70%).onClick(()this.getUIContext().getRouter().pushUrl({url:pages/samples/OrderPage}))构建验证 →BUILD SUCCESSFUL。四、运行效果描述进入「 9 订单与明细」第一屏标题栏「 订单与明细 · 外键一对多 · JOIN 联表查询」状态统计条「全部 6 · 待支付 1 · 已支付 1 · 已发货 1 · 已完成 2 · 已取消 1」下方 6 张订单卡——每张依次是订单头单号 收货人 彩色状态标签→ 浅灰明细区1~3 行商品名称 单价×数量 小计→ 订单尾共 N 件 红色合计→ 操作按钮行。交互一状态流转点订单 1待支付的「→ 已支付」→ Toast「状态已更新为「已支付」」→ 标签变蓝、统计条刷新待支付 0 / 已支付 2→ 再点「→ 已发货」「→ 已完成」推进到底。交互二取消订单对任意待支付订单点「取消订单」→ 确认框 → 状态变灰「已取消」统计条同步。交互三状态筛选点「已完成 2」→ 列表只剩 2 张绿色标签的订单 → 点「全部」恢复 6 张。交互四删除点「删除」→ 确认框提示删除明细→ 订单与明细一起消失。五、代码质量要点回顾关注点本实例做法一对多orders order_item 聚合体组装事务下单先插主表 循环插从表 commitJOIN 查询LEFT JOIN map 归组状态机页面守卫 status 3动态按钮状态统计GROUP BY status破坏确认showDialog index 1六、文章小结实例 9「订单与明细」收官。五篇文章覆盖一对多建模9-1→ 主从嵌套 UI9-2→ 事务下单与 JOIN9-3→ 双表种子9-4→ 全量代码9-5。核心技术是「先主后从」的事务写入、LEFT JOIN 展平 内存归组的联表查询、状态机驱动的动态按钮——多表建模与联表查询的能力至此系统建立。
RELATED

相关推荐

黑客攻防实战:从渗透测试到APT攻击防御

黑客攻防实战:从渗透测试到APT攻击防御

1. 黑客能力的边界与真实案例解析在网络安全领域,顶级黑客的技术能力常常超出普通人的想象。他们不仅能够突破常规防御系统,更能发现系统设计者从未考虑到的漏洞。这种能力并非来自魔法,而是对计算机系统底层原理的深刻理解与创造性思维的结合…

📅 2026/9/14 3:21:46
美团“红灯停表”悄悄按下了骑手计时器的暂停键

美团“红灯停表”悄悄按下了骑手计时器的暂停键

导语:从超时免罚到“红灯停表”:美团走上了算法的纠偏之路。北京朝阳北路和青年路交叉口,下午两点,日头把柏油路面晒得发软。外卖骑手们眼睛在手机屏幕的倒计时和路口那盏红灯之间来回跳,心里反复算着拐过这个路口还有…

📅 2026/9/14 13:57:26
粗排与精排:揭秘大规模推荐系统的核心排序架构

粗排与精排:揭秘大规模推荐系统的核心排序架构

1. 项目概述:从“海选”到“决赛”的流量筛选逻辑在广告、搜索、推荐这些我们每天都会接触的互联网产品背后,藏着一套极其精密且高效的“流量分发”系统。它的核心任务,是在毫秒级的时间内,从上百万甚至上亿的候选内容&#xff08…

📅 2026/9/15 13:23:08
MORE NEWS

更多资讯

📰

STM32F215ZG驱动MR25H40CDF MRAM:SPI配置、HAL库读写与掉电保护实战

1. 为什么工业现场还在用并行SRAM的替代方案如果你拆过工业PLC的板子,大概率见过两种存储器:一种是带纽扣电池的SRAM,另一种是NOR Flash。前者掉电丢数据,后者写入慢、擦除寿命有限。很多做数据采集的朋友都遇到过同一个尴尬——设…

📰

全国选型避坑指南:项目落地前先把 Base URL 改到 TaoToken 确认这几件事

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Ubuntu Server 无桌面环境下播放视频与显示网页:mpv 与 chromium 实战指南

1. 为什么要在 Ubuntu Server 上折腾视频和网页显示很多人第一次听到"在 Ubuntu Server 上播放视频、显示网页"这个需求,第一反应是:Server 版本不是没有桌面吗,装它干嘛用?这个疑问很合理,但实际场景里&…

📰

METAL:GWAS汇总统计元分析的工业级命令行工具

1. 什么是METAL?一个专为GWAS数据设计的元分析“老炮儿”如果你正在处理多个全基因组关联研究(GWAS)的数据,比如手头有来自欧洲人群、东亚人群、非洲裔队列的三套独立GWAS汇总统计(summary statistics)&…

📰

OpenBitFun 定时任务指南:打造你的黑灯工厂,让 AI 在服务器持续干活

OpenBitFun 定时任务指南:打造你的黑灯工厂,让 AI 在服务器持续干活 【免费下载链接】OpenBitFun OpenBitFun combines a high-performance agent runtime written in Rust with a polished desktop application. It pairs the depth of a Code Agent wi…

📰

未来反向教学:用确定性约束提升时序模型可解释性与鲁棒性

1. 项目概述:这不是“未来预测”,而是让模型学会“时间倒带式推理”“自然 通讯:让‘未来’反过来教模型如何预测”——这个标题乍看像科幻小说的副标题,但其实它精准指向一个正在悄然改变AI建模底层逻辑的新范式。我第一次在实验…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬