摘 要
本次课程设计主要目的是培养我们面向对象软件开发的思维,初步了解软件开发的一般流程。提高编程的实际动手能力并增强大家对面向对象的了解。这次课程设计的主要内容是开发一个应用程序,我们小组设计的ATM柜员机,它主要是由各个indows窗口组成,它是由登录页面、选择服务、取款、查询余额、修改密码和退卡等功能组成,它的各种按钮的事件和功能可以简单的模拟ATM柜员机。它具备初步的独立分析和设计能力,我们在软件开发过程遇到并解决问题,综合运用所学的理论知识和方法,独立分析和解决问题的能力,培养软件工作者所应具备的科学的工作方法和作风。
此次实训基本把我们本学期所学的内容进行综合应用,让我们更加容易简单的了解体验到了未来工作的一般状况,锻炼了我们的实际操作能力,同时也在一定程度上增加了同学们对Java语言学习的信心,一些简单的小游戏,通过运用自己所学也是可以实现的,让我们不在对编程感觉那么神秘。
团队合作与交流很重要,“团结就是力量”在本次项目开发中真的体会得到,在做项目时,小组成员要知道本小组所做项目的基本构想框架,要做什么、实现什么。如果有自己的想法就要和自己的伙伴进行交流。
关键词:eclipse2012.9 ATM Java程序设计 Sql
1.1研究背景与现状
随着科技的发展,人们生活水平的不断提高,高性能高效率的产品越来越受到人们的欢迎。ATM自动取款机是一种非常智能的机器,人们可以直接和它交互,代替以前的手工操作,大大提高了银行的工作效率。同时也给广大用户带来了非常大的方便。由于ATM自动取款机是和服务器是连网的,这就涉及到安全的问题,例如密码被盗的问题,这就需要加强安全措施,如运用一些加密算法。所以银行卡丢失的时候一定要及时挂失,以确保自己的账户安全。
1.2研究现状
现如今,有许多家银行在顾客办理业务时都需要到柜台前需要服务人员的操作,效率很低。为了解决这样的问题,我们小组提出了研究ATM自动取款机系统,使银行和各户办理业务时更便捷。ATM自动取款机可以24 小时自动取款,无需人工服务,同时提供了许多的功能。
1.3研究意义
ATM网上银行取款作为电子商务的一种形式正以方便、快捷的优势,逐步成为新兴的经营模式和理念,人们已经不再满足于排队等待办理各种业务,而是渴望着能够充分享受网络所带来的更加多的便利。ATM银行取款系统正适应了当今社会快节奏地生活,使顾客可以方便快捷轻松地办理各种实物银行所能办理的各种业务,大大节约了时间和实物银行所需的人力,物力,财力等。
经过了近40年的发展,ATM也取得了长足的进步,从早期的纸券取钱,到现在的一卡在手,ATM机也从早期的简单机器,后期的系统集成式机器,发展成了如今的基于个人PC上操作系统下的智能化系统,拥有了更多更全更加方便的功能。随着个人PC的快速发展,越来越多的ATM机逐步替换为了PC机,具有了更加人性化,更加友好的操作界面,也具有了更快的响应速度,这也使得各个银行之间的 ATM操作平台有了逐步统一的可能,加强各银行的服务联系,使客户跨行进行ATM交易将更加便捷,资费也能够得到降低。
模拟ATM系统就是对提款机操作系统在个人 PC上及主流操作平台中的编程实现,其开发主要包括后台数据库的建立和维护及前端应用程序的开发制作两个方面。用户在ATM客户端登陆,实现取款、查询、转账、密码修改等业务操作,银行管理员在后台实现对银行数据库信息的增删改查等操作。
由于银行ATM系统着重的是安全性和实用性,本系统采用JAVA语言进行开发,由于Java语言具有简单、面向对象、多线程、分布性、体系结构中立、安全性等方面的优点,并且由Java语言开发的软件可以在不同的硬件平台和操作系统下运行,大大提高了程序的可移植性。同时通过Access对象进行界面之间的转换,从而完成用户的相关操作和信息保存。
一个软件系统的开发,从最初的需求分析到流程图的绘制及模块的分析,再到最后的数据库设计及代码的编写实现都需要自己动手一步一步的来解决完成,这个过程对于自己在大学所学的知识是一个非常好的检验,对自己动手能力及思维能力也是一次非常好的锻炼。希望通过这次毕业设计的研究学习,认清自己的不足之处,不断的去学习完善自己的理论知识,逐步提高动手能力,为以后的工作打下坚实的基础。
2.1可行性分析
2.1.1技术可行性
技术可行性分析主要是分析现有的技术条件能否顺利完成软件的开发工作,软件、硬件能否满足开发者的需要。本系统采用JAVA技术进行软件开发,JAVA具有动态联编的特性,更能发挥出面向对象的优势。多线程机制使应用程序能并行执行,Java有一套成熟的同步原语,保证了对共享数据的正确操作.通过使用多线程,程序设计者可以分别用不同的线程完成特定的行为,而不需要采用全局的事件循环机制,这样就很容易实现网络上实时的交互行为。Java的设计使它适合于一个不断发展的环境。在类库中可以自由地加入新的方法和实例变量而不会影响用户程序的执行。并且Java通过接口来支持多重继承,使之比严格的类继承具有更灵活的方式和扩展性7]。Java有建立在公共密钥技术基础上的确认技术.指示器语义的改变将使应用程序不能再去访问以前的数据结构或是私有数据,大多数病毒也就无法破坏数据.因而,用Java可以构造出无病毒、安全的系统。
2.1.2经济可行性
本系统实现的功能较少且简单,所以在开发的过程中基本上不需要考虑什么成本开发人员已尽可能的减少。使用较成熟的开发工具也减少不必要的支出,只需用很小的代价便可开发完毕。使用本系统的用户只需在短时间内就可以获得个人所需的信息,并获得需要的服务。这点与传统的人工服务相比,效率得到了很大的提升,无论是对用户还是公司都节省了大量的时间,带来很大的方便,并且省去了雇佣员工的费用。软件的经济效益大大的超过了它的开发成本,所以开发本软件在经济上是可行的。
2.1.3操作可行性
本系统采用的是直观的图形用户界面,用户进入ATM系统的主界面后,有取款和转账等操作按钮可供用户选择,各个界面简洁,操作方便,容易上手,更有提示信息。总体来说,程序操作简单,数据显示直观。
另外,从法律方面来看,该系统的开发只运用于学习中,它不存在法律问题,也可以说是完全合法的,完全可行的。从社会效益方面来看,该系统的应用有利于银行业的发展提高它的经济效益,同时促进社会经济的发展。
2.2需求分析
需求分析是软件工程前期的最后一个阶段,在这一阶段需要确定系统必须完成哪些工作,也就是对系统提出完整,准确,清晰,具体的要求。需求分析的方法必须遵守下述准则:
1)必须理解并描述ATM系统的信息域,根据这条准则应该建立数据模型。
2)必须定义ATM系统应完成的功能,建立相应的功能模型。
3)必须描述作为外部事件结果的软件行为,建立相应的行为模型。
4)必须对描述信息,功能和行为的模型进行分解,用层次的方式展开细节。
2.2.1系统功能需求
系统的实现采用直观的图形用户界面,用户进入ATM系统的主界面后,对余额的查询、取款等简单操作,有查询、取款和转账等操作界面可供用户选择,各个界面简洁,操作方便,容易上手。用户可以对账户进行详细的信息查询,然后根据需求进行取款等操作(整个程序运行过程中,对用户不当的操作将提出错误警告)。
系统登录:每个用户对应自己的登录口令,不能修改和查看他人帐号。
密码修改:用户可以对自己的帐号和口令进行修改。
取款:辨认用户输入的取款金额是否正确。
转帐:与系统中其他用户进行转帐,需要对象用户同样存在于数据库中。
查询金额:查询自己的余额。
存款:存入所需款项。
退卡:设定退卡时间限制。
明确用户的信息需求,明确新系统的逻辑功能。主要工作是对用户需求进行进一步调查分析,创建新系统的逻辑模型。
2.2.2系统性能需求
本系统对于计算机系统的性能配置要求是能保障能使程序快速、稳定地运行,必须通过用户名和密码的验证才能进入系统,如果用户名与密码验证通不过,则给予错误提示,不显示当前内容,用户登录,必须通过验证,保证其用户名与密码的正确性,才能登录系统,以此满足系统的安全性需求。
2.2.3其他需求
除了上述的功能需求分析与性能需求分析,系统还存在着其它的需求,如可靠性和可用需求,可靠性需求能够保障系统的可靠性,可用性需求则可量化用户可以使用系统的程度。此外,还有接口需求,逆向需求等。
2.3功能分析
登录:连接数据库 判断账号密码是否正确
存款:定期+活期储存在两个表中
只能从输入键盘输入钱数
存款只能是100的整数倍
定期存款
活期存款
取款:只能取出活期存款
金额必须为100或100的整数倍
所取金额大于卡内余额弹出提示框
转账:所转账号必须真实存在且不能是自己的账号
转账金额不能超过卡内余额
查询:连接数据库对card表中的money(活期存款)和permoney(定期存款)进行查询最后返回到屏幕上输出给用户
3.1系统设计指导思想
银行ATM已经发展成为各大银行金融服务战略中的重要一环,为广大用户提供了更加快捷和人性化的服务,ATM已经成为我们日常生活中不可或缺的一部分,该项目正是通过设计一个ATM模拟程序来实现ATM机系统的基本功能,充分运用所学知识进行设计编程。
3.2数据库设计
通常使用实体-联系图来建立数据模型。可以吧实体联系图简称为ER图,相应的可把用ER描绘的数据模型称为ER模型。ER图中包含了实体、关系和属性3种基本成分,通常用矩形框代表实体,用连接相关实体的菱形框表示关系,用椭圆形或者圆角矩形表示实体属性,并用直线把实体与其属性连接起来。
数据库设计指对系统所采用的数据模式、子模式、应用程序、数据库等根据用户的具体要求进行分析和设计。它也是管理信息系统设计的重要组成部分。数据库设计的基本原则是尽可能提高数据组织的相对独立性,简化其结构,即用规范化方法设施数据存储的结构,提高数据的可维护性、完整性、一致性。通过收集和分析用户需求,确定了数据库要保存的信息,将此次数据库设计为二个如下所示表的设计如下:
1.卡的信息表:
2.管理员表:
3.交易信息表:
第四章 详细设计
4.1登录模块
4.1.1登录模块介绍
登录模块分为管理员登录与普通用户登录。在登录时,对用户的账号与密码进行匹配,若账号密码匹配成功,则登陆成功;如果用户名错误,则弹出“账号不存在”的提示框;如果密码错误,则弹出“密码错误”提示框;如果密码连续错误三次,则弹出“吞卡”提示框。
4.1.2登录情况介绍
1.登陆成功
2.账号匹配错误
3.密码匹配错误
4.密码连续错误三次,吞卡
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
String account=tfAccount.getText();
String pwd=new String(tfPwd.getPassword());
try {
Socket s=new Socket(InetAddress.getByName("127.0.0.1"),8009);
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter pw=new PrintWriter(s.getOutputStream());
//发送数据到服务器
pw.write("Login\r\n");
pw.write(account+"\r\n");
pw.write(pwd+"\r\n");
pw.flush();
//等待服务器响应
String strEcho=br.readLine();
if(strEcho.equals("1")){
JOptionPane.showMessageDialog(Login.this, "对不起,您的账号有误!");
}else if(strEcho.equals("2")){
JOptionPane.showMessageDialog(Login.this, "欢迎登录河北金苑银行!");
Login.this.dispose();
float money=Float.parseFloat(br.readLine());
String phone=br.readLine();
float permoney=Float.parseFloat(br.readLine());
currCard=new Card(account,pwd,money,phone,permoney);
//System.out.println(permoney);
new MainFrame(br,pw,currCard).init();
}
else if(strEcho.equals("4")){
JOptionPane.showMessageDialog(Login.this,"您的密码有误!请重新输入!");
}
else if(strEcho.equals("3")){
JOptionPane.showMessageDialog(Login.this,"服务器验证密码错误三次,吞卡!");
System.exit(0);
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
btManager.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
new Manager(null, null).init();
}
});
btCancel.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
Login.this.dispose();
}
});
}
线程1:登录信息
public static void main(String[] args) {
// TODO Auto-generated method stub
new Login().init();
}
}
public class ServerLis {
Card currCard;
int count;// 密码错误次数
String strHead;
Statement st;
ResultSet rs;
Connection conn;
public void init() {
try {
ServerSocket ss = new ServerSocket(8009);
Socket s;
while (true) {
// 等待客户端链接
s = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(
s.getInputStream()));
PrintWriter pw = new PrintWriter(s.getOutputStream());
// 接收客户端数据
strHead=br.readLine();
String account = br.readLine();
String pwd = br.readLine();
// 数据库匹配
// 1加载驱动
if(strHead.equals("Login")){
Conn n =new Conn();
conn=n.getConnection();
try {
st = conn.createStatement();
// 4执行sql语句
String sql = "select * from card where account='" + account
+ "'";
rs = st.executeQuery(sql);
if (rs.next()) {
if (pwd.equals(rs.getString("pwd"))) {
currCard = new Card(account, pwd,rs.getInt("money"),rs.getString("phone"), rs.getInt("permoney"));
pw.write("2\r\n");
pw.write(currCard.getMoney() + "\r\n");
pw.write(rs.getString("phone")+"\r\n");
pw.write(rs.getInt("permoney")+"\r\n");
pw.flush();
new Thread(new ServerLis2(br, pw, currCard))
.start();
}
else{
count++;
if(count==3){//密码错误3次
pw.write("3\r\n");
pw.flush();
}else{ //密码错误不足3次
pw.write("4\r\n");
pw.flush();
}
}
rs.close();
st.close();
conn.close();
}
else{
pw.write("1\r\n");
pw.flush();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else if(strHead.equals("Manager")){
Conn n =new Conn();
conn=n.getConnection();
try {
st = conn.createStatement();
// 4执行sql语句
String sql = "select * from manager where account='" + account
+ "'";
rs = st.executeQuery(sql);
if (rs.next()) {
if (pwd.equals(rs.getString("pwd"))) {
pw.write("2\r\n");
pw.flush();
new Thread(new ServerLis2(br, pw, currCard))
.start();
}
else{
count++;
if(count==3){//密码错误3次
pw.write("3\r\n");
pw.flush();
}else{ //密码错误不足3次
pw.write("4\r\n");
pw.flush();
}
}
rs.close();
st.close();
conn.close();
}
else{
pw.write("1\r\n");
pw.flush();
}
//} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
// System.out.println("数据库驱动加载失败!");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new ServerLis().init();
}
}
4.2存款模块
4.2.1存款模块介绍
存款模块界面有输入键盘,使用户只能从输入键盘中输入钱数,避免了出现输入不法字符的情况。同时在存款过程中,存款只能是100的整数倍,如果存在不是100的整数倍的情况, 则弹出提示框提示用户,让用户重新输入。存款成功后,界面上会提示“存款成功”并提示用户目前账户内的余额。存款分为了定期存款与活期存款,定期存款与活期存款分别存储在两个表中。
4.2.2存款情况介绍
1.存款成功,提示余额
2.输入的金额必须是100或100的倍数
3.定期存款
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
if(arg0.getSource()==bt100||arg0.getSource()==bt200||arg0.getSource()==bt300||arg0.getSource()==bt500||arg0.getSource()==bt1000)
tfMoney.setText(arg0.getActionCommand());
else if(arg0.getSource()==bt000||arg0.getSource()==bt001||arg0.getSource()==bt002||arg0.getSource()==bt003||arg0.getSource()==bt004||arg0.getSource()==bt005||
arg0.getSource()==bt006||arg0.getSource()==bt007||arg0.getSource()==bt008||arg0.getSource()==bt009){
tfMoney.setText(tfMoney.getText()+arg0.getActionCommand());
}else if(arg0.getSource()==btOk){
int takeMoney=Integer.parseInt(tfMoney.getText());
if(putMoney%100!=0){
JOptionPane.showMessageDialog(Take.this, "对不起,请输入100或100的整数倍!!");
tfMoney.setText("");
}
else{
//发送新的账户信息给服务器
pw.write("take\r\n");
pw.write(takeMoney+"\r\n");
pw.flush();
//等待服务器响应
String strEcho="";
try {
strEcho=br.readLine();
if(strEcho.equals("ok")){
currCard.setMoney(currCard.getMoney()+putMoney);
JOptionPane.showMessageDialog(Take.this, "恭喜您存款"+putMoney+"元成功!\n您的当前账户余额是"+currCard.getMoney());
tfMoney.setText("");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}else if(arg0.getSource()==btCancel){
put.this.dispose();
}else if(arg0.getSource()==btRetry){
tfMoney.setText("");
}
}
}
4.3取款模块
4.3.1取款模块介绍
取款时只能取出活期存款的金额,定期存款的金额无法取出。同时,取款金额也必须为100或100的倍数;当所取金额超过卡内余额是,弹出提示框提醒用户“余额不足”。
4.3.2取款情况介绍
1.取款成功
2.余额不足
3.取款金额必须为100或100的倍数
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
if(arg0.getSource()==bt100||arg0.getSource()==bt200||arg0.getSource()==bt300||arg0.getSource()==bt500||arg0.getSource()==bt1000)
tfMoney.setText(arg0.getActionCommand());
else if(arg0.getSource()==bt000||arg0.getSource()==bt001||arg0.getSource()==bt002||arg0.getSource()==bt003||arg0.getSource()==bt004||arg0.getSource()==bt005||
arg0.getSource()==bt006||arg0.getSource()==bt007||arg0.getSource()==bt008||arg0.getSource()==bt009){
tfMoney.setText(tfMoney.getText()+arg0.getActionCommand());
}else if(arg0.getSource()==btOk){
int takeMoney=Integer.parseInt(tfMoney.getText());
if(takeMoney%100!=0){
JOptionPane.showMessageDialog(Take.this, "对不起,请输入100或100的整数倍!!");
tfMoney.setText("");
}
else if(currCard.getMoney()
JOptionPane.showMessageDialog(Take.this, "对不起,您的余额不足!");
tfMoney.setText("");
}
else{
//发送新的账户信息给服务器
pw.write("take\r\n");
pw.write(takeMoney+"\r\n");
pw.flush();
//等待服务器响应
String strEcho="";
try {
strEcho=br.readLine();
if(strEcho.equals("ok")){
currCard.setMoney(currCard.getMoney()-takeMoney);
JOptionPane.showMessageDialog(Take.this, "恭喜您取款"+takeMoney+"元成功!\n您的当前账户余额是"+currCard.getMoney());
tfMoney.setText("");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}else if(arg0.getSource()==btCancel){
Take.this.dispose();
}else if(arg0.getSource()==btRetry){
tfMoney.setText("");
}
4.4转账模块
4.4.1转账模块介绍
转账是首先会对所转账号进行核对,所转账号必须真实存在且不能是自己的账号,同时转账金额不能超过卡内余额。
4.4.2转账情况介绍
1.转账成功
2.不能向自己转账
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
int transMoney=Integer.parseInt(tfMoney.getText());
//钱数为空的表达
if(tfMoney.getText()==""){
JOptionPane.showMessageDialog(Transfer.this, "对不起,钱数不能为空!");
}
else if(currCard.getMoney()
JOptionPane.showMessageDialog(Transfer.this, "对不起,您的余额不足!");
tfMoney.setText("");
}
else{
try {
String account=tfAccount.getText();
pw.write("transfer\r\n");
pw.write(account+"\r\n");
pw.write(transMoney+"\r\n");
pw.flush();
String strEcho = br.readLine();
if(strEcho.equals("1")){
JOptionPane.showMessageDialog(Transfer.this, "对不起,您转的账号不存在!");
}
else if(strEcho.equals("2")){
JOptionPane.showMessageDialog(Transfer.this, "不能给自己转账!");
}
else if(strEcho.equals("ok")){
currCard.setMoney(currCard.getMoney()-transMoney);
JOptionPane.showMessageDialog(Transfer.this, "向"+account+"转账"+transMoney+"元成功!"+'\n'+"您的账户余额为:"+currCard.getMoney()+"元");
tfMoney.setText("");
tfAccount.setText("");
Transfer.this.dispose();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
btCancel.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
dispose();
}
});
}
}
4.5查询模块
4.5.1查询模块介绍
查询模块主要实现的是用户查询自己的银行卡余额。
4.5.2查询情况介绍
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
JOptionPane.showMessageDialog(MainFrame.this, "您当前账户活期余额为:"+currCard.getMoney()+"\n"+"您当前账户定期余额为:"+currCard.getPermoney()+"\n"+"预存手机号码为:"+currCard.getPhone());//如何将permoney传过来
}
});
btCommuni.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
new Manager(br, pw).init();
}
});
4.6修改信息模块
4.6.1修改信息模块介绍
修改信息模块只要实现的是用户自己修改密码及手机号
4.6.2修改信息情况介绍
btCancel.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
//if(e.getSource()==btCancel){
Update1.this.dispose();
new MainFrame(br, pw, currCard).init();
}
});
//else if(e.getSource()==btOk){
btOk.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
String oldpwd=new String(tfoldpwd.getPassword());
String newpwd=new String(tfnewpwd.getPassword());
String newpwd1=new String(tfnewpwd1.getPassword());
String currpwd=new String(currCard.getPwd());
int a=oldpwd.compareTo(currpwd);
int b=newpwd.compareTo(oldpwd);
int c=newpwd1.compareTo(newpwd);
if(a!=0){
JOptionPane.showMessageDialog(Update1.this,"对不起,原密码输入错误,请核对后输入");
tfoldpwd.setText("");
tfnewpwd.setText("");
tfnewpwd1.setText("");
}
else if(b==0){
JOptionPane.showMessageDialog(Update1.this, "对不起,新密码不能与原来一致");
tfoldpwd.setText("");
tfnewpwd.setText("");
tfnewpwd1.setText("");
}
else if(c!=0){
JOptionPane.showMessageDialog(Update1.this, "对不起,新密码两次输入不一致");
tfoldpwd.setText("");
tfnewpwd.setText("");
tfnewpwd1.setText("");
}else{
//发送新的账户信息给服务器
pw.write("Update1\r\n");
pw.write(newpwd+"\r\n");
pw.flush();
//等待服务器响应
String strEcho;
try {
strEcho=br.readLine();
if(strEcho.equals("ok")){
JOptionPane.showMessageDialog(Update1.this, "恭喜您成功修改密码,新密码为"+newpwd);
Update1.this.dispose();
new Login().init();
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
});
//}else if(e.getSource()==btRetry){
btRetry.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
tfoldpwd.setText("");
tfnewpwd.setText("");
tfnewpwd1.setText("");
}
});
}
}
修改手机号关键代码
btCancel.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
//if(e.getSource()==btCancel){
Update2.this.dispose();
new MainFrame(br, pw, currCard).init();
}
});
//else if(e.getSource()==btOk){
btOk.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
String oldphone=new String( tfoldphone.getText());
String newphone=new String(tfnewphone.getText());
String newphone1=new String(tfnewphone2.getText());
String currphone=new String(currCard.getPhone());
int a=oldphone.compareTo(currphone);
int b=newphone.compareTo(oldphone);
int c=newphone1.compareTo(newphone);
if(a!=0){
JOptionPane.showMessageDialog(Update2.this,"对不起,预留手机号输入错误,请核对后输入");
tfoldphone.setText("");
tfnewphone.setText("");
tfnewphone2.setText("");
}
else if(b==0){
JOptionPane.showMessageDialog(Update2.this, "对不起,新手机号不能与原来一致");
tfoldphone.setText("");
tfnewphone.setText("");
tfnewphone2.setText("");
}
else if(c!=0){
JOptionPane.showMessageDialog(Update2.this, "对不起,新手机号两次输入不一致");
tfoldphone.setText("");
tfnewphone.setText("");
tfnewphone2.setText("");
}else{
//发送新的账户信息给服务器
pw.write("Update2\r\n");
pw.write(newphone+"\r\n");
pw.flush();
//等待服务器响应
String strEcho;
try {
strEcho=br.readLine();
if(strEcho.equals("ok")){
JOptionPane.showMessageDialog(Update2.this, "恭喜您成功修改手机号,新手机号为"+newphone);
Update2.this.dispose();
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
});
//}else if(e.getSource()==btRetry){
btRetry.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
tfoldphone.setText("");
tfnewphone.setText("");
tfnewphone2.setText("");
}
});
}
}
第五章 总结
5.1遇到的难点及解决办法
在此次中遇到了一些问题,如对于面向对象的方法了解不够透彻,运用到实际的软件开发中存在着困难。对于Java语言只学习到了一些最基本的知识,要在短时间内用Java语言来是一个较大的挑战。对于正规开发的流程不熟悉适应起来比较慢,自己感觉难以动手,这表明所学的知识不能灵活运用到实际中。
对于以上的问题自己有清楚的认识,解决办法是需要大量阅读相关的书籍,对于书上以及网站上下载的资料中的Java实例必须有清楚的理解,还有就是多跟老师和同学交流取其精华,对于实际动手能力与的流程的适应必须多进行实际的练习与操作才能有大的进步空间。
在实现过程中,因为前期考虑不充分,使得有些功能具有局限性,不够完善,例如,开户功能中,开户账号是手动输入,需要多次与数据库中已有账号进行比较等。而且未能实现金融模块。同时对用户信息的定义过少,表的结构过于简单。
5.2课程设计收获
此次模拟ATM系统的开发让我学习到很多知识,现总结如下:
1.系统开发的过程中,我深刻体会到一个问题,那就是:一个系统开发的过程中编码不是最重要的,重要的是对系统进行分析以及建立恰当的系统模型。有了一个好的系统模型之后,我们再将其划分成几个模块,那样做起来就会容易得多。
2.在该ATM模拟系统设计中,从系统的实用性出发,我能够在开发该系统时站在用户的角度看问题,本着用户操作界面友好、清晰、易学易用的原则进行设计。如开发过程中我尽可能地设想记录为空,输入为空,输入出错等边界条件,然后在这些边界上,设置出错检测,使系统能自动捕获出错点,给出提示,允许用户重新进行操作,使系统能够安全的运行下去,而不是退出系统。
3.在本次设计中,我发现了一种应用编程接口JDBC。它是一种面向对象的、与语言无关的应用编程接口,具有易于使用、高速度、低内存支出和占用磁盘较少,可以使用所有支持0DBC的数据库等优点;使用JDBC可以实现动态数据库的链接,从而避免以往静态方式连接数据库的--些缺点。这些知识对我本次的系统开发有着很大的帮助。
开发期间,我学会了有目的的去学习--些将要用到的东西,仔细地考虑工作流程的规律和步骤,充分利用手中的开发工具,利用其所具备的功能,尽量使自己的开发在代码上实现少而精确、让用户能够尽量简单地进行操作。但是在检测过程中,还是出现了很多的不足之处,这些都是要在今后的工作中需要努力改进和完善的。
在这次毕业设计中,我遇到了很多困难,这主要是由于我开发软件的经验不足,工具的应用也不够熟练,虽然用的语言是JAVA,但是由于以前基础不够扎实,对我来说可以算是一个全新的尝试,整个开发过程并不是很顺利,却使我从中充分体会到学习的快乐,系统也在从理论到实践,再从实践到理论的反复中一步步得到完善。
5.3期望
这次的系统开发,实现了我自己动手完成一个系统开发的目标,也学习到很多东西,不只是实践经验,还有一些做事的道理。并且,对于这次体验而言,我们应该巩固已经掌握的知识,加强基础知识的学习。以后做课程设计时,多参考一些不同的资料书,具体了解所做项目各个功能怎样运转实现,把自己所学真真切切融入于社会实际。做出更切合实际、更符合需要的、功能更全面的好的设计。
1 《从问题到程序》机械工业出版社20115月第二版
2 神龙工作室. ASP.NET 2.0网络编程入门与提高[M]. 北京:人民邮电出版社, 2008.9, 2-8.
3 蔡继文等. 21天学通ASP.NET[M]. 北京:电子工业出版社, 2009.1, 21-22.
4 王珊,萨师煊.数据库系统概论(第四版)[M].北京:高等教育出版社,2006.5,79-80.
5 龙马工作室. 新编ASP.NET 2.0+SQL Server 2005从入门到精通[M]. 北京:人民邮电出版社, 2008, 215-258.
6 Jesse,L.& D.Hurwitz. Programming ASP.NET(中文版) [M].北京:电子工业出版社,2007, 408.
7 李书杰,李志刚.B/S三层体系结构模式[J],河北理工学院学报,2002(24):26-34.
8 江广顺, 余松编. ASP.NET 2.0+SQL Server热门网络应用开发详解[M]. 北京:人民邮电出版社, 2007, 35-40.
9 黄明, 梁旭, 段竹编. ASP.NET 2.0+SQL Server中小型信息系统开发实例精选北京:机械工业出版社, 2007, 17-18.
10 罗斌等. ASP.NET 2.0数据库开发经典案例[M]. 北京:中国水利水电出版社, 2008,114-152.
11 朱少民. 软件测试方法和技术[M].北京:清华大学出版社,2010.7, 25-27.