食堂售饭系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目一、食堂售饭系统
1、实验目的
①熟练运用JAVA开发环境及工具、并用JAVA语言编写程序;
②掌握面向对象的概念;
③掌握系统功能模块的合理划分,并实现各模块接口的连接;
④掌握C/S结构的编程方法;实现与数据库的连接及相关的SQL操作。
2、实验内容
从需求出发,进行食堂售饭系统设计,包括同学在校内消费各方面内容:刷卡消费、查询、存款,学生信息管理等。
方便的对同学饭卡信息进行各项操作,定时进行数据的备份更新,保持数据的一致性和准确性,各方面的内容应该相互联系,最终产生各种查询统计报表,以供同学进行检查。
3、实验过程
用户通过系统首页面,创建饭卡,存入钱。
消费时根据饭卡ID判断该用户是否是合法用户,同时进行消费操作。
管理员可以对系统进行新建饭卡、注销饭卡、修改饭卡信息等操作,而学生进行消费的操作。
要求:
a.功能:
1实现消费使用卡片扣钱(取代现金);
2在固定保险的地方存钱;
3有消费记录功能;
4有挂失功能。
b. 输出:
在刷卡器上,每次消费时:
1存额
2此次消费额
3剩余额
刷卡器上,额外的信息如:
1出错信息
2锁卡信息
3剩余不多提示信息
报单:
1输出消费记录报单。
2输出存款记录报单。
3注销卡时,返还剩余额(钱)。
c.输入:
刷卡器上,每次消费时:
1卡ID(可由读卡器自动读入)
2消费额
3操作符(确认,撤消,后退,计算(加减乘除),存款(有权限限制),其他功能) 数据库管理电脑上: 1输入学生信息
2学生存款额(由读卡器端输入器完成) 3查询,修改,删除功能输入 d .在安全与保密方面的要求:
1使用者之间的ID 号不能重复; 2 ID 号不被他人轻易知道;
3即便知道也能有快速相应的机制,予以弥补;
4有使用追踪功能,可以让用户了解,自己使用的情况。
3.1功能的规定
数据流程图
饭卡系统
存款额
刷卡器
显示器
管理员
刷卡服务
员
消费额卡ID 余额信息学生信息
其他信息
学生
查询结果
其他信息
E-R 图如下:
学生信息库(student_info )
列名 数据类型 学生学号 stu_num int 卡ID id int 学生姓名 name Char(20) 性别 male boolean 电话号码 tel Char(20) 地址
address
Char(50)
卡信息(card_info)
列名数据类型
卡ID id int
余额sum float
锁lock boolean 卡历史(card_his)
列名数据类型
卡ID id int
时间daytime daytype
款额sum float
操作op Char(20)
3.2接口设计
1用户接口
(1)用户类别:
1有提供学生查阅的学生界面。
2 提供管理员操作的管理员界面。
3 提供刷卡的刷卡服务员界面。
(2) 管理员界面菜单
1 状态
1.1登陆;
1.2注销;
2 新建--新建学生信息界面;
3 查询更新
3.1 学生消费历史
3.2 学生信息
4 挂失
4.1 加锁
4.2 解锁
5 注销卡
(3)学生查询菜单
1 状态
1.1登陆;
1.2注销;
2 查询历史
3 查询学生信息
(4)刷卡界面
1 状态
1.1登陆;
1.2注销;
2 消费方式
2.1 正常
2.2 定价
3 显示上次输出
2外部接口
说明本系统同外界的所有接口的安排包括软件与硬件之间的接口、本系统与各支持软件之间的接口关系。
3内部接口
查询和更新都要调用数据库的操作。
3.3系统出错处理设计
出错信息
1 在学生刷卡后,卡ID被锁,将会出现错误信息:“Kard Locked”
2 学生卡信息丢失,查询时或者消费-存款时,不认卡情况
3 存款额大于999.99元,刷卡器只显示小于等于999,99元部分
4 消费时消费额大于存款额。
系统将会提示错误,不作其他任何操作。
措施(号码对应)
1 只能解卡锁
2 有备份数据库,随时可以恢复
3 只能更换刷卡器
4 计时充钱
3.4详细设计
3.4.1入口程序entry() 设计说明
1程序描述
提供管理员和学生用户,刷卡服务三种环境,限制用户对系统的使用权限。
特点:非常驻内存;单独的一个程序;顺序处理。
2输入项
权限:三个单选项。
Level。
管理员用户名:字符串类型,user,长度不超过20,可以是数字(不能开头)和字母、汉字;
管理员密码:字符串类型,pass, 长度不超过20, 可以是数字和字母,区分大小写3输出项
欢迎或者提示错误信息。
4流程逻辑
程序开始
用户名密码
判断什么权限管理员管理库
管理员权限
学生查询权限刷卡服务员权限
输入权限类别
学生查询界面
刷卡服务界面
判断用户名和密码是否合法
管理员界面界面
正确提示错误错误
欢迎提示
3.4.2查询模块search() 设计说明
1程序描述
完成对系统(数据库)的查找。
2输入项
学生卡信息,时间信息,消费信息等。
3输出项
查找结果。
4流程逻辑
输入查询条件
查询
给出题是错误
查询条件
正确
从数据库读数据
打印报表
显示结果在屏幕
打印与否
打印
3.4.3消费模块pay() 设计说明
4.1程序描述
完成消费部分。
对输入和消费额,进行合法性验证。
4.2输入项
卡ID ,定价与否,消费额。
4.3输出项
卡余额,错误提示。
4.4流程逻辑
消费
卡ID正确
卡ID错误提示错误
提示显余额
定价消费
正常消费
确认消费,并显示余额
余额不足,提示错误
确认消费,显示余额
余额不足,提示错误
卡未锁
卡锁,输出错误
3.4.4存款模块deposit() 设计说明
1程序描述
完成存款部分。
对输入和存款额,进行合法性验证。
2输入项
卡ID ,存款额。
3输出项
卡余额,错误提示。
4流程逻辑
3.4.5面向对象分析、设计
面向对象分析首要的工作,是建立问题域的对象模型,这个模型描述了现实世界中的“类于对象”以及它们之间的关系,表示了目标系统的静态数据结构。
其中对象是对问题域中有意义的事务的抽象,他们既可能是物理实体, 也可能是抽象概念。
要确定类和对象,我们先要找出候选的类于对象,然后在从中筛选出正确的类于对象。
1有四个类:
(1) 类名:学生帐户
属性:学号,卡ID ,余额,锁 方法:创建(学生,卡,历史),更新属性,更新数据库,注销(学生,卡,历史),返回(学号,卡ID ,余额,锁),消费,存款,设定(号,卡ID ,余额,锁),撤销历史,显示历史
(2) 类名:读卡器
学生代号
1 2 3 读卡成功 N Y N 卡没有锁 N N Y 存款成功 N N N 显示余额 显示 不可能 题是错误 提示 不可能 显示存款成功信息 不显示 不显示 不可能 显示存款失败信息
不显示
显示
不可能
属性:卡ID
方法:读取ID,确认卡,警告,设定ID
(3)类名:输入器
属性:值,临时值1,临时值2
方法:读入,加法,减法,乘法,等于,定价,常用,最
后一次输入,取消卡,消费
(4)类名:屏幕
属性:值1,值2,值3,定价
方法:显示当前输入,显示卡余额,清屏,定价,
2细化对象模型,生成Java代码框架
//=============(1)学生帐户=============
public class StudentInfo
{ private Integer stu_num; private Integer card_id; private Double sum;
private Boolean lock;
public StudentInfo()
{ }
public void createStuInfo(Integer stu_num, Integer card_id, String name, Boolean male, Integer tel, String address)
{ }
public void createCardInfo(Integer id)
{ }
public void createCardHis(Integer id)
{ }
public void updateAttr()
{ }
public void updateDB()
{ }
public void deposit(Double value)
{ }
public void delCardHis()
{ }
public void delCardInfo()
{ }
public void delStuInfo()
{ }
public void spend(Double value)
{ }
public void unDoHis()
{ }
public void printHis()
{ }
public Integer getStu_num()
{ return null; }
public Integer getCard_id()
{ return null; }
public Double getSum()
{ return null; }
public Boolean getLock()
{
return null;
}}
//=============(2)读卡器=============
public class CardReader
{
private Integer card_id;
public CardReader()
{ }
public Integer readId()
{ return null; }
public Boolean judgeId()
{ return null; }
public void alarm()
{ }
public Integer getCard_id()
{ return null; }
public void setCard_id(Integer id) { } }
//=============(3)输入器=============
public class Inputer
{ private Double value = 0;
private Double temp = 0;
public Inputer()
{ }
public Double read()
{ return null; }
public Double plus()
{ return null; }
public Double minus()
{ return null; }
public Double multiply()
{ return null; }
public void equal()
{ }
public void fixPrice()
{ }
public void commonUse()
{ }
public void lastVal()
{ }
public void denyCard()
{ }
public void spend()
{ }
}
//=============(4)屏幕=============
public class Screen
{ private Integer value1;
private Boolean fixlight;
public Screen()
{ }
public void printNow()
{ }
public void printSum()
{ }
public void cls()
{ }
public void setFix(Boolean state)
{ }
}
4、关键代码与分析
4.1.权限界面
1数据库联接公共部分
public static Connection conn = null;
public static Statement state =
null;
public static void odbc(){
String DBDriver =
"sun.jdbc.odbc.JdbcOdbcDriver";
String connectionStr =
"jdbc:odbc:myodbc";
try{
Class.forName(DBDriver);
}
catch(ng.ClassNotFoundException
e){System.err.println("DBconnecton:"+e.getMessage());}
try{
conn = DriverManager.getConnection(connectionStr,"","");
state = conn.createStatement();
}catch(SQLException
ex){ System.err.println("aq.executeQuery:"+ex.getMessage());}
}
2 刷卡选择部分
//=================== 刷卡界面===================
if(this.jRadioButton2.isSelected()){
this.setVisible(false);
JOptionPane.showMessageDialog(null,"欢迎进入刷卡界面!");
Spend.main(null);
}
//=================== 管理员界面===================
if(this.jRadioButton1.isSelected()){
String nstr,pstr,sql;
nstr = this.jTextField1.getText();
pstr = this.jTextField2.getText();
sql = "select * from admin where name like '"+nstr+"'";
ResultSet rs =null;
try{
rs = Main.state.executeQuery(sql);
if(rs.next()){
if(pareTo(rs.getString("pass"))==0){
this.setVisible(false);
JOptionPane.showMessageDialog(null,"欢迎进入管理员界面!");
Admin.main(null);
}else
JOptionPane.showMessageDialog(null,"密码错误");
}else{JOptionPane.showMessageDialog(null,"用户名错误");
}
}catch(SQLException
ex){ System.err.println("aq.executeQuery:"+ex.getMessage());}
}
//=================== 学生查询界面===================
if(this.jRadioButton3.isSelected()){
this.setVisible(false);
JOptionPane.showMessageDialog(null,"欢迎进入学生查询界面!");
StuInfo.main(null);
}
4.2
.提示界面
4.3.消费界面
1 搜索部分
if(Ids.getText().equals("") ){
JOptionPane.showMessageDialog(null,"卡号不能为空!");
Ids.setFocusable(true); }else{
try{
String sql = "select * from
card_info where id = "+Ids.getText(); ResultSet rs = Main.state.executeQuery(sql); if(rs.next()){
if(rs.getBoolean(3)){
JOptionPane.showMessageDialog(null,"卡
已
经被锁,如要解锁,请与管理员联系否则10日后 自动注销!"); }else{ if(DjCheck.isSelected()){ Sum.setText(rs.getString(2)); this.result=String.valueOf(Integer.parseInt(Sum.getTex t())-Integer.parseInt(Dingj ia.getText())); JOptionPane.showMessageDialog(null,"消费完毕,卡剩余"+ result +"。
如果要继续消费请在10秒内操作,只后自动关闭帐户"); Sum.setText(result); }else{ Ids.setEditable(false); this.jButton26.setEnabled(false); this.jPanel1.setVisible(true); Sum.setText(rs.getString(2)); jButton12.setEnabled(true);
jButton13.setEnabled(true); jButton14.setEnabled(true);
jButton15.setEnabled(true); } } }else{ JOptionPane.showMessageDialog(null,"卡号错误!
");
} }catch(SQLException ex){ System.err.println("aq.executeQuery:"+ex.getMessage());} } 2 消费部分
try{
this.result=String.valueOf((Integer.parseInt(Sum.getText()) - Integer.parseInt(Now.getText())));
String sql = "update card_info set sum = "+result+" where id = "+Ids.getText(); if(Main.state.executeUpdate(sql)==0){ JOptionPane.showMessageDialog(null,"消费失败"); }else{
this.nows =Now.getText(); this.sums =Sum.getText();
JOptionPane.showMessageDialog(null,"消费完毕,卡剩余"+ result +"。
如果要继续消费请在10秒内操作,只后自动关闭帐户");
Sum.setText(result); }
}catch(SQLException ex){ System.err.println("aq.executeQuery:"+ex.getMessage());} 3 加减乘部分
if(Jisuan.getText().compareTo("") == 0){ Jisuan.setText(Now.getText()); Now.setText("0"); } else { switch(ops){ case 3: int a= 0; a=Integer.parseInt(Jisuan.getText()) * Integer.parseInt(Now.getText()); if(a>999){ JOptionPane.showMessageDialog(null,"计算量超过消费最大值!"); }else{ Jisuan.setText(String.valueOf(Integer.parse Int(Jisuan.getText()) * Integer.parseInt(Now.getText()))); Now.setText(Jisuan.getText()); } break; case 2: int b=0; b = Integer.parseInt(Jisuan.getText()) + Integer.parseInt(Now.getText()); if(b>999){ JOptionPane.showMessageDialog(null,"计算量超过消费最大值!"); }else{ Jisuan.setText(S tring.valueOf(Integer.parseInt(Jisuan.getTe xt()) + Integer.parseInt(Now.getText()))); Now.setText(Jisuan.getText()); } break; case 1: int c=1; c=Integer.parseInt(Jisuan.getText()) - Integer.parseInt(Now.getText()); if(c>999||c<=0){ JOp tionPane.showMessageDialog(null,"计算量超过消费有效值!"); }else{ Jisuan.setText(String.valueOf(Integer.parse Int(Jisuan.getText()) - Integer.parseInt(Now.getText()))); Now.setText(Jisuan.getText());
} break; } }
ops = 0 ;
Op.setText("=");
4.4 学生查询界面
1 查找信息部分
if(num.getText().equals("") ){
JOptionPane.showMessageDialog(null,"卡号不能为空!"); num.setFocusable(true);
}else{
try{ String sql = "select * from
student_info where stu_num = "+num.getText();
ResultSet rs =
Main.state.executeQuery(sql);
if(rs.next()){ id.setText(rs.getString(2)); name.setText(rs.getString(3)); if(rs.getBoolean(4)) sex.setText("男"); else sex.setText("女"); tel.setText(rs.getString(5)); address.setText(rs.getString(6));
}else{
JOptionPane.showMessageDialog(null,"卡号错误!"); }
}catch(SQLException ex){ System.err.println("aq.executeQuery:"+ex.getMessage());} }
4.5 挂失界面
1 锁卡部分
if(num.getText().equals("") ){
JOptionPane.showMessageDialog(null,"学生
学号不能为空!");
num.setFocusable(true);
}else{
try{ String sql = "select * from student_info where stu_num =
"+num.getText();
ResultSet rs =
Main.state.executeQuery(sql);
if(rs.next()){
if(rs.getString(7).compareTo(pass.getText())==0)
{
JOptionPane.showMessageDialog(null,"请按确认锁键,确认锁卡!");
num.setEnabled(false);
pass.setEnabled(false);
this.jButton1.setEnabled(false);
this.jButton2.setEnabled(true);
ids=rs.getInt(1);
}else {
JOptionPane.showMessageDialog(null,"学生密码错误!");
}
}else{
JOptionPane.showMessageDialog(null,"学生学号错误!");
} }catch(SQLException ex){ System.err.println("aq.executeQuery:"+ex.getMessage());} }
4.6 管理员界面。