day01、项目概述、环境搭建
1. 项目的基础背景(面试)
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
-
编写实体类
package com.xuecheng.env.entity; -
③编写配置文件
server -
④编写启动类
-
⑤运行启动类,访问swagger
服务器接口文档地址:服务地址+项目的根路径+swagger-ui.html
例如:localhost:8899/swagger/swagger-ui.html
7.4 请求参数方式
-
无参接口
-
QueryString(?传参)参数接口 使用@RequestParam

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

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

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

7.5 Swagger常用注解
7.5.1 Controller接口描述注解
| 注解名称 | 作用 | 标注位置 |
|---|---|---|
| 对Controller接口信息描述 | 类上 | |
| 对Controller方法功能描述 | 方法上(常用)或类上 | |
| 对Controller方法多个请求参数信息描述 | 方法上(常用)、注解、类上 | |
| 对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 {
7.5.2 实体类描述注解
| 注解名称 | 作用 | 标注位置 |
|---|---|---|
| 对方法中实体类的信息描述 | 类上 | |
| 对方法中实体类的属性信息描述 | 属性上 |
例:在swagger中model里添加中文描述
...
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
-
添加分组(或使用默认分组)
-
添加项目,进入项目
-
将代码运行起来,前往swagger页面,点击顶部的相关链接,全选复制,新建json文件,讲复制内容粘贴进去,

-
在YApi项目页面,选择数据管理,添加创建的json文件,导入成功
9. 代码生成器
为了提高项目开发速度,又考虑到项目的数据库的持久层为:Mybatis Plus ,我们可以使用 Mybatis Plus 官方提供的代码生成器来对项目中的基础代码进行。
步骤:
-
构建数据库
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
-
将xc-mp-generator导入到xc-parent目录下,并在 xc-parent 工程下的 pom 文件中添加子模块的管理配置:
<modules>
<module>xc-mp-generator</module>
</modules> -
修改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"); -
代码生成
运行main方法,即可生成内容管理的代码,刷新Reload fromDisk.
-
若未生成content文件夹,将/xc-parent路径删除
gc.setOutputDir(System.getProperty("user.dir") + "/xc-parent/xc-mp-generator/src/main/java");

浙公网安备 33010602011771号