建設(shè)網(wǎng)站后怎么發(fā)布長沙網(wǎng)絡(luò)推廣公司
基于SSM框架的狼途汽車門店管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
?全網(wǎng)粉絲20W+,csdn特邀作者、博客專家、CSDN新星計(jì)劃導(dǎo)師、java領(lǐng)域優(yōu)質(zhì)創(chuàng)作者,博客之星、掘金/華為云/阿里云/InfoQ等平臺優(yōu)質(zhì)作者、專注于Java技術(shù)領(lǐng)域和畢業(yè)項(xiàng)目實(shí)戰(zhàn)?
🍅文末獲取項(xiàng)目下載方式🍅
一、項(xiàng)目背景介紹:
汽車美容這個(gè)概念進(jìn)入中國都已經(jīng)有十多年之久了,汽車的美容方式也逐漸發(fā)展的多式多樣。眾多4S店在中國的立足也說明著汽車美容行業(yè)其實(shí)已經(jīng)正式的走向了成熟的發(fā)展時(shí)期。不得不說,中國的汽車市場是非常龐大的,得益于中國的經(jīng)濟(jì)發(fā)展速度太迅猛了,人們的生活水平日益提升,很多大城市已經(jīng)能做到汽車是家庭的必備品,甚至于很多家庭都不止一臺汽車。汽車多了,那么汽車門店也像春后的竹筍一般出現(xiàn)在我國的各地。
汽車的服務(wù)行業(yè)算是一個(gè)比較不錯(cuò)的“產(chǎn)業(yè)”。主要是因?yàn)檫@個(gè)行業(yè)是屬于社會(huì)經(jīng)濟(jì)高速發(fā)展的產(chǎn)物,是根據(jù)汽車保有量的增加而隨之形成的新型行業(yè)。那么大火的汽車的后服務(wù)市場究竟是什么呢?汽車的后服務(wù)市場可以這樣理解,你買完車之后,你如果想讓車的內(nèi)飾變得更加美觀,這時(shí)候門店就能幫你解決這個(gè)問題。從宏觀的角度上來說,其實(shí)就是有關(guān)于購車后的所有服務(wù)門店都可以幫你解決你的需求。但是由于我國的汽車后服務(wù)市場其實(shí)才算是剛剛起步,屬于極度不穩(wěn)定的狀態(tài)。今后這幾年之間是肯定會(huì)進(jìn)行一場激烈的競爭,經(jīng)過重新洗牌之后的結(jié)局才是真正汽車服務(wù)業(yè)的開始。屆時(shí),能通過這些競爭“存活”下來的門店必定是那些懂得用信息化管理技術(shù)去運(yùn)營的。因?yàn)橹挥羞@些會(huì)抓住機(jī)會(huì)的店家才能運(yùn)籌帷幄。
雖說這幾年中國互聯(lián)網(wǎng)技術(shù)發(fā)展的還算比較不錯(cuò),但是較于西方那些發(fā)達(dá)國家,其實(shí)還是有一點(diǎn)差距的。原因在于歐美那些國家主要推崇的都是O2O模式,該模式其實(shí)就是利用起互聯(lián)網(wǎng)在現(xiàn)今社會(huì)的優(yōu)勢,用真正的信息化去管理門店。讓門店真正可以做到“無人管理”。中國在O2O模式的應(yīng)用上還算是比較少的,中國汽車門店其實(shí)很多還是使用純線下的方式在運(yùn)營。這種運(yùn)營方式其實(shí)不符合現(xiàn)在的發(fā)展境況,畢竟現(xiàn)在是屬于信息化的時(shí)代。一個(gè)門店如果是純線下的模式在面對龐大的信息量的時(shí)候,人工管理是沒有什么辦法管理的。面對這種情況,其實(shí)是可以借鑒一下那些歐美國家的做法,使用數(shù)據(jù)庫去存取這些信息,發(fā)揮出互聯(lián)網(wǎng)時(shí)代應(yīng)該有的優(yōu)勢,用一個(gè)功能完善、輕量、能處理大量數(shù)據(jù)的汽車門店管理系統(tǒng)去管理門店,從而真正的實(shí)現(xiàn)機(jī)械化管理,讓汽車門店的運(yùn)營變得更加便利與先進(jìn)。
二、項(xiàng)目技術(shù)簡介:
- JAVA:Java是一門面向?qū)ο缶幊陶Z言,不僅吸收了C++語言的各種優(yōu)點(diǎn),還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強(qiáng)大和簡單易用兩個(gè)特征。Java語言作為靜態(tài)面向?qū)ο缶幊陶Z言的代表,極好地實(shí)現(xiàn)了面向?qū)ο罄碚?#xff0c;允許程序員以優(yōu)雅的思維方式進(jìn)行復(fù)雜的編程。
- Spring:Spring框架是一個(gè)開放源代碼的J2EE應(yīng)用程序框架,由Rod Johnson發(fā)起,是針對bean的生命周期進(jìn)行管理的輕量級容器(lightweight container)。 Spring解決了開發(fā)者在J2EE開發(fā)中遇到的許多常見的問題,提供了功能強(qiáng)大IOC、AOP及Web MVC等功能。Spring可以單獨(dú)應(yīng)用于構(gòu)筑應(yīng)用程序,也可以和Struts、Webwork、Tapestry等眾多Web框架組合使用,并且可以與 Swing等桌面應(yīng)用程序AP組合。因此, Spring不僅僅能應(yīng)用于J2EE應(yīng)用程序之中,也可以應(yīng)用于桌面應(yīng)用程序以及小應(yīng)用程序之中。Spring框架主要由七部分組成,分別是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。
- Mybatis:MyBatis本是apache的一個(gè)開源項(xiàng)目iBatis,2010年這個(gè)項(xiàng)目由apache software foundation遷移到了google code,并且改名為MyBatis。2013年11月遷移到Github。
iBATIS一詞來源于“internet”和“abatis”的組合,是一個(gè)基于Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAOs)。 - Bootstrap:Bootstrap是美國Twitter公司的設(shè)計(jì)師Mark Otto和Jacob Thornton合作基于HTML、CSS、JavaScript 開發(fā)的簡潔、直觀、強(qiáng)悍的前端開發(fā)框架,使得 Web 開發(fā)更加快捷。Bootstrap提供了優(yōu)雅的HTML和CSS規(guī)范,它即是由動(dòng)態(tài)CSS語言Less寫成。Bootstrap一經(jīng)推出后頗受歡迎,一直是GitHub上的熱門開源項(xiàng)目,包括NASA的MSNBC(微軟全國廣播公司)的Breaking News都使用了該項(xiàng)目。 國內(nèi)一些移動(dòng)開發(fā)者較為熟悉的框架,如WeX5前端開源框架等,也是基于Bootstrap源碼進(jìn)行性能優(yōu)化而來。
- Html:HTML的全稱為超文本標(biāo)記語言,是一種標(biāo)記語言。它包括一系列標(biāo)簽.通過這些標(biāo)簽可以將網(wǎng)絡(luò)上的文檔格式統(tǒng)一,使分散的Internet資源連接為一個(gè)邏輯整體。HTML文本是由HTML命令組成的描述性文本,HTML命令可以說明文字,圖形、動(dòng)畫、聲音、表格、鏈接等。
超文本是一種組織信息的方式,它通過超級鏈接方法將文本中的文字、圖表與其他信息媒體相關(guān)聯(lián)。這些相互關(guān)聯(lián)的信息媒體可能在同一文本中,也可能是其他文件,或是地理位置相距遙遠(yuǎn)的某臺計(jì)算機(jī)上的文件。這種組織信息方式將分布在不同位置的信息資源用隨機(jī)方式進(jìn)行連接,為人們查找,檢索信息提供方便。
三、系統(tǒng)功能模塊介紹:
四、數(shù)據(jù)庫設(shè)計(jì):
1:管理員表
(admin)
字段名 | 類型 | 默認(rèn)值 | 列注釋 |
---|---|---|---|
id | bigint(20) | NULL | 主鍵ID |
user_name | varchar(50) | NULL | 用戶名 |
pass_word | varchar(255) | NULL | 密碼 |
head_img | varchar(200) | NULL | 頭像 |
nick_name | varchar(50) | NULL | 昵稱 |
type | int(3) | NULL | 類型[1:員工 |
2:配件表
(parts)
字段名 | 類型 | 默認(rèn)值 | 列注釋 |
---|---|---|---|
id | bigint(20) | NULL | 主鍵ID |
parts_name | varchar(50) | NULL | 配件名稱 |
supplier_id | bigint(20) | NULL | 所屬供應(yīng)商 |
price | varchar(10) | NULL | 單價(jià) |
stock | int(20) | NULL | 庫存 |
cover_img | varchar(200) | NULL | 配件 |
content | text | NULL | 配件用途 |
type_id | bigint(20) | NULL | 所屬分類 |
current_stock | int(20) | NULL | 當(dāng)前庫存 |
3:配件分類
(parts_type)
字段名 | 類型 | 默認(rèn)值 | 列注釋 |
---|---|---|---|
id | bigint(20) | NULL | 主鍵ID |
parts_type_name | varchar(255) | NULL | 配件分類 |
4:服務(wù)項(xiàng)目表
(projects)
字段名 | 類型 | 默認(rèn)值 | 列注釋 |
---|---|---|---|
id | bigint(20) | NULL | 主鍵ID |
subscribe_id | bigint(20) | NULL | 預(yù)約表ID |
user_id | bigint(20) | NULL | 用戶ID |
content | text | NULL | 主要服務(wù)內(nèi)容 |
type | int(3) | NULL | 項(xiàng)目類別[1:汽車美容 |
5:用戶預(yù)約表
(subscribe)
字段名 | 類型 | 默認(rèn)值 | 列注釋 |
---|---|---|---|
id | bigint(20) | NULL | 主鍵ID |
user_id | bigint(20) | NULL | 用戶ID |
su_info | text | NULL | 預(yù)約內(nèi)容 |
subscribe_time | datetime | NULL | 預(yù)約時(shí)間 |
status | int(3) | NULL | 預(yù)約狀態(tài)[1:預(yù)約中 |
6:供應(yīng)商表
(supplier)
字段名 | 類型 | 默認(rèn)值 | 列注釋 |
---|---|---|---|
id | bigint(20) | NULL | 主鍵ID |
supplier_name | varchar(50) | NULL | 供應(yīng)商名稱 |
supplier_type | varchar(50) | NULL | 供應(yīng)商類別 |
supplier_localtion | varchar(255) | NULL | 供應(yīng)商所在地址 |
supplier_boss_name | varchar(50) | NULL | 供應(yīng)商聯(lián)系人名稱 |
supplier_tel | varchar(20) | NULL | 聯(lián)系電話 |
7:項(xiàng)目配件表
(user_parts)
字段名 | 類型 | 默認(rèn)值 | 列注釋 |
---|---|---|---|
id | bigint(20) | NULL | 主鍵ID |
parts_id | bigint(20) | NULL | 配件ID |
use_num | int(20) | NULL | 使用數(shù)量 |
projects_id | bigint(20) | NULL | 維修項(xiàng)目ID |
8:用戶表(users)
字段名 | 類型 | 默認(rèn)值 | 列注釋 |
---|---|---|---|
id | bigint(20) | NULL | 主鍵ID |
user_name | varchar(255) | NULL | 用戶名 |
pass_word | varchar(255) | NULL | 密碼 |
nick_name | varchar(50) | NULL | 昵稱 |
sex | int(3) | NULL | 性別[1:男 |
五、功能模塊:
-
前臺頁面的功能實(shí)現(xiàn):當(dāng)點(diǎn)擊馬上預(yù)約的時(shí)候,就會(huì)彈出預(yù)約信息的模態(tài)框,預(yù)約信息包括了姓名、電話、預(yù)約的門店(可以下拉選擇)、預(yù)約的業(yè)務(wù)(下拉選擇)、預(yù)約的時(shí)間、備注說明。點(diǎn)擊確定預(yù)約以后會(huì)提示用戶預(yù)約成功。點(diǎn)擊ok之后就可以返回門店首頁。
-
登錄頁面功能的實(shí)現(xiàn):當(dāng)輸入賬號不存在或者密碼錯(cuò)誤的時(shí)候,會(huì)提示賬號或者密碼錯(cuò)誤。當(dāng)輸入的賬號密碼正確的時(shí)候,會(huì)跳轉(zhuǎn)到員工信息頁面,并在菜單欄顯示當(dāng)前登錄的用戶名
-
員工頁面功能的實(shí)現(xiàn):點(diǎn)擊添加/編輯的時(shí)候,會(huì)跳轉(zhuǎn)到編輯頁面。當(dāng)輸入的信息不符合條件的時(shí)候?qū)⒉辉试S被保存 。
點(diǎn)擊導(dǎo)出員工表的時(shí)候,會(huì)直接生成一張包含所有員工信息的表格返回給用戶。
點(diǎn)擊導(dǎo)入按鈕的時(shí)候,會(huì)有下載模板和選擇文件,用戶可以下載模板,然后再模板表格填寫員工數(shù)據(jù),再選擇剛才編寫的文件,點(diǎn)擊保存之后就會(huì)跳轉(zhuǎn)回員工信息頁面。 -
權(quán)限頁面功能的實(shí)現(xiàn):因?yàn)橄到y(tǒng)的代碼可能會(huì)改動(dòng),那么就需要在頁面提供一個(gè)按鈕,作用是為了權(quán)限表達(dá)式和數(shù)據(jù)庫的權(quán)限表達(dá)式同步。點(diǎn)擊重新加載按鈕,會(huì)提示是否重新加載權(quán)限。點(diǎn)擊確定之后會(huì)更新權(quán)限頁面。
-
公告頁面功能的實(shí)現(xiàn):點(diǎn)擊查看按鈕的時(shí)候?qū)?yīng)的已讀狀態(tài)會(huì)改成已讀。而且會(huì)跳轉(zhuǎn)至公告查看的頁面。
點(diǎn)擊發(fā)布按鈕的時(shí)候狀態(tài)會(huì)變成已發(fā)布,同時(shí)刷新公告頁面。 -
門店信息頁面功能的實(shí)現(xiàn):點(diǎn)擊編輯的時(shí)候進(jìn)入到信息編輯頁面,有個(gè)查看附件的按鈕,點(diǎn)擊該按鈕的時(shí)候會(huì)打開門店的營業(yè)執(zhí)照照片??梢赃x擇文件作為營業(yè)執(zhí)照的照片進(jìn)行上傳。
-
預(yù)約信息頁面功能的實(shí)現(xiàn):點(diǎn)擊確認(rèn)預(yù)約的時(shí)候,預(yù)約單的狀態(tài)會(huì)變成履行中。點(diǎn)擊取消預(yù)約的時(shí)候,預(yù)約單的狀態(tài)會(huì)變成廢棄。
六、代碼示例:
前臺頁面的功能實(shí)現(xiàn)
/*** 展示前端頁面方法* @param model* @return*/@RequestMapping("/index")public String index(Model model){//獲取所有的數(shù)據(jù)字典
List<SystemDictionary>systemDictionaries=systemDictionaryService.selectTitle("business");model.addAttribute("systemDictionaries",systemDictionaries);//獲取總店對象Business business = businessService.getBymainStore(true);model.addAttribute("business",business);//獲取所有的門店信息List<Business> businesses = businessService.listAll();model.addAttribute("businesses",businesses);return "index";}
登錄頁面功能的實(shí)現(xiàn)
public class LoginController {@Autowiredprivate IEmployeeService employeeService;@RequestMapping("/empLogin")@ResponseBodypublic JsonResult empLogin(String username,String password){try {UsernamePasswordToken token = new UsernamePasswordToken(username,password);SecurityUtils.getSubject().login(token);return new JsonResult();} catch (UnknownAccountException e) {return new JsonResult(false, "賬號不存在");} catch (IncorrectCredentialsException e) {return new JsonResult(false, "密碼錯(cuò)誤");} catch (Exception e) {e.printStackTrace();return new JsonResult(false, "登錄異常,請聯(lián)系管理員");}}
員工頁面功能的實(shí)現(xiàn)
public class CheckLoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {if (handler instanceof HandlerMethod){//攔截到的都是請求動(dòng)態(tài)資源的請求//判斷是否有登錄 有放行 沒有跳轉(zhuǎn)登錄頁面Object emp = request.getSession().getAttribute(UserContext.USER_IN_SESSION);if (emp == null){response.sendRedirect("/login.html");return false;}}return true;}
}
權(quán)限頁面功能的實(shí)現(xiàn)
public void reload() {//1.一次性的把數(shù)據(jù)庫所有的權(quán)限信息查出來.List<Permission> permissions = permissionMapper.selectAll();//2.創(chuàng)建一個(gè)set集合 用來存儲權(quán)限表達(dá)式Set<String> expressionSet = new HashSet<>();for(Permission p:permissions){//3.將所有的權(quán)限信息去從加到集合中expressionSet.add(p.getExpression());}//獲取到所有貼了RequiredPermission注解,取出注解上的name和expression,// 封裝成Permission,保存到數(shù)據(jù)庫中//HandlerMethod代表每一個(gè)控制的方法引用Map<RequestMappingInfo, HandlerMethod> handlerMethods = rmhm.getHandlerMethods();Collection<HandlerMethod> values = handlerMethods.values();for(HandlerMethod method:values){// 獲取方法的注解RequiresPermissions annotation = method.getMethodAnnotation(RequiresPermissions.class);// 方法上有貼我們的自定義權(quán)限注解if (annotation != null) {// 獲取方法的注解 name 和 expression 值String name = annotation.value()[1];String expression = annotation.value()[0];// 存入到數(shù)據(jù)庫之前要判斷一下, 若數(shù)據(jù)庫中不存在就存入if(!expressionSet.contains(expression)) {Permission permission = new Permission();permission.setName(name);permission.setExpression(expression);permissionMapper.insert(permission);}}}
}
公告頁面功能的實(shí)現(xiàn)
@Overridepublic Notice get(Long id) {Notice notice = noticeMapper.selectByPrimaryKey(id);//點(diǎn)擊查看的時(shí)候中間表插入數(shù)據(jù)noticeMapper.insertEmpNotice(UserContext.getEmployee().getId(),id);return notice;
}
門店信息頁面功能的實(shí)現(xiàn)
@RequiresPermissions(value = {"business:saveOrUpdate","門店編輯"}, logical = Logical.OR)public String saveOrUpdate(Business business, MultipartFile file) throws Exception {if (file != null && file.getSize()>0) {//處理上傳的操作String realPath = servletContext.getRealPath("/");//如果存在 編輯的時(shí)候上傳帶就把之前的刪除if (StringUtils.hasText(business.getLicenseImg())) {//拼出刪除的路徑String deletePath = realPath + business.getLicenseImg();FileUploadUtil.deleteFile(deletePath);}String filePath = FileUploadUtil.uploadFile(file, realPath);business.setLicenseImg(filePath);}if (business.getId() == null) {businessService.save(business);} else {businessService.update(business);}return "redirect:/business/list";
}
預(yù)約信息頁面功能的實(shí)現(xiàn)
//修改預(yù)約單狀態(tài)功能@RequestMapping("/updateStatus")public String updateStatus(Long id ,Integer status){appointmentService.updateStatus(id,status);return "redirect:/appointment/list";
}void updateStatus(@Param("id") Long id, @Param("status") Integer status);<update id="updateStatus">update appointmentset status = #{status}where id = #{id}</update>
七、論文參考:
八、項(xiàng)目總結(jié):
在本次畢業(yè)設(shè)計(jì)期間,自己學(xué)會(huì)了很多新技術(shù)。以前百度開發(fā)技術(shù)的時(shí)候總覺得這些東西了解一下就好了,到時(shí)候不是手到擒來的事情嗎。通過這次畢業(yè)設(shè)計(jì)項(xiàng)目的開發(fā)才真正認(rèn)識到一個(gè)技術(shù)如果僅僅只是了解,那么你就只能說出技術(shù)的要點(diǎn),讓你真正去實(shí)現(xiàn)就會(huì)發(fā)現(xiàn)比登天都難。其實(shí)計(jì)算機(jī)方面的知識重在實(shí)踐,只有你真正的把這些技術(shù)用熟才能說是對其的了解。
但是由于是第一次自己手動(dòng)開發(fā)一個(gè)整套的基于SSM框架的項(xiàng)目,所以系統(tǒng)的問題還是有很多的。例如前端頁面選取問題上,本人是采用了各個(gè)框架技術(shù)的模板頁面;數(shù)據(jù)庫中表的設(shè)計(jì)可能也會(huì)存在關(guān)系錯(cuò)亂的問題。但是在這次開發(fā)過程中也收獲了很多之前沒有的開發(fā)經(jīng)驗(yàn)。對Bootstrap、Jquery、Freemarker、mybatis等框架或者技術(shù)有了更深層次的認(rèn)識。同樣也為自己畢業(yè)以后的學(xué)習(xí)生活和工作打下了堅(jiān)實(shí)的基礎(chǔ)。
在本次設(shè)計(jì)中收獲最大的其實(shí)并不是對技術(shù)的掌握,而是了解到開發(fā)一個(gè)項(xiàng)目必須得做好規(guī)劃。不能像無頭蒼蠅一般沒有頭緒,只有把項(xiàng)目的全部流程詳細(xì)的規(guī)劃好,用文檔去記錄起來,然后一步一步的實(shí)現(xiàn)項(xiàng)目的需求才能讓系統(tǒng)具有生命。在開發(fā)過程中也不會(huì)一帆風(fēng)順,遇到系統(tǒng)出現(xiàn)問題的時(shí)候,我從以前的束手無策變成現(xiàn)在的冷靜也得益于此次開發(fā)。現(xiàn)在的我遇到問題都會(huì)先分析系統(tǒng)的流程情況,再根據(jù)流程情況去分析代碼實(shí)現(xiàn)的邏輯問題,實(shí)在解決不了就會(huì)借助百度的力量。當(dāng)問題十分棘手的情況下會(huì)選擇詢問畢設(shè)導(dǎo)師周少波老師請求幫助。我覺得在畢業(yè)之后的工作時(shí)也應(yīng)該有這樣的態(tài)度,才能真正去把項(xiàng)目開發(fā)好。
本次畢業(yè)設(shè)計(jì)所做出的項(xiàng)目可能還無法滿足真正的企業(yè)要求,與真正實(shí)際應(yīng)用還是有著一定的差距的。原因在于搜集的信息不夠充足、對實(shí)際情況了解不夠深入、對系統(tǒng)的分析不夠徹底。但是有了這次的開發(fā)經(jīng)驗(yàn),我相信在以后的開發(fā)之路上我能避免走很多彎路,也能開發(fā)出真正能應(yīng)用于現(xiàn)實(shí)生活中的項(xiàng)目系統(tǒng)。
九、源碼獲取:
大家點(diǎn)贊、收藏、關(guān)注、評論啦 、查看👇🏻👇🏻👇🏻獲取聯(lián)系方式👇🏻👇🏻👇🏻
鏈接點(diǎn)擊直達(dá):下載鏈接