首页 软件工程课程设计--无线点菜系统设计报告

软件工程课程设计--无线点菜系统设计报告

举报
开通vip

软件工程课程设计--无线点菜系统设计报告软件工程课程设计--无线点菜系统设计报告 本文由蓝鹰小组贡献 pdf文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 目录 一、题目 ………………………………………………………………………. 二、任务与要求 ………………………………………………………………. 三、课程设计摘要及整体方框图 ……………………………………………. 四、课程设计原理分析及相关知识概述 ……………………………………. 2 2 2 3 1 需求分析 1.1 1.2 1.3 1.4 1.5 1.6 1....

软件工程课程设计--无线点菜系统设计报告
软件 工程 路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理 课程设计--无线点菜系统设计 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 本文由蓝鹰小组贡献 pdf文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 目录 一、题目 ………………………………………………………………………. 二、任务与要求 ………………………………………………………………. 三、课程设计摘要及整体方框图 ……………………………………………. 四、课程设计原理分析及相关知识概述 ……………………………………. 2 2 2 3 1 需求分析 1.1 1.2 1.3 1.4 1.5 1.6 1.7 .……………………………………………………………………….. 3 3 3 3 3 4 4 5 项目背景 …………………………………………………………………….. 名词解释 …………………………………………………………………….. 可行性分析 ………………………………………………………………….. 对其他产品的影响 ………………………………………………………….. 安全性评估 ………………………………………………………………….. 功能详述 …………………………………………………………………… . 其他问题描述 ……………………………………………………………….. 2 用例建模 …………………………………………………………………………. 5 2.1 系统用例图 ………………………………………………………………….. 5 2.2 用例概述 …………………………………………………………………….. 6 2.3 用例详细设计 ……………………………………………………………….. 7 3 领域建模 ………………………………………………………………………….. 13 3.1 系统类图 …………………………………………………………………….. 13 3.2 状态图 …………………………………………………………………..…… 15 4 架构设计 4.1 4.2 4.3 4.4 …………………………………………………………………….…… 19 19 21 24 25 鲁棒性分析 ……………………………………………………………..……. 应用架构模式 …………………………………………………………………… 概念性架构 ……………………………………………………………………… 逻辑架构 …… 5 系统实现 5.1 编码 5.2 测试 …………………………………………………………………………… 27 ……………………………………………………………………………… ……………………………………………………………………………… 27 27 五、结论 ………………………………………………………………………. 32 六、体会与收获 ………………………………………………………………. 32 附件: 1、源程序代码 …………………………………………………………… 33 1 一、 题目 课程设计课题: 无线点菜系统 二、任务与要求 按照软件工程思想开发一套 XXX 系统,要求有需求分析,软件设计及代码 实现。最后提交纸质文档与电子文档。(注:电子文档发到:xindj@Foxmail.com) 三、课程设计摘要及整体方框图 设计摘要: 当前服务业不断发展, 效率与质量的竞争已经成为各服务商共同的目标。 长沙素有食府之美称,大街小巷都是美食店,小吃店。本系统主要针对的人 群就是这些业主而设计。系统小巧灵活、效率高、底成本、高率润。经过 1 礼拜的需求分析,2 个礼拜的编码测试,第一个可运行版本终于诞生。再经 过黑盒测试和单元测试,目前已经到达了 1.3 版本。虽然界面有待改进,但 是该系统的所有功能都基本完成。 整体方框图: 客户端 服务端 点菜 接收客户 请求 查询菜单 状态 网 络 信 息 通 讯 处理菜单 更改菜单 信息 修改菜肴 状态 结账 菜肴管理 2 四、课程设计原理分析及相关知识概述 1 需求分析 1.1 项目背景 我们生活在一个充斥着数字技术的世界里无线通信技术发展的突飞猛进,移 动生活、 移动办公已经从一种空中楼阁般的幻想转变成大众生活中随手可及的实 用技术。而传统劳动密集型、低科技含量的餐饮业,也在潜移默化中折服于无线 网络科技的无穷魅力,悄然发生着技术革命,而其中最为突出的应用就是无线点 餐技术。 然而无线点菜系统还没有基于平板电脑的版本。 1.2 名词解释 用户:餐厅服务员 厨师长:管理、指挥厨师的人。 顾客:去餐厅吃饭的客人 1.3 可行性分析 1.3.1 前期调研信息 从阿里巴巴获取的数据可以得知: 最便宜的 PDA 为 850 元, 其规格如下: CPU Samsung 中央处理器 400MHz WIFI IEEE 802.11b/g LCD 2.8“触摸 TFT LCD 320*240 像素,65536 色 摄像头 内置 130 万像素摄像头,支持正常及微距拍摄 系统内存 32MB 系统储存 256MB 操作系统 Windows CE 5.0 或 Window mobile 6.1 系统 1.3.2 项目预期目标 开发完成后一年内销售 10 套系统 1.4 对其它产品的影响 与餐厅收银、财务管理系统的对接 3 1.5 安全性评估 内部使用,安全性没有要求 1.6 功能详述 1.6.1 无线点菜系统客户端功能 1.6.1.1 开桌功能 功能点描述:服务员选择输入顾客桌号 1.6.1.2 顾客点菜功能 功能点描述:顾客根据喜好选择自己喜欢的菜肴,可以增加,删除菜 肴。 1.6.1.2.1 增加菜单项 顾客选择喜欢的菜肴到自己的菜单中。 1.6.1.2.2 删除菜单项 顾客可以删除已选的菜单项。 1.6.1.3 菜单传送功能 功能点描述:顾客点完菜后点击确定按钮,菜单传送到服务器端。 1.6.1.4 顾客修改菜单功能 功能点描述:顾客在厨师做指定的菜之前可以更换, 删除菜品。 1.6.1.5 查看菜单功能 功能点描述:顾客可以随时查看菜单信息,每个菜的进度。 1.6.2 无线点菜系统服务端功能 1.6.2.1 接受菜单 功能点描述:服务端接收客户端传送来的菜单 1.6.2.2 厨师查看菜单 功能点描述:厨师查看菜单详情 1.6.2.3 厨师修改菜单项状态功能 功能点描述:厨师可以修改菜单项的状态,如 未做,已开始,已完成。 4 1.6.2.4 接收客户端查询请求 功能点描述:服务器接收客户端查询请求并响应 1.6.2.5 接收客户端修改菜单信息 功能点描述:服务器接收客户端修改菜单信息 1.6.2.6 菜肴管理 功能点描述:管理菜单的菜肴 1.6.2.6.1 增加菜肴 增加新的菜肴到菜单中。 1.6.2.6.2 修改菜肴 修改菜单中现有菜肴的信息。 1.6.2.6.3 删除菜肴 删除菜单中的菜肴。 1.7 其它问题描述 2 用例建模 2.1 系统用例图 图 2-1-1 客户端用例图 5 图 2-1-2 服务器端用例图 2.2 用例概述 2.2.1 点菜:服务员根据顾客的需要选择菜肴,当确定所需菜肴之后,通过点击确定点 菜按钮传递到厨房。 2.2.2 查询菜肴列 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf :在点菜之前,服务员查询菜肴列表,将所有的菜肴显示给用户, 供其选择。 2.2.3 添加菜肴:当客户点一道菜后,服务员点击相应菜肴将其添加到点菜列表中。 2.2.3 移除选中菜肴:如果客户不需要已经点了的某道或几道菜时,服务员根据其需要 选择对应菜肴,点击移除按钮,将其从点菜列表中删除。 2.2.4 确定点菜:当客户确定好所需菜肴之后,服务员点击确定点菜按钮,将其传送到 厨房。 2.2.5 开桌:当客户需要就餐时,服务员点击开桌按钮,初始化菜单列表 2.2.6 查看菜单状态:如果客户想要知道所点菜肴做好了没,或者需要修改所点菜肴时, 服务员首先输入桌号,点击查看菜单状态按钮来查看相应菜单状态信息。 2.2.6 修改菜单:如果客户需要修改菜单时,服务员根据其需要来修改菜单。 2.2.7 追加菜单项:当客户需要添加菜肴时,服务员选中相应菜肴,点击确定修改按钮, 6 将其传送到厨房。 2.2.8 取消菜单项:如果客户不想要某道菜时,服务员选中相应菜肴, 点击取消菜肴按 钮, 如果菜肴正在处理或者已经完成,则警告: 该菜肴正在处理或已完成, 不能取消。否则, 显示取消完成。 2.2.9 确认修改:当客户确定要修改的菜肴之后,服务员点击确认修改按钮,将修改后 的点菜列表重新传送到厨房。 2.2.10 显示菜单状态:当客户要知道所点菜做了没有时,服务员输入桌号,点击菜单状 态查询按钮来查看其状态。 如果菜已经做好了, 则显示已完成; 如果正在做, 则显示处理中; 如果还没开始做,则显示未处理。 2.2.11 结账:当客户就餐结束后,服务员选择对应桌号,点击结账按钮,系统显示消费 金额,客户付款。 2.2.12 查看菜单信息:厨师选择桌号,通过桌号来查看各桌所点的菜肴。 2.2.13 修改菜单项状态:当厨师要开始做某道菜时,将其状态改为处理中,如果已经做 好,则将其状态改为已完成。 2.2.14 菜肴管理:厨师根据菜库里各种菜的存放量来管理菜肴,可以添加,删除菜肴, 也可以修改菜肴信息。 2.2.15 添加菜肴信息:如果菜库里增加了新菜,厨师可以根据其设计出新的菜肴,并将 其信息添加到菜肴列表中。 2.2.16 修改菜肴信息: 厨师根据菜市场的菜价变化及各种情况, 及时修改菜肴信息列表。 .2.17 删除菜肴信息:如果由于某种原因不再做某道菜时,厨师可将其从菜肴信息列表 2.2.17 中删除。 2.2.18 接收客户端查询请求:厨师端接收客户端对菜肴列表的各种查询请求。 2.2.19 接收客户端点菜:厨师端接收客户端的点菜请求。 2.2.20 接收客户端修改菜单信息:厨师端接收客户端对菜单的修改请求。 2.3 用例详细设计 用例编号 用例名称 用例概述 主参与者 前置条件 后置条件 基本事件流 U001 点菜 服务员根据顾客的需要选择菜肴,当确定所需菜肴之后,通过点击确 定点菜按钮传递到厨房。 服务员 查询菜单列表 更新菜单状态 1. 进入点菜界面 2. 服务员根据顾客需要选择菜肴 3. 菜单页面自动更新 4. 点击确定菜单传递至厨房 1. 如果系统繁忙,则通知稍后再试。 2. 扩展事件流 7 用例编号 用例名称 用例概述 主参与者 前置条件 后置条件 基本事件流 U002 查询菜肴列表 在点菜之前,服务员查询菜肴列表,将所有的菜肴显示给用户,供 其选择 服务员 开桌 1. 服务员查询菜肴列表 2. 系统初始化菜单 3. 显示所有菜单供顾客选择 扩展事件流 用例编号 用例名称 用例概述 主参与者 前置条件 后置条件 基本事件流 扩展事件流 U003 添加菜肴 当客户点一道菜后,服务员点击相应菜肴将其添加到点菜列表中 服务员 进入点菜页面 1. 顾客选择所选菜肴 2. 菜肴添加到已选菜单中 用例编号 用例名称 用例概述 主参与者 前置条件 后置条件 基本事件流 扩展事件流 U004 取消菜单项 如果客户不想要某道菜时,服务员选中相应菜肴,点击取消菜肴按 钮 服务员 已选菜单已传送至服务端 1. 8 用例编号 用例名称 用例概述 主参与者 前置条件 后置条件 基本事件流 扩展事件流 U005 修改菜单 如果客户需要修改菜单时,服务员根据其需要来修改菜单 服务员 客户已经完成点餐,并且确定需要修改菜单信息 1( 顾客告诉服务员所要修改的菜 2( 服务员根据顾客的要求修改菜单信息 用例编号 用例名称 用例概述 主参与者 前置条件 后置条件 基本事件流 扩展事件流 U006 追加菜肴 当客户需要添加菜肴时,服务员选中相应菜肴,点击确定修改 按钮,将其传送到厨房。 服务员 客户已经完成点餐 1( 顾客想要添加新的菜肴,并告诉服务员 2( 服务员根据顾客的要求选中相应菜肴添加新的菜肴 用例编号 用例名称 用例概述 U007 取消菜肴 如果客户不想要某道菜时,服务员选中相应菜肴,点击取消菜 肴按钮,如果菜肴正在处理或者已经完成,则警告:该菜肴正在处 理或已完成,不能取消。否则,显示取消完成。 服务员 菜单已传至服务端 1( 顾客想要取消菜肴,并将此信息告诉服务员 2( 服务员根据顾客的要求选中相应菜肴取消菜肴, 主参与者 前置条件 后置条件 基本事件流 扩展事件流 9 用例编号 用例名称 用例概述 主参与者 前置条件 后置条件 基本事件流 U008 确定修改 当客户确定要修改的菜肴之后,服务员点击确认修改按钮,将修改 后的点菜列表重新传送到厨房。 顾客 服务员 菜单传送到服务端 1( 顾客确定要修改的菜肴 2( 服务员点击确认修改按钮 3( 服务员将点菜表重新传送到厨房 扩展事件流 用例编号 用例名称 用例概述 主参与者前置条件 后置条件 基本事件流 U008 确定修改 当客户确定要修改的菜肴之后,服务员点击确认修改按钮,将修改 后的点菜列表重新传送到厨房。 顾客 服务员 菜单传送到服务端 4( 顾客确定要修改的菜肴 5( 服务员点击确认修改按钮 6( 服务员将点菜表重新传送到厨房 扩展事件流 用例编号 用例名称 用例概述 U009 结账 当客户就餐结束后,服务员选择对应桌号,点击结账按钮,系 统显示消费金额,客户付款。 客户 服务员 客户已经用完餐 1( 客户用完餐 2( 服务员选择对应桌号,点击结账按钮 3( 系统显示消费金额,客户付款 主参与者 前置条件 后置条件 基本事件流 扩展事件流 10 用例编号 用例名称 用例概述 U010 菜单处理 当客户端成功提交菜单后,会自动添加到服务端的未处理菜单 列表,并显示到面板中。使用者可以从未处理菜单列表中选择一个 菜单处理,并添加到正在处理菜单列表中。使用者可以在正在处理 列表中选择一个菜单进行处理菜肴状态。可以修改菜肴状态为,处 理中,已完成。如果一个菜单的所有菜肴状态都已经修改成已经完 成,则该菜单状态自动变为完成。 厨师长 未处理菜单列表不为空 菜单或者菜肴状态被修改 1、从未处理菜单列表中选择一个菜肴并双击。 2、系统自动把选中的菜单信息添加到正在处理菜单列表,并 显示该菜单的所有显示信息。 3、在菜单信息面板中,选择要处理的菜肴,并双击,可以修 改菜肴状态。 初始状态为未处理,经过一次处理后, 变成正在处理, 再次双击处理后,变为已完成。 4、当一个菜单的所有菜肴状态都变为已完成时,该菜单状态 自动变为已完成。 1、 当一个菜单未处理完时, 也可以从正在处理菜单列表中选择, 并双击菜单,可以把选中菜单信息显示到菜单信息面板中,然 后可以处理菜肴。 主参与者 前置条件 后置条件 基本事件流 扩展事件流 用例编号 用例名称 用例概述 主参与者 前置条件 后置条件 基本事件流 U011 菜肴管理 当有新菜肴要添加到系统或者要修改菜肴信息或者要删除菜 肴信息时,厨师长可以通过点击菜肴管理操作进行管理菜肴。 厨师长 点击菜肴管理 1、选择添加菜肴信息或者修改菜肴信息或者删除菜肴信息按 钮。 2、系统更具用户不同选择显示不同面板和功能按钮。 3、系统按照用户操作更新数据库。 扩展事件流 11 用例编号 用例名称 用例概述 U012 添加菜肴信息 当厨房有新菜肴要添加到系统时,厨师长通过点击菜肴管理, 再选择添加菜肴按钮后,系统显示添加菜肴信息面板以及功能按 钮。 厨师长 单击添加菜肴信息按钮 1、点击菜肴管理 2、点击添加菜肴 3、输入菜肴信息,包括菜肴 ID,菜肴名称,架构,类型以及 菜肴备注信息,和菜肴图片。 4、当这些信息填写好后,点击确定添加按钮。 5、系统判断该菜肴 ID 是否已经存在,如果不存在则保存该菜 肴信息,如果该菜肴 ID 已经存在则提示用户,该 ID 不能使用。 6、等用户修改后跳到 5. 主参与者 前置条件 后置条件 基本事件流 扩展事件流 用例编号 用例名称 用例概述 主参与者 前置条件 后置条件 基本事件流 U013 删除菜肴信息 需要把系统中的一个菜肴信息删除时,可以通过点击菜肴管理, 删除菜肴信息。 厨师长 单击删除菜肴信息按钮 1、输入要删除的菜肴 ID。 2、点击查询按钮,查询该菜肴信息。 3、如果有才菜肴信息则显示该菜肴信息并到第 4 步,如果没 有改菜肴信息则系统提示错误,并结束本次操作,返回 1。 4、当用户点击确定删除按钮时,系统再次提醒用户,是否确 定删除该菜肴信息。 5、如果用户选择了确定删除,则在数据库中删除才菜肴信息。 如果选择否,则不进行任何操作。 扩展事件流 12 3 领域建模 3.1 系统类图 图 3-1-1 点菜 13 图 3-1-2 菜单处理 图 3-1-3 查询菜单状态 14 图 3-1-4 菜肴管理 3.2 状态图 图 3-2-1 查看菜单状态 15 图 3-2-2 处理菜肴状态图 16 图 3-2-3 点菜状态图 17 图 3-2-4 结账状态图 18 图 3-2-5 添加菜肴状态图 4 架构设计 4.1 鲁棒性分析 图 4.1.1 点菜 鲁棒性分析 19 图 4.1.2 查看菜单状态 鲁棒性分析 图 4.1.3 处理菜单状态 鲁棒性分析 20 图 4.1.3 菜肴管理 鲁棒性分析 4.2 应用架构模式 图 4.2.1 应用架构点菜 21 图 4.2.2 应用架构查看菜单状态 图 4.2.3 应用架构修改菜单状态 22 图 4.2.4 应用架构菜肴管理 23 4.3 概念性架构 24 4.4 逻辑架构 图 4-1-1 点菜 图 4-1-2 菜单处理 25 图 4-1-3 查询菜单状态 图 4-1-4 菜肴管理 26 5 系统实现 5.1 编码实现 请看附录1: 5.2 运行测试: 5.2.1 客户端运行界面: 27 5.2.2 确定添加菜肴 5.2.3 确定点菜 28 5.2.4 查看菜单状态 29 5.2.5 服务端主界面 5.2.6 确定处理菜单 30 5.2.7 确定处理菜肴 5.2.8 添加菜肴 31 五、结论 无线点菜系统是一个很涉及范围比较广的课题。在这个系统中,不仅仅涉及 到多线程还 有网络编程。Java 的多线程是一个重点。当一个系统中有多个线程在 同时运行时,还需要 解决另外一个关键性的问题,那就是线程的互斥与同步。 通 过操作系统课程的学习,结合 软件工程思想,面向对象设计理论可以很好的应付 多线程在 java 中的处理。在本系统中, 还有一个关键点就是网络信息传输。Java 在网络编程这一块,有一个大特色就是传输一个对 象,只要该对象实现一个接口 Serializable,该类的一个对象就可以很好的在网络上进行传输。如此一来很方便,虽 然 网络传输负担有所增加, 但是在该系统中是很好的设计思路, 因为该系统是使用于小范围、 数据交互量不大。最后,我们深知该系统有很多缺陷,也有很多我们么有发现的不足,但是 我 们对自己在有限的时间内作出这样的系统感觉还是不错的。 六、体会与收获 该系统虽然不大,系统总代码行数只有 5000 多行。但是其中涉及的 java 知 识还是很 全面的,包括多线程、网络编程、swing 、awt 以及面向对象思想和软件 工程过程思想。 在 整个系统开发过程中, 我们小组一同讨论需求、 一起分析系统。 通过一个礼拜的需求分析, 两个礼拜的编码我们把系统原型实现了。最后经过多 次的测试与修改终于完成了 3.0 版本。 通过本次课程设计,我们学会了分工的重要性与合作的必要性。我们在整个 过程中遇到了不 少的问题,但经过我们的艰辛与努力,还是突破了难关,迈进了 成功。 32 附件: 附件:程序关键代码 客户端服务类代码: package server; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Inet4Address; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import entity.Dish; import entity.Order; public class ServerConnection { private Socket clientSocket; private int serverPort; private String serverIP; public ServerConnection(int serverPort, String serverIP) { this.serverPort = serverPort; this.serverIP = serverIP; this.serverIP= } public void setServerIP(String serverIP) { this.serverIP = serverIP; this.serverIP= } public void setServerPort(int serverPort) { this.serverPort = serverPort; } /** * 连接服务器 * @return */ public boolean connecte(){ boolean flage=false; try { this.clientSocket=new Socket(); InetAddress address=InetAddress.getByName(this.serverIP); InetSocketAddress socketAddress=new InetSocketAddress(address, this.serverPort); 33 this.clientSocket.connect(socketAddress, 5515); flage=true; } catch (UnknownHostException e) { this.clientSocket=null; System.out.println(" System.out.println("服务器 IP 不正确~ "); ~"); } catch (IOException e) { this.clientSocket=null; System.out.println(" System.out.println("服务器连接异常~ "); ~"); } return flage; } /** * 断开连接 */ public void close(){ if(this.clientSocket!=null){ try { this.clientSocket.close(); } catch (IOException e) { e.printStackTrace(); this.clientSocket=null; } } } /** * 发送菜 单 * @param order * @return */ public boolean sendOrder(Order order){ boolean flage=false; if(!connecte()){ return false; } try { ObjectOutputStream sendOrder=new ObjectOutputStream(this.clientSocket.getOutputStream()); ObjectInputStream resiveOrder=new ObjectInputStream(this.clientSocket.getInputStream()); sendOrder.writeObject(SYSCMD.SYS_NEWORDER); ///// /////发送 新建订单 指令 34 sendOrder.writeObject(order); //// ////发送订单 String rest=(String)resiveOrder.readObject(); if(SYSCMD.OPT_OK.equals(rest)){ flage=true; } resiveOrder.close(); sendOrder.close(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }finally{ this.close(); } return flage; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** * 修改菜单 * @param order * @return */ public List updateOrder(Order order){ List rest=null; if(!connecte()){ return new ArrayList(0); } try { ObjectOutputStream sendOrder=new ObjectOutputStream(this.clientSocket.getOutputStream()); ObjectInputStream resiveOrder=new ObjectInputStream(this.clientSocket.getInputStream()); System.out.println("======"); sendOrder.writeObject(SYSCMD.SYS_UPDATEORDER); ///// /////发送 修改订 单指令 "); System.out.println(" System.out.println("成功发 送 修改指令~"); sendOrder.writeObject(order); rest=(List)resiveOrder.readObject(); sendOrder.close(); resiveOrder.close(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { 35 e.printStackTrace(); }finally{ this.close(); } return rest; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** * 查询菜单状态信息 * @param order * @return */ public Order getOrderStateInfo(String tableNo){ Order order=null; if(!connecte()){ return null; } try { ObjectOutputStream sendOrder=new ObjectOutputStream(this.clientSocket.getOutputStream()); ObjectInputStream resiveOrder=new ObjectInputStream(this.clientSocket.getInputStream()); sendOrder.writeObject(SYSCMD.SYS_GETORDERSTATE); ///// /////发送 查询 菜单状态 指 令 sendOrder.writeObject(tableNo); order=(Order)resiveOrder.readObject(); resiveOrder.close(); sendOrder.close(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }finally{ this.close(); } return order; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** * 查询菜肴信息 * @param dislike 36 * @return */ public List dishQuery(Dish dislike){ List dislist=null; if(!connecte()){ return null; } try { ObjectOutputStream sendOrder=new ObjectOutputStream(this.clientSocket.getOutputStream()); ObjectInputStream resiveOrder=new ObjectInputStream(this.clientSocket.getInputStream()); sendOrder.writeObject(SYSCMD.SYS_DISHQUERY); ///// /////发送 查询菜单 状态 指令 sendOrder.writeObject(dislike); //// ////发送查询条件 dislist=(List)resiveOrder.readObject(); /// ///接收查询结果 resiveOrder.close(); sendOrder.close(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }finally{ this.close(); } return dislist; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** * 付款 */ public boolean payOrder(Order order){ boolean flage=false; if(!connecte()){ return false; } try { ObjectOutputStream sendOrder=new ObjectOutputStream(this.clientSocket.getOutputStream()); ObjectInputStream resiveOrder=new ObjectInputStream(this.clientSocket.getInputStream()); 37 sendOrder.writeObject(SYSCMD.SYS_PAY); ///// /////发送 新建订单指令 sendOrder.writeObject(order); //// ////发送订单 String rest=(String)resiveOrder.readObject(); if(SYSCMD.OPT_OK.equals(rest)){ flage=true; } resiveOrder.close(); sendOrder.close(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }finally{ this.close(); } return flage; } } 客户端主界面核心代码 ///////////////////////////////////////////////////////////////// //////////////////////// ////////////////////////////////////////////////////////////// /////////////////////////// ////////////////////////////////////////////////////////////// /////////////////////////// /** * 开桌事件处理 */ private void openTable(){ this if if("".equals(this this.tx_tableNo.getText().trim())){ this JOptionPane. showMessageDialog (this "请输入桌号~~"); this, ~ return return; } null if if(currentOrder!=null null){ int opt=JOptionPane. showConfirmDialog (this 当 前 菜 单 未 提 this this," 38 交~取消当前菜单重新开桌~", "警告~ ~",JOptionPane. YES_NO_OPTION ); if if(opt==JOptionPane. NO_OPTION ){ return return; } } new currentOrder=new Order(); this currentOrder.setTableNo(this this.tx_tableNo.getText().trim()); this this.tx_tableNo.setText(""); this this.la_tableNo.setText(currentOrder.getTableNo()); new Date nowDate=new Date(); currentOrder.setDate(nowDate); new SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String time=format.format(nowDate); this this.la_orderTime.setText(time); btn_addOrder.setText("确定点菜"); btn_cancelSelect.setText("删除选中"); showOrderDishs(); } ////////////////////////////////////////////////////////////// /////////////////////////// ////////////////////////////////////////////////////////////// /////////////////////////// /** * 显示第page页菜肴列表 */ int public void showDish(int page){ if if(page<=0 || page > (dishList.size()/lineSize+1)){ return return; } this this.dishTableList.clear(); distab.removeAll(); ////"操作","编号"," 菜肴名称"," 类别","单价","简介" null Object []obs=null null; 39 int count=lineSize*page; if if(count>dishList.size()){ count=dishList .size(); } for int index=lineSize*(page-1);index deletedeItems=null null; public void cancelSelectedDishs(){ null if if(currentOrder==null null){ return return; 43 } String str=btn_cancelSelect.getText(); this int opt=JOptionPane. showConfirmDialog (this "确定要删除选中的菜 this, 肴吗,,","注意~",JOptionPane. YES_NO_OPTION ); if if(opt==JOptionPane. NO_OPTION ){ return return; } for int index=0;index rest=service.updateOrder(currentOrder); flushOrderDish(); 45 String img=""; if if(rest.size()>0){ img="部分菜肴更新失败:"; for for(Dish d:rest){ img+=d.getDishName()+" "; } else }else else{ img="更新成功~ ~"; } img+=" 是否查看当前状态,"; this opt=JOptionPane.showConfirmDialog (this this, ",JOptionPane. YES_NO_OPTION ); btn_addOrder.setText("确定点菜"); if if(opt==JOptionPane. NO_OPTION ){ return return; } try { Thread. sleep (100); } catch (InterruptedException e) { e.printStackTrace(); } queryOrderState(); } } ////////////////////////////////////////////////////////////// /////////////////////////// /** * 结账 */ public void payOrder(){ null if if(currentOrder==null null){ this JOptionPane. showMessageDialog (this " 请 先查 询 该桌 的 菜单 信 this, 息~ ~"); return return; } for for(Dish dis:currentOrder.getDishList()){ if if(!"已完成".equals(dis.getState())){ 46 img," 信 息 ~ int opt=JOptionPane. showConfirmDialog (this "部分菜肴未 this this, 完成,是 否继续付款~ ~","警告~ ~",JOptionPane. YES_NO_OPTION ); if if(JOptionPane. NO_OPTION ==opt){ return return; } } } if if(service.payOrder(currentOrder)){ this JOptionPane. showMessageDialog (this "恭喜,付款成功~本次消 this, 费共: "+currentOrder.getTotalMoney()+" ,"); else }else else{ this JOptionPane. showMessageDialog (this "对不起,系统忙,请重试~ this, ~ "); } flushOrderDish(); } ////////////////////////////////////////////////////////////// /////////////////////////// /** * 查询菜单状态 */ public void queryOrderState(){ this String tableNo=this this.tx_tableNo.getText().trim(); null if if(tableNo==null || "".equals(tableNo)){ this JOptionPane. showMessageDialog (this "请输入桌号~ this, ~"); return return; } null if if(currentOrder!=null null){ this int opt=JOptionPane. showConfirmDialog (this "当前菜单未发 this, 送, 确定要继续吗,","警告~",JOptionPane. YES_NO_OPTION ); if if(opt==JOptionPane. NO_OPTION ){ return return; } } currentOrder=service.getOrderStateInfo(tableNo); null if if(currentOrder!=null null){ new deletedeItems=new ArrayList(); showOrderDishs(); btn_addOrder.setText("确定修改"); 47 btn_cancelSelect.setText("取消菜肴"); else }else else{ this JOptionPane. showMessageDialog (this "该桌还没有点菜~ this, ~请确认 后再试… … "); } } ////////////////////////////////////////////////////////////// /////////////////////////// /** * 查询菜肴信息 */ public void queryDishsByLikes(){ new Dish dishlik=new Dish(); dishlik.setDishName(tx_dishName.getText().trim()); String pri=tx_dishPrice.getText().trim(); if if(!"".equals(pri)){ dishlik.setPrice(Float. valueOf (pri)); } String type=cb_dishType.getSelectedItem().toString(); if if("所有".equals(type)){ type=""; } dishlik.setType(type); Object obj= service.dishQuery(dishlik); if null if(obj==null null){ this JOptionPane. showMessageDialog (this " 没 有你 要 查询 的 菜肴 信 this, 息~ ~"); return return; } dishList=(List)obj; currentPage=1; showDish(1); } 服务端数据库连接代码 package dao; import java.sql.Connection; 48 import java.sql.DriverManager; import java.sql.SQLException; public class DBConnection { private String path; private String url; private String user="jeking"; private String pwd="king"; { path=System.getProperty("user.dir"); url="jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ="+path+"/db/db604.mdb"; try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); }catch(Exception e){ e.printStackTrace(); System.out.println(" System.out.println("驱动加载失败~ "); ~"); } } public Connection openConnection(){ try { return DriverManager.getConnection(url, user, pwd); } catch (SQLException e) { e.printStackTrace(); } return null; } public void close(Connection conn){ if(conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } 服务端服务类代码 package server; import java.io.IOException; 49 import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; import win.ServerceMainWin; import dao.DishDAO; import dao.OrderDAO; import entity.Dish; import entity.Order; import entity.OrderItem; public class ServerceThread extends Thread { private ServerSocket serverSocket; private int serverPort; private ServerceMainWin serverceMainWin; private Socket clientSocket; private DishDAO dishDao=new DishDAO(); private OrderDAO orderDao=new OrderDAO(); public ServerceThread(ServerceMainWin serverceMainWin) { this.serverceMainWin=serverceMainWin; } public ServerceThread(ServerceMainWin serverceMainWin,int serverPort) { this.serverPort = serverPort; this.serverceMainWin=serverceMainWin; } public int getServerPort() { return serverPort; } public void setServerPort(int serverPort) { this.serverPort = serverPort; } /** * 启动服务器 */ 50 public void runServer(){ try { this.serverSocket=new ServerSocket(this.serverPort); } catch (IOException e) { e.printStackTrace(); "); System.out.println(" System.out.println("服务器启动异常~"); return; } } public void stopServer(){ stop(); if(this.serverSocket!=null){ try { this.serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } /** , * 断开连接, 结束本次服务 * @param resive * @param send */ public void close(ObjectInputStream resive,ObjectOutputStream send){ try { if(resive!=null){ resive.close(); } if(send!=null){ send.close(); } } catch (IOException e) { e.printStackTrace(); } } public void run(){ ObjectInputStream resive=null; ObjectOutputStream send=null; 51 while(true){ try { ////// //////接受客户端连接请求 this.clientSocket=this.serverSocket.accept(); resive=new ObjectInputStream(this.clientSocket.getInputStream()); send=new ObjectOutputStream(this.clientSocket.getOutputStream()); //// ////获得客户操作指 令 String cmd=(String)resive.readObject(); "+cmd); System.out.println(" System.out.println("客户端发送请求指令:"+cmd); if(SYSCMD.SYS_DISHQUERY.equals(cmd)){ ///// /////查询菜肴请求 Dish likedis=null; List list=null; /// ///结束 客户查询条件 likedis=(Dish)resive.readObject(); //// ////发送结果 if(likedis==null){ send.writeObject(SYSCMD.ERROR_QUERY); }else{ list=this.dishQuery(likedis); send.writeObject(list); } }else if(SYSCMD.SYS_GETORDERSTATE.equals(cmd)){ //// ////获得菜单状态请求 String tableNo=null; Order order=null; /// ///接收客户端传入 桌号 tableNo=(String)resive.readObject(); if(tableNo==null){ send.writeObject(SYSCMD.ERROR_GETORDERSTATE); }else{ order= this.getOrderState(tableNo); send.writeObject(order); } 52 }else if(SYSCMD.SYS_NEWORDER.equals(cmd)){ //// ////客户请求提交菜单 System.out.println(" System.out.println("收到客户端提交菜请求。。 "); 。。"); Order order=null; /// ///接收菜单信息 order=(Order)resive.readObject(); System.out.println(" System.out.println("收到客户端提交菜单信息~ "); ~"); /// /// 返回结果 if(order==null){ send.writeObject(SYSCMD.ERROR_NEWORDER); }else{ this.resiveOrder(order); send.writeObject(SYSCMD.OPT_OK); } }else if(SYSCMD.SYS_UPDATEORDER.equals(cmd)){ //// ////更新菜单请求 Order order=null; order=(Order)resive.readObject(); if(order==null){ send.writeObject(SYSCMD.ERROR_UPDATEORDER); }else{ List list=this.updateOrder(order); send.writeObject(list); } }else if(SYSCMD.SYS_PAY.equals(cmd)){ //// ////结账 Order order=null; order=(Order)resive.readObject(); if(this.payMoney(order)){ send.writeObject(SYSCMD.OPT_OK); }else{ send.writeObject(SYSCMD.ERROR_PAY); } }else{ -=="+cmd); System.out.println(" System.out.println("服务器收到错误请求指令=="+cmd); send.writeObject(SYSCMD.ERROR_UNKOWN); 53 } this.close(resive, send); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { !"); System.out.println(" System.out.println("指令接收异常!"); e.printStackTrace(); } }///////////while(true) } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** * 接收 菜单: * 基本事件流: * 1、 首先保存 入数据库 * 2、 把菜单显示到界面 * @param order */ public boolean resiveOrder(Order order){ for(Dish dish:order.getDishList()){ "); dish.setState(" dish.setState("未处理"); } if(orderDao.insertOrder(order)){ this.serverceMainWin.resiveOrder(order); return true; } return false; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** : * 菜肴查询服务: : * 基本事件流: :likedis * 1. 接收客户端传送的 查询条件对象:likedis . * 2. 调用 DishDAO 完成查询操作. * 3. 把 查询结果传回客户端 * @param likedis * @return */ public List dishQuery(Dish likedis){ return dishDao.findDishLike(likedis); 54 } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** !! * 获得菜单状态!! : * 基本事件流: * 1. 接 收客户端传过来的 桌号 , * 2. 从服务器的 未处理菜单表, 正在处理菜单表 以及 已完成 但未付款缓存中 , 查找, 如果查到则进行步骤 3 没有这进程步骤 4 * 3. 把服务器中的菜 单 传回客户端, 结束本次服务 , * 4. 通知客户端,改菜单已经结账.结束本次服务 , . * @param tableNo * @return */ public Order getOrderState(String tableNo){ return this.serverceMainWin.getOrderState(tableNo); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** * 更新菜单信息: : : * 基本事件流: ( * 1. 接 收客户端传入的新点菜单信息(如果只是添加菜肴, order 的 marks 备 则 order 注信息为 空, * * 如果有删除菜肴信息,则被删除菜肴的 ID 保存在 marks 中,中间用*隔 ) 开) * 2. 添加客户 新点菜肴 * @param order * * @return */ public List updateOrder(Order order){ Order currentOrder=serverceMainWin.getOrderState(order.getTableNo()); //// ////新添加的 菜肴保存在 dishList 中 OrderItem item=null; for(Dish dis:order.getDishList()){ item=new OrderItem(); item.setOrderId(currentOrder.getOrderId()); item.setDishId(dis.getDishID()); item.setCount(1); item.setMoney(dis.getPrice()); "); item.setState(" item.setState("未处理"); "); dis.setState(" dis.setState("未处理"); 55 currentOrder.getDishList().add(dis); currentOrder.getItemList().add(item); orderDao.addOrderItem(item); } /// ///取消的菜肴列表保存在 itemList 中 List list=new ArrayList(); for(OrderItem it:order.getItemList()){ for(int index=0;index
本文档为【软件工程课程设计--无线点菜系统设计报告】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_624976
暂无简介~
格式:doc
大小:90KB
软件:Word
页数:38
分类:生活休闲
上传时间:2018-09-16
浏览量:48