文章目录
- 1. 实现功能概要
- 2. 功能界面概览
- 3. 代码详解
- (1)选择身份登录方法实现
- (2)登录按钮的响应
- 4. 全部代码示例
- 5. 包的存放位置
1. 实现功能概要
这里是第三部分,我们的登录界面,与数据库信息进行核对,在看下面内容之前,我们具体要实现以下登录界面功能:
- 登录界面需要连接数据库账户信息并进行核对。
- 用户出现用户名或者密码错误要进行相应的警告框提示。
- 根据不同的用户等级,进入不同的界面。
针对 第三个功能:
例如,用户身份是老板界面,那就进入老板管理界面,如果是普通员工,那就进入普通员工的界面。
我们把超级管理员,销售员,仓库管理员,销售员这四个身份分别建立单独的表。然后检索JComboBox组件的Item名,来进入不同的数据库,核对账户密码。
2. 功能界面概览
现展示JComboBox控件。
用户进入登录界面以后,先选择用户属性,然后输入用户名和密码后,进入相应管理界面。
不好意思各位,忘记改了,上面的“注册“按钮实际实现的是退出功能。
后面的登录界面中的”注册”按钮实际上都是退出。1)用户登录界面,用JComboBox控件实现对不同用户的管理。
登录成功后随即进入超级管理员界面。(界面就凑合看吧,我就是做了个简单的实例。)
我们再来个采购员的登录实示例,其他身份的用户其实都一样的。
点击“确定”后,用户进入采购员界面了。
我这里就放了两个示例,接下来我会细细分析我的代码部分。尽量讲的详细点。
3. 代码详解
首先我们这个界面中,我们要用到的控件以及获得文本的方法如下:
控件名称 | 获取控件的文本方法 |
ComboBox(下拉单) | getSelectedItem.toString().equals("ComboBox中addItem()方法中的内容"); |
JTextField 文本框 | getText() |
JPasswordField 密码文本框 | getText() (使用时提示被弃用,但是可用) |
Button | -- |
Font 文本样式设计 | -- |
JOptionPane 对话框技术 | -- |
主要的就是一以上几个控件。实现很简单。
这里我就不一一介绍控件了,我们主要讲登录功能实现和根据不同用户登录不同界面的功能实现方法。
(1)选择身份登录方法实现
登录
连接数据库代码:下面的代码很长,但是不要慌,只是因为里面用户不同的身份有4个,每个都要检验用户名和密码。
我为四个身份用户分别建立了四个表,掌管不同的身份用户信息,所以下面每种身份用户都会进行一次数据库查询。此外,用户身份验证和核对,封装在check函数
再强调一点,获取JComboBox中Item方法是:
jc1.getSelectedItem.toString().equals("");
euquals里面的参数是你之前给JComboBox里面addItem里面的String值:“超级管理员”,“”采购员“之类的
现在我们看一下JCoboBox是如何核对账户信息和密码的:
if (jc1.getSelectedItem().toString().equals("超级管理员")) { //当用户选择“超级管理员”身份登录时
String sql = "select * from denglu " + "where zhanghao = '" + name + "' and mima = '" //查询"denglu"的sql表格中用户信息。
+ password + "'";
ResultSet rs = s.executeQuery(sql);
while (rs.next()) {
if (rs.getString("zhanghao").equals(name) && rs.getString("mima").equals(password)) { //如果用户输入的用户名和密码都和数据库中信息对得上。
result = true; //返回true
} else {
System.out.println(rs.getString("zhanghao").equals(name));
System.out.println(rs.getString("mima").equals(password));
return false;
}
}
}
具体代码如下:
public boolean check(String name, String password) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
boolean result = false;
try {
String url = "jdbc:mysql://localhost:3306/supermarket?serverTimezone=CTT";// 注意设置时区,这个连接是8.0版本的mysql。
String username = "root";
String passwords = "Yuanfeng200517";
Connection c = DriverManager.getConnection(url, username, passwords);
if (c != null) {
System.out.println("数据库连接成功!");
} else {
System.out.println("数据库连接失败!");
}
Statement s = c.createStatement();
//上面的是为了建立数据而做驱动准备以及连接测试。
if (jc1.getSelectedItem().toString().equals("超级管理员")) { //当用户选择“超级管理员”身份登录时
String sql = "select * from denglu " + "where zhanghao = '" + name + "' and mima = '" //查询"denglu"的sql表格中用户信息。
+ password + "'";
ResultSet rs = s.executeQuery(sql);
while (rs.next()) {
if (rs.getString("zhanghao").equals(name) && rs.getString("mima").equals(password)) { //如果用户输入的用户名和密码都和数据库中信息对得上。
result = true; //返回true
} else {
System.out.println(rs.getString("zhanghao").equals(name));
System.out.println(rs.getString("mima").equals(password));
return false;
}
}
} else {
if (jc1.getSelectedItem().toString().equals("供应商")) { //当用户选择“供应商”身份登录时
String sql = "select * from denglu2 " + "where zhanghao = '" + name + "' and mima = '"
+ password + "'";
ResultSet rs = s.executeQuery(sql);
while (rs.next()) {
if (rs.getString("zhanghao").equals(name)
&& rs.getString("mima").equals(password)) {
result = true; // 如果用户名和密码都正确,那么就将result返回为true;
} else {
return false;
}
}
}
if (jc1.getSelectedItem().toString().equals("采购员")) {
String sql = "select * from denglu_purchase " + "where zhanghao = '" + name
+ "' and mima = '" + password + "'";
ResultSet rs = s.executeQuery(sql);
while (rs.next()) {
if (rs.getString("zhanghao").equals(name)
&& rs.getString("mima").equals(password)) {
result = true; // 如果用户名和密码都正确,那么就将result返回为true;
} else
return false;
}
}
/****************** 销售员 ********************/
if (jc1.getSelectedItem().toString().equals("销售员")) {
String sql = "select * from denglu_sell " + "where zhanghao = '" + name
+ "' and mima = '" + password + "'";
ResultSet rs = s.executeQuery(sql);
while (rs.next()) {
if (rs.getString("zhanghao").equals(name)
&& rs.getString("mima").equals(password)) {
result = true; // 如果用户名和密码都正确,那么就将result返回为true;
} else
return false;
}
}
/****************** 仓库管理员 ********************/
if (jc1.getSelectedItem().toString().equals("仓库管理员")) {
String sql = "select * from denglu_warehouse " + "where zhanghao = '" + name
+ "' and mima = '" + password + "'";
ResultSet rs = s.executeQuery(sql);
while (rs.next()) {
if (rs.getString("zhanghao").equals(name)
&& rs.getString("mima").equals(password)) {
result = true;
} else
return false;
}
}
}
} catch (SQLException e2) {
e2.printStackTrace();
}
return result;
}
(2)登录按钮的响应
由于第一步中介绍了check()方法,对用户信息进行分类性验证。这里将我们的登录按钮响应事件。
- 登录成功提示登陆成功,弹出相应的界面。
- 登录失败提示用户或者密码输入错误,这里用到了对话框技术JOptionPane
当登录成功后,我们就new一个界面出来,这样就实现了我们登录成功进入相应的界面。
代码如下:
bt1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String name = t1.getText(); // 获取文本框内的用户名
String pass = t2.getText(); // 获取文本框内的密码
if (0 == name.length()) { //如果用户名中未输入信息,提示账号不能为空。
JOptionPane.showMessageDialog(null, "账号不能为空");
t1.grabFocus();
return;
}
if (0 == pass.length()) { //如果密码中未输入信息,提示密码不能为空。
JOptionPane.showMessageDialog(null, "密码不可为空!");
t2.grabFocus();
return;
}
if (jc1.getSelectedItem().toString().equals("超级管理员")) {
if (check(name, pass)) {
JOptionPane.showMessageDialog(null, "登陆成功");
new user1(); //当登录成功以后,用户就自动进入到另一个界面“user1”。下面是一样的。
} else
JOptionPane.showMessageDialog(null, "密码错误");
}
/* 仓库管理员的检查 */
if (jc1.getSelectedItem().toString().equals("仓库管理员")) {
if (check(name, pass)) {
JOptionPane.showMessageDialog(null, "登陆成功");
new user2();
} else
JOptionPane.showMessageDialog(null, "密码错误");
}
/* 采购员的检查 */
if (jc1.getSelectedItem().toString().equals("采购员")) {
if (check(name, pass)) {
JOptionPane.showMessageDialog(null, "登陆成功");
new user3();
} else
JOptionPane.showMessageDialog(null, "密码错误");
}
/* 销售员的检查 */
if (jc1.getSelectedItem().toString().equals("销售员")) {
if (check(name, pass)) {
JOptionPane.showMessageDialog(null, "登陆成功");
new user4();
} else
JOptionPane.showMessageDialog(null, "密码错误");
}
}
});
4. 全部代码示例
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import newGUI.PurchaseFrame;
import newGUI.StockFrame;
import test.user1;
import test.user2;
import test.user3;
import test.user4;
public class Load_GUI extends JFrame implements ActionListener {
static Load_GUI lg = null; //放在Main函数中,用于加载窗体信息。
//上面这部分代码是用来控制GUI风格的,我这里是Windows风格。
//数据库信息
private static String user = "root"; //连接数据库的用户名。
//上面这个参数在最下面的this.setDefaultCloseOperation(),中使用参数。作用是,当我们打开连个窗口时,其中一个窗口关闭不会导致这个窗口也被迫关闭。
private static String pass; //连接数据库的密码
String url = "jdbc:mysql://localhost:3306/supermarket?serverTimezone=CTT";
/* Lable控件 */
JLabel l1 = new JLabel("XxxXX管理系统");
JLabel l2 = new JLabel("用户名:");
JLabel l3 = new JLabel("密码:");
/* 控制Label中的字体风格 */
Font f = new Font("楷体", Font.BOLD, 20);
Font f2 = new Font("楷体", Font.BOLD, 15);
/* 下拉单 */
JComboBox jc1 = new JComboBox();
/* 按钮 */
JButton bt1 = new JButton("登录");
JButton bt2 = new JButton("取消");
/* 文本框 */
JTextArea textarea;
JTextField t1 = new JTextField(); //textField控件可以获取获取文本内容//
JPasswordField t2 = new JPasswordField(); //密码输入框的专用控件
private int defaultCloseOperation = HIDE_ON_CLOSE;
{
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (Exception e) {
System.out.println(e);
}
}
public Load_GUI() {
l1.setFont(f); //字体风格Font参数和Label控件 名称为l1的对象 绑定。
l2.setFont(f2);
l3.setFont(f2);
l1.setBounds(new Rectangle(100, 20, 220, 40));
l2.setBounds(new Rectangle(40, 60, 200, 40));
l3.setBounds(new Rectangle(40, 90, 200, 40));
bt1.setBounds(new Rectangle(40, 180, 120, 25));
bt2.setBounds(new Rectangle(220, 180, 120, 25));
t1.setBounds(new Rectangle(100, 70, 180, 26));
t2.setBounds(new Rectangle(100, 100, 180, 26));
jc1.setBounds(new Rectangle(120, 130, 100, 26));
/* 给对象名为jc1的Combobox控件,添加内容。 */
jc1.addItem("超级管理员");
jc1.addItem("仓库管理员");
jc1.addItem("销售员");
jc1.addItem("采购员");
{
bt2.addActionListener(new ActionListener() {//该事件监听用于 监听按钮"取消"事件。
@Override
public void actionPerformed(ActionEvent e) {//如果用户按下”取消“按钮,程序退出。
System.exit(0);
}
});
bt1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String name = t1.getText(); // 获取文本框内的用户名
String pass = t2.getText(); // 获取文本框内的密码
if (0 == name.length()) {
JOptionPane.showMessageDialog(null, "账号不能为空");
t1.grabFocus();
return;
}
if (0 == pass.length()) {
JOptionPane.showMessageDialog(null, "密码不可为空!");
t2.grabFocus();
return;
}
if (jc1.getSelectedItem().toString().equals("超级管理员")) {
if (check(name, pass)) {
JOptionPane.showMessageDialog(null, "登陆成功");
new user1();
} else
JOptionPane.showMessageDialog(null, "密码错误");
}
/* 仓库管理员的检查 */
if (jc1.getSelectedItem().toString().equals("仓库管理员")) {
if (check(name, pass)) {
JOptionPane.showMessageDialog(null, "登陆成功");
new user2();
} else
JOptionPane.showMessageDialog(null, "密码错误");
}
/* 采购员的检查 */
if (jc1.getSelectedItem().toString().equals("采购员")) {
if (check(name, pass)) {
JOptionPane.showMessageDialog(null, "登陆成功");
new user3();
} else
JOptionPane.showMessageDialog(null, "密码错误");
}
/* 销售员的检查 */
if (jc1.getSelectedItem().toString().equals("销售员")) {
if (check(name, pass)) {
JOptionPane.showMessageDialog(null, "登陆成功");
new user4();
} else
JOptionPane.showMessageDialog(null, "密码错误");
}
}
});
this.setTitle("登录"); //设置窗体标题名称
this.setLayout(null); // 窗体布局设置为自定义,这行代码不可更换到其他位置//
this.setSize(400, 300);
this.add(bt2);
this.add(bt1);
this.add(l1);
this.add(l2);
this.add(l3);
this.add(t1);
this.add(t2);
this.add(jc1);
this.setBounds(800, 300, 400, 300); //设置窗体规格
this.setDefaultCloseOperation(1);
this.setVisible(true); //窗体可以看见,如果是false,那么运行程序后窗体看不见,。
this.setResizable(false); //setResizable用于控制窗体大小可拉伸与否。false表示,窗体大小定死了。
user = t1.getText();
}
}
public static void main(String args[]) {
lg = new Load_GUI();
}
@Override
public void actionPerformed(ActionEvent e) {
}
public boolean check(String name, String password) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
boolean result = false;
try {
String url = "jdbc:mysql://localhost:3306/supermarket?serverTimezone=CTT";// 注意设置时区,这个连接是8.0版本的mysql。
String username = "root";
String passwords = "Yuanfeng200517";
Connection c = DriverManager.getConnection(url, username, passwords);
if (c != null) {
System.out.println("数据库连接成功!");
} else {
System.out.println("数据库连接失败!");
}
Statement s = c.createStatement();
if (jc1.getSelectedItem().toString().equals("超级管理员")) {
String sql = "select * from denglu " + "where zhanghao = '" + name + "' and mima = '"
+ password + "'";
ResultSet rs = s.executeQuery(sql);
while (rs.next()) {
if (rs.getString("zhanghao").equals(name) && rs.getString("mima").equals(password)) {
result = true;
} else {
System.out.println(rs.getString("zhanghao").equals(name));
System.out.println(rs.getString("mima").equals(password));
return false;
}
}
} else {
if (jc1.getSelectedItem().toString().equals("供应商")) {
String sql = "select * from denglu2 " + "where zhanghao = '" + name + "' and mima = '"
+ password + "'";
ResultSet rs = s.executeQuery(sql);
while (rs.next()) {
if (rs.getString("zhanghao").equals(name)
&& rs.getString("mima").equals(password)) {
result = true; // 如果用户名和密码都正确,那么就将result返回为true;
} else {
return false;
}
}
}
if (jc1.getSelectedItem().toString().equals("采购员")) {
String sql = "select * from denglu_purchase " + "where zhanghao = '" + name
+ "' and mima = '" + password + "'";
ResultSet rs = s.executeQuery(sql);
while (rs.next()) {
if (rs.getString("zhanghao").equals(name)
&& rs.getString("mima").equals(password)) {
result = true; // 如果用户名和密码都正确,那么就将result返回为true;
} else
return false;
}
}
/****************** 销售员 ********************/
if (jc1.getSelectedItem().toString().equals("销售员")) {
String sql = "select * from denglu_sell " + "where zhanghao = '" + name
+ "' and mima = '" + password + "'";
ResultSet rs = s.executeQuery(sql);
while (rs.next()) {
if (rs.getString("zhanghao").equals(name)
&& rs.getString("mima").equals(password)) {
result = true; // 如果用户名和密码都正确,那么就将result返回为true;
} else
return false;
}
}
/****************** 仓库管理员 ********************/
if (jc1.getSelectedItem().toString().equals("仓库管理员")) {
String sql = "select * from denglu_warehouse " + "where zhanghao = '" + name
+ "' and mima = '" + password + "'";
ResultSet rs = s.executeQuery(sql);
while (rs.next()) {
if (rs.getString("zhanghao").equals(name)
&& rs.getString("mima").equals(password)) {
result = true;
} else
return false;
}
}
}
} catch (SQLException e2) {
e2.printStackTrace();
}
return result;
}
}
5. 包的存放位置
由于我们登录成功后会相应不同的界面,我设计的界面存放结构如下:
由于每个界面只是放了个Lable,所以这里只展示了一个界面的代码,后面的都差不多,把Label的内容改改就行:
package test;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
public class user1 extends JFrame{
JLabel jlabel=new JLabel();
public user1() {
this.setTitle("超级管理员界面");
this.setSize(600,500);
this.setLayout(null);
this.setLocation(400,400);
this.jlabel=new JLabel("超级管理员界面");
this.jlabel.setBounds(150, 120, 120, 30);
this.add(jlabel);
this.setVisible(true);
this.setResizable(false);
}
public static void main(String [] args)
{
new user1();
}
}
实现出来就是这种界面:
这边建议各位使用快捷的窗体开发工具,JwindowBuilder,所有的窗体控件都是拖拽式的。具体使用各种博客都有。这里就不再赘述。