功能要求:
1) 在磁盤上創建一個Mysql數據庫,名稱自定,在該數據庫下建立一個數據表,名稱為userTable,表結構如圖12-4所示,表中的數據不要錄入(用注冊窗口添加)。
2) 用戶在登錄窗口點擊注冊進入注冊界面,在注冊窗口中輸入賬號、姓名、性別、出生日期、email和密碼(要驗證兩次密碼一致性)等信息后,單擊“注冊”按鈕后完成用戶注冊功能。並且將數據添加到數據庫中。
3) 注冊帳號過程中,輸入完賬號后,回車,進行賬號字符有效性驗證,如果正確,將焦點自動切換到姓名文本框(不用鼠標切換);否則,彈出對話框,提示錯誤,並將焦點保持在賬號文本框;用同樣方法實現Email地址合法性驗證;在確認密碼輸入結束后,按回車,完成注冊功能(即等同於點擊注冊按鈕)
4) 用戶在登錄窗口中輸入用戶和口令,單擊“登錄”按鈕后,如果用戶和口令與數據表文件中某一行匹配,則彈出對話框(對話框的文字提示信息是“登錄成功!”),並進入“更改密碼”窗口,否則彈出對話框(對話框的文字提示信息是“用戶或口令不正確!”)
5) 在“更改密碼”窗口中輸入相應信息后,單擊“確定”,完成更改密碼功能。可以打開數據庫驗證是否成功!
6) 建議設計三個窗口類(登錄、注冊和更改密碼)、一個用戶類(至少包括以下方法:數據庫連接方法、添加數據方法、登錄驗證方法、更改密碼方法以及用於數據合法性檢測的方法)。
package mytest; public class Login { boolean success = false; String id; String password; public void setID(String string) { this.id = string; } public void setPassword(String password) { this.password = password; } public String getID() { return id; } public String getPassword() { return password; } public void setSuccess(boolean success) { this.success = success; } public boolean getSuccess() { return success; } } package mytest; public class Change { boolean success = false; String id; String password; public void setID(String string) { this.id = string; } public void setPassword(String password) { this.password = password; } public String getID() { return id; } public String getPassword() { return password; } public void setSuccess(boolean success) { this.success = success; } public boolean getSuccess() { return success; } } package mytest; public class Register { String id; String password; String email; String sex; String name; String birth; public void setID(String string) { this.id = string; } public void setPassword(String password) { this.password = password; } public void setSex(String sex) { this.sex = sex; } public void setEmail(String email) { this.email = email; } public void setBirth(String birth) { this.birth = birth; } public void setName(String name) { this.name = name; } public String getName() { return name; } public String getID() { return id; } public String getPassword() { return password; } public String getSex() { return sex; } public String getEmail() { return email; } public String getBirth() { return birth; } } package mytest; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import mytest.*; import mytest.Login; import mytest.Register; public class RegAndLog extends JFrame { RLview rl; RegAndLog(){ setBounds(100,100,800,260); rl = new RLview(); add(rl); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setVisible(true); } public static void main(String args[]) { RegAndLog window = new RegAndLog(); window.setTitle("登錄"); } } package mytest; import java.awt.*; import javax.swing.*; import mytest.Register; import java.awt.event.*; public class RegisterView extends JPanel implements ActionListener, ItemListener{ Register register; JTextField id,name,email,password1,password2; JComboBox sex,year,month,day; int[] DAY={31,28,31,30,31,30,31,31,30,31,30,31}; JButton reg,esc; RegisterView(){ register = new Register(); id = new JTextField(15); name =new JTextField(15); email =new JTextField(15); password1 = new JTextField(15); password2 =new JTextField(15); reg = new JButton("注冊"); esc = new JButton("退出"); add(new JLabel("賬號:")); add(id); add(new JLabel("姓名:")); add(name); add(new JLabel("性別")); sex = new JComboBox(); sex.addItem("male"); sex.addItem("female"); add(sex); year=new JComboBox(); month=new JComboBox(); day=new JComboBox(); add(new JLabel("出生日期")); for(int i=1910;i<2021;i++) { year.addItem(i); } add(year); add(new JLabel("年")); for(int i=1;i<13;i++) { month.addItem(i); month.addItemListener(this); } add(month); add(new JLabel("月")); add(day); add(new JLabel("日")); // add(new JLabel("Email")); add(new JLabel(“email:")); add(email); add(new JLabel("密碼:")); add(password1); add(new JLabel("確認密碼")); add(password2); add(reg); add(esc); reg.addActionListener(this); esc.addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if(e.getSource()==esc) { System.exit(0); } if(e.getSource()==reg) { register.setID(id.getText()); register.setName(name.getText()); register.setEmail(email.getText()); register.setSex(sex.getSelectedItem().toString()); String born = year.getSelectedItem().toString()+"-"+ month.getSelectedItem().toString() +"-"+day.getSelectedItem().toString(); register.setBirth(born); if(password1.getText().equals(password2.getText())) { register.setPassword(password1.getText()); } else { JOptionPane.showMessageDialog(null,"密碼前后不一致","警告",JOptionPane.WARNING_MESSAGE); } HandleReg hr = new HandleReg(); hr.writeReg(register); } } public void itemStateChanged(ItemEvent e) { if (e.getSource() == month) { String year = this.year.getSelectedItem().toString();//獲取選中 //已知年份 String mon = this.month.getSelectedItem().toString();//獲取月份 int y = Integer.valueOf(year); int m = Integer.valueOf(mon);//轉換為int if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) { DAY[1] = 29; } else { DAY[1] = 28;//判斷閏年 } day.removeAllItems();//清空選項列表、 for (int i = 0; i < DAY[m - 1]; i++) { day.addItem(i + 1); } } } } package mytest; import java.awt.*; import javax.swing.*; import mytest.*; import mytest.Login; import java.awt.event.*; public class LoginView extends JPanel implements ActionListener{ Login login; JTextField id; JPasswordField pass; JButton log,esc; boolean success; LoginView(){ login = new Login(); id = new JTextField(15); pass = new JPasswordField(15); log = new JButton("登錄"); esc = new JButton("退出"); add(new JLabel("賬號")); add(id); add(new JLabel("密碼")); add(pass); add(log); add(esc); log.addActionListener(this); esc.addActionListener(this); } public boolean isSuccess() { return success; } @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==esc) { System.exit(0); } if(e.getSource()==log) { login.setID(id.getText()); char [] pw = pass.getPassword(); login.setPassword(new String (pw)); HandleLog hl = new HandleLog(); login = hl.queryVerify(login); success = login.getSuccess(); } } } package mytest; import java.sql.*; import javax.swing.JOptionPane; import mytest.Register; public class HandleReg { Connection con; PreparedStatement preSql; public HandleReg() { try { Class.forName("com.mysql.jdbc.Driver"); } catch(Exception e){} String uri = "jdbc:mysql://localhost:3306/test?useSSL=true&characterEncoding=utf-8"; try { // 表名↑ 密碼↓ con = DriverManager.getConnection(uri,"root","z123"); } catch (SQLException e) {System.out.println(e.toString());} } public void writeReg(Register register) {//更新 String sqlStr = "insert into mess values(?,?,?,?,?,?)"; int ok = 0; try { preSql = con.prepareStatement(sqlStr);//鏈接 preSql.setString(1,register.getID());//更新數據 preSql.setString(2, register.getName()); preSql.setString(3, register.getSex()); preSql.setString(4, register.getBirth()); preSql.setString(5, register.getEmail()); preSql.setString(6, register.getPassword()); ok = preSql.executeUpdate(); con.close(); } catch (NullPointerException e){ System.out.println(e.toString()); } catch(SQLException e) { System.out.println(e.toString()); JOptionPane.showMessageDialog(null,"id不能重復","警告",JOptionPane.WARNING_MESSAGE);//提示 } if(ok!=0) { JOptionPane.showMessageDialog(null,"注冊成功","恭喜",JOptionPane.WARNING_MESSAGE); } } } package mytest; import java.sql.*; import javax.swing.JOptionPane; import mytest.Login; public class HandleLog { Connection con;//鏈接 PreparedStatement pre;//驅動 ResultSet rs; public HandleLog() { try { Class.forName("com.mysql.jdbc.Driver"); } catch(Exception e){} String uri = "jdbc:mysql://localhost:3306/test?useSSL=true&characterEncoding=utf-8"; try { // ku名 密碼↓ con = DriverManager.getConnection(uri,"root","zyk123"); } catch(Exception e){System.out.println(e.toString());} } public Login queryVerify(Login logins) { String id = logins.getID(); String pw = logins.getPassword(); String sqlStr = "select userID,password from mess where userID = ? and password = ?";//注意語法 try { pre = con.prepareStatement(sqlStr); pre.setString(1,id); pre.setString(2, pw); rs = pre.executeQuery(); if(rs.next()==true) { logins.setSuccess(true); JOptionPane.showMessageDialog(null,"登錄成功","恭喜",JOptionPane.WARNING_MESSAGE); } else { logins.setSuccess(false); JOptionPane.showMessageDialog(null,"登錄失敗","抱歉",JOptionPane.WARNING_MESSAGE); } } catch(Exception e){ System.out.println(e.toString()); } return logins; } } package mytest; import java.sql.*; import javax.swing.JOptionPane; import mytest.Login; public class HandleChange { Connection con; PreparedStatement sql; ResultSet rs; public HandleChange() { try { Class.forName("com.mysql.jdbc.Driver"); } catch(Exception e){} String uri = "jdbc:mysql://localhost:3306/test?useSSL=true&characterEncoding=utf-8"; try { // 數據庫名 密碼↓ con = DriverManager.getConnection(uri,"root","z123"); } catch(Exception e){ System.out.println(e.toString()); } if(con==null) return; } public Change query(Change ch) { String id = ch.getID(); String pw = ch.getPassword(); String sqlStr = "update mess set password=? where userID =?"; try { sql = con.prepareStatement(sqlStr); sql.setString(1,ch.getPassword()); sql.setString(2,ch.getID()); int ok = sql.executeUpdate();//括號里面不能再寫sqlStr ch.setSuccess(true); System.out.println(ok); } catch(Exception e){ System.out.println(e.toString()); } return ch; } } package mytest; import java.awt.BorderLayout; import javax.swing.JPanel; import javax.swing.JTabbedPane; import java.awt.*; public class RLview extends JPanel{ JTabbedPane p; RegisterView reg; LoginView log; ChangePass pa; public RLview() { reg = new RegisterView(); log = new LoginView(); pa = new ChangePass(); setLayout(new BorderLayout()); p =new JTabbedPane(); p.add("注冊",reg); p.add("登錄",log); p.add("修改密碼",pa); p.invalidate(); add(p,BorderLayout.CENTER); } } package mytest; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import mytest.*; import mytest.Login; import mytest.Register; public class RegAndLog extends JFrame { RLview rl; RegAndLog(){ setBounds(100,100,800,260); rl = new RLview(); add(rl); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setVisible(true); } public static void main(String args[]) { RegAndLog window = new RegAndLog(); window.setTitle("登錄"); } }