尚医通day01-【项目环境搭建和医院设置详细步骤】(内附源码)

这篇具有很好参考价值的文章主要介绍了尚医通day01-【项目环境搭建和医院设置详细步骤】(内附源码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第01章-项目介绍

1、课程介绍

  • 项目名称:尚医通预约挂号统一平台
  • 项目原型:https://www.114yygh.com 北京市预约挂号统一平台
  • 项目技术栈:前后端分离
    • 后端技术:SpringBoot + SpringCloud + MyBatisPlus + MySQL + MongoDB + Redis + RabbitMQ + Docker + EasyExcel + API远程接口调用 + SDK远程接口调用 + 对称加密和非对称加密 + 数字签名和数字证书 + OAuth2 + 内网穿透 + 微信登录 + 微信支付 + 阿里云OSS服务 + 阿里云市场短信服务 + 定时任务
    • 前端技术:Vue.js + ElementUI + npm + axios + Nuxt.js

2、功能简介

功能模块:尚医通(预约挂号平台、管理平台、接口系统)、医院系统(接口系统)

业务流程:

3、尚医通技术架构

架构设计需要考虑的几个方面:

  • 可扩展性:系统功能会随着用户量的增加以及多变的互联网用户需求不断地扩展,因此考虑到系统的可扩展性的要求,需要使用微服务架构,引入消息中间件
  • 性能:考虑访问频率,每个用户每天的访问次数。一般项目初始阶段用户的访问量可能并不大,如果考虑做运营推广,可能会迎来服务器访问量骤增,因此要考虑分布式部署,引入缓存
  • 安全性: 系统的信息有一定的隐私性,例如用户的个人身份信息,因此使用账号密码管理。另外涉及到身份证照片的上传,需要有加密和权限控制功能的文件服务器。系统涉及第三方微信登录和微信支付,引入微信登录接口和支付接口,确保登录和支付的安全。
  • 高可用:系统一旦宕机,将会带来不可挽回的损失,因此必须做负载均衡,甚至是异地多活这类复杂的方案。如果数据丢失,修复将会非常麻烦,只能靠人工逐条修复,这个很难接受,因此需要考虑存储高可靠。我们需要考虑多种异常情况:机器故障、机房故障,针对机器故障,我们需要设计 MySQL 同机房主备方案;针对机房故障,我们需要设计 MySQL 跨机房同步方案。为了减轻MySQL服务器的访问压力,我们引入更灵活的MongoDB数据库。
  • 成本:互联网程序的主要成本在于服务器成本、流量成本、存储成本、流媒体研发成本,中小型公司可以考虑使用云服务器和云服务。系统中我们是用了阿里云OSS和阿里云市场短信。

第02章-启动项目工程

整个项目基于一个已经开发好的“通用权限系统”进行二次开发,因此我们先将“通用权限系统”搭建并运行起来

1、运行数据库脚本

资料:资料>权限系统>guigu_common_system.sql

2、安装redis的docker容器

2.1、创建redis挂载目录

mkdir -p /atguigu/syt/redis/{data,conf}

2.2、复制配置文件

/atguigu/syt/redis/conf 目录中创建文件 redis.conf,文件从

资料:资料>权限系统>redis-6.2.7.tar.gz 中解压获取

修改默认配置(从上至下依次):

#bind 127.0.0.1 #注释掉这部分,这是限制redis只能本地访问
protected-mode no #默认yes,开启保护模式,限制为本地访问
daemonize no #默认no,改为yes意为以守护进程方式启动,可后台运行,#注意!!!此处是no,否则redis无法通过配置文件启动

也可以直接从资料目录复制,这里是已经修改好的配置文件

资料:资料>权限系统>redis.conf

2.3、创建redis容器

docker run -d --restart=always --name atguigu_syt_redis \
-p 6379:6379 \
-v /atguigu/syt/redis/conf/redis.conf:/redis.conf \
-v /atguigu/syt/redis/data:/data \
redis:6.2.7 \
redis-server /redis.conf \
--appendonly yes --requirepass "123456"

参数解释:

-d 后台运行
-p 端口映射到主机的端口
-v 将主机目录挂载到容器的目录
redis-server --appendonly yes : 在容器执行redis-server启动命令,并打开appendonly持久化配置
–requirepass :设置密码

常见问题:以下IPv4问题会导致无法远程链接redis服务

解决方案:

#修改配置文件:
vim /usr/lib/sysctl.d/00-system.conf
#追加
net.ipv4.ip_forward=1
#接着重启网络
systemctl restart network

2.4、进入redis容器

docker exec -it atguigu_syt_redis redis-cli

2.5、输入密码

auth 123456

2.6、测试

set name "xiaogu" 

2.7、远程连接测试

在本机使用客户端工具远程链接redis,测试是否能成功连接

3、运行后端项目

3.1、启动后端Java项目

资料:资料>权限系统>guigu-syt-parent.zip

将压缩包解压,并放在自己的工作目录下,启动前注意检查:

  • 配置文件:修改application-dev.yml中MySQL和redis的相关参数

  • idea的Maven配置:配置到自己的Maven配置文件和本地仓库目录中

  • idea中配置的jdk版本:1.8.0_300以上(微信支付安全策略要求)

  • idea的项目编码:utf8

  • MySQL版本:8.0

3.2、测试后端Java项目

  • 访问Swagger测试页面:http://localhost:8800/doc.html

  • 执行登录测试,并获取token:用户名是admin,密码是111111

  • 在文档管理中添加全局参数token:
  • 测试一个后端接口,例如,岗位管理->根据id获取数据,确保请求头中携带了刚刚设置的token:
  • 录入参数,测试功能,确保后端程序成功运行,并可正常使用:

4、运行前端项目

4.1、启动前端vue项目

资料:资料>权限系统>guigu-syt-ui.zip

将压缩包解压,并放在自己的工作目录下,启动前注意检查:

  • node.js版本:v16.16.0

执行以下命令启动项目

npm i #安装项目依赖模块
npm run dev #运行程序

4.2、测试前端vue项目

访问前端页面:http://localhost:9528/

5、项目结构介绍

5.1、后端项目

|-guigu-syt-parent:项目父节点,管理多个子模块
	|-common:公共模块父节点
		|-common-log:系统日志
		|-common-util:通用工具类
		|-model:实体类
		|-service-util:微服务通用配置
		|-spring-security:用户认证和授权
	|-service:微服务父节点
		|-service-system:认证和授权管理微服务

说明:model模块中的com.atguigu.syt是尚医通项目中的实体类

5.2、前端项目

这里列出重要的目录和文件:

|-node_modules 下载的模块依赖
|-public
	|-index.html 入口页面
|-src
	|-api 后端api请求模块
	|-assets 公共资源文件
	|-components 通用组件
	|-layout 页面布局
	|-router 路由配置
	|-utils 通用工具
		|-request.js axios封装
	|-views 页面组件
		|-dashboard 首页面
		|-login 登录页面
		|-system 通用权限页面
	|-App.vue 根组件
	|-main.js 入口js
	|-settings.js 应用基本配置
|-package.json 当前项目基本信息和依赖信息
|-vue.config.js webpack相关配置

第03章-医院设置微服务

1、需求

当医院入驻尚医通平台后,尚医通管理员会为每个医院创建一条医院设置记录,这里会为每个医院分配一个唯一的医院编码,分配一个用于远程接口调用的密钥,并配置每个医院的远程接口主机地址,以及医院信息系统的联系人、联系方式等相关信息。只有平台为医院添加了医院设置信息,医院才可以上传医院基本信息、医院预约规则信息、医院科室信息、医院排班信息等内容到平台中。

1.1、医院设置列表

1.2、医院设置表单

2、创建数据库

资料:资料>医院设置微服务>guigu_syt_hosp.sql

  • 数据库:guigu_syt_hosp
  • 表结构:hospital_set
hosname:医院名称
hoscode:医院编号(平台分配,全局唯一,api接口必填信息)
api_url:医院接口调用的主机地址(如:预约下单,我们要调用该地址去医院下单)
sign_key:双方api接口调用的签名key,由平台生成
contacts_name:医院联系人姓名
contacts_phone:医院联系人手机
status:状态(锁定/解锁)

3、创建service-hosp模块

在service下创建子模块,选择 maven类型的模块,输入模块名称service-hosp,完成创建

创建后删除默认的主类Main.java

4、添加依赖

在service-hosp中添加依赖:

<dependencies>
    <!--实体-->
    <dependency>
        <groupId>com.atguigu</groupId>
        <artifactId>model</artifactId>
        <version>1.0</version>
    </dependency>

    <!--服务通用配置-->
    <dependency>
        <groupId>com.atguigu</groupId>
        <artifactId>service-util</artifactId>
        <version>1.0</version>
    </dependency>

    <!--自定义安全模块-->
    <dependency>
        <groupId>com.atguigu</groupId>
        <artifactId>spring-security</artifactId>
        <version>1.0</version>
    </dependency>

    <!--mysql驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <!-- 单元测试 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

5、代码生成器

在service-util中添加代码生成器:

5.1、添加依赖

<!--MP代码生成器-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
</dependency>
<!--代码生成器模板-->
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
</dependency>
<!--mysql驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>provided</scope>
</dependency>

5.2、编写代码生成器

在service-util的test目录中,创建包com.atguigu.syt

从资料中复制代码生成器

资料:资料>医院设置微服务>CodeGen.java

确认代码生成器中变量moduleName的值为hosp,以及数据源配置,然后运行程序

然后删除service-hosp微服务中的entity包,修改mapper层和service层引入的实体类,并引入model模块中的实体类

6、创建配置文件

在service-hosp模块中resources目录下创建文件

application.yml

spring:
  application:
    name: service-hosp
  profiles:
    active: dev,redis

application-dev.yml

server:
  port: 8201

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath:com/atguigu/syt/hosp/mapper/xml/*.xml
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    password: 123456
    url: jdbc:mysql://localhost:3306/guigu_syt_hosp?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false
    username: root
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8

7、创建SpringBoot启动类

在包com.atguigu.syt.hosp中创建启动类ServiceHospApplication.java

package com.atguigu.syt.hosp;

@SpringBootApplication
@ComponentScan(basePackages = {"com.atguigu"})
public class ServiceHospApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceHospApplication.class, args);
    }
}

8、实现基本CRUD

简单的功能我们可以直接在controller中实现

8.1、编写Controller代码

注意:将@RequestMapping路径前面添加 /admin 前缀

package com.atguigu.syt.hosp.controller.admin;

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

    @Resource
    private HospitalSetService hospitalSetService;

    @ApiOperation(value = "根据id查询医院设置")
    @GetMapping("/getHospSet/{id}")
    public Result<HospitalSet> getById(
            @ApiParam(value = "医院设置id",required = true)
            @PathVariable Long id){
        HospitalSet hospitalSet = hospitalSetService.getById(id);
        return Result.ok(hospitalSet);
    }

    @ApiOperation(value = "根据id删除医院设置")
    @DeleteMapping("/{id}")
    public Result removeById(
            @ApiParam(value = "医院设置id",required = true)
            @PathVariable Long id){
        boolean result = hospitalSetService.removeById(id);
        if(result){
            return Result.ok().message("删除成功");
        }else{
            return Result.fail().message("删除失败");
        }
    }

    @ApiOperation(value = "新增医院设置")
    @PostMapping("/saveHospSet")
    public Result save(
            @ApiParam(value = "医院设置对象", required = true)
            @RequestBody HospitalSet hospitalSet){

        //设置状态 1可用 0锁定
        hospitalSet.setStatus(1);
        //生成签名秘钥
        Random random = new Random();
        hospitalSet.setSignKey(MD5.encrypt(System.currentTimeMillis()+""+random.nextInt(1000)));
        boolean result = hospitalSetService.save(hospitalSet);
        if(result){
            return Result.ok().message("添加成功");
        }else{
            return Result.fail().message("添加失败");
        }
    }

    @ApiOperation(value = "根据ID修改医院设置")
    @PutMapping("/updateHospSet")
    public Result updateById(
            @ApiParam(value = "医院设置对象", required = true)
            @RequestBody HospitalSet hospitalSet){
        boolean result = hospitalSetService.updateById(hospitalSet);
        if(result){
            return Result.ok().message("修改成功");
        }else{
            return Result.fail().message("修改失败");
        }
    }

    @ApiOperation(value = "批量删除医院设置") //[1,2,3]
    @DeleteMapping("/batchRemove")
    public Result batchRemoveHospitalSet(
            @ApiParam(value = "id列表", required = true)
            @RequestBody List<Long> idList) {

        boolean result = hospitalSetService.removeByIds(idList);
        if(result){
            return Result.ok().message("删除成功");
        }else{
            return Result.fail().message("删除失败");
        }
    }

    @ApiOperation(value = "医院设置锁定和解锁")
    @PutMapping("/lockHospitalSet/{id}/{status}")
    public Result lockHospitalSet(
            @ApiParam(value = "医院设置id",required = true) @PathVariable Long id,
            @ApiParam(value = "状态", required = true) @PathVariable Integer status) {

        if(status != 0 && status != 1){
            return Result.fail().message("非法数据");
        }

        HospitalSet hospitalSet = new HospitalSet();
        hospitalSet.setId(id);
        hospitalSet.setStatus(status);
        boolean result = hospitalSetService.updateById(hospitalSet);

        if(result){
            return Result.ok().message("操作成功");
        }else{
            return Result.fail().message("操作失败");
        }
    }
}

8.2、Swagger测试

注意:先登录,获取token,然后设置全局token

9、分页和条件查询

复杂的功能我们需要添加service层

9.1、Controller

AdminHospitalSetController中添加分页方法

@ApiOperation("分页条件查询")
@GetMapping("/{page}/{limit}")
public Result<Page> pageList(
    @ApiParam(value = "页码",required = true)
    @PathVariable Long page,
    @ApiParam(value = "每页记录数",required = true)
    @PathVariable Long limit,
    @ApiParam(value = "查询对象",required = false)
    HospitalSetQueryVo hospitalSetQueryVo
){
    Page<HospitalSet> pageParam = hospitalSetService.selectPage(page, limit, hospitalSetQueryVo);
    return Result.ok(pageParam);
}

9.2、Service

接口:HospitalSetService

/**
     * 分页查询
     * @param page 页码
     * @param limit 每页记录数
     * @param hospitalSetQueryVo 查询对象
     * @return 分页对象
     */
Page<HospitalSet> selectPage(Long page, Long limit, HospitalSetQueryVo hospitalSetQueryVo);

实现:HospitalSetServiceImpl

@Override
public Page<HospitalSet> selectPage(Long page, Long limit, HospitalSetQueryVo hospitalSetQueryVo) {

    //分页参数
    Page<HospitalSet> pageParam = new Page<>(page, limit);

    //查询参数
    QueryWrapper<HospitalSet> queryWrapper = new QueryWrapper<>();
    String hosname = hospitalSetQueryVo.getHosname();
    queryWrapper.like(!StringUtils.isEmpty(hosname),"hosname", hosname);
    String hoscode = hospitalSetQueryVo.getHoscode();
    queryWrapper.eq(!StringUtils.isEmpty(hoscode), "hoscode", hoscode);

    //执行查询
    baseMapper.selectPage(pageParam, queryWrapper);
    return pageParam;
}

第04章-统一日志

1、Logback日志

spring boot内部使用Logback作为日志实现的框架。

1.1、什么是日志

通过日志查看程序的运行过程,运行信息,异常信息等

统一日志处理的目的:

  • 将日志记录在文件中,方便运维和开发做错误排查
  • 文件日志需要做滚动输出(输出到更多的日志文件中),避免单日志体积过大,拖垮服务器
  • 可以方便的在开发环境和生产环境等环境中切换输出方式,例如在控制台和日志文件中灵活输出

1.2、设置日志级别

日志记录器(Logger)的行为是分等级的。如下表所示:

从高到低分为:ERROR、WARN、INFO、DEBUG、TRACE

可以在service-hosp的application-dev.yml文件中,通过以下配置设置日志级别

logging:
  level:
    root: info

1.3、测试日志的输出

启动service-hosp微服务,可以看到微服务的启动日志在控制台上输出了info级别的内容

也可以修改成debug、error等其他级别查看日志输出情况

1.4、测试日志的打印

在AdminHospitalSetController类上添加注解:

@Slf4j

添加测试方法:

@ApiOperation(value = "日志测试")
@GetMapping("/log")
public Result log(){

    log.trace("getHospSet trace");
    log.debug("getHospSet debug");
    log.info("getHospSet info");
    log.warn("getHospSet warn");
    log.error("getHospSet error");

    return Result.ok();
}

在application-dev.yml文件中修改日志级别,可以看到日志的输出情况。

2、Logback日志文件

可以创建独立的日志配置文件,配置更强大的日志功能

2.1、创建Logback日志文件

在service-util的resources目录 中创建 logback-spring.xml (默认日志文件的名字)

2.2、控制台日志配置

在logback-spring.xml中配置如下内容:

<!--
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">


    <!--每个logger都关联到logger上下文,默认上下文名称为“default”。
    可以使用contextName标签设置成其他名字,用于区分不同应用程序的记录-->
    <contextName>syt</contextName>

    <!--
    用来定义变量值的标签,property标签有两个属性,name和value;
    其中name的值是变量的名称,value的值是变量定义的值。
    通过property定义的值会被插入到logger上下文中。
    定义变量后,可以使“${name}”来使用变量。
    -->
    <property name="charset" value="UTF-8"></property>
    <!--控制台彩色日志日志格式-->
    <!-- magenta:洋红 -->
    <!-- boldMagenta:粗红-->
    <!-- cyan:青色 -->
    <!-- white:白色 -->
    <!-- magenta:洋红 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="%boldMagenta(%date{yyyy-MM-dd HH:mm:ss}) %highlight(%-5level) %thread %magenta(%file:%line) %green(%logger) - %msg%n"/>

    <!-- 默认的控制台日志输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>${charset}</charset>
        </encoder>
    </appender>

    <!--
    根logger,且只有一个level属性,定义日志输出的默认级别
    如果微服务中配置了logging:level:xxx,那么微服务中设置的级别优先
    如果微服务中没有配置日志级别,那么日志按照此处配置的级别输出
    -->
    <root level="info">
        <!--ref:引用appender的name的值-->
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

启动service-hosp,微服务的启动信息在控制台按照CONSOLE_LOG_PATTERN中设置的格式和颜色输出,并且输出的级别由root节点的level属性指定

2.3、文件日志配置

控制台日志只在开发环境下使用,生产环境下我们不使用控制台日志,而是需要将日志输出到文件中。

在logback-spring.xml中配置如下内容:

<!--
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">


    <!--每个logger都关联到logger上下文,默认上下文名称为“default”。
    可以使用contextName标签设置成其他名字,用于区分不同应用程序的记录-->
    <contextName>syt</contextName>

    <!--
       用来定义变量值的标签,property标签有两个属性,name和value;
       其中name的值是变量的名称,value的值是变量定义的值。
       通过property定义的值会被插入到logger上下文中。
       定义变量后,可以使“${name}”来使用变量。
       -->
    <property name="charset" value="UTF-8"></property>

    <!-- 属性文件:在properties文件中找到对应的配置项 -->
    <property name="logging.position"  value="D:/project/yygh/logs/"/>
    <springProperty scope="context" name="logging.path"  source="logging.file.path"/>
    <springProperty scope="context" name="logging.level" source="logging.level.root"/>

    <appender name="SYT-LOGGER" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <append>true</append>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>${logging.level}</level>
        </filter>
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${logging.position}${logging.path}/syt-log.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>${charset}</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档路径以及格式 -->
            <fileNamePattern>${logging.position}${logging.path}/syt-log-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>1MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>


    <!--
    根logger,且只有一个level属性,定义日志输出的默认级别
    如果微服务中配置了logging:level:xxx,那么微服务中设置的级别优先
    如果微服务中没有配置日志级别,那么日志按照此处配置的级别输出
    -->
    <root level="info">
        <appender-ref ref="SYT-LOGGER"/>
    </root>
</configuration>

在service-hosp的application-dev.yml文件中,通过以下配置设置日志级别和日志路径

logging:
  level:
    root: info
  file:
    path: hosp

所以控制台中将只会打印出Spring Boot的bannar之后就啥也不打印了,所有的启动信息都会被打印在日志文件syt-log.log中。

但是实际上我们不希望业务日志中包括这些启动信息。所以这个时候我们就需要通过logger标签来搞事情了。将上面的配置文件进行简单修改:将标签改为标签

<!--
用来设置某一个包或者具体的某一个类的日志打印级别以及指定appender。
-->
<logger name="com.atguigu.syt" level="${logging.level}" additivity="false">
    <appender-ref ref="SYT-LOGGER" />
</logger>

2.4、只打印error的appender

通过如下的方式设置节点,可以只打印一个级别的日志在指定的日志文件中,这里设置只打印error级别:

<!-- 错误日志 appender : 按照每天生成日志文件 -->
<appender name="SYT-ERROR-LOGGER" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <append>true</append>
    <!-- 过滤器,只记录 error 级别的日志 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERROR</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
    <!-- 日志名称 -->
    <file>${logging.position}${logging.path}/syt-error-log.log</file>
    <!--日志文件输出格式-->
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        <charset>${charset}</charset>
    </encoder>
    <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- 每天日志归档路径以及格式 -->
        <fileNamePattern>${logging.position}${logging.path}/syt-error-log-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>1MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
        <!--日志文件保留天数-->
        <maxHistory>30</maxHistory>
    </rollingPolicy>
</appender>

2.5、完整的日志配置文件

可以从资料文件夹中复制完整的日志配置文件到service-util中

资料:资料>医院设置微服务>logback-spring.xml

文件中添加了节点,表示应用于特定的环境的日志配置,如下:

<!-- 开发环境 -->
<springProfile name="dev">
    <!--
    根logger,且只有一个level属性,定义日志输出的默认级别
    如果微服务中配置了logging:level:xxx,那么微服务中设置的级别优先
    如果微服务中没有配置日志级别,那么日志按照此处配置的级别输出
    -->
    <root level="info">
        <appender-ref ref="STDOUT"/>
    </root>
</springProfile>

<!-- 生产环境 -->
<springProfile name="prod">
    <!--
    用来设置某一个包或者具体的某一个类的日志打印级别以及指定appender。
    -->
    <logger name="com.atguigu.syt" level="${logging.level}" additivity="false">
        <appender-ref ref="SYT-LOGGER" />
        <appender-ref ref="SYT-ERROR-LOGGER" />
    </logger>
</springProfile>

修改service-hosp中的application.yml配置文件如下:则日志输出在控制台

spring:
  application:
    name: service-hosp
  profiles:
    active: dev,redis

修改service-hosp中的application.yml配置文件如下:则日志输出在文件中

spring:
  application:
    name: service-hosp
  profiles:
    active: prod,redis

在service-system中的application-dev中添加如下配置:

logging:
  level:
    root: info
  file:
    path: system

源码:https://gitee.com/dengyaojava/guigu-syt-parent文章来源地址https://www.toymoban.com/news/detail-480207.html

到了这里,关于尚医通day01-【项目环境搭建和医院设置详细步骤】(内附源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 尚医通-day12【token续期和就诊人管理】(内附源码)

    ![image-20230225060710 前面我们完成了用户登录、用户认证与就诊人管理,现在我们需要把这些信息在我们的平台管理系统中进行统一管理 简单的设置redis和cookie的过期时间,会导致用户在操作的过程中掉线,为了解决这个问题,我们可以使用token续期的方案,具体的做法是生成一

    2024年02月09日
    浏览(44)
  • day01-项目介绍与环境搭建

    Java基础知识 javaweb MySQL SpringBoot SSM(Spring,SpringMVC,MyBatis) Maven 了解企业项目开发的完整流程,增长开发经验 了解需求分析的过程,提高分析和设计能力 对所学的技术进行灵活应用,提高编码能力 解决各种异常情况,提高代码调试能力 开发环境(development):开发人员在

    2023年04月14日
    浏览(38)
  • 【尚医通】vue3+ts前端项目开发笔记 2 —— 创建项目、封装网络请求、集成elment-plus 、重置样式、准备状态管理/路由 等开发前准备

    服务器地址:http://syt.atguigu.cn 医院接口:http://139.198.34.216:8201/swagger-ui.html 公共数据接口:http://139.198.34.216:8202/swagger-ui.html 会员接口:http://139.198.34.216:8203/swagger-ui.html 短信验证码接口:http://139.198.34.216:8204/swagger-ui.html 订单接口:http://139.198.34.216:8206/swagger-ui.html 文件上传接口:

    2024年02月13日
    浏览(51)
  • kubesphere部署尚医通

    目录 ​​​​​​​ 项目架构  中间件 deploy.yaml 修改maven从阿里云下载镜像 部署到k8s集群  中间件 集群内地址 外部访问地址 Nacos his-nacos.his:8848 192.168.1.211:30349/nacos MySQL his-mysql.his:3306 192.168.1.211:31840 Redis his-redis.his:6379 192.168.1.211:31968 Sentinel his-sentinel.his:8080 192.168.1.211 MongoD

    2024年02月06日
    浏览(46)
  • 尚医通-阿里云短信服务(二十九)

    目录: (1)前台用户系统-手机登录-阿里云短信服务介绍 (2)手机登录-整合短信服务 (3)整合短信发送服务测试 (1)前台用户系统-手机登录-阿里云短信服务介绍 现在使用阿里云完成短信服务:注册登录阿里云网站: 在产品中找短信服务:  或者搜索短信服务:   需要

    2024年02月02日
    浏览(40)
  • 尚医通06:数据字典+EasyExcel+mongodb

    内容介绍 1、数据字典列表前端 2、EasyExcel介绍、实例 3、数据字典导出接口、前端 4、数据字典导入接口、前端 5、数据字典添加redis缓存 6、MongoDB简介 7、MongoDB安装 8、MongoDB基本概念 数据字典列表前端 1 、测试问题 ( 1 )报错日志 ( 2 )问题定位 URL 错误 ( 3 )解决问题

    2024年02月15日
    浏览(38)
  • 尚医通(四)前端开发之ES | Vue

    1、下载地址 https://code.visualstudio.com/ 2、插件安装 为方便后续开发,建议安装如下插件(红色矩形框标记的插件) 3、调节字体和背景色 4、创建项目 vscode本身没有新建项目的选项,所以要先创建一个空的文件夹,如project_xxxx。 然后打开vscode,再在vscode里面选择 File - Open Fol

    2024年02月07日
    浏览(42)
  • 尚医通-阿里云OSS、用户认证与就诊人

    这里采用的方式是通过后端传 oss,可以对比下 谷粒商城里面的,从后端拿上传凭证,然后前端直传的方式 配置文件 配置常量读取 Service 核心实现 controller 用户登录成功后都要进行身份认证,认证通过后才可以预约挂号 认证过程:用户填写信息(姓名、证件类型、证件号码

    2024年02月01日
    浏览(38)
  • 尚医通-阿里云oss-认证接口开发-前端整合(三十二)

    目录: (1)前台用户系统-阿里云OSS介绍 (2)阿里云oss代码入门案例 (3)上传文件到阿里云oss-接口开发 (4)用户认证-接口开发 (5)用户认证-前端整合 (1)前台用户系统-阿里云OSS介绍 扫码登录后显示用户的昵称,点击下面会显示一些下拉列表,下面完成这些功能  实

    2024年01月17日
    浏览(52)
  • 尚医通 (十) --------- axios、Element UI 与 Node.js

    A、axios 作用 axios 是独立于 vue 的一个项目,可以用于浏览器和 node.js 中发送 ajax 请求。 B、axios 实例 ① 复制 js 资源 ② 创建 axios.html ③ 引入 js ④ 编写 js element-ui 是饿了么前端出品的基于 Vue.js 的 后台组件库,方便程序员进行页面快速布局和构建 官网 :http://element-cn.eleme

    2024年02月02日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包