HarmonyOS ArkTS 实战:实现一个校园自动售货机库存与补货记录应用

HarmonyOS ArkTS 实战:实现一个校园自动售货机库存与补货记录应用

项目效果

本文使用 HarmonyOS 和 ArkTS 实现一个校园自动售货机库存与补货记录应用。

应用可以登记校园售货机,记录设备名称、所在位置、设备类型、商品库存和运行状态,并提供库存预警、快速补货、故障上报、维修完成、状态筛选和数据统计等功能。

项目使用 DevEco Studio 开发,适配 API 23 及以上版本。

功能介绍

本项目实现了以下功能:

  • 登记新的校园自动售货机
  • 记录设备名称和所在位置
  • 选择饮料机、零食机或综合机类型
  • 设置设备初始库存
  • 自动识别低库存设备
  • 一键为售货机补充库存
  • 上报设备故障
  • 标记设备维修完成
  • 按库存和运行状态筛选设备
  • 统计设备总数、缺货数量和故障数量
  • 删除不再使用的设备记录

定义数据结构

首先定义自动售货机的数据结构:

ts 复制代码
interface VendingRecord {
  id: number;
  name: string;
  location: string;
  stock: number;
  type: string;
  status: string;
}

字段说明如下:

  • id:设备记录的唯一编号
  • name:售货机名称或编号
  • location:设备所在位置
  • stock:当前商品库存
  • type:售货机类型
  • status:设备运行状态

初始化页面状态

使用 @State 保存输入内容和筛选条件:

ts 复制代码
@State private nameText: string = '';
@State private locationText: string = '';
@State private stockText: string = '';
@State private machineType: string = '饮料机';
@State private filterType: string = '全部';
@State private nextId: number = 6;

准备一些初始设备数据:

ts 复制代码
@State private records: VendingRecord[] = [
  {
    id: 1,
    name: 'A-01 售货机',
    location: '图书馆一楼',
    stock: 42,
    type: '饮料机',
    status: '正常'
  },
  {
    id: 2,
    name: 'B-03 售货机',
    location: '第二教学楼',
    stock: 8,
    type: '综合机',
    status: '缺货'
  },
  {
    id: 3,
    name: 'C-02 售货机',
    location: '南区宿舍大厅',
    stock: 25,
    type: '零食机',
    status: '正常'
  },
  {
    id: 4,
    name: 'D-01 售货机',
    location: '东区体育馆',
    stock: 16,
    type: '饮料机',
    status: '故障'
  }
];

初始数据包含正常、缺货和故障三种状态,可以让 Preview 直接展示完整页面效果。

添加售货机

用户填写设备名称、位置和初始库存后,可以登记新的售货机:

ts 复制代码
private addRecord(): void {
  const name: string = this.nameText.trim();
  const location: string = this.locationText.trim();
  const stock: number = Number(this.stockText);

  if (
    name.length === 0 ||
    location.length === 0 ||
    Number.isNaN(stock) ||
    stock < 0
  ) {
    return;
  }

  const record: VendingRecord = {
    id: this.nextId,
    name,
    location,
    stock,
    type: this.machineType,
    status: stock <= 10 ? '缺货' : '正常'
  };

  this.records = [record, ...this.records];
  this.nextId += 1;
  this.nameText = '';
  this.locationText = '';
  this.stockText = '';
}

如果初始库存小于或等于 10,系统会自动将设备标记为"缺货"。

实现快速补货

点击"补货 +20"按钮后,设备库存增加 20,同时将状态恢复为正常:

ts 复制代码
private restock(id: number): void {
  this.records = this.records.map((item: VendingRecord) => {
    if (item.id === id) {
      return {
        id: item.id,
        name: item.name,
        location: item.location,
        stock: item.stock + 20,
        type: item.type,
        status: '正常'
      };
    }

    return item;
  });
}

这里使用 map 创建新数组,使 ArkUI 能够自动刷新设备卡片和统计数据。

上报故障和完成维修

点击"上报故障"可以将设备标记为故障。维修完成后,再次点击按钮即可恢复设备状态:

ts 复制代码
private toggleFault(id: number): void {
  this.records = this.records.map((item: VendingRecord) => {
    if (item.id === id) {
      const status: string =
        item.status === '故障'
          ? (item.stock <= 10 ? '缺货' : '正常')
          : '故障';

      return {
        id: item.id,
        name: item.name,
        location: item.location,
        stock: item.stock,
        type: item.type,
        status
      };
    }

    return item;
  });
}

维修完成后,系统还会检查库存。如果库存不足,设备恢复为缺货状态;否则恢复为正常状态。

筛选设备记录

页面可以按运行状态筛选售货机:

ts 复制代码
private getFilteredRecords(): VendingRecord[] {
  if (this.filterType === '库存不足') {
    return this.records.filter(
      (item: VendingRecord) => item.status === '缺货'
    );
  }

  if (this.filterType === '设备故障') {
    return this.records.filter(
      (item: VendingRecord) => item.status === '故障'
    );
  }

  if (this.filterType === '运行正常') {
    return this.records.filter(
      (item: VendingRecord) => item.status === '正常'
    );
  }

  return this.records;
}

筛选按钮封装如下:

ts 复制代码
@Builder
FilterButton(text: string) {
  Button(text)
    .height(34)
    .layoutWeight(1)
    .fontSize(12)
    .fontColor(this.filterType === text ? Color.White : '#344054')
    .backgroundColor(
      this.filterType === text ? '#0891B2' : '#E8EEF7'
    )
    .borderRadius(8)
    .onClick(() => {
      this.filterType = text;
    });
}

在页面中调用:

ts 复制代码
Row({ space: 8 }) {
  this.FilterButton('全部');
  this.FilterButton('库存不足');
  this.FilterButton('设备故障');
  this.FilterButton('运行正常');
}
.width('100%');

统计设备状态

使用 filter 统计指定状态的设备数量:

ts 复制代码
private getCount(status: string): number {
  return this.records.filter(
    (item: VendingRecord) => item.status === status
  ).length;
}

页面顶部展示设备总数、库存不足和设备故障数量:

ts 复制代码
this.StatCard(
  '设备总数',
  `${this.records.length}`,
  '#0891B2',
  '#ECFEFF'
);

this.StatCard(
  '库存不足',
  `${this.getCount('缺货')}`,
  '#D97706',
  '#FFF7E8'
);

this.StatCard(
  '设备故障',
  `${this.getCount('故障')}`,
  '#D92D20',
  '#FEE4E2'
);

计算设备在线率

设备在线率可以根据故障设备数量动态计算:

ts 复制代码
const onlineRate: number =
  this.records.length === 0
    ? 0
    : Math.round(
        (this.records.length - this.getCount('故障')) /
        this.records.length *
        100
      );

在页面顶部显示在线率,可以让管理人员快速了解校园售货机的整体运行情况。

设置状态颜色

不同状态使用不同颜色进行区分:

ts 复制代码
private getStatusColor(status: string): ResourceColor {
  if (status === '正常') {
    return '#059669';
  }

  if (status === '缺货') {
    return '#D97706';
  }

  return '#D92D20';
}

颜色含义如下:

  • 绿色:设备运行正常
  • 橙色:库存不足,需要补货
  • 红色:设备发生故障
  • 青色:页面主要操作和统计信息

删除设备记录

不再使用的售货机可以从列表中删除:

ts 复制代码
private deleteRecord(id: number): void {
  this.records = this.records.filter(
    (item: VendingRecord) => item.id !== id
  );
}

删除后,设备列表和顶部统计数据会同时更新。

使用列表渲染设备

使用 ListForEach 渲染筛选后的设备记录:

ts 复制代码
List({ space: 10 }) {
  ForEach(
    this.getFilteredRecords(),
    (item: VendingRecord) => {
      ListItem() {
        this.MachineCard(item)
      }
    },
    (item: VendingRecord) => item.id.toString()
  );
}
.width('100%')
.layoutWeight(1)
.scrollBar(BarState.Off);

每个售货机使用独立卡片展示,卡片中包含设备名称、位置、类型、库存、状态和操作按钮。

页面设计说明

应用采用青色作为主题色,突出智能设备管理的感觉。

页面主要分为以下区域:

  1. 顶部标题和在线率区域
  2. 设备状态统计区域
  3. 售货机登记区域
  4. 状态筛选区域
  5. 设备运行记录区域

卡片采用白色背景,页面背景使用浅灰色。正常、缺货和故障状态分别使用绿色、橙色和红色,方便快速识别异常设备。

SDK 配置

本项目使用 HarmonyOS API 24,满足 API 23 及以上要求:

json5 复制代码
{
  "name": "default",
  "compatibleSdkVersion": "6.1.1(24)",
  "runtimeOS": "HarmonyOS",
  "targetSdkVersion": "6.1.1(24)",
  "compileSdkVersion": "6.1.1(24)"
}

entry 模块中的 runtimeOS 也需要保持一致:

json5 复制代码
{
  "apiType": "stageMode",
  "targets": [
    {
      "name": "default",
      "runtimeOS": "HarmonyOS"
    }
  ]
}

运行项目

使用 DevEco Studio 打开项目,然后找到页面文件:

text 复制代码
entry/src/main/ets/pages/Index.ets

等待项目同步完成,点击右侧 Preview 按钮即可查看页面运行效果。

如果修改代码后预览页面没有变化,可以点击 Preview 窗口中的刷新按钮。

项目总结

本文使用 HarmonyOS 和 ArkTS 实现了一个校园自动售货机库存与补货记录应用。

项目实现了设备登记、类型选择、库存预警、快速补货、故障上报、维修完成、状态筛选、数据统计和删除等功能。

通过这个项目可以掌握:

  • ArkTS 接口定义
  • @State 状态管理
  • TextInput 输入组件
  • ListForEach 列表渲染
  • mapfilter 数组操作
  • 条件判断和状态切换
  • 自定义 @Builder 组件
  • HarmonyOS 页面布局
  • 简单的库存与设备状态管理

后续还可以加入商品明细、库存消耗记录、自动补货提醒、设备地图、销售额统计和本地数据持久化等功能。

相关推荐
世人万千丶15 小时前
鸿蒙Flutter TextStyle样式配置
学习·flutter·harmonyos·鸿蒙
不肥嘟嘟右卫门18 小时前
鸿蒙原生ArkTS布局方式之LazyForEach懒加载布局深度解析
华为·harmonyos
程序员黑豆19 小时前
鸿蒙开发入门:以 Text 组件为例,掌握内置组件用法
前端·harmonyos
xd18557855519 小时前
道歉话术生成:基于鸿蒙生态的智能情感沟通助手
人工智能·华为·harmonyos·鸿蒙
程序员黑豆20 小时前
鸿蒙应用开发之模拟器安装与使用教程
前端·harmonyos
SameX21 小时前
HarmonyOS 用 relationalStore 做本地数据库的完整实战 —— 一个真实项目的 5 个决策
harmonyos
绝世番茄1 天前
鸿蒙原生 ArkTS 布局方式之 Button+Shake 抖动按钮实战全解
华为·harmonyos·鸿蒙
●VON1 天前
鸿蒙 PC Markdown 编辑器换行兼容:LF、CRLF 与混合换行归一化
华为·架构·编辑器·harmonyos·鸿蒙
qizayaoshuap1 天前
# [特殊字符] 骰子模拟器 — 鸿蒙ArkTS随机算法与动画系统设计
算法·华为·harmonyos