医院信息化与智能化系统(15)
医院信息化与智能化系统(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注册服务
- 在service模块引入
spring-cloud-starter-alibaba-nacos-discovery
依赖 - 在
application.properties
配置文件设置nacos地址`spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 - 在启动类
ServiceHospApplication
上添加注解@EnableDiscoveryClient
- 注意: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-cmn
的DictController
创建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
方法:
- 提供value,直接依靠value值来找
- 提供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
进行等级与地区设置;分别用hostypeString
和fullAddress
对应。
//根据条件与页数返回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
设置与后端接口的对应;
getHospList
:对应后端listHospital
方法,根据当前页,每页记录数,查询条件查询。findByDictCode
:对应后端findByDictCode
方法,根据DictCode查所有省
findChildId
:对应后端findChildData
方法,根据数据id查所有市
第三部分编写list.vue
在<template>
标签内,仍是借助element-ui
先是提供两个选择表单
,选择要查询的省和市,一个普通表单
对应要查询的医院名称,一个查询按钮;
随后提供一个table
,里面对应医院列表的各个信息
最后放置分组组件
对应分页功能。
方法部分
- 导入hosp.js,为后续调用方法做准备
- 搭建基础结构:data、created、methods
- 定义变量及默认值:list
医院列表数据
、 total数据库中的总记录数
、page默认页码
…
进入页面就需要进行查询,所以创建fetchData
方法,内部调用getHospList
,并在.then()
中处理返回值,将list和total分别赋值。
同时,需要在查询列表中,显示所有的省份,因此创建findAllProvince
方法,内部调用findByDictCode
。
根据省需要提供市的列表,做法是创建provinceChanged
方法,首先初始化市列表
,随后根据searchObj.provinceCode
获得选项框省的ID,再调用findChildId
,最后把返回值赋值给`cityList
页面插件有一个选择页数
进行展示,绑定方法changeSize
,每一次选择页数进行调用,内部直接赋值this.limit
,再执行this.fetchData(1)
实现刷新即可。