Java EE( SSM + Spring Boot + Vue.js 3 )框架整合開發(fā) 課件 第9章 電子商務(wù)平臺的設(shè)計與實(shí)現(xiàn)(Spring Boot+Thymleaf+MyBatis)_第1頁
Java EE( SSM + Spring Boot + Vue.js 3 )框架整合開發(fā) 課件 第9章 電子商務(wù)平臺的設(shè)計與實(shí)現(xiàn)(Spring Boot+Thymleaf+MyBatis)_第2頁
Java EE( SSM + Spring Boot + Vue.js 3 )框架整合開發(fā) 課件 第9章 電子商務(wù)平臺的設(shè)計與實(shí)現(xiàn)(Spring Boot+Thymleaf+MyBatis)_第3頁
Java EE( SSM + Spring Boot + Vue.js 3 )框架整合開發(fā) 課件 第9章 電子商務(wù)平臺的設(shè)計與實(shí)現(xiàn)(Spring Boot+Thymleaf+MyBatis)_第4頁
Java EE( SSM + Spring Boot + Vue.js 3 )框架整合開發(fā) 課件 第9章 電子商務(wù)平臺的設(shè)計與實(shí)現(xiàn)(Spring Boot+Thymleaf+MyBatis)_第5頁
已閱讀5頁,還剩140頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第九章電子商務(wù)平臺的設(shè)計與實(shí)現(xiàn)(SpringBoot+Thymleaf+MyBatis)授課教師:陳恒大連外國語大學(xué)本章目標(biāo)理解電子商務(wù)的業(yè)務(wù)流程掌握SpringBoot、MyBatis等框架技術(shù)掌握Thymeleaf表現(xiàn)層技術(shù)掌握基于Thymeleaf+MyBatis的SpringBootWeb應(yīng)用開發(fā)的流程、方法以及技術(shù)1本章內(nèi)容29.1系統(tǒng)設(shè)計9.2數(shù)據(jù)庫設(shè)計9.3系統(tǒng)管理9.4組件設(shè)計9.5后臺管理子系統(tǒng)的實(shí)現(xiàn)9.6前臺電子商務(wù)子系統(tǒng)的實(shí)現(xiàn)9.1系統(tǒng)設(shè)計9.1.1系統(tǒng)功能需求9.1.2系統(tǒng)模塊劃分39.1.1系統(tǒng)功能需求1.后臺管理子系統(tǒng)后臺管理子系統(tǒng)要求管理員登錄成功后,才能對商品進(jìn)行管理,包括添加商品、查詢商品、修改商品以及刪除商品。除商品管理外,管理員還需要對商品類型、注冊用戶以及用戶的訂單等進(jìn)行管理。42.電子商務(wù)子系統(tǒng)1)非注冊用戶非注冊用戶或未登錄用戶具有的功能如下:瀏覽首頁、查看商品詳情以及搜索商品的功能。2)用戶成功登錄的用戶除具有未登錄用戶具有的功能外,還具有購買商品、查看購物車、收藏商品、查看訂單、查看收藏以及查看用戶個人信息的功能。59.1系統(tǒng)設(shè)計9.1.1系統(tǒng)功能需求9.1.2系統(tǒng)模塊劃分61.后臺管理子系統(tǒng)7后臺管理子系統(tǒng)商品管理查詢訂單用戶管理安全退出新增商品刪除商品修改商品查詢商品查詢用戶刪除用戶類型管理新增類型刪除類型查詢類型2.電子商務(wù)子系統(tǒng)8本章內(nèi)容99.1系統(tǒng)設(shè)計9.2數(shù)據(jù)庫設(shè)計9.3系統(tǒng)管理9.4組件設(shè)計9.5后臺管理子系統(tǒng)的實(shí)現(xiàn)9.6前臺電子商務(wù)子系統(tǒng)的實(shí)現(xiàn)9.2數(shù)據(jù)庫設(shè)計9.2.1數(shù)據(jù)庫概念結(jié)構(gòu)設(shè)計9.2.2數(shù)據(jù)邏輯結(jié)構(gòu)設(shè)計9.2.3創(chuàng)建數(shù)據(jù)表109.2.1數(shù)據(jù)庫概念結(jié)構(gòu)設(shè)計119.2數(shù)據(jù)庫設(shè)計9.2.1數(shù)據(jù)庫概念結(jié)構(gòu)設(shè)計9.2.2數(shù)據(jù)邏輯結(jié)構(gòu)設(shè)計9.2.3創(chuàng)建數(shù)據(jù)表129.2.2數(shù)據(jù)邏輯結(jié)構(gòu)設(shè)計將數(shù)據(jù)庫概念結(jié)構(gòu)圖轉(zhuǎn)換為MySQL數(shù)據(jù)庫所支持的實(shí)際數(shù)據(jù)模型,即數(shù)據(jù)庫的邏輯結(jié)構(gòu)。13管理員信息表14字

段含義類

型長度是否為空id管理員ID(PK自增)int11noaname用戶名varchar50noapwd密碼varchar50no用戶信息表15字

段含義類

型長

度是否為空id用戶ID(PK自增)int11nobemailE-mailvarchar50nobpwd密碼varchar50no商品類型表16字

段含義類

型長

度是否為空idID(PK自增)int11notypename名稱varchar50no商品信息表17字

段含義類

型長

度是否為空id編號(PK自增)int11nogname名稱varchar50nogoprice原價double

nogrprice現(xiàn)價double

nogstore庫存int11nogpicture圖片varchar50

isRecommend是否推薦tinyint2noisAdvertisement是否廣告tinyint2nogoodstype_id類型(FK)int11no購物車表18字段含義類

型長

度是否為空idID(PK自增)int11nobusertable_id用戶ID(FK)int11nogoodstable_id商品編號(FK)int11noshoppingnum購買數(shù)量int11no關(guān)注表19字

段含義類

型長

度是否為空idID(PK自增)int11nogoodstable_id商品ID(FK)int11nobusertable_id用戶ID(FK)int11nofocustime收藏時間datetime

no訂單基礎(chǔ)表20字

段含義類

型長度是否為空idID(PK自增)int11nobusertable_id用戶ID(FK)int11noamount金額double

nostatus訂單狀態(tài)tinyint4noorderdate下單時間datetime

no訂單詳情表21字

段含義類

型長

度是否為空idID(PK自增)int11noorderbasetable_id訂單編號(FK)int11nogoodstable_id商品編號(FK)int11noshoppingnum購買數(shù)量int11no9.2數(shù)據(jù)庫設(shè)計9.2.1數(shù)據(jù)庫概念結(jié)構(gòu)設(shè)計9.2.2數(shù)據(jù)邏輯結(jié)構(gòu)設(shè)計9.2.3創(chuàng)建數(shù)據(jù)表229.2.3創(chuàng)建數(shù)據(jù)表根據(jù)9.2.2節(jié)的邏輯結(jié)構(gòu),創(chuàng)建數(shù)據(jù)表。篇幅有限,創(chuàng)建數(shù)據(jù)表代碼請讀者參考本書提供的源代碼ch9.sql。23本章內(nèi)容249.1系統(tǒng)設(shè)計9.2數(shù)據(jù)庫設(shè)計9.3系統(tǒng)管理9.4組件設(shè)計9.5后臺管理子系統(tǒng)的實(shí)現(xiàn)9.6前臺電子商務(wù)子系統(tǒng)的實(shí)現(xiàn)9.3系統(tǒng)管理9.3.1添加相關(guān)依賴9.3.2HTML頁面及靜態(tài)資源管理9.3.3應(yīng)用的包結(jié)構(gòu)9.3.4配置文件259.3.1添加相關(guān)依賴新建一個基于Thymeleaf+MyBatis的SpringBootWeb應(yīng)用eBusiness,在eBusiness應(yīng)用中開發(fā)本系統(tǒng)。除了STS快速創(chuàng)建基于Thymeleaf+MyBatis的SpringBootWeb應(yīng)用自帶的spring-boot-starter-thymeleaf、mybatis-spring-boot-starter和spring-boot-starter-web依賴外,還需要向eBusiness應(yīng)用的pom.xml文件中添加上傳文件依賴commons-fileupload、表單驗證依賴hibernate-validator以及MySQL連接器依賴。269.3系統(tǒng)管理9.3.1添加相關(guān)依賴9.3.2HTML頁面及靜態(tài)資源管理9.3.3應(yīng)用的包結(jié)構(gòu)9.3.4配置文件279.3.2HTML頁面及靜態(tài)資源管理系統(tǒng)由后臺管理和電子商務(wù)兩個子系統(tǒng)組成,為了方便管理,兩個子系統(tǒng)的HTML頁面分開存放。在src/main/resources/templates/admin目錄下存放與后臺管理子系統(tǒng)相關(guān)的HTML頁面;在src/main/resources/templates/user目錄下存放與電子商務(wù)子系統(tǒng)相關(guān)的HTML頁面;在src/main/resources/static目錄下存放與整個系統(tǒng)相關(guān)的BootStrap及jQuery。281.后臺管理子系統(tǒng)管理員在瀏覽器的地址欄中輸入http://localhost:8080/eBusiness/admin/toLogin訪問登錄頁面,登錄成功后,進(jìn)入后臺商品管理主頁面(adminGoods.html)292.電子商務(wù)子系統(tǒng)注冊用戶或游客在瀏覽器的地址欄中輸入http://localhost:8080/eBusiness可以訪問電子商務(wù)子系統(tǒng)的首頁(index.html)。309.3系統(tǒng)管理9.3.1添加相關(guān)依賴9.3.2HTML頁面及靜態(tài)資源管理9.3.3應(yīng)用的包結(jié)構(gòu)9.3.4配置文件319.3.3應(yīng)用的包結(jié)構(gòu)321.com.ch.ebusiness包該包中包括應(yīng)用的主程序類EBusinessApplication、統(tǒng)一異常處理類GlobalExceptionHandleController以及自定義異常類NoLoginException。2.com.ch.ebusiness.controller包系統(tǒng)的控制器類都在該包中,后臺管理相關(guān)的控制器類在admin子包中,電子商務(wù)相關(guān)的控制器類在before子包中。3.com.ch.ebusiness.entity包實(shí)體類存放在該包中。4.com.ch.ebusiness.repository包該包中存放的Java接口程序是實(shí)現(xiàn)數(shù)據(jù)庫的持久化操作。每個接口方法與SQL映射文件中的id相同。后臺管理相關(guān)的數(shù)據(jù)庫操作在admin子包中,電子商務(wù)相關(guān)的數(shù)據(jù)庫操作在before子包中。5.com.ch.ebusiness.service包service包中有兩個子包:admin和before,admin子包存放后臺管理相關(guān)業(yè)務(wù)層的接口與實(shí)現(xiàn)類;before子包存放電子商務(wù)相關(guān)業(yè)務(wù)層的接口與實(shí)現(xiàn)類。6.com.ch.ebusiness.util包該包中存放的是系統(tǒng)的工具類。9.3系統(tǒng)管理9.3.1添加相關(guān)依賴9.3.2HTML頁面及靜態(tài)資源管理9.3.3應(yīng)用的包結(jié)構(gòu)9.3.4配置文件339.3.4配置文件在配置文件perties中,配置了數(shù)據(jù)源、實(shí)體類包別名、映射文件位置、SQL日志、頁面熱部署及文件上傳等信息。34server.servlet.context-path=/eBusinessspring.datasource.url=jdbc:mysql://localhost:3306/shop?characterEncoding=utf8spring.datasource.username=rootspring.datasource.password=rootspring.datasource.driver-class-name=com.mysql.jdbc.Drivermybatis.type-aliases-package=com.ch.ebusiness.entitymybatis.mapperLocations=classpath:mappers/*.xml.ch.ebusiness.repository=debugspring.thymeleaf.cache=falsespring.servlet.multipart.max-file-size=50MB

spring.servlet.multipart.max-request-size=500MB本章內(nèi)容359.1系統(tǒng)設(shè)計9.2數(shù)據(jù)庫設(shè)計9.3系統(tǒng)管理9.4組件設(shè)計9.5后臺管理子系統(tǒng)的實(shí)現(xiàn)9.6前臺電子商務(wù)子系統(tǒng)的實(shí)現(xiàn)9.4組件設(shè)計9.4.1管理員登錄權(quán)限驗證9.4.2前臺用戶登錄權(quán)限驗證9.4.3驗證碼9.4.4統(tǒng)一異常處理9.4.5工具類369.4.1管理員登錄權(quán)限驗證從系統(tǒng)分析得知,管理員成功登錄后,才能管理商品、商品類型、用戶、訂單等功能模塊。因此,本系統(tǒng)需要對這些功能模塊的操作進(jìn)行管理員登錄權(quán)限控制。在com.ch.ebusiness.controller.admin包中創(chuàng)建AdminBaseController控制器類,該類中有一個@ModelAttribute注解的方法isLogin。isLogin方法的功能是判斷管理員是否已成功登錄。需要進(jìn)行管理員登錄權(quán)限控制的控制器類繼承AdminBaseController類即可,因為帶有@ModelAttribute注解的方法首先被控制器執(zhí)行。37AdminBaseController控制器類的核心代碼38@ControllerpublicclassAdminBaseController{

@ModelAttributepublicvoidisLogin(HttpSessionsession)throwsNoLoginException{if(session.getAttribute("auser")==null){thrownewNoLoginException("沒有登錄");}}}9.4組件設(shè)計9.4.1管理員登錄權(quán)限驗證9.4.2前臺用戶登錄權(quán)限驗證9.4.3驗證碼9.4.4統(tǒng)一異常處理9.4.5工具類399.4.2前臺用戶登錄權(quán)限驗證從系統(tǒng)分析得知,用戶成功登錄后,才能購買商品、收藏商品、查看購物車、我的訂單以及個人信息。與管理員登錄權(quán)限驗證同理,在com.ch.ebusiness.controller.before包中創(chuàng)建BeforeBaseController控制器類,該類中有一個@ModelAttribute注解的方法isLogin。isLogin方法的功能是判斷前臺用戶是否已成功登錄。需要進(jìn)行前臺用戶登錄權(quán)限控制的控制器類繼承BeforeBaseController類即可。BeforeBaseController控制器類的代碼與AdminBaseController基本一樣,為節(jié)省篇幅,不再贅述。409.4組件設(shè)計9.4.1管理員登錄權(quán)限驗證9.4.2前臺用戶登錄權(quán)限驗證9.4.3驗證碼9.4.4統(tǒng)一異常處理9.4.5工具類419.4.3驗證碼本系統(tǒng)驗證碼的使用步驟如下:1.創(chuàng)建產(chǎn)生驗證碼的控制器類在com.ch.ebusiness.controller.before包中,創(chuàng)建產(chǎn)生驗證碼的控制器類ValidateCodeController。2.使用驗證碼在需要驗證碼的HTML頁面中,調(diào)用產(chǎn)生驗證碼的控制器顯示驗證碼,示例代碼片段如下:<imgth:src="@{/validateCode}"id="mycode">429.4組件設(shè)計9.4.1管理員登錄權(quán)限驗證9.4.2前臺用戶登錄權(quán)限驗證9.4.3驗證碼9.4.4統(tǒng)一異常處理9.4.5工具類439.4.4統(tǒng)一異常處理系統(tǒng)對未登錄異常、數(shù)據(jù)庫操作異常以及程序未知異常進(jìn)行了統(tǒng)一異常處理。具體步驟如下:1.創(chuàng)建未登錄自定義異常44packagecom.ch.ebusiness;publicclassNoLoginExceptionextendsException{ privatestaticfinallongserialVersionUID=1L; publicNoLoginException(){ super(); } publicNoLoginException(Stringmessage){ super(message); }}2.創(chuàng)建統(tǒng)一異常處理類使用注解@ControllerAdvice和@ExceptionHandler創(chuàng)建統(tǒng)一異常處理類GlobalExceptionHandleController。使用注解@ControllerAdvice的類是一個增強(qiáng)的Controller類,在增強(qiáng)的控制器類中使用@ExceptionHandler注解的方法對所有控制器類進(jìn)行統(tǒng)一處理異常。45@ControllerAdvicepublicclassGlobalExceptionHandleController{

@ExceptionHandler(value=Exception.class) publicStringexceptionHandler(Exceptione,Modelmodel){ Stringmessage=""; //數(shù)據(jù)庫異常 if(einstanceofSQLException){ message="數(shù)據(jù)庫異常"; }elseif(einstanceofNoLoginException){ message="未登錄異常"; }else{//未知異常 message="未知異常"; } model.addAttribute("mymessage",message); return"myError"; }}9.4組件設(shè)計9.4.1管理員登錄權(quán)限驗證9.4.2前臺用戶登錄權(quán)限驗證9.4.3驗證碼9.4.4統(tǒng)一異常處理9.4.5工具類469.4.5工具類本系統(tǒng)使用的工具類有兩個:MD5Util和MyUtil。MD5Util工具用來對明文密碼加密,MyUtil工具里包含文件重命名和獲得用戶信息兩個功能。47本章內(nèi)容489.1系統(tǒng)設(shè)計9.2數(shù)據(jù)庫設(shè)計9.3系統(tǒng)管理9.4組件設(shè)計9.5后臺管理子系統(tǒng)的實(shí)現(xiàn)9.6前臺電子商務(wù)子系統(tǒng)的實(shí)現(xiàn)9.5后臺管理子系統(tǒng)的實(shí)現(xiàn)9.5.1管理員登錄9.5.2類型管理9.5.3添加商品9.5.4查詢商品9.5.5修改商品9.5.6刪除商品9.5.7查詢訂單9.5.8用戶管理9.5.9安全退出499.5.1管理員登錄管理員輸入用戶名和密碼后,系統(tǒng)將對管理員的用戶名和密碼進(jìn)行驗證。如果用戶名和密碼同時正確,則成功登錄,進(jìn)入后臺商品管理主頁面(adminGoods.html);如果用戶名或密碼有誤,則提示錯誤。502.編寫控制器層51@Controller@RequestMapping("/admin")publicclassAdminController{ @Autowired privateAdminServiceadminService;

@RequestMapping("/toLogin") publicStringtoLogin(@ModelAttribute("aUser")AUseraUser){ return"admin/login"; }

@RequestMapping("/login") publicStringlogin(@ModelAttribute("aUser")AUseraUser,HttpSessionsession,Modelmodel){ returnadminService.login(aUser,session,model); }}3.編寫Service層52publicStringlogin(AUseraUser,HttpSessionsession,Modelmodel){ List<AUser>list=adminRepository.login(aUser); if(list.size()>0){//登錄成功

session.setAttribute("auser",aUser); return"forward:/goods/selectAllGoodsByPage?currentPage=1&act=select"; }else{//登錄失敗 model.addAttribute("errorMessage","用戶名或密碼錯誤!"); return"admin/login"; }}?請思考

兩個return的區(qū)別?4.編寫SQL映射文件數(shù)據(jù)訪問層(Repository)僅由@Repository注解的接口組成,接口方法與SQL映射文件中SQL語句的id相同。管理員登錄的SQL映射文件為src/main/resources/mappers目錄下的AdminMapper.xml,實(shí)現(xiàn)的SQL語句如下:53<selectid="login"parameterType="AUser"resultType="AUser"> select*fromausertablewhereaname=#{aname}andapwd=#{apwd}</select>9.5后臺管理子系統(tǒng)的實(shí)現(xiàn)9.5.1管理員登錄9.5.2類型管理9.5.3添加商品9.5.4查詢商品9.5.5修改商品9.5.6刪除商品9.5.7查詢訂單9.5.8用戶管理9.5.9安全退出549.5.2類型管理管理員登錄成功后,管理商品類型。類型管理分為添加類型和刪除類型。559.5后臺管理子系統(tǒng)的實(shí)現(xiàn)9.5.1管理員登錄9.5.2類型管理9.5.3添加商品9.5.4查詢商品9.5.5修改商品9.5.6刪除商品9.5.7查詢訂單9.5.8用戶管理9.5.9安全退出569.5.3添加商品572.編寫控制器層58@RequestMapping("/toAddGoods")publicStringtoAddGoods(@ModelAttribute("goods")Goodsgoods,Modelmodel){ goods.setIsAdvertisement(0); goods.setIsRecommend(1); returngoodsService.toAddGoods(goods,model);}@RequestMapping("/addGoods")publicStringaddGoods(@ModelAttribute("goods")Goodsgoods,HttpServletRequestrequest,Stringact)throwsIllegalStateException,IOException{ returngoodsService.addGoods(goods,request,act);}添加商品”超鏈接“goods/toAddGoods”“添加”的請求路徑“goods/addGoods?act=add”3.編寫Service層59@OverridepublicStringaddGoods(Goodsgoods,HttpServletRequestrequest,Stringact)throwsIllegalStateException,IOException{ //實(shí)現(xiàn)商品圖片上傳 //實(shí)現(xiàn)商品添加到數(shù)據(jù)庫

}@OverridepublicStringtoAddGoods(Goodsgoods,Modelmodel){ //導(dǎo)航到商品添加頁面

}4.編寫SQL映射文件60<!--添加商品--><insertid="addGoods"parameterType="Goods"> insertintogoodstable(id,gname,goprice,grprice,gstore,gpicture,isRecommend,isAdvertisement,goodstype_id) values(null,#{gname},#{goprice},#{grprice},#{gstore},#{gpicture},#{isRecommend},#{isAdvertisement},#{goodstype_id})</insert><!--查詢商品類型--><selectid="selectAllGoodsType"resultType="GoodsType"> select*fromgoodstype</select>9.5后臺管理子系統(tǒng)的實(shí)現(xiàn)9.5.1管理員登錄9.5.2類型管理9.5.3添加商品9.5.4查詢商品9.5.5修改商品9.5.6刪除商品9.5.7查詢訂單9.5.8用戶管理9.5.9安全退出619.5.4查詢商品622.編寫控制器層此功能模塊共有兩個處理請求:goods/selectAllGoodsByPage?currentPage=1和@{goods/detail(id=${gds.id},act=detail)}。系統(tǒng)根據(jù)@RequestMapping注解找到對應(yīng)控制器類com.ch.ebusiness.controller.admin.GoodsController的selectAllGoodsByPage和detail方法處理請求。在控制器類的處理方法中調(diào)用com.ch.ebusiness.service.admin.GoodsService接口的selectAllGoodsByPage和detail方法處理業(yè)務(wù)。633.編寫Service層64 @Override publicStringselectAllGoodsByPage(Modelmodel,intcurrentPage){ //共多少個商品 inttotalCount=goodsRepository.selectAllGoods(); //計算共多少頁 intpageSize=5; inttotalPage=(int)Math.ceil(totalCount*1.0/pageSize); List<Goods>typeByPage=goodsRepository.selectAllGoodsByPage((current1)*pageSize,pageSize); model.addAttribute("allGoods",typeByPage); model.addAttribute("totalPage",totalPage); model.addAttribute("currentPage",currentPage); return"admin/adminGoods"; } @Override publicStringdetail(Modelmodel,Integerid,Stringact){ model.addAttribute("goods",goodsRepository.selectAGoods(id)); if("detail".equals(act)) return"admin/detail"; else{ model.addAttribute("goodsType",goodsRepository.selectAllGoodsType()); return"admin/updateAGoods"; } }4.編寫SQL映射文件65 <selectid="selectAllGoods"resultType="integer"> selectcount(*)fromgoodstable </select> <!--分頁查詢--> <selectid="selectAllGoodsByPage"resultType="Goods"> selectgt.*,gy.typename fromgoodstablegt,goodstypegy wheregt.goodstype_id=gy.id orderbyiddesclimit#{startIndex},#{perPageSize} </select> <!--查詢商品詳情--> <selectid="selectAGoods"resultType="Goods"> selectgt.*,gy.typename fromgoodstablegt,goodstypegy wheregt.goodstype_id=gy.idandgt.id=#{id} </select>9.5后臺管理子系統(tǒng)的實(shí)現(xiàn)9.5.1管理員登錄9.5.2類型管理9.5.3添加商品9.5.4查詢商品9.5.5修改商品9.5.6刪除商品9.5.7查詢訂單9.5.8用戶管理9.5.9安全退出669.5.5修改商品672.編寫控制器層此功能模塊共有兩個處理請求:goods/detail(id=${gds.id},act=update)和goods/addGoods?act=update。goods/detail(id=${gds.id},act=update)請求已在9.5.4節(jié)介紹,goods/addGoods?act=update請求已在9.5.3節(jié)介紹。3.編寫Service層同理,Service層請參考9.5.3與9.5.4節(jié)。4.編寫SQL映射文件68<updateid="updateGoods"parameterType="Goods">updategoodstablesetgname=#{gname},goprice=#{goprice},grprice=#{grprice},gstore=#{gstore},gpicture=#{gpicture},isRecommend=#{isRecommend},isAdvertisement=#{isAdvertisement},goodstype_id=#{goodstype_id} whereid=#{id}</update>9.5后臺管理子系統(tǒng)的實(shí)現(xiàn)9.5.1管理員登錄9.5.2類型管理9.5.3添加商品9.5.4查詢商品9.5.5修改商品9.5.6刪除商品9.5.7查詢訂單9.5.8用戶管理9.5.9安全退出699.5.6刪除商品70單擊圖中“刪除”超鏈接('javascript:deleteGoods('+${gds.id}+')')可實(shí)現(xiàn)單個商品的刪除。成功刪除(關(guān)聯(lián)商品不允許刪除)后,返回刪除商品管理主頁面。1.編寫控制器層71@RequestMapping("/delete")@ResponseBodypublicStringdelete(Integerid){ returngoodsService.delete(id);}2.編寫Service層72@OverridepublicStringdelete(Integerid){ if(goodsRepository.selectCartGoods(id).size()>0 ||goodsRepository.selectFocusGoods(id).size()>0 ||goodsRepository.selectOrderGoods(id).size()>0) return"no"; else{ goodsRepository.deleteAGoods(id); return"/goods/selectAllGoodsByPage?currentPage=1"; }}!!!注意:關(guān)聯(lián)商品不允許刪除3.編寫SQL映射文件73<selectid="selectFocusGoods"parameterType="integer"resultType="map"> select*fromfocustablewheregoodstable_id=#{id}</select><selectid="selectCartGoods"parameterType="integer"resultType="map"> select*fromcarttablewheregoodstable_id=#{id}</select><selectid="selectOrderGoods"parameterType="integer"resultType="map"> select*fromorderdetailwheregoodstable_id=#{id}</select><deleteid="deleteAGoods"parameterType="Integer"> deletefromgoodstablewhereid=#{id}</delete>9.5后臺管理子系統(tǒng)的實(shí)現(xiàn)9.5.1管理員登錄9.5.2類型管理9.5.3添加商品9.5.4查詢商品9.5.5修改商品9.5.6刪除商品9.5.7查詢訂單9.5.8用戶管理9.5.9安全退出749.5.7查詢訂單75單擊后臺管理主頁面中“查詢訂單”超鏈接(selectOrder?currentPage=1),打開查詢訂單頁面allOrder.html。2.編寫控制器層此功能模塊有個處理請求:selectOrder?currentPage=1。系統(tǒng)根據(jù)@RequestMapping注解找到對應(yīng)控制器類com.ch.ebusiness.controller.admin.UserAndOrderAndOutController的selectOrder方法處理請求。在控制器類的處理方法中調(diào)用com.ch.ebusiness.service.admin.UserAndOrderAndOutService接口的selectOrder方法處理業(yè)務(wù)。76@RequestMapping("/selectOrder")publicStringselectOrder(Modelmodel,intcurrentPage){ returnuserAndOrderAndOutService.selectOrder(model,currentPage);}3.編寫Service層77@OverridepublicStringselectOrder(Modelmodel,intcurrentPage){ //共多少個訂單 inttotalCount=userAndOrderAndOutRepository.selectAllOrder(); //計算共多少頁 intpageSize=5; inttotalPage=(int)Math.ceil(totalCount*1.0/pageSize); List<Map<String,Object>>orderByPage=userAndOrderAndOutRepository.selectOrderByPage((current1)*pageSize,pageSize); model.addAttribute("allOrders",orderByPage); model.addAttribute("totalPage",totalPage); model.addAttribute("currentPage",currentPage); return"admin/allOrder";}4.編寫SQL映射文件78<selectid="selectAllOrder"resultType="integer"> selectcount(*)fromorderbasetable

</select><!--分頁查詢--><selectid="selectOrderByPage"resultType="map"> selectobt.*,bt.bemailfromorderbasetableobt,busertablebtwhereobt.busertable_id=bt.idlimit#{startIndex},#{perPageSize}</select>9.5后臺管理子系統(tǒng)的實(shí)現(xiàn)9.5.1管理員登錄9.5.2類型管理9.5.3添加商品9.5.4查詢商品9.5.5修改商品9.5.6刪除商品9.5.7查詢訂單9.5.8用戶管理9.5.9安全退出799.5.8用戶管理80

單擊后臺管理主頁面中“用戶管理”超鏈接(selectUser?currentPage=1),打開用戶管理頁面allUser.html,如圖9.13所示。

單擊上圖中“刪除”超鏈接('javascript:deleteUsers('+${u.id}+')')可刪除未關(guān)聯(lián)的用戶。“用戶管理”與9.5.7“查詢訂單”的實(shí)現(xiàn)方式基本一樣,不再贅述。9.5后臺管理子系統(tǒng)的實(shí)現(xiàn)9.5.1管理員登錄9.5.2類型管理9.5.3添加商品9.5.4查詢商品9.5.5修改商品9.5.6刪除商品9.5.7查詢訂單9.5.8用戶管理9.5.9安全退出819.5.9安全退出在后臺管理主頁面中,單擊“安全退出”超鏈接(loginOut),將返回后臺登錄頁面。系統(tǒng)根據(jù)@RequestMapping注解找到對應(yīng)控制器類com.ch.ebusiness.controller.admin.UserAndOrderAndOutController的loginOut方法處理請求。在loginOut方法中執(zhí)行session.invalidate()將session失效,并返回后臺登錄頁面。82@RequestMapping("/loginOut")

publicStringloginOut(@ModelAttribute("aUser")AUseraUser,HttpSessionsession){ session.invalidate(); return"admin/login";}?

??為什么稱為安全退出?本章內(nèi)容839.1系統(tǒng)設(shè)計9.2數(shù)據(jù)庫設(shè)計9.3系統(tǒng)管理9.4組件設(shè)計9.5后臺管理子系統(tǒng)的實(shí)現(xiàn)9.6前臺電子商務(wù)子系統(tǒng)的實(shí)現(xiàn)9.6前臺電子商務(wù)子系統(tǒng)的實(shí)現(xiàn)9.6.1導(dǎo)航欄及首頁搜索9.6.2推薦商品及最新商品9.6.3用戶注冊9.6.4用戶登錄9.6.5商品詳情9.6.6收藏商品9.6.7購物車9.6.8下單9.6.9個人信息9.6.10我的收藏9.6.11我的訂單849.6.1導(dǎo)航欄及首頁搜索在前臺每個HTML頁面中,都引入了一個名為header.html的頁面,引入代碼如下:<divth:include="user/header"></div>header.html中的商品類型以及廣告區(qū)域的商品信息都是從數(shù)據(jù)庫中獲取。85搜索在導(dǎo)航欄的搜索框中輸入信息,單擊“搜索”按鈕,將搜索信息提交給search請求處理,系統(tǒng)根據(jù)@RequestMapping注解找到com.ch.ebusiness.controller.before.IndexController控制器類的search方法處理請求。并將搜索到的商品信息轉(zhuǎn)發(fā)給searchResult.html。862.編寫控制器層該功能模塊的控制器層涉及com.ch.ebusiness.controller.before.IndexController控制器類的處理方法search。87@RequestMapping("/search")publicStringsearch(Modelmodel,Stringmykey){ returnindexService.search(model,mykey);}3.編寫Service層88@OverridepublicStringsearch(Modelmodel,Stringmykey){ //廣告區(qū)商品 model.addAttribute("advertisementGoods", indexRepository.selectAdvertisementGoods()); //導(dǎo)航欄商品類型 model.addAttribute("goodsType",indexRepository.selectGoodsType()); //商品搜索 model.addAttribute("searchgoods",indexRepository.search(mykey)); return"user/searchResult";}4.編寫SQL映射文件89<!--查詢廣告商品--><selectid="selectAdvertisementGoods"resultType="Goods"> select gt.*,gy.typename from goodstablegt,goodstypegy where gt.goodstype_id=gy.id andgt.isAdvertisement=1 orderbygt.iddesclimit5</select><!--查詢商品類型--><selectid="selectGoodsType"resultType="GoodsType"> select*fromgoodstype</select><!--首頁搜索--><selectid="search"resultType="Goods"parameterType="String"> selectgt.*,gy.typenamefromGOODSTABLEgt,GOODSTYPEgywheregt.goodstype_id=gy.id andgt.gnamelikeconcat('%',#{mykey},'%')</select>9.6前臺電子商務(wù)子系統(tǒng)的實(shí)現(xiàn)9.6.1導(dǎo)航欄及首頁搜索9.6.2推薦商品及最新商品9.6.3用戶注冊9.6.4用戶登錄9.6.5商品詳情9.6.6收藏商品9.6.7購物車9.6.8下單9.6.9個人信息9.6.10我的收藏9.6.11我的訂單909.6.2推薦商品及最新商品推薦商品是根據(jù)商品表中的字段isRecommend值判斷的。最新商品是以商品ID排序的,因為商品ID是用MySQL自動遞增產(chǎn)生的。912.編寫控制器層該功能模塊的控制器層涉及com.ch.ebusiness.controller.before.IndexController控制器類的處理方法index。92@RequestMapping("/")publicStringindex(Modelmodel,Integertid){ returnindexService.index(model,tid);}3.編寫Service層93@OverridepublicStringindex(Modelmodel,Integertid){ if(tid==null) tid=0; //廣告區(qū)商品 model.addAttribute("advertisementGoods", indexRepository.selectAdvertisementGoods()); //導(dǎo)航欄商品類型 model.addAttribute("goodsType",indexRepository.selectGoodsType()); //推薦商品 model.addAttribute("recommendGoods", indexRepository.selectRecommendGoods(tid)); //最新商品 model.addAttribute("lastedGoods",indexRepository.selectLastedGoods(tid)); return"user/index";}4.編寫SQL映射文件94 <!--查詢推薦商品--> <selectid="selectRecommendGoods"resultType="Goods"parameterType="integer"> select gt.*,gy.typename from goodstablegt,goodstypegy where gt.goodstype_id=gy.id andgt.isRecommend=1 <iftest="tid!=0"> andgy.id=#{tid} </if> orderbygt.iddesclimit6 </select> <!--查詢最新商品--> <selectid="selectLastedGoods"resultType="Goods"parameterType="integer"> select gt.*,gy.typename from goodstablegt,goodstypegy where gt.goodstype_id=gy.id <iftest="tid!=0"> andgy.id=#{tid} </if> orderbygt.iddesclimit6 </select>9.6前臺電子商務(wù)子系統(tǒng)的實(shí)現(xiàn)9.6.1導(dǎo)航欄及首頁搜索9.6.2推薦商品及最新商品9.6.3用戶注冊9.6.4用戶登錄9.6.5商品詳情9.6.6收藏商品9.6.7購物車9.6.8下單9.6.9個人信息9.6.10我的收藏9.6.11我的訂單959.6.3用戶注冊單擊導(dǎo)航欄的“注冊”超鏈接(user/toRegister),將打開注冊頁面register.html。輸入用戶信息,單擊“注冊”按鈕,將用戶信息提交給user/register處理請求,系統(tǒng)根據(jù)@RequestMapping注解找到com.ch.ebusiness.controller.before.UserController控制器類的toRegister和register方法處理請求。962.編寫控制器層該功能模塊涉及com.ch.ebusiness.controller.before.UserController控制器類的toRegister和register方法。97@RequestMapping("/toRegister")publicStringtoRegister(@ModelAttribute("bUser")BUserbUser){ return"user/register";

}@RequestMapping("/register")

publicStringregister(@ModelAttribute("bUser")@ValidatedBUserbUser,BindingResultrs){ if(rs.hasErrors()){//驗證失敗

return"user/register"; } returnuserService.register(bUser);

}3.編寫Service層98@Override

publicStringisUse(BUserbUser){ if(userRepository.isUse(bUser).size()>0){ return"no"; } return"ok";

}

@Override

publicStringregister(BUserbUser){ //對密碼MD5加密

bUser.setBpwd(MD5Util.MD5(bUser.getBpwd())); if(userRepository.register(bUser)>0){ return"user/login"; } return"user/register";

}4.編寫SQL映射文件99<selectid="isUse"parameterType="BUser"resultType="BUser"> select*frombusertablewherebemail=#{bemail}</select><insertid="register"parameterType="BUser"> insertintobusertable(id,bemail,bpwd)values(null,#{bemail},#{bpwd})</insert>9.6前臺電子商務(wù)子系統(tǒng)的實(shí)現(xiàn)9.6.1導(dǎo)航欄及首頁搜索9.6.2推薦商品及最新商品9.6.3用戶注冊9.6.4用戶登錄9.6.5商品詳情9.6.6收藏商品9.6.7購物車9.6.8下單9.6.9個人信息9.6.10我的收藏9.6.11我的訂單1009.6.4用戶登錄用戶注冊成功后,跳轉(zhuǎn)到登錄頁面login.html。輸入信息后單擊“登錄”,將用戶輸入的E-mail、密碼以及驗證碼提交給user/login請求處理。系統(tǒng)根據(jù)@RequestMapping注解找到com.ch.ebusiness.controller.before.UserController控制器類的login方法處理請求。登錄成功后,將用戶的登錄信息保存在session對象中,然后回到網(wǎng)站首頁。1012.編寫控制器層該功能模塊涉及com.ch.ebusiness.controller.before.UserController控制器類的login方法。102@RequestMapping("/login")publicStringlogin(@ModelAttribute("bUser")@ValidatedBUserbUser, BindingResultrs,HttpSessionsession,Modelmodel){ if(rs.hasErrors()){//驗證失敗 return"user/login"; } returnuserService.login(bUser,session,model);}3.編寫Service層103 @Override publicStringlogin(BUserbUser,HttpSessionsession,Modelmodel){ //對密碼MD5加密

bUser.setBpwd(MD5Util.MD5(bUser.getBpwd())); Stringrand=(String)session.getAttribute("rand"); if(!rand.equalsIgnoreCase(bUser.getCode())){ model.addAttribute("errorMessage","驗證碼錯誤!"); return"user/login"; } List<BUser>list=userRepository.login(bUser); if(list.size()>0){ session.setAttribute("bUser",list.get(0)); return"redirect:/";//到首頁

} model.addAttribute("errorMessage","用戶名或密碼錯誤!"); return"user/login"; }4.編寫SQL映射文件104<selectid="login"parameterType="BUser"resultType="BUser"> select*frombusertablewherebemail=#{bemail}andbpwd=#{bpwd}

</select>9.6前臺電子商務(wù)子系統(tǒng)的實(shí)現(xiàn)9.6.1導(dǎo)航欄及首頁搜索9.6.2推薦商品及最新商品9.6.3用戶注冊9.6.4用戶登錄9.6.5商品詳情9.6.6收藏商品9.6.7購物車9.6.8下單9.6.9個人信息9.6.10我的收藏9.6.11我的訂單1059.6.5商品詳情可以從推薦商品、最新商品、廣告商品以及搜索商品結(jié)果等位置處,單擊商品圖片進(jìn)入商品詳情頁面goodsDetail.html。1062.編寫控制器層該功能模塊涉及com.ch.ebusiness.controller.before.IndexController控制器類的goodsDetail方法。107@RequestMapping("/goodsDetail")publicStringgoodsDetail(Modelmodel,Integerid){ returnindexService.goodsDetail(model,id);

}3.編寫Service層108@OverridepublicStringgoodsDetail(Modelmodel,Integerid){ //廣告區(qū)商品 model.addAttribute("advertisementGoods", indexRepository.selectAdvertisementGoods()); //導(dǎo)航欄商品類型 model.addAttribute("goodsType",indexRepository.selectGoodsType()); //商品詳情 model.addAttribute("goods",indexRepository.selectAGoods(id)); return"user/goodsDetail";}4.編寫SQL映射文件109<!--查詢商品詳情--><selectid="selectAGoods"resultType="Goods"> select gt.*,gy.typename from goodstablegt,goodstypegy where gt.goodstype_id=gy.id andgt.id=#{id}</select>9.6前臺電子商務(wù)子系統(tǒng)的實(shí)現(xiàn)9.6.1導(dǎo)航欄及首頁搜索9.6.2推薦商品及最新商品9.6.3用戶注冊9.6.4用戶登錄9.6.5商品詳情9.6.6收藏商品9.6.7購物車9.6.8下單9.6.9個人信息9.6.10我的收藏9.6.11我的訂單1109.6.6收藏商品登錄成功的用戶可以在商品詳情頁面、首頁以及搜索商品結(jié)果頁面,單擊“加入收藏”按鈕收藏該商品。此時,請求路徑為cart/focus(Ajax實(shí)現(xiàn))。系統(tǒng)根據(jù)@RequestMapping注解找到com.ch.ebusiness.controller.before.CartController控制器類的focus方法處理請求。1111.編寫控制器層該功能模塊涉及com.ch.ebusiness.controller.before.CartController控制器類的focus方法。112@RequestMapping("/focus")@ResponseBodypublicStringfocus(@RequestBodyGoodsgoods,Modelmodel,HttpSessionsession){ returncartService.focus(model,session,goods.getId());}2.編寫Service層113@OverridepublicStringfocus(Modelmodel,HttpSessionsession,Integergid){ Integeruid=MyUtil.getUser(session).getId(); List<Map<String,Object>>list=cartRepository.isFocus(uid,gid); //判斷是否已收藏 if(list.size()>0){ return"no"; }else{ cartRepository.focus(uid,gid); return"ok"; }}3.編寫SQL映射文件114<!--處理加入收藏-->

<selectid="isFocus"resultType="map">

select*fromfocustablewheregoodstable_id=#{gid}andbusertable_id=#{uid}</select>

<insertid="focus">

insertintofocustable(id,goodstable_id,busertable_id,focustime)values(null,#{gid},#{uid},now())

</insert>9.6前臺電子商務(wù)子系統(tǒng)的實(shí)現(xiàn)9.6.1導(dǎo)航欄及首頁搜索9.6.2推薦商品及最新商品9.6.3用戶注冊9.6.4用戶登錄9.6.5商品詳情9.6.6收藏商品9.6.7購物車9.6.8下單9.6.9個人信息9.6.10我的收藏9.6.11我的訂單1159.6.7購物車單擊商品詳情頁面中的“加入購物車”按鈕或?qū)Ш綑谥械摹拔业馁徫镘嚒背溄樱蜷_購物車頁面cart.html。116與購物車有關(guān)的處理請求有cart/putCart(加入購物車)、cart/clearCart(清空購物車)、cart/selectCart(查詢購物車)和cart/deleteCart(刪除購物車)。系統(tǒng)根據(jù)@RequestMapping注解分別找到com.ch.ebusiness.controller.before.CartController控制器類的putCart、clearCart、selectCart、deleteCart等方法處理請求。2.編寫控制器層117 @RequestMapping("/putCart") publicStringputCart(Goodsgoods,Modelmodel,HttpSessionsession){ returncartService.putCart(goods,model,session); } @RequestMapping("/selectCart") publicStringselectCart(Modelmodel,HttpSessionsession,Stringact){ returncartService.selectCart(model,session,act); } @RequestMapping("/deleteCart") publicStringdeleteCart(HttpSessionsession,Integergid){ returncartService.deleteCart(session,gid); } @RequestMapping("/clearCart") pub

溫馨提示

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

最新文檔

評論

0/150

提交評論