day01、项目概述、环境搭建

Day01 、项目概述、环境搭建

1. 项目的基础背景(面试)

(1.基于MOOC思想;2.提供IT高等教育;3.多元学习模式;4.B2B2C业务模式) 学成在线项目是基于MOOC思想而诞生的一个IT专业知识在线学习平台,提供了从入门到精通各个阶段的教学服务,该平台提供了多元学习模式,大家可以通过在线点播以及直播课程的方式进行学习,同时师生间也可以通过平台进行在线的学习交流。平台采用B2B2C业务模式,对于老师的入驻以及学习者的在线学习,都提供了极大的便利。

2. 项目的功能构架(面试)

功能架构

该项目的功能模块一共有三层:

  • 在线教育平台 ①门户 在首页、活动页、专题页等页面提供课程学习入口。 ②教育管理平台 教学机构登录系统的入口,通过此来管理机构中的课程相关的数据。 ③运营平台 教师登录教学管理中心进行课程管理、资源管理、考试管理等教学活动。

  • 业务支撑系统 ①内容管理系统 内容管理中对教学机构的课程、课程计划、课程教师、课程营销数据进行管理 ②教学管理中心 对平台的入住教学机构数据进行管理和审核,以及课程中设计到的课程作业。 ③学习中心 对课程中的学员学习课程的记录数据来进行管理。 ④社交系统 论坛系统、问答系统、消息系统、评论系统等信息的管理 ⑤媒资管理 课程计划所关联的课程流媒体资源数据进行管理(直播、录播)。

  • 基础服务 ①系统管理 对学成在线后端服务提供系统的基础数据。 ②支付系统 管理收费课程的交易记录和订单数据。 ③文件服务 管理系统中的文件资源,包括课程图片、教师图片等。 ④验证码服务 生成系统中的验证码并通过短息服务发送验证码、校验验证码等。 ⑤统一认证服务 对系统中的所有用户资源进行管理,并提供服务中用户资源的认证功能 ⑥视频点直播 在课程学习时需要通过此服务来对视频资源进行播放。

3. 项目的技术架构(面试)

技术架构分层

该项目采用前后分离架构开发,技术架构主要有以下六层:用户层CDN内容分发和加速负载均衡UI层微服务层数据层

名称功能
用户层 支持用户通过pc端,手机app端,以及h5页面访问该系统
CDN (Content Delivery Network)对系统中的静态网络资源进行加速,提高访问的速度
负载均衡 存在于系统的CDN层、UI层、服务层及数据层,会根据系统的需求来确定负载均衡器的类型
UI层 UI层描述了用户(pc、app、h5)看到的产品界面
微服务层 将系统服务分为三类:业务服务(为核心业务提供服务,并于数据层进行交互获得数据)、基础服务(管理系统运行的配置、日志、任务调度、短信等系统级别的服务)、第三方代理服务(接入第三方服务,认证、支付、直播、点播、用户认证和授权等)
数据层 描述系统的数据存储的内容类型。

4. 项目主体业务流程(面试)

主要从三个方面对业务流程进项分析:

  • 教学机构业务主体流程

    教学机构主体流程

业务流程:教育机构入驻到平台→机构人员进行登录→在教学管理中心对课程进行管理(用到阿里云或七牛云等服务)→课程确认无误后,教育机构进行课程上传→平台审核成功后,机构便可以发布课程

  • 平台机构业务主体流程

    平台机构主体流程

业务流程:平台机构登陆到平台,进入教学管理中心,预览并审核教育机构提交的课程内容。

  • 学员业务主体流程

     

    学员主体流程

业务流程:学员在平台注册登录后,在门户搜索要学习的内容,找到目标课程进行下单购买,之后可进入学习中心,对已购课程进行学习。

5. 项目工程结构

该项目分为三层结构:父类工程、基础工程、业务工程。

项目工程结构

①父工程

  • 继承SpringBoot父类工程 ,构建微服务工程

  • 对依赖的包进行管理

  • 对依赖包的版本进行管理

  • 本身为Pom工程,对子工程进行聚合管理

②基础工程

  • 继承父类工程,将相关被管理的依赖坐标引入

  • 通用组件工程(xc-common)

    • 对微服务工程公共内容进行管理

  • 接口工程(xc-api)

    • 对各个模块的微服务接口进行统一管理

    • 对接口交互数据DTO进行管理

③业务功能微服务工程

  • 对学成在线业务模块功能进行实现(每个微服务只实现单个业务模块)

6. 基础工程的导入

导入xc-parent,在实际项目中,基础工程和项目主要由架构师或者项目主使来构建,程序员则直接导入进行开发。

7. swagger

7.1 什么是swagger

Swagger 是一个规范和完整的框架,用于生成、描述、调用并可视化 RESTful 风格的 Web 服务。Swagger UI生成的界面比Javadoc生成的界面美观 ,可以实时同步API文档(代码修改后,文档同步修改) ,对SpringMVC工程支持友好官网

7.2 swagger能解决什么?

在开发阶段,需要后端开发人员手写Api接口文档(即对后端开发的接口地址的列表和每个接口地址的描述)传递给前端人员,过程繁琐,而swagger可以自动生成Api文档。

7.3 swagger怎么使用?

官方的swagger使用起来相对繁琐,我们采用国内大牛制作的Spring Boot 对 Swagger 启动器,使用起来更加便捷。

主要分为以下步骤:

  • ①创建工程,导入swagger依赖

    <!-- 继承 Spring Boot 父工程 -->
    <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>2.3.2.RELEASE</version>
    </parent>
    <!--添加 spring boot web 依赖-->
    <dependencies>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-validation</artifactId>
       </dependency>
       <!-- swagger对springboot的集成 -->
       <dependency>
           <groupId>com.spring4all</groupId>
           <artifactId>swagger-spring-boot-starter</artifactId>
           <version>1.9.0.RELEASE</version>
       </dependency>
       <!-- lombok使用 -->
       <dependency>
           <groupId>org.projectlombok</groupId>
           <artifactId>lombok</artifactId>
           <version>1.18.8</version>
           <scope>provided</scope>
       </dependency>
    </dependencies>
  • ②编写controller

    @RestController
    @RequestMapping("stu")
    public class HelloController {
       /**
       * 测试无参数接口地址
       无参:get http://ip:port/rootPath/stu/hello
       */
       @GetMapping("hello")
       public String hello() {
           return "hello";
      }
       /**
       * 测试 queryString 风格的参入参数
       QueryString(问号传参):
       get http://ip:port/rootPath/stu?num=xxx
       */
       @GetMapping
       public Student modifyStudentNum(@RequestParam("num") String num) {
           Student student = new Student(num, "xiaohong", 10, "parts");
           return student;
      }
       /**
       * 测试Restful风格的参入参数
       path(Restful):
       get http://ip:port/rootPath/stu/xxxx
       */
       @GetMapping("{name}")
       public Student modifyStudentName(@PathVariable("name") String name) {
           Student student = new Student("002", name, 10, "parts");
           return student;
      }
       /**
       * 测试json格式的传入参数
       请求体传参(json格式的数据):
       post http://ip:port/rootPath/stu
       requestBody:
       {
       "xxxxx":"xxxx"
       }
       */
       @PostMapping
       public Student modifyStudent(@RequestBody Student student) {
           student.setName("modifyName");
           return student;
      }
       /**
       * 测试 queryString 、Restful 和 json 格式的参数
       put http://ip:port/rootPath/stu/xxxx?name=xxx
       requestBody:
       {
       "xxxxx":"xxxx"
       }
       */
       @PutMapping("{id}")
       public Student mofidyStudentBynNum(@PathVariable("id") String id, @RequestParam("name") String name, @RequestBody Student student) {
           student.setName(name);
           student.setStuNo(id);
           return student;
      }
    }
  • 编写实体类

    package com.xuecheng.env.entity;
    @Data
    @AllArgsConstructor
    public class Student {
       //学员编号
       private String stuNo;
       //学成名称
       private String name;
       //学员年龄
       private int age;
       //学员地址
       private String address;
       
       //getter/setter 省略
    }
  • ③编写配置文件

    server:
    port: 8080
    servlet:
      context-path: /swagger
    swagger:
    enabled: true   #Swagger工程开启开关
    base-package: com.itheima.swagger   #需要生成文档资源所在的包
    title: "swagger测试工程"    #文档标题
    description: "对swagger程序的测试"  #文档描述
    version: 1.0.0  #版本

     

  • ④编写启动类

    @SpringBootApplication
    @EnableSwagger2Doc
    public class SwaggerApplication {
       public static void main(String[] args) {
           SpringApplication.run(SwaggerApplication.class);
      }
    }

     

  • ⑤运行启动类,访问swagger

    服务器接口文档地址:服务地址+项目的根路径+swagger-ui.html

    例如:localhost:8899/swagger/swagger-ui.html

7.4 请求参数方式

  • 无参接口

  • QueryString(?传参)参数接口 使用@RequestParam

    QueryString传参

  • Restful(path路径传参)参数接口 使用@PathVariable

    Restful路径传参

  • RequestBody(请求体)参数(json格式)接口 使用@RequestBody

    RequestBody请求体传参

  • 缝合传参(多种类型参数)

    image-20220717155047189

7.5 Swagger常用注解

 

7.5.1 Controller接口描述注解

注解名称作用标注位置
@Api 对Controller接口信息描述 类上
@ApiOperation 对Controller方法功能描述 方法上(常用)或类上
@ApiImplicitParams 对Controller方法多个请求参数信息描述 方法上(常用)、注解、类上
@ApilmplicitParam 对Controller方法一个请求参数信息描述 方法上

@Api注解属性

属性名称作用
name Controller 接口命名
tag Controller 接口信息简述(新版本使用)
description Controller 接口信息的描述(老版本使用)

@ApiOperation注解属性

属性名称作用
value 对接口功能信息的描述

@ApiImplicitParam

属性名称取值作用
paramType(查询参数类型) path 路径传参
  query ?(QueryString)传参(直接跟参数完成自动映射赋值)
  body 请求体(RequestBody)传参,仅支持post,get没有请求体
  header 参数在request headers里提交
  form 以form表单的形式提交 仅支持post
dataType(参数的数据类型) Long  
  String  
name   接收参数名
value   接收参数描述
required(参数是否必填) true 必填
  false 非必填(默认)
defaultValue   默认值

Controller接口描述注解的使用

方式一:直接标注在Controller上(注解较多时,程序看起来杂乱,不推荐使用)。

方式二:编写一个接口,将Api注解都写入接口,然后Controller实现该接口。

tips:类生成接口:右键类,Refactor→Extract Interface..,类会自动实现该接口。

例:为swagger页面部分数据添加中文描述

public interface HelloApi {

   @ApiOperation("修改学员信息")
   @ApiImplicitParams({
           @ApiImplicitParam(name = "id",value = "学员id值",required = true,dataType = "String",paramType = "path"),
           @ApiImplicitParam(name = "name",value = "学员名称值",required = true,dataType = "String",paramType = "query"),
  })
   Student mofidyStudentBynNum(String id,
                               String name,
                               Student student);
}

 

7.5.2 实体类描述注解

注解名称作用标注位置
@ApiModel 对方法中实体类的信息描述 类上
@ApiModelProperty 对方法中实体类的属性信息描述 属性上

例:在swagger中model里添加中文描述

...
@Data
@AllArgsConstructor
@ApiModel("学员封装实体类")
public class Student {
   @ApiModelProperty("学员编号")
   private String stuNo;
   @ApiModelProperty("学成名称")
   private String name;
   @ApiModelProperty("学员年龄")
   private int age;
   @ApiModelProperty("学员地址")
   private String address;

 

8.YApi

背景:程序停止运行后,swagger也就访问不了了,给前后端联调带来不便,这里引入YApi.

8.1 YApi环境部署

8.1.1MongoDB环境安装

(MongoDB是YApi使用的数据库)

  • 拉取镜像

    docker pull mongo:4.4
  • 安装容器

    docker run -d \
    --name mongo-yapi \
    -v /usr/soft/mongo/data/:/usr/soft/mongo/data \
    -p 27017:27017 \
    -e MONGO_INITDB_ROOT_USERNAME=admin \
    -e MONGO_INITDB_ROOT_PASSWORD=anoyi \
    mongo:4.4

8.1.2 YApi环境安装

  • 拉取镜像

    docker pull registry.cn-hangzhou.aliyuncs.com/anoyi/yapi
  • 创建工作目录

    mkdir -p /usr/soft/yapi/config
  • 进入到目录中

    cd /usr/soft/yapi/config
  • 创建YApi的配置文件config.json

    vim config.json
    {
    "port": "3000",
    "adminAccount": "admin@anoyi.com",
    "timeout":120000,
    "db": {
    "servername": "mongo",
    "DATABASE": "yapi",
    "port": 27017,
    "user": "admin",
    "pass": "anoyi",
    "authSource": "admin"
    }
    }
    • 初始化 YApi 的数据库索引及管理员账号

      docker run -it --rm \
      --link mongo-yapi:mongo \
      --entrypoint npm \
      --workdir /yapi/vendors \
      -v $PWD/config.json:/yapi/config.json \
      registry.cn-hangzhou.aliyuncs.com/anoyi/yapi \
      run install-server
    • 创建容器

      docker run -d \
      --name yapi \
      --link mongo-yapi:mongo \
      --workdir /yapi/vendors \
      -p 3000:3000 \
      -v $PWD/config.json:/yapi/config.json \
      registry.cn-hangzhou.aliyuncs.com/anoyi/yapi \
      server/app.js
    • 访问:http://ip地址:3000

8.1.3 YApi使用

(将swagger生成的在线Api接口文档上传到YApi中)

tip:虚拟机关机后再次启动

先启动mongo

docker start mongo-yapi

再启动yapi

docker start yapi
  1. 添加分组(或使用默认分组)

  2. 添加项目,进入项目

  3. 将代码运行起来,前往swagger页面,点击顶部的相关链接,全选复制,新建json文件,讲复制内容粘贴进去,

    image-20220717172108260

  4. 在YApi项目页面,选择数据管理,添加创建的json文件,导入成功

9. 代码生成器

为了提高项目开发速度,又考虑到项目的数据库的持久层为:Mybatis Plus ,我们可以使用 Mybatis Plus 官方提供的代码生成器来对项目中的基础代码进行。

步骤:

  1. 构建数据库

    mysql容器完整版本创建

    ## 容器化部署

    #拉取镜像并创建启动容器
    docker pull mysql:5.7

    #详细方式
    docker run --name mysql --restart=always -p 3306:3306 --privileged=true -ti -e MYSQL_ROOT_PASSWORD=itcast142 -e MYSQL_USER=user -e MYSQL_PASSWORD=itcast142 -e TZ=Asia/Shanghai -v /usr/soft/mysql/docker/3306/config/:/etc/mysql/conf.d -v /usr/soft/mysql/docker/3306/data/:/var/lib/mysql -v /usr/soft/mysql/docker/3306/logs/:/var/log/mysql -d mysql:5.7

    #-e 代表添加环境变量 MYSQL_ROOT_PASSWORD 是root用户的远程登陆密码(如果是在容器中使用root登录的话,那么其密码为空)

    #进入容器
    docker exec -it mysql /bin/bash

    #登录容器内mysql
    mysql -uroot -p

    #退出容器
    exit


    如果容器创建完容器,但mysql的时区不对,需要通过下面的配置来修改时区:

    #进入容器
    docker exec -it mysql5.7 bash

    #查看当前时区
    date -R

    #修改时区 方式一:
    cp /usr/share/zoneinfo/PRC /etc/localtime

    # 或者 方式二:
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

    在可视化工具中,导入xc_content.sql

  2. 将xc-mp-generator导入到xc-parent目录下,并在 xc-parent 工程下的 pom 文件中添加子模块的管理配置:

    <modules>
    <module>xc-mp-generator</module>
    </modules>
  3. 修改src/main/java/com.xuecheng.generator里的ContentCodeGenerator.java

    //1.数据库相关配置参数
    private static final String DATA_SOURCE_USER_NAME = "root";//用户名
    private static final String DATA_SOURCE_PASSWORD = "root";//密码
    //2.是否生成DTO数据
    private static final Boolean IS_DTO = false;
    //true:生成DTO实体类
    //false:生成PO实体类
    //3.数据库地址
    dsc.setUrl("jdbc:mysql://192.168.94.129:3306/xc_" + SERVICE_NAME
    + "?useUnicode=true&useSSL=false&characterEncoding=utf8");
  4. 代码生成

    运行main方法,即可生成内容管理的代码,刷新Reload fromDisk.

  5. 若未生成content文件夹,将/xc-parent路径删除

    gc.setOutputDir(System.getProperty("user.dir") + "/xc-parent/xc-mp-generator/src/main/java");
posted @ 2022-07-12 16:57  忘了鱼尾纱的猫  阅读(116)  评论(0)    收藏  举报