第二次作业(登陆界面与简易计算机)

发布时间 2023-11-22 12:41:40作者: qwerty81173

一.实验目的

  设计一个包含登录界面的计算器软件,该软件可以实现第一次作业中的全部功能,同时可以保存用户的历史计算记录。

二.项目功能

  1. 简易计算机的建立
  2. 登陆界面
  3. 登录和注册功能的实现
  4. 数据库保存数据

三.使用环境

  1. 使用Microsoft Visio作绘图工具
  2. 使用Java语言与IntelliJ IDEA Community Edition作开发工具
  3. 使用MySQL数据库储存数据
  4. 使用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();
    }
}