尚医通项目73-80:数据接口

开始时间: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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值