医院信息化与智能化系统(13)
医院信息化与智能化系统(13)
这里只描述对应过程,和可能遇到的问题及解决办法以及对应的参考链接,并不会直接每一步详细配置
如果你想通过文字描述或代码画流程图,可以试试PlantUML
,告诉GPT你的文件结构,让他给你对应的代码
预约挂号微服务模块搭建
前端知识点补充,此章节不会详细讲具体前端的每个知识点
1、集成医院接口模拟系统
这是一个已经提供的项目(简称:项目B
),需要把它移植到yygh_parent
总项目中来
先在项目中以Spring Initializr
创建Maven模块hospital-manage
,它放在yygh_parent
下
在pom中更改spring-boot版本为2.2.1.RELEASE
将项目B中的com
文件复制到src/main/java
文件夹下,resources文件直接导入项目文件即可,将其标记为资源根目录
。(ps:网传该文件下的/templates
中的.html文件有病毒…,自查方法是,在Vscode中打开该文件,然后查询是否有VBScript
标签或者<script language="VBScript">
,有的话删除掉)
接着把项目B的pom文件的依赖,引入到hospital-manage
的pom文件
中,其中关于redis注释掉的依赖也需要加上。
在application-dev.yml
中修改redis的hostname
(IP)和数据库的url
配置、用户密码
配置(datasource
下)
接着在创建数据库yygh_manage
并导入三张表 hospital_set、order_info、schedule
此表sql文件数据,来自B站用户浅笑灬桔
提供,下载地址,提取码 738w;如果JOSN格式可以导入数据库,可以直接使用提供的JSON数据(其中,如果hospital_set
中添加的那条数据id不为1
,后续网页操作会报错,所以一定要注意!!,可以自己主动修改为1
)
在导入的项目中,如果你报了很多错误,一些import的包显示无法解析符号XXX
,我的做法是:yygh_manage
的pom.xml文件,更改其parent标签
内的信息,改为
<parent>
<groupId>com.xxx</groupId>
<artifactId>yygh_parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
如果操作正常,在项目启动之后,url:localhost:9998
你将进入下面的界面。
2、实体类创建
第一步是复制工具类,将提供的helper文件夹,放在service-util
模块的yygh/common
下,里面存放了HttpRequestHelper
类(这里面的import语句,需要重新导入一下,有的路径变了,并且JSONObject
的依赖需要加到pom.xml中);再把提供的HttpUtil
类,放在yygh/common/utils
下
<!-- JSONObject依赖, 版本号不需要添加,主项目设定了 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
第二步,在service-hosp模块
引入mongodb相关依赖,在application.properties
添加mongodb配置信息。
第三步,创建repository、service和controller;
其中创建repository/HospitalRepository
接口,继承MongoRepository
接口,并指定泛型为Hospital
类,这是关于医院信息的类。在其上用@Repository 注解
修饰,用于标识数据访问层的组件,提供异常处理和组件扫描的支持,使得数据访问逻辑的实现更加清晰和可管理。
在service文件夹创建HospitalService
接口,并在service/impl
创建HospitalServiceImpl
用于实现该接口,并且该实体类用@Service
修饰,并在其中注入HospitalRepository
@Service
public class HospitalServiceImpl implements HospitalService {
@Autowired
private HospitalRepository hospitalRepository;
}
最后在service/controller中创建api
文件夹,里面创建ApiController
类,内部用@RestController
、@RequestMapping
修饰,其中的路径是与项目B中的方法路径对应的,并非随意取名。
@RestController
@RequestMapping("/api/hosp")
public class ApiController {
@Autowired
private HospitalService hospitalService;
}
3、上传医院 接口
在ApiController
创建上传医院方法,用于上传
医院的基本信息与规则信息,这里的url
也要与项目B中的对应,具体接口路径需要查阅项目B的接口文档
接收一个HttpServletRequest
对象,这个对象包含了请求的所有信息。
Map<String, String[]> requestMap
获取请求参数并存储在requestMap中,参数名作为键,参数值的数组作为值
Map<String, Object> paremMap
转换成另一个类型的映射,方便后续将String[]转为单个Object
后续需要创建hospitalService.save
方法,将接受的参数保存到数据库
@PostMapping("saveHospital")
public Result saveHosp(HttpServletRequest request){
//获取传递过来的信息
Map<String, String[]> requestMap = request.getParameterMap();
Map<String, Object> paremMap = HttpRequestHelper.switchMap(requestMap);
//调用service的方法
hospitalService.save(paremMap);
return Result.ok();
}
在HospitalServiceImpl
中实现save方法,它逻辑顺序是,先把map集合转换成Hospital对象(利用之前导入的fastjson
依赖),再判断数据库是否存在相同数据,存在则对原数据进行修改
,不存在则进行添加
。
判断是否存在的方法,Spring Data提供了对mongodb数据访问的支持,我们只需要继承MongoRepository
类,按照Spring Data规范命名函数即可自动实现。
所以在HospitalRepository
中声明方法getHospitalByHoscode
,具体规则可以百度springdata方法定义规范
。
具体修改与添加的步骤是:
- 修改:
getHospitalByHoscode
的返回值存在,前端传入的值并不包括id、status、CreateTime
和UpdateTime
,所以在保存前要对其进行提前赋值,前三个就用返回值字段属性
,最后一个用当前时间Date类
就行。 - 添加
status
、CreateTime
和UpdateTime
设置为默认值0与当前时间,在把接收的值添加。
完成以后同时运行service-hosp
与hospital-manage
,进行测试,打开http://localhost:9998/
->医院管理
->添加
,把资料提供的hospital.josn
内容粘贴进去,再点击保存内容
。期间有一些错误弹窗可以暂时不理会,因为项目还没完善。
可以在Navicat
中新建关于Mongodb的连接,这样就能图形化查看自己的mongodb数据库了
后续设置
校验设置
:在数据库yygh_hosp
和yygh_manage
中都有’hospital_set’,要在ApiController
的save方法添加一个校验功能。
在ApiController中要注入HospitalSetService
,这样才能操作yygh_hosp库的hospital_set表的sign_key
。
...//save方法体
Map<String, Object> paremMap = HttpRequestHelper.switchMap(requestMap);
//获取医院系统传递过来的签名,签名进行了MD5加密
String hospSign = (String) paremMap.get("sign");
//根据传递过来的医院编码,查询数据库、查询签名
String hoscode = (String) paremMap.get("hoscode");
String signKey = hospitalSetService.getSignKey(hoscode);
...
这里在HospitalSetServiceImpl
中实现getSignKey
方法,即根据hoscode获取sign_key。
//HospitalSetServiceImpl类
@Override
public String getSignKey(String hoscode) {
QueryWrapper<HospitalSet> wrapper = new QueryWrapper<>();
wrapper.eq("hoscode",hoscode);
HospitalSet hospitalSet = baseMapper.selectOne(wrapper);
return hospitalSet.getSignKey();
}
测试前把hospital-manage中HttpRequestHelper
中的getSign
方法体内容全部注释掉,并将
//方法体内容
String md5Str = MD5.encrypt(signKey);
return md5Str;
保证yygh_manage
中的hospital_set
内的hoscode与sign_key与yygh_hosp
中的对应;
其次logo图片转换为base64字符串
时,该字符串中包含大量的加号+
,服务器在解析数据时会把加号当成连接符
,转换为空格
,所以在添加数据时,要把空格转为加号。
// saveHosp
...
String logoData = (String) paremMap.get("logoData");
logoData = logoData.replaceAll(" ","+");
paremMap.put("logoData",logoData);
验证图片时,删除之前的mongodb数据库内容,重新把hospital.josn
内容上传,再把logoData
中的字段内容复制,这里假设其内容为conment
创建一个txt文件夹,构建如下标签,并另存为.html文件,打开就会显示图片
<img src="data:image/png;base64,conment"/>