开始时间:2022-05-24
课程链接:课程链接:【尚医通】
部署部分应用到阿里云
在我们现在的操作下,要启动我们的服务
首先是启动两个springboot项目
然后启动前端项目
还要开启虚拟机运行Linux环境,并通过xshell连接Linux上的虚拟机
在linux环境下需要启动redis的客户端和服务器,还要记得关闭安全模式和防火墙
在linux环境下启动MongoDB
还要在window环境下启动nginx
但是我电脑同时开这么多服务,太卡了,于是我们想把虚拟机下的东西,全部转移到云服务器上
于是开了阿里云的一个云服务,一年几十块钱。
在阿里云上新建了一个实例
在这里创建一个CentOS7.X的操作系统
在安全组里面,布置我们所需要的端口
通过xshell连接上我们这个云服务器,通过Docker把对应的镜像下载下来,然后run就行了
进入redis内部,操作如下
[root@iZ2ze2nmdlhki02jgpue4yZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f0273d70f78 redis:5.0.2 "docker-entrypoint.s…" 24 hours ago Up 24 hours 0.0.0.0:6379->6379/tcp redis
b7f55ca2bf85 mongo "docker-entrypoint.s…" 24 hours ago Up 24 hours 0.0.0.0:27017->27017/tcp mongo
525c10ca9d81 mysql:5.7 "docker-entrypoint.s…" 24 hours ago Up 24 hours 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
[root@iZ2ze2nmdlhki02jgpue4yZ ~]# docker exec -it redis /bin/bash
root@3f0273d70f78:/data# redis-cli
127.0.0.1:6379>
进入MongoDB内部
这里用mongo是因为我们最初配置的时候都重命名好了,就是上面docker ps后的命名
[root@iZ2ze2nmdlhki02jgpue4yZ ~]# docker exec -it mongo /bin/bash
root@b7f55ca2bf85:/# mongo
---
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
yygh_hosp 0.000GB
>
具体的redis/mongodb/mysql怎么装的,随用随百度的
然后在Navicat里面新建一个连接,连上阿里云
只要我们不关这个服务,那么上面的redis,MySQL就会一直运行下去
将后端配置文件里面的地址也做响应修改
如果要直接使用redis、MySQL,修改其配置信息,那么需要从docker中进入这些容器才行
现在使用就可以不开虚拟机了,开两个springboot+前端+nginx就行
上传医院接口
这里进行了一大堆的CV操作,都是从给的资料代码里弄进去的
新建一个包
所有代码都给了,我就是复制粘贴的
注意这里的配置文件需要填自己的信息
yml格式的,注意和properties写法区分一下
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/yygh_manage?characterEncoding=utf-8&useSSL=false
username: root
password: 333333
新建一个库
代码都是现成的。
集成mongodb
添加依赖
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
说明:改为自己安装mongodb的ip地址
添加医院基础类
添加model
说明:由于实体对象没有逻辑,我们已经统一导入
com.bupt.yygh.model.hosp.Hospital
添加Repository
@Repository
public interface HospitalRepository extends MongoRepository<Hospital,String> {
}
添加service接口及实现类
添加com.bupt.yygh.hosp.service.HospitalService接口
public interface HospitalService {
}
2,添加com.bupt.yygh.hosp.service.impl.HospitalServiceImpl接口实现
package com.bupt.yygh.hosp.service.impl;
@Service
public class HospitalServiceImpl implements HospitalService {
@Autowired
private HospitalRepository hospitalRepository;
}
添加controller
添加com.bupt.yygh.hosp.api.ApiController
package com.bupt.yygh.hosp.api;
@Api(tags = "医院管理API接口")
@RestController
@RequestMapping("/api/hosp")
public class ApiController {
@Autowired
private HospitalService hospitalService;
//获取传递过来医院信息
Map<String, String[]> requestMap = request.getParameterMap();
//模拟端传来JSON信息,用于装进数据库里
Map<String, Object> paramMap = HttpRequestHelper.switchMap(requestMap);
//调用service的方法
hospitalService.save(paramMap);
return Result.ok();
}
说明:平台对外开发的接口都写在该Controller类
启动后有这么一个平台界面
注意要预留一条数据在数据库中才能打开这个界面
上传医院
添加service接口
1、在HospitalService 类添加接口
/**
* 上传医院信息
* @param paramMap
*/
void save(Map<String, Object> paramMap);
说明:参数使用Map,减少对象封装,有利于签名校验,后续会体验到
在HospitalServiceImpl类添加实现
@Override
public void save(Map<String, Object> paramMap) {
//把参数map集合转换成字符串再转为对象 Hospital
String mapString = JSONObject.toJSONString(paramMap);
Hospital hospital = JSONObject.parseObject(mapString, Hospital.class);
//判断是否存在数据
String hoscode = hospital.getHoscode();
Hospital hospitalExist = hospitalRepository.getHospitalByHoscode(hoscode);
//如果存在,进行修改
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);
hospital.setCreateTime(new Date());
hospital.setUpdateTime(new Date());
hospital.setIsDeleted(0);
hospitalRepository.save(hospital);
}
}
}
添加repository接口
在HospitalRepository类添加接口
//判断是否存在数据
//Mongo自动写好具体代码了,前提是命名要规范
Hospital getHospitalByHoscode(String hoscode);
添加controller接口
在ApiController类添加接口
@RestController
@RequestMapping("/api/hosp")
public class ApiController {
@Autowired
private HospitalService hospitalService;
//上传医院接口
@PostMapping("saveHospital")
public Result saveHosp(HttpServletRequest request) {
//获取传递过来医院信息
Map<String, String[]> requestMap = request.getParameterMap();
//模拟端传来JSON信息,用于装进数据库里
Map<String, Object> paramMap = HttpRequestHelper.switchMap(requestMap);
//调用service的方法
hospitalService.save(paramMap);
return Result.ok();
}
运行hospitalManage和serv_hosp两个服务
在框框里填下面的json数据
提示操作成功
我们就可以看到MongoDB数据库有这条数据了
注意我们这一步成功,需要前面数据库的配合
api_url一定是能链接到我们hosp这个微服务的地址,不能写错了
上传医院添加签名校验
我们在医院设置的时候,为每个医院生成了医院编码与签名key,因此我在验证签名时要根据医院编码去动态获取签名key,然后再做签名校验
1,在HospitalSetService类添加接口
/**
* 获取签名key
* @param hoscode
* @return
*/
String getSignKey(String hoscode);
在HospitalSetServiceImpl类实现接口
@Service
public class HospitalSetServiceImpl extends ServiceImpl<HospitalSetMapper, HospitalSet> implements HospitalSetService {
//2 根据传递过来医院编码,查询数据库,查询签名
@Override
public String getSignKey(String hoscode) {
QueryWrapper<HospitalSet> wrapper = new QueryWrapper<>();
wrapper.eq("hoscode", hoscode);
HospitalSet hospitalSet = baseMapper.selectOne(wrapper);
return hospitalSet.getSignKey();
}
//@Autowired不用写了,已经通过MP帮忙注册了
}
修改ApiController类上传医院接口
//上传医院接口
@PostMapping("saveHospital")
public Result saveHosp(HttpServletRequest request) {
//获取传递过来医院信息
Map<String, String[]> requestMap = request.getParameterMap();
//模拟端传来JSON信息,用于装进数据库里
Map<String, Object> paramMap = HttpRequestHelper.switchMap(requestMap);
//1 获取医院系统传递过来的签名,签名进行MD5加密
String hospSign = (String) paramMap.get("sign");
//2 根据传递过来医院编码,查询数据库,查询签名
String hoscode = (String) paramMap.get("hoscode");
String signKey = hospitalSetService.getSignKey(hoscode);
//3 把数据库查询签名进行MD5加密
String signKeyMd5 = MD5.encrypt(signKey);
//4 判断签名是否一致
if (!hospSign.equalsIgnoreCase(signKeyMd5)) {
throw new YyghException(ResultCodeEnum.SIGN_ERROR);
}
//传输过程中“+”转换为了“ ”,因此我们要转换回来
String logoData = (String) paramMap.get("logoData");
logoData = logoData.replaceAll(" ", "+");
paramMap.put("logoData", logoData);
//调用service的方法
hospitalService.save(paramMap);
return Result.ok();
}
这里我一直报 hospitalSetService空指针异常
原来是写成这样了
得分别写Autowired才行
在医院管理中添加
我们添加数据,必须要两个表对应字段和JSON字段统一
添加JSON字段的hoscode是1000_0
在yygh_hosp表中的hospital_set以及yygh_manage的hospital_set都要有对应字段为1000_0的值
并且,yygh_hosp和yygh_manage对应的sign_key也要一致
操作成功后刷新Mongo数据库
我们把数据库中的logoData数据拿出来
写到一个html文件中测试,其中红线以上固定写法
红线以下粘贴logoData
尾巴记得封住
打开后可得到
二、查询医院接口
添加service接口
在HospitalService 类添加接口
/**
* 查询医院
* @param hoscode
* @return
*/
Hospital getByHoscode(String hoscode);
2,在HospitalServiceImpl类添加实现
@Override
public Hospital getByHoscode(String hoscode) {
return hospitalRepository.getHospitalByHoscode(hoscode);
}
添加controller
//查询医院
@PostMapping("hospital/show")
public Result getHospital(HttpServletRequest request) {
//获取传递过来医院信息
Map<String, String[]> requestMap = request.getParameterMap();
Map<String, Object> paramMap = HttpRequestHelper.switchMap(requestMap);
//获取医院编号
String hoscode = (String) paramMap.get("hoscode");
//1 获取医院系统传递过来的签名,签名进行MD5加密
String hospSign = (String) paramMap.get("sign");
//2 根据传递过来医院编码,查询数据库,查询签名
String signKey = hospitalSetService.getSignKey(hoscode);
//3 把数据库查询签名进行MD5加密
String signKeyMd5 = MD5.encrypt(signKey);
//4 判断签名是否一致
if (!hospSign.equals(signKeyMd5)) {
throw new YyghException(ResultCodeEnum.SIGN_ERROR);
}
//调用service方法实现根据医院编号查询
Hospital hospital = hospitalService.getByHoscode(hoscode);
return Result.ok(hospital);
}
结果ok
上传科室接口
添加科室基础类
添加model
说明:由于实体对象没有逻辑,我们已经统一导入
com.bupt.yygh.model.hosp.Department
添加apicontroller
//上传科室接口
@PostMapping("saveDepartment")
public Result saveDepartment(HttpServletRequest request) {
//获取传递过来科室信息
Map<String, String[]> requestMap = request.getParameterMap();
Map<String, Object> paramMap = HttpRequestHelper.switchMap(requestMap);
//获取医院编号
String hoscode = (String) paramMap.get("hoscode");
//1 获取医院系统传递过来的签名,签名进行MD5加密
String hospSign = (String) paramMap.get("sign");
//2 根据传递过来医院编码,查询数据库,查询签名
String signKey = hospitalSetService.getSignKey(hoscode);
//3 把数据库查询签名进行MD5加密
String signKeyMd5 = MD5.encrypt(signKey);
//4 判断签名是否一致
if (!hospSign.equals(signKeyMd5)) {
throw new YyghException(ResultCodeEnum.SIGN_ERROR);
}
//调用service的方法
departmentService.save(paramMap);
return Result.ok();
}
添加repository
package com.bupt.yygh.hosp.repository;
@Repository
public interface DepartmentRepository extends MongoRepository<Department,String> {
Department getDepartmentByHoscodeAndDepcode(String hoscode, String depcode);
}
添加service接口及实现类
1,添加com.bupt.yygh.hosp.service.DepartmentService接口
package com.bupt.yygh.hosp.service;
public interface DepartmentService {
void save(Map<String, Object> paramMap);
}
2,添加com.bupt.yygh.hosp.service.impl.DepartmentServiceImpl接口实现
package com.bupt.yygh.hosp.service.impl;
@Service
@Slf4j
public class DepartmentServiceImpl implements DepartmentService {
@Autowired
private DepartmentRepository departmentRepository;
//上传科室接口
@Override
public void save(Map<String, Object> paramMap) {
//paramMap 转换department对象
String paramMapString = JSONObject.toJSONString(paramMap);
Department department = JSONObject.parseObject(paramMapString, Department.class);
//根据医院编号 和 科室编号查询
Department departmentExist = departmentRepository.
getDepartmentByHoscodeAndDepcode(department.getHoscode(), department.getDepcode());
//判断
if (departmentExist != null) {
departmentExist.setUpdateTime(new Date());
departmentExist.setIsDeleted(0);
departmentRepository.save(departmentExist);
} else {
department.setCreateTime(new Date());
department.setUpdateTime(new Date());
department.setIsDeleted(0);
departmentRepository.save(department);
}
}
}
测试一下
数据来啦
写这个部分的时候
departmentRepository.save(departmentExist);
一直提示我有问题,save()里面填不进数据,只接受hospital的数据
我才发现是我 上面repository的父类里的泛型写成了<Hospital,String>,改过来就好了
@Repository
public interface DepartmentRepository extends MongoRepository<Department,String> {
Department getDepartmentByHoscodeAndDepcode(String hoscode, String depcode);
}
查询科室接口
//查询科室接口
Page<Department> findPageDepartment(int page, int limit, DepartmentQueryVo departmentQueryVo);
实现接口
@Override
public Page<Department> findPageDepartment(int page, int limit, DepartmentQueryVo departmentQueryVo) {
// 创建Pageable对象,设置当前页和每页记录数
//0是第一页
Pageable pageable = PageRequest.of(page - 1, limit);
// 创建Example对象
Department department = new Department();
BeanUtils.copyProperties(departmentQueryVo, department);
department.setIsDeleted(0);
ExampleMatcher matcher = ExampleMatcher.matching()
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)
.withIgnoreCase(true);
Example<Department> example = Example.of(department, matcher);
Page<Department> all = departmentRepository.findAll(example, pageable);
return all;
}
写controller
//查询科室接口
@PostMapping("department/list")
public Result findDepartment(HttpServletRequest request) {
//获取传递过来科室信息
Map<String, String[]> requestMap = request.getParameterMap();
Map<String, Object> paramMap = HttpRequestHelper.switchMap(requestMap);
//医院编号
String hoscode = (String) paramMap.get("hoscode");
//当前页 和 每页记录数
int page = StringUtils.isEmpty(paramMap.get("page")) ? 1 : Integer.parseInt((String) paramMap.get("page"));
int limit = StringUtils.isEmpty(paramMap.get("limit")) ? 1 : Integer.parseInt((String) paramMap.get("limit"));
//TODO 签名校验
DepartmentQueryVo departmentQueryVo = new DepartmentQueryVo();
departmentQueryVo.setHoscode(hoscode);
//调用service方法
Page<Department> pageModel = departmentService.findPageDepartment(page, limit, departmentQueryVo);
return Result.ok(pageModel);
}
删除科室接口
//删除接口
void remove(String hoscode, String depcode);
//删除科室接口
@Override
public void remove(String hoscode, String depcode) {
//根据医院编号 和 科室编号查询
Department department = departmentRepository.getDepartmentByHoscodeAndDepcode(hoscode, depcode);
if (department != null) {
//调用方法删除
departmentRepository.deleteById(department.getId());
}
}
//删除科室接口
@PostMapping("department/remove")
public Result removeDepartment(HttpServletRequest request) {
//获取传递过来科室信息
Map<String, String[]> requestMap = request.getParameterMap();
Map<String, Object> paramMap = HttpRequestHelper.switchMap(requestMap);
//医院编号 和 科室编号
String hoscode = (String)paramMap.get("hoscode");
String depcode = (String)paramMap.get("depcode");
//TODO 签名校验
departmentService.remove(hoscode,depcode);
return Result.ok();
}
测试一下
删除也正常
排班接口
分为上传、查询、删除
分别写
Controller
public class ApiController {
@Autowired
private HospitalService hospitalService;
@Autowired
private HospitalSetService hospitalSetService;
@Autowired
private DepartmentService departmentService;
@Autowired
private ScheduleService scheduleService;
//删除排班
@PostMapping("schedule/remove")
public Result remove(HttpServletRequest request) {
//获取传递过来科室信息
Map<String, String[]> requestMap = request.getParameterMap();
Map<String, Object> paramMap = HttpRequestHelper.switchMap(requestMap);
//获取医院编号和排班编号
String hoscode = (String) paramMap.get("hoscode");
String hosScheduleId = (String) paramMap.get("hosScheduleId");
//TODO 签名校验
scheduleService.remove(hoscode, hosScheduleId);
return Result.ok();
}
//查询排班接口
@PostMapping("schedule/list")
public Result findSchedule(HttpServletRequest request) {
//获取传递过来科室信息
Map<String, String[]> requestMap = request.getParameterMap();
Map<String, Object> paramMap = HttpRequestHelper.switchMap(requestMap);
//医院编号
String hoscode = (String) paramMap.get("hoscode");
//科室编号
String depcode = (String) paramMap.get("depcode");
//当前页 和 每页记录数
int page = StringUtils.isEmpty(paramMap.get("page")) ? 1 : Integer.parseInt((String) paramMap.get("page"));
int limit = StringUtils.isEmpty(paramMap.get("limit")) ? 1 : Integer.parseInt((String) paramMap.get("limit"));
//TODO 签名校验
ScheduleQueryVo scheduleQueryVo = new ScheduleQueryVo();
scheduleQueryVo.setHoscode(hoscode);
scheduleQueryVo.setDepcode(depcode);
//调用service方法
Page<Schedule> pageModel = scheduleService.findPageSchedule(page, limit, scheduleQueryVo);
return Result.ok(pageModel);
}
//上传排班接口
@PostMapping("saveSchedule")
public Result saveSchedule(HttpServletRequest request) {
//获取传递过来科室信息
Map<String, String[]> requestMap = request.getParameterMap();
Map<String, Object> paramMap = HttpRequestHelper.switchMap(requestMap);
//TODO 签名校验
scheduleService.save(paramMap);
return Result.ok();
}
写repository
@Repository
public interface ScheduleRepository extends MongoRepository<Schedule, String> {
Schedule getScheduleByHoscodeAndHosScheduleId(String hoscode, String hosScheduleId);
}
写service接口和实现类
package com.bupt.yygh.hosp.service;
import com.bupt.yygh.model.hosp.Schedule;
import com.bupt.yygh.vo.hosp.ScheduleQueryVo;
import org.springframework.data.domain.Page;
import java.util.Map;
public interface ScheduleService {
void save(Map<String, Object> paramMap);
Page<Schedule> findPageSchedule(int page, int limit, ScheduleQueryVo scheduleQueryVo);
void remove(String hoscode, String hosScheduleId);
}
实现类
package com.bupt.yygh.hosp.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.bupt.yygh.hosp.repository.ScheduleRepository;
import com.bupt.yygh.hosp.service.ScheduleService;
import com.bupt.yygh.model.hosp.Schedule;
import com.bupt.yygh.vo.hosp.ScheduleQueryVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.Map;
@Service
public class ScheduleServiceImpl implements ScheduleService {
@Autowired
private ScheduleRepository scheduleRepository;
//删除排班
@Override
public void remove(String hoscode, String hosScheduleId) {
//根据医院编号和排班编号查询信息
Schedule schedule = scheduleRepository.getScheduleByHoscodeAndHosScheduleId(hoscode, hosScheduleId);
if(schedule != null) {
scheduleRepository.deleteById(schedule.getId());
}
}
//查询排班接口
@Override
public Page<Schedule> findPageSchedule(int page, int limit, ScheduleQueryVo scheduleQueryVo) {
// 创建Pageable对象,设置当前页和每页记录数
//0是第一页
Pageable pageable = PageRequest.of(page - 1, limit);
// 创建Example对象
Schedule schedule = new Schedule();
BeanUtils.copyProperties(scheduleQueryVo, schedule);
schedule.setIsDeleted(0);
schedule.setStatus(1);
ExampleMatcher matcher = ExampleMatcher.matching()
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)
.withIgnoreCase(true);
Example<Schedule> example = Example.of(schedule, matcher);
Page<Schedule> all = scheduleRepository.findAll(example, pageable);
return all;
}
//上传排班接口
@Override
public void save(Map<String, Object> paramMap) {
//paramMap 转换department对象
String paramMapString = JSONObject.toJSONString(paramMap);
Schedule schedule = JSONObject.parseObject(paramMapString, Schedule.class);
//根据医院编号 和 排班编号查询
Schedule scheduleExist = scheduleRepository.
getScheduleByHoscodeAndHosScheduleId(schedule.getHoscode(), schedule.getHosScheduleId());
//判断
if (scheduleExist != null) {
scheduleExist.setUpdateTime(new Date());
scheduleExist.setIsDeleted(0);
scheduleExist.setStatus(1);
scheduleRepository.save(scheduleExist);
} else {
schedule.setCreateTime(new Date());
schedule.setUpdateTime(new Date());
schedule.setIsDeleted(0);
schedule.setStatus(1);
scheduleRepository.save(schedule);
}
}
}
测试删除也没问题
结束时间:2022-05-26