项目业务介绍
本项目包括了用户端、机构端、运营端。
核心模块包括:内容管理、媒资管理、课程搜索、订单支付、选课管理、认证授权等。
下图是项目的功能模块图:
![](https://img-blog.csdnimg.cn/direct/1ec79d99e0344a39bcba55ab2739d77e.png)
下边介绍业务流程:
1、课程编辑与发布流程如下:
![](https://img-blog.csdnimg.cn/direct/4eb32ce92b114cdb9405eafee7ce932b.png)
2、课程发布后学生登录平台进行选课、在线学习。
免费课程可直接学习,收费课程需要下单购买。
学生选课流程如下:
![](https://img-blog.csdnimg.cn/direct/b4a2823b1a034563844e446b875de110.png)
1.3 项目技术架构
本项目采用前后端分离架构,后端采用SpringBoot、SpringCloud技术栈开发,数据库使用了MySQL,还使用的Redis、消息队列、分布式文件系统、Elasticsearch等中间件系统。
划分的微服务包括:内容管理服务、媒资管理服务、搜索服务、订单支付服务、 学习中心服务、系统管理服务、认证授权服务、网关服务、注册中心服务、配置中心服务等。
下图是项目的技术架构图:
![](https://img-blog.csdnimg.cn/direct/d604be95b4de4c84b27a9b9de9eb6dc5.png)
各层职责说明如下:
名称 | 功能描述 |
用户层 | 用户层描述了本系统所支持的用户类型包括: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用户的门户系统、学习中心系统。 |
微服务层 | 微服务层将系统服务分类三类:业务服务、基础服务、第三方代理服务。 业务服务:主要为学成在线核心业务提供服务,并与数据层进行交互获得数据。 基础服务:主要管理学成在线系统运行所需的配置、日志、任务调度、短信等系统级别的服务。 第三方代理服务:系统接入第三方服务完成业务的对接,例如认证、支付、视频点播/直播、用户认证和授权。 |
数据层 | 数据层描述了系统的数据存储的内容类型,关系性数据库:持久化的业务数据使用MySQL。 消息队列:存储系统服务间通信的消息,本身提供消息存取服务,与微服务层的系统服务连接。 索引库:存储课程信息的索引信息,本身提供索引维护及搜索的服务,与微服务层的系统服务连接。 缓存:作为系统的缓存服务,作为微服务的缓存数据便于查询。 文件存储:提供系统静态资源文件的分布式存储服务,文件存储服务器作为CDN服务器的数据来源,CDN上的静态资源将最终在文件存储服务器上保存多份。 |
1.2 项目演示
下边在测试环境演示系统的核心业务流程,本项目主要包括三类用户角色:学生、教学机构的老师、平台运营人员,核心业务流程包括课程发布流程、选课学习流程。
课程发布流程:
1、教学机构的老师登录教学管理平台,编辑课程信息,发布自己的课程。
2、平台运营人员登录运营平台审核课程、视频等信息,审核通过后课程方可发布。
流程图如下:
![](https://img-blog.csdnimg.cn/direct/52ea74d1d6f546778a91cc9918b80325.png)
课程发布后学生登录平台进行选课、在线学习。
免费课程可直接学习,收费课程需要下单购买。
学生选课学习流程如下:
![](https://img-blog.csdnimg.cn/direct/05238b5f0a1b4b95b407c803f18a0fbf.png)
1.4 面试
1、详细说说你的项目吧
从以下几个方面进行项目介绍:
1、项目的背景,包括:是自研还是外包、什么业务、服务的客户群是谁、谁去运营等问题。
2、项目的业务流程
3、项目的功能模块
4、项目的技术架构
5、个人工作职责
6、个人负责模块的详细说明,包括模块的设计,所用到的技术,技术的实现方案等。
一个例子:
我最近参与的项目是我们公司自研的专门针对成人职业技能教育的网络课堂系统,网站提供了成人职业技能培训的相关课程,如:软件开发培训、职业资格证书培训、成人学历教育培训等课程。项目基于B2B2C的业务模式,培训机构可以在平台入驻、发布课程,我们公司作为运营方由专门的人员对发布的课程进行审核,审核通过后课程才可以发布成功,课程包括免费和收费两种形式,对于免费课程普通用户可以直接选课学习,对于收费课程在选课后需要支付成功才可以继续学习。
本项目包括用户端、机构端、运营端三个端。
核心模块包括:内容管理、媒资管理、课程搜索、订单支付、选课管理、认证授权等。
本项目采用前后端分离架构,后端采用SpringBoot、SpringCloud技术栈开发,数据库使用了MySQL,还使用的Redis、消息队列、分布式文件系统、Elasticsearch等中间件系统。
划分的微服务包括:内容管理服务、媒资管理服务、搜索服务、订单支付服务、 学习中心服务、系统管理服务、认证授权服务、网关服务、注册中心服务、配置中心服务等。
我在这个项目中负责了内容管理、媒资管理、订单支付模块的设计与开发。
内容管理模块,是对平台上的课程进行管理,课程的相关信息比较多这里在数据库设计了课程基本信息表、课程营销表、课程计划、课程师资表进行存储 ,培训机构要发布一门课程需要填写课程基本信息、课程营销信息、课程计划信息、课程师资信息,填写完毕后需要提交审核,由运营人员进行课程信息的审核,整个审核过程是程序自动审核加人工确认的方式,通常24小时审核完成。课程审核通过即可发布课程,课程的相关信息会聚合到课程发布表中,这里不仅要将课程信息写到课程发布表还要将课程信息写到索引库、分布式文件系统中,所以这里存在分布式事务的问题,项目使用本地消息表加任务调度的方式去解决这里的分布式事务,保存数据的最终一致性。
2 环境搭建
2.1 安装开发工具
项目基于JDK1.8环境开发,使用Mavne构建项目工程,首先安装开发工具,安装及配置步骤参考:学成在线项目开发环境配置。
学完第一章要求JDK、IDEA、Maven、Git、MySQL环境安装完成。
提示:如果虚拟机环境没有很快安装成功可先将MySQL数据库安装在本机,因为第二章的内容刚开始就要使用MySQL数据库。
MySQL8下载地址:https://dev.mysql.com/downloads/
2.2 Git环境
2.2.1 拉取代码
本项目使用Git进行版本控制,在gogs上创建一个个人使用的git仓库:http://192.168.101.65:10880/xuecheng-plus-group01/xuecheng-plus.git,如果gogs安装有问题也可自行选择一个公网的Git仓库,比如:gitee、github,注册自己的账号并创建仓库。
使用git拉取远程仓库。
打开IDEA,从版本控制创建工程。
![](https://img-blog.csdnimg.cn/direct/e60d01e4f3c448c9bb7998c6471f1990.png)
输入仓库地址,并选择工程路径。
![](https://img-blog.csdnimg.cn/direct/79db28375a4c442698f12ba4ea8bb8b3.png)
创建成功:
![](https://img-blog.csdnimg.cn/direct/28ad7777c52c41ef9df13178af44fb2d.png)
添加.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仓库。
![](https://img-blog.csdnimg.cn/direct/79349264f4af42f5be1c7e0ab028d330.png)
执行push:
![](https://img-blog.csdnimg.cn/direct/b73d10b2bd304a649f6a6b445d0e9bfd.png)
如果是首次向该git仓库提交代码需要输入账号和密码:
![](https://img-blog.csdnimg.cn/direct/a70f2227da7f4fffbea808c163e90228.png)
可以输入默认的账号和密码:gogs/gogs
如果账号密码输入错误报异常:Incorrect username or password (access token)
![](https://img-blog.csdnimg.cn/direct/60e32318a58d4127a97f73b6622ff455.png)
如果没有权限访问此仓库则报403错误:
![](https://img-blog.csdnimg.cn/direct/140fa2338675483ab849cda530d7e268.png)
此时就需要在仓库成员管理界面将账号添加到此仓库即可。
如果忘记密码,此时可以先修改gogs中的密码,再修改windows凭据的密码,
![](https://img-blog.csdnimg.cn/direct/b985b06e7e5c455bb1f36338ea58e136.png)
在此界面中找到远程仓库的记录,修改密码。
如果在windows凭据中找不到指定记录可以设置IDEA不记录密码
![](https://img-blog.csdnimg.cn/direct/a697c079606b4321af605030dbe80349.png)
2.2.2 创建开发分支
通常不会在主分支进行开发,本项目在dev开发分支进行开发,下边创建开发分支。
新建一个分支,点击IDEA右下角的分支标识:
![](https://img-blog.csdnimg.cn/direct/06a918fb3e0f4d51b5ed81f7af8b609d.png)
输入分支名称:
![](https://img-blog.csdnimg.cn/direct/3575902aa9874c94a7f4f594ea232808.png)
点击:Create
创建成功,右下角已经显示了dev分支
![](https://img-blog.csdnimg.cn/direct/0e9d10e753df439a9f397a5e6978aecb.png)
打开Git Log:
![](https://img-blog.csdnimg.cn/direct/bf57ac98b0604885b15eb1c1857e65c6.png)
下边将dev分支提交到远程仓库
![](https://img-blog.csdnimg.cn/direct/e9e42a35d0f94cd8bbff5c30038b74f7.png)
push成功,查看远程git仓库界面显示了dev分支:
![](https://img-blog.csdnimg.cn/direct/4e1e9ff413c64315ab1166aee0c3050c.png)
接下来我们就在dev分支进行开发,开发完成后将合并到主分支。
要求:学生在练习每天老师布置的作业前都创建一个新分支进行。
2.4 基础工程搭建
2.4.1 工程结构关系
学成在线使用 Maven 来进行项目的管理和构建。整个项目分为三大类工程:父工程、基础工程 和微服务工程。
![](https://img-blog.csdnimg.cn/direct/1b1bb4eaf5c447be9deb6bca1f03db19.png)
每一种类的工程都有不同的作用,下面是对其功能进行说明:
- 分别从业务、技术方面划分模块,每个模块构建为一个微服务。
- 包括:内容管理服务、媒资管理服务、搜索服务、订单支付服务等。
2.4.2 构建父工程
父工程的职责是对依赖包的版本进行管理,本小节创建父工程分两步,第一创建父工程,第二在pom.xml编辑依赖管理。
1、首先创建父工程
为了对代码更好的进行权限管理,这里我们单独创建父工程。
使用idea打开工程目录,进入工程结构界面。
点击File-->Project Structure:
![](https://img-blog.csdnimg.cn/direct/179e2df2d7b64fefbc5dc952a5d1a524.png)
进入Project Structure,首先检查jdk是否配置正确,并进行配置。
![](https://img-blog.csdnimg.cn/direct/0888454f2e0b4da9bee8e63625d20fbd.png)
进入Modules界面,新建模块
![](https://img-blog.csdnimg.cn/direct/5b63dd2f83284a58bab9c0e0bf4227ee.png)
进入新建模块界面,选择Spring Initializr,填写模块的信息。
注意:这里Server URL默认是start.spring.io,如果连接不上可换为start.aliyun.com。
![](https://img-blog.csdnimg.cn/direct/ece3e8f91dae46d9bb99feef2517a088.png)
创建成功,删除多余文件
![](https://img-blog.csdnimg.cn/direct/2194a5bc03554227913c4c9e6611495d.png)
选择要删除的文件,进行删除
![](https://img-blog.csdnimg.cn/direct/fe0b2b42921342359e71a48119b68135.png)
删除成功
![](https://img-blog.csdnimg.cn/direct/b24dcfab21c443b59b7b761317b6db0a.png)
到此父工程创建完成。
2、依赖管理定义
下边开始编辑xuecheng-plus-parent父工程的依赖管理 。
父工程中没有代码,不用去依赖其它的包,它的作用是限定其它子工程依赖包的版本号,即在dependencyManagement 中去编辑即可。
1)确定父工程为一个pom工程,在pom.xml中添加如下内容:
<packaging>pom</packaging>
2)编辑依赖的包的版本号、打包插件等。
pom.xml如下:
Java <?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> |
2.4.3 构建基础工程
基础工程的职责是提供一些系统架构所需要的基础类库以及一此工具类库。
1、首先创建基础工程xuecheng-plus-base。
创建的过程同父工程的创建过程,如下图:
![](https://img-blog.csdnimg.cn/direct/6efe6ce5321f4228a8007037e2c5ab02.png)
删除多余的文件
![](https://img-blog.csdnimg.cn/direct/aa9d827e34d14e34a1778f473b6072e1.png)
这里需要注意的是xuecheng-plus-base的父工程为xuecheng-plus-parent,xuecheng-plus-base的pom.xml的如下:
Java <?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> |
基础工程中的内容待需要时再行开发。
至此父工程和基础工程创建完成,最后提交至git。
![](https://img-blog.csdnimg.cn/direct/f1b2812c19a4464bb597d1a52c1891a7.png)
最后push到远程仓库
![](https://img-blog.csdnimg.cn/direct/780270155b0941de9260eed2d081f229.png)
创建模块工程
2.1 模块工程结构
在第一章节创建了项目父工程、项目基础工程,如下图:
![](https://img-blog.csdnimg.cn/direct/8546c9cd248e4a7e9ac6f321d28e2ef7.png)
接下来要创建内容管理模块的工程结构。
本项目是一个前后端分离项目,前端与后端开发人员之间主要依据接口进行开发。
下图是前后端交互的流程图:
1、前端请求后端服务提供的接口。(通常为http协议 )
2、后端服务的控制层Controller接收前端的请求。
3、Contorller层调用Service层进行业务处理。
4、Service层调用Dao持久层对数据持久化。
![](https://img-blog.csdnimg.cn/direct/cf747eb47ae743c18ec25fe531bd2755.png)
整个流程分为前端、接口层、业务层三部分。
所以模块工程的结构如下图所示:
![](https://img-blog.csdnimg.cn/direct/29075597e5bf4b74be7710ac3336df51.png)
xuecheng-plus-content-api:接口工程,为前端提供接口。
xuecheng-plus-content-service: 业务工程,为接口工程提供业务支撑。
xuecheng-plus-content-model: 数据模型工程,存储数据模型类、数据传输类型等。
结合项目父工程、项目基础工程后,如下图:
![](https://img-blog.csdnimg.cn/direct/99704d27018944838eab75efe667cc14.png)
xuecheng-plus-content:内容管理模块工程,负责聚合xuecheng-plus-content-api、xuecheng-plus-content-service、xuecheng-plus-content-model。
2.2 创建模块工程
1、首先在项目根目录创建内容管理模块的父工程xuecheng-plus-content
![](https://img-blog.csdnimg.cn/direct/b85b748e40d14482bfe2fef4129a40b1.png)
创建完成,只保留pom.xml文件,删除多余的文件。
内容管理父工程的主要职责是聚合内容管理接口和内容管理接口实现两个工程,它的父工程是
xuecheng-plus-parent。
pom.xml如下
XML <?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> <artifactId>xuecheng-plus-parent</artifactId> <groupId>com.xuecheng</groupId> <version>0.0.1-SNAPSHOT</version> <relativePath>../xuecheng-plus-parent</relativePath> </parent> <artifactId>xuecheng-plus-content</artifactId> <name>xuecheng-plus-content</name> <description>xuecheng-plus-content</description> <packaging>pom</packaging>
<modules> <module>xuecheng-plus-content-api</module> <module>xuecheng-plus-content-model</module> <module>xuecheng-plus-content-service</module> </modules> </project> |
由于xuecheng-plus-content-api和xuecheng-plus-content-service两个工程还没有创建所以modules报错。
2、在xuecheng-plus-content下创建xuecheng-plus-content-model数据模型工程。
![](https://img-blog.csdnimg.cn/direct/7093450e00f147b48e036b1715bfc089.png)
创建完成,只保留包和pom.xml文件 ,删除多余的文件。
修改pom.xml文件
XML <?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> <artifactId>xuecheng-plus-content</artifactId> <groupId>com.xuecheng</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>xuecheng-plus-content-model</artifactId>
<dependencies> <dependency> <groupId>com.xuecheng</groupId> <artifactId>xuecheng-plus-base</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies>
</project> |
3、在xuecheng-plus-content下创建xuecheng-plus-content-service接口实现工程。
![](https://img-blog.csdnimg.cn/direct/6376b96ef643448eb304a2ee66630890.png)
创建完成,只保留包和pom.xml文件 ,删除多余的文件
,pom.xml如下:
XML <?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> <artifactId>xuecheng-plus-content</artifactId> <groupId>com.xuecheng</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>xuecheng-plus-content-service</artifactId> <dependencies> <dependency> <groupId>com.xuecheng</groupId> <artifactId>xuecheng-plus-content-model</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> </project> |
4、在xuecheng-plus-content下创建xuecheng-plus-content-api接口工程。
xuecheng-plus-content-api接口工程的父工程是xuecheng-plus-content,它依赖了xuecheng-plus-base基础工程。
![](https://img-blog.csdnimg.cn/direct/45d2c6b1607c4816a7ad0725ac37ef77.png)
编辑pom.xml
XML <?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> <artifactId>xuecheng-plus-content</artifactId> <groupId>com.xuecheng</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>xuecheng-plus-content-api</artifactId>
<dependencies> <dependency> <groupId>com.xuecheng</groupId> <artifactId>xuecheng-plus-content-service</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies>
</project> |
到此内容管理模块的四个工程创建完毕,工程结构图如下:
![](https://img-blog.csdnimg.cn/direct/09dea78c0a7c466982fb62119e34275b.png)