商城是采用分布式架構(gòu)部署的一個大型網(wǎng)上商城系統(tǒng),類似于京東商城。本系統(tǒng)分前臺系統(tǒng)和后臺系統(tǒng)。前臺系統(tǒng)主要負責商城的頁面的顯示功能,這里獨立商城網(wǎng)站建設采用的面向服務的方式,pc端手機端只負責顯示頁面,業(yè)務邏輯都在服務層實現(xiàn),客戶端調(diào)用服務端接口來實現(xiàn)顯示功能。
在前臺網(wǎng)上商城系統(tǒng)中主要分為:客戶端:系統(tǒng)前臺頁面顯示系統(tǒng)(portal,8082)。
服務端系統(tǒng):
(1)rest系統(tǒng)(8081):負責調(diào)用CMS系統(tǒng)的內(nèi)容,將CMS系統(tǒng)的內(nèi)容顯示到頁面,(這里的CMS內(nèi)容管理系統(tǒng),在后臺實現(xiàn))。
(2)商品的搜索系統(tǒng)(8083),當在頁面輸入商品信息時,可以搜索商品。這里用到了solr技術,利用solr索引庫來實現(xiàn)。
(3)SSO(單點登陸系統(tǒng),8084),因為商城采用分布式的系統(tǒng)部署,將整個系統(tǒng)劃分為幾個子系統(tǒng),所以對于用戶的訪問權(quán)限是一個問題,如何實現(xiàn)一次登陸即其他系統(tǒng)都可以免登陸,sso可以解決。
(4)訂單系統(tǒng)(8085):商城購物少不了訂單系統(tǒng),所以將此作為一個獨立工程編寫。
后臺系統(tǒng)功能:商城的后臺系統(tǒng)主要是負責商品的分類,添加、規(guī)格參數(shù)。CMS系統(tǒng)(這里主要是廣告的分類、添加)。
本系統(tǒng)前臺界面設計采用的easyUI的設計,后臺采用springMVC、spring、mybatis框架,擦用java語言編程。
步驟分析:
1、項目需求分析:模仿京東商城系統(tǒng)。
2、項目數(shù)據(jù)庫設計:商品信息表、商品信息分類表、商品信息描述表、商品規(guī)格參數(shù)表。
3、CMS系統(tǒng)內(nèi)容表、CMS系統(tǒng)內(nèi)容分類表。
4、用戶表、訂單表、訂單的具體明細表。
具體實現(xiàn):
1、框架的搭建:
這里采用maven來管理整個項目。
優(yōu)勢兩點:
1、maven可以以管理整個項目工程,方便熱部署項目,項目發(fā)布方便。
2、maven管理你jar包具有很大的優(yōu)勢,可以自動下載所需的jar包,只需定義好版本即可,其他maven自動下載。
因為這個項目比較大,子工程比較多,所以我們建立一個pom類型(聚合工程)parent來管理里所有jar包的版本,這樣其他 子工程都依賴此工程。版本得到了統(tǒng)一,不會出現(xiàn)因版本問題導致的錯誤。其次建立一個專門的(jar類型)common工具類,可以將系統(tǒng)中使用到的工具類都加入此類,其他類也依賴此類,就可以使用這里面的工具了。此工具類也依賴parent類。
下面就是利用SSM框架來搭建工程了:利用框架搭建工程主要分兩步:框架所依賴的jar包,框架的配置文件。弄清了這兩點就好辦了。
框架主要分三層:
dao層(mybatis)(主要是與數(shù)據(jù)庫打交道)、service層(spring)(主要是負責調(diào)用dao層,實現(xiàn)業(yè)務邏輯的編寫)、controller層(springMVC)(這里主要調(diào)用service層,根據(jù)jsp頁面的內(nèi)容,將jsp的內(nèi)容傳遞到service層,然后講數(shù)據(jù)顯示到jsp頁面)。
所以這里的配置文件也就:mybatis的SqlMapConfig.xml (主要是它的插件配置,數(shù)據(jù)庫配置放在dao)。spring將mybatis和springMVC整合起來的application_context_dao.xml(配置數(shù)據(jù)源,與數(shù)據(jù)庫的連接),application_context_service.xml(將service的文件包引入工程)。application_context_transation.xml(這里將事務獨立出來,主要是事務的配置)
SpringMVC.xml(主要是前端控制器,試圖解析器的配置)
框架搭建完成后,利用mybatis的逆向工程生成各個表的mapper.xml和mapper.java文件、pojo文件。
2、具體的功能的實現(xiàn)邏輯
(1)后臺系統(tǒng)功能實現(xiàn)
(這里主要講商品的查詢、添加、規(guī)格參數(shù)、CMS系統(tǒng)的分類、添加)
其實對于功能模塊的分析主要有三點:
從哪個數(shù)據(jù)表獲?。ㄖ饕猰apper實現(xiàn));頁面?zhèn)鬟f是否有參數(shù),頁面的url是什么(controller實現(xiàn));返回值是什么(即頁面展示的格式是什么樣子的,這個根據(jù)jsp使用的框架來決定,比如這里的easyUI,可以查詢它的api文檔,找到其返回值類型);
A、商品的查詢邏輯分析:其實對于商品的查詢主要就是從數(shù)據(jù)庫中將所有商品查詢出來。這簡單的查詢很簡單,可是在頁面分頁顯示出來這就是一個問題了。這里到了mybatis的分頁插件pageHelper來實現(xiàn)。
1、傳入?yún)?shù):Easyui頁面默認有page、rows參數(shù)傳遞。
2、返回值:easyui的格式即datagrid的格式,專門編寫一個對應的pojo類放入專門工具類中使用,返回格式即這個pojo。
3、邏輯:Dao層:Dao層用mybatis的逆向工程
4、Service調(diào)用mapper的查詢和分頁實現(xiàn)邏輯。
5、Controller即將參數(shù)傳遞過去,url寫好
B、商品添加:商品添加即將商品信息寫入數(shù)據(jù)庫,頁面?zhèn)鬟f的內(nèi)容當點擊提交按鈕時直接寫入數(shù)據(jù)庫,只需補全沒有的字段即可。
這里涉及到商品的類目選擇、上面的圖片上傳、商品的描述信息。
類目選擇首先得將類目展示出來,這里使用的異步樹的格式。查詢api發(fā)現(xiàn)異步樹的返回值的格式。主要思路是:根據(jù)parentId來查詢類目表,默認從0開始,異步樹有個特點,就是每次獲取到的id,如果有子節(jié)點,會發(fā)送url再次請求,如果沒有子節(jié)點則不發(fā)送請求,所以可以都遍歷到所有節(jié)點。(這個是tree的特點,自動請求)
1、異步樹的特點:從最頂層開始讀取,先讀頂層節(jié)點,如果是閉合狀態(tài),發(fā)送請求給服務器讀取子節(jié)點,子節(jié)點的狀態(tài)依賴于父節(jié)點,當展開一個封閉的節(jié)點時,如果節(jié)點沒有加載子節(jié)點,它將會把節(jié)點的id的值作為http請求參數(shù)并命名為id,通過url發(fā)送到服務器上檢索子節(jié)點。所以遍歷一次后,如果父節(jié)點還是父節(jié)點(即存在子節(jié)點)則檢索下面的子節(jié)點的內(nèi)容,將子節(jié)點的id作為parentId來檢索下面的節(jié)點。如果不是父節(jié)點了,則打開下面列表。也就是說這些實現(xiàn)都是 異步樹自動實現(xiàn)的,我們只需要判斷父節(jié)點的狀態(tài)即可,下面的檢索根據(jù)這個狀態(tài)進行。
2、圖片上傳功能:因為商城的圖片非常多,所以我們將這么多的圖片保存在圖片服務器中,然后將圖片在服務器中的具體url寫入數(shù)據(jù)庫,供前臺調(diào)用。前臺獲取到這個url既可獲取到這個圖片。這里圖片上傳到服務器的功能:先生存圖片的名稱,然后生成圖片保存的格式,然后利用ftpUtil將圖片上傳到服務器,返回一個url鏈接。
3、商品規(guī)格參數(shù),這里采用的規(guī)格參數(shù)模板的形式:
(1)這里有兩個表:
一個模板表(根據(jù)商品的分類建立的模板,根據(jù)分類id),一個展示模板表(根據(jù)商品的信息寫入模板表,根據(jù)商品id查詢商品信息,然后寫入對應訂單模板中,然后生成HTML)。
1、商品的描述:這里采用文本的形式存儲的,寫入即可。富文本編輯器。
2、CMS分類:這里的格式也是用了異步樹的格式,所以顯示方法是一樣的。
3、分類添加:像表中插入數(shù)據(jù)庫即可。
(2)前臺功能實現(xiàn)
首頁大廣告位的實現(xiàn):這里是從CMS系統(tǒng)中獲取廣告位的圖片,然后展示在頁面。但是前臺跟后臺是不一樣的端口,如何從前臺訪問后臺呢,可以使用jsonp的形式。但是我們這里系統(tǒng)是采用面向服務的編程,所以采用rest接口的方式然后功能前臺調(diào)用,這里用的httpcliet來調(diào)用接口。
(3)商品搜索功能的實現(xiàn):
首先在linux下部署好solr服務器,然后將數(shù)據(jù)庫的表字段導入到solr索引庫。然后編寫search服務接口,然后供前臺調(diào)用這個服務接口。
1、Rest功能:
商品詳情頁面展示:寫三個服務:根據(jù)id查詢商品的具體信息顯示到頁面,根據(jù)id查詢商品的內(nèi)容表,根據(jù)id查詢商品的規(guī)格參數(shù),即將三個信息展示到頁面。然后前臺分別調(diào)用。
2、SSO系統(tǒng):這里涉及到攔截器:
這里是利用了sso的接口文檔,即校驗接口、注冊、登錄接口、根據(jù)token查詢用戶接口、安全退出接口。這個的調(diào)用服務層是利用jsonp的形式訪問的服務接口,實現(xiàn)跨域訪問。客戶端全部在jsp頁面實現(xiàn)的。
3、具體流程:
當用戶點擊注冊的時候,跳轉(zhuǎn)到注冊頁面,即用戶信息的保存功能。檢驗用戶名是否存在、手機號和郵箱不能為空。
當用戶點擊登錄按鈕的時候,用戶輸入用戶名和密碼,檢驗用戶名是否在數(shù)據(jù)庫中存在,然后用戶名密碼是否正確。這里的密碼是用了spring的MD5加密技術。當全部成功后,給用戶頒發(fā)一個token令牌(利用uuid實現(xiàn)),然后將token存入到redis中(token的key是它生成的號,值是用戶的名字),然后設置在redis的過期時間。這相當于用戶的session。
然后將token寫入cookie中,前臺頁面利用jsonp調(diào)用,根據(jù)cookie中的token的值,調(diào)用sso的根據(jù)token查詢用戶的服務,查看用戶是否有效,如果有效則將用戶返回前臺頁面,前臺頁面獲取用戶的用戶名顯示在首頁,表示***已登陸。
這里的cookie是設置了共享域,即全部子系統(tǒng)都可以訪問到cookie。
當用戶登錄其他子系統(tǒng)時,先從從cookie中獲取token信息,根據(jù)token信息獲取用戶信息,判斷用戶信息是否有效,如果有效則放行,如果無效,則利用攔截器攔截跳轉(zhuǎn)到登錄頁面。用戶再次登錄的時候刷新redis的時間,重新設置有效期。攔截器的攔截,在springMVC.xml中設置攔截的名稱。
購物車功能:
購物車功能注意到這里商品加入購物車,是將購物車保存在cookie中。這里用到cookieUtil工具來實現(xiàn)這些保存刪除功能。在商品詳情頁面點擊“加入購物車”按鈕提交一個請求吧商品id傳遞給Controller,Controller接收id,Controller調(diào)用Service根據(jù)商品id查詢商品基本信息,購物車的商品專門寫一個pojo對象,因為商品的很多信息購物車里面用不到。將購物車的商品的pojo,把商品寫入cookie中,加入cookie之前先從cookie中把購物車的商品取出來判斷當前購物車商品列表中是否有此商品,如果有數(shù)量加一,如果沒有添加一個商品,數(shù)量為1。展示給用戶購物車列表。
訂單系統(tǒng):訂單系統(tǒng)主要是訂單的創(chuàng)建、查詢、修改、刪除功能。
訂單系統(tǒng)因為pc端和移動端都需要調(diào)用此功能模塊,所以將訂單系統(tǒng)也單獨作為一個服務接口供客戶端調(diào)用。
訂單服務接口也有接口文檔,根據(jù)文檔進行訂單的創(chuàng)建。
訂單的創(chuàng)建需要用戶登錄,這里用到了攔截器在springMVC中配置下攔截方式即可。
當用戶攔截成功后,用戶登錄該商城,這時候注意將用戶保存在request中,目的是因為查詢訂單的時候需要根據(jù)用戶的id來查詢,不同的用戶具有不同的訂單啊。
然后用request的get和setAttribute來獲取值、設定值。為什么可以從request中取,因為我們整個商城都是http協(xié)議訪問的。
(1)訂單創(chuàng)建邏輯:
當點擊去去購物車結(jié)算時,顯示購物車的列表,當選中購物車的商品點擊去結(jié)算的時候,顯示商品的提交訂單之前的一系列信息(也就是結(jié)算頁):針對數(shù)據(jù)庫三張表:訂單基本信息表、訂單明細表(購買的商品信息)、訂單配送(收貨人的地址電話信息)
傳入?yún)?shù):因為創(chuàng)建訂單也就是向數(shù)據(jù)庫中插入一系列的信息,而對應的是數(shù)據(jù)庫中的三個表,所以根據(jù)頁面的內(nèi)容,傳入的參數(shù)也就是三個pojo類,然后頁面填寫的+補全頁面上在數(shù)據(jù)庫中沒有的字段。所以主要是對數(shù)據(jù)庫中的三個表進行插入操作。服務接口是負責接收這三個pojo類,所以客戶端要想辦法將這三個pojo類傳遞過來。
根據(jù)接口文檔,返回的是一個json格式的數(shù)據(jù),即這三張表的數(shù)據(jù)是在一個json串中,所以這里要想辦法將這三個表單獨建立一個pojo來保存這個返回值。
接收的pojo類:
這里采用了這種方式巧妙的將三個表合并起來了。
接下來就是數(shù)據(jù)的插入操作了,這個在service層實現(xiàn):逐個表的插入數(shù)據(jù)庫即可,然后返回一個訂單號即訂單的id。
controller層傳遞的就是這個pojo類,然后返回給客戶端。
客戶端也是將這個pojo類傳遞給服務接口,返回一個訂單號給客戶端。提交訂單的時候顯示訂單提交成功頁面時候,看下jsp頁面顯示哪些字段,然后用model傳遞給頁面。
(2)訂單的分頁查詢:
前面我們將用戶保存在了request中,然后獲取到用戶的id,根據(jù)用戶的id來查詢訂單,前臺頁面默認傳遞page和rows,利用mybatis的分頁查詢來查詢訂單即可。
傳入?yún)?shù):page和rows
執(zhí)行操作:根據(jù)用戶id查詢訂單,根據(jù)page和rows分頁
返回值:訂單的列表信息,即用戶的多個訂單信息。根據(jù)接口文檔,我們發(fā)現(xiàn)這個返回的信息就是數(shù)據(jù)中訂單表的部分信息,所以用幾個字段組成一個新的pojo來接收返回值。
(3)根據(jù)訂單id查詢訂單:
根據(jù)訂單id查詢訂單這個顯示的信息就比較全面了,這個返回值跟之前的三個數(shù)據(jù)庫的表對應,所以根據(jù)id,分別查詢這三個表,來獲取對應的信息。
1、傳入?yún)?shù):訂單id;
2、操作:三個表分別查詢;
3、返回值:之前新定義的三個表的Order的pojo類;
來源:博客園
<數(shù)商云(www.zhimaihui.cn)是國內(nèi)知名企業(yè)級電商平臺提供商,為企業(yè)級商家提供最佳的系統(tǒng)開發(fā)(多種模式電商平臺搭建:B2B/B2B2C/B2C/O2O/新零售等)、供應鏈系統(tǒng)搭建及電商行業(yè)解決方案服務>
評論