1.項目背景
1.1 在線教育市場環境
以下內容摘自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服務的機構迅速成長起來,成為各種會展上的主力軍。
1.2 IT培訓市場規模
中國IT人才供給報告(https://new.qq.com/rain/a/20210831A01JI600
)
IT人才總體供不應求,高中低人才分別占比8%、41%、51%,詳見下圖:
IT服務是貫穿IT應用系統全生命周期的各項服務的統稱,下圖是IT服務產品圖譜,本項目屬于IT培訓產業。
下圖是IT培訓市場規模:
1.3 學成在線項目背景
學成在線項目是本公司自研的一個專門針對成人職業技能教育的網絡課堂系統,網站提供了成人職業技能培訓的相關課程,如:軟件開發培訓、職業資格證書培訓、成人學歷教育培訓等課程。項目基于B2B2C的業務模式,培訓機構可以在平臺入駐、發布課程,運營人員對發布的課程進行審核,審核通過后課程才可以發布成功,課程包括免費和收費兩種形式,對于免費課程可以直接選課學習,對于收費課程在選課后需要支付成功才可以繼續學習。
什么是B2B2C?
B2B2C是一種電子商務類型的網絡購物商業模式,B是Business的簡稱,C是Consumer的簡稱,第一個B指的是商品或服務的供應商,第二個B指的是從事電子商務的企業,C則是表示消費者。
B2B的定義:企業跟企業之間的電子商務運作方式。
B2C的定義:企業跟消費者之間的電子商務運作方式。
2.項目介紹
下邊分別從業務和技術兩個方式介紹項目。
2.1 項目業務介紹
本項目包括了用戶端、機構端、運營端。
核心模塊包括:內容管理、媒資管理、課程搜索、訂單支付、選課管理、認證授權等。
下圖是項目的功能模塊圖:
下邊介紹業務流程:
-
1)課程編輯與發布流程如下:
-
2)課程發布后學生登錄平臺進行選課、在線學習
- 免費課程可直接學習,收費課程需要下單購買。
- 學生選課流程如下:
2.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用戶的門戶系統、學習中心系統。 |
微服務層 | 微服務層將系統服務分類三類:業務服務、基礎服務、第三方代理服務。 業務服務:主要為學成在線核心業務提供服務,并與數據層進行交互獲得數據。 基礎服務:主要管理學成在線系統運行所需的配置、日志、任務調度、短信等系統級別的服務。 第三方代理服務:系統接入第三方服務完成業務的對接,例如認證、支付、視頻點播/直播、用戶認證和授權。 |
數據層 | 數據層描述了系統的數據存儲的內容類型,關系性數據庫:持久化的業務數據使用MySQL。 消息隊列:存儲系統服務間通信的消息,本身提供消息存取服務,與微服務層的系統服務連接。 索引庫:存儲課程信息的索引信息,本身提供索引維護及搜索的服務,與微服務層的系統服務連接。 緩存:作為系統的緩存服務,作為微服務的緩存數據便于查詢。 文件存儲:提供系統靜態資源文件的分布式存儲服務,文件存儲服務器作為CDN服務器的數據來源,CDN上的靜態資源將最終在文件存儲服務器上保存多份。 |
流程說明
- 用戶可以通過pc、手機等客戶端訪問系統進行在線學習。
- 系統應用CDN技術,對一些圖片、CSS、視頻等資源從CDN調度訪問。
- 所有的請求全部經過負載均衡器。
- 對于PC、H5等客戶端請求,首先請求UI層,渲染用戶界面。
- 客戶端UI請求服務層獲取進行具體的業務操作。
- 服務層將數據持久化到數據庫。
2.3 項目技術棧
學成在線按照技術分層的基礎上,需要對主要層次使用具體的技術作說明。下面是學成在線技術棧結構圖。
2.4 項目演示
下邊在測試環境演示系統的核心業務流程,本項目主要包括三類用戶角色:學生、教學機構的老師、平臺運營人員,核心業務流程包括課程發布流程、選課學習流程。
課程發布流程:
- 教學機構的老師登錄教學管理平臺,編輯課程信息,發布自己的課程。
- 平臺運營人員登錄運營平臺審核課程、視頻等信息,審核通過后課程方可發布。
流程圖如下:
課程發布后學生登錄平臺進行選課、在線學習。
免費課程可直接學習,收費課程需要下單購買。
學生選課學習流程如下:
2.5 面試
詳細說說你的項目吧
從以下幾個方面進行項目介紹:
- 項目的背景,包括:是自研還是外包、什么業務、服務的客戶群是誰、誰去運營等問題。
- 項目的業務流程
- 項目的功能模塊
- 項目的技術架構
- 個人工作職責
- 個人負責模塊的詳細說明,包括模塊的設計,所用到的技術,技術的實現方案等。
一個例子:
- 我最近參與的項目是我們公司自研的專門針對成人職業技能教育的網絡課堂系統,網站提供了成人職業技能培訓的相關課程,如:軟件開發培訓、職業資格證書培訓、成人學歷教育培訓等課程。項目基于B2B2C的業務模式,培訓機構可以在平臺入駐、發布課程,我們公司作為運營方由專門的人員對發布的課程進行審核,審核通過后課程才可以發布成功,課程包括免費和收費兩種形式,對于免費課程普通用戶可以直接選課學習,對于收費課程在選課后需要支付成功才可以繼續學習。
- 本項目包括用戶端、機構端、運營端三個端。
- 核心模塊包括:內容管理、媒資管理、課程搜索、訂單支付、選課管理、認證授權等。
- 本項目采用前后端分離架構,后端采用SpringBoot、SpringCloud技術棧開發,數據庫使用了MySQL,還使用的Redis、消息隊列、分布式文件系統、Elasticsearch等中間件系統。
- 劃分的微服務包括:內容管理服務、媒資管理服務、搜索服務、訂單支付服務、 學習中心服務、系統管理服務、認證授權服務、網關服務、注冊中心服務、配置中心服務等。
- 我在這個項目中負責了內容管理、媒資管理、訂單支付模塊的設計與開發。
- 內容管理模塊,是對平臺上的課程進行管理,課程的相關信息比較多這里在數據庫設計了課程基本信息表、課程營銷表、課程計劃、課程師資表進行存儲 ,培訓機構要發布一門課程需要填寫課程基本信息、課程營銷信息、課程計劃信息、課程師資信息,填寫完畢后需要提交審核,由運營人員進行課程信息的審核,整個審核過程是程序自動審核加人工確認的方式,通常24小時審核完成。課程審核通過即可發布課程,課程的相關信息會聚合到課程發布表中,這里不僅要將課程信息寫到課程發布表還要將課程信息寫到索引庫、分布式文件系統中,所以這里存在分布式事務的問題,項目使用本地消息表加任務調度的方式去解決這里的分布式事務,保存數據的最終一致性。
3.環境搭建
3.1 安裝開發工具
項目基于JDK1.8環境開發,使用Mavne構建項目工程,首先安裝開發工具,安裝及配置步驟參考:學成在線項目開發環境配置。
學完第一章要求JDK、IDEA、Maven、Git、MySQL環境安裝完成。
提示:如果虛擬機環境沒有很快安裝成功可先將MySQL數據庫安裝在本機,因為第二章的內容剛開始就要使用MySQL數據庫。
MySQL8下載地址:https://dev.mysql.com/downloads/
3.2 Git環境
3.2.1 拉取代碼
本項目使用Git進行版本控制,在gogs上創建一個個人使用的git倉庫:http://192.168.101.65:10880/xuecheng-plus-group402/xuecheng-plus-project.git
,如果gogs安裝有問題也可自行選擇一個公網的Git倉庫,比如:gitee、github,注冊自己的賬號并創建倉庫。
使用git拉取遠程倉庫。
打開IDEA,從版本控制創建工程。
輸入倉庫地址,并選擇工程路徑。
創建成功:
添加.gitignore
文件,編輯內容如下:
說明:因為是要用git管理,有很多的文件不需要提交到遠程倉庫,所以配置忽略的文件。
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不記錄密碼
3.2.2 創建開發分支
通常不會在主分支進行開發,本項目在dev開發分支進行開發,下邊創建開發分支。
新建一個分支,點擊IDEA右下角的分支標識:
輸入分支名稱:這里演示每天創建一個分支
點擊:Create
創建成功,右下角已經顯示了dev分支
打開Git Log:
可以切換分支:查看每天分支的代碼。
當前只是本地有分支,遠程沒有分支。
下邊將dev分支提交到遠程倉庫:
push成功,查看遠程git倉庫界面顯示了dev分支:
接下來我們就在dev分支進行開發,開發完成后將合并到主分支。
要求:學生在練習每天老師布置的作業前都創建一個新分支進行。
3.3 基礎工程搭建
3.3.1 工程結構關系
學成在線使用 Maven 來進行項目的管理和構建。整個項目分為三大類工程:父工程、基礎工程 和 微服務工程。
每一種類的工程都有不同的作用,下面是對其功能進行說明:
-
父工程
- 對依賴包的版本進行管理
- 本身為Pom工程,對子工程進行聚合管理
-
基礎工程
- 繼承父類工程
- 提供基礎類庫
- 提供工具類庫
-
微服務工程
- 分別從業務、技術方面劃分模塊,每個模塊構建為一個微服務。
- 每個微服務工程依賴基礎工程,間接繼承父工程。
- 包括:內容管理服務、媒資管理服務、搜索服務、訂單支付服務等。
3.3.2 構建父工程
父工程的職責是對依賴包的版本進行管理,本小節創建父工程分兩步,第一創建父工程,第二在pom.xml編輯依賴管理。
1、首先創建父工程
為了對代碼更好的進行權限管理,這里我們單獨創建父工程。
使用idea打開工程目錄,進入工程結構界面。
點擊File–>Project Structure:
進入Project Structure,首先檢查jdk是否配置正確,并進行配置。
進入Modules界面,新建模塊
進入新建模塊界面,選擇Spring Initializr,填寫模塊的信息。xuecheng-plus-parent
注意:這里Server URL默認是start.spring.io,如果連接不上可換為start.aliyun.com。
創建成功,刪除多余文件
選擇要刪除的文件,進行刪除
刪除成功
到此父工程創建完成。
2、依賴管理定義
下邊開始編輯xuecheng-plus-parent父工程的依賴管理 。
父工程中沒有代碼,不用去依賴其它的包,它的作用是限定其它子工程依賴包的版本號,即在dependencyManagement 中去編輯即可。
1)確定父工程為一個pom工程,在pom.xml中添加如下內容:
<packaging>pom</packaging>
2)編輯依賴的包的版本號、打包插件等。
pom.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><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>
3.3.3 構建基礎工程
基礎工程的職責是提供一些系統架構所需要的基礎類庫以及一此工具類庫。
1、首先創建基礎工程xuecheng-plus-base。
創建的過程同父工程的創建過程,如下圖:
刪除多余的文件
這里需要注意的是xuecheng-plus-base的父工程為xuecheng-plus-parent,xuecheng-plus-base的pom.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><groupId>com.xuecheng</groupId><artifactId>xuecheng-plus-parent</artifactId><version>0.0.1-SNAPSHOT</version><!--因為這2個項目是平級關系的方式創建的,所以可以使用此標簽找到父項目pom文件--><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。
最后push到遠程倉庫
3.3.4 面試-Git相關問題
1、Git代碼沖突怎么處理?
我們在使用Git時難免會出現代碼沖突的問題,出現沖突的原因是因為當本地文件的版本與目標分支中文件的版本不一致時當存在同一行的內容不同時在進行合并時會出現沖突。
代碼沖突—般發生在以下情況:
-
多個分支向主分支合并時
-
同一個分支下pull或push操作時。
發生了沖突需要手動合并代碼,選擇最終的版本,可以通過圖形界面,如下:
點擊Merge
選擇版本后,點擊Apply,提交代碼并push到遠程倉庫。
不通過圖形化界面處理沖突,當出現沖突后在代碼中自動添加了版本標識,如下:
手動修改代碼如下:
將文件添加到暫存區,提交文件,push到遠程倉庫即可。
2、你是在哪個分支開發?
我們不是直接在主分支開發,由技術經理創建獨立的開發分支,我們是在獨立的開發分支中進行開發,最后由技術經理將開發分支合并到主分支。
3.3.5 面試-Maven相關問題
maven的常用命令
- mvn clean //清除target目錄中的生成結果
- mvn compile //編譯源代碼
- mvn test //執行單元測試
- mvn package //打包
- mvn install //打包并把打好的包上傳到本地倉庫
- mvn deploy //打包并把打好的包上傳到遠程倉庫
maven依賴版本沖突怎么處理?
maven依賴版本沖突一般是由于間接依賴導致一個jar包即有多個不同的版本,比如:A依賴了B的1.0版本,C依賴了B的2.0版本,項目依賴A和C從而間接依賴了B的1.0和2.0版本,此時B有兩個版本引入到了項目中,當存在版本沖突時可能會出現ClassNotFoundException、NoSuchMethodError等錯誤。
處理版本沖突可以使用以下方法:
- 使用exclusions排除依賴
- 比如:我們只依賴B的1.0版本,此時可以在依賴C時排除對B的依賴。
- 使用dependencyManagement鎖定版本號。
- 通常在父工程對依賴的版本統—管理。
- 比如:我們只依賴B的1.0版本,此時可以在父工程中限定B的版本為1.0。
3.4 導入內容管理模塊數據庫
- 創建數據庫:xc402_content
- 導入
內容管理模塊
的sql腳本
3.5 面試-MySql存儲引擎及區別
一、InnoDB
- 支持事務。
- 使用的鎖粒度默認為行級鎖,可以支持更高的并發;也支持表鎖。
- 支持外鍵約束;外鍵約束其實降低了表的查詢速度,增加了表之間的耦合度。
二、MyISAM
- 不提供事務支持
- 只支持表級鎖
- 不支持外鍵
三、memory
- 數據存儲在內存中
總結:
- MyISAM管理非事務表,提供高速存儲和檢索以及全文搜索能力,如果在應用中執行大量select操作,應該選擇MyISAM
- lnnoDB用于事務處理,具有ACID事務支持等特性,如果在應用中執行大量insert和update操作,應該選擇lnnoDB
3.6 面試-MySql建表注意哪些
MySQL建表的經驗有很多,下邊列舉—些:
- 注意選擇存儲引擎,如果要支持事務需要選擇InnoDB。
- 注意字段類型的選擇,對于日期類型如果要記錄時分秒建議使用datetime,只記錄年月日使用date類型,對于字符類型的選擇,固定長度字段選擇char,不固定長度的字段選擇varchar,varchar比char節省空間但速度沒有char快;對于內容介紹類的長廣文本字段使用text或longtext類型;如果存儲圖片等二進制數據使用blob或
longblob類型;對金額字段建議使用DECIMAL;對于數值類型的字段在確保取值范圍足夠的前提下盡量使用占用空間較小的類型. - 主鍵字段建議使用自然主鍵,不要有業務意義,建議使用int unsigned類型,特殊場景使用bigint類型。
- 如果要存儲text、blob字段建議單獨建—張表,使用外鍵關聯。
- 盡量不要定義外鍵,保證表的獨立性,可以存在外鍵意義的字段。
- 設置字段默認值,比如:狀態、創建時間等。
- 每個字段寫清楚注釋。
- 注意字段的約束,比如:非空、唯一、主鍵等。