分佈式電商系統項目總結

概述:前端

淘淘商城是採用分佈式架構部署的一個大型網上商城系統,相似於京東商城。本系統分前臺系統和後臺系統。前臺系統主要負責商城的頁面的顯示功能,這裏採用的面向服務的方式,pc端手機端只負責顯示頁面,業務邏輯都在服務層實現,客戶端調用服務端接口來實現顯示功能。java

在前臺系統中主要分爲:客戶端:系統前臺頁面顯示系統(portal,8082)。服務端系統:(1)rest系統(8081):負責調用CMS系統的內容,將CMS系統的內容顯示到頁面,(這裏的CMS內容管理系統,在後臺實現)。(2)商品的搜索系統(8083),當在頁面輸入商品信息時,能夠搜索商品。這裏用到了solr技術,利用solr索引庫來實現。(3)SSO(單點登錄系統,8084),由於商城採用分佈式的系統部署,將整個系統劃分爲幾個子系統,因此對於用戶的訪問權限是一個問題,如何實現一次登錄即其餘系統均可以避免登錄,sso能夠解決。(4)訂單系統(8085):商城購物少不了訂單系統,因此將此做爲一個獨立工程編寫。linux

後臺系統功能:商城的後臺系統主要是負責商品的分類,添加、規格參數。CMS系統(這裏主要是廣告的分類、添加)。redis

本系統前臺界面設計採用的easyUI的設計,後臺採用springMVC、spring、mybatis框架,擦用java語言編程。spring

步驟分析:數據庫

1、項目需求分析:模仿京東商城系統。編程

2、項目數據庫設計:商品信息表、商品信息分類表、商品信息描述表、商品規格參數表、json

CMS系統內容表、CMS系統內容分類表api

用戶表、訂單表、訂單的具體明細表跨域

3、具體實現:

一、框架的搭建:

       這裏採用maven來管理整個項目。優點兩點:一、maven能夠以管理整個項目工程,方便熱部署項目,項目發佈方便。二、maven管理你jar包具備很大的優點,能夠自動下載所需的jar包,只需定義好版本便可,其餘maven自動下載。

由於這個項目比較大,子工程比較多,因此咱們創建一個pom類型(聚合工程)parent來管理裏全部jar包的版本,這樣其餘 子工程都依賴此工程。版本獲得了統一,不會出現因版本問題致使的錯誤。其次創建一個專門的(jar類型)common工具類,能夠將系統中使用到的工具類都加入此類,其餘類也依賴此類,就可使用這裏面的工具了。此工具類也依賴parent類。

下面就是利用SSM框架來搭建工程了:利用框架搭建工程主要分兩步:框架所依賴的jar包,框架的配置文件。弄清了這兩點就好辦了。框架主要分三層:dao層(mybatis)(主要是與數據庫打交道)、service層(spring)(主要是負責調用dao層,實現業務邏輯的編寫)、controller層(springMVC)(這裏主要調用service層,根據jsp頁面的內容,將jsp的內容傳遞到service層,而後講數據顯示到jsp頁面)。因此這裏的配置文件也就:mybatis的SqlMapConfig.xml (主要是它的插件配置,數據庫配置放在dao)。spring將mybatis和springMVC整合起來的application_context_dao.xml(配置數據源,與數據庫的鏈接),application_context_service.xml(將service的文件包引入工程)。application_context_transation.xml(這裏將事務獨立出來,主要是事務的配置)

SpringMVC.xml(主要是前端控制器,試圖解析器的配置)

框架搭建完成後,利用mybatis的逆向工程生成各個表的mapper.xml和mapper.java文件、pojo文件。

二、具體的功能的實現邏輯

(1)後臺系統功能實現

(這裏主要講商品的查詢、添加、規格參數、CMS系統的分類、添加)

其實對於功能模塊的分析主要有三點:

從哪一個數據表獲取(主要mapper實現);頁面傳遞是否有參數,頁面的url是什麼(controller實現);返回值是什麼(即頁面展現的格式是什麼樣子的,這個根據jsp使用的框架來決定,好比這裏的easyUI,能夠查詢它的api文檔,找到其返回值類型);

A、商品的查詢邏輯分析:其實對於商品的查詢主要就是從數據庫中將全部商品查詢出來。這簡單的查詢很簡單,但是在頁面分頁顯示出來這就是一個問題了。這裏到了mybatis的分頁插件pageHelper來實現。

傳入參數:Easyui頁面默認有page、rows參數傳遞。

返回值:easyui的格式即datagrid的格式,專門編寫一個對應的pojo類放入專門工具類中使用,返回格式即這個pojo。

邏輯:Dao層:Dao層用mybatis的逆向工程

Service調用mapper的查詢和分頁實現邏輯。

Controller即將參數傳遞過去,url寫好

B、商品添加:商品添加即將商品信息寫入數據庫,頁面傳遞的內容當點擊提交按鈕時直接寫入數據庫,只需補全沒有的字段便可。

這裏涉及到商品的類目選擇、上面的圖片上傳、商品的描述信息。

類目選擇首先得將類目展現出來,這裏使用的異步樹的格式。查詢api發現異步樹的返回值的格式。主要思路是:根據parentId來查詢類目表,默認從0開始,異步樹有個特色,就是每次獲取到的id,若是有子節點,會發送url再次請求,若是沒有子節點則不發送請求,因此能夠都遍歷到全部節點。(這個是tree的特色,自動請求)

異步樹的特色:從最頂層開始讀取,先讀頂層節點,若是是閉合狀態,發送請求給服務器讀取子節點,子節點的狀態依賴於父節點,當展開一個封閉的節點時,若是節點沒有加載子節點,它將會把節點的id的值做爲http請求參數並命名爲id,經過url發送到服務器上檢索子節點。因此遍歷一次後,若是父節點仍是父節點(即存在子節點)則檢索下面的子節點的內容,將子節點的id做爲parentId來檢索下面的節點。若是不是父節點了,則打開下面列表。也就是說這些實現都是 異步樹自動實現的,咱們只須要判斷父節點的狀態便可,下面的檢索根據這個狀態進行。

圖片上傳功能:由於商城的圖片很是多,因此咱們將這麼多的圖片保存在圖片服務器中,而後將圖片在服務器中的具體url寫入數據庫,供前臺調用。前臺獲取到這個url既可獲取到這個圖片。這裏圖片上傳到服務器的功能:先生存圖片的名稱,而後生成圖片保存的格式,而後利用ftpUtil將圖片上傳到服務器,返回一個url連接。

商品規格參數,這裏採用的規格參數模板的形式。:

這裏有兩個表:一個模板表(根據商品的分類創建的模板,根據分類id),一個展現模板表(根據商品的信息寫入模板表,根據商品id查詢商品信息,而後寫入對應訂單模板中,而後生成HTML)。

商品的描述:這裏採用文本的形式存儲的,寫入便可。富文本編輯器。

CMS分類:這裏的格式也是用了異步樹的格式,因此顯示方法是同樣的。

分類添加:像表中插入數據庫便可。

(2)前臺功能實現

首頁大廣告位的實現:這裏是從CMS系統中獲取廣告位的圖片,而後展現在頁面。可是前臺跟後臺是不同的端口,如何從前臺訪問後臺呢,可使用jsonp的形式。可是咱們這裏系統是採用面向服務的編程,因此採用rest接口的方式而後功能前臺調用,這裏用的httpcliet來調用接口。

商品搜索功能的實現:

首先在linux下部署好solr服務器,而後將數據庫的表字段導入到solr索引庫。而後編寫search服務接口,而後供前臺調用這個服務接口。

Rest功能:

商品詳情頁面展現:寫三個服務:根據id查詢商品的具體信息顯示到頁面,根據id查詢商品的內容表,根據id查詢商品的規格參數,即將三個信息展現到頁面。而後前臺分別調用。

SSO系統:這裏涉及到攔截器。

       這裏是利用了sso的接口文檔,即校驗接口、註冊、登陸接口、根據token查詢用戶接口、安全退出接口。

   這個的調用服務層是利用jsonp的形式訪問的服務接口,實現跨域訪問。客戶端所有在jsp頁面實現的。

具體流程:

     當用戶點擊註冊的時候,跳轉到註冊頁面,即用戶信息的保存功能。檢驗用戶名是否存在、手機號和郵箱不能爲空。

       當用戶點擊登陸按鈕的時候,用戶輸入用戶名和密碼,檢驗用戶名是否在數據庫中存在,而後用戶名密碼是否正確。這裏的密碼是用了spring的MD5加密技術。當所有成功後,給用戶頒發一個token令牌(利用uuid實現),而後將token存入到redis中(token的key是它生成的號,值是用戶的名字),而後設置在redis的過時時間。這至關於用戶的session。

   而後將token寫入cookie中,前臺頁面利用jsonp調用,根據cookie中的token的值,調用sso的根據token查詢用戶的服務,查看用戶是否有效,若是有效則將用戶返回前臺頁面,前臺頁面獲取用戶的用戶名顯示在首頁,表示***已登錄。

   這裏的cookie是設置了共享域,即所有子系統均可以訪問到cookie。

當用戶登陸其餘子系統時,先從從cookie中獲取token信息,根據token信息獲取用戶信息,判斷用戶信息是否有效,若是有效則放行,若是無效,則利用攔截器攔截跳轉到登陸頁面。用戶再次登陸的時候刷新redis的時間,從新設置有效期。

攔截器的攔截,在springMVC.xml中設置攔截的名稱。

購物車功能:

購物車功能注意到這裏商品加入購物車,是將購物車保存在cookie中。這裏用到cookieUtil工具來實現這些保存刪除功能。在商品詳情頁面點擊「加入購物車」按鈕提交一個請求吧商品id傳遞給Controller,Controller接收id,Controller調用Service根據商品id查詢商品基本信息,購物車的商品專門寫一個pojo對象,由於商品的不少信息購物車裏面用不到。將購物車的商品的pojo,把商品寫入cookie中,加入cookie以前先從cookie中把購物車的商品取出來判斷當前購物車商品列表中是否有此商品,若是有數量加一,若是沒有添加一個商品,數量爲1。展現給用戶購物車列表。

 

訂單系統:訂單系統主要是訂單的建立、查詢、修改、刪除功能。

訂單系統由於pc端和移動端都須要調用此功能模塊,因此將訂單系統也單獨做爲一個服務接口供客戶端調用。

訂單服務接口也有接口文檔,根據文檔進行訂單的建立。

訂單的建立須要用戶登陸,這裏用到了攔截器在springMVC中配置下攔截方式便可。

當用戶攔截成功後,用戶登陸該商城,這時候注意將用戶保存在request中,目的是由於查詢訂單的時候須要根據用戶的id來查詢,不一樣的用戶具備不一樣的訂單啊。

而後用request的get和setAttribute來獲取值和設定值。爲何能夠從request中取,由於咱們整個商城都是http協議訪問的。

(1)訂單建立邏輯:

當點擊去去購物車結算時,顯示購物車的列表,當選中購物車的商品點擊去結算的時候,顯示商品的提交訂單以前的一系列信息(也就是結算頁):針對數據庫三張表:訂單基本信息表、訂單明細表(購買的商品信息)、訂單配送(收貨人的地址電話信息)

傳入參數:由於建立訂單也就是向數據庫中插入一系列的信息,而對應的是數據庫中的三個表,因此根據頁面的內容,傳入的參數也就是三個pojo類,而後頁面填寫的+補全頁面上在數據庫中沒有的字段。因此主要是對數據庫中的三個表進行插入操做。服務接口是負責接收這三個pojo類,因此客戶端要想辦法將這三個pojo類傳遞過來。

根據接口文檔,返回的是一個json格式的數據,即這三張表的數據是在一個json串中,因此這裏要想辦法將這三個表單獨創建一個pojo來保存這個返回值。

接收的pojo類:

這裏採用了這種方式巧妙的將三個表合併起來了。

接下來就是數據的插入操做了,這個在service層實現:逐個表的插入數據庫便可,而後返回一個訂單號即訂單的id。

controller層傳遞的就是這個pojo類,而後返回給客戶端。

客戶端也是將這個pojo類傳遞給服務接口,返回一個訂單號給客戶端。提交訂單的時候顯示訂單提交成功頁面時候,看下jsp頁面顯示哪些字段,而後用model傳遞給頁面。

(2)訂單的分頁查詢:

前面咱們將用戶保存在了request中,而後獲取到用戶的id,根據用戶的id來查詢訂單,前臺頁面默認傳遞page和rows,利用mybatis的分頁查詢來查詢訂單便可。

傳入參數:page和rows

執行操做:根據用戶id查詢訂單,根據page和rows分頁

返回值:訂單的列表信息,即用戶的多個訂單信息。根據接口文檔,咱們發現這個返回的信息就是數據中訂單表的部分信息,因此用幾個字段組成一個新的pojo來接收返回值。

 

(3)根據訂單id查詢訂單:

根據訂單id查詢訂單這個顯示的信息就比較全面了,這個返回值跟以前的三個數據庫的表對應,因此根據id,分別查詢這三個表,來獲取對應的信息。

傳入參數:訂單id

操做:三個表分別查詢

返回值:以前新定義的三個表的Order的pojo類。

相關文章
相關標籤/搜索