1. 程式人生 > >淘淘商城分散式電商系統專案總結

淘淘商城分散式電商系統專案總結

淘淘商城是採用分散式架構部署的一個大型網上商城系統,類似於京東商城。本系統分前臺系統和後臺系統。前臺系統主要負責商城的頁面的顯示功能,這裡採用的面向服務的方式,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系統的分類、新增)

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

從哪個資料表獲取(主要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)。

商品的描述:這裡採用文字的形式儲存的,寫入即可。富文字編輯器。

(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。展示給使用者購物車列表。