spring boot校园二手销售网站 毕业设计源码161417
目 ?錄
摘要 1
1 緒論 1
1.1 研究背景 1
1.2國內外研究現狀 1
1.3論文結構與章節安排 1
2開發工具及相關技術介紹 ?技術介紹 3
2.1 MVVM模式介紹 3
2.2?B/S體系工作原理 4
2.3?spring boot框架介紹 4
2.4?JavaScript 運行模式 5
2.5?Ajax 應用 5
2.6?Vue.js 主要功能 6
3?校園二手銷售網站 ?系統分析 7
3.1 可行性分析 7
3.2 系統流程分析 8
3.2.1 數據流程 8
3.3.2 業務流程 9
3.3 系統功能分析 9
3.3.1 功能性分析 10
3.3.2 非功能性分析 10
3.4 系統用例分析 11
3.5本章小結 11
4?校園二手銷售網站 ?總體設計 12
4.1 系統架構設計 13
4.2 系統功能模塊設計 14
4.2.1整體功能模塊設計 15
4.2.2用戶模塊設計 16
4.2.3商城管理模塊設計 17
4.2.4訂單管理模塊設計 17
4.3 數據庫設計 18
4.3.1 數據庫概念結構設計 18
4.3.2 數據庫邏輯結構設計 19
4.4本章小結 23
5?校園二手銷售網站 ?詳細設計與實現 23
5.1用戶功能模塊 24
5.1.1 前臺首頁界面 25
5.1.2 用戶注冊界面 27
5.1.3 用戶登錄界面 28
5.1.4在線留言界面 30
5.1.5 收貨地址界面 31
5.1.6 商品詳情界面 33
5.1.7 我的訂單界面 33
5.2管理員功能模塊 34
5.2.1 用戶管理界面 35
5.2.2 在線留言管理界面 36
5.2.3 二手商城管理界面 37
5.2.4 二手資訊界面 38
5.2.5?訂單列表管理界面 39
5.2.6?訂單發貨界面 40
6系統測試 41
6.1系統測試的目的 41
6.2 系統測試用例 41
6.3 系統測試結果 42
結論 43
參考文獻 44
致??謝 45
摘要
隨著互聯網的普及以及發展,在網上出售、購買東西變得越來越日常,出于對校園發展的考慮,在很多校園里都實現了各式各樣的校園二手銷售網站 ,提高了校園資源的利用效率。然而,搭建大部分的網站所需要花費的人力和財力普遍較高,部署高能硬件也是一道坎,使得大部分中校園二手銷售網站都沒有成型,平臺的后期維護費用也拖垮了不少用戶。怎樣解決這個問題?我們需要找到一個更優的技術和方法,來降低網站的響應時間和做到提高系統高并發性性能,提升用戶的使用體驗,降低硬件需求度,能夠使用更便宜的硬件進行部署,從而降低網站建設的成本。此校園二手銷售網站 的開發項目采用springboot技術+MYSQL數據庫,就論題的各類需求分析說明做出解釋,然后再就網站的總體設計和詳細設計做出論述,給出了網站總體結構的搭建方法。從而滿足大部分中校園二手銷售網站 的需求。
關鍵詞:springboot技術;MYSQL;校園二手銷售網站 ?
Abstract
With the popularity and development of the Internet, selling and buying things on the Internet has become more and more daily. For the consideration of campus development, a variety of campus second-hand sales websites have been realized in many campuses, which improves the utilization efficiency of campus resources. However, the human and financial resources required to build most websites are generally high, and the deployment of high-energy hardware is also a barrier, which makes most of the secondary sales websites on campus not formed, and the later maintenance cost of the platform also brings down many users. How to solve this problem? We need to find a better technology and method to reduce the response time of the website, improve the high concurrency performance of the system, improve the user experience, reduce the hardware demand, and be able to deploy with cheaper hardware, so as to reduce the cost of website construction. The development project of this campus second-hand sales website adopts springboot technology + MySQL database to explain various needs analysis and instructions of the topic, then discusses the overall design and detailed design of the website, and gives the construction method of the overall structure of the website. So as to meet the needs of most secondary sales websites on campus.
Keywords:?Springboot technology; MYSQL; Campus second-hand sales website
1 緒論
1.1 研究背景
隨著時代不斷進步,社會不斷發展.電子商務得到了不斷地發展.電子商務成為了人們日常生活的一部分.如今,網上買東西,足不出戶便可以買到想要的東西物美價廉更是成為了年輕人的主流消費方式而電子商務也正在逐步的走向校園,學生可以在網上更方便的找工作、購物、以及買賣交易二手物品.綜上所述,校園二手銷售網站系統是有發展潛力的。
二手物品在校園中是有市場的.將要畢業的學生,可以將二手物品,如書,自行車,暖壺,以及一些不方便攜帶的東西,可以賣給學弟學妹們.這樣可以很大程度上避免浪費,符合本人國的可持續發展的國策學弟學妹,可以用低廉的價格,買到自己想要而實用的物品,符合國家倡導的勤儉節約的政策.校園二手商品網上銷售系統無論是對丁買方還是賣方,可以達到雙贏互助的。
每個學校雖然在每年6月份都有跳蚤市場,來頭賣二手物品但是局限性很大同學們往往在跳蚤市場逛了天,卻還是無所獲沒要買到自己想要的東西.而且魚龍混雜,經常無法保證售后,以及二手物品的質量.而學生們如果在校園二手商品網上銷售系統上交易二手物品.不僅可以讓買賣變得方便,系統分類簡單明了,賣賣雙方都有學籍和學號,很大的程度減少學生受騙的情況。
綜上三點,校園二手商品網上銷售系統既方便,又便捷,還方便管理.符合開發的目的。
1.2國內外研究現狀
由于這幾年來,計算機技術的逐日發展,在現代化的生活中,我們所需要的各種信息的處理操作都是通過使用計算機來完成的,有了計算機就可以方便的對各種信息進行查詢和維護了。因此需要實現對校園二手交易管理的電子化,提高校園二手交易的管理效能和銷售效能。
因為國內外傳統的二手的交易的方式是基于手工的,而人的精力和工作準確度是有限的,所以傳統的二手交易的數據管理方式難免會存在效率低下、準確率低等缺點,還伴隨著人力資源的大量浪費。在管理的工作中,所涉及到的工作電腦機器比人類更為擅長,能夠達到快速、準確、耗費資源小等要求。基于這些顯著的優點,如果能設計一套完整且貼合具體校園用戶需求的校園二手銷售網站,那么將大大地提高二手交易的服務質量。在具備這樣的校園二手銷售網站之下,買家只要登錄到系統中就能看到所有的二手商品,進行購買,賣家只要登錄到系統中就能夠出售二手商品管理人員只需配備少量的專業人員對數據庫進行日常數據審核、管理以及定期維護。整個過程中,使用者只需提供少量的必要信息,大部分數據處理工作皆由數據庫和相關程序來完成,節省了大量時間。如果數據庫中的某部分信息存在錯誤,那么使用者可以通過批量修改等方式來降低排錯過程中所要花費的時間和精力。因此,為校園開發一個稱職的校園二手銷售網站是十分有必要的。
1.3論文結構與章節安排
論文將分層次經行編排,除去論文摘要致謝文獻參考部分,正文部分還會對網站需求做出分析,以及闡述大體的設計和實現的功能,最后羅列部分調測記錄,論文主要架構如下:
第一章:引言。第一章主要介紹了課題研究的背景,系統開發的現狀和本文的研究內容與主要工作。
第二章:系統需求分析。第二章主要從系統的用戶、功能等方面進行需求分析。
第三章:系統設計。第三章主要對系統框架、系統功能模塊、數據庫進行功能設計。
第四章:系統實現。第四章主要介紹了系統框架搭建、系統界面的實現。
第五章:系統測試。第五章主要對系統的部分界面進行測試并對主要功能進行測試
2開發工具及相關技術介紹???技術介紹
2.1.MVVM模式介紹:
MVVM是Model-View-ViewModel的簡寫。它本質上就是MVC 的改進版。MVVM 就是將其中的View 的狀態和行為抽象化,讓我們將視圖 UI 和業務邏輯分開。當然這些事 ViewModel 已經幫我們做了,它可以取出 Model 的數據同時幫忙處理 View 中由于需要展示內容而涉及的業務邏輯。微軟的WPF帶來了新的技術體驗,如Silverlight、音頻、視頻、3D、動畫……,這導致了軟件UI層更加細節化、可定制化。同時,在技術層面,WPF也帶來了 諸如Binding、Dependency Property、Routed Events、Command、DataTemplate、ControlTemplate等新特性。MVVM(Model-View-ViewModel)框架的由來便是MVP(Model-View-Presenter)模式與WPF結合的應用方式時發展演變過來的一種新型架構框架。它立足于原有MVP框架并且把WPF的新特性糅合進去,以應對客戶日益復雜的需求變化。
2.2 B/S體系工作原理
B/S架構采取瀏覽器請求,服務器響應的工作模式。
用戶可以通過瀏覽器去訪問Internet上由Web服務器產生的文本、數據、圖片、動畫、視頻點播和聲音等信息;
而每一個Web服務器又可以通過各種方式與數據庫服務器連接,大量的數據實際存放在數據庫服務器中;
從Web服務器上下載程序到本地來執行,在下載過程中若遇到與數據庫有關的指令,由Web服務器交給數據庫服務器來解釋執行,并返回給Web服務器,Web服務器又返回給用戶。在這種結構中,將許許多多的網連接到一塊,形成一個巨大的網,即全球網。而各個企業可以在此結構的基礎上建立自己的Internet。
在 B/S 模式中,用戶是通過瀏覽器針對許多分布于網絡上的服務器進行請求訪問的,瀏覽器的請求通過服務器進行處理,并將處理結果以及相應的信息返回給瀏覽器,其他的數據加工、請求全部都是由Web Server完成的。通過該框架結構以及植入于操作系統內部的瀏覽器,該結構已經成為了當今軟件應用的主流結構模式。
?
2.3 spring boot框架介紹
Spring框架是Java平臺上的一種開源應用框架,提供具有控制反轉特性的容器。盡管Spring框架自身對編程模型沒有限制,但其在Java應用中的頻繁使用讓它備受青睞,以至于后來讓它作為EJB(EnterpriseJavaBeans)模型的補充,甚至是替補。Spring框架為開發提供了一系列的解決方案,比如利用控制反轉的核心特性,并通過依賴注入實現控制反轉來實現管理對象生命周期容器化,利用面向切面編程進行聲明式的事務管理,整合多種持久化技術管理數據訪問,提供大量優秀的Web框架方便開發等等。Spring框架具有控制反轉(IOC)特性,IOC旨在方便項目維護和測試,它提供了一種通過Java的反射機制對Java對象進行統一的配置和管理的方法。Spring框架利用容器管理對象的生命周期,容器可以通過掃描XML文件或類上特定Java注解來配置對象,開發者可以通過依賴查找或依賴注入來獲得對象。Spring框架具有面向切面編程(AOP)框架,SpringAOP框架基于代理模式,同時運行時可配置;AOP框架主要針對模塊之間的交叉關注點進行模塊化。Spring框架的AOP框架僅提供基本的AOP特性,雖無法與AspectJ框架相比,但通過與AspectJ的集成,也可以滿足基本需求。Spring框架下的事務管理、遠程訪問等功能均可以通過使用SpringAOP技術實現。Spring的事務管理框架為Java平臺帶來了一種抽象機制,使本地和全局事務以及嵌套事務能夠與保存點一起工作,并且幾乎可以在Java平臺的任何環境中工作。Spring集成多種事務模板,系統可以通過事務模板、XML或Java注解進行事務配置,并且事務框架集成了消息傳遞和緩存等功能。Spring的數據訪問框架解決了開發人員在應用程序中使用數據庫時遇到的常見困難。它不僅對Java:JDBC、iBATS/MyBATIs、Hibernate、Java數據對象(JDO)、ApacheOJB和ApacheCayne等所有流行的數據訪問框架中提供支持,同時還可以與Spring的事務管理一起使用,為數據訪問提供了靈活的抽象。Spring框架最初是沒有打算構建一個自己的WebMVC框架,其開發人員在開發過程中認為現有的StrutsWeb框架的呈現層和請求處理層之間以及請求處理層和模型之間的分離不夠,于是創建了SpringMVC。
2.4 JavaScript 運行模式
JavaScript是一種屬于網絡的高級腳本語言,已經被廣泛用于Web應用開發,常用來為網頁添加各式各樣的動態功能,為用戶提供更流暢美觀的瀏覽效果。通常JavaScript腳本是通過嵌入在HTML中來實現自身的功能的。
1.8.1是一種解釋性腳本語言(代碼不進行預編譯)。
1.8.2主要用來向HTML(標準通用標記語言下的一個應用)頁面添加交互行為。
1.8.3可以直接嵌入HTML頁面,但寫成單獨的js文件有利于結構和行為的分離。
1.8.4跨平臺特性,在絕大多數瀏覽器的支持下,可以在多種平臺下運行(如Windows、Linux、Mac、Android、iOS等)。
1.8.5 JavaScript腳本語言同其他語言一樣,有它自身的基本數據類型,表達式和算術運算符及程序的基本程序框架。JavaScript提供了四種基本的數據類型和兩種特殊數據類型用來處理數據和文字。而變量提供存放信息的地方,表達式則可以完成較復雜的信息處理。
2.5Ajax 應用
該技術在 1998 年前后得到了應用。允許客戶端腳本發送HTTP請求(XMLHTTP)的第一個組件由Outlook Web Access小組寫成。該組件原屬于微軟 Exchange Server,并且迅速地成為了 Internet Explorer 4.0 的一部分。部分觀察家認為,Outlook Web Access 是第一個應用了 Ajax 技術的成功的商業應用程序,并成為包括Oddpost 的網絡郵件產品在內的許多產品的領頭羊。但是,2005 年初,許多事件使得 Ajax 被大眾所接受。Google 在它著名的交互應用程序中使用了異步通訊,如Google、Google 地圖、Google 搜索建議、Gmail等。Ajax 這個詞由《Ajax: A New Approach to Web Applications》一文所創,該文的迅速傳播加強了人們使用該項技術的意識。另外,對Mozilla/Gecko 的支持使得該技術走向成熟,變得更為易用。
Ajax 前景非常樂觀,可以提高系統性能,優化用戶界面。Ajax 現有直接框架 AjaxPro,可以引入 AjaxPro.2.dll 文件,可以直接在前臺頁面 JavaScript 調用后臺頁面的方法。但此框架與表單驗證有沖突。另外微軟也引入了 Ajax 組件,需要添加AjaxControlToolkit.dll 文件,可以在控件列表中出現相關控件。
?
2.6 Vue.js 主要功能
Vue.js是一套構建用戶界面的漸進式框架。與其他重量級框架不同的是,Vue采用自底向上增量開發的設計。Vue 的核心庫只關注視圖層,并且非常容易學習,非常容易與其它庫或已有項目整合。另一方面,Vue 完全有能力驅動采用單文件組件和Vue生態系統支持的庫開發的復雜單頁應用。
Vue.js 的目標是通過盡可能簡單的 API 實現響應的數據綁定和組合的視圖組件。
Vue.js 自身不是一個全能框架——它只聚焦于視圖層。因此它非常容易學習,非常容易與其它庫或已有項目整合。另一方面,在與相關工具和支持庫一起使用時,Vue.js 也能驅動復雜的單頁應用。
3?校園二手銷售網站 ?系統分析
系統分析是開發一個項目的先決條件,通過系統分析可以很好的了解系統的主體用戶的基本需求情況,同時這也是項目的開發的原因。進而對系統開發進行可行性分析,通常包括技術可行性、經濟可行性等,可行性分析同時也是從項目整體角度進行的分析。然后就是對項目的具體需求進行分析,分析的手段一般都是通過用戶的用例圖來實現。下面是詳細的介紹。
本系統將在經濟、技術、操作這三個角度上進行可行性分析。
3.1?可行性分析
(1)經濟可行性
整個系統從設計到開發以及測試過程嚴謹步驟齊全,所有工作任務全部由本人完成,并未獲取外部技術支持,節約了一切服務成本開銷以及人工成本,在硬件方面,為節約成本使用一臺二手移動工作站作為項目部署服務器以及數據庫服務器,成本在一萬元一下,真個網絡部署也是由本人獨立完成不涉及到其他人工費用,整個開發過程本著低成本,低消耗的原則。
綜上所述經濟可行性也沒有問題。
(2)技術可行性
技術可行性分析的目的是確認該系統能否利用現有技術實現,并評估開發效率和完成情況。技術的可行性是指在當前的技術條件下,計算機軟件和硬件的開發是否能夠滿足發展的要求。因為該系統的開發基于Java語言,所以開發該系統所需的軟件和硬件條件可以在普通計算機上滿足。因為它占用的內存相對較少,所以用MySQL數據庫開發和設計軟件理論上沒有問題,因為它占用的內存太少。上述技術可以有效地保證系統的成功和高效開發。
綜上所述技術可行性也沒有問題。
(3)法律可行性:
從開發者角度來看,springboot和MYSQL是網上開源且免費的,在知識產權方面不會產生任何法律糾紛。
從用戶使用角度來看,只要不再系統上販賣違禁品,對系統做出條約協議,杜絕非法支付即可。
綜上所述法律可行性也沒有問題。
3.2 系統流程分析
3.2.1?數據流程
校園二手銷售網站主要的目的就是實現對二手商品的在線選購,圖2-1就是系統的數據流圖。
?
圖2-1商品購買操作展開圖
3.3.2?業務流程
分析完系統的數據流,接下來我們來看系統的業務流程,圖2-2就是業務流程圖:
?
圖3-2業務流程圖
3.3?系統功能分析
3.3.1 功能性分析
按照校園二手銷售網站的角色,我劃分為了用戶管理模塊、管理員管理模塊這兩大部分。
用戶管理模塊:
(1)用戶注冊登錄:用戶注冊為會員并登錄校園二手銷售網站;用戶對個人信息的增刪改查,比如個人資料,密碼修改。
(2)用戶查看商品:用戶進行商品信息的閱覽,通過發現喜歡的商品后可以購買+評論+收藏。
(3)二手資訊:用戶進行資訊的閱覽,查看管理者發布的二手資訊信息。
(4)在線留言:用戶在留言這一菜單下對用戶提交的查看、同時也可以發布留言、評論。
(5)我的訂單:用戶在提交訂單后,可以對提交的訂單進行管理。
管理員管理模塊:
(1)用戶管理:管理員可以對前臺上注冊過的用戶信息進行管控,也可以對管理員信息進行管控。
(2)二手資訊管理:管理員在后臺可以對校園二手銷售網站中顯示的二手資訊信息進行增刪改查。
(3)分類列表管理:管理員對校園二手銷售網站中商品的分類進行管控。
(4)二手商城管理:管理員對賣家提交的商品訂單進行管控。
(5)留言管理:管理員可以對校園二手銷售網站中用戶提交的留言以及留言的分類進行增刪改查。
(6)站點管理:管理員可以對校園二手銷售網站中首頁顯示的輪播圖以及系統中的一些公告發布到系統當中,讓用戶及時的查看到系統信息,進行合理安排。
3.3.2 非功能性分析
1.系統處理的準確性和機密性
系統軟件應確保公司內部信息內容的機密性,以確保用戶利益。系統軟件應選擇管理權限,操縱不同客戶的應用程序管理權限,并且客戶不得濫用該權限進行實際操作。系統軟件應確保數據信息的安全性。另外,客戶指定系統軟件具有縱橫比的可信度,數據信息的準確性,并且系統軟件是可恢復的。
2.系統軟件的開發和可擴展性
客戶會在系統使用過程中不斷對系統提出新要求,擴展系統功能,這就要求系統軟件必須具有出色的可伸縮性,以考慮到客戶的長期和易于使用的法規,客戶會在系統使用過程中不斷對系統提出新要求,擴展系統功能。
3.系統軟件的便利性和可執行性
控制系統設計應個性化,用戶界面應該做到清晰簡單一目了然,操作簡單方便,達到人機 友好的目的。
4.系統軟件的響應時間
系統軟件響應速度是考慮系統軟件特性的優缺點的關鍵參考。該系統要求響應速度短,升級解決方案快,數據交換和傳輸時間短以及后臺管理網絡服務器的響應速度快。由于系統軟件用戶的唯一性,系統軟件必須立即有效地做出響應。并且,請務必在安全前提下確保高效的響應能力。
校園二手銷售網站的非功能性需求比如校園二手銷售網站的安全性怎么樣,可靠性怎么樣,性能怎么樣,可拓展性怎么樣等。具體可以表示在如下3-1表格中:
表3-1校園二手銷售網站非功能需求表
| 安全性 | 主要指校園二手銷售網站數據庫的安裝,數據庫的使用和密碼的設定必須合乎規范。 |
| 可靠性 | 可靠性是指校園二手銷售網站能夠安裝用戶的指示進行操作,經過測試,可靠性90%以上。 |
| 性能 | 性能是影響校園二手銷售網站占據市場的必要條件,所以性能最好要佳才好。 |
| 可擴展性 | 比如數據庫預留多個屬性,比如接口的使用等確保了系統的非功能性需求。 |
| 易用性 | 用戶只要跟著校園二手銷售網站的頁面展示內容進行操作,就可以了。 |
| 可維護性 | 校園二手銷售網站開發的可維護性是非常重要的,經過測試,可維護性沒有問題 |
3.4?系統用例分析
通過2.3功能的分析,得出了本校園二手銷售網站的用例圖:
用戶角色用例如圖2-3所示。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
圖2-3?校園二手銷售網站 ?用戶角色用例圖
web后臺管理上的管理員是維護整個校園二手銷售網站中所有數據信息的管理員角色用例如圖2-5所示。
?
?
圖2-5?校園二手銷售網站管理員角色用例圖
3.6本章小結
本章主要通過對校園二手銷售網站的可行性分析、流程分析、功能需求分析、系統用例分析,確定整個校園二手銷售網站要實現的功能。同時也為校園二手銷售網站的代碼實現和測試提供了標準。
4 校園二手銷售網站 ?總體設計
本章主要討論的內容包括校園二手銷售網站 ?的功能模塊設計、數據庫系統設計。
4.1 系統架構設計
本校園二手銷售網站從架構上分為三層:表現層(UI)、業務邏輯層(BLL)以及數據層(DL)。
圖3-1校園二手銷售網站 ?系統架構設計圖
?
表現層(UI):又稱UI層,主要完成本校園二手銷售網站的UI交互功能,一個良好的UI可以打打提高用戶的用戶體驗,增強用戶使用本校園二手銷售網站時的舒適度。UI的界面設計也要適應不同版本的校園二手銷售網站以及不同尺寸的分辨率,以做到良好的兼容性。UI交互功能要求合理,用戶進行交互操作時必須要得到與之相符的交互結果,這就要求表現層要與業務邏輯層進行良好的對接。
業務邏輯層(BLL):主要完成本校園二手銷售網站的數據處理功能。用戶從表現層傳輸過來的數據經過業務邏輯層進行處理交付給數據層,系統從數據層讀取的數據經過業務邏輯層進行處理交付給表現層。
數據層(DL):由于本校園二手銷售網站的數據是放在服務端的mysql數據庫中,因此本屬于服務層的部分可以直接整合在業務邏輯層中,所以數據層中只有數據庫,其主要完成本校園二手銷售網站的數據存儲和管理功能。
4.2?系統功能模塊設計
4.2.1整體功能模塊設計
在上一章節中主要對系統的功能性需求和非功能性需求進行分析,并且根據需求分析了本校園二手銷售網站中的用例。那么接下來就要開始對本校園二手銷售網站的架構、主要功能和數據庫開始進行設計。校園二手銷售網站根據前面章節的需求分析得出,其總體設計模塊圖如圖3-2所示。
?
圖3-2?校園二手銷售網站功能模塊圖
前臺適用用于用戶的登錄、注冊、二手商品的展示和檢索、商品的購買和查看自己的訂單等。
后臺包括管理員登錄、增加商品、查看和修改商品信息、訂單管理、用戶管理。
4.2.2用戶模塊設計
后臺管理者能夠實現對前臺注冊的用戶增刪改查操作,用戶模塊結構圖如下圖:
?
圖3-3會員用戶模塊結構圖
4.2.3商城管理模塊設計
校園二手銷售網站是中需要存儲不少商品信息,其模塊功能結構,具體的結構圖如下:
?
圖3-4商城模塊結構圖
4.2.4訂單管理模塊設計
校園二手銷售網站最重要的一個功能就是購買,其模塊功能結構,具體的結構圖如下:
?
圖3-5訂單模塊結構圖
4.3 數據庫設計
數據庫設計一般包括需求分析、概念模型設計、數據庫表建立三大過程,其中需求分析前面章節已經闡述,概念模型設計有概念模型和邏輯結構設計兩部分。
4.3.1 數據庫概念結構設計
下面是整個校園二手銷售網站 ?中主要的數據庫表總E-R實體關系圖。
圖3-6?校園二手銷售網站總E-R關系圖
?
下面根據校園二手銷售網站的數據庫總E-R關系圖可以得出校園二手銷售網站需要很多E-R圖,在此羅列出來一些主要的數據庫E-R模型圖。
?
圖3-7訂單發貨E-R關系圖
?
圖3-8?二手商城信息E-R關系圖
?
圖3-9?地址信息E-R關系圖
?
圖3-10?評論E-R關系圖
4.3.2 數據庫邏輯結構設計
通過上一小節中校園二手銷售網站中總E-R關系圖上得出一共需要創建很多個數據表。在此我主要羅列幾個主要的數據庫表結構設計。
表3-1?user_registration用戶注冊表
| 名稱 | 類型 | 長度 | 不是null | 主鍵 | 注釋 |
| user_registration_id | int | 11 | 是 | 是 | 用戶注冊ID |
| gender | varchar | 64 | 否 | 否 | 性別 |
| examine_state | varchar | 16 | 是 | 否 | 審核狀態 |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| user_id | int | 11 | 是 | 否 | 用戶ID |
| create_time | datetime | 0 | 是 | 否 | 創建時間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時間 |
表3-2?second_hand_mall二手商城表
| 名稱 | 類型 | 長度 | 不是null | 主鍵 | 注釋 |
| second_hand_mall_id | int | 11 | 是 | 是 | 二手商城ID |
| condition | varchar | 64 | 否 | 否 | 成色 |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| cart_title | varchar | 125 | 否 | 否 | 標題 |
| cart_img | text | 0 | 否 | 否 | 封面圖 |
| cart_description | varchar | 255 | 否 | 否 | 描述 |
| cart_price_ago | double | 8 | 是 | 否 | 原價 |
| cart_price | double | 8 | 是 | 否 | 賣價 |
| cart_inventory | int | 11 | 是 | 否 | 商品庫存 |
| cart_type | varchar | 64 | 是 | 否 | 商品分類 |
| cart_content | longtext | 0 | 否 | 否 | 正文 |
| cart_img_1 | text | 0 | 否 | 否 | 主圖1 |
| cart_img_2 | text | 0 | 否 | 否 | 主圖2 |
| cart_img_3 | text | 0 | 否 | 否 | 主圖3 |
| cart_img_4 | text | 0 | 否 | 否 | 主圖4 |
| cart_img_5 | text | 0 | 否 | 否 | 主圖5 |
| create_time | datetime | 0 | 是 | 否 | 創建時間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時間 |
表3-3 praise點贊表
| 名稱 | 類型 | 長度 | 不是null | 主鍵 | 注釋 |
| praise_id | int | 10 | 是 | 是 | 點贊ID |
| user_id | int | 11 | 是 | 否 | 點贊人 |
| create_time | timestamp | 0 | 是 | 否 | 創建時間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時間 |
| source_table | varchar | 255 | 否 | 否 | 來源表 |
| source_field | varchar | 255 | 否 | 否 | 來源字段 |
| source_id | int | 10 | 是 | 否 | 來源ID |
| status | tinyint | 1 | 是 | 否 | 點贊狀態 |
表3-4?address收貨地址表
| 名稱 | 類型 | 長度 | 不是null | 主鍵 | 注釋 |
| address_id | int | 11 | 是 | 是 | 收貨地址 |
| name | varchar | 32 | 否 | 否 | 姓名 |
| phone | varchar | 13 | 否 | 否 | 手機 |
| postcode | varchar | 8 | 否 | 否 | 郵編 |
| address | varchar | 255 | 是 | 否 | 地址: |
| user_id | mediumint | 8 | 是 | 否 | 用戶ID |
| create_time | timestamp | 0 | 是 | 否 | 創建時間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時間 |
| default | tinyint | 1 | 是 | 否 | 默認判斷 |
表3-5 comment評論信息表
| 名稱 | 類型 | 長度 | 不是null | 主鍵 | 注釋 |
| comment_id | int | 11 | 是 | 是 | 評論ID |
| user_id | int | 11 | 是 | 否 | 評論人ID |
| reply_to_id | int | 11 | 是 | 否 | 回復評論ID |
| content | longtext | 0 | 否 | 否 | 內容 |
| nickname | varchar | 255 | 否 | 否 | 昵稱 |
| avatar | varchar | 255 | 否 | 否 | 頭像地址 |
| create_time | timestamp | 0 | 是 | 否 | 創建時間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時間 |
| source_table | varchar | 255 | 否 | 否 | 來源表 |
| source_field | varchar | 255 | 否 | 否 | 來源字段 |
| source_id | int | 10 | 是 | 否 | 來源ID |
表3-6?order_shipment訂單發貨表
| 名稱 | 類型 | 長度 | 不是null | 主鍵 | 注釋 |
| order_shipment_id | int | 11 | 是 | 是 | 訂單發貨ID |
| order_number | varchar | 64 | 否 | 否 | 訂單編號 |
| trade_name | varchar | 64 | 否 | 否 | 商品名稱 |
| shipment_quantity | int | 11 | 否 | 否 | 發貨數量 |
| delivery_time | date | 0 | 否 | 否 | 發貨時間 |
| delivery_logistics | varchar | 64 | 否 | 否 | 發貨物流 |
| shipment_no | varchar | 64 | 否 | 否 | 發貨單號 |
| user_account | int | 11 | 否 | 否 | 用戶賬號 |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| create_time | datetime | 0 | 是 | 否 | 創建時間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時間 |
4.4本章小結
整個校園二手銷售網站的需求分析主要對系統總體架構以及功能模塊的設計,通過建立E-R模型和數據庫邏輯系統設計完成了數據庫系統設計。
5?校園二手銷售網站 ?詳細設計與實現
校園二手銷售網站的詳細設計與實現主要是根據前面的校園二手銷售網站的需求分析和校園二手銷售網站的總體設計來設計頁面并實現業務邏輯。主要從校園二手銷售網站界面實現、業務邏輯實現這兩部分進行介紹。
5.1用戶功能模塊
5.1.1 前臺首頁界面
用戶界面要盡量簡潔大方,使用戶能夠方便找到需要的功能入口,瀏覽、購買商品,且要易于修改和維護,同時還要保證用戶合法和系統安全。其主界面展示如下圖5-1所示。
?
圖5-1?前臺首頁界面圖
系統首頁關鍵代碼如下所示。
public class FindConfig {
????public static String PAGE = "page";
????public static String SIZE = "size";
????public static String LIKE = "like";
????public static String ORDER_BY = "orderby";
????public static String FIELD = "field";
????public static String GROUP_BY = "groupby";
????public static String MIN_ = "_min";
????public static String MAX_ = "_max";
}
5.1.2 用戶注冊界面
不是校園二手銷售網站中正式用戶的是可以在線進行注冊的,如果你沒有本校園二手銷售網站的賬號的話,添加“注冊”,當填寫上自己的賬號+密碼+確認密碼+昵稱+郵箱+手機號等后再點擊“注冊”按鈕后將會先驗證輸入的有沒有空數據,再次驗證密碼和確認密碼是否是一樣的,最后驗證輸入的賬戶名和數據庫表中已經注冊的賬戶名是否重復,只有都驗證沒問題后即可用戶注冊成功。其用用戶注冊界面展示如下圖5-2所示。
?
圖5-2?前臺用戶注冊界面圖
注冊關鍵代碼如下所示。
/**
?????* 注冊
?????* @param user
?????* @return
?????*/
????@PostMapping("register")
????public Map<String, Object> signUp(@RequestBody User user) {
????????// 查詢用戶
????????Map<String, String> query = new HashMap<>();
????????query.put("username",user.getUsername());
????????List list = service.select(query, new HashMap<>()).getResultList();
????????if (list.size()>0){
????????????return error(30000, "用戶已存在");
????????}
????????user.setUserId(null);
????????user.setPassword(service.encryption(user.getPassword()));
????????service.save(user);
????????return success(1);
}
/**
?????* 用戶ID:[0,8388607]用戶獲取其他與用戶相關的數據
?????*/
????@Id
????@GeneratedValue(strategy = GenerationType.IDENTITY)
????@Column(name = "user_id")
????private Integer userId;
????/**
?????* 賬戶狀態:[0,10](1可用|2異常|3已凍結|4已注銷)
?????*/
????@Basic
????@Column(name = "state")
????private Integer state;
????/**
?????* 所在用戶組:[0,32767]決定用戶身份和權限
?????*/
????@Basic
????@Column(name = "user_group")
????private String userGroup;
????/**
?????* 上次登錄時間:
?????*/
????@Basic
????@Column(name = "login_time")
????private Timestamp loginTime;
????/**
?????* 手機號碼:[0,11]用戶的手機號碼,用于找回密碼時或登錄時
?????*/
????@Basic
????@Column(name = "phone")
????private String phone;
????/**
?????* 手機認證:[0,1](0未認證|1審核中|2已認證)
?????*/
????@Basic
????@Column(name = "phone_state")
????private Integer phoneState;
????/**
?????* 用戶名:[0,16]用戶登錄時所用的賬戶名稱
?????*/
????@Basic
????@Column(name = "username")
????private String username;
????/**
?????* 昵稱:[0,16]
?????*/
????@Basic
????@Column(name = "nickname")
????private String nickname;
????/**
?????* 密碼:[0,32]用戶登錄所需的密碼,由6-16位數字或英文組成
?????*/
????@Basic
????@Column(name = "password")
????private String password;
????/**
?????* 郵箱:[0,64]用戶的郵箱,用于找回密碼時或登錄時
?????*/
????@Basic
????@Column(name = "email")
????private String email;
????/**
?????* 郵箱認證:[0,1](0未認證|1審核中|2已認證)
?????*/
????@Basic
????@Column(name = "email_state")
????private Integer emailState;
????/**
?????* 頭像地址:[0,255]
?????*/
????@Basic
????@Column(name = "avatar")
????private String avatar;
????/**
?????* 創建時間:
?????*/
????@Basic
????@Column(name = "create_time")
????@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
????private Timestamp createTime;
????@Basic
????@Transient
????private String code;
}
5.1.3 用戶登錄界面
校園二手銷售網站中的前臺上注冊后的用戶是可以通過自己的賬戶名和密碼進行登錄的,當用戶輸入完整的自己的賬戶名和密碼信息并點擊“登錄”按鈕后,將會首先驗證輸入的有沒有空數據,再次驗證輸入的賬戶名+密碼和數據庫中當前保存的用戶信息是否一致,只有在一致后將會登錄成功并自動跳轉到校園二手銷售網站 ?的首頁中;否則將會提示相應錯誤信息,用戶登錄界面如下圖5-3所示。
?
圖5-3用戶登錄界面圖
登錄關鍵代碼如下所示。
/**
?????* 登錄
?????* @param data
?????* @param httpServletRequest
?????* @return
?????*/
????@PostMapping("login")
????public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {
????????log.info("[執行登錄接口]");
????????String username = data.get("username");
????????String email = data.get("email");
????????String phone = data.get("phone");
????????String password = data.get("password");
????????List resultList = null;
????????Map<String, String> map = new HashMap<>();
????????if(username != null && "".equals(username) == false){
????????????map.put("username", username);
????????????resultList = service.select(map, new HashMap<>()).getResultList();
????????}
????????else if(email != null && "".equals(email) == false){
????????????map.put("email", email);
????????????resultList = service.select(map, new HashMap<>()).getResultList();
????????}
????????else if(phone != null && "".equals(phone) == false){
????????????map.put("phone", phone);
????????????resultList = service.select(map, new HashMap<>()).getResultList();
????????}else{
????????????return error(30000, "賬號或密碼不能為空");
????????}
????????if (resultList == null || password == null) {
????????????return error(30000, "賬號或密碼不能為空");
????????}
????????//判斷是否有這個用戶
????????if (resultList.size()<=0){
????????????return error(30000,"用戶不存在");
????????}
????????User byUsername = (User) resultList.get(0);
????????Map<String, String> groupMap = new HashMap<>();
????????groupMap.put("name",byUsername.getUserGroup());
????????List groupList = userGroupService.select(groupMap, new HashMap<>()).getResultList();
????????if (groupList.size()<1){
????????????return error(30000,"用戶組不存在");
????????}
????????UserGroup userGroup = (UserGroup) groupList.get(0);
????????//查詢用戶審核狀態
????????if (!StringUtils.isEmpty(userGroup.getSourceTable())){
????????????String sql = "select examine_state from "+ userGroup.getSourceTable() +" WHERE user_id = " + byUsername.getUserId();
????????????String res = String.valueOf(service.runCountSql(sql).getSingleResult());
????????????if (res==null){
????????????????return error(30000,"用戶不存在");
????????????}
????????????if (!res.equals("已通過")){
????????????????return error(30000,"該用戶審核未通過");
????????????}
????????}
????????//查詢用戶狀態
????????if (byUsername.getState()!=1){
????????????return error(30000,"用戶非可用狀態,不能登錄");
????????}
????????String md5password = service.encryption(password);
????????if (byUsername.getPassword().equals(md5password)) {
????????????// 存儲Token到數據庫
????????????AccessToken accessToken = new AccessToken();
????????????accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));
????????????accessToken.setUser_id(byUsername.getUserId());
????????????tokenService.save(accessToken);
????????????// 返回用戶信息
????????????JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));
????????????user.put("token", accessToken.getToken());
????????????JSONObject ret = new JSONObject();
????????????ret.put("obj",user);
????????????return success(ret);
????????} else {
????????????return error(30000, "賬號或密碼不正確");
????????}
}
5.1.4在線留言界面
用戶在點擊導航欄上面的留言板后,就可以搜索查看留言信息,用戶根據自己的喜好可以進行交流,留言板界面如下圖4-4所示。
?
圖4-4在線留言界面圖
在線留言關鍵代碼如下所示。
@PostMapping("/add")
????@Transactional
????public Map<String, Object> add(HttpServletRequest request) throws IOException {
????????service.insert(service.readBody(request.getReader()));
????????return success(1);
????}
????@Transactional
????public Map<String, Object> addMap(Map<String,Object> map){
????????service.insert(map);
????????return success(1);
}
????public Map<String,Object> readBody(BufferedReader reader){
????????BufferedReader br = null;
????????StringBuilder sb = new StringBuilder("");
????????try{
????????????br = reader;
????????????String str;
????????????while ((str = br.readLine()) != null){
????????????????sb.append(str);
????????????}
????????????br.close();
????????????String json = sb.toString();
????????????return JSONObject.parseObject(json, Map.class);
????????}catch (IOException e){
????????????e.printStackTrace();
????????}finally{
????????????if (null != br){
????????????????try{
????????????????????br.close();
????????????????}catch (IOException e){
????????????????????e.printStackTrace();
????????????????}
????????????}
????????}
????????return null;
}
????public void insert(Map<String,Object> body){
????????StringBuffer sql = new StringBuffer("INSERT INTO ");
????????sql.append("`").append(table).append("`").append(" (");
????????for (Map.Entry<String,Object> entry:body.entrySet()){
????????????sql.append("`"+humpToLine(entry.getKey())+"`").append(",");
????????}
????????sql.deleteCharAt(sql.length()-1);
????????sql.append(") VALUES (");
????????for (Map.Entry<String,Object> entry:body.entrySet()){
????????????Object value = entry.getValue();
????????????if (value instanceof String){
????????????????sql.append("'").append(entry.getValue()).append("'").append(",");
????????????}else {
????????????????sql.append(entry.getValue()).append(",");
????????????}
????????}
????????sql.deleteCharAt(sql.length() - 1);
????????sql.append(")");
????????log.info("[{}] - 插入操作:{}",table,sql);
????????Query query = runCountSql(sql.toString());
????????query.executeUpdate();
????}
5.1.5?收貨地址界面
當用戶點擊“收貨地址”右后,就回去顯示出目前現有的地址,也可以添加新的地址,界面如下圖4-5所示。
?
圖5-5收貨地址界面圖
5.1.6?商品詳情界面
當訪客點擊了任意商品后將會進入該款商品的詳情界面,可以了解到該商品的圖片信息、商品信息、價錢信息等,同時可以對該商品進行加購+立即購買+收藏+點贊+評論,商品詳情展示頁面如圖4-6所示。
?
圖5-6?商品詳情界面圖
5.1.7?我的訂單界面
當用戶點擊“我的訂單”鏈接后就進入自己購買的訂單的界面展示,界面如下圖4-7所示。
?
圖5-7?我的訂單界面圖
5.2管理員功能模塊
5.2.1 用戶管理界面
校園二手銷售網站中的管理人員是可以對前臺注冊的用戶進行管理的,也可以對管理員進行管控。界面如下圖4-9所示。
?
圖4-9用戶管理界面圖
用戶管理關鍵代碼如下所示。
public String encryption(String plainText) {
????????String re_md5 = new String();
????????try {
????????????MessageDigest md = MessageDigest.getInstance("MD5");
????????????md.update(plainText.getBytes());
????????????byte b[] = md.digest();
????????????int i;
????????????StringBuffer buf = new StringBuffer("");
????????????for (int offset = 0; offset < b.length; offset++) {
????????????????i = b[offset];
????????????????if (i < 0)
????????????????????i += 256;
????????????????if (i < 16)
????????????????????buf.append("0");
????????????????buf.append(Integer.toHexString(i));
????????????}
????????????re_md5 = buf.toString();
????????} catch (Exception e) {
????????????e.printStackTrace();
????????}
????????return re_md5;
????}
5.2.2?在線留言管理界面
校園二手銷售網站中的管理人員是可以對前臺用戶發布的留言進行管控的,界面如下圖4-11所示。
?
圖4-10在線留言界面圖
5.2.3二手商城管理界面
校園二手銷售網站中的管理人員是可以對校園二手銷售網站內的賣家發布的商品進行維護和管理的,支持增刪改查操作。界面如下圖4-11所示。
?
圖4-11二手商城管理界面圖
二手商城管理關鍵代碼如下所示。
??@PostMapping("/add")
????@Transactional
????public Map<String, Object> add(HttpServletRequest request) throws IOException {
????????service.insert(service.readBody(request.getReader()));
????????return success(1);
????}
????@Transactional
????public Map<String, Object> addMap(Map<String,Object> map){
????????service.insert(map);
????????return success(1);
}
????public Map<String,Object> readBody(BufferedReader reader){
????????BufferedReader br = null;
????????StringBuilder sb = new StringBuilder("");
????????try{
????????????br = reader;
????????????String str;
????????????while ((str = br.readLine()) != null){
????????????????sb.append(str);
????????????}
????????????br.close();
????????????String json = sb.toString();
????????????return JSONObject.parseObject(json, Map.class);
????????}catch (IOException e){
????????????e.printStackTrace();
????????}finally{
????????????if (null != br){
????????????????try{
????????????????????br.close();
????????????????}catch (IOException e){
????????????????????e.printStackTrace();
????????????????}
????????????}
????????}
????????return null;
}
????public void insert(Map<String,Object> body){
????????StringBuffer sql = new StringBuffer("INSERT INTO ");
????????sql.append("`").append(table).append("`").append(" (");
????????for (Map.Entry<String,Object> entry:body.entrySet()){
????????????sql.append("`"+humpToLine(entry.getKey())+"`").append(",");
????????}
????????sql.deleteCharAt(sql.length()-1);
????????sql.append(") VALUES (");
????????for (Map.Entry<String,Object> entry:body.entrySet()){
????????????Object value = entry.getValue();
????????????if (value instanceof String){
????????????????sql.append("'").append(entry.getValue()).append("'").append(",");
????????????}else {
????????????????sql.append(entry.getValue()).append(",");
????????????}
????????}
????????sql.deleteCharAt(sql.length() - 1);
????????sql.append(")");
????????log.info("[{}] - 插入操作:{}",table,sql);
????????Query query = runCountSql(sql.toString());
????????query.executeUpdate();
????}
5.2.4 二手資訊界面
校園二手銷售網站中的管理人員是可以對校園二手銷售網站內的資訊信息進行維護和管理的。校園資訊列表界面如下圖5-12所示。
?
圖5-12二手資訊界面圖
二手資訊管理關鍵代碼如下所示。
@RequestMapping(value = "/del")
????@Transactional
????public Map<String, Object> del(HttpServletRequest request) {
????????service.delete(service.readQuery(request), service.readConfig(request));
????????return success(1);
}
????@Transactional
????public void delete(Map<String,String> query,Map<String,String> config){
????????StringBuffer sql = new StringBuffer("DELETE FROM ").append("`").append(table).append("`").append(" ");
????????sql.append(toWhereSql(query, "0".equals(config.get(FindConfig.GROUP_BY))));
????????log.info("[{}] - 刪除操作:{}",table,sql);
????????Query query1 = runCountSql(sql.toString());
????????query1.executeUpdate();
????}
5.2.5訂單列表管理的實現
管理員在后臺管理界面點擊到所有訂單界面dingdan_list.html,向控制層dingdanAction發送請求,搜索當前所有訂單信息,dingdanAction向dingdanDAOImp調用搜索全部訂單的請求,向數據庫的訂單表搜索當前所有訂單并將訂單信息以對象的形式層層返回到dingdan_list.html界面,顯示出當前所有訂單信息。同時可以刪除過期訂單,確認已有訂單,進行發貨處理。
訂單管理界面如下圖所示。
?
圖5-13訂單列表管理界面
訂單列表管理關鍵代碼如下所示。
@PostMapping("/set")
@Transactional
????public Map<String, Object> set(HttpServletRequest request) throws IOException {
????????service.update(service.readQuery(request), service.readConfig(request), service.readBody(request.getReader()));
????????return success(1);
}
????public Map<String,String> readConfig(HttpServletRequest request){
????????Map<String,String> map = new HashMap<>();
????????map.put(FindConfig.PAGE,request.getParameter(FindConfig.PAGE));
????????map.put(FindConfig.SIZE,request.getParameter(FindConfig.SIZE));
????????map.put(FindConfig.LIKE,request.getParameter(FindConfig.LIKE));
????????map.put(FindConfig.ORDER_BY,request.getParameter(FindConfig.ORDER_BY));
????????map.put(FindConfig.FIELD,request.getParameter(FindConfig.FIELD));
????????map.put(FindConfig.GROUP_BY,request.getParameter(FindConfig.GROUP_BY));
????????map.put(FindConfig.MAX_,request.getParameter(FindConfig.MAX_));
????????map.put(FindConfig.MIN_,request.getParameter(FindConfig.MIN_));
????????return map;
}
????public Map<String,String> readQuery(HttpServletRequest request){
????????String queryString = request.getQueryString();
????????if (queryString != null && !"".equals(queryString)) {
????????????String[] querys = queryString.split("&");
????????????Map<String, String> map = new HashMap<>();
????????????for (String query : querys) {
????????????????String[] q = query.split("=");
????????????????map.put(q[0], q[1]);
????????????}
????????????map.remove(FindConfig.PAGE);
????????????map.remove(FindConfig.SIZE);
????????????map.remove(FindConfig.LIKE);
????????????map.remove(FindConfig.ORDER_BY);
????????????map.remove(FindConfig.FIELD);
????????????map.remove(FindConfig.GROUP_BY);
????????????map.remove(FindConfig.MAX_);
????????????map.remove(FindConfig.MIN_);
????????????return map;
????????}else {
????????????return new HashMap<>();
????????}
}
????@Transactional
????public void update(Map<String,String> query,Map<String,String> config,Map<String,Object> body){
????????StringBuffer sql = new StringBuffer("UPDATE ").append("`").append(table).append("`").append(" SET ");
????????for (Map.Entry<String,Object> entry:body.entrySet()){
????????????Object value = entry.getValue();
????????????if (value instanceof String){
????????????????sql.append("`"+humpToLine(entry.getKey())+"`").append("=").append("'").append(value).append("'").append(",");
????????????}else {
????????????????sql.append("`"+humpToLine(entry.getKey())+"`").append("=").append(value).append(",");
????????????}
????????}
????????sql.deleteCharAt(sql.length()-1);
????????sql.append(toWhereSql(query,"0".equals(config.get(FindConfig.LIKE))));
????????log.info("[{}] - 更新操作:{}",table,sql);
????????Query query1 = runCountSql(sql.toString());
????????query1.executeUpdate();
}
????public String toWhereSql(Map<String,String> query, Boolean like) {
????????if (query.size() > 0) {
????????????try {
????????????????StringBuilder sql = new StringBuilder(" WHERE ");
????????????????for (Map.Entry<String, String> entry : query.entrySet()) {
????????????????????if (entry.getKey().contains(FindConfig.MIN_)) {
????????????????????????String min = humpToLine(entry.getKey()).replace("_min", "");
????????????????????????sql.append("`"+min+"`").append(" >= '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("' and ");
????????????????????????continue;
????????????????????}
????????????????????if (entry.getKey().contains(FindConfig.MAX_)) {
????????????????????????String max = humpToLine(entry.getKey()).replace("_max", "");
????????????????????????sql.append("`"+max+"`").append(" <= '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("' and ");
????????????????????????continue;
????????????????????}
????????????????????if (like == true) {
????????????????????????sql.append("`"+humpToLine(entry.getKey())+"`").append(" LIKE '%").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("%'").append(" and ");
????????????????????} else {
????????????????????????sql.append("`"+humpToLine(entry.getKey())+"`").append(" = '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("'").append(" and ");
????????????????????}
????????????????}
????????????????sql.delete(sql.length() - 4, sql.length());
????????????????sql.append(" ");
????????????????return sql.toString();
????????????} catch (UnsupportedEncodingException e) {
????????????????log.info("拼接sql 失敗:{}", e.getMessage());
????????????}
????????}
????????return "";
????}
5.2.6訂單發貨界面
管理員在后臺管理界面點擊到所有訂單發貨界面dingdan_list.html,向控制層dingdanAction發送請求,搜索當前所有訂單發貨信息,dingdanAction向dingdanDAOImp調用搜索全部訂單發貨的請求,向數據庫的訂單表搜索當前所有訂單發貨并將訂單信息以對象的形式層層返回到dingdan_list.html界面,顯示出當前所有訂單發貨信息。同時可以刪除過期訂單,確認已有訂單,進行發貨處理。
訂單發貨管理界面如下圖所示。
?
圖5-14訂單發貨界面圖
訂單發貨管理關鍵代碼如下所示。
@RequestMapping("/get_obj")
????public Map<String, Object> obj(HttpServletRequest request) {
????????Query select = service.select(service.readQuery(request), service.readConfig(request));
????????List resultList = select.getResultList();
????????if (resultList.size() > 0) {
????????????JSONObject jsonObject = new JSONObject();
????????????jsonObject.put("obj",resultList.get(0));
????????????return success(jsonObject);
????????} else {
????????????return success(null);
????????}
}
?public Query select(Map<String,String> query,Map<String,String> config){
????????StringBuffer sql = new StringBuffer("select ");
????????sql.append(config.get(FindConfig.FIELD) == null || "".equals(config.get(FindConfig.FIELD)) ? "*" : config.get(FindConfig.FIELD)).append(" ");
????????sql.append("from ").append("`").append(table).append("`").append(toWhereSql(query, "0".equals(config.get(FindConfig.LIKE))));
????????if (config.get(FindConfig.GROUP_BY) != null && !"".equals(config.get(FindConfig.GROUP_BY))){
????????????sql.append("group by ").append(config.get(FindConfig.GROUP_BY)).append(" ");
????????}
????????if (config.get(FindConfig.ORDER_BY) != null && !"".equals(config.get(FindConfig.ORDER_BY))){
????????????sql.append("order by ").append(config.get(FindConfig.ORDER_BY)).append(" ");
????????}
????????if (config.get(FindConfig.PAGE) != null && !"".equals(config.get(FindConfig.PAGE))){
????????????int page = config.get(FindConfig.PAGE) != null && !"".equals(config.get(FindConfig.PAGE)) ? Integer.parseInt(config.get(FindConfig.PAGE)) : 1;
????????????int limit = config.get(FindConfig.SIZE) != null && !"".equals(config.get(FindConfig.SIZE)) ? Integer.parseInt(config.get(FindConfig.SIZE)) : 10;
????????????sql.append(" limit ").append( (page-1)*limit ).append(" , ").append(limit);
????????}
????????log.info("[{}] - 查詢操作,sql: {}",table,sql);
????????return runEntitySql(sql.toString());
????}
6系統測試
6.1系統測試的目的
系統開發到了最后一個階段那就是系統測試,系統測試對軟件的開發其實是非常有必要的。因為沒什么系統一經開發出來就可能會盡善盡美,再厲害的系統開發工程師也會在系統開發的時候出現紕漏,系統測試能夠較好的改正一些bug,為后期系統的維護性提供很好的支持。通過系統測試,開發人員也可以建立自己對系統的信心,為后期的系統版本的跟新提供支持。
6.2?系統測試用例
系統測試包括:用戶登錄功能測試、商品展示功能測試、商品添加、商品搜索、密碼修改功能測試,如表6-1、6-2、6-3、6-4、6-5所示:
用戶登錄功能測試:
表6-1?用戶登錄功能測試表
| 用例名稱 | 用戶登錄系統 |
| 目的 | 測試用戶通過正確的用戶名和密碼可否登錄功能 |
| 前提 | 未登錄的情況下 |
| 測試流程 | 1) 進入登錄頁面 2) 輸入正確的用戶名和密碼 |
| 預期結果 | 用戶名和密碼正確的時候,跳轉到登錄成功界面,反之則顯示錯誤信息,提示重新輸入 |
| 實際結果 | 實際結果與預期結果一致 |
商品查看功能測試:
表6-2?商品查看功能測試表
| 用例名稱 | 商品查看 |
| 目的 | 測試商品查看功能 |
| 前提 | 用戶登錄 |
| 測試流程 | 點擊商品列表 |
| 預期結果 | 可以查看到所有商品信息 |
| 實際結果 | 實際結果與預期結果一致 |
管理員添加商品界面測試:
表6-3?管理員添加商品界面測試表
| 用例名稱 | 商品發布測試用例 |
| 目的 | 測試商品發布功能 |
| 前提 | 用戶正常登錄情況下 |
| 測試流程 | 1)點擊商品信息管理就,然后點擊添加后并填寫信息。 2)點擊進行提交。 |
| 預期結果 | 提交以后,頁面首頁會顯示新的商品信息? |
| 實際結果 | 實際結果與預期結果一致 |
商品搜索功能測試:
表6-4商品搜索功能測試表
| 用例名稱 | 商品搜索測試 |
| 目的 | 測試商品搜索功能 |
| 前提 | 無 |
| 測試流程 | 1)在搜索框填入搜索關鍵字。 2)點擊搜索按鈕。 |
| 預期結果 | 頁面顯示包含有搜索關鍵字的商品 |
| 實際結果 | 實際結果與預期結果一致 |
密碼修改功能測試:
表6-5 密碼修改功能測試表
| 用例名稱 | 密碼修改測試用例 |
| 目的 | 測試管理員密碼修改功能 |
| 前提 | 管理員用戶正常登錄情況下 |
| 測試流程 | 1)管理員密碼修改并完成填寫。 2)點擊進行提交。 |
| 預期結果 | 使用新的密碼可以登錄 |
| 實際結果 | 實際結果與預期結果一致 |
6.3?系統測試結果
通過編寫校園二手銷售網站的測試用例,已經檢測完畢用戶登錄模塊、商品查看模塊、商品添加模塊、商品搜索模塊、密碼修改功能測試,通過這5大模塊為校園二手銷售網站的后期推廣運營提供了強力的技術支撐。
結論
至此,校園二手銷售網站已經結束,在開發前做了許多的準備,在本系統的設計和開發過程中閱覽和學習了許多文獻資料,從中我也收獲了很多寶貴的方法和設計思路,對系統的開發也起到了很重要的作用,系統的開發技術選用的都是自己比較熟悉的,比如Web、springboot技術、MYSQL,這些技術都是在以前的學習中學到了,其中許多的設計思路和方法都是在以前不斷地學習中摸索出來的經驗,其實對于我們來說工作量還是比較大的,但是正是由于之前的積累與準備,才能順利的完成這個項目,由此看來,積累經驗跟做好準備是十分重要的事情。
當然在該系統的設計與實現的過程中也離不開老師以及同學們的幫助,正是因為他們的指導與幫助,我才能夠成功的在預期內完成了這個系統。同時在這個過程當中我也收獲了很多東西,此系統也有需要改進的地方,但是由于專業知識的淺薄,并不能做到十分完美,希望以后有機會可以讓其真正的投入到使用之中。
參考文獻
[1]朱珍珠,段華斌,鄧永清,杜丹蕾.基于Java的增值平臺的設計與實現[J].辦公自動化,2022,27(05):55-58.
[2]魏瑾.Java多線程技術在網絡通信系統中的應用[J].山西電子技術,2022(01):66-68.
[3]鎮鑫羽,景琴琴.Java語言程序設計的教學實踐[J].集成電路應用,2022,39(02):256-257.
[4]董衛,王婷婷,徐劍.基于Java Web的畢業設計選題系統設計與實現[J].科技資訊,2022,20(03):1-3.
[5]王春山,孫欣.基于Java的金融消費者投訴審計小助手的設計和實現[J].金融科技時代,2022,30(02):68-73.
[6]熊柏祥.基于Springboot和Vue框架的考試資源服務平臺的設計與實現[J].信息與電腦(理論版),2022,34(01):97-99+103.
[7]霍福華,韓慧.基于SpringBoot微服務架構下前后端分離的MVVM模型[J].電子技術與軟件工程,2022(01):73-76.
[8]曹明昊. 基于SpringBoot和Vue框架的邯鄲市現代農業園區信息管理系統的研發[D].河北工程大學,2021.
[9]單樹倩,任佳勛.基于SpringBoot和Vue框架的數據庫原理網站設計與實現[J].電腦知識與技術,2021,17(30):40-41+50.
[10]蘇文強,劉紫陽,苗玉恒.基于SpringBoot的缺陷管理系統設計與實現[J].大眾科技,2021,23(10):4-6+10.
[11]王萍.SpringBoot項目中EhCache緩存技術的實現[J].電腦知識與技術,2021,17(29):79-81.
[12]He Xinbin,Bai Yongbin,Yue Lisen,Wang Haixiao,Liu Yi. Design and Implementation of Information System Based on Java Technology Platform[J]. Journal of Physics: Conference Series,2021,2033(1).
[13]陳曉華,劉加成.寧國市旅游景點空間特征及整體開發策略——基于大數據挖掘及地理信息技術應用[J].合肥學院學報(綜合版),2021,38(04):33-39.
[14]田青海. 面向Java應用的性能監控系統的設計與實現[D].浙江大學,2021.
[15]Qu Xiaona. Application of Java Technology in Dynamic Web Database Technology[J]. Journal of Physics: Conference Series,2021,1744(4).
[16]嚴宇,王嘯楠.基于大數據分析的旅游景點信息平臺的模型設計[J].計算機產品與流通,2020(10):154.
[17]Tian Ming Huang. Design and Implementation of App System for Legal Consulting Based on JAVA Technology[J]. Procedia Computer Science,2020,166(C).
致 ?謝
逝者如斯夫,不舍晝夜。轉眼間,大學生會員活便已經接近尾聲,人面對著離別與結束,總是充滿著不舍與茫然,我亦如此,仍記得那年秋天,我迫不及待的提前一天到了學校,面對學校巍峨的大門,我心里充滿了期待:這里,就是我新生活的起點嗎?那天,陽光明媚,學校的歡迎儀式很熱烈,我面對著一個個對著我微笑的同學,仿佛一縷縷陽光透過胸口照進了我心里,同時,在那天我認識可愛的室友,我們攜手共同度過了這難忘的兩年。如今,我望著這篇論文的致謝,不禁又要問自己:現在,我們就要說再見了嗎?
感慨莫名,不知所言。遙想當初剛來學校的時候,心里總是想著工科學校會過于板正,會缺乏一些柔情,當時心里甚至有一點點排斥,但是隨著我對學校的慢慢認識與了解,我才認識到了她的美麗,她的柔情,并且慢慢的喜歡上了這個校園,但是時間太快了,快到我還沒有好好體會她的美麗便要離開了,但是她帶給我的回憶,永遠不會離開我,也許真正離開那天我的眼里會滿含淚水,我不是因為難過,我只是想將她的樣子映在我的淚水里,刻在我的心里。最后,感謝我的老師們,是你們教授了我們知識與做人的道理;感謝我的室友們,是你們陪伴了我如此之久;感謝每位關心與支持我的人。
少年,追風趕月莫停留,平荒盡處是春山。
點贊+收藏+關注 → 私信領取本源代碼、數據庫
總結
以上是生活随笔為你收集整理的spring boot校园二手销售网站 毕业设计源码161417的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lunix磁盘与文件系统管理
- 下一篇: 花菁染料Cy3.5 炔烃,Cy3.5 a