分布式電商系統項目總結


概述:

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

在前台系統中主要分為:客戶端:系統前台頁面顯示系統(portal,8082)。服務端系統:(1)rest系統(8081):負責調用CMS系統的內容,將CMS系統的內容顯示到頁面,(這里的CMS內容管理系統,在后台實現)。(2)商品的搜索系統(8083),當在頁面輸入商品信息時,可以搜索商品。這里用到了solr技術,利用solr索引庫來實現。(3)SSO(單點登陸系統,8084),因為商城采用分布式的系統部署,將整個系統划分為幾個子系統,所以對於用戶的訪問權限是一個問題,如何實現一次登陸即其他系統都可以免登陸,sso可以解決。(4)訂單系統(8085):商城購物少不了訂單系統,所以將此作為一個獨立工程編寫。

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

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

步驟分析:

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

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

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

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

三、具體實現:

1、框架的搭建:

       這里采用maven來管理整個項目。優勢兩點:1、maven可以以管理整個項目工程,方便熱部署項目,項目發布方便。2、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文件。

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

(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類。

 


免責聲明!

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



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