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

news2025/1/23 1:05:49

请添加图片描述


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


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


目录

  • 【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。

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

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


三、可视化分析

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1978211.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python rsa如何安装

Python中的一些模块是用一个包管理器来发布的,RSA模块就是,所以首先需要安装setup tools工具。 1、下载文件:ez_setup.py 2、安装: sudo python ez_setup.py 3、下载RSA安装包:rsa-3.1.1-py2.7.egg 4、安装RSA&…

牛客JS题(二十一)数组扁平化

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; 递归flat字符串操作正则表达式替换 题干&#xff1a; 我的答案 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /></head><body><script&…

Dubbo源码深度解析(中)

接着《Dubbo源码深度解析(上)》继续讲&#xff0c;上篇博客主要讲Dubbo提供的三个注解的作用&#xff0c;即&#xff1a;EnableDubbo、DubboComponentScan、EnableDubboConfig。其中后两个注解是在EnableDubbo上的&#xff0c;因此在启动类上加上EnableDubbo注解&#xff0c;等…

数据分析模型:洞察数据背后的奥秘

数据分析模型&#xff1a;洞察数据背后的奥秘 事件分析模型通过对用户行为事件的深入剖析&#xff0c;能够了解用户在产品上的具体行为&#xff0c;为产品优化和营销策略提供了有力依据。漏斗分析模型则专注于用户转化流程&#xff0c;帮助找出业务流程中的薄弱环节&#xff0c…

[Meachines] [Easy] Sense PFSense防火墙RCE

信息收集 IP AddressOpening Ports10.10.10.60TCP:80,443 $ nmap -p- 10.10.10.60 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 80/tcp open http lighttpd 1.4.35 |_http-title: Did not follow redirect to https://10.10.10.60/ |_http-server-header…

zlm-openRtpServer使用

http://127.0.0.1/index/api/openRtpServer?port50253&tcp_mode1&stream_idtest123&secretLSAjqhPDsC0IcL27hI6U8heTxgnTlZlW使用getRtpInfo查看这个流的情况&#xff0c;注意只有这个端口在接受流的时候&#xff0c;才会返回数据 http://127.0.0.1/index/api/ge…

【文献阅读】TAM: Topology-Aware Margin Loss for Class-Imbalanced Node Classification

Abstract 在类别不平衡的图数据中学习无偏的节点表示是一项具有挑战性的任务&#xff0c;因为相邻节点之间存在相互作用。现有研究的共同点在于&#xff0c;它们根据少数类节点的总体数量“作为一个整体”进行补偿&#xff08;忽略了图中的节点连接&#xff09;&#xff0c;这…

理解<共轭复数乘法,复数乘法,复数除法>

目录 复数乘法共轭复数乘法的理解复数除法 复数乘法 共轭复数乘法的理解 共轭复数乘法&#xff1a;可以理解为滤波&#xff0c;计算两序列的相关。即一个序列固定&#xff0c;另一个序列进行滑动计算该点的累积和。因为傅里叶变换的卷积定理&#xff0c;时域卷积对于频域相乘。…

web漏洞-知识点详解

先放张图&#xff01;右边漏洞比左边漏洞更重要&#xff01;右边漏洞更多&#xff01;重点讲述右边漏洞&#xff01; sql注入 危害情况&#xff1a;可以获取网站数据库中的数据&#xff0c;如果数据中有敏感信息&#xff0c;比如管理员账号密码&#xff0c;就可以登录后台 漏…

学生管理系统之更新和删除、筛选

学生管理系统之更新和删除 建立新的窗口 添加组件 进行布局 使用Widget把二个放在一块,作为一列,然后全选进行栅格布局,最后添加弹簧进行微调。 编写增加的槽函数 在主函数中调用对话框

CC++内存魔术:掌控无形资源

hello,uu们,今天呢我们来详细讲解C&C的内存管理,好啦,废话不多讲,开干 1:C/C内存分布 2:C语言中动态内存管理方式:malloc/calloc/realloc/free 3:C内存管理方式 3.1:new/delete操作内置类型 3.1.1:代码1 3.1.2:代码2 3.2:new和delete操作自定义类型 3.2.1:C语言创建…

初识增强现实(AR)

初识增强现实&#xff08;AR&#xff09; 笔记来源&#xff1a; 1.2023年中国增强现实&#xff08;AR&#xff09;行业研究报告 2.wiki/Augmented reality 3.In-Depth Review of Augmented Reality: Tracking Technologies, Development Tools, AR Displays, Collaborative AR…

js第二天

比较运算符 ==左右两边值是否相等 ===左右两边值和类型是否全相等 !==左右两边是否类型和值全不相等 undefin === null NaN === NaN(错误,NaN不等于任何值) =单等是赋值 ==双等是判断 ===三等是全等,开发中判断是否相等,一般用全等。 console.log 先比较a和a,相…

电脑添加虚拟网卡与ensp互联,互访

一、按照过程 1、打开设备管理器 2、点击网络适配器&#xff0c;点击左上角操作&#xff0c;点击“添加过时硬件” 3、下一页 4、选择“安装我手动从列表选择的硬件”&#xff0c;下一页 5、下拉&#xff0c;选择“网络适配器”&#xff0c;下一页 6、厂商选择“Microsoft”&…

基于MFC对话框吸管实验

1.新建项目 2.将bmp图像放入res文件下 3.导入bmp文件到bitmap 4.在dlg中添加picture控件&#xff0c;修改控件属性&#xff08;Type Image属性&#xff09;&#xff0c;把bitmap资源添加到控件中 5.重写鼠标单击鼠标中键响应事件 6.主要源代码 void CMFC吸管Dlg::OnMButtonDow…

使用Springboot + netty 打造聊天服务之Nacos集群问题记录

目录 1、前言1.1、方法一1.2、方法二 2、方案二实战2.1、在netty服务里加上ws连接、中断事件2.2、在netty服务里加上消息服务 4、总结 使用Springboot netty 打造聊天服务系列文章 第一章 初始搭建工程 第二章 Nacos集群问题记录 1、前言 在使用Springboot Nacos Netty(Web…

SAPUI5基础知识23 - 模型的种类(小结)

1. 背景 在前序的学习中&#xff0c;我们学习了SAPUI5的MVC架构中的各个知识点&#xff0c;包括视图的设计&#xff0c;控制器的设计&#xff0c;以及模型的使用。 在企业级应用程序中&#xff0c;对于数据的处理的需求是很大的&#xff0c;在学习更复杂的数据绑定方式之前&a…

Pr2024苹果(mac)版剪辑软件安装下载(附下载链接)

Adobe Premiere Pro 2024&#xff08;简称PR 2024&#xff09;是一款由Adobe公司开发的专业视频编辑软件&#xff0c;被广泛应用于电影、电视、广告和社交媒体视频的制作。以下是对PR 2024的详细简介&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rN-3kB3KQgn0JswDa…

《学会 SpringMVC 系列 · 剖析初始化》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

win10系统资源监视器磁盘蓝黄线、活动时间代表什么意思?

win10系统资源监视器磁盘蓝黄线、活动时间代表什么意思&#xff1f;在win10系统中磁盘在运行工程中会有不同的数据信息显示&#xff0c;如下图所示&#xff0c;10兆字节/秒、磁盘中蓝线和黄线、活动时间都达标什么意思呢&#xff1f;本文中winwin7小编给大家分享介绍下win10系统…