如何通过HarmonyOS开发下肢康复外骨骼系统

news2024/12/23 18:09:12

项目介绍

我们的项目是由硬件和软件两部分组成。硬件由下肢康复外骨骼对患者进行康复训练。软件部分为鸿蒙APP根据评估患者的结果进行推送,推送的康复动作视频指导患者对康复动作进行及时的纠正和改善,从而使患者的康复效率得到提高。在训练结束后,会对其训练过程中的数据进行整理分析,发送到我们数据展示页面中,能够将患者延续性护理的状况,如平衡能力的提升,走路稳定性的提升,病情在日周月的变化趋势,让患者看到自己病情的变换情况,对脑卒中偏瘫的再次复发起到预防作用。

开发环境

DevEco Studio版本:DevEco Studio 3.1 Release

HarmonyOS SDK版本:3.1.0(API version9)

DAYU200.4.0.10.16

主要开发功能

账号的注册

注册页面使用了按钮、输入框组件、弹窗组件等组件。弹窗组件是为了提示账号已经注册成功可以正常使用。

 Text("注册账号")
  .fontSize(50)
  .fontWeight(FontWeight.Bold)
  .margin(20)
TextInput({placeholder:'请输入你的手机号或者邮箱'})
  .placeholderColor("rgb(105,105,105)")
  .placeholderFont({size:20,weight:120,family:'cursive'})
  .height(50)
  .width('80%')
  .fontSize(30)
  .fontWeight(FontWeight.Bold)
  .margin({top:30})
TextInput({placeholder:'请输入你的密码'})
  .type(InputType.Password)
  .placeholderColor("rgb(105,105,105)")
  .placeholderFont({size:20,weight:120,family:'cursive'})
  .height(50)
  .width('80%')
  .fontSize(30)
  .fontWeight(FontWeight.Bold)
  .margin({top:30})
TextInput({placeholder:'请再次确定你的密码'})
  .type(InputType.Password)
  .placeholderColor("rgb(105,105,105)")
  .placeholderFont({size:20,weight:120,family:'cursive'})
  .height(50)
  .width('80%')
  .fontSize(30)
  .fontWeight(FontWeight.Bold)
  .margin({top:30})
Button("确定注册")
  .height(50)
  .width(180)
  .backgroundColor("#66CDCA")
  .margin({top:40})
  .onClick(() => {
    AlertDialog.show(
      {
        title: '注册账号',
        message: '账号注册成功',
        confirm: {
          value: '确定',
          action: () => {
            console.info('通过')
          }
        },
        cancel: () => {
          console.info('结束')
        }
      }
    )
  })
Button("返回登录")
  .height(50)
  .width(180)
  .backgroundColor("#66CDCA")
  .margin({top:40})
  .onClick(()=>{
    router.pushUrl({
      url:'pages/login',
    })})

图2 注册成功页面

账号的登录

登录界面使用了,输入框、按钮和单选框。同时还使用了一个条件判断,根据usernam_rag正则表达式验证用户名格式,如果不符合要求则显示错误提示。

 Image("/common/images/logo.jpg")
                      .width(100).height(100)
                    Column({ space: 5 }) {
                      Text("下肢康复系统")
                        .fontSize(45)
                      Text("登录账号以使用更多服务")
                        .fontSize(20).opacity(0.5)
                    }

    TextInput({ placeholder: "请输入账号",text:this.username })
      .height(50)
      .width("85%")
    if(this.username_rag.test(this.username)){
      Text("用户名至少输入五位")
        .fontSize(12)
        .fontWeight(700)
        .fontColor("#ff0000")
        .width("80%")
    }

    TextInput({ placeholder: "请输入密码", text: this.password })
      .type(InputType.Password)
      .height(50)
      .width("85%")
    Row() {
      Button("短信验证码登录")
        .width(180).height(30).backgroundColor("#ffffff").fontColor("#0d110e")
      Button("忘记密码")
        .width(150).height(30).backgroundColor("#ffffff").fontColor("#0d110e")

    }
    .justifyContent(FlexAlign.SpaceBetween).width("100%")

    Button("登录")
      .width(180).height(50).backgroundColor("#66CDCA")
      .onClick(()=>{
        router.pushUrl({
        url:'pages/my'
      })})
    Button("注册账号")
      .width(180).height(50).backgroundColor("#66CDCA")
      .onClick(()=>{
        router.pushUrl({
        url:'pages/register'
      })})
    Row({ space: 50 }) {
      Column({space:5}) {
        Button("QQ")
          .width(60).height(60).backgroundColor("#66CDCA").fontSize(10)
        Text('QQ登录')
          .fontSize(15)
      }
      Column({space:5}) {
        Button("微信")
          .width(60).height(60).backgroundColor("#66CDCA").fontSize(10)
        Text('微信登录')
          .fontSize(15)
      }
      Column({space:5}) {
        Button("微博")
          .width(60).height(60).backgroundColor("#66CDCA").fontSize(10)
        Text('微博登录')
          .fontSize(15)
      }
    }

点击同意隐私协议

Checkbox({name: 'checkbox2'})
    .select(false)
    .selectedColor('#66CDCA')
  Text("请同意《服务条款》《隐私政策》《儿童隐私政策》")
    .fontSize(15).fontColor("rgb(105,105,105)")

图3 登录页面

使用了一个条件判断,根据usernam_rag正则表达式验证用户名格式,如果用户名输入少于五位就会出现提示如上图

private username_rag = /^[A-Za-z0-9]{5,8}$/;
if(this.username_rag.test(this.username)){
  Text("用户名至少输入五位")
    .fontSize(12)
    .fontWeight(700)
    .fontColor("#ff0000")
    .width("80%")
}

评估功能

在评估页面,使用了轮播图组件,用于展示评估不同方面的问卷,并且通过ForEach方法遍历imageSrc数组。在实现的过程中,定义了一个ImageData的类,并且在构造initializeImageData的函数中,对这个类的三个属性:ID(图片的表示),img(图片资源)和name(图片名称),进行赋值。而且还定义了两个私有属性,imgSrc:用于储存数据数组,swiperController:用于控制轮播功能。

export class ImageData {
  id: string
  img: Resource
  name: string

  constructor(id: string, img: Resource, name: string) {
    this.id = id // 图片唯一表示
    this.img = img // 图片资源
    this.name = name // 图片名称
  }
}
export function initializeImageData(): Array<ImageData> {
  let imageDataArray: Array<ImageData> = [
    { "id": "0", "img": $r('app.media.hunmi'), "name": '格拉斯哥昏迷量表' },
    { "id": "1", "img": $r('app.media.huodong'), "name": '卒中病人运动能力评估表' },
    { "id": "2", "img": $r('app.media.chifan'), "name": '日常生活活动能立量表' },
    {"id":"3","img":$r('app.media.pingheng'), "name":'Berg平衡能力量表'}
  ]
  return imageDataArray
}
@Entry
@Component
struct Index {
  private imageSrc: ImageData[] = initializeImageData()
  private swiperController: SwiperController = new SwiperController()

  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Text("脑卒中评估量表")
        .fontSize(60)
        .fontWeight(800)
        .margin(10)
      Swiper(this.swiperController) {
        ForEach(this.imageSrc, item => {
          Image(item.img)
        }, item => item.name)
      }
      .height("60%")
      .width("100%")
      .margin({ top: 0 })

      Row({ space: 60 }) {
        Button('showNext')
          .height(60)
          .width(180)
          .onClick(() => {
            this.swiperController.showNext()
          })
        Button('showPrevious')
          .height(60)
          .width(180)
          .onClick(() => {
            this.swiperController.showPrevious()
          })
      }
      .margin({top:10})
      Text("温馨提示:" +
      "评估分数仅供参考,以病人的实际情况为例")
        .fontColor("#ff0000")
        .margin({top:10})
    }.margin(30)


  }
}

图4 评估页面

通过onClick触发点击图片。入评估问卷界面,通过对页面问题的回答来判断患者具体的身体情况。

 Swiper(this.swiperController) {
        Image($r('app.media.pingheng')).width('85%').height(400).onClick(()=>{  router.push({
          url:'pages/pinggu1',
          params:{aa:'333'}
        })})
        Image($r('app.media.huodong')).width('85%').height(400).onClick(()=>{  router.push({
          url:'pages/pinggu2',
          params:{aa:'444'}

        })})
        Image($r('app.media.chifan')).width('85%').height(400).onClick(()=>{  router.push({
          url:'pages/pinggu3',
          params:{aa:'555'}
        })})
        Image($r('app.media.hunmi')).width('85%').height(400).onClick(()=>{  router.push({
          url:'pages/pinggu4',
          params:{aa:'666'}
        })})
/      }

图5 评估问卷页面

播放康复视频

播放康复视频,让患者随着康复视频一起做动作,从而达到训练的目的。播放视频的页面使用了视频播放器和按钮等组件,也是用了视频源、预览封面、播放倍速、控制器等属性,同时还设置了视频组件的一些行为:静音、自动播放、控制栏显示模式、循环播放等。

Text(this.message)
  .fontSize(50)
  .fontWeight(FontWeight.Bold)
Video({
  src: $r('app.media.stage21'),
  previewUri: this.previewUris, // 视频封面
  currentProgressRate: this.currentProgressRate, // 视频播放倍速
  controller: this.controller,

})
  .muted(this.muted) // 是否静音
  .autoPlay(this.autoPlay) // 是否自动播放
  .controls(this.controls) // 控制视频播放的控制栏是否显示
  .objectFit(ImageFit.Contain) // 视频显示模式
  .loop(this.loop) // 是否单个视频循环播放
  .height("60%")
  .onStart(() => {
    // 播放时触发该事件
    console.info('onStart');
  })
  .onPause(() => {
    // 暂停时触发该事件
    console.info('onPause');
  })
  .onFinish(() => {
    console.info('onFinish');

  })
  .onError(() => {
    // 播放失败时触发该事件
    console.error('onError');
  })
  .onFullscreenChange((e) => {
    console.info('视频进入和退出全屏时触发该事件:' + e.fullscreen)
  })
  .onPrepared((e) => {
    console.info('视频准备完成时触发该事件:' + e.duration)
  })
  .onSeeking((e) => {
    console.info('操作进度条过程时上报时间信息:' + e.time)
  })
  .onSeeked((e) => {
    console.info('操作进度条完成后,上报播放时间信息:' + e.time)
  })
  .onUpdate((e) => {
    console.info('播放进度变化时触发该事件:' + e.time)
  })
  .height("30%")
Row({}) {
  Flex({ wrap: FlexWrap.Wrap, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) {
    Button("开始训练")
      .height(40)
      .width(180)
      .onClick(() => {
        this.controller.start()
      }).margin(8)
    Button("结束训练")
      .height(40)
      .width(180)
      .onClick(() => {
        this.controller.pause()
      })
  }
  }

图6 康复视频页面

最后

如果你想成为一名鸿蒙开发者,以下这些资料将是十分优质且有价值,让你的鸿蒙开发之路事半功倍!相对于网上那些碎片化的知识内容,这份学习资料的知识点更加系统化,更容易理解和记忆。

内容包含了:【OpenHarmony多媒体技术、Stage模型、ArkUI多端部署、分布式应用开发、音频、视频、WebGL、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战】等技术知识点。

鸿蒙Next全套VIP学习资料←点击领取!(安全链接,放心点击

1.鸿蒙核心技术学习路线

2.大厂面试必问面试题

3.鸿蒙南向开发技术

 4.鸿蒙APP开发必备

 5.HarmonyOS Next 最新全套视频教程

 6.鸿蒙生态应用开发白皮书V2.0PDF

这份全套完整版的学习资料已经全部打包好,朋友们如果需要可以点击→鸿蒙Next全套VIP学习资料:免费领取(安全链接,放心点击

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

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

相关文章

Java学习-MyBatis学习(二)

代码下载 MyBatis核心配置文件 jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://192.168.29.201:3306/mybatis jdbc.usernameroot jdbc.password123456<configuration><!-- environments&#xff1a;配置多个连接数据库环境default&#xff1a;默认使用的…

【稳定检索/投稿优惠】2024年心理健康与社会科学国际会议(MHSS 2024)

2024 International Conference on Mental Health and Social Sciences 2024年心理健康与社会科学国际会议 【会议信息】 会议简称&#xff1a;MHSS 2024截稿时间&#xff1a;点击查看大会地点&#xff1a;中国三亚会议官网&#xff1a;www.icmhss.com会议邮箱&#xff1a;mhs…

怎么只读USB存储设备?教你两种方法

电脑的USB可以帮助我们连接各种设备&#xff0c;比如移动存储设备。而只读USB则可以保护电脑数据和移动存储设备中的设备。那么&#xff0c;怎么只读USB存储设备&#xff1f;下面我们就一起来了解一下吧。 USB设备只读加密 USB设备只读加密可以在不影响移动存储设备正常使用的…

和数集团最新人事任命通知

根据集团战略发展规划&#xff0c;为进一步拓展业务领域&#xff0c;优化组织架构&#xff0c;完善客户服务&#xff0c;经公司研究决定&#xff0c;现对以下人事进行任命&#xff1a; 任命徐敬东为和数研究院院长 任命李晓峰为常务副总经理 任命陈善明为市场总监 任命窦晓…

深入理解Python多进程

目录 一、引言 二、Python多进程基础 进程与线程的区别 Python多进程模块 三、Python多进程实现原理 进程创建 进程间通信 进程同步 四、Python多进程使用方法 创建进程 进程间通信 五、实战案例 六、总结 一、引言 在Python编程中&#xff0c;多进程是一种重…

C脚本实现用键盘按键控制Wincc某按钮动作

文章目录 前言一、创建Wincc画面并添加变量及按钮二、在“事件”-“键盘”下&#xff0c;编写“按下”和“释放”的C脚本 前言 在某些特定场景下&#xff0c;需要通过电脑键盘控制上位机界面上按钮按下或释放&#xff0c;本文给出了基于C脚本的解决方案。 一、创建Wincc画面并…

commit过大文件,导致push失败如何解决

1、查看过大文件是谁 2、使用该命令删除过大文件 git filter-branch --force --index-filter git rm -rf --cached --ignore-unmatch 文件名 --prune-empty --tag-name-filter cat -- --all 例如&#xff1a; git filter-branch --force --index-filter git rm -rf --cached --…

PlugLink:让数据分析与工作流无缝连接(附源码)

PlugLink&#xff1a;让数据分析与工作流无缝连接 引言 数据分析和自动化工作流已成为各个企业和个人提高效率的关键手段。今天&#xff0c;我要介绍一款名为PlugLink的工具&#xff0c;它不仅能帮助你轻松进行数据分析&#xff0c;还能将这些分析结果无缝连接到你的工作流中&…

洛谷 P4913 二叉树深度(递归)

题目描述 有一个 &#x1d45b;(&#x1d45b;≤10^6) 个结点的二叉树。给出每个结点的两个子结点编号&#xff08;均不超过 &#x1d45b;&#xff09;&#xff0c;建立一棵二叉树&#xff08;根节点的编号为 1&#xff09;&#xff0c;如果是叶子结点&#xff0c;则输入 0。…

【大模型应用开发极简入门】提示工程二:零样本学习、少样本学习与改善提示效果

文章目录 一. 逐步思考&#xff1a;零样本思维链1. 数学计算推理2. 注意有效的方面 二. 少样本学习1. 基于提示词示例的学习2. 单样本学习 三. 改善提示效果1.指示模型提出更多问题2.格式化输出3.重复指示4.使用负面提示5. 添加长度限制 一. 逐步思考&#xff1a;零样本思维链 …

AI大模型的战场:通用大模型与垂直大模型的对决

引言 随着人工智能技术的不断进步&#xff0c;AI大模型在各个领域的应用也日益广泛。如今&#xff0c;AI大模型的战场正在分化&#xff0c;主要分为通用大模型和垂直大模型两个方向。通用大模型由于其适用范围广泛&#xff0c;在落地场景中占据了较大的优势。而垂直大模型则凭…

python3的基本语法说明三

一. 简介 前面几篇文章简单学习了 python3的基本语法&#xff0c;文章如下&#xff1a; python3的基本语法说明一-CSDN博客 python3的基本语法说明二-CSDN博客 本文继续学习 python3的基本语法。 二. python3 的基本语法 1. 等待用户输入 执行下面的程序在按回车键后就会…

就业班 第四阶段(k8s) 2401--6.11 day5 CICD实践+VPN+LDAP域管理+还有一些云产品

CICD项目实践&#xff08;扩展&#xff09; RBAC 角色&#xff1a;role 用户&#xff1a;user 角色绑定&#xff1a;rolebinding 需要自己指定好名称空间&#xff0c;只对某个名称空间有权限 集群角色&#xff1a;clusterrole 集群角色绑定&#xff1a;clusterrolebindin…

[初阶数据结构] 包装类 | 泛型

目录 一. 包装类 1.1 什么是包装类? 1.2 包装类的意义 1.3 基本数据类型与包装类 1.4 装箱 1.5 拆箱 1.6 小总结 二. 泛型 2.1 什么是泛型? 2.2 泛型的意义 2.3 泛型的语法 2.4 泛型的编译 2.4.1 下载插件 2.4.2 分析 2.5 上界 2.6 泛型方法 2.7 小总结 三. 总结 一.…

element-ui将组件默认语言改为中文

在main.js中加入以下代码即可 // 引入 Element Plus 及其样式 import ElementPlus from element-plus import element-plus/dist/index.css// 引入中文语言包 import zhCn from element-plus/es/locale/lang/zh-cn// 使用 Element Plus 并设置语言为中文 app.use(ElementPlus,…

乐鑫ESP32系列SOC技术让设备控制更简单,HMI智能屏方案应用

随着科技的飞速发展&#xff0c;我们的生活方式正在被重新定义。在智能家居领域&#xff0c;人机交互的便捷性和直观性一直是创新的焦点&#xff0c;如今正逐渐成为现实。 乐鑫以其先进的SoC技术&#xff0c;为智能家居行业带来了新的HMI智能屏方案。这一方案不仅集成了高性能…

商用OLED柔性屏,有42、48、55、65和77寸

商用OLED柔性屏在市场上的尺寸选择相对丰富&#xff0c;以下是针对您提到的42、48、55、65和77寸的具体信息&#xff1a; 42寸OLED柔性屏 目前市场上已有42寸的OLED柔性屏产品&#xff0c;如LG的42英寸电视柔性屏OLED&#xff0c;具有可曲直的特性&#xff0c;支持120Hz高刷新…

LogicFlow 学习笔记——1. 初步使用 LogicFlow

什么是 LogicFlow LogicFlow 是一个开源的前端流程图编辑器和工作流引擎&#xff0c;旨在帮助开发者和业务人员在网页端创建、编辑和管理复杂的业务流程和工作流。它提供了一个直观的界面和强大的功能&#xff0c;使得设计和管理工作流变得更加高效和便捷。 官网地址&#xff…

芯品荟 | 会议系统屏驱案例分享

一、产品简介 智能会议系统是一种对声、光、电等各种设备进行集中控制的设备。其可实现对会议过程进行签到、表决、多国语言翻译、现场摄像视像跟踪功能&#xff0c;并对进程中处以发言管理&#xff0c;达到人性化高科技水平&#xff0c;使会议可一键掌控。 系统要做到可方便快…

profiling模型性能分析与优化入门

一、定义 profiler 作用入门pyproftorch.summary/torchinfo 模型参数量分析以及模型可视化profiling 参数分析-模型分析 二、实现 1.profiler 作用&#xff1a;分析模型执行时间,内存占用 CPU/GPU 端Op执行时间统计 CPU/GPU 端Op输入Tensor的维度分析 Op的内存消耗统计 2. 入…