目录:
(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:上传医院的接口方法:
 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:
 一步一步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页面进行查看:成功显示代码:



















