黑马学成在线--项目环境搭建
Posted Cyborg2077
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了黑马学成在线--项目环境搭建相关的知识,希望对你有一定的参考价值。
-
完整版请移步至我的个人博客查看:https://cyborg2077.github.io/
-
Git仓库:https://github.com/Cyborg2077/xuecheng-plus
项目背景
在线教育市场环境
- 以下内容摘自 https://report.iresearch.cn/content/2021/01/358854.shtml
- 在线教育行业是一个有着极强的广度和深度的行业,从校内到校外;从早幼教到职业培训;从教育工具到全信息化平台等等。
- 2020年的新冠疫情外生冲击,让在线教育再次站在聚光灯下。疫情下教育领域获融资最多,而其中在线教育最受资本青睐。据艾瑞咨询统计,2020年教育行业累计融资1164亿元,其中在线教育融资金额1034亿元,占比89%。与此同时,在行业处于困境的情况下,会加速洗牌,资源向好的企业集中。2020年资源向头部集中趋势明显,中小型机构生存更加困难。2020年资本向在线教育行业累计输送的1034亿元中,80%都流向了头部的5家公司。
- To C市场
- 据艾瑞咨询统计核算,2020年中国在线教育行业市场规模2573亿元,过去4年的CAGR达34.5%,其中低幼及素质教育赛道、K12学科培训赛道在线化进程加快是在线教育市场快速增长的最主要贡献因素。疫情影响下,低幼及素质教育领域的在线化范围持续纵深,职业教育领域的在线化进程也在不断加速,新的供给和需求不断产生。但同时,2020年疫情外生冲击加快了2020年的在线教育进程,将会透支一部分2021年的增速,艾瑞预计2021年在线教育行业同比增速将回落到20%左右。
- To B 市场
- 疫情也加速了整个教育产业链的进化,to B机构快速成长起来,扮演着赋能者的角色,课程内容、招生、师训、直播系统、管理系统等产品及服务大量涌现。随着云服务发展成熟以及疫情对直播课需求的催化,大量提供直播授课系统等PaaS/SaaS服务的机构迅速成长起来,成为各种会展上的主力军。
项目背景
-
本项目是本公司自研的一个专门针对成人职业技能教育的网络课堂系统,网站提供了成人职业技能培训的相关课程,如:软件开发培训、职业资格证书培训、成人学历教育培训等课程。项目基于B2B2C的业务模式,培训机构可以在平台入驻、发布课程,运营人员对发布的课程进行审核,审核通过后课程才可以发布成功,课程包括免费和收费两种形式,对于免费课程可以直接选课学习,对于收费课程在选课后需要支付成功才可以继续学习。
-
什么是B2B2C?
- B2B2C是一种电子商务类型的网络购物商业模式,B是Business的简称,C是Consumer的简称,第一个B指的是商品或服务的供应商,第二个B指的是从事电子商务的企业,C则是表示消费者。
- B2B的定义:企业跟企业之间的电子商务运作方式。
- B2C的定义:企业跟消费者之间的电子商务运作方式。
项目介绍
项目介绍
-
本项目包括了用户端、机构端、运营端。
-
核心模块包括:内容管理、媒资管理、课程搜索、订单支付、选课管理、认证授权等。
-
下图是项目的功能模块图:
-
本项目采用前后端分离架构,后端采用SpringBoot、SpringCloud技术栈开发,数据库使用了mysql,还使用的Redis、消息队列、分布式文件系统、Elasticsearch等中间件系统。
-
划分的微服务包括:内容管理服务、媒资管理服务、搜索服务、订单支付服务、 学习中心服务、系统管理服务、认证授权服务、网关服务、注册中心服务、配置中心服务等。
-
下边介绍业务流程:
- 课程编辑与发布流程如下:
- 课程发布后学生登录平台进行选课、在线学习。
- 免费课程可直接学习,收费课程需要下单购买。
- 学生选课流程如下:
- 课程编辑与发布流程如下:
功能模块与演示
-
本项目包括了用户端、机构端、运营端,核心模块包括:内容管理、媒资管理、课程搜索、订单支付、选课管理、认证授权等。
-
本项目主要包括三类用户角色:学生、教学机构的老师、平台运营人员。
-
主要讲解下边的业务流程:
- 教学机构的老师登录教学管理平台,编辑课程信息,发布自己的课程。
- 平台运营人员登录运营平台审核课程、视频等信息,审核通过后课程方可发布。
-
课程编辑与发布流程如下:
-
课程发布后学生登录平台进行选课、在线学习。
-
免费课程可直接学习,收费课程需要下单购买。
-
学生选课流程如下
面试
- 详细说说你的项目吧
- 从以下几个方面进行项目介绍:
- 项目的背景,包括:是自研还是外包、什么业务、服务的客户群是谁、谁去运营等问题。
- 项目的业务流程
- 项目的功能模块
- 项目的技术架构
- 个人工作职责
- 个人负责模块的详细说明,包括模块的设计,所用到的技术,技术的实现方案等。
一个例子:
% note info no-icon %
- 我最近参与的项目是我们公司自研的专门针对成人职业技能教育的网络课堂系统,网站提供了成人职业技能培训的相关课程,如:软件开发培训、职业资格证书培训、成人学历教育培训等课程。项目基于B2B2C的业务模式,培训机构可以在平台入驻、发布课程,我们公司作为运营方由专门的人员对发布的课程进行审核,审核通过后课程才可以发布成功,课程包括免费和收费两种形式,对于免费课程普通用户可以直接选课学习,对于收费课程在选课后需要支付成功才可以继续学习。
- 本项目包括三个端:用户端(学生端)、机构端、运营端。
- 核心模块包括:内容管理、媒资管理、课程搜索、订单支付、选课管理、认证授权等。
- 本项目采用前后端分离架构,后端采用SpringBoot、SpringCloud技术栈开发,数据库使用了MySQL,还使用的Redis、消息队列、分布式文件系统、Elasticsearch等中间件系统。
- 划分的微服务包括:内容管理服务、媒资管理服务、搜索服务、订单支付服务、 学习中心服务、系统管理服务、认证授权服务、网关服务、注册中心服务、配置中心服务等。
- 我在这个项目中负责了内容管理、媒资管理、订单支付模块的设计与开发。
- 内容管理模块,是对平台上的课程进行管理,课程的相关信息比较多这里在数据库设计了课程基本信息表、课程营销表、课程计划、课程师资表进行存储 ,培训机构要发布一门课程需要填写课程基本信息、课程营销信息、课程计划信息、课程师资信息,填写完毕后需要提交审核,由运营人员进行课程信息的审核,整个审核过程是程序自动审核加人工确认的方式,通常24小时审核完成。课程审核通过即可发布课程,课程的相关信息会聚合到课程发布表中,这里不仅要将课程信息写到课程发布表还要将课程信息写到索引库、分布式文件系统中,所以这里存在分布式事务的问题,项目使用本地消息表加任务调度的方式去解决这里的分布式事务,保存数据的最终一致性。
% endnote %
项目技术架构
项目技术架构
- 学成在线项目采用当前流行的前后端分离架构开发,由以下流程来构成:用户层、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上的静态资源将最终在文件存储服务器上保存多份。 |
- 流程说明
- 用户可以通过pc、手机等客户端访问系统进行在线学习。
- 系统应用CDN技术,对一些图片、CSS、视频等资源从CDN调度访问。
- 所有的请求全部经过负载均衡器。
- 对于PC、H5等客户端请求,首先请求UI层,渲染用户界面。
- 客户端UI请求服务层获取进行具体的业务操作。
- 服务层将数据持久化到数据库。
项目技术栈
- 学成在线按照技术分层的基础上,需要对主要层次使用具体的技术作说明。下面是学成在线技术栈结构图。
项目开发环境搭建
项目工程搭建
工程结构关系
- 学成在线使用 Maven 来进行项目的管理和构建。整个项目分为三大类工程:父工程、基础工程 和微服务工程
- 每一种类的工程都有不同的作用,下面是对其功能进行说明:
-
父工程
- 对依赖包的版本进行管理
- 本身为Pom工程,对子工程进行聚合管理
-
基础工程
- 继承父类工程
- 提供基础类库
- 提供工具类库
-
微服务工程
- 分别从业务、技术方面划分模块,每个模块构建为一个微服务。
- 每个微服务工程依赖基础工程,间接继承父工程。
- 包括:内容管理服务、媒资管理服务、搜索服务、缓存服务、消息服务等。
-
构架父工程
- 父工程的职责是对依赖包的版本进行管理
- 创建父工程,新建模块,选择Spring Initalizr,填写模块信息
- 模块名:xuecheng-plus-parent
- 包名:com.xuecheng
- 依赖管理定义
- 父工程中没有代码,不用去依赖其他的包,它的作用就是限定其他子工程依赖包的版本号,即在dependencyManagement中去编辑即可
- 确定父工程为一个pom工程,在pom.xml中添加如下内容
<packaging>pom</packaging>
- 确定项目所依赖的包及其版本号
<properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-boot.version>2.3.7.RELEASE</spring-boot.version> <spring-cloud.version>Hoxton.SR9</spring-cloud.version> <org.mapstruct.version>1.3.1.Final</org.mapstruct.version> <spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version> <org.projectlombok.version>1.18.8</org.projectlombok.version> <javax.servlet-api.version>4.0.1</javax.servlet-api.version> <fastjson.version>1.2.83</fastjson.version> <druid-spring-boot-starter.version>1.2.8</druid-spring-boot-starter.version> <mysql-connector-java.version>8.0.30</mysql-connector-java.version> <mybatis-plus-boot-starter.version>3.4.1</mybatis-plus-boot-starter.version> <commons-lang.version>2.6</commons-lang.version> <minio.version>8.4.3</minio.version> <xxl-job-core.version>2.3.1</xxl-job-core.version> <swagger-annotations.version>1.5.20</swagger-annotations.version> <commons-lang3.version>3.10</commons-lang3.version> <okhttp.version>4.8.1</okhttp.version> <swagger-spring-boot-starter.version>1.9.0.RELEASE</swagger-spring-boot-starter.version> <elasticsearch.version>7.12.1</elasticsearch.version> </properties>
- 编写dependencyManagement l来限定所依赖包的版本。
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>$spring-cloud.version</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>$spring-boot.version</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>$spring-cloud-alibaba.version</version> <type>pom</type> <scope>import</scope> </dependency> <!-- lombok,简化类的构建--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>$org.projectlombok.version</version> </dependency> <!-- mapstruct 代码生成器,简化java bean之间的映射 --> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-jdk8</artifactId> <version>$org.mapstruct.version</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>$org.mapstruct.version</version> </dependency> <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-annotations</artifactId> <version>$swagger-annotations.version</version> </dependency> <!-- Servlet 容器管理 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>$javax.servlet-api.version</version> <scope>provided</scope> </dependency> <!-- fastjson ,json解析工具 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>$fastjson.version</version> </dependency> <!-- druid 连接池管理 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>$druid-spring-boot-starter.version</version> </dependency> <!-- mySQL数据库驱动包管理 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>$mysql-connector-java.version</version> </dependency> <!-- mybatis plus 集成Spring Boot启动器 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>$mybatis-plus-boot-starter.version</version> </dependency> <!-- mybatis plus 代码生成器 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>$mybatis-plus-boot-starter.version</version> </dependency> <!-- 工具类管理 --> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>$commons-lang.version</version> </dependency> <!-- 分布式文件系统 minIO的客户端API包 --> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>$minio.version</version> </dependency> <!--google推荐的一套工具类库--> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>25.0-jre</version> </dependency> <!--分布式任务调度--> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>$xxl-job-core.version</version> </dependency> <!--Spring boot单元测试--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>$spring-boot.version</version> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>$okhttp.version</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>$commons-lang3.version</version> </dependency> <dependency> <groupId>com.spring4all</groupId> <artifactId>swagger-spring-boot-starter</artifactId> <version>$swagger-spring-boot-starter.version</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>$elasticsearch.version</version> </dependency> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>$elasticsearch.version</version> </dependency> </dependencies> </dependencyManagement>
- 编辑打包插件:
<build> <finalName>$project.name</finalName> <!--编译打包过虑配置--> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>**/*</include> </includes> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> <plugins> <!--打包插件--> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>$spring-boot.version</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <!--指定项目源码jdk的版本--> <source>1.8</source> <!--指定项目编译后的jdk的版本--> <target>1.8</target> <!--配置注解预编译--> <annotationProcessorPaths> <!-- <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>$org.mapstruct.version</version> </path>--> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>$org.projectlombok.version</version> </path> </annotationProcessorPaths> </configuration> </plugin> <!--责处理项目资源文件并拷贝到输出目录,如果有额外的资源文件目录则需要配置--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.3.0</version> <configuration> <encoding>utf-8</encoding> <!--使用默认分隔符,resource中可以使用分割符定义过虑的路径--> <useDefaultDelimiters>true</useDefaultDelimiters> </configuration> </plugin> </plugins> </build>
- 创建父工程,新建模块,选择Spring Initalizr,填写模块信息
构建基础工程
- 基础工程的职责是提供一些系统架构所需要的基础类库以及一些工具类库
- 创建基础工程
- 模块名:xuecheng-plus-base
- 包名:com.xuecheng
- 编辑pom.xml
- 注意base的父工程是parent
<?xml version="1.0" encoding="UTF-8"?> <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.0</modelVersion> <parent> <groupId>com.xuecheng</groupId> <artifactId>xuecheng-plus-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../xuecheng-plus-parent</relativePath> </parent> <artifactId>xuecheng-plus-base</artifactId> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- fast Json --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> </dependency> <!-- servlet Api 依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <scope>provided</scope> </dependency> <!-- 通用组件 --> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.11</version> </dependency> <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-annotations</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <!--根据扩展名取mimetype--> <dependency> <groupId>com.j256.simplemagic</groupId> <artifactId>simplemagic</artifactId> <version>1.17</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.3</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.3.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-parameter-names</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jdk8</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
- 创建基础工程
添加.gitignore文件
- 在项目工程的根目录(xuecheng-plus)新增
.gitignore
文件,设置不需要提交的内容
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/
项目数据库环境
- MySQL版本要使用8.0以上,然后创建一个xc_content数据库
CREATE DATABASE xc_content
- 之后导入课程提供好的建表sql语句即可
项目背景
在线教育市场环境
- 以下内容摘自 https://report.iresearch.cn/content/2021/01/358854.shtml
- 在线教育行业是一个有着极强的广度和深度的行业,从校内到校外;从早幼教到职业培训;从教育工具到全信息化平台等等。
- 2020年的新冠疫情外生冲击,让在线教育再次站在聚光灯下。疫情下教育领域获融资最多,而其中在线教育最受资本青睐。据艾瑞咨询统计,2020年教育行业累计融资1164亿元,其中在线教育融资金额1034亿元,占比89%。与此同时,在行业处于困境的情况下,会加速洗牌,资源向好的企业集中。2020年资源向头部集中趋势明显,中小型机构生存更加困难。2020年资本向在线教育行业累计输送的1034亿元中,80%都流向了头部的5家公司。
- To C市场
- 据艾瑞咨询统计核算,2020年中国在线教育行业市场规模2573亿元,过去4年的CAGR达34.5%,其中低幼及素质教育赛道、K12学科培训赛道在线化进程加快是在线教育市场快速增长的最主要贡献因素。疫情影响下,低幼及素质教育领域的在线化范围持续纵深,职业教育领域的在线化进程也在不断加速,新的供给和需求不断产生。但同时,2020年疫情外生冲击加快了2020年的在线教育进程,将会透支一部分2021年的增速,艾瑞预计2021年在线教育行业同比增速将回落到20%左右。
![](https://img-blog.csdnimg.cn/img_convert/8e9356e466f639d97117ae8a47bd691e.png)
- To B 市场
- 疫情也加速了整个教育产业链的进化,to B机构快速成长起来,扮演着赋能者的角色,课程内容、招生、师训、直播系统、管理系统等产品及服务大量涌现。随着云服务发展成熟以及疫情对直播课需求的催化,大量提供直播授课系统等PaaS/SaaS服务的机构迅速成长起来,成为各种会展上的主力军。
项目背景
-
本项目是本公司自研的一个专门针对成人职业技能教育的网络课堂系统,网站提供了成人职业技能培训的相关课程,如:软件开发培训、职业资格证书培训、成人学历教育培训等课程。项目基于B2B2C的业务模式,培训机构可以在平台入驻、发布课程,运营人员对发布的课程进行审核,审核通过后课程才可以发布成功,课程包括免费和收费两种形式,对于免费课程可以直接选课学习,对于收费课程在选课后需要支付成功才可以继续学习。
-
什么是B2B2C?
-
B2B2C是一种电子商务类型的网络购物商业模式,B是Business的简称,C是Consumer的简称,第一个B指的是商品或服务的供应商,第二个B指的是从事电子商务的企业,C则是表示消费者。
-
B2B的定义:企业跟企业之间的电子商务运作方式。
-
B2C的定义:企业跟消费者之间的电子商务运作方式。
-
项目介绍
项目介绍
-
本项目包括了用户端、机构端、运营端。
-
核心模块包括:内容管理、媒资管理、课程搜索、订单支付、选课管理、认证授权等。
-
下图是项目的功能模块图:
-
本项目采用前后端分离架构,后端采用SpringBoot、SpringCloud技术栈开发,数据库使用了MySQL,还使用的Redis、消息队列、分布式文件系统、Elasticsearch等中间件系统。
-
划分的微服务包括:内容管理服务、媒资管理服务、搜索服务、订单支付服务、 学习中心服务、系统管理服务、认证授权服务、网关服务、注册中心服务、配置中心服务等。
-
下边介绍业务流程:
- 课程编辑与发布流程如下:
-
课程发布后学生登录平台进行选课、在线学习。
-
免费课程可直接学习,收费课程需要下单购买。
-
学生选课流程如下:
-
功能模块与演示
- 本项目包括了用户端、机构端、运营端,核心模块包括:内容管理、媒资管理、课程搜索、订单支付、选课管理、认证授权等。
-
本项目主要包括三类用户角色:学生、教学机构的老师、平台运营人员。
-
主要讲解下边的业务流程:
-
教学机构的老师登录教学管理平台,编辑课程信息,发布自己的课程。
-
平台运营人员登录运营平台审核课程、视频等信息,审核通过后课程方可发布。
-
-
课程编辑与发布流程如下:
-
课程发布后学生登录平台进行选课、在线学习。
-
免费课程可直接学习,收费课程需要下单购买。
-
学生选课流程如下
面试
- 详细说说你的项目吧
- 从以下几个方面进行项目介绍:
- 项目的背景,包括:是自研还是外包、什么业务、服务的客户群是谁、谁去运营等问题。
- 项目的业务流程
- 项目的功能模块
- 项目的技术架构
- 个人工作职责
- 个人负责模块的详细说明,包括模块的设计,所用到的技术,技术的实现方案等。
一个例子:
% note info no-icon %
-
我最近参与的项目是我们公司自研的专门针对成人职业技能教育的网络课堂系统,网站提供了成人职业技能培训的相关课程,如:软件开发培训、职业资格证书培训、成人学历教育培训等课程。项目基于B2B2C的业务模式,培训机构可以在平台入驻、发布课程,我们公司作为运营方由专门的人员对发布的课程进行审核,审核通过后课程才可以发布成功,课程包括免费和收费两种形式,对于免费课程普通用户可以直接选课学习,对于收费课程在选课后需要支付成功才可以继续学习。
-
本项目包括三个端:用户端(学生端)、机构端、运营端。
-
核心模块包括:内容管理、媒资管理、课程搜索、订单支付、选课管理、认证授权等。
-
本项目采用前后端分离架构,后端采用SpringBoot、SpringCloud技术栈开发,数据库使用了MySQL,还使用的Redis、消息队列、分布式文件系统、Elasticsearch等中间件系统。
-
划分的微服务包括:内容管理服务、媒资管理服务、搜索服务、订单支付服务、 学习中心服务、系统管理服务、认证授权服务、网关服务、注册中心服务、配置中心服务等。
-
我在这个项目中负责了内容管理、媒资管理、订单支付模块的设计与开发。
-
内容管理模块,是对平台上的课程进行管理,课程的相关信息比较多这里在数据库设计了课程基本信息表、课程营销表、课程计划、课程师资表进行存储 ,培训机构要发布一门课程需要填写课程基本信息、课程营销信息、课程计划信息、课程师资信息,填写完毕后需要提交审核,由运营人员进行课程信息的审核,整个审核过程是程序自动审核加人工确认的方式,通常24小时审核完成。课程审核通过即可发布课程,课程的相关信息会聚合到课程发布表中,这里不仅要将课程信息写到课程发布表还要将课程信息写到索引库、分布式文件系统中,所以这里存在分布式事务的问题,项目使用本地消息表加任务调度的方式去解决这里的分布式事务,保存数据的最终一致性。
% endnote %
项目技术架构
项目技术架构
- 学成在线项目采用当前流行的前后端分离架构开发,由以下流程来构成:用户层、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上的静态资源将最终在文件存储服务器上保存多份。 |
-
流程说明
-
用户可以通过pc、手机等客户端访问系统进行在线学习。
-
系统应用CDN技术,对一些图片、CSS、视频等资源从CDN调度访问。
-
所有的请求全部经过负载均衡器。
-
对于PC、H5等客户端请求,首先请求UI层,渲染用户界面。
-
客户端UI请求服务层获取进行具体的业务操作。
-
服务层将数据持久化到数据库。
-
项目技术栈
- 学成在线按照技术分层的基础上,需要对主要层次使用具体的技术作说明。下面是学成在线技术栈结构图。
项目开发环境搭建
项目工程搭建
工程结构关系
- 学成在线使用 Maven 来进行项目的管理和构建。整个项目分为三大类工程:父工程、基础工程 和微服务工程
-
每一种类的工程都有不同的作用,下面是对其功能进行说明:
-
父工程
-
对依赖包的版本进行管理
-
本身为Pom工程,对子工程进行聚合管理
-
-
基础工程
-
继承父类工程
-
提供基础类库
-
提供工具类库
-
-
微服务工程
-
分别从业务、技术方面划分模块,每个模块构建为一个微服务。
-
每个微服务工程依赖基础工程,间接继承父工程。
-
包括:内容管理服务、媒资管理服务、搜索服务、缓存服务、消息服务等。
-
-
构架父工程
-
父工程的职责是对依赖包的版本进行管理
-
创建父工程,新建模块,选择Spring Initalizr,填写模块信息
-
模块名:xuecheng-plus-parent
-
包名:com.xuecheng
-
-
依赖管理定义
-
父工程中没有代码,不用去依赖其他的包,它的作用就是限定其他子工程依赖包的版本号,即在dependencyManagement中去编辑即可
-
确定父工程为一个pom工程,在pom.xml中添加如下内容
<packaging>pom</packaging>
- 确定项目所依赖的包及其版本号
<properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-boot.version>2.3.7.RELEASE</spring-boot.version> <spring-cloud.version>Hoxton.SR9</spring-cloud.version> <org.mapstruct.version>1.3.1.Final</org.mapstruct.version> <spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version> <org.projectlombok.version>1.18.8</org.projectlombok.version> <javax.servlet-api.version>4.0.1</javax.servlet-api.version> <fastjson.version>1.2.83</fastjson.version> <druid-spring-boot-starter.version>1.2.8</druid-spring-boot-starter.version> <mysql-connector-java.version>8.0.30</mysql-connector-java.version> <mybatis-plus-boot-starter.version>3.4.1</mybatis-plus-boot-starter.version> <commons-lang.version>2.6</commons-lang.version> <minio.version>8.4.3</minio.version> <xxl-job-core.version>2.3.1</xxl-job-core.version> <swagger-annotations.version>1.5.20</swagger-annotations.version> <commons-lang3.version>3.10</commons-lang3.version> <okhttp.version>4.8.1</okhttp.version> <swagger-spring-boot-starter.version>1.9.0.RELEASE</swagger-spring-boot-starter.version> <elasticsearch.version>7.12.1</elasticsearch.version> </properties>
- 编写dependencyManagement l来限定所依赖包的版本。
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>$spring-cloud.version</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>$spring-boot.version</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>$spring-cloud-alibaba.version</version> <type>pom</type> <scope>import</scope> </dependency> <!-- lombok,简化类的构建--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>$org.projectlombok.version</version> </dependency> <!-- mapstruct 代码生成器,简化java bean之间的映射 --> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-jdk8</artifactId> <version>$org.mapstruct.version</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>$org.mapstruct.version</version> </dependency> <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-annotations</artifactId> <version>$swagger-annotations.version</version> </dependency> <!-- Servlet 容器管理 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>$javax.servlet-api.version</version> <scope>provided</scope> </dependency> <!-- fastjson ,json解析工具 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>$fastjson.version</version> </dependency> <!-- druid 连接池管理 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>$druid-spring-boot-starter.version</version> </dependency> <!-- mySQL数据库驱动包管理 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>$mysql-connector-java.version</version> </dependency> <!-- mybatis plus 集成Spring Boot启动器 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>$mybatis-plus-boot-starter.version</version> </dependency> <!-- mybatis plus 代码生成器 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>$mybatis-plus-boot-starter.version</version> </dependency> <!-- 工具类管理 --> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>$commons-lang.version</version> </dependency> <!-- 分布式文件系统 minIO的客户端API包 --> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>$minio.version</version> </dependency> <!--google推荐的一套工具类库--> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>25.0-jre</version> </dependency> <!--分布式任务调度--> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>$xxl-job-core.version</version> </dependency> <!--Spring boot单元测试--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>$spring-boot.version</version> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>$okhttp.version</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>$commons-lang3.version</version> </dependency> <dependency> <groupId>com.spring4all</groupId> <artifactId>swagger-spring-boot-starter</artifactId> <version>$swagger-spring-boot-starter.version</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>$elasticsearch.version</version> </dependency> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>$elasticsearch.version</version> </dependency> </dependencies> </dependencyManagement>
- 编辑打包插件:
<build> <finalName>$project.name</finalName> <!--编译打包过虑配置--> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>**/*</include> </includes> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> <plugins> <!--打包插件--> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>$spring-boot.version</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <!--指定项目源码jdk的版本--> <source>1.8</source> <!--指定项目编译后的jdk的版本--> <target>1.8</target> <!--配置注解预编译--> <annotationProcessorPaths> <!-- <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>$org.mapstruct.version</version> </path>--> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>$org.projectlombok.version</version> </path> </annotationProcessorPaths> </configuration> </plugin> <!--责处理项目资源文件并拷贝到输出目录,如果有额外的资源文件目录则需要配置--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.3.0</version> <configuration> <encoding>utf-8</encoding> <!--使用默认分隔符,resource中可以使用分割符定义过虑的路径--> <useDefaultDelimiters>true</useDefaultDelimiters> </configuration> </plugin> </plugins> </build>
-
-
构建基础工程
-
基础工程的职责是提供一些系统架构所需要的基础类库以及一些工具类库
-
创建基础工程
-
模块名:xuecheng-plus-base
-
包名:com.xuecheng
-
-
编辑pom.xml
- 注意base的父工程是parent
<?xml version="1.0" encoding="UTF-8"?> <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.0</modelVersion> <parent> <groupId>com.xuecheng</groupId> <artifactId>xuecheng-plus-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../xuecheng-plus-parent</relativePath> </parent> <artifactId>xuecheng-plus-base</artifactId> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- fast Json --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> </dep
黑马程序员前端-CSS练手之学成在线页面制作
前端学习笔记教程不定期更新中,传送门:
- 前端HTML第一天:什么是网页?什么是HTML?网页怎么形成?
- 黑马程序员前端-CSS入门总结
- 黑马程序员前端-CSS之emmet语法
- 黑马程序员前端-CSS的复合选择器
- 黑马程序员前端-CSS的显示模式
- 黑马程序员前端-CSS背景
- 黑马程序员前端-CSS三大特性:叠层性、继承性、优先级
- 黑马程序员前端–CSS盒子模型以及PS基础
- 黑马程序员前端-CSS之圆角边框、盒子阴影、文字阴影
- 黑马程序员前端-CSS之浮动知识点汇总
- 黑马程序员前端-CSS前端基础了解PS切图
- 黑马程序员前端-CSS属性书写顺序(重点)
下面开始继续更新内容,前面链接大家用来查漏补缺哦。
CSS练手之学成在线页面制作一、页面展示
学成在线是一个企业级网站,学习的目的是为了整体感知企业级网站布局流程,而且可以帮大家复习以前的知识。
1.1 前期准备素材
- 学成在线PSD源文件
- 开发工具 = PS(切图) + sublime(代码) + chrome(测试)
1.2 前期准备工作
先把我们的前期准备工作做好, 我们本次采取结构与样式相分离思想。
- 创建 study 目录文件夹 (用于存放我们这个页面的相关内容)。
- 用vscode打开study目录文件夹.
- study 目录内新建 images 文件夹,用于保存图片。
- 新建首页文件 index.html(以后我们的网站首页统一命名规定为 index.html )。
- 新建 style.css 样式文件。我们本次采用外链样式表。
- 将样式引入到我们的 HTML 页面文件中。
- 样式表写入清除内外边距的样式,来检测样式表是否引入成功。
1.3 页面布局整体思路
为了提高网页制作的效率,布局时通常有以下的整体思路,具体如下:
1.必须确定页面的版心(可视区),我们测量可得知。
2.分析页面中的行模块,以及每个行模块中的列模块。其实页面布局第一准则.
3.一行中的列模块经常浮动布局, 先确定每个列的大小,之后确定列的位置. 页面布局第二准则
4.制作 HTML 结构。我们还是遵循,先有结构,后有样式的原则。结构永远最重要.
5.所以, 先理清楚布局结构,再写代码尤为重要. 这需要我们多写多积累.
二、页面制作
确定版心:
这个页面的版心是 1200像素 ,每个版心都要水平居中对齐,所以,我们可以定义版心为公共类:
css .w width: 1200px; margin: auto;
2.1 header头部制作
结构图如下:
- 1号是版心盒子 header 1200 * 42 的盒子水平居中对齐, 上下给一个margin值就好了。
- 版心盒子 里面包含 2号盒子 logo 图标
- 版心盒子 里面包含 3号盒子 nav 导航栏
- 版心盒子 里面包含 4号盒子 search 搜索框
- 版心盒子 里面包含 5号盒子 user 个人信息
- 注意,要求里面的 4个子盒子 必须都浮动
2.2 导航栏注意点
实际开发中,重要的导航栏,我们不会直接用链接a ,而是用 li 包含链接(li+a)的做法
1.li+a 语义更清晰,一看这就是有条理的列表型内容。
2.如果直接用a,搜索引擎容易辨别为有堆砌关键字嫌疑(故意堆砌关键字容易被搜索引擎有降权的风险),从而影响网站排名
注意:
1.让导航栏一行显示, 给 li 加浮动, 因为 li 是块级元素, 需要一行显示.
2.这个nav导航栏可以不给宽度,将来可以继续添加其余文字
3.因为导航栏里面文字不一样多,所以最好给链接 a 左右padding 撑开盒子,而不是指定宽度
4号盒子search的细节:
search 搜索框的意思: 一个 search 大盒子里面包含 2个 表单
技巧:input和button都,属于行内块元素,会有缝隙,使用浮动,可以去缝隙。
2.3 banner制作
结构图如下:
- 1号盒子是通栏的大盒子banner, 不给宽度,给高度,给一个蓝色背景。
- 2号盒子是版心 w, 要水平居中对齐。
- 3号盒子版心内,左对齐 subnav 侧导航栏。
- 4号盒子版心内,右对齐 course 课程。
2.4 subnav侧导航栏(左侧的)
- subnav 盒子 背景色 黑色半透明
- 重要的导航栏,li 包 a ,行高45px
- a里面包含文字和span,span右浮动
- 当鼠标经过a ,a里面的内容(文字和span)变蓝色
2.5 course课程表模块(右侧的)
结构图如下:
- 1号盒子 是 228 * 300 的盒子 右浮动 注意 浮动的元素 不会有外边距塌陷的问题
- 1号盒子内 分为 上下 两个 子盒子
- 2号子盒子是 上部分 我们命名为 course-hd (hd 是 head 的简写 头部的意思,我们经常用)
- 3号子盒子是 下部分 我们命名为 course-bd (bd 是 body 的简写 主体的意思,我们经常用)
2.6 精品推荐小模块
结构图如下:
- 复习点: 因为里面三个盒子都要垂直居中,我们利用 继承性,给 最大的盒子 一个垂直居中的代码就好了,还记得 那些 样式可以继承吗??? font- line- text- color
- 大盒子水平居中 goods 精品 ,注意此处有个盒子阴影
- 1号盒子是标题 H3 左侧浮动
- 2号盒子 里面放链接 左侧浮动 goods-item 距离可以控制链接的 左右外边距(注意行内元素只给左右内外边距)
- 3号盒子 右浮动 mod 修改
2.7 精品推荐大模块
结构图如下:
- 1号盒子为最大的盒子 box 版心水平居中对齐
- 2号盒子为上面部分 box-hd -- 里面 左侧标题H3 左浮动 右侧 链接 a 右浮动
- 3号盒子为底下部分 box-bd --- 里面是无序列表 有 10个 小li 组成
- 小li 外边距的问题, 这里有个小技巧。 给box-hd 宽度为 1215 就可以一行装开5个 li了
- 复习点:我们用到清除浮动,因为 box-hd 里面的盒子个数不一定是多少,所以我们就不给高度了,但是里面的盒子浮动会影响下面的布局,因此需要清除浮动。
三、底部模块制作
结构图如下:
- 1号盒子通栏大盒子 底部 footer 给高度 底色是白色
- 2号盒子版心水平居中
- 3号盒子版权 copyright 左对齐
- 4号盒子 链接组 links 右对齐
以上是关于黑马学成在线--项目环境搭建的主要内容,如果未能解决你的问题,请参考以下文章
-