健康飲食小程序的設(shè)計(jì)與實(shí)現(xiàn)
摘?要
本文設(shè)計(jì)了一種基于微信小程序的健康飲食小程序小程序,系統(tǒng)為人們提供了方便快捷、即用即搜的健康食譜服務(wù),包括健康食譜,醫(yī)療資訊、注冊(cè)登錄等,用戶(hù)能夠方便快捷地查看資訊、搜索健康方面得食譜、還能了解各食物科普等。健康飲食小程序采取面對(duì)對(duì)象的開(kāi)發(fā)模式進(jìn)行軟件的開(kāi)發(fā)和硬體的架設(shè),能很好的滿(mǎn)足實(shí)際使用的需求,完善了對(duì)應(yīng)的軟體架設(shè)以及程序編碼的工作,采取MySQL作為后臺(tái)數(shù)據(jù)的主要存儲(chǔ)單元,采用Spring boot框架、JSP技術(shù)、Ajax技術(shù)進(jìn)行業(yè)務(wù)系統(tǒng)的編碼及其開(kāi)發(fā),實(shí)現(xiàn)了小程序內(nèi)的全部功能。本次報(bào)告,首先分析了研究的背景、作用、意義,為研究工作的合理性打下了基礎(chǔ)。
關(guān)鍵詞:小程序;Springboot框架;MySQL數(shù)據(jù)庫(kù)
Design and implementation of healthy diet appletAbstract
This paper designs a healthy diet applet based on wechat applet. The system provides people with convenient and fast, use and search Health recipe services, including health recipes, medical information, registration and login. Users can easily and quickly view information, search health recipes, and understand various food science popularization. The healthy diet applet adopts the object-oriented development mode for software development and hardware erection, which can well meet the needs of actual use, improve the corresponding software erection and program coding, take MySQL as the main storage unit of background data, and adopt spring boot framework, JSP technology and Ajax technology for business system coding and development, All functions in the applet are realized. This report first analyzes the background, function and significance of the research, which lays a foundation for the rationality of the research work.
Key words:applet; The Springboot?framework; The MySQL database
目 ?錄
第1章 緒論
1.1?研究背景與意義
1.2?系統(tǒng)優(yōu)點(diǎn)
1.3?論文組成結(jié)構(gòu)
第2章 相關(guān)技術(shù)介紹
2.1?J2EE技術(shù)
2.2 MVVM模式
2.3 B/S結(jié)構(gòu)
2.4 Springboot框架
2.5?Mysql數(shù)據(jù)庫(kù)
2.6小程序框架以及目錄結(jié)構(gòu)介紹
2.6 B/S體系工作原理
第3章 系統(tǒng)分析
3.1?可行性分析
3.2?功能需求分析
3.2.1?前臺(tái)用戶(hù)功能
3.2.2?后臺(tái)管理員功能
3.3?非功能需求分析
3.4?安全性需求分析
3.4.1?系統(tǒng)的安全性
3.4.2?數(shù)據(jù)的安全性
3.5?數(shù)據(jù)流程分析
第4章 系統(tǒng)設(shè)計(jì)
4.1?系統(tǒng)架構(gòu)設(shè)計(jì)
4.2?系統(tǒng)總體設(shè)計(jì)
4.3?系統(tǒng)功能設(shè)計(jì)
4.4?數(shù)據(jù)庫(kù)設(shè)計(jì)
4.4.1?數(shù)據(jù)需求分析
4.4.2?數(shù)據(jù)庫(kù)概念設(shè)計(jì)
4.4.3?數(shù)據(jù)庫(kù)表設(shè)計(jì)
第5章 系統(tǒng)實(shí)現(xiàn)
5.1?注冊(cè)模塊的實(shí)現(xiàn)
5.2?登錄模塊的實(shí)現(xiàn)
5.3?用戶(hù)資料修改模塊的實(shí)現(xiàn)
5.4?食物科普管理模塊的實(shí)現(xiàn)
5.5?醫(yī)療資訊模塊的實(shí)現(xiàn)
5.6?交流中心管理模塊的實(shí)現(xiàn)
第6章 系統(tǒng)測(cè)試
6.1?測(cè)試目的
6.2?功能測(cè)試
6.3?性能測(cè)試
第7章 總結(jié)與展望
參考文獻(xiàn)
致謝
-
緒論
- 研究背景與意義
人們生活水平的提高以及信息化技術(shù)的發(fā)展,使得人們?cè)絹?lái)越重視健康,用戶(hù)希望能夠?qū)ψ约航诘娘嬍硜?lái)進(jìn)行有關(guān)營(yíng)養(yǎng)健康分析,如果人們?nèi)狈I(yíng)養(yǎng)元素,那么就需要通過(guò)食物的購(gòu)買(mǎi)以便可以及時(shí)補(bǔ)充相應(yīng)的營(yíng)養(yǎng)元素。為了滿(mǎn)足用戶(hù)的需求,所以開(kāi)發(fā)一個(gè)健康飲食小程序是迫切需要的。
隨著現(xiàn)代科技的飛速發(fā)展,一方面,以智能手機(jī)作為背景,迅速在國(guó)內(nèi)發(fā)展起來(lái)。另一方面,人們的營(yíng)養(yǎng)健康狀況對(duì)國(guó)民的素質(zhì)以及國(guó)家的未來(lái)都有很大的影響?,F(xiàn)代的社會(huì)生活方式使得大多數(shù)人都處于一種亞健康狀態(tài),所以良好的營(yíng)養(yǎng)搭配可以促進(jìn)身體健康生長(zhǎng)。然而,為了促進(jìn)新一代年輕人可以一個(gè)養(yǎng)成良好的飲食習(xí)慣,就需要在業(yè)余時(shí)間給國(guó)民多增加點(diǎn)營(yíng)養(yǎng)知識(shí),這樣呢,就可以普遍促進(jìn)人們的身體素質(zhì),進(jìn)而促進(jìn)人們的經(jīng)濟(jì)發(fā)展。在國(guó)際上,處于發(fā)達(dá)國(guó)家之中的一些國(guó)家,就拿美國(guó)、日本來(lái)說(shuō),他們將學(xué)校供餐通過(guò)規(guī)范化、標(biāo)準(zhǔn)化、法制化來(lái)進(jìn)行管理,對(duì)于這些發(fā)達(dá)國(guó)家,他們都有著很多年的營(yíng)養(yǎng)教育史,面對(duì)著人們的呼聲高漲,飲食健康對(duì)于活在當(dāng)下的人們來(lái)說(shuō)相當(dāng)重要。因此,開(kāi)發(fā)的健康飲食小程序的設(shè)計(jì)具有一定的重要理論和實(shí)踐意義。
-
- 系統(tǒng)優(yōu)點(diǎn)
微信小程序的開(kāi)發(fā)框架實(shí)現(xiàn)了簡(jiǎn)單高效的開(kāi)發(fā)方式,整體的系統(tǒng)框架由邏輯層、視圖層兩部分組成。邏輯層使用Java語(yǔ)言描述,視圖層使用Wxml 語(yǔ)言和 Wxss 語(yǔ)言描述。邏輯層與視圖層可以進(jìn)行數(shù)據(jù)、事件的通信。響應(yīng)的數(shù)據(jù)綁定系統(tǒng)是微信小程序的框架核心,數(shù)據(jù)和視圖可以保持同步的更新??蚣芄芾碚麄€(gè)微信小程序的頁(yè)面路由,每個(gè)頁(yè)面有完整的生命周期,頁(yè)面之間可以切換。
-
- 論文組成結(jié)構(gòu)
根據(jù)市場(chǎng)調(diào)研得到的信息數(shù)據(jù),結(jié)合國(guó)內(nèi)外前沿研究,利用相關(guān)系統(tǒng)開(kāi)發(fā)和設(shè)計(jì)方法,最終設(shè)計(jì)出健康飲食小程序。
本文共有七章,如下所示。
第一章概述了健康飲食小程序的研究目的和意義,最后給出了論文的組成結(jié)構(gòu)。
第二章簡(jiǎn)要概述了本文所用的開(kāi)發(fā)技術(shù)和工具。
第三章簡(jiǎn)要對(duì)系統(tǒng)各業(yè)務(wù)流程進(jìn)行需求分析、可行性分析。
第四章對(duì)健康飲食小程序進(jìn)行設(shè)計(jì)。
第五章對(duì)健康飲食小程序進(jìn)行實(shí)現(xiàn),并貼出相關(guān)頁(yè)面截圖,語(yǔ)言描述出具體功能實(shí)現(xiàn)的操作方法。
第六章對(duì)健康飲食小程序采用測(cè)試用例的方式來(lái)對(duì)一些主要功能模塊測(cè)試,最后得出測(cè)試結(jié)果。
第七章總結(jié)全文并對(duì)未來(lái)的研究做出展望。
-
相關(guān)技術(shù)介紹
- J2EE技術(shù)
人可以掌握多門(mén)外語(yǔ),而一個(gè)計(jì)算機(jī)科學(xué)家精通的大多是編程語(yǔ)言,它不是人類(lèi)的自然語(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ù)方便。
-
- MVVM模式
MVVM模式是常用的開(kāi)發(fā)模式,主要是在代碼實(shí)現(xiàn)上將其分為M層、V層和C層。
視圖(View)代表用戶(hù)交互界面,一個(gè) Web 應(yīng)用就可能有很多的界面,在 MVVM?模式中,視圖僅僅處理的只有數(shù)據(jù)采集、處理,還有用戶(hù)的請(qǐng)求, 并不包括業(yè)務(wù)流程的處理,業(yè)務(wù)流程由模型(Model)來(lái)處理。
模型(Model)就是業(yè)務(wù)流程/狀態(tài)的處理及業(yè)務(wù)規(guī)則的制定。模型處理業(yè)務(wù)流程的過(guò)程其它層是無(wú)法看見(jiàn)了的,它就像黑箱子,在接受視圖請(qǐng)求的數(shù)據(jù)之后,然后返回最終的處理結(jié)果。MVVM?最主要的核心就是業(yè)務(wù)模型的設(shè)計(jì),一個(gè)典型的應(yīng)用例子就是目前流行的 EJB 模型,它從應(yīng)用技術(shù)實(shí)現(xiàn)的角度對(duì)模型做了進(jìn)一步的劃分,以便充分利用現(xiàn)有的組件,但是它不能作為應(yīng)用設(shè)計(jì)模型的框架。
控制器(Controller)可以理解為接收用戶(hù)的請(qǐng)求,然后視圖和模型匹配在一起,一起再完成用戶(hù)請(qǐng)求。它有非常明顯的作用在劃分控制層上,可以很清晰地告訴你,它就是一個(gè)分發(fā)器,選擇什么樣的模型、視圖,可以完成用戶(hù)的什么樣的請(qǐng)求??刂茖硬蛔鏊械臄?shù)據(jù)處理,比如說(shuō):用戶(hù)點(diǎn)擊一個(gè)連接,控制層接受到請(qǐng)求之后,并不處理業(yè)務(wù)信息,它只是向模型傳遞用戶(hù)的信息,同時(shí)告訴模型做什么,然后選擇符合需求的視圖返回給用戶(hù)。
-
- B/S結(jié)構(gòu)
B/S(Browser/Server)比前身架構(gòu)更為省事的架構(gòu)。它借助Web server完成數(shù)據(jù)的傳遞交流。只需要下載瀏覽器作為客戶(hù)端,那么工作就達(dá)到“瘦身”效果, 不需要考慮不停裝軟件的問(wèn)題。
-
- Spring boot框架
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ò)依賴(lài)注入實(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文件或類(lèi)上特定Java注解來(lái)配置對(duì)象,開(kāi)發(fā)者可以通過(guò)依賴(lài)查找或依賴(lài)注入來(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的集成,也可以滿(mǎn)足基本需求。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。
-
- Mysql數(shù)據(jù)庫(kù)
Mysql 經(jīng)過(guò)多次的更新,功能層面已經(jīng)非常的豐富和完善了,從Mysql4版本到5版本進(jìn)行了比較大的更新,在商業(yè)的實(shí)際使用中取得了很好的實(shí)際應(yīng)用效果。最新版本的Mysql支持對(duì)信息的壓縮,同時(shí)還能進(jìn)行加密能更好的滿(mǎn)足對(duì)信息安全性的需求。同時(shí)經(jīng)過(guò)系統(tǒng)的多次更新,數(shù)據(jù)庫(kù)自身的鏡像功能也得到了很大的增強(qiáng),運(yùn)行的流暢度和易用性方面有了不小的進(jìn)步,驅(qū)動(dòng)的使用和創(chuàng)建也更加的高效快捷。最大的變動(dòng)還是進(jìn)行了空間信息的顯示優(yōu)化,能更加方便的在應(yīng)用地圖上進(jìn)行坐標(biāo)的標(biāo)注和運(yùn)算。強(qiáng)大的備份功能也保證了用戶(hù)使用的過(guò)程會(huì)更加安心,同時(shí)支持的Office特性還支持用戶(hù)的自行安裝和使用。在信息的顯示形式上也進(jìn)行了不小的更新,增加了兩個(gè)非常使用的顯示區(qū),一個(gè)是信息區(qū),對(duì)表格和文字進(jìn)行了分類(lèi)處理,界面的顯示更加清爽和具體。第二是儀表的信息控件,能在儀表信息區(qū)進(jìn)行信息的顯示,同時(shí)還能進(jìn)行多個(gè)信息的比對(duì),為用戶(hù)的實(shí)際使用帶來(lái)了很大的便捷。
針對(duì)本文中設(shè)計(jì)的學(xué)生課程考試系統(tǒng)在實(shí)際的實(shí)現(xiàn)過(guò)程中,最終選擇Mysql數(shù)據(jù)庫(kù)的主要原因在于在企業(yè)的應(yīng)用系統(tǒng)應(yīng)用及開(kāi)發(fā)的過(guò)程中會(huì)存在大量的數(shù)據(jù)庫(kù)比較頻繁的操作,而且數(shù)據(jù)的安全性要求也是非常的高。綜合這些因素,最終選擇安全性系數(shù)比較高的Mysql來(lái)對(duì)校園競(jìng)賽管理系統(tǒng)后臺(tái)數(shù)據(jù)進(jìn)行存儲(chǔ)操作。
-
- 小程序框架以及目錄結(jié)構(gòu)介紹
整個(gè)小程序框架系統(tǒng)分為兩部分:邏輯層和視圖層。小程序開(kāi)發(fā)框架的目標(biāo)是通過(guò)盡可能簡(jiǎn)單、高效的方式讓開(kāi)發(fā)者可以在微信中開(kāi)發(fā)具有原生 小程序 體驗(yàn)的服務(wù)。小程序在視圖層與邏輯層間提供了數(shù)據(jù)傳輸和事件系統(tǒng),提供了自己的視圖層以及邏輯層框架,讓開(kāi)發(fā)者能夠?qū)W⒂跀?shù)據(jù)與邏輯??蚣艿暮诵氖且粋€(gè)響應(yīng)的數(shù)據(jù)綁定系統(tǒng),可以讓數(shù)據(jù)與視圖非常簡(jiǎn)單地保持同步。在邏輯層做數(shù)據(jù)修改,在視圖層就會(huì)做相應(yīng)的更新??蚣芴峁┝艘惶谆A(chǔ)的組件,這些組件自帶微信風(fēng)格的樣式以及特殊的邏輯,開(kāi)發(fā)者可以通過(guò)組合基礎(chǔ)組件,創(chuàng)建出強(qiáng)大的微信小程序 。
-
- B/S體系工作原理
B/S架構(gòu)采取瀏覽器請(qǐng)求,服務(wù)器響應(yīng)的工作模式。
用戶(hù)可以通過(guò)瀏覽器去訪問(wèn)Internet上由Web服務(wù)器產(chǎn)生的文本、數(shù)據(jù)、圖片、動(dòng)畫(huà)、視頻點(diǎn)播和聲音等信息;
而每一個(gè)Web服務(wù)器又可以通過(guò)各種方式與數(shù)據(jù)庫(kù)服務(wù)器連接,大量的數(shù)據(jù)實(shí)際存放在數(shù)據(jù)庫(kù)服務(wù)器中;
從Web服務(wù)器上下載程序到本地來(lái)執(zhí)行,在下載過(guò)程中若遇到與數(shù)據(jù)庫(kù)有關(guān)的指令,由Web服務(wù)器交給數(shù)據(jù)庫(kù)服務(wù)器來(lái)解釋執(zhí)行,并返回給Web服務(wù)器,Web服務(wù)器又返回給用戶(hù)。在這種結(jié)構(gòu)中,將許許多多的網(wǎng)連接到一塊,形成一個(gè)巨大的網(wǎng),即全球網(wǎng)。而各個(gè)企業(yè)可以在此結(jié)構(gòu)的基礎(chǔ)上建立自己的Internet。
在 B/S 模式中,用戶(hù)是通過(guò)瀏覽器針對(duì)許多分布于網(wǎng)絡(luò)上的服務(wù)器進(jìn)行請(qǐng)求訪問(wèn)的,瀏覽器的請(qǐng)求通過(guò)服務(wù)器進(jìn)行處理,并將處理結(jié)果以及相應(yīng)的信息返回給瀏覽器,其他的數(shù)據(jù)加工、請(qǐng)求全部都是由Web Server完成的。通過(guò)該框架結(jié)構(gòu)以及植入于操作系統(tǒng)內(nèi)部的瀏覽器,該結(jié)構(gòu)已經(jīng)成為了當(dāng)今軟件應(yīng)用的主流結(jié)構(gòu)模式。
-
系統(tǒng)分析
- 可行性分析
開(kāi)發(fā)任何一個(gè)系統(tǒng),都要對(duì)其可行性進(jìn)行分析,對(duì)其時(shí)間和資源上的限制進(jìn)行考慮,這樣可以減少系統(tǒng)開(kāi)發(fā)的風(fēng)險(xiǎn)。同時(shí),分析之后不僅能夠合理的運(yùn)用人力,還能在各方面資源的消耗上得到節(jié)省。下面就對(duì)技術(shù)、經(jīng)濟(jì)和社會(huì)三個(gè)方面來(lái)介紹。
實(shí)用性方面,本次設(shè)計(jì)的主要任務(wù)是在健康飲食小程序里實(shí)現(xiàn)健康醫(yī)療資訊、健康食譜、食物科普,交流互動(dòng)等功能模塊,符合當(dāng)前潮流的發(fā)展。從用戶(hù)角度出發(fā),同時(shí)也考慮系統(tǒng)運(yùn)營(yíng)成本和人力資源,采用網(wǎng)絡(luò)上的便捷方式,實(shí)現(xiàn)線(xiàn)上業(yè)務(wù),使得業(yè)務(wù)流程更系統(tǒng),也更方便用戶(hù)的體驗(yàn),比較實(shí)用。
經(jīng)濟(jì)性方面,由于本課題中設(shè)計(jì)的健康飲食小程序的主要目的是為了能夠更加方便及快捷的進(jìn)行美食信息的查詢(xún)管理及檢索服務(wù),也就是能夠可以直接投入使用的信息化軟件。系統(tǒng)的主要成本主要是集中在對(duì)使用數(shù)據(jù)后期繼續(xù)維護(hù)及其管理更新這個(gè)操作上。但是一旦系統(tǒng)投入到實(shí)際的運(yùn)行及使用之后就能夠很好的提高信息查詢(xún)檢索的效率,同時(shí)也需要有效的保證查詢(xún)者的信息方面的安全性,同時(shí)這個(gè)健康分享所帶來(lái)的實(shí)際應(yīng)用方面的價(jià)值是遠(yuǎn)遠(yuǎn)的超過(guò)了實(shí)際系統(tǒng)進(jìn)行開(kāi)發(fā)與維護(hù)方面的成本,因此,從經(jīng)濟(jì)上來(lái)說(shuō)開(kāi)發(fā)這個(gè)軟件是可行的。
-
- 功能需求分析
健康飲食小程序的功能主要分為前臺(tái)用戶(hù)根據(jù)自己的需求進(jìn)行注冊(cè)登錄,對(duì)健康醫(yī)療資訊列表進(jìn)行瀏覽,食物科普。后臺(tái)系統(tǒng)管理員主要對(duì)注冊(cè)用戶(hù),資訊數(shù)據(jù),資訊分類(lèi)、健康食譜等詳細(xì)信息進(jìn)行管理。
用戶(hù)用例圖如下所示。
?
圖3-1 學(xué)生用例圖
?
管理員用例圖如下所示。
??????????????????????
圖3-2 管理員用例圖
?
-
-
- 前臺(tái)用戶(hù)功能
-
前臺(tái)注冊(cè)用戶(hù)的功能如下:
注冊(cè)登錄:用戶(hù)填寫(xiě)個(gè)人信息,并驗(yàn)證手機(jī)號(hào)碼進(jìn)行賬戶(hù)注冊(cè),注冊(cè)成功后方可登錄系統(tǒng)。
醫(yī)療資訊:用戶(hù)可以在線(xiàn)進(jìn)行資訊搜索,醫(yī)療資訊信息進(jìn)行查看等。
食物科普:用戶(hù)可以查看食物科普信息。
維護(hù)個(gè)人信息:用戶(hù)因個(gè)人信息的變更可以隨時(shí)修改自己注冊(cè)信息。
交流中心:用戶(hù)可以在線(xiàn)發(fā)布內(nèi)容進(jìn)行交流操作。
-
-
- 后臺(tái)管理員功能
-
管理員功能如下:
修改密碼:管理員可以隨時(shí)修改自己進(jìn)入系統(tǒng)的登錄密碼,以保證系統(tǒng)的安全性。
用戶(hù)管理:對(duì)注冊(cè)的用戶(hù)信息進(jìn)行維護(hù)管理等。
食物科普管理:對(duì)食物科普信息進(jìn)行維護(hù),添加、刪除、修改信息。
醫(yī)療資訊管理:對(duì)各類(lèi)醫(yī)療資訊進(jìn)行發(fā)布。
內(nèi)容管理:對(duì)內(nèi)容信息錄入,對(duì)科普信息進(jìn)行管理。
站點(diǎn)管理,模塊管理等。
-
- 非功能需求分析
首先主要考慮的是系統(tǒng)功能軟件,在具體設(shè)計(jì)的環(huán)節(jié)上,是不是能夠較好的滿(mǎn)足各類(lèi)用戶(hù)的基本功能需求,如果不能較好的滿(mǎn)足用戶(hù)需求,那么這個(gè)系統(tǒng)的存在是沒(méi)有價(jià)值的。軟件系統(tǒng)的非功能性求分析,從7個(gè)方面展開(kāi),一個(gè)是性能分析,針對(duì)系統(tǒng);一個(gè)是安全分析,針對(duì)系統(tǒng),一個(gè)是完整度分析,針對(duì)系統(tǒng),一個(gè)是可維護(hù)分析,針對(duì)系統(tǒng),一個(gè)是可擴(kuò)展性分析,針對(duì)系統(tǒng),一個(gè)是適應(yīng)業(yè)務(wù)的性能分析。面對(duì)學(xué)生試題測(cè)試與系統(tǒng)存在的性能、安全、擴(kuò)展、完整度等7個(gè)方面性能綜合比對(duì)分析后發(fā)現(xiàn),需要相應(yīng)的非功能性需求分析。
-
-
安全性需求分析
- 系統(tǒng)的安全性
-
安全性需求分析
安全性對(duì)每一個(gè)系統(tǒng)來(lái)說(shuō)都是非常重要的。安全性很好的系統(tǒng)可以保護(hù)企業(yè)的信息和用戶(hù)的信息不被竊取。提高系統(tǒng)的安全性不僅是對(duì)用戶(hù)的負(fù)責(zé)。尤其針對(duì)于健康飲食小程序來(lái)說(shuō),必須要有很好的安全性來(lái)保障整個(gè)系統(tǒng)。
系統(tǒng)具有對(duì)使用者有權(quán)限控制,針對(duì)角色的不通限制使用者的權(quán)限,以此來(lái)確保系統(tǒng)的安全性。
-
-
- 數(shù)據(jù)的安全性
-
數(shù)據(jù)庫(kù)中的數(shù)據(jù)是從外界輸入的,當(dāng)數(shù)據(jù)的輸入時(shí),由于種種原因,輸入的數(shù)據(jù)會(huì)無(wú)效,或者是臟數(shù)據(jù)。因此,怎樣保證輸入的數(shù)據(jù)符合規(guī)定,成為了數(shù)據(jù)庫(kù)系統(tǒng),尤其是多用戶(hù)的關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)首要關(guān)注的問(wèn)題。
因此,在寫(xiě)入數(shù)據(jù)庫(kù)時(shí),要保證數(shù)據(jù)完整性、正確性和一致性。
-
- 數(shù)據(jù)流程分析
對(duì)系統(tǒng)的數(shù)據(jù)流進(jìn)行分析,系統(tǒng)的使用者分為二類(lèi),一般用戶(hù),管理員。系統(tǒng)主要對(duì)界面信息傳送,登錄信息的驗(yàn)證,注冊(cè)信息的接收,用戶(hù)各種操作的響應(yīng)做處理。
系統(tǒng)頂層數(shù)據(jù)流圖如下圖所示。
?
圖3-2 頂層數(shù)據(jù)流圖
要判斷用戶(hù)是是什么身份,是根據(jù)登錄的數(shù)據(jù)來(lái)判斷后,跳轉(zhuǎn)到對(duì)應(yīng)的功能界面。在系統(tǒng)的內(nèi)部用戶(hù)就可以對(duì)數(shù)據(jù)進(jìn)行操作,數(shù)據(jù)庫(kù)中心就可以接收到系統(tǒng)傳輸?shù)挠行?shù)據(jù)流來(lái)對(duì)數(shù)據(jù)sql語(yǔ)句進(jìn)行對(duì)應(yīng)操作。
系統(tǒng)底層數(shù)據(jù)流圖如下圖所示。
?圖3-3 底層數(shù)據(jù)流圖
?
系統(tǒng)可以分為前臺(tái)和后臺(tái)兩部分,每一種操作后系統(tǒng)都返回操作結(jié)果。前臺(tái)和后臺(tái)的數(shù)據(jù)連接主要通過(guò)數(shù)據(jù)庫(kù),既分別對(duì)數(shù)據(jù)庫(kù)做不同的操作。
-
系統(tǒng)設(shè)計(jì)
- 系統(tǒng)架構(gòu)設(shè)計(jì)
健康飲食小程序的架構(gòu)設(shè)計(jì)主要分為可以3層,主要有Web層,業(yè)務(wù)層,Model層。其中web層還包括View層和Controller層,Model層包括元數(shù)據(jù)擴(kuò)展層和數(shù)據(jù)訪問(wèn)層。
系統(tǒng)架構(gòu)如下圖所示。
MVVM 就是將其中的View 的狀態(tài)和行為抽象化,讓我們將視圖 UI 和業(yè)務(wù)邏輯分開(kāi)。當(dāng)然這些事 ViewModel 已經(jīng)幫我們做了,它可以取出 Model 的數(shù)據(jù)同時(shí)幫忙處理 View 中由于需要展示內(nèi)容而涉及的業(yè)務(wù)邏輯。它強(qiáng)制性的把應(yīng)用程序的輸入、輸出和處理全部分開(kāi),將其分為三個(gè)核心部分,這三個(gè)部分分別有不同的功能。
?
圖4-1系統(tǒng)架構(gòu)圖
視圖層視圖是指被用戶(hù)所看到的并且能夠與之進(jìn)行交互的界面。視圖可以向用戶(hù)展示相關(guān)的數(shù)據(jù),并接收用戶(hù)輸入的數(shù)據(jù),但對(duì)用戶(hù)數(shù)據(jù)不進(jìn)行任何實(shí)際業(yè)務(wù)操作處理。
模型層通過(guò)控制層來(lái)處理視圖層傳遞的數(shù)據(jù),同一個(gè)模型可以給不同的視圖提供數(shù)據(jù),也可以被不同的視圖重復(fù)使用。由于 Model 的主要內(nèi)容是數(shù)據(jù)、方法和行為,其也是 MVVM?中邏輯最為復(fù)雜,代碼量最多的部分,其中包含了許多應(yīng)用中需要用到的業(yè)務(wù)邏輯,因此模型層的開(kāi)發(fā)也變得尤為重要,后期一般不會(huì)對(duì)模型層進(jìn)行大規(guī)模改動(dòng),也是 MVVM最穩(wěn)定的部分??刂茖又饕?fù)責(zé)視圖層和模型層之間的數(shù)據(jù)傳輸和處理請(qǐng)求操作。當(dāng)用戶(hù)通過(guò)視圖發(fā)送數(shù)據(jù)和請(qǐng)求時(shí),控制層可以接收請(qǐng)求和數(shù)據(jù)并決定調(diào)用哪些模型、通過(guò)模型的哪些操來(lái)處理數(shù)據(jù)和請(qǐng)求,處理完成后,控制層再將數(shù)據(jù)返回給相應(yīng)的視圖。
-
- 系統(tǒng)總體設(shè)計(jì)
健康飲食小程序總體分為前臺(tái)用戶(hù)模塊和后臺(tái)管理員模塊。
兩個(gè)模塊表現(xiàn)上是分別獨(dú)立存在,但是訪問(wèn)的數(shù)據(jù)庫(kù)是一樣的。每一個(gè)模塊的功能都是根據(jù)先前完成的需求分析,并查閱相關(guān)資料后整理制作的。
綜上所述,系統(tǒng)功能結(jié)構(gòu)圖如下圖所示。
?
圖4-2 系統(tǒng)功能結(jié)構(gòu)圖
-
- 系統(tǒng)功能設(shè)計(jì)
登錄模塊:登錄模塊是進(jìn)入系統(tǒng)的入口,所有用戶(hù)必須登錄后才能訪問(wèn)系統(tǒng)。登錄需要輸入用戶(hù)名和密碼,如果多次嘗試登錄需要輸入驗(yàn)證碼。登錄時(shí)需要選擇用戶(hù)的角色,是一般用戶(hù)還是管理員登錄等。登錄成功后,會(huì)通過(guò)數(shù)據(jù)庫(kù)獲取用戶(hù)的權(quán)限,并跳轉(zhuǎn)至用戶(hù)的主頁(yè)面。
食物科普模塊:可分為瀏覽、檢索、信息維護(hù)三個(gè)模塊,管理員對(duì)食物科普有維護(hù)的權(quán)限,發(fā)布新的信息、更新已有的信息等。
醫(yī)療資訊管理模塊:對(duì)發(fā)布醫(yī)療資訊操作等。
-
-
數(shù)據(jù)庫(kù)設(shè)計(jì)
- 數(shù)據(jù)需求分析
-
數(shù)據(jù)庫(kù)設(shè)計(jì)
從前面可以分析到數(shù)據(jù)庫(kù)中最重要的是醫(yī)療資訊,資訊列表,同時(shí)存在資訊瀏覽和食物科普信息。分析可以得到如下數(shù)據(jù)描述:
平臺(tái)用戶(hù):用于記錄用戶(hù)的各種信息,包括姓名、手機(jī)、郵箱、照片等數(shù)據(jù)項(xiàng)。
管理員:記錄管理員的登錄信息。包括用戶(hù)名,密碼,權(quán)限等數(shù)據(jù)項(xiàng)。
食物科普:存放給各類(lèi)食物科普數(shù)據(jù)項(xiàng)。
醫(yī)療資訊:存儲(chǔ)醫(yī)療資訊等數(shù)據(jù)項(xiàng)。
交流中心:管理用戶(hù)的交流發(fā)布內(nèi)容等數(shù)據(jù)項(xiàng)。
-
-
- 數(shù)據(jù)庫(kù)概念設(shè)計(jì)
-
根據(jù)前面的數(shù)據(jù)流程圖,結(jié)合系統(tǒng)的功能模塊設(shè)計(jì),設(shè)計(jì)出符合系統(tǒng)的各信息實(shí)體。
系統(tǒng)ER圖如下圖所示。
?
圖4-3 系統(tǒng)ER圖
-
-
- 數(shù)據(jù)庫(kù)表設(shè)計(jì)
-
健康飲食小程序所擁有的數(shù)據(jù)表有以下:用戶(hù)信息表,資訊信息表,分類(lèi)列表,食物科普表,交流中心表等。
由于數(shù)據(jù)表較多,只展示系統(tǒng)主要數(shù)據(jù)表,如下表所示。
名稱(chēng) |
類(lèi)型 |
長(zhǎng)度 |
不是null |
主鍵 |
注釋 |
ordinary_users_id |
int |
11 |
是 |
是 |
普通用戶(hù)ID |
full_name |
varchar |
64 |
否 |
否 |
姓名 |
gender |
varchar |
64 |
否 |
否 |
性別 |
examine_state |
varchar |
16 |
是 |
否 |
審核狀態(tài) |
recommend |
int |
11 |
是 |
否 |
智能推薦 |
user_id |
int |
11 |
是 |
否 |
用戶(hù)ID |
create_time |
datetime |
0 |
是 |
否 |
創(chuàng)建時(shí)間 |
update_time |
timestamp |
0 |
是 |
否 |
更新時(shí)間 |
名稱(chēng) |
類(lèi)型 |
長(zhǎng)度 |
不是null |
主鍵 |
注釋 |
food_science_popularization_id |
int |
11 |
是 |
是 |
食物科普ID |
title_name |
varchar |
64 |
否 |
否 |
標(biāo)題名稱(chēng) |
food_name |
varchar |
64 |
否 |
否 |
食物名稱(chēng) |
food_classification |
varchar |
64 |
否 |
否 |
食物分類(lèi) |
food_ingredients |
varchar |
64 |
否 |
否 |
食物食材 |
food_practices |
varchar |
64 |
否 |
否 |
食物做法 |
food_calories |
varchar |
64 |
否 |
否 |
食物熱量 |
food_efficacy |
varchar |
64 |
否 |
否 |
食物功效 |
cover_photo_ |
varchar |
255 |
否 |
否 |
封面圖片 |
detailed_description |
text |
0 |
否 |
否 |
詳細(xì)描述 |
hits |
int |
11 |
是 |
否 |
點(diǎn)擊數(shù) |
recommend |
int |
11 |
是 |
否 |
智能推薦 |
create_time |
datetime |
0 |
是 |
否 |
創(chuàng)建時(shí)間 |
update_time |
timestamp |
0 |
是 |
否 |
更新時(shí)間 |
名稱(chēng) |
類(lèi)型 |
長(zhǎng)度 |
不是null |
主鍵 |
注釋 |
classification_management_id |
int |
11 |
是 |
是 |
分類(lèi)管理ID |
food_classification |
varchar |
64 |
否 |
否 |
食物分類(lèi) |
recommend |
int |
11 |
是 |
否 |
智能推薦 |
create_time |
datetime |
0 |
是 |
否 |
創(chuàng)建時(shí)間 |
update_time |
timestamp |
0 |
是 |
否 |
更新時(shí)間 |
名稱(chēng) |
類(lèi)型 |
長(zhǎng)度 |
不是null |
主鍵 |
注釋 |
forum_id |
mediumint |
8 |
是 |
是 |
論壇id |
display |
smallint |
5 |
是 |
否 |
排序 |
user_id |
mediumint |
8 |
是 |
否 |
用戶(hù)ID |
nickname |
varchar |
16 |
否 |
否 |
昵稱(chēng):[0,16] |
praise_len |
int |
10 |
否 |
否 |
點(diǎn)贊數(shù) |
hits |
int |
10 |
是 |
否 |
訪問(wèn)數(shù) |
title |
varchar |
125 |
是 |
否 |
標(biāo)題 |
keywords |
varchar |
125 |
否 |
否 |
關(guān)鍵詞 |
description |
varchar |
255 |
否 |
否 |
描述 |
url |
varchar |
255 |
否 |
否 |
來(lái)源地址 |
tag |
varchar |
255 |
否 |
否 |
標(biāo)簽 |
img |
text |
0 |
否 |
否 |
封面圖 |
content |
longtext |
0 |
否 |
否 |
正文 |
create_time |
timestamp |
0 |
是 |
否 |
創(chuàng)建時(shí)間: |
update_time |
timestamp |
0 |
是 |
否 |
更新時(shí)間: |
avatar |
varchar |
255 |
否 |
否 |
發(fā)帖人頭像: |
type |
varchar |
64 |
是 |
否 |
論壇分類(lèi): |
名稱(chēng) |
類(lèi)型 |
長(zhǎng)度 |
不是null |
主鍵 |
注釋 |
complaints_and_suggestions_id |
int |
11 |
是 |
是 |
交流中心ID |
theme |
varchar |
64 |
否 |
否 |
主題 |
relevant_vouchers |
varchar |
255 |
否 |
否 |
相關(guān)憑證 |
user_name |
int |
11 |
否 |
否 |
用戶(hù)名 |
contact_number |
varchar |
64 |
否 |
否 |
聯(lián)系電話(huà) |
content |
text |
0 |
否 |
否 |
內(nèi)容 |
recommend |
int |
11 |
是 |
否 |
智能推薦 |
create_time |
datetime |
0 |
是 |
否 |
創(chuàng)建時(shí)間 |
update_time |
timestamp |
0 |
是 |
否 |
更新時(shí)間 |
-
系統(tǒng)實(shí)現(xiàn)
- 注冊(cè)模塊的實(shí)現(xiàn)
用戶(hù)在填寫(xiě)數(shù)據(jù)的時(shí)候必須與注冊(cè)頁(yè)面上的驗(yàn)證相匹配否則會(huì)注冊(cè)失敗,注冊(cè)頁(yè)面的表單驗(yàn)證是通過(guò)驗(yàn)證的,用戶(hù)名的長(zhǎng)度必須在6到18之間,郵箱必須帶有@符號(hào),密碼和密碼確認(rèn)必須相同,你輸入的密碼,系統(tǒng)會(huì)根據(jù)你輸入密碼的強(qiáng)度給出指定的值,電話(huà)號(hào)碼和身份證號(hào)碼必須要求輸入格式與生活相符合,當(dāng)你前臺(tái)驗(yàn)證通過(guò)的時(shí)候你點(diǎn)擊注冊(cè),表單會(huì)將你輸入的值通過(guò)name值傳遞給后臺(tái)并保存到數(shù)據(jù)庫(kù)中。
用戶(hù)注冊(cè)流程圖如下圖所示。
?
圖5-1用戶(hù)注冊(cè)流程圖
用戶(hù)注冊(cè)界面如下圖所示。
?
圖5-2用戶(hù)注冊(cè)界面
用戶(hù)注冊(cè)邏輯代碼如下:
/**
?????* 注冊(cè)
?????* @param user
?????* @return
?????*/
????@PostMapping("register")
????public Map<String, Object> signUp(@RequestBody User user) {
????????// 查詢(xún)用戶(hù)
????????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, "用戶(hù)已存在");
????????}
????????user.setUserId(null);
????????user.setPassword(service.encryption(user.getPassword()));
????????service.save(user);
????????return success(1);
}
/**
?????* 用戶(hù)ID:[0,8388607]用戶(hù)獲取其他與用戶(hù)相關(guān)的數(shù)據(jù)
?????*/
????@Id
????@GeneratedValue(strategy = GenerationType.IDENTITY)
????@Column(name = "user_id")
????private Integer userId;
????/**
?????* 賬戶(hù)狀態(tài):[0,10](1可用|2異常|3已凍結(jié)|4已注銷(xiāo))
?????*/
????@Basic
????@Column(name = "state")
????private Integer state;
????/**
?????* 所在用戶(hù)組:[0,32767]決定用戶(hù)身份和權(quán)限
?????*/
????@Basic
????@Column(name = "user_group")
????private String userGroup;
????/**
?????* 上次登錄時(shí)間:
?????*/
????@Basic
????@Column(name = "login_time")
????private Timestamp loginTime;
????/**
?????* 手機(jī)號(hào)碼:[0,11]用戶(hù)的手機(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;
????/**
?????* 用戶(hù)名:[0,16]用戶(hù)登錄時(shí)所用的賬戶(hù)名稱(chēng)
?????*/
????@Basic
????@Column(name = "username")
????private String username;
????/**
?????* 昵稱(chēng):[0,16]
?????*/
????@Basic
????@Column(name = "nickname")
????private String nickname;
????/**
?????* 密碼:[0,32]用戶(hù)登錄所需的密碼,由6-16位數(shù)字或英文組成
?????*/
????@Basic
????@Column(name = "password")
????private String password;
????/**
?????* 郵箱:[0,64]用戶(hù)的郵箱,用于找回密碼時(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;
}
-
- 登錄模塊的實(shí)現(xiàn)
主要由兩部分組成,登錄前的登錄界面以及登錄后的用戶(hù)功能界面。登錄界面,要求用戶(hù)輸入用戶(hù)名和密碼,當(dāng)用戶(hù)名和密碼其中一個(gè)輸入為空時(shí),給出提示“用戶(hù)名,密碼不能為空”。獲取用戶(hù)名和密碼后到數(shù)據(jù)庫(kù)中查找,如果用戶(hù)名存在,以及對(duì)應(yīng)的密碼正確,則登錄成功,否則登錄失敗。登錄失敗后給出提示,并把焦點(diǎn)停在文本框中。登錄成功后將該次會(huì)話(huà)的全局變量username設(shè)置為用戶(hù)名。登錄成功后進(jìn)入會(huì)員的功能模塊,主要有會(huì)員基本信息修改,已經(jīng)發(fā)布考試信息管理,發(fā)布信息,和退出功能。退出功能是清除全局變量username的值,并跳回到首頁(yè)。
登錄流程圖如下圖所示。
?
圖5-3登錄流程圖
用戶(hù)登錄界面如下圖所示。
?
圖5-4用戶(hù)登錄界面
用戶(hù)登錄的邏輯代碼如下所示。
/**
?????* 登錄
?????* @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è)用戶(hù)
????????if (resultList.size()<=0){
????????????return error(30000,"用戶(hù)不存在");
????????}
????????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,"用戶(hù)組不存在");
????????}
????????UserGroup userGroup = (UserGroup) groupList.get(0);
????????//查詢(xún)用戶(hù)審核狀態(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,"用戶(hù)不存在");
????????????}
????????????if (!res.equals("已通過(guò)")){
????????????????return error(30000,"該用戶(hù)審核未通過(guò)");
????????????}
????????}
????????//查詢(xún)用戶(hù)狀態(tài)
????????if (byUsername.getState()!=1){
????????????return error(30000,"用戶(hù)非可用狀態(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);
????????????// 返回用戶(hù)信息
????????????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)或密碼不正確");
????????}
}
-
- 用戶(hù)資料修改模塊的實(shí)現(xiàn)
用戶(hù)登錄/注冊(cè)成功之后可以修改自己的基本信息。修改頁(yè)面的表單中每一個(gè)input的name值都要與實(shí)體類(lèi)中的參數(shù)相匹配,在用戶(hù)點(diǎn)擊修改頁(yè)面的時(shí)候,如果改后用戶(hù)名與數(shù)據(jù)庫(kù)里面重復(fù)了,頁(yè)面會(huì)提示該用戶(hù)名已經(jīng)存在了,否則通過(guò)Id來(lái)查詢(xún)用戶(hù),并將用戶(hù)的信息修改為表單提交的數(shù)據(jù)。
-
- 食物科普管理模塊的實(shí)現(xiàn)
如果食物科普的信息需要修改,管理員可以通過(guò)查詢(xún)食物科普的基本信息來(lái)查詢(xún)食物科普,查詢(xún)食物科普是通過(guò)ajax技術(shù)來(lái)進(jìn)行查詢(xún)的,需要傳遞食物科普的標(biāo)題、編號(hào)等參數(shù)然后在返回到該頁(yè)面中,可以選中要修改或刪除的那條信息,如果選中了超過(guò)一條數(shù)據(jù),頁(yè)面會(huì)挑一個(gè)窗口提醒只能選擇一條數(shù),如果沒(méi)有選中數(shù)據(jù)會(huì)挑一個(gè)窗口題型必須選擇一條數(shù)據(jù)。當(dāng)選擇確認(rèn)修改的時(shí)候,后臺(tái)會(huì)根據(jù)傳過(guò)來(lái)的id到數(shù)據(jù)庫(kù)查詢(xún),并將結(jié)果返回到修改頁(yè)面中,可以在修改頁(yè)面中修改剛剛選中的信息當(dāng)點(diǎn)擊確認(rèn)的時(shí)候from表單會(huì)將修改的數(shù)據(jù)提交到后臺(tái)并保存到數(shù)據(jù)庫(kù)中,就是說(shuō)如果提交的數(shù)據(jù)數(shù)據(jù)庫(kù)中存在就修改,否則就保存。
食物科普展示界面如下圖所示。
?
圖5-5食物科普展示界面
食物科普的邏輯代碼如下:
?@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ī)療資訊模塊的實(shí)現(xiàn)
醫(yī)療資訊功能需要考慮高并發(fā),防止出現(xiàn)醫(yī)療資訊重復(fù)、醫(yī)療資訊狀態(tài)顯示出錯(cuò)等情況,特對(duì)醫(yī)療資訊這一共享數(shù)據(jù)增加鎖機(jī)制。在樂(lè)觀鎖、悲觀鎖以及線(xiàn)程鎖中,綜合考慮性能效率和錯(cuò)誤的可接受性選擇了樂(lè)觀鎖機(jī)制。樂(lè)觀鎖的實(shí)現(xiàn)方式是使用版本標(biāo)識(shí)來(lái)確定讀到的數(shù)據(jù)與提交時(shí)的數(shù)據(jù)是否一致,提交后修改版本標(biāo)識(shí),不一致時(shí)可以采取丟棄和再次嘗試的策略。在數(shù)據(jù)庫(kù)醫(yī)療資訊表(對(duì)應(yīng)醫(yī)療資訊實(shí)體)設(shè)計(jì)中增加了version字段,每次數(shù)據(jù)提交時(shí)(更改醫(yī)療資訊狀態(tài))會(huì)判斷version是否匹配,若不匹配停止本次提交,若匹配則提交成功并增加version的值。
醫(yī)療資訊功能整體流程:用戶(hù)瀏覽醫(yī)療資訊信息時(shí),同時(shí)會(huì)顯示醫(yī)療資訊的狀態(tài),系統(tǒng)會(huì)在其顯示詳細(xì)信息的頁(yè)面時(shí)便會(huì)判斷醫(yī)療資訊的狀態(tài),若醫(yī)療資訊狀態(tài)為可瀏覽,則會(huì)顯示搜索的鏈接按鈕。在用戶(hù)點(diǎn)擊搜索按鈕時(shí),會(huì)先通過(guò)攔截器判斷用戶(hù)是否登錄,若未登錄,會(huì)跳轉(zhuǎn)至登錄頁(yè)面,提示用戶(hù)先登錄,若為登錄用戶(hù)就會(huì)跳轉(zhuǎn)至填寫(xiě)信息的頁(yè)面,填寫(xiě)好信息之后,點(diǎn)擊搜索按鈕,成功之后顯示出醫(yī)療資訊。
醫(yī)療資訊流程圖如下圖所示。
?
圖5-6醫(yī)療資訊流程圖
醫(yī)療資訊界面如下圖所示。
?
圖5-7醫(yī)療資訊界面
醫(yī)療資訊界面邏輯代碼如下:
@RequestMapping(value = {"/avg_group", "/avg"})
public Map<String, Object> avg(HttpServletRequest request) {
????????Query count = service.avg(service.readQuery(request), service.readConfig(request));
????????return success(count.getResultList());
}
-
- 交流中心管理模塊的實(shí)現(xiàn)
此頁(yè)面的關(guān)鍵是編寫(xiě)交流中心信息,包括交流中心詳情等。單擊提交按鈕以完成信息的添加。如果未寫(xiě)入完整的交流中心信息,例如,如果未寫(xiě)入交流中心,系統(tǒng)將給出相應(yīng)的錯(cuò)誤提示,并且無(wú)法成功輸入。數(shù)據(jù)以概念的形式以onsubmit =“return checkForm()”的形式寫(xiě)入以進(jìn)行檢查,checkForm()函數(shù)是一種用于寫(xiě)入數(shù)據(jù)的不同類(lèi)型的校對(duì)方法,是不是為空也是經(jīng)過(guò)form表單中的οnsubmit=”return checkForm()來(lái)檢查。
管理員點(diǎn)擊左側(cè)菜單“交流中心信息管理”,頁(yè)面跳轉(zhuǎn)到交流中心信息管理外觀,調(diào)用后臺(tái)交流中心查詢(xún)所有交流中心信息。并將信息密封到數(shù)據(jù)集合List,綁定到請(qǐng)求對(duì)象,然后頁(yè)面跳轉(zhuǎn)到相應(yīng)的界面,顯示出交流中心信息,單擊刪除按鈕完成交流中心信息的刪除。
交流中心管理流程圖如下圖所示。
?
圖5-8交流中心管理流程圖
交流中心管理界面如下圖所示。
?
圖5-9交流中心管理界面
交流中心管理界面邏輯代碼如下:
?@RequestMapping("/get_list")
????public Map<String, Object> getList(HttpServletRequest request) {
????????Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));
????????return success(map);
}
-
系統(tǒng)測(cè)試
- 測(cè)試目的
對(duì)任何系統(tǒng)而言,測(cè)試都是必不可少的環(huán)節(jié),測(cè)試可以發(fā)現(xiàn)系統(tǒng)存在的很多問(wèn)題,所有的軟件上線(xiàn)之前,都應(yīng)該進(jìn)行充足的測(cè)試之后才能保證上線(xiàn)后不會(huì)Bug頻發(fā),或者是功能不滿(mǎn)足需求等問(wèn)題的發(fā)生。下面分別從單元測(cè)試,功能測(cè)試和用例測(cè)試來(lái)對(duì)系統(tǒng)進(jìn)行測(cè)試以保證系統(tǒng)的穩(wěn)定性和可靠性。
-
- 功能測(cè)試
下表是交流中心管理功能的測(cè)試用例,檢測(cè)了交流中心管理中對(duì)交流中心信息的增加,刪除,修改,查詢(xún)操作是否成功運(yùn)行。觀察系統(tǒng)的響應(yīng)情況,得出該功能也達(dá)到了設(shè)計(jì)目標(biāo),系統(tǒng)運(yùn)行正確。
前置條件;用戶(hù)登錄系統(tǒng)。
表6-1 交流中心管理的測(cè)試用例
功能描述 |
用于交流中心管理 |
|
測(cè)試目的 |
檢測(cè)交流中心管理時(shí)的各種操作的運(yùn)行情況 |
|
測(cè)試數(shù)據(jù)以及操作 |
預(yù)期結(jié)果 |
實(shí)際結(jié)果 |
點(diǎn)擊添加交流中心,必填項(xiàng)合法輸入,點(diǎn)擊保存 |
提示添加成功 |
與預(yù)期結(jié)果一致 |
點(diǎn)擊添加交流中心,必填項(xiàng)輸入不合法,點(diǎn)擊保存 |
提示必填項(xiàng)不能為空 |
與預(yù)期結(jié)果一致 |
點(diǎn)擊修改交流中心,必填項(xiàng)修改為空,點(diǎn)擊保存 |
提示必填項(xiàng)不能為空 |
與預(yù)期結(jié)果一致 |
點(diǎn)擊修改交流中心,必填項(xiàng)輸入不合法,點(diǎn)擊保存 |
提示必填項(xiàng)不能為空 |
與預(yù)期結(jié)果一致 |
點(diǎn)擊刪除交流中心,選擇交流中心刪除 |
提示刪除成功 |
與預(yù)期結(jié)果一致 |
點(diǎn)擊搜索交流中心,輸入存在的交流中心名 |
查找出交流中心 |
與預(yù)期結(jié)果一致 |
點(diǎn)擊搜索交流中心,輸入不存在的交流中心名 |
不顯示交流中心 |
與預(yù)期結(jié)果一致 |
下表是食物科普管理功能的測(cè)試用例,檢測(cè)了食物科普管理中對(duì)食物科普信息的增加,刪除,修改,查詢(xún)操作是否成功運(yùn)行。觀察系統(tǒng)的響應(yīng)情況,得出該功能也達(dá)到了設(shè)計(jì)目標(biāo),系統(tǒng)運(yùn)行正確。
前置條件;用戶(hù)登錄系統(tǒng)。
表6-2 食物科普管理的測(cè)試用例
功能描述 |
用于食物科普管理 |
|
測(cè)試目的 |
檢測(cè)食物科普管理時(shí)的各種操作的運(yùn)行情況 |
|
測(cè)試數(shù)據(jù)以及操作 |
預(yù)期結(jié)果 |
實(shí)際結(jié)果 |
點(diǎn)擊添加食物科普,必填項(xiàng)合法輸入,點(diǎn)擊保存 |
提示添加成功 |
與預(yù)期結(jié)果一致 |
點(diǎn)擊添加食物科普,必填項(xiàng)輸入不合法,點(diǎn)擊保存 |
提示必填項(xiàng)不能為空 |
與預(yù)期結(jié)果一致 |
點(diǎn)擊修改食物科普,必填項(xiàng)修改為空,點(diǎn)擊保存 |
提示必填項(xiàng)不能為空 |
與預(yù)期結(jié)果一致 |
點(diǎn)擊修改食物科普,必填項(xiàng)輸入不合法,點(diǎn)擊保存 |
提示必填項(xiàng)不能為空 |
與預(yù)期結(jié)果一致 |
點(diǎn)擊刪除食物科普,選擇食物科普刪除 |
提示刪除成功 |
與預(yù)期結(jié)果一致 |
點(diǎn)擊搜索食物科普,輸入存在的食物科普名 |
查找出食物科普 |
與預(yù)期結(jié)果一致 |
點(diǎn)擊搜索食物科普,輸入不存在的食物科普名 |
不顯示食物科普 |
與預(yù)期結(jié)果一致 |
下表是發(fā)布內(nèi)容管理功能的測(cè)試用例,檢測(cè)了發(fā)布內(nèi)容管理中分類(lèi)列表的操作是否成功運(yùn)行。觀察系統(tǒng)的響應(yīng)情況,得出該功能也達(dá)到了設(shè)計(jì)目標(biāo),系統(tǒng)運(yùn)行正確。
前置條件;用戶(hù)登錄系統(tǒng)。
表6-3 發(fā)布內(nèi)容管理的測(cè)試用例
功能描述 |
用于發(fā)布內(nèi)容管理 |
|
測(cè)試目的 |
檢測(cè)發(fā)布內(nèi)容管理時(shí)各種操作的情況 |
|
測(cè)試數(shù)據(jù)以及操作 |
預(yù)期結(jié)果 |
實(shí)際結(jié)果 |
未選擇分類(lèi),點(diǎn)擊提交 |
提示請(qǐng)選擇分類(lèi) |
與預(yù)期結(jié)果一致 |
未選擇列表,點(diǎn)擊提交 |
提示請(qǐng)選擇列表 |
與預(yù)期結(jié)果一致 |
-
- 性能測(cè)試
使用阿里云PTS(Performance Testing Service)性能測(cè)試服務(wù)對(duì)線(xiàn)上系統(tǒng)進(jìn)行壓力測(cè)試。線(xiàn)上服務(wù)器環(huán)境為:1核心CPU,1G內(nèi)存,1Mbps公網(wǎng)帶寬,Centos7.0操作系統(tǒng)。
壓測(cè)過(guò)程中使用了2臺(tái)并發(fā)機(jī)器,每臺(tái)機(jī)器20個(gè)用戶(hù)并發(fā),對(duì)系統(tǒng)主頁(yè),登錄,數(shù)據(jù)查詢(xún)和數(shù)據(jù)維護(hù)等模塊進(jìn)行并發(fā)訪問(wèn),測(cè)試結(jié)果是有40個(gè)用戶(hù)并發(fā)時(shí),數(shù)據(jù)管理相關(guān)頁(yè)面的響應(yīng)時(shí)間甚至達(dá)到了7s,通過(guò)查看服務(wù)器出網(wǎng)流量發(fā)現(xiàn)已經(jīng)達(dá)到1381kb/s,可以看出服務(wù)器的帶寬已經(jīng)達(dá)到峰值,如果系統(tǒng)使用5Mbps的帶寬,系統(tǒng)的響應(yīng)時(shí)間和TPS將會(huì)大大增加。在整個(gè)測(cè)試的過(guò)程中,CPU的使用率占用僅8%,也提現(xiàn)出帶寬瓶頸對(duì)系統(tǒng)的影響非常嚴(yán)重。
- 總結(jié)與展望
隨著計(jì)算機(jī)互聯(lián)網(wǎng)技術(shù)的迅猛發(fā)展,各行各業(yè)都已經(jīng)實(shí)現(xiàn)采用計(jì)算機(jī)相關(guān)技術(shù)對(duì)日益放大的數(shù)據(jù)進(jìn)行管理。該課題是健康飲食推薦為核心展開(kāi)的。本研究針對(duì)健康飲食小程序的需求建模,數(shù)據(jù)建模及過(guò)程建模分析設(shè)計(jì)并實(shí)現(xiàn)平臺(tái)研究的過(guò)程。給出系統(tǒng)應(yīng)用架構(gòu)并分析優(yōu)劣勢(shì),通過(guò)功能分解圖,系統(tǒng)組件圖描述功能需求。設(shè)計(jì)建立了數(shù)據(jù)庫(kù),給出系統(tǒng)關(guān)鍵數(shù)據(jù)結(jié)構(gòu)的定義。通過(guò)類(lèi)關(guān)系圖描述組件間的協(xié)作關(guān)系,給出各個(gè)類(lèi)的定義方法。通過(guò)描述每一個(gè)類(lèi)的字段,屬性及方法實(shí)現(xiàn)系統(tǒng)的前后端代碼。最終給出系統(tǒng)集成整合方法,完成健康飲食小程序的設(shè)計(jì)與實(shí)現(xiàn)。系統(tǒng)投入運(yùn)行時(shí),各功能均運(yùn)行正常。系統(tǒng)的每個(gè)界面的操作符合常規(guī)邏輯,對(duì)使用者來(lái)說(shuō)操作簡(jiǎn)單,界面友好。整個(gè)系統(tǒng)的各個(gè)功能設(shè)計(jì)合理,體現(xiàn)了人性化。
但是由于自己在系統(tǒng)開(kāi)發(fā)過(guò)程中對(duì)一些用到的相關(guān)知識(shí)和技術(shù)掌握不夠牢固,再加上自身開(kāi)發(fā)經(jīng)驗(yàn)欠缺,因此系統(tǒng)在有些方面的功能還不夠完善,考慮的不夠全面,因此整個(gè)系統(tǒng)還有待日后逐步完善。
參考文獻(xiàn)
- 鮮易洲,楊蕊,吳蓉,鞏培楨,吳麗麗.時(shí)食健康分享系統(tǒng)的設(shè)計(jì)與分析[J].電腦知識(shí)與技術(shù),2021,17(09):85-87.
- [2]墨菲.收獲開(kāi)心季,美國(guó)開(kāi)心果烹飪、健康分享——跨越國(guó)界,用“心”分享,美國(guó)開(kāi)心果“云”活動(dòng)順利舉辦[J].中國(guó)食品,2020(23):160.
- 張茜. 用戶(hù)體驗(yàn)下的山西面食APP交互設(shè)計(jì)與研究[D].大連工業(yè)大學(xué),2020.
- [4]施金鳳,胡婷.移動(dòng)互聯(lián)網(wǎng)背景下健康分享類(lèi)APP用戶(hù)體驗(yàn)與購(gòu)買(mǎi)意向研究[J].健康研究,2019,36(03):31-35.
[5]夏菁. 移動(dòng)互聯(lián)網(wǎng)時(shí)代青年的健康社交[D].安徽大學(xué),2019.
[6]朱明秀.基于Android的健康食譜APP設(shè)計(jì)與實(shí)現(xiàn)——以桂林健康A(chǔ)PP為例[J].信息與電腦(理論版),2019(05):135-137.
[7]周顯春,鄧雨,吳世雄,楊宇鑫,王晗.基于改進(jìn)協(xié)同過(guò)濾算法的個(gè)性化健康推薦APP開(kāi)發(fā)[J].軟件導(dǎo)刊,2019,18(02):88-90+95.
[8]文怡.健康家分享“萬(wàn)能調(diào)料”公式[J].康頤,2019(01):60-62.
[9]祖冰疇.視頻平臺(tái)中健康視頻的發(fā)展現(xiàn)狀分析——以抖音app中健康視頻為例[J].飲食科學(xué),2018(02):140.
[10]盧紅霞,方曉亮.社會(huì)化顧客價(jià)值在健康分享網(wǎng)站的應(yīng)用研究[J].物流工程與管理,2019,37(11):230-233.
[11]“舌尖上的西部——最具人氣十大西部健康”系列評(píng)選活動(dòng)[J].中國(guó)西部,2019(43):89.
[12]翁偉軒.微博平臺(tái)的信息分享動(dòng)因——以新浪微博微健康為例[J].新聞傳播,2019(17):59-60.
[13]張祎.社交,從廚房開(kāi)始——Fisher&Paykel斐雪派克健康·分享·生活主題活動(dòng)[J].優(yōu)品,2018(12):254.
[14]姚強(qiáng).Chihuoshuo.com:吃貨說(shuō),健康體驗(yàn)分享社區(qū)[J].互聯(lián)網(wǎng)天地,2018(12):56.
[15]休閑健康體驗(yàn)點(diǎn)評(píng)選:評(píng)味道、選感覺(jué)、精挑細(xì)選[J].杭州(生活品質(zhì)版),2018(Z1):181.
致謝
本次設(shè)計(jì)歷時(shí)3個(gè)月。在這個(gè)畢業(yè)設(shè)計(jì)中,它離不開(kāi)指導(dǎo)教師的指導(dǎo),使事情基本順利。指導(dǎo)老師無(wú)論是在畢業(yè)設(shè)計(jì)歷經(jīng)中,還是在論文做完中都給了了我特別大的助益。另一個(gè)方面,教師認(rèn)真負(fù)責(zé)的工作姿態(tài),謹(jǐn)慎的教學(xué)精神厚重的理論水準(zhǔn)都使我獲益匪淺。他勤懇謹(jǐn)慎的教學(xué)育人學(xué)習(xí)姿態(tài)也給我留下了特別特別深的感覺(jué)。我從老師那里學(xué)到了很多東西。在理論和實(shí)踐中,我的技能得到了特別大的提高。在此,特向教師表示由衷的感激。
經(jīng)過(guò)對(duì)該畢業(yè)設(shè)計(jì)的全部研究和開(kāi)發(fā),我的系統(tǒng)研發(fā)經(jīng)歷了從需求分析到實(shí)現(xiàn)詳細(xì)功能,再到最終測(cè)試和維護(hù)的特殊進(jìn)展。讓我對(duì)系統(tǒng)研發(fā)有了更深層次的認(rèn)識(shí)。如今我的動(dòng)手本領(lǐng)單獨(dú)處理疑惑的本領(lǐng)也獲取到了特別大的演練學(xué)習(xí)增多,這是這次畢業(yè)設(shè)計(jì)最好的收獲。
最后,在整個(gè)系統(tǒng)開(kāi)發(fā)過(guò)程中,我周?chē)耐瑢W(xué)和朋友給了我很多意見(jiàn),所以我很快就確認(rèn)了系統(tǒng)的商業(yè)思想。在次,我由衷的向他們表示感激。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-488529.html
免費(fèi)領(lǐng)取本源代碼,請(qǐng)關(guān)注+私信文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-488529.html
到了這里,關(guān)于Springboot健康飲食小程序的設(shè)計(jì)的實(shí)現(xiàn)畢業(yè)設(shè)計(jì)源碼280920的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!