作业要求:
- 根据以上登陆界面内容设计一个数据表, 要求用户正确的输入用户名和密码允许用户登陆, 否则输出密码或用户名不正确.
- 根据下面要求编写程序
- 设计一个图形界面
- 在数据库中建立一个表
- 表名为学生
- 表结构为:学号, 姓名, 性别, 年龄, JAVA语言, 数据结构, 数据库, 总分
- 功能要求: 实现对对数据库的增, 删, 改, 查操作
界面展示与功能说明
登录界面:
- 数据库中有三个字段, 分别为递增整数主键id, 表中唯一且可索引的可变长字符串(最长32个字符)字段username与64字节定长字节字段password(用来储存使用SHA-512进行散列的密码).
- 数据库中初始化了用户名为
admin
, 散列前密码也为admin
的管理员账户.
- 当输入的用户名不存在或用户名对应的密码不一致时, 点击确定按钮将弹出一个提示框.
- 点击取消按钮将结束程序.
- 当输入的用户名存在且数据库中的密码散列与输入框中的密码散列后的字节串相同, 点击确定按钮将弹出一个提示框.
- 单击确定后将隐藏登录界面并进入信息管理页面.
信息管理界面:
初始状态:
- 程序UI由左侧的显示面板与右侧的操作面板组成, 单击窗口关闭按钮将退出程序.
- 左侧显示面板实时显示数据库对应表中所有的记录与字段, 并具有滚动条进行翻页.
- 操作面板提供数据的增删改查功能, 并依靠业务逻辑设置按钮的活动与禁用, 以避免数据库的错误操作.
添加记录:
- 在右侧数据编辑面板编辑需要添加字段的信息.
- 学号必须为10位字符, 若不为10位字符, 则禁用添加, 修改与删除按钮.
- 若学号为10位字符且在数据库中具有能够匹配相应记录(学号为唯一字段), 则更新其他输入框中的内容并激活修改与删除按钮并禁用添加按钮, 可以使用该功能通过学号查询对应学生的信息.
- 若学号为10位字符且在数据库中没有能与其匹配的相应记录(学号为唯一字段), 则更新其他输入框中的内容并激活添加按钮并禁用修改与删除按钮.
- 若在添加时成绩具有小数点后第三位或更小的位数, 则会对小数点后第三位进行四舍五入操作.
- 性别下拉选项框可以在其选项中选择, 也可以通过单击选项框直接编辑.
- 若三门课的成绩不在0~100范围内, 则在点击添加按钮 / 点击修改按钮 / 输入完成后单击回车键时弹出一个提示框.
- 该提示框单击确定按钮后程序将不进行任何数据库操作, 直到所有数据都合理规范.
- 若在输入完成后单击回车键时弹出该对话框, 则会清除该输入框中的不合理数据.
- 若三门课成绩的输入框与年龄的输入框中存在非法字符, 则在点击添加按钮 / 点击修改按钮 / 输入完成后单击回车键时弹出一个提示框.
- 若在输入完成后单击回车键时弹出该对话框, 则会清除该输入框中的不合理数据.
修改记录:
- 在三门课程成绩的输入框中输入数据后单击回车键则会对输入框中的字符串进行处理, 若字符串可以解析为一个数字且其数值在0~100范围内, 则会保留两位小数并对小数点后第三位(若有)进行四舍五入操作.
- 总成绩不可编辑, 由系统对三门课程的成绩自动进行求和.
- 左侧信息显示区不能直接编辑, 但是单击对应的记录后该记录的信息将更新到右侧信息编辑区, 在编辑区便可以对数据进行修改, 修改完成后点击修改按钮则将修改后的字段同步更新至数据库, 左侧显示区也会自动刷新.
- 左侧信息显示区中的记录将会按照学号递增的顺序排序.
- 四个操作按钮(刷新/添加/修改/删除)响应后左侧显示区均会进行刷新.
删除记录:
- 只有在数据库中存在对应学号的记录时删除按钮才会激活.
- 删除后编辑区信息不会改变, 若误操作可以单击添加按钮将删除的信息重新添加进数据库.
程序源代码
package assignment.week_12;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.awt.*;
import java.sql.*;
import java.util.*;
import java.security.*;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class StudentManage implements ActionListener
{
private JLabel label_username;
private JLabel label_password;
private JTextField field_username;
private JPasswordField field_password;
private Button button_login;
private Button button_exit;
private JFrame frame_login;
private Connection connection;
private StudentInfoManage student_info_manage;
private static final String username = "admin";
private static final String password = "admin";
private static final String JDriver = "org.sqlite.JDBC";
private static final String conURL = "jdbc:sqlite:assignment\\assignment.db";
public static void main(String arg[])
{
new StudentManage().run();
}
public static void init()
{
try {
Class.forName(JDriver);
} catch (java.lang.ClassNotFoundException e) {
System.out.println("ForName: " + e.getMessage());
}
try {
Connection connection = DriverManager.getConnection(conURL);
Statement statement = connection.createStatement();
String query = "CREATE TABLE USER("
+ "id INTEGER NOT NULL UNIQUE PRIMARY KEY AUTOINCREMENT,"
+ "username VARCHAR(32) NOT NULL UNIQUE,"
+ "password BINARY(64) NOT NULL"
+ ");";
query += "CREATE UNIQUE INDEX index_user ON USER (id, username);";
statement.executeUpdate(query);
statement.close();
PreparedStatement p_statement = connection.prepareStatement("INSERT INTO USER(username, password) values(?, ?);");
p_statement.setString(1, StudentManage.username);
p_statement.setBytes(2, getHashBiteString(StudentManage.password));
p_statement.executeUpdate();
p_statement.close();
connection.close();
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, String.format("异常信息:\n%s\n%s", e.toString(), e.getStackTrace()), "运行时异常", JOptionPane.ERROR_MESSAGE);
}
}
public StudentManage()
{
try {
Class.forName(JDriver);
this.connection = DriverManager.getConnection(conURL);
} catch (java.lang.ClassNotFoundException e) {
JOptionPane.showMessageDialog(null, String.format("异常信息:\n%s\n%s", e.toString(), e.getStackTrace()), "运行时异常", JOptionPane.ERROR_MESSAGE);
System.exit(0);
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, String.format("异常信息:\n%s\n%s", e.toString(), e.getStackTrace()), "运行时异常", JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
}
protected void finalize()
{
try {
this.connection.close();
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, String.format("异常信息:\n%s\n%s", e.toString(), e.getStackTrace()), "运行时异常", JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
}
public void run()
{
this.frame_login = new JFrame("登录");
frame_login.setSize(300, 200);
frame_login.setLocation(500, 300);
frame_login.setBackground(Color.lightGray);
frame_login.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame_login.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.CENTER;
gbc.fill = GridBagConstraints.BOTH;
gbc.insets = new Insets(10, 5, 10, 5);
this.label_username = new JLabel("用户名", JLabel.LEFT);
this.label_password = new JLabel("密码", JLabel.LEFT);
this.field_username = new JTextField(20);
this.field_password = new JPasswordField(20);
this.button_login = new Button("确定");
this.button_exit = new Button("取消");
Container frame_contain = frame_login.getContentPane();
addComponent(label_username, frame_contain, gbc, 0, 0, 1, 1, 1, 1);
addComponent(field_username, frame_contain, gbc, 0, 1, 3, 1, 3, 1);
addComponent(label_password, frame_contain, gbc, 1, 0, 1, 1, 1, 1);
addComponent(field_password, frame_contain, gbc, 1, 1, 3, 1, 3, 1);
addComponent(button_login, frame_contain, gbc, 2, 1, 1, 1, 1, 1);
addComponent(button_exit, frame_contain, gbc, 2, 3, 1, 1, 1, 1);
this.button_login.addActionListener(this);
this.button_exit.addActionListener(this);
frame_login.setVisible(true);
}
private void addComponent(Component c, Container contain, GridBagConstraints gbc, int row, int column, int width, int height, int weightx, int weighty)
{
gbc.gridy = row;
gbc.gridx = column;
gbc.gridwidth = width;
gbc.gridheight = height;
gbc.weightx = weightx;
gbc.weighty = weighty;
gbc.ipadx = 2;
gbc.ipady = 2;
contain.add(c, gbc);
}
private static byte[] getHashBiteString(String str)
{
try {
MessageDigest digest = MessageDigest.getInstance("SHA-512");
return digest.digest(str.getBytes());
} catch (NoSuchAlgorithmException e) {
JOptionPane.showMessageDialog(null, String.format("异常信息:\n%s\n%s", e.toString(), e.getStackTrace()), "运行时异常", JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
return null;
}
public void actionPerformed(ActionEvent event)