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

news2024/11/15 6:10:04

目录:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/131028.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis Windows版安装和使用

下载地址&#xff0c;亲已测试可放心使用 https://github.com/tporadowski/redis/releases Redis安装和基本使用&#xff08;windows版&#xff09; 1.Redis简介 完全开源免费的高性能的key-value的数据库 支持数据的持久化&#xff0c;可以将内存中的数据保存在磁盘中&…

【函数】一篇文章带你看懂控制流、递归、高阶函数

目录 控制流 条件语句 迭代语句 示例&#xff1a;质因数分解 递归 示例&#xff1a;阶乘 示例&#xff1a;斐波那契数列 示例&#xff1a;判断奇偶数 高阶函数 lambda 表达式 设计函数 示例&#xff1a;累加计算 示例&#xff1a;柯里化 Lab 1: Functions, Control …

个人能用的短信平台有哪些?看这一篇就够了

对于程序员个人来说&#xff0c;在做开发或者是接项目的时候&#xff0c;常常会用到发送短信功能模块&#xff0c;而自己写这个模块会要相当多的精力和时间&#xff0c;去找短信平台来解决问题&#xff0c;已经成了不少程序员的共识。 但市面上的短信平台确实很杂&#xff0c;鱼…

服务注册与发现原理

一、什么是服务注册与发现&#xff1f; 服务注册与发现就是一套管理微服务的组件&#xff0c;方便各拆分的服务平滑上线和下线&#xff0c;以及某个服务出现故障自动剔除。其实质就是维护一张记录各在线服务的表。让消费服知道服务在线可以请求。。。。。。 二、服务注册与发现…

SQL限制

SQL限制目录概述需求&#xff1a;设计思路实现思路分析1.URL管理参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive. happy…

PLL实验

PLL实验 开发板上面只有一个200MHz时钟输入&#xff0c;对于其它频率的时钟怎么办&#xff1f; 介绍 其实在很多 FPGA 芯片内部都集成了 PLL &#xff0c;其他厂商可能不叫 PLL &#xff0c;但是也有类似的功能模块&#xff0c;通过 PLL 可以倍频分频&#xff0c;产生其他很…

pytorch搭建yolov3网络

yolov3的整体网络结构 主要包含了两个部分。左边的Darknet-53主干特征提取网络主要用于提取特征。右边是一个FPN金字塔结构。 主干特征提取网络&#xff08;提取特征&#xff09; import math from collections import OrderedDict import torch.nn as nn#------------------…

MySQL事务相关知识

实践阅读&#xff1a;一文彻底读懂MySQL事务的四大隔离级别 1、什么是事务&#xff1f; 数据库事务&#xff08;简称&#xff1a;事务&#xff09;&#xff0c;是数据库管理系统执行过程中的一个逻辑单位&#xff0c;由一个有限的数据库操作序列构成&#xff0c;这些操作要么全…

AcWing 4645. 选数异或(预处理小区间 + 二分优化找)

题目如下&#xff1a; 题解 or 思路 在 [l,r][l, r][l,r] 区间内找到两个数 a,ba, ba,b 使得 a ^ b x 通过异或的性质&#xff1a; a ^ b ^ b x ^ b > a x ^ b 我们可以通过 b 可以迅速找到 a, a x ^ b 我们可以现预处理出所有小区间(大区间可以不需要&#xff0c;因为…

win11怎么分回c盘空间

有网友反映自己的win11系统有多个分区&#xff0c;c盘分区的空间比较小&#xff0c;便想通过win11分盘功能&#xff0c;将临近的磁盘空间分给c盘。那么win11怎么分回c盘空间&#xff1f;下面就教下大家win11将其他盘空间分回c盘的方法步骤。 工具/原料&#xff1a; 系统版本&am…

最近几年-基于深度学习自然语言处理的推荐系统-必读论文整理分享

基于内容的推荐&#xff08;Content-based Recommendation&#xff09;是信息过滤技术的延续与发展&#xff0c;它是建立在项目的内容信息上作出推荐的&#xff0c;而不需要依据用户对项目的评价意见&#xff0c;更多地需要用机器学习的方法从关于内容的特征描述的事例中得到用…

02-JVM堆里面的分区:Eden,survival (from+ to),老年代,各自的特点?

1.模型 堆里面分为新生代和老生代&#xff08;java8 取消了永久代&#xff0c;采用了 Metaspace&#xff09;&#xff0c;新生代包含 EdenSurvivor 区&#xff0c;survivor 区里面分为 from 和 to 区. 内存回收时&#xff0c;如果用的是复制算法&#xff0c;从 from 复制到 to…

项目实战之旅游网(十三)前台产品详情 前台收藏

目录 一.前台产品详情 1.查询产品 2.收藏按钮 二.前台收藏 本章的代码会统一放到最后。 一.前台产品详情 1.查询产品 即点击“查看详情”即可得到这个产品的详细描述。 并且项目运行起来之后&#xff0c;可以在后台新建新的产品&#xff0c;在前台可以实时查询到。 2.…

C工程与寄存器封装

目录 一、C语言工程简介 二、启动代码分析 三、C语言实现LED 四、寄存器的封装方式 五、寄存器操作的标准化 六、流水灯 一、C语言工程简介 先将工程模板解压 include里是.h文件 src里是.c文件 start里面是.s启动文件 ## NAME interface CROSS_COMPILE arm-no…

Fusion360 外壳开孔零件居中对齐的方法

DIY时需要根据从市场上采购的成品盒子进行开孔&#xff0c;通过3维软件进行开孔设计是比较方便的。Solidworks由于版权问题不易采用&#xff0c;Fusion360的个人版由于软件差异不像Solidworks方便约束定位。我通过尝试找到了适用方法。 先看成果。在一块板上居中位置开孔以便安…

电子学会2020年9月青少年软件编程(图形化)等级考试试卷(三级)答案解析

目录 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 二、判断题&#xff08;共10题&#xff0c;每题2分&#xff0c;共20分&#xff09; 三、编程题【该题由测评师线下评分】&#xff08;共3题&#xff0c;共30分&#xff09; 青少年软件…

阶段性回顾(4)与四道题目

TIPS 1. 当创建数组的时候&#xff0c;如果没有指定数组的元素个数也没关系&#xff0c;编译器会根据你初始化的内容来自行确定。 2. 在逻辑表达式当中&#xff0c;如果为真&#xff0c;就以1作为结果&#xff0c;如果为假&#xff0c;就以0作为结果。 3. 输入字符串的时候&…

VUE实例的组件的生命周期和数据共享和ref的使用方法(建议直接看ref)

目录VUE实例的组件的生命周期和数据共享组件间的数据共享ref的使用方法使用ref操作dom使用ref引用组件this.$nextTick(cb)方法的使用VUE实例的组件的生命周期和数据共享 生命周期和生命周期函数 这个是我学校vue书籍阿里云盘地址,有需要可以点击看看 生命周期&#xff08;Life…

对Java中异常的认识

文章目录一、异常的概念与体系结构1.异常的概念2.异常的体系结构3.异常的分类二、异常的处理1.防御式编程2. 异常的抛出3.异常的捕获4.异常处理流程总结三、自定义异常类一、异常的概念与体系结构 1.异常的概念 在生活中&#xff0c;当我们发现朋友表现出不舒服的情况&#x…

LabVIEW ​​单​进程​共享​变量​与​​全局​变量

LabVIEW ​​单​进程​共享​变量​与​​全局​变量 单​进程​共享​变量​与​LabVIEW​全局​变量​相似。​事实​上&#xff0c;​单​进程​共享​变量​的​实现​是在​LabVIEW​全局​变量​的​基础​上​增加​了​时间​标识​功能。 ​为了​比较​单​进程​…