開發(fā)分布式醫(yī)療掛號系統(tǒng)MongoDB集成實(shí)現(xiàn)上傳醫(yī)院接口
前言
需求:在《分布式預(yù)約掛號平臺》中完成上傳醫(yī)院接口開發(fā),再通過醫(yī)院接口模擬系統(tǒng)(醫(yī)院管理表)調(diào)用平臺中的接口,從而實(shí)現(xiàn)上傳醫(yī)院的功能。另外,所有通過平臺中接口上傳的信息都需要被保存到MongoDB中,通過MongoDB來進(jìn)行操作。
本篇文章根據(jù)上述需求,對《分布式醫(yī)療掛號系統(tǒng)》中的上傳醫(yī)院接口進(jìn)行實(shí)現(xiàn),項(xiàng)目代碼已同步至github,https://github.com/Guoqianliang/yygh_parent
一、集成MongoDB
上傳醫(yī)院接口的開發(fā)仍然在之前創(chuàng)建好的service-hosp模塊中進(jìn)行,由于此次額外使用了MongoDB技術(shù),所以首先需要引入MongoDB的依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
除了引入MongoDB的依賴還需要將MongoDB數(shù)據(jù)庫添加到配置中:
spring.data.mongodb.uri=mongodb://[ip地址]:27017/[MongoDB的數(shù)據(jù)庫]
將來通過接口會向MongoDB上傳一張hospital文檔,下標(biāo)對這些記錄進(jìn)行說明,這些表在Java中也需要有一個對應(yīng)的實(shí)體類。

二、開發(fā)Controller層
上傳醫(yī)院的接口路徑為:/api/hosp/saveHospital,下面分析ApiController中上傳醫(yī)院接口所做的事情:
1.將從醫(yī)院管理表傳遞過來的醫(yī)院信息轉(zhuǎn)換為Object類型
2.獲取醫(yī)院管理表中的密鑰(已經(jīng)使用MD5加密好了)
3.獲取醫(yī)院設(shè)置表中的密鑰并進(jìn)行MD5加密 此處調(diào)用醫(yī)院設(shè)置業(yè)務(wù)層
4.密鑰不匹配就拋出錯誤
5.傳遞的圖片涉及base64編碼問題,需要將logoData記錄中所有的" "替換為+
6.執(zhí)行上傳操作 此處調(diào)用醫(yī)院管理業(yè)務(wù)層
詳細(xì)代碼實(shí)現(xiàn):
@RestController
@RequestMapping("/api/hosp")
public class ApiController {
@Autowired
private HospitalService hospitalService;
@Autowired
private HospitalSetService hospitalSetService;
@ApiOperation(value = "上傳醫(yī)院到數(shù)據(jù)庫")
@PostMapping("saveHospital")
public Result saveHosp(HttpServletRequest request) {
// 1.將從醫(yī)院管理表傳遞過來的醫(yī)院信息轉(zhuǎn)換為Object類型
Map<String, String[]> requestMap = request.getParameterMap();
Map<String, Object> paramMap = HttpRequestHelper.switchMap(requestMap);
// 2.獲取醫(yī)院管理表中的密鑰(已經(jīng)使用MD5加密好了)
String hospSign = (String) paramMap.get("sign");
// 3.獲取醫(yī)院設(shè)置表中的密鑰并進(jìn)行MD5加密
String hoscode = (String) paramMap.get("hoscode");
String signKey = hospitalSetService.getSignKey(hoscode);
String signKeyMd5 = MD5.encrypt(signKey);
// 4.密鑰不匹配就拋出錯誤
if (!hospSign.equals(signKeyMd5)) {
throw new YyghException(ResultCodeEnum.SIGN_ERROR);
}
// 5.傳遞的圖片涉及base64編碼問題,需要將logoData記錄中所有的" "替換為+
String logoData = (String) paramMap.get("logoData");
logoData = logoData.replaceAll(" ", "+");
paramMap.put("logoData", logoData);
// 6.執(zhí)行上傳操作
hospitalService.save(paramMap);
return Result.ok();
}
}
三、開發(fā)Service層
醫(yī)院設(shè)置的Service層
在醫(yī)院設(shè)置的Service層中根據(jù)醫(yī)院編碼獲取SignKey,下面是接口和實(shí)現(xiàn)類:
public interface HospitalSetService extends IService<HospitalSet> {
String getSignKey(String hoscode);
}
@Service
public class HospitalSetServiceImpl extends ServiceImpl<HospitalSetMapper, HospitalSet>
implements HospitalSetService {
@Override
public String getSignKey(String hoscode) {
QueryWrapper<HospitalSet> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("hoscode", hoscode);
HospitalSet hospitalSet = baseMapper.selectOne(queryWrapper);
return hospitalSet.getSignKey();
}
}
醫(yī)院管理的Service層
分析醫(yī)院管理Service層所做的事情:
1.把參宿map集合轉(zhuǎn)換為Hospital對象(借助JSONObject工具)
2.判斷MongoDB中是否已有這條記錄
3.如果有就執(zhí)行更新,沒有就執(zhí)行保存
詳細(xì)代碼實(shí)現(xiàn):
public interface HospitalService {
void save(Map<String, Object> paramMap);
}
@Service
public class HospitalServiceImpl implements HospitalService {
@Autowired
private HospitalRepository hospitalRepository;
@Override
public void save(Map<String, Object> paramMap) {
// 1.把參宿map集合轉(zhuǎn)換為Hospital對象(借助JSONObject工具)
String mapString = JSONObject.toJSONString(paramMap);
Hospital hospital = JSONObject.parseObject(mapString, Hospital.class);
// 2.判斷MongoDB中是否已有這條記錄
String hoscode = hospital.getHoscode();
Hospital hospitalExist = hospitalRepository.getHospitalByHoscode(hoscode);
// 3.如果有就執(zhí)行更新,沒有就執(zhí)行保存
if (null != hospitalExist) {
hospital.setStatus(hospitalExist.getStatus());
hospital.setCreateTime(hospitalExist.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);
}
}
}
四、Respository數(shù)據(jù)層
在Respository層中僅僅進(jìn)行了根據(jù)HosCode獲得記錄的方法定義,MongoDB會智能的為我們生成相應(yīng)查詢代碼。(這需要我們對類名進(jìn)行規(guī)范定義,當(dāng)然,這并不是本篇文章所討論的內(nèi)容)
@Repository
public interface HospitalRepository extends MongoRepository<Hospital,String> {
/**
* 根據(jù)HosCode獲得記錄
* @param hoscode
* @return
*/
Hospital getHospitalByHoscode(String hoscode);
}
五、測試上傳醫(yī)院接口
運(yùn)行醫(yī)院設(shè)置和醫(yī)院管理兩個微服務(wù)模塊,打開醫(yī)院管理模塊的模擬添加頁面,加入一條JSON測試記錄。

點(diǎn)擊保存后,調(diào)用醫(yī)院設(shè)置中的api接口,最終將數(shù)據(jù)保存到了MongoDB中:

至此,開發(fā)上傳醫(yī)院接口的后端代碼,全部完成,更多關(guān)于分布式醫(yī)療掛號系統(tǒng)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MongoDB在Windows系統(tǒng)和Linux系統(tǒng)中實(shí)現(xiàn)自動定時備份的操作步驟
要在Windows系統(tǒng)中實(shí)現(xiàn)自動定時備份MongoDB數(shù)據(jù)庫,可以使用Windows任務(wù)計(jì)劃程序和MongoDB自帶的mongodump工具,這篇文章主要介紹了MongoDB在Windows系統(tǒng)和Linux系統(tǒng)中實(shí)現(xiàn)自動定時備份的操作步驟,需要的朋友可以參考下2023-12-12
MongoDB 中聚合統(tǒng)計(jì)計(jì)算--$SUM表達(dá)式
這篇文章主要介紹了MongoDB 中聚合統(tǒng)計(jì)計(jì)算--$SUM表達(dá)式的相關(guān)知識,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08
關(guān)于MongoDB數(shù)據(jù)庫學(xué)習(xí)路線指南
這篇文章主要介紹了關(guān)于MongoDB數(shù)據(jù)庫學(xué)習(xí)路線指南,給大家以學(xué)習(xí)路線地圖的形式講解該怎么學(xué)習(xí)MongoDB數(shù)據(jù)庫,需要的朋友可以參考下2023-04-04
mongoDB 實(shí)現(xiàn)主從讀寫分離實(shí)現(xiàn)的實(shí)例代碼
這篇文章主要介紹了 mongoDB 實(shí)現(xiàn)主從讀寫分離實(shí)現(xiàn)的實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-01-01
MongoDB數(shù)據(jù)庫基礎(chǔ)操作總結(jié)
這篇文章主要介紹了MongoDB數(shù)據(jù)庫基礎(chǔ)操作,結(jié)合實(shí)例形式總結(jié)分析了MongoDB數(shù)據(jù)庫創(chuàng)建、刪除、集合、文檔等基本操作技巧,需要的朋友可以參考下2020-06-06
使用MongoDB進(jìn)行數(shù)據(jù)存儲的操作流程
在現(xiàn)代應(yīng)用開發(fā)中,數(shù)據(jù)存儲是一個至關(guān)重要的部分,隨著數(shù)據(jù)量的增大和復(fù)雜性的增加,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫有時難以應(yīng)對高并發(fā)和大數(shù)據(jù)量的處理需求,MongoDB作為一種高效的NoSQL數(shù)據(jù)庫,逐漸成為了開發(fā)者的首選,本文將介紹如何使用MongoDB進(jìn)行數(shù)據(jù)存儲2025-01-01

