開(kāi)發(fā)分布式醫(yī)療掛號(hào)系統(tǒng)MongoDB集成實(shí)現(xiàn)上傳醫(yī)院接口
前言
需求:在《分布式預(yù)約掛號(hào)平臺(tái)》中完成上傳醫(yī)院接口開(kāi)發(fā),再通過(guò)醫(yī)院接口模擬系統(tǒng)(醫(yī)院管理表)調(diào)用平臺(tái)中的接口,從而實(shí)現(xiàn)上傳醫(yī)院的功能。另外,所有通過(guò)平臺(tái)中接口上傳的信息都需要被保存到MongoDB中,通過(guò)MongoDB來(lái)進(jìn)行操作。
本篇文章根據(jù)上述需求,對(duì)《分布式醫(yī)療掛號(hào)系統(tǒng)》中的上傳醫(yī)院接口進(jìn)行實(shí)現(xiàn),項(xiàng)目代碼已同步至github,https://github.com/Guoqianliang/yygh_parent
一、集成MongoDB
上傳醫(yī)院接口的開(kāi)發(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ù)庫(kù)添加到配置中:
spring.data.mongodb.uri=mongodb://[ip地址]:27017/[MongoDB的數(shù)據(jù)庫(kù)]
將來(lái)通過(guò)接口會(huì)向MongoDB上傳一張hospital文檔,下標(biāo)對(duì)這些記錄進(jìn)行說(shuō)明,這些表在Java中也需要有一個(gè)對(duì)應(yīng)的實(shí)體類。
二、開(kāi)發(fā)Controller層
上傳醫(yī)院的接口路徑為:/api/hosp/saveHospital
,下面分析ApiController中上傳醫(yī)院接口所做的事情:
1.將從醫(yī)院管理表傳遞過(guò)來(lái)的醫(yī)院信息轉(zhuǎn)換為Object類型
2.獲取醫(yī)院管理表中的密鑰(已經(jīng)使用MD5加密好了)
3.獲取醫(yī)院設(shè)置表中的密鑰并進(jìn)行MD5加密 此處調(diào)用醫(yī)院設(shè)置業(yè)務(wù)層
4.密鑰不匹配就拋出錯(cuò)誤
5.傳遞的圖片涉及base64編碼問(wèn)題,需要將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ù)庫(kù)") @PostMapping("saveHospital") public Result saveHosp(HttpServletRequest request) { // 1.將從醫(yī)院管理表傳遞過(guò)來(lái)的醫(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.密鑰不匹配就拋出錯(cuò)誤 if (!hospSign.equals(signKeyMd5)) { throw new YyghException(ResultCodeEnum.SIGN_ERROR); } // 5.傳遞的圖片涉及base64編碼問(wèn)題,需要將logoData記錄中所有的" "替換為+ String logoData = (String) paramMap.get("logoData"); logoData = logoData.replaceAll(" ", "+"); paramMap.put("logoData", logoData); // 6.執(zhí)行上傳操作 hospitalService.save(paramMap); return Result.ok(); } }
三、開(kāi)發(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對(duì)象(借助JSONObject工具)
2.判斷MongoDB中是否已有這條記錄
3.如果有就執(zhí)行更新,沒(méi)有就執(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對(duì)象(借助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í)行更新,沒(méi)有就執(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會(huì)智能的為我們生成相應(yīng)查詢代碼。(這需要我們對(duì)類名進(jìn)行規(guī)范定義,當(dāng)然,這并不是本篇文章所討論的內(nèi)容)
@Repository public interface HospitalRepository extends MongoRepository<Hospital,String> { /** * 根據(jù)HosCode獲得記錄 * @param hoscode * @return */ Hospital getHospitalByHoscode(String hoscode); }
五、測(cè)試上傳醫(yī)院接口
運(yùn)行醫(yī)院設(shè)置和醫(yī)院管理兩個(gè)微服務(wù)模塊,打開(kāi)醫(yī)院管理模塊的模擬添加頁(yè)面,加入一條JSON測(cè)試記錄。
點(diǎn)擊保存后,調(diào)用醫(yī)院設(shè)置中的api接口,最終將數(shù)據(jù)保存到了MongoDB中:
至此,開(kāi)發(fā)上傳醫(yī)院接口的后端代碼,全部完成,更多關(guān)于分布式醫(yī)療掛號(hào)系統(tǒng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- goalng?結(jié)構(gòu)體?方法集?接口實(shí)例詳解
- go swagger生成接口文檔使用教程
- Go interface接口聲明實(shí)現(xiàn)及作用詳解
- Go?Ginrest實(shí)現(xiàn)一個(gè)RESTful接口
- Go語(yǔ)言fsnotify接口實(shí)現(xiàn)監(jiān)測(cè)文件修改
- Go語(yǔ)言單元測(cè)試模擬服務(wù)請(qǐng)求和接口返回
- GoFrame框架數(shù)據(jù)校驗(yàn)之校驗(yàn)結(jié)果Error接口對(duì)象
- Go調(diào)用Rust方法及外部函數(shù)接口前置
- Go 請(qǐng)求兔子識(shí)別接口實(shí)現(xiàn)流程示例詳解
相關(guān)文章
MongoDB數(shù)據(jù)庫(kù)的日志文件深入分析
這篇文章主要給大家介紹了關(guān)于MongoDB數(shù)據(jù)庫(kù)日志的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MongoDB具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09Windows下MongoDB配置用戶權(quán)限實(shí)例
這篇文章主要介紹了Windows下MongoDB配置用戶權(quán)限實(shí)例,本文實(shí)現(xiàn)需要輸入用戶名、密碼才可以訪問(wèn)MongoDB數(shù)據(jù)庫(kù),需要的朋友可以參考下2015-01-01Spring Boot中使用MongoDB數(shù)據(jù)庫(kù)的方法
MongoDB是一個(gè)高性能,開(kāi)源,無(wú)模式的,基于分布式文件存儲(chǔ)的文檔型數(shù)據(jù)庫(kù),由C++語(yǔ)言編寫(xiě),其名稱來(lái)源取自“humongous”,是一種開(kāi)源的文檔數(shù)據(jù)庫(kù)──NoSql數(shù)據(jù)庫(kù)的一種。這篇文章主要介紹了Spring Boot中使用MongoDB數(shù)據(jù)庫(kù)的方法,需要的朋友可以參考下2017-12-12win7平臺(tái)快速安裝、啟動(dòng)mongodb的方法
這篇文章主要介紹了win7平臺(tái)快速安裝、啟動(dòng)mongodb的方法,結(jié)合圖文形式分析了win7平臺(tái)下載、安裝、啟動(dòng)、配置MongoDB數(shù)據(jù)庫(kù)的方法與注意事項(xiàng),需要的朋友可以參考下2020-05-05MongoDB的主從復(fù)制及副本集的replSet配置教程
MongoDB可以在以一個(gè)主節(jié)點(diǎn)處理客戶端請(qǐng)求的情況下以其他節(jié)點(diǎn)服務(wù)器負(fù)責(zé)映射主節(jié)點(diǎn)上的數(shù)據(jù),即為我們通常所說(shuō)的主從復(fù)制功能,這里我們就來(lái)共同總結(jié)MongoDB的主從復(fù)制及副本集的replSet配置教程:2016-07-07