医院信息化与智能化系统(15)

news2024/11/23 2:59:54

医院信息化与智能化系统(15)

这里只描述对应过程,和可能遇到的问题及解决办法以及对应的参考链接,并不会直接每一步详细配置
如果你想通过文字描述或代码画流程图,可以试试PlantUML,告诉GPT你的文件结构,让他给你对应的代码

预约挂号微服务模块搭建

前端知识点补充,此章节不会详细讲具体前端的每个知识点

1、医院管理概述

目前我们把医院、科室和排班都上传到了平台,那么管理平台就应该把他们管理起来,在我们的管理平台能够直观的查看这些信息。

需求分析及Nacos启动

需求分析:
要设置一个element-ui中的table标签存放logo医院名称等级...

在这里插入图片描述

在MongoDB数据库中并没有等级字段,只有hostype,那么需要根据数据字典获取对应的等级:这里涉及到通过service-hosp远程调用service-cmn模块

注册中心与服务调用

下载nacos-server-1.1.4版本并解压,在其bin目录下双击打开startup.cmd | start.sh,前后分别对应Windows | Linux

访问路径默认为 : http://localhost:8848/nacos,用户密码都是nacos
在这里插入图片描述

Nacos注册服务

  1. 在service模块引入spring-cloud-starter-alibaba-nacos-discovery依赖
  2. application.properties配置文件设置nacos地址`spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
  3. 在启动类ServiceHospApplication上添加注解@EnableDiscoveryClient
  4. 注意:service-hosp和service-cmn都要按步骤2、3设置

我这里出现了一个问题:service-cmn突然爆了一个关于没有找到mongodb连接的问题,我心想我也没使用它,所以在该模块的依赖中去找,找到了对service-hosp的依赖,再具体分析依赖关系(右键项目可以查看),发现确实不小心填加了关于mongodb的依赖项,所以做法很简单,就是直接把对service-hosp的依赖删除即可。[我这删除完没报错,如果你们有,最多应该也就是import出了问题,应该直接删就行,我没看见需要import关于hosp模块的地方]

在这里插入图片描述

2、 医院列表接口

在service-hosp中创建HospitalController用于存储实现方法,用@RestController@RequestMapping("xx")@CrossOrigin注解修饰。

医院列表实际是以get方式获取page和limit,随后进行条件查询。项目提供HospitalQueryVo类用于存放查询条件。创建selectHospPage方法实现条件查询,流程就是基于Mongodb数据库条件查询逻辑。

由于医院等级、省市区地址都是取的数据字典value值,因此我们在列表显示医院等级与医院地址时要根据数据字典value值获取数据字典名称。

由于yygh_cmn数据库表的value值并不唯一,所以需要创建方法来根据dictcode和value获取对应的name
service-cmnDictController创建getName方法;
在这里插入图片描述

    @GetMapping("getName/{dictCode}/{value}")
    public String getName(@PathVariable String dictCode,
                          @PathVariable String value){
        String dictName = dictService.getDictName(dictCode,value);
        return dictName;
    }
    @GetMapping("getName/{value}")
    public String getName(@PathVariable String value){
        String dictName = dictService.getDictName("",value);
        return dictName;
    }

在DictServiceImpl中实现具体getDictName方法:

  1. 提供value,直接依靠value值来找
  2. 提供value和dictcode,根据dictcode找到对应其父类对应的id,再根据parent_id =id以及value做更细致的查找
public String getDictName(String dictCode, String value) {
        //如果dictCode为空,则直接根据value查询
        if (StringUtils.isEmpty(dictCode)){
            QueryWrapper<Dict> wrapper = new QueryWrapper<>();
            wrapper.eq("value",value);
            Dict dict = baseMapper.selectOne(wrapper);
            return dict.getName();
        }else {
            Dict codeDict =this.getDictByCode(dictCode);
            Long parent_id = codeDict.getId();
            //根据parent_id和value进行查询
            Dict finalDick = baseMapper.selectOne(new QueryWrapper<Dict>()
                    .eq("parent_id", parent_id)
                    .eq("value", value));
            return finalDick.getName();
        }

封装Feign服务调用

搭建service_client模块,来进行服务调用的封装,注意:这里是创建子模块,也就是yygh_parent->新建模块->Maven工程,而不是用Spring Initializr创建一个springboot工程。

设置打包方式为<packaging>pom</packaging>

导入相关依赖:common模块、feign相关依赖、common-util模块等。

在该模块创建子模块service_cmn_client

创建接口DictFeignClient,该接口用@FeignClient("service-cmn")@Repository修饰,其中service-cmn是nacos中需要被调用服务的名称,该名称的声明在application.properties中。

该接口中方法的声明步骤,直接去找你要调用的模块方法,除方法体外内容全部复制即可,但需要注意的是@xxxMapping注解的路径需要补充完整;此外还需要指定URL路径中的变量名

   @GetMapping("/admin/cmn/dict/getName/{value}")
    public String getName(@PathVariable("value") String value);

接着就是在调用端service-hosp模块引入service_cmn_client依赖,在HospitalServiceImpl中实例化实现DictFeignClient接口的对象;并在启动类添加注解@EnableFeignClients(basePackages = "com.xxx")

由于Hospital中没有等级信息字段,查看其父类BaseMongoEntity中声明了Map<String,Object> param,利用其进行对等级的封装。

根据lambda表达式,对每一个取出的Hospital进行等级与地区设置;分别用hostypeStringfullAddress对应。

//根据条件与页数返回pages后
  //获取查询list集合,遍历进行医院等级封装
  ...
        pages.getContent().stream().forEach(item->{
            this.setHospitalHosType(item);
        });

private Hospital setHospitalHosType(Hospital hospital) {
        //这里的hospital的Hostype是value类型:1,2...
        //"Hostype"是对应字典的dict_Code
        String hostypeString = dictFeignClient.getName("Hostype", hospital.getHostype());
        //查询省 市 地区
        String provinceString = dictFeignClient.getName(hospital.getProvinceCode());
        String cityString = dictFeignClient.getName( hospital.getCityCode());
        String districtString = dictFeignClient.getName(hospital.getDistrictCode());
        hospital.getParam().put("hostypeString",hostypeString);
        hospital.getParam().put("fullAddress",provinceString+cityString+districtString);
        return hospital;
    }

测试时nacos、redis、mongodb、nginx全部打开,再启动模块,再到swagger里测试。
在这里插入图片描述

查询所有子节点 接口

首次进入前端,显示所有省份的医院信息;再添加查询功能,根据进行条件查询

所以在DictController创建方法,根据dictCode查询子数据列表并在DictServiceImpl实现findByDictCode代码逻辑。

findByDictCode借助getDictByCode函数,输入dictCode可以得到对应的Dict对象,再通过findChildData,输入Dict对象的id,得到其子节点数组,最后做返回。

测试时,输入对应dict_code,会以JSON响应对应的子节点(省:北京市...)

医院列表 前端

第一步是添加路由,在router/index.js的医院设置管理下面添加医院列表部分,并设置跳转路径为:@/views/hosp/list(对应创建)

第二步在api/hosp.js设置与后端接口的对应;

  1. getHospList:对应后端listHospital方法,根据当前页,每页记录数,查询条件查询。
  2. findByDictCode:对应后端findByDictCode方法,根据DictCode查所有
  3. findChildId:对应后端findChildData方法,根据数据id查所有

第三部分编写list.vue

<template>标签内,仍是借助element-ui

先是提供两个选择表单,选择要查询的省和市,一个普通表单对应要查询的医院名称,一个查询按钮;

随后提供一个table,里面对应医院列表的各个信息

最后放置分组组件对应分页功能。

方法部分

  1. 导入hosp.js,为后续调用方法做准备
  2. 搭建基础结构:data、created、methods
  3. 定义变量及默认值:list医院列表数据、 total数据库中的总记录数、page 默认页码

进入页面就需要进行查询,所以创建fetchData方法,内部调用getHospList,并在.then()中处理返回值,将list和total分别赋值。

同时,需要在查询列表中,显示所有的省份,因此创建findAllProvince方法,内部调用findByDictCode

根据省需要提供市的列表,做法是创建provinceChanged方法,首先初始化市列表,随后根据searchObj.provinceCode获得选项框省的ID,再调用findChildId,最后把返回值赋值给`cityList

页面插件有一个选择页数进行展示,绑定方法changeSize,每一次选择页数进行调用,内部直接赋值this.limit,再执行this.fetchData(1)实现刷新即可。

在这里插入图片描述

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

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

相关文章

系统集成项目管理工程师考试时间

系统集成项目管理基础知识考试信息 题量&#xff1a;共 75 道题。考试时间&#xff1a;该科目考试时间为上午 8&#xff1a;30 - 12&#xff1a;30&#xff08;或下午 14&#xff1a;30 - 18&#xff1a;30&#xff0c;但通常为上午&#xff09;。基础知识科目最短作答时长 90…

数据结构 ——— 向上调整建堆和向下调整建堆的区别

目录 前言 向下调整算法&#xff08;默认小堆&#xff09; 利用向下调整算法对数组建堆 向上调整建堆和向下调整建堆的区别​编辑 向下调整建堆的时间复杂度&#xff1a; 向上调整建堆的时间复杂度&#xff1a; 结论 前言 在上一章讲解到了利用向上调整算法对数组进行…

Handler、Looper、message进阶知识

Android Handler、Looper、Message的进阶知识 在Android开发中&#xff0c;Handler、Looper和Message机制是多线程通信的核心。为了深入理解并优化它们的使用&#xff0c;尤其是在高并发和UI性能优化中&#xff0c;可以利用一些高级特性。 1. Handler的高阶知识 Handler在基本…

【设计模式系列】迭代器模式(七)

一、什么是迭代器模式 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;它提供一种方法来顺序访问一个聚合对象中的各个元素&#xff0c;而不暴露其内部的表示。迭代器模式将集合的遍历过程封装在一个独立的迭代器对象中&#xff0c;这样…

C++基础三(构造函数,形参默认值,函数重载,单例模式,析构函数,内联函数,拷贝构造函数)

C有六个默认函数&#xff0c;分别是&#xff1a; 1、默认构造函数; 2、默认拷贝构造函数; 3、默认析构函数; 4、赋值运算符; 5、取址运算符; 6、取址运算符const; 构造函数 构造函数(初始化类成员变量)&#xff1a; 1、属于类的成员函数之一 …

【C语言学习笔记】

C语言发展史&#xff1a; 1960 原型A语言->ALGOL语言 1963 CPL语言1967 BCPL1970 B语言1973 C语言 C语言特点&#xff1a; 基础性语言语法简洁 紧凑 方便 灵活(得益于指针)运算符 数据结构丰富结构化 模块化编程移植性好 执行效率…

智慧城市的守护者——智能井盖监测终端

城市化进程的加速推进使得基础设施建设成为提升城市品质的关键环节。然而&#xff0c;在这一进程中&#xff0c;市政公用设施中的井盖与地下线缆的安全问题却日益凸显。由于缺乏有效的实时监控与管理体系&#xff0c;给犯罪分子留下了可趁之机&#xff0c;频繁发生的井盖被盗及…

C语言 | Leetcode C语言题解之第513题找树左下角的值

题目&#xff1a; 题解&#xff1a; #define MAX_NODE_SIZE 10000int findBottomLeftValue(struct TreeNode* root){int ret;struct TreeNode** queue (struct TreeNode **)malloc(sizeof(struct TreeNode) * MAX_NODE_SIZE);int head 0;int tail 0;queue[tail] root;whil…

HarmonyOS应用开发者基础认证——初级闯关习题参考答案大全

相关文章 HarmonyOS应用开发者中级认证——中级闯关习题参考答案大全 HarmonyOS应用开发者高级认证——高级闯关习题参考答案大全 文章目录 HarmonyOS第一课 HarmonyOS介绍判断题单选题多选题 HarmonyOS第一课 DevEco Studio的使用判断题单选题多选题 HarmonyOS第一课 ArkTS语法…

SpringBoot 集成 Mybatis-Plus,LambdaQueryWrapper 使用方法

&#x1f3dd;️ 博主介绍 大家好&#xff0c;我是 一个搬砖的农民工&#xff0c;很高兴认识大家 &#x1f60a; ~ &#x1f468;‍&#x1f393; 个人介绍&#xff1a;本人是一名后端Java开发工程师&#xff0c;坐标北京 ~ &#x1f389; 感谢关注 &#x1f4d6; 一起学习 &am…

Word文档丢失抢救方法:15 个 Word 文档恢复工具

MS Word 文档恢复的重要性 对于严重依赖 Microsoft Word 创建和编辑文档的个人和企业来说&#xff0c;MS Word 文档恢复是一个至关重要的方面。 文件损坏、系统崩溃和其他意外事件可能会导致 Word 文档中存储的重要数据丢失。 及时恢复这些文档有助于节省时间、精力和资源。 本…

python实战项目51:selenium结合requests获取某众点评评论

python实战项目51:selenium结合requests获取某众点评评论 一、selenium获取cookies二、利用requests发送请求三、注意事项四、完整代码一、selenium获取cookies 首先,初始化selenium的webdriver,然后使用webdriver打开某众点评主页,之后手动扫码登录,利用selenium的get_c…

ETLCloud怎么样?深度解析其在数据管理中的表现

在BI或数据大屏等数据分析工具中&#xff0c;经常需要从多个业务系统中提取原始数据&#xff0c;然后对数据进行清洗、处理&#xff0c;以获取高质量、有效且干净的数据以供后续的BI进行数据统计和分析使用&#xff0c;从高质量的实现企业数据的价值变现。 然而&#xff0c;在…

《花少6》豆瓣评分3.9,“锅”不该周雨彤一个人背

《花儿与少年 第六季》以豆瓣评分3.9成为了整个系列IP有史以来口碑最差的一季节目。 播出过半的《花少6》终于在万众期待下开分了&#xff0c;豆瓣首次开分为4.8&#xff0c;实际上已经是“花少”史上最低评分&#xff0c;紧接着短短几天持续下滑至3.9分&#xff0c;让原本就不…

WPF+MVVM案例实战(十七)- 自定义字体图标按钮的封装与实现(上)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、案例效果1、按钮分类2、BC类按钮实现1、文件创建2、字体图标资源3、自定义依赖属性4、按钮特效样式实现3、案例实现1、案例效果 1、按钮分类 在WPF开发中,最常见的就是按钮的使用,这里我们总…

day-77 超级饮料的最大强化能量

思路 动态规划&#xff1a;因为每一步要么选A&#xff0c;要么选B&#xff0c;所以问题可以转换为求最后一步从A选或从B选中的较大值 解题过程 定义而二维数组dp,dp[i][0]表示最后一步从A取能获得的最大能量&#xff0c;dp[i][1]表示最后一步从B取能获得的最大能量状态转换方程…

91.【C语言】数据结构之单向链表的头删和尾删

目录 1.尾删函数SLTPopBack 代码示例(写入SList.c) 在SList.h中写入该函数的声明 main.c部分代码改为 ​编辑 分析 解决方法 方法1:双指针算法(快指针tail,慢指针pretail) 方法2 2.头删函数SLTPopFront 一个节点示意图 多个节点示意图 代码示例(写入SList.c) 在S…

C语言内幕--全局变量(结合内存分区、汇编视角看类型、连接器)

前言 学习资源&#xff1a;b站up主&#xff1a;底层技术栈学过C语言都知道&#xff0c;全局变量可以再全局中使用&#xff0c;其实全局变量内部还是涉及到不少知识&#xff0c;这里从内存分区、汇编视角看类型、连接器等角度看待全局变量&#xff1b;由于涉及到底层技术&#…

新160个crackme - 089-fornixcrackme1

运行分析 需要破解Name和Serial PE分析 ASM程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida搜索找到关键字符串 动态分析关键函数&#xff0c;逻辑如上图&#xff0c;通过Name计算得到char_1&#xff0c;亦或后对比Serial&#xff0c;相等则返回成功信息 分析…