鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备
-
工具安装:
- 下载安装DevEco Studio 4.0+(支持HarmonyOS 5)
- 配置HarmonyOS SDK 5.0+
- 确保Node.js版本≥14
-
项目初始化:
ohpm init @harmony/hospital-report-app
二、核心功能模块实现
1. 报告列表展示
// ReportList.ets
@Component
struct ReportList {@State reports: Array<ReportItem> = []@State isLoading: boolean = trueaboutToAppear() {this.fetchReports()}async fetchReports() {try {const result = await ReportService.getReportList()this.reports = result.data} catch (error) {logger.error('获取报告列表失败', error)} finally {this.isLoading = false}}build() {Column() {if (this.isLoading) {LoadingProgress()} else {List({ space: 12 }) {ForEach(this.reports, (item) => {ListItem() {ReportCard({ report: item }).onClick(() => {router.pushUrl({url: 'pages/ReportDetail',params: { reportId: item.id }})})}})}}}}
}
2. 报告详情查看
// ReportDetail.ets
@Component
struct ReportDetail {@State report: MedicalReport = null@State isImageLoading: boolean = falseaboutToAppear() {const params = router.getParams()this.loadReportDetail(params['reportId'])}async loadReportDetail(reportId: string) {this.isImageLoading = truetry {this.report = await ReportService.getReportDetail(reportId)} finally {this.isImageLoading = false}}build() {Column() {// 报告基本信息ReportHeader({ report: this.report })// PDF报告查看if (this.report?.fileType === 'pdf') {PDFViewer({ src: this.report.fileUrl,controller: this.pdfController})}// 图片报告查看else if (this.report?.fileType === 'image') {Stack() {Image(this.report.fileUrl).width('100%').objectFit(ImageFit.Contain)if (this.isImageLoading) {LoadingProgress()}}}// 分享按钮Button('分享报告', { type: ButtonType.Capsule }).onClick(() => this.shareReport())}}
}
三、HarmonyOS 5特色功能集成
1. 分布式报告共享
// 跨设备分享报告
async function shareToOtherDevice(report: MedicalReport) {try {const devices = deviceManager.getAvailableDeviceListSync([DeviceType.SMART_PHONE])const result = await featureAbility.startAbilityForResult({deviceId: devices[0].deviceId,bundleName: 'com.example.medical',abilityName: 'ReportReceiverAbility',parameters: {reportData: JSON.stringify(report),action: 'shareReport'}})logger.info('分享结果:', result)} catch (error) {logger.error('跨设备分享失败', error)}
}
2. 原子化服务入口
// module.json5配置
{"abilities": [{"name": "QuickViewAbility","srcEntry": "./ets/quickview/QuickView.ets","label": "快速查看","icon": "$media:icon","startWindowIcon": "$media:icon","exported": true,"skills": [{"actions": ["action.system.view","action.medical.report.view"],"uris": [{"scheme": "medicalreport","host": "quickview"}]}]}]
}
3. 卡片服务实现
// ReportCard.ets
@Component
export struct ReportCard {@Prop report: ReportItem@State isFavorite: boolean = falsebuild() {Column() {Row() {Image(this.report.typeIcon).width(24).height(24)Text(this.report.name).fontSize(16).fontWeight(FontWeight.Medium)Blank()Image($r('app.media.favorite')).visibility(this.isFavorite ? Visibility.Visible : Visibility.None)}Divider()Row() {Text('检查日期:').fontColor('#666')Text(this.report.date).margin({ left: 8 })}// 更多报告信息...}.onClick(() => {postCardAction(this, {action: 'router',abilityName: 'ReportDetailAbility',params: { reportId: this.report.id }})})}
}
四、数据安全与管理
1. 加密存储敏感数据
// 使用HarmonyOS加密API
import cryptoFramework from '@ohos.security.cryptoFramework';async function encryptReportData(data: string): Promise<string> {try {const cipher = cryptoFramework.createCipher('RSA1024|PKCS1');await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, publicKey);const input: cryptoFramework.DataBlob = { data: stringToUint8Array(data) };const output = await cipher.doFinal(input);return uint8ArrayToString(output.data);} catch (error) {logger.error('加密失败:', error);throw error;}
}
2. 数据库操作
// 使用关系型数据库存储报告缓存
const STORE_CONFIG = {name: 'medical_reports.db',securityLevel: relationalStore.SecurityLevel.S4, // 最高安全级别encryptKey: new Uint8Array(32) // 32字节加密密钥
};relationalStore.getRdbStore(context, STORE_CONFIG, (err, store) => {if (err) {logger.error('数据库初始化失败:', err);return;}// 创建报告表store.executeSql(`CREATE TABLE IF NOT EXISTS reports (id TEXT PRIMARY KEY,patient_id TEXT,report_data TEXT,created_time INTEGER)`);
});
五、UI/UX设计实现
1. 医疗风格主题
// resources/base/theme/medical_theme.json
{"color": {"medical_primary": "#1a73e8","medical_secondary": "#34a853","medical_warning": "#fbbc05","medical_danger": "#ea4335"},"font": {"medical_title": {"size": 20,"weight": 500},"medical_body": {"size": 14,"weight": 400}}
}
2. 报告分类导航
// ReportCategory.ets
@Component
struct ReportCategory {@State categories: Array<Category> = [{ id: 'lab', name: '检验报告', icon: 'lab' },{ id: 'image', name: '影像报告', icon: 'radiology' },{ id: 'pathology', name: '病理报告', icon: 'microscope' }]build() {GridRow({ columns: 4, gutter: 8 }) {ForEach(this.categories, (category) => {GridCol({ span: 1 }) {Column() {Image($r(`app.media.${category.icon}`)).width(48).height(48)Text(category.name).margin({ top: 8 })}.onClick(() => this.filterByCategory(category.id))}})}}
}
六、测试与发布
1. 单元测试示例
// ReportService.test.ets
describe('ReportService Test', () => {beforeAll(() => {// 初始化测试环境});it('should fetch report list successfully', async () => {const mockData = [{ id: '1', name: '血常规' }];jest.spyOn(http, 'request').mockResolvedValue({ data: mockData });const result = await ReportService.getReportList();expect(result).toEqual(mockData);});it('should handle network error', async () => {jest.spyOn(http, 'request').mockRejectedValue(new Error('Network Error'));await expect(ReportService.getReportList()).rejects.toThrow('获取报告列表失败');});
});
2. 应用发布准备
-
签名配置:
hdc appmode install --signature [签名文件] --bundle-name [包名]
-
上架华为应用市场:
- 准备医疗类应用特殊资质文件
- 确保符合《移动医疗应用数据安全规范》
- 提交隐私合规审查
七、性能优化建议
-
报告图片懒加载:
// LazyImage.ets @Component struct LazyImage {@Prop src: string@State isLoaded: boolean = falsebuild() {Stack() {if (this.isLoaded) {Image(this.src).onComplete(() => this.isLoaded = true)} else {Placeholder()}}} }
-
数据预加载:
// 在用户登录后预加载常用报告 UserService.onLogin(() => {ReportService.prefetchReports(); });
-
缓存策略:
// 使用两级缓存 const CACHE_STRATEGY = {memoryCache: new Map<string, any>(),diskCache: new PreferencesCache(),async get(key: string) {if (this.memoryCache.has(key)) {return this.memoryCache.get(key);}const diskData = await this.diskCache.get(key);if (diskData) this.memoryCache.set(key, diskData);return diskData;} };
通过以上实现,您可以构建一个符合HarmonyOS 5设计规范、功能完善的医院报告查看小程序,充分利用鸿蒙的分布式能力和安全特性,为患者提供安全便捷的报告查询体验。
相关文章:
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...