当前位置: 首页 > article >正文

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

一、项目初始化与配置

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 = falsebuild() {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 = truetry {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 = currentthis.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 = valuethis.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的分布式能力和支付服务,为用户提供便捷的生活缴费体验。

相关文章:

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

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

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

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

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

PL0语法,分析器实现!

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

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

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

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

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

Ascend NPU上适配Step-Audio模型

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

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

【Java_EE】Spring MVC

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

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

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

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

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

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…...