## 尚医通
尚医通医院接口开发**
引言:
假期开始学习尚硅谷的尚医通项目,前边的代码还是比较简单的,主要是对医院的crud,但到了医院接口开发部分就感觉难度增加了,在此记录一下。
1.上传医院接口:
详细的接口文档就看尚硅谷的资料。
1.1上传医院:上传医院的信息和规则然后存储在数据库中(mongo,关于mongo非关系型数据库就不多做解释了,我也是以前没学过,做这个项目才学的.
上图就是医院管理的界面,里边是输入json数据传递到后端然后存储到数据库中.
json:
{
"hoscode": "1000_0",
"hosname": "北京协和医院",
"hostype": "1",
"provinceCode": "110000",
"cityCode": "110100",
"districtCode": "110102",
"address": "大望路",
"intro": "北京协和医院是集医疗、教学、科研于一体的大型三级甲等综合医院,是国家卫生计生委指定的全国疑难重症诊治指导中心,也是最早承担高干保健和外宾医疗任务的医院之一,以学科齐全、技术力量雄厚、特色专科突出、多学科综合优势强大享誉海内外。在2010、2011、2012、2013、2014年复旦大学医院管理研究所公布的“中国最佳医院排行榜”中连续五年名列榜首。\n\n医院建成于1921年,由洛克菲勒基金会创办。建院之初,就志在“建成亚洲最好的医学中心”。90余年来,医院形成了“严谨、求精、勤奋、奉献”的协和精神和兼容并蓄的特色文化风格,创立了“三基”、“三严”的现代医学教育理念,形成了以“教授、病案、图书馆”著称的协和“三宝”,培养造就了张孝骞、林巧稚等一代医学大师和多位中国现代医学的领军人物,并向全国输送了大批的医学管理人才,创建了当今知名的10余家大型综合及专科医院。2011年在总结90年发展经验的基础上,创新性提出了“待病人如亲人,提高病人满意度;待同事如家人,提高员工幸福感”新办院理念。\n\n目前,医院共有2个院区、总建筑面积53万平方米,在职职工4000余名、两院院士5人、临床和医技科室53个、国家级重点学科20个、国家临床重点专科29个、博士点16个、硕士点29个、国家级继续医学教育基地6个、二级学科住院医师培养基地18个、三级学科专科医师培养基地15个。开放住院床位2000余张,单日最高门诊量约1.5万人次、年出院病人约8万余人次。被评为“全国文明单位”、“全国创先争优先进基层党组织”、“全国卫生系统先进集体”、“首都卫生系统文明单位”、“最受欢迎三甲医院”,荣获全国五一劳动奖章。同时,医院还承担着支援老少边穷地区、国家重要活动和突发事件主力医疗队的重任,在2008年北京奥运工作中荣获“特别贡献奖”。\n\n90多年来,协和人以执着的医志、高尚的医德、精湛的医术和严谨的学风书写了辉煌的历史,今天的协和人正为打造“国际知名、国内一流”医院的目标而继续努力。",
"route": "东院区乘车路线:106、108、110、111、116、684、685路到东单路口北;41、104快、814路到东单路口南;1、52、802路到东单路口西;20、25、37、39路到东单路口东;103、104、420、803路到新东安市场;地铁1、5号线到东单。\n西院区乘车路线:68路到辟才胡同东口;更多乘车路线详见须知。",
"logoData": "iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAMAAABOo35HAAADAFBMVEUAAAD///79/v3///0BTyP8
"bookingRule": {
"cycle": "10",
"releaseTime": "08:30",
"stopTime": "11:30",
"quitDay": "-1",
"quitTime": "15:30",
"rule": [
"西院区预约号取号地点:西院区门诊楼一层大厅挂号窗口取号",
"东院区预约号取号地点:东院区老门诊楼一层大厅挂号窗口或新门诊楼各楼层挂号/收费窗口取号"
]
}
}
然后就根据开发文档提供的地址进行编码:
1.1controller:
@PostMapping("saveHospital")
public Result saveHosp(HttpServletRequest request){
//获取到传递过来的医院信息
Map<String, String[]> parameterMap = `request.getParameterMap();`
Map<String, Object> map = HttpRequestHelper.switchMap(parameterMap);
//存到mong中
hospitalService.save(map);
return Result.ok();
}
注:
因为前端是把json数据以表单的形式发送到后端,这里就直接用:
request.getParameterMap();
来直接取到前段传递的参数。同时为了以后操作数据方便就直接把 Map<String, String[]>转化为Map<String, Object> map。
1.2:Mongodb整合:
Spring Data提供了对mongodb数据访问的支持,我们只需要继承MongoRepository类,按照Spring Data规范就可以了,就和mybatis-plus差不多.
package com.tan.yygh.hosp.reposity;
import com.atguigu.yygh.model.hosp.Hospital;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface HospitalReposity extends MongoRepository<Hospital,String> {
//mong自动查询,不用写具体
//判断是否存在数据
Hospital getHospitalByHoscode(String hoscode);
}
这个神奇的是不需要写具体的实现,它底层会自动帮助你根据你的方法名字来实现,虽然这样变简单了,但是得起对方法名,我由于没有弄正确方法名很长一段时间里找不到哪里出错.方法名的规范去看一下官网就行.
1.3:service
package com.tan.yygh.hosp.service;
import java.util.Map;
public interface HospitalService {
//上传医院
void save(Map<String, Object> map);
}
package com.tan.yygh.hosp.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.atguigu.yygh.model.hosp.Hospital;
import com.tan.yygh.hosp.reposity.HospitalReposity;
import com.tan.yygh.hosp.service.HospitalService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.Map;
@Service
public class HospitalServalImpl implements HospitalService {
@Autowired
private HospitalReposity hospitalReposity;
@Override
public void save(Map<String, Object> map) {
//先判断是否存在相同的数据,存在就修改,不存在就添加
//1.map变成字符串
String s = JSONObject.toJSONString(map);
//然后把字符串转化为对象
Hospital hospital = JSONObject.parseObject(s, Hospital.class);
//判断数据是否存在,取对象中的一个属性查询
String hoscode = hospital.getHoscode();
//判断数据是否存在
Hospital Exithospital= hospitalReposity.getHospitalByHoscode(hoscode);
if (null != Exithospital) {
//存在就修改:感觉直接进行有好提示会好一点
hospital.setStatus(Exithospital.getStatus());
hospital.setCreateTime(Exithospital.getCreateTime());
hospital.setUpdateTime(Exithospital.getUpdateTime());
hospital.setIsDeleted(0);
hospitalReposity.save(hospital);
}else{
//存在就修改:感觉直接进行有好提示会好一点
hospital.setStatus(0);
hospital.setCreateTime(new Date());
hospital.setUpdateTime(new Date());
hospital.setIsDeleted(0);
hospitalReposity.save(hospital);
}
}
}
注:
service层的方法就是把前端返回的json数据封装变成一个对象:
//1.map变成字符串
String s = JSONObject.toJSONString(map);
//然后把字符串转化为对象
Hospital hospital = JSONObject.parseObject(s, Hospital.class);
这是JSONObject的两个方法.
然后下边的流程就是:
先判断数据是否存在,就随便从这个对象中取一个属性的值,然后从数据库中条件查询是否存在,
这个属性值也取的比较特殊:是医院的ID,每个都不同,所以不会冲突.
如果存在的话就执行更新操作,不存在就保存:
save()方法的特性就是如果数据存在就更新,不存在就保存,但我觉得如果存在的话就直接提示就行,再保存一个感觉没有必要。
从图中我们可以看到,单击保存的时候会执行/hospital/save的方法,我们看一下这个方法:
@RequestMapping(value="/hospital/save",method=RequestMethod.POST)
public String saveHospital(String data, HttpServletRequest request) {
try {
apiService.saveHospital(data);
} catch (YyghException e) {
return this.failurePage(e.getMessage(),request);
} catch (Exception e) {
return this.failurePage("数据异常",request);
}
return this.successPage(null,request);
}
以及service对应的方法:
@Override
public boolean saveHospital(String data) {
JSONObject jsonObject = JSONObject.parseObject(data);
Map<String, Object> paramMap = new HashMap<>();
System.out.println(this);
System.out.println(this.getApiUrl());
paramMap.put("hoscode",this.getHoscode());
paramMap.put("hosname",jsonObject.getString("hosname"));
paramMap.put("hostype",jsonObject.getString("hostype"));
paramMap.put("provinceCode",jsonObject.getString("provinceCode"));
paramMap.put("cityCode", jsonObject.getString("cityCode"));
paramMap.put("districtCode",jsonObject.getString("districtCode"));
paramMap.put("address",jsonObject.getString("address"));
paramMap.put("intro",jsonObject.getString("intro"));
paramMap.put("route",jsonObject.getString("route"));
//图片
paramMap.put("logoData", jsonObject.getString("logoData"));
JSONObject bookingRule = jsonObject.getJSONObject("bookingRule");
paramMap.put("bookingRule",bookingRule.toJSONString());
paramMap.put("timestamp", HttpRequestHelper.getTimestamp());
paramMap.put("sign", MD5.encrypt(this.getSignKey()));
JSONObject respone =
HttpRequestHelper.sendRequest(paramMap,this.getApiUrl()+"/api/hosp/saveHospital");
System.out.println(respone.toJSONString());
if(null != respone && 200 == respone.getIntValue("code")) {
return true;
} else {
throw new YyghException(respone.getString("message"), 201);
}
}
APIService:saveHospital(String data):
从里边可以看出把前端数据封装到map中去,然后再向服务层的模块发送请求去保存数据:
JSONObject respone =
HttpRequestHelper.sendRequest(paramMap,this.getApiUrl()+"/api/hosp/saveHospital");
这行代码是关键,其中的this.getApiUrl()如下:
private String getApiUrl() {
HospitalSet hospitalSet = hospitalSetMapper.selectById(1);
return hospitalSet.getApiUrl();
}
也就是从数据库中取出第一条数据的url作为路径
在这个项目中因为对应的服务端接口的编写都在8201这个端口上,所以才会把这个url给拼接上去,其实不管取数据库中的第几条数据,对应的url都会是这个,后边的地址就是接口文档中要规范的地址。