基於微服務架構開發在線教育網站


  • 項目介紹

本項目采用前后端分離開發,其中

后端技術棧

SpringBoot作為快速開發框架;

SpringCloud作為微服務架構框架;

Nacos-服務發現、分布式配置;

Feign-服務調用;

Hystrx-熔斷器;

GateWay-服務網關;

Redis作為非關系型數據庫為短信驗證碼、主頁數據緩存等提供數據存儲;

MyBatis-Plus作為持久層框架。

前端技術棧

Vue作為前端開發框架;

Element-ui作為后台管理系統模板框架;

nodejs作為JavaScript運行環境;

Echars作為數據圖表工具。

第三方技術

阿里雲OSS作為對象存儲服務;

阿里雲視頻點播服務;

阿里雲短信服務;

EsayExcel作為讀取Excel工具;

  • 數據庫

 

  •  微服務架構

  • 功能點分析

 

后台管理系統

登錄界面和權限管理:登錄采用SpringSecurity,對用戶進行權限管理,過程是首先通過SpringSecurity的攔截器TokenLoginFilter將登錄信息攔截,調用實現類查出用戶信息,對調用配置類密碼進行處理,比對成功調用登錄成功方法,並向前端返回一個token,比對失敗調用失敗方法返回失敗信息。

 

講師管理

主要有講師列表和添加講師

講師列表主要是遍歷講師表,將數據庫信息發送給前端,這里頭銜列在數據庫中使用的是0和1來代表高級講師和首席講師,而在前端使用三元運算來實現頭銜的顯示,同時這里也提供了根據講師名稱以及時間段的查詢功能;

添加講師中主要是講師頭像,這里使用的是阿里雲的OSS(對象存儲)來存儲講師頭像可以從eacher表中看到avatar字段中存儲的是頭像的地址,這里上傳頭像會調用后端的oss服務,這個服務就是上傳頭像或者文件的,在這個服務中設置AccessKey、accessKeySecret、endpoint以及bucketName就可以連接上你的阿里雲OSS,同時也可以設置所存儲的文件夾,具體業務細節可以參考阿里雲OSS的SDK。

課程分類

課程分類這里課程采用的是一級分類和二級分類的划分模式,一級分類的id是二級分類的pid,以這樣的形式來關聯兩種分類的關系。

導入課程分類這里使用了EsayExcel,首先從前端讀取file文件,調用EasyExcel的read方法向里面傳入文件輸入流InputStream,所需要讀取的實體類的class對象以及監聽器SubjectExcelistener,具體的監聽器實現流程可以參考EasyExcel官方文檔。

 課程管理

發布課程,首先是課程的基本信息的存入,然后是課程的大綱和小節的存儲,這里存儲課程小節時需要將本節的課程視頻上傳到阿里雲的視頻點播服務中,這里同樣是將前端傳回的文件流進行處理,這里使用的是vod模塊微服務,與講師頭像上傳類似,具體可以參考阿里雲視頻點播的SDK,最后是課程的發布,這里是對課程狀態的改變。

課程列表,這里提供了查詢功能以及對課程的編輯和刪除功能。

 

統計分析

這里采用了微服務之間的調用,因為這個模塊需要對不同的微服務中的數據進行統計,所以將這個模塊單獨創建為一個微服務來對其他微服務進行調用,這里調用的方法采用了Feign,使用方法為,首先先需要調用的服務中創建一個接口,在接口上加上@FeignClient("服務的name")(name 可以在Nacos中看到,同時也要保證調用的服務於被調用的服務都要在Nacos中注冊)將需要調用的方法復制過來,其中請求地址需要加上controller類的地址,為調用端的啟動類上添加@EnableFeignClients注解,這樣就可以調用其他微服務中的方法了。統計分析模塊就是讓其他模塊為其提供所需要的數據,然后由statistics這個微服務處理。而前端是圖表則采用了Echars這個工具來實現圖表的顯示。

前端網站

 主頁

輪播圖采用獨立的微服務,來實現輪播圖。前端使用swiper組件來實現。

熱門課程根據課程發布時間,將前八個課程展示在主頁;

名師根據課程發布時間,將前四位名師展示先主頁。

 

課程界面

主要用於顯示課程以及根據課程分類來查找所需的課程。

 

課程詳情界面

主要有課程的詳細信息,以及購買鏈接,這里采用微信支付的方式。同時本頁面也支持評論功能,可以在登錄后對課程進行評論。

 

講師界面

主要是顯示全部講師

講師詳情界面

主要顯示講師的詳細信息以及講師所講的課程

登錄、注冊界面

注冊采用了通過短信驗證的方式實現注冊

通過短信驗證的方式,這里使用到了阿里的短信服務,短信服務使用獨立的微服務模塊,其中主要的實現流程為,首先我們通過前端獲取到注冊者的手機號,需要從Redis中查詢在過去五分鍾內是否已經發送過驗證碼,如果沒有,我們在本地生成一個驗證碼然后發送到阿里雲的短信服務,這里同樣與OSS和視頻點播服務一樣需要regionId等,具體的實現流程可以參考阿里雲短信服務的SDK,當用戶收到短信后,將驗證碼輸入后,數據完整的傳入后端會通過Redis獲取驗證碼,與注冊者的驗證碼進行比對,如果相同將注冊成功。

登錄采用了手機號密碼的方式和微信登錄的方式來實現登錄

 

通過微信登錄的方式,這里首先要生成一個登錄的二維碼,通過訪問微信提供的一個固定的地址來獲取二維碼地址,掃碼后,微信會向后端接口返回一個code(臨時票據),通過這個code去訪問微信的一個固定地址,得到一個access_token(訪問憑證)和openid(微信唯一標識),然后再通過這兩個去訪問微信的一個固定地址來獲取用戶信息。獲取完后會將信息放入ucenter(用戶表)中,同時通過jwt工具生成一個token返回給前端。

通過手機號密碼的方式,首先從前端獲取到用戶的手機號和密碼,這里需要先對手機號密碼進行非空判斷,當然也可以進行異常處理,驗證成功后通過jwt工具生成一個token返回給前端。

 

  • 總結

 本項目在編寫中所遇到的問題

后端

跨域問題,在項目之初使用@CrossOrigin注解解決,之后結合前端使用nginx實現反向代理,前端只需訪問一個地址就可以訪問到所有微服務,在項目最后通過gateway網關來實現;

實體類注解偶爾失效例如:@TableField(fill = FieldFill.INSERT),解決辦法Maven去clear或install一下;

服務端口號偶爾會被其他程序占用,在任務管理器中找到結束進程,或者直接重啟電腦;

有時寫mapper可能會用xml寫一些復雜的sql,但在啟動后找不到mapper,在配置文件中加上xml文件的路徑,例如mybatis-plus.mapper-locations=classpath:com/atguigu/eduservice/mapper/xml/*.xml

當取url中傳的值時最好加上@PathVariable注解,在取實體類參數是加上@RequestBody注解,本項目后端返回的值為JSON格式的所以在controller上也要加上@RestController注解。

前端

在向cookie傳值是需要將值轉換成JSON格式,在取值時要將值再轉換回來;

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM