订单模块全量代码与效果: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 展平 内存归组的联表查询、状态机驱动的动态按钮——多表建模与联表查询的能力至此系统建立。

相关新闻

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

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

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

2026/9/26 2:56:47 阅读更多 →
美团“红灯停表”悄悄按下了骑手计时器的暂停键

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

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

2026/10/11 5:11:37 阅读更多 →
粗排与精排:揭秘大规模推荐系统的核心排序架构

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

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

2026/10/9 2:06:31 阅读更多 →

最新新闻

升级时突然断电,为什么不能先擦掉旧程序?

升级时突然断电,为什么不能先擦掉旧程序?

升级时突然断电,为什么不能先擦掉旧程序?本文为教学接线与设计预期,尚无实物测量记录;使用 NUCLEO-F030R8。问题 升级包只收到一半就断电,重启后还能运行旧程序吗?关键不是串口传得快不快,而是写…

2026/10/11 5:11:35 阅读更多 →
霜钻连续三年荣登《亚洲品牌500强》

霜钻连续三年荣登《亚洲品牌500强》

2026年9月20日第21届亚洲品牌盛典在香港举办,同期发布亚洲品牌500强榜单。中国高端院线护肤品牌霜钻第三次荣膺亚洲500强品牌,位列第370位,排名相比上年大幅跃升68位,品牌价值突破230亿元,与华为、抖音、丰田、三星等品…

2026/10/11 5:11:35 阅读更多 →
现在入场亚马逊晚了吗?数据说:刚刚好!

现在入场亚马逊晚了吗?数据说:刚刚好!

想做亚马逊前,总有很多问题让人犹豫:英语不行能开店吗?预算不多能试水吗?没人带能跑通吗? 先看一份新卖家成绩单 ✦ PERMA:0经验95后兄妹,2025年5月入驻亚马逊,25万资金起步做拼图&…

2026/10/11 5:11:35 阅读更多 →
VLA 系统学习第 17 课:正式进入 ACT——为什么需要 CVAE、潜变量 z 和 KL Loss?

VLA 系统学习第 17 课:正式进入 ACT——为什么需要 CVAE、潜变量 z 和 KL Loss?

第十六课标准答案上一课我们已经从 Transformer 的内部结构,走到了一个能预测 Action Chunk 的 Encoder–Decoder Policy。现在先解决 9 道题,然后正式进入 ACT:Action Chunking with Transformers。1. 为什么 Encoder 的输出叫 Memory&#…

2026/10/11 5:11:35 阅读更多 →
【Agent架构探索】之Agent和大模型交互基本工作过程

【Agent架构探索】之Agent和大模型交互基本工作过程

昨天提到了提到 system prompt(系统提示词) 那他这个和user prompt(用户提示词)(用户角色的提示词到底有什么区别? 为什么system prompt不能太多? 为什么要使用多Agent架构,直接使用…

2026/10/11 5:11:34 阅读更多 →
Proxmark3 RDV4.01:Windows 11 下 Iceman 固件升级与完整使用指南

Proxmark3 RDV4.01:Windows 11 下 Iceman 固件升级与完整使用指南

1. 前言 Proxmark3 是一款开源的 RFID/NFC 协议研究设备,支持高频(HF)和低频(LF)射频技术,可用于卡片识别、协议分析、通信监听、射频信号采样及授权安全测试。 本文使用 Proxmark3 RDV4.01,原…

2026/10/11 5:10:34 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/10 10:38:42 阅读更多 →