ATM-GUI版

@[LZJ]ATM-GUI

关于ATM-GUI版,实现各自功能

用实体类之后,代码时变得简介,面向对象封装思想。

最重要的是,如果将来有所改动,只需要改动实体类, 方法间调用接口,完全不需要变动,大大减少了程序修改量,迎合了面向对象中接口不变的思想。

甚至在程序设计时,就把将来可能需要的属性预先放在实体类中,这样以后变动时,连实体类都不用变动了

一、建立账号实体类:通过账号,密码,账号余额,并创立相应的内容。

以下是相应的代码:

/**
 * 账号实体类
 * @author 一期一会
 *
 */
public class CodeBean {
	/**
	 * 账号
	 */
	private String code;
	/**
	 * 密码
	 */
	private String pwd;
	/**
	 * 账号余额
	 */
	private int money;
	public CodeBean() {
		super();
	}
	public CodeBean(String code, String pwd, int money) {
		super();
		this.code = code;
		this.pwd = pwd;
		this.money = money;
	}
	
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public int getMoney() {
		return money;
	}
	public void setMoney(int money) {
		this.money = money;
	}
	@Override
	public String toString() {
		return "CodeBean [code=" + code + ", pwd=" + pwd + ", money=" + money + "]";
	}

二、建立账号相关接口:账号业务接口(放入后面需要的方法,方便使用)。

什么是java接口:

Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现。

不同于接口的概念,接口是一个类所具有的方法的特征集合,是一种逻辑上的抽象。

主要功能有:1、登录 2、查询 3、存款 4、取款 5、改密 6、转账

以下是相应的代码:

/**
* 账号业务接口
* @author 一期一会
*
*/
public interface IcondeService {
   
   /**
    * 登录
    * @param code  账号
    * @param pwd  密码
    * @return  登录是否成功
    */
   public boolean login(String code,String pwd);
   
   /**
    * 得到登录账号的金额
    * @return  账号金额
    */
   public int getCodeMoney();
   
   /**
    * 存款
    * @param sm  存款金额
    */
   public void saveMoney(int sm);
   
   /**
    * 取款
    * @param gm  取款金额
    * @return 取款是否成功,余额不足返回false,取款成功,返回true
    */
   public boolean sellMoney(int gm);
   
   /**
    * 改密码
    * @param oldPwd 旧密码
    * @param newpwd 新密码
    * @param repwd  确认新密码
    * @return  出错信息,如果修改成功,返回null
    */
   public String updatePwd(String oldPwd,String newpwd,String repwd);
   
   /**
    * 转账				
    * @param tranCodde  目标账号
    * @param money  转账金额
    * @return  出错信息,如果转账成功,返回null
    */
   public String transferMoney(String tranCodde,int money);

三、建立实现相应账号相关接口的类:CodeServiceImpl(后面的主要操作都在这里进行,可以方便以后的更改,不需要对窗口等其他类中重复操作,造成编码人的混乱以及读码人不必要的麻烦。PS:在后面学习相应的读取、写入直接在这里进行修改就好)。

父接口引用子接口特征
夫接口引用可以访问子接口实现类重写的方法
接口的实现需要重写该接口和该接口的所有父接口的所有特征方法

以下是相应的代码:

/**
    * 账号数组
    */
   private static CodeBean[] codeArray = {
   		new CodeBean("1","111",5000),
   		new CodeBean("2","222",8000),
   		new CodeBean("3","333",4000)
   };
   
   /**
    * 登录账号
    */
   private static CodeBean loginCode;

   @Override
   public boolean login(String code, String pwd) {
   	for (int i = 0; i < codeArray.length; i++) {
   		if(codeArray[i].getCode().equals(code) && codeArray[i].getPwd().equals(pwd)) {
   			loginCode = codeArray[i];
   			return true;
   		}
   	}
   	return false;
   }

   @Override
   public int getCodeMoney() {
   	return loginCode.getMoney();
   }

   @Override
   public void saveMoney(int sm) {
   	loginCode.setMoney(loginCode.getMoney() + sm);
   }

   @Override
   public boolean sellMoney(int gm) {
   	if(gm > loginCode.getMoney()) {
   		return false;
   	}
   	loginCode.setMoney(loginCode.getMoney() - gm);
   	return true;
   }

   @Override
   public String updatePwd(String oldPwd, String newpwd, String repwd) {
   	String info = "";
   	if(oldPwd.equals(loginCode.getPwd()) == false){
   		info += "原密码错误\n";
   	}
   	if(newpwd.equals(repwd)==false) {
   		info += "两次密码不一致\n";
   	}
   	if(info.length() != 0) {
   		return info;
   	}
   	loginCode.setPwd(newpwd);
   	return null;
   }

   @Override
   public String transferMoney(String tranCodde, int money) {
   	String info = "";
   	//得到转账账号
   	CodeBean transCode = checkCode(tranCodde);
   	if(transCode == null) {
   		info += "转账账号不存在\n";
   	}
   	if(money > loginCode.getMoney()) {
   		info += "余额不足\n";
   	}
   	if(info.length() != 0) {
   		return info;
   	}
   	loginCode.setMoney(loginCode.getMoney() - money);
   	transCode.setMoney(transCode.getMoney() + money);
   	return null;
   }

   /**
    * 验证账号是否存在
    * @param code  账号
    * @return  是否存在
    */
   private CodeBean checkCode(String code) {
   	for (int i = 0; i < codeArray.length; i++) {
   		if(code.equals(codeArray[i].getCode())) {
   			return codeArray[i];
   		}
   	}
   	return null;
   }

**里面所用到通过定义数组来表示账号、密码、余额
通过:
private static CodeBean loginCode;来进行对各自账号相应的操作(避免了之前学习通过下标找相应的账号)。
通过:
checkCode()方法来对需要进行转账的账号进行判断账号是否正确。
通过:
String info = “”; 来对改密方法和转账方法进行判断。
_

四、建立图形界面。(这里使用的是跳转窗体)

一、建立窗体。

一、界面共有:1、登录界面 2、菜单界面3、查询界面 4、存款界面 5、取款界面 6、改密界面 7、转账界面。

二、建立相应的事件监听器,用来进行个界面之间的跳转。

Listener是监听者,比如你定义了一个按钮,用addActionListener就可以给这个按钮添加一个监听者,一旦有事件发生(比如鼠标点击),监听者都可以得到这个事件,并可以把事件信息(例如事件源)传给事件处理函数

二、建立了三个类用来封装JTextField、JLabel、JButton(简化代码)。

以下是三个自己建立的:JTextField、JLabel、JButton三个类:

public class MyTxt extends JTextField{
	
	public MyTxt(String lable,int x,int y,Container jf) {	
		JLabel accountLabel = new JLabel(lable);
		accountLabel.setBounds(x , y,150,50);
		jf.add(accountLabel);
		this.setBounds(x + 100, y, 150, 50);
		jf.add(this);
	}
}

public class MyJLable extends JLabel{
	public MyJLable(String info,int x,int y,Container myJFram) {
		//设置按钮的文本
		this.setText(info);
		//设置按钮位置和大小
		this.setBounds(x,y, 100, 30);
		//加入字体
		this.setFont(new Font("宋体", Font.PLAIN, 25));
		//将按钮加入窗体
		myJFram.add(this);
	}
}

public class MyButton extends JButton{	
	public MyButton(String name,int x,int y,Container jf) {	
		//设置按钮文本
		this.setText(name);
		//设置按钮位置和大小
		this.setBounds(x, y, 140, 50);
		//加入按钮字体
		this.setFont(new Font("宋体", Font.PLAIN, 25));
		//按钮加入窗体
		jf.add(this);	
	}
}

总结

在此次编码过程中复习了之前相关的Java基础知识,也对学习新的知识得到了有效的巩固,但自己还有许多不足之处还需要加强学习。

作为一名小白,不会的还有很多,该ATM的图形界面版本在老师和同学们的帮助下完成。特此感谢老师和同学们的帮助!
做的如有不足之处敬请批评指正!
基于wxPython和pymysql,可以设计一个ATM GUI系统,实现现实生活中ATM机器的大部分功能,包括插卡、退卡、取款、存款等操作。以下是一个简单的ATM GUI系统的实现: ```python import wx import pymysql class MyFrame(wx.Frame): def __init__(self): super().__init__(parent=None, title='ATM GUI') self.SetSize(400, 300) panel = wx.Panel(self) vbox = wx.BoxSizer(wx.VERTICAL) hbox1 = wx.BoxSizer(wx.HORIZONTAL) st1 = wx.StaticText(panel, label='Card Number:') hbox1.Add(st1, flag=wx.RIGHT, border=8) self.tc1 = wx.TextCtrl(panel) hbox1.Add(self.tc1, proportion=1) vbox.Add(hbox1, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP, border=10) hbox2 = wx.BoxSizer(wx.HORIZONTAL) st2 = wx.StaticText(panel, label='Password:') hbox2.Add(st2, flag=wx.RIGHT, border=8) self.tc2 = wx.TextCtrl(panel, style=wx.TE_PASSWORD) hbox2.Add(self.tc2, proportion=1) vbox.Add(hbox2, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP, border=10) hbox3 = wx.BoxSizer(wx.HORIZONTAL) btn1 = wx.Button(panel, label='Login') hbox3.Add(btn1) btn2 = wx.Button(panel, label='Exit') hbox3.Add(btn2, flag=wx.LEFT|wx.BOTTOM, border=5) vbox.Add(hbox3, flag=wx.ALIGN_RIGHT|wx.RIGHT, border=10) panel.SetSizer(vbox) btn1.Bind(wx.EVT_BUTTON, self.login) btn2.Bind(wx.EVT_BUTTON, self.exit) def login(self, event): card_num = self.tc1.GetValue() password = self.tc2.GetValue() # 连接数据库 conn = pymysql.connect(host='localhost', user='root', password='123456', database='atm') cursor = conn.cursor() # 查询卡号和密码是否匹配 sql = "SELECT * FROM user WHERE card_num=%s AND password=%s" cursor.execute(sql, (card_num, password)) result = cursor.fetchone() if result: # 登录成功,跳转到操作界面 self.Destroy() op_frame = OperationFrame(result) op_frame.Show() else: # 登录失败,弹出提示框 wx.MessageBox('Card number or password is incorrect!', 'Error', wx.OK|wx.ICON_ERROR) cursor.close() conn.close() def exit(self, event): self.Destroy() class OperationFrame(wx.Frame): def __init__(self, user_info): super().__init__(parent=None, title='ATM GUI') self.SetSize(400, 300) panel = wx.Panel(self) vbox = wx.BoxSizer(wx.VERTICAL) hbox1 = wx.BoxSizer(wx.HORIZONTAL) st1 = wx.StaticText(panel, label='Welcome, ' + user_info[1]) hbox1.Add(st1) vbox.Add(hbox1, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP, border=10) hbox2 = wx.BoxSizer(wx.HORIZONTAL) btn1 = wx.Button(panel, label='Check Balance') hbox2.Add(btn1) btn2 = wx.Button(panel, label='Withdraw') hbox2.Add(btn2, flag=wx.LEFT|wx.BOTTOM, border=5) vbox.Add(hbox2, flag=wx.ALIGN_CENTER|wx.TOP, border=50) hbox3 = wx.BoxSizer(wx.HORIZONTAL) btn3 = wx.Button(panel, label='Deposit') hbox3.Add(btn3) btn4 = wx.Button(panel, label='Transfer') hbox3.Add(btn4, flag=wx.LEFT|wx.BOTTOM, border=5) vbox.Add(hbox3, flag=wx.ALIGN_CENTER|wx.TOP, border=20) panel.SetSizer(vbox) btn1.Bind(wx.EVT_BUTTON, self.check_balance) btn2.Bind(wx.EVT_BUTTON, self.withdraw) btn3.Bind(wx.EVT_BUTTON, self.deposit) btn4.Bind(wx.EVT_BUTTON, self.transfer) def check_balance(self, event): # 查询余额 wx.MessageBox('Your balance is 10000.', 'Balance', wx.OK|wx.ICON_INFORMATION) def withdraw(self, event): # 取款 wx.MessageBox('Withdraw successfully!', 'Withdraw', wx.OK|wx.ICON_INFORMATION) def deposit(self, event): # 存款 wx.MessageBox('Deposit successfully!', 'Deposit', wx.OK|wx.ICON_INFORMATION) def transfer(self, event): # 转账 wx.MessageBox('Transfer successfully!', 'Transfer', wx.OK|wx.ICON_INFORMATION) if __name__ == '__main__': app = wx.App() frame = MyFrame() frame.Show() app.MainLoop() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值