一、预约挂号微服务模块搭建

项目模块构建

hospital-manage:医院接口模拟端(已开发,直接使用)
yygh-parent:根目录,管理子模块:
common:公共模块父节点
common-util:工具类模块,所有模块都可以依赖于它
rabbit-util:rabbitmq业务封装
service-util:service服务的工具包,包含service服务的公共配置类,所有 service模块依赖于它
server-gateway:服务网关
model:实体类模块
service:api接口服务父节点
service-hosp:医院api接口服务
service-cmn:公共api接口服务
service-user:用户api接口服务
service-order:订单api接口服务
service-oss:文件api接口服务
service-sms:短信 api接口服务
service-task:定时任务服务
service-statistics:统计api接口服务
service-client:feign服务调用父节点
service-cmn-client:公共api接口
service-hosp-client:医院api接口
service-order-client:订单api接口
service-user:用户api接口
搭建环境和医院设置 - 图1
搭建环境和医院设置 - 图2

sql资源

导入sql:资料/sql/*.sql

1 构建父工程(yygh-parent)

父工程目录我们已经通过git引入
搭建环境和医院设置 - 图3

1.1 添加配置pom.xml

| <?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
https://maven.apache.org/xsd/maven-4.0.0.xsd”>
<modelVersion>4.0.0</modelVersion>
<modules>
<module>common</module>
<module>model</module>
<module>service</module>
<module>server-gateway</module>
<module>service-client</module>
<module>hospital-manage</module>
</modules>

  1. <**parent**><br /> <**groupId**>org.springframework.boot</**groupId**><br /> <**artifactId**>spring-boot-starter-parent</**artifactId**><br /> <**version**>2.2.1.RELEASE</**version**><br /> </**parent**>
  2. <**groupId**>com.atguigu.yygh</**groupId**><br /> <**artifactId**>yygh-parent</**artifactId**><br /> <**version**>1.0</**version**><br /> <**packaging**>pom</**packaging**>
  3. <**properties**><br /> <**java.version**>1.8</**java.version**><br /> <**cloud.version**>Hoxton.RELEASE</**cloud.version**><br /> <**alibaba.version**>2.2.0.RELEASE</**alibaba.version**><br /> <**mybatis-plus.version**>3.3.1</**mybatis-plus.version**><br /> <**mysql.version**>5.1.46</**mysql.version**><br /> <**swagger.version**>2.7.0</**swagger.version**><br /> <**jwt.version**>0.7.0</**jwt.version**><br /> <**fastjson.version**>1.2.29</**fastjson.version**><br /> <**httpclient.version**>4.5.1</**httpclient.version**><br /> <**easyexcel.version**>2.2.0-beta2</**easyexcel.version**><br /> <**aliyun.version**>4.1.1</**aliyun.version**><br /> <**oss.version**>3.9.1</**oss.version**><br /> <**jodatime.version**>2.10.1</**jodatime.version**><br /> </**properties**>
  4. _<!--配置dependencyManagement锁定依赖的版本--><br /> _<**dependencyManagement**><br /> <**dependencies**><br /> <**dependency**><br /> <**groupId**>org.springframework.cloud</**groupId**><br /> <**artifactId**>spring-cloud-dependencies</**artifactId**><br /> <**version**>${cloud.version}</**version**><br /> <**type**>pom</**type**><br /> <**scope**>import</**scope**><br /> </**dependency**>
  5. <**dependency**><br /> <**groupId**>com.alibaba.cloud</**groupId**><br /> <**artifactId**>spring-cloud-alibaba-dependencies</**artifactId**><br /> <**version**>${alibaba.version}</**version**><br /> <**type**>pom</**type**><br /> <**scope**>import</**scope**><br /> </**dependency**>
  6. _<!--mybatis-plus 持久层--><br /> _<**dependency**><br /> <**groupId**>com.baomidou</**groupId**><br /> <**artifactId**>mybatis-plus-boot-starter</**artifactId**><br /> <**version**>${mybatis-plus.version}</**version**><br /> </**dependency**>
  7. <**dependency**><br /> <**groupId**>mysql</**groupId**><br /> <**artifactId**>mysql-connector-java</**artifactId**><br /> <**version**>${mysql.version}</**version**><br /> </**dependency**>
  8. _<!--swagger--><br /> _<**dependency**><br /> <**groupId**>io.springfox</**groupId**><br /> <**artifactId**>springfox-swagger2</**artifactId**><br /> <**version**>${swagger.version}</**version**><br /> </**dependency**><br /> _<!--swagger ui--><br /> _<**dependency**><br /> <**groupId**>io.springfox</**groupId**><br /> <**artifactId**>springfox-swagger-ui</**artifactId**><br /> <**version**>${swagger.version}</**version**><br /> </**dependency**>
  9. <**dependency**><br /> <**groupId**>io.jsonwebtoken</**groupId**><br /> <**artifactId**>jjwt</**artifactId**><br /> <**version**>${jwt.version}</**version**><br /> </**dependency**>
  10. <**dependency**><br /> <**groupId**>org.apache.httpcomponents</**groupId**><br /> <**artifactId**>httpclient</**artifactId**><br /> <**version**>${httpclient.version}</**version**><br /> </**dependency**>
  11. <**dependency**><br /> <**groupId**>com.alibaba</**groupId**><br /> <**artifactId**>fastjson</**artifactId**><br /> <**version**>${fastjson.version}</**version**><br /> </**dependency**>
  12. <**dependency**><br /> <**groupId**>com.alibaba</**groupId**><br /> <**artifactId**>easyexcel</**artifactId**><br /> <**version**>${easyexcel.version}</**version**><br /> </**dependency**>
  13. <**dependency**><br /> <**groupId**>com.aliyun</**groupId**><br /> <**artifactId**>aliyun-java-sdk-core</**artifactId**><br /> <**version**>${aliyun.version}</**version**><br /> </**dependency**>
  14. <**dependency**><br /> <**groupId**>com.aliyun.oss</**groupId**><br /> <**artifactId**>aliyun-sdk-oss</**artifactId**><br /> <**version**>${oss.version}</**version**><br /> </**dependency**>
  15. _<!--日期时间工具--><br /> _<**dependency**><br /> <**groupId**>joda-time</**groupId**><br /> <**artifactId**>joda-time</**artifactId**><br /> <**version**>${jodatime.version}</**version**><br /> </**dependency**><br /> </**dependencies**><br /> </**dependencyManagement**>_</**project**> |

| —- |

2 搭建common父模块

common:公共模块父节点
common-util:工具类模块,所有模块都可以依赖于它
service-util:service服务的工具包,包含service服务的公共配置类,所有 service模块依赖于它

2.1 搭建common

点击yygh-parent,选择New–>Module,操作如下
搭建环境和医院设置 - 图4
选择下一步
搭建环境和医院设置 - 图5
选择下一步
搭建环境和医院设置 - 图6
完成,删除src目录,结构如下
搭建环境和医院设置 - 图7

2.2 修改配置pom.xml

| <?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
https://maven.apache.org/xsd/maven-4.0.0.xsd”>
<modelVersion>4.0.0</modelVersion>

<**parent**><br />        <**groupId**>com.atguigu.yygh</**groupId**><br />        <**artifactId**>yygh-parent</**artifactId**><br />        <**version**>1.0</**version**><br />    </**parent**>

<**artifactId**>common</**artifactId**><br />    <**packaging**>pom</**packaging**><br />    <**version**>1.0</**version**>

<**dependencies**><br />        <**dependency**><br />            <**groupId**>org.springframework.boot</**groupId**><br />            <**artifactId**>spring-boot-starter-web</**artifactId**><br />            <**scope**>provided </**scope**><br />        </**dependency**>

    _<!--mybatis-plus--><br />        _<**dependency**><br />            <**groupId**>com.baomidou</**groupId**><br />            <**artifactId**>mybatis-plus-boot-starter</**artifactId**><br />            <**scope**>provided </**scope**><br />        </**dependency**>

    _<!--lombok用来简化实体类:需要安装lombok插件--><br />        _<**dependency**><br />            <**groupId**>org.projectlombok</**groupId**><br />            <**artifactId**>lombok</**artifactId**><br />        </**dependency**>

    _<!--swagger--><br />        _<**dependency**><br />            <**groupId**>io.springfox</**groupId**><br />            <**artifactId**>springfox-swagger2</**artifactId**><br />        </**dependency**><br />        <**dependency**><br />            <**groupId**>io.springfox</**groupId**><br />            <**artifactId**>springfox-swagger-ui</**artifactId**><br />        </**dependency**><br />    </**dependencies**><br /></**project**> |

| —- |

3 搭建common-util模块

3.1 搭建common-util

点击common,选择New–>Module,操作如下
搭建环境和医院设置 - 图8
选择下一步
搭建环境和医院设置 - 图9
选择下一步
搭建环境和医院设置 - 图10
完成,结构如下
搭建环境和医院设置 - 图11

3.2 修改配置pom.xml

| <?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
https://maven.apache.org/xsd/maven-4.0.0.xsd”>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.atguigu.yygh</groupId>
<artifactId>common</artifactId>
<version>1.0</version>
</parent>

<**artifactId**>common-util</**artifactId**><br />    <**version**>1.0</**version**>

<**packaging**>jar</**packaging**><br />    <**name**>common-util</**name**><br />    <**description**>common-util</**description**>

<**dependencies**><br />        <**dependency**><br />            <**groupId**>org.apache.httpcomponents</**groupId**><br />            <**artifactId**>httpclient</**artifactId**><br />        </**dependency**>

    <**dependency**><br />            <**groupId**>com.alibaba</**groupId**><br />            <**artifactId**>fastjson</**artifactId**><br />        </**dependency**>

    <**dependency**><br />            <**groupId**>io.jsonwebtoken</**groupId**><br />            <**artifactId**>jjwt</**artifactId**><br />        </**dependency**>

    <**dependency**><br />            <**groupId**>com.alibaba</**groupId**><br />            <**artifactId**>easyexcel</**artifactId**><br />        </**dependency**>

    _<!-- 日期工具栏依赖 --><br />        _<**dependency**><br />            <**groupId**>joda-time</**groupId**><br />            <**artifactId**>joda-time</**artifactId**><br />        </**dependency**><br />    </**dependencies**>

</project> | | —- |

3.3 添加公共工具类

搭建环境和医院设置 - 图12

YyghException 自定义全局异常
Result API统一返回结果封装类
ResultCodeEnum API统一返回结果状态信息
BeanUtils 实体bean copy工具类
MD5 MD5加密工具类

4搭建service-util模块

4.1 搭建service-util

搭建过程同common-util
如图
搭建环境和医院设置 - 图13

4.2 修改配置pom.xml

| <?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
https://maven.apache.org/xsd/maven-4.0.0.xsd”>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.atguigu.yygh</groupId>
<artifactId>common</artifactId>
<version>1.0</version>
</parent>

<**artifactId**>service-util</**artifactId**><br />    <**version**>1.0</**version**>

<**packaging**>jar</**packaging**><br />    <**name**>service-util</**name**><br />    <**description**>service-util</**description**><br />    <**dependencies**><br />        <**dependency**><br />            <**groupId**>com.atguigu.yygh</**groupId**><br />            <**artifactId**>common-util</**artifactId**><br />            <**version**>1.0</**version**><br />        </**dependency**><br />        _<!-- redis --><br />        _<**dependency**><br />            <**groupId**>org.springframework.boot</**groupId**><br />            <**artifactId**>spring-boot-starter-data-redis</**artifactId**><br />        </**dependency**><br />        _<!-- spring2.X集成redis所需common-pool2--><br />        _<**dependency**><br />            <**groupId**>org.apache.commons</**groupId**><br />            <**artifactId**>commons-pool2</**artifactId**><br />            <**version**>2.6.0</**version**><br />        </**dependency**><br />    </**dependencies**><br /></**project**> |

| —- |

4.3 添加service-util公共类

搭建环境和医院设置 - 图14

MybatisPlusConfig MybatisPlus配置类
CommonMetaObjectHandler Mybatis plus Handler配置类
package com.atguigu.yygh.common.config;
/*
MybatisPlus配置类
*/
@EnableTransactionManagement //事务处理@Configuration
@MapperScan(“com.atguigu.yygh.*.mapper”)public class MybatisPlusConfig {
/*
分页插件
*/
@Beanpublic PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();// paginationInterceptor.setLimit(你的最大单页限制数量,默认 500 条,小于 0 如 -1 不受限制);return paginationInterceptor;
}
/*
乐观锁配置
*/@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor() {return new **OptimisticLockerInterceptor();
}
}
package com.atguigu.yygh.common.handler;/*
Mybatis plus Handler配置类
*/
@Componentpublic class CommonMetaObjectHandler implements MetaObjectHandler {
@Overridepublic void insertFill(MetaObject metaObject) {this.setFieldValByName(“createTime”, new Date(), metaObject);this.setFieldValByName(“updateTime”, new Date(), metaObject);
}@Overridepublic void updateFill(MetaObject metaObject) {this.setFieldValByName(“updateTime”, new Date(), metaObject);
}
}

5搭建model模块

5.1 搭建model

搭建过程同common-util父模块

5.2 修改配置pom.xml

| <?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”>
<modelVersion>4.0.0</modelVersion>

<**parent**><br />        <**groupId**>com.atguigu.yygh</**groupId**><br />        <**artifactId**>yygh-parent</**artifactId**><br />        <**version**>1.0</**version**><br />    </**parent**>

<**artifactId**>model</**artifactId**><br />    <**version**>1.0</**version**><br />    <**packaging**>jar</**packaging**><br />    <**name**>model</**name**><br />    <**description**>model</**description**><br />    <**dependencies**><br />        <**dependency**><br />            <**groupId**>org.projectlombok</**groupId**><br />            <**artifactId**>lombok</**artifactId**><br />        </**dependency**><br />        _<!--mybatis-plus--><br />        _<**dependency**><br />            <**groupId**>com.baomidou</**groupId**><br />            <**artifactId**>mybatis-plus-boot-starter</**artifactId**><br />            <**scope**>provided </**scope**><br />        </**dependency**><br />        _<!--swagger--><br />        _<**dependency**><br />            <**groupId**>io.springfox</**groupId**><br />            <**artifactId**>springfox-swagger2</**artifactId**><br />            <**scope**>provided </**scope**><br />        </**dependency**><br />        <**dependency**><br />            <**groupId**>com.alibaba</**groupId**><br />            <**artifactId**>easyexcel</**artifactId**><br />            <**scope**>provided </**scope**><br />        </**dependency**><br />        <**dependency**><br />            <**groupId**>org.springframework.boot</**groupId**><br />            <**artifactId**>spring-boot-starter-data-mongodb</**artifactId**><br />            <**scope**>provided </**scope**><br />        </**dependency**><br />        <**dependency**><br />            <**groupId**>com.alibaba</**groupId**><br />            <**artifactId**>fastjson</**artifactId**><br />            <**scope**>provided </**scope**><br />        </**dependency**><br />    </**dependencies**><br /></**project**> |

| —- |

5.3 引入实体类

将实体类都引入进来,后续不再单独引入,实体类没有业务逻辑,提前引入,方便后续开发。

6搭建service父模块

service:service模块父节点
service-user:会员服务模块

6.1 搭建service

搭建过程同common父模块

6.2 修改配置pom.xml

| <?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>yygh-parent</artifactId>
<groupId>com.atguigu.yygh</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<**artifactId**>service</**artifactId**><br />    <**packaging**>pom</**packaging**><br />    <**version**>1.0</**version**><br />    <**dependencies**><br />        <**dependency**><br />            <**groupId**>com.atguigu.yygh</**groupId**><br />            <**artifactId**>service-util</**artifactId**><br />            <**version**>1.0</**version**><br />        </**dependency**><br />        <**dependency**><br />            <**groupId**>com.atguigu.yygh</**groupId**><br />            <**artifactId**>model</**artifactId**><br />            <**version**>1.0</**version**><br />        </**dependency**><br />        _<!--web--><br />        _<**dependency**><br />            <**groupId**>org.springframework.boot</**groupId**><br />            <**artifactId**>spring-boot-starter-web</**artifactId**><br />        </**dependency**><br />        _<!--mybatis-plus--><br />        _<**dependency**><br />            <**groupId**>com.baomidou</**groupId**><br />            <**artifactId**>mybatis-plus-boot-starter</**artifactId**><br />        </**dependency**><br />        _<!--mysql--><br />        _<**dependency**><br />            <**groupId**>mysql</**groupId**><br />            <**artifactId**>mysql-connector-java</**artifactId**><br />        </**dependency**><br />        _<!--开发者工具--><br />        _<**dependency**><br />            <**groupId**>org.springframework.boot</**groupId**><br />            <**artifactId**>spring-boot-devtools</**artifactId**><br />            <**optional**>true</**optional**><br />        </**dependency**><br />        _<!-- 服务调用feign --><br />        _<**dependency**><br />            <**groupId**>org.springframework.cloud</**groupId**><br />            <**artifactId**>spring-cloud-starter-openfeign</**artifactId**><br />        </**dependency**><br />        _<!-- 服务注册 --><br />        _<**dependency**><br />            <**groupId**>com.alibaba.cloud</**groupId**><br />            <**artifactId**>spring-cloud-starter-alibaba-nacos-discovery</**artifactId**><br />        </**dependency**>_        <!-- 流量控制 --><br />        _<**dependency**><br />            <**groupId**>com.alibaba.cloud</**groupId**><br />            <**artifactId**>spring-cloud-starter-alibaba-sentinel</**artifactId**><br />        </**dependency**><br />    </**dependencies**><br />    <**build**><br />        <**plugins**><br />            <**plugin**><br />                <**groupId**>org.springframework.boot</**groupId**><br />                <**artifactId**>spring-boot-maven-plugin</**artifactId**><br />            </**plugin**><br />        </**plugins**><br />        <**resources**><br />            <**resource**><br />                <**directory**>src/main/java</**directory**><br />                <**includes**><br />                    <**include**>**/*.yml</**include**><br />                    <**include**>**/*.properties</**include**><br />                    <**include**>**/*.xml</**include**><br />                </**includes**><br />                <**filtering**>false</**filtering**><br />            </**resource**><br />            <**resource**><br />                <**directory**>src/main/resources</**directory**><br />                <**includes**> <**include**>**/*.yml</**include**><br />                    <**include**>**/*.properties</**include**><br />                    <**include**>**/*.xml</**include**><br />                </**includes**><br />                <**filtering**>false</**filtering**><br />            </**resource**><br />        </**resources**><br />    </**build**><br /></**project**> |

| —- |

二、gitee使用

1 创建仓库

搭建环境和医院设置 - 图15

2 点击创建

搭建环境和医院设置 - 图16

3 复制gitee码云的HttpS连接

搭建环境和医院设置 - 图17

4 提交上传

打开项目并点击菜单栏上的【CVS】—》【Import into version control】—》【Create Git Repository】创建本地仓库
搭建环境和医院设置 - 图18
在打开的【Create Git Repository】对话框内选择本地仓库的位置,这里我选择项目的根目录。
搭建环境和医院设置 - 图19
右击项目点击【Git】—》【Add】,接着点击【Git】—》【Commit Directory】在打开的窗口中选择要上传到本地仓库的代码并添加注释后提交到本地仓库内。
搭建环境和医院设置 - 图20
右击项目点击【Git】—》【Repository】—》【Remotes…】。在打开的【Git Remotes】窗口中添加码云的远程仓库。
搭建环境和医院设置 - 图21
搭建环境和医院设置 - 图22
点击【OK】后接着输入码云的账号密码。
搭建环境和医院设置 - 图23
上传代码到码云,右击项目点击【Git】—》【Repository】—》【Push…】在打开的【Push commits】内可以看到已提交到本地仓库的提交信息。点击【Push】按钮将本地仓库的代码上传到码云上,上传成功后就可以在码云上看到。
搭建环境和医院设置 - 图24

三、医院设置需求

4 需求

医院设置主要是用来保存开通医院的一些基本信息,每个医院一条信息,保存了医院编号(平台分配,全局唯一)和接口调用相关的签名key等信息,是整个流程的第一步,只有开通了医院设置信息,才可以上传医院相关信息。
我们所开发的功能就是基于单表的一个CRUD、锁定/解锁和发送签名信息这些基本功能。

2、表结构

搭建环境和医院设置 - 图25
hosname:医院名称
hoscode:医院编号(平台分配,全局唯一,api接口必填信息)
api_url:医院回调的基础url(如:预约下单,我们要调用该地址去医院下单)
sign_key:双方api接口调用的签名key,有平台生成
contacts_name:医院联系人姓名
contacts_phone:医院联系人手机
status:状态(锁定/解锁)

四、医院模块开发

5 搭建医院模块service-hosp

5.1 搭建service-hosp

点击service,选择New–>Module,操作如下
搭建环境和医院设置 - 图26
选择下一步
搭建环境和医院设置 - 图27
选择下一步
搭建环境和医院设置 - 图28
完成,结构如下:
搭建环境和医院设置 - 图29

5.2 修改配置

1、修改pom.xml

| <?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.atguigu.yygh</groupId>
<version>1.0</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>

<dependencies>
</dependencies>

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

</project> | | —- |

2、添加配置文件application.properties

# 服务端口server.port=8201# 服务名spring.application.name=service-hosp
# 环境设置:dev、test、prodspring.profiles.active=dev
# mysql数据库连接spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://192.168.44.163:3306/yygh_hosp?characterEncoding=utf-8&useSSL=falsespring.datasource.username=rootspring.datasource.password=root123
#返回json的全局时间格式spring.jackson.date-format=yyyy-MM-dd HH:mm:ssspring.jackson.time-zone=GMT+8
#配置mapper xml文件的路径
#mybatis-plus.mapper-locations=classpath:com/atguigu/yygh/mapper/xml/*.xml
mybatis-plus.mapper-locations=classpath:com/atguigu/yygh/mapper/xml/*.xml# nacos服务地址spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
#开启sentinelfeign.sentinel.enabled=true#设置sentinel地址spring.cloud.sentinel.transport.dashboard=http://127.0.0.1:8858#mongodb地址spring.data.mongodb.host=192.168.44.163spring.data.mongodb.port=27017spring.data.mongodb.database=yyghhosp
**
#rabbitmq地址_spring.rabbitmq.host=127.0.0.1spring.rabbitmq.port=5672spring.rabbitmq.username=guestspring.rabbitmq.password=guest

1.3 添加启动类

添加com.atguigu.yygh.ServiceHospApplication类

package com.atguigu.yygh;@SpringBootApplicationpublic class ServiceHospApplication { public static void main(String[] args) {
SpringApplication.run(ServiceHospApplication.class, args);
}
}

2添加医院设置CURD

2.1 添加model

说明:由于实体对象没有逻辑,我们已经统一导入
com.atguigu.yygh.model.hosp.HospitalSet

2.2 添加Mapper

添加com.atguigu.yygh.hosp.mapper.HospitalSetMapper

| package com.atguigu.yygh.hosp.mapper;
@Mapperpublic interface HospitalSetMapper extends BaseMapper {

} | | —- |

在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.atguigu.yygh.hosp.mapper.HospitalSetMapper”>

</mapper> | | —- |

2.3 添加service接口及实现类

1、添加com.atguigu.yygh.hosp.service.HospitalSetService接口

package com.atguigu.yygh.hosp.service;
public interface HospitalSetService extends IService {
}

2、添加com.atguigu.yygh.hosp.service.impl.HospitalSetServiceImpl接口实现

| package com.atguigu.yygh.hosp.service.impl;
@Servicepublic class HospitalSetServiceImpl extends ServiceImplimplements HospitalSetService {
@Autowiredprivate HospitalSetMapper hospitalSetMapper;

} | | —- |

2.4 添加controller

添加com.atguigu.yygh.hosp.controller.HospitalSetController类

| package com.atguigu.yygh.hosp.controller;_
@RestController
@RequestMapping(“/admin/hosp/hospitalSet”)public class HospitalSetController {
@Autowiredprivate HospitalSetService hospitalSetService;

} | | —- |

2.5 医院设置CRUD

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

2.6 添加controller方法

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

_//注入service<br />    _@Autowired<br />    **private **HospitalSetService **hospitalSetService**;_    //1 查询医院设置表所有信息<br />    _@ApiOperation(value = **"获取所有医院设置"**)<br />    @GetMapping(**"findAll"**)<br />    **public **Result findAllHospitalSet() {<br />        _//调用service的方法<br />        _List<HospitalSet> list = **hospitalSetService**.list();<br />        **return **Result._ok_(list);<br />    }

_//2 逻辑删除医院设置<br />    _@ApiOperation(value = **"逻辑删除医院设置"**)<br />    @DeleteMapping(**"{id}"**)<br />    **public **Result removeHospSet(@PathVariable Long id) {<br />        **boolean **flag = **hospitalSetService**.removeById(id);<br />        **if**(flag) {<br />            **return **Result._ok_();<br />        } **else **{<br />            **return **Result._fail_();<br />        }<br />    }

_//3 条件查询带分页<br />    _@PostMapping(**"findPageHospSet/{current}/{limit}"**)<br />    **public **Result findPageHospSet(@PathVariable **long **current,<br />                                  @PathVariable **long **limit,<br />                                  @RequestBody<br />(required = **false**) HospitalSetQueryVo hospitalSetQueryVo) {<br />        _//创建page对象,传递当前页,每页记录数<br />        _Page<HospitalSet> page = **new **Page<>(current,limit);<br />        _//构建条件<br />        _QueryWrapper<HospitalSet> wrapper = **new **QueryWrapper<>();<br />        String hosname = hospitalSetQueryVo.getHosname();_//医院名称<br />        _String hoscode = hospitalSetQueryVo.getHoscode();_//医院编号<br />        _**if**(!StringUtils._isEmpty_(hosname)) {<br />            wrapper.like(**"hosname"**,hospitalSetQueryVo.getHosname());<br />        }<br />        **if**(!StringUtils._isEmpty_(hoscode)) {<br />            wrapper.eq(**"hoscode"**,hospitalSetQueryVo.getHoscode());<br />        }<br />        _//调用方法实现分页查询<br />        _Page<HospitalSet> pageHospitalSet = **hospitalSetService**.page(page, wrapper);<br />        _//返回结果<br />        _**return **Result._ok_(pageHospitalSet);<br />    }

_//4 添加医院设置<br />    _@PostMapping(**"saveHospitalSet"**)<br />    **public **Result saveHospitalSet(@RequestBody HospitalSet hospitalSet) {<br />        _//设置状态 1 使用 0 不能使用<br />        _hospitalSet.setStatus(1);<br />        _//签名秘钥<br />        _Random random = **new **Random();<br />        hospitalSet.setSignKey(MD5._encrypt_(System._currentTimeMillis_()+**""**+random.nextInt(1000)));<br />        _//调用service<br />        _**boolean **save = **hospitalSetService**.save(hospitalSet);<br />        **if**(save) {<br />            **return **Result._ok_();<br />        } **else **{<br />            **return **Result._fail_();<br />        }<br />    }

_//5 根据id获取医院设置<br />    _@GetMapping(**"getHospSet/{id}"**)<br />    **public **Result getHospSet(@PathVariable Long id) {<br />        HospitalSet hospitalSet = **hospitalSetService**.getById(id);<br />        **return **Result._ok_(hospitalSet);<br />    }

_//6 修改医院设置<br />    _@PostMapping(**"updateHospitalSet"**)<br />    **public **Result updateHospitalSet(@RequestBody HospitalSet hospitalSet) {<br />        **boolean **flag = **hospitalSetService**.updateById(hospitalSet);<br />        **if**(flag) {<br />            **return **Result._ok_();<br />        } **else **{<br />            **return **Result._fail_();<br />        }<br />    }

_//7 批量删除医院设置<br />    _@DeleteMapping(**"batchRemove"**)<br />    **public **Result batchRemoveHospitalSet(@RequestBody List<Long> idList) {<br />        **hospitalSetService**.removeByIds(idList);<br />        **return **Result._ok_();<br />    }<br />} |

| —- |

说明:一个完整的CRUD就实现了

3、Swagger2介绍与集成

3.1 swagger2介绍

什么是swagger2
编写和维护接口文档是每个程序员的职责,根据Swagger2可以快速帮助我们编写最新的API接口文档,再也不用担心开会前仍忙于整理各种资料了,间接提升了团队开发的沟通效率。
常用注解
swagger通过注解表明该接口会生成文档,包括接口名、请求方法、参数、返回信息的等等。
@Api:修饰整个类,描述Controller的作用
@ApiOperation:描述一个类的一个方法,或者说一个接口
@ApiParam:单个参数描述
@ApiModel:用对象来接收参数
@ApiModelProperty:用对象接收参数时,描述对象的一个字段
@ApiImplicitParam:一个请求参数
@ApiImplicitParams:多个请求参数

3.2 swagger2集成

3.2.1 项目整合swagger2

在common模块pom.xml引入依赖

<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</dependency>

说明:我们在yygh-parent中的pom.xml中添加了版本控制,这里不需要添加版本,已引入就忽略

3.2.2 添加swagger2配置类

在service-util模块添加配置类:
com.atguigu.yygh.common.config.Swagger2Config类

| /*
Swagger2配置信息
*/
@Configuration
@EnableSwagger2public 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<br />    **public **Docket adminApiConfig(){<br />        **return new **Docket(DocumentationType.**_SWAGGER_2_**)<br />                .groupName(**"adminApi"**)<br />                .apiInfo(adminApiInfo())<br />                .select()<br />                _//只显示admin路径下的页面<br />                _.paths(Predicates._and_(PathSelectors._regex_(**"/admin/.*"**)))<br />                .build();<br />    }

**private **ApiInfo webApiInfo(){<br />        **return new **ApiInfoBuilder()<br />                .title(**"网站-API文档"**)<br />                .description(**"本文档描述了网站微服务接口定义"**)<br />                .version(**"1.0"**)<br />                .contact(**new **Contact(**"atguigu"**, **"http://atguigu.com"**, **"493211102@qq.com"**))<br />                .build();<br />    }

**private **ApiInfo adminApiInfo(){<br />        **return new **ApiInfoBuilder()<br />                .title(**"后台管理系统-API文档"**)<br />                .description(**"本文档描述了后台管理系统微服务接口定义"**)<br />                .version(**"1.0"**)<br />                .contact(**new **Contact(**"atguigu"**, **"http://atguigu.com"**, **"49321112@qq.com"**))<br />                .build();<br />    }<br />} |

| —- |

3.3 使用swagger2测试

搭建环境和医院设置 - 图30

4、医院锁定与解锁

医院锁定后不能再上传数据

4.1 添加controller方法

在HospitalSetController类添加方法

//8 医院设置锁定和解锁@PutMapping(“lockHospitalSet/{id}/{status}”)public Result lockHospitalSet(@PathVariable Long id,
@PathVariable Integer status) {
//根据id查询医院设置信息
_HospitalSet hospitalSet = hospitalSetService.getById(id);
//设置状态
hospitalSet.setStatus(status);
//调用方法
hospitalSetService.updateById(hospitalSet);
return Result._ok
();
}

5、发送签名key

医院信息配置后,可以通过短信的形式发送医院编号与签名key给联系人,联系人拿到该信息就可以参考《尚医通API接口文档.docx》对接接口了。

5.1 添加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();
}

6、全局异常处理

spring boot 默认情况下会映射到 /error 进行异常处理,但是提示并不十分友好,下面自定义异常处理,提供友好展示。

6.1 自定义异常类

我们在搭建模块时在common-util模块已经添加了YyghException类,这里不做解释

6.2 添加全局异常处理类

在service-util模块添加全局异常处理类

| package com.atguigu.yygh.common.handler;

/*
全局异常处理类

/
@ControllerAdvicepublic class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)@ResponseBodypublic Result error(Exception e){
e.printStackTrace();return Result.fail();
}
/*
自定义异常处理方法
*
@param __e* @return*/@ExceptionHandler(YyghException.class)@ResponseBodypublic Result error(YyghException e){return Result.build(e.getCode(), e.getMessage());
}
} | | —- |

6.3 集成测试

手动在controller任意方法制造异常(int i = 1/0),添加GlobalExceptionHandler类与不添加这个类区别

7、日志

7.1配置日志级别

日志记录器(Logger)的行为是分等级的。如下表所示:
分为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL
默认情况下,spring boot从控制台打印出来的日志级别只有INFO及以上级别,可以配置日志级别
# 设置日志级别
logging.level.root=WARN
这种方式只能将日志打印在控制台上

7.2 Logback日志

spring boot内部使用Logback作为日志实现的框架。
Logback和log4j非常相似,如果你对log4j很熟悉,那对logback很快就会得心应手。

7.3 配置日志

resources/logback-spring.xml

| <?xml version=”1.0” encoding=”UTF-8”?><configuration scan=”true” scanPeriod=”10 seconds”>




<contextName>logback</contextName>

<property name=”log.path” value=”D:/yygh_log/edu” />







<property name=”CONSOLE_LOG_PATTERN”
value=”%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)”
/>

<appender name=”CONSOLE” class=”ch.qos.logback.core.ConsoleAppender”>


<filter class=”ch.qos.logback.classic.filter.ThresholdFilter”>
<level>INFO</level>
</filter>
<encoder>
<Pattern>${CONSOLELOG_PATTERN}</Pattern>

<charset>UTF-8</charset>
</encoder>
</appender>


<appender name=”INFO_FILE” class=”ch.qos.logback.core.rolling.RollingFileAppender”>

<file>${log.path}/log_info.log</file>

<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>

<rollingPolicy class=”ch.qos.logback.core.rolling.TimeBasedRollingPolicy”>

<fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class=”ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP”>
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>

<maxHistory>15</maxHistory>
</rollingPolicy>

_<filter class=”ch.qos.logback.classic.filter.LevelFilter”>
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>

_<!-- 时间滚动输出 level为 WARN 日志 --><br />    _<**appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"**><br />        _<!-- 正在记录的日志文件的路径及文件名 --><br />        _<**file**>${log.path}/log_warn.log</**file**><br />        _<!--日志文件输出格式--><br />        _<**encoder**><br />            <**pattern**>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</**pattern**><br />            <**charset**>UTF-8</**charset**> _<!-- 此处设置字符集 --><br />        _</**encoder**><br />        _<!-- 日志记录器的滚动策略,按日期,按大小记录 --><br />        _<**rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"**><br />            <**fileNamePattern**>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</**fileNamePattern**><br />            <**timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"**><br />                <**maxFileSize**>100MB</**maxFileSize**><br />            </**timeBasedFileNamingAndTriggeringPolicy**><br />            _<!--日志文件保留天数--><br />            _<**maxHistory**>15</**maxHistory**><br />        </**rollingPolicy**><br />        _<!-- 此日志文件只记录warn级别的 --><br />        _<**filter class="ch.qos.logback.classic.filter.LevelFilter"**><br />            <**level**>warn</**level**><br />            <**onMatch**>ACCEPT</**onMatch**><br />            <**onMismatch**>DENY</**onMismatch**><br />        </**filter**><br />    </**appender**>

_<!-- 时间滚动输出 level为 ERROR 日志 --><br />    _<**appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"**><br />        _<!-- 正在记录的日志文件的路径及文件名 --><br />        _<**file**>${log.path}/log_error.log</**file**><br />        _<!--日志文件输出格式--><br />        _<**encoder**><br />            <**pattern**>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</**pattern**><br />            <**charset**>UTF-8</**charset**> _<!-- 此处设置字符集 --><br />        _</**encoder**><br />        _<!-- 日志记录器的滚动策略,按日期,按大小记录 --><br />        _<**rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"**><br />            <**fileNamePattern**>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</**fileNamePattern**><br />            <**timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"**><br />                <**maxFileSize**>100MB</**maxFileSize**><br />            </**timeBasedFileNamingAndTriggeringPolicy**><br />            _<!--日志文件保留天数--><br />            _<**maxHistory**>15</**maxHistory**><br />        </**rollingPolicy**><br />        _<!-- 此日志文件只记录ERROR级别的 --><br />        _<**filter class="ch.qos.logback.classic.filter.LevelFilter"**><br />            <**level**>ERROR</**level**><br />            <**onMatch**>ACCEPT</**onMatch**><br />            <**onMismatch**>DENY</**onMismatch**><br />        </**filter**><br />    </**appender**>

_<!--<br />        <logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。<br />        <logger>仅有一个name属性,<br />        一个可选的level和一个可选的addtivity属性。<br />        name:用来指定受此logger约束的某一个包或者具体的某一个类。<br />        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,<br />              如果未设置此属性,那么当前logger将会继承上级的级别。<br />    --><br />    <!--<br />        使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:<br />        第一种把<root level="INFO">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息<br />        第二种就是单独给mapper下目录配置DEBUG模式,代码如下,这样配置sql语句会打印,其他还是正常DEBUG级别:<br />     --><br />    <!--开发环境:打印控制台--><br />    _<**springProfile name="dev"**><br />        _<!--可以输出项目中的debug日志,包括mybatis的sql日志--><br />        _<**logger name="com.guli" level="INFO" **/>

    _<!--<br />            root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性<br />            level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,默认是DEBUG<br />            可以包含零个或多个appender元素。<br />        --><br />        _<**root level="INFO"**><br />            <**appender-ref ref="CONSOLE" **/><br />            <**appender-ref ref="INFO_FILE" **/><br />            <**appender-ref ref="WARN_FILE" **/><br />            <**appender-ref ref="ERROR_FILE" **/><br />        </**root**><br />    </**springProfile**>

_<!--生产环境:输出到文件--><br />    _<**springProfile name="pro"**>

    <**root level="INFO"**><br />            <**appender-ref ref="CONSOLE" **/><br />            <**appender-ref ref="DEBUG_FILE" **/><br />            <**appender-ref ref="INFO_FILE" **/><br />            <**appender-ref ref="ERROR_FILE" **/><br />            <**appender-ref ref="WARN_FILE" **/><br />        </**root**><br />    </**springProfile**><br /></**configuration**> |

| —- |