版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1緒論1.1系統(tǒng)目的近幾年人們的消費(fèi)觀念在逐漸的發(fā)生改變,越來(lái)越多的人選擇在網(wǎng)路上購(gòu)買(mǎi)自己所需要的產(chǎn)品,網(wǎng)購(gòu)就需要快遞這個(gè)行業(yè)支撐。不知不覺(jué)中快遞已經(jīng)成為大多數(shù)人生活中一個(gè)必不可少的東西。為了能更好的服務(wù)大家,就需要一個(gè)良好的物流系統(tǒng)來(lái)實(shí)現(xiàn)。1.2需求描述在開(kāi)始實(shí)現(xiàn)系統(tǒng)之前,首先得先做需求分析,有了良好的需求分析才能使得系統(tǒng)更好的進(jìn)行下去。該系統(tǒng)分為了兩大功能模塊:用戶(hù)模塊,管理員模塊。1.2.1用戶(hù)模塊a.注冊(cè),將用戶(hù)的姓名,密碼,手機(jī)號(hào)等信息記錄起來(lái)。b.登錄,用戶(hù)通過(guò)輸入用戶(hù)名和密碼登錄自己的賬號(hào),從而進(jìn)行更多的操作,不僅保護(hù)了用戶(hù)自己的個(gè)人數(shù)據(jù)不被他人操作,也告訴了系統(tǒng)是哪個(gè)用戶(hù)在進(jìn)行操作。c.修改密碼,提高用戶(hù)體驗(yàn)d.評(píng)論,記錄用戶(hù)的評(píng)論能更好的了解用戶(hù)的需求,這樣有利于后期對(duì)系統(tǒng)的完善。e.下單,新增訂單,記錄用戶(hù)的快遞信息。f.訂單查詢(xún),將訂單的詳細(xì)信息展示給用戶(hù),提高用戶(hù)體驗(yàn)。1.2.2管理員模塊a.用戶(hù)的增刪改查,作為該系統(tǒng)的操作與維護(hù)者,需要有更多的權(quán)限。不僅可以新增普通用戶(hù),而且也能新增配送員,還能增加管理員。b.訂單進(jìn)行增刪改查,能更好的展示數(shù)據(jù)的時(shí)效性。c.對(duì)用戶(hù)評(píng)論進(jìn)行回復(fù)。1.3系統(tǒng)的可行性分析技術(shù)可行性是決定整個(gè)物流管理系統(tǒng)成效的最直接的因素,沒(méi)有堅(jiān)實(shí)可靠的技術(shù)作為支持,物流管理系統(tǒng)就無(wú)法正常穩(wěn)定的運(yùn)行。研究人員首先需要分析物流管理系統(tǒng)的技術(shù)特點(diǎn),然后結(jié)合系統(tǒng)的應(yīng)用特點(diǎn)進(jìn)行全面分析這樣才能夠搭建一個(gè)良好的系統(tǒng)。因?yàn)閖ava是一門(mén)強(qiáng)大的而且簡(jiǎn)單易用的面向?qū)ο笳Z(yǔ)言編程語(yǔ)言,Java具有簡(jiǎn)單性、面向?qū)ο蟆⒎植际?、健壯性、安全性等特點(diǎn),能更好的滿足需求。Mysql也是一非常強(qiáng)大的數(shù)據(jù)庫(kù),而且還是開(kāi)源(免費(fèi))的。1.4開(kāi)發(fā)環(huán)境該系統(tǒng)是一個(gè)基于jsp+Mysql實(shí)現(xiàn)的web系統(tǒng)。采用的是前后端分離技術(shù),前臺(tái)主要是html,css,js,jQuery,jsp,Ajax來(lái)實(shí)現(xiàn)的,后端采用的編程預(yù)言是java,java代碼來(lái)處理操作數(shù)據(jù)的邏輯,持久層是利用Mysql數(shù)據(jù)庫(kù)來(lái)記錄數(shù)據(jù)。前端主要用的是WebStorm這款軟件編寫(xiě)的,java代碼是用eclipse編寫(xiě)的,持久層使用Navicat來(lái)編寫(xiě)sql語(yǔ)句。雖然eclipse這一個(gè)應(yīng)用軟件能滿足以上代碼的編寫(xiě),但其對(duì)于前端的編程和sql的編寫(xiě)太過(guò)于繁瑣,所以為了提高代碼的質(zhì)量,采用了三款軟件對(duì)代碼進(jìn)行編寫(xiě)。該系統(tǒng)是在Windows操作系統(tǒng),jdk1,8,Tomcat下設(shè)計(jì)實(shí)現(xiàn)的。2系統(tǒng)相關(guān)技術(shù)2.1JspServlet是sun公司制定的一種擴(kuò)展web服務(wù)器功能的組件規(guī)范。web服務(wù)器只能夠處理靜態(tài)資源的請(qǐng)求(即需要事先將靜態(tài)頁(yè)面寫(xiě)好),不能夠處理動(dòng)態(tài)資源的請(qǐng)求(即需要進(jìn)行計(jì)算,生成動(dòng)態(tài)頁(yè)面),所以,需要擴(kuò)展其功能??梢允褂肧ervlet來(lái)擴(kuò)展web服務(wù)器功能,web服務(wù)器收到請(qǐng)求之后,如果需要計(jì)算,則調(diào)用Servlet來(lái)處理。圖2-1Servlet工作原理圖Servlet的工作主要分成6步:a.瀏覽器依據(jù)ip和port建立連接。b.瀏覽器將相關(guān)數(shù)據(jù)放到請(qǐng)求數(shù)據(jù)包,然后將請(qǐng)求數(shù)據(jù)包發(fā)送給服務(wù)器。c.服務(wù)器解析請(qǐng)求數(shù)據(jù)包,將解析到的結(jié)果放到請(qǐng)求對(duì)象里面,同時(shí),創(chuàng)建一個(gè)響應(yīng)對(duì)象。d.服務(wù)器依據(jù)請(qǐng)求路徑,創(chuàng)建Servlet對(duì)象,然后調(diào)用該對(duì)象的service方法。e.容器從響應(yīng)對(duì)象中取出處理結(jié)果,然后創(chuàng)建響應(yīng)數(shù)據(jù)包并發(fā)送給瀏覽器。f.瀏覽器解析響應(yīng)數(shù)據(jù)包,生成結(jié)果頁(yè)面。jsp是sun公司制訂的一種服務(wù)器端動(dòng)態(tài)頁(yè)面技術(shù)規(guī)范。其本質(zhì)就是一個(gè)Servlet。雖然可以使用Servlet來(lái)實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面效果,但是過(guò)于繁瑣,并且不利于頁(yè)面的維護(hù)(比如,要修改頁(yè)面就必須修改java代碼),所以,sun制訂了一個(gè)全新的技術(shù)規(guī)范,即jsp規(guī)范。jsp文件中主要包含了html和少量的java代碼,容器在啟動(dòng)的時(shí)候會(huì)將jsp文件自動(dòng)編譯成一個(gè)對(duì)應(yīng)的Servlet然后執(zhí)行。2.2Ajax在傳統(tǒng)開(kāi)發(fā)模式中,瀏覽器向服務(wù)器提交請(qǐng)求的方式有:改變?yōu)g覽器地址欄中的URL、FORM表單,這2種方式發(fā)出請(qǐng)求后,由瀏覽器直接處理服務(wù)器的響應(yīng),而瀏覽器的響應(yīng)方式就是直接把響應(yīng)正文顯示在瀏覽器中!為了使得客戶(hù)端可以自行發(fā)出請(qǐng)求,并自行處理結(jié)果,而不是由瀏覽器把響應(yīng)的結(jié)果直接顯示出來(lái),則需要使用到異步請(qǐng)求!AJAX是在網(wǎng)頁(yè)客戶(hù)端通過(guò)Javascript發(fā)出異步請(qǐng)求的做法,傳統(tǒng)的AJAX開(kāi)發(fā)比較麻煩,通常,會(huì)結(jié)合jQuery框架來(lái)使用。其發(fā)送的是json類(lèi)型的數(shù)據(jù)。其語(yǔ)法特征是:整個(gè)數(shù)據(jù)是使用大括號(hào)框住的;各組屬性之間使用逗號(hào)分隔;使用冒號(hào)分隔屬性名稱(chēng)與屬性值;屬性名稱(chēng)使用雙引號(hào)框??;如果屬性值是字符串,也需要使用雙引號(hào)框?。粚傩灾悼梢允腔拘蛿?shù)據(jù)(數(shù)值型、字符串、布爾值),也可以是另一個(gè)對(duì)象(使用`{}`),或數(shù)組(使用`[]`)。2.3MysqlMysql是一個(gè)非常流行的關(guān)系型數(shù)據(jù)庫(kù),由于該系統(tǒng)是一個(gè)WEB應(yīng)用,而Mysql在WEB應(yīng)用方面是最好關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)應(yīng)用軟件,所以該系統(tǒng)采用的是Mysql數(shù)據(jù)庫(kù)。2.4SSM框架SSM框架,即Spring、SpringMVC、MyBatis三個(gè)框架,SSM框架也是非常流行的2.4.1SpringSpring是一個(gè)輕量級(jí)的、用來(lái)簡(jiǎn)化企業(yè)級(jí)應(yīng)用開(kāi)發(fā)的開(kāi)發(fā)框架。Spring的一個(gè)核心模塊是Spring容器,用于管理對(duì)象(包括對(duì)象的創(chuàng)建及對(duì)象之間的依賴(lài)關(guān)系)。Spring的核心技術(shù)為IOC和AOP。IOC(InversionOfControll控制反轉(zhuǎn))對(duì)象之間的依賴(lài)關(guān)系應(yīng)該由容器來(lái)建立,,對(duì)象之間的耦合度會(huì)大大降低,提供高了系統(tǒng)的維護(hù)性。AOP即面向切面編程,是面向?qū)ο缶幊痰难永m(xù),AOP使得業(yè)務(wù)邏輯變得更加清晰,可以讓業(yè)務(wù)邏輯只關(guān)注業(yè)務(wù)本身。2.4.2SpringMVCSpringMVC框架解決了V-C的交互問(wèn)題,即視圖與控制器的交互問(wèn)題。SpringMVC組件:DispatcherServlet:前端控制器,主要職責(zé)是接收所有請(qǐng)求(根據(jù)配置文件來(lái)決定),并將請(qǐng)求轉(zhuǎn)發(fā)給對(duì)應(yīng)的控制器,接收控制器的處理結(jié)果,確定最終由哪個(gè)視圖完成響應(yīng)!HandlerMapping:處理請(qǐng)求路徑與控制器的映射關(guān)系。Controller:實(shí)際處理請(qǐng)求的組件,例如接收請(qǐng)求參數(shù),決定最終是轉(zhuǎn)發(fā)或重定向的方式來(lái)響應(yīng)。ModelAndView:控制器的處理結(jié)果,其中的Model表示轉(zhuǎn)發(fā)的數(shù)據(jù)(如果是重定向,則Model沒(méi)有意義),而View表示最終負(fù)責(zé)響應(yīng)的視圖組件的名稱(chēng)。ViewResolver:根據(jù)視圖組件的名稱(chēng),確定具體使用的是哪個(gè)視圖組件。圖2-2SpringMVC的原理圖2.4.3MyBatisMyBatis是優(yōu)秀的、簡(jiǎn)化持久層開(kāi)發(fā)的框架,MyBatis簡(jiǎn)單易用,使用時(shí)只要定義數(shù)據(jù)操作接口的抽象方法,然后在編寫(xiě)與之關(guān)聯(lián)的sql語(yǔ)句。MyBatis是一個(gè)獨(dú)立的框架,能單獨(dú)使用,但是比較麻煩,結(jié)合Spring框架和SpringMVC來(lái)使用會(huì)使得操作變得相對(duì)簡(jiǎn)單。3系統(tǒng)數(shù)據(jù)庫(kù)的設(shè)計(jì)3.1用戶(hù)信息表(user)用戶(hù)信息表記錄的是用戶(hù)的詳細(xì)信息。其結(jié)構(gòu)如下:表3-1用戶(hù)信息表字段名稱(chēng)類(lèi)型含義idint主鍵,表示數(shù)據(jù)的唯一性u(píng)sernamevarchar(15)用戶(hù)姓名user_telvarchar(15)用戶(hù)手機(jī)號(hào)碼passwordchar(32)密碼customer_idint用戶(hù)類(lèi)型(包含普通用戶(hù),管理員,配送員)saltchar(32)鹽值is_deleteint是否刪除,用來(lái)判斷數(shù)據(jù)是否被刪除created_timedatetime創(chuàng)建時(shí)間created_uservarchar(20)創(chuàng)建人modified_uservarchar(20)最后一次修改人modified_timedatetime最后一次修改時(shí)間其中varchar表示為可變長(zhǎng)度的字符串,括號(hào)后面的數(shù)字表示字符串的最大長(zhǎng)度;char表示固定長(zhǎng)度的字符串,括號(hào)里面的數(shù)字表示的是字符串的長(zhǎng)度;datetime是用來(lái)保存時(shí)間的類(lèi)型,保存年月日時(shí)分秒,默認(rèn)值為null,最大值9999-12-31。表中后四個(gè)字段是用來(lái)記日志的,方便追蹤數(shù)據(jù)。3.2評(píng)論信息表(comment)評(píng)論信息表記錄的是用戶(hù)的評(píng)論信息和管理員回復(fù)信息,其結(jié)構(gòu)如下:字段名稱(chēng)類(lèi)型含義idint主鍵,表示數(shù)據(jù)的唯一性customer_idint客戶(hù)id,用來(lái)記錄評(píng)論的用戶(hù)REMAKEvarchar(100)用戶(hù)評(píng)論內(nèi)容REPLYvarchar(100)管理員回復(fù)內(nèi)容REPLY_idint管理員id,用來(lái)記錄回復(fù)管理員信息is_deleteint是否刪除,用來(lái)判斷數(shù)據(jù)是否被刪除created_timedatetime創(chuàng)建時(shí)間created_uservarchar(20)創(chuàng)建人modified_timevarchar(20)最后一次修改人modified_userdatetime最后一次修改時(shí)間表3-2評(píng)論信息表(comment)3.3地址管理表(t_area)物流是離不開(kāi)地址管理的,所以應(yīng)當(dāng)創(chuàng)建一個(gè)地址管理表來(lái)將全國(guó)的地址信息記錄下來(lái),由于全國(guó)的省市縣數(shù)據(jù)量較大,所以不可能去一條條的新增,而且關(guān)于地址的管理網(wǎng)上有很多現(xiàn)成的sql,可拿過(guò)來(lái)直接使用,其表結(jié)構(gòu)如下:表3-3地址管理表(t_area)字段名稱(chēng)類(lèi)型含義areaIdint地區(qū)IdareaCodevarchar(50)地區(qū)編碼areaNamevarchar(20)地區(qū)名levelint地區(qū)級(jí)別(1:省份,2:市3:區(qū)縣cityCodevarchar(50)城市編碼centervarchar(50)城市中心點(diǎn)(即:經(jīng)緯度坐標(biāo))parentIdint地區(qū)父節(jié)點(diǎn)地址表里面的數(shù)據(jù)是固定的,所以沒(méi)有添加日志四項(xiàng)和is_delete字段。3.4枚舉值表(fix_code)枚舉值表用來(lái)記錄不同的枚舉值,比如用戶(hù)的類(lèi)型,訂單的狀態(tài)等,相較于直接使用值類(lèi)型去做判斷,枚舉類(lèi)型更易讀,能夠提升代碼的可讀性和易維護(hù)性。該表結(jié)構(gòu)如下:表3-4枚舉值表(fix_code)字段名稱(chēng)類(lèi)型含義CODE_TYPEvarchar(20)枚舉值類(lèi)型CODEint枚舉值CODE_NAMEvarchar(20)枚舉名稱(chēng)TYPE_NAMEvarchar(20)枚舉類(lèi)型名稱(chēng)created_timedatetime創(chuàng)建時(shí)間created_uservarchar(20)創(chuàng)建人modified_timedatetime最后一次修改時(shí)間modified_uservarchar(20)最后一次修改人3.5訂單信息表(t_order)訂單信息表記錄的是訂單的詳細(xì)信息。其結(jié)構(gòu)如下:表3-5訂單信息表(t_order)字段名稱(chēng)類(lèi)型含義idint主鍵,表示數(shù)據(jù)的唯一性mail_namevarchar(20)寄件人姓名mail_telint寄件人手機(jī)號(hào)碼mail_pidint寄件省idmail_cidint寄件市idmail_aidint寄件區(qū)/縣idmail_addressvarchar(50)寄件詳細(xì)地址receipt_namevarchar(20)收件人姓名receipt_telvarchar(20)收件人手機(jī)號(hào)碼receipt_pidint收件省idreceipt_cidint收件市idreceipt_aidint收件區(qū)/縣idreceipt_addressvarchar(50)收件詳細(xì)地址statusint訂單狀態(tài)(枚舉值)is_deleteint是否刪除created_timedatetime創(chuàng)建時(shí)間created_uservarchar(20)創(chuàng)建人modified_timedatetime最后一次修改時(shí)間modified_uservarchar(20)最后一次修改人4系統(tǒng)設(shè)計(jì)4.1系統(tǒng)結(jié)構(gòu)圖4-1系統(tǒng)結(jié)構(gòu)圖系統(tǒng)的名稱(chēng)為SF-logistics,是一個(gè)Mavenwar系統(tǒng)。在src/main/java目錄下創(chuàng)建包c(diǎn)om.cbb.logistics來(lái)存放java代碼,其內(nèi)部結(jié)構(gòu)如下:圖4-2java代碼結(jié)構(gòu)圖其中controller包存放的都是控制器類(lèi);entity包下存放的都是實(shí)體類(lèi),filter下存放的是過(guò)濾器;interceptor目錄下存放的是攔截器;mapper類(lèi)下面存放的是持久層接口;service包下存放的是業(yè)務(wù)層接口,其子包ex下存放的是異常類(lèi),子包impl下存放的是業(yè)務(wù)層實(shí)現(xiàn)類(lèi)。util包下存放的是幫助類(lèi);VO類(lèi)存放的是多表查詢(xún)的實(shí)體類(lèi)。每個(gè)包下存放的類(lèi)都應(yīng)當(dāng)屬于同一類(lèi)型,這樣使得結(jié)構(gòu)清晰,方便閱讀和維護(hù)。所有的前臺(tái)代碼都存放在src/main/webapp目錄下,其內(nèi)部結(jié)構(gòu)如下:圖4-3前端代碼結(jié)構(gòu)圖其中web文件夾下面存放的是.html文件;css文件夾下面存放的是.css文件,js目錄下存放的是.js文件;img目錄下存放的是圖片;WEB-INF目錄下有.jsp文件,還有配置文件web.xml,該目錄下的.jsp文件是不能直接通過(guò)瀏覽器輸入地址訪問(wèn)的,必須是服務(wù)器內(nèi)部通過(guò)轉(zhuǎn)發(fā)或重定向才能訪問(wèn)。持久層的代碼寫(xiě)在src/main/resources下的mapper文件夾下面,一個(gè)xml映射文件,都會(huì)對(duì)應(yīng)一個(gè)持久層接口,對(duì)應(yīng)關(guān)系為xml文件的namespace值與持久層接口的全限名相同;而xml文件中的每一個(gè)Statement的id屬性值與的接口的方法名相等而形成對(duì)于關(guān)系;接口方法內(nèi)的參數(shù),就是傳遞給sql的參數(shù)。Mapper接口是沒(méi)有實(shí)現(xiàn)類(lèi)的,當(dāng)調(diào)用接口方法時(shí),接口全限名+方法名拼接字符串作為主鍵值,可唯一對(duì)應(yīng)一個(gè)MapperStatement對(duì)象。在Mybatis中,每一個(gè)增刪改查標(biāo)簽,都會(huì)被解析為一個(gè)MapperStatement對(duì)象。4.2用戶(hù)模塊4.2.1注冊(cè)由于大部分的表都含有日志的四項(xiàng),所以在設(shè)計(jì)實(shí)體類(lèi)前,先設(shè)計(jì)實(shí)體類(lèi)的基類(lèi)。在entity包下面按照javaBean的設(shè)計(jì)模式創(chuàng)建實(shí)體類(lèi)基類(lèi)BaseEntity,將日志四項(xiàng)createdUser(創(chuàng)建人)、createdTime(創(chuàng)建時(shí)間)、moidifiedUser(修改人)、modifiedTime(修改時(shí)間)申明成私有屬性,并生成對(duì)應(yīng)的get、set方法和toString方法。并實(shí)現(xiàn)序列化接口Serializable,并生成序列化版本號(hào)。在entity中創(chuàng)建用戶(hù)實(shí)體類(lèi)User,繼承BaseEntity,申明私有化屬性id(用戶(hù)自增長(zhǎng)id)、username(用戶(hù)姓名)、userTel(用戶(hù)手機(jī)號(hào))、password(密碼)、customerId(用戶(hù)類(lèi)型)、salt(鹽值)、isDelete(是否刪除),同樣生成get、set方法和toString方法。為了保護(hù)用戶(hù)的信息,需要對(duì)用戶(hù)的密碼進(jìn)行加密處理,而不是直接將用戶(hù)的密碼記錄在數(shù)據(jù)庫(kù)中。加密算法有:對(duì)稱(chēng)加密、非對(duì)稱(chēng)加密。無(wú)論是哪種,在已知加密過(guò)程的各項(xiàng)數(shù)據(jù)參數(shù)后,都可以根據(jù)密文運(yùn)算得到原文。通常,密碼的存儲(chǔ)并不使用這些加密算法,而是使用消息摘要(MessageDigest)算法。消息摘要的特征有:使用特定的摘要算法,得到的摘要數(shù)據(jù)的長(zhǎng)度是固定的;使用相同的原文,必然得到相同的摘要;使用不同的原文,可能得到相同的摘要,但是,機(jī)率非常非常低;消息摘要是不可被逆運(yùn)算的!常見(jiàn)的消息摘要算法有SHA家族(SecureHashAlgorithm)算法,MD系列。在Java原生API中,有`java.security.MessageDigest`類(lèi),用于處理消息摘要運(yùn)算,但是,使用相對(duì)繁瑣,通常,會(huì)使用其它API來(lái)實(shí)現(xiàn),例如,在Spring和Apache中都有`DigestUtils`工具類(lèi),可以用于摘要運(yùn)算,前者需要添加Spring的依賴(lài),后者需要添加`commons-codec`的依賴(lài):<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.10</version> </dependency>為進(jìn)一步增加密碼的安全性,采取了加鹽操作和多次加密操作,其方法如下: privateStringgetEncrpytedPassword(Stringpassword,Stringsalt){ Stringpwd=password+salt;//將密碼與鹽值拼接 for(inti=0;i<5;i++){//循環(huán)5次加密 pwd=DigestUtils.md5Hex(pwd); } returnpwd;//返回 }首先在com.cbb.logistics.mapper包下創(chuàng)建接口UserMapper,創(chuàng)建抽象方法Integerinsert(Useruser)和UserfindByName(Stringn);在src/main/resources下創(chuàng)建一個(gè)mapper文件夾,該文件夾下面存放放的是持久層接口對(duì)應(yīng)的xml文件。在該目錄下創(chuàng)建UserMapper.xml文件。在該xml文件中創(chuàng)建兩個(gè)方法的映射。業(yè)務(wù)層在com.cbb.logistics.service包下創(chuàng)建建IUserService接口,聲明抽象方法User(Useruser),com.cbb.logistics.service.impl包下創(chuàng)建其實(shí)現(xiàn)類(lèi)UserServiceImpl,并重寫(xiě)抽象方法如下:publicUseruserReg(Useruser){ //驗(yàn)證輸入格式 if(!TextValidator.checkUsername(user.getUsername())){ thrownewUsernameFormatException("用戶(hù)名格式不正確!"); } if(!TextValidator.checkPassword(user.getPassword())){ thrownewPasswordFormatException("密碼的格式不正確!"); } if(!TextValidator.checkPhone(user.getUserTel())){ thrownewPhoneFormatException("手機(jī)號(hào)碼的格式不正確!"); } Stringusername=user.getUsername(); //根據(jù)用戶(hù)名查詢(xún)用戶(hù)信息 Userdata=findByName(username); if(data!=null){//如果用戶(hù)已存在,則拋出用戶(hù)沖突異常 thrownewUsernameConflictException("您嘗試注冊(cè)的用戶(hù)名"+username+"以被占用!"); } //反之說(shuō)明用戶(hù)是不存在的,則執(zhí)行插入數(shù)據(jù)操作 try{ Userr=insertUserInfo(user); returnr; }catch(InsertDataExceptione){ throwe; } } privateUserinsertUserInfo(Useruser){ //在參數(shù)user中封裝那些不由外部提供的數(shù)據(jù): //1.生成隨機(jī)鹽,并封裝到user中 Stringsalt=UUID.randomUUID().toString(); user.setSalt(salt); //2.取出user中原密碼執(zhí)行加密,并封裝回user中 Stringpassword=getEncrpytedPassword(user.getPassword(),salt); user.setPassword(password); //3.設(shè)置customerId為普通用戶(hù)(10001001) user.setCustomerId(FixCode.USER_TYPE_CUSTOMER); //4.設(shè)置isDelete為0 user.setIsDelete(FixCode.IS_DELETE_NO); //5.日志的4項(xiàng) user.setCreatedUser(FixCode.SYSTEM);//"System" user.setCreatedTime(newDate()); user.setModifiedUser(FixCode.SYSTEM); user.setModifiedTime(newDate()); //調(diào)用持久層對(duì)象的方法實(shí)現(xiàn)功能,并獲取返回值 Integerrows=userMapper.insert(user); if(rows!=1){//拋出InsertDataException異常 thrownewInsertDataException("增加用戶(hù)數(shù)據(jù)時(shí)發(fā)生未知錯(cuò)誤!請(qǐng)聯(lián)系系統(tǒng)的管理員進(jìn)行處理!"); } returnuser; }注冊(cè)前臺(tái)頁(yè)面如下:圖4-1用戶(hù)注冊(cè)圖首先在com.cbb.logistics.controller創(chuàng)建控制器層基類(lèi)BaseController,可以在基類(lèi)處理控制器層拋出的異常,和控制器層共有的方法。創(chuàng)建UserController繼承BaseController,添加類(lèi)注解@Controller和@RequestMapping("/user"),通過(guò)添加@RequestMapping("/user")注解表示該控制器都在/user目錄下。創(chuàng)建注冊(cè)方法,在方法上添加注解@ResponseBody和@RequestMapping(value="/handle_reg.do",method=RequestMethod.POST),@ResponseBody表示返回值為json字符串,@RequestMapping注解的value表示請(qǐng)求路徑,method屬性的值表示前端發(fā)送的請(qǐng)求為POST請(qǐng)求。用戶(hù)填選數(shù)據(jù)進(jìn)行注冊(cè),通過(guò)注冊(cè)按鈕的點(diǎn)擊事件發(fā)送Ajax請(qǐng)求給后臺(tái),判斷返回值,如果是200表示注冊(cè)成功,則跳轉(zhuǎn)到登錄頁(yè)面;如果不是200,根據(jù)不同的返回值判斷注冊(cè)失敗原因,提示用戶(hù)按照要求注冊(cè)。4.2.2登錄登錄在持久層里利用注冊(cè)持久層的方法findByName。業(yè)務(wù)層在IUserService創(chuàng)建抽象方法Userlogin(Strringusername,Stringpassword);并在UserServiceImpl實(shí)現(xiàn)該方法如下:publicUseruserLogin(Stringusername,Stringpassword){ //驗(yàn)證格式 if(!TextValidator.checkUsername(username)){//用戶(hù)名格式不正確 thrownewUsernameFormatException("用戶(hù)名格式不正確!"); } if(!TextValidator.checkPassword(password)){//密碼格式不正確 thrownewPasswordFormatException("密碼格式不正確"); } Userdata=findByName(username);//根據(jù)用戶(hù)名查找用戶(hù)數(shù)據(jù) if(data==null){//用戶(hù)名不存在 thrownewUserNotFoundException("用戶(hù)名不存在!"); } Stringsalt=data.getSalt(); //獲取鹽值//將顏值和用戶(hù)輸入的密碼進(jìn)行加密 Stringpwd=getEncrpytedPassword(password,salt); if(!pwd.equals(data.getPassword())){//加密后的密碼和數(shù)據(jù)庫(kù)中用戶(hù)密碼不一致 thrownewPasswordNotMatchException("密碼錯(cuò)誤"); } data.setSalt(null);//登錄成功將密碼和顏值設(shè)置為null data.setPassword(null); returndata; }控制器層在UserController類(lèi)中創(chuàng)建注冊(cè)方法:@ResponseBody @RequestMapping(value="/login.do",method=RequestMethod.POST) publicResponseResult<Void>userLogin(Stringusername,Stringpassword,HttpSessionsession){ //驗(yàn)證格式 if(!TextValidator.checkUsername(username)){//用戶(hù)名格式不正確 thrownewUsernameFormatException("用戶(hù)名格式不正確!"); } if(!TextValidator.checkPassword(password)){//密碼格式不正確 thrownewPasswordFormatException("密碼格式不正確"); } Useruser=userService.userLogin(username,password); //登錄 //將登錄成功的user的id和username和customerId綁定到session中 session.setAttribute("uid",user.getId()); session.setAttribute("uname",user.getUsername()); session.setAttribute("cid",user.getCustomerId()); returnnewResponseResult<Void>(); }并返回json給前端。前臺(tái)用戶(hù)通過(guò)輸入用戶(hù)名和密碼進(jìn)行登錄,當(dāng)用戶(hù)名密碼全部輸入正確后才能登錄,并將用戶(hù)的id和name和用戶(hù)類(lèi)型綁定在session中。否則提示用戶(hù)錯(cuò)誤信息。后期的很多功能是建立在登錄上的,,而且不同的用戶(hù)的操作權(quán)限也是不相同的,這些都是通過(guò)獲取session中綁定的數(shù)據(jù)來(lái)進(jìn)行判斷的。4.2.3修改密碼登錄成功后,點(diǎn)擊用戶(hù)身份進(jìn)入用戶(hù)信息界面,將用戶(hù)的用戶(hù)名和手機(jī)號(hào)顯示出來(lái),而一些敏感的數(shù)據(jù)如密碼就不顯示。用戶(hù)可以點(diǎn)擊修改密碼按鈕來(lái)修改密碼,只有當(dāng)原密碼輸入正確的時(shí)候才能修改密碼,一旦修改密碼操作成功,用戶(hù)就需要重新登錄。其頁(yè)面如下:圖4-2修改密碼4.2.4評(píng)論用戶(hù)可以進(jìn)行評(píng)論,該功能同樣是需要用戶(hù)進(jìn)行登錄操作。用戶(hù)進(jìn)入評(píng)論界面,首先展示10條最新的評(píng)論以及管理員的回復(fù),用戶(hù)可以在文本域中輸入內(nèi)容進(jìn)行評(píng)論,系統(tǒng)會(huì)將用戶(hù)輸入的信息和用戶(hù)的用戶(hù)id記錄下來(lái),每當(dāng)用戶(hù)評(píng)論成功后會(huì)再次刷新評(píng)論區(qū)的內(nèi)容。4.2.5寄件用戶(hù)寄件也是需要用戶(hù)登錄才能進(jìn)行操作的。進(jìn)入寄件頁(yè)面,首先向服務(wù)器發(fā)送請(qǐng)求,將所有的省全部查詢(xún)出來(lái),顯示到下拉選中供用戶(hù)選擇。當(dāng)用戶(hù)選擇對(duì)應(yīng)的省份后,會(huì)向服務(wù)器發(fā)送請(qǐng)求獲取當(dāng)前省對(duì)應(yīng)的市,同理當(dāng)市發(fā)送改變的時(shí)候會(huì)將對(duì)應(yīng)的區(qū)縣查詢(xún)出來(lái)。用戶(hù)通過(guò)填選寄件的詳細(xì)信息來(lái)下單,并會(huì)生成對(duì)應(yīng)的訂單號(hào),默認(rèn)提交的訂單狀態(tài)為已生成,當(dāng)訂單保存成功后,會(huì)跳轉(zhuǎn)到我的訂單頁(yè)面。訂單頁(yè)面會(huì)展示當(dāng)前登錄人創(chuàng)建的所有訂單詳細(xì)信息。圖4-3寄件人信息圖4-4收件人信息4.2.6訂單查詢(xún)用戶(hù)不僅能通過(guò)訂單頁(yè)面查詢(xún)自己創(chuàng)建的訂單,也可以通過(guò)輸入訂單號(hào)來(lái)查詢(xún)對(duì)應(yīng)的訂單。通過(guò)輸入號(hào)碼
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度出租房水電費(fèi)分時(shí)電價(jià)應(yīng)用合同3篇
- 二零二五年度農(nóng)場(chǎng)租賃合同農(nóng)業(yè)產(chǎn)業(yè)鏈整合協(xié)議4篇
- 2025版新型綠色建材采購(gòu)供應(yīng)合同4篇
- 2025年度電商企業(yè)風(fēng)險(xiǎn)管理與服務(wù)協(xié)議4篇
- 2025年度民間擔(dān)保公司資產(chǎn)抵押擔(dān)保合同模板4篇
- 2025年度門(mén)業(yè)市場(chǎng)調(diào)研與營(yíng)銷(xiāo)策劃合同4篇
- 二零二五年度農(nóng)產(chǎn)品電商平臺(tái)物流配送合同3篇
- 地域文學(xué)中的地域特色語(yǔ)言-深度研究
- 2025年度船舶空調(diào)系統(tǒng)檢修與維護(hù)合同4篇
- 2025年度個(gè)人與體育公司贊助貸款合同范本3篇
- 【地理】地圖的選擇和應(yīng)用(分層練) 2024-2025學(xué)年七年級(jí)地理上冊(cè)同步備課系列(人教版)
- (正式版)CB∕T 4552-2024 船舶行業(yè)企業(yè)安全生產(chǎn)文件編制和管理規(guī)定
- JBT 14588-2023 激光加工鏡頭 (正式版)
- 2024年四川省成都市樹(shù)德實(shí)驗(yàn)中學(xué)物理八年級(jí)下冊(cè)期末質(zhì)量檢測(cè)試題含解析
- 九型人格與領(lǐng)導(dǎo)力講義
- 廉潔應(yīng)征承諾書(shū)
- 2023年四川省成都市中考物理試卷真題(含答案)
- 泵車(chē)述職報(bào)告
- 2024年山西文旅集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 恢復(fù)中華人民共和國(guó)國(guó)籍申請(qǐng)表
- 管理期貨的趨勢(shì)跟蹤策略 尋找危機(jī)阿爾法
評(píng)論
0/150
提交評(píng)論