今日重点
项目背景介绍:
1 在线教育近几年处于稳步增长
2 政治环境促进在线教育的发展
3 在线教育在疫情情况下,用户规模逐步上升
4 在线教育市场规模将持续增长 2020年达到(4538亿元)
项目的基础概述:
1. 基于MOCC思想 : 大型开放网络课程,(重点知识收费)
2. 提供ID教育 : 业务实现主要是在IT领域做教育的提供
3. 多元学习模式 : 可以视频点播,课程直播在线学习,老师学生可以在线进行沟通!
4. B2B2C :提供平台 面向个体户 或者大型公司 (也就是个人商铺可以进行售卖,也可以对接大型品牌商家入驻进行售卖)
b 企业 b 企业 c 用户
项目简要概述:
学成在线是基于MOOC思想,提供了多元化的学习方式,并且主要提供的是IT课程,主要业务模式是B2B2C,只提供平台,平台本身并不提供教育课程服务,都是让教学机构入驻对外销售课程!
功能概述:
B2B2C的业务模式,功能进行了分层(三大层)在线教育平台 ,业务支持系统,基础服务,
在线教育平台是整个项目的入口,提供前端的页面显示
业务支持系统主要给项目入口提供服务!
基础服务 基础服务的功能,以每个小服务为维度提供业务支撑系统使用!
在线教育平台(整个项目的入口,提供前端页面显示)
门户(消费者,学员):学生购买消费课程
教学机构管理平台(老师&入驻商家):上传课程 直播授课(需要给运营平台进行审核)
运营管理平台(运营管理人员):负责监管教学机构
业务支撑系统
学习中心 : 给入口层用户提供相对应的服务,学习记录,选课记录等等!
教学管理中心: 提供服务给运营管理人员,进行对入驻平台提供课程资源进行审核 !
内容管理系统:对教学机构管理提供相应的服务,课程的CRUD等等!
社交系统 : 提供专业的社区论坛,老师与学员在线问答系统,消费信息系统,以及评论区提供功能!
媒资管理系统
媒资管理 直播管理
基础服务(基础服务的功能,以每个小服务为维度提供业务支撑系统使用)
系统管理 : 整个项目分类进行分类管理!
支付服务:给用户,以及入驻商家业务提供系统支付服务
文件服务 : 给学习中心的学员提供购买课程的服务,以及教学管理中心,设置课程价格!
验证码服务 :校验使用业务支持层用户的身份!
统一认证服务 :给业务支持系统,提供统一的认证登陆等待服务!
视频点直播: 给媒资管理提供点播,直播服务!
项目技术架构分层:(以技术为维度 对整体项目进行划分)
用户层:
PC端(重点实现:电脑网页版)
APP(手机版应用)
H5(Html5 Css3 Ecma高版本 ==== 公众号)
CDN(静态资源放置:CDN可以提速) :
CDN(HTML,Css/js,image,json,video,doc)
负载层 :
4层负载:
7层负载:
nginx 服务端负载
ribbon 客户端负载
UI层 :
前端提供该层服务,不归后端人员负责
微服务层:
HTTP API接入网关
业务服务集群:
统一账户 统一认证 教学管理服务 内容管理服务
学习中心 媒资管理 系统管理中心 订单服务
基础服务集群
统一配置 任务调度 统一日志 服务监控 短信服务 文件服务
数据层:
关系型数据库(Mysql) 消息队列(RabbitMQ) 缓存(Reddis) 索引(ES) 文件存储
环境搭建 基于 DevOps
maven 通过parent 继承父工程
moudle
依赖 《dependecy》实现
项目主体业务流程
教学机构主体业务流程
①:教学机构先入驻到学成在线平台中
②:教学机构人员在学成进行登录
③:在教学管理中心可以管理课程信息
④:课程管理是会使用阿里云和七牛云服务
⑤:教学机构在课程没有问题的情况下将课程进行提交审核
⑥:课程审核通过后,教学机构可以发布课程。
平台机构业务主体流程
上图中的简要流程:
①:平台机构在学成进行登录
②:在教学管理中心管理教学机构课程内容
③:课程中需要从外部服务中获得课程内容数据,并进行预览
④:预览课程内容后,需要对课程进行审核
学员业务主体流程
上图中的简要流程:
①:学员在学成的门户注册后进行登录
②:在门户搜索需要学习的课程内容
③:找到对应课程后,需要对课程进行 下单购买
④:在学习中心查看自己课程,并进行学习 视频播放时会使用到第三方的服务。
Swagger后端文档工具介绍:
接口文档就是对后端开发的接口地址的列表和每个接口地址的描述,Swagger是一个完整的框架提供了可视化Restful风格的服务,SwaggerUI生成的界面非常美观, 而且可以通过Yapi技术服务进行对文档的持久化,对SpringMVC工程支持友好!
Swagger 生成文档内容 (可在网址之间发送请求测试改接口是否可以响应)
contrtller : @Api @Apioperation @ApiImplicitParams @ApiImplicParam
pojo : @ApiModel(pojo类注解) @ApiModelProperty(pojo属性注解)
service :
优点: 自动生成文档,显示需要的请求参数 请求路径等等!
缺点: 在线文档 项目停止即访问不到可视化界面,请求头中固定为token 写死了!
YApi环境部署,解决离线文档需求!(主要存放一些文档信息)
MongoDB(YAPi使用的数据库)
YApi服务
QueryString (问号传参)
http://ip:prot/rootpath/stu?number=xxx
@Requestparam
@Path(Restful,路径传参)
http://ip:prot/rootpath/stu/xxx
@PathVariable
@RequestBody(json格式传参)
http://ip:prot/rootpath/stu
pojo类注解
代码生成器 完成!
项目开发规范文档
提高代码结结构的一致性和代码的可读性,大大提高项目的协作能力和维护能力
三大体现:
1.代码编写的规范
2.前后端交互的URL接口规范
3.项目内容结构的规范
项目介绍
●项目二描述 使用微服务搭建分布式结构的项目。
●项目二核心内容 1.业务场景的分析和实现(写清业务的步骤,将文字的步骤变为代码) 2.使用分布式技术来解决现有问题 3.重视项目中的规范,对代码内容进行约束
●项目课程讲法 内容导读实现+思考问题和学员实现 项目中会有组内实战
●项目学习结果 每天需要同步代码待Gitee,总结项目中重点内容
学成在线导读
学成在线一共是 7个章节,分12天进行讲解。
第一章 项目介绍 环境搭建
介绍项目的背景、通过项目的功能架构和技术架构来介绍项目结构。并展示项目的课程主体业务流程内容介绍,搭建项目的初期环境。
第二章 内容管理
搭建项目内容管理和系统管理微服务。对内容管理数据模型和主要功能进行强调。对课程基本信息管理、课程计划管理、课程营销管理、课程图片上传等内容,并解决搭建项目全局异常处理器来处理异常信息。
第三章 媒资管理
对教学平台的媒体资源进行管理,通过第三方平台来管理媒体信息资源数据,并能在线进行视频的点播来子线观看视频,介绍资源文件的断点和分片上传文件。
第四章 课程发布
介绍课程发布的功能,并通过技术层面分析课程发布的功能性需求。在此会通过模板技术来实现课程的详情页并且可以在线预览,从中介绍分布式事务理论,通过RabbitMQ来实现消息的一致性。
第五章 课程搜索
介绍互联网项目的特点,并使用索引库来实现课程内容的检索。本内容在课程发布后,会通过数据采集将课程发布后的内容存放到索引库中,达到数据通过索引库来查询出数据。
第六章 学生选课
本章节首先来介绍用户认证的需求,并通过UAA服务来实现第三方协议Oauth2的用户认证。分析选课的需求分析和业务流程,完成收费课程的支付功能,并使用分布式任务调度查询支付的结果内容。
第七章 课程学习
对课程在线点播进行业务分析,开发课程在线学习对课程计划的查询操作,并通过阿里视频点播方案来实现课程在线播放。
学习目标
1了解项目的背景
2熟悉项目的功能架构和技术结构
3熟悉项目的具体业务流程
4掌握开发工具Swagger
5能够搭建环境和使用进行服务的配置
6能够使用代码生成器-MP
7熟悉开发规范文档
需要掌握内容:
1.项目的功能结构和技术架构
2.项目的主要业务流程
3.搭建项目的基础环境
4.开发工具 Swagger
5.使用开发其他环境
代码生成器
项目的开发文档
1.项目背景
1.1 项目处于的环境
学成在线所处于下面 4 个环境。
1.在线教育近五年来稳步增长
在线教育市场规模未来将持续增长, 一二线城市在线教育市场渐趋成熟, 而三四线城市市场仍处千初步发展阶段。
2.政治环境促进在线教育健康发展
在线教育越发得到重视,相关政策规定的出现,将进一步促进在线教育健康发展。
3.在线教育用户规模再创新高
中国在线教育用户规模逐步上升在2020年达已突破到3.09亿,互联网的普及和发展带来的 "互联网十教育” 使得在线教育用户不断奉升。
4.在线教育市场规模将持续增长
iiMedia Research (艾媒咨询)数据显示, 在线教育市场规模逐年增长, 2020年达到4538亿元。
1.2 项目基础背景(面试)
1.基于MOOC思想
学成在线借鉴了MOOC(大型开放式网络课程,即MOOC(massive open online courses))的设计思想提供在线教育平台。
2.提供IT高等教育
提供IT职业课程在线学习的平台,它为即将和已经加入IT领域的技术人才提供在线学习服务。
3.多元学习模式
用户通过学成在线平台进行视频点播在线学习、课程直播在线学习、师生间的针对学习在线沟通。
4.B2B2C业务模式
向企业或个人在线教育平台提供教学服务,老师和学生通过平台完成整个教学和学习的过程.
2.项目的功能构架(面试)
2.1 功能架构介绍
从在线教育的火热到如今,在线教育的模式出现多种多样,包括:B2C、C2C、B2B2C等业务模式。**学成在线采用B2B2C业务模式**,即向企业或个人在线教育平台提供教学服务,老师和学生通过平台完成整个教学和学习的过程,市场上类似的平台有:网易云课堂、腾讯课堂等,学成在线的特点是IT职业课程在线教学。<br /> **学成在线包括在线教育平台、业务支持系统、基础服务来构建整个功能架构**。<br />学成在线功能架构图
模块功能列表
1.在线教育平台
| 功能模块名称
| 功能说明
| | —- | —- | | 门户
| 在首页、活动页、专题页等页面提供课程学习入口。
| | 教学管理平台
| 教学机构登录系统的入口,通过此来管理机构中的课程相关的数据。
| | 运营平台
| 教师登录教学管理中心进行课程管理、资源管理、考试管理等教学活动。
|
2.业务系统支撑
| 功能模块名称
| 功能说明
| | —- | —- | | 内容管理系统
| 内容管理中对教学机构的课程、课程计划、课程教师、课程营销数据进行管理
| | 教学管理中心
| 对平台的入住教学机构数据进行管理和审核,以及课程中设计到的课程作业。
| | 学习中心
| 对课程中的学员学习课程的记录数据来进行管理。
| | 社交系统
| 论坛系统、问答系统、消息系统、评论系统等信息的管理
| | 媒资管理
| 课程计划所关联的课程流媒体资源数据进行管理(直播、录播)。
|
3.基础服务
| 功能模块名称
| 功能说明
| | —- | —- | | 系统管理
| 对学成在线后端服务提供系统的基础数据。
| | 支付系统
| 管理收费课程的交易记录和订单数据。
| | 文件服务
| 管理系统中的文件资源,包括课程图片、教师图片等。
| | 验证码服务
| 生成系统中的验证码并通过短息服务发送验证码、校验验证码等。
| | 统一认证服务
| 对系统中的所有用户资源进行管理,并提供服务中用户资源的认证功能
| | 视频点直播
| 在课程学习时需要通过此服务来对视频资源进行播放。
|
3.项目的技术架构(面试)
3.1 项目技术架构分层
学成在线采用当前流行的前后端分离架构开发,由以下流程来构成:用户层、CDN内容分发和加速、负载均衡、UI层、微服务层、数据层。
学成在线技术架构图
学成在线技术架构图
技术架构列表
| 序号
| 名称
| 功能描述
| | —- | —- | —- | | 1
| 用户层
| 用户层描述了本系统所支持的用户类型包括:pc用户、app用户、h5用户。pc用户通过浏览器访问系统、app用户通过android、ios手机访问系统,H5用户通过h5页面访问系统。
| | 2
| CDN
| CDN全称Content Delivery Network,即内容分发网络,本系统所有静态资源全部通过CDN加速来提高访问速度。系统静态资源包括:html页面、js文件、css文件、image图片、pdf和ppt及doc教学文档、video视频等。
| | 3
| 负载均衡
| 系统的CDN层、UI层、服务层及数据层均设置了负载均衡服务,上图仅在UI层前边标注了负载均衡。 每一层的负载均衡会根据系统的需求来确定负载均衡器的类型,系统支持4层负载均衡+7层负载均衡结合的方式,4层负载均衡是指在网络传输层进行流程转发,根据IP和端口进行转发,7层负载均衡完成HTTP协议负载均衡及反向代理的功能,根据url进行请求转发。
| | 4
| UI层
| UI层描述了系统向pc用户、app用户、h5用户提供的产品界面。根据系统功能模块特点确定了UI层包括如下产品界面类型: 1)面向pc用户的门户系统、学习中心系统、教学管理系统、系统管理中心。 2)面向h5用户的门户系统、学习中心系统。 3)面向app用户的门户系统、学习中心系统。
| | 5
| 微服务层
| 微服务层将系统服务分类三类:业务服务、基础服务、第三方代理服务。 业务服务:主要为学成在线核心业务提供服务,并与数据层进行交互获得数据。 基础服务:主要管理学成在线系统运行所需的配置、日志、任务调度、短信等系统级别的服务。 第三方代理服务:系统接入第三方服务完成业务的对接,例如认证、支付、视频点播/直播、用户认证和授权。
| | 6
| 数据层
| 数据层描述了系统的数据存储的内容类型,关系性数据库:持久化的业务数据使用MySQL。 消息队列:存储系统服务间通信的消息,本身提供消息存取服务,与微服务层的系统服务连接。 索引库:存储课程信息的索引信息,本身提供索引维护及搜索的服务,与微服务层的系统服务连接。 缓存:作为系统的缓存服务,作为微服务的缓存数据便于查询。 文件存储:提供系统静态资源文件的分布式存储服务,文件存储服务器作为CDN服务器的数据来源,CDN上的静态资源将最终在文件存储服务器上保存多份。
|
七层网络模型:http://www.linuxvirtualserver.org/zh/lvs1.html
●业务流程举例:
1用户可以通过pc、手机等客户端访问系统进行在线学习。
2系统应用CDN技术,对一些图片、CSS、视频等资源从CDN调度访问。
3所有的请求全部经过负载均衡器。
4对于PC、H5等客户端请求,首先请求UI层,渲染用户界面。
5客户端UI请求服务层获取进行具体的业务操作。
6服务层将数据持久化到数据库。
3.2 项目技术栈
学成在线按照技术分层的基础上,需要对主要层次使用具体的技术作说明。下面是学成在线技术栈结构图。
技术栈(技术结构图)
技术栈列表
| 技术层名称
| 技术栈
| | —- | —- | | 视图层
| 页面的构建:微信等使用H5技术、PC使用前端技术Vue/React、移动端使用App(安卓/ios)
| | 微服务接入控制层
| GateWay、Eureka、Ribbon、Sentinel、Feign等
| | 微服务层微服务层
| Spring Boot 、Druid、Lombok、MapStruct、Mybatis plus、sharding-jdbc、swagger、XXL-job、Freemark
| | 数据访问层
| 使用Spring Data 、Mybatis 等
|
4.项目主体业务流程(面试)
在学成在线整个学习周期中,课程里会对主要核心的业务进行实现,主要包含三方面的业务流程:
1.第三方教学机构
2.学成在线管理平台人员
3.学员
下面我们一起来认识下。
4.1 教学机构业务主体流程
教学机构业务主体流程示意图
上图中的简要流程:
①:教学机构先入住到学成在线平台中
②:教学机构人员在学成进行登录
③:在教学管理中心可以管理课程信息
④:课程管理是会使用阿里云和七牛云服务
⑤:教学机构在课程没有问题的情况下将课程进行提交审核
⑥:课程审核通过后,教学机构可以发布课程。
4.2 平台机构业务主体流程
平台机构业务主体流程示意图
上图中的简要流程:
①:平台机构在学成进行登录
②:在教学管理中心管理教学机构课程内容
③:课程中需要从外部服务中获得课程内容数据,并进行预览
④:预览课程内容后,需要对课程进行审核
4.3 学员业务主体流程
学员业务主体流程示意图
上图中的简要流程:
①:学员在学成的门户注册后进行登录
②:在门户搜索需要学习的课程内容
③:找到对应课程后,需要对课程进行 下单购买
④:在学习中心查看自己课程,并进行学习 视频播放时会使用到第三方的服务。
上图信息如下:
使用人群:
1.第三方教学机构
2.学成在线管理平台人员
3.学员
主要业务操作:
1.由第三方的教学机构在学成在线系统中录入教学数据
在录入数据前,需要进行登录认证,然后录入教学数据包括直播和点播。
2.由学成在线管理平台人员对学成在线系统中第三方教学机构的课程内容进行审核操作
第三方的教学内容,需要平台人员进行审核。审核通过,学员才可以对其进行学习。
3.学员需要登录到学成在线平台,添加需要学习的课程进行学习
对于收费的课程需要进行下单购买,才可以进行学习
主业务和外部服务交互:
1.学成在线系统中对于用户的认证将使用第三方认证系统UAA来完成
系统中的三类用户都需要通过UAA系统来获得认证和授权
2.学成在线中的教学资料会使用第三方的分布式系统来保存
对于视频点播/直播会使用阿里元服务
对于文件会使用七牛云进行存储
5.项目环境搭建
5.1 开发环境配置
在项目开发前期,需要将本地开发环境进行统一配置,方便后期开发中出现因环境问题引起的异常。在真实开发中也是一样的,开发前,需要对开发环境进行统一配置。不同的公司会有不同的开发环境配置,这里需要大家引以重视,到公司开发前一定要先将本地开发环境进行统一。
参考下发资料中的 “资料/开发工具配置/开发工具环境配置.md” 文档。
!!!!开发前一定要配置!!!!
统一配置
统一版本
统一使用技术
5.2 项目基础工程搭建
5.2.1 项目工程结构关系(面试)
学成在线使用 Maven 来进行项目的管理和构建,使用 Maven 的一些特性来对项目进行结构化的划分。整个项目分为三大类工程:父工程、基础工程 和 业务功能微服务工程。
项目关系结构图
每一种类的工程都有不同的作用,下面是对其功能进行说明:<br />●父工程<br />○继承SpringBoot父类工程 ,构建微服务工程<br />○对依赖的包进行管理<br />○对依赖包的版本进行管理<br />○本身为Pom工程,对子工程进行聚合管理<br />●基础工程<br />○继承父类工程,将相关被管理的依赖坐标引入<br />○通用组件工程(xc-common)<br />■对微服务工程公共内容进行管理<br />○接口工程(xc-api)<br />■对各个模块的微服务接口进行统一管理<br />■对接口交互数据DTO进行管理<br />●业务功能微服务工程<br />○对学成在线业务模块功能进行实现(每个微服务只实现单个业务模块)
5.2.2 基础工程的导入
在今天下发资料中,有父工程和基础工程,我们直接将其导入到 IDEA 中即可。其中有很多的配置,后期的课程中接触到了在详细的阐述。
下面我们开始将基础工程导入 IDEA中。
创建一个空工程后,将今天下发资料中 ‘\资料\基础工程\xc-parent.7z ’ 解压到空的工程中,然后以模块的方式发开就可以。
将下发资料的基础工程解(xc-parent)压到本地(路径不要有特殊字符和中文名称)
PS:对于基础工程和项目构建在实际项目里,一般都是有架构师或项目主程这两位角色来创建。其他的开发人员都是将基础工程从代码托管平台下载下来,在此基础上进行开发,并非由程序员来搭建项目。所以,我们的基础工程在设计好后,直接导入进行开发,希望大家知晓。
操作步骤:
1.在本地创建目录,目录路径不能有中文和特殊字符
2.在该目录下创建出两个目录
3.将今日资料基础工程项目拷贝到back_code目录中
4.使用idea创建工程
5.导入xc-parent工程
5.3 项目数据库环境
5.3.1 学成在线数据库环境介绍
学成在线课程的基础数据存储在 Mysql 中,数据将以分库分表的方式进行数据操作,不同的业务操作不同的数据库,下面是对分库分表的具体划分。
分库数据划分
后面的课程中设计到的业务,就会来搭建出对应的数据库,等讲到哪块业务再导入对应的数据库。
6. 项目开发简化工具
对于现如今的项目开发业务功能,都会使用一些工具简化实际的工作量。学成在线对其也使用了简化工具在项目中,简化内容主要有后端的代码简化、开发接口文档自动生成,下面我们分别进行说明。
6.11介绍
随着软件架构的演变,现如今的开发模式也有不小的变动。微服务的出现,使得开发模式变为前后端分离式开发。后端的微服务端开发接口地址,需要开发人员开发阶段编写接口文档。
接口文档就是对后端开发的接口地址的列表和每个接口地址的描述,之前的接口文档,一般是开发人员通过编写文档的形式来体现。但手写接口文档费时费力,能不能通过程序自动生成呢?对于现在来说,当然是可以的,它就是后端 API 文档生成工具 :Swagger。<br /> Swagger 是一个规范和完整的**框架**,用于生成、描述、调用和**可视化 RESTful 风格的 Web 服务**。Swagger UI生成的界面比Javadoc生成的**界面美观** ,可以实时同步API文档(代码修改后,文档同步修改) ,**对SpringMVC工程支持友好**。<br />swagger 官方网站:[https://swagger.io/](https://swagger.io/)<br /> 对于 Spring Boot 对 Swagger 的集成,自然是很简单。国人对此制作出 Spring Boot 对 Swagger 启动器。更加便捷在 Spring Boot 工程中使用并配置。<br />spring-boot-starter-swagger启动器:[https://github.com/SpringForAll/spring-boot-starter-swagger](https://github.com/SpringForAll/spring-boot-starter-swagger)
6.1.1 Swagger 使用方式
1. 创建 Spring Boot 工程 (省略)
在 IDEA 中开发环境下创建测试模块 test-swagger 。
2. 在 pom 文件中添加 Swagger 的 Spring Boot 启动器
<!-- 继承 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>
PS:上述包依赖里坐标中,如果项目中引入 MapStruct 依赖,这里需要将 swagger 对 MapStruct 依赖版本排除,否则会有 jar 包冲突。
3. 编写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 省略
}
4. 编写 application.yml 中的启动配置
# Spring Boot 启动参数
server:
port: 8080
servlet:
context-path: /swagger
# Spring Boot 集成 Swagger 的集成参数
swagger:
enabled: true #Swagger 工程开启开关
base-package: com.xuecheng #需要生成文档资源所在包
title: "测试工程" #文档的标题
description: "对 Swagger 的测试程序" #文档的描述
version: 1.0.0 #文档的版本号
5. 编写 Spring Boot 启动类
package com.xuecheng.swagger;
import com.spring4all.swagger.EnableSwagger2Doc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* <p> Spring Boot 启动类</p>
*/
@SpringBootApplication //Spring Boot 启动注解
@EnableSwagger2Doc //开启 Swagger 功能
public class SwaggerTestApplication {
public static void main(String[] args) {
SpringApplication.run(TestEnvApplication.class);
}
}
PS:上面的 Spring Boot 启动类的代码中,必须要使用 @EnableSwagger2Doc 开启 Swagger功能
6. 运行界面显示
服务接口文档地址固定为:服务地址+项目的根路径+ swagger-ui.html
6.1.2 生成文档说明信息种类
上面的案例中,简单的演示了 Swagger 的使用,不难发现 Swagger可以接口信息进行描述,描述主要有一下几类信息:
1. 工程接口文档的基本信息
2. 接口所属的 Controller 信息
3. Controller 方法中的接口信息描述
上图解释:
注释①:请求方式
注释②:请求地址
注释③:请求参数描述
注释④:响应参数描述
6.1.3 生成请求参数文档说明
其中请求参数方式不同,器描述的信息也有不同,大致有5种类型,分别是:
1无参接口信息描述
2QueryString 参数接口描述
3Restful 参数接口描述
4请求体参数(json格式)接口描述
5多种类型参数描述
上面的参数方式描述的信息是 Swagger 对 Spring MVC 注解解析而生产的文档,不同的注解会生产不同的文档描述,这是我们就需要知道哪些注解会影响到 Swagger 生成的文档。
1@ControllerSwagger 只会对 Controller 上标注有 @Controller(或@Controller派生注解) 的类生成文档。
@RestController
@RequestMapping("stu")
public class HelloController {
//省略代码
}
1@RequestMappingSwagger 只会对 Controller 标注有 @RequestMapping(或@RequestMapping派生注解) 方法生成文档。
@RestController
@RequestMapping("stu")
public class HelloController {
/**
* 测试Restful风格的参入参数
*/
@GetMapping("{name}")
public Student modifyStudentName(@PathVariable("name") String name) {
Student student = new Student("002", name, 10, "parts");
return student;
}
//省略其他代码
}
1@RequestParamSwagger 对此注解生成 QueryString 的参数方式的文档。
2@PathVariableSwagger 对此注解生成 Restful 的参数方式的文档。
3@RequestBodySwagger 对此注解生成请求体(json)的参数方式的文档。
6.1.4 Swagger 的常用注解
在之前 Swagger 对 Spring MVC 的注解生成文档,文档是生成了,但文档对具体的信息没有描述,例下图如:
上图中的问题:
注释①:Controller 具体信息没有信息描述
注释②:请求地址没有功能信息描述
注释③:传入参数没有具体信息描述
注释④:响应信息没有具体信息描述
既然上面的文档需要具体的信息描述,那我们应该如何解决呢?这里 Swagger 通过注解的方式来描述文档的具体信息。Swagger 的文档描述注解,常用的有两大类文档信息描述注解:
1.Controller 接口描述注解
2.实体类描述注解
下面具体介绍。
6.1.4.1 Controller接口描述注解
Controller接口描述注解主要用在 Controller 类中或 Controller 实现的接口类上,下面是注解的列表:
| 注解名称
| 作用
| 标注位置
| | —- | —- | —- | | @Api
| 对Controller接口信息描述
| 类上
| | @ApiOperation
| 对Controller方法功能描述
| 方法上(常用)或类上
| 对Controller方法多个请求参数信息描述
| 方法上(常用)、注解、类上
| 对Controller方法一个请求参数信息描述
| 方法上
|
下面是 Controller 接口描述注解的使用:
方式一:标注在 Controller上
上图中解释:
注释①:@Api 对 Controller文档描述
注释②:@ApiOperation 对方法进行描述
注释③:@ApilmplicitParam 对方法一个参数的描述
注释④:@ApilmplicitParams 对方法多个参数的描述
方式二:标注在 Controller实现的接口上(推荐 )
●接口声明
上图中解释:
注释①:@Api 对 Controller文档描述
注释②:@ApiOperation 对方法进行描述
注释③:@ApilmplicitParam 对方法一个参数的描述
注释④:@ApilmplicitParams 对方法多个参数的描述
●Controller 实现接口方法
生成页面文档效果:
●Controller 提供接口地址和方法功能描述
●Controller 方法参数的描述
Plain Text复制代码
1
文档的生成我们使用相关的注解里的属性来对文档的某些信息进行描述,下面是各个注解属性的解释。
●@Api 注解属性
| 属性名称
| 作用
| | —- | —- | | name
| Controller 接口命名
| | tag
| Controller 接口信息简述(新版本使用)
| | description
| Controller 接口信息的描述(老版本使用)
|
| 属性名称
| 作用
| | —- | —- | | value
| 对接口功能信息的描述
|
| 属性名称
| 取值
| 作用
| | —- | —- | —- | | paramType
| | 查询参数类型
| | | path
| 以地址的形式提交数据
| | | query
| 直接跟参数完成自动映射赋值
| | | body
| 以流的形式提交 仅支持POST
| | | header
| 参数在request headers 里边提交
| | | form
| 以form表单的形式提交 仅支持POST
| | dataType
| | 参数的数据类型 只作为标志说明,并没有实际验证
| | | Long
| | | | String
| | | name
| | 接收参数名
| | value
| | 接收参数的意义描述
| | required
| | 参数是否必填
| | | true
| 必填
| | | false
| 非必填(默认)
| | defaultValue
| | 默认值
|
6.1.4.2. 实体类描述注解
在 Controller 的方法中,参入和传出参数有时是一个实体类,而实体类的属性信息并没有在接口文档中描述,如下图:
上图中解释:
注释①:参入参数没有信息描述
注释②:传出参数没有信息描述
Swagger对此也提供了实体类描述注解,分表对实体类和实体类属性进行描述,下面是注解的列表:
| 注解名称
| 作用
| 标注位置
| | —- | —- | —- | | @ApiModel
| 对方法中实体类的信息描述
| 类上
| 对方法中实体类的属性信息描述
| 属性上
|
下面是实体类描述注解的使用:
●在实体类中使用
●生成页面文档效果:
上图中解释:
注释①:参入参数信息描述
注释②:传出参数信息描述
6.2 YApi 环境部署
YApi 的安装需要安装两个环境:
1.MongoDB(YApi使用的数据库)
2.YApi 服务
Yapi 官方github地址:https://github.com/YMFE/yapi
6.2.1 MongoDB 环境安装
拉取镜像
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
6.2.2 YApi 环境安装
拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/anoyi/yapi
创建 YApi 的工作目录
#创建目录
mkdir -p /usr/soft/yapi/config
#进入到目录中
cd /usr/soft/yapi/config
在此目录中创建 yapi的配置文件 config.json ,内容如下:
{
"port": "3000",
"adminAccount": "admin@anoyi.com",
"timeout":120000,
"db": {
"servername": "mongo",
"DATABASE": "yapi",
"port": 27017,
"user": "admin",
"pass": "anoyi",
"authSource": "admin"
}
}
在 /usr/soft/yapi/config 中执行下面命令来初始化 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
初始化后便可以得到 yapi 的默认账号:账号名:”admin@anoyi.com“,密码:”ymfe.org”
在 /usr/soft/yapi/config 中执行下面命令来创建容器
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
7.其他开发工具
下面需要介绍一下项目开发前的两个内容:
1.项目代码生成器
2.项目开发规范文档
7.1 项目代码生成器
考虑到后期也项目业务代码繁杂,编写基础性的代码会成为浪费项目开发时间。为了提高项目开发速度,又考虑到项目的数据库的持久层为:Mybatis Plus ,我们可以使用 Mybatis Plus 官方提供的代码生成器来对项目中的基础代码进行。
Mybatis Plus 代码生成器:https://baomidou.com/guide/generator.html
7.1.1 项目导入
在学成在线项目中将会对代码生成器进行了封装,并提供了对应的项目来生成开发中的基础代码。在今天下发资料中 “\资料\代码生成器工程\xc-mp-generator.7z” ,将其解压并发送 xc-parent 工程下。
并在 xc-parent 工程下的 pom 文件中添加子模块的管理配置,如下:
<!-- 对子项目进行聚合管理 -->
<modules>
<module>xc-common</module>
<module>xc-api</module>
<module>xc-content-service</module>
<!-- 添加子模块 -->
<module>xc-mp-generator</module>
</modules>
下面是 xc-mp-generator 中的代码生成器的核心代码,如下图:
代码生成器示意图
PS:上面是针对学成在线每一个业务模块来生成的代码。
比如说,内容管理微服务代码生成器:ContentCodeGenerator
后面就会使用上面的代码生成器来生成每一个模块下的基础代码。
7.1.2 代码生成参数说明
每一个代码生成器中都包含下面上个重要参数,如下:
1.数据库相关配置参数
2.是否生成 DTO 数据
1.数据库相关配置参数(数据库的名称)
代码生成其会根据数据库的内容来动态的生成代码,所有下面需要对数据库内容进行对应的配置。
数据库相关配置参数说明
上图解释:
注释①:修改服务名称,也是数据库的名称:xc_后缀名称。
由于是内容管理,名称为:content。
注释②:修改数据库参数。
数据账号和密码,对课程基本信息报生成相关代码。
注释③:数据库表的名称。
我们需要生成哪张表的基础代码,就需要填写对应的表的名称。
2.是否生成 DTO 数据。
在后端业务操作时,会涉及到实体类对象的数据转换数据传输对象 DTO ,
上图解释:
注释①:通过修改 IS_DTO 来生成 DTO 实体类。
true:生成 DTO 实体类。
false:生成 PO 实体类。
7.1.3 代码生成
下面将通过内容管理服务的代码生成器 :ContentCodeGenerator,来生成内容管理的代码。
运行main方法
PS:在生成前,请先确认内容管理对应的数据库 xc_content 在数据库创建出来,否则无法生成对应的代码。
运行后就会在 xc-mp-generator 的 src/main/java 下生成对应的基础代码,如下图:
代码生成示意图
对于生成后的代码我们需要拷贝到内容管理微服务中,如下图:
拷贝资源
7.2 项目开发规范文档
学成在线在进行开发时,会提供项目团队开发的规范文档。规范文档主要的作用是规范代码编写,提高代码结构的一致性和代码的可读性,大大提高项目的协作能力和维护能力。
对于学成在线来说,规范项目内容主要有几方面:
1.代码编写的规范
2.前后端交互的URL接口规范
3.项目内容结构的规范
在今天下发资料中 “/资料/开发规范/项目开发规范文档.md” 中通过 10 点来描述上面的三项内容。
扩展
1.jsr规范:
https://zh.wikipedia.org/wiki/JCP
2.java 8 日期
https://lw900925.github.io/java/java8-newtime-api.html
补充:
mysql容器完整版本创建
## 容器化部署
#拉取镜像并创建启动容器
docker pull mysql:5.7
#详细方式
docker run --name mysql --restart=always -p 3306:3306 --privileged=true -ti -e MYSQL_ROOT_PASSWORD=root -e MYSQL_USER=user -e MYSQL_PASSWORD=root -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