校园网络技术科研与创新能力实践《网上订餐系统》.docx
网络技术科研与创新能力实践 题 目: 网上订餐系统 学 院: xxxx学院 专业名称: xxxxxx 班级学号: xxxxxx 学生姓名: xxx 指导教师: xxxxx 2014年12月1日摘要随着网络的普及,人们也通过各类网上的系统来方便日常的生活,此系统就是基于B/S模式开发的网上订餐系统。订餐系统为用户提供注册及登入功能;当成功注册为网站的用户,用户即可通过本系统进行订餐,其中包括菜品订购、查看或修改订单、提交订单、查阅过往订单。同时,订餐系统为餐饮管理者提供系统登入、用户所购订单查看、菜品信息管理。本文将从用户和餐饮管理者的角度对本系统进行详细的介绍。此系统是基于HTML、DIV+CSS、PHP、JavaScript语言开发的一套订餐系统。系统实施包括三个阶段(前期、中期、后期),实施工作前期包括系统过程图设计、数据库设计、MVC开发模式图设计、XML文档设计,实施工作中期包括系统代码编写、系统网页设计、系统功能优化等,实施工作后期主要包括系统的功能测试。关键字:系统、注册、管理、订购目 录前言 . 1第一章 网上订餐系统需求分析. 2 1.1网上订餐系统任务概述. 2 1.2网上订餐系统的设计要求. 21.2.1网上订餐系统功能流程. 21.2.2网上订餐系统功能流程分析. 2 1.3网上订餐系统功能过程图. 3 1.3.1网站注册、订餐过程图. 31.3.2管理员操作管理过程图. 4 1.4网上订餐系统需求总结. 5第二章 网上订餐系统数据层设计介绍. 5 2.1系统数据层简述. 5 2.2网上订餐系统数据层. 5 2.2.1数据层-数据库表格设计简述. 5 2.2.2数据层-数据库表格设计详述. 52.2.3数据层-XML文件设计简述. 8 2.2.4数据层-XML文件设计详述. 8 2.3网上订餐系统数据层总结. 9 第三章 网上点餐系统管理层功能设计与实现. 11 3.1系统管理层简述. 11 3.2网上订餐系统管理层功能设计与实现. 11 3.2.1管理层-管理员登入功能三层模式设计. 113.2.2管理层-管理员登入功能实现. 12 3.2.3管理层-管理员登入功能图示. 15 3.2.4管理层-管理员操作功能三层模式设计. 163.2.5管理层-管理员操作功能实现. 173.2.6管理层-管理员操作功能图示. 22 3.3网上订餐系统管理层功能总结. 25第四章 网上订餐系统用户层功能设计与实现. 25 4.1系统用户层简述. 25 4.2网上订餐系统用户层功能设计与实现. 25 4.2.1用户层-用户登入、注册功能三层模式设计. 25 4.2.2用户层-用户登入、注册功能实现. 254.2.3用户层-用户登入、注册功能图示. 30 4.2.4用户层-用户操作功能三层模式设计. 31 4.2.5用户层-用户操作功能实现. 34 4.2.6用户层-用户操作功能图示. 45 4.3网上订餐系统用户层功能总结. 47第五章 网上订餐系统项目总结. 47参考文献. 48附录. 49前言随着信息和网络技术的发展和进步,高效便捷的系统服务为越来越多的人们所追求,尤其的基于B/S模式的服务系统,越来越受到广大用户们的欢迎。这种模式的好处在于,有更加良好的交互界面、有更加便捷的操作体验、有更加灵活高效的系统,使得开发者可以及时的更新系统的功能和不断提升系统的性能,使得用户有更好的交互体验。正是由于这种背景,开发了此套基于B/S模式的网上订餐系统。网上订餐已成为时下较为普遍和流行的一种电商模式,尤其是在我们的校园和白领人士上班的地方,这样的需求较为普遍。不方便外出就餐的人们通过各类的订餐网站进行网上订餐,客户提供送餐地址和联系电话,卖家则通过系统反馈的信息来给客户提供相应的服务。本系统也是基于这样的一种思想,来实现相应的功能。当然,就一个完整的系统来说,我们需要将该系统进行划分,分为用户层面的和管理者层面。对于用户层面,我们需要对用户渴求的一些基本功能和系统本身的需求进行结合,来考虑最终的系统用户层面的功能需求。而对于管理者层面我们需要更加考虑到安全性和功能性的二者结合,因为管理者层需要接触权限更高的一些操作,如一些重要的数据库表单的CRUD操作以及可能的客户信息等。故本系统将功能层面的操作分为客户层面和管理者层面,使得系统更加的完善、友好。当然对于B/S模式,我们需要更多的考虑到的是系统的安全性和健壮性,对于客户可能的不合法操作需要进行相应的出错处理。本系统对于安全性方面主要是基于合法用户的在线监测,而对于健壮性方面,系统对于用户可能出现的错误操作都进行了相应的出错处理,屏蔽了一些可能存在的非法操作,一个提供了系统的健壮性,另一方面也提高了客户的交互体验。当然,对于成熟的B/S模式系统,有更加完善的系统级的安全保护和各种错误处理机制,所以,随着今后各种B/S模式系统的推出,会有更多的系统安全解决方案,使得B/S模式系统更加安全。总之,B/S模式会是今后较为流行的一种开发模式,各类高体验的系统也会建立在这种模式上,给予客户更加方便快捷的体验,也减轻了客户本地系统压力。今后我们只要点击浏览器,就可以登入各类系统进行操作。1第一章:网上订餐系统设计需求分析1.1网上订餐系统的任务概述网上订餐系统是基于B/S模式开发一种用户订餐系统,本系统需要实现的功能主要功能有以下的几个方面。首先,系统最为基础的功能是要实现用户的注册、用户的系统登入功能,其次,系统需要为用户提供订餐服务,其中包括点击订餐、购物篮的显示、购物篮信息的修改、提交订单等功能;同时也提供给用户查询以往订餐信息的操作,以及修改密码的操作。再有,系统需要为管理者或者我们俗称为餐饮经营者提供管理界面,包括订单接收、菜餐信息的修改等功能。通过对系统以上功能的整合分析,并结合在代码实施阶段的功能调整,搭建起一个完整的网上订餐系统。1.2网上订餐系统的设计要求1.2.1网上订餐系统功能流程第一步:进入订餐网站,如需点餐,用户首先需要注册,用户可以点击页面右上方“注册”按钮进入注册页面。第二步:请按指定格式填写用户的用户名、订餐联系手机号、电子邮箱等个人资料,并设置密码,以便下次订餐时凭借输入电子邮箱(或手机号)和密码快速登录。首次订餐用户需仔细阅读用户协议,点击“同意”接受用户协议后方可继续下一步。第三步:填写送餐地址请选择用户所在城市,并填写用户的详细地址信息以完成注册。用户输入的详细地址会保存在用户的地址簿中方便用户下次订餐提交。第四步:浏览菜单点餐选择用户喜爱的餐点,输入份数,然后选择“立即订购”。用户可以在右侧“我的订单”中看到用户的点餐内容和金额。第五步:确认送餐信息并复核订单,系统将分别罗列出用户的送餐信息以及用户的订单,用户可在此再次复核用户的地址信息和订单。点击“提交”即可完成用户的首次订餐!1.2.2网上订餐系统功能流程分析分析一:根据以上对于本订餐系统功能流程的描述,可以看到,本系统仅对注册用户提供订餐服务,而对于非注册用户不提供相应的服务,那么系统在响应相应的订餐动作时,需要作出判断,并向客服反馈!即若用户在已登入的情况下订餐,则更新购物篮信息,否则提示尚未登入,无法订餐。分析二:对于用户注册时所提供的手机号,邮箱账号等信息,我们不将其作为登入的ID使用,参考目前多数网站的做法,我们需要用户提供唯一标示身份的ID,那么为了避免冲突,我们将在注册时进行检索,来防止用户提供与其他用户相同的ID号,并提示用户修改ID,从新注册。分析三:本系统提供的用户协议也是用户订餐的操作事项,所以我们将此功能调整为用户每次进行订餐时,都需要对协议进行勾选,否则无法提交订单。1.3网上订餐系统功能过程图1.3.1网站注册、订餐过程图:(图1.1)图1.1以上过程图简单的表述了订餐和注册的一个过程图,根据对系统功能流程的介绍和分析可以看出,在进行注册和订餐时,都需要进行完整性和合法性校验,通过规则的校验才能最终提交。1.3.2管理员操作管理过程图(图1.2)图1.2以上过程图为管理员操作过程图,反应了管理员对于客户反馈的订单信息进行相应的处理操作过程,以及对于本餐饮店的一些日常店铺的管理和维护工作的操作过程。1.4网上订餐系统需求总结根据以上的分析,我们将网上订餐系统的需求归纳为以下的几个方面:1、 客户注册需求2、 客户和管理员登入需求3、 客户订餐和提交订单需求4、 管理员处理订单需求5、 管理员修改菜品信息需求6、 客户个人信息修改需求以上为该系统所总结出的六大功能需求,我们将在项目的实施阶段一一对其进行功能实现和完善。第二章 :网上订餐系统数据层设计介绍2.1系统数据层简述作为一套订餐系统,避免不了系统和用户进行数据的交互,用户需要向系统提交输入的数据信息,系统需要对用户的信息进行分析、识别和处理。所以数据层的设计对于一套系统来说是不可避免的,而且也是重中之重的。一个好的底层数据的存储设计,对于系统的运行速度、执行效率、人机交互等这些方面都有很大的影响。存储数据的方式也无外乎为三种,写内存、写数据库、写文件;这三类存储方式有其各自的优缺点,对于写内存型存储方式,主要用于即时性的数据,这类数据不要求记录也不是很重要,但在系统的运行中需要不断的进行读取调用;而对于写文件型存储,这类存储的信息多为配置信息,但也可根据系统需求进行合理使用,本系统即将用户购物篮信息和订单信息写成XML文件,使得系统更加高效;对于数据库存储,保存的多为需要进行快速检索和定位的信息,当然这些数据也是长期存储的,并且对于数据间具有关联的数据多运用数据库进行存储,这样可提高数据可维护性和数据的完整性。2.2网上订餐系统数据层2.2.1数据层-数据库表格设计简述我们将数据库表格分为三类表,分别为管理员表,用户表,菜单表。其中管理员表有两张,一张维护着管理员的登入名和密码,以及邮件信息;另一张维护着管理员登入时为进一步确定身份而进行的问题验证机制所设定的问题信息表。而对于用户表和菜单表都仅有一张表,分别维护着用户的基本信息和菜品对应的基本信息。2.2.2数据层-数据库表格设计详述管理员表主要存储着管理员的信息,管理员登入名和管理员的登入密码,以及管理员的邮箱地址;还有就是用于管理员登入时进行二次验证的问题。两张表的名字分别为admin_infor_data和admin_question_data。表admin_infor_data设计如下:FieldTypeNullKeyDefaultExtraAdmin_idInt(10)unsignedNOPRINULLAuto_incrementAdmin_nameVarchar(64)NONULLAdmin_passwordVarchar(512)NONULLAdmin_emailVarchar()NONULL表admin_question_data设计如下:FieldTypeNullKeyDefaultExtraAdmin_nameVarchar(64)YESNULLAdmin_questiontextNONULLAdmin_answertextNONULL以上为admin的两张表格的设计,初始的数据为:Insert into Admin_infor_data(admin_name,admin_password,admin_email) values('小米',md5('12345'),'xiaomi');insert into Admin_question_data(admin_name,admin_question,admin_answer) values('小米','我喜欢的花是?','百合');初始的管理员为小米,密码为12345,且使用MD5加密存储,提高安全性。并初始化需要验证回答的问题为“我喜欢的花是?”,答案是:“百合”。用户表和菜单表分别维护者用户和菜品的信息,两张表分别命名为user_infor_data和dishes,以下给出两张表的设计:FieldTypeNullKeyDefaultExtraUser_idInt(10)unsignedNOPRINULLAuto_incrementUser_nameVarchar(64)NONULLUser_passwordVarchar(512)NONULLUser_telephoneVarchar(32)NONULLUser_emailVarchar(128)NONULLUser_addresstextNONULL表user_infor_data设计如下:表dishes设计如下:FieldTypeNullKeyDefaultExtraDishes_idInt(10)unsignedNOPRINULLAuto_incrementDishes_nameVarchar(64)NONULLDishes_valueInt(10)unsignedNONULLDishes_kindVarchar(64)NONULLDishes_pathtextNONULL对于用户表,主要存储着用户的订餐电话,用户的送餐地址,用户Email,用户的登入名和密码,一样密码也采用MD5加密后存储,提供数据库的安全性。对于菜单表,主要存储菜单的菜品名、菜品的价格、菜品所属的菜系、菜品图片所存储的路径。(图2.1)图2.1本系统采用的数据库为MYSQL数据库,本类型数据库具有小巧,易维护等特点,多适合于小中型网站的数据库选择。且该类型的数据库免费提供给开发者使用,对于学习型的开发者来说是较好的一种学习选择。并且,这种数据库可以支持各种语言的访问,如Java、PHP等语言对其都有较好的支持。尤其是PHP对其有较成熟函数支持,提供较多操作数据库的函数。一般,我们将这些函数封装成操作数据库的类,后续会进行详细的介绍。2.2.3数据层-XML文件设计简述在系统的数据层方面,我们没有全部采用数据库表形式存储,尤其对于要经常改写的一些底层数据,我们将其设计成一定格式的XML文件。这里需要引入的一个技术即为DOM编程技术,该技术可以将一定格式的XML文件转化为一棵XML文件树,文件树维护着XML文件中的各个节点信息。通过DOM提供一些操作函数和类内置变量可以利用我们方便地操作一棵XML文件树,达到以一定的格式读写XML文件树的目的。基于XML文件的存储速度快,易于操作的优点,我们将用户的购物篮中的信息写成一个XML文件以及将用户提交的订单也写成一个XML文件。2.2.4数据层-XML文件设计详述将用户购物篮信息保存成XML文件,我们需要考虑到每一个用户维护着自身的购物篮信息,而这些购物篮信息又都存储在同一个XML文件中,所以如何区分存储是设计XML文件的主要内容。同时对于存储的信息的选择也非常的关键,这里的设计主要是要防止数据的冗余存储。我们将用户存储购物篮信息的XML文件命名为:order_dishes.xml文件,其设计如下(图2.2)图2.2可以看到,此XML文件的根节点为order_dishes,每个user_id维护了一个ID属性,用于区分不同用户提交的购物篮信息,同时user_id为根节点的子树下维护着所订购的菜品的名字和份数信息。其实构建了四层子树的文件结构(图2.3)。图2.3将用户提交的订单信息保存到XML文件中,也是依然需要对不同用户提交的信息进行区分,而且,由于系统提供以往订单查询的功能,所以对于提交的订单,我们需要给每天的订单加上相应的时间戳,来区别不同时间所提交的订单信息。再有,对于用户提交的订单,我们需要加上相应的标准位,来确定本条记录是否已经处理,及餐厅是否已经接受订单,若已接受及不再给餐厅进行处理。我们将接受订单信息的XML文件命名为:submit_order_dishes.xml文件,其设计的结构如下(图2.4)图2.4这里将XML的根节点设为submit_order,order_time作为其子节点,在其属性time标记上描述着订单提交的日期,那么这一天提交的所有订单都会存储在这个节点下。同上,使用order_id来区分不同的用户提交的订单信息,订单信息中描述着订单的菜品、菜品份数、价格、送餐地址、联系电话、送餐时间等。其中有个state的子节点用于标记此份订单是否已被处理,未被处理显示“on”,已被处理显示“off”。同样这里也维护着一棵五层模式的XML文件树(图2.5)图2.52.3网上订餐系统数据层设计总结以上介绍了网上订餐系统的数据层设计,数据层的设计是通过写内存和写文件结合的方式进行的,一些需要进行多次更改的数据,如用户购物篮中的数据以及用户多次提交订单的数据,我们使用写文件的方式,即上述的写XML文件的方式进行数据的录入和获取。而对于不需要经常进行更改的数据这里使用数据库进行存储,即如上述的菜品信息以及管理员、用户信息。这样的设计可以提高系统的执行效率,提高系统的运行速度,同时也贴合系统的需求。总之,该数据层的设计达到了对于各类数据的存储与提高各类数据处理效率的目标。第三章 :网上点餐系统管理层功能设计与实现3.1系统管理层简述管理层,作为一块功能层的总称,在大多数的系统中都会有这一功能模块,其在系统中的主要作用是维护系统的各类数据。通俗的讲,管理层也作为系统的一类用户,也管理着一类数据,其区别在于系统所授予数据操作的权限不同,管理层所感兴趣的需求与一般用户的需求也不同,所以其功能上需要作为一个独立的模块进行分析。3.2网上订餐系统管理层功能设计与实现3.2.1管理层-管理员登入功能三层模式设计管理员登入根据三层模式的特点,将功能模块分为视图层、处理层、数据层,在此功能上,视图层上主要是用于接受管理员的登入请求,视图层的界面分为登入界面(Restaurant_login.php)、二次问题验证界面(Restaurant_login_question.php)。而对于处理层分为数据处理(Restaurant_login_process.php)、数据服务(用于处理提交到后台的合法数据)(Restaurant_login_service.php),数据处理页面会调用(call)数据服务中的函数,来得到相应的功能函数。总之,数据处理调用功能函数,根据函数返回的结果来判断是否为合法登入。(设计见图3.1)图3.13.2.2管理层-管理员登入功能实现管理员登入功能的实现主要在于通过管理员提交的数据和后台的数据进行校验,来达到检验管理员身份是否合法的目的。管理员登入数据处理代码,即位于Restaurant_login_process.php中的代码,这里对数据进行初步的校验和分析,主要对数据完整性和合法性进行检验。登入功能第一层校验,用户名密码校验,其代码如下:if(!empty($_POST'loginname')&&!empty($_POST'password')&&!empty($_POST'checkcode')/查看登录数据的完整性 $login_name=$_POST'loginname' $password=$_POST'password' $check_code=$_POST'checkcode'/接收登入信息(登录名、密码、验证码) else header("location:Restaurant_login.php?error=1");/信息不完整,返回错误信息。 exit(); if(!empty($_SESSION'checkline')$check_line=$_SESSION'checkline'/获取验证码if(!empty($_POST'login_model')$login_modle=$_POST'login_model'/获取登入模式(一般用户、管理员)if($check_line=$check_code)/校验验证码 $res=$login_service->check_password($login_name,$password,$login_modle); if($res)/调用check_password函数检验密码,正确返回true,错误返回false if($login_modle="admin") $_SESSION'admin_name'=$login_name;/将登入名写入session中 $_SESSION'login_one'=1;/用于标记第一层检验通过 header("location:Restaurant_login_question.php");/验证通过,跳转至第二层 exit(); else header("location:Restaurant_login.php?error=3");/密码错误,返回错误信息 exit();else/验证码错误,返回错误信息header("location:Restaurant_login.php?error=2");exit();登入功能第二层校验,管理员问题校验,其代码如下:if(!empty($_GET'question_check')/提交是数据来自问题校验功能模块 if(!empty($_POST'login_answer')&&!empty($_POST'checkcode')/完整性校验 $check_code=$_POST'checkcode' if($_SESSION'checkline'=$check_code)/检验验证码 $login_name=$_SESSION'admin_name' $login_answer=$_POST'login_answer'/接收校验数据 $res=$login_service->check_answer($login_answer, $login_name); if($res)/调用check_answer函数,正确返回true,错误返回false $_SESSION'login_two'=1;/管理员登入成功标记,写入session中 header("location:Restaurant_admin_page.php"); exit();/登入成功,跳转至管理员界面 else/答案错误,返回错误信息 header("location:Restaurant_login_question.php?error=3"); exit();/ else /验证码错误,返回提示信息 header("location:Restaurant_login_question.php?error=2"); exit(); else header("location:Restaurant_login_question.php?error=1"); exit(); /验证信息不完整,返回错误信息check_password($login_name,$password,$login_modle)函数代码如下:public function check_password($login_name,$password,$login_model) $mysql=new Mysqli_stmt_h();/新建一个数据库操作类对象 if($login_model="admin")/构造管理员登陆模式SQL语句 $sql="select admin_password from Admin_infor_data where admin_name='".$login_name."'" $arr=$mysql->oper_query($sql);/执行返回数据库中的密码 $mysql->conn_close();/关闭数据库连接 if($arr00=md5($password)/与用户提交的密码进行对比 return 1;/相同返回1 else return 0;/不同返回0 check_answer($login_answer, $login_name)函数代码如下:public function check_answer($login_answer,$login_name) $mysql=new Mysqli_stmt_h();/新建一个数据库操作类对象 $sql="select admin_answer from admin_question_data where admin_name='".$login_name."'"/构造SQL语句 $arr=$mysql->oper_query($sql);/去数据库中的问题 $mysql->conn_close();/关闭数据库连接 if($login_answer=$arr00) return 1;/答案正确返回1 else return 0;/答案错误返回0 以上的两个函数都位于Restaurant_login_service.php的login_service类中,所以调用时通过该类的对象即可进行调用。以上即为管理员登陆的代码实现过程和介绍。3.2.3管理层-管理员登入功能图示登入页面图示见图3.2,这里选择登陆模式为“管理员”。图3.2问题验证页面见图3.3,系统显示的问题,需要管理员进行回答。图3.3以上即为管理员登陆过程的图示,这里设计双重登入校验是考虑到系统的安全性。3.2.4管理层-管理员操作功能三层模式设计首先,对于管理员来说,他具有最高权限,既能操作数据库中的数据,也可以操作XML文件中的数据,那么底层的数据层具有数据库中存储的数据,也有XML文件中存储的数据需要管理员操作。其实这里就是涉及到菜单中菜品信息的更新,还有就是有关于订单的处理。那么在视图层涉及的视图页面也就是菜单更新界面、订单处理界面、日订单数据查看界面(这里的日订单数据是模拟的数据,通过作图工具表示的条形图)。对于业务层,即处理层包含的业务处理有订单数据处理以及菜品更新的处理页面和函数。设计图见(图3.2)。图3.43.2.5管理层-管理员操作功能实现就本系统来讲,管理员操作主要为订单查看以及菜品更新,这里也就只这两项功能的实现进行详细介绍。点击查看订单,页面跳转到Restaurant_check_user_order.php,这个页面会给出订单信息,点击处理即可处理订单信息。下面给出实现代码:$i=0;/调用get_submit_order_dishes函数操作XML文件$arr=$check_order_service->get_submit_order_dishes();/获取当天的未处理订餐信息if(!empty($arr)/判断当天订餐信息是否为空foreach ($arr as $key_id=>$val)/foreach循环显示订餐信息 echo"<div class='record'>"/每一个订餐信息使用DIV包围 foreach ($val as $key=>$val) if(is_string($key) echo"菜名:".$key."-份数".$val."<br>" else if(is_int($key)if($i=0)echo "地址:"elseif($i=1)echo"价格:"elseif($i=2)echo"时间:"elseif($i=3)echo"电话:" echo"$val<br>"$i+; /不为空,即显示出订单信息 echo"<a href='Restaurant_check_user_order_process.php?order_id=$key_id'>处理</a>"/处理超链接,将订单处理请求发送至Restaurant_check_user_order_process.php echo"</div>" elseecho"<div class='record'>"echo"暂无订餐记录!"echo"</div>"/为空返回订餐信息为空订餐处理实现代码如下,Restaurant_check_user_order_process.php中的代码主要用于接收订单处理消息,根据该消息,选取相应的函数处理:$check_order_service=new check_order_sevice();if($_GET'order_id') $order_id=$_GET'order_id' $check_order_service->deal_submi