Java课程设计:基于Java+Swing+MySQL的图书管理系统(内附源码)

news2024/11/26 10:46:53

文章目录

  • 一、项目介绍
  • 二、项目展示
  • 三、源码展示
  • 四、源码获取

一、项目介绍

图书管理系统是一个常见的软件项目,广泛应用于图书馆、学校、企业等需要管理图书资源的场景。该系统通常涵盖图书信息录入、查询、借阅、归还等核心功能,是实现图书资源高效管理的重要工具。

随着信息技术的快速发展,传统纸质图书管理方式已经难以满足现代化管理的需求。图书管理系统的数字化转型成为当前图书馆和相关行业的重要发展方向。通过开发和应用图书管理系统,可以实现图书资源的数字化管理,提高工作效率,增强用户体验。

二、项目展示

登录界面
在这里插入图片描述

首页
请添加图片描述
读者查询
在这里插入图片描述
借阅图书
在这里插入图片描述
图书查询
在这里插入图片描述

三、源码展示

登录界面实现

public class LoginForm extends JFrame {


    private JComboBox comboBox;
    private JLabel title,usernamelab,passwordlab,select;
    private JTextField usernameField;
    private JPasswordField passwordField;
    private JButton submit,updatePwd,regist;
    private UserService service = new UserService();

    public LoginForm() {

        Container container = getContentPane();
        container.setLayout(null);


        submit=new JButton("登录");
        submit.setBounds(20,210,60,20);
        //登录监听
        submit.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                loginByUserAndPwd(e);
            }
        });
        regist=new JButton("注册");
        regist.setBounds(90,210,60,20);
        //跳转到注册界面
        regist.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new RegistForm();
            }
        });

        updatePwd=new JButton("修改密码");
        updatePwd.setBounds(160,210,100,20);
        //更新密码
        updatePwd.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new UpdatePwdForm();
            }
        });


        title=new JLabel("图书管理系统");
        title.setFont(new Font("宋体", Font.PLAIN, 24));
        title.setBounds(70,30,200,25);
        usernamelab=new JLabel("用户名:");
        usernamelab.setFont(new Font("宋体", Font.PLAIN, 16));
        usernamelab.setBounds(50,80,60,20);
        passwordlab=new JLabel("密码:");
        passwordlab.setFont(new Font("宋体", Font.PLAIN, 16));
        passwordlab.setBounds(50,120,60,20);

        usernameField=new JTextField();
        usernameField.setBounds(120,80,130,20);
        passwordField=new JPasswordField();
        passwordField.setEchoChar('*');
        passwordField.setBounds(120,120,130,20);


        container.add(title);
        container.add(usernamelab);container.add(usernameField);
        container.add(passwordlab);container.add(passwordField);
        container.add(submit);container.add(regist);container.add(updatePwd);


        //container.setBackground(Color.RED);
        setTitle("登录");
        setSize(300,300);
        setLocationRelativeTo(null);
        setResizable(false);
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    private void loginByUserAndPwd(ActionEvent e) {
        String username = this.usernameField.getText();
        String password = new String(this.passwordField.getPassword());
        String is_admin="";

        if(StringUtil.isEmpty(username)||StringUtil.isEmpty(password)){
            JOptionPane.showMessageDialog(null,"用户名或密码不能为空");
        }else {
                is_admin="1";//管理员
                User user = service.login(username, password, is_admin);
                if (user!=null){
                    JOptionPane.showMessageDialog(null,"登录成功");
                    dispose();
                    new RootMainForm();
                }else {
                    JOptionPane.showMessageDialog(null,"账号或面错误");
                }
            }
        }

    }

添加图书界面实现

public class AddBookForm extends JFrame {

    private JLabel bookId,bookName,bookType,translator,publishTime,stock,price,publisher,author;
    private JTextField bookIdField,bookNameField,translatorField,stockField,priceField,publisherField,authorField;
    private JButton btn_Add,btn_Cancel;
    private  JComboBox<String> comboBox;
    final JXDatePicker datepick = new JXDatePicker();
     

    public AddBookForm(){
        Container container = getContentPane();
        container.setLayout(null);

        btn_Add=new JButton("保存");
        btn_Add.setBounds(190,310,80,20);
        btn_Cancel=new JButton("取消");
        btn_Cancel.setBounds(320,310,80,20);
        //取消按钮监听
        btn_Cancel.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });
        //添加按钮监听
        btn_Add.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    addBook(e);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        });

        bookId=new JLabel("图书编号");
        bookId.setFont(new Font("宋体", Font.PLAIN, 16));
        bookId.setBounds(50,50,100,20);
        bookType=new JLabel("图书类型");
        bookType.setFont(new Font("宋体", Font.PLAIN, 16));
        bookType.setBounds(50,90,100,20);
        translator=new JLabel("译者");
        translator.setFont(new Font("宋体", Font.PLAIN, 16));
        translator.setBounds(50,130,100,20);
        publishTime=new JLabel("出版时间");
        publishTime.setFont(new Font("宋体", Font.PLAIN, 16));
        publishTime.setBounds(50,170,100,20);
        stock=new JLabel("库存数量");
        stock.setFont(new Font("宋体", Font.PLAIN, 16));
        stock.setBounds(50,210,100,20);
        bookName=new JLabel("图书名称");
        bookName.setFont(new Font("宋体", Font.PLAIN, 16));
        bookName.setBounds(280,50,100,20);
        author=new JLabel("作者");
        author.setFont(new Font("宋体", Font.PLAIN, 16));
        author.setBounds(280,90,100,20);
        publisher=new JLabel("出版社");
        publisher.setFont(new Font("宋体", Font.PLAIN, 16));
        publisher.setBounds(280,130,100,20);
        price=new JLabel("定价");
        price.setFont(new Font("宋体", Font.PLAIN, 16));
        price.setBounds(280,170,100,20);

        bookIdField=new JTextField();
        bookIdField.setColumns(10);
        bookIdField.setBounds(120,50,130,20);
        String[] ty=new String[]{"文学","理学"};
        comboBox = new JComboBox<>(ty);
        comboBox.setBounds(120,90,130,20);
        translatorField=new JTextField();
        translatorField.setColumns(10);
        translatorField.setBounds(120,130,130,20);
        Date date = new Date();
        // 设置 date日期
        datepick.setDate(date);
        datepick.setBounds(120,170,130,20);

        stockField=new JTextField();
        stockField.setColumns(10);
        stockField.setBounds(120,210,130,20);
        bookNameField=new JTextField();
        bookNameField.setColumns(10);
        bookNameField.setBounds(360,50,130,20);
        authorField=new JTextField();
        authorField.setColumns(10);
        authorField.setBounds(360,90,130,20);
        publisherField=new JTextField();
        publisherField.setColumns(10);
        publisherField.setBounds(360,130,130,20);
        priceField=new JTextField();
        priceField.setColumns(10);
        priceField.setBounds(360,170,130,20);

        container.add(bookId);container.add(bookIdField);
        container.add(bookName);container.add(bookNameField);
        container.add(bookType);container.add(comboBox);
        container.add(author);container.add(authorField);
        container.add(translator);container.add(translatorField);
        container.add(publisher);container.add(publisherField);
        container.add(publishTime);container.add(datepick);
        container.add(price);container.add(priceField);
        container.add(stock);container.add(stockField);
        container.add(btn_Add);container.add(btn_Cancel);


        setTitle("添加图书");
        setSize(600,400);
        setLocationRelativeTo(null);
        setResizable(false);
        setVisible(true);
        //setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }


    private void addBook(ActionEvent e) throws Exception {
        String bookId = this.bookIdField.getText();
        String bookname = this.bookNameField.getText();
        String booktype = (String) this.comboBox.getSelectedItem();
        String author = this.authorField.getText();
        String translator = this.translatorField.getText();
        String publisher = this.publisherField.getText();
        Date date = this.datepick.getDate();
        java.sql.Date publishtime = new java.sql.Date(date.getTime());

        float price = Float.parseFloat(this.priceField.getText());
        int stock = Integer.parseInt(this.stockField.getText());
        Book book = new Book(bookId, bookname, booktype, author, translator, publisher, publishtime, price, stock);
        BookService bookService = new BookService();
        int i=bookService.addBook(book);
        if (i>0){
            JOptionPane.showMessageDialog(null,"添加成功");
            dispose();
        }else {
            JOptionPane.showMessageDialog(null,"添加失败");
        }
    }

借阅图书实现

public class BorrowBookForm extends JFrame {
    private JLabel bookId,readerId,bookName,publisher,price,author,publishTime,stock
            ,readerName,readerType,max_num,days_num
            ,borrowNum,isBorrow,borrowDate
            ,readerInfo,borrowInfo,bookInfo;
    private JTextField bookIdField,readerIdField,bookNameField,authorField,publisherField,publishTimeField,priceField,stockField
            ,readerNameField,readerTypeField,max_numField,days_numField
            ,borrowNumField,isBorrowField;
    private JButton btn_Check,btn_Borrow,btn_Close;
    private BorrowService borrowService=new BorrowService();
    private ReaderService readerService=new ReaderService();
    final JXDatePicker datepick1,datepick2;

    public BorrowBookForm() {
        Container container = getContentPane();
        container.setLayout(null);

        btn_Check=new JButton("查询");
        btn_Check.setBounds(450,20,60,20);
        btn_Borrow=new JButton("借出");
        btn_Borrow.setBounds(200,410,60,20);
        btn_Close=new JButton("关闭");
        btn_Close.setBounds(300,410,60,20);
        btn_Close.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });
        btn_Check.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                checkReaderIdAndBookId(e);
            }
        });
        btn_Borrow.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                borrowBook(e);
            }
        });

        bookId=new JLabel("图书编号");
        bookId.setFont(new Font("宋体", Font.PLAIN, 16));
        bookId.setBounds(50,20,100,20);
        readerId=new JLabel("读者编号");
        readerId.setFont(new Font("宋体", Font.PLAIN, 16));
        readerId.setBounds(250,20,100,20);

        bookInfo=new JLabel("--------------------------图书信息--------------------------");
        bookInfo.setFont(new Font("宋体", Font.PLAIN, 16));
        bookInfo.setBounds(50,55,500,20);
        bookName=new JLabel("图书名称:");
        bookName.setFont(new Font("宋体", Font.PLAIN, 16));
        bookName.setBounds(50,80,100,20);
        author=new JLabel("作者:");
        author.setFont(new Font("宋体", Font.PLAIN, 16));
        author.setBounds(350,80,100,20);
        publisher=new JLabel("出版社:");
        publisher.setFont(new Font("宋体", Font.PLAIN, 16));
        publisher.setBounds(50,110,100,20);
        publishTime=new JLabel("出版时间:");
        publishTime.setFont(new Font("宋体", Font.PLAIN, 16));;
        publishTime.setBounds(350,110,100,20);
        price=new JLabel("订价:");
        price.setFont(new Font("宋体", Font.PLAIN, 16));
        price.setBounds(50,140,100,20);
        stock=new JLabel("库存量:");
        stock.setFont(new Font("宋体", Font.PLAIN, 16));
        stock.setBounds(350,140,100,20);

        readerInfo=new JLabel("--------------------------读者信息--------------------------");
        readerInfo.setFont(new Font("宋体", Font.PLAIN, 16));
        readerInfo.setBounds(50,170,500,20);
        readerName=new JLabel("读者姓名:");
        readerName.setFont(new Font("宋体", Font.PLAIN, 16));
        readerName.setBounds(50,195,100,20);
        readerType=new JLabel("读者类型:");
        readerType.setFont(new Font("宋体", Font.PLAIN, 16));
        readerType.setBounds(350,195,100,20);
        max_num=new JLabel("最大可借数:");
        max_num.setFont(new Font("宋体", Font.PLAIN, 16));
        max_num.setBounds(50,220,100,20);
        days_num=new JLabel("最大可借天数:");
        days_num.setFont(new Font("宋体", Font.PLAIN, 16));
        days_num.setBounds(350,220,130,20);
        borrowInfo=new JLabel("--------------------------借阅信息--------------------------");
        borrowInfo.setFont(new Font("宋体", Font.PLAIN, 16));
        borrowInfo.setBounds(50,250,500,20);

        /**
         * 文本框
         */
        bookIdField=new JTextField();
        bookIdField.setBounds(120,20,100,20);
        readerIdField=new JTextField();
        readerIdField.setBounds(320,20,100,20);
        bookNameField=new JTextField();
        bookNameField.setEditable(false);
        bookNameField.setBounds(140,80,100,20);
        authorField=new JTextField();
        authorField.setEditable(false);
        authorField.setBounds(430,80,100,20);
        publisherField=new JTextField();
        publisherField.setEditable(false);
        publisherField.setBounds(140,110,100,20);
        //出版时间
        Date date = new Date();
        // 设置 date日期
        datepick1= new JXDatePicker();
        datepick1.setDate(date);
        datepick1.setEditable(false);
        datepick1.setBounds(430,110,100,20);

        priceField=new JTextField();
        priceField.setEditable(false);
        priceField.setBounds(140,140,110,20);
        stockField=new JTextField();
        stockField.setEditable(false);
        stockField.setBounds(430,140,100,20);
        readerNameField=new JTextField();
        readerNameField.setEditable(false);
        readerNameField.setBounds(140,195,100,20);
        readerTypeField=new JTextField();
        readerTypeField.setEditable(false);
        readerTypeField.setBounds(430,195,100,20);
        max_numField=new JTextField();
        max_numField.setEditable(false);
        max_numField.setBounds(140,220,100,20);
        days_numField=new JTextField();
        days_numField.setEditable(false);
        days_numField.setBounds(470,220,60,20);
        borrowNumField=new JTextField();
        borrowNumField.setEditable(false);
        borrowNumField.setBounds(210,275,100,20);
        isBorrowField=new JTextField();
        isBorrowField.setEditable(false);
        isBorrowField.setBounds(250,300,100,20);
        //借阅日期
        Date date2 = new Date();
        // 设置 date日期
        datepick2= new JXDatePicker();
        datepick2.setDate(date2);
        datepick2.setBounds(140,325,100,20);

        /**
         * 借阅者文本框
         */
        borrowNum=new JLabel("该读书已借图书数量:");
        borrowNum.setFont(new Font("宋体", Font.PLAIN, 16));
        borrowNum.setBounds(50,275,200,20);
        isBorrow=new JLabel("该读者是否可借所选图书:");
        isBorrow.setFont(new Font("宋体", Font.PLAIN, 16));
        isBorrow.setBounds(50,300,200,20);
        borrowDate=new JLabel("借阅日期:");
        borrowDate.setFont(new Font("宋体", Font.PLAIN, 16));
        borrowDate.setBounds(50,325,100,20);


        /**
         * 添加到容器
         */
        container.add(bookId);container.add(bookIdField);
        container.add(readerId);container.add(readerIdField);
        container.add(btn_Check);
        container.add(bookInfo);
        container.add(bookName);container.add(bookNameField);
        container.add(author);container.add(authorField);
        container.add(publisher);container.add(publisherField);
        container.add(publishTime);container.add(datepick1);
        container.add(price);container.add(priceField);
        container.add(stock);container.add(stockField);
        container.add(readerInfo);
        container.add(readerName);container.add(readerNameField);
        container.add(readerType);container.add(readerTypeField);
        container.add(max_num);container.add(max_numField);
        container.add(days_num);container.add(days_numField);
        container.add(borrowInfo);
        container.add(borrowNum);container.add(borrowNumField);
        container.add(isBorrow);container.add(isBorrowField);
        container.add(borrowDate);container.add(datepick2);
        container.add(btn_Borrow);container.add(btn_Close);

        setTitle("借阅图书");
        setSize(600,500);
        setLocationRelativeTo(null);
        setResizable(false);
        setVisible(true);
        //setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    private void borrowBook(ActionEvent e) {
        //获取图书字段
        String bookId = bookIdField.getText();
        //获取库存量
        int stock = Integer.parseInt(this.stockField.getText());
        //获取已借数量
        int outloan = Integer.parseInt(borrowNumField.getText());
        //获取最大可借数
        int maxnum= Integer.parseInt(max_numField.getText());
        //获取读者id
        int readerId = Integer.parseInt(readerIdField.getText());
        //获取天数
        int daysNum = Integer.parseInt(days_numField.getText());
        //获取当前日期
        Date date = this.datepick2.getDate();
        java.sql.Date borrowDate = new java.sql.Date(date.getTime());
        //指定归还日期
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, daysNum);
        Date newDate = cal.getTime();
        //设置借书和还书的标识
        String if_back="";
        Borrow borrow=borrowService.findBorrowById(readerId, bookId);
        System.out.println(borrow);
        if (borrow==null){
            if_back="1";
            Borrow borrowAdd = new Borrow(bookId,readerId,borrowDate,new java.sql.Date(newDate.getTime()),if_back);
            int i=borrowService.addBorrowDate(borrowAdd);
            if (i>0){
                //每次借阅+1;
                outloan++;
                //最大可借数-1;
                maxnum--;
                //库存-1
                stock--;
                if (stock<=0){
                    this.btn_Borrow.setEnabled(false);
                }else {
                    BookService bookService = new BookService();
                    Book book = new Book(bookId,stock,outloan);
                    Reader reader = new Reader(readerId,maxnum);
                    ReaderService readerService = new ReaderService();
                    //更新读者可借的最大数量
                    int i2 = readerService.updateReaderMaxnum(reader);
                    //更新库存量和已借数量
                    int i1 = bookService.updateBookStockAndOutloan(book);
                    borrowService.addBookandRead(bookId,readerId);
                    if (i1>0&&i2>0){
                        //更新后设置库存文本框
                        stockField.setText(String.valueOf(book.getStock()));
                        borrowNumField.setText(String.valueOf(book.getOutloan()));
                        max_numField.setText(String.valueOf(reader.getMax_num()));
                        JOptionPane.showMessageDialog(null,"借出成功");
                        dispose();
                    }
                }
            }else {
                JOptionPane.showMessageDialog(null,"借出失败");
            }
        }
    }

    //连表查询图书和读者信息
    private void checkReaderIdAndBookId(ActionEvent e) {
        String bookId = bookIdField.getText();
        int readerId = Integer.parseInt(readerIdField.getText());
        //System.out.println(readerId);
        ReaderBorrowBook rbb=borrowService.findBorrowBybookIdAndreaderId(bookId,readerId);
        //System.out.println(rbb);
        if (rbb!=null){
            bookNameField.setText(rbb.getBookname());//书名
            authorField.setText(rbb.getAuthor());//作者
            publisherField.setText(rbb.getPublisher());//出版社
            datepick1.setDate(rbb.getPublish_time());//出版日期
            priceField.setText(String.valueOf(rbb.getPricce()));//价格
            stockField.setText(String.valueOf(rbb.getStock()));//库存
            readerNameField.setText(rbb.getReadername());//读者名
            readerTypeField.setText(rbb.getReadertype());//读者类型
            max_numField.setText(String.valueOf(rbb.getMax_num()));//最大借书量
            days_numField.setText(String.valueOf(rbb.getDays_num()));//最大借书天数
            borrowNumField.setText(String.valueOf(rbb.getOutloan()));//已借书数量
            Borrow borrow=borrowService.findBorrowById(readerId, bookId);

            System.out.println(borrow);
            if (rbb.getMax_num()<=0){
                isBorrowField.setText("无法再借图书");
                //不能点击借书按钮
                btn_Borrow.setEnabled(false);
            }else {
                //可以点击借书按钮
                btn_Borrow.setEnabled(true);
            }
            if (borrow==null){
                    isBorrowField.setText("是");
                    btn_Borrow.setEnabled(true);
            }else {
                //判读是1还是0,从而判断是否被借还是归还
                if (borrow.getIf_back().equals("1")){
                    isBorrowField.setText("否");
                    datepick2.setDate(borrow.getBorrowDate());
                    btn_Borrow.setEnabled(false);
                }else if (borrow.getIf_back().equals("0")){
                    isBorrowField.setText("是");
                    btn_Borrow.setEnabled(true);
                }
            }
        }
    }
}

四、源码获取

源码已经打包了,点击下面蓝色链接获取!

点我获取源码

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

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

相关文章

coap:使用californium建立coap server和client的简单示例

【pom.xml】 <dependency><groupId>org.eclipse.californium</groupId><artifactId>californium-core</artifactId><version>2.0.0-M7</version> </dependency> <dependency><groupId>org.eclipse.californium&l…

元宇宙3D虚拟代言人凸显企业形象和品牌风格

在虚拟社交的新时代浪潮中&#xff0c;拥有一个个性鲜明的AI数字人形象&#xff0c;无疑能让你在虚拟的海洋中独领风骚。深圳华锐视点作为你的数字形象创造的合作伙伴&#xff0c;为你呈现了一个丰富多彩的素材库与高度灵活的编辑工具。在这里&#xff0c;你可以依据个人喜好和…

爆款AI工具大盘点:最强文本、视频、音乐生成AI,适用岗位全解析!

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

内存管理--3.用幻灯片讲解C++手动内存管理

用幻灯片讲解C手动内存管理 1.栈内存的基本元素 2.栈内存的聚合对象 3.手动分配内存和释放内存 注意&#xff1a;手动分配内存&#xff0c;指的是在堆内存中。 除非实现自己的数据结构&#xff0c;否则永远不要手动分配内存! 即使这样&#xff0c;您也应该通过std::allocator…

Redis 配置及操作整理

本篇文章介绍了Redis在window中如何安装和修改配置及Redis几种数据类型及操作命令。 目录 window环境安装 修改配置 设置密码 设置最大内存大小 其他参数介绍 启动服务 使用客户端 客户端连接 验证密码 Redis数据类型 String 设置 运算 其它 Hash 设置 获取 …

文件操作学不懂,小代老师带你深入理解文件操作(上卷)

文件操作学不懂&#xff0c;小代老师带你深入理解文件操作上卷 1. 为什么使用⽂件&#xff1f;2. 什么是⽂件&#xff1f;2.1 程序⽂件2.2 数据⽂件2.3 文件名 3. 二进制文件和文本文件&#xff1f; 1. 为什么使用⽂件&#xff1f; 如果没有⽂件&#xff0c;我们写的程序的数据…

旋转方块加载动画

效果图: 完整代码: <!DOCTYPE html> <html> <head><meta charset="UTF-8" /><title>旋转方块加载动画</title><style type="text/css">body {background: #ECF0F1;display: flex;justify-content: center;al…

java自学阶段二:JavaWeb开发50(Spring和Springboot学习)

Spring、Springboot基础知识学习 目录 学习目标Spring基础概念IOC控制反转DI依赖注入事务管理AOP面向切面编程Spring案例说明&#xff08;Postman使用、Restful开发规范、lombok、Restful、nginx了解&#xff09; 一&#xff1a;学习目标&#xff1a; 1&#xff09;了解Sprin…

如何基于 Elasticsearch 实现排序沉底或前置

在搜索场景的应用中&#xff0c;存在希望根据某个或某些字段来调整排序评分&#xff0c;从而实现排序沉底或置顶效果的使用需求。以商机管理中的扫街场景为例&#xff0c;当我们在扫街场景中需要寻找一个商户时&#xff0c;希望这个商户离的近、GMV 潜力大、被他人跟进过的次数…

前端计网面试题(二)

一、在浏览器中输入url并且按下回车之后发生了什么&#xff1f; 首先解析url&#xff0c;判断url是否合法&#xff0c;如果合法再判断是否完整。如果不合法&#xff0c;则使用用户默认的搜索引擎进行搜索。DNS域名解析获取URL对应的ip地址。&#xff08;首先看本地是否有缓存&…

【干货】SaaS出海业务必看的五个海外流量渠道

一、Product Hunt 月访客约500万 Product Hunt拥有巨大的用户流量和影响力&#xff0c;其全球Alexa排名在前四千以内。许多知名的产品&#xff0c;如ChatGPT、Notion等&#xff0c;都在这里成功上线并获得广泛关注。在美国有什么新产品&#xff08;不论网站、APP还是插件&…

ThinkPHP+Bootstrap简约自适应网址导航网站源码

使用 ThinkPHPbootstrap 开发&#xff0c;后台采用全局 ajax 无刷新加载&#xff0c;前后台自适应&#xff0c;前台页面非常简洁适合自己收藏网站或做导航网站。 搭建教程&#xff1a; 1.整个主机 2.绑定解析域名 3.上传源码&#xff0c;解压 把解压出来的 nav.sql 文件导入数…

25.入口点注入

钩子注入是利用SetWindowsHookEx函数这是一个被动的注入方式&#xff0c;入口点注入是一个主动注入&#xff0c;就是做这件事什么都不为就是为了注入&#xff0c;入口点注入有很多优势比如说做一个游戏的多开器&#xff0c;多开的检测事情是在游戏一启动的时候完成的&#xff0…

两种典型的嵌入式系统架构模式

大多数嵌入式系统都具备实时特征&#xff0c;那么&#xff0c;这种嵌入式系统的典型架构可概括为两种模式&#xff0c;即层次化模式架构和递归模式架构。 1.层次化模式架构 为了达到概念一致性&#xff0c;许多系统通过层次化的方法进行搭建。这样做的结果是&#xff1a;位于高…

Offline : How to Leverage Diverse Demonstrations in Offline Imitation Learning

ICML 2024 paper code Intro 文章提出一种从混合质量数据中高效抽取有用状态动作数据用于模仿学习。算法基于一种假设&#xff0c;即使当前状态并非属于专家状态&#xff0c;但是若在该状态下采取动作导致下一状态是专家状态&#xff0c;那么该状态相较于随机状态更有价值。 …

【漏洞复现】海洋CMS /js/player/dmplayer/dmku/ SQL注入漏洞复现(CVE-2024-29275)

0x01 产品简介 海洋CMS是一套专为不同需求的站长而设计的内容管理系统&#xff0c;灵活、方便、人性化设计、内容的专业网站。海洋CMS基于PHPMySql技术开发&#xff0c;完全开源免费、无任何加密代码。简单易用是最大的特色&#xff0c;可快速建立一个海量 0x02 漏洞概述 海…

Redis高并发高可用

1. 复制机制 在分布式系统中&#xff0c;为了解决单点问题&#xff0c;通常会将数据复制多个副本部署到其他机器&#xff0c;以满足故障恢复和负载均衡等需求。Redis提供了复制功能&#xff0c;实现了相同数据的多个Redis副本。复制功能是高可用Redis的基础&#xff0c;后面的…

1224 - 过河卒

题目描述 AA 点有一个过河卒&#xff0c;需要走到目标 BB 点。 卒行走规则&#xff1a;可以向下、或者向右。同时在棋盘上的任一点有一个对方的马&#xff08;如下图的 CC 点&#xff09;&#xff0c;该马所在的点和所有跳跃一步可达的点称为对方马的控制点。 例如&#xff…

LabVIEW RT环境中因字符串拼接导致的系统崩溃问题

在LabVIEW实时操作系统&#xff08;RT&#xff09;环境中运行的应用程序出现字符串拼接后死机的问题&#xff0c;通常涉及内存管理、内存泄漏或其他资源管理问题。以下是一些指导和步骤&#xff0c;帮助解决这个问题&#xff1a; 1. 内存泄漏检测 字符串拼接会在内存中创建新…

Could not resolve dependencies for project XXX

大家好&#xff0c;这里是教授.F 如果项目上使用的是idea ide的多模块话&#xff0c;需要模块之间的依赖&#xff0c;比如说系统管理模块依赖授权模块进行认证和授权&#xff0c;而认证授权模块需要依赖系统管理模块进行&#xff0c;然后&#xff0c;就开始相互依赖&#xff0…