畢業(yè)設計(論文)-springboot水果超市商城系統(tǒng)設計_第1頁
畢業(yè)設計(論文)-springboot水果超市商城系統(tǒng)設計_第2頁
畢業(yè)設計(論文)-springboot水果超市商城系統(tǒng)設計_第3頁
畢業(yè)設計(論文)-springboot水果超市商城系統(tǒng)設計_第4頁
畢業(yè)設計(論文)-springboot水果超市商城系統(tǒng)設計_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Springboot水果超市平臺緒論1.1研究意義日益發(fā)展的信息技術,互聯(lián)網經濟的快速興起,網上的購物日益受到人們的關注,蔬菜水果網上批發(fā)市場模式也必然成為其潮流發(fā)展一部分。基于springboot技術的水果在線批發(fā)系統(tǒng)借助于遍布全球的互聯(lián)網,進行水果的市場消費流動,因此水果的批發(fā)既可以在本地進行,也可以在異地進行。網上進行水果批發(fā)既可以省下許多時間體力,也可以節(jié)省來回的花銷成本,更可以足不出戶就可以了解到水果批發(fā)市場的行情,消費者可以吃到想吃的新鮮的水果。生產者以及批發(fā)銷售商可以獲得更多客戶資源和批發(fā)渠道,進而提升蔬菜水果批發(fā)銷量和規(guī)模。輕輕松松實現(xiàn)買賣交易。本課題利用Javaspringboot技術開發(fā)一個水果系統(tǒng),為消費者和批發(fā)商提供一個平臺,降低了成本、時間占用,也解決了交通困難等系列問題,促進人們生活消費水平。1.2國內外研究現(xiàn)狀、水平和發(fā)展趨勢隨著農村市場經濟發(fā)展,尤其是我國加入WTO,融入經濟全球化潮流,水果業(yè)已進入國內外市場經濟發(fā)展新時期,農業(yè)、農村與市場聯(lián)系越來越緊密,我國水果產業(yè)也進入新歷史發(fā)展階段。水果產業(yè)部門、科技部門、涉農單位對水果產業(yè)信息化的認識逐步提高,積極探索水果產業(yè)信息體系如何向廣大農民企業(yè)提供更服務。蔬菜經營場所封閉性、分散性和生產手段落后等特點決定了水果產業(yè)的發(fā)展起到巨大推動作用。為了更好地服務于農業(yè)、農村、農民,推進農業(yè)現(xiàn)代化進程,農業(yè)信息體系建設已迫在眉睫。隨著電子商務在批發(fā)市場運用深化,一部分批發(fā)市場“蒸發(fā)”了,悄然退出市場、使有形市場和無形市場相結合從而產生一種新模式。對絕大多數(shù)市場來說,在組織創(chuàng)新上,當前最易采取形式是有形市場與無形市場相結合的方式。可以充分利用有形市場的優(yōu)勢,創(chuàng)辦網上市場,搭建網上交易平臺為市場經營者建立網上水果商鋪,進行網上水果商品宣傳,引導經營者開展網上交易,實行與現(xiàn)貨交易并行的電子商務模式。農業(yè)網站發(fā)展表明,互聯(lián)網和農業(yè)的結合正在逐漸深入,這是農業(yè)現(xiàn)代化發(fā)展需要,同時也是農村電子商務自身發(fā)展必然趨勢,為農產品銷售電子商務的發(fā)展提供了保障在廣大購物者漸漸對產品性價比要求越來越高的今天,我們發(fā)現(xiàn)必須要有一套完善的采購經銷體系、才能不斷提高產品質量同時降低產品的價格,所以減少產品銷售中間環(huán)節(jié)成本增加勢在必行。為此創(chuàng)辦電子商務果蔬商城網站,讓優(yōu)質新鮮的蔬菜水果在網站直接面消費者,一提高網站可以提供比在商店購物中更為詳盡資料、歷史淵源以及顧客評論等信息,顧客可以方便地從琳瑯滿目的各類精品蔬菜水果中快速查詢出需要的產品;另一方面也少商店運營成本,將價格實惠轉讓給顧客、使電子商務果蔬商城網站的發(fā)展成為必然。1.3項目的可行性研究設計此系統(tǒng)需要java面向對象編程基礎,數(shù)據庫應用知識以及功能分析。根據目前階段所掌握的知識,根據這學期以及之前學習掌握的java編程知識和數(shù)據庫應用知識以及前端知識做出一個這樣的基于、springboot輕量級框架網頁版的水果超市平臺。1.4相關技術簡介1.4.1springSpring框架是\t"/item/Spring%20Boot/_blank"Java平臺上的一種開源應用框架,提供具有控制反轉特性容器。盡管Spring框架自身對編程模型沒有限制,以至于后來讓它作為\t"/item/Spring%20Boot/_blank"EJB(EnterpriseJavaBeans)模型的補充,甚至是替補。Spring框架為開發(fā)提供了一系列的解決方案,比如利用控制反轉核心特性,并通過依賴注入實現(xiàn)控制反轉來實現(xiàn)管理對象生命周期的容器化,利用面向切面編程進行聲明式事務管理,整合多種持久化技術管理數(shù)據訪問,提供大量優(yōu)秀的Web框架方便開發(fā)等。Spring框架具有控制反轉(IOC)特性,它提供了一種通過Java的反射機制對Java對象進行統(tǒng)一的配置管理的方法。Spring框架利用容器管理對象生命周期,容器可以通過掃描XML文件配置對象。Spring框架具有\(zhòng)t"/item/Spring%20Boot/_blank"面向切面編程(AOP)框架,SpringAOP框架基于代理模式,運行時可配置;AOP框架主要針對模塊之間的交叉關注點進行模塊化。Spring框架的AOP框架僅提供基本的AOP特性,Spring框架下的事務管理、遠程訪問等功能均可以通過使用SpringAOP技術實現(xiàn)。Spring的事務管理框架為Java平臺帶來了一種抽象機制,使本地和全局事務以及嵌套事務能夠與保存點一起工作,并且?guī)缀蹩梢栽贘ava平臺的任何環(huán)境中工作。Spring集成多種事務模板,系統(tǒng)可以通過事務模板、XML或Java注解進行事務配置,并且事務框架集成了消息傳遞和緩存等功能。Spring數(shù)據訪問框架解決了開發(fā)人員在應用程序中使用數(shù)據庫時遇到的常見困難。它不僅對Java:JDBC、MyBATIs、Hibernate、Java數(shù)據對象(JDO)、ApacheOJB和ApacheCayne等所有流行的數(shù)據訪問框架中提供支持,同時還可以與Spring的事務管理一起使用,為數(shù)據訪問提供了靈活的抽象。Spring框架最初是沒有打算構建一個自己的Web\t"/item/Spring%20Boot/_blank"MVC框架,其開發(fā)人員在開發(fā)過程中認為現(xiàn)有的Web框架的呈現(xiàn)層和請求處理層之間以及請求處理層和模型之間的分離不夠,于是創(chuàng)建了SpringMVC。1.4.2mybatismybatis是對jdbc的封裝,它讓數(shù)據庫底層操作變的透明。mybatis的操作都是圍繞一個sqlSessionFactory實例展開。mybatis通過配置文件關聯(lián)到各實體類Mapper文件,Mapper文件中配置了每個類對數(shù)據庫所需進行的sql語句映射。在每次與數(shù)據庫交互,通過sqlSessionFactory拿到一個sqlSession,再執(zhí)行sql。頁面發(fā)送請求給控制器,控制器調用業(yè)務層處理,邏輯層向持久層發(fā)送請求,持久層與數(shù)據庫交互,將結果返回給業(yè)務層,業(yè)務層將處理邏輯發(fā)送給控制器,控制器再調用視圖展現(xiàn)數(shù)據。1.4.3Shiro權限框架shiro是一個安全框架,是Apache的一個項目。shiro提供了:認證、授權、加密、會話管理、與web集成、緩存等模塊。

1.1、模塊介紹Authentication:用戶身份識別,可以是登錄;Authorization:授權,權限驗證,驗證某個已認證的用戶是否擁有某個權限功能;即判斷用戶是否能做事情,常見:驗證某個用戶是否擁有某個角色?;蛘呒毩6鹊尿炞C某個用戶對某資源是否具有某個權限。SessionManager:會話管理,用戶登錄后就是一次會話,在沒有退出之前,所有信息都在會話中;會話可以是普通JavaSE環(huán)境的,也可以是如Web環(huán)境的。Cryptography:加密,保護數(shù)據的安全性,密碼加密存儲到數(shù)據庫,而不是明文存儲。WebSupport:Web支持,可以非常容易的集成到javaweb環(huán)境。Caching:緩存,比如用戶登錄后,其用戶信息、擁有的角色/權限不必每次去查,這樣可以提高效率。Concurrency:shiro支持多線程應用的并發(fā)驗證,即如在一個線程中開啟另一個線程,能把權限自動傳播過去。Testing:提供測試支持。2、核心概念Subject:主體,代表了當前操作用戶,這個用戶不一定是具體的人,與當前應用交互的任何東西都是subject,即抽象概念。所有Subject都綁定到SecurityManager,與Subject交互都會委托給SercurityManager;SecurityManager:安全管理器;即所有與subject安全有關的操作都會與SecurityManager交互;且它管理著所有的Subject;它負責與里面的各個組件交互,也可以把它理解成springmvc中DispatcherServlet前端控制器。Realm:域,安全數(shù)據源。shiro從Realm獲取安全數(shù)據(如用戶、權限),就是說SecurityManager驗證用戶身份,那么它需要從Realm得到用戶相應角色、權限進行驗證用戶是否能進行操作;可以把Realm看成DataSource,即安全數(shù)據源。從上圖可以看出:1、應用代碼通過Subject來進行認證和授權,而Subject又委托給SecurityManager;2、SecurityManager要驗證用戶身份,那么它需要從Realm中獲取相對應的用戶、角色、權限進行比較以確定用戶身份是否合法??偨Y:shiro不提供維護用戶、權限,而是通過Realm讓開發(fā)人員自己注入。3、shiro內部架構介紹1)Subject:主體,看到主體可以是任何與應用交互“用戶”。2)SecurityManager:相當于SpringMVC中的DispatcherServlet或者Struts2中的FilterDispatcher。它是Shiro的核心,所有具體的交互都通過SecurityManager進行控制。它管理著所有Subject、且負責進行認證和授權、及會話、緩存的管理。3)Authenticator:認證器,負責主體認證的,這是一個擴展點,如果用戶覺得Shiro默認的不好,我們可以自定義實現(xiàn)。其需要認證策略(AuthenticationStrategy),即什么情況下算用戶認證通過了。4)Authrizer:授權器,或者訪問控制器。它用來決定主體是否有權限進行相應的操作,即控制著用戶能訪問應用中的哪些功能。5)Realm:可以有1個或多個Realm,可以認為是安全實體數(shù)據源,即用于獲取安全實體的。它可以是JDBC實現(xiàn),也可以是LDAP實現(xiàn),或者內存實現(xiàn)等。6)SessionManager:如果寫過Servlet就應該知道Session的概念,Session需要有人去管理它的生命周期,這個組件就是SessionManager。而Shiro并不僅僅可以用在Web環(huán)境,也可以用在如普通的JavaSE環(huán)境。7)SessionDAO:DAO大家都用過,數(shù)據訪問對象,用于會話的CRUD。我們可以自定義SessionDAO的實現(xiàn),控制session存儲的位置。如通過JDBC寫到數(shù)據庫或通過jedis寫入redis中。另外SessionDAO中可以使用Cache進行緩存,以提高性能。8)CacheManager:緩存管理器。它來管理如用戶、角色、權限等的緩存的。因為這些數(shù)據基本上很少去改變,放到緩存中后可以提高訪問的性能。9)Cryptography:密碼模塊,Shiro提高了一些常見的加密組件用于如密碼加密/解密的。4、過濾器當Shiro被運用到web項目時,Shiro會自動創(chuàng)建一些默認的過濾器對客戶端請求進行過濾。以下是Shiro提供的過濾器:過濾器簡稱對應的Java類anonorg.apache.shiro.web.filter.authc.AnonymousFilterauthcorg.apache.shiro.web.filter.authc.FormAuthenticationFilterauthcBasicorg.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilterpermsorg.apache.shiro.web.filter.authz.PermissionsAuthorizationFilterportorg.apache.shiro.web.filter.authz.PortFilterrestorg.apache.shiro.web.filter.authz.HttpMethodPermissionFilterrolesorg.apache.shiro.web.filter.authz.RolesAuthorizationFiltersslorg.apache.shiro.web.filter.authz.SslFilteruserorg.apache.shiro.web.filter.authc.UserFilterlogoutorg.apache.shiro.web.filter.authc.LogoutFilternoSessionCreationorg.apache.shiro.web.filter.session.NoSessionCreationFilter解釋:/admins/**=anon#表示該uri可以匿名訪問/admins/**=auth#表示該uri需要認證才能訪問/admins/**=authcBasic#表示該uri需要httpBasic認證/admins/**=perms[user:add:*]#表示該uri需要認證用戶擁有user:add:*權限才能訪問/admins/**=port[8081]#表示該uri需要使用8081端口/admins/**=rest[user]#相當于/admins/**=perms[user:method],其中,method表示get、post、delete等/admins/**=roles[admin]#表示該uri需要認證用戶擁有admin角色才能訪問/admins/**=ssl#表示該uri需要使用https協(xié)議/admins/**=user#表示該uri需要認證或通過記住我認證才能訪問/logout=logout#表示注銷,可以當作固定配置1.4.4SpringBootSpringBoot是Pivotal團隊在2013年開始研發(fā)、2014年4月發(fā)布第一個版本全新開源的輕量級框架。它基于Spring4.0設計,不僅繼承了Spring框架原有優(yōu)秀特性,而且還通過簡化配置來進一步簡化了Spring應用的整個搭建開發(fā)過程。另外SpringBoot通過集成大量的框架使得依賴包的版本沖突,引用的不穩(wěn)定性等問題得到了很好的解決。SpringBoot具備的特征有:(1)可以創(chuàng)建獨立的\t"/item/Spring%20Boot/_blank"Spring應用程序,并且基于其Maven或Gradle插件,可以創(chuàng)建可執(zhí)行的JARs和WARs;(2)內嵌Tomcat或Jetty等Servlet容器;(3)提供自動配置的“starter”項目對象模型(POMS)以簡化\t"/item/Spring%20Boot/_blank"Maven配置;(4)盡可能自動配置Spring容器;(5)提供準備好的特性,如指標、健康檢查和外部化配置;(6)絕對沒有代碼生成,不需要XML配置。

[1]

[2]SpringBoot框架中還有兩個非常重要的策略:開箱即用和約定優(yōu)于配置。開箱即用,Outofbox,是指在開發(fā)過程中,通過在MAVEN項目的pom文件中添加相關依賴包,然后使用對應注解來代替繁瑣的XML配置文件以管理對象的生命周期。這個特點使得開發(fā)人員擺脫了復雜的配置工作以及依賴的管理工作,更加專注于業(yè)務邏輯。約定優(yōu)于配置,Conventionoverconfiguration,是一種由SpringBoot本身來配置目標結構,由開發(fā)者在結構中添加信息的軟件設計范式。這一特點雖降低了部分靈活性,增加了BUG定位的復雜性,但減少了開發(fā)人員需要做出決定的數(shù)量,同時減少了大量的XML配置,并且可以將代碼編譯、測試和打包等工作自動化。SpringBoot應用系統(tǒng)開發(fā)模板的基本架構設計從前端到后臺進行說明:前端常使用模板引擎,主要有FreeMarker和Thymeleaf,它們都是用Java語言編寫的,渲染模板并輸出相應文本,使得界面的設計與應用的邏輯分離,同時前端開發(fā)還會使用到Bootstrap、AngularJS、JQuery等;在瀏覽器的數(shù)據傳輸格式上采用Json,非xml,同時提供RESTfulAPI;SpringMVC框架用于數(shù)據到達服務器后處理請求;到\t"/item/Spring%20Boot/_blank"數(shù)據訪問層主要有Hibernate、MyBatis、JPA等持久層框架;數(shù)據庫常用\t"/item/Spring%20Boot/_blank"MySQL;開發(fā)工具推薦IntelliJIDEA。1.4.5jQueryjQuery是一個快速、簡潔JavaScript框架,是繼Prototype之后又一個優(yōu)秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“writeLess,DoMore”,即倡導寫更少的代碼,做更多的事情。它封裝JavaScript常用的功能代碼,提供一種簡便的JavaScript設計模式,優(yōu)化HTML文檔操作、事件處理、動畫設計和Ajax交互。jQuery的核心特性可以總結為:具有獨特的鏈式語法和短小清晰的多功能接口;具有高效靈活的css選擇器,并且可對CSS選擇器進行擴展;擁有便捷的插件擴展機制和豐富的插件。jQuery兼容各種主流瀏覽器,如IE6.0+、FF1.5+、Safari2.0+、Opera9.0+等1.4.6MysqlMySQL是一款安全、跨平臺、高效的,并與PHP、Java等主流編程語言緊密結合的數(shù)據庫系統(tǒng)。該數(shù)據庫系統(tǒng)是由瑞典的MySQLAB公司開發(fā)、發(fā)布并支持,由MySQL的初始開發(fā)人員DavidAxmark和MichaelMontyWidenius于1995年建立的。

MySQL的象征符號是一只名為Sakila的海豚,代表著MySQL數(shù)據庫的速度、能力、精確和優(yōu)秀本質。

圖:MySQL圖標

目前MySQL被廣泛地應用在Internet上的中小型網站中。由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,使得很多公司都采用MySQL數(shù)據庫以降低成本。

MySQL數(shù)據庫可以稱得上是目前運行速度最快的SQL語言數(shù)據庫之一。除了具有許多其他數(shù)據庫所不具備的功能外,MySQL數(shù)據庫還是一種完全免費的產品,用戶可以直接通過網絡下載MySQL數(shù)據庫,而不必支付任何費用。MySQL特點下面總結了一下MySQL具備的特點。1)功能強大MySQL中提供了多種數(shù)據庫存儲引擎,各引擎各有所長,適用于不同的應用場合,用戶可以選擇最合適的引擎以得到最高性能,可以處理每天訪問量超過數(shù)億的高強度的搜索Web站點。MySQL5支持事務、視圖、存儲過程、觸發(fā)器等。2)支持跨平臺MySQL支持至少20種以上的開發(fā)平臺,包括Linux、Windows、FreeBSD、IBMAIX、AIX、FreeBSD等。這使得在任何平臺下編寫的程序都可以進行移植,而不需要對程序做任何的修改。3)運行速度快高速是MySQL的顯著特性。在MySQL中,使用了極快的B樹磁盤表(MyISAM)和索引壓縮;通過使用優(yōu)化的單掃描多連接,能夠極快地實現(xiàn)連接;SQL函數(shù)使用高度優(yōu)化的類庫實現(xiàn),運行速度極快。4)支持面向對象PHP支持混合編程方式。編程方式可分為純粹面向對象、純粹面向過程、面句對象與面向過程混合3種方式。5)安全性高靈活和安全的權限與密碼系統(tǒng),允許基本主機的驗證。連接到服務器時,所有的密碼傳輸均采用加密形式,從而保證了密碼的安全。6)成本低MySQL數(shù)據庫是一種完全免費的產品,用戶可以直接通過網絡下載。7)支持各種開發(fā)語言MySQL為各種流行的程序設計語言提供支持,為它們提供了很多的API函數(shù),包括PHP、ASP.NET、Java、Eiffel、Python、Ruby、Tcl、C、C++、Perl語言等。8)數(shù)據庫存儲容量大MySQL數(shù)據庫的最大有效表尺寸通常是由操作系統(tǒng)對文件大小的限制決定的,而不是由MySQL內部限制決定的。InnoDB存儲引擎將InnoDB表保存在一個表空間內,該表空間可由數(shù)個文件創(chuàng)建,表空間的最大容量為64TB,可以輕松處理擁有上千萬條記錄的大型數(shù)據庫。9)支持強大的內置函數(shù)PHP中提供了大量內置函數(shù),幾乎涵蓋了Web應用開發(fā)中的所有功能。它內置了數(shù)據庫連接、文件上傳等功能,MySQL支持大量的擴展庫,如MySQLi等,可以為快速開發(fā)Web應用提供便利。數(shù)據庫的應用數(shù)據庫是計算機應用系統(tǒng)中的一種專門管理數(shù)據資源的系統(tǒng)。數(shù)據有多種形式,如文字、數(shù)碼、符號、圖形、圖像及聲音等,數(shù)據是所有計算機系統(tǒng)所要處理的對象。我們所熟知的一種處理辦法是制作文件,即將處理過程編成程序文件,將所涉及的數(shù)據按程序要求組成數(shù)據文件,再用程序來調用,數(shù)據文件與程序文件保持著一定的關系。

在計算機應用迅速發(fā)展的情況下,這種文件式管理方法便顯出它的不足。比如,它使得數(shù)據通用性差、不便于移植、在不同文件中存儲大量重復信息、浪費存儲空間、更新不便等。

而數(shù)據庫系統(tǒng)便能解決上述問題。數(shù)據庫系統(tǒng)不從具體的應用程序出發(fā),而是立足于數(shù)據本身的管理,它將所有數(shù)據保存在數(shù)據庫中,進行科學的組織,并借助于數(shù)據庫管理系統(tǒng),以它為中介,與各種應用程序或應用系統(tǒng)接口,使之能方便地使用數(shù)據庫中的數(shù)據。

其實簡單地說,數(shù)據庫就是一組經過計算機整理后的數(shù)據,存儲在一個或多個文件中,而管理這個數(shù)據庫的軟件就稱為數(shù)據庫管理系統(tǒng)。一般一個數(shù)據庫系統(tǒng)(DatabaseSystem)

可以分為數(shù)據庫(Database)與數(shù)據管理系統(tǒng)(DatabaseManagementSystem,DBMS)兩個部分。主流的數(shù)據庫軟件有Oracle、Informix、Sybase、SQLServer、PostgreSQL、MySQL、Access、FoxPro和Teradata等等。數(shù)據庫在Web開發(fā)中的重要地位歸根結底,動態(tài)網站都是對數(shù)據進行操作,我們平時瀏覽網頁時,會發(fā)現(xiàn)網頁的內容會經常變化,而頁面的主體結構框架沒變,新聞就是一個典型。這是因為我們將新聞存儲在了數(shù)據庫中,用戶在瀏覽時,程序就會根據用戶所請求的新聞編號,將對應的新聞從數(shù)據庫中讀取出來,然后再以特定的格式響應給用戶。

Web系統(tǒng)的開發(fā)基本上是離不開數(shù)據庫的,因為任何東西都要存放在數(shù)據庫中。所謂的動態(tài)網站就是基于數(shù)據庫開發(fā)的系統(tǒng),最重要的就是數(shù)據管理,或者說我們在開發(fā)時都是在圍繞數(shù)據庫在寫程序。所以作為一個Web程序員,只有先掌握一門數(shù)據庫,才可能去進行軟件開發(fā)。

系統(tǒng)需求分析2.1系統(tǒng)功能分析1.用戶模塊管理:用戶登錄、用戶注冊、用戶的查詢、添加、刪除操作、2.頁面模塊管理:頁面菜單的展示、添加操作、修改操作、刪除操作、3.角色模塊管理:用戶角色列表的查看、刪除等操作、4.商品管理:商品信息的查看、添加、刪除、5.訂單管理:訂單管理信息操作、6.用戶評論模塊管理:用戶評論查詢、添加、刪除、7.收藏模塊管理:對喜歡水果的收藏管理8.購物車管理:對水果商品加入購物車、移除購物車9.修改密碼管理以及個人信息查看管理9.注銷退出登錄管理2.2系統(tǒng)運行環(huán)境JavaJDK1.8環(huán)境配置、Java運行在idea軟件上,數(shù)據庫用mysql5版本數(shù)據庫、數(shù)據庫采用NacicatMysql可視化工具、基于主流的谷歌瀏覽器運行展示以及F12控制臺調試樣式、系統(tǒng)設計3.1系統(tǒng)模板設計系統(tǒng)主要設計采用Java語言開發(fā)、采用springboot為后臺框架、數(shù)據庫框架采用mybatis、前端采用jquery、layui框架等主要模塊設計如下:1.用戶模塊管理:用戶登錄、用戶注冊、用戶的查詢、添加、刪除操作、2.頁面模塊管理:頁面菜單的展示、添加操作、修改操作、刪除操作、3.角色模塊管理:用戶角色列表的查看、刪除等操作、4.商品管理:商品信息的查看、添加、刪除、5.訂單管理:訂單管理信息操作、6.用戶評論模塊管理:用戶評論查詢、添加、刪除、7.收藏模塊管理:對喜歡水果的收藏管理8.購物車管理:對水果商品加入購物車、移除購物車9.修改密碼管理以及個人信息查看管理9.注銷退出登錄管理3.2系統(tǒng)流程描述3項目源碼架構設計系統(tǒng)實現(xiàn)4.1程序主要類4.1.1用戶管理員admin實體類privateIntegerid;//管理員ID@ValidateEntity(required=true,errorRequiredMsg="管理員對應角色不能為空!")privateIntegerroleId;//管理員對應角色ID@ValidateEntity(requiredMaxLength=true,maxLength=256,errorMaxLengthMsg="管理員頭像長度不能大于256!")privateStringheadPic;//管理員頭像@ValidateEntity(required=true,requiredMaxLength=true,requiredMinLength=true,maxLength=16,minLength=1,errorRequiredMsg="管理員名稱不能為空!",errorMaxLengthMsg="管理員名稱長度不能大于16!",errorMinLengthMsg="管理員名稱長度不能小于1!")privateStringname;//管理員姓名@ValidateEntity(required=true,requiredMaxLength=true,requiredMinLength=true,maxLength=16,minLength=5,errorRequiredMsg="管理員密碼不能為空!",errorMaxLengthMsg="管理員密碼長度不能大于16!",errorMinLengthMsg="管理員密碼長度不能小于5!")privateStringpassword;//管理員密碼默認為:123456privateIntegersex;//管理員性別:1:男;2:女;3:未知默認為3:未知@ValidateEntity(requiredMaxLength=true,maxLength=128,errorMaxLengthMsg="管理員地址長度不能大于128!")privateStringaddress;//管理員地址privateLongmobile;//管理員電話@ValidateEntity(required=true,errorRequiredMsg="管理員狀態(tài)不能為空!")privateIntegerstate;//管理員狀態(tài):1:啟用;2:凍結4.1.4公告Announcement實體類@DatapublicclassAnnouncement{privateIntegerid;//公告ID@ValidateEntity(required=true,requiredMaxLength=true,requiredMinLength=true,maxLength=256,minLength=1,errorRequiredMsg="公告內容不能為空!",errorMaxLengthMsg="公告內容長度不能大于256!",errorMinLengthMsg="公告內容長度不能小于1!")privateStringcontent;//公告內容@ValidateEntity(required=true,errorRequiredMsg="公告發(fā)布對應管理員角色不能為空!")privateIntegeradminId;//公告發(fā)布所屬管理員privateDatecreateTime;//公告創(chuàng)建時間privateDateupdateTime;//公告更新時間4.1.4菜單Menu實體類publicclassMenu{privateIntegerid;//菜單ID@ValidateEntity(required=true,errorRequiredMsg="上級菜單不能為空!")privateIntegerparentId;//上級菜單的ID:默認為0@ValidateEntity(required=true,requiredMaxLength=true,requiredMinLength=true,minLength=1,maxLength=32,errorRequiredMsg="菜單名稱不能為空!",errorMinLengthMsg="菜單名稱長度至少為1!",errorMaxLengthMsg="菜單名稱長度不能大于32!")privateStringname;//菜單名稱@ValidateEntity(requiredMaxLength=true,maxLength=256,errorMaxLengthMsg="菜單路徑長度不能大于256!")privateStringurl;//菜單路徑@ValidateEntity(requiredMaxValue=true,requiredMinValue=true,required=true,maxValue=1024,minValue=0,errorMaxValueMsg="菜單排序最大值為1024!",errorMinValueMsg="菜單排序最小值為0!",errorRequiredMsg="菜單排序不能為空!")privateIntegersort;//菜單排序:默認為0,值越大則在同級別越優(yōu)先顯示@ValidateEntity(required=true,requiredMaxLength=true,maxLength=64,errorRequiredMsg="菜單圖標不能為空!",errorMaxLengthMsg="菜單圖標長度不能大于64!")privateStringicon;//菜單圖標@ValidateEntity(required=true,errorRequiredMsg="菜單狀態(tài)不能為空!")privateIntegerstate;//菜單狀態(tài):1:開啟;2:停用4.1.4評論Comment實體類publicclassComment{privateLongid;//評論id@ValidateEntity(required=true,errorRequiredMsg="評論對應的商品不能為空!")privateLongproductId;//評論對應的商品idprivateProductproduct;//評論對應的商品@ValidateEntity(required=true,errorRequiredMsg="評論對應的用戶不能為空!")privateLonguserId;//評論對應的用戶idprivateUseruser;//評論對應的用戶@ValidateEntity(required=true,requiredMaxLength=true,requiredMinLength=true,maxLength=100,minLength=1,errorRequiredMsg="評論內容不能為空!",errorMinLengthMsg="評論內容的長度不能小于1",errorMaxLengthMsg="評論內容的長度不能大于100!")privateStringcontent;//評論內容privateDatecreateTime;//評論創(chuàng)建時間4.1.4訂單order實體類privateLongid;//訂單idprivateLongorderNo;//訂單流水號privateLonguserId;//訂單所屬用戶idprivateUseruser;//訂單所屬用戶privateIntegerstate;//訂單狀態(tài)0:未支付;1:已支付,待發(fā)貨;2:已取消;3:已送達,待簽收;4:已簽收;5:已發(fā)貨privateBigDecimaltotalPrice;//訂單總價privateLongaddressId;//訂單對應的配送地址idprivateAddressaddress;//訂單對應的配送地址privateStringremark;//訂單留言privateIntegerisDeleted;//用戶是否刪除訂單0:未刪除;1:已刪除privateList<OrderItem>orderItemList;//訂單對應的訂單詳情privateDatecreateTime;//訂單創(chuàng)建時間privateDateupdateTime;//訂單更新時間4.1.4商品Product實體類publicclassProduct{privateLongid;//商品id@ValidateEntity(required=true,requiredMaxLength=true,requiredMinLength=true,maxLength=16,minLength=1,errorRequiredMsg="商品名稱不能為空!",errorMaxLengthMsg="商品名稱長度不能大于16!",errorMinLengthMsg="商品名稱長度不能小于1!")privateStringproductName;//商品的名稱@ValidateEntity(required=true,requiredMaxLength=true,requiredMinLength=true,maxLength=32,minLength=1,errorRequiredMsg="商品詳情不能為空!",errorMaxLengthMsg="商品詳情長度不能大于32!",errorMinLengthMsg="商品詳情長度不能小于1!")privateStringinfo;//商品的詳情@ValidateEntity(requiredMaxLength=true,maxLength=256,errorMaxLengthMsg="商品圖片路徑長度不能大于256!")privateStringproductPic;//商品的圖片@ValidateEntity(required=true,requiredMinValue=true,requiredMaxValue=true,maxValue=100000000.00,minValue=0.00,errorRequiredMsg="商品價格不能為空!",errorMaxValueMsg="商品價格不合理,請調低價格!",errorMinValueMsg="商品價格不能低于0.00元!")privateBigDecimalprice;//商品的價格@ValidateEntity(required=true,requiredMinValue=true,requiredMaxValue=true,maxValue=100000000,minValue=0,errorRequiredMsg="商品庫存不能為空!",errorMaxValueMsg="商品庫存不合理,請調低庫存量!",errorMinValueMsg="商品庫存不能低于0個!")privateIntegerstock;//商品的庫存privateIntegersellNum;//商品的銷售數(shù)量privateIntegercommentNum;//商品的評論數(shù)量@ValidateEntity(required=true,errorRequiredMsg="該商品對應的商品種類不能為空!")privateLongcategoryId;//商品所屬的商品種類idprivateProductCategoryproductCategory;//商品所屬的商品種類privateDatecreateTime;//商品創(chuàng)建時間privateDateupdateTime;//商品更新時間4.1.4用戶User實體類publicclassUser{privateLongid;//用戶id@ValidateEntity(required=true,requiredMaxLength=true,requiredMinLength=true,maxLength=8,minLength=1,errorRequiredMsg="用戶名稱不能為空!",errorMaxLengthMsg="用戶名稱長度不能大于8!",errorMinLengthMsg="用戶名稱長度不能小于1!")privateStringusername;//用戶名稱@ValidateEntity(required=true,requiredMaxLength=true,requiredMinLength=true,maxLength=16,minLength=6,errorRequiredMsg="密碼不能為空!",errorMaxLengthMsg="密碼長度不能大于16!",errorMinLengthMsg="密碼長度不能小于6!")privateStringpassword;//用戶密碼@ValidateEntity(required=true,requiredMaxLength=true,requiredMinLength=true,maxLength=64,minLength=1,errorRequiredMsg="電子郵箱不能為空!",errorMaxLengthMsg="電子郵箱長度不能大于64!",errorMinLengthMsg="電子郵箱長度不能小于1!")privateStringemail;//用戶電子郵箱@ValidateEntity(required=true,requiredMaxLength=true,requiredMinLength=true,maxLength=11,minLength=11,errorRequiredMsg="手機號碼不能為空!",errorMaxLengthMsg="請輸入11位手機號碼!",errorMinLengthMsg="請輸入11位手機號碼!")privateStringphone;//用戶手機號碼@ValidateEntity(requiredMaxLength=true,maxLength=256,errorMaxLengthMsg="頭像路徑長度不能大于256!")privateStringheadPic;//用戶頭像privateDatecreateTime;//用戶信息創(chuàng)建時間privateDateupdateTime;//用戶信息更改時間4.3系統(tǒng)功能主要實現(xiàn)模塊截圖4.3.1項目首頁前臺地址:http://localhost:8080/home/system/index4.3.1首頁://表單數(shù)據序列化vardata=$('#login_form').serialize();$.ajax({url:'/home/user/login',data:data,type:'post',dataType:'json',success:function(data){if(data.code==0){setTokenToCookie(data.msg,7);window.location.href="/home/system/index";}else{layer.alert(data.msg,{icon:5});}},error:function(){layer.alert("網絡錯誤,登錄失?。?,{icon:5});}});4.3.2注冊頁面: @RequestMapping(value="/doRegist") @ResponseBody publicResultMapdoRegist(Useruser){ System.out.println(user); Useru=userService.getUserByPhoneAndName(user.getPhone(),null); if(u!=null){ returnresultMap.success().message("該手機號已注冊!"); } try{ user.setPassword(MD5.md5(user.getPassword())); user.setCreateTime(newDate()); userService.save(user); String[]ids=newString[1]; ids[0]=user.getId()+""; //普通用戶 userRoleService.addUserRole(2,ids); returnresultMap.success().message("注冊成功"); }catch(Exceptione){ e.printStackTrace(); returnresultMap.fail().message("注冊失敗"); } }4.3.2主頁面系統(tǒng)首頁水果專區(qū)購物車管理添加用戶:我的訂單管理添加頁面菜單:輸入菜單名稱、URL進行保存添加。個人信息管理添加寵物信息:刪除寵物信息:修改密碼管理用戶評論收藏收貨地址管理4.3.4部分關鍵源碼展示:登錄模塊:/** *登錄表單驗證處理 *@paramadmin *@paramcpacha *@return */ @RequestMapping(value="/login",method=RequestMethod.POST) @ResponseBody publicResponseVo<Boolean>login(Adminadmin,Stringcpacha,HttpServletRequestrequest){ if(admin==null){ returnResponseVo.errorByMsg(CodeMsg.DATA_ERROR); } if(StringUtil.isEmpty(cpacha)){ returnResponseVo.errorByMsg(CodeMsg.CPACHA_EMPTY); } Stringcorrect_cpacha=(String)request.getSession().getAttribute("admin_login"); //判斷驗證碼是否過期 if(StringUtil.isEmpty(correct_cpacha)){ returnResponseVo.errorByMsg(CodeMsg.CPACHA_EXPIRE); } if(!cpacha.toLowerCase().equals(correct_cpacha.toLowerCase())){ returnResponseVo.errorByMsg(CodeMsg.CPACHA_ERROR); } //去數(shù)據庫查詢數(shù)據驗證 AdminselectByNameAndPassword=adminMapper.selectByNameAndPassword(admin.getName(),admin.getPassword()); if(selectByNameAndPassword==null){ returnResponseVo.errorByMsg(CodeMsg.USERNAME_OR_PASSWORD_ERROR); } //驗證該用戶是否被凍結 if(selectByNameAndPassword.getState().intValue()==AdminStateEnum.STOP.getCode().intValue()){ returnResponseVo.errorByMsg(CodeMsg.USER_STATE_ERROR); } //驗證該用戶是否無權限 List<Authority>selectByRoleId=authorityMapper.selectByRoleId(selectByNameAndPassword.getRoleId()); if(selectByRoleId==null||selectByRoleId.size()==0){ returnResponseVo.errorByMsg(CodeMsg.USER_AUTHORITY_ERROR); } //創(chuàng)建權限 request.getSession().setAttribute(SessionConstant.SESSION_ADMIN_LOGIN_KEY,selectByNameAndPassword); returnResponseVo.success(true);springboot全局配置文件:################################################################################################################server.port=8080#1800sserver.servlet.session.timeout=1800spring.jackson.time-zone=GMT+8spring.jackson.date-format=yyyy-MM-ddHH:mm:ss#定義加載的配置文件files.active=dev###FREEMARKER#設置是否允許HttpServletRequest屬性重寫(隱藏)控制器生成的同名模型屬性。spring.freemarker.allow-request-override=falsespring.freemarker.cache=falsespring.freemarker.check-template-location=truespring.freemarker.charset=UTF-8spring.freemarker.content-type=text/html#設置是否應在與模板合并之前將所有請求屬性添加到模型中。spring.freemarker.expose-request-attributes=false#設置是否允許HttpSession屬性重寫(隱藏)控制器生成的同名模型屬性。spring.freemarker.expose-session-attributes=false#設置是否公開名為“SpringmacroRequestContext”的RequestContext供Spring的宏庫使用.spring.freemarker.expose-spring-macro-helpers=falsespring.freemarker.prefix=#spring.freemarker.request-context-attribute=#spring.freemarker.settings.spring.freemarker.settings.template_update_delay=0spring.freemarker.settings.default_encoding=UTF-8spring.freemarker.suffix=.ftlspring.freemarker.template-loader-path=classpath:/templates/#spring.freemarker.view-names=#whitelistofviewnamesthatcanberesolvedspring.freemarker.settings.number_format=0.##spring.servlet.multipart.max-file-size=300MBspring.servlet.multipart.max-request-size=300MBperties:#文件上傳路徑,文件存放的真實路徑FILEPATH=/tmp/files/#資源映射地址為file:D://User/file.location=file:/tmp/files/數(shù)據庫連接配置文件:#數(shù)據源的地址spring.datasource.url=jdbc:mysql://:3307/db_fruit_vegetable_shop?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf8spring.datasource.username=rootspring.datasource.password=crit@2019spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.continue-on-error=falsespring.datasource.test-while-idle=true#獲取連接時候驗證,會影響性能spring.datasource.test-on-borrow=false#在連接歸還到連接池時是否測試該連接spring.datasource.test-on-return=falsespring.datasource.validation-query=SELECT1FROMDUAL#空閑連接回收的時間間隔,與test-while-idle一起使用,設置5分鐘spring.datasource.time-between-eviction-runs-millis=300000#連接池空閑連接的有效時間,設置30分鐘spring.datasource.min-evictable-idle-time-millis=1800000spring.datasource.initial-size=5#指定連接池中最大的活躍連接數(shù).spring.datasource.max-active=50#指定連接池等待連接返回的最大等待時間,毫秒單位.spring.datasource.max-wait=60000#指定必須保持連接的最小值spring.datasource.min-idle=5#熱部署生效spring.devtools.restart.enabled=true#mybatis駝峰匹配開啟mybatis.configuration.map-underscore-to-camel-case=true#控制臺日志配置mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl#mapper文件掃描路徑mybatis.mapper-locations=classpath*:mappers/admin/*.xml,classpath*:mappers/home/*.xml,classpath*:mappers/common/*.xml#mail配置spring.mail.host=tocol=smtpspring.mail.default-encoding=UTF-8spring.mail.username163.comspring.mail.password=LBWCLXTCZNGUMVMZspring.mail.test-connection=perties.mail.smtp.auth=perties.mail.smtp.starttls.enable=perties.mail.smtp.starttls.required=true#redis配置spring.redis.host=spring.redis.port=6379spring.redis.database=0#圖片上傳設置yjq.upload.photo.sufix=.jpg,.png,.gif,.jpeg#1024KByjq.upload.photo.maxsize=1024#200MB=204800KByjq.upload.attachment.maxsize=204800yjq.upload.photo.path=D:/IDEA_project/FruitAndVegetableShop/src/main/resources/upload/photo/yjq.upload.attachment.path=D:/IDEA_project/FruitAndVegetableShop/src/main/resources/upload/attachment/logback-spring.xml日志文件<?xmlversion="1.0"encoding="UTF-8"?><configuration> <appendername="consoleApp"class="ch.qos.logback.core.ConsoleAppender"><layoutclass="ch.qos.logback.classic.PatternLayout"><pattern>%date{yyyy-MM-ddHH:mm:ss.SSS}%-5level[%thread]%logger{56}.%method:%L-%msg%n</pattern></layout></appender><appendername="fileInfoApp"class="ch.qos.logback.core.rolling.RollingFileAppender"><filterclass="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>DENY</onMatch><onMismatch>ACCEPT</onMismatch></filter><encoder><pattern>%date{yyyy-MM-ddHH:mm:ss.SSS}%-5level[%thread]%logger{56}.%method:%L-%msg%n</pattern></encoder><!--滾動策略--><rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--路徑--><fileNamePattern>app_log/log/.%d{yyyy-MM-dd}.log</fileNamePattern><!--重啟清理日志文件--><cleanHistoryOnStart>true</cleanHistoryOnStart><!--日志文件保留天數(shù)10天--><maxHistory>10</maxHistory></rollingPolicy></appender><appendername="fileErrorApp"class="ch.qos.logback.core.rolling.RollingFileAppender"><filterclass="ch.qos.logback.classic.filter.ThresholdFilter"><level>ERROR</level></filter><encoder><pattern>%date{yyyy-MM-ddHH:mm:ss.SSS}%-5level[%thread]%logger{56}.%method:%L-%msg%n</pattern></encoder><!--設置滾動策略--><rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--路徑--><fileNamePattern>app_log/log/app.err.%d{yyyy-MM-dd}.log</fileNamePattern><!--重啟清理日志文件--><cleanHistoryOnStart>true</cleanHistoryOnStart><!--日志文件保留天數(shù)10天--><maxHistory>10</maxHistory></rollingPolicy></appender><rootlevel="INFO"><appender-refref="consoleApp"/><appender-refref="fileInfoApp"/><appender-refref="fileErrorApp"/></root></configuration>代碼主啟動類:/***項目入口啟動文件**/@SpringBootApplication@MapperScan({"grammer.dao.admin","grammer.dao.home","mon"})publicclassFruitAndVegetableShop{publicstaticvoidmain(String[]args){SpringApplication.run(FruitAndVegetableShop.class,args);}}過濾器實現(xiàn)類://后臺管理員登錄攔截器無需攔截的urlArrays.asList:字符串數(shù)組轉化為List publicstaticList<String>adminLoginExcludePathPatterns=Arrays.asList( "/admin/system/login", "/common/cpacha/generate_cpacha", "/admin/login/**", "/admin/common/**", "/admin/X-admin-2.2/**", "/home/css/**", "/home/common/**", "/home/font/**", "/home/images/**", "/home/js/**", "/home/system/js/slider.js", "/ueditor/**", "/photo/**" ); //前臺用戶登錄攔截器無需攔截的urlArrays.asList:字符串數(shù)組轉化為List publicstaticList<String>userLoginExcludePathPatterns=Arrays.asList( "/admin/system/login", "/home/system/js/slider.js", "/common/cpacha/generate_cpacha", "/admin/login/**", "/admin/common/**", "/admin/X-admin-2.2/**", "/home/css/**", "/home/common/**", "/home/font/**", "/home/images/**", "/home/js/**", "/ueditor/**", "/photo/**" ); //前臺用戶訪問需要攔截但無需驗證的urlArrays.asList:字符串數(shù)組轉化為List publicstaticList<String>userNotNeedConfirmUrl=Arrays.asList( "/home/system/index", "/home/user/login", "/home/user/register", "/home/product/fruit", "/home/product/vegetable", "/home/product/detail"4.4數(shù)據庫表設計4.4.0數(shù)據庫三范式要求:一、第一范式1NF是對屬性的原子性,要求屬性具有原子性,不可再分解;二、第二范式2NF是對記錄的唯一性,要求記錄有唯一標識,即實體的唯一性,即不存在部分依賴;三、第三范式3NF是對字段的冗余性,要求任何字段不能由其他字段派生出來,它要求字段沒有冗余,即不存在傳遞依賴;四、反范式化一般說來,數(shù)據庫只需滿足第三范式(3NF)就行了。沒有冗余的數(shù)據庫設計可以做到。但是,沒有冗余的數(shù)據庫未必是最好的數(shù)據庫,有時為了提高運行效率,就必須降低范式標準,適當保留冗余數(shù)據。具體做法是:在概念數(shù)據模型設計時遵守第三范式,降低范式標準的工作放到物理數(shù)據模型設計時考慮。降低范式就是增加字段,允許冗余,達到以空間換時間的目的?!祭剑河幸粡埓娣派唐返幕颈?,“金額”這個字段的存在,表明該表的設計不滿足第三范式,因為“金額”可以由“單價”乘以“數(shù)量”得到,說明“金額”是冗余字段。但是,增加“金額”這個冗余字段,可以提高查詢統(tǒng)計的速度,這就是以空間換時間的作法。在Rose2002中,規(guī)定列有兩種類型:數(shù)據列和計算列?!敖痤~”這樣的列被稱為“計算列”,而“單價”和“數(shù)量”這樣的列被稱為“數(shù)據列”。五、范式化設計和反范式化設計的優(yōu)缺點5.1范式化優(yōu)點:缺點:5.2反范式化優(yōu)點:缺點:數(shù)據庫采用mysql5版本、滿足數(shù)據庫

溫馨提示

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

最新文檔

評論

0/150

提交評論