Teng's blog Teng's blog
首页
Java
H5前端
GitHub (opens new window)
首页
Java
H5前端
GitHub (opens new window)
  • 01.项目介绍
  • 02.后台系统-搭建项目
  • 03.后台系统-医院设置模块
    • 需求分析
    • 表结构
    • 搭建模块 service-hosp
      • 修改pom文件
      • 添加application.properties文件
      • 添加启动类
    • 基础实现
      • 添加实体类 BaseEntity
      • 添加实体类HospitalSet
      • service-hosp中添加mapper
      • 添加全局mybatisPlus配置
      • service-hosp中添加service
      • service-hosp中添加controller
      • 配置统一返回
      • 集成Swagger2
    • 带条件的分页查询实现
    • 添加医院设置实现
    • 通过id查询医院设置
    • 修改医院设置
    • 批量删除医院设置
    • 医院的锁定和解锁操作
    • 发送签名的key
  • 04.后台系统-统一异常处理
  • 05.后台系统-统一日志处理
  • 06.后台系统-搭建管理后台前端
  • 07.后台系统-医院设置前端
  • 08.后台系统-数据字典
  • 09.SpringCache+Redis缓存数据
  • 10.集成与配置Nginx
  • 11.启动医院接口模拟系统
  • 12.后台系统-上传医院信息
  • 13.后台系统-上传科室信息
  • 14.后台系统-上传排班信息
  • 15.搭建服务注册中心Nacos
  • 16.后台系统-医院管理
  • 17.后台系统-排班管理
  • 18.搭建服务网关Gateway
  • 19.前台系统-搭建前端环境
  • 20.前台系统-首页
  • 21.前台系统-医院详情页
  • 22.前台系统-用户登录
  • 23.后台系统-短信服务
  • 24.用户认证与网关整合
  • 25.前台系统-微信登录
  • 26.前台系统-实名认证
  • 27.前台系统-就诊人管理
  • 28.后台系统-平台用户管理
  • 29.前台系统-预约挂号详情
  • 30.前台系统-预约确认
  • 31.前台系统-预约下单
  • 32.前台系统-订单管理
  • 33.后台系统-订单管理
  • 34.前台系统-微信支付
  • 35.前台系统-取消预约
  • 36.前台系统-就医提醒
  • 37.后台系统-预约统计
  • 38.小结
  • 附录:医院接口模拟系统说明
  • 附录:在线预约挂号API接口文档
  • Project-尚医通
Shetengteng
2021-11-25

03.后台系统-医院设置模块

# 需求分析

存医院的基本信息,保持医院的编号,唯一id和接口调用的相关签名key的信息,开通医院设置信息后,可以上传医院的相关信息

功能点

  • 基于单表的CRUD
  • 锁定
  • 解锁
  • 发送签名信息

# 表结构

CREATE TABLE `hospital_set` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
  `hosname` varchar(100) DEFAULT NULL COMMENT '医院名称',
  `hoscode` varchar(30) DEFAULT NULL COMMENT '医院编号',
  `api_url` varchar(100) DEFAULT NULL COMMENT 'api基础路径',
  `sign_key` varchar(50) DEFAULT NULL COMMENT '签名秘钥',
  `contacts_name` varchar(20) DEFAULT NULL COMMENT '联系人',
  `contacts_phone` varchar(11) DEFAULT NULL COMMENT '联系人手机',
  `status` tinyint(3) NOT NULL DEFAULT '0' COMMENT '状态',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `is_deleted` tinyint(3) NOT NULL DEFAULT '0' COMMENT '逻辑删除(1:已删除,0:未删除)',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_hoscode` (`hoscode`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='医院设置表';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  • hosname :医院名称
  • hoscode :医院编号,平台分配,全局唯一,api接口必填信息
  • api_url :医院回调的基础url,如预约下单,则调用该接口地址去医院下单
  • sign_key :双方api接口调用的签名key,由平台生成
  • contacts_name :联系人姓名
  • contacts_phone :联系人电话
  • status :状态
    • 锁定 0 :表示不可以使用
    • 解锁 1:表示可以使用

# 搭建模块 service-hosp

在父模块service下创建子模块,操作步骤同 common下的common-util

创建完成后,在src/main/java下

  • 新建 com.stt.yygh.hosp 包
  • 新建 com.stt.yygh.hosp.controller 包
  • 新建 com.stt.yygh.hosp.service 包
  • 新建 com.stt.yygh.hosp.mapper 包

# 修改pom文件

找到 serivce-hosp 项目下的pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>service</artifactId>
        <groupId>com.stt.yygh</groupId>
        <version>0.0.1</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <version>1.0</version>
    <artifactId>service-hosp</artifactId>
    <packaging>jar</packaging>
    <name>service-hosp</name>
    <description>service-hosp</description>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
    </dependencies>

    <build>
        <finalName>service-hosp</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

# 添加application.properties文件

application.properties 配置内容如下

# 服务端口
server.port=8201
# 服务名
spring.application.name=service-hosp

# 环境设置:dev、test、prod
spring.profiles.active=dev

# mysql数据库连接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/yygh_hosp?characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456

#返回json的全局时间格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8

#配置mapper xml文件的路径
mybatis-plus.mapper-locations=classpath:com/stt/yygh/mapper/xml/*.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 添加启动类

创建包 com.stt.yygh.hosp

在该包下添加 ServiceHospApplication.java文件,内容如下

package com.stt.yygh.hosp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ServiceHospApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceHospApplication.class, args);
    }
}
1
2
3
4
5
6
7
8
9
10
11

注意:添加完成后,验证该服务是否可以启动成功

# 基础实现

# 添加实体类 BaseEntity

在 model 模块中创建包 com.stt.yygh.model.base

添加实体类 BaseEntity,所有实体类的父类,包含公共信息如下

  • id
    • 每个对象的主键id
  • createTime
    • 使用了jackson 的注解进行格式化,并绑定到create_time列
  • updateTime
    • 与createTime类似的操作
  • isDeleted
    • 逻辑删除列,使用了mybatisPlus的TableLogic注解指明
  • param
    • 通过 mybatisPlus中 TableField 注解设置为非数据库字段
    • 用于bean传递额外的参数使用
package com.stt.yygh.model.base;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Data
public class BaseEntity implements Serializable {

    @ApiModelProperty(value = "id")
    @TableId(type = IdType.AUTO)
    private Long id;

    @ApiModelProperty(value = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("create_time")
    private Date createTime;

    @ApiModelProperty(value = "更新时间")
    @TableField("update_time")
    private Date updateTime;

    @ApiModelProperty(value = "逻辑删除(1:已删除,0:未删除)")
    @TableLogic
    @TableField("is_deleted")
    private Integer isDeleted;

    @ApiModelProperty(value = "其他参数")
    @TableField(exist = false)
    private Map<String,Object> param = new HashMap<>();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

# 添加实体类HospitalSet

在model模块中创建 com.stt.yygh.model.hosp 包

在该包下添加 HospitalSet实体类,该实体类与数据库表hospital_set中的列一一对应

package com.stt.yygh.model.hosp;

import com.stt.yygh.model.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
@ApiModel(description = "医院设置")
@TableName("hospital_set")
public class HospitalSet extends BaseEntity {
	private static final long serialVersionUID = 1L;

	@ApiModelProperty(value = "医院名称")
	@TableField("hosname")
	private String hosname;

	@ApiModelProperty(value = "医院编号")
	@TableField("hoscode")
	private String hoscode;

	@ApiModelProperty(value = "api基础路径")
	@TableField("api_url")
	private String apiUrl;

	@ApiModelProperty(value = "签名秘钥")
	@TableField("sign_key")
	private String signKey;

	@ApiModelProperty(value = "联系人姓名")
	@TableField("contacts_name")
	private String contactsName;

	@ApiModelProperty(value = "联系人手机")
	@TableField("contacts_phone")
	private String contactsPhone;

	@ApiModelProperty(value = "状态")
	@TableField("status")
	private Integer status;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

# service-hosp中添加mapper

  • 创建 com.stt.yygh.hosp.mapper 包,并添加 HospitalSetMapper类
package com.stt.yygh.hosp.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.stt.yygh.model.hosp.HospitalSet;
import org.apache.ibatis.annotations.Mapper;

// 可以使用Mapper单独注册,也可以配置MapperScan进行注册
@Mapper
public interface HospitalSetMapper extends BaseMapper<HospitalSet> {
}
1
2
3
4
5
6
7
8
9
10
  • 创建 com.stt.yygh.hosp.mapper.xml 包,并添加 HospitalSetMapper.xml 文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.stt.yygh.hosp.mapper.HospitalSetMapper">
</mapper>
1
2
3
4
5

# 添加全局mybatisPlus配置

由于Mapper接口的实现类是框架自动生成的,如果没有@Mapper注解,那么就不会在spring容器中注册

可以使用全局注册的方式注册

在service-hosp服务中添加配置类 com.stt.yygh.hosp.config.HospitalSetConfig

在配置中添加分页插件拦截器配置

package com.stt.yygh.hosp.config;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@MapperScan("com.stt.yygh.hosp.mapper")
public class HospitalSetConfig {

    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# service-hosp中添加service

创建 com.stt.yygh.hosp.service.HospitalSetService接口

package com.stt.yygh.hosp.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.stt.yygh.model.hosp.HospitalSet;

public interface HospitalSetService extends IService<HospitalSet> {
}
1
2
3
4
5
6
7

创建 com.stt.yygh.hosp.service.HospitalSetServiceImpl 实现类

  • 通过MybatisPlus中对service进行封装,提供了CRUD的能力
package com.stt.yygh.hosp.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.stt.yygh.hosp.mapper.HospitalSetMapper;
import com.stt.yygh.hosp.service.HospitalSetService;
import com.stt.yygh.model.hosp.HospitalSet;
import org.springframework.stereotype.Service;

@Service
public class HospitalSetServiceImpl extends ServiceImpl<HospitalSetMapper, HospitalSet> implements HospitalSetService {
    // 由于传递了 HospitalSetMapper ,在 ServiceImpl 中进行了 Autowired操作
    // 因此可以直接通过 baseMapper 变量调用  HospitalSetMapper 中的方法
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# service-hosp中添加controller

添加controller,实现CRUD功能

  • 由于com.baomidou.mybatisplus.extension.service.impl.ServiceImpl类已经默认实现 了单表的CRUD,分页查询也有默认实现,能够更加灵活和代码简洁把分页查询功能实现
package com.stt.yygh.hosp.controller;

import com.stt.yygh.hosp.service.HospitalSetService;
import com.stt.yygh.model.hosp.HospitalSet;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Api(tags = "医院设置管理")
@RestController
@RequestMapping("/admin/hosp/hospitalSet")
public class HospitalSetController {

    @Autowired
    private HospitalSetService hospitalSetService;

    //1 查询医院设置表所有信息
    @ApiOperation(value = "获取所有医院设置")
    @GetMapping("findAll")
    public List<HospitalSet> findAll(){
        List<HospitalSet> re = hospitalSetService.list();
        return re;
    }

    //2 逻辑删除医院设置
    @ApiOperation(value = "逻辑删除医院设置")
    @DeleteMapping("{id}")
    public boolean remove(@PathVariable Long id){
        boolean re = hospitalSetService.removeById(id);
        return re;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

返回信息不统一,需要一个类统一包装一下

# 配置统一返回

在common的common-util模块中添加 com.stt.yygh.common.result.Result

package com.stt.yygh.common.result;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
 * 全局统一返回结果类
 */
@Data
@ApiModel(value = "全局统一返回结果")
public class Result<T> {

    @ApiModelProperty(value = "返回码")
    private Integer code;

    @ApiModelProperty(value = "返回消息")
    private String message;

    @ApiModelProperty(value = "返回数据")
    private T data;

    public Result(){}

    protected static <T> Result<T> build(T data) {
        Result<T> result = new Result<T>();
        if (data != null)
            result.setData(data);
        return result;
    }

    public static <T> Result<T> build(T body, ResultCodeEnum resultCodeEnum) {
        Result<T> result = build(body);
        result.setCode(resultCodeEnum.getCode());
        result.setMessage(resultCodeEnum.getMessage());
        return result;
    }

    public static <T> Result<T> build(Integer code, String message) {
        Result<T> result = build(null);
        result.setCode(code);
        result.setMessage(message);
        return result;
    }

    public static<T> Result<T> ok(){
        return Result.ok(null);
    }

    /**
     * 操作成功
     * @param data
     * @param <T>
     * @return
     */
    public static<T> Result<T> ok(T data){
        Result<T> result = build(data);
        return build(data, ResultCodeEnum.SUCCESS);
    }

    public static<T> Result<T> fail(){
        return Result.fail(null);
    }

    /**
     * 操作失败
     * @param data
     * @param <T>
     * @return
     */
    public static<T> Result<T> fail(T data){
        Result<T> result = build(data);
        return build(data, ResultCodeEnum.FAIL);
    }

    public Result<T> message(String msg){
        this.setMessage(msg);
        return this;
    }

    public Result<T> code(Integer code){
        this.setCode(code);
        return this;
    }

    public boolean isOk() {
        if(this.getCode().intValue() == ResultCodeEnum.SUCCESS.getCode().intValue()) {
            return true;
        }
        return false;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92

同样对应的返回的枚举值,在common-util中添加com.stt.yygh.common.result.ResultCodeEnum

package com.stt.yygh.common.result;

import lombok.Getter;

//  统一返回结果状态信息类
@Getter
public enum ResultCodeEnum {

    SUCCESS(200,"成功"),
    FAIL(201, "失败"),
    PARAM_ERROR( 202, "参数不正确"),
    SERVICE_ERROR(203, "服务异常"),
    DATA_ERROR(204, "数据异常"),
    DATA_UPDATE_ERROR(205, "数据版本异常"),

    LOGIN_AUTH(208, "未登陆"),
    PERMISSION(209, "没有权限"),

    CODE_ERROR(210, "验证码错误"),
//    LOGIN_MOBLE_ERROR(211, "账号不正确"),
    LOGIN_DISABLED_ERROR(212, "改用户已被禁用"),
    REGISTER_MOBLE_ERROR(213, "手机号已被使用"),
    LOGIN_AURH(214, "需要登录"),
    LOGIN_ACL(215, "没有权限"),

    URL_ENCODE_ERROR( 216, "URL编码失败"),
    ILLEGAL_CALLBACK_REQUEST_ERROR( 217, "非法回调请求"),
    FETCH_ACCESSTOKEN_FAILD( 218, "获取accessToken失败"),
    FETCH_USERINFO_ERROR( 219, "获取用户信息失败"),
    //LOGIN_ERROR( 23005, "登录失败"),

    PAY_RUN(220, "支付中"),
    CANCEL_ORDER_FAIL(225, "取消订单失败"),
    CANCEL_ORDER_NO(225, "不能取消预约"),

    HOSCODE_EXIST(230, "医院编号已经存在"),
    NUMBER_NO(240, "可预约号不足"),
    TIME_NO(250, "当前时间不可以预约"),

    SIGN_ERROR(300, "签名错误"),
    HOSPITAL_OPEN(310, "医院未开通,暂时不能访问"),
    HOSPITAL_LOCK(320, "医院被锁定,暂时不能访问"),
    ;

    private Integer code;
    private String message;

    private ResultCodeEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

此时再修改controller中的返回类型

package com.stt.yygh.hosp.controller;

import com.stt.yygh.hosp.service.HospitalSetService;
import com.stt.yygh.model.hosp.HospitalSet;
import com.stt.yygh..result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Api(tags = "医院设置管理")
@RestController
@RequestMapping("/admin/hosp/hospitalSet")
public class HospitalSetController {

    @Autowired
    private HospitalSetService hospitalSetService;

    //1 查询医院设置表所有信息
    @ApiOperation(value = "获取所有医院设置")
    @GetMapping("findAll")
    public Result findAll() {
        List<HospitalSet> re = hospitalSetService.list();
        return Result.ok(re);
    }

    //2 逻辑删除医院设置
    @ApiOperation(value = "逻辑删除医院设置")
    @DeleteMapping("{id}")
    public Result remove(@PathVariable Long id) {
        boolean re = hospitalSetService.removeById(id);
        return re ? Result.ok() : Result.fail();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

配置完成后,进行测试,访问响应的接口,查看结果

# 集成Swagger2

需要了解swagger2的基本使用,如果已经了解可以略过

快速访问 🚀 Swagger2

swagger通过注解表明该接口会生成文档,包括接口名、请求方法、参数、返回信息等

- name: 快速访问 🚀 Swagger2
  desc: swagger通过注解表明该接口会生成文档,包括接口名、请求方法、参数、返回信息等
  link: /note/swagger2/
  bgColor: '#DFEEE7'
  textColor: '#2A3344'
1
2
3
4
5

在父模块common中添加如下依赖,让common-util和service-util含有swagger2依赖

<!--swagger-->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
</dependency>
1
2
3
4
5
6
7
8
9

在server-util模块中添加com.stt.yygh.common.config.Swagger2Config,让所有服务都含有swagger2

package com.stt.yygh.common.config;

import com.google.common.base.Predicates;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class Swagger2Config {
    @Bean
    public Docket webApiConfig(){
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("webApi")
                .apiInfo(webApiInfo())
                .select()
                //只显示api路径下的页面
                .paths(Predicates.and(PathSelectors.regex("/api/.*")))
                .build();
    }

    @Bean
    public Docket adminApiConfig(){
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("adminApi")
                .apiInfo(adminApiInfo())
                .select()
                //只显示admin路径下的页面
                .paths(Predicates.and(PathSelectors.regex("/admin/.*")))
                .build();
    }

    private ApiInfo webApiInfo(){
        return new ApiInfoBuilder()
                .title("网站-API文档")
                .description("本文档描述了网站微服务接口定义")
                .version("1.0")
                .contact(new Contact("stt", "http://www.my-notes.cn", "382143256@qq.com"))
                .build();
    }

    private ApiInfo adminApiInfo(){
        return new ApiInfoBuilder()
                .title("后台管理系统-API文档")
                .description("本文档描述了后台管理系统微服务接口定义")
                .version("1.0")
                .contact(new Contact("stt", "http://www.my-notes.cn", "382143256@qq.com"))
                .build();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

注意:在service-hosp模块中ServiceHospApplication 上需要添加 @ComponentScan 注解,用于扫描service-util工具包中的配置类,放入spring容器的管理








 






package com.stt.yygh.hosp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages = "com.stt")
public class ServiceHospApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceHospApplication.class, args);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 带条件的分页查询实现

针对查询的传参需要进行封装,在model模块中创建 com.stt.yygh.vo.hosp.HospitalSetQueryVo

package com.stt.yygh.vo.hosp;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
public class HospitalSetQueryVo {

    @ApiModelProperty(value = "医院名称")
    private String hosname;

    @ApiModelProperty(value = "医院编号")
    private String hoscode;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

在serivce-hosp 模块中的com.stt.yygh.hosp.controller.HospitalSetController添加如下方法

  • 使用@PostMapping注解,接受@RequestBody内的json数据作为查询参数
//3 条件查询带分页
@PostMapping("findPageHospSet/{current}/{limit}")
public Result findPage(@PathVariable long current,
                       @PathVariable long limit,
                       @RequestBody(required = false) HospitalSetQueryVo hospitalSetQueryVo) {
    // 构建查询条件
    QueryWrapper<HospitalSet> queryWrapper = new QueryWrapper<>();
    if (!StringUtils.isEmpty(hospitalSetQueryVo.getHosname())) {
        queryWrapper.like("hosname", hospitalSetQueryVo.getHosname());
    }
    if (!StringUtils.isEmpty(hospitalSetQueryVo.getHoscode())) {
        queryWrapper.like("hoscode", hospitalSetQueryVo.getHoscode());
    }
    // 查询分页
    Page<HospitalSet> re = hospitalSetService.page(new Page<>(current, limit), queryWrapper);
    return Result.ok(re);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 添加医院设置实现

由于添加操作,需要使用MD5加密操作,在service-util下创建

  • 当然实际工作中,应该使用第三方安全jar包中的方法
package com.stt.yygh.common.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public final class MD5 {

    public static String encrypt(String strSrc) {
        try {
            char hexChars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
                    '9', 'a', 'b', 'c', 'd', 'e', 'f' };
            byte[] bytes = strSrc.getBytes();
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(bytes);
            bytes = md.digest();
            int j = bytes.length;
            char[] chars = new char[j * 2];
            int k = 0;
            for (int i = 0; i < bytes.length; i++) {
                byte b = bytes[i];
                chars[k++] = hexChars[b >>> 4 & 0xf];
                chars[k++] = hexChars[b & 0xf];
            }
            return new String(chars);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            throw new RuntimeException("MD5加密出错!!+" + e);
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

在serivce-hosp 模块中的com.stt.yygh.hosp.controller.HospitalSetController添加如下方法

//4 添加医院设置
@PostMapping("saveHospitalSet")
public Result save(@RequestBody HospitalSet hospitalSet) {
    hospitalSet.setStatus(1); // 1 启用, 0 禁用
    // 随机数签名
    Random random = new Random();
    hospitalSet.setSignKey(MD5.encrypt(System.currentTimeMillis() + "" + random.nextInt(1000)));
    boolean re = hospitalSetService.save(hospitalSet);
    if (re) {
        return Result.ok();
    }
    return Result.fail();
}
1
2
3
4
5
6
7
8
9
10
11
12
13

在swagger2页面进行创建测试,可以填写如下参数

{
  "apiUrl": "http://localhost:8888",
  "contactsName": "lisi",
  "contactsPhone": "13866666666",
  "hoscode": "10001",
  "hosname": "协和医院"
}
1
2
3
4
5
6
7

# 通过id查询医院设置

在serivce-hosp 模块中的com.stt.yygh.hosp.controller.HospitalSetController添加如下方法

//5 根据id获取医院设置
@GetMapping("getHospSet/{id}")
public Result getById(@PathVariable Long id) {
    HospitalSet re = hospitalSetService.getById(id);
    return Result.ok(re);
}
1
2
3
4
5
6

# 修改医院设置

在serivce-hosp 模块中的com.stt.yygh.hosp.controller.HospitalSetController添加如下方法

//6 修改医院设置
@PostMapping("updateHospitalSet")
public Result update(@RequestBody HospitalSet hospitalSet) {
    boolean re = hospitalSetService.updateById(hospitalSet);
    if (re) {
        return Result.ok();
    }
    return Result.fail();
}
1
2
3
4
5
6
7
8
9

# 批量删除医院设置

在serivce-hosp 模块中的com.stt.yygh.hosp.controller.HospitalSetController添加如下方法

//7 批量删除医院设置
@DeleteMapping("batchRemove")
public Result batchRemove(@RequestBody List<Long> idList){
    hospitalSetService.removeByIds(idList);
    return Result.ok();
}
1
2
3
4
5
6

# 医院的锁定和解锁操作

医院在创建后,如果锁定了,则不能进行上传信息等其他业务操作

在serivce-hosp 模块中的com.stt.yygh.hosp.controller.HospitalSetController添加如下方法

//8 医院设置锁定和解锁
@PutMapping("lockHospitalSet/{id}/{status}")
public Result updateStatus(@PathVariable Long id,
                           @PathVariable Integer status) {
    HospitalSet hospitalSet = hospitalSetService.getById(id);
    hospitalSet.setStatus(status);
    boolean re = hospitalSetService.updateById(hospitalSet);
    if (re) {
        return Result.ok();
    }
    return Result.fail();
}
1
2
3
4
5
6
7
8
9
10
11
12

# 发送签名的key

医院信息配置后,可以通过短信的形式发送医院编号与签名key给联系人

联系人拿到该信息就可以参考【附录:在线预约挂号API接口文档】对接接口了

在serivce-hosp 模块中的com.stt.yygh.hosp.controller.HospitalSetController添加如下方法

  • 关于发送接口,后期添加
//9 发送签名秘钥
@PutMapping("sendKey/{id}")
public Result lockHospitalSet(@PathVariable Long id) {
    HospitalSet hospitalSet = hospitalSetService.getById(id);
    String signKey = hospitalSet.getSignKey();
    String hosCode = hospitalSet.getHoscode();
    // todo 发送短信
    return Result.ok();
}
1
2
3
4
5
6
7
8
9
Last Updated: 2022/01/16, 11:29:51
02.后台系统-搭建项目
04.后台系统-统一异常处理

← 02.后台系统-搭建项目 04.后台系统-统一异常处理→

Theme by Vdoing | Copyright © 2021-2022 Shetengteng | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式