目录:
(1)上传医院接口-基础类的创建
(2)数据接口-上传医院接口-初步实现
(3)上传医院接口-最终实现
(1)上传医院接口-基础类的创建
复制相关的工具类:这个做请求发送和数据转换
把这两个工具类复制到项目中
在common模块中引入依赖:
加下来就在平台的项目中开发接口,开发到service_hosp里面
进行相关配置引入依赖,添加相关配置
service-hosp模块pom.xml添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency> |
在application.properties文件添加配置
spring.data.mongodb.uri=mongodb://192.168.44.165:27017/yygh_hosp |
我们先做医院相关,再做科室,在做排班
医院相关需要的实体类已经加入:Hospital:
操作mongodb有多种方式有MongoTemplate与MongoRepository,这里采用MongoRepository实现,首先创建reposity包
创建类
package com.atguigu.yygh.hosp.repository;
import com.atguigu.yygh.model.hosp.Hospital;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
@Repository //让它交给spring管理
public interface HospitalRepository extends MongoRepository<Hospital,String> {
}
在service包下创建HospitalService:
package com.atguigu.yygh.hosp.service;
public interface HospitalService {
}
实现类:
package com.atguigu.yygh.hosp.service.impl;
import com.atguigu.yygh.hosp.repository.HospitalRepository;
import com.atguigu.yygh.hosp.service.HospitalService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service //交给spring管理
public class HospitalServiceImpl implements HospitalService {
//service操作Reposity操作MongoDB
//注入reposity
@Autowired
private HospitalRepository hospitalRepository;
}
创建controller:创建的controller对外进行调用,创建一个包显示他对外调用api
package com.atguigu.yygh.hosp.controller.api;
import com.atguigu.yygh.hosp.service.HospitalService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/hosp") //这个路径要跟医院系统的路径相对应
public class ApiController {
//注入service
@Autowired
private HospitalService hospitalService;
}
(2)数据接口-上传医院接口-初步实现
接口数据分析
{
"hoscode": "1000_0",
"hosname": "北京协和医院",
"hostype": "1",
"provinceCode": "110000",
"cityCode": "110100",
"districtCode": "110102",
"address": "大望路",
"intro": "北京协和医院是集医疗、教学、科研于一体的大型三级甲等综合医院,是国家卫生计生委...目标而继续努力。",
"route": "东院区乘车路线:106、...更多乘车路线详见须知。",
"logoData": "iVBORw0KGgoAAAA...NSUhEUg==",
"bookingRule": {
"cycle": "1",
"releaseTime": "08:30",
"stopTime": "11:30",
"quitDay": "-1",
"quitTime": "15:30",
"rule": [
"西院区预约号取号地点:西院区门诊楼一层大厅挂号窗口取号",
"东院区预约号取号地点:东院区老门诊楼一层大厅挂号窗口或新门诊楼各楼层挂号/收费窗口取号"
]
}
} |
我们是通过医院的系统把数据上传到平台中来,平台要得到上传的信息,然后把信息加到数据库中
医院系统那边是通过post提交传过来参数,controller中怎么得到post提交过来的参数?
可以通过request.getParameter得到 还可以getParameterMap可以得到
接口:
这个工具类中的方法进行转换: switchMap方法把map集合的类型进行转换成Object
ApiController:上传医院的接口方法:
package com.atguigu.yygh.hosp.controller.api;
import com.atguigu.yygh.common.helper.HttpRequestHelper;
import com.atguigu.yygh.common.result.Result;
import com.atguigu.yygh.hosp.service.HospitalService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
@RestController
@RequestMapping("/api/hosp") //这个路径要跟医院系统的路径相对应
public class ApiController {
//注入service
@Autowired
private HospitalService hospitalService;
//上传医院的接口
@PostMapping("saveHospital")
public Result saveHosp(HttpServletRequest request){
//获取传递过来的医院信息
Map<String, String[]> parameterMap = request.getParameterMap();
Map<String, Object> paramMap = HttpRequestHelper.switchMap(parameterMap);
//调用service的方法把它加入到数据库
hospitalService.save(paramMap);
return Result.ok();
}
}
HospitalService:
package com.atguigu.yygh.hosp.service;
import java.util.Map;
public interface HospitalService {
//上传医院接口的方法
void save(Map<String, Object> paramMap);
}
实现类:
package com.atguigu.yygh.hosp.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.atguigu.yygh.hosp.repository.HospitalRepository;
import com.atguigu.yygh.hosp.service.HospitalService;
import com.atguigu.yygh.model.hosp.Hospital;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.Map;
@Service //交给spring管理
public class HospitalServiceImpl implements HospitalService {
//service操作Reposity操作MongoDB
//注入reposity
@Autowired
private HospitalRepository hospitalRepository;
//上传医院接口的方法
@Override
public void save(Map<String, Object> paramMap) {
//mongodb添加数据第一次添加save做的是添加操作,第二次做的是更新操作
//先把paramMap集合 调用fastjson的方法
String mapstring = JSONObject.toJSONString(paramMap);
Hospital hospital = JSONObject.parseObject(mapstring, Hospital.class);
//判断数据库中是否存在数据
String hostcode=hospital.getHoscode();
Hospital hospitalExist =hospitalRepository.getHospitalByHoscode(hostcode);//根基hostcode判断对象是否存在,需要在hospitalRepository写这个方法
//如果存在,进行修改
if (hospitalExist!=null){
//设置固定的值
hospital.setStatus(hospitalExist.getStatus());
hospital.setCreateTime(hospitalExist.getCreateTime());
hospital.setUpdateTime(new Date());
hospital.setIsDeleted(0);
hospitalRepository.save(hospital);//修改
}else {//如果不存在,进行添加
//设置固定的值
hospital.setStatus(0);//第一次添加状态是未上线为0,存在的是已上线为1
hospital.setCreateTime(new Date());
hospital.setUpdateTime(new Date());
hospital.setIsDeleted(0);
hospitalRepository.save(hospital);//添加
}
}
}
HospitalRepository :
package com.atguigu.yygh.hosp.repository;
import com.atguigu.yygh.model.hosp.Hospital;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
@Repository //让它交给spring管理
public interface HospitalRepository extends MongoRepository<Hospital,String> {
//根据hostcode查询对象是否存在 这个方法不用我们自己实现MongoRepository会帮助我们实现
Hospital getHospitalByHoscode(String hostcode);
}
运行项目:启动主启动类:启动医院的系统模块和service_hosp的模块
这个表的数据是医院设置的接口添加的数据:
这里要用到上面表中的数据code和key,点击保存:
保存之前:
保存之后
在点击医院管理的 添加:
把提前准备好的数据复制过来:
点击保存内容:
查看我们使用Mongdb的客户端工具类似MySQL的SQLyang
数据成功添加进去:
(3)上传医院接口-最终实现
我们在上传医院信息,只要知道地址就可以调用,没有做任何校验,现在做一个校验,只有是这个医院才能调用这个接口,而不是说所有医院都能调用这个接口,让他们做一个连接,让相应的医院调用对应的接口,我们需要做一个签名的校验
让这两个字符串进行比对,查看是否相同,相同才能做接口调用
医院系统的医院上传的实现中把签名使用MD5进行了加密:
传过来的paramMap有相关的签名做了MD5加密,
ApiController:注入HospitalSetService 我们用这个service写
package com.atguigu.yygh.hosp.controller.api;
import com.atguigu.yygh.common.exception.HospitalException;
import com.atguigu.yygh.common.helper.HttpRequestHelper;
import com.atguigu.yygh.common.result.Result;
import com.atguigu.yygh.common.result.ResultCodeEnum;
import com.atguigu.yygh.common.utils.MD5;
import com.atguigu.yygh.hosp.service.HospitalService;
import com.atguigu.yygh.hosp.service.HospitalSetService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
@RestController
@RequestMapping("/api/hosp") //这个路径要跟医院系统的路径相对应
public class ApiController {
//注入service
@Autowired
private HospitalService hospitalService;
//注入HospitalSetService
@Autowired
private HospitalSetService hospitalSetService;
//上传医院的接口
@PostMapping("saveHospital")
public Result saveHosp(HttpServletRequest request){
//获取传递过来的医院信息
Map<String, String[]> parameterMap = request.getParameterMap();
Map<String, Object> paramMap = HttpRequestHelper.switchMap(parameterMap);
//校验
//1获取医院系统中传递过来的签名,这个签名做了MD5加密
String hospSign = (String)paramMap.get("sign");
//2根据传递过来的医院编号,查询数据库,查询签名
String hoscode = (String)paramMap.get("hoscode");
//调用hospitalSetService中的方法根据医院编码获取签名
String singKey= hospitalSetService.getSignKey(hoscode);
//把数据库查询出来的签名进行MD5的加密
String signMd5 = MD5.encrypt(singKey);
//判断签名是否一致
if (!hospSign.equals(signMd5)){
throw new HospitalException(ResultCodeEnum.SIGN_ERROR);//抛出我们自定义的异常
}
//调用service的方法把它加入到数据库
hospitalService.save(paramMap);
return Result.ok();
}
}
HospitalSetService :
package com.atguigu.yygh.hosp.service;
import com.atguigu.yygh.model.hosp.HospitalSet;
import com.baomidou.mybatisplus.extension.service.IService;
public interface HospitalSetService extends IService<HospitalSet> {
//根据医院编码获取签名
String getSignKey(String hoscode);
}
实现类:
package com.atguigu.yygh.hosp.service.impl;
import com.atguigu.yygh.hosp.mapper.HospitalSetMapper;
import com.atguigu.yygh.hosp.service.HospitalSetService;
import com.atguigu.yygh.model.hosp.HospitalSet;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class HospitalSetServiceImpl extends ServiceImpl<HospitalSetMapper, HospitalSet> implements HospitalSetService {
//根据医院编码获取签名
@Override
public String getSignKey(String hoscode) {
QueryWrapper<HospitalSet> wrapper=new QueryWrapper<>();
wrapper.eq("hoscode",hoscode);
HospitalSet hospitalSet = baseMapper.selectOne(wrapper);
return hospitalSet.getSignKey();
}
}
先清空数据库中的内容:
打个断点:用debug启动
重新添加数据:
一步一步debug:
发现加密后的签名是一样的 ,在下一步成功加入:
是一个图标:
把图片进行了base64编码,编码之后的数据传输过程中会有一个问题
5.1 图片base64说明
图片的base64编码就是可以将一张图片数据编码成一串字符串,使用该字符串代替图像地址url
在前端页面中常见的base64图片的引入方式:
<img src="data:image/png;base64,iVBORw0..>
- 优点
- base64格式的图片是文本格式,占用内存小,转换后的大小比例大概为1/3,降低了资源服务器的消耗;
(2)网页中使用base64格式的图片时,不用再请求服务器调用图片资源,减少了服务器访问次数。
2. 缺点
(1)base64格式的文本内容较多,存储在数据库中增大了数据库服务器的压力;
(2)网页加载图片虽然不用访问服务器了,但因为base64格式的内容太多,所以加载网页的速度会降低,可能会影响用户的体验。
说明:医院logo图片小,因此上传医院logo是可以使用base64格式保存
在common-util模块添加工具类
添加com.atguigu.yygh.common.util.ImageBase64Util类
package com.atguigu.yygh.common.util;
import org.apache.commons.codec.binary.Base64;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class ImageBase64Util {
public static void main(String[] args) {
String imageFile= "D:\\yygh_work\\xh.png";// 待处理的图片
System.out.println(getImageString(imageFile));
}
public static String getImageString(String imageFile){
InputStream is = null;
try {
byte[] data = null;
is = new FileInputStream(new File(imageFile));
data = new byte[is.available()];
is.read(data);
return new String(Base64.encodeBase64(data));
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != is) {
try {
is.close();
is = null;
} catch (Exception e) {
e.printStackTrace();
}
}
}
return "";
}
} |
解决base64编码的问题:
package com.atguigu.yygh.hosp.controller.api;
import com.atguigu.yygh.common.exception.HospitalException;
import com.atguigu.yygh.common.helper.HttpRequestHelper;
import com.atguigu.yygh.common.result.Result;
import com.atguigu.yygh.common.result.ResultCodeEnum;
import com.atguigu.yygh.common.utils.MD5;
import com.atguigu.yygh.hosp.service.HospitalService;
import com.atguigu.yygh.hosp.service.HospitalSetService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
@RestController
@RequestMapping("/api/hosp") //这个路径要跟医院系统的路径相对应
public class ApiController {
//注入service
@Autowired
private HospitalService hospitalService;
//注入HospitalSetService
@Autowired
private HospitalSetService hospitalSetService;
//上传医院的接口
@PostMapping("saveHospital")
public Result saveHosp(HttpServletRequest request){
//获取传递过来的医院信息
Map<String, String[]> parameterMap = request.getParameterMap();
Map<String, Object> paramMap = HttpRequestHelper.switchMap(parameterMap);
//签名校验
//1获取医院系统中传递过来的签名,这个签名做了MD5加密
String hospSign = (String)paramMap.get("sign");
//2根据传递过来的医院编号,查询数据库,查询签名
String hoscode = (String)paramMap.get("hoscode");
//调用hospitalSetService中的方法根据医院编码获取签名
String singKey= hospitalSetService.getSignKey(hoscode);
//3把数据库查询出来的签名进行MD5的加密
String signMd5 = MD5.encrypt(singKey);
//传输过程中“+”转换为了“ ”,因此我们要转换回来
String logoDataString = (String)paramMap.get("logoData");
String logoData = logoDataString.replaceAll(" ", "+");
paramMap.put("logoData", logoData);
//4判断签名是否一致
if (!hospSign.equals(signMd5)){
throw new HospitalException(ResultCodeEnum.SIGN_ERROR);//抛出我们自定义的异常
}
//调用service的方法把它加入到数据库
hospitalService.save(paramMap);
return Result.ok();
}
}
修改之后删除数据库中的数据重新上传数据:
然后复制这个数据:logoData
<img src="data:image/png;base64,"/> ,后面加上上面的logoData的代码,装换成html页面进行查看:成功显示代码: