【Java】Java Swing 图书管借阅管理系统(源码+论文)【独一无二】

请添加图片描述


👉博__主👈:米码收割机
👉技__能👈:C++/Python语言
👉公众号👈:测试开发自动化【获取源码+商业合作】
👉荣__誉👈:阿里云博客专家博主、51CTO技术博主
👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。


【Java】Java Swing 图书管借阅管理系统(源码+论文)【独一无二】



一、设计要求

首先,GUI应用程序开发是这个实验的核心背景。GUI(Graphical User Interface)应用程序是一种通过可视化元素,如窗口、按钮、文本框等,与用户进行交互的应用程序。GUI应用程序的开发对于创建用户友好且易于使用的软件至关重要。在许多领域,如企业应用、桌面应用、教育软件等,GUI应用程序都有广泛的应用。因此,理解如何构建GUI应用程序是软件开发领域的一个重要方面。

其次,基于用户权限的访问控制是这个实验的另一个关键背景。在许多应用程序中,不同用户可能拥有不同的权限和访问级别。,在一个图书管理系统中,管理员可能具有对所有功能和数据的完全访问权限,而普通用户可能仅具有查看图书信息的权限。因此,为了确保数据的安全性和合规性,需要实现基于用户权限的访问控制。这可以通过在应用程序中动态控制用户界面上的功能按钮、限制特定用户的操作等方式来实现。

综上所述,这段代码的实验背景涵盖了GUI应用程序开发和基于用户权限的访问控制。通过开发一个简单的图书管理系统,这个实验旨在教授如何创建具有用户友好界面的应用程序,并演示如何根据用户的身份和权限控制他们在应用程序中的操作。这些知识和技能对于开发实际应用程序非常重要,因为它们可以应用于各种领域和行业,提高了软件开发人员的综合能力和竞争力。同时,这个实验还有助于学生理解和应用编程中的关键概念,如事件处理、数据库交互和用户界面设计,为他们的职业生涯奠定了坚实的基础。因此,这个实验背景具有广泛的教育和实践价值。

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 代码 ” 获取,拿来即用。👈👈👈

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


二、设计思路

登录界面

  1. 导入必要的包和类:
    通过import语句导入了一些Swing和数据库相关的类,这些类用于创建GUI界面和处理数据库连接、查询等操作。

  2. Login类继承自JFrame类:
    Login类是一个窗口界面,用于用户输入用户名和密码进行登录验证。

  3. 构造方法Login():
    在构造方法中,设置了窗口标题、大小、关闭操作等窗口属性。
    创建了一个包含用户名、密码标签和文本框、登录按钮和取消按钮的面板,并使用GridLayout布局管理器来布置这些组件。
    添加了登录按钮和取消按钮的动作监听器,以便在按钮点击时执行相应的操作。
    将所有组件添加到窗口中,并设置窗口居中可见。

  4. actionPerformed方法:
    actionPerformed方法是登录按钮的点击事件处理方法。
    从用户名文本框和密码输入框中获取用户输入的用户名和密码。
    调用validateLogin()方法来验证用户名和密码是否在数据库中匹配。
    如果匹配成功,会显示登录成功的消息框,并关闭当前登录窗口。
    同时,将用户名存储到GlobalVar类的静态变量中,以便其他部分的程序可以访问。
    如果验证失败,会显示用户名或密码错误的消息框。

  5. validateLogin()方法:
    validateLogin()方法用于验证用户名和密码是否匹配。
    首先创建一个数据库连接,然后使用PreparedStatement执行SQL查询语句,以查找匹配的用户名和密码。
    如果查询结果包含记录,表示验证成功,返回该记录的id;否则,返回null表示验证失败。

  6. main方法:
    main方法是程序的入口点,通过SwingUtilities.invokeLater()方法在事件分发线程中创建Login实例,确保Swing组件在正确的线程中创建和运行。

总体来说,这段代码实现了一个简单的登录界面,用户可以输入用户名和密码,然后进行登录验证。验证通过后,登录窗口关闭,并将用户名存储到全局变量中,然后打开另一个窗口。需要注意的是,代码中存在一些不够优雅的部分,重复的代码块和硬编码的方式,可以进一步改进代码以提高可维护性和可读性。

修改密码

  1. 导入必要的包和类:
    通过import语句导入了一些Swing和数据库相关的类,这些类用于创建GUI界面和处理数据库连接、查询等操作。

  2. UpdatePassword类继承自JFrame类:
    UpdatePassword类是一个窗口界面,用于用户输入原密码和新密码,然后进行密码修改操作。

  3. 构造方法UpdatePassword():
    在构造方法中,设置了窗口标题、大小、关闭操作等窗口属性。
    创建了一个包含用户名、密码标签和文本框、登录按钮和取消按钮的面板,并使用GridLayout布局管理器来布置这些组件。
    添加了登录按钮和取消按钮的动作监听器,以便在按钮点击时执行相应的操作。
    将所有组件添加到窗口中,并设置窗口居中可见。

  4. actionPerformed方法:
    actionPerformed方法是登录按钮的点击事件处理方法。
    从用户名文本框和密码输入框中获取用户输入的用户名和密码。
    调用check()方法来检查原密码和新密码是否一致,如果一致,继续下一步,否则显示错误消息。
    如果密码一致,则调用validateLogin()方法来更新数据库中的密码,并显示成功或失败的消息框。
    在成功或失败后,关闭当前登录窗口,并在事件分发线程中创建一个新的ShowMain实例。

  5. validateLogin()方法:
    validateLogin()方法用于更新数据库中的用户密码。
    首先创建一个数据库连接,然后使用PreparedStatement执行SQL语句来更新用户密码。
    更新成功后,返回true;否则,返回false。

  6. check()方法:
    check()方法用于检查原密码和新密码是否一致。
    如果一致,返回true;否则,返回false。

  7. main方法:
    main方法是程序的入口点,通过SwingUtilities.invokeLater()方法在事件分发线程中创建UpdatePassword实例,确保Swing组件在正确的线程中创建和运行。

总体来说,这段代码实现了一个简单的密码修改界面,用户输入原密码和新密码后,会将新密码更新到数据库中。需要注意的是,代码中存在一些不够优雅的部分,重复的代码块和硬编码的方式。可以进一步改进代码以提高可维护性和可读性。

借书界面

  1. 导入必要的包和类:
    通过import语句导入了一些Swing、数据库和日期处理相关的类,用于创建GUI界面、处理数据库连接、查询以及日期格式化等操作。

  2. Borrow类继承自JFrame类:
    Borrow类是一个窗口界面,用于实现图书借阅操作,包括查询图书信息、读者信息,以及借阅图书的功能。

  3. 构造方法Borrow():
    在构造方法中,设置了窗口标题、大小、关闭操作等窗口属性。
    创建了包括查询图书编号、读者编号、查询按钮、文本区域和确定、取消按钮的各个面板,并使用布局管理器将它们组织在一起。
    添加了查询按钮、确定按钮和取消按钮的动作监听器,以便在按钮点击时执行相应的操作。
    使用JScrollPane包装文本区域,以支持滚动查看文本。

  4. actionPerformed方法:
    actionPerformed方法是各个按钮的点击事件处理方法。
    查询按钮的点击事件会调用selectBorrow()方法,用于查询图书和读者信息,并显示在文本区域中。
    确定按钮的点击事件会调用add()方法,用于借阅图书,并在成功借阅后显示成功消息框,并关闭当前窗口。
    取消按钮的点击事件会关闭当前窗口。

  5. selectBorrow()方法:
    selectBorrow()方法用于查询图书和读者信息,并显示在文本区域中。
    通过用户输入的图书编号和读者编号,查询相应的图书和读者信息,并统计读者的借阅次数和最近借阅时间。
    使用SimpleDateFormat格式化最近借阅时间,并将结果显示在文本区域中。

  6. add()方法:
    add()方法用于借阅图书。
    根据用户输入的图书编号和读者编号,插入借阅记录到数据库中,同时设置借阅日期和应还日期,并标记为未归还。
    如果插入成功,返回true;否则,返回false。

  7. main方法:
    main方法是程序的入口点,通过SwingUtilities.invokeLater()方法在事件分发线程中创建Borrow实例,确保Swing组件在正确的线程中创建和运行。

总体来说,这段代码实现了一个简单的图书借阅界面,用户可以查询图书和读者信息,并进行图书借阅操作。需要注意的是,代码中存在一些不够优雅的部分,重复的代码块和硬编码的方式,可以进一步改进代码以提高可维护性和可读性。此外,代码还应该考虑一些错误处理和边界情况,以提高程序的健壮性。

书籍查询

  1. 导入必要的包和类:
    通过import语句导入了一些Swing、数据库相关的类,用于创建GUI界面和处理数据库连接、查询等操作。

  2. BookQuery类继承自JFrame类:
    BookQuery类是一个窗口界面,用于实现图书查询功能,用户可以根据图书名称、作者、出版社和出版时间等条件查询图书信息。

  3. 构造方法BookQuery():
    在构造方法中,设置了窗口标题、大小、关闭操作等窗口属性。
    创建了包括图书名称、作者、出版社、出版时间文本框和查询按钮、结果表格的各个组件,并使用FlowLayout布局管理器将它们组织在一起。
    创建了一个空的DefaultTableModel模型来表示表格数据。
    使用JScrollPane包装结果表格,以支持滚动查看结果。

  4. actionPerformed方法:
    actionPerformed方法是查询按钮的点击事件处理方法。
    查询按钮的点击事件会调用queryBooks()方法,用于根据用户输入的条件构建SQL查询语句,执行查询并将查询结果显示在结果表格中。

  5. queryBooks()方法:
    queryBooks()方法用于执行图书查询操作。
    根据用户输入的图书名称、作者、出版社和出版时间等条件构建SQL查询语句。
    使用PreparedStatement执行SQL查询,将查询结果遍历并加入到DefaultTableModel模型中,最后将模型设置到结果表格中显示查询结果。

  6. main方法:
    main方法是程序的入口点,通过SwingUtilities.invokeLater()方法在事件分发线程中创建BookQuery实例,确保Swing组件在正确的线程中创建和运行。

总体来说,这段代码实现了一个图书查询界面,用户可以根据不同的查询条件查询图书信息,并将查询结果显示在表格中。需要注意的是,代码中使用了PreparedStatement来构建SQL查询语句,从而防止SQL注入攻击。然而,代码仍然可以进一步改进,添加错误处理和更友好的用户界面等功能。

读者信息

代码设计是一个Java Swing应用程序,用于管理读者信息的界面。它包括了读者信息的添加、更新和删除功能,分为三个子界面:AddReaderOperle(添加读者信息)、UpdateReaderOperle(更新读者信息)和DelReaderOperle(删除读者信息)。

  1. ReaderOperate 类:
    这是主界面类,用于创建读者管理的主界面。
    它包含了添加、更新和删除读者信息的按钮,点击这些按钮会打开对应的子界面。
    构造方法中设置了窗口的标题、大小、默认关闭操作等。
    通过按钮的事件监听器,点击按钮会打开对应的子界面,并关闭主界面。

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 代码 ” 获取,拿来即用。👈👈👈

package book;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 读者管理界面类
 */
public class ReaderOperate extends JFrame {
    private JTextField readerIdField;
    private JTextField readerNameField;
    private JTextField readerTypeField;
    private JTextField sexField;
    private JTextField maxNumField;
    private JTextField daysNumField;

    /**
     * 构造方法,创建读者管理界面
     */
    public ReaderOperate(String windowTitle) {
        setTitle(windowTitle);
        setSize(400, 450);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        // 创建按钮面板
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));

        JButton addButton = new JButton("添加读者");
        JButton updateButton = new JButton("更新读者");
        JButton deleteButton = new JButton("删除读者");

        addButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 关闭当前读者管理窗口
                dispose();
                new AddReaderOperle();
            }
        });

        updateButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dispose();
                new UpdateReaderOperle();
            }
        });

        deleteButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dispose();
                new DelReaderOperle();
            }
        });

        buttonPanel.add(addButton);
        buttonPanel.add(updateButton);
        buttonPanel.add(deleteButton);

        add(buttonPanel, BorderLayout.NORTH);
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(10, 2, 10, 10));
 // 略.....
 // 略.....
 // 略.....
  1. AddReaderOperle 类:
    这是添加读者信息的界面类。
    它包含了读者编号、读者姓名、读者类别、读者性别、可借数量和可借天数等字段的输入框。
    用户可以输入读者信息并点击 “确定” 按钮来保存信息。
    构造方法中设置了窗口的标题、大小、默认关闭操作等。
    通过 “确定” 按钮的事件监听器,点击按钮会调用 saveReader() 方法来保存读者信息。

  2. UpdateReaderOperle 类:
    这是更新读者信息的界面类。
    它包含了读者编号的输入框,用户可以输入要更新的读者编号,并点击 “查询” 按钮查找读者信息。
    一旦找到对应的读者信息,界面会填充读者的其他信息(姓名、类别、性别、可借数量和可借天数)。
    用户可以修改这些信息并点击 “确定” 按钮来更新读者信息。
    构造方法中设置了窗口的标题、大小、默认关闭操作等。
    通过 “查询” 按钮的事件监听器,点击按钮会调用 searchReader() 方法来查询读者信息,然后通过 “确定” 按钮的事件监听器调用 updateReader() 方法来更新读者信息。

  3. DelReaderOperle 类:
    这是删除读者信息的界面类,与更新界面类似。
    它包含了读者编号的输入框,用户可以输入要删除的读者编号,并点击 “查询” 按钮查找读者信息。
    一旦找到对应的读者信息,界面会填充读者的其他信息(姓名、类别、性别、可借数量和可借天数)。
    用户可以点击 “确定” 按钮来删除读者信息。
    构造方法中设置了窗口的标题、大小、默认关闭操作等。
    通过 “查询” 按钮的事件监听器,点击按钮会调用 searchReader() 方法来查询读者信息,然后通过 “确定” 按钮的事件监听器调用 updateReader() 方法来删除读者信息。

总体来说,这段代码实现了一个简单的读者信息管理系统,包括添加、更新和删除功能。每个功能都有对应的界面,用户可以通过界面来操作读者信息。需要注意的是,代码中使用了Swing库来创建图形用户界面,以及与数据库交互的功能。同时,代码中也包含了一些事件监听器来处理用户的操作。

归还书籍

这段代码是一个Java Swing应用程序,用于图书归还的管理。它的功能包括查询借阅信息、归还图书和取消操作。下面是代码的功能和结构分析:

  1. Back 类:
    这是主界面类,用于创建图书归还管理的主界面。
    主要包括一个文本框用于输入图书编号(searchBookIdField)和一个文本框用于输入读者编号(searchReaderIdField),以及查询按钮(searchButton)、确定按钮(addButton)、取消按钮(cancelButton)和一个文本区域用于显示查询结果(resultTextArea)。
    构造方法中设置了窗口的标题、大小、默认关闭操作等。
package book;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Back extends JFrame {
    private JTextField searchBookIdField; // 用于输入要查询的图书编号的文本框
    private JTextField searchReaderIdField; // 用于输入要查询的读者编号的文本框
    private JButton searchButton; // 查询按钮
    private JButton addButton; // 确定按钮
    private JButton cancelButton; // 取消按钮

    // 用于显示数据的组件
    private JTextArea resultTextArea;

    public Back(String windowTitle) {
        setTitle(windowTitle);
        setSize(600, 450);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        // 主面板,使用BorderLayout
        JPanel mainPanel = new JPanel(new BorderLayout());

        // 顶部面板,用于查询图书
        JPanel topPanel = new JPanel(new FlowLayout());

        JLabel searchBookIdLabel = new JLabel("图书编号:");
        searchBookIdField = new JTextField(10);


        JLabel searchReaderIdLabel = new JLabel("读者编号:");
        searchReaderIdField = new JTextField(10);

        searchButton = new JButton("查询");
        addButton = new JButton("确定");
        cancelButton = new JButton("取消");

        topPanel.add(searchBookIdLabel);
        topPanel.add(searchBookIdField);
        topPanel.add(searchReaderIdLabel);
        topPanel.add(searchReaderIdField);
        topPanel.add(searchButton);
        topPanel.add(addButton);
        topPanel.add(cancelButton);

        // 用于显示数据的文本区域
        resultTextArea = new JTextArea(10, 30);
        resultTextArea.setEditable(false); // 设置为不可编辑

        // 添加滚动条
        JScrollPane scrollPane = new JScrollPane(resultTextArea);

        // 将顶部面板和文本区域添加到主面板
        mainPanel.add(topPanel, BorderLayout.NORTH);
        mainPanel.add(scrollPane, BorderLayout.CENTER);

        // 查询按钮的事件监听器
        searchButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 调用方法查询图书并填充信息
                try {
                    selectBorrow();
                } catch (SQLException | ClassNotFoundException ex) {
                    throw new RuntimeException(ex);
                }
            }
        });

      // 略.....
 // 略.....
 // 略.....

  1. selectBorrow 方法:
    这个方法用于查询借阅信息并显示在文本区域中。
    它首先获取用户输入的图书编号和读者编号,然后调用 BookSelect.selectBookById 和 ReaderSelect.selectReaderById 方法来查询对应的图书和读者信息。
    还统计了读者的借阅次数。
    然后,将查询到的图书信息、读者信息、当前日期等信息格式化后,显示在文本区域中。

  2. add 方法:
    这个方法用于执行图书归还操作。
    它首先检查指定的读者是否借阅了指定的图书(通过调用 IfBorrowBack.hasBorrowed 方法来判断)。
    如果读者借阅了图书,就会将借阅记录中的 if_back 标记为 “是”,并设置归还日期为当前日期。
    归还操作完成后,方法返回 true 表示归还成功,否则返回 false 表示没有归还成功。

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 代码 ” 获取,拿来即用。👈👈👈

  1. 查询按钮、确定按钮和取消按钮的事件监听器:
    查询按钮的事件监听器会调用 selectBorrow 方法来查询借阅信息并显示在文本区域中。
    确定按钮的事件监听器会调用 add 方法来执行归还操作,如果成功则显示归还成功的消息,并关闭当前窗口,然后打开一个新的窗口(BB 类的实例)。
    取消按钮的事件监听器用于关闭当前窗口。

总体来说,这段代码实现了一个简单的图书归还管理系统,用户可以通过输入图书编号和读者编号来查询借阅信息,并执行图书归还操作。借阅信息会显示在文本区域中,归还成功后会弹出消息提示。需要注意的是,代码中使用了Swing库来创建图形用户界面,以及与数据库交互的功能。

主界面

这段代码是一个Java Swing应用程序,实现了一个主页面窗口,用户可以根据不同的权限访问不同的子页面。以下是代码的功能和结构分析:

  1. ShowMain 类:
    这是主页面的类,用于创建主页面的窗口。
    窗口的标题为 “主页面”,初始大小为400x300,设定了关闭窗口时的默认操作为退出应用程序。
package book;


import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class ShowMain extends JFrame {
    private JButton button1;

    public ShowMain(String username) throws SQLException, ClassNotFoundException {
        setTitle("主页面");
        setSize(400, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 使用GridBagLayout布局管理器
        setLayout(new GridBagLayout());

        // 创建 GridBagConstraints 对象
        GridBagConstraints gbc = new GridBagConstraints();

        // 设置顶部按钮行的高度为整个页面的十分之一
        gbc.weighty = 0.1;

        // 创建一个面板来包含顶部的按钮
        JPanel topPanel = new JPanel(new GridLayout(1, 4, 10, 0));
        button1 = new JButton("数据管理");
        JButton button2 = new JButton("借阅管理");
        JButton button3 = new JButton("查询管理");


        // 根据用户权限设置按钮可用性
        if (!isAdminUser(username)) {
            button1.setEnabled(false);
        }

        button1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                openPage("A");
            }
        });

        button2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                openPage("B");
            }
        });

        button3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                openPage("C");
            }
        });

        button4.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                openPage("D");
            }
        });

        topPanel.add(button1);
        topPanel.add(button2);
        topPanel.add(button3);
        topPanel.add(button4);

        // 添加顶部按钮行到页面
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        add(topPanel, gbc);

        // 创建一个面板来包含主内容
        JPanel mainContentPanel = new JPanel();
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.weightx = 1.0; // 让主内容面板水平充满整个宽度
        gbc.weighty = 0.9; // 让主内容面板垂直充满整个剩余高度
        add(mainContentPanel, gbc);

        setLocationRelativeTo(null);
        setVisible(true);
    }
 // 略.....
 // 略.....
 // 略.....
}

  1. 布局管理和界面元素:
    使用了GridBagLayout布局管理器来管理主页面的布局,它允许更灵活地控制组件的位置和大小。
    创建了一个GridBagConstraints对象gbc来控制组件的位置和大小。
    顶部按钮行使用JPanel包含四个按钮,按钮之间有10像素的水平间距。这些按钮分别用于数据管理、借阅管理、查询管理和系统管理。

  2. 用户权限控制:
    在构造函数中,根据用户的权限来设置按钮的可用性。用户权限通过isAdminUser方法查询数据库中tb_user表的is_admin字段来确定是否是管理员用户。
    如果用户不是管理员用户,数据管理按钮(button1)将被禁用,即不可点击。

  3. 按钮事件监听器:
    每个按钮都有一个事件监听器,当用户点击按钮时,会执行相应的操作。
    openPage 方法用于根据按钮的名称打开相应的子页面。具体的子页面包括数据管理、借阅管理、查询管理和密码更新页面。
    每个子页面的窗口会在打开之前关闭当前主页面窗口。

  4. isAdminUser 方法:
    该方法用于查询用户是否是管理员用户。
    它通过执行SQL查询语句从数据库中检索用户的is_admin字段值,并返回一个布尔值,表示用户是否为管理员。

  5. main 方法:
    main 方法用于启动整个应用程序。
    在SwingUtilities.invokeLater中,创建了一个ShowMain实例,这是应用程序的入口点。
    如果出现异常,会抛出RuntimeException。

总的来说,这段代码实现了一个主页面,根据用户的权限来决定哪些功能按钮可用,点击按钮会打开不同的子页面。这是一个简单的权限管理和导航功能的应用程序。

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 代码 ” 获取,拿来即用。👈👈👈


三、可视化分析

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 代码 ” 获取,拿来即用。👈👈👈

在这里插入图片描述

在这里插入图片描述

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 代码 ” 获取,拿来即用。👈👈👈


  • 31
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米码收割机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值