尚医通 (二十五) --------- 医院接口开发

news2024/10/7 10:19:58

目录

  • 一、医院系统模拟接口
    • 1. 服务部署
    • 2. 操作说明
    • 3. 上传接口与回调接口
      • ① 业务术语
      • ② 安全控制
      • ③ 业务接口
      • ④ 平台接口
      • ⑤ 医院接口
  • 二、集成 MongoDB
  • 三、添加医院基础类
  • 四、上传医院
  • 五、参数签名
  • 六、图片 Base64 编码
  • 七、查询医院接口


一、医院系统模拟接口

1. 服务部署

① 找到资源文件夹下面的 hospital-manage 项目,导入 idea

在这里插入图片描述

在这里插入图片描述

② 导入sql,路径:hospital-manage/资源文件/sql/表结构.sql

在这里插入图片描述

在这里插入图片描述

③ 修改 application-dev.yml 文件数据库连接

在这里插入图片描述

④ 启动项目

在这里插入图片描述

2. 操作说明

① 访问项目

浏览器:http://localhost:9998/,如图

在这里插入图片描述
② 医院设置

我们在尚医通管理后台设置的医院信息配置到医院接口模拟系统,如图:

在这里插入图片描述

配置参数:

  • 医院 code:尚医通分配的医院 code
  • 签名 key:尚医通分配的签名 key
  • 统一预约挂号平台基础路径:尚医通接口基础路径

3. 上传接口与回调接口

上传接口包括的相关操作有医院、科室与排班等。

对应的测试数据在:hospital-manage/资源文件/示例数据。

回调接口包括预约下单、更新支付状态和取消预约等。

① 业务术语

医院编号:医院与尚医通合作后,尚医通合提供给医院的唯一标识ID号(hoscode)。

签名密钥:医院与尚医通合作后,尚医通提供给医院,用于接口调用的 MD5 数字签名算法的密码串 (signKey)。

② 安全控制

接口采用数据签名的方式来保证医院与尚医通系统间的身份验证、中间信息传递的完整性,以便进行电子商务安全当中非常重要的交易身份辨识、不可抵赖、防止篡改等功能。

③ 业务接口

传参说明:

所有参数递交的方式必须为 POST,参数值编码为 gb2312。如果采用拼接(如http://localhost?a=1&b=李四) 的形式提交,传参时要对参数值进行 url 编码,尤其是汉字、网址等。采用 Form 表单形式提交则不需要。参数值不要带空格。

验签参数sign生成:

a、组成加密串。所有变量值按照参数名 (不包含sign参数) 升序用 | 连接,最后连接 signKey。

b、加密。采用 32 位 MD5 小写 (编码utf-8) 加密。

c、例:假设接口参数 a=1,b=张三,c=13012345678,指派给商户的签名密钥signKey=1234567890,则加密串如下:1|张三|13012345678|1234567890

d、MD5(32位小写) 加密值核对。

Md5("123456")=e10adc3949ba59abbe56e057f20f883e

所有的字段都使用驼峰形式,如:agent_id 改为 agentId

返回/通知结果:所有接口同步返回

④ 平台接口

A、上传医院

医院的基本信息与规则信息

提交地址:http://localhost/api/hosp/saveHospital

请求参数:变量定义

字段名类型长度必输说明
hoscodestring30给医院分配的唯一标识
hosnamestring50医院名称
hostypestring1医院类型(1:三级甲等,2:三级乙等,3:二级甲等,4:二级乙等,5:一级)
provinceCodestring18省code (国家统计局对应省的code)
cityCodestring50市code (国家统计局对应市的code)
districtCodestring10区code(国家统计局对应区的code)
addressstring20详情地址
logoDatastring11医院logo(转换为base64字符串)
introstring医院简介
routestring255坐车路线
bookingRulestring8000预约规则,json数据
timestamplong时间戳,从1970-01-01 00:00:00算起的毫秒数
signstring32验签参数

bookingRule 例子:

{
	"cycle": "1",
	"releaseTime": "08:30",
	"stopTime": "11:30",
	"quitDay": "-1",
	"quitTime": "15:30",
	"rule": [
		"西院区预约号取号地点:西院区门诊楼一层大厅挂号窗口取号", "东院区预约号取号地点:东院区老门诊楼一层大厅挂号窗口或新门诊楼各楼层挂号/收费窗口取号"
     ]
}

bookingRule 说明:属性说明

  • cycle:预约周期
  • releaseTime:放号时间
  • stopTime:停挂时间
  • quitDay:退号截止天数(如:就诊前一天为-1,当天为0)
  • quitTime:退号时间
  • rule:预约规则,以数组形式传递

同步返回:
结果参数含义:

字段名类型长度必输说明
codestring结果编码。200:请求成功。不等于200:请求失败(message:失败原因)
messagestring100结果描述
datastring5000业务数据

B、上传科室

科室信息:
提交地址:http://localhost/api/hosp/saveDepartment

请求参数:

变量定义

字段名类型长度必输说明
hoscodestring30给医院分配的唯一标识
depcodestring50科室编号
depnamestring1科室名称
introstring18科室描述
bigcodestring50大科室编号
bignamestring10大科室名称
addressstring20详情地址
timestamplong时间戳。从1970-01-01 00:00:00算起的毫秒数
signstring32验签参数

同步返回:

结果参数含义

字段名类型长度必输说明
codestring结果编码。200:请求成功;不等于200:请求失败(message:失败原因)
messagestring100结果描述
datastring5000业务数据

C、上传排班

排班信息

提交地址:http://localhost/api/hosp/saveSchedule

请求参数:

变量定义

字段名类型长度必输说明
hoscodestring30给医院分配的唯一标识
depcodestring20科室编号
titlestring30职称
docnamestring30医生名称
skillstring300擅长技能
workDatestring10安排日期(yyyy-MM-dd)
workTimeint安排时间 (0:上午 1:下午)
reservedNumberint可预约数
availableNumberint剩余预约数
amountstring5挂号费
statusint排班状态 (-1:停诊 0:停约 1:可约)
hosScheduleIdstring30排班编号 (医院自己的排班主键)
timestamplong时间戳,从1970-01-01 00:00:00算起的毫秒数
signstring32

同步返回 :

结果参数含义

字段名类型长度必输说明
codestring结果编码。200:请求成功,不等于200:请求失败 (message:失败原因)
messagestring100结果描述
datastring5000业务数据

D、查询医院

医院信息

提交地址:http://localhost/api/hosp/hospital/show

请求参数:

变量定义

字段名类型长度必输说明
hoscodestring30给医院分配的唯一标识
timestamplong时间戳,从1970-01-01 00:00:00算起的毫秒数
signstring32验签参数。

同步返回:

结果参数含义

字段名类型长度必输说明
codestring结果编码,200:请求成功。不等于200:请求失败 (message:失败原因)
messagestring100结果描述
datastring5000业务数据

E、查询科室

科室信息

提交地址:http://localhost/api/hosp/department/list

请求参数

变量定义

字段名类型长度必输说明
hoscodestring30给医院分配的唯一标识
pageNumInt第几页
pageSizeInt每页个数
timestamplong时间戳。从1970-01-01 00:00:00算起的毫秒数
signstring32验签参数。

同步返回

结果参数含义

字段名类型长度必输说明
codestring结果编码,200:请求成功。不等于200:请求失败 (message:失败原因)
messagestring100结果描述
datastring5000业务数据

F、查询排班

医院信息

提交地址:http://localhost/api/hosp/schedule/list

请求参数

变量定义:

字段名类型长度必输说明
hoscodestring30给医院分配的唯一标识
pageNumInt第几页
pageSizeInt每页个数
timestamplong时间戳,从 1970-01-01 00:00:00 算起的毫秒数
signstring32验签参数

同步返回

结果参数含义:

字段名类型长度必输说明
codestring结果编码,200:请求成功,不等于200:请求失败 (message:失败原因)
messagestring100结果描述
datastring5000业务数据

G、删除科室

删除科室信息

提交地址:http://localhost/api/hosp/department/remove

请求参数

变量定义:

字段名类型长度必输说明
hoscodestring30给医院分配的唯一标识
depcodestring30科室编号
timestamplong时间戳,从1970-01-01 00:00:00算起的毫秒数
signstring32验签参数

同步返回

结果参数含义:

字段名类型长度必输说明
codestring结果编码 200:请求成功。不等于200:请求失败 (message:失败原因)
messagstring100结果描述
datastring5000业务数据

H、删除排班

删除排班信息

提交地址:http://localhost/api/hosp/schedule/remove

请求参数:

变量定义

字段名类型长度必输说明
hoscodestring30给医院分配的唯一标识
hosScheduleIdstrin30排班编号 (医院自己的排班主键)
timestamplong时间戳,从1970-01-01 00:00:00算起的毫秒数
signstring32验签参数

同步返回

结果参数含义

字段名类型长度必输说明
codestring结果编码。200:请求成功,不等于200:请求失败 (message:失败原因)
messagestring100结果描述
datastring5000业务数据

⑤ 医院接口

A、预约下单

医院的基本信息与规则信息

提交地址:${basePath}/order/submitOrder

请求参数:

变量定义

字段名类型长度必输说明
hoscodestring30给医院分配的唯一标识
depcodestring20科室编号
hosScheduleIdstring30排班编号 (医院自己的排班主键)
reserveDatestring10安排日期 (yyyy-MM-dd)
reserveTimeint安排时间(0:上午 1:下午)
amountstring5挂号费
namestring20就诊人姓名
sexint就诊人性别
birthdatestring20就诊人出生年月
phonestring11就诊人手机
isMarryint就诊人是否结婚
provinceCodestring50
cityCodestring50市code (国家统计局对应市的code)
districtCodestring10区code (国家统计局对应区的code)
addressstring20就诊人详情地址
contactsNamestring11联系人姓名
contactsCertificatesTypeint联系人证件类型
contactsCertificatesNostring30联系人证件号
contactsPhonestring11联系人手机
isInsureint是否有医保
timestamplong时间戳,从 1970-01-01 00:00:00 算起的毫秒数
signstring32验签参数

同步返回

结果参数含义:

字段名类型长度必输说明
codestring结果编码:200:请求成功,不等于200:请求失败(message:失败原因)
messagestring100结果描述
datastring5000业务数据

data业务数据字段:

字段名类型长度必输说明
hosRecordIdstring预约记录唯一标识 (医院预约记录主键)
numberint预约序号
reservedNumberint排班可预约数
availableNumberint排班剩余预约数
fetchTimestring50取号时间
fetchAddressstring200取号地址

B、更新支付状态
平台支付成功,通过该接口更新医院支付状态

提交地址 :${basePath}/order/updatePayStatus

请求参数 :

变量定义

字段名类型长度必输说明
hoscodestring30给医院分配的唯一标识
hosRecordIdstring预约记录唯一标识 (医院预约记录主键)
timestamplong时间戳,从1970-01-01 00:00:00算起的毫秒数
signstring32验签参数

同步返回:

结果参数含义

字段名类型长度必输说明
codestring结果编码,200:请求成功。不等于200:请求失败 (message:失败原因)
messagestring100结果描述
datastring5000业务数据

C、取消预约

平台通过该接口取消预约

提交地址:${basePath}/order/updateCancelStatus

请求参数

变量定义

字段名类型长度必输说明
hoscodestring30给医院分配的唯一标识
hosRecordIdstring预约记录唯一标识 (医院预约记录主键)
timestamplong时间戳,从 1970-01-01 00:00:00 算起的毫秒数
signstring32验签参数

同步返回

结果参数含义

字段名类型长度必输说明
codestring结果编码,200:请求成功,不等于200:请求失败 (message:失败原因)
messagestring100结果描述
datastring5000业务数据

二、集成 MongoDB

A、添加依赖

service-hosp 模块 pom.xml 添加依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

在这里插入图片描述

B、添加配置

在 application.properties 文件添加配置

spring.data.mongodb.uri=mongodb://192.168.38.130:27017/yygh_hosp

说明:改为自己安装 MongoDB 的 IP 地址

这样写也可以:

在这里插入图片描述

三、添加医院基础类

A、添加 model

说明:由于实体对象没有逻辑,我们已经统一导入com.fancy.yygh.model.hosp.Hospital

B、添加 Repository

@Repository
public interface HospitalRepository extends MongoRepository<Hospital,String> {
    
}

在这里插入图片描述

C、添加 service 接口及实现类

添加 com.fancy.yygh.hosp.service.HospitalService 接口

public interface HospitalService {
 
}

添加com.fancy.yygh.hosp.service.impl.HospitalServiceImpl接口实现

package com.fancy.yygh.hosp.service.impl;

@Service
public class HospitalServiceImpl implements HospitalService {

	@Autowired
	private HospitalRepository hospitalRepository;

}

在这里插入图片描述

D、添加 controller

添加 com.fancy.yygh.hosp.api.ApiController

package com.fancy.yygh.hosp.api;

@Api(tags = "医院管理API接口")
@RestController
@RequestMapping("/api/hosp")
public class ApiController {

	@Autowired
	private HospitalService hospitalService;

}

说明:平台对外开发的接口都写在该 Controller 类

在这里插入图片描述

四、上传医院

医院编号是平台分配的,全局唯一,上传医院接口可以多次调用,如果存在相同编号的为更新操作

A、接口数据分析

{
	"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": [
			"西院区预约号取号地点:西院区门诊楼一层大厅挂号窗口取号",
			"东院区预约号取号地点:东院区老门诊楼一层大厅挂号窗口或新门诊楼各楼层挂号/收费窗口取号"
		]
    }
}

说明:

  • 数据分为医院基本信息与预约规则信息
  • 医院logo转换为base64字符串
  • 预约规则信息属于医院基本信息的一个属性
  • 预约规则rule,以数组形式传递
  • 数据传递过来我们还要验证签名,只允许平台开通的医院可以上传数据,保证数据安全性

B、添加 service 接口

在 HospitalService 类添加接口

/**
 * 上传医院信息
 * @param paramMap
*/
void save(Map<String, Object> paramMap);

说明:参数使用Map,减少对象封装,有利于签名校验,后续会体验到

在 HospitalServiceImpl 类添加实现

@Override
public void save(Map<String, Object> paramMap) {
	log.info(JSONObject.toJSONString(paramMap));
	Hospital hospital = JSONObject.parseObject(JSONObject.toJSONString(paramMap),Hospital.class);
	//判断是否存在
	Hospital targetHospital = hospitalRepository.getHospitalByHoscode(hospital.getHoscode());
	if(null != targetHospital) {
		hospital.setStatus(targetHospital.getStatus());
		hospital.setCreateTime(targetHospital.getCreateTime());
		hospital.setUpdateTime(new Date());
		hospital.setIsDeleted(0);
		hospitalRepository.save(hospital);
	} else {
		//0:未上线 1:已上线
		hospital.setStatus(0);
		hospital.setCreateTime(new Date());
		hospital.setUpdateTime(new Date());
		hospital.setIsDeleted(0);
		hospitalRepository.save(hospital);
	}
}

说明:

Hospital hospital = JSONObject.parseObject(JSONObject.toJSONString(paramMap),Hospital.class);

Map 转换为 Hospital 对象时,预约规则 bookingRule 为一个对象属性,rule 为一个数组属性,因此在转换时我们要重新对应的 set 方法,不然转换不会成功

public class Hospital extends BaseMongoEntity {

	private static final long serialVersionUID = 1L;
	
	@ApiModelProperty(value = "医院编号")
	private String hoscode;
	
	...
	
	//预约规则
	@ApiModelProperty(value = "预约规则")
	private BookingRule bookingRule;
	
	public void setBookingRule(String bookingRule) {
		this.bookingRule = JSONObject.parseObject(bookingRule, BookingRule.class);
	}

}


public class BookingRule {

	@ApiModelProperty(value = "预约周期")
	private Integer cycle;
	
	...
	
	@ApiModelProperty(value = "预约规则")
	private List<String>rule;
	
	/**
	    *
	    * @param rule
	*/
	public void setRule(String rule) {
		if(!StringUtils.isEmpty(rule)) {
			this.rule = JSONArray.parseArray(rule, String.class);
		}
	}

}

C、添加repository接口

在 HospitalRepository 类添加接口

Hospital getHospitalByHoscode(String hoscode);

D、添加 controller 接口

在 ApiController 类添加接口

@ApiOperation(value = "上传医院")
@PostMapping("saveHospital")
public Result saveHospital(HttpServletRequest request) {
   	Map<String, Object> paramMap = HttpRequestHelper.switchMap(request.getParameterMap());
	hospitalService.save(paramMap);
	return Result.ok();
}

E、添加帮助类

在 service-util 模块添加 HttpRequestHelper 帮助类

package com.fancy.yygh.common.helper;


@Slf4j
public class HttpRequestHelper {

	/**
	*
	* @param paramMap
	* @return
	*/
	public static Map<String, Object> switchMap(Map<String, String[]> paramMap) {
		Map<String, Object> resultMap = new HashMap<>();
		for (Map.Entry<String, String[]> param : paramMap.entrySet()) {
			resultMap.put(param.getKey(), param.getValue()[0]);
		}
		return resultMap;
	}
}

五、参数签名

A、封装签名方法

在 service-util 模块 HttpRequestHelper 类添加方法

public static void main(String[] args) {
    Map<String, Object> paramMap = new HashMap<>();
    paramMap.put("d", "4");
    paramMap.put("b", "2");
    paramMap.put("c", "3");
    paramMap.put("a", "1");
	paramMap.put("timestamp", getTimestamp());
	log.info(getSign(paramMap, "111111111"));
}


/**
* 请求数据获取签名
* @param paramMap
* @param signKey
* @return
*/
public static String getSign(Map<String, Object> paramMap, String signKey) {
	if(paramMap.containsKey("sign")) {
        paramMap.remove("sign");
    }
    TreeMap<String, Object> sorted = new TreeMap<>(paramMap);
    StringBuilder str = new StringBuilder();
	for (Map.Entry<String, Object> param : sorted.entrySet()) {
        str.append(param.getValue()).append("|");
    }
    str.append(signKey);
	log.info("加密前:"+ str.toString());
    String md5Str = MD5.encrypt(str.toString());
	log.info("加密后:"+ md5Str);
	return md5Str;
}

/**
 * 签名校验
 * @param paramMap
* @param signKey
* @return
*/
public static boolean isSignEquals(Map<String, Object> paramMap, String signKey) {
    String sign = (String)paramMap.get("sign");
    String md5Str = getSign(paramMap, signKey);
	if(!sign.equals(md5Str)) {
		return false;
    }
	return true;
}

/**
 * 获取时间戳
 * @return
*/
public static long getTimestamp() {
	return new Date().getTime();
}

B、上传医院添加签名校验

我们在医院设置的时候,为每个医院生成了医院编码与签名key,因此我在验证签名时要根据医院编码去动态获取签名key,然后再做签名校验

添加获取签名key接口

1,在 HospitalSetService 类添加接口

/**
 * 获取签名key
 * @param hoscode
* @return
*/
String getSignKey(String hoscode);

2,在 HospitalSetServiceImpl 类实现接口

@Override
public String getSignKey(String hoscode) {
	HospitalSet hospitalSet = this.getByHoscode(hoscode);
	if(null == hospitalSet) {
		throw new YyghException(ResultCodeEnum.HOSPITAL_OPEN);
	}
	if(hospitalSet.getStatus().intValue() == 0) {
		throw new YyghException(ResultCodeEnum.HOSPITAL_LOCK);
	}
	return hospitalSet.getSignKey();
}

/**
 * 根据hoscode获取医院设置
 * @param hoscode
* @return
*/
private HospitalSet getByHoscode(String hoscode) {
	return hospitalSetMapper.selectOne(new QueryWrapper<HospitalSet>().eq("hoscode", hoscode));
}

修改 ApiController 类上传医院接口:

修改 ApiController 类上传医院接口

@ApiOperation(value = "上传医院")
@PostMapping("saveHospital")
public Result saveHospital(HttpServletRequest request) {
	Map<String, Object> paramMap = HttpRequestHelper.switchMap(request.getParameterMap());
	//必须参数校验 略
	String hoscode = (String)paramMap.get("hoscode");
	if(StringUtils.isEmpty(hoscode)) {
		throw new YyghException(ResultCodeEnum.PARAM_ERROR);
	}
	//签名校验
	if(!HttpRequestHelper.isSignEquals(paramMap, hospitalSetService.getSignKey(hoscode))) {
		throw new YyghException(ResultCodeEnum.SIGN_ERROR);
	}

	hospitalService.save(paramMap);
	return Result.ok();
}

六、图片 Base64 编码

A、图片 base64 说明

图片的 Base64 编码就是可以将一张图片数据编码成一串字符串,使用该字符串代替图像地址 url

在前端页面中常见的 Base64 图片的引入方式:

<img src="data:image/png;base64,iVBORw0..>

优点

  • Base64 格式的图片是文本格式,占用内存小,转换后的大小比例大概为 1/3,降低了资源服务器的消耗;
  • 网页中使用 Base64 格式的图片时,不用再请求服务器调用图片资源,减少了服务器访问次数。

缺点

  • Base64 格式的文本内容较多,存储在数据库中增大了数据库服务器的压力
  • 网页加载图片虽然不用访问服务器了,但因为 Base64 格式的内容太多,所以加载网页的速度会降低,可能会影响用户的体验。

说明:医院 logo 图片小,因此上传医院 logo 是可以使用Base64 格式保存

B、图片 Base64 工具类

在 common-util 模块添加工具类
添加 com.fancy.yygh.common.util.ImageBase64Util 类

package com.fancy.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 "";
	}
}

C、上传医院接口修正

图片转换为 Base64 字符串时,该字符串中包含大量的加号“+”,服务器在解析数据时会把加号当成连接符,转换为空格,因此我们要做一下特殊处理

修改 ApiController 类上传接口

@ApiOperation(value = "上传医院")
@PostMapping("saveHospital")
public Result saveHospital(HttpServletRequest request) {
    Map<String, Object> paramMap = HttpRequestHelper.switchMap(request.getParameterMap());
	//必须参数校验 略
	String hoscode = (String)paramMap.get("hoscode");
	if(StringUtils.isEmpty(hoscode)) {
		throw new YyghException(ResultCodeEnum.PARAM_ERROR);
   	}
	//传输过程中“+”转换为了“ ”,因此我们要转换回来
	String logoDataString = (String)paramMap.get("logoData");
	if(!StringUtils.isEmpty(logoDataString)) {
		String logoData = logoDataString.replaceAll("", "+");
		paramMap.put("logoData", logoData);
    }

	//签名校验
	if(!HttpRequestHelper.isSignEquals(paramMap, hospitalSetService.getSignKey(hoscode))) {
		throw new YyghException(ResultCodeEnum.SIGN_ERROR);
    }

	hospitalService.save(paramMap);
	return Result.ok();
}

七、查询医院接口

A、添加 service 接口

在 HospitalService 类添加接口

/**
 * 查询医院
 * @param hoscode
* @return
*/
Hospital getByHoscode(String hoscode);

在 HospitalServiceImpl 类添加实现

@Override
public Hospital getByHoscode(String hoscode) {
	return hospitalRepository.getHospitalByHoscode(hoscode);
}

B、添加 controller 接口

在 ApiController 类添加接口

@ApiOperation(value = "获取医院信息")
@PostMapping("hospital/show")
public Result hospital(HttpServletRequest request) {
	Map<String, Object> paramMap = HttpRequestHelper.switchMap(request.getParameterMap());
	//必须参数校验 略
	String hoscode = (String)paramMap.get("hoscode");
	if(StringUtils.isEmpty(hoscode)) {
		throw new YyghException(ResultCodeEnum.PARAM_ERROR);
	}
	//签名校验
	if(!HttpRequestHelper.isSignEquals(paramMap, hospitalSetService.getSignKey(hoscode))) {
		throw new YyghException(ResultCodeEnum.SIGN_ERROR);
	}
	
	return Result.ok(hospitalService.getByHoscode((String)paramMap.get("hoscode")));
}

在这里插入图片描述

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

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

相关文章

刷题笔记之十二(快到碗里来+跳台阶+变态跳台阶+不用加减乘除做加法+三角形+猴子分桃+反转部分单向链表)

目录 1. 快到碗里来 2. 跳台阶 3. 变态跳台阶 4. ConcurrentHashMap使用lock关键字保证线程安全;Arrays.asList返回值是List接口对象 5. 字符串对象比较相等,使用equals比较内容;使用 比较的是地址 6. 编译命令: javac 源文件名称.java; 运行命令: java 主类名称 要传递的…

第七章第二节:B树和B+树

文章目录教程&#xff1a;1. B树1.1 B树的定义1.2 B树的高度1.3 B树的插入和 删除1.4 B树的删除1.5 总结&#xff1a;2. B树2.1 B树的查找2.2 B树与B树的对比2.3 总结教程&#xff1a; B树&#xff1a; https://www.bilibili.com/video/BV1b7411N798/?p72&share_sourceco…

深入理解MySQL数据库(Innodb存储引擎)

1.BTree 什么是B Tree 1&#xff09;树中每个结点至多有M棵子树&#xff08;即至多含有m-1个关键字&#xff09; 2&#xff09;若根节点不是终端结点&#xff0c;则至少有两颗子树 3&#xff09;所有的叶子结点都出现在同一层次上&#xff0c;并且不带信息 什么是BTree …

【毕业设计】37-基于单片机智能楼宇消防监控系统设计(原理图工程+仿真工程+源代码+答辩论文+答辩PPT)

【毕业设计】37-基于单片机智能楼宇消防监控系统设计&#xff08;原理图工程仿真工程源代码答辩论文答辩PPT&#xff09; 文章目录【毕业设计】37-基于单片机智能楼宇消防监控系统设计&#xff08;原理图工程仿真工程源代码答辩论文答辩PPT&#xff09;资料下载链接任务书设计说…

Redis集群(Cluster)

Redis集群(Cluster) 单台redis容量限制&#xff0c;如何进行扩容&#xff1f;继续加内存、加硬件么&#xff1f;单台redis并发写量太大有性能瓶颈&#xff0c;如何解决&#xff1f;redis3.0中提供了集群可以解决这些问题。 redis集群是对redis的水平扩容&#xff0c;即启动N个…

静态后台管理(9页)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 |学生管理系统网页设计 | OA管理系统 | 后台管理模板 | 智能停车系统 | 等网站的设计与制作 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 H…

C++ Visual Studio 2022 中的改进、行为更改和错误修复

目录 Visual Studio 2022 版本 17.4 中的一致性改进 作用域的基础类型没有固定类型enum 定义中没有固定基础类型的枚举器类型enum Visual Studio 2022 版本 17.3 中的一致性改进 改进了指针之间的修饰符兼容性检查 Visual Studio 2022 版本 17.2 中的一致性改进 未终止的双向…

【分隔结构】定从分离

形式 先行词 其他定语 定语从句先行词 状语 定语从句作主语的先行词 谓语 定语从句 练习一 他们从一部分人来说&#xff0c;是受到了 1998 年才获得的 DNA 证据的启发&#xff0c;这份 DNA 证据&#xff0c;几乎肯定的证明了 Thomas Jefferson 和 他的奴隶 Sally Hemin…

力扣(LeetCode)16. 最接近的三数之和(C++)

双指针 快排使 numsnumsnums 正序。 设置三个指针 iii 指向 numsnumsnums 第一个数&#xff0c;从前往后枚举 nums[i]nums[i]nums[i] &#xff0c; lll 从 nums[i1]nums[i1]nums[i1] 往后&#xff0c;指向第二个数&#xff0c;rrr 从 nums.size()−1nums.size()-1nums.size()…

【博客539】使用openssl手动为k8s集群签发证书

使用openssl手动为k8s集群签发证书 创建ca私钥和ca证书 1、生成ca私钥&#xff1a;生成一个 2048 位的 ca.key 文件 openssl genrsa -out ca.key 2048 2、基于ca私钥&#xff0c;生成根(root)证书&#xff1a;在 ca.key 文件的基础上&#xff0c;生成 ca.crt 文件 openssl re…

[MQ] 交换机与队列的介绍

✨✨个人主页:沫洺的主页 &#x1f4da;&#x1f4da;系列专栏: &#x1f4d6; JavaWeb专栏&#x1f4d6; JavaSE专栏 &#x1f4d6; Java基础专栏&#x1f4d6;vue3专栏 &#x1f4d6;MyBatis专栏&#x1f4d6;Spring专栏&#x1f4d6;SpringMVC专栏&#x1f4d6;SpringBoot专…

[Spring Cloud] Open Feign 使用

✨✨个人主页:沫洺的主页 &#x1f4da;&#x1f4da;系列专栏: &#x1f4d6; JavaWeb专栏&#x1f4d6; JavaSE专栏 &#x1f4d6; Java基础专栏&#x1f4d6;vue3专栏 &#x1f4d6;MyBatis专栏&#x1f4d6;Spring专栏&#x1f4d6;SpringMVC专栏&#x1f4d6;SpringBoot专…

机械设计基础试题3

一、判断题&#xff08;请在后面的括号中&#xff0c;正确的填√&#xff0c;错误的填&#xff09; &#xff08;20分&#xff09; 1. 如果机构的自由度F&#xff1d;2&#xff0c;则机构无确定性运动。 &#xff08; &#xff09; 2. 作相对运动的三个构件的三个瞬心不一定在一…

JavaEE 进阶:Spring 的创建和使用

文章目录前言一、创建 Spring 项⽬1、创建⼀个 Maven 项⽬2、添加 Spring 框架⽀持3、添加启动类二、存储 Bean 对象1、创建 Bean2、将 Bean 注册到容器三、获取并使⽤ Bean 对象1、创建 Spring 上下⽂① ApplicationContextⅠ 注意事项② BeanFactory③ ApplicationContext VS…

【浅学Java】Bean的作用域和生命周期

Bean的作用域和生命周期1. Bean的作用域1.1 什么是Bean的作用域1.2 Bean的6种作用域singleton——单例作用域prototype——多例作用域request——请求作用域session——会话作用域application——全局作用域(了解)websoccket——HTTP WebSocket作用域(了解)1.3 设置作用域2. Be…

计算机毕业设计node.js+vue+Element企业员工信息管理系统

项目介绍 随着Internet的发展,人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化、网络化和电子化。本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采用node框架和node来完成对系统的设计。整个开发过程首先对企业员工管理系统进行需求分…

LVS-NAT模式部署

目录 一、环境准备 1、准备三台centos服务器 2、实验拓扑 3、NAT模式介绍 二、LVS-NAT模式部署 1、给lvs服务器安装LVS 2、新建LVS集群 3、添加Real Server服务器节点 4、开启路由转发 5、给后端web服务器配置网关 6、效果测试 一、环境准备 1、准备三台centos服务器…

ctfhub-web-warmup

打开题目链接 是一张图 查看源代码 提示source.php 访问这个文件 得到源码 <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["source">"source.php","hint">"hint.php…

Java毕业设计项目_企业级实战全栈项目中信CRM

【教程、代码】文章底部 1.学习目标视频教程目录【教程、代码】文章底部2.CRM 系统概念与项目开发流程2.1. CRM基本概念 圈内存在这么一句话&#xff1a;“世上本来没有CRM&#xff0c;大家的生意越来越难做了&#xff0c;才有了CRM。”在同质化竞争时代&#xff0c;顾客资产尤…

[附源码]java毕业设计社区医院管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…