1、网上订餐系统1. 课程设计目当计算机与互联网飞速发展和使用,越来越多公司、单位和个人通过网站提供服务、发布信息、交流知识等使互联网越来越以便咱们生活。在Web开发中,Java语言以其可扩展性、灵活性、可靠性和跨平台等特点,成为进行web编程首选。更重要是,开源社区提供了一大批功能强大框架技术,Structs、Spring、Hibernate等,运用这些技术使咱们更高效维护和建立咱们自己网站同步也让网站开发更加以便和快捷。在这学期课堂上所学到Java知识,可觉得咱们解决某些实际问题能力。运用一周时间,使用Java框架技术完毕网上订餐系统分析设计和开发。有了网上订餐系统,人们可以在家随意挑选自己爱
2、慕食物。当前正是经济全球化时代,运用网络,咱们可以浏览不同地区甚至不同国家商品,这也变化着人们消费观,网上订餐系统正是符合了这一趋势发展,越来越多人可以不出门就能吃上美味可口饭菜。2.设计方案论证2.1需求分析随着科技进步、计算机技术发展,越来越多人选取用网络来满足自己需求,网上订餐浮现,正是体现了这一点。不少商家都把眼观放在了网上销售这一方面,把实体销售徐徐转变为网上销售。当前人们越来越注重节约时间,提高效率,不论是消费者还是商家都如此,有了网上订餐系统,可以让订餐者与餐厅进行互动,足不出户,选取自己爱慕菜品,对与商家而言,这样做节约了成本,不需要为实体店地址而烦恼,这样做对于商家和消费者来
3、说无疑是双赢。2.2系统总体设计本系统为了便于各种操作,采用多页面模式。顾客可在不同网页进行相应操作:在管理员信息表中,涉及数据项:帐号,密码,权限,注册时间。在订餐客户信息表中,涉及数据项:顾客编号,顾客名,密码,姓名,电话,身份证,注册时间等。在菜品信息表中,涉及数据项:菜品编号,菜品名称,菜品价格,内容,类别,添加时间等,每道菜均有它菜名、简介、价格等信息,为了让菜品这些信息在页面有个较好呈现,咱们把这些信息存入菜品信息表中进行维护。在定单列表中,涉及数据项:定单列表编号,顾客名,菜品编号,下单时间等。在购物车信息,涉及数据项:购物车信息唯一标记,食品id,订餐顾客名,添加时间等。当顾客
4、选购菜品放入购物车时,咱们会把这些菜品id、数量、价格记录存入订单关联表中,通过订单关联表中信息算出会员将要支付金额,再通过菜品id这个主健把相应信息存入个人订单这张表中进行维护。为了有效地管理菜品,在新增菜品时加了一种分类属性,在此需要建张分类表进行维护,系统总体功能图如图1所示。后台菜肴价目信息发布餐厅销售记录顾客留言及售后服务前台顾客管理菜单浏览订单管理顾客反馈网上订餐系统图1 系统功能框图2.3 系统流程设计课程设计信息管理系统,涉及顾客注册、管理员登录、菜品查询、菜品详单等。任务执行流程如图2所示。进入系统主界面管理员登录浏览页面顾客注册顾客登录菜品搜索选购商品顾客注册数据库数据库操
5、作页面加入购物车订单查询后台管理系统公示结账注销登录图2 系统流程图2.4 数据库设计该系统是借助MySQL数据库对数据进行统一管理。在网上订餐系统中需MySQL创立数据库“订餐管理系统”, MySQL数据库中数据操作可以分为四种不同类型,分别是添加、删除、查询和修改。该数据库包括表有菜品信息表、管理员表、订单表等。2.4.1菜品信息表菜品信息表,记录系统中菜品信息。把中文转化为汉语拼音,作为字段名。把ID设为主键,且不为空,bianhao、mingcheng、leibie、tupian、jianjie、jiage、faburen、addtime与之有关联,如表1所示。表1菜品信息表字段名类型
6、长度与否为主键与否为空阐明idint11是否菜品编号bianhaovarchar20否是菜品编码mingchengvarchar50否是菜品名称leibievarchar20否是菜品类别tupianvarchar50否是菜品图片jianjievarchar50否是菜品简介faburenvarchar30否是发布人2.4.2 管理员信息表管理员信息表,存储系统中管理员信息。把中文转化为汉语拼音,作为字段名。其中,ID设立为int型,并设为主键,且不能为空;username、pwd设立为varchar型,如表2所示。表2 管理员信息表字段名类型长度与否为主键与否为空阐明IdInt10是否顾客编号u
7、sernameVarchar30否是顾客姓名PwdVarchar30否是顾客密码2.4.3顾客注册信息表顾客注册信息表,记录系统中注册顾客信息。把中文转化为汉语拼音,作为字段名。把ID设为主键,且不为空,zhanghao、mima、ximgming、diqu、zhaopian、issh与之有关联。表3 顾客注册信息表字段名类型长度与否为主键与否为空阐明idint11是否编号Zhanghaovarchar30否是账号mimavarchar20否是密码Xingmingvarchar30否是姓名Diquvarchar50否是地区Zhaopianvarchar50否是照片Isshvarchar10否是
8、备注2.5 重要功能用struts框架中异常解决机制,本系统自定义了异常类SystemException和异常解决类SystemExceptionHandler。在MessageResources.properties中定义需要在Dao中抛出异常时声明内容。在struts-config.xml中配备公共异常解决文献,加入资源文献在Dao中抛出自定义异常。并在公共异常解决页面中使用struts标签进行异常信息显示。顾客模块为封装异常跳转页面如下图3所示:图3在struts-config.xml文献中配备信息如下:在配备文献中可见,异常是以键值对方式在struts1.1中存储,type属性是指异常
9、类,handler属性是指异常解决类,path属性是指浮现异常后跳转错误页面。3. 设计成果与分析3.1订餐系统登录界面设计该系统通过输入顾客名和密码进行登录,登录界面如图4所示。图4 登录界面功能描述:顾客登陆管理,涉及登陆时管理员需要输入顾客名、密码、验证码、也可已选取与否记录顾客名和密码以便后来登录。如果管理员选取记住顾客名和密码则下一次登陆时候只需要输入验证码,即可直接登录。(1) 登录页面控制模块Login有关代码如下:login.jsp:登录页面 /head 订餐系统 public class ALogin public void doLogin ( Hashtable input
10、Data,Hashtable outputData, HttpSession mySession ) throws Exception /获取输入信息 String sUsername = (String)inputData.get(username); String sPassword = (String)inputData.get(password); /校验顾客输入信息LUserlUser=(LUser)GlobalObjectProvider.getLogicService(CommonConst.LOGIC_KEY_USER); /如果相应类没有话,报错并返回login页面 if (
11、 lUser = null ) throw new Exception(顾客名或密码错误请重新输入! ); /获取顾客信息 User userInfo = lUser.getUserInfo( sUsername,sPassword ); if ( userInfo = null ) outputData.put( pageId,CommonConst.VIEWID_LOGIN ); outputData.put( errMsg,顾客名密码检查失败!请重新输入。 ); outputData.put( username,sUsername ); return; Else outputData.p
12、ut( pageId,CommonConst.VIEWID_MENU); /往session中设立顾客信息 mySession.setAttribute( loginUser,userInfo ); return; 3.2订餐系统主页面模块设计顾客可以通过订餐系统主页面进行订餐如图5所示。图5功能描述:顾客登陆管理,涉及(1) 登陆时可以以游客或者会员两种方式进行订餐操作,如果是会员登陆,先前需要录入顾客名、密码、验证码,以便系统确认登陆成功。(2) 会员个人信息管理,会员可以修改个人资料(如:电话,地址等),也可以查看订餐信息,理解当前订餐动态(详见会员登录流程图)。(3) 选购美食,作为顾
13、客,在挑选美食过程中,可以直接将称心美食选进购物车中也可通过一系列查询,进一步理解后,再选取美食(详见选购美食流程图)。选购美食某些代码如下:/得到在Spring中动态注入Service层对象/得到日记对象logpublic ActionForward queryForAll(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response) String forward = first;if(request.getParameter(user).equals(manage
14、r)forward = queryDishes ;Food food = new Food() ;List foodList = null ;List topList = null ;int allRecorders = foodService.queryForAllRecorders(food) ;/当不是第一次登陆页面时if(request.getParameter(cp)!=null&request.getParameter(ls)!=null)intcurrentPage = Integer.parseInt(request.getParameter(cp) ;int lineSize
15、 = Integer.parseInt(request.getParameter(ls) ;if(currentPage1&lineSizeallRecorders)currentPage = 1 ;food.setCurrentPage(currentPage) ;food.setLineSize(lineSize) ;foodList= foodService.queryForFood(food) ;else/第一次来到页面,top5和食品图片等信息foodList = foodService.queryForFood() ;int pageSize = (allRecorders + f
16、ood.getLineSize() - 1) / food.getLineSize() ;request.setAttribute(pageSize,pageSize) ;request.setAttribute(allRecorders,allRecorders) ;topList = foodService.queryForTop() ;/下拉列表中信息List foodAttributeList = foodService.querySelectInfo();/传给top10listrequest.setAttribute(topList,topList);/传给视频图片等信息listr
17、equest.setAttribute(foodList,foodList);/传给下拉列表listrequest.setAttribute(foodAttributeList,foodAttributeList) ;return mapping.findForward(forward);一方面判断是从哪个页面跳到到这里来调用这一办法,随着调用者不同,办法也会将最后传播到不同页面中去。然后查询出所有美食记录数,再对与否是第一次登录到此页面进行判断,觉得,第一次登录时当前页数和每页显示行数是默认,而此后登录到此页面时有也许发生变化,最后再用Spring中动态注入服务层中食品类对象调用查询食品信息
18、办法,再将成果通过request对象传播到相应页面中去。public String getFoodInfo(String src) /图片绝对途径String picsrc = null;String foodInfo = null ;/只保存相对途径,将绝对途径去掉String temp = src.split(/);for (int i = 0;i temp.length;i+) /得到图片相对途径picsrc = temptemp.length - 1;Food fd = foodDAO.query(picsrc);foodInfo = fd.getFoodDescription() ;
19、return foodInfo;此办法要在jsp页面中有DWR对象调用,其中得到途径是图片在服务器上绝对途径,一方面用String类中split办法将其截成数据库中所存入得图片途径形式,然后再作为查询条件在数据库中查询,查询出美食信息。然后DWR对象会将查询出来信息作为jsp页面中回调函数参数传回页面端。3.3 美食信息添加功能模块功能描述:对菜品信息进行维护,涉及:添加菜品,添加菜品图品,价格,与否是推荐菜品等。菜品过季下架,用于菜品原料缺少或菜品过季等状况,进行逻辑删除。菜品查询,可以按菜品名称、价格、销售量、与否是推荐菜品进行查询,默认是推荐菜品查询。修改维护菜品信息,重要针对菜品原料价
20、格更变菜品价格及菜品是打折时价格更变,如图6所示。图6美食添加中图片上传功能代码如下:/*图片上传*/定义局部变量try IPTimeStamp its = new IPTimeStamp(request.getRemoteAddr() ;/自动为上传图片命名,以拟定图片唯一性,以防覆盖foodPictureAddr = its.getIPTimeStampRand()+.+its.getLastName(file.getFileName() ;stream = file.getInputStream(); filePath = this.getServlet().getServletCont
21、ext().getRealPath(/images/food)+/+foodPictureAddr; bos = new FileOutputStream(filePath); int bytesRead = 0; byte buffer = new byte8192; while (bytesRead = stream.read(buffer,0,8192) != -1) bos.write(buffer,0,bytesRead); catch (Exception e) e.printStackTrace() ;finally try bos.close(); stream.close()
22、; catch (IOException e) e.printStackTrace(); catch(Exception e)file.destroy();/*图片上传结束*/一方面,有系统自动未上传图片命名,防止覆盖,然后通过字符串拼接方式作为图片地址存入数据库(例如:图片名称叫aaa,扩展名为jpg,在存入数据库中地址就是相对地址系统自动生成名字.jpg),在通过输入输出流方式将图片上传到服务器上。即由从form中得到图片途径以流方式服务器上一本系统自动并命好文献上,最后关闭输入流和输入流,并将文献损毁。另附图片自动命名类某些代码如下/为了得到不重复图片名称(一方面用数字零给本机IP地址点
23、补位,然后再加上当前时间(精准到毫秒),最后再加上三个随机数)/定义局部变量public String getIPTimeStampRand() StringBuffer buf = new StringBuffer();if (ip != null) String str = this.ip.split(.);for (int i = 0;i str.length;i+) buf.append(this.addZero(stri,3);buf.append(this.getTimeStamp();Random rand = new Random();for (int i = 0;i 3;i+
24、) buf.append(rand.nextInt(10) ;return buf.toString() ;ip已经在实例化自动命名类对象是赋值,即是本机ip地址,将ip地址通过“.”字符来分开有字符串数组接受,再将每某些未满三位进行补零操作,再加上时间戳,最后加上三位随机数,再将StringBuffer转换成String对象最后得到内容既是系统为图片自动赋好名字。另附美食类别解决代码如下:if(!attributeId.trim().equals(0)&!(attributeId.trim().equals()food.setFoodTypeId(attributeId) ;else/新类别
25、foodAttributeValue = foodService.queryFoodAttributeId() ;foodAttributeId = foodAttributeValue.getAttributeId() ;try /调用bean中changeAttributeId办法将foodAttributeId转换成foodattribute表中格式attributeid = foodAttributeValue.changeAttributeId(foodAttributeId) ; catch (Exception e) / 超过3位,提示减少不必要食品类型,或者联系hhqe.pri
26、ntStackTrace();log.error(系统添加食品类别信息过多!,e);throw new SystemException(foodattributelargenum.error,e);foodattribute = new FoodAttribute() ;foodattribute.setAttributeId(attributeid) ;foodattribute.setAttributeName(newAttributeName) ;/将新类别向属性表中插值try isAdd = foodService.addFoodAttribute(foodattribute) ; c
27、atch (Exception e) e.printStackTrace();log.error(系统添加食品类别信息时错误!,e);throw new SystemException(foodattributeadd.error,e);if(isAdd=true)food.setFoodTypeId(attributeid) ;基于美食类别操作可添加性,则需要判断是在文本框中填写美食内容(即:新类别),还是在下拉菜单中选取内容(即:老类别),如果是老类别则可以运用原有类别编号直接填入数据库中。而如果是新类别则需要生成新类别编号,再将类别编号填入到数据库中。3.4订单查询功能描述:对顾客购物车
28、所下订单进行管理,涉及:查看订单,可按订单号、顾客姓名进行查询管理员可以查看到当前餐厅订单,并可以进行打印订单以确认发货。修改订单,管理员对不在自己店范畴内订单可进行手动或者可以在订单状态为等待中时为顾客修改菜品数量及品种,若订单状态为如下单则不能为顾客修改。打印订单,若打印订单表达以确认发货,并自动修改订单状态为已发送。取消订单,若顾客不以便上网打电话要取消订餐话,管理员查看订单状态若为已下单则不能为顾客取消订单,若订单状态在等待中,则可觉得顾客取消订单,如图7所示。图7 订单信息查询页面查询订单某些代码如下:SELECT temp.* FROM(select o.orderid as or
29、derId , to_char(o.ordertime ,yyyy-MM-dd HH24:mi:ss ) as orderTime , o.receivername as receiverName , o.receiveraddr as receiverAddr , o.receivertel as receiverTel , o.orderallprice as orderAllPrice , a.attributename as orderStatus , o.nodes as nodes , rownum as rn from ordertable o,attributetable a
30、where o.orderstatusid = a.attributeidand o.orderstatusid not in (06001,06002)ando.memberusername like #memberUserName#and !CDATA rownum )temp WHERE ( #currentPage# - 1 ) * #pageSize# 由于iBatis框架多持久层进行封装,因此SQL语句在写法上会有些不同,针对物理分页这一规定,采用由rownum来控制输出列数,在查询成果上,也用到了oracle自己函数to-char来对日期类型进行解决。其中,在select标签中,
31、id属性相应在DAO实现类中对象smctemplate所调用queryForList办法第一种参数,借此找到此SQL,来进行查询操作。resultClass与parameterClass分别表达,成果类类型和参数类类型,其中尚有标签是iBatis中使用rownum来进行分页操作所必要应用到。而如果在页面上点击“查看订单详情”则会弹出一种模态对话框,该对话框由两某些构成,上半某些是美食信息,有美食名称、美食份数、美食单价、美食总价四个属性,而其中有“沿着此处剪开”字样,下半某些则是顾客信息有订单号、订单状态、收货人、地址、联系电话、总价、支付方式、订单时间、备注信息几项构成。4.设计体会通过一段
32、时间设计和开发,网上订餐系统基本开发完毕。其功能基本符合大众需求,可以完毕菜肴更新,菜肴查询,菜肴下单,后台管理等各种功能但是由于课程设计时间较短和本人水平所限,虽然谢教师予以了我诸多指引,但是该系统尚有许多不尽如人意地方,对于Java框架技术我还需要进一步进行学习。如今信息化普及,要想使该系统能在海量网上订餐系统中脱颖而出,以咱们编写能力,及咱们对需求分析和理解以及业务上纯熟限度都显得远远不够。尚有某些后续工作需要完毕,下一步改进一定做到层次更清晰,功能划分更明确,以实现更好扩展性和重用性。5.参照文献1 严璋鹏基于B-S学生学籍管理系统设计与实现J价值工程.19:33-412 李刚. 轻量
33、级J2EE公司应用实战Struts+Spring+Hibernate整合开发M .北京:电子工业出版社,.3:46-753 贾素玲,王强. JSP应用开发技术M .北京:清华大学出版社,.7:35-764 王海涛,贾宗璞.基于Struts和HibernateWeb应用开发J.计算机工程,,37(9):113.5 沈应逵. Java Web数据库系统应用开发与实例M.北京:人民邮电出版社,.9:102-134.6胡涛涛. 基于MVC模式课程管理系统功能设计J. 山西煤炭管理干部学院学报,04:140-142.7任广财. 基于JSP高校学生工作管理系统设计与开发J. 科技经济市场,12:119-1
34、20.8施阳,张海燕,戴德伟. 基于JavaEE毕业设计管理系统设计与实现J. 软件导刊,02:86-88.9赵春生. 浅谈JavaEE程序设计课程教学改革J. 科辅导刊(中旬刊),08:119-120.10 刘晓华,张健,周慧贞JSP应用开发详解(第三版) M北京:电子工业出版社,16.附录:public class CommonServlet extends HttpServlet /保存各页面Id相应action类对象 private Hashtable hPageHandler = new Hashtable(); /配备文献存储位置 private JXPathContext con
35、figContext = null; public void init() /获得配备文献,并获得其中dom元素 String filePath = getInitParameter(configXML); String fileRealPath = getServletContext().getRealPath(filePath);/尝试建立配备文献DOM try org.jdom.input.SAXBuilder builder = new SAXBuilder(); org.jdom.Document pDoc = builder.build(fileRealPath ); config
36、Context = JXPathContext.newContext(pDoc); GlobalObjectProvider.init( configContext ); catch(Exception e) System.out.println(Servlet初始化失败!); /初始化共通类以获取页面信息 CommonConst.init(); /每一种动作第一次执行时候,初始化相应类 public void doPost ( HttpServletRequest request, HttpServletResponse response ) throws ServletException,
37、IOException /设立提交表单中文编码 request.setCharacterEncoding(GBK); HttpSession mySession = request.getSession(true); /得到顾客输入信息 String sPageId = request.getParameter(pageId); String sActionId = request.getParameter(actionId); if ( sPageId = null | sPageId.equals() | sActionId = null | sActionId.equals() ) /非法进入页面,跳转到首页 mySession.invalidate(); resp
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100