小程序springboot食堂预约订餐系统毕业设计-附源码221554
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 摘 ?要
信息化社會(huì)內(nèi)需要與之針對(duì)性的信息獲取途徑,但是途徑的擴(kuò)展基本上為人們所努力的方向,由于站在的角度存在偏差,人們經(jīng)常能夠獲得不同類型信息,這也是技術(shù)最為難以攻克的課題。針對(duì)食堂預(yù)約訂餐系統(tǒng)等問題,對(duì)食堂預(yù)約訂餐系統(tǒng)進(jìn)行研究分析,然后開發(fā)設(shè)計(jì)出食堂預(yù)約訂餐系統(tǒng)以解決問題。
食堂預(yù)約訂餐系統(tǒng)小程序的設(shè)計(jì)主要是對(duì)系統(tǒng)所要實(shí)現(xiàn)的功能進(jìn)行詳細(xì)考慮,確定所要實(shí)現(xiàn)的功能后進(jìn)行界面的設(shè)計(jì),在這中間還要考慮如何可以更好的將功能及頁(yè)面進(jìn)行很好的結(jié)合,方便用戶可以很容易明了的找到自己所需要的信息,還有系統(tǒng)平臺(tái)后期的可操作性,通過對(duì)信息內(nèi)容的詳細(xì)了解進(jìn)行技術(shù)的開發(fā)。
食堂預(yù)約訂餐系統(tǒng)小程序的開發(fā)利用現(xiàn)有的成熟技術(shù)參考,以源代碼為模板,分析功能調(diào)整與食堂預(yù)約訂餐系統(tǒng)小程序管理的實(shí)際需求相結(jié)合,討論了基于食堂預(yù)約訂餐系統(tǒng)小程序管理的使用。?
關(guān)鍵詞:食堂預(yù)約訂餐系統(tǒng)小程序;springboot?
Small program SPRINGBOOT canteen reservation ordering system?
Abstract
In the information society, there is a need for targeted access to information, but the expansion of access is basically the direction that people are striving for. Because of the deviation from the perspective, people can often obtain different types of information, which is also the most difficult task for technology to overcome. Aiming at the problems of canteen reservation system, this paper studies and analyzes the canteen reservation system, and then develops and designs the canteen reservation system to solve the problems.
The design of the small program of the dining room reservation and ordering system is mainly to consider the functions to be realized in detail, and then design the interface after determining the functions to be realized. In this process, we should also consider how to better combine the functions and pages, so that users can easily and clearly find the information they need, as well as the operability of the later stage of the system platform, and develop the technology through a detailed understanding of the information content.
The development of the canteen booking system applet utilizes the existing mature technical reference, takes the source code as a template, analyzes the combination of function adjustment and the actual requirements of the canteen booking system applet management, and discusses the use of the canteen booking system applet management.
Key words:?Canteen reservation ordering system applet; springboot
目 ?錄
摘??要
Abstract
第一章?緒?論
1.1選題背景
1.2國(guó)內(nèi)外研究概況
1.3研究?jī)?nèi)容
第二章 開發(fā)工具及關(guān)鍵技術(shù)介紹
2.1微信開發(fā)者工具
2.2小程序框架以及目錄結(jié)構(gòu)介紹
2.3 Spring Boot框架
2.4 ?Mysql數(shù)據(jù)庫(kù)
第三章?系統(tǒng)分析
3.1需求分析
3.2可行性分析
3.2.1技術(shù)可行性:技術(shù)背景
3.2.2經(jīng)濟(jì)可行性
3.2.3操作可行性:
3.3性能分析
3.4系統(tǒng)操作流程
3.4.1用戶登錄流程
3.4.2信息添加流程
3.4.3信息刪除流程
第四章?系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
4.1系統(tǒng)架構(gòu)設(shè)計(jì)
4.2開發(fā)流程設(shè)計(jì)
4.3數(shù)據(jù)庫(kù)設(shè)計(jì)
4.3.1實(shí)體ER圖
4.3.2數(shù)據(jù)表
第五章?系統(tǒng)實(shí)現(xiàn)
5.1用戶前臺(tái)功能前臺(tái)(前端)
5.2管理員功能模塊(后端) 29
第六章??系統(tǒng)的測(cè)試 33
6.1 測(cè)試目的 33
6.2 測(cè)試方案設(shè)計(jì) 33
6.2.1 測(cè)試策略 33
6.2.2 測(cè)試分析 33
6.3 測(cè)試結(jié)果 34
結(jié)??論 35
參考文獻(xiàn) 36
致??謝 38
第一章 緒 論
1.1選題背景與意義
隨著網(wǎng)絡(luò)時(shí)代的到來,互聯(lián)網(wǎng)的優(yōu)勢(shì)和普及時(shí)刻影響并改變著人們的生活方式。在信息技術(shù)迅速發(fā)展的今天,計(jì)算機(jī)技術(shù)已經(jīng)遍及全球,使社會(huì)發(fā)生了巨大的變革。
為了不受時(shí)間和地點(diǎn)的限制,智能手機(jī)用戶可以通過移動(dòng)網(wǎng)絡(luò)訪問網(wǎng)站和處理各種業(yè)務(wù)和互聯(lián)網(wǎng),這是一個(gè)有效的將應(yīng)用系統(tǒng)的功能擴(kuò)展到手機(jī)終端的方法。現(xiàn)今各種智能手機(jī)層出不窮,各類基于手機(jī)平臺(tái)的軟件應(yīng)運(yùn)而生,其中,在眾多交流軟件中,微信備受人們青睞。近年來,微信發(fā)展規(guī)模越來越大,越來越多的人開始使用微信,目前隨著智能手機(jī)系統(tǒng)的普及,人人手機(jī)上基本都有了微信。
所以,微信推出小程序廣告支持公眾號(hào)關(guān)注,而這就意味著小程序跟公眾號(hào)之間的通道被徹底打通了。本論文食堂預(yù)約訂餐系統(tǒng)小程序主要牽扯到的程序,數(shù)據(jù)庫(kù)與計(jì)算機(jī)技術(shù)等。覆蓋知識(shí)面大,可以大大的提高系統(tǒng)人員工作效率。
微信小程序的食堂預(yù)約訂餐系統(tǒng)是計(jì)算機(jī)技術(shù)與座位管理相結(jié)合的產(chǎn)物,通過微信小程序的食堂預(yù)約訂餐系統(tǒng)實(shí)現(xiàn)了對(duì)食堂的高效管理。隨著計(jì)算機(jī)技術(shù)的不斷提高,計(jì)算機(jī)已經(jīng)深入到社會(huì)生活的各個(gè)角落.而采用人工找食堂訂餐的方法,不僅效率低,易出錯(cuò),手續(xù)繁瑣,而且耗費(fèi)大量人力。為了滿足微信小程序的食堂預(yù)約訂餐高效的管理,在工作人員的具備一定的計(jì)算機(jī)操作能力的前提下,特編此微信小程序的食堂預(yù)約訂餐系統(tǒng)軟件以提高食堂預(yù)約訂餐的管理效率。
1.2國(guó)內(nèi)外研究概況
隨著高新科技的不斷發(fā)展,信息化水平的日益提高,越來越多的餐飲企業(yè)開始意識(shí)到餐飲信息化的重要性,也在積極的考慮如何將信息化技術(shù)融入到自己的餐飲管理中。通過創(chuàng)新,餐飲業(yè)主不僅可以降低成本,為客戶提供更好的服務(wù)并獲得額外的經(jīng)濟(jì)效益。顧客也會(huì)感到更加滿意。后面我們所看到的類似于手機(jī)的一 些餐飲服務(wù)系統(tǒng)、餐飲管理系統(tǒng)也逐漸開發(fā)成功并且慢慢的投入到新興的餐飲行業(yè)中,給國(guó)內(nèi)的餐飲業(yè)帶來了新機(jī)。它節(jié)省了時(shí)間,使用掌上終端或者是平板,服務(wù)員不必離開桌子把點(diǎn)菜單給到廚房或者是酒水區(qū),便可直接準(zhǔn)確無誤的下單至后廚。服務(wù)員也不需要利用紙筆手寫菜單,節(jié)省了餐廳日常開支,提高了點(diǎn)菜速度,減少了顧客的等待時(shí)間,提高了服務(wù)質(zhì)量和翻單率,增加了客戶的滿意度和好評(píng)率。而且服務(wù)員可以服務(wù)多個(gè)餐桌,大大提高了服務(wù)效率,節(jié)約了人力成本。
在30年的發(fā)展進(jìn)程中,餐飲業(yè)作為我國(guó)第三產(chǎn)業(yè)中的一一個(gè)傳統(tǒng)服務(wù)性行業(yè),始終保持著旺盛的發(fā)展勢(shì)頭。據(jù)中國(guó)烹飪協(xié)會(huì)提供的資料顯示在改革開放前夕的1978年,全國(guó)餐飲業(yè)的經(jīng)營(yíng)網(wǎng)點(diǎn)不足12萬個(gè),員工,104.4萬,零售額54.8億元。自1991年以來,全國(guó)餐飲業(yè)的經(jīng)營(yíng)網(wǎng)點(diǎn)已突破800萬個(gè),員工已突破9000萬,銷售額年平均550億元以上。2006年全國(guó)餐飲業(yè)零售額突破1萬億元大關(guān),達(dá)到10345.5億元、同比增長(zhǎng)16. 4%,拉動(dòng)社會(huì)消費(fèi)品零售總額增長(zhǎng)2.2個(gè)百分點(diǎn)。2007年,隨著人民生活水平和餐飲社會(huì)化程度的逐步提高,我國(guó)餐飲產(chǎn)業(yè)再創(chuàng)佳績(jī),餐飲消費(fèi)持續(xù)快速增長(zhǎng),餐飲業(yè)經(jīng)營(yíng)網(wǎng)點(diǎn)數(shù)量的增長(zhǎng)速度在我國(guó)第三產(chǎn)業(yè)中攀升至第一。
隨著市場(chǎng)競(jìng)爭(zhēng)的加劇,許多酒店、餐廳也開始著手利用高科技來改變餐飲服務(wù)模式和經(jīng)營(yíng)模式,無線點(diǎn)菜系統(tǒng)應(yīng)運(yùn)而生。傳統(tǒng)餐飲行業(yè)與互聯(lián)網(wǎng)商圈這一現(xiàn)代化工具的結(jié)合早就如火如荼地展開了,餐飲020也已成為赤手可熱的名詞,很多餐廳、酒店都已開始走上020之路。微博營(yíng)銷、微信公眾平臺(tái)、APP客戶端、020交易平臺(tái),各種工具、手段全面利用;推廣營(yíng)銷、外賣外送、線下打折促銷活動(dòng)、優(yōu)惠券發(fā)放等各項(xiàng)服務(wù)線上線下雙管齊下。如今,搶客戶、爭(zhēng)流量大戰(zhàn)已進(jìn)入白熱化階段,在互聯(lián)網(wǎng)商圈掀起了一陣融資注資熱潮。
歐美等西方發(fā)達(dá)國(guó)家信息技術(shù)起步早,各個(gè)行業(yè)的信息化變革出現(xiàn)較|早。相比較國(guó)內(nèi),歐美國(guó)家餐廳建設(shè)電子化點(diǎn)餐平臺(tái)的起步較早。例如化完成。顧客可以通過店內(nèi)的計(jì)算機(jī)設(shè)備完成菜品瀏覽、點(diǎn)餐與結(jié)算。德國(guó)在07年出現(xiàn)了世界第一一個(gè)無人餐廳,餐廳中所有服務(wù)均由機(jī)器自動(dòng)無人餐廳秩序良好,效率高效,及時(shí)在用餐高峰期也沒有出現(xiàn)顧客長(zhǎng)時(shí)間排隊(duì)、等待等問題,顧客對(duì)用餐環(huán)境非常滿意。這種完全將餐廳服務(wù)的自動(dòng)化餐廳的出現(xiàn)與良好運(yùn)營(yíng),向大家展示了信息技術(shù)對(duì)餐飲行業(yè)的變革作用。日本- -家餐廳在德國(guó)無人餐廳的基礎(chǔ)上,適應(yīng)目前移動(dòng)互聯(lián)網(wǎng)的發(fā)展趨勢(shì),將點(diǎn)餐系統(tǒng)移植到智能終端。顧客可以通過餐廳APP提前預(yù)約點(diǎn)菜,可以節(jié)約顧客的等待時(shí)間,進(jìn)一 步向人們展示出了信息時(shí)代智能點(diǎn)餐系統(tǒng)給人們生活帶來的便捷。從歷史發(fā)展來看,歐美餐飲行業(yè)的信息化變革分以下幾個(gè)階段:
1、餐廳內(nèi)有線點(diǎn)餐系統(tǒng)餐飲行業(yè)傳統(tǒng)人工點(diǎn)餐方式中,菜品的記錄與訂單管理的介質(zhì)都是紙質(zhì)的,容易出現(xiàn)下單錯(cuò)誤的問題。從80年代開始,隨著計(jì)算機(jī)技術(shù)的迅速普及與各種信息管理系統(tǒng)的發(fā)展,餐廳開始建立自身的訂單管理系統(tǒng), 借助計(jì)算機(jī)技術(shù)完成下單、結(jié)算等業(yè)務(wù)的電子化。在這一階段,點(diǎn)餐系統(tǒng)的終端往往是PC端。
2、餐廳內(nèi)無線點(diǎn)餐系統(tǒng)從80年代末開始,隨著嵌入式技術(shù)的發(fā)展與無線局域網(wǎng)的出現(xiàn),基于移動(dòng)PAD的餐廳內(nèi)無線點(diǎn)餐系統(tǒng)開始出現(xiàn)。借助該系統(tǒng),服務(wù)員可以通過手持的PAD完成下單。該方式的出現(xiàn)很大程度上提高了餐廳業(yè)務(wù)效率。
3、基于互聯(lián)網(wǎng)的無線點(diǎn)餐系統(tǒng)從90年代開始,隨著互聯(lián)網(wǎng)與智能手機(jī)的迅速普及,餐廳的信息化建設(shè)步入一一個(gè)全新的時(shí)代。目前,眾多餐廳定制研發(fā)了手機(jī)應(yīng)用程序,顧客可以通過餐廳的手機(jī)端應(yīng)用在線進(jìn)行各種瀏覽與操作。例如,法國(guó)巴黎的Storific是一 款典型的移動(dòng)端點(diǎn)餐應(yīng)用,顧客無需服務(wù)員無需到店都可以瀏覽菜品、預(yù)約下單、在線支付。
餐飲020日益滲透到我們的日常生活中,消費(fèi)者的消費(fèi)習(xí)慣和消費(fèi)觀念也發(fā)生了重大變化。消費(fèi)者已更多的去關(guān)注點(diǎn)評(píng)類網(wǎng)站,微博、微信公眾平臺(tái)等,根據(jù)餐飲消費(fèi)調(diào)查,這些平臺(tái)對(duì)消費(fèi)者做出餐飲消費(fèi)選擇的影響明顯加強(qiáng)。而且,當(dāng)前消費(fèi)者對(duì)020的應(yīng)用不止集中在預(yù)訂,還逐漸向點(diǎn)餐、支付等綜合功能深入擴(kuò)展。例如,直接在APP客戶端進(jìn)行點(diǎn)餐,支持前臺(tái)付款、快速擔(dān)保及信用卡預(yù)付等。
1.3研究?jī)?nèi)容
微信小程序的食堂預(yù)約訂餐系統(tǒng)的開發(fā)及實(shí)現(xiàn),所需要的工作內(nèi)容:
(1)首先是確定選題,確定好所要做的系統(tǒng),并對(duì)系統(tǒng)的背景及現(xiàn)在面臨的一些問題等進(jìn)行系統(tǒng)的初步確認(rèn)。
(2)系統(tǒng)確認(rèn)完成后,結(jié)合系統(tǒng)開發(fā)的需求進(jìn)行確認(rèn)系統(tǒng)開發(fā)所使用的技術(shù),食堂預(yù)約訂餐系統(tǒng)小程序的開發(fā)使用SPRINGBOOT技術(shù),數(shù)據(jù)庫(kù)進(jìn)行平臺(tái)的搭建開發(fā),確認(rèn)好使用的技術(shù)進(jìn)行技術(shù)分析,所使用的技術(shù)是否可以完成食堂預(yù)約訂餐系統(tǒng)小程序的實(shí)現(xiàn)。
(3)確定好系統(tǒng)使用的技術(shù),進(jìn)行在線確認(rèn)系統(tǒng)所劃分的用戶角色,并且根據(jù)用戶角色劃分確定所要設(shè)計(jì)的功能模塊,對(duì)于食堂預(yù)約訂餐系統(tǒng)小程序系統(tǒng)的設(shè)計(jì)主要?jiǎng)澐謩e為管理員和用戶角色,并所使用的功能模塊也相應(yīng)不同,但是系統(tǒng)的數(shù)據(jù)庫(kù)實(shí)現(xiàn)的內(nèi)容是交互的,用戶可以隨時(shí)根據(jù)自己的需求進(jìn)行查看,對(duì)于系統(tǒng)工作人員可以根據(jù)自己的分管內(nèi)容進(jìn)行在線信息的處理及操作,管理員獲取到所有用戶的詳細(xì)數(shù)據(jù)信息,并根據(jù)需求進(jìn)行第一時(shí)間處理解決。
(4)系統(tǒng)的功能模塊確認(rèn)完成后進(jìn)行程序及界面的設(shè)計(jì),設(shè)計(jì)完成后,并且通過測(cè)試來判斷程序是否完善,對(duì)于系統(tǒng)測(cè)試,需要不同的用戶進(jìn)行不同的內(nèi)容編輯及提交,及使用不同的測(cè)試方式找出程序中存在的漏洞,并對(duì)程序出現(xiàn)的漏洞問題進(jìn)行在線解決處理,如果測(cè)試系統(tǒng)沒有任何問題時(shí),可以將系統(tǒng)上傳進(jìn)行正式操作使用。
- 開發(fā)工具及關(guān)鍵技術(shù)介紹
2.1微信開發(fā)者工具
微信開發(fā)者工具現(xiàn)在已經(jīng)被小程序開發(fā)團(tuán)隊(duì)開發(fā)運(yùn)行,目前微信開發(fā)者工具任然在不斷的完善中,在開發(fā)小程序時(shí)經(jīng)常要不斷的更新。可以使用微信掃碼登陸開發(fā)者工具,開發(fā)者工具將使用這個(gè)微信帳號(hào)的信息進(jìn)行小程序的開發(fā)和調(diào)試。
機(jī)型選擇:小程序以智能手機(jī)的屏幕尺寸為設(shè)計(jì)標(biāo)準(zhǔn),進(jìn)行切圖。
預(yù)覽界面:寫好視圖布局后點(diǎn)擊編譯,用來刷新視圖界面。
控制臺(tái):方便調(diào)試打印輸出信息。
上傳代碼:上傳到騰訊服務(wù)器,提交審核必經(jīng)步驟。上傳代碼時(shí)可以填寫版本號(hào)和備注信息。
資源文件:一般可以在資源文件進(jìn)行對(duì)應(yīng)項(xiàng)目的文件目錄的斷點(diǎn)調(diào)試。
顯示遠(yuǎn)程調(diào)試:手機(jī)端和PC端開發(fā)工具聯(lián)調(diào)對(duì)用戶而言是非常實(shí)用的。
本地?cái)?shù)據(jù)存儲(chǔ):顯示的是本地存儲(chǔ)的數(shù)據(jù)。
視圖調(diào)試:標(biāo)組件以子父層級(jí)結(jié)構(gòu)呈現(xiàn),方便調(diào)試。
微信限制在2M 以內(nèi)的代碼體積;開發(fā)中一般不校驗(yàn)合法域名信息;小程序后臺(tái)要做配置服務(wù)器域名。
以上就是在開發(fā)過程中微信開發(fā)者工具常用到的功能,微信開發(fā)者工具也在不斷的完善。
2.2小程序框架以及目錄結(jié)構(gòu)介紹
整個(gè)小程序框架系統(tǒng)分為兩部分:邏輯層和視圖層。小程序開發(fā)框架的目標(biāo)是通過盡可能簡(jiǎn)單、高效的方式讓開發(fā)者可以在微信中開發(fā)具有原生小程序體驗(yàn)的服務(wù)。小程序在視圖層與邏輯層間提供了數(shù)據(jù)傳輸和事件系統(tǒng),提供了自己的視圖層以及邏輯層框架,讓開發(fā)者能夠?qū)W⒂跀?shù)據(jù)與邏輯。框架的核心是一個(gè)響應(yīng)的數(shù)據(jù)綁定系統(tǒng),可以讓數(shù)據(jù)與視圖非常簡(jiǎn)單地保持同步。在邏輯層做數(shù)據(jù)修改,在視圖層就會(huì)做相應(yīng)的更新。框架提供了一套基礎(chǔ)的組件,這些組件自帶微信風(fēng)格的樣式以及特殊的邏輯,開發(fā)者可以通過組合基礎(chǔ)組件,創(chuàng)建出強(qiáng)大的微信小程序 。
2.3 Spring Boot框架
Spring框架是Java平臺(tái)上的一種開源應(yīng)用框架,提供具有控制反轉(zhuǎn)特性的容器。盡管Spring框架自身對(duì)編程模型沒有限制,但其在Java應(yīng)用中的頻繁使用讓它備受青睞,以至于后來讓它作為EJB(EnterpriseJavaBeans)模型的補(bǔ)充,甚至是替補(bǔ)。Spring框架為開發(fā)提供了一系列的解決方案,比如利用控制反轉(zhuǎn)的核心特性,并通過依賴注入實(shí)現(xiàn)控制反轉(zhuǎn)來實(shí)現(xiàn)管理對(duì)象生命周期容器化,利用面向切面編程進(jìn)行聲明式的事務(wù)管理,整合多種持久化技術(shù)管理數(shù)據(jù)訪問,提供大量?jī)?yōu)秀的Web框架方便開發(fā)等等。Spring框架具有控制反轉(zhuǎn)(IOC)特性,IOC旨在方便項(xiàng)目維護(hù)和測(cè)試,它提供了一種通過Java的反射機(jī)制對(duì)Java對(duì)象進(jìn)行統(tǒng)一的配置和管理的方法。Spring框架利用容器管理對(duì)象的生命周期,容器可以通過掃描XML文件或類上特定Java注解來配置對(duì)象,開發(fā)者可以通過依賴查找或依賴注入來獲得對(duì)象。Spring框架具有面向切面編程(AOP)框架,SpringAOP框架基于代理模式,同時(shí)運(yùn)行時(shí)可配置;AOP框架主要針對(duì)模塊之間的交叉關(guān)注點(diǎn)進(jìn)行模塊化。Spring框架的AOP框架僅提供基本的AOP特性,雖無法與AspectJ框架相比,但通過與AspectJ的集成,也可以滿足基本需求。Spring框架下的事務(wù)管理、遠(yuǎn)程訪問等功能均可以通過使用SpringAOP技術(shù)實(shí)現(xiàn)。Spring的事務(wù)管理框架為Java平臺(tái)帶來了一種抽象機(jī)制,使本地和全局事務(wù)以及嵌套事務(wù)能夠與保存點(diǎn)一起工作,并且?guī)缀蹩梢栽贘ava平臺(tái)的任何環(huán)境中工作。
2.4 ?Mysql數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)是系統(tǒng)開發(fā)過程中不可或缺的一部分。 在WEB應(yīng)用方面,MySQL AB開發(fā)了一個(gè)具有很大優(yōu)勢(shì)的MySQL關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)。 MySQL可以將數(shù)據(jù)存儲(chǔ)在不同的表中,這非常靈活,并且還可以提高系統(tǒng)在實(shí)際應(yīng)用中的速度。 數(shù)據(jù)庫(kù)訪問最常用于標(biāo)準(zhǔn)SQL語(yǔ)言,MySQL用于SQL語(yǔ)言,因此它具有高度兼容性。數(shù)據(jù)庫(kù)的操作是必不可少的,包括對(duì)數(shù)據(jù)庫(kù)表的增加、刪除、修改、查詢等功能。現(xiàn)如今,數(shù)據(jù)庫(kù)可以分為關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù),Mysql屬于關(guān)系性數(shù)據(jù)庫(kù),Mysql數(shù)據(jù)庫(kù)是一款小型的關(guān)系型數(shù)據(jù)庫(kù),它以其自身特點(diǎn):體積小、速度快、成本低等,Mysql數(shù)據(jù)庫(kù)是目前最受歡迎的開源數(shù)據(jù)庫(kù)。
在WEB應(yīng)用技術(shù)中, Mysql數(shù)據(jù)庫(kù)支持不同的操作系統(tǒng)平臺(tái),雖然在不同平臺(tái)下的安裝和配置都不相同,但是差別也不是很大,Mysql在Windows平臺(tái)下兩種安裝方式,二進(jìn)制版和免安裝版。安裝完Mysql數(shù)據(jù)庫(kù)之后,需要啟動(dòng)服務(wù)進(jìn)程,相應(yīng)的客戶端就可以連接數(shù)據(jù)庫(kù),客戶端可通過命令行或者圖形界面工具登錄數(shù)據(jù)庫(kù)。
第三章 系統(tǒng)分析
3.1需求分析
任何一個(gè)項(xiàng)目在開發(fā)研究前,都需要對(duì)研發(fā)系統(tǒng)本身的需求做一個(gè)認(rèn)真的分析,市場(chǎng)的調(diào)研是不可忽視的,從實(shí)際場(chǎng)景中確定使用人員的功能需求,從而明確目標(biāo),對(duì)整個(gè)系統(tǒng)的開發(fā)有一個(gè)更加準(zhǔn)確的定位,在這個(gè)章節(jié),需要對(duì)系統(tǒng)的性能分析,業(yè)務(wù)流程分析,和數(shù)據(jù)等進(jìn)行分析,食堂預(yù)約訂餐系統(tǒng)小程序的整體界面簡(jiǎn)單,功能完善。
需求的可行性是分析和討論發(fā)達(dá)的系統(tǒng)能達(dá)到什么樣的要求。開發(fā)的系統(tǒng)平臺(tái)是否符合之前的要求。只有在預(yù)先評(píng)估系統(tǒng)的開發(fā)中,才能在系統(tǒng)開發(fā)和實(shí)施之前完成需求。如果您不具備開發(fā)一個(gè)功能不合格的系統(tǒng)的可行性,那就是開發(fā)失敗。開發(fā)系統(tǒng)是否有用,可以完成之前討論過的需求,以下分析了食堂預(yù)約訂餐系統(tǒng)小程序的實(shí)際需求。
系統(tǒng)設(shè)計(jì)需要從用戶和管理員的實(shí)際需求開始,以了解他們需要實(shí)施哪些功能以及他們可以包括哪些管理工作。
考慮到食堂預(yù)約訂餐系統(tǒng)小程序設(shè)計(jì)的特點(diǎn),應(yīng)滿足幾個(gè)要求:
(1)它可以通過網(wǎng)絡(luò)開展食堂預(yù)約訂餐系統(tǒng)小程序信息管理工作,促進(jìn)對(duì)食堂預(yù)約訂餐系統(tǒng)小程序信息管理。
(2)用戶可以查看農(nóng)產(chǎn)品信息和公告信息;
(3)它提供了一個(gè)免費(fèi)的渠道,以確保數(shù)據(jù)的實(shí)時(shí)有效溝通。
3.2可行性分析
3.2.1技術(shù)可行性:技術(shù)背景?????
食堂預(yù)約訂餐系統(tǒng)小程序采用了SPRINGBOOT技術(shù),開發(fā)了功能完備、使用簡(jiǎn)單的前端應(yīng)用程序,并建立、維護(hù)了一個(gè)數(shù)據(jù)完整、安全、穩(wěn)定性強(qiáng)的后臺(tái)數(shù)據(jù)庫(kù)系統(tǒng)。
系統(tǒng)使用SPRINGBOOT技術(shù)和Mysql數(shù)據(jù)庫(kù)作為設(shè)計(jì)工具,可簡(jiǎn)單易行地學(xué)習(xí)操作。用戶角色之間的相結(jié)合開發(fā)一套食堂預(yù)約訂餐系統(tǒng)小程序是值得嘗試的,數(shù)據(jù)完整性和許多品質(zhì)為數(shù)據(jù)的功能分配和管理提供了依據(jù)。它也是數(shù)據(jù)庫(kù)安全平臺(tái)的重要組成部分,是提高和增強(qiáng)數(shù)據(jù)安全性的重要手段。此外,為了提供更平滑,更智能和更有效的基本控制方法,定義了同時(shí)構(gòu)建對(duì)安全計(jì)算環(huán)境的支持所需的步驟,并幫助維護(hù)安全性。因?yàn)樵谶@兩種開發(fā)工具中,功能強(qiáng)大且免費(fèi)且界面良好,所以食堂預(yù)約訂餐系統(tǒng)小程序在技術(shù)方面是可行的。
3.2.2經(jīng)濟(jì)可行性
桌面食堂預(yù)約訂餐系統(tǒng)小程序管理的開發(fā)是由開發(fā)者自己開發(fā),不需要購(gòu)買其他軟件或者端口之類的,而且在食堂預(yù)約訂餐系統(tǒng)小程序管理的開發(fā)之前所做的市場(chǎng)調(diào)研及其他的食堂預(yù)約訂餐系統(tǒng)小程序,都是沒有任何費(fèi)用的,通過開發(fā)者自己的努力,所有的工作的都是自己親力親為,在碰到自己比較難以解決的問題,大多是通過同學(xué)和指導(dǎo)老師的幫助進(jìn)行相關(guān)信息的解決,所以對(duì)于食堂預(yù)約訂餐系統(tǒng)小程序的開發(fā)在經(jīng)濟(jì)上是完全可行的,沒有任何費(fèi)用支出的。
使用SPRINGBOOT技術(shù)是比較成熟的技術(shù),所以食堂預(yù)約訂餐系統(tǒng)小程序的開發(fā)在經(jīng)濟(jì)上是沒有問題的。
3.2.3操作可行性:?
可操作性主要是對(duì)食堂預(yù)約訂餐系統(tǒng)小程序系統(tǒng)設(shè)計(jì)完成后,用戶的使用體驗(yàn)度,對(duì)于管理員可以通過系統(tǒng)隨時(shí)管理相關(guān)的數(shù)據(jù)信息,并且對(duì)于管理員、用戶二個(gè)用戶角色,都可以簡(jiǎn)單明了的進(jìn)入到自己的系統(tǒng)界面,通過界面導(dǎo)航菜單可以簡(jiǎn)單明了地操作功能模塊,方便用戶信息需求和農(nóng)產(chǎn)品信息管理數(shù)據(jù)信息,對(duì)于系統(tǒng)的操作,不需要專業(yè)人員都可以直接進(jìn)行功能模塊的操作管理,所以在系統(tǒng)的可操作性是完全可以的。本系統(tǒng)的操作使用的也是界面窗口進(jìn)行登錄,所以操作人員只要會(huì)簡(jiǎn)單的電腦操作就完全可以的。
3.3性能分析
對(duì)于性能分析,與傳統(tǒng)的管理方式相比,傳統(tǒng)的管理方式是使用人工通過用紙和筆進(jìn)行數(shù)據(jù)信息的統(tǒng)計(jì)和管理,并且這種方式對(duì)于存儲(chǔ)和查找某一數(shù)據(jù)信息都比較麻煩,隨著計(jì)算機(jī)網(wǎng)絡(luò)的到來,這種傳統(tǒng)的方法很難適應(yīng)當(dāng)下社會(huì)的發(fā)展,不僅降低人們的辦事效率,而且還需要很多的人力和物力,對(duì)于使用的時(shí)間和所要花費(fèi)的費(fèi)用都是比較高的,為了降低成本費(fèi)用,提高用戶的工作效率,進(jìn)行開發(fā)一套基于計(jì)算機(jī)和網(wǎng)絡(luò)技術(shù)的食堂預(yù)約訂餐系統(tǒng)小程序。
食堂預(yù)約訂餐系統(tǒng)小程序的開發(fā)設(shè)計(jì)時(shí)一個(gè)獨(dú)立的系統(tǒng),以流行數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)的存儲(chǔ)開發(fā),主要是為了實(shí)現(xiàn)食堂預(yù)約訂餐系統(tǒng)小程序的用戶角色及相對(duì)應(yīng)的功能模塊,讓食堂預(yù)約訂餐系統(tǒng)小程序的管理不會(huì)存在管理差異、低效率,而是跟傳統(tǒng)的管理信息恰好相反,食堂預(yù)約訂餐系統(tǒng)小程序的實(shí)現(xiàn)可以節(jié)約資源,并且對(duì)于業(yè)務(wù)的處理速度也提高,速度快、效率高,功能性強(qiáng)大。
3.4系統(tǒng)操作流程
3.4.1用戶登錄流程
對(duì)于系統(tǒng)的安全性的第一關(guān),就是用戶想要進(jìn)入系統(tǒng),必須通過登錄窗口,輸入自己的登錄信息才可以進(jìn)行登錄,用戶輸入的信息準(zhǔn)確無誤后才可以進(jìn)入到操作系統(tǒng)界面,進(jìn)行功能模塊的相對(duì)應(yīng)操作,如果用戶輸入的信息不正確,則窗口出現(xiàn)提示框,用戶登錄失敗,返回到第一步進(jìn)行重新輸入,如圖3-1所示。
圖3-1登錄操作流程圖
?
3.4.2信息添加流程
對(duì)于食堂預(yù)約訂餐系統(tǒng)小程序,需要隨時(shí)添加所需要的數(shù)據(jù)信息,對(duì)于用戶添加信息,需要根據(jù)添加界面,根據(jù)選框的內(nèi)容進(jìn)行填寫所要添加的數(shù)據(jù)信息,信息輸入完成后判斷數(shù)據(jù)信息是否符合要求,符合要求則添加完成,用戶所添加的信息不符合要求,則需要返回到第一步,重新輸入數(shù)據(jù)信息,再進(jìn)行判斷操作,如圖3-2所示。
?
圖3-2 信息添加流程圖
3.4.3信息刪除流程
不管是哪個(gè)用戶角色進(jìn)入到不通的系統(tǒng)操作界面,都可以進(jìn)行不同的信息內(nèi)容的操作功能,對(duì)用系統(tǒng)數(shù)據(jù)信息的刪除,用戶一旦將信息刪除,那么該刪除的數(shù)據(jù)信息將無法恢復(fù),所以用戶在對(duì)數(shù)據(jù)刪除事,一定判斷刪除的內(nèi)容是否是確定要?jiǎng)h除的,確定無誤后選擇確定刪除操作,如圖3-3所示。
?
圖3-3?信息刪除流程圖
第四章 系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
4.1系統(tǒng)架構(gòu)設(shè)計(jì)
食堂預(yù)約訂餐系統(tǒng)小程序的系統(tǒng)項(xiàng)目的概述設(shè)計(jì)分析,主要內(nèi)容食堂預(yù)約訂餐系統(tǒng)信息的具體分析,進(jìn)行數(shù)據(jù)庫(kù)的是設(shè)計(jì),數(shù)據(jù)采用mysql數(shù)據(jù)庫(kù),并且對(duì)于系統(tǒng)的設(shè)計(jì)采用比較人性化的操作設(shè)計(jì),對(duì)于系統(tǒng)出現(xiàn)的錯(cuò)誤信息可以及時(shí)做出處理及反饋。
基于食堂預(yù)約訂餐系統(tǒng)小程序的設(shè)計(jì)基于現(xiàn)有的手機(jī),可以實(shí)現(xiàn)管理員:首頁(yè)、站點(diǎn)管理(輪播圖、公告欄)用戶管理(管理員、普通用戶)內(nèi)容管理(美食資訊、資訊分類)更多管理(食堂菜譜、菜品分類、訂單中心、取消訂單、用戶催單)等功能。方便用戶對(duì)首頁(yè)、食堂菜譜、訂單中心、取消訂單、美食資訊、我的等詳細(xì)的了解及統(tǒng)計(jì)分析。根據(jù)系統(tǒng)功能需求建立的模塊關(guān)系圖如下圖:
?
圖4-1管理員功能模塊圖
4.2開發(fā)流程設(shè)計(jì)
食堂預(yù)約訂餐系統(tǒng)小程序的開發(fā)對(duì)管理模塊和系統(tǒng)使用的數(shù)據(jù)庫(kù)進(jìn)行分析,編寫代開發(fā),規(guī)劃和操作是構(gòu)建信息管理應(yīng)用程序的必要三步曲,它決定了系統(tǒng)是否能夠真正實(shí)現(xiàn)預(yù)設(shè)功能以及是否可以在成功設(shè)計(jì)后實(shí)施。在開發(fā)過程中,每個(gè)階段必須嚴(yán)格按照線性順序進(jìn)行開發(fā),并且在相應(yīng)階段生成的每個(gè)工作都可以通過技術(shù)進(jìn)行驗(yàn)證和檢查。確保一個(gè)階段完成后是正確的,不會(huì)造成下一階段拖拽現(xiàn)象,使系統(tǒng)完成設(shè)計(jì)功能后得到保證。
從食堂預(yù)約訂餐系統(tǒng)小程序的成功開發(fā)經(jīng)驗(yàn)來看,上述方法效果最為明顯,最大程度地降低了系統(tǒng)開發(fā)的復(fù)雜性。如圖4-2所示。
?
圖4-2開發(fā)系統(tǒng)流程圖
4.3數(shù)據(jù)庫(kù)設(shè)計(jì)
數(shù)據(jù)庫(kù)是信息系統(tǒng)的基礎(chǔ)和核心。數(shù)據(jù)庫(kù)設(shè)計(jì)的好壞直接影響到信息系統(tǒng)開發(fā)的成敗。創(chuàng)建數(shù)據(jù)庫(kù)表首先確定實(shí)體的屬性和實(shí)體之間的關(guān)系。根據(jù)關(guān)系創(chuàng)建一個(gè)數(shù)據(jù)表。
4.3.1實(shí)體ER圖
數(shù)據(jù)庫(kù)是整個(gè)軟件編程中最重要的一個(gè)步驟,對(duì)于數(shù)據(jù)庫(kù)問題主要是判定數(shù)據(jù)庫(kù)的數(shù)量和結(jié)構(gòu)公式的創(chuàng)建。展示系統(tǒng)使用的是Mysql進(jìn)行對(duì)數(shù)據(jù)庫(kù)進(jìn)行管理,進(jìn)行保證數(shù)據(jù)的安全性、穩(wěn)定性等。
概念模型的設(shè)計(jì)是為了抽象真實(shí)世界的信息,并對(duì)信息世界進(jìn)行建模。它是數(shù)據(jù)庫(kù)設(shè)計(jì)的強(qiáng)大工具。數(shù)據(jù)庫(kù)概念模型設(shè)計(jì)可以通過E-R圖描述現(xiàn)實(shí)世界的概念模型。系統(tǒng)的E-R圖顯示了系統(tǒng)中實(shí)體之間的鏈接。而且Mysql數(shù)據(jù)庫(kù)是自我保護(hù)能力比較強(qiáng)的數(shù)據(jù)庫(kù),下圖主要是對(duì)數(shù)據(jù)庫(kù)實(shí)體的E-R圖:
(1) ?用戶信息E-R圖,如圖4-3所示:
?
圖4-3 用戶信息實(shí)體屬性圖
?(2)?食堂菜譜信息E-R圖如圖4-4所示:
?
圖4-4食堂菜譜信息實(shí)體圖
這些功能可以充分滿足食堂預(yù)約訂餐系統(tǒng)小程序的需求。此系統(tǒng)功能較為全面如下圖系統(tǒng)功能結(jié)構(gòu)如圖4-5所示。
?????????????????????????????????
?
圖4-5系統(tǒng)功能結(jié)構(gòu)圖
4.3.2數(shù)據(jù)表
我們可以根據(jù)數(shù)據(jù)結(jié)構(gòu)的詳細(xì)分析要求,我們根據(jù)輸入和輸出數(shù)據(jù)量的要求進(jìn)行分析,確定什么表表,結(jié)構(gòu)之間的關(guān)系,我們可以驗(yàn)證,調(diào)整和完善,查詢和瀏覽過程,可以實(shí)現(xiàn)數(shù)據(jù)庫(kù),以使用戶對(duì)數(shù)據(jù)和功能有更多要求。
基于系統(tǒng)使用的數(shù)據(jù)庫(kù)管理系統(tǒng)的特點(diǎn),對(duì)數(shù)據(jù)庫(kù)的概念模型進(jìn)行了轉(zhuǎn)換和構(gòu)建。但是,這個(gè)系統(tǒng)只需要充分考慮食堂預(yù)約訂餐系統(tǒng)小程序的功能,而且組織比較清晰。
user_reminder表:
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| user_reminder_id | int | 11 | 是 | 是 | 用戶催單ID |
| order_number | varchar | 64 | 否 | 否 | 訂單號(hào) |
| dish_name | varchar | 64 | 否 | 否 | 菜品名稱 |
| purchase_user | int | 11 | 否 | 否 | 購(gòu)買用戶 |
| reservation_information | text | 0 | 否 | 否 | 預(yù)約信息 |
| reminder_content | text | 0 | 否 | 否 | 催單內(nèi)容 |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| create_time | datetime | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
ordinary_users表:
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| ordinary_users_id | int | 11 | 是 | 是 | 普通用戶ID |
| full_name | varchar | 64 | 否 | 否 | 姓名 |
| gender | varchar | 64 | 否 | 否 | 性別 |
| 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í)間 |
order_center表:
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| order_center_id | int | 11 | 是 | 是 | 訂單中心ID |
| order_number | varchar | 64 | 否 | 否 | 訂單號(hào) |
| dish_name | varchar | 64 | 否 | 否 | 菜品名稱 |
| dish_classification | varchar | 64 | 否 | 否 | 菜品分類 |
| price | varchar | 64 | 否 | 否 | 價(jià)格 |
| number_of_purchases | int | 11 | 否 | 否 | 購(gòu)買數(shù) |
| total | varchar | 64 | 否 | 否 | 合計(jì) |
| purchase_user | int | 11 | 否 | 否 | 購(gòu)買用戶 |
| reservation_information | text | 0 | 否 | 否 | 預(yù)約信息 |
| pay_state | varchar | 16 | 是 | 否 | 支付狀態(tài) |
| pay_type | varchar | 16 | 否 | 否 | 支付類型: 微信、支付寶、網(wǎng)銀 |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| create_time | datetime | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
dish_classification表:
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| dish_classification_id | int | 11 | 是 | 是 | 菜品分類ID |
| dish_classification | varchar | 64 | 否 | 否 | 菜品分類 |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| create_time | datetime | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
canteen_menu表:
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| canteen_menu_id | int | 11 | 是 | 是 | 食堂菜譜ID |
| dish_name | varchar | 64 | 否 | 否 | 菜品名稱 |
| dish_classification | varchar | 64 | 否 | 否 | 菜品分類 |
| dish_pictures | varchar | 255 | 否 | 否 | 菜品圖片 |
| price | int | 11 | 否 | 否 | 價(jià)格 |
| stock | int | 11 | 否 | 否 | 庫(kù)存 |
| dish_details | text | 0 | 否 | 否 | 菜品詳情 |
| hits | int | 11 | 是 | 否 | 點(diǎn)擊數(shù) |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| create_time | datetime | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
cancellation_of_order表:
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| cancellation_of_order_id | int | 11 | 是 | 是 | 取消訂單ID |
| order_number | varchar | 64 | 否 | 否 | 訂單號(hào) |
| dish_name | varchar | 64 | 否 | 否 | 菜品名稱 |
| number_of_purchases | varchar | 64 | 否 | 否 | 購(gòu)買數(shù) |
| total | varchar | 64 | 否 | 否 | 合計(jì) |
| purchase_user | int | 11 | 否 | 否 | 購(gòu)買用戶 |
| contact_number | varchar | 16 | 否 | 否 | 聯(lián)系電話 |
| order_status | varchar | 64 | 否 | 否 | 訂單狀態(tài) |
| reason_for_cancellation | text | 0 | 否 | 否 | 取消原由 |
| merchant_reply | text | 0 | 否 | 否 | 商家回復(fù) |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| create_time | datetime | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
第五章 系統(tǒng)實(shí)現(xiàn)
5.1用戶前臺(tái)功能前臺(tái)(前端)?
食堂預(yù)約訂餐系統(tǒng)小程序登錄界面,通過填寫賬號(hào)、密碼、登錄用戶類型等信息進(jìn)行登錄,如圖5-1所示。
?
圖5-1登錄界面圖
注冊(cè),通過填寫用戶名、密碼、姓名、手機(jī)、郵箱、身份等信息,輸入完成后選擇提交即可注冊(cè)成功,如圖5-2所示。
?
圖5-2注冊(cè)界面圖
注冊(cè)關(guān)鍵代碼如下所示。
/**
?????* 注冊(cè)
?????* @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]用戶獲取其他與用戶相關(guān)的數(shù)據(jù)
?????*/
????@Id
????@GeneratedValue(strategy = GenerationType.IDENTITY)
????@Column(name = "user_id")
????private Integer userId;
????/**
?????* 賬戶狀態(tài):[0,10](1可用|2異常|3已凍結(jié)|4已注銷)
?????*/
????@Basic
????@Column(name = "state")
????private Integer state;
????/**
?????* 所在用戶組:[0,32767]決定用戶身份和權(quán)限
?????*/
????@Basic
????@Column(name = "user_group")
????private String userGroup;
????/**
?????* 上次登錄時(shí)間:
?????*/
????@Basic
????@Column(name = "login_time")
????private Timestamp loginTime;
????/**
?????* 手機(jī)號(hào)碼:[0,11]用戶的手機(jī)號(hào)碼,用于找回密碼時(shí)或登錄時(shí)
?????*/
????@Basic
????@Column(name = "phone")
????private String phone;
????/**
?????* 手機(jī)認(rèn)證:[0,1](0未認(rèn)證|1審核中|2已認(rèn)證)
?????*/
????@Basic
????@Column(name = "phone_state")
????private Integer phoneState;
????/**
?????* 用戶名:[0,16]用戶登錄時(shí)所用的賬戶名稱
?????*/
????@Basic
????@Column(name = "username")
????private String username;
????/**
?????* 昵稱:[0,16]
?????*/
????@Basic
????@Column(name = "nickname")
????private String nickname;
????/**
?????* 密碼:[0,32]用戶登錄所需的密碼,由6-16位數(shù)字或英文組成
?????*/
????@Basic
????@Column(name = "password")
????private String password;
????/**
?????* 郵箱:[0,64]用戶的郵箱,用于找回密碼時(shí)或登錄時(shí)
?????*/
????@Basic
????@Column(name = "email")
????private String email;
????/**
?????* 郵箱認(rèn)證:[0,1](0未認(rèn)證|1審核中|2已認(rèn)證)
?????*/
????@Basic
????@Column(name = "email_state")
????private Integer emailState;
????/**
?????* 頭像地址:[0,255]
?????*/
????@Basic
????@Column(name = "avatar")
????private String avatar;
????/**
?????* 創(chuàng)建時(shí)間:
?????*/
????@Basic
????@Column(name = "create_time")
????@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
????private Timestamp createTime;
????@Basic
????@Transient
????private String code;
}
用戶登錄進(jìn)入首頁(yè),可以進(jìn)行首頁(yè)、美食資訊、食堂菜譜、我的等功能模塊的查看與操作,如圖5-3所示。
?
?
圖5-3系統(tǒng)首頁(yè)界面圖
美食資訊信息,在美食資訊信息頁(yè)面可以查看公告標(biāo)題、類型、圖片、發(fā)布日期、點(diǎn)贊等信息,如圖5-4所示。
?
圖5-4資訊信息界面圖
我的信息,在我的信息頁(yè)面可以填寫普通用戶、訂單中心、取消訂單、用戶催單等信息,如圖5-5所示。
?
圖5-5我的信息界面圖
5.2管理員功能模塊(后端)??
管理員登錄,管理員通過輸入用戶名、密碼,選擇角色并點(diǎn)擊登錄進(jìn)行系統(tǒng)登錄操作,如圖5-6所示。
?
圖5-6管理員登錄界圖面
管理員登錄關(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("已通過")){
????????????????return error(30000,"該用戶審核未通過");
????????????}
????????}
????????//查詢用戶狀態(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)或密碼不正確");
????????}
}
在管理員功能頁(yè)面可以查看管理員:首頁(yè)、站點(diǎn)管理(輪播圖、公告欄)用戶管理(管理員、普通用戶)內(nèi)容管理(美食資訊、資訊分類)更多管理(食堂菜譜、菜品分類、訂單中心、取消訂單、用戶催單)等內(nèi)容進(jìn)行相對(duì)應(yīng)操作,如圖5-7所示。
?
圖5-7管理員功能界面圖
管理員功能關(guān)鍵代碼如下所示。
@RequestMapping(value = {"/sum_group", "/sum"})
????public Map<String, Object> sum(HttpServletRequest request) {
????????Query count = service.sum(service.readQuery(request), service.readConfig(request));
????????return success(count.getResultList());
}
用戶管理,在用戶管理頁(yè)面可以查看索引、昵稱、用戶名、密碼、姓名、性別、頭像等信息,并可根據(jù)需要進(jìn)行修改或刪除操作,如圖5-8所示。
?
圖5-8用戶管理界面圖
用戶管理就代碼如下所示。
@RequestMapping(value = {"/count_group", "/count"})
????public Map<String, Object> count(HttpServletRequest request) {
????????Query count = service.count(service.readQuery(request), service.readConfig(request));
????????return success(count.getResultList());
}
食堂菜譜管理,在食堂菜譜管理頁(yè)面可以查看索引、菜品名稱、菜品分類、菜品圖片、價(jià)格、庫(kù)存、菜品詳情等信息,并可根據(jù)需要進(jìn)行查看評(píng)論、修改或刪除操作,如圖5-9所示。
?
圖5-9食堂菜譜管理界面圖
食堂菜譜管理關(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();
????}
用戶催單管理,在用戶催單信息管理頁(yè)面查看用戶訂單號(hào)、菜品名稱、購(gòu)買用戶、預(yù)約信息、催單內(nèi)容等信息,如圖5-10所示。
?
圖5-10用戶催單管理界面圖
用戶催單管理關(guān)鍵代碼如下所示。
@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 "";
????}
第六章 ?系統(tǒng)的測(cè)試
6.1 測(cè)試目的
程序設(shè)計(jì)不能保證沒有錯(cuò)誤,這是一個(gè)開發(fā)過程,在錯(cuò)誤或錯(cuò)誤的過程中難以避免,這是不可避免的,但我們不能使這些錯(cuò)誤始終存在于系統(tǒng)中,錯(cuò)誤可能會(huì)造成無法估量的后果 如系統(tǒng)崩潰,安全信息,系統(tǒng)無法正常啟動(dòng),導(dǎo)致安裝用戶手機(jī)屏幕等,為了避免這些問題,我們需要測(cè)試程序,并發(fā)現(xiàn)這些問題,并糾正它們 ,并使系統(tǒng)更長(zhǎng)時(shí)間穩(wěn)定成熟,本章的作用是發(fā)現(xiàn)這些問題,并對(duì)其進(jìn)行修改,雖然耗時(shí)費(fèi)力,但長(zhǎng)期非常重要和必要系統(tǒng)的開發(fā)。
軟件測(cè)試與開發(fā)過程是一樣的,都必須按照軟件工程的正規(guī)原理進(jìn)行,遵守管理學(xué)理論。不過,目前國(guó)內(nèi)的軟件測(cè)試已經(jīng)積累了大量經(jīng)驗(yàn)和方法,步驟相對(duì)成熟,軟件測(cè)試的效率也越來越高。
食堂預(yù)約訂餐系統(tǒng)小程序的實(shí)現(xiàn),對(duì)于系統(tǒng)中功能模塊的實(shí)現(xiàn)及操作都必須通過測(cè)試進(jìn)行來評(píng)判系統(tǒng)是否可以準(zhǔn)確的實(shí)現(xiàn)。在食堂預(yù)約訂餐系統(tǒng)小程序正式上傳使用之前必須做的一步就是系統(tǒng)測(cè)試,對(duì)于測(cè)試發(fā)現(xiàn)的錯(cuò)誤及時(shí)修改處理,保證系統(tǒng)準(zhǔn)確無誤的供給用戶使用。
6.2?測(cè)試方案設(shè)計(jì)
6.2.1 測(cè)試策略
1、功能測(cè)試
從用戶的角度來看,測(cè)試時(shí)不了解新開發(fā)軟件的內(nèi)部結(jié)構(gòu),因此可以將系統(tǒng)與黑匣子進(jìn)行比較,盲目輸入后可以查看系統(tǒng)給出的反饋。這種測(cè)試屬于黑盒測(cè)試,在測(cè)試中如果輸入錯(cuò)誤信息系統(tǒng)會(huì)報(bào)錯(cuò)。
2、性能測(cè)試
測(cè)試軟件程序的整體狀況(稱為性能測(cè)試)通常使用自動(dòng)化測(cè)試工具來檢測(cè)系統(tǒng)的整體功能,在負(fù)載測(cè)試和壓力測(cè)試之間進(jìn)行分配,在某些情況下,將這兩種情況結(jié)合起來。雖然壓力測(cè)試可以檢測(cè)到系統(tǒng)可以提供的最高級(jí)別的服務(wù),但負(fù)載測(cè)試可以測(cè)試系統(tǒng)如何響應(yīng)增加的負(fù)載。
6.2.2 測(cè)試分析
測(cè)試評(píng)估系統(tǒng)質(zhì)量的方法不局限于系統(tǒng)編碼和過程,應(yīng)該與軟件設(shè)計(jì)工作和歷史需求分析密切相關(guān)。
軟件測(cè)試應(yīng)遵循以下原則:
(1)軟件測(cè)試應(yīng)盡快進(jìn)行,整個(gè)測(cè)試部分應(yīng)在軟件開發(fā)和設(shè)計(jì)的整個(gè)過程中進(jìn)行。如發(fā)現(xiàn)錯(cuò)誤,立即處理,將大大減少軟件開發(fā)的時(shí)間,并提高軟件的質(zhì)量。
(2)在軟件的各種測(cè)試中,測(cè)試過程中使用的計(jì)劃、報(bào)告等應(yīng)妥善處理和存儲(chǔ)。其主要目的是為了便于以后系統(tǒng)的維護(hù)。
(3)軟件測(cè)試整個(gè)過程中的聚類現(xiàn)象應(yīng)優(yōu)先考慮。
(4)對(duì)于軟件測(cè)試,我們應(yīng)該盡量不去和自己設(shè)計(jì)的系統(tǒng)進(jìn)行參考,而是要測(cè)試對(duì)方的程序,以確保軟件測(cè)試結(jié)果的客觀性和公平性。
(5)整個(gè)測(cè)試計(jì)劃嚴(yán)格按照軟件測(cè)試的具體實(shí)施細(xì)則進(jìn)行。
(6)對(duì)整個(gè)測(cè)試結(jié)果進(jìn)行綜合檢查,盡量避免重復(fù)錯(cuò)誤。
本食堂預(yù)約訂餐系統(tǒng)小程序滿足用戶的要求和需求,本食堂預(yù)約訂餐系統(tǒng)小程序的使用能夠有效的提高用戶的使用率。
6.3?測(cè)試結(jié)果
測(cè)試后得到的性能和用例,系統(tǒng)具有足夠的正確性、可靠性、穩(wěn)定性,并且可以對(duì)輸入數(shù)據(jù)進(jìn)行準(zhǔn)確的點(diǎn)擊操作處理和響應(yīng)測(cè)試用戶的體驗(yàn)也得到了很好的反饋和響應(yīng)時(shí)間。合理的范圍,可以兼容所有主流瀏覽器,設(shè)計(jì)所需的效果。
結(jié) ?論
在這個(gè)設(shè)計(jì)中,我花了大量的時(shí)間去理解系統(tǒng)開發(fā)中使用的知識(shí),經(jīng)過這段時(shí)間的努力工作最終完成了系統(tǒng)設(shè)計(jì)。通過這一階段的學(xué)習(xí),我發(fā)現(xiàn)了自己的不足,充分掌握了必要的應(yīng)用技能,進(jìn)一步的學(xué)習(xí)使我充實(shí)了自己的知識(shí)基礎(chǔ),完成了這個(gè)艱巨的任務(wù)。當(dāng)遇到問題時(shí),我很及時(shí)的尋求老師的幫助,通過專業(yè)的網(wǎng)站來解決,他們的幫助讓我一步一步的成功克服了困難的問題。系統(tǒng)設(shè)計(jì)過程不容易,你需要不斷充實(shí)自己,有勇氣克服困難。系統(tǒng)開發(fā)的一些功能還不完善,需要繼續(xù)改善后,通過用戶體驗(yàn)來修改設(shè)計(jì)完美的系統(tǒng),讓用戶得到更好的體驗(yàn),我覺得很高興,因?yàn)檫@是我第一次通過自己的努力實(shí)現(xiàn)這個(gè)系統(tǒng),但絕不是我的最后一個(gè),在未來我將努力實(shí)現(xiàn)更多的優(yōu)秀的系統(tǒng)。
在一些編程語(yǔ)言的系統(tǒng)實(shí)現(xiàn)中,對(duì)詞匯表不太熟悉,導(dǎo)致了開發(fā)的困難,但是我通過了合適的字典軟件來解決這個(gè)大問題。由此,我學(xué)會(huì)了自己的英語(yǔ)缺陷。在那之后,我不斷地提高自己的英語(yǔ)知識(shí),這樣我就不會(huì)有任何未來的工作和生活。畢業(yè)設(shè)計(jì)過程我感覺很深刻,從一開始就不熟悉開發(fā)技術(shù),一步一步的使用,接觸到文獻(xiàn)和信息,不難理解,系統(tǒng)是一次又一次的實(shí)現(xiàn),系統(tǒng)本身對(duì)于在線學(xué)習(xí)是有用的。我從這個(gè)設(shè)計(jì)中獲益良多,論文的編寫需要有自己的意愿去實(shí)現(xiàn)一點(diǎn),學(xué)習(xí)生活中所有的問題的勇氣,學(xué)習(xí)的過程就是學(xué)習(xí)的過程。畢業(yè)設(shè)計(jì),我學(xué)會(huì)了將理論知識(shí)應(yīng)用于實(shí)踐。讓我知道該怎么做,我們必須認(rèn)真對(duì)待。勇于克服困難,相信未來,我會(huì)做得更好。
參考文獻(xiàn)
[1]高天搏,劉偉.基于微信小程序的食堂訂餐系統(tǒng)[J].科學(xué)技術(shù)創(chuàng)新,2021(29):74-76.
[2]劉帥,姜旭濤,劉進(jìn)芬.基于微信小程序的智能食堂系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2021(09):60-62.
[3]于莉,張哲坤,白天.基于微信小程序的高校就餐食堂管理與開發(fā)[J].電子世界,2021(14):204-205.
[4]丁文,李婷婷.高校食堂早餐配送服務(wù):現(xiàn)實(shí)背景、市場(chǎng)態(tài)勢(shì)與實(shí)現(xiàn)策略——基于云南部分高校的校園調(diào)查[J].統(tǒng)計(jì)與管理,2021,36(08):103-108.
[5]彭玉嬌. 智慧治理視角下網(wǎng)絡(luò)訂餐食品安全監(jiān)管平臺(tái)建設(shè)研究[D].南昌大學(xué),2021.
[6]張生霞,王瓊,李雯雯,武文科,韓圓圓,李艷梅.“一點(diǎn)就到餐”——基于微信小程序的校園食堂訂餐服務(wù)系統(tǒng)[J].電腦知識(shí)與技術(shù),2021,17(18):258-260.
[7]劉婧莉,常賢發(fā).智慧食堂用餐管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].電腦編程技巧與維護(hù),2021(04):90-92.
[8]杜港.微信小程序在醫(yī)院患者訂餐中的應(yīng)用[J].中國(guó)醫(yī)院建筑與裝備,2021,22(04):83-84.
[9]陳江輝,於立杰,李強(qiáng).智慧校園食堂訂餐系統(tǒng)信息化平臺(tái)的設(shè)計(jì)[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2021(03):43-44.
[10]李含陽(yáng),宮千千,張宇新.“互聯(lián)網(wǎng)+”模式下大學(xué)生群體網(wǎng)絡(luò)訂餐現(xiàn)狀及問題研究[J].文化創(chuàng)新比較研究,2020,4(24):118-120.
[11]周亞楠,張佳儀,任雨杰,史文娟.基于大數(shù)據(jù)理論指導(dǎo)下的高校食堂點(diǎn)餐微信小程序功能設(shè)計(jì)[J].電腦知識(shí)與技術(shù),2019,15(34):55-59+68.
[12] “訂餐APP”攻占校園,需要防堵嗎?[N]. 西安日?qǐng)?bào),2015-11-24(007).
[13] The 'Villa dei Gordiani' Project The so-called 'Villa dei Gordiani' at the 3?? mile of the Via Prenestina[J]. Bullettino della Commissione Archeologica Comunale di Roma,2018,109:
[14]莊媛媛,周蕓,李鶴. 病人電子訂餐系統(tǒng)的應(yīng)用[C]//中國(guó)營(yíng)養(yǎng)學(xué)會(huì)第八屆臨床營(yíng)養(yǎng)學(xué)術(shù)會(huì)議暨第三屆營(yíng)養(yǎng)與腫瘤會(huì)議論文摘要匯編.,2018:150.
[15]Ugolini Daniela,Pardies Céline. L'éVOLUTION TOPOGRAPHIQUE DE L'HABITAT D'AGàTHE (AGDE, F) (VI? S. AV. J.-C. - I?? S. APR. J.-C.)[J]. Archeologia Classica,2018,69:
致 ?謝
食堂預(yù)約訂餐系統(tǒng)小程序的完成,如何實(shí)現(xiàn)的更好,其中付出的努力是很大的,這段時(shí)光將會(huì)終身難忘。
食堂預(yù)約訂餐系統(tǒng)小程序的設(shè)計(jì)可以順利完成,首先,我要感謝我的指導(dǎo)老師,他在我遇到設(shè)計(jì)問題時(shí)及時(shí)幫助了我,并在我對(duì)設(shè)計(jì)感到困惑時(shí)給了我充分的指導(dǎo)。在他的幫助下,我可以完成高質(zhì)量的畢業(yè)設(shè)計(jì)。在食堂預(yù)約訂餐系統(tǒng)小程序的設(shè)計(jì)和開發(fā)中,指導(dǎo)老師提出了許多實(shí)用的意見和建議,并為我提供了大量相關(guān)的研究資料,使我對(duì)設(shè)計(jì)有了更深入的了解。只有在老師的指導(dǎo)下,才能在畢業(yè)設(shè)計(jì)中取得成功。在此,我要向指導(dǎo)老師表示深深的謝意。
在此,我還要感謝我的同學(xué)們,他們?yōu)槲业脑O(shè)計(jì)提供了許多參考意見,并與我討論了設(shè)計(jì)中的問題,從而使我的設(shè)計(jì)一步一步走向成熟。 ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ?點(diǎn)贊+收藏+關(guān)注??→? 私信領(lǐng)取本源代碼、數(shù)據(jù)庫(kù)
總結(jié)
以上是生活随笔為你收集整理的小程序springboot食堂预约订餐系统毕业设计-附源码221554的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python中5种下划线的含义
- 下一篇: 计算机网络多项式的定义,使用多项式方法定