1.项目背景

  • 学成在线项目是本公司自研的一个专门针对成人职业技能教育的网络课堂系统,网站提供了成人职业技能培训的相关课程,如:软件开发培训、职业资格证书培训、成人学历教育培训等课程。项目基于B2B2C的业务模式,培训机构可以在平台入驻、发布课程,运营人员对发布的课程进行审核,审核通过后课程才可以发布成功,课程包括免费和收费两种形式,对于免费课程可以直接选课学习,对于收费课程在选课后需要支付成功才可以继续学习。
  • 什么是什么是B2B2C?
  • B2B2C是一种电子商务类型的网络购物商业模式,B是Business的简称,C是Consumer的简称,第一个B指的是商品或服务的供应商,第二个B指的是从事电子商务的企业,C则是表示消费者。
  • B2B的定义:企业跟企业之间的电子商务运作方式。
  • B2C的定义:企业跟消费者之间的电子商务运作方式。

    2.项目介绍

  • 本项目包括了用户端、机构端、运营端。
  • 核心模块包括:内容管理、媒资管理、课程搜索、订单支付、选课管理、认证授权等。

    3.项目介绍

  • 本项目包括了用户端、机构端、运营端。
  • 核心模块包括:内容管理、媒资管理、课程搜索、订单支付、选课管理、认证授权等。
  • 课程编辑与发布流程如下:
  • 学生选课流程如下:

    4.项目技术架构

  • 本项目采用前后端分离架构,后端采用SpringBoot、SpringCloud技术栈开发,数据库使用了MySQL,还使用的Redis、消息队列、分布式文件系统、Elasticsearch等中间件系统。
  • 划分的微服务包括:内容管理服务、媒资管理服务、搜索服务、订单支付服务、 学习中心服务、系统管理服务、认证授权服务、网关服务、注册中心服务、配置中心服务等。

    5.面试

    • 详细说说你的项目吧
  • 从以下几个方面进行项目介绍:

    1、项目的背景,包括:是自研还是外包、什么业务、服务的客户群是谁、谁去运营等问题。
    2、项目的业务流程
    3、项目的功能模块
    4、项目的技术架构
    5、个人工作职责
    6、个人负责模块的详细说明,包括模块的设计,所用到的技术,技术的实现方案等。

一个例子:

  • 我最近参与的项目是我们公司自研的专门针对成人职业技能教育的网络课堂系统,网站提供了成人职业技能培训的相关课程,如:软件开发培训、职业资格证书培训、成人学历教育培训等课程。项目基于B2B2C的业务模式,培训机构可以在平台入驻、发布课程,我们公司作为运营方由专门的人员对发布的课程进行审核,审核通过后课程才可以发布成功,课程包括免费和收费两种形式,对于免费课程普通用户可以直接选课学习,对于收费课程在选课后需要支付成功才可以继续学习。
  • 本项目包括用户端、机构端、运营端三个端。
  • 核心模块包括:内容管理、媒资管理、课程搜索、订单支付、选课管理、认证授权等。
  • 本项目采用前后端分离架构,后端采用SpringBoot、SpringCloud技术栈开发,数据库使用了MySQL,还使用的Redis、消息队列、分布式文件系统、Elasticsearch等中间件系统。
  • 划分的微服务包括:内容管理服务、媒资管理服务、搜索服务、订单支付服务、 学习中心服务、系统管理服务、认证授权服务、网关服务、注册中心服务、配置中心服务等。
  • 我在这个项目中负责了内容管理、媒资管理、订单支付模块的设计与开发。
  • 内容管理模块,是对平台上的课程进行管理,课程的相关信息比较多这里在数据库设计了课程基本信息表、课程营销表、课程计划、课程师资表进行存储 ,培训机构要发布一门课程需要填写课程基本信息、课程营销信息、课程计划信息、课程师资信息,填写完毕后需要提交审核,由运营人员进行课程信息的审核,整个审核过程是程序自动审核加人工确认的方式,通常24小时审核完成。课程审核通过即可发布课程,课程的相关信息会聚合到课程发布表中,这里不仅要将课程信息写到课程发布表还要将课程信息写到索引库、分布式文件系统中,所以这里存在分布式事务的问题,项目使用本地消息表加任务调度的方式去解决这里的分布式事务,保存数据的最终一致性。

6.基础工程搭建

6.1工程结构关系

  • 学成在线使用 Maven 来进行项目的管理和构建。整个项目分为三大类工程:父工程、基础工程 和微服务工程。

    每一种类的工程都有不同的作用,下面是对其功能进行说明:
  • 父工程
    • 对依赖包的版本进行管理
    • 本身为Pom工程,对子工程进行聚合管理
  • 基础工程
    • 继承父类工程
    • 提供基础类库
    • 提供工具类库
  • 微服务工程
    • 分别从业务、技术方面划分模块,每个模块构建为一个微服务。
    • 每个微服务工程依赖基础工程,间接继承父工程。
      包括:内容管理服务、媒资管理服务、搜索服务、订单支付服务等。

6.2构建父工程

  • 父工程的职责是对依赖包的版本进行管理
    1. 创建父工程,新建模块,选择Spring Initalizr,填写模块信息
      • 模块名:xuecheng-plus-parent
      • 包名:com.xuecheng
    2. 依赖管理定义
      • 父工程中没有代码,不用去依赖其他的包,它的作用就是限定其他子工程依赖包的版本号,即在dependencyManagement中去编辑即可
      • 确定父工程为一个POM工程,在pom.xml中添加如下内容
        1
        <packaging>pom</packaging>
      • 确定父工程的依赖
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        58
        59
        60
        61
        62
        63
        64
        65
        66
        67
        68
        69
        70
        71
        72
        73
        74
        75
        76
        77
        78
        79
        80
        81
        82
        83
        84
        85
        86
        87
        88
        89
        90
        91
        92
        93
        94
        95
        96
        97
        98
        99
        100
        101
        102
        103
        104
        105
        106
        107
        108
        109
        110
        111
        112
        113
        114
        115
        116
        117
        118
        119
        120
        121
        122
        123
        124
        125
        126
        127
        128
        129
        130
        131
        132
        133
        134
        135
        136
        137
        138
        139
        140
        141
        142
        143
        144
        145
        146
        147
        148
        149
        150
        151
        152
        153
        154
        155
        156
        157
        158
        159
        160
        161
        162
        163
        164
        165
        166
        167
        168
        169
        170
        171
        172
        173
        174
        175
        176
        177
        178
        179
        180
        181
        182
        183
        184
        185
        186
        187
        188
        189
        190
        191
        192
        193
        194
        195
        196
        197
        198
        199
        200
        201
        202
        203
        204
        205
        206
        207
        208
        209
        210
        211
        212
        213
        214
        215
        216
        217
        218
        219
        220
        221
        222
        223
        224
        225
        226
        227
        228
        229
        230
        231
        232
        233
        234
        235
        236
        237
        238
        239
        240
        241
        242
        243
        _<?_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>
            <groupId>com.xuecheng</groupId>
            <artifactId>xuecheng-plus-parent</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <name>xuecheng-plus-parent</name>
            <description>xuecheng-plus-parent</description>
            <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>
                <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.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.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>

        </project>

        6.3构建基础工程

  • 基础工程的职责是提供一些系统架构所需要的基础类库以及一些工具类库
    1. 创建基础工程
      • 模块名:xuecheng-plus-base
      • 包名:com.xuecheng
    2. 编辑pom.xml
      • 注意base的父工程是parent
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        58
        59
        60
        61
        62
        63
        64
        65
        66
        67
        68
        69
        70
        71
        72
        73
        74
        75
        76
        77
        78
        79
        80
        81
        82
        83
        84
        85
        86
        87
        88
        89
        90
        91
        92
        93
        94
        95
        96
        97
        98
        _<?_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>

        <dependencies>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</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>

        </project>

        6.4添加.gitignore文件

  • 在项目工程的根目录(xuecheng-plus)新增文件.gitignore,设置不需要提交的内容
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    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/

    7.项目环境

  • 设置子网IP:192.168.101.0,子网掩码:255.255.255.0
  • 虚拟机的IP地址为192.168.101.65
  • 虚拟机账号与密码为:root/centos
  • 执行 systemctl start docker 启动docker。
  • 运行: sh /data/soft/restart.sh
  • 查询docker容器:docker ps
  • 数据库账号与密码为:root/mysql