登录模块在实际项目开发中很常见,利用单一职责原则重构后的类图实现这一模块。
一、单一职责原则
二、类图
三、版本
(一)C++版
① 效果:
② 代码:
login.cpp
1 #include<iostream> 2 using namespace std; 3 4 class LoginForm 5 { 6 public: 7 void init() { 8 cout << "初始化成功!" << endl; 9 } 10 void display() { 11 cout << "显示界面成功!" << endl; 12 } 13 void validate() { 14 cout << "方法调用成功!" << endl; 15 } 16 }; 17 18 class UserDao 19 { 20 public: 21 void findUser(int userName, int userPassword) { 22 int name = 1; 23 int password = 1; 24 if (userName == name && userPassword == password) { 25 cout << "用户名及密码正确,登录成功!" << endl; 26 } 27 else { 28 cout << "用户名或密码错误,请重新输入!!" << endl; 29 } 30 } 31 }; 32 33 class DBUtil 34 { 35 public: 36 void getConnection() { 37 cout << "连接成功!!!" << endl; 38 } 39 }; 40 41 int main() { 42 LoginForm login; 43 UserDao userdao; 44 DBUtil db; 45 db.getConnection(); 46 login.init(); 47 login.display(); 48 int m, n; 49 cout << "请输入学号:"; 50 cin >> m; 51 cout << "请输入密码:"; 52 cin >> n; 53 userdao.findUser(m,n); 54 login.validate(); 55 56 }
(二)JAVA版
① 效果:
② 目录结构:
③ 数据库建表语句:
1 SET FOREIGN_KEY_CHECKS=0; 2 3 -- ---------------------------- 4 -- Table structure for `login` 5 -- ---------------------------- 6 DROP TABLE IF EXISTS `login`; 7 CREATE TABLE `login` ( 8 `id` int(11) NOT NULL AUTO_INCREMENT, 9 `userName` varchar(255) NOT NULL, 10 `userPassword` varchar(255) NOT NULL, 11 PRIMARY KEY (`id`) 12 ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 13 14 -- ---------------------------- 15 -- Records of login 16 -- ---------------------------- 17 INSERT INTO `login` VALUES ('1', 'admin', '123456');
④ 代码:
MainClass.java
1 package login; 2 3 public class MainClass {//负责启动系统 4 public static void main(String[] args) { 5 //在主函数中,实例化Login类的对象,调用初始化界面的方法 6 LoginForm login = new LoginForm(); 7 login.init(); 8 } 9 }
DBUtil.java
1 package login; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.PreparedStatement; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8 9 public class DBUtil { 10 11 public static final String url="jdbc:mysql://localhost:3306/login";//URL 12 public static final String user="root";//用户名 13 public static final String password="123";//密码 14 15 /** 16 * 连接数据库 17 * @return 18 */ 19 public static Connection getConnection(){ 20 Connection conn=null; 21 try { 22 Class.forName("com.mysql.jdbc.Driver");//加载数据库驱动 23 conn=DriverManager.getConnection(url, user, password); 24 System.out.println("数据库连接成功!"); 25 }catch(Exception e) { 26 e.printStackTrace(); 27 } 28 return conn; 29 } 30 31 /** 32 * 关闭数据库 33 */ 34 public static void close(Connection conn,PreparedStatement pstm) { 35 36 System.out.println("关闭SQL(conn,pstm)"); 37 if(pstm!=null) { 38 try { 39 pstm.close(); 40 }catch(SQLException e) { 41 e.printStackTrace(); 42 } 43 } 44 45 if(conn!=null) { 46 try { 47 conn.close(); 48 }catch(SQLException e) { 49 e.printStackTrace(); 50 } 51 } 52 53 } 54 55 public static void close(Connection conn,PreparedStatement pstm,ResultSet rs) { 56 57 System.out.println("关闭SQL(conn,pstm,rs)"); 58 if(pstm!=null) { 59 try { 60 pstm.close(); 61 }catch(SQLException e) { 62 e.printStackTrace(); 63 } 64 } 65 66 if(conn!=null) { 67 try { 68 conn.close(); 69 }catch(SQLException e) { 70 e.printStackTrace(); 71 } 72 } 73 74 if(rs!=null) { 75 try { 76 rs.close(); 77 }catch(SQLException e) { 78 e.printStackTrace(); 79 } 80 } 81 82 } 83 84 // public static void main(String[] args) { 85 // getConnection(); 86 // } 87 }
LoginForm.java
1 package login; 2 3 import java.awt.BorderLayout; 4 import java.awt.Dimension; 5 import java.awt.FlowLayout; 6 import java.awt.Font; 7 import java.awt.event.ActionEvent; 8 import java.awt.event.ActionListener; 9 10 import javax.swing.JButton; 11 import javax.swing.JFrame; 12 import javax.swing.JLabel; 13 import javax.swing.JPanel; 14 import javax.swing.JPasswordField; 15 import javax.swing.JTextField; 16 17 @SuppressWarnings("serial") 18 public class LoginForm extends JFrame implements ActionListener {// 负责页面显示 19 20 JTextField text_name = new JTextField(); 21 JPasswordField text_password = new JPasswordField(); 22 private boolean login=false; 23 24 public void init() {// 用于初始化按钮、文本框等界面控件 25 // 在init中实例化JFrame类的对象 26 JFrame frame = new JFrame(); 27 // 设置窗体对象的属性值 28 frame.setTitle("登录");// 设置窗体标题 29 frame.setSize(400, 250);// 设置窗体大小,只对顶层容器生效 30 frame.setDefaultCloseOperation(3);// 设置窗体关闭操作,3表示关闭窗体退出程序 31 frame.setLocationRelativeTo(null);// 设置窗体相对于另一组间的居中位置,参数null表示窗体相对于屏幕的中央位置 32 frame.setResizable(false);// 禁止调整窗体大小 33 frame.setFont(new Font("宋体", Font.PLAIN, 14));// 设置字体,显示格式正常,大小 34 35 // 实例化FlowLayout流式布局类的对象,指定对齐方式为居中对齐组件之间的间隔为10个像素 36 FlowLayout fl = new FlowLayout(FlowLayout.CENTER, 10, 10); 37 // 实例化流式布局类的对象 38 frame.setLayout(fl); 39 40 // 实例化JLabel标签对象,该对象显示“账号” 41 JLabel labname = new JLabel("Name:"); 42 labname.setFont(new Font("宋体", Font.PLAIN, 14)); 43 // 将labname标签添加到窗体上 44 frame.add(labname); 45 46 // 实例化JTextField标签对象化 47 Dimension dim1 = new Dimension(300, 30); 48 text_name.setPreferredSize(dim1);// 设置除顶级容器组件以外其他组件的大小 49 // 将textName标签添加到窗体上 50 frame.add(text_name); 51 52 // 实例化JLabel标签对象,该对象显示“密码” 53 JLabel labpass = new JLabel("Password:"); 54 labpass.setFont(new Font("宋体", Font.PLAIN, 14)); 55 // 将labpass添加到窗体上 56 frame.add(labpass); 57 58 // 设置大小 59 text_password.setPreferredSize(dim1); 60 // 添加到窗体 61 frame.add(text_password); 62 63 // 实例化JButton组件 64 JButton button1 = new JButton(); 65 // 设置按键的显示内容 66 Dimension dim2 = new Dimension(100, 30); 67 button1.setText("登录"); 68 button1.setFont(new Font("宋体", Font.PLAIN, 14)); 69 // 设置按键大小 70 button1.setSize(dim2); 71 72 button1.addActionListener(new ActionListener() {// 给按钮添加事件接收器 73 @Override 74 public void actionPerformed(ActionEvent e) {// 接受到事件后,进行下面的处理 75 validate(); 76 } 77 }); 78 79 frame.add(button1); 80 frame.setVisible(true);// 窗体可见,一定要放在所有组件加入窗体后 81 } 82 83 public void display() {// 用于向界面容器中增加页面控件并显示窗口 84 int i = 3;// 3次登录机会 85 Dimension dim3 = new Dimension(300, 30); 86 87 // 生成新界面 88 javax.swing.JFrame login2 = new javax.swing.JFrame(); 89 login2.setSize(400, 200); 90 login2.setDefaultCloseOperation(3); 91 login2.setLocationRelativeTo(null); 92 login2.setFont(new Font("宋体", Font.PLAIN, 14)); // 宋体,正常风格,14号字体 93 // 创建组件 94 javax.swing.JPanel jp1 = new JPanel(); 95 javax.swing.JPanel jp2 = new JPanel(); 96 97 if(login==true) { 98 JLabel message = new JLabel("登陆成功!"); 99 message.setFont(new Font("宋体", Font.PLAIN, 14)); // 宋体,正常风格,14号字体 100 message.setPreferredSize(dim3); 101 jp1.add(message); 102 login2.add(jp1, BorderLayout.CENTER); 103 104 login2.setResizable(false); 105 login2.setVisible(true); 106 }else { 107 if (i >= 2) { 108 JLabel message = new JLabel("账号或密码错误,您今天还有" + (i - 1) + "次机会"); 109 message.setFont(new Font("宋体", Font.PLAIN, 14)); // 宋体,正常风格,14号字体 110 message.setPreferredSize(dim3); 111 // 将textName标签添加到窗体上 112 jp1.add(message); 113 login2.add(jp1, BorderLayout.CENTER); 114 115 JButton close = new JButton("确定"); 116 close.setFont(new Font("宋体", Font.PLAIN, 14)); 117 // 设置按键大小 118 close.setSize(dim3); 119 jp2.add(close); 120 login2.add(jp2, BorderLayout.SOUTH); 121 122 i--;// 次数减少 123 close.addActionListener(new ActionListener() { 124 public void actionPerformed(ActionEvent e) { 125 login2.dispose(); 126 } 127 }); 128 129 login2.setResizable(false); 130 login2.setVisible(true); 131 } 132 else if (i == 1) { 133 JLabel message = new JLabel("账号已锁定,请明天再试"); 134 message.setFont(new Font("宋体", Font.PLAIN, 14)); // 宋体,正常风格,14号字体 135 message.setPreferredSize(dim3); 136 // 将textName标签添加到窗体上 137 jp1.add(message); 138 login2.add(jp1, BorderLayout.CENTER); 139 140 JButton close = new JButton("确定"); 141 close.setFont(new Font("宋体", Font.PLAIN, 14)); 142 // 设置按键大小 143 close.setSize(dim3); 144 jp2.add(close); 145 login2.add(jp2, BorderLayout.SOUTH); 146 147 close.addActionListener(new ActionListener() { 148 public void actionPerformed(ActionEvent e) { 149 login2.dispose(); 150 } 151 }); 152 153 login2.setResizable(false); 154 login2.setVisible(true); 155 } 156 } 157 158 } 159 160 public void validate() {// 供登录按钮的事件处理方法调用,用于调用与数据库相关的方法完成登录处理,如果登录成功则进入主页面,否则提示错误信息 161 if (UserDAO.findUser(text_name, text_password)) { 162 System.out.println("登录成功"); 163 login=true; 164 display(); 165 } else { 166 System.out.println("登录失败"); 167 login=false; 168 display(); 169 } 170 } 171 172 @Override 173 public void actionPerformed(ActionEvent e) { 174 // TODO Auto-generated method stub 175 176 } 177 178 }
UserDAO.java
1 package login; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 7 public class UserDAO {//负责用户表的增删改查操作,它封装了对用户表的全部操作代码,登录本质上是一个查询用户表的操作 8 //登录的查询操作 9 @SuppressWarnings("deprecation") 10 public static boolean findUser(javax.swing.JTextField userName, 11 javax.swing.JPasswordField userPassword) {//用于根据用户名和密码查询数据库中是否存在该用户,如果存在则返回true,否则返回false,该方法需要调用getConnection()方法连接数据库,并供validate()方法调用 12 Connection conn=null; 13 PreparedStatement pstm=null; 14 ResultSet rs=null; 15 try { 16 conn=DBUtil.getConnection(); 17 String sql="select * from login where userName=? and userPassword=?"; 18 System.out.println(sql); 19 pstm=conn.prepareStatement(sql); 20 pstm.setString(1, userName.getText()); 21 pstm.setString(2, userPassword.getText()); 22 rs=pstm.executeQuery(); 23 while(rs.next()) { 24 System.out.println("userName:"+rs.getString("userName")+",userPassword:"+rs.getString("userPassword")); 25 return true; 26 } 27 }catch(Exception e) { 28 e.printStackTrace(); 29 }finally { 30 //SQL执行完成后释放相关资源 31 DBUtil.close(conn,pstm,rs); 32 } 33 return false; 34 } 35 //以下功能均暂未开放 36 // //增加用户操作 37 // public boolean addUser(String userName,String userPassword) { 38 // Connection conn=null; 39 // PreparedStatement pstm=null; 40 // boolean judge=false; 41 // try { 42 // conn=DBUtil.getConnection(); 43 // String sql="insert into login(userName,userPassword) values(?,?)"; 44 // pstm=conn.prepareStatement(sql); 45 // pstm.setString(1, userName); 46 // pstm.setString(2, userPassword); 47 // //执行插入操作 48 // int num=pstm.executeUpdate(); 49 // if(num>0) { 50 // System.out.println("插入成功"); 51 // judge=true; 52 // }else { 53 // System.out.println("插入失败"); 54 // judge=false; 55 // } 56 // }catch(Exception e) { 57 // e.printStackTrace(); 58 // }finally { 59 // //SQL执行完成后释放相关资源 60 // DBUtil.close(conn,pstm); 61 // } 62 // return judge; 63 // } 64 // //删除用户操作 65 // public boolean deleteUser(String userName) { 66 // Connection conn=null; 67 // PreparedStatement pstm=null; 68 // ResultSet rs=null; 69 // boolean judge=false; 70 // try { 71 // conn=DBUtil.getConnection(); 72 // String sql="delete from login where userName=?"; 73 // pstm=conn.prepareStatement(sql); 74 // pstm.setString(1, userName); 75 // int num=pstm.executeUpdate(); 76 // if(num>0) { 77 // System.out.println("删除成功"); 78 // judge=true; 79 // }else { 80 // System.out.println("删除失败"); 81 // judge=false; 82 // } 83 // }catch(Exception e) { 84 // e.printStackTrace(); 85 // }finally { 86 // //SQL执行完成后释放相关资源 87 // DBUtil.close(conn,pstm,rs); 88 // } 89 // return judge; 90 // } 91 // //修改用户操作 92 // public boolean alterUser(String userName){ 93 // Connection conn=null; 94 // ResultSet rs=null; 95 // PreparedStatement pstm=null; 96 // try { 97 // conn=DBUtil.getConnection(); 98 // String sql="select * from login where userName=?"; 99 // pstm=conn.prepareStatement(sql); 100 // pstm.setString(1,userName); 101 // rs=pstm.executeQuery(); 102 // while(rs.next()) { 103 // System.out.println("userName:"+rs.getString("name")+",userPassword:"+rs.getString("password")); 104 // return true; 105 // } 106 // }catch(Exception e) { 107 // e.printStackTrace(); 108 // }finally { 109 // DBUtil.close(conn,pstm,rs); 110 // } 111 // return false; 112 // } 113 // //修改——更新用户操作 114 // public boolean updateUser(String userName,String userPassword,String judgeName) { 115 // Connection conn=null; 116 // PreparedStatement pstm=null; 117 // boolean judge=false; 118 // try { 119 // conn=DBUtil.getConnection(); 120 // String sql="update login set userName=?,userPassword=? where userName=?"; 121 // pstm=conn.prepareStatement(sql); 122 // pstm.setString(1, userName); 123 // pstm.setString(2, userPassword); 124 // pstm.setString(3, judgeName); 125 // //执行插入操作 126 // int num=pstm.executeUpdate(); 127 // if(num>0) { 128 // System.out.println("修改成功"); 129 // judge=true; 130 // }else { 131 // System.out.println("修改失败"); 132 // judge=false; 133 // } 134 // }catch(Exception e) { 135 // e.printStackTrace(); 136 // }finally { 137 // //SQL执行完成后释放相关资源 138 // DBUtil.close(conn,pstm); 139 // } 140 // return judge; 141 // } 142 }