授课语音

第三课:用户登录模块

课程目标

  • 掌握用户登录界面的设计与实现,包括用户名和密码输入框、登录按钮、及提示信息。
  • 实现基本的登录验证逻辑,初步了解如何在程序中设计用户身份验证。
  • 学会用户信息的本地存储设计,如通过文本文件保存用户信息。
  • 实现登录成功后的界面跳转,进入图书管理系统的主界面。

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(); // 实例化登录界面
    }
}

详细解释

  • usernameFieldpasswordField:分别用于输入用户名和密码,其中密码输入框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()方法关闭当前登录窗口,实现登录后的界面跳转。


课后练习

  1. 修改validateLogin方法,实现从users.txt中读取用户信息。
  2. 扩展登录界面,增加“记住密码”复选框功能。
  3. 设计登录失败的限制机制,例如连续三次登录失败后,系统锁定一分钟。

通过本课的学习,大家已经掌握了如何实现一个简单的用户登录模块,包括登录界面的设计、验证逻辑的实现和用户信息的本地存储方式。在接下来的课程中,我们将继续实现图书管理系统的其他功能模块。

去1:1私密咨询

系列课程: