基于java的網(wǎng)上商城設(shè)計(jì)與實(shí)現(xiàn)-畢業(yè)論文(設(shè)計(jì))_第1頁(yè)
基于java的網(wǎng)上商城設(shè)計(jì)與實(shí)現(xiàn)-畢業(yè)論文(設(shè)計(jì))_第2頁(yè)
基于java的網(wǎng)上商城設(shè)計(jì)與實(shí)現(xiàn)-畢業(yè)論文(設(shè)計(jì))_第3頁(yè)
基于java的網(wǎng)上商城設(shè)計(jì)與實(shí)現(xiàn)-畢業(yè)論文(設(shè)計(jì))_第4頁(yè)
基于java的網(wǎng)上商城設(shè)計(jì)與實(shí)現(xiàn)-畢業(yè)論文(設(shè)計(jì))_第5頁(yè)
已閱讀5頁(yè),還剩41頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

學(xué)號(hào)鄭州成功財(cái)經(jīng)學(xué)院畢業(yè)論文(設(shè)計(jì))基于JAVA的網(wǎng)上商城設(shè)計(jì)與實(shí)現(xiàn)系部名稱(chēng):信息工程系專(zhuān)業(yè)名稱(chēng):計(jì)算機(jī)科學(xué)與技術(shù)學(xué)生姓名:指導(dǎo)教師:講師緒論研究的背景和意義研究的背景在衣食等購(gòu)買(mǎi)方面,傳統(tǒng)的方式是我們需要花費(fèi)時(shí)間到固定的地方挑選,假設(shè)購(gòu)買(mǎi)的東西多還需要額外的花費(fèi)去運(yùn)輸。但是隨著中國(guó)經(jīng)濟(jì)的快速發(fā)展,人們對(duì)物質(zhì)生活要求的提升,工作時(shí)間的不充足,購(gòu)買(mǎi)量偏大這些問(wèn)題往往會(huì)使我們感到厭煩。如何改善人們的購(gòu)物體驗(yàn),如何使商家與顧客實(shí)現(xiàn)共贏,人們一直在嘗試各種辦法解決這個(gè)問(wèn)題。隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,網(wǎng)絡(luò)與人們的日常生活也產(chǎn)生了千絲萬(wàn)縷的關(guān)系。信息技術(shù)也改變了人們的思維方式,現(xiàn)在越來(lái)越多的人通過(guò)互聯(lián)網(wǎng)來(lái)完成自己想做的事情。隨著數(shù)據(jù)庫(kù),計(jì)算機(jī)硬件,存儲(chǔ)技術(shù)的發(fā)展,信息技術(shù)已經(jīng)覆蓋到日常生活的各個(gè)方面,現(xiàn)在人們已經(jīng)離不開(kāi)互聯(lián)網(wǎng)了。網(wǎng)上購(gòu)物商城就是在這種大趨勢(shì)的推動(dòng)下產(chǎn)生的。研究的意義在衣食等方面網(wǎng)上購(gòu)物商城充當(dāng)著一個(gè)重要的角色,在以往我們需要花費(fèi)時(shí)間去挑選去到固定的地方去買(mǎi)。而現(xiàn)在我們只需要?jiǎng)觿?dòng)我們的手指很多東西就可以送貨上門(mén)。可以證明商城很火爆的一個(gè)列子是天貓雙十一??梢哉f(shuō)是開(kāi)辟了網(wǎng)上購(gòu)物的一個(gè)春天,成交量超過(guò)千億,可以說(shuō)明現(xiàn)在互聯(lián)網(wǎng)購(gòu)物商城方面的一個(gè)發(fā)展趨勢(shì)。研究?jī)?nèi)容本系統(tǒng)采用SSM搭建的分布式項(xiàng)目,使用Maven管理Jar使用Git作為版本的管理工具,由此將項(xiàng)目分為如下幾個(gè)模塊:1)后臺(tái)管理:包括管理員對(duì)商品的增刪改查,對(duì)商品規(guī)格參數(shù)的增刪改查。2)主頁(yè)展示:類(lèi)似京東的主頁(yè)面,讓商品分類(lèi)目展示。論文組織結(jié)構(gòu):闡述了商城項(xiàng)目研究的背景與意義以及論文的組織結(jié)構(gòu):介紹了在商城項(xiàng)目中用到的JavaWEB技術(shù)以及開(kāi)發(fā)工具以及Eclipse中比較好的插件的用法。:介紹了該系統(tǒng)的基本功能需求以及業(yè)務(wù)流程:實(shí)現(xiàn)對(duì)ssm框架的整合。對(duì)商城主要功能模塊的時(shí)間:對(duì)網(wǎng)上商城的前臺(tái)后臺(tái)進(jìn)行一些數(shù)據(jù)測(cè)試保證其健壯性,穩(wěn)定性。:總結(jié)商城開(kāi)發(fā)過(guò)程中用到的問(wèn)題,分析優(yōu)勢(shì)與不足,明確下一步的工作內(nèi)容。 商城系統(tǒng)開(kāi)發(fā)技術(shù)及工具介紹商城開(kāi)發(fā)的核心技術(shù)Jsonp簡(jiǎn)介跨域的基本概念:不同服務(wù)器或者同一個(gè)服務(wù)器不同的端口號(hào)他們之間進(jìn)行通信這就叫做跨域在商城項(xiàng)目中單點(diǎn)登錄要實(shí)現(xiàn)在一個(gè)地方登錄其他地方不用再重新登錄,在這個(gè)地方需要用到跨域,在JSP頁(yè)面使用跨域要用到Jsonp。Jsonp:Jsonp就是JSON的特殊使用法.因?yàn)锳jax無(wú)法接收到跨域的Json類(lèi)型數(shù)據(jù),Jsonp讓跨域時(shí)返回的是一個(gè)腳本文件.腳本文件中包含了,回調(diào)函數(shù)及JSON數(shù)據(jù).JSONP的使用步驟:客戶(hù)端需要重點(diǎn)設(shè)置以下三個(gè)屬性:1)dataType:’jsonp’,響應(yīng)結(jié)果類(lèi)型2)jsonp:’callback:,請(qǐng)求時(shí)傳遞回調(diào)方法名的參數(shù)名3)jsonpCallback:’abc,傳遞過(guò)去的回調(diào)方法名代碼示例如下:$.ajax({ url:'http://localhost:8081/demo', dataType:'jsonp', jsonp:'callback', jsonpCallback:'abc', type:'POST', success:function(data){ alert(data.a+""+"匿名方式"+data.b); }});服務(wù)器端使用的是由Spring封裝的MappingJacksonValue它返回jsonp需要的數(shù)據(jù)格式。他要注意的是幾個(gè)屬性produces:string[],設(shè)置響應(yīng)頭中Content-Type,響應(yīng)內(nèi)容類(lèi)型.代碼示例如下:@RequestMapping(value="demo",produces={MediaType.APPLICATION_JSON_UTF8_VALUE})@ResponseBodypublicMappingJacksonValueshow(Stringcallback){ Map<String,String>map=newHashMap<>(); map.put("a","a1"); map.put("b","b1"); MappingJacksonValuemjv=newMappingJacksonValue(map); mjv.setJsonpFunction(callback); returnmjv;HttpClient簡(jiǎn)介分布式項(xiàng)目中不同子項(xiàng)目之間進(jìn)行信息傳輸需要跨域,而HttpClient是用Java代碼的方式進(jìn)行的跨域信息交流,下面介紹一下HttpClient。HTTP協(xié)議應(yīng)該是互聯(lián)網(wǎng)中最重要的協(xié)議。持續(xù)增長(zhǎng)的WEB服務(wù)、互聯(lián)網(wǎng)的家用電器等都在繼承并拓展著Http協(xié)議,向著瀏覽器之外的方向發(fā)展。雖然JDK中的J包中提供了一些基本的方法,通過(guò)Http協(xié)議來(lái)訪問(wèn)網(wǎng)絡(luò)資源,但是大多數(shù)場(chǎng)景下,它都不夠靈活和強(qiáng)大。HttpCilent致力于填補(bǔ)這個(gè)空白,它可以提供有效的、最新的、功能豐富的包來(lái)實(shí)現(xiàn)Http客戶(hù)端。為了拓展,Httpclient即支持基本的Http協(xié)議,還支持Http-aware客戶(hù)端程序,如WEB瀏覽器,WebServer客戶(hù)端,以及利用OR拓展Http協(xié)議的分布式系統(tǒng)。1)HttpClient的范圍/特性是一個(gè)基于Httpcore的客戶(hù)端Http傳輸類(lèi)庫(kù)基于傳統(tǒng)的(阻塞)IO內(nèi)容無(wú)關(guān)2)HttpClient不能做的事情HttpClient不是瀏覽器,它是一個(gè)客戶(hù)端HTTP協(xié)議傳輸類(lèi)庫(kù)。HttpClient被用來(lái)發(fā)送和接受HTTP消息。HttpClient不會(huì)處理HTTP消息的內(nèi)容,不會(huì)進(jìn)行JavaScript解析,不會(huì)關(guān)心contenttype,如果沒(méi)有明確設(shè)置,HttpClientT也不會(huì)對(duì)請(qǐng)求進(jìn)行格式化、重定向URL,或者其他任何和Http消息傳輸相關(guān)的功能。代碼示例如下:POST請(qǐng)求 CloseableHttpClienthttpClient=HttpClients.createDefault(); HttpPostpost=newHttpPost("http://localhost:8081/demo1"); List<NameValuePair>params=newArrayList<NameValuePair>(); params.add(newBasicNameValuePair("name","李四")); params.add(newBasicNameValuePair("age","15")); post.setEntity(newUrlEncodedFormEntity(params,"utf-8")); CloseableHttpResponseresponse=httpClient.execute(post); Stringresult=EntityUtils.toString(response.getEntity()); response.close(); httpClient.close();GET請(qǐng)求:publicvoiddoGetWithParam()throwsException{ CloseableHttpClienthttpClient=HttpClients.createDefault(); URIBuilderuriBuilder=newURIBuilder("/web"); uriBuilder.addParameter("query","花千骨"); HttpGetget=newHttpGet(uriBuilder.build()); CloseableHttpResponseresponse=httpClient.execute(get); intstatusCode=response.getStatusLine().getStatusCode(); HttpEntityentity=response.getEntity(); Stringstring=EntityUtils.toString(entity,"utf-8"); response.close(); httpClient.close();}Cookie簡(jiǎn)介Cookie概念:由服務(wù)器端產(chǎn)生,存放于客戶(hù)端瀏覽器的文本文件。Cookie原理:1)在服務(wù)器端實(shí)例化Cookie對(duì)象,里面只能存放字符串內(nèi)容(Cookie盡量不要存放中文)。2)設(shè)置Cookie的有效時(shí)間和作用域和有效路徑。3)伴隨重定向,隨著響應(yīng)對(duì)象響應(yīng)給客戶(hù)端瀏覽器。4)瀏覽器接收到Cookie內(nèi)容進(jìn)行I/O操作,把Cookie存放與本地某個(gè)Cookie特定文件夾中。5)當(dāng)用戶(hù)在次發(fā)送請(qǐng)求時(shí),只要能獲取到某個(gè)或某些Cookie,會(huì)由瀏覽器幫助自動(dòng)攜帶Cookie發(fā)送給服務(wù)端。服務(wù)器端示例代碼如下:Cookiec=newCookie("test","123");c.setMaxAge(10);c.setDomain(".");c.setPath("/cookie/page");res.addCookie(c);res.sendRedirect("page/index.jsp");客戶(hù)端代碼示例如下:<%Cookie[]cs=request.getCookies();if(cs!=null){ for(Cookiec:cs){ out.println(c.getName()+""+c.getValue()+"<br/>"); }}%>Session簡(jiǎn)介Session是什么?由服務(wù)器端產(chǎn)生,存放于客戶(hù)端瀏覽器的文本文件。Session原理:1)在服務(wù)器端實(shí)例化Cookie對(duì)象,里面只能存放字符串內(nèi)容(Cookie盡量不要存放中文)。2)設(shè)置Cookie的有效時(shí)間和作用域和有效路徑。3)伴隨重定向,隨著響應(yīng)對(duì)象響應(yīng)給客戶(hù)端瀏覽器。4)瀏覽器接收到Cookie內(nèi)容進(jìn)行I/O操作,把Cookie存放與本地某個(gè)Cookie特定文件夾中。5)當(dāng)用戶(hù)在次發(fā)送請(qǐng)求時(shí),只要能獲取到某個(gè)或某些Cookie,會(huì)由瀏覽器幫助自動(dòng)攜帶Cookie發(fā)送給服務(wù)端。Solr簡(jiǎn)介Solr介紹1)作用:一個(gè)搜索引擎。2)SOLR實(shí)際是一個(gè)WEB項(xiàng)目。3)優(yōu)點(diǎn):搜索內(nèi)容高亮。對(duì)搜索關(guān)鍵字的突出顯示。搜索引擎方案:目前在國(guó)內(nèi)希望實(shí)現(xiàn)全文搜索常用解決方案。1)使用Baidu,Google提供的API2)使用基于Apache提供的Lucene搜索引擎實(shí)現(xiàn)。Solr運(yùn)行原理:Solr實(shí)際上是基于lucceen開(kāi)發(fā)的,需要通過(guò)Solr對(duì)外提供的接口,訪問(wèn)Solr項(xiàng)目.Solr接收請(qǐng)求,交由SolrRequestHandler,處理請(qǐng)求.拆分請(qǐng)求內(nèi)容為n多個(gè)詞條(一句話(huà)拆分成多段).根據(jù)詞條內(nèi)容,索引整個(gè)Solr中內(nèi)容,最終相應(yīng)給用戶(hù)一個(gè)XML格式的結(jié)果,也可以是備用結(jié)果。索引介紹:1)查詢(xún)時(shí),從頭查詢(xún)到結(jié)果一行一行的查詢(xún)過(guò)程叫做順序查詢(xún)。2)索引:建立內(nèi)容和索引內(nèi)容之間關(guān)系,通過(guò)找到索引內(nèi)容快速定位到具體內(nèi)容的過(guò)程就是索引查詢(xún)(新華字典目錄.)。3)solr基于反向索引進(jìn)行查詢(xún)的.建立索引和內(nèi)容之間關(guān)系,通過(guò)索引查找內(nèi)容的過(guò)程稱(chēng)為反向索引。SSM框架技術(shù)框架技術(shù)概述框架是一種通用的半成品的軟件,SSM用了MVC的設(shè)計(jì)模式可以使程序易維護(hù)擴(kuò)展,使程序員之間的分工比較明確,使業(yè)務(wù)邏輯與視圖進(jìn)行分離,簡(jiǎn)化了程序員的開(kāi)發(fā)提高了工作效率,如圖2-1就是框架技術(shù)在MVC三層模型所代表的角色。Servlet(C)Servlet(C)用戶(hù)JSP(V)Service(業(yè)務(wù)邏輯處理)DAODataBase從上到下:傳遞的是參數(shù)封裝的對(duì)象Mybatis從下到上:從數(shù)據(jù)庫(kù)中取出的結(jié)果封裝的對(duì)象SpringMVCSpring圖2-1框架在MVC中的角色SpringMVC框架Springmvc運(yùn)行流程圖如圖2-2圖2-2SpringMVC執(zhí)行時(shí)序圖Springmvc運(yùn)行原理:在編程中都是以spring-webmvc.jar形式存在.SpringMVC是基于front設(shè)計(jì)模式研發(fā)出來(lái)的必須有入口地址,地址是DispatcherServlet。DispatcherServlet也是一個(gè)Servlet,在SpringMVC中ServletAPI被完整的支持.由于是一個(gè)MVC框架,所以核心是控制器.大部分執(zhí)行流程都是在控制器前后完成的。具體執(zhí)行流程為:當(dāng)用戶(hù)發(fā)送請(qǐng)求后被DispatcherSevlet進(jìn)行分發(fā),然后轉(zhuǎn)交給HandlerMapping進(jìn)行驗(yàn)證格式是否合法,如果不合法報(bào)異常,如果合法向下傳遞交給HandlerAdapter準(zhǔn)備調(diào)用某個(gè)Controller,Controller在進(jìn)入之前一般都需要執(zhí)行HandlerInterceptor攔截器的preHandle()方法,判斷是否可以調(diào)用Controller.如果可以調(diào)用才能進(jìn)入Controller,當(dāng)Controller執(zhí)行完成后再次進(jìn)入攔截的postHandle驗(yàn)證傳遞內(nèi)容是否合法,如果合法交給ViewResovler視圖解析器調(diào)用具體的View視圖資源.調(diào)用成功后再次進(jìn)入攔截器的afterCompletion做最后驗(yàn)證,如果一切正確,響應(yīng)給客戶(hù)端.到此,SpirngMVC執(zhí)行結(jié)束.Mybatis框架Mybatis運(yùn)行流程圖如圖2-3圖2-3MYBATIS的執(zhí)行流程圖2-3Mybatis的執(zhí)行流程Mybatis是持久層框架,內(nèi)部封裝的JDBC,不依賴(lài)于SERVLET容器在測(cè)試階段使用比較方便。它的運(yùn)行原理如下:運(yùn)行原理就是程序執(zhí)行過(guò)程,平時(shí)編寫(xiě)代碼時(shí)只需要把配置文件轉(zhuǎn)換為流后給交SqlSessionFactoryBuilder就會(huì)產(chǎn)生SqlSessionFactory,但實(shí)際上底層是這樣實(shí)現(xiàn)的.實(shí)際上把配置文件流交由XMLConfigBuilder進(jìn)行解析,解析后把所有配置信息封裝到Configuration中,再把Configuration傳遞給DefaultSqlSession-Factory,并實(shí)例化這個(gè)類(lèi)在源碼可以看出DefaultSqlSessionFactory是SqlSessionFactory的實(shí)現(xiàn)類(lèi),所以這個(gè)時(shí)候就產(chǎn)生了SqlSessionFactory接口的實(shí)例..需要openSession,產(chǎn)生SqlSession示例,根據(jù)SqlSession實(shí)例執(zhí)行事務(wù)。最后要提交事務(wù)和關(guān)閉SqlSession通常都不關(guān)閉SqlSessionFactory,在大點(diǎn)的項(xiàng)目中,都需要用到二級(jí)緩存,所以不關(guān)閉.Spring框架Spring在實(shí)際項(xiàng)目是以ApplicationContext.xml配置文件文件形式存在.當(dāng)加載ApplicationContext.xml后會(huì)產(chǎn)生ApplicationContext容器,在該容器中放置所有管理的對(duì)象.這些對(duì)象默認(rèn)都是單例的.通過(guò)Scope屬性可以設(shè)置對(duì)象是否單例.對(duì)象中如果還有對(duì)象就繼續(xù)進(jìn)行依賴(lài)注入.其實(shí)Spring主要核心包括:IoC和AOP。IOC,叫做控制反轉(zhuǎn),所有對(duì)象實(shí)例化的過(guò)程轉(zhuǎn)交給SpringIoC組件,不用程序員手動(dòng)new對(duì)象.目前主流編程語(yǔ)言都是面向?qū)ο笳Z(yǔ)言,經(jīng)常處理對(duì)象和對(duì)象之間的關(guān)系.引入SpringIoC(我們也可以叫DI)可以把我們的關(guān)注點(diǎn)從對(duì)象之間關(guān)系釋放出來(lái),我們只關(guān)注業(yè)務(wù)邏輯.IoC實(shí)際就解析XML或注解后通過(guò)反射機(jī)制加載對(duì)應(yīng)的類(lèi),然后進(jìn)行實(shí)例化或注入里面常用的設(shè)計(jì)模式包含:單例,工廠等。AOP是面向切面編程.把傳統(tǒng)程序執(zhí)行過(guò)程看成縱向執(zhí)行過(guò)程,每個(gè)方法當(dāng)作一個(gè)點(diǎn).基于這些點(diǎn)可以進(jìn)行增強(qiáng)處理。形成了橫向的切面,包含了原有方法和增強(qiáng)方法.不改變?cè)写a結(jié)構(gòu),添加額外功能.常用AOP功能有事務(wù)管理,權(quán)限處理,日志打印等。其實(shí)Spring的AOP就是對(duì)代理設(shè)計(jì)模式的一個(gè)實(shí)現(xiàn)。商城開(kāi)發(fā)工具Ecplipse及其插件Ecplipse介紹:Ecplipse是著名的跨平臺(tái)自由集成開(kāi)發(fā)環(huán)境(IDE)。它本身是一個(gè)框架平臺(tái),支持眾多功能,有很強(qiáng)的靈活性。許多軟件開(kāi)發(fā)商以Ecplipse開(kāi)發(fā)自己的IDE如MyEcplipse。Eclipse最早由IBM公司開(kāi)發(fā),2011年貢獻(xiàn)給開(kāi)源社區(qū),現(xiàn)在它由非盈利軟體供應(yīng)商聯(lián)盟Eclipse基金會(huì)(EclipseFoundation)管理。Eclipse常用插件介紹:SimplePropertieseditor一個(gè)簡(jiǎn)單實(shí)用的文本編輯器插件,可以直接將ANSII漢字或者我們比較熟悉的語(yǔ)種。如在eclipse里面我們通常會(huì)實(shí)用properties屬性文件,但是如果我們寫(xiě)的是漢字它會(huì)轉(zhuǎn)化成ANsII編碼的格式,使用此插件可以直接將里面的編碼轉(zhuǎn)換成我們想要的漢字。EclipseClassDecompiler 整合了目前最好的2個(gè)反編譯工具Jad和JD-Core,并且和EclipseClassViewer無(wú)縫集成,能夠方便的使用插件查看類(lèi)庫(kù)源碼,以及采用本插件進(jìn)行Debug調(diào)試EclipseTomcatPlugin當(dāng)我們?cè)谶M(jìn)行多個(gè)web項(xiàng)目開(kāi)發(fā)或者進(jìn)行學(xué)習(xí)的時(shí)候,jar包是一個(gè)麻煩的事情,我們需要頻繁的去復(fù)制粘貼jar,這不僅浪費(fèi)了大量的時(shí)間,而且也占用了較大的存儲(chǔ)空間,而tomcat自定義類(lèi)加載器就會(huì)起到很大的作用,這是tomcat的一個(gè)擴(kuò)展點(diǎn),而且tomcatplugin也使用這個(gè)擴(kuò)展點(diǎn)自定義了一個(gè)loder我們以后就只需要導(dǎo)jar就行了不需要額外的再?gòu)?fù)制粘貼jar。Tomcat服務(wù)器Tomcat服務(wù)器是一個(gè)免費(fèi)的開(kāi)放源代碼的WEB應(yīng)用服務(wù)器。Tomcat是Apache軟件基金會(huì)(ApacheSoftwareFoundation)的Jakarta項(xiàng)目中的核心項(xiàng)目,由Apache,Sun和其他一些公司及個(gè)人共同開(kāi)發(fā)而成。因?yàn)門(mén)omcat技術(shù)先進(jìn),性能穩(wěn)定,而且免費(fèi),因而深受Java愛(ài)好者的喜愛(ài)并得到了很多軟件開(kāi)發(fā)商的認(rèn)可,是目前比較流行的WEB應(yīng)用服務(wù)器。MySQL數(shù)據(jù)庫(kù)MySQL是一個(gè)小型關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),開(kāi)發(fā)者為瑞典的MysqlLab公司,在2008年被Sun收購(gòu)。MySQL被廣泛地應(yīng)用在Internet上的中小型網(wǎng)站。由于體積小,速度快,總體擁有成本低,尤其是開(kāi)放源代碼這一特點(diǎn),許多小型公司為了減低成本而選擇MySQL作為網(wǎng)站數(shù)據(jù)庫(kù)。但是后來(lái)他又被Oracl收購(gòu),它以后的發(fā)展或者收費(fèi)與否還要看Oracl公司如何決斷了。Redis數(shù)據(jù)庫(kù)Redis是一個(gè)開(kāi)源的,先進(jìn)的key-value存儲(chǔ),并用于構(gòu)建高性能,可擴(kuò)展的WEB應(yīng)用程序的完美解決方案。Redis從它的許多競(jìng)爭(zhēng)者中脫穎而出主要有以下三個(gè)主要特點(diǎn)1)數(shù)據(jù)庫(kù)完全在內(nèi)存中,使用磁盤(pán)僅用于持久性。2)有豐富的數(shù)據(jù)類(lèi)型。3)使用簡(jiǎn)單方便處理速度快。

商城系統(tǒng)項(xiàng)目需求分析目標(biāo)基于JavaEE平臺(tái)的網(wǎng)上商城是依托于目前主流的SSM框架搭建而成。主要包括兩個(gè)方面:一是后臺(tái)管理,為管理員提供一些增刪改的權(quán)限,改變手工記賬效率慢,成本高的現(xiàn)狀;而前臺(tái)方面,給用戶(hù)看的主要包括用戶(hù)的登陸,購(gòu)物車(chē)的實(shí)現(xiàn)等,減少用戶(hù)外出購(gòu)買(mǎi)商品所需時(shí)間。商城需要實(shí)現(xiàn)的具體目標(biāo)包括:1)購(gòu)物商城臺(tái)中實(shí)現(xiàn)管理員對(duì)商品的增加,上架,下架圖片的插入,對(duì)商品內(nèi)容的管理包括對(duì)商品類(lèi)目的增加,對(duì)商品規(guī)格參數(shù)的修改增加,對(duì)大廣告位的插入,對(duì)首頁(yè)常用圖片的插入。2)購(gòu)物商城中前臺(tái)部分包括實(shí)現(xiàn)對(duì)商品整個(gè)目錄結(jié)構(gòu)的展示,用戶(hù)單點(diǎn)登錄,商品展示,商品詳情以及規(guī)格參數(shù)的展示,商品購(gòu)買(mǎi),購(gòu)物車(chē)中商品的增加刪除修改。商城業(yè)務(wù)流程圖商城后臺(tái)業(yè)務(wù)流程圖網(wǎng)站后臺(tái)系統(tǒng)是商城的一個(gè)核心,通過(guò)后臺(tái)系統(tǒng)管理員可以對(duì)倉(cāng)庫(kù)的商品進(jìn)行上架,下架,新增的操作,以前這些都是人工操坐,人工記錄,現(xiàn)在則改為由數(shù)據(jù)庫(kù)進(jìn)行一個(gè)記錄大大提高了安全性,提高了工作效率,降低了運(yùn)作成本。如圖3-1是商城的后臺(tái)業(yè)務(wù)流程圖。圖3-1商城前臺(tái)流程圖概況商城前臺(tái)務(wù)流程圖商城前臺(tái)是為客戶(hù)準(zhǔn)備的頁(yè)面,包括會(huì)員管理,商品購(gòu)買(mǎi),購(gòu)物車(chē),商品結(jié)算。現(xiàn)在使用這個(gè)購(gòu)買(mǎi)平臺(tái)可以留住購(gòu)買(mǎi)者,利用會(huì)員等級(jí)制度激發(fā)用戶(hù)的購(gòu)買(mǎi)力,使用數(shù)據(jù)庫(kù)來(lái)保存用戶(hù)的購(gòu)買(mǎi)記錄,由此來(lái)分析用戶(hù)喜歡那些商品,那些商品高買(mǎi)的比較少??梢宰顬闃I(yè)務(wù)分析的依據(jù),單點(diǎn)登錄(登錄一次其他地方就不用再登錄)由此改善用戶(hù)體驗(yàn)。商城前臺(tái)流程圖如圖3-2圖3-2商城后臺(tái)流程圖概商城系統(tǒng)詳細(xì)設(shè)計(jì)及實(shí)現(xiàn)商城總體開(kāi)發(fā)架構(gòu)本商城采用Ecplipse搭建商城項(xiàng)目,EasyUI搭建后臺(tái)框架,Git作為版本管理,使用Maven搭建分布式項(xiàng)目并管理架包,使用Linux部署項(xiàng)目。使用Mysql作為持久化存儲(chǔ)介質(zhì),使用Reidis作為緩存數(shù)據(jù)庫(kù)提高查詢(xún)速度,使用Solr作為全文搜索引擎。商城總體開(kāi)發(fā)結(jié)構(gòu)圖如圖4-1:圖4-1商城項(xiàng)目架構(gòu)圖商城框架實(shí)現(xiàn)Spring整合SpringMVCSPRINGMVC作為視圖層的一個(gè)框架與SPRING配合使用主要有以下步驟1)配置包掃描器使SPRING可以自動(dòng)掃描類(lèi),不用寫(xiě)額外的代碼進(jìn)行識(shí)別<context:component-scanbase-package="com.chenfeng.ego.rest.controller"></context:component-scan>2)驅(qū)動(dòng)注解,給springmvc提供了數(shù)據(jù)綁定的功能<mvc:annotation-driven/>3)視圖解析器,在控制器處理結(jié)束并返回模型和視圖名之后,Spring會(huì)依次調(diào)用Spring容器中所注冊(cè)的視圖解析器,來(lái)查找符合條件的視圖。<beanid="viewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver"><propertyname="prefix"value="/WEB-INF/jsp/"></property><propertyname="suffix"value=".jsp"></property></bean>4)springmvc自動(dòng)加載靜態(tài)資源,這樣做的好處是,不必每次請(qǐng)求的時(shí)候都需要來(lái)加載,而且在某種情況下,這個(gè)靜態(tài)資源不適用這個(gè)會(huì)出錯(cuò)。<mvc:resourceslocation="/WEB-INF/images/"mapping="/images/**"></mvc:resources><mvc:resourceslocation="/WEB-INF/js/"mapping="/js/**"></mvc:resources><mvc:resourceslocation="/WEB-INF/css/"mapping="/css/**"></mvc:resources><beanid="multipartResolver"class="mons.CommonsMultipartResolver"><propertyname="maxUploadSize"value="100000000"></property><propertyname="maxInMemorySize"value="10000000"></property><propertyname="defaultEncoding"value="utf-8"></property></bean>Spring整合MybatisMybatis作為持久層與SPRING整合主要有以下步驟1)掃描類(lèi)可以使注解正常使用<context:component-scanbase-package="com.chenfeng.ego.rest.service"></context:component-scan>2)創(chuàng)建數(shù)據(jù)源,連接數(shù)據(jù)庫(kù)<beanid="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"p:driverClassName="com.mysql.jdbc.Driver"p:url="jdbc:mysql://localhost:3306/ego"p:username="root"p:password="root"></bean>3)創(chuàng)建SqlSessionFactory實(shí)例,使我們可以正常使用這個(gè)實(shí)例對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作<beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean"><propertyname="configLocation"value="classpath:mybatis-config.xml"></property></bean>4)配置事務(wù)管理器。<beanid="txManage"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"></bean>5)配置聲明式事物,以那些方法會(huì)被攔截<tx:adviceid="txAdvice"transaction-manager="txManage"> <tx:attributes> <tx:methodname="find*"read-only="true"/> <tx:methodname="sel*"read-only="true"/> <tx:methodname="*"/> </tx:attributes></tx:advice>6)配置aop切面,使聲明式事物開(kāi)始生效。<aop:config><aop:pointcutexpression="execution(*com.chenfeng.ego.rest.service.impl.*.*(..))"id="mypointer"/><aop:advisoradvice-ref="txAdvice"pointcut-ref="mypointer"/></aop:config>7)配置mapper掃描器,這樣就可以只需要寫(xiě)接口不用寫(xiě)實(shí)現(xiàn)類(lèi)使dao層簡(jiǎn)化,提高開(kāi)發(fā)效率。<beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer"> <propertyname="basePackage"value="com.chenfeng.ego.mapper"></property></bean>Spring整合JedisSpring與jedis結(jié)合使用主要有兩方面的配置1)連接池的配置 <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <propertyname="maxTotal"value="30"/> <propertyname="maxIdle"value="10"/> <propertyname="numTestsPerEvictionRun"value="1024"/> <propertyname="timeBetweenEvictionRunsMillis"value="30000"/> <propertyname="minEvictableIdleTimeMillis"value="1800000"/> <propertyname="softMinEvictableIdleTimeMillis"value="10000"/> <propertyname="maxWaitMillis"value="1500"/> <propertyname="testOnBorrow"value="true"/> <propertyname="testWhileIdle"value="true"/> <propertyname="blockWhenExhausted"value="false"/> </bean>Redis集群的配置 <beanid="jedisClients"class="redis.clients.jedis.JedisCluster"> <constructor-argname="poolConfig"ref="jedisPoolConfig"/> <constructor-argname="nodes"> <set> <beanclass="redis.clients.jedis.HostAndPort"> <constructor-argname="host"value="32"/> <constructor-argname="port"value="7001"/> </bean> //…以下還有四個(gè)配置服務(wù)器地址需要配置配置方法如上一樣 </bean> </set> </constructor-arg> </bean>商城主要功能模塊實(shí)現(xiàn)由于使用的是框架技術(shù)所以我們使用的依然是mvc三層模型設(shè)計(jì),所以每個(gè)功能實(shí)現(xiàn)也是分層次的POJO層,Service層,Sontroller層,Dao層,以下介紹的時(shí)候主要介紹service,Control層代碼設(shè)計(jì)。商城后臺(tái)商品管理實(shí)現(xiàn)1)商城商品管理主要就是商品的增刪該查以及其商品的展示。商品展示圖4-1商城后臺(tái)頁(yè)面操作展示Service層代碼如下其中使用到了pagehelp這個(gè)分頁(yè)插件privateTbItemParamMapperitemParamMapper;publicEasyUIDataGridshowTbItem(intpage,introws){ EasyUIDataGriddataGrid=newEasyUIDataGrid(); PageHelper.startPage(page,rows); List<TbItem>list=tbItemMapper.selectByExample(new TbItemExample()); PageInfo<TbItem>info=newPageInfo<>(list); dataGrid.setRows(info.getList()); dataGrid.setTotal(info.getTotal()); returndataGrid; }Controller層代碼如下 @RequestMapping("item/list") @ResponseBody publicEasyUIDataGridshow(intpage,introws){ returnthis.tbItemService.showTbItem(page,rows); }商品的上架,下架,編輯,刪除圖4-2商城后臺(tái)商品的增刪,下,上架展示Service層代碼如下 @Override publicvoidupStatus(Stringids,bytestatus)throwsException{ TbItemrecord=newTbItem(); List<Long>list=ItemSpiltUtil.idSplit(ids); for(Longlong1:list){ record.setStatus(status); record.setId(long1); tbItemMapper.updateByPrimaryKeySelective(record); } }Controller層代碼其中使用到了封裝的思想,將同樣的代碼封裝起來(lái),因?yàn)镾ervice層的代碼都一樣所以使用了一個(gè)來(lái)判斷簡(jiǎn)化了代碼的開(kāi)發(fā)。是程序看起來(lái)更加健壯。@RequestMapping("rest/item/{type}") @ResponseBody publicEgoResultupdataStatus(@PathVariableStringtype,Stringids){ EgoResultegoResult=newEgoResult(); Bytestatus=null; if("delete".equalsIgnoreCase(type)){ status=(byte)3; }elseif("instock".equalsIgnoreCase(type)){ status=(byte)2; }elseif("reshelf".equalsIgnoreCase(type)){ status=(byte)1; } try{ tbItemService.upStatus(ids,status); egoResult.setStatus(200); }catch(Exceptione){ e.printStackTrace(); egoResult.setStatus(400); } returnegoResult; }商城后臺(tái)內(nèi)容管理實(shí)現(xiàn)商城內(nèi)容管理對(duì)內(nèi)容的增加,重命名如圖4-3所示圖4-3商城后臺(tái)內(nèi)容管理Service層代碼@ResourceTbContentCategoryMappertbContentCategoryMapper;@OverridepublicList<EasyUiTree>selById(longid){ TbContentCategoryExampleexample=new TbContentCategoryExample(); example.createCriteria().andParentIdEqualTo(id).andStatusEqualTo(1; List<TbContentCategory>list= tbContentCategoryMapper.selectByExample(example); List<EasyUiTree>easyUiTreeList=newArrayList<>(); for(TbContentCategorytbContentCategory:list){ EasyUiTreeea=newEasyUiTree(); ea.setId(tbContentCategory.getId()); ea.setText(tbContentCategory.getName()); ea.setState(tbContentCategory.getIsParent()?"closed": "open"); easyUiTreeList.add(ea); } returneasyUiTreeList; } @Override publicEgoResultinsertByid(longparentId,Stringname) { EgoResultegoResult=newEgoResult(); TbContentCategorytbContentCategory=newTbContentCategory(); tbContentCategory.setCreated(newDate()); tbContentCategory.setId(IDUtils.genItemId()); tbContentCategory.setIsParent(false); tbContentCategory.setName(name); tbContentCategory.setParentId(parentId); tbContentCategory.setSortOrder(1); tbContentCategory.setStatus(1); tbContentCategory.setUpdated(newDate()); TbContentCategoryExample example = new TbContentCategoryExample(); example.createCriteria().andNameEqualTo(name); intcount=this.tbContentCategoryMapper.countByExample(example);if(count<1){intresult= this.tbContentCategoryMapper.insert(tbContentCategory); if(result>0){ TbContentCategoryparent=newTbContentCategory(); parent.setId(parentId); parent.setIsParent(true); intre= this.tbContentCategoryMapper.updateByPrimaryKeySelective(parent); if(re>0){ egoResult.setStatus(200); }else{ egoResult.setStatus(400); } }else{ egoResult.setStatus(400); } }else{ egoResult.setStatus(400); } returnegoResult; }商城前臺(tái)單點(diǎn)登錄的實(shí)現(xiàn)單點(diǎn)登錄原理簡(jiǎn)述:要想實(shí)現(xiàn)Cookie-Redis總得有個(gè)Cookie吧,所以第一步要先創(chuàng)建一個(gè)Cookie,然后Cookie起個(gè)名字,(因?yàn)槲覀円袛酁g覽器端是否存在這個(gè)cookie所以說(shuō)需要專(zhuān)門(mén)寫(xiě)一個(gè)js這個(gè)js是前臺(tái)寫(xiě)的,跟后續(xù)其他的需要登錄的網(wǎng)頁(yè)相關(guān)聯(lián),其他的網(wǎng)頁(yè)要引入這個(gè)js,當(dāng)判斷Cookie有了之后就會(huì)將這個(gè)js就會(huì)獲取第一個(gè)js里面的Cookie值,之后就可以從Redis查詢(xún)數(shù)據(jù)了)Cookie的值為UUid,然后將這個(gè)UUid作為key存儲(chǔ)到Redis中他的值為用戶(hù)信息,同時(shí)設(shè)置Redis的失效時(shí)間。每一個(gè)需要用戶(hù)信息的頁(yè)面都要有兩個(gè)js上面提到的,第一個(gè)js要判斷是否存在這個(gè)Cookie,第二個(gè)js是先獲取Cookie里面的值然后發(fā)送一個(gè)Jsonp請(qǐng)求,從Redis里面獲取,然后進(jìn)行相應(yīng)的展現(xiàn)。Rdis-Cookie就是對(duì)Cookie-Jsessin的模擬。單點(diǎn)登錄service層代碼如下@ResourceprivateTbUserMapperusermapper;@ResourceprivateJedisDaodao; @Override 當(dāng)用戶(hù)登錄的時(shí)候要?jiǎng)?chuàng)建Cookie存值為UUid,UUid將最為Redis的key 內(nèi)存User對(duì)象Usr對(duì)象經(jīng)過(guò)工具類(lèi)轉(zhuǎn)換 PublicEgoResultlogin(TbUsertb,HttpServletRequest req,HttpServletResponseres){ tb.setPassword(DigestUtils.md5DigestAsHex(tb.getPassword().getBytes ())); EgoResultego=newEgoResult(); TbUserExampleexample=newTbUserExample(); example.createCriteria().andUsernameEqualTo(tb.getUsername()).andPa sswordEqualTo(tb.getPassword()); List<TbUser>list=usermapper.selectByExample(example); if(list!=null&&list.size()>0) { Stringuuid=UUID.randomUUID().toString(); dao.set("user-"+uuid,JsonUtils.objectToJson(list.get(0))); System.out.println(list.get(0)); dao.expire("user-"+uuid,30*60); CookieUtils.setCookie(req,res,"TT_TOKEN",uuid,30*60); ego.setStatus(200); ego.setData(uuid); }else{ ego.setStatus(400); } returnego; } publicEgoResultgetTokenResult(Stringtoken,HttpServletRequest req,HttpServletResponseres) { EgoResultego=newEgoResult(); Stringstring=dao.get("user-"+token); ego.setStatus(200); ego.setData(JsonUtils.jsonToPojo(string,TbUser.class)); dao.expire("user-"+token,30*60); CookieUtils.setCookie(req,res,"TT_TOKEN",token,30*60); returnego; } 注冊(cè)頁(yè)面注冊(cè)成功之后會(huì)跳轉(zhuǎn)到登錄頁(yè)面而登錄頁(yè)面登錄地址的參數(shù) 將帶有此次相應(yīng)結(jié)果的rfferer參數(shù)就可以成功跳回到登錄之前的頁(yè)面 @RequestMapping("user/showRegister") publicStringresigin(@RequestHeader(name="Referer")String referer,Modelmodel) {model.addAttribute("url",referer); return"register"; } @RequestMapping("user/check/{countent}/{type}") @ResponseBody publicEgoResultcheck(@PathVariableStringcountent,@PathVariable inttype){ returnuserService.check(countent,type); } @RequestMapping("/user/register") @ResponseBody publicEgoResultregister(TbUseruser)} returnuserService.register(user); }商城前臺(tái)solr全文搜索的實(shí)現(xiàn)商城前臺(tái)使用的是solr全文solr引擎Solr管理集群的結(jié)構(gòu)圖如圖4-5圖4-5商城solr集群結(jié)結(jié)構(gòu)圖主要步驟以及代碼如下在使用之前要對(duì)Solr進(jìn)行初始化,在初始化之后Solr中就會(huì)建立索引的一些聯(lián)系。當(dāng)用戶(hù)查詢(xún)數(shù)據(jù)的時(shí)候會(huì)直接在初始化的文件中對(duì)數(shù)據(jù)進(jìn)行搜索Service層代碼如下@Resource privateSolrMappermapper; @Value("${zkHost}") privateStringzkHost; @Override publicStringinitSolr()throwsSolrServerException,IOException{ List<ItemSearch>list=mapper.seAll(); CloudSolrServerserver=newCloudSolrServer(zkHost); server.setDefaultCollection("collection1"); for(ItemSearchitemSearch:list){ SolrInputDocumentdoc=newSolrInputDocument(); doc.addField("id",itemSearch.getId()); doc.addField("item_category_name", itemSearch.getItem_category_name()); doc.addField("item_desc",itemSearch.getItem_desc()); doc.addField("item_image",itemSearch.getItem_image()); doc.addField("item_price",itemSearch.getItem_price()); doc.addField("item_sell_point", itemSearch.getItem_sell_point()); doc.addField("item_title",itemSearch.getItem_title()); server.add(doc); }mit(); return"ok"; } publicSearchResultselByQ(Stringq,intpage,introws)throws SolrServerException{ SearchResultsear=newSearchResult(); CloudSolrServerserver=newCloudSolrServer(zkHost); server.setDefaultCoection("collection1"); SolrQueryquery=newSolrQuery(); query.setQuery("item_keywords:"+q); query.setStart((1)*rows); query.setRows(rows); query.setHighlight(true); query.addHighlightField("item_titleitem_sell_point"); query.setHighlightSimplePre("<spanstyle='color:red'>"); query.setHighlightSimplePost("</span>"); QueryResponseresponse=server.query(query); SolrDocumentListlist=response.getResults(); longcount=list.getNumFound(); sear.setTotalPages(count%rows==0?count/rows:count/rows+1); sear.setPage(page); List<ItemSearch>listResult=newArrayList<>(); Map<String,Map<String,List<String>>>map= response.getHighlighting(); for(SolrDocumentdoc:list) { ItemSearchis=newItemSearch(); is.setId(Long.parseLong(doc.get("id").toString())); is.setItem_category_name(doc.get("item_category_name").toString());is.setItem_image(doc.get("item_image").toString()==null?"":doc.get("item_image").toString().split(",")[0]); is.setItem_price(Long.parseLong(doc.get("item_price").toString())) returnsear; }}

商城系統(tǒng)運(yùn)行結(jié)果商城后臺(tái)運(yùn)行結(jié)果商城前臺(tái)新增產(chǎn)品管理員新增商品:當(dāng)用戶(hù)想在數(shù)據(jù)庫(kù)里面增加商品的時(shí)候有幾個(gè)要點(diǎn)要注意管理員新增商品的時(shí)候有商品類(lèi)目這個(gè)商品類(lèi)目是按照一個(gè)樹(shù)狀結(jié)構(gòu)展示的是由EasyUI框架提供的向數(shù)據(jù)庫(kù)里面查詢(xún)數(shù)據(jù)。商品的一個(gè)圖片上傳是用的vsftpt代理服務(wù)器進(jìn)行操作的我們實(shí)際上上傳的圖片最終存儲(chǔ)的位置是在一個(gè)遠(yuǎn)程調(diào)用的服務(wù)器上存儲(chǔ)的新增商品的時(shí)候用到了一個(gè)數(shù)據(jù)庫(kù)的模板設(shè)計(jì)模式。他的思想是兩個(gè)表之間自動(dòng)建立聯(lián)系交給中間的一個(gè)代理做模板的處理具體操作如圖5-1所示圖5-1增加商品的操作當(dāng)我們?cè)谶M(jìn)行如上操作結(jié)束之后,利用SQL工具的查詢(xún)語(yǔ)句直接在數(shù)據(jù)庫(kù)里面進(jìn)行一個(gè)查詢(xún)操作可以得到如下結(jié)果,由此可見(jiàn)上述操作沒(méi)有問(wèn)題圖5-2數(shù)據(jù)庫(kù)中查詢(xún)出來(lái)的商品商城前臺(tái)商品內(nèi)容管理通過(guò)如圖5-1,5-2的相關(guān)信息可以得出結(jié)論,增加商品的時(shí)候數(shù)據(jù)庫(kù)里面會(huì)同步存儲(chǔ)相應(yīng)的商品。當(dāng)對(duì)內(nèi)容進(jìn)行一些增加,刪除,修改操作的時(shí)候觀察數(shù)據(jù)庫(kù)是否會(huì)進(jìn)行相應(yīng)的變化如下圖所示5-3進(jìn)行相應(yīng)的操作圖5-3商品內(nèi)容的添加如果5-4當(dāng)進(jìn)行了如上圖的增加操作的時(shí)候數(shù)據(jù)庫(kù)里面已經(jīng)有了剛才添加的內(nèi)容,由此可證明內(nèi)容管理中的增加是沒(méi)有問(wèn)題的。篇幅所限制刪除,修改就不在這里繼續(xù)演示了圖5-4數(shù)據(jù)庫(kù)中的內(nèi)容商城前臺(tái)運(yùn)行結(jié)果商城前臺(tái)用戶(hù)搜索在商城的用戶(hù)搜素模塊,當(dāng)我們輸入想要購(gòu)買(mǎi)的物品的時(shí)候如圖5-5,請(qǐng)求會(huì)首先經(jīng)過(guò)web.xml然后再通過(guò)遠(yuǎn)程調(diào)用請(qǐng)求Solr這個(gè)WEB項(xiàng)目中的一個(gè)文件,然后對(duì)數(shù)據(jù)進(jìn)行一個(gè)查詢(xún)操作,這點(diǎn)要注意的是這次查詢(xún)將不會(huì)再數(shù)據(jù)庫(kù)里面進(jìn)行一個(gè)查詢(xún)操作。圖5-5搜索頁(yè)面當(dāng)我們輸入要搜索的物品之后,在Solr文件里面經(jīng)過(guò)查詢(xún)之后,會(huì)將結(jié)果返回到WEB頁(yè)面WEB頁(yè)面里面的相關(guān)代碼會(huì)將查詢(xún)的結(jié)果進(jìn)行一個(gè)分頁(yè)的操作然后會(huì)將查詢(xún)結(jié)果的第一頁(yè)進(jìn)行具體結(jié)果顯示如圖5-6圖5-6搜索結(jié)果頁(yè)面商城前臺(tái)用戶(hù)注冊(cè)當(dāng)用戶(hù)進(jìn)行注冊(cè)的時(shí)候?qū)?huì)有幾個(gè)判斷條件1)用戶(hù)的手機(jī)號(hào)是否已經(jīng)注冊(cè)如果沒(méi)有注冊(cè)則會(huì)提示注冊(cè)成功如圖5-8如果用戶(hù)已經(jīng)注冊(cè)過(guò)將會(huì)提示用戶(hù)已經(jīng)注冊(cè)過(guò)該手機(jī)如圖5-72)當(dāng)用戶(hù)的密碼不一致時(shí)提示用戶(hù)的密碼不一致3)當(dāng)用戶(hù)的密碼與要求的密碼不一致或者密碼過(guò)短的時(shí)候也會(huì)提示注冊(cè)失敗圖5-7用戶(hù)注冊(cè)失敗圖5-8用戶(hù)注冊(cè)成功商城用戶(hù)購(gòu)物車(chē)商城購(gòu)物車(chē)可以說(shuō)是整個(gè)業(yè)務(wù)的最核心之一也不為過(guò),因?yàn)樯坛谴嬖诘哪康木褪琴I(mǎi)與賣(mài),沒(méi)有這個(gè)后續(xù)的很多東西都無(wú)法展開(kāi)。下面就詳細(xì)的講下購(gòu)物車(chē)以及它的測(cè)試當(dāng)用戶(hù)點(diǎn)擊想要購(gòu)買(mǎi)的物品的時(shí)候要進(jìn)行一個(gè)基于AOP的攔截器的操作,首先要進(jìn)行一個(gè)判斷,判斷用戶(hù)是否已經(jīng)登錄,如果用戶(hù)登錄過(guò)來(lái)則可以進(jìn)行商品的購(gòu)買(mǎi)加入購(gòu)物車(chē)如圖5-9所示的購(gòu)物車(chē)。如果用戶(hù)沒(méi)有登錄過(guò)則會(huì)跳轉(zhuǎn)到登錄頁(yè)面進(jìn)行登錄。圖5-9加入購(gòu)物車(chē)當(dāng)用戶(hù)登錄成功之后用戶(hù)購(gòu)買(mǎi)的物品就可以在購(gòu)物車(chē)上顯示出來(lái)了,具體的顯示效果如下圖5-10所示,當(dāng)用戶(hù)添加了一個(gè)平板電腦之后在網(wǎng)頁(yè)上顯示出來(lái)。圖5-10購(gòu)物車(chē)顯示當(dāng)用戶(hù)選完物品之后可以進(jìn)行一系列的操作,如用戶(hù)想增加已經(jīng)購(gòu)買(mǎi)的商品的數(shù)量的候可以點(diǎn)擊加號(hào),當(dāng)用戶(hù)想減少自己購(gòu)買(mǎi)的物品的數(shù)量的時(shí)候可以點(diǎn)擊減號(hào),當(dāng)用戶(hù)不想要購(gòu)物車(chē)的商品的時(shí)候點(diǎn)擊減號(hào)即可,這就是購(gòu)物車(chē)的基本功能而且通過(guò)圖5-10和圖5-11我們也可以知道當(dāng)減少增減物品的時(shí)候他的價(jià)格也可以正確的變化圖5-11購(gòu)物車(chē)的商品進(jìn)行操作總結(jié)以及展望本項(xiàng)目使用了當(dāng)前流行的SSM框架技術(shù),是一個(gè)B2B的商城項(xiàng)目,本項(xiàng)目著重對(duì)管理員的操作,以及用戶(hù)的一些操作做了簡(jiǎn)單的介紹,對(duì)于支付模塊這點(diǎn)還沒(méi)有做過(guò)相應(yīng)的介紹,還有的不足是單點(diǎn)登錄是一個(gè)偽登錄做的還不夠完善。對(duì)于頁(yè)面的優(yōu)化做的也不是太好。未來(lái)的展望是本項(xiàng)目將使用阿里系的Dubbo這個(gè)流動(dòng)式的微服務(wù)架構(gòu)搭建分布式項(xiàng)目,優(yōu)點(diǎn)就是簡(jiǎn)單易用,可以動(dòng)態(tài)的調(diào)節(jié)連接數(shù)。然后在頁(yè)面優(yōu)化方面用HTML5進(jìn)行一定的特色布局。相信商城在這些技術(shù)的支持下一定會(huì)變的越來(lái)越好。為商家和廣大用戶(hù)提供更好的服務(wù),讓我們的生活變的更加愉悅。參考文獻(xiàn)[1](美)BruceEckel著.Java編程思想[M].陳昊鵬等譯.北京:基機(jī)械工業(yè)出版社,2007:100-150.[2](美)CraigWalls著.SpringINACTION[M].張衛(wèi)濱譯.第四版:北京.張衛(wèi)濱譯:人民郵電出版社.2016:78-90.[3](美)W.RichardStevens著.TCP/IP詳解卷1:協(xié)議[M]范建華,胥光輝,張濤譯.謝希仁校.北京:機(jī)械工業(yè)出版社,2013:90-110.[4]鳥(niǎo)哥.Linux私房菜基礎(chǔ)學(xué)習(xí)篇(第三版)[M].北京.人民郵電出版社,2010:120-200.[5]唐漢明,翟振興,關(guān)寶軍,王洪權(quán),黃瀟.深入淺出MySql數(shù)據(jù)庫(kù)開(kāi)發(fā)[M],優(yōu)化與管理維護(hù)(第2版)北京:人民郵電出版社,2014:150-200.[6](美)JonLoeliger著Git版本控制管理[M].王迪譯.北京:人民郵電出版社250-300.[7](美)David.PattersonJohnL著.計(jì)算機(jī)組成與設(shè)計(jì)硬件/軟件接口[M].康繼昌.樊曉椏譯.北京:機(jī)械工業(yè)出版社,2010:55-60.[8](美)FreederickP.Brooks著.人月神話(huà)[M].UMLChina翻譯組.汪穎譯北京:清華大學(xué)出版社,2014:70-150.[9](美)EricFReeman&ElisabethFreemanwithKathySierra&BertBates著HeadFirst設(shè)計(jì)模式[M]O.ReillyTaiwan公司譯UMLChina改編:北京人民郵電出版社,2014:100-150.[10]July著編程之法面試和算法心得[M]北京:人民郵電出版社,2016:55-80.[11]盧瀚.王春斌等編著Java開(kāi)發(fā)實(shí)戰(zhàn)1200例[M]北京:清華大學(xué)出版社,2012:70-150[12]張桂珠,劉麗,陳愛(ài)國(guó)java面向?qū)ο蟪绦蛟O(shè)計(jì)[M](第2版)北京:機(jī)械工業(yè)出版社,2008:70-80.[13]高林,周海燕.Jsp網(wǎng)上書(shū)店系統(tǒng)與案例分析[M].清華大學(xué)出版社,北京:2005:110-115.[14]劉騰紅,孫細(xì)明.信息系統(tǒng)分析與設(shè)計(jì)[M].清華大學(xué)出版社,2003:99-110.[15]林邦杰,徹底研究java[M].北京:電子工業(yè)出版社,2002:65-70.致謝當(dāng)我論文完成的那一刻,我的心情萬(wàn)分激動(dòng)。在論文的選題以及編寫(xiě)的過(guò)程中我得到了很多的幫助。首先,也是最主要感謝的是我的指導(dǎo)老師,老師。在論文的編寫(xiě)過(guò)程中,他給了我極大的幫助,幫助我指出了論文中的很多不足,以及指導(dǎo)意見(jiàn)。我在老師的指導(dǎo)中看到了他對(duì)對(duì)學(xué)術(shù)態(tài)度的嚴(yán)謹(jǐn)。讓我學(xué)到了對(duì)待任何正式的事物都要保持這種態(tài)度,這也是我們前進(jìn)的動(dòng)力更是成功的關(guān)鍵。在論文的編寫(xiě)過(guò)程中,我要感謝周?chē)睦蠋熀屯瑢W(xué),他們耐心的幫我指出了錯(cuò)誤,并相互促進(jìn)讓我學(xué)到了許多老師以及同學(xué)解決問(wèn)題的好辦法。在此十分感謝各位老師以及同學(xué)對(duì)我的幫助。最后,也要特別感謝審閱和論文答辯組的各位老師,對(duì)你們的付出我表示深深的感謝?;贑8051F單片機(jī)直流電動(dòng)機(jī)反饋控制系統(tǒng)的設(shè)計(jì)與研究基于單片機(jī)的嵌入式Web服務(wù)器的研究MOTOROLA單片機(jī)MC68HC(8)05PV8/A內(nèi)嵌EEPROM的工藝和制程方法及對(duì)良率的影響研究基于模糊控制的電阻釬焊單片機(jī)溫度控制系統(tǒng)的研制基于MCS-51系列單片機(jī)的通用控制模塊的研究基于單片機(jī)實(shí)現(xiàn)的供暖系統(tǒng)最佳啟停自校正(STR)調(diào)節(jié)器單片機(jī)控制的二級(jí)倒立擺系統(tǒng)的研究基于增強(qiáng)型51系列單片機(jī)的TCP/IP協(xié)議棧的實(shí)現(xiàn)基于單片機(jī)的蓄電池自動(dòng)監(jiān)測(cè)系統(tǒng)基于32位嵌入式單片機(jī)系統(tǒng)的圖像采集與處理技術(shù)的研究基于單片機(jī)的作物營(yíng)養(yǎng)診斷專(zhuān)家系統(tǒng)的研究基于單片機(jī)的交流伺服電機(jī)運(yùn)動(dòng)控制系統(tǒng)研究與開(kāi)發(fā)基于單片機(jī)的泵管內(nèi)壁硬度測(cè)試儀的研制基于單片機(jī)的自動(dòng)找平控制系統(tǒng)研究基于C8051F040單片機(jī)的嵌入式系統(tǒng)開(kāi)發(fā)基于單片機(jī)的液壓動(dòng)力系統(tǒng)狀態(tài)監(jiān)測(cè)儀開(kāi)發(fā)模糊Smith智能控制方法的研究及其單片機(jī)實(shí)現(xiàn)一種基于單片機(jī)的軸快流CO〈,2〉激光器的手持控制面板的研制基于雙單片機(jī)沖床數(shù)控系統(tǒng)的研究基于CYGNAL單片機(jī)的在線(xiàn)間歇式濁度儀的研制基于單片機(jī)的噴油泵試驗(yàn)臺(tái)控制器的研制基于單片機(jī)的軟起動(dòng)器的研究和設(shè)計(jì)基于單片機(jī)控制的高速快走絲電火花線(xiàn)切割機(jī)床短循環(huán)走絲方式研究基于單片機(jī)的機(jī)電產(chǎn)品控制系統(tǒng)開(kāi)發(fā)基于PIC單片機(jī)的智能手機(jī)充電器基于單片機(jī)的實(shí)時(shí)內(nèi)核設(shè)計(jì)及其應(yīng)用研究基于單片機(jī)的遠(yuǎn)程抄表系統(tǒng)的設(shè)計(jì)與研究基于單片機(jī)的煙氣二氧化硫濃度檢測(cè)儀的研制基于微型光譜儀的單片機(jī)系統(tǒng)單片機(jī)系統(tǒng)軟件構(gòu)件開(kāi)發(fā)的技術(shù)研究基于單片機(jī)的液體點(diǎn)滴速度自動(dòng)檢測(cè)儀的研制基于單片機(jī)系統(tǒng)的多功能溫度測(cè)量?jī)x的研制基于PIC單片機(jī)的電能采集終端的設(shè)計(jì)和應(yīng)用基于單片機(jī)的光纖光柵解調(diào)儀的研制氣壓式線(xiàn)性摩擦焊機(jī)單片機(jī)控制系統(tǒng)的研制HYPERLINK"/detail.htm?

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論