当前位置: 首页 > news >正文

【JavaSE】小练习 —— 图书管理系统

【JavaSE】JavaSE小练习 —— 图书管理系统

  • 一、系统功能
  • 二、涉及的知识点
  • 三、业务逻辑
  • 四、代码实现
    • 4.1 book 包
    • 4.2 user 包
    • 4.3 Main 类
    • 4.4 完善管理员菜单和普通用户菜单
    • 4.5 接着4.4的管理员菜单和普通用户菜单,进行操作选择(1查找图书、2借阅图书.....)
    • 4.6 operation 包
    • 4.7 剩下的操作应该也按照此流程,那怎么实现分类呢(把5个操作分给管理员,4个操作分给普通用户)?
    • 4.8 管理员的操作写完了,接下来是普通用户的操作:
    • 4.9 接下来实现具体业务:
      • 4.9.1 普通用户的具体业务实现 :
      • 4.9.2 管理员的具体业务实现 :新增图书、删除图书、显示图书

一、系统功能

  1. 输入用户名
  2. 是以什么身份登录(普通用户 or 管理员)
  3. 普通用户选项菜单 && 管理员选项菜单
  4. 功能实现(普通用户和管理员菜单可操作的功能有所不同)
     4.1 查找图书(普通用户 和 管理员)
     4.2 新增图书(管理员)
     4.3 删除图书(管理员)
     4.4 显示图书(普通用户 和 管理员)
     4.5 退出系统(普通用户 和 管理员)
     4.6 借阅图书 (普通用户 )
     4.7 归还图书(普通用户 )
  5. 隐藏功能(就是背地里完成的功能)
     5.1 存储数的信息
     5.2 书不止一本,所以该怎么存储?
     5.3 业务功能,就是说别人还书,借书的指引,或者提示什么的。

二、涉及的知识点

  1. 基础语法:数据类型、数组、方法
  2. 类和对象
  3. 继承和多态
  4. 抽象类和接口

三、业务逻辑

  1. 找对象 --> 创建对象 --> 使用对象
  2. 抽象出来的对象:
    书 / 书架
    用户 :分为管理员 / 普通用户
  3. 这些操作,需要分类:
    哪些是管理员的?哪些是普通用户的?
    怎么分类?

四、代码实现

4.1 book 包

在这里插入图片描述

  • Book类

在这个类实现的是我们图书该有的属性,与相应的构造方法,以及为了方便我们打印而重写的toString方法。

package book;

//书籍对象
public class Book {
    private String name;//书籍名称
    private String author;//作者
    private int price;//书籍价格
    private String type;//类型
    private boolean isBorrowed;//是否被借出

//构造方法: 除了isBorrowed,new一本书籍,默认书未被借出 -- boolean类型,未被初始化,默认是false
    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }

    //因为前面的成员变量是private,需要提供get()和set()方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public boolean isBorrowed() {
        return isBorrowed;
    }

    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }


    //toString()方法
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ", isBorrowed=" + isBorrowed +
                '}';
    }
}

  1. BookList类

这里我们需要实现的有可以存放很多Book的数组,可以与增加、删除等功能的对应方法。

package book;
//书架

public class BookList {
    private Book[] books;//存放书籍
    private static final int DEFAULT_SIZE = 10;

    private int usedSize;//书架上 原有有效书籍的个数

    public BookList() {
        this.books = new Book[DEFAULT_SIZE];
    }

    public int getUsedSize() {
        return usedSize;
    }

    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }

    //还有待补充的.....
}

4.2 user 包

user 用户的意思,无论是管理员,还是普通用户,都是用户。那么就意味着两者具有共性,我们将其提取出来。
在这里插入图片描述

  • User 类
package user;

public abstract class User {
    public String name;

    public User(String name) {
        this.name = name;
    }

    public abstract void menu();//普通用户 或者 管理员,可以重写菜单
    //可先不实现,所以写成 抽象类
}

  • NormalUser 类
package user;

public class NormalUser extends User{

    public NormalUser(String name) {
        super(name);
    }

    @Override
    public void menu() {
        System.out.println("普通用户菜单.....");
    }
}

  • AdminUser 类
package user;

public class AdminUser extends User{

    public AdminUser(String name) {
        super(name);
    }

    @Override
    public void menu() {
        System.out.println("管理员菜单....");
    }
}

4.3 Main 类

import user.AdminUser;
import user.NormalUser;
import user.User;

import java.util.Scanner;

public class Main {
    public static User login(){//运行的时候 登录
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入姓名:");
        String name = scanner.nextLine();

        System.out.println("请输入你的身份:1.管理员 2.普通用户");
        int choice = scanner.nextInt();

        if(choice == 1){
            return new AdminUser(name);
        }else{
            return new NormalUser(name);
        }//向上转型

    }
    public static void main(String[] args) {
        User user = login();
        user.menu();

    }
}

运行Main:

输入1,管理员菜单;输入2,普通用户菜单。

在这里插入图片描述

总结:
(1)向上转型
在这里插入图片描述
(2)动态绑定
在这里插入图片描述

4.4 完善管理员菜单和普通用户菜单

//管理员菜单
package user;

public class AdminUser extends User{

    public AdminUser(String name) {
        super(name);
    }

    @Override
    public void menu() {
        System.out.println(" 欢迎 "+ this.name+" 来到图书管理系统!");
        System.out.println("**********管理员菜单**********");

        System.out.println("1: 查找图书");
        System.out.println("2: 新增图书");
        System.out.println("3: 删除图书");
        System.out.println("4: 显示图书");
        System.out.println("0: 退出系统");
        System.out.println("*****************************");

        System.out.println("请输入你的操作:");
    }
}
//普通用户菜单
package user;

public class NormalUser extends User{

    public NormalUser(String name) {
        super(name);
    }

    @Override
    public void menu() {
        System.out.println(" 欢迎"+ this.name+" 来到图书管理系统!");
        System.out.println("**********普通用户菜单**********");

        System.out.println("1: 查找图书");
        System.out.println("2: 借阅图书");
        System.out.println("3: 归还图书");
        System.out.println("0: 退出系统");
        System.out.println("*****************************");

        System.out.println("请输入你的操作:");

    }
}

运行Main:

输入1,管理员菜单;输入2,普通用户菜单。

在这里插入图片描述

4.5 接着4.4的管理员菜单和普通用户菜单,进行操作选择(1查找图书、2借阅图书…)

  • AdminUser 类
package user;

import java.util.Scanner;

public class AdminUser extends User{

    public AdminUser(String name) {
        super(name);
    }

    @Override
    public int menu() {
        System.out.println(" 欢迎 "+ this.name+" 来到图书管理系统!");
        System.out.println("**********管理员菜单**********");

        System.out.println("1: 查找图书");
        System.out.println("2: 新增图书");
        System.out.println("3: 删除图书");
        System.out.println("4: 显示图书");
        System.out.println("0: 退出系统");
        System.out.println("*****************************");

        System.out.println("请输入你的操作:");
        
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}

  • NormalUser 类
package user;

import operation.IOperation;

import java.util.Scanner;

public class NormalUser extends User{

    public NormalUser(String name) {
        super(name);
        this.iOperations = new IOperation[]{

        };
    }

    @Override
    public int menu() {
        System.out.println(" 欢迎"+ this.name+" 来到图书管理系统!");
        System.out.println("**********普通用户菜单**********");

        System.out.println("1: 查找图书");
        System.out.println("2: 借阅图书");
        System.out.println("3: 归还图书");
        System.out.println("0: 退出系统");
        System.out.println("*****************************");

        System.out.println("请输入你的操作:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;

    }
}

  • User 类
package user;

public abstract class User {
    public String name;

    public User(String name) {
        this.name = name;
    }

    public abstract int menu();//普通用户 或者 管理员,可以重写菜单
    //可先不实现,所以写成 抽象类
}

  • Main类
import user.AdminUser;
import user.NormalUser;
import user.User;

import java.util.Scanner;

public class Main {
    public static User login(){//运行的时候 登录
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入姓名:");
        String name = scanner.nextLine();

        System.out.println("请输入你的身份:1.管理员 2.普通用户");
        int choice = scanner.nextInt();

        if(choice == 1){
            return new AdminUser(name);
        }else{
            return new NormalUser(name);
        }//向上转型

    }
    public static void main(String[] args) {
        User user = login();
        int choice = user.menu();
    }
}

4.6 operation 包

在这里插入图片描述

  • FindBook
package operation;

import book.Book;

public class FindBook {
    @Override
    public void work(Book[] books) {
        System.out.println("查找图书.....");
    }
}

  • AddBook
package operation;

import book.Book;

public class AddBook {
    @Override
    public void work(Book[] books) {
        System.out.println("新增图书.....");
    }
}

4.7 剩下的操作应该也按照此流程,那怎么实现分类呢(把5个操作分给管理员,4个操作分给普通用户)?

这些操作放在一起,需要一个统一类型的数组 – (接口)。

  • IOPeration接口
package operation;

import book.Book;

public interface IOperation {
    void work(Book[] books);
}

所以上面的操作需要继承IOperation接口,重写work()方法

  • 修改后的FindBook
package operation;

import book.Book;

public class FindBook implements IOperation{
    @Override
    public void work(Book[] books) {
        System.out.println("查找图书.....");
    }
}

  • 修改后的AddBook
package operation;

import book.Book;

public class FindBook implements IOperation{
    @Override
    public void work(Book[] books) {
        System.out.println("查找图书.....");
    }
}
  • DelBook
package operation;

import book.Book;

public class DelBook implements IOperation{

    @Override
    public void work(Book[] books) {
        System.out.println("删除图书.....");
    }
}
  • ShowBook
package operation;

import book.Book;

public class ShowBook implements IOperation{

    @Override
    public void work(Book[] books) {
        System.out.println("打印图书.....");
    }
}

  • ExitBook
package operation;

import book.Book;

public class ExitBook implements IOperation{

    @Override
    public void work(Book[] books) {
        System.out.println("退出系统......");
    }
}

4.8 管理员的操作写完了,接下来是普通用户的操作:

查找图书和退出系统已经有了,还剩下借阅图书、归还图书操作。

  • BorrowedBook
public class BorrowedBook implements IOperation{

    @Override
    public void work(Book[] books) {
        System.out.println("借阅图书.....");
    }
}

ReturnBook

public class ReturnBook implements IOperation{

    @Override
    public void work(Book[] books) {
        System.out.println("归还图书....");
    }
}

所以的类都实现了IOPeration接口,意味着这个接口可以放 所以类的对象,但是还没有分开管理员和普通用户的操作,那么怎么分开?

给User 类定义成员变量,在这里插入图片描述
因为AdminUser和NormalUser继承了User,只需要在AdminUser和NormalUser 中对IOperation进行指定类型的初始化,就可以将 管理员对应的操作 和 普通用户对应的操作 分开。

  • 修改的User类
public abstract class User {
    public String name;

    public IOperation[] iOperations;//未被初始化

    public User(String name) {
        this.name = name;
    }

    public abstract int menu();
}
  • 修改后的AdminUser类
public class NormalUser extends User{

    public NormalUser(String name) {
        super(name);
        this.iOperations = new IOperation[]{
                new ExitBook(),
                new BorrowedBook(),
                new ReturnBook(),
        };
    }

    @Override
    public int menu() {
        System.out.println(" 欢迎"+ this.name+" 来到图书管理系统!");
        System.out.println("**********普通用户菜单**********");

        System.out.println("1: 查找图书");
        System.out.println("2: 借阅图书");
        System.out.println("3: 归还图书");
        System.out.println("0: 退出系统");
        System.out.println("*****************************");

        System.out.println("请输入你的操作:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;

    }
}

  • 修改后的AdminUser类
public class AdminUser extends User{

    public AdminUser(String name) {
        super(name);
        this.iOperations = new IOperation[]{
            new ExitBook(),
            new FindBook(),
            new AddBook(),
            new DelBook(),
            new ShowBook()
        };
    }

    @Override
    public int menu() {
        System.out.println(" 欢迎 "+ this.name+" 来到图书管理系统!");
        System.out.println("**********管理员菜单**********");

        System.out.println("1: 查找图书");
        System.out.println("2: 新增图书");
        System.out.println("3: 删除图书");
        System.out.println("4: 显示图书");
        System.out.println("0: 退出系统");
        System.out.println("*****************************");

        System.out.println("请输入你的操作:");

        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}

根据choice选择管理员/普通用户对应菜单的选择,即操作IOperation数组:
在User类中定义操作IOperation的方法。
在这里插入图片描述

  • User类
package user;

import book.Book;
import book.BookList;
import operation.IOperation;

public abstract class User {
    public String name;

    public IOperation[] iOperations;//未被初始化

    public User(String name) {
        this.name = name;
    }

    public abstract int menu();

    public void doiOperations(int choice, BookList books){
        //在Normal菜单中选择3,根据choice来
        // 操作NoramlUser的IOperation[]数组
        IOperation iOperation = this.iOperations[choice];
        //向上转型
        iOperation.work(books);
    }
}
  • Main类
import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;
import book.BookList;

import java.util.Scanner;

public class Main {
    public static User login(){//运行的时候 登录
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入姓名:");
        String name = scanner.nextLine();

        System.out.println("请输入你的身份:1.管理员 2.普通用户");
        int choice = scanner.nextInt();

        if(choice == 1){
            return new AdminUser(name);
        }else{
            return new NormalUser(name);
        }//向上转型

    }
    public static void main(String[] args) {

        BookList bookList = new BookList();
        User user = login();
        int choice = user.menu();

        user.doiOperations(choice,bookList);
    }
}

4.9 接下来实现具体业务:

4.9.1 普通用户的具体业务实现 :

查找图书 - > 根据书名查找

  • BookList
package book;
//书架

public class BookList {
    private Book[] books;//存放书籍
    private static final int DEFAULT_SIZE = 10;

    private int usedSize;//书架上 原有有效书籍的个数

    public BookList() {
        this.books = new Book[DEFAULT_SIZE];
        //预先存3本书
        this.books[0] = new Book("三国演义","罗贯中",20,"武侠小说");
        this.books[1] = new Book("西游记","吴承恩",28,"神话小说");
        this.books[2] = new Book("红楼梦","曹雪芹",15,"小说");
        this.usedSize  = 3;
    }

    public int getUsedSize() {
        return usedSize;
    }

    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }

    //还有待补充的.....
    public Book getBook(int pos){//下标pos
        return books[pos];
    }

    public void setBooks(int pos,Book book){
        books[pos] = book;
    }
}

  • FindBook实现
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class FindBook implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书.....");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要查找的图书的名字:");
        String name = scanner.nextLine();

        //查找图书:遍历BookList的books数组,看看每一本书的name和输入的是否一样
        //1.确定当前数组中,有效的书籍个数
        int currentSize = bookList.getUsedSize();

        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                System.out.println("找到这本书籍了,书籍内容如下:");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有你要找的书籍");
    }
}

在这里插入图片描述

  • ExitBook
package operation;

import book.Book;
import book.BookList;

public class ExitBook implements IOperation{

    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统......");
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {//退出系统,需要把指向的对象回收
              //bookList[i] = null;
              bookList.setBooks(i,null);
        }
        bookList.setUsedSize(0);
        System.exit(0);//0表示正常退出
    }
}

  • BorrowedBook
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class BorrowedBook implements IOperation{

    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书.....");
        System.out.println("请输入你要借阅的图书:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();

        //1.先遍历数组 查找是否存在要借阅的图书
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                //2.如果存在 检查 是否已经被借出
                if(book.isBorrowed()){
                    System.out.println("这本书已经被借出了!");
                }else{
                    //3.如果不存在 则不能借阅
                    book.setBorrowed(true);
                    System.out.println(book);
                    System.out.println("借阅成功");

                }
                return;
            }
        }
        //4. 如果没有借出 可以借阅;否则 不能借阅
        System.out.println("没有你要找的这本书,无法借阅!");
    }
}


在这里插入图片描述

  • ReturnBook 归还图书
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class ReturnBook implements IOperation{

    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书....");
        System.out.println("请输入你要归还的图书:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();

        //1.先遍历数组 查找是否存在要归还的图书
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                //2.如果没有被借出 则不用归还
                if(!book.isBorrowed()){
                    System.out.println("这本书没有被借出过,不用还!");
                }else{
                    //3.否则 归还 显示归还成功
                    System.out.println("归还成功");
                    System.out.println(book);
                    book.setBorrowed(false);
                }
                return;
            }
        }
        //4. 没有要找的图书 无法归还
        System.out.println("没有你要找的这本书,无法归还!");
    }
}

在这里插入图片描述

  • Book
package book;

//书籍对象
public class Book {
    private String name;//书籍名称
    private String author;//作者
    private int price;//书籍价格
    private String type;//类型
    private boolean isBorrowed;//是否被借出

//构造方法: 除了isBorrowed,new一本书籍,默认书未被借出 -- boolean类型,未被初始化,默认是false
    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }

    //因为前面的成员变量是private,需要提供get()和set()方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public boolean isBorrowed() {
        return isBorrowed;
    }

    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }


    //toString()方法
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                (isBorrowed == true ? " ,  已借出  ": " ,  未借出  ")+
                //", isBorrowed=" + isBorrowed +
                '}';
    }
}

4.9.2 管理员的具体业务实现 :新增图书、删除图书、显示图书

  • 新增图书 AddBook
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class AddBook implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("新增图书.....");
/*
//扩容
        if(isFull(bookList)){
            System.out.println("书架满了....");
        }
*/
       /* if(isFull(bookList)){
            //扩容的代码
            //arrays.copyof()
        }*/

        //1.整理书籍信息
        //新增的图书 实际上 是一个一个的图书对象
        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入书籍的名称:");
        String name = scanner.nextLine();

        System.out.println("请输入书籍的作者:");
        String author = scanner.nextLine();

        System.out.println("请输入书籍的价格:");
        int price = scanner.nextInt();
        scanner.next();

        System.out.println("请输入书籍的类型:");
        String type = scanner.nextLine();//nextLine会读取空格
        //next遇到空格 结束

        Book book = new Book(name,author,price,type);

        //放到书籍 数组里
        //2.如果书架上有这本书 则不能上架
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book tmp = bookList.getBook(i);
            if(tmp.getName().equals(name)){
                System.out.println("有这本书,可以不上架!");
                return;
            }
        }
        //3.没有这本书 则放到书籍数组当中
        bookList.setBooks(currentSize,book);

        bookList.setUsedSize(currentSize+1);
    }

    //判断书架的书 是否摆满
    private boolean isFull(BookList bookList){
        return bookList.getbooks().length == bookList.getUsedSize();
    }
}

在这里插入图片描述

  • 显示图书ShowBook
package operation;

import book.Book;
import book.BookList;

public class ShowBook implements IOperation{

    @Override
    public void work(BookList bookList) {
        System.out.println("打印图书.....");

        //如果书架上有这本书 就展示书籍
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book tmp = bookList.getBook(i);
            System.out.println(tmp);
        }
    }
}

在这里插入图片描述

  • 删除图书DelBook
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class DelBook implements IOperation{

    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书.....");
        Scanner scanner = new Scanner(System.in);

        //1.输入你要删除的书籍名称
        System.out.println("请输入要删除的书籍名称:");
        String name = scanner.nextLine();

        //2.查看当前书籍是否存在
        int index = -1;
        int i = 0;
        int currentSize = bookList.getUsedSize();
        for ( i = 0; i < currentSize; i++) {
            Book tmp = bookList.getBook(i);
            if(tmp.getName().equals(name)){
                index = i;
                break;
            }
        }
        //没有遇到break
        if(i >= currentSize){
            System.out.println("没有你要删除的书籍....");
        }

        //遇到breaK:此时开始真正删除
        for (int j = index; j < currentSize-1; j++) {
            //bookList[j] = bookList[j+1];
            Book tmp = bookList.getBook(j+1);
            bookList.setBooks(j,tmp);
        }

        //修改usedSize的值,清空内存
        bookList.setUsedSize(currentSize-1);
        bookList.setBooks(currentSize-1,null);
    }
}

在这里插入图片描述


💖💖💖
最后附上 图书管理系统码云链接

相关文章:

  • go语言len函数差别
  • minecraft.service 文件配置
  • 关于OpenAI在React框架下搭建的项目雏形
  • Python的概论
  • 《新能源汽车 DEEA 平台开发策略》
  • 鲁大师单文件版
  • c++进阶之------哈希(开放寻址法)
  • 房地产数据可视化管理详细设计基于Spring Boot SSM原创
  • 剑指Offer(数据结构与算法面试题精讲)C++版——整数除法
  • 【Keepalived】Keepalived-2.3.3明确结束对CentOS 7的支持
  • 【蓝桥杯】第十四届C++B组省赛
  • git 常用操作整理
  • L1-083 谁能进图书馆(10分)(超详解)
  • 优化 ant-select(下拉数据太多)导致的页面卡顿问题
  • MPLAB X IDE 环境中配置字的注意点
  • python的sys中sys.argv 和 sys.exit() 用法
  • 数据层的基本操作
  • RKNN SDK User Guide学习要点
  • .NET 调用API创建系统服务实现权限维持
  • 实现ESP32woor连接deepseek进行访问
  • 武汉网站制作 费用/外贸推广有哪些好的方式
  • 杭州网站开发公司/百度新闻app
  • 网站工信部备案号/百度手游排行榜
  • 律师在哪个网站做/怎么成为百度推广代理商
  • 宁波网站推广优化公司电话/淘宝seo搜索引擎优化
  • 手机怎么做黑网站吗/优化网站搜索排名