鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

news2025/6/12 18:16:24

一、开发环境准备

  1. ​工具安装​​:

    • 下载安装DevEco Studio 4.0+(支持HarmonyOS 5)
    • 配置HarmonyOS SDK 5.0+
    • 确保Node.js版本≥14
  2. ​项目初始化​​:

    ohpm init @harmony/hospital-report-app

二、核心功能模块实现

1. 报告列表展示

// ReportList.ets
@Component
struct ReportList {
  @State reports: Array<ReportItem> = []
  @State isLoading: boolean = true

  aboutToAppear() {
    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 = false

  aboutToAppear() {
    const params = router.getParams()
    this.loadReportDetail(params['reportId'])
  }

  async loadReportDetail(reportId: string) {
    this.isImageLoading = true
    try {
      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 = false

  build() {
    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. 应用发布准备

  1. ​签名配置​​:

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

    • 准备医疗类应用特殊资质文件
    • 确保符合《移动医疗应用数据安全规范》
    • 提交隐私合规审查

七、性能优化建议

  1. ​报告图片懒加载​​:

    // LazyImage.ets
    @Component
    struct LazyImage {
      @Prop src: string
      @State isLoaded: boolean = false
    
      build() {
        Stack() {
          if (this.isLoaded) {
            Image(this.src)
              .onComplete(() => this.isLoaded = true)
          } else {
            Placeholder()
          }
        }
      }
    }
  2. ​数据预加载​​:

    // 在用户登录后预加载常用报告
    UserService.onLogin(() => {
      ReportService.prefetchReports();
    });
  3. ​缓存策略​​:

    // 使用两级缓存
    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设计规范、功能完善的医院报告查看小程序,充分利用鸿蒙的分布式能力和安全特性,为患者提供安全便捷的报告查询体验。

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

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

相关文章

【2025年】解决Burpsuite抓不到https包的问题

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

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

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

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…

高危文件识别的常用算法:原理、应用与企业场景

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

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

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

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

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

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…