第3课_用户登录模块
热度🔥:61 免费课程
授课语音
第三课:用户登录模块
课程目标
- 掌握用户登录界面的设计与实现,包括用户名和密码输入框、登录按钮、及提示信息。
- 实现基本的登录验证逻辑,初步了解如何在程序中设计用户身份验证。
- 学会用户信息的本地存储设计,如通过文本文件保存用户信息。
- 实现登录成功后的界面跳转,进入图书管理系统的主界面。
1. 登录界面设计与实现
登录界面是系统的入口,用户可以在这里输入用户名和密码来验证身份。登录界面一般包含以下几个主要元素:
- 用户名输入框:用于输入用户名。
- 密码输入框:用于输入密码,输入时内容显示为隐藏状态。
- 登录按钮:点击后验证用户输入的用户名和密码。
- 提示信息:用于提示用户登录状态,例如输入错误时显示提示信息。
在实际实现时,我们使用Java的Swing库来构建这些组件。我们可以先在ui
包中新建一个LoginFrame
类,用于实现登录界面。
代码案例:LoginFrame
类
package ui;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class LoginFrame extends JFrame {
// 定义登录界面的组件
private JTextField usernameField; // 用户名输入框
private JPasswordField passwordField; // 密码输入框
private JLabel messageLabel; // 提示信息标签
// 构造方法,初始化登录界面
public LoginFrame() {
// 设置窗口标题
setTitle("用户登录");
// 设置窗口大小
setSize(300, 200);
// 设置窗口居中显示
setLocationRelativeTo(null);
// 设置关闭操作
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建界面组件
usernameField = new JTextField(15); // 创建用户名输入框
passwordField = new JPasswordField(15); // 创建密码输入框
JButton loginButton = new JButton("登录"); // 创建登录按钮
messageLabel = new JLabel("", SwingConstants.CENTER); // 创建提示信息标签,默认无内容
// 创建面板并添加组件
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(4, 1, 10, 10)); // 使用网格布局,4行1列,组件间距为10
// 添加组件到面板
panel.add(new JLabel("用户名:", SwingConstants.CENTER));
panel.add(usernameField);
panel.add(new JLabel("密码:", SwingConstants.CENTER));
panel.add(passwordField);
// 添加按钮及提示信息
panel.add(loginButton);
panel.add(messageLabel);
// 将面板添加到窗口
add(panel);
// 添加按钮的点击事件
loginButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 获取用户输入的用户名和密码
String username = usernameField.getText();
String password = new String(passwordField.getPassword());
// 调用验证方法
if (validateLogin(username, password)) {
// 验证成功,显示成功提示
messageLabel.setText("登录成功!");
// 跳转到主界面
new MainFrame(); // 创建主界面窗口
dispose(); // 关闭当前窗口
} else {
// 验证失败,显示错误提示
messageLabel.setText("用户名或密码错误!");
}
}
});
// 设置窗口可见
setVisible(true);
}
// 登录验证方法
private boolean validateLogin(String username, String password) {
// 简单验证逻辑:用户名为"admin",密码为"1234"
return "admin".equals(username) && "1234".equals(password);
}
// 主方法,启动程序
public static void main(String[] args) {
new LoginFrame(); // 实例化登录界面
}
}
详细解释:
usernameField
和passwordField
:分别用于输入用户名和密码,其中密码输入框passwordField
使用JPasswordField
,以便输入时字符显示为隐藏状态。validateLogin
方法:这是一个简单的验证逻辑,硬编码了用户名和密码(可以根据需求改为从文件读取用户信息)。messageLabel
:用于显示登录状态的提示信息。loginButton
的点击事件:当点击登录按钮时,会获取用户名和密码,并调用validateLogin
方法进行验证。验证成功时,跳转到主界面;失败时显示错误提示。
2. 实现简单的验证逻辑
在validateLogin
方法中,我们使用硬编码的方式,将用户名设为“admin”,密码为“1234”。这种方式简单直接,适合教学和演示。但在实际项目中,我们可以将用户名和密码存储在一个本地文件中,并从文件中读取用户信息来进行验证。
3. 用户信息的本地存储设计
用户信息可以通过文本文件进行存储,这样的设计简单易懂且实现方便。假设我们的用户数据存储在一个users.txt
文件中,每行存储一个用户信息,格式为用户名:密码
。
用户信息存储示例:users.txt
admin:1234
user1:password1
user2:password2
接下来,我们实现从文件中读取用户信息,并进行登录验证。
代码案例:读取文件中的用户信息进行验证
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class LoginFrame extends JFrame {
// 其他代码略...
// 文件验证登录方法
private boolean validateLogin(String username, String password) {
try (BufferedReader reader = new BufferedReader(new FileReader("users.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
// 按照“用户名:密码”的格式解析每行
String[] parts = line.split(":");
if (parts.length == 2) {
String storedUsername = parts[0];
String storedPassword = parts[1];
// 如果用户名和密码匹配,则返回true
if (storedUsername.equals(username) && storedPassword.equals(password)) {
return true;
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
// 用户名或密码不匹配时返回false
return false;
}
}
解释:
- 通过
BufferedReader
读取文件users.txt
,逐行解析用户名和密码。 - 如果文件中有匹配的用户名和密码,则返回
true
,否则返回false
。 - 使用
try-with-resources
语句,确保文件读取完成后自动关闭资源。
4. 登录成功后的界面跳转
当用户输入正确的用户名和密码后,程序会打开图书管理系统的主界面MainFrame
,并关闭登录窗口。
在LoginFrame
类的ActionListener
中,通过new MainFrame()
实例化主界面,同时使用dispose()
方法关闭当前登录窗口,实现登录后的界面跳转。
课后练习
- 修改
validateLogin
方法,实现从users.txt
中读取用户信息。 - 扩展登录界面,增加“记住密码”复选框功能。
- 设计登录失败的限制机制,例如连续三次登录失败后,系统锁定一分钟。
通过本课的学习,大家已经掌握了如何实现一个简单的用户登录模块,包括登录界面的设计、验证逻辑的实现和用户信息的本地存储方式。在接下来的课程中,我们将继续实现图书管理系统的其他功能模块。