6.vue3医疗在线问诊项目 - _极速问诊-订单选择页面 ==> 问诊级别(普通/三甲)、科室选择(一级科室、二级科室)、病情描述、选择患者

news2024/11/25 16:56:41

6.vue3医疗在线问诊项目 - _极速问诊-订单选择页面 ==> 问诊级别(普通/三甲)、科室选择(一级科室、二级科室)、病情描述、选择患者

极速问诊-选择问诊级别-路由{#consult-change-type}

image-20220815133500165

完成选择三甲还是普通问诊页面,点击后记录对应的类型,跳转到选择科室路由

步骤:

  • 路由和组件
  • 点击入口记录极速问诊级别

代码:

1)路由和组件

router/index.ts

{
  path: '/consult/fast',
  component: () => import('@/views/consult/ConsultFast.vue'),
  meta: { title: '极速问诊' }
}

2)点击入口记录极速问诊级别

Consult/ConsultFast.vue

<script setup lang="ts">
import { useConsultStore } from '@/stores'

const store = useConsultStore()
</script>
<router-link to="/consult/dep" class="item"
+             @click="store.setIllnessType(1)">
<router-link to="/consult/dep" class="item"
+             @click="store.setIllnessType(0)">

极速问诊-选择科室-路由{#consult-dep-html}

image-20220824154050319

实现:配置科室选择路由

代码:

  1. 路由与组件

router/index.ts

    {
      path: '/consult/dep',
      component: () => import('@/views/consult/ConsultDep.vue'),
      meta: { title: '选择科室' }
    }
  1. 分析结构

极速问诊-选择科室-业务{#consult-dep-logic}

实现:科室切换以及跳转到病情描述

步骤:

  1. 编写科室需要的类型:父子科室

  2. 准备API函数

  3. 实现一级科室切换

  4. 实现二级科室切换

  5. 跳转时记录科室到问诊记录

代码:

1)编写科室需要的类型 types/consult.d.ts

// 科室
export type SubDep = {
  id: string
  name: string
}
// 一级科室
export type TopDep = SubDep & {
  child: SubDep[]
}

2)准备API函数 api/consult.ts

import type {
  DoctorPage,
  FollowType,
  KnowledgePage,
  KnowledgeParams,
  PageParams,
+  TopDep
} from '@/types/consult'

+ export const getAllDep = () => request.get<TopDep[]>('/dep/all')

3)实现一级科室切换 Consult/ConsultDep.vue

import { getAllDep } from '@/api/consult'
import type { TopDep } from '@/types/consult'
import { onMounted, ref } from 'vue'
// 获取所有科室
const allDep = ref<TopDep[]>([])
onMounted(async () => {
  const res = await getAllDep()
  allDep.value = res.data
})
<van-sidebar v-model="active">
  <van-sidebar-item :title="top.name" v-for="top in allDep" :key="top.id" />
</van-sidebar>

image-20230610210514844

4)实现二级科室切换

<!-- 二级科室,注意:组件初始化没有数据 child 可能拿不到,所以需要在allDepp[active]后面加? -->
<div class="sub-dep">
  <router-link
    @click="store.setDepId(item.id)"
    v-for="item in allDep[active]?.child"
    :key="item.id"
    to="/consult/illness"
    >{{ item.name }}</router-link
  >
</div>

注意❓:使用可选链操作符,解决组件初始化没有数据 child 可能拿不到

image-20221011214333599

5)跳转时记录科室到问诊记录

import { useConsultStore } from '@/stores'

const store = useConsultStore()
        <router-link
          to="/consult/illness"
          v-for="sub in subDep"
          :key="sub.id"
+          @click="store.setDep(sub.id)"
        >
          {{ sub.name }}
        </router-link>

病情描述-路由和表单准备{#illness-html}

image-20220824154141532

实现:路由配置,了解组件以及页面的基础布局(医生提示,描述,症状时间,是否已问诊)

1)路由

    {
      path: '/consult/illness',
      component: () => import('@/views/consult/ConsultIllness.vue'),
      meta: { title: '病情描述' }
    },

2)准备病情描述类型和表单数据

consult.d.ts

// 病情描述全部必填
export type ConsultIllness = Pick<
  PartialConsult,
  'illnessDesc' | 'illnessTime' | 'consultFlag' | 'pictures'
>

Consult/ConsultIllness.vue

import type { ConsultIllness } from '@/types/consult'
import { ref } from 'vue'

// 表单变量
const form = ref<ConsultIllness>({
  illnessDesc: '',
  illnessTime: undefined,
  consultFlag: undefined,
  pictures: []
})

image-20230610211327871

    <!-- 表单 -->
    <div class="illness-form">
      <van-field
        type="textarea"
        rows="3"
        placeholder="请详细描述您的病情,病情描述不能为空"
+       v-model="form.illnessDesc"
      ></van-field>
      <div class="item">
        <p>本次患病多久了?</p>
        <cp-radio-btn :options="timeOptions"
+        v-model="form.illnessTime" />
      </div>
      <div class="item">
        <p>此次病情是否去医院问诊过?</p>
        <cp-radio-btn :options="flagOptions"
+        v-model="form.consultFlag" />
      </div>
    </div>

病情描述-图片上传-组件(作业){#illness-img}

实现:使用 van-upload 组件,进行样式和功能配置

步骤:

  • 配置文字和图标
  • 配置最多数量和最大体积
  • 支持双向数据绑定,支持选择图片后触发函数,支持点击删除事件函数

代码:

1)配置文字和图标

        <van-uploader
+          upload-icon="photo-o"
+          upload-text="上传图片"
        ></van-uploader>

2)配置最多数量和最大体积

        <van-uploader
+          max-count="9"
+          :max-size="5 * 1024 * 1024"
          upload-icon="photo-o"
          upload-text="上传图片"
        ></van-uploader>

3)支持双向数据绑定,支持选择图片后触发函数,支持点击删除事件函数

image-20230611202416901

image-20230611202627455

        <van-uploader
+          :after-read="onAfterRead"
+          @delete="onDeleteImg"
+          v-model="fileList"
          max-count="9"
          :max-size="5 * 1024 * 1024"
          upload-icon="photo-o"
          upload-text="上传图片"
        ></van-uploader>
// 有赞提供的类型
import type { UploaderAfterRead, UploaderFileListItem } from 'vant/lib/uploader/types'
import type { Image } from '@/types/consult'
const fileList = ref<Image[]>([])
const onAfterRead: UploaderAfterRead = (item) => {
  // TODO 上传图片:调用后台api上传接口
}
const onDeleteImg = (item: UploaderFileListItem) => {
  // TODO 删除图片
}

小结:

  • fileList 是配置图片预览使用的,同步 form 中的 pictures
  • 读取成功后,需要自己调用接口上传
  • 删除成功后触发的事件,需要去删除 form 中的数据

病情描述-图片上传-业务(作业){#illness-img-logic}

实现:上传图片与删除图片功能

步骤:

  • 定义上传图片 api 函数
  • 实现上传
  • 实现删除

代码:

1)定义 api 函数 api/consult.ts

import type {
  DoctorPage,
  FollowType,
+  Image,
  KnowledgePage,
  KnowledgeParams,
  PageParams,
  TopDep
} from '@/types/consult'
// 上传病情描述图片
export const uploadImage = (file: File) => {
  const fd = new FormData()
  fd.append('file', file)
  return request.post<Image>('/upload', fd)
}

2)实现上传 Consult/ConsultIllness.vue

import { uploadImage } from '@/api/consult'
// 这个item并不是我们传的值,就是vant自带的那个参数'file'
const onAfterRead: UploaderAfterRead = (item) => {
  if (Array.isArray(item)) return
  if (!item.file) return
  // 开始上传
  item.status = 'uploading'
  item.message = '上传中...'
  uploadImage(item.file)
    .then((res) => {
      item.status = 'done'
      item.message = undefined
      // 给 item 加上 url 是为了删除可以根据 url 进行删除
      item.url = res.data.url
      // 存储上传成功图片url
      form.value.pictures?.push(res.data)
    })
    .catch(() => {
      item.status = 'failed'
      item.message = '上传失败'
    })
}

image-20230611203644877

image-20230611203917359

3)实现删除

const onDeleteImg = (item: UploaderFileListItem) => {
  // 删除已经上传图片 -->> 根据我们上传是记录的url来删除
  form.value.pictures = form.value.pictures?.filter((pic) => pic.url !== item.url)
}

image-20230611204119855

小结:

  • 给 item 加上 url 是为了删除可以根据 url 进行filter过滤删除

病情描述-保存数据{#illness-data}

实现:按钮点亮,提交校验,保存数据,跳转选择患者

1)添加vant按钮,实现按钮点亮交互

<van-button :class={disabled} @click="next" type="primary" block round>下一步</van-button>
import { computed, ref } from 'vue'
// ... 省略 ...
const disabled = computed(
  () =>
    !form.value.illnessDesc ||
    form.value.illnessTime === undefined ||
    form.value.consultFlag === undefined
)

2)提交校验 保存数据,跳转选择患者

import { useRouter } from 'vue-router'
import { Toast } from 'vant'
import { useConsultStore } from '@/stores'
const store = useConsultStore()
const router = useRouter()
const next = () => {
  if (!form.value.illnessDesc) return Toast('请输入病情描述')
  if (form.value.illnessTime === undefined) return Toast('请选择症状持续时间')
  if (form.value.consultFlag === undefined) return Toast('请选择是否已经问诊')
  // 存储病情描述
  store.setIllness(form.value)
  // 跳转档案管理:选择患者,需要根据 isChange 实现选择功能
  router.push('/user/patient?isChange=1')
}

说明❓:后续需要根据?isChange=1参数实现患者选择功能

病情描述-回显数据{#illness-show}

实现:进入页面时候提示用户是否回显之前填写的病情描述信息

1)进入页面,如果有记录数据,弹出确认框

import { ..., onMounted } from 'vue'
// 回显数据
onMounted(() => {
  if (store.consult.illnessDesc) {
    Dialog.confirm({
      title: '温馨提示',
      message: '是否恢复您之前填写的病情信息呢?',
      confirmButtonColor: 'var(--cp-primary)',
      closeOnPopstate: false // 是否在页面回退时自动关闭,注意默认值为true
    }).then(() => {
      // 确认
    })
  }
})

image-20230611205127170

2)回显数据

从 store 拿出记录的数据

// ...
.then(() => {
      // 确认
      const { illnessDesc, illnessTime, consultFlag, pictures } = store.consult
      form.value = { illnessDesc, illnessTime, consultFlag, pictures }
      // 图片回显预览
      fileList.value = pictures || []
    })

说明❓:回退页面时,确认框会自动关闭,需要设置closeOnPopstate: false

选择患者-家庭档案兼容{#consult-change-patient}

image-20220824154246436

实现:在家庭档案基础上实现选择患者功能

步骤:

  • 界面兼容,根据地址栏是否有isChange标识

  • 点击选中效果

  • 默认选中效果

  • 记录患者ID跳转到待支付页面

代码:

User/PatientInfo.vue

  1. 界面兼容选择患者
import { useRoute } from 'vue-router'

// 是否是选择患者
const route = useRoute()
// 用于判断是否能够选中患者  --极速问诊流程中能够选中  --家庭档案中不能选中
const isChange = computed(() => route.query.isChange === '1')
<cp-nav-bar
+ :title="isChange ? '选择患者' : '家庭档案'" />
-<!-- 头部选择提示 -->
<div class="patient-change"
+ v-if="isChange">
  <h3>请选择患者信息</h3>
  <p>以便医生给出更准确的治疗,信息仅医生可见</p>
</div>

-<!-- 患者选择下一步 -->
<div class="patient-next"
+ v-if="isChange">
  <van-button type="primary" @click="next" round block>下一步</van-button>
 </div>
  1. 点击选中效果
// 存储点击选中患者ID作为标识
const patientId = ref<string>()
const selectedPatient = (item: Patient) => {
  if (isChange.value) {
    patientId.value = item.id
  }
}
<div
class="patient-item"
v-for="item in list"
:key="item.id"
+ @click="selectedPatient(item)"
+ :class="{ selected: patientId === item.id }"
>
  1. 默认选中效果
const loadList = async () => {
  const res = await getPatientList()
  list.value = res.data
+  // 设置默认选中的ID,当你是选择患者的时候,且有患者信息的时候
+  if (isChange.value && list.value.length) {
+    const defPatient = list.value.find((item) => item.defaultFlag === 1)
+    if (defPatient) patientId.value = defPatient.id
+    else patientId.value = list.value[0].id
+  }
}
  1. 记录患者ID跳转到待支付页面
const store = useConsultStore()
const router = useRouter()
const next = async () => {
  if (!patientId.value) return Toast('请选问诊择患者')
  store.setPatient(patientId.value)
  router.push('/consult/pay')
}

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

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

相关文章

【Hadoop】大数据开发环境配置

【Hadoop】大数据开发环境配置 文章目录 【Hadoop】大数据开发环境配置1 设置静态ip2 设置主机名3 关闭防火墙4 ssh免密码登录5 JDK配置6 hadoop安装并配置6.1 集群节点之间时间同步6.2 SSH免密码登录完善6.3 hadoop配置 1 设置静态ip 进入ifcfg-ens33文件 vi /etc/sysconfig/n…

JAVA图形界面GUI

目录 一、窗口、窗格、按钮、标签 设置一个窗口JFrame 设置一个窗格JPanel和按钮JButton 设置一个标签JLabel 标准写法 二、监听器ActionListener 用内部类实现 用匿名内部类实现 用LAMADA表达式实现 三、文本域、复选框、下拉列表 JTextField单行文本域 JCheckBox复选…

智能算法终极大比拼,以CEC2017测试函数为例,十种智能算法直接打包带走,不含任何套路

包含人工蜂群(ABC)、灰狼(GWO)、差分进化(DE)、粒子群(PSO)、麻雀优化(SSA)、蜣螂优化(DBO)、白鲸优化(BWO)、遗传算法(GA)、粒子群算法(PSO)&#xff0c;基于反向动态学习的差分进化算法&#xff0c;共十种算法&#xff0c;直接一文全部搞定&#xff01; 其中基于反向动态学习…

Dalamud 插件开发白皮书 P1 - Getting started

文章目录 从哪里开始 How do I get started?Dalamud 插件例子Dalamud 底层探究XIVLauncher 启动器 在哪里寻找帮助 Where do I ask for help?如何热重载插件 How do I hot-reload my plugin?如何调试插件&#xff0c;甚至游戏&#xff1f;如何在编码过程中使用 How do I use…

国内几款强大的语言模型

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

STC15WProteus仿真红绿灯直行左右转紧急模式STC15W4K32S4-0041

STC15WProteus仿真红绿灯直行左右转紧急模式STC15W4K32S4-0041 Proteus仿真小实验&#xff1a; STC15WProteus仿真红绿灯直行左右转紧急模式STC15W4K32S4-0041 功能&#xff1a; 硬件组成&#xff1a;STC15W4K32S4单片机 2位数码管5个LED灯&#xff08;红 黄 ←绿 ↑绿 →绿…

《网络基础之socket理解》

【一】socket是什么 从字面上的意思来理解&#xff0c;这玩意的中文含义叫插座&#xff0c;对你想的没错&#xff0c;就是你家用来插电器的插座&#xff0c;只不过你家的插座是用来导电的&#xff0c;而网络里面的socket是用来传导信息的。 【二】网络socket传送数据流程 我们…

基于阻尼绕组起动同步电动机matlab完整程序分享

主要包含输出转速,感应转矩,磁场变化,感应电压,感应电流等6个参数变化曲线图!! 完整程序如下: clc; clear; close all; warning off; addpath(genpath(pwd)); %電機參數設定 r_stat_in=15;%stator內圈半徑 r_stat_out=17;%stator外圈半徑 width_rot=2;%rotor細部寬度 leng…

【瑞萨RA_FSP】DAC —— 输出正弦波

文章目录 一、DAC简介二、DAC的结构框图1. 参考电压2. 触发源3. DAC数据寄存器4. 转换的过程5. 同步转换 三、生成正弦波数据表四、DAC程序设计1. 硬件设计2. 软件设计①文件结构②FSP配置③DAC初始化函数④设置DAC输出电压函数⑤DAC输出正弦波⑥ hal_entry入口函数 一、DAC简介…

多用户商城软件有哪些开发方式?-加速度jsudo

电商时代之下&#xff0c;企业商家纷纷开始了b2b2c商城系统的搭建&#xff0c;以此来抢占电商市场&#xff0c;但由于大多企业商家并没有专业化的开发团队&#xff0c;所以大多会选择将网站建设外包给专业的商城系统开发公司&#xff0c;但就目前而言&#xff0c;b2b2c商城系统…

改进YOLOv8 | 损失函数篇 | YOLOv8 更换损失函数之 SIoU / EIoU / WIoU / Focal_xIoU 最全汇总版

文章目录 更换方式CIoUDIoUEIoUGIoUSIoUWIoUFocal_CIoUFocal_DIoUFocal_EIoUFocal_GIoUFocal_SIoU提示更换方式 第一步:将ultralytics/yolo/utils/metrics.py文件中的bbox_iou替换为如下的代码:class

基于微信小程序的云音乐管理系统+第三稿+文档

博主介绍&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 项目名称 基于微信小程序的云音乐管理系统第三稿文档 视频演示 基于微信小程序的云音乐管理系统第三稿问题解答任务书开题报告查重报告安装视频讲解视频&#…

【计算机网络】第三章传输层-电子科技大学2023期末考试

第三章 传输层 传输层服务与协议 传输层为两个不同主机上的应用程序之间提供逻辑通信机制 传输层协议运行在端系统 发送方: 将应用程序报文分成数据段传递给网络层,接受方: 将数据段重新组装成报文传递到应用层 网络层为两个主机之间提供逻辑通信 主要提供两种协议TCP和U…

RTC

文章目录 前言驱动应用程序运行 前言 RTC&#xff08;Real Time Clock&#xff0c;实时时钟&#xff09;是个常用的外设&#xff0c;通过 RTC 我们可以知道日期和时间信息&#xff0c;因此在需要记录时间的场合就需要实时时钟。 可以使用专用的实时时钟芯片来完成此功能&#…

PostgreSQL如何创建临时表?

分类 PostgreSQL支持两种临时表&#xff1a; 会话级临时表&#xff1a;数据可以一直保存在整个会话的生命周期中事务级临时表&#xff1a;数据只存在于这个事务的生命周期中 在PostgreSQL中&#xff0c;不管是事务级的临时表还是会话级的临时表&#xff0c;当会话结束时都会…

家庭版Windows10/Windows11不支持远程桌面的解决办法

家庭版Windows10或11是不支持远程桌面的。我们可以在电脑的“设置”-> “远程桌面设置”中查看系统是否支持远程桌面&#xff1a;我们可以通过RDPWrap这个项目让家庭版也支持远程桌面。 百度网盘下载 首先在下面网址下载该项目&#xff0c;下载zip&#xff1a;https://gith…

【wifi使用指导】wifi模块怎么用?无线路由wifi模块SKW92A/SKW77网页配置说明

据悉&#xff0c;在全球范围内&#xff0c;WiFi承载了超过一半的数据流量&#xff0c;并且65%-90%的智能手机流量来自WiFi。无线覆盖的实现依赖于WiFi模块提供的WiFi信号&#xff0c;支持AP/Client&#xff0c;Bridge&#xff0c;Gateway&#xff0c;Router&#xff0c;3G/4G R…

U-Mail企业邮件服务器搭建方案

数字化办公的日渐推行&#xff0c;使企业对邮箱的依赖与日俱增&#xff0c;正式工作报告&#xff0c;部门之间的事物往来、通知等等都需要使用到企业邮箱。随着企业对数字化建设的不断深入&#xff0c;企业对企业邮箱的要求也越来越高&#xff0c;比如对第三方应用集成及协同办…

【C++】STL之string类(1)

个人主页&#xff1a;平行线也会相交&#x1f4aa; 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】&#x1f48c; 本专栏旨在记录C的学习路线&#xff0c;望对大家有所帮助&#x1f647;‍ 希望我们一起努力、成长&…

19项网络与数据安全新国标全文公开免费下载

根据2023年5月23日国家市场监督管理总局、国家标准化管理委员会发布的中华人民共和国国家标准公告&#xff08;2023年第2号&#xff09;&#xff0c;全国信息安全标准化技术委员会归口的19项网络安全国家标准正式发布。近日&#xff0c;标准全文正式公开&#xff0c;博主第一时…