springboot车辆管理系统的设计与实现毕业设计源码031034
車(chē)輛管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
摘?要
科技進(jìn)步的飛速發(fā)展引起人們?nèi)粘I畹木薮笞兓?#xff0c;電子信息技術(shù)的飛速發(fā)展使得電子信息技術(shù)的各個(gè)領(lǐng)域的應(yīng)用水平得到普及和應(yīng)用。信息時(shí)代的到來(lái)已成為不可阻擋的時(shí)尚潮流,人類發(fā)展的歷史正進(jìn)入一個(gè)新時(shí)代。在現(xiàn)實(shí)運(yùn)用中,應(yīng)用軟件的工作規(guī)則和開(kāi)發(fā)步驟,采用Java技術(shù)建設(shè)車(chē)輛管理系統(tǒng)。
本設(shè)計(jì)主要實(shí)現(xiàn)集人性化、高效率、便捷等優(yōu)點(diǎn)于一身的車(chē)輛管理系統(tǒng),完成用戶管理、車(chē)輛管理、車(chē)輛分類、品牌分類出車(chē)記錄、還車(chē)記錄等功能模塊。系統(tǒng)通過(guò)瀏覽器與服務(wù)器進(jìn)行通信,實(shí)現(xiàn)數(shù)據(jù)的交互與變更。本系統(tǒng)通過(guò)科學(xué)的管理方式、便捷的服務(wù)提高了工作效率,減少了數(shù)據(jù)存儲(chǔ)上的錯(cuò)誤和遺漏。車(chē)輛管理系統(tǒng)使用Java語(yǔ)言,采用基于 MVC模式的JavaEE技術(shù)進(jìn)行開(kāi)發(fā),使用 MyEclipse 2017 CI 10 編譯器編寫(xiě),數(shù)據(jù)方面主要采用的是微軟的MySQL關(guān)系型數(shù)據(jù)庫(kù)來(lái)作為數(shù)據(jù)存儲(chǔ)媒介,配合前臺(tái)HTML+CSS 技術(shù)完成系統(tǒng)的開(kāi)發(fā)。
關(guān)鍵詞:車(chē)輛管理;Java語(yǔ)言;關(guān)系型數(shù)據(jù)庫(kù);數(shù)據(jù)存儲(chǔ)
Design and implementation of vehicle management systemAbstract
The rapid development of scientific and technological progress has caused great changes in people's daily life. The rapid development of electronic information technology has popularized and applied the application level of electronic information technology in various fields. The advent of the information age has become an irresistible fashion trend, and the history of human development is entering a new era. In practical application, according to the working rules and development steps of the application software, Java technology is used to build the vehicle management system.
This design mainly realizes the vehicle management system with the advantages of humanization, high efficiency and convenience, and completes the functional modules of user management, vehicle management, vehicle classification, brand classification, departure record, return record and so on. The system communicates with the server through the browser to realize the interaction and change of data. Through scientific management and convenient service, the system improves work efficiency and reduces errors and omissions in data storage. The vehicle management system is developed using java language, Java EE technology based on MVC mode and MyEclipse 2017 CI 10 compiler. In terms of data, Microsoft's MySQL relational database is mainly used as the data storage medium, and the system development is completed with the foreground HTML + CSS technology.
Key words:Vehicle management; The Java language. Relational database; Data is stored
目 ?錄
第1章 緒論
1.1?研究背景與意義
1.2?開(kāi)發(fā)意義
1.3?本文的組織結(jié)構(gòu)
第2章 相關(guān)技術(shù)介紹
2.1 J2EE技術(shù)
2.2Myeclipse描述
2.3 MySQL數(shù)據(jù)庫(kù)
2.4 B/S結(jié)構(gòu)
2.5 Tomcat描述
2.6springboot框架介紹
第3章 系統(tǒng)分析
3.1?可行性分析
3.1.1?技術(shù)可行性分析
3.1.2?經(jīng)濟(jì)可行性分析
3.1.3?操作可行性分析
3.2?功能需求分析
3.3?非功能需求分析
3.4?數(shù)據(jù)流程分析
第4章 系統(tǒng)設(shè)計(jì)
4.1?系統(tǒng)架構(gòu)設(shè)計(jì)
4.2?系統(tǒng)功能結(jié)構(gòu)
4.3?功能模塊設(shè)計(jì)
4.4?數(shù)據(jù)庫(kù)設(shè)計(jì)
4.4.1?概念模型
4.4.2?關(guān)系模型
4.4.3?數(shù)據(jù)表
第5章 系統(tǒng)實(shí)現(xiàn)
5.1?登錄模塊的實(shí)現(xiàn)
5.2?駕駛員系統(tǒng)模塊的實(shí)現(xiàn)
5.2.1?用戶首頁(yè)模塊
5.2.2?出車(chē)記錄模塊
5.2.3?車(chē)輛信息模塊
5.3?管理員子系統(tǒng)模塊的實(shí)現(xiàn)
5.3.1?用戶管理模塊
5.3.2?個(gè)人資料管理模塊
5.3.3?車(chē)輛管理模塊
5.3.4 還車(chē)記錄管理模塊
5.4?分頁(yè)模塊的實(shí)現(xiàn)
第6章 系統(tǒng)測(cè)試
6.1?測(cè)試目的
6.2?測(cè)試過(guò)程
6.3?測(cè)試結(jié)果
第7章 總結(jié)與展望
參考文獻(xiàn)
致謝
車(chē)輛管理是對(duì)所涉及到的人、財(cái)、物等資源的管理和調(diào)配,隨著交通運(yùn)輸業(yè)的飛速發(fā)展為人們的生活帶來(lái)了極大的便利,與此同時(shí),各種交通運(yùn)輸工具特別是汽車(chē)數(shù)量的劇增也給社會(huì)各方面帶來(lái)了日趨嚴(yán)重的巨大壓力。對(duì)于各事業(yè)或企業(yè)單位內(nèi)部的車(chē)輛管理,傳統(tǒng)手工操作手段由于工作量大、強(qiáng)度高,而導(dǎo)致的效率低下、出錯(cuò)率高已逐漸不能滿足目前車(chē)輛管理的需求。依據(jù)項(xiàng)目需求特點(diǎn),圍繞提高車(chē)輛使用和管理工作,結(jié)合車(chē)輛自身的特點(diǎn),完成對(duì)通行車(chē)輛調(diào)度的管理,對(duì)車(chē)輛使用調(diào)度、車(chē)輛信息和相關(guān)人員的信息管理、使用記錄、事故等信息統(tǒng)一管理,進(jìn)一步提高車(chē)輛管理、使用效率和安全保障,做到車(chē)輛狀態(tài)有案可查、有據(jù)可依,實(shí)現(xiàn)車(chē)輛的科學(xué)化、自動(dòng)化管理。
在智能化的管理當(dāng)中,企業(yè)的車(chē)輛管理成為了急需解決的問(wèn)題之一。經(jīng)濟(jì)高速發(fā)展時(shí)代的到來(lái)給企業(yè)的發(fā)展帶來(lái)了機(jī)遇,但同時(shí)越來(lái)越多的工作量需要使用更多的車(chē)輛來(lái)方便工作,這樣就給企業(yè)的車(chē)輛管理帶來(lái)了巨大的壓力,企業(yè)必須合理安排好下屬各個(gè)部門(mén)的車(chē)輛使用情況,提供即時(shí)的車(chē)輛信息,只有做到這一點(diǎn),才能使企業(yè)更好的運(yùn)轉(zhuǎn)起來(lái),最大化的提高企業(yè)的整體工作效率。
車(chē)輛管理系統(tǒng)是信息管理系統(tǒng),是一個(gè)小型的數(shù)據(jù)庫(kù)系統(tǒng)。車(chē)輛管理系統(tǒng)綜合了車(chē)輛運(yùn)營(yíng)領(lǐng)域,車(chē)輛管理領(lǐng)域,數(shù)據(jù)庫(kù)領(lǐng)域等方面的知識(shí)。
由于車(chē)輛信息的復(fù)雜繁多,管理制度的程序繁多,過(guò)去采用人工的文件管理已不能適應(yīng)。文件管理方式存在許多缺點(diǎn):資料的繁多容易丟失,忽略,遺忘;信息的冗余量極大;安全性極差;查找起來(lái)困難;工作量大,工作人員累。
車(chē)輛管理軟件代替人工的文件管理,可以避免或大大的緩解上述問(wèn)題。而且計(jì)算機(jī)管理還有一些不可替代的優(yōu)點(diǎn):過(guò)去需要記憶的一些資料,比如車(chē)輛保險(xiǎn)的期限,或者是車(chē)輛使用年限,現(xiàn)在就可以利用計(jì)算機(jī)軟件來(lái)查詢和管理;隨著計(jì)算機(jī)的普及,還可以隨時(shí)隨地的進(jìn)行工作,公司領(lǐng)導(dǎo)也可以在家或者其他地方查找所需要的資料,檢查工作;存儲(chǔ)量大;保密性好;壽命長(zhǎng)等等。企業(yè)的工作效率提高了,管理也方便了,也將逐步走向正規(guī)化。
第一章是緒論,本文章的開(kāi)頭部分,對(duì)本題目的研究背景和研究意義等一些做文字性的描述。
第二章研究了車(chē)輛管理系統(tǒng)的所采用的開(kāi)發(fā)技術(shù)和開(kāi)發(fā)工具。
第三章是系統(tǒng)分析部分,包括系統(tǒng)總體需求描述、功能性角度分析系統(tǒng)需求、非功能性等各個(gè)方面分析系統(tǒng)是否可以實(shí)現(xiàn)。
第四章是系統(tǒng)設(shè)計(jì)部分,本文章的重要部分,提供了系統(tǒng)架構(gòu)的詳細(xì)設(shè)計(jì)和一些主要功能模塊的設(shè)計(jì)說(shuō)明。
第五章是系統(tǒng)的具體實(shí)現(xiàn),介紹系統(tǒng)的各個(gè)模塊的具體實(shí)現(xiàn)。
第六章在前幾章的基礎(chǔ)上對(duì)系統(tǒng)進(jìn)行測(cè)試和運(yùn)行。
最后對(duì)系統(tǒng)進(jìn)行了認(rèn)真的總結(jié),以此對(duì)未來(lái)有一個(gè)新的展望。
人可以掌握多門(mén)外語(yǔ),而一個(gè)計(jì)算機(jī)科學(xué)家精通的大多是編程語(yǔ)言,它不是人類的自然語(yǔ)言,比如C語(yǔ)言、Java、Perl等等。由于不同的公司開(kāi)發(fā)出的“中間件”不夠規(guī)范,所以Sun公司推出J2EE,用這個(gè)標(biāo)準(zhǔn)來(lái)解決弊病。它提供了良好的機(jī)制,讓每個(gè)層次允許與之相對(duì)的服務(wù)器、組件運(yùn)行,使得系統(tǒng)的搭建穩(wěn)定可用、開(kāi)發(fā)高效、維護(hù)方便。
我們?cè)诶肑ava來(lái)開(kāi)發(fā)系統(tǒng)時(shí)通常采用的軟件就是Myeclipse,它是用來(lái)設(shè)計(jì)Java, JavaEE的Eclipse插件的調(diào)集,采取了 Myeclipse大部分可以實(shí)現(xiàn)對(duì)Mysql的數(shù)據(jù)庫(kù)和Javaee的研究和開(kāi)發(fā)。用了Myeclipse很大的便利了開(kāi)發(fā)人員,系統(tǒng)開(kāi)發(fā)的進(jìn)度也會(huì)得到一些提高。
科技的進(jìn)步,給日常帶來(lái)許多便利:教室的投影器用到了虛擬成像技術(shù),數(shù)碼相機(jī)用到了光電檢測(cè)技術(shù),比如超市貨物進(jìn)出庫(kù)的記錄需要一個(gè)信息倉(cāng)庫(kù)。這個(gè)信息倉(cāng)庫(kù)就是數(shù)據(jù)庫(kù),而這次的車(chē)輛管理系統(tǒng)也需要這項(xiàng)技術(shù)的支持。
用MySQL這個(gè)軟件,是因?yàn)樗芙邮芏鄠€(gè)使用者訪問(wèn),而且里面存在Archive等。它會(huì)先把數(shù)據(jù)進(jìn)行分類,然后分別保存在表里,這樣的特別操作就會(huì)提高數(shù)據(jù)管理系統(tǒng)自身的速度,讓數(shù)據(jù)庫(kù)能被靈活運(yùn)用。MySQL的代碼是公開(kāi)的,而且允許別人二次編譯升級(jí)。這個(gè)特點(diǎn)能夠降低使用者的成本,再搭配合適的軟件后形成一個(gè)良好的網(wǎng)站系統(tǒng)。雖然它有缺點(diǎn),但是綜合各方面來(lái)說(shuō),它是使用者的主流運(yùn)用的對(duì)象。
B/S(Browser/Server)比前身架構(gòu)更為省事的架構(gòu)。它借助Web server完成數(shù)據(jù)的傳遞交流。只需要下載瀏覽器作為客戶端,那么工作就達(dá)到“瘦身”效果, 不需要考慮不停裝軟件的問(wèn)題。
Tomcat是一個(gè)不收費(fèi)的服務(wù)器。使用場(chǎng)景比較適合訪問(wèn)量比較少的情況下。意思就是,將Tomcat安裝到電腦上的時(shí)候,前端HTML頁(yè)面的訪問(wèn)請(qǐng)求可以通過(guò)它進(jìn)行解析。實(shí)際上,Tomcat是對(duì)Apache的擴(kuò)展,但它相對(duì)于Apache卻是相對(duì)獨(dú)立作業(yè)的,由此可以看作它與Apache 是相對(duì)獨(dú)立進(jìn)程運(yùn)行的。
Tomcat最開(kāi)始是sun公司的戴維森進(jìn)行開(kāi)發(fā)應(yīng)用的,經(jīng)過(guò)他的努力,不斷地將其變?yōu)殚_(kāi)源的服務(wù)器。還由sun公司將其交給了Apache軟件基金會(huì)。不斷發(fā)展的tomcat服務(wù)器在最近的一個(gè)版本中進(jìn)行了大量的重構(gòu)和梳理,使其使用起來(lái)更加的方便。基于Tomcat負(fù)載均衡算法是一種開(kāi)源的軟件,實(shí)現(xiàn)方式。不需要增加額外的硬件投入,實(shí)現(xiàn)起來(lái)也很方便,特別適用于一般的小企業(yè)網(wǎng)站服務(wù)器在現(xiàn)在和將來(lái)一段時(shí)間的擴(kuò)展。從目前的實(shí)踐來(lái)看,可作為需要進(jìn)行類似應(yīng)用的一個(gè)參考借鑒。
Spring框架是Java平臺(tái)上的一種開(kāi)源應(yīng)用框架,提供具有控制反轉(zhuǎn)特性的容器。盡管Spring框架自身對(duì)編程模型沒(méi)有限制,但其在Java應(yīng)用中的頻繁使用讓它備受青睞,以至于后來(lái)讓它作為EJB(EnterpriseJavaBeans)模型的補(bǔ)充,甚至是替補(bǔ)。Spring框架為開(kāi)發(fā)提供了一系列的解決方案,比如利用控制反轉(zhuǎn)的核心特性,并通過(guò)依賴注入實(shí)現(xiàn)控制反轉(zhuǎn)來(lái)實(shí)現(xiàn)管理對(duì)象生命周期容器化,利用面向切面編程進(jìn)行聲明式的事務(wù)管理,整合多種持久化技術(shù)管理數(shù)據(jù)訪問(wèn),提供大量?jī)?yōu)秀的Web框架方便開(kāi)發(fā)等等。Spring框架具有控制反轉(zhuǎn)(IOC)特性,IOC旨在方便項(xiàng)目維護(hù)和測(cè)試,它提供了一種通過(guò)Java的反射機(jī)制對(duì)Java對(duì)象進(jìn)行統(tǒng)一的配置和管理的方法。Spring框架利用容器管理對(duì)象的生命周期,容器可以通過(guò)掃描XML文件或類上特定Java注解來(lái)配置對(duì)象,開(kāi)發(fā)者可以通過(guò)依賴查找或依賴注入來(lái)獲得對(duì)象。Spring框架具有面向切面編程(AOP)框架,SpringAOP框架基于代理模式,同時(shí)運(yùn)行時(shí)可配置;AOP框架主要針對(duì)模塊之間的交叉關(guān)注點(diǎn)進(jìn)行模塊化。Spring框架的AOP框架僅提供基本的AOP特性,雖無(wú)法與AspectJ框架相比,但通過(guò)與AspectJ的集成,也可以滿足基本需求。Spring框架下的事務(wù)管理、遠(yuǎn)程訪問(wèn)等功能均可以通過(guò)使用SpringAOP技術(shù)實(shí)現(xiàn)。Spring的事務(wù)管理框架為Java平臺(tái)帶來(lái)了一種抽象機(jī)制,使本地和全局事務(wù)以及嵌套事務(wù)能夠與保存點(diǎn)一起工作,并且?guī)缀蹩梢栽贘ava平臺(tái)的任何環(huán)境中工作。Spring集成多種事務(wù)模板,系統(tǒng)可以通過(guò)事務(wù)模板、XML或Java注解進(jìn)行事務(wù)配置,并且事務(wù)框架集成了消息傳遞和緩存等功能。Spring的數(shù)據(jù)訪問(wèn)框架解決了開(kāi)發(fā)人員在應(yīng)用程序中使用數(shù)據(jù)庫(kù)時(shí)遇到的常見(jiàn)困難。它不僅對(duì)Java:JDBC、iBATS/MyBATIs、Hibernate、Java數(shù)據(jù)對(duì)象(JDO)、ApacheOJB和ApacheCayne等所有流行的數(shù)據(jù)訪問(wèn)框架中提供支持,同時(shí)還可以與Spring的事務(wù)管理一起使用,為數(shù)據(jù)訪問(wèn)提供了靈活的抽象。Spring框架最初是沒(méi)有打算構(gòu)建一個(gè)自己的WebMVC框架,其開(kāi)發(fā)人員在開(kāi)發(fā)過(guò)程中認(rèn)為現(xiàn)有的StrutsWeb框架的呈現(xiàn)層和請(qǐng)求處理層之間以及請(qǐng)求處理層和模型之間的分離不夠,于是創(chuàng)建了SpringMVC。
本次設(shè)計(jì)基于B/S 模式下,運(yùn)用Java技術(shù)采用的是MySQL數(shù)據(jù)庫(kù)和Myeclipse實(shí)現(xiàn),總體的可行性共分為以下三個(gè)方面。
所謂的技術(shù)可行性就是在限定時(shí)間,前期擬定的功能能否被滿足。在開(kāi)發(fā)設(shè)計(jì)上是否會(huì)遇上解決不了的問(wèn)題。做完的項(xiàng)目能否被很好地應(yīng)用,如果存在缺點(diǎn)在后期的維護(hù)上是否存在很大的難度。在對(duì)這個(gè)系統(tǒng)評(píng)估后,認(rèn)定已存在的技術(shù)能達(dá)成目標(biāo)。用JSP技術(shù)來(lái)實(shí)現(xiàn)動(dòng)態(tài)的頁(yè)面,嵌入低依賴性的設(shè)計(jì)模式,靈活的數(shù)據(jù)庫(kù),配合穩(wěn)定的服務(wù)器,整個(gè)系統(tǒng)的運(yùn)行效率大大提升。由此可見(jiàn),在技術(shù)層面達(dá)成目標(biāo)不是非非之想。
在項(xiàng)目上使用的工具大部分都是是當(dāng)下流行開(kāi)源免費(fèi)的,所以在開(kāi)發(fā)前期,開(kāi)發(fā)時(shí)用于項(xiàng)目的經(jīng)費(fèi)將會(huì)大大降低,不會(huì)讓開(kāi)發(fā)該軟件在項(xiàng)目啟動(dòng)期受到經(jīng)費(fèi)的影響,所以經(jīng)濟(jì)上還是可行的。盡量用最少的花費(fèi)去滿足用戶的需求。省下經(jīng)費(fèi)用于人工費(fèi),以及設(shè)備費(fèi)用。將在無(wú)紙化,高效率的道路上越走越遠(yuǎn)。
本系統(tǒng)實(shí)現(xiàn)功能的操作很簡(jiǎn)單,普通電腦的常見(jiàn)配置就可以運(yùn)行本軟件,并且只要粗通電腦使用的基本常識(shí)就可以流暢的使用本軟件。電腦具備連接互聯(lián)網(wǎng)的能力,并且可以正常訪問(wèn)系統(tǒng),并不需要操作者有什么高超的能力,只需了解業(yè)務(wù)流程,并且按照專業(yè)知識(shí)進(jìn)行正確操作即可,所以車(chē)輛管理系統(tǒng)具備操作可行性。
在系統(tǒng)開(kāi)發(fā)設(shè)計(jì)前,應(yīng)該對(duì)功能做初步設(shè)想,清楚這個(gè)管理系統(tǒng)有什么板塊,每個(gè)板塊有什么功能,整體的設(shè)計(jì)是否滿足使用者的需求,接著對(duì)所開(kāi)發(fā)的系統(tǒng)功能進(jìn)行的詳細(xì)分析總結(jié),從而設(shè)計(jì)出完整的系統(tǒng)并將其實(shí)現(xiàn)。用戶和開(kāi)發(fā)人員的交流分析,使其達(dá)到最佳理解程度,使系統(tǒng)功能達(dá)到最佳。
駕駛員用例圖如下所示。
圖3-1 駕駛員用例圖
管理員用例圖如下所示。
圖3-2 管理員用例圖
車(chē)輛管理系統(tǒng)在對(duì)需求做解析后,整個(gè)系統(tǒng)主要分為兩個(gè)部分:管理員和普通用戶,每個(gè)模塊下的分支功能不一樣。對(duì)功能做出如下說(shuō)明:
駕駛員用戶模塊:
賬號(hào)登錄認(rèn)證。
管理個(gè)人資料信息,修改可修改的信息項(xiàng)。
車(chē)輛出入記錄查詢,同時(shí)查看歷史已出入的記錄。
還車(chē)記錄查詢,同時(shí)查看歷史已有還車(chē)的記錄。
管理員模塊:
維護(hù)普通用戶,審核普通用戶的賬號(hào),可以凍結(jié)普通用戶的登錄權(quán)限,或者刪除普通用戶賬號(hào)。
發(fā)布車(chē)輛管理,并可以銷毀某個(gè)車(chē)輛信息,更新車(chē)輛數(shù)據(jù),模糊搜索車(chē)輛數(shù)據(jù)等。
發(fā)布出車(chē)記錄,并可以銷毀某個(gè)出車(chē)記錄數(shù)據(jù),更新出車(chē)記錄數(shù)據(jù),模糊搜索出車(chē)記錄數(shù)據(jù)等。
管理車(chē)輛還車(chē)記錄數(shù)據(jù)。
系統(tǒng)非功能需求有非常多,比如性能需求、可承載最大用戶數(shù)、穩(wěn)定性、易用性需求等。本系統(tǒng)分析時(shí)考慮到易用性需求,因?yàn)橄到y(tǒng)是給人使用的,所以必須充分從用戶的角度出發(fā),考慮用戶體驗(yàn),使系統(tǒng)易理解易上手易操作。
一層數(shù)據(jù)流程圖包括了登錄、用戶功能和檢索維護(hù)等模塊,在登錄模塊使用到的數(shù)據(jù)存儲(chǔ)有用戶賬戶文檔,用戶功能模塊需要的存儲(chǔ)是用戶各功能模塊數(shù)據(jù)文檔,檢索維護(hù)是使用以上這些數(shù)據(jù)文檔通過(guò)關(guān)鍵詞進(jìn)行檢索。
系統(tǒng)的一層數(shù)據(jù)流圖如下圖所示。
圖3-2系統(tǒng)數(shù)據(jù)流圖(一層)
二層數(shù)據(jù)流程是對(duì)一層數(shù)據(jù)流層圖中填寫(xiě)登錄信息、用戶功能的細(xì)化。即:填寫(xiě)登錄信息細(xì)化為填制信息、后臺(tái)審核,用戶功能細(xì)化為車(chē)輛管理查詢、車(chē)輛分類查詢、品牌分類、出車(chē)記錄、用戶查詢等操作。
系統(tǒng)的二層數(shù)據(jù)流圖如下圖所示。
圖3-4系統(tǒng)數(shù)據(jù)流圖(二層)
目前B/S體系的系統(tǒng)主要的數(shù)據(jù)訪問(wèn)方式是:通過(guò)瀏覽器頁(yè)面用戶可以進(jìn)入系統(tǒng),系統(tǒng)可以自動(dòng)對(duì)用戶向服務(wù)器發(fā)送的請(qǐng)求進(jìn)行處理,處理請(qǐng)求是在系統(tǒng)后臺(tái)中進(jìn)行的,用戶在瀏覽器頁(yè)面上進(jìn)行相應(yīng)操作,就能夠看到服務(wù)端傳遞的處理結(jié)果。車(chē)輛管理系統(tǒng)主要分為視圖-模型-控制三層架構(gòu)設(shè)計(jì)。在視圖層中,主要是操作在服務(wù)器端向客戶端反饋并顯示的數(shù)據(jù),在模型層中,主要處理相關(guān)的業(yè)務(wù)邏輯、數(shù)據(jù)整合等,最后的控制層它介于視圖和模型之間,主要是調(diào)整兩層之間的關(guān)系,最終落實(shí)數(shù)據(jù)的傳遞。
系統(tǒng)架構(gòu)圖如下圖所示。
圖4-1系統(tǒng)架構(gòu)圖
系統(tǒng)設(shè)計(jì)的目的是分析系統(tǒng)包括的所有功能結(jié)構(gòu),為開(kāi)發(fā)人員設(shè)計(jì)開(kāi)發(fā)和實(shí)現(xiàn)系統(tǒng)做好準(zhǔn)備工作。經(jīng)過(guò)前期的需求調(diào)查、分析和整理之后,確定的總體需求主要包括多個(gè)模塊,分別是:用戶管理、車(chē)輛管理、出車(chē)記錄管理、還車(chē)記錄管理、車(chē)輛分類管理、品牌分類管理。系統(tǒng)整體角色分為二個(gè)部分,一是駕駛員戶、二是管理員。權(quán)限分布也是很明顯,駕駛員是在除去瀏覽信息之外還具有查詢和管理自己賬戶信息、車(chē)輛信息查詢、還車(chē)記錄查詢、出車(chē)記錄查詢等權(quán)限;管理員是最高權(quán)限擁有者。
系統(tǒng)功能結(jié)構(gòu)圖如下圖所示。
圖4-2系統(tǒng)功能結(jié)構(gòu)圖
用戶管理模塊
該模塊是為所有用戶登錄設(shè)計(jì)的,如普通用戶登錄后只能進(jìn)行自己的普通功能操作(如個(gè)人信息修改),管理員和超級(jí)管理員登錄后有不同的權(quán)限,管理員不能超越權(quán)限。超級(jí)管理員能對(duì)整個(gè)系統(tǒng)的數(shù)據(jù)進(jìn)行管理,主要是用戶的登錄權(quán)限以及用戶登錄后在系統(tǒng)里的操作權(quán)限。
出車(chē)記錄模塊
駕駛員和車(chē)輛存在出車(chē)記錄關(guān)系,關(guān)系為一對(duì)多,根據(jù)車(chē)輛信息編號(hào)來(lái)將車(chē)輛數(shù)據(jù)傳入到出車(chē)記錄數(shù)據(jù)中,操作人為駕駛員,然后生成記錄列表,駕駛員查看個(gè)人歷史出入出車(chē)記錄列表,可以進(jìn)行數(shù)據(jù)銷毀。
車(chē)輛信息維護(hù)模塊
操作人來(lái)錄入車(chē)輛數(shù)據(jù),點(diǎn)擊車(chē)輛錄入按鈕,依次填寫(xiě)要錄入的車(chē)輛數(shù)據(jù),點(diǎn)擊提交按鈕,將數(shù)據(jù)提交至數(shù)據(jù)庫(kù),然后刷新車(chē)輛數(shù)據(jù)頁(yè)面,每條數(shù)據(jù)右邊有刪除和編輯按鈕,來(lái)完成相應(yīng)的刪除和更新功能。
品牌維護(hù)模塊
操作人來(lái)錄入品牌分類數(shù)據(jù),點(diǎn)擊品牌分類錄入按鈕,依次填寫(xiě)要錄入的品牌數(shù)據(jù),點(diǎn)擊提交按鈕,將數(shù)據(jù)提交至數(shù)據(jù)庫(kù),然后刷新品牌分類數(shù)據(jù)頁(yè)面,每條數(shù)據(jù)右邊有刪除和編輯按鈕,來(lái)完成相應(yīng)的刪除和更新功能。
還車(chē)記錄模塊
操作人來(lái)錄入還車(chē)記錄數(shù)據(jù),點(diǎn)擊還車(chē)錄入按鈕,依次填寫(xiě)要錄入的還車(chē)記錄數(shù)據(jù),點(diǎn)擊提交按鈕,將數(shù)據(jù)提交至數(shù)據(jù)庫(kù),然后刷新收費(fèi)設(shè)置數(shù)據(jù)頁(yè)面,每條數(shù)據(jù)右邊有刪除和編輯按鈕,來(lái)完成相應(yīng)的刪除和更新功能。
對(duì)于一個(gè)要開(kāi)發(fā)的系統(tǒng)來(lái)說(shuō),E-R圖可以讓別人能更快更輕松的了解此系統(tǒng)的事務(wù)及它們之間的關(guān)系。根據(jù)系統(tǒng)分析階段所得出的結(jié)論確定了在車(chē)輛管理系統(tǒng)中存在著多個(gè)實(shí)體分別是用駕駛員、管理員、車(chē)輛、出車(chē)記錄、還車(chē)記錄、品牌分類、車(chē)輛分類。
系統(tǒng)總體ER圖如下圖所示。
圖4-4系統(tǒng)總體ER圖
管理員(管理員id、用戶名、密碼、權(quán)限)
駕駛員(駕駛員id、性別、身份證號(hào)、駕駛證、審核狀態(tài)、用戶id)
車(chē)輛分類(車(chē)輛分類id、車(chē)輛類型)
車(chē)輛(車(chē)輛id、車(chē)牌號(hào)、車(chē)輛類型、車(chē)輛品牌、購(gòu)買(mǎi)日期、車(chē)輛狀態(tài)、車(chē)輛數(shù))
還車(chē)記錄(還車(chē)記錄id、車(chē)牌號(hào)、車(chē)輛類型、車(chē)輛品牌、駕駛員、出車(chē)數(shù)、歸還時(shí)間)
出車(chē)記錄(出車(chē)記錄id、車(chē)牌號(hào)、車(chē)輛類型、車(chē)輛品牌、駕駛員、出車(chē)時(shí)間、出車(chē)數(shù)、出車(chē)情況)
品牌分類(品牌分類id、車(chē)輛品牌)
數(shù)據(jù)庫(kù)邏輯結(jié)構(gòu)就是將E-R圖在數(shù)據(jù)庫(kù)中用具體的字段進(jìn)行描述。用字段和數(shù)據(jù)類型描述來(lái)使對(duì)象特征實(shí)體化,最后形成具有一定邏輯關(guān)系的數(shù)據(jù)庫(kù)表結(jié)構(gòu)。車(chē)輛管理系統(tǒng)所需要的部分?jǐn)?shù)據(jù)結(jié)構(gòu)表如下表所示。
vehicle_classification表:
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| vehicle_classification_id | int | 11 | 是 | 是 | 車(chē)輛分類ID |
| vehicle_type | varchar | 64 | 否 | 否 | 車(chē)輛類型 |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| create_time | datetime | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
| vehicle表: | |||||
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| vehicle_id | int | 11 | 是 | 是 | 車(chē)輛ID |
| license_plate_number | varchar | 64 | 是 | 否 | 車(chē)牌號(hào) |
| vehicle_type | varchar | 64 | 否 | 否 | 車(chē)輛類型 |
| vehicle_brand | varchar | 64 | 否 | 否 | 車(chē)輛品牌 |
| purchase_date | date | 0 | 否 | 否 | 購(gòu)買(mǎi)日期 |
| vehicle_status | varchar | 64 | 否 | 否 | 車(chē)輛狀態(tài) |
| number_of_vehicles | varchar | 64 | 否 | 否 | 車(chē)輛數(shù) |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| create_time | datetime | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| return_record_id | int | 11 | 是 | 是 | 還車(chē)記錄ID |
| license_plate_number | varchar | 64 | 否 | 否 | 車(chē)牌號(hào) |
| vehicle_type | varchar | 64 | 否 | 否 | 車(chē)輛類型 |
| vehicle_brand | varchar | 64 | 否 | 否 | 車(chē)輛品牌 |
| driver | int | 11 | 否 | 否 | 駕駛員 |
| number_of_trips | varchar | 64 | 否 | 否 | 出車(chē)數(shù) |
| return_time | date | 0 | 否 | 否 | 歸還時(shí)間 |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| create_time | datetime | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
| departure_record表: | |||||
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| departure_record_id | int | 11 | 是 | 是 | 出車(chē)記錄ID |
| license_plate_number | varchar | 64 | 否 | 否 | 車(chē)牌號(hào) |
| vehicle_type | varchar | 64 | 否 | 否 | 車(chē)輛類型 |
| vehicle_brand | varchar | 64 | 否 | 否 | 車(chē)輛品牌 |
| driver | int | 11 | 否 | 否 | 駕駛員 |
| departure_time | date | 0 | 否 | 否 | 出車(chē)時(shí)間 |
| number_of_trips | varchar | 64 | 否 | 否 | 出車(chē)數(shù) |
| driving_situation | text | 0 | 否 | 否 | 出車(chē)情況 |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| create_time | datetime | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
| brand_classification表: | |||||
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| brand_classification_id | int | 11 | 是 | 是 | 品牌分類ID |
| vehicle_brand | varchar | 64 | 否 | 否 | 車(chē)輛品牌 |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| create_time | datetime | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
| driver表: | |||||
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| driver_id | int | 11 | 是 | 是 | 駕駛員ID |
| gender | varchar | 64 | 否 | 否 | 性別 |
| id_number | varchar | 255 | 是 | 否 | 身份證號(hào) |
| driver_license | varchar | 255 | 否 | 否 | 駕駛證 |
| examine_state | varchar | 16 | 是 | 否 | 審核狀態(tài) |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| user_id | int | 11 | 是 | 否 | 用戶ID |
| create_time | datetime | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
系統(tǒng)的登錄窗口是用戶的入口,用戶只有在登錄成功后才可以進(jìn)入訪問(wèn)。通過(guò)在登錄提交表單,后臺(tái)處理判斷是否為合法用戶,進(jìn)行頁(yè)面跳轉(zhuǎn),進(jìn)入系統(tǒng)中去。
登錄合法性判斷過(guò)程:用戶輸入賬號(hào)和密碼后,系統(tǒng)首先確定輸入輸入數(shù)據(jù)合法性,然后在login.jsp頁(yè)面發(fā)送登錄請(qǐng)求,調(diào)用src下的mainctrl類的dopost方法來(lái)驗(yàn)證。
用戶登錄模塊的IPO如下所示:
輸入:用戶名和密碼。
處理:
1)檢測(cè)用戶輸入的賬號(hào)、密碼是否正確及在數(shù)據(jù)庫(kù)已對(duì)應(yīng)存在。
2)從數(shù)據(jù)庫(kù)中提取記錄,并儲(chǔ)存在本地的session中(timeout默認(rèn)=30min)。
3)根據(jù)用戶名,將其顯示在系統(tǒng)首頁(yè)上。
輸出:是否成功的信息。
登錄流程圖如下所示。
圖5-1登錄流程圖
系統(tǒng)登錄界面如下所示。
圖5-2系統(tǒng)登錄界面
登錄關(guān)鍵代碼如下。
/**
?????* 登錄
?????* @param data
?????* @param httpServletRequest
?????* @return
?????*/
????@PostMapping("login")
????public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {
????????log.info("[執(zhí)行登錄接口]");
????????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, "賬號(hào)或密碼不能為空");
????????}
????????if (resultList == null || password == null) {
????????????return error(30000, "賬號(hào)或密碼不能為空");
????????}
????????//判斷是否有這個(gè)用戶
????????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);
????????//查詢用戶審核狀態(tài)
????????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("已通過(guò)")){
????????????????return error(30000,"該用戶審核未通過(guò)");
????????????}
????????}
????????//查詢用戶狀態(tài)
????????if (byUsername.getState()!=1){
????????????return error(30000,"用戶非可用狀態(tài),不能登錄");
????????}
????????String md5password = service.encryption(password);
????????if (byUsername.getPassword().equals(md5password)) {
????????????// 存儲(chǔ)Token到數(shù)據(jù)庫(kù)
????????????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, "賬號(hào)或密碼不正確");
????????}
}
系統(tǒng)呈現(xiàn)出一種簡(jiǎn)潔大方的首頁(yè):界面簡(jiǎn)約、鱗次櫛比,用戶能輕車(chē)熟路的使用。出于對(duì)系統(tǒng)使用群體廣泛的顧慮,應(yīng)有良好性能的后臺(tái)。
如下圖所示為系統(tǒng)的首頁(yè)界面。
圖5-3系統(tǒng)首頁(yè)界面
出車(chē)記錄過(guò)程中,首先使用getmap(id,"xinxi"),通過(guò)車(chē)輛ID得到車(chē)輛數(shù)據(jù),將車(chē)輛數(shù)據(jù)賦值給出車(chē)記錄,調(diào)用CommDAO的insert方法將出入收費(fèi)數(shù)據(jù)插入出車(chē)記錄表中,最后查看個(gè)人歷史出車(chē)記錄,可以銷毀歷史出車(chē)記錄數(shù)據(jù)。
出車(chē)記錄流程圖如下所示。
圖5-4出車(chē)記錄流程圖
出車(chē)記錄界面如圖所示。
圖5-5出車(chē)記錄界面
駕駛員提交車(chē)輛信息,可以進(jìn)行新增、查看、修改以及刪除等相應(yīng)的車(chē)輛信息管理操作。當(dāng)點(diǎn)擊"新增車(chē)輛信息"的按鈕時(shí),在車(chē)輛信息添加界面進(jìn)行詳細(xì)信息的添加操作。當(dāng)點(diǎn)擊"查看車(chē)輛信息"超級(jí)鏈接時(shí),會(huì)顯示所選的車(chē)輛信息的信息,然后點(diǎn)擊"返回"再返回到其主頁(yè)面。
車(chē)輛信息界面如圖所示。
圖5-5車(chē)輛信息界面
車(chē)輛信息管理界面如圖所示。
圖5-6車(chē)輛信息管理界面
車(chē)輛信息添加關(guān)鍵代碼如下所示。
@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();
????}
用戶在yhzhgl查看用戶信息,先使用sql語(yǔ)句查詢出所有用戶表的數(shù)據(jù),然后調(diào)用PageManager.getPages(url,4,sql, request ),返回一個(gè)ArrayList的對(duì)象,在for循環(huán)里,使用jsp得到每個(gè)ArrayList對(duì)象的數(shù)據(jù),在jsp頁(yè)面中解析ArrayList對(duì)象,得到其各個(gè)鍵值對(duì)的值。
用戶管理界面如下圖所示。
圖5-7用戶管理界面
系統(tǒng)用戶管理關(guān)鍵代碼如下所示。
@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();
????}
用戶點(diǎn)擊登錄填寫(xiě)賬號(hào)信息登錄后,會(huì)切換內(nèi)容為“某某用戶歡迎您”和歷史訂單,并給出注銷鏈接。當(dāng)用戶登錄成功后會(huì)將個(gè)人信息保存在session作用域中,點(diǎn)擊自己的用戶名時(shí),會(huì)跳轉(zhuǎn)到個(gè)人詳細(xì)信息頁(yè)面,由后臺(tái)通過(guò)Freemarker取出session作用域中的用戶信息進(jìn)行動(dòng)態(tài)渲染,例如,郵箱、電話號(hào)碼、用戶名等等。同時(shí)頁(yè)面上會(huì)顯示修改個(gè)人信息和修改密碼的按鈕,這時(shí)客戶可以修改自己的登錄密碼以保障賬號(hào)的安全性,防止被人竊取賬號(hào),通過(guò)UserController.java的updatePassword()實(shí)現(xiàn),同時(shí)也可以根據(jù)自己的個(gè)人信息是否變動(dòng)做出相應(yīng)的修改,通過(guò)updateUserInfo()實(shí)現(xiàn)。
密碼修改流程圖如下所示。
圖5-8密碼修改流程圖
密碼修改關(guān)鍵代碼如下所示。
?/**
?????* 修改密碼
?????* @param data
?????* @param request
?????* @return
?????*/
????@PostMapping("change_password")
????public Map<String, Object> change_password(@RequestBody Map<String, String> data, HttpServletRequest request){
????????// 根據(jù)Token獲取UserId
????????String token = request.getHeader("x-auth-token");
????????Integer userId = tokenGetUserId(token);
????????// 根據(jù)UserId和舊密碼獲取用戶
????????Map<String, String> query = new HashMap<>();
????????String o_password = data.get("o_password");
????????query.put("user_id" ,String.valueOf(userId));
????????query.put("password" ,service.encryption(o_password));
????????Query ret = service.count(query, service.readConfig(request));
????????List list = ret.getResultList();
????????Object s = list.get(0);
????????int count = Integer.parseInt(list.get(0).toString());
????????if(count > 0){
????????????// 修改密碼
????????????Map<String,Object> form = new HashMap<>();
????????????form.put("password",service.encryption(data.get("password")));
????????????service.update(query,service.readConfig(request),form);
????????????return success(1);
????????}
????????return error(10000,"密碼修改失敗!");
????}
添加車(chē)輛信息時(shí),輸入必填字段后,表現(xiàn)層的CheliangController接受傳過(guò)來(lái)的車(chē)輛信息參數(shù),再調(diào)用CheliangController類的addCheliang方法,經(jīng)過(guò)CheliangService業(yè)務(wù)層到CheliangMapper持久層的處理,完成對(duì)整個(gè)添加車(chē)輛信息的操作。addCheliang方法也和用戶管理中的addUser方法類似,同時(shí)做添加和修改工作。
修改車(chē)輛信息時(shí),選擇需要修改的車(chē)輛進(jìn)行修改,調(diào)用CheliangController控制器的editCheliang方法,拿到該車(chē)輛原本的信息并顯示到頁(yè)面,管理員再對(duì)需要修改的車(chē)輛信息字段進(jìn)行修改,完成后調(diào)用addCheliang方法,調(diào)用業(yè)務(wù)層的updateByKey方法,更新數(shù)據(jù)庫(kù)的車(chē)輛信息表的數(shù)據(jù)。
車(chē)輛管理流程圖如下所示。
圖5-9車(chē)輛管理流程圖
車(chē)輛添加界面如下圖所示。
圖5-10車(chē)輛添加界面
車(chē)輛查詢界面如下圖所示。
圖5-11車(chē)輛查詢界面
車(chē)輛信息添加關(guān)鍵代碼如下所示。
@PostMapping("/upload")
????public Map<String, Object> upload(@RequestParam("file") MultipartFile file) {
????????log.info("進(jìn)入方法");
????????if (file.isEmpty()) {
????????????return error(30000, "沒(méi)有選擇文件");
????????}
????????try {
????????????//判斷有沒(méi)路徑,沒(méi)有則創(chuàng)建
????????????String filePath = System.getProperty("user.dir") + "\\target\\classes\\static\\upload\\";
????????????File targetDir = new File(filePath);
????????????if (!targetDir.exists() && !targetDir.isDirectory()) {
????????????????if (targetDir.mkdirs()) {
????????????????????log.info("創(chuàng)建目錄成功");
????????????????} else {
????????????????????log.error("創(chuàng)建目錄失敗");
????????????????}
????????????}
????????????String fileName = file.getOriginalFilename();
????????????File dest = new File(filePath + fileName);
????????????log.info("文件路徑:{}", dest.getPath());
????????????log.info("文件名:{}", dest.getName());
????????????file.transferTo(dest);
????????????JSONObject jsonObject = new JSONObject();
????????????jsonObject.put("url", "/api/upload/" + fileName);
????????????return success(jsonObject);
????????} catch (IOException e) {
????????????log.info("上傳失敗:{}", e.getMessage());
????????}
????????return error(30000, "上傳失敗");
}
刪除還車(chē)記錄時(shí),選擇需要?jiǎng)h除的還車(chē)記錄進(jìn)行刪除,把主鍵的uId傳到RfiddanganController控制器,再調(diào)用控制器的deleteRfiddangan方法,數(shù)據(jù)經(jīng)過(guò)RfiddanganService業(yè)務(wù)層解析和處理,請(qǐng)求RfiddanganMapper持久層調(diào)用deleteByPrimaryKey方法操作數(shù)據(jù)庫(kù)將還車(chē)記錄數(shù)據(jù)從數(shù)據(jù)庫(kù)中刪除。
查找還車(chē)記錄時(shí),輸入需要查找的還車(chē)記錄名,調(diào)用getData方法獲取所有數(shù)據(jù)并且進(jìn)行分頁(yè),把獲取到的所有數(shù)據(jù)顯示到視圖上,這時(shí)候只需要用腳本方法便能快速查找,不涉及對(duì)數(shù)據(jù)庫(kù)操作。
還車(chē)記錄管理流程圖如下所示。
圖5-12還車(chē)記錄管理流程圖
還車(chē)記錄添加界面如下圖所示。
圖5-135還車(chē)記錄添加界面
本系統(tǒng)單獨(dú)編寫(xiě)一個(gè)Pager類用于分頁(yè)技術(shù)的實(shí)現(xiàn),在該類中確定每一個(gè)頁(yè)面顯示記錄的總數(shù)pageSize,同時(shí)定義總記錄數(shù)totalSize、當(dāng)前頁(yè)currentPage和總頁(yè)數(shù)totalPage這幾個(gè)屬性,聲明一個(gè)帶兩個(gè)參數(shù)的構(gòu)造函數(shù),獲取數(shù)據(jù)庫(kù)記錄的時(shí)候傳入記錄總數(shù)給pageSize,通過(guò)記錄總數(shù)和pageSize這兩個(gè)變量計(jì)算出總頁(yè)數(shù),在查詢數(shù)據(jù)的時(shí)候需要通過(guò)Pager類的pageSize設(shè)置每次取出數(shù)據(jù)的最大記錄數(shù)和設(shè)置起始取出記錄的位置。該類中還定義了幾個(gè)boolean類型的變量,用于判斷是否有上一頁(yè)、下一頁(yè)、最后一頁(yè)等等,在Java頁(yè)面顯示數(shù)據(jù)的時(shí)候通過(guò)標(biāo)簽顯示記錄是否有上一頁(yè)或者下一頁(yè)。
在對(duì)該系統(tǒng)進(jìn)行完詳細(xì)設(shè)計(jì)和編碼之后,就要對(duì)車(chē)輛管理系統(tǒng)的程序進(jìn)行測(cè)試,檢測(cè)程序是否運(yùn)行無(wú)誤,反復(fù)進(jìn)行測(cè)試和修改,使之最后成為完整的軟件,滿足用戶的需求,實(shí)現(xiàn)預(yù)期的功能。
在軟件的測(cè)試過(guò)程中,通常測(cè)試人員需要針對(duì)不同的功能模塊設(shè)計(jì)多種測(cè)試用例。通過(guò)測(cè)試用例能夠及時(shí)發(fā)現(xiàn)代碼業(yè)務(wù)邏輯上是否與真實(shí)的業(yè)務(wù)邏輯相對(duì)應(yīng),及時(shí)發(fā)現(xiàn)代碼上或邏輯上的缺陷,以此來(lái)來(lái)完善系統(tǒng),提高軟件產(chǎn)品的質(zhì)量,使軟件具有良好的用戶體驗(yàn)。
登錄測(cè)試用例表如下所示。
表6-1登錄測(cè)試用例
| 測(cè)試性能 | 用戶或操作員登錄系統(tǒng) | ||
| 用例目的 | 測(cè)試用戶或操作員登錄系統(tǒng)時(shí)功能是否正常 | ||
| 前提條件 | 進(jìn)入用戶登錄頁(yè)面或操作員登錄頁(yè)面 | ||
| 輸入條件 | 預(yù)期輸出 | 實(shí)際情況 | |
| 各項(xiàng)信息不予填寫(xiě),直接點(diǎn)擊登陸按鈕 | 不允許登錄,提示填寫(xiě)賬號(hào)相關(guān)信息 | 一致 | |
| 填寫(xiě)錯(cuò)誤的登錄名或密碼后點(diǎn)擊登錄系統(tǒng) | 提示用戶名或密碼錯(cuò)誤,要求重新填寫(xiě)進(jìn)行登錄 | 一致 | |
| 填寫(xiě)與驗(yàn)證碼信息不一致的信息 | 系統(tǒng)顯示出提示信息,表明驗(yàn)證碼錯(cuò)誤,要求重新填寫(xiě) | 一致 | |
還車(chē)記錄測(cè)試用例表如下所示。
表6-2還車(chē)記錄測(cè)試用例
| 測(cè)試性能 | 用戶進(jìn)行還車(chē)記錄的操作 | ||
| 用例目的 | 測(cè)試用戶進(jìn)行還車(chē)記錄操作時(shí),該功能是否正常 | ||
| 前提條件 | 用戶進(jìn)入還車(chē)詳情頁(yè),該車(chē)輛能夠被記錄 | ||
| 輸入條件 | 預(yù)期輸出 | 實(shí)際情況 | |
| 對(duì)著某車(chē)輛點(diǎn)擊“還車(chē)記錄”按鈕 | 界面跳轉(zhuǎn)至還車(chē)記錄界面 | 一致 | |
| 在還車(chē)記錄界面,輸入必填項(xiàng),點(diǎn)擊“提交”按鈕 | 提示“還車(chē)記錄成功”,并返回上一級(jí)界面 | 一致 | |
| 在還車(chē)記錄界面,填寫(xiě)還車(chē)記錄表單的時(shí)候未輸入完整,點(diǎn)擊“提交”按鈕 | 提示“還車(chē)記錄失敗” | 一致 | |
車(chē)輛管理測(cè)試用例表如下所示。
表6-3車(chē)輛管理測(cè)試用例
| 測(cè)試性能 | 車(chē)輛相關(guān)信息管理功能 | ||
| 用例目的 | 測(cè)試系統(tǒng)操作者對(duì)車(chē)輛相關(guān)信息進(jìn)行管理的功能是否正常 | ||
| 前提條件 | 登錄系統(tǒng)進(jìn)入相關(guān)管理頁(yè)面 | ||
| 輸入條件 | 預(yù)期輸出 | 實(shí)際情況 | |
| 進(jìn)入車(chē)輛管理界面,點(diǎn)擊“錄入”按鈕,填寫(xiě)所有必填項(xiàng),點(diǎn)擊提交 | 提示“錄入成功”,并返回查詢界面 | 一致 | |
| 進(jìn)入車(chē)輛管理界面,點(diǎn)擊“錄入”按鈕,未填寫(xiě)一個(gè)或者多個(gè)必填項(xiàng),點(diǎn)擊提交 | 提示“錄入失敗”,請(qǐng)?zhí)顚?xiě)必填項(xiàng) | 一致 | |
| 進(jìn)入車(chē)輛管理界面,選擇要修改的一條數(shù)據(jù),點(diǎn)擊該條數(shù)據(jù)后面的“修改”按鈕? | 節(jié)目跳轉(zhuǎn)至修改界面 | 一致 | |
| 在修改界面,修改可修改項(xiàng)后,點(diǎn)擊“提交”按鈕 | 提示“修改成功”,并返回查詢界面 | 一致 | |
| 進(jìn)入車(chē)輛管理界面,點(diǎn)擊某條數(shù)據(jù)后面的刪除按鈕 | 提示“是否要?jiǎng)h除該數(shù)據(jù)”,如果用戶點(diǎn)擊“確定”按鈕,則成功刪除該條數(shù)據(jù),并提示“刪除成功”,之后返回查詢界面 | 一致 | |
經(jīng)過(guò)對(duì)此系統(tǒng)的測(cè)試,得出該系統(tǒng)足以滿足用戶日常需求,在功能項(xiàng)目和操作等方面也能滿足操作員對(duì)于其他用戶的管理。但是,還有很多功能有待添加,這個(gè)系統(tǒng)僅能滿足大部分的需求,還需要對(duì)此系統(tǒng)的功能更進(jìn)一步的完善,這樣使用起來(lái)才能更加的完美。
通過(guò)車(chē)輛管理系統(tǒng)的開(kāi)發(fā),本人鞏固了之前學(xué)過(guò)的知識(shí),如今將平時(shí)所學(xué)到的知識(shí)融合在設(shè)計(jì)中,在設(shè)計(jì)過(guò)程中,做了很多的準(zhǔn)備,首先,在數(shù)據(jù)庫(kù)系統(tǒng)的設(shè)計(jì)過(guò)程中,尤其是在數(shù)據(jù)庫(kù)的工作原理、工作特點(diǎn),對(duì)其深刻的討論,與此同時(shí),對(duì)于小型站點(diǎn)來(lái)說(shuō),最好服務(wù)器的選擇,其次,利用所學(xué)的知識(shí)點(diǎn)分析所做的系統(tǒng),并在此基礎(chǔ)上設(shè)計(jì)。
目前本系統(tǒng)已經(jīng)上線,正在試運(yùn)行階段,用戶反饋良好,基本完成用戶所需,試運(yùn)行過(guò)程中沒(méi)有出現(xiàn)阻斷性問(wèn)題,有一些不足和小問(wèn)題也及時(shí)予以修正,系統(tǒng)上線后,為了保證數(shù)據(jù)的安全性,對(duì)系統(tǒng)進(jìn)行了備份操作,系統(tǒng)備份是每?jī)蓚€(gè)月備份一次,數(shù)據(jù)庫(kù)備份為每周備份一次,系統(tǒng)部署在租賃的云平臺(tái)服務(wù)器中。
本次系統(tǒng)上線成功后,得到了用戶的高度認(rèn)可,但是在功能上和性能上還需做進(jìn)一步的研究處理,使其有更高的性能和更好的用戶體驗(yàn)。
系統(tǒng)在以后的升級(jí)過(guò)程中,需要解決一系列用戶所提出的問(wèn)題,例如打印過(guò)程中如何避免瀏覽器的兼容性問(wèn)題,大量用戶訪問(wèn)時(shí),如何保持較高的響應(yīng)速度,在系統(tǒng)今后的升級(jí)過(guò)程中將著重解決這些安全性問(wèn)題。
參考文獻(xiàn)
[1]佐藤翔野,寺畑克哉,關(guān)優(yōu)志. 住宿型車(chē)輛管理裝置、住宿型車(chē)輛管理系統(tǒng)以及住宿型車(chē)輛[P]. 日本:CN110774967B,2022-03-15.
[2]程勝.現(xiàn)代車(chē)輛管理系統(tǒng)及其維修策略分析[J].時(shí)代汽車(chē),2021(12):184-185.
[3]于勤操. 基于車(chē)牌識(shí)別的智能礦區(qū)車(chē)輛管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].內(nèi)蒙古大學(xué),2021.
[4]柳楊. 物流車(chē)輛管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].杭州電子科技大學(xué),2021.
[5]王怡康,王淑永, 后勤服務(wù) 建成辦公區(qū)ETC車(chē)輛管理系統(tǒng). 蘇茂林 主編,黃河年鑒,水利部黃河水利委員會(huì)黃河年鑒社,2020,407,年鑒.
[6]盧玉華,薛斌斌,駱軍.車(chē)輛管理系統(tǒng)信息安全防護(hù)[J].中國(guó)科技信息,2020(24):44-45.
[7]. ResearchAndMarkets.com Releases Report: Asia Pacific Vehicle Management System Market[J]. Wireless News,2020.
[8]內(nèi)藤智,向云.日本新型機(jī)車(chē)車(chē)輛管理系統(tǒng)的開(kāi)發(fā)[J].國(guó)外鐵道車(chē)輛,2020,57(06):43-46.
[9]馮春強(qiáng).基于毫米波雷達(dá)的高速公路服務(wù)區(qū)車(chē)輛管理信息發(fā)布系統(tǒng)[J].中國(guó)交通信息化,2020(11):118-121.
[10]. Nissan Motor Co. Ltd.; Patent Issued for Vehicle Management System And Vehicle Management Method (USPTO 10,748,418)[J]. Computers Networks & Communications,2020.
[11]. Toyota Jidosha Kabushiki Kaisha; Patent Issued for Vehicle Management System, Vehicle Management Method, And Non-Transitory Computer-Readable Recording Medium (USPTO 10,688,964)[J]. Computer Technology Journal,2020.
[12]孫一鳴. 交警大隊(duì)暫扣車(chē)輛管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].吉林大學(xué),2020.
[13]夏琮.車(chē)輛管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].時(shí)代汽車(chē),2020(06):18-21.
[14]曹鑫亮,孫桂平,孫健,鄒晨亮,車(chē)明亮,王英利.支持大并發(fā)量的車(chē)輛管理系統(tǒng)[J].南通大學(xué)學(xué)報(bào)(自然科學(xué)版),2019,18(04):34-38.
[15]蘇九寧.公安車(chē)輛管理系統(tǒng)的主要功能模塊設(shè)計(jì)與實(shí)現(xiàn)[J].中國(guó)新技術(shù)新產(chǎn)品,2019(22):16-17.DOI:10.13612/j.cnki.cntp.2019.22.006.
[16]韓亮, 智能網(wǎng)聯(lián)運(yùn)營(yíng)車(chē)輛管理系統(tǒng)的研究與開(kāi)發(fā). 四川省,宜賓成電智慧信息系統(tǒng)研究院有限公司,2019-09-26.
[17], 智慧交警涉案車(chē)輛管理系統(tǒng)V1.0. 安徽省,安徽國(guó)達(dá)城建設(shè)施科技有限公司,2019-08-27.
致謝
伴隨著設(shè)計(jì)的完成,大學(xué)生涯也隨之即將結(jié)束。大學(xué)期間是我最珍惜的時(shí)光,大學(xué)時(shí)光中學(xué)會(huì)了很多,也成長(zhǎng)了很多,這段時(shí)光中每一段回憶都刻在腦海中。感謝一起學(xué)習(xí),一起成長(zhǎng)同學(xué)們,和成長(zhǎng)過(guò)程悉心教導(dǎo)的老師們,非常感激有你們的陪伴。
首先感謝我的指導(dǎo)老師,設(shè)計(jì)的完成離不開(kāi)老師的一系列指導(dǎo)。在畢業(yè)設(shè)計(jì)的完成過(guò)程中,老師給出了很多中肯的建議,正是由于老師一絲不茍的工作態(tài)度,我的設(shè)計(jì)才能順利的完成。
最后,感謝在大學(xué)生涯中每一位教導(dǎo)我的老師,是你們教給了我豐富的知識(shí),更教會(huì)了我遇到問(wèn)題時(shí),如何去應(yīng)對(duì)并解決。謝謝你們的幫助與支持。
免費(fèi)領(lǐng)取本源代碼,請(qǐng)關(guān)注點(diǎn)贊+私信
總結(jié)
以上是生活随笔為你收集整理的springboot车辆管理系统的设计与实现毕业设计源码031034的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电池上的PHP是什么,一次电池与二次电池
- 下一篇: 山洪灾害监测预警系统解决方案