鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

news2025/6/12 19:44:56

一、项目初始化与配置

1. 创建项目

ohpm init @harmony/utility-payment-app

2. 配置权限

// module.json5
{
  "requestPermissions": [
    {
      "name": "ohos.permission.INTERNET"
    },
    {
      "name": "ohos.permission.GET_NETWORK_INFO"
    },
    {
      "name": "ohos.permission.ACCESS_BILLING_SERVICE"
    }
  ]
}

二、核心功能实现

1. 电费账户绑定模块

// AccountBinding.ets
@Component
struct AccountBinding {
  @State accountInfo: ElectricAccount = {
    accountNumber: '',
    region: '',
    address: ''
  }

  @State regions: Array<string> = ['北京', '上海', '广州', '深圳']
  @State isLoading: boolean = false

  build() {
    Column() {
      Form({ labelPosition: 'fixed' }) {
        FormItem({ label: '地区选择' }) {
          Select(this.accountInfo.region)
            .options(this.regions.map(region => ({ value: region })))
            .onSelect((index) => {
              this.accountInfo.region = this.regions[index]
            })
        }

        FormItem({ label: '电费账号' }) {
          TextInput({ placeholder: '请输入电费账号' })
            .onChange((value) => this.accountInfo.accountNumber = value)
        }

        FormItem({ label: '用电地址' }) {
          TextInput({ placeholder: '请输入详细地址' })
            .onChange((value) => this.accountInfo.address = value)
        }
      }

      Button('绑定账户', { type: ButtonType.Capsule })
        .width('90%')
        .margin(20)
        .onClick(() => this.bindAccount())
        .enabled(!this.isLoading && this.validateForm())

      if (this.isLoading) {
        LoadingProgress()
          .margin({ top: 20 })
      }
    }
  }

  async bindAccount() {
    this.isLoading = true
    try {
      await ElectricService.bindAccount(this.accountInfo)
      router.replace({ url: 'pages/Home' })
    } catch (error) {
      prompt.showToast({ message: '绑定失败: ' + error.message })
    } finally {
      this.isLoading = false
    }
  }
}

2. 电费查询功能

// BillQuery.ets
@Component
struct BillQuery {
  @State currentBill: ElectricBill = null
  @State historyBills: Array<ElectricBill> = []
  @State selectedMonth: string = this.getDefaultMonth()

  aboutToAppear() {
    this.loadBills()
  }

  async loadBills() {
    try {
      const [current, history] = await Promise.all([
        ElectricService.getCurrentBill(),
        ElectricService.getHistoryBills()
      ])
      this.currentBill = current
      this.historyBills = history
    } catch (error) {
      logger.error('获取账单失败:', error)
    }
  }

  build() {
    Column() {
      // 当前账单卡片
      BillCard({ 
        bill: this.currentBill,
        type: 'current'
      })

      // 历史账单查询
      Text('历史账单查询')
        .fontSize(18)
        .margin({ top: 20, bottom: 10 })
      
      MonthPicker({
        selected: this.selectedMonth,
        onAccept: (value) => {
          this.selectedMonth = value
          this.queryHistoryBill(value)
        }
      })

      List() {
        ForEach(this.historyBills, (bill) => {
          ListItem() {
            BillCard({ 
              bill: bill,
              type: 'history'
            })
          }
        })
      }
      .layoutWeight(1)
    }
  }
}

3. 电费缴纳功能

// Payment.ets
@Component
struct Payment {
  @State paymentAmount: number = 0
  @State paymentMethods: Array<PaymentMethod> = [
    { id: 'alipay', name: '支付宝', icon: 'alipay' },
    { id: 'wechat', name: '微信支付', icon: 'wechat' },
    { id: 'unionpay', name: '银联支付', icon: 'unionpay' }
  ]
  @State selectedMethod: string = 'alipay'

  build() {
    Column() {
      // 金额输入
      TextInput({ placeholder: '输入缴费金额' })
        .type(InputType.Number)
        .onChange((value) => this.paymentAmount = Number(value))
        .margin(20)

      // 支付方式选择
      Text('选择支付方式')
        .fontSize(16)
        .margin({ left: 20, top: 10, bottom: 10 })
      
      GridRow({ columns: 3 }) {
        ForEach(this.paymentMethods, (method) => {
          GridCol() {
            Column() {
              Image($r(`app.media.${method.icon}`))
                .width(60)
                .height(60)
              Text(method.name)
                .margin({ top: 5 })
            }
            .border({
              width: this.selectedMethod === method.id ? 2 : 0,
              color: '#1a73e8'
            })
            .onClick(() => this.selectedMethod = method.id)
          }
        })
      }
      .margin(20)

      // 确认支付按钮
      Button('确认支付', { type: ButtonType.Capsule })
        .width('90%')
        .margin(20)
        .enabled(this.paymentAmount > 0)
        .onClick(() => this.confirmPayment())
    }
  }

  async confirmPayment() {
    try {
      const result = await PaymentService.createPayment({
        amount: this.paymentAmount,
        method: this.selectedMethod
      })
      
      if (result.success) {
        router.push({
          url: 'pages/PaymentResult',
          params: { success: true }
        })
      }
    } catch (error) {
      prompt.showToast({ message: '支付失败: ' + error.message })
    }
  }
}

三、HarmonyOS 5特色功能集成

1. 分布式缴费提醒

// 跨设备同步缴费提醒
function syncPaymentReminder(account: ElectricAccount) {
  const devices = deviceManager.getTrustedDeviceListSync()
  devices.forEach(device => {
    featureAbility.startAbility({
      deviceId: device.deviceId,
      bundleName: 'com.example.utility',
      abilityName: 'ReminderAbility',
      parameters: {
        type: 'electric',
        account: account.accountNumber,
        balance: account.balance
      }
    })
  })
}

2. 原子化服务快捷缴费

// QuickPayment.ets
@Entry
@Component
struct QuickPayment {
  @State quickAmounts: number[] = [50, 100, 200, 500]

  build() {
    Column() {
      Text('快捷缴费')
        .fontSize(20)
        .margin({ bottom: 20 })

      GridRow({ columns: 2 }) {
        ForEach(this.quickAmounts, (amount) => {
          GridCol() {
            Button(`${amount}元`, { type: ButtonType.Normal })
              .height(80)
              .margin(10)
              .onClick(() => this.startQuickPayment(amount))
          }
        })
      }
    }
  }

  startQuickPayment(amount: number) {
    router.push({
      url: 'pages/Payment',
      params: { amount }
    })
  }
}

3. 缴费记录卡片服务

// config.json卡片配置
{
  "forms": [
    {
      "name": "PaymentCard",
      "description": "电费缴费卡片",
      "type": "JS",
      "jsComponentName": "PaymentCard",
      "colorMode": "auto",
      "isDefault": true,
      "updateEnabled": true,
      "scheduledUpdateTime": "08:00",
      "updateDuration": 1,
      "defaultDimension": "2 * 2",
      "supportDimensions": ["2 * 2", "2 * 4"]
    }
  ]
}

四、数据安全与支付处理

1. 支付安全处理

// PaymentService.ets
import payment from '@ohos.iap';

class PaymentService {
  static async createPayment(params: PaymentParams) {
    try {
      const result = await payment.purchase({
        productId: 'electric_payment',
        amount: params.amount,
        currency: 'CNY',
        extraInfo: {
          account: params.account
        }
      })
      
      if (result.paymentState === payment.PaymentState.SUCCESS) {
        await this.verifyPayment(result.purchaseToken)
        return { success: true }
      }
    } catch (error) {
      logger.error('支付处理失败:', error)
      throw error
    }
  }
}

2. 数据加密存储

// 使用HarmonyOS加密API存储敏感信息
import cryptoFramework from '@ohos.security.cryptoFramework';

async function encryptAccountData(account: ElectricAccount) {
  const cipher = cryptoFramework.createCipher('AES256|GCM|PKCS7')
  await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, secretKey)
  
  const input: cryptoFramework.DataBlob = {
    data: stringToUint8Array(JSON.stringify(account))
  }
  
  const output = await cipher.doFinal(input)
  return output.data
}

五、UI/UX优化设计

1. 用电数据可视化

// ConsumptionChart.ets
@Component
struct ConsumptionChart {
  @Prop consumptionData: Array<ConsumptionPoint>

  build() {
    Canvas(this.context) {
      ForEach(this.consumptionData, (item, index) => {
        Path()
          .width(20)
          .height(item.value * 2)
          .fill(getColorByUsage(item.value))
          .position({ x: index * 30 + 10, y: 200 - item.value * 2 })
        
        Text(item.month)
          .position({ x: index * 30 + 10, y: 210 })
      })
    }
    .height(250)
    .margin(20)
  }
}

2. 主题配色方案

// resources/base/theme/electric_theme.json
{
  "color": {
    "electric_primary": "#1a73e8",
    "electric_secondary": "#34a853",
    "electric_warning": "#fbbc05",
    "electric_danger": "#ea4335",
    "chart_bar": "#4285f4",
    "chart_line": "#34a853"
  }
}

六、测试与发布

1. 单元测试示例

// ElectricService.test.ets
describe('ElectricService Test', () => {
  beforeAll(() => {
    jest.mock('@ohos.net.http')
  })

  it('should fetch current bill correctly', async () => {
    const mockBill = { amount: 150.50, dueDate: '2023-11-20' }
    http.request.mockResolvedValue({ data: mockBill })
    
    const result = await ElectricService.getCurrentBill()
    expect(result.amount).toBe(150.50)
  })

  it('should handle payment failure', async () => {
    http.request.mockRejectedValue(new Error('Network Error'))
    
    await expect(ElectricService.payBill(100))
      .rejects
      .toThrow('支付请求失败')
  })
})

2. 应用发布准备

  1. ​签名配置​​:

    hdc appmode install --signature [签名文件] --bundle-name com.example.electric
  2. ​上架华为应用市场​​:

    • 准备支付相关资质文件
    • 确保符合金融类应用合规要求
    • 提交安全扫描报告

七、性能优化建议

  1. ​数据缓存策略​​:

    // 实现两级缓存
    const BillCache = {
      memoryCache: new Map(),
      
      async get(key) {
        if (this.memoryCache.has(key)) {
          return this.memoryCache.get(key)
        }
        
        const diskData = await preferences.get(key)
        if (diskData) {
          this.memoryCache.set(key, diskData)
          return diskData
        }
        
        return null
      },
      
      async set(key, value) {
        this.memoryCache.set(key, value)
        await preferences.set(key, value)
      }
    }
  2. ​预加载关键资源​​:

    // 应用启动时预加载
    aboutToAppear() {
      this.loadLogos()
      this.loadPaymentMethods()
    }
  3. ​按需加载账单详情​​:

    // 懒加载账单详情
    LazyForEach(this.bills, (bill) => {
      BillItem({ bill })
    })

通过以上实现,您可以构建一个功能完善、安全可靠的鸿蒙电费缴纳与查询小程序,充分利用HarmonyOS 5的分布式能力和支付服务,为用户提供便捷的生活缴费体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2407590.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…