数据库课程设计报告--美食主题-安卓系统菜谱查询应用程序.docx

上传人:李司机 文档编号:6713586 上传时间:2024-01-08 格式:DOCX 页数:15 大小:180.75KB
返回 下载 相关 举报
数据库课程设计报告--美食主题-安卓系统菜谱查询应用程序.docx_第1页
第1页 / 共15页
数据库课程设计报告--美食主题-安卓系统菜谱查询应用程序.docx_第2页
第2页 / 共15页
数据库课程设计报告--美食主题-安卓系统菜谱查询应用程序.docx_第3页
第3页 / 共15页
数据库课程设计报告--美食主题-安卓系统菜谱查询应用程序.docx_第4页
第4页 / 共15页
数据库课程设计报告--美食主题-安卓系统菜谱查询应用程序.docx_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《数据库课程设计报告--美食主题-安卓系统菜谱查询应用程序.docx》由会员分享,可在线阅读,更多相关《数据库课程设计报告--美食主题-安卓系统菜谱查询应用程序.docx(15页珍藏版)》请在三一办公上搜索。

1、数据库课程设计美食主题安卓系统菜谱查询应用程序CookBook目录一、麒要求2二、选题背景3三、需求分析3四、削理念3五、开发工具7六、实现步骤7七、结果15八、总结与体会15课题主题美食菜谱一、选题要求以美食为主线,最好与健库和互联网,移动互联网相关,开发一个小应用程序或者小系统。可参考如下一些相关的美食网站:广州美食团购:http:gz.meituan.Comcategorymeishiall?UtmqmPaigr=I344091295&utmmedium=cpc&utmsource=baidu&utmcoment=PinIei&utmterTn=%E7%BE%8E%E9%A3%9F%E5

2、%9B%A2%E8%B4%AD%E7%BD%91京东美食:http:WWW二、选题背景随着人们生活水平的普遍提高,对餐饮娱乐业的服务、硬件设施、菜品口味的要求越来越挑剔。加上原材料的不断上涨,人工成本越来越高以及越来越多食品安全丑闻的曝光,自己动手做菜成了现代生活的最佳觅食手段。自己动手做菜,则不仅要保证色香味俱全,还要营养价值丰富。那么方便查阅的菜谱必不可少。一份方便的菜谱,不仅要让用户能够根据食材和菜名快速的找到相关菜肴,还要对菜肴有详细的介绍,对做菜的步骤有详细的说明。除此之外,还要有方便快捷的信息统计功能,如菜谱所需食材的统计、食材总价的估算、当季热门菜谱的推荐、用户收藏夹的查阅等等功

3、能来帮助用户快捷的使用菜谱。本应用程序就是希望通过向大众提供营养的食谱,向更多的关注健康的人们提供一个吃出健康的好环境。它的服务又掇是非常广泛的,前景十分广阔。三、需求分析这里主要描述客户需求1 .登陆/注册账号2 .根据菜谱名称或者食材进行模糊搜索3 .点击搜索返回结果以查看菜谱详细内容菜谱详细内容包括:3.1. 菜谱图片一张32少于200字的菜式简介3.3. 适合人数,消耗时间3.4. 食材(包括配料)名称、用量3.5. 若干步骤36用户评价4 .收藏菜谱5 .丽介菜谱6 .将菜谱食材加入购物清单7 .查看购物清单(包含食材名字、用量、总价)8 .清空购物清单9 .查看个人收藏四.设计理念

4、1.系统逻辑谢十2.数据库设计2.1. E-R图2.2.关Ingredient?w2.3.数据字典PC-20140404KILC.kBookDB-dbo.DishPC-201404列名 Did Dname DintrodurtonDpic DtimeCost Dpeople Dhot数据类型 int nvarchar(20) nvar char (200) vardar(30) tinyint tinyint int允许NUl值DdateSmalldate tme列名数据类组允许Nul值intUnamenvar char(10)Upasswordnvar char (20)iPC-201404

5、04KILC.ookDB - dbo.Users PC-2014040PC-20140404KILC.B - dboJngredient PC-20140404列名数据类数一不泮NuI值3ntInamevardar(10)Ipricenumeric(4, 1)Iunitnvarchar(2)PC-20140404KILC.B - dbo.Seasoning SQLQueryl.s列名额据类空-充*2值?nintSnamenvarchar(8)PC-20140404KIIDB - db。.CommentS PC-一201PC-20140404KILCo dboJngredientList PC-

6、20140/列名数据类汇允许NuI值皿intEIidint0!amountnumehc(Sf 2)PC-20140404KILCo.dbo.SeasoningListPC-2014O列名数据类型允许NUll值IntDidIntESanxxjntnchar(5)列名数据类型允许Null值用 CidlintPC-20140404KILC.-Ccontentnvardar(200)列名Cdatesmalldatetime UidlDidintCidPC-20140404KILC.ookDB - dbo.Steps PC-2014040PC-20140404KILC.-列名数据类空允许Nul值Step

7、IDint0列名DidintOSaxitentnvarchar(200)IrlDid2.4.建表语句db。.CommentLiSt PC-201404C数据类受痴NuH值Int口int口Odbo.BookmarkList PC-201404数据类型福NUIl值useCookBookDBgcreatetableDish(Didintprimarykeynotnull,Dnamenvarchar(20)notnull,Dintroductionnvarchar(200)notnulldefault,暂无介绍:Dpicnvarchar(30).DtimeCosttinyintnotnull,Dpeo

8、pletinyintnotnull.DhotintnotnulldefaultO.DdateSmalldatetimenotnulldefaultgetdate();createtableIngredientfIidintprimarykeynotnull,Inamenvarchar(10)notnull,!pricenumeric(4.1)notnull.Iunitnvarchar(2)notnull);createtableSeasoning(SidintPrimarykeynotnull.Snamenvarchar(8)notnull);createtableComments(Cidin

9、tprimarykeynotnull.Ccontentnvarchar(2()0)notnullCdateSmalldatetimenotnull.Didintnotnullforeignkey(Did)referencesDish(Did)ondeletecascade);createtableSteps(StepIDintprimarykeynotnull,Didintnotnullforeignkey(Did)referencesDish(Did)ondeletecascade.Scontentnvarchar(2(X)notnull);createtabicIngredientList

10、(Iidintnotnullforeignkey(Iid)referencesIngredient(Iid)ondeletecascade.Didintnotnullforeignkey(Did)referencesDish(Did)ondeletecascade,!amountnumeric(5,2)notnull);createtableSeasoningList(Sidintnotnullforeignkey(Sid)referencesSeasoning(Sid)ondeletecascade.Didintnotnullforeignkey(Did)referencesDish(Did

11、)ondeletecascade.Samountnchar(5)notnull一比如一茶匙)createtableUsers(Uidintprimarykeynotnull,Unamenvarchar(10)notnull,Upasswordnvarchar(20)notnull.)createtableBookinarkLisKUidintnotnullforeignkey(Uid)referencesUsers(Uid)ondeletecascade.Didintnotnullforeignkey(Did)referencesDish(Did)ondeletecascade.)create

12、tableCommentList(Uidintnotnullforeignkey(Uid)referencesUsers(Uid)ondeletecascade.Cidintnotnullforeignkey(Cid)referencesComments(Cid)ondeletecascade.五.开发工具环境:SQLsevermanagementstudio2008xeclipse.VisualStudio2010语言:SQL、java、C+工具包:AndroidSDK、ADO组件六.实现步骤6.1客户端实现:1 .设计程序界面:在纸上画出草图,确定每个功能应该在什么界面实现2 .Andro

13、id编程:在装有ADT的eclipseIDE中进行编程,实现页面布局设计、页面间跳转、请求数据、显示返回数据等需求分析中提到的功能。其中,实现页面布局设计是我们对ADT中的布局文件进行了编写,页面间爵炼专以及请求和返回数据我们是通过intent来相互传送,其中核心步骤的代码为:加VerrIdepublicvoidonItemClick(AdapterViewargQ,Viewargl,intarg2,longarg3)TODOAuto-generatedmethodstubIntenti=newIntent(Homepage.this,detailinfo.class);listdatadat

14、a=adapter.getltem(arg2);|/Toast.makeText(this,data.name,Toast.LENGTH_SHORT).show();i.putExtra(txt,data.Did);startActivity(i);在首页的GridView网格视图中任意点击一个item,都能传输菜的id(即上图中的Did)到客户端,客户端连接以及得到id这个参数的核心代码如下,然后服务端根据id作为key搜索数据库,并返回菜谱的内容。publicvoidonClick(Viewarg)TODOAuto-generatedmethodstubif(iSConnecting&mS

15、ocketCIient!=null)StringmsgText=getlntent().getStringExtra(txt);取得编辑框中我们输入的内容if(msgTet.length()assword;publicfinalStringUSER_SEXMu_sex;publicfinalStringUSEReHOBBY=*uhobby;publicUserDatabase(ContextcontextStringnameCursorFactoryfactoryintversion)super(context,naae/factory,version);/ToOoAuto-generated

16、constructorstubOverridepublicvoidOnCreate(SQLiteDatabaSedb)/TOOOAuto-generatedmethodstubStringsql=CREATETABLE+TABLE_NAME+M(+USER-ID+integerprimarykey,+USER二NAHe+textnotnull,+USER_PASSWORD+,textnotnull,+USER_SEX+_textnotnull,+USER_H0B8Y+-textdb.eecSQL(sql);init_database(db);)4.Socket网络通信(1)建立通信我们的项目里

17、面包括一个服务端和一个客户端,菜谱的数据保存在服务端,客户端如果想要获得服务端的数据,就必须通过网络获取数据,这里我们使用socket通信,在客户端,我们指定输入服务器的IP和Port,更具客户需求,建立通信,连接服务器的代码如下:try/手及著务导mSocketClient=newSocket(sIP,port);pQrtnUm/尊(W人.战力&InBufferedReaderCLient-newBufferedReader(newInPUtStreamReader(mSocketClient.getInputStream(),GB2312);OutputStreaBoutput-BiSoc

18、ketClient.getOutputStream();/5三SS三*三54Writerwriter=newjava.io.OutputStreanWriter(output,UTF_8);mPrintUr0)(PecvMenuClient=getInfoBuff(buffer,count);/:”矣W/支W个tiH入比Bc析绛欲鎏立是不是一个民忘StoreString+=CecvMenuClient;Messagemsg-newMessage。;msg.what=2;InHandler.sendHessage(sg);catch(Exceptione)(CecvMessageClient=S

19、Js:+e.getMessage()+n;/=三isMessagemsg-newMessage();nsg.what=1;Handler.sendMessage(msg);)通过PrimWriter发送数据:if(isConnecting&InSocketClient!=null)StringmsgText=$21.txt;取弟企艳猥=却灌入?j:容if(msgTet.length()feeext(mContext,?E装字符不楂方空:,Toast.LENGTH_SHORT).show();else(try加PrintlriterCttent.print(msgText)发送j芸务第mPrin

20、triterCLient.flush();)catch(Exceptione)(T(XX):handleexceptionToast.znfeeext(mContext,比!东率字号舁常:+e.getMessage(),Toast.LENGTH_SHORT).show();else(Toast.wfeeText(mContext,Joast.LENGTHSHORT).show();)除此之外,由于安卓对于SoCket有特殊的要求。安卓为了保证主线程的安全,需要所有的SOCket连接和信息传输的工作都要在分线程上完成,所以每当需要显示的数据时候,我们就需要调用handler函数,在线程外部完成信

21、息的输出,具体实现如下:HandlermHandler三newHandler()(publicvoidHandleMessage(Messagemsg)super.HandleMessage(msg);if(msg.what=0)(recvMenu.append(recvMenuClient);/N)if(msg.what=三1)recvTet.append(,*Client:+recvMessageClient);/呈产if(msg.what=2)(recvText叩Pend(checked!);recvMenu.append(“交5:至举n);StringTempl三recvMenuCli

22、ent.split($FLAG*);recvMenu.append(,j(g:+Templl+,n);recvMenu.append(g=+Templ2+n);recvMenu.append(步3L+Tempi2+nrecvMenu.叩Pend(夏归,+Templ3+,*n););(2)分析接收到的内容在接收到服务端发送的数据之后,客户端必须有分析收到接收到的信息的能力,即必须能够通过判断分隔符的方式,将接受到了一类字符串短程一段段有意义的字符,并将这些字符分别储存在不同的地方,或者显示出来。(3)根据不同的需求,向服务端发送不同的数据客户端必须根据不同的客户需求向服务端发送不同的符号,服务器

23、识别这些符号之后,会根据客户的需求发送不同的信息,这里为了方面,每当客户点击菜品目纸到菜谱页面的时候,我们就返回一个菜品的ID,具体的实现如下:OverridepublicvoidonItemClick(AdapterViewarg0,Viewargl,intarg2,longarg3)/TODOAuto-generatedmethodstubIntenti=nevIntent(Homepage.thisjdetailinfo.class);listdatadata=adapter.getltem(arg2);|/Toast.makeText(this,data.name,Toast.LENG

24、TH_SHORT).show();i.putExtra(txt,data.Did);startActivity(i);6.1客户端实现:服务端主要任务是,根据客户端的请求处理数据库,或从数据库调出数据。这是一种安全的访问数据库方式,因为客户端并没有直接通过SQL语句访问数据库,而是通过服务端;客户端与服务端间的通信采用非明文的协议模式,不存在SQL注入等语法攻击。1.Socket通信的实现既然要客户端和服务端间通信,我们想到了用Socket的办法。Socket是套接字,用于通信双方的识别,下面是SoCket的建立过程。boolinit-socket()WSADatadata;WORDWVers

25、ion=MAKEWORD(2,2);if(WSAStartup(wVersion,&data)(=0)returnfalse;if(LOBYTE(data.wVersion)!=2HIBYTE(data.wVersion)!=2)returnfalse;returntrue;sock_sevr=socket(AF_INET,SOCK_STREAM,0);if(socksevr三三INVALID,SOCKET)cout”CantCreateServerSocket!*endl;returnfalse;addr_sevr.sin-addr.s_addr=htonl(ADDR_ANY);addr_s

26、evr.sin_family=AF_INET;addr_sevr.sin_port=htons(DEFAULT_PORT);addr_len三sizeof(addr_sevr):if(bind(sock_sevr,(constsockaddr*)&addr_sevr,addr_len)三=SOCKET_ERROR)Write_msg(ServerBindAddressFailed!a,);returnfalse;voidServer:close-server()closesocket(sock_sevr);WSACleanupO:CoUninitializeO:2 .服务端多线程作为服务端,不

27、可能只为一个客户端服务,因此在这里又要涉及到多线程的实现。我们采取的办法是,主线程用于监听,一旦有远端SoCket接入,新建一个线程去处理这个连接请求,并把Server对象、接入的SoCket作为参数传进这个线程。voidServer:start_listen()while(true)coutaddr_len;while(sock=INVALID.SOCKET)sock=accept(sock_sevr,(sockaddr*)&addr_client,&client_addrlen);DWORDtid;ThreadParam*para=newThreadParam(*this,sock,add

28、r_client);CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)ServerWorkProc,param,0,if(!tid)Write_msg(CreateServerWorkingThreadFailed!*);服务端在线程中主要任务是监听客户端的请求:do(msg_len=recv(sock,buffer,IttIXJKESSAGE,O);*1处接收来自客户端的消息*if(msg_len0)pts.writensg(buffer);*将此消直显示/stringcmd(buffer);Requestreq(cmd):3 .AD0连接数据库由

29、于服务端是需要调用SQLserver的数据库,并以流的方式通过Socket传到客户端,因此我们需要一些数据库组件来完成这个调出数据的过程。ADO是一种程序对象,用于表示用户数据库中的数据结构和所包含的数据。在MiCrOSOftViSUalBaSiC编辑器中,可以使用ADO对象以及ADO的附加组件(称为MicrosoftADOExtensionsforDLLandSecurity(ADOX)来创建或修改表和查询、检验数据库、或者访问外部数据源。还可在代码中使用ADO来操作数据库中的数据。以下分别是连接数据库,以及访问数据库实现登陆检测的代码boolServer:init_database()HR

30、ESULThr三S_OK;try(CoInitialize(NULL);StrCnn=PrOvider=SQLOLEDB;PersistSecurityInfo=False;UserID=sa;PasswordiPRstAuthors=NULL;pConnection=NULL;if(FAILED(pConnection.CreateInstance(_uuidof(Connection)printf(*Failedcreatingconnectioninstancen*);returnO;if(FAILED(pRstAuthors.CreateInstance(_uuidof(Records

31、et)cerrvDatabaseError:Failedcreatingrecordsetinstance”:returnfalse;)catch(_com_error&ce)cerr0pen(sqlStr.c_str(),strCnn,adpenStatic,adLoCkReadOnly,adCmdText);_bstr_tval;pRstAuthors-MoveFirst();val=pRstAuthors-Fie1ds-Get11em(*Upassword)-Value;if(pwd=(char*)val)returntrue;)catch(_com_error&ce)cerr*Logi

32、nError:%sn*,(char*)ce.DescriptionO;returnfalse;)returnfalse;)4 .建立SQL数据库为了测试,我们先建立一个简单的表格,下面是建表语句:createtableUsers(Uidintprimarykeyidentity(l,l)notnull,Unamenvarchar(10)notnull,Upasswordnvarchar(20)notnull,createtableDsh(Didnvarchar(3)primarykeynotnullzDnamenvarchar(20)notnull,introductionnvarchar(2

33、00)notnulldefault暂无介绍,Dpicnvarchar(200),Dstepsnvarchar(200)notnull,Dmaterialnvarchar(200)notnull,);createtableBookmarkList(Uidintnotnullforeignkey(Uid)referencesUsers(Uid)ondeletecascade,Didintnotnullforeignkey(Did)referencesDish(Did)ondeletecascade,5 .客户端/服务端协议,分析指令。为了节省流量,也为了通信的安全性,我们建立了客户端和服务端之间的

34、协议,用代码和参数形式格式化传递请求和数据:userid!$FLAGpwd$Coinpletename$FLAGpwdJComp1eteuseridJCoirpletednameCompleteA1$FLAGA2$FLAGA3KolnPIetednameJCoinpletednameJCowleteClient-ServerServer-ClientServer-ClientClient-ServerServer-ClientServer-X?lientClient-ServerServer-ClientClient-ServerClient-Server登登登注注注靠路录录录册册败功功咨果藏

35、七、结果ece%gn34Cookfinal用户名Cd14ft男女计机C泳L乒乓獐注册取消er.CookfinalEwG2输入菜港或食材1)注册界面2)登陆界面3)主页面125.216.246.121:2222-Mooiwifi查找英谱获取菜谱收藏菜谱承而显示菜安普介:IIMi6荷兰豆的一般做法是用广式小Hi.其实四川的传统餐膈也有广味的.放人的没有广式小Hi那么多,再溯上用空气炸祸里任的加惊(的油分也会出去好多.这是比W健*的瞰如累没有空5JTW,,胃H晶的步H改为水.M后切片80可MH:四川胸牌一条,荷兰豆220g,大|,切片,大慧一小WL切开MW,均S少注99.1、荷兰豆125.216.2

36、46.121:2222一生e*查找菜谙获取菜谱收底菜谱提示信.H介:讨于我们这冷大学生寝室,是没有泊VI三JU炒菜的,只能做些箫的米熏R.N身体也.N:生荣,。,魅独,陈.iW,食用温,91.娘水,麦己Ii洗蜉的生柒.2、拿一碗,放人锋末、海帽.几滴防Ir番油、用斛油.调匀.3、得便好的生菜放入谓“备H的碗中,授,均匀的用4)购物清单界面5)菜谱界面16)菜谱界面2八、总结与体会通过这次的课程设计,使我们了解了更多数据库原理与应用这门课程,对以前不太理解和熟悉的内容有更多的掌握,特别是如何将数据库放在服务器端并通过网络通信实现与应用程序的互连。有了上个学期数据库作业的经验,这次课程设计中数据库

37、的建立和查询语句就不是难点了。画出E-R图,建表,插入一些测试数据,很快就完成了。但是,本次课设,最具有挑战性的工作其实是:Android界面的实现,数据库的调用和数据的远程传输。在设计布局的时候我们发现布局文件并没有预期中的容易控制,安卓布置的时候跟其他开发软件不同,不能随意拖动空间到想要的地方。而服务器与数据库的连接更是一大难题,服务端与客户端的连接更是要获取很多权限才能实在地操作,服务端跟客户端之间的数据传输有许许多多的格式问题需要修正。经过这次课程设计,我们可以更好的将所学知识运用到实际中去,使得所学的知识能够融会贯通。同时,在课程设计过程中,我们还自学了许多其他知识,扩展了视野,锻炼了专业能力,激发了对其他领域的兴趣。我们今后一定更加努力的学习,以实践检验自己所习得的知识,让自己更加充实。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号