一.实验目的
设计一个包含登录界面的计算器软件,该软件可以实现第一次作业中的全部功能,同时可以保存用户的历史计算记录。
二.项目功能
- 简易计算机的建立
- 登陆界面
- 登录和注册功能的实现
- 数据库保存数据
三.使用环境
- 使用Microsoft Visio作绘图工具
- 使用Java语言与IntelliJ IDEA Community Edition作开发工具
- 使用MySQL数据库储存数据
- 使用JDBC链接数据库
四.流程图
1.登录流程图

2.注册流程图

五.功能展示
1.登陆界面

2.登陆成功

3.登录失败

4.注册页面

5.注册成功

6.注册失败

7.数据保存

六.代码展示
1.Admin用户的实体类
package src; /*管理员实体*/ public class Admin { private String id; private String name; private String password; void setID(String id) { this.id=id; } void setName(String name) { this.name=name; } void setPassword(String password) { this.password=password; } String getID() { return this.id; } String getName() { return this.name; } String getPassword() { return this.password; } }
2.Login_Register主程序入口
package src; import ch5.Calulator; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPasswordField; import javax.swing.JTextField; public class Login_Register extends JFrame{ Login_Register() { init(); } //登录界面初始化 public void init() { JFrame frame = new JFrame("登录"); frame.setLayout(null); JLabel nameStr = new JLabel("账号:"); nameStr.setBounds(250, 200, 100, 25); frame.add(nameStr); JLabel passwordStr = new JLabel("密码:"); passwordStr.setBounds(250, 250, 100, 25); frame.add(passwordStr); JTextField userID = new JTextField(); userID.setBounds(300, 200, 200, 25); frame.add(userID); JPasswordField password = new JPasswordField(); password.setBounds(300, 250, 200, 25); frame.add(password); JButton buttonlogin = new JButton("登录"); buttonlogin.setBounds(310, 300, 70, 25); frame.add(buttonlogin); JButton buttonregister = new JButton("注册"); buttonregister.setBounds(410, 300, 70, 25); frame.add(buttonregister); frame.setBounds(400, 100, 800, 640); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); //为登录按钮添加监听器 buttonlogin.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String ID = userID.getText(); String passwd = new String (password.getPassword()); //创建一个Admin用户,把输入框中的用户名密码和提出来 Admin admin = new Admin(); admin.setID(ID); admin.setPassword(passwd); //登录 Login login = new Login(); login.setAdmin(admin); if(login.JudgeAdmin()==0) { //弹出账号或密码错误的窗口 JOptionPane.showMessageDialog(null, "账号或密码错误", "账号或密码错误", JOptionPane.WARNING_MESSAGE); //清除密码框中的信息 password.setText(""); //清除账号框中的信息 userID.setText(""); //System.out.println("登陆失败"); } else { //弹出登录成功的窗口 JOptionPane.showMessageDialog(null, "登陆成功", "登陆成功", JOptionPane.NO_OPTION); //点击确定后会跳转到主窗口 frame.setVisible(false); Calulator Cal = new Calulator(); } } }); //为注册按钮添加监听器 buttonregister.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //注册页面 frame.setVisible(false); AdminRegister ar = new AdminRegister(); } }); } public static void main(String []args) { //主程序 //登录窗口 Login_Register login_register = new Login_Register(); } }
3.Login判断登录状态
package src; /*处理用户登录*/ import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class Login { Admin admin; void setAdmin(Admin admin) { this.admin=admin; } /** * JudgeAdmin()方法 * 判断Admin的用户和密码是否正确,如果正确,显示登录成功 * 如果错误,弹出一个窗口,显示账号或密码错误 */ private String driver = "com.mysql.cj.jdbc.Driver"; private String url = "jdbc:mysql://localhost:3306/Test?serverTimezone=UTC&characterEncoding=utf-8"; private String user = "root"; private String password = "123456"; public boolean login(Admin admin) throws SQLException, ClassNotFoundException { String sql="select * from admin where id=? and password=?"; Class.forName(driver); Connection conn = DriverManager.getConnection(url, user, password); PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, admin.getID()); ps.setString(2, admin.getPassword()); ResultSet rs = ps.executeQuery(); int ans = 0; if(rs.next()) { ans = 1; } rs.close(); ps.close(); conn.close(); if(ans == 1) { return true; } else return false; } int JudgeAdmin() { try { if(login(this.admin)) { System.out.println("登录成功"); return 1; }else { return 0; } }catch(Exception e) { } return 0; } }
4.AdminRegister用户注册界面
package src; /*管理员注册界面*/ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.SQLException; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPasswordField; import javax.swing.JTextField; public class AdminRegister extends JFrame{ AdminRegister () { init(); } void init() { JFrame frame = new JFrame("注册管理员账号"); frame.setLayout(null); JLabel nameStr = new JLabel("用户名:"); nameStr.setBounds(250, 150, 100, 25); frame.add(nameStr); JLabel IDStr = new JLabel("账号:"); IDStr.setBounds(250, 200, 100, 25); frame.add(IDStr); JLabel passwordStr = new JLabel("密码:"); passwordStr.setBounds(250, 250, 100, 25); frame.add(passwordStr); JLabel confrimStr = new JLabel("确认密码:"); confrimStr.setBounds(250, 300, 100, 30); frame.add(confrimStr); JTextField userName = new JTextField(); userName.setBounds(320, 150, 150, 25); frame.add(userName); JTextField userID = new JTextField(); userID.setBounds(320, 200, 150, 25); frame.add(userID); JPasswordField password = new JPasswordField(); password.setBounds(320, 250, 150, 25); frame.add(password); JPasswordField confrimPassword = new JPasswordField(); confrimPassword.setBounds(320, 300, 150, 25); frame.add(confrimPassword); JButton buttonregister = new JButton("注册"); buttonregister.setBounds(350, 350, 70, 25); frame.add(buttonregister); frame.setBounds(400, 100, 800, 640); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); //为注册按钮增加监听器 buttonregister.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String name = userName.getText(); String ID = userID.getText(); String passwd = new String (password.getPassword()); String confrimpasswd = new String (confrimPassword.getPassword()); //创建Register类 Register register = new Register(); register.setID(ID); register.setName(name); register.setPassword(passwd); register.setconfirmpasswd(confrimpasswd); //如果注册成功,返回登录界面 try { if(register.JudgeRegister()) { frame.setVisible(false); Login_Register login_register = new Login_Register(); } } catch (SQLException e1) { } catch (ClassNotFoundException e1) { e1.printStackTrace(); } } }); } }
5.Register判断添加新用户状态
package src;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.swing.JOptionPane;
public class Register {
String name;
String ID;
String password;
String confirmpassword;
private String driver = "com.mysql.cj.jdbc.Driver";
private String url = "jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=utf-8";
private String user = "root";
private String sqlpassword = "123456";
void setName(String name) {
this.name = name;
}
void setID(String ID) {
this.ID = ID;
}
void setPassword(String password) {
this.password = password;
}
void setconfirmpasswd(String confirmpassword) {
this.confirmpassword = confirmpassword;
}
//判断注册的账号是否符合规则
boolean JudgeRegister() throws SQLException, ClassNotFoundException {
if(this.name.equals("")) {
JOptionPane.showMessageDialog(null, "用户名不能为空!", "用户名", JOptionPane.ERROR_MESSAGE);
return false;
}
if(this.ID.equals("")) {
JOptionPane.showMessageDialog(null, "账号不能为空!", "账号为空", JOptionPane.ERROR_MESSAGE);
return false;
}
if(this.password.equals("")) {
JOptionPane.showMessageDialog(null, "密码不能为空!", "密码为空", JOptionPane.ERROR_MESSAGE);
return false;
}
if(!this.password.equals(this.confirmpassword)) {
JOptionPane.showMessageDialog(null, "两次输入的密码不一致!", "密码不一致", JOptionPane.ERROR_MESSAGE);
return false;
}
//符合规则,弹出注册成功的窗口,并将账号添加数据库
JOptionPane.showMessageDialog(null, "注册成功");
addAdmin();
return true;
}
//向数据库添加Admin账户
void addAdmin() throws ClassNotFoundException, SQLException {
String sql="insert into admin (id, name, password) values (?,?,?)";
Class.forName(driver);
try {
Connection conn = DriverManager.getConnection(url, user, sqlpassword);
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, this.ID);
ps.setString(2, this.name);
ps.setString(3, this.password);
ps.executeUpdate();
ps.close();
conn.close();
}catch(SQLException ex) {
System.out.println("添加用户失败!");
}
}
}
6.Record计算记录与结果存入
package src; import javax.swing.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class Record { String ID; private String driver = "com.mysql.cj.jdbc.Driver"; private String url = "jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=utf-8"; private String user = "root"; private String sqlpassword = "123456"; void setID(String ID) { this.ID = ID; } boolean dong() throws SQLException, ClassNotFoundException { JOptionPane.showMessageDialog(null, "记录成功"); record(); return true; } void record() throws ClassNotFoundException, SQLException { String sql = "insert into calculator (id, record, result) values (?,?,?)"; Class.forName(driver); try { Connection conn = DriverManager.getConnection(url, user, sqlpassword); PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, this.ID); /* ps.setString(2, this.record); ps.setString(3, this.result);*/ ps.executeUpdate(); ps.close(); conn.close(); } catch (SQLException ex) { System.out.println("添加信息失败!"); } } }
7.calculator计算器
package src; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Objects; import javax.swing.*; public class Calulator extends JFrame implements ActionListener { private final String[] KEYS = { "7", "8", "9", "AC", "4", "5", "6", "-", "1", "2", "3", "+", "0", ".", "√", "%","*", "(", ")", "/", "=" }; private String Result; // 构造方法 public Calulator() { super("Caculator"); resultText.setBounds(20, 18, 255, 115); resultText.setAlignmentX(RIGHT_ALIGNMENT); resultText.setEditable(false); History.setBounds(290, 40, 250,370); History.setAlignmentX(LEFT_ALIGNMENT); History.setEditable(false); label.setBounds(300, 15, 100, 20); jp2.setBounds(290,40,250,370); jp2.setLayout(new GridLayout()); JPanel jp1 = new JPanel(); jp1.setBounds(20,18,255,115);//设置面板窗口位置及大小 jp1.setLayout(new GridLayout()); resultText.setLineWrap(true);// resultText.setWrapStyleWord(true); resultText.setSelectedTextColor(Color.RED); History.setLineWrap(true);//自动换行 History.setWrapStyleWord(true); History.setSelectedTextColor(Color.blue); gdt2.setViewportView(History); this.add(jp1);//将面板添加到总窗体中 this.add(jp2);//将面板添加到总窗体中 this.setLayout(null); // 放置按钮 int x = 20, y = 150; for (int i = 0; i < KEYS.length; i++) { keys[i] = new JButton(); keys[i].setText(KEYS[i]); keys[i].setBounds(x, y, 60, 40); if (x < 215) { x += 65; } else { x = 20; y += 45; } this.add(keys[i]); } for (int i = 0; i < KEYS.length; i++)// 每个按钮都注册事件监听器 { keys[i].addActionListener(this); } this.setResizable(false); this.setBounds(500, 200, 567, 480); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setVisible(true); } private String[] houzhui(String str) { String s = ""; char[] opStack = new char[100]; String[] postQueue = new String[100]; int top = -1, j = 0; for (int i = 0; i < str.length(); i++) { if ("0123456789.".indexOf(str.charAt(i)) >= 0) { s = ""; for (; i < str.length() && "0123456789.".indexOf(str.charAt(i)) >= 0; i++) { s = s + str.charAt(i); } i--; postQueue[j] = s; j++; } else if ("(".indexOf(str.charAt(i)) >= 0) { top++; opStack[top] = str.charAt(i); } else if (")".indexOf(str.charAt(i)) >= 0) { for (;;) { if (opStack[top] != '(') { postQueue[j] = opStack[top] + ""; j++; top--; } else { top--; break; } } } else if ("*%/+-".indexOf(str.charAt(i)) >= 0) { if (top == -1) { top++; opStack[top] = str.charAt(i); } else if ("*%/".indexOf(opStack[top]) >= 0) { postQueue[j] = opStack[top] + ""; j++; opStack[top] = str.charAt(i); } else { top++; opStack[top] = str.charAt(i); } } } while (top != -1) { postQueue[j] = opStack[top] + ""; j++; top--; } return postQueue; } public String kfys(String str) { String result = ""; double a = Double.parseDouble(str), b = 0; b = Math.sqrt(a); result = String.valueOf(b); return result; } public String Result(String[] str) { String[] Result = new String[100]; int Top = -1;// 静态指针Top for (int i = 0; str[i] != null; i++) { if ("+-*%/".indexOf(str[i]) < 0) { Top++; Result[Top] = str[i]; } if ("+-*%/".indexOf(str[i]) >= 0) { double x, y, n; x = Double.parseDouble(Result[Top]); Top--; y = Double.parseDouble(Result[Top]); Top--; if ("*".indexOf(str[i]) >= 0) { n = y * x; Top++; Result[Top] = String.valueOf(n); } if ("/".indexOf(str[i]) >= 0) { if (x == 0) { String s = "error!"; return s; } else { n = y / x; Top++; Result[Top] = String.valueOf(n); } } if ("%".indexOf(str[i]) >= 0) { if (x == 0) { String s = "error!"; return s; } else { n = y % x; Top++; Result[Top] = String.valueOf(n); } } if ("-".indexOf(str[i]) >= 0) { n = y - x; Top++; Result[Top] = String.valueOf(n); } if ("+".indexOf(str[i]) >= 0) { n = y + x; Top++; Result[Top] = String.valueOf(n); } } } return Result[Top]; } String record; String result; public void setCaled(String record) { this.record = record; } public void setAns(String result) { this.result = result ; } public String getrecord() { return record; } public String getresult() { return result; } // 主函数 public static void main(String[] args) { Calulator a = new Calulator(); } }