本文视频学习地址:
https://www.bilibili.com/video/BV1j8411N7Bm/vd_source=08ac522c6603c56e243d5e129a309a60
黑马学成在线项目B站视频链接
在线教育行业是一个有着极强的广度和深度的行业,从校内到校外;从早幼教到职业培训;从教育工具到全信息化平台等等;
特别是疫情经历,让在线教育再次站在聚光灯下。疫情下教育领域获融资最多,而其中在线教育最受资本青睐。据艾瑞咨询统计,2020年教育行业累计融资1164亿元,其中在线教育融资金额1034亿元,占比89%。与此同时,在行业处于困境的情况下,会加速洗牌,资源向好的企业集中。2020年资源向头部集中趋势明显,中小型机构生存更加困难。2020年资本向在线教育行业累计输送的1034亿元中,80%都流向了TOP5公司。
To C市场
据艾瑞咨询统计核算,2020年中国在线教育行业市场规模2573亿元,过去4年的CAGR达34.5%,其中低幼及素质教育赛道、K12学科培训赛道在线化进程加快是在线教育市场快速增长的最主要贡献因素。
To B 市场
疫情也加速了整个教育产业链的进化,to B机构快速成长起来,扮演着赋能者的角色,课程内容、招生、师训、直播系统、管理系统等产品及服务大量涌现。随着云服务发展成熟以及疫情对直播课需求的催化,大量提供直播授课系统等PaaS/SaaS服务的机构迅速成长起来,成为各种会展上的主力军。
中国IT人才供给报告(https://new.qq.com/rain/a/20210831A01JI600)
IT人才总体供不应求,高中低人才分别占比8%、41%、51%,
IT服务是贯穿IT应用系统全生命周期的各项服务的统称,下图是IT服务产品图谱,本项目属于IT培训产业。
IT培训市场规模:从13年约170亿元到20年约480亿元的规模,几乎以每年50亿元左右的幅度增长;
1.3 ⭐学成在线项目背景
软件总体分为两类:系统软件和应用软件,应用软件包括:运营类、管理类、工具类等,
学成在线项目属于运营类的项目,运营类项目的研发可能是自研也可能是外包,自研是由运营商成立软件研发部门自己进行软件研发,运营商即是甲方也是乙方,外包则是由运营商外包给第三方软件公司进行研发,运营商是甲方,软件公司是乙方。
学成在线项目是本公司自研的一个专门针对成人职业技能教育的网络课堂系统,网站提供了成人职业技能培训的相关课程,如:软件开发培训、职业资格证书培训、成人学历教育培训等课程。项目基于B2B2C的业务模式,培训机构可以在平台入驻、发布课程,运营人员对发布的课程进行审核,审核通过后课程才可以发布成功,课程包括免费和收费两种形式,对于免费课程可以直接选课学习,对于收费课程在选课后需要支付成功才可以继续学习。
什么是B2B2C?
B2B2C是一种电子商务类型的网络购物商业模式,B是Business的简称,C是Consumer的简称,第一个B指的是商品或服务的供应商,第二个B指的是从事电子商务的企业,C则是表示消费者。
B2B的定义:企业跟企业之间的电子商务运作方式。
B2C的定义:企业跟消费者之间的电子商务运作方式。
分别从业务和技术两个方式介绍项目。
本项目包括了用户端、机构端、运营端。
核心模块包括:内容管理、媒资管理、课程搜索、订单支付、选课管理、认证授权等。
下图是项目的功能模块图:
下边介绍业务流程:
1、课程编辑与发布流程如下:
2、课程发布后学生登录平台进行选课、在线学习。
免费课程可直接学习,收费课程需要下单购买。
学生选课流程如下:
本项目采用前后端分离架构,
后端采用SpringBoot、SpringCloud技术栈开发,数据库使用了MySQL,还使用的Redis、消息队列、分布式文件系统、Elasticsearch等中间件系统。
划分的微服务包括:内容管理服务、媒资管理服务、搜索服务、订单支付服务、学习中心服务、系统管理服务、认证授权服务、网关服务、注册中心服务、配置中心服务等。
下图是项目的技术架构图:
各层职责说明如下:
名称 | 功能描述 |
---|---|
用户层 | 用户层描述了本系统所支持的用户类型包括:pc用户、app用户、h5用户。 |
pc用户通过浏览器访问系统、app用户通过android、ios手机访问,H5用户通过h5页面访问。 | |
CDN | CDN全称Content Delivery Network,即内容分发网络,本系统所有静态资源全部通过CDN加速来提高访问速度。 |
系统静态资源包括:html页面、js/css文件、image图片、pdf/ppt/doc教学文档、video视频等。 | |
负载均衡 | 系统的CDN层、UI层、服务层及数据层均设置了负载均衡服务,上图仅在UI层前边标注了负载均衡。 每一层的负载均衡会根据系统的需求来确定负载均衡器的类型,系统支持4层负载均衡+7层负载均衡结合的方式,4层负载均衡是指在网络传输层进行流程转发,根据IP和端口进行转发,7层负载均衡完成HTTP协议负载均衡及反向代理的功能,根据url进行请求转发。 |
UI层 | UI层描述了系统向pc用户、app用户、h5用户提供的产品界面。 |
根据系统功能模块特点确定了UI层包括如下产品界面类型: | |
1)面向pc用户的门户系统、学习中心系统、教学管理系统、系统管理中心。 | |
2)面向h5用户的门户系统、学习中心系统。 | |
3)面向app用户的门户系统、学习中心系统。 | |
微服务层 | 微服务层将系统服务分类三类:业务服务、基础服务、第三方代理服务。 |
下边在测试环境演示系统的核心业务流程,本项目主要包括三类用户角色:学生、教学机构的老师、平台运营人员,核心业务流程包括课程发布流程、选课学习流程。
课程发布流程:
1、教学机构的老师登录教学管理平台,编辑课程信息,发布自己的课程。
2、平台运营人员登录运营平台审核课程、视频等信息,审核通过后课程方可发布。
流程图如业务介绍图:
课程发布后学生登录平台进行选课、在线学习。
免费课程可直接学习,收费课程需要下单购买。
学生选课学习流程如业务介绍图:
项目基于JDK1.8环境开发,使用Mavne构建项目工程,首先安装开发工具,安装及配置步骤参考:学成在线项目开发环境配置。
要求JDK、IDEA、Maven、Git、MySQL环境安装完成。
提示:如果虚拟机环境没有很快安装成功可先将MySQL数据库安装在本机,因为后续内容刚开始就要使用MySQL数据库。
MySQL8下载地址:https://dev.mysql.com/downloads/
本项目使用Git进行版本控制,在gogs上创建一个个人使用的git仓库:http://192.168.101.65:10880/xuecheng-plus-group01/xuecheng-plus.git,如果gogs安装有问题也可自行选择一个公网的Git仓库,比如:gitee、github,注册自己的账号并创建仓库。
使用git拉取远程仓库。
打开IDEA,从版本控制创建工程。
输入仓库地址,并选择工程路径。
创建成功:
添加.gitignore文件,编辑内容如下:
Java
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**
!**/src/test/**
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
logs/
### VS Code ###
.vscode/
提交代码到git仓库。
执行push:
如果是首次向该git仓库提交代码需要输入账号和密码:
可以输入默认的账号和密码:gogs/gogs
如果账号密码输入错误报异常:Incorrect username or password (access token)
如果没有权限访问此仓库则报403错误:
此时就需要在仓库成员管理界面将账号添加到此仓库即可。
如果忘记密码,此时可以先修改gogs中的密码,再修改windows凭据的密码,
在此界面中找到远程仓库的记录,修改密码。
如果在windows凭据中找不到指定记录可以设置IDEA不记录密码
通常不会在主分支进行开发,本项目在dev开发分支进行开发,下边创建开发分支。
新建一个分支,点击IDEA右下角的分支标识:
输入分支名称:
点击:Create
创建成功,右下角已经显示了dev分支
打开Git Log:
下边将dev分支提交到远程仓库
push成功,查看远程git仓库界面显示了dev分支:
然后就在dev分支进行开发,开发完成后将合并到主分支。
学成在线使用 Maven 来进行项目的管理和构建。整个项目分为三大类工程:父工程、基础工程 和微服务工程。
• 父工程
○ 对依赖包的版本进行管理
○ 本身为Pom工程,对子工程进行聚合管理
• 基础工程
○ 继承父类工程
○ 提供基础类库
○ 提供工具类库
• 微服务工程
○ 分别从业务、技术方面划分模块,每个模块构建为一个微服务。
○ 每个微服务工程依赖基础工程,间接继承父工程。
○ 包括:内容管理服务、媒资管理服务、搜索服务、订单支付服务等。
父工程的职责是对依赖包的版本进行管理,本小节创建父工程分两步,第一创建父工程,第二在pom.xml编辑依赖管理。
1、首先创建父工程
为了对代码更好的进行权限管理,这里我们单独创建父工程。
使用idea打开工程目录,进入工程结构界面。
点击File–>Project Structure:
进入Project Structure,首先检查jdk是否配置正确,并进行配置。
进入Modules界面,新建模块
进入新建模块界面,选择Spring Initializr,填写模块的信息。
注意:这里Server URL默认是start.spring.io,如果连接不上可换为start.aliyun.com。
创建成功,删除多余文件
到此父工程创建完成。
2、依赖管理定义
下边开始编辑xuecheng-plus-parent父工程的依赖管理 。
父工程中没有代码,不用去依赖其它的包,它的作用是限定其它子工程依赖包的版本号,即在dependencyManagement 中去编辑即可。
1)确定父工程为一个pom工程,在pom.xml中添加如下内容:
pom
2)编辑依赖的包的版本号、打包插件等。
pom.xml如下:
<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.0modelVersion>
<groupId>com.xuechenggroupId>
<artifactId>xuecheng-plus-parentartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>xuecheng-plus-parentname>
<description>xuecheng-plus-parentdescription>
<packaging>pompackaging>
<properties>
<java.version>1.8java.version>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASEspring-boot.version>
<spring-cloud.version>Hoxton.SR9spring-cloud.version>
<org.mapstruct.version>1.3.1.Finalorg.mapstruct.version>
<spring-cloud-alibaba.version>2.2.6.RELEASEspring-cloud-alibaba.version>
<org.projectlombok.version>1.18.8org.projectlombok.version>
<javax.servlet-api.version>4.0.1javax.servlet-api.version>
<fastjson.version>1.2.83fastjson.version>
<druid-spring-boot-starter.version>1.2.8druid-spring-boot-starter.version>
<mysql-connector-java.version>8.0.30mysql-connector-java.version>
<mybatis-plus-boot-starter.version>3.4.1mybatis-plus-boot-starter.version>
<commons-lang.version>2.6commons-lang.version>
<minio.version>8.4.3minio.version>
<xxl-job-core.version>2.3.1xxl-job-core.version>
<swagger-annotations.version>1.5.20swagger-annotations.version>
<commons-lang3.version>3.10commons-lang3.version>
<okhttp.version>4.8.1okhttp.version>
<swagger-spring-boot-starter.version>1.9.0.RELEASEswagger-spring-boot-starter.version>
<elasticsearch.version>7.12.1elasticsearch.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>${spring-boot.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>${spring-cloud-alibaba.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>${org.projectlombok.version}version>
dependency>
<dependency>
<groupId>org.mapstructgroupId>
<artifactId>mapstruct-jdk8artifactId>
<version>${org.mapstruct.version}version>
dependency>
<dependency>
<groupId>org.mapstructgroupId>
<artifactId>mapstruct-processorartifactId>
<version>${org.mapstruct.version}version>
dependency>
<dependency>
<groupId>io.swaggergroupId>
<artifactId>swagger-annotationsartifactId>
<version>${swagger-annotations.version}version>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>${javax.servlet-api.version}version>
<scope>providedscope>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>${fastjson.version}version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druid-spring-boot-starterartifactId>
<version>${druid-spring-boot-starter.version}version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>${mysql-connector-java.version}version>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>${mybatis-plus-boot-starter.version}version>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-generatorartifactId>
<version>${mybatis-plus-boot-starter.version}version>
dependency>
<dependency>
<groupId>commons-langgroupId>
<artifactId>commons-langartifactId>
<version>${commons-lang.version}version>
dependency>
<dependency>
<groupId>io.miniogroupId>
<artifactId>minioartifactId>
<version>${minio.version}version>
dependency>
<dependency>
<groupId>com.google.guavagroupId>
<artifactId>guavaartifactId>
<version>25.0-jreversion>
dependency>
<dependency>
<groupId>com.xuxueligroupId>
<artifactId>xxl-job-coreartifactId>
<version>${xxl-job-core.version}version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<version>${spring-boot.version}version>
<scope>testscope>
<exclusions>
<exclusion>
<groupId>org.junit.vintagegroupId>
<artifactId>junit-vintage-engineartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>com.squareup.okhttp3groupId>
<artifactId>okhttpartifactId>
<version>${okhttp.version}version>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-lang3artifactId>
<version>${commons-lang3.version}version>
dependency>
<dependency>
<groupId>com.spring4allgroupId>
<artifactId>swagger-spring-boot-starterartifactId>
<version>${swagger-spring-boot-starter.version}version>
dependency>
<dependency>
<groupId>org.elasticsearch.clientgroupId>
<artifactId>elasticsearch-rest-high-level-clientartifactId>
<version>${elasticsearch.version}version>
dependency>
<dependency>
<groupId>org.elasticsearchgroupId>
<artifactId>elasticsearchartifactId>
<version>${elasticsearch.version}version>
dependency>
dependencies>
dependencyManagement>
<build>
<finalName>${project.name}finalName>
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<filtering>truefiltering>
<includes>
<include>**/*include>
includes>
resource>
<resource>
<directory>src/main/javadirectory>
<includes>
<include>**/*.xmlinclude>
includes>
resource>
resources>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.8.1version>
<configuration>
<source>1.8source>
<target>1.8target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>${org.projectlombok.version}version>
path>
annotationProcessorPaths>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-resources-pluginartifactId>
<version>3.3.0version>
<configuration>
<encoding>utf-8encoding>
<useDefaultDelimiters>trueuseDefaultDelimiters>
configuration>
plugin>
plugins>
build>
project>
基础工程的职责是提供一些系统架构所需要的基础类库以及一此工具类库。
1、首先创建基础工程xuecheng-plus-base。
创建的过程同父工程的创建过程,同上述步骤:
这里需要注意的是xuecheng-plus-base的父工程为xuecheng-plus-parent,xuecheng-plus-base的pom.xml的如下:
<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.0modelVersion>
<parent>
<groupId>com.xuechenggroupId>
<artifactId>xuecheng-plus-parentartifactId>
<version>0.0.1-SNAPSHOTversion>
<relativePath>../xuecheng-plus-parentrelativePath>
parent>
<artifactId>xuecheng-plus-baseartifactId>
<dependencies>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-lang3artifactId>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<scope>providedscope>
dependency>
<dependency>
<groupId>commons-langgroupId>
<artifactId>commons-langartifactId>
dependency>
<dependency>
<groupId>commons-codecgroupId>
<artifactId>commons-codecartifactId>
<version>1.11version>
dependency>
<dependency>
<groupId>io.swaggergroupId>
<artifactId>swagger-annotationsartifactId>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-validationartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-log4j2artifactId>
dependency>
<dependency>
<groupId>com.j256.simplemagicgroupId>
<artifactId>simplemagicartifactId>
<version>1.17version>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-lang3artifactId>
dependency>
<dependency>
<groupId>com.google.zxinggroupId>
<artifactId>coreartifactId>
<version>3.3.3version>
dependency>
<dependency>
<groupId>com.google.zxinggroupId>
<artifactId>javaseartifactId>
<version>3.3.3version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.modulegroupId>
<artifactId>jackson-module-parameter-namesartifactId>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatypegroupId>
<artifactId>jackson-datatype-jdk8artifactId>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatypegroupId>
<artifactId>jackson-datatype-jsr310artifactId>
dependency>
dependencies>
project>
基础工程中的内容待需要时再行开发。
至此父工程和基础工程创建完成,最后提交至git。
最后push到远程仓库
仅仅用作个人复习练习使用