尚医通-上传医院接口实现(十八)

目录:

(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..>

  1. 优点
  1. 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页面进行查看:成功显示代码:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵俺第一专栏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值