Java订餐系统(JAVA SWING)

 

一、 开发技术

JDK:JDK1.8,JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

IDE:NetBeans 8.2.0,NetBeans是开源软件开发集成环境,是一个开放框架

DataBase:JavaDB,Java自带的数据库。

二、 需求分析

 

图2.1系统框图

 

2.2功能介绍

菜品信息管理系统主要分为前台用户点餐,和后台管理员对菜品信息和用户提交订单信息的增删改查和统计等操作。

1.菜品信息管理页面:可以增加菜品信息,上下架菜品,修改价格,删除菜品,保存菜品信息到文件,按销量排序等。

2.订单管理界面:管理员可以对订单进行今日收入、本月收入、总收入的统计,并且可以根据时间查询订单信息。

3.后厨管理界面:可以查看今日所有用户提交的订单信息,并按用户提交的顺序排列菜名和备注,后厨可以根据订单中用户提交的信息来做菜并完成订单。

4.前台用户点餐页面:包括菜单展示,菜品图片预览,向订单中加入菜品和更改菜品备注(菜品口味特殊要求),并且实时地根据用户选择的菜品统计总消费金额,此页面显示的菜品都是后台中已上架的菜品,未上架的菜品在前台不会显示,并且在此页面成功提交订单后,选择菜品的销量也会随之增加。

5.登录页面:将用户输入的账号密码与用户数据表中存在的账号密码进行匹配,匹配成功则进入后台管理页面。

三、 系统设计

3.1结构介绍

结构主要分为GUI包(存放图形界面JFRAME和部分逻辑操作)、DbQuery包(存放所有访问数据库的操作)、img包(存放图标图片和各种菜品的展示图片)和Db包(存放JAVADB的数据库文件)。

3.2数据表结构分析

数据表主要分为三个:菜品信息表、用户订单表、管理员信息表。

 

表1菜品信息表

Dish_num

Dish_name

Dish_price

Dish_intro

Dish_sum

Dish_display

菜品编号

菜品名称

菜品价格

菜品介绍

菜品销量

菜品上架情况

String(10)

String(10)

Double

String(100)

INT

Boolean

对于菜品这个实体一共有五个属性,首先是作为主键的菜品编号是不为空且不重复,价格可能出现小数,所以把价格设置为double类型。对于菜品销量,是一个比较小的整数,所以使用INT型即可,当用户在订单中点菜后,销量也随之增加,而菜品上下架是一个只有两个值的字段,所以使用Boolean来储存。其他的介绍、名称都可能出现各种类型的数据,所以把这些属性都设置为字符串类型。

 

表2用户订单表

Order_num

order_dish

order_price

Order_time

Order_extra

订单编号

菜品信息

订单总价

订单时间

订单备注

String(10)

String(100)

Double

Date

String(100)

对于订单信息这个表,因为要根据时间查询订单并且在订单管理页面统计订单消费额,所以把订单事件设为Date类型,M-D格式,就可以定位到每一天的订单。订单表中并没有把每一个菜和价格作为一个字段,因为那样表的字段就不能作为固定的。所以我把用户点的菜品和备注进行字符串拼接并且用 , 分隔,这样拉取订单数据的时候就可以通过字符串的split(‘,’)函数,获得一个字符串数组,这样就实现了任意数量菜品的储存效果。

 

表3管理员信息表

User

Password

Label

用户名

密码

权限

String(10)

String(10)

String(10)

管理员信息表作为登录界面比对字符串就可以简单的都设计为String类型的字符串,在比较时直接通过SQL语句进行比较,权限字段开始的时候想要做出来根据权限不同来分配不同的功能,但是发现分配权限的逻辑没有想得很完整,不容易实现,所以最终只使用了最高权限的admin。

3.3程序类与函数分析

对于程序类主要结构,主要设计了MainFrame,DishFrame, OrderDishFrame, DbQuery等类,DishFrame中包括多个dialog,后厨管理(jdialogKitchen),关于我们(jDialogAbout),订单统计(jdialogOrder),MainFrame为程序主界面,包括主界面和登录界面(JDialogLogin),每个dialog中又包括着java swing的组件和触发器,例如private void jButtonResetActionPerformed(java.awt.event.ActionEvent evt)这类的鼠标点击触发的事件, 当点击重置按钮的时候触发该事件,将所有的TextField中的内容都改为空。

DbQuery类中包括数据库的各种操作,例如getConnection为连接数据库的方法,返回一个Connection对象,addDish(String No, String Name, double Money, boolean dis, String intro)方法,从形参获取菜品信息,通过SQL语句将其存入到数据表中。public static String[][] getOrder()方法从数据库中通过”select * from orderdish”的SQL语句拿到所有订单信息,并且以二维数组的形式返回到调用的地方,public static Double[] sumUp()函数可以在数据表订单中统计并返回每天、每月、总消费额的二维数组。

通过这三个大类中互相导入、实例化和调用,完成整个系统的功能与架构。

四、 系统实现

 

Java订餐系统(JAVA SWING)_第1张图片

图4.1程序主页面

 

 Java订餐系统(JAVA SWING)_第2张图片

图4.2用户订餐页面

Java订餐系统(JAVA SWING)_第3张图片

图4.3登录页面

 

 Java订餐系统(JAVA SWING)_第4张图片

图4.4后台管理页面

Java订餐系统(JAVA SWING)_第5张图片

图4.5订单管理页面

Java订餐系统(JAVA SWING)_第6张图片

图4.6后厨管理页面

 

图4.7关于页面

 

五、 主要问题

第一个遇到的问题是向数据库中插入Date类型的数据,在java程序中一般的生成时间的类是java.utily.Date,但这与数据表中的Date格式的类型不一致,而且date类型生成的一半是很具体的时间,而javadb中的date类型只是精确到日,所以执行插入的SQL语句时一直报错。后来经过在报错信息里找到了数据表中的Date类型为java.SQL.date生成的时间,可以先通过System.currentMillentime获得一个类型为Long的时间戳,将这个时间戳作为形参调用Date(),就能得到能够插入数据表中的当前时间。

第二个遇到的问题是动态修改表格中的数据,一开始根据上课老师讲的getmodel方法得到模型,但这时获取的model是TABLEMODEL类型的,并没有add这个属性,所以先对jTable执行getModel方法再将其强制转换为DefaultModel类型,对表格的Model进行addrow和其他操作完成修改后,再对jTable使用setModel将修改后的Model覆过去,这时表格的内容就随着model的改变而改变了。

第三个遇到的问题是进行表单输入或查询时经常会没选定列就直接点按钮或未输入表单就提交,这时候经常会抛出异常,阻碍程序运行。出现这种情况的时候,我把错误名称从报错信息里获得,例如输入表单的内容为空时会产生NumberFormatException的异常,所以我把这一段代码放在try的中间,再使用catch捕获这个异常,如果产生这个异常,就执行catch里的语句段,再向用户提示错误信息,将许多确定的异常信息设置TRA-CATCH后,就大大提高了程序的健壮性,例如在表格中没有选定列就点击删除按钮,这时候不会出现红色异常,而是捕获到异常并提示选定列之后再操作。

之后对数据库的迁移也遇到了问题,在自己电脑上的时候一直是在netbeans的服务选项里的javaDB中连接,后来将文件夹打包移到别的电脑上之后,就不能成功连接,所以之后我重新创建数据库的时候把文件存到了本地,在数据库连接时将url的地址也写到了文件夹的相对路径。之后再重新启动电脑或者将项目放到其他文件夹的时候,不需要再启动数据库服务,连接的时候会直接从文件里读取数据库信息。

在程序退出的时候显示是否确定要退出的对话框,一开始选择否选项之后也会退出系统,后来发现了jframe在设计菜单里有一个关闭时的属性,将其设为do_nothing,并将windowClosing的事件弹出confirmDialog时选择是的执行System.exit(0).否的执行return语句。

在用户创建订单时能够点击表格中的菜品查看图片的功能,开始我是使用表格中的MOUSECLICKED事件对jlabel实现setIcon事件手动设置对应已经保存好的图片,并不是可以上传图片的形式,后来我把图片上传加入到了添加菜品中去,使用FileChooser和Image类上传图片后再将图片名存为唯一主键菜品的编号,之后再前台显示菜品图片就从数据库中获得菜品的主键编号,根据编号在IMG文件夹中找到对应的图片。

 

六、 总结

这次课程设计让我们对一个Java项目的构建、分布、和具体的实施有了很大的了解,并且熟悉了后台语言与数据库的对接操作。对于数据库操作,有点八卦衍万物的感觉,通过增删改查简单的四个数据库操作来完成各种复杂的JAVA系统操作。之前上课的时候,经常是只看着老师操作而没有真正去实践,真正自己去设计一个系统的时候发现自己还有好多有遗漏的知识点,例如图片上传并保存,JavaSwing中更加细节的操作,通过查阅资料不断地补充知识。例如开始设计系统的时候结构比较乱,没有按MVC的结构来分布开,导致很多代码都揉在了一起,到后期改的时候就比较费力,之后只把数据库操作分离了出来。在网上查阅资料的时候也了解到了很多java的新知识,例如Java Fx图形框架,能够制作出更加美观和便利的界面,但是了解到这个框架的时候已经是第三天晚上,程序已经写的差不多了,所以我想之后在课下自己学习一下JavaFx框架,再丰富提升一下自己的Java编程技术。

这次的课设不同于以前的地方是之前的课设一直是给定出特定的题目和具体的功能要求,让我们研究如何去实现。但这次课设是给定出一个大的题目范围,自己去创造开发拓展一些功能,真正让自己深入到设计系统的思路中去,例如我的菜品信息管理系统,如果单单只是简单的信息管理的话,功能会比较单一。但是经过自己的设计拓展之后,加入了用户点餐、菜品预览、订单统计、后厨管理等功能,让这个课程设计变得丰满起来,真正变成了一个自己去开发并设计的项目。

另外,我感觉除了编程能力之外,答辩能力和表达能力也是一个项目的重要组成部分,自己把课设做出来了,但没有完全讲出来,并且表达的时候不自信和紧张,造成了很大的失误,比如答辩的时候因为紧张没有把自己的所有功能演示出来,遗漏了几个小功能。所以之后还要努力提升自己的答辩能力和表达技巧,让别人了解到自己作品的具体的优点,将自己项目的功能完整地表达出来,一件商品如果值50块,普通人只能卖到60块、70块,懂得推销自己的人却能将它说出100块的价值,所以自己的编程之路还漫漫其修远兮,需要学的东西还很多很多。

七、 参考文献

[1] Java核心技术(卷1):基础知识(原书第9版) 霍斯特曼 (Cay S. Horstmann)

[2] Java核心技术(卷2):高级特性(原书第9版) 霍斯特曼 (Cay S. Horstmann)

附录:程序代码

 

 

你可能感兴趣的:(JAVA,软件相关技术)