1、 合肥学院 计算机科学与技术系 课程设计报告 2012~2013学年第一学期 课程 Java课程设计 课程设计名称 信用卡在线管理系统 专业班级 11计本(4)班 姓名 黄伟 指导教师 张贯虹 胡春玲 2013年1月 一. 需求分析 1、课程设计名称及内容 课程设计名称:信用卡在线管理系统 设计内容:设计一个信用卡管理系统,实现基于网络管理信用卡信息。 2、任务和要求 系统用户分为管理员、注册用户和普通用户。 a) 提供注册功能,系统的访问者可以注册成为注册用户,注册信息包括卡号、密码和其他个人信息。注册用户没有任
2、何操作权限,必须经管理员审批通过后成为普通用户才有权操作。新注册的用户,卡上初始金额为0。 b) 普通用户可以执行现金转入、现金转出、个人信息修改、余额查询和交易记录查询功能。 c) 用户可以录入转入金额和转出金额,当转出金额大于信用卡的余额时,须判断透支金额是否在本卡的信用额度内(信用额度由管理员设定),如果在则允许透支,否则拒绝支出。 d) 当信用卡发生透支后,在20天内不计利息,20天后按每天1%计算利息,当透支金额+透支利息超过本卡的信用额度,则本卡自动转入“黑名单”(利息继续计算),不再允许进行现金转出操作。 e) 普通用户可以随时查看卡内余额。 f) 普通用户可以按时间段
3、查看交易记录,包括转入、转出和透支情况。 g) 管理员可以审核注册用户,设定用户信用额度,批准成为普通用户。 h) 管理员可以查看系统内的黑名单,包括卡号和透支额度。 二. 设计 1.数据库设计思想: (1)数据库的设计:我们使用的数据库是Microsoft SQL 2005。 创建record和user表: create database card; use card; create table record ( id int not null primary key , fromId varchar(100) not null,
4、toId varchar(50) not null, money float not null, tradetime datetime ); create table user1 ( id varchar(50) primary key not null, password varchar(50) not null, name varchar(100) not null, type int , money float , credit float , overdraft float , blackli
5、st int );、 交易表 用户表 (2)对数据库的操作 Insert主要时用来对数据库进行插入操作,例如在record表中插入一条记录为, public boolean insert ( Record record ){ String sql = "insert into record(id,fromId,toId,money,tradetime) values(?,?,?,?,?)"; try { PreparedStatement pre = conn.prepareStatement(sql); Calendar calendar=Cal
6、endar.getInstance(); calendar.setTime(record.getTradetime()); pre.setInt(1 , record.getId()); pre.setString(2 , record.getFromId()); pre.setString(3 , record.getToId()); pre.setDouble(4 , record.getMoney()); pre.setDate(5 , record.getTradetime()); pre.execute(); retur
7、n true; } catch (SQLException e) { e.printStackTrace(); } return false; } Delete是多数据表中的记录加以删除,例如对user表中的记录删除操作为: public boolean delete ( User user ){ String sql = "delete from [user] where id=?"; try { PreparedStatement pre = conn.prepareStatement(sql); pre.setString(1
8、 user.getId()); pre.execute(); return true; } catch (SQLException e) { e.printStackTrace(); } return false; } Update是对数据库中的信息加以修改! findAll是查找数据库中的所有记录! findById是通过用户给定的id好来对数据库进行扫描,查找出所有与输入的id相匹配的信息! 同时也可以根据其他的关键字对数据库进行查找查找,例如是否是黑名单,是否已经有透支额了等等,具体的实现见代码! 2.java程序的设计:
9、主要以下几个包: --bean --User表示的是user表中的一条记录 --Record表示的是record表中的一条记录 --ChangePasswordBean是对修改密码时的所有属性的封装 --zhucBean是在新用户注册时的一条记录,主要包括属性id ,password ,name ;以及set和get方法! --dao --DBConnection用于连接数据库 --RecordDAO接口是封装对数据表Record的操作 --UserDAO接口是封装对数据表User的操作 --exception --
10、inputChangePasswordInfoNotRightException是用来显示输入的修改密码的出错的信息! --InputGetNumNotRightException是用户输入的取款金额不合法异常 --InputSetNumNotRightException是用户输入的存款金额不合法异常 --LoginInfoNotRightException 是用户登陆是的不合法异常 --imp --RecordDAOImp是对接口RecordDAO中的方法的实现。 --UserDAOImp是对接口UserDAO中方法的实现。 --service --Cha
11、ngePasswordService是对修改密码服务中可能出现的不正常信息加以分类并且予以处理。 --GetService是对用户输入的取款信息的不正常信息加以分类并且予以处理。 -- LoginService是对用户在登陆时输入信息的不正常信息加以分类并且予以处理。 -- SetService是对用户输入的存款信息的不正常信息加以分类并且予以处理。 -- view -- ChangePasswordFrame是修改密码的操作界面。 -- GetFrame是用户进行取款操作的界面。 -- GuanlFram是管理员进行操作的界面。 -- LoginView是登陆主界
12、面。 -- PtFram是普通用户的操作界面。 -- SetFrame是用户进行存款操作的界面。 -- zhucFram是新注册用户进行注册的界面。 a.登陆时主界面设计 public class LoginView extends JFrame implements ActionListener{ private JButton adminLoginButton; private JButton zhucButton; private JButton loginButton; private JTextField idField; private JP
13、asswordField passwordField; private JLabel showMessageLabel; private String title="登陆"; private JPanel panel=null; //protected ImageIcon icon; public LoginView(){ //窗口属性设置 this.setBounds(250, 80, 550,600); //icon=new ImageIcon("img/1.jpg"); panel=new JPanel(); panel.setLayo
14、ut(null); panel.setBounds(250, 80, 600,650); //创建相应的组件 adminLoginButton=new JButton("管理员登陆"); JLabel welcomeLabel=new JLabel("欢迎使用信用卡网上管理模拟系统"); showMessageLabel=new JLabel(); JLabel nameLabel=new JLabel("账号"); JLabel passwordLabel=new JLabel("密码"); idField=new JTextField(); passwo
15、rdField=new JPasswordField(); zhucButton=new JButton("注册"); loginButton=new JButton("登陆"); // button.setIcon(new ImageIcon(button.getToolkit().getImage("F:\\MyEclipse\\abcdefg\\atm\\icon.png"))); //组件属性设置 adminLoginButton.setBounds(390, 340, 120, 25); showMessageLabel.setBounds(100, 500,
16、500, 30); welcomeLabel.setFont(new Font("隶书",Font.BOLD,30)); welcomeLabel.setBounds(20, 50, 500, 60); nameLabel.setBounds(170,240,60,30); passwordLabel.setBounds(170, 290, 60, 30); idField.setBounds(205, 240, 180, 25); passwordField.setBounds(205, 290, 180, 25); zhucButton.setBounds(20
17、5, 340,60,25); loginButton.setBounds(305, 340,60,25); passwordField.setEchoChar('*'); // 注册监听器 adminLoginButton.addActionListener(this); zhucButton.addActionListener(this); loginButton.addActionListener(this); passwordField.addActionListener(this); //向面板中添加各个组件 panel.add(adminLogin
18、Button); panel.add(showMessageLabel); panel.add(welcomeLabel); panel.add(nameLabel); panel.add(passwordLabel); panel.add(idField); panel.add(passwordField); panel.add(zhucButton); panel.add(loginButton); this.add(panel); this.addWindowListener(new WindowAdapter(){ public void
19、windowClosing(WindowEvent e){ System.exit(0); } }); this.setResizable(false); this.setVisible(true); } /* * 事件处理 */ public void actionPerformed(ActionEvent e) { if((JButton)e.getSource()==zhucButton){ new zhucFram("新用户注册界面"); } else if((JButton)e.getSource()==lo
20、ginButton){ UserDAOImp userDao=new UserDAOImp(); User user=new User(); LoginService loginService=new LoginService(); user.setId(idField.getText().trim()); user.setPassword(String.valueOf(passwordField.getPassword())); User user1=userDao.findByIdAndPassword(user); System.o
21、ut.println("user="+user.getPassword()); try { loginService.checkLoginInfo(user1); //用户登陆成功后得主界面 new PtFram("用户登陆成功后的操作界面",user.getId()).setVisible(true); this.setVisible(false); System.out.println("ghghj"); JOptionPane.showMessageDialog(null,"登陆成功!!","",JOptionPane.
22、DEFAULT_OPTION); } catch (LoginInfoNotRightException e1){ e1.printStackTrace(); System.out.println(e.toString()); showMessageLabel.setText(e.toString()); } } else if(e.getSource()==adminLoginButton){ if("admin".equals(idField.getText())&&"admin".equals(String.valueOf
23、passwordField.getPassword()))){ //管理员注册成功后的主界面 new GuanlFram(" 管理员登陆成功后的操作界面").setVisible(true); this.setVisible(false); } else { showMessageLabel.setText("账号错或者密码错,请查找后重新登陆!"); idField.setText(null); passwordField.setText(null); } } } } 主界面截
24、图: b.注册新用户界面 public class zhucFram extends JFrame implements ActionListener { Box basebox,box1,box2; Button Button1,Button2; TextField NameTextField =new TextField(12); TextField idTextField =new TextField(12); JPasswordField passwordTextField = new JPasswordField(12); JPasswordField
25、 repasswordTextField = new JPasswordField(12); public zhucFram(String s) { super(s); Button1=new Button("确定"); Button2=new Button("取消"); box1=Box.createVerticalBox(); box1.add(new Label("姓名")); box1.add(Box.createVerticalStrut(8)); box1.add(new Label("卡号")); box1.add(Box.
26、createVerticalStrut(8)); box1.add(new Label("请输入密码")); box1.add(Box.createVerticalStrut(8)); box1.add(new Label("请再输一遍")); box1.add(Box.createVerticalStrut(8)); box1.add(Button1); box2=Box.createVerticalBox(); box2.add(NameTextField); box2.add(Box.createVerticalStrut(8));
27、box2.add(idTextField); box2.add(Box.createVerticalStrut(8)); box2.add(passwordTextField); box2.add(Box.createVerticalStrut(8)); box2.add(repasswordTextField); box2.add(Box.createVerticalStrut(8)); box2.add(Button2); basebox=Box.createHorizontalBox(); basebox.add(box1); bas
28、ebox.add(Box.createHorizontalStrut(10)); basebox.add(box2); Button1.addActionListener(this); Button2.addActionListener(this); setLayout(new FlowLayout()); add(basebox); setBounds(240,250,500,300); setVisible(true); } public void actionPerformed(ActionEvent e) { i
29、f(e.getSource()==Button1) { String userName = String.valueOf(NameTextField.getText()) ; String userId = String.valueOf(idTextField.getText()) ; String userPassword = String.valueOf(passwordTextField.getPassword()) ; String testPassword = String.valueOf(repasswordTextFi
30、eld.getPassword()) ; if(userPassword.equals(testPassword)){ try{ User user1=new User(); user1.setId(userId); user1.setName(userName); user1.setPassword(userPassword); UserDAOImp addUser=new UserDAOImp(); boolean success=addUser.insert(user1
31、); if(success) JOptionPane.showMessageDialog(null,"注册成功,请重新登陆","",JOptionPane.DEFAULT_OPTION); else{ JOptionPane.showMessageDialog(null,"注册失败!!","",JOptionPane.DEFAULT_OPTION); } } catch(Throwable www){www.printStackTrace();} } else{
32、 JOptionPane.showMessageDialog(null,"您输入的密码前后不符,请重新输入","",JOptionPane.DEFAULT_OPTION); } } else{dispose() ;} } } 用户注册界面截图: c.管理员登陆界面 public class GuanlFram extends Frame implements ActionListener{ Button shenhButton=new Button("审核注册用户"); Button chakButton=new Button("查看系统内的黑名
33、单"); Button _return = new Button("返回"); Box baseBox,box1; public GuanlFram(String s) { super(s); box1=Box.createVerticalBox(); box1.add(Box.createVerticalStrut(10)); box1.add(shenhButton); box1.add(Box.createVerticalStrut(10)); box1.add(chakButton); box1.add(Box.createVe
34、rticalStrut(10)); box1.add(_return); baseBox=Box.createHorizontalBox(); baseBox.add(box1); _return.addActionListener(this); shenhButton.addActionListener(this); chakButton.addActionListener(this); setLayout(new FlowLayout()); add(baseBox); this.addWindowListener(new Window
35、Adapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); setBounds(240,250,500,300); setVisible(true); } public void actionPerformed(ActionEvent e) { if(e.getSource()==shenhButton) { //System.out.println("新注册用户的信息"); U
36、serDAOImp userdao=new UserDAOImp(); List list = new UserDAOImp().findByType(0); final Frame frame=new Frame(); TextArea text=new TextArea(50,50); frame.setLayout(new FlowLayout()); frame.add(text); frame.setBounds(240,250,500,300); // frame.add(_
37、return);
frame.setVisible(true);
frame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
frame.setVisible(false);
}
});
if(list.size()==0)
text.append("系统现在没有新注册的用户");
else{
for(int i=0;i 38、size();i++){
User user=(User)list.get(i);
text.append("卡号:"+user.getId());
text.append("\n密码:"+user.getPassword());
text.append("\n姓名:"+user.getName());
text.append("\n余额"+user.getMoney());
text.append("\n信用额度"+user.getCredit());
text.ap 39、pend("\n透支金额"+user.getOverdraft());
text.append("\n******************************");
text.append("\n此时系统已经将新注册用户提升为普通用户了!");
user.setType(1);
text.append("\n******************************");
text.append("\n系统已经将新注册用户的信用额度设置为1000元!");
user.setCr 40、edit(1000);
userdao.update(user);
}
}
}
else if(e.getSource()==chakButton)
{
//System.out.println("进入系统黑名单界面");
List list = new UserDAOImp().findByBlacklist(1);
final Frame frame=new Frame();
TextArea text=new TextArea(50,50);
41、 frame.setLayout(new FlowLayout());
frame.add(text);
frame.setBounds(240,250,500,300);
frame.setVisible(true);
frame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
frame.setVisible(false);
}
});
if(list.si 42、ze()==0)
text.append("系统现在没有黑名单的用户");
else{
for(int i=0;i 43、etMoney());
text.append("\n信用额度:"+user.getCredit());
text.append("\n透支金额:"+user.getOverdraft());
text.append("\n******************************");
}
}
}
else if(e.getSource() == _return){
new LoginView();
dispo 44、se();
}
}
}
管理员登陆界面截图:
e.普通用户登陆界面
public class PtFram extends Frame implements ActionListener{
private String id;
Button getButton=new Button("现金转出");
Button setButton=new Button("现金转入");
Button changeButton=new Button("个人信息修改");
Button serchButton=new Button("余额查询" 45、);
Button serchjiluButton=new Button("交易记录查询");
Button serchfhButton=new Button("返回");
Box baseBox,box1;
public PtFram(String s,String id)
{
super(s);
this.id=id;
box1=Box.createVerticalBox();
box1.add(Box.createVerticalStrut(10));
box1.add(getButton);
box1.add(Box.create 46、VerticalStrut(10));
box1.add(setButton);
box1.add(Box.createVerticalStrut(10));
box1.add(changeButton);
box1.add(Box.createVerticalStrut(10));
box1.add(serchButton);
box1.add(Box.createVerticalStrut(10));
box1.add(serchjiluButton);
box1.add(Box.createVerticalStrut(10));
bo 47、x1.add(serchfhButton);
baseBox=Box.createHorizontalBox();
baseBox.add(box1);
getButton.addActionListener(this);
setButton.addActionListener(this);
changeButton.addActionListener(this);
serchButton.addActionListener(this);
serchjiluButton.addActionListener(this);
serchfhButton 48、addActionListener(this);
setLayout(new FlowLayout());
add(baseBox);
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
setBounds(240,250,500,300);
setVisible(true);
}
public void actionPerformed(ActionEv 49、ent e)
{
if(e.getSource()==getButton)
{
System.out.println("进入现金转出界面");
new GetFrame(id).setVisible(true);
}
else if(e.getSource()==setButton)
{
System.out.println("进入现金转入界面");
new SetFrame(id).setVisible(true);
50、 }
else if(e.getSource()==changeButton)
{
System.out.println("进入信息修改界面");
//User user=new UserDAOImp().update(id);
new ChangePasswordFrame(id).setVisible(true);
}
else if(e.getSource()==serchButton)
{
System.out.println("进入余额查询界面");






