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

【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类型,未被初始化,默认是falsepublic 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()方法@Overridepublic 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);}@Overridepublic void menu() {System.out.println("普通用户菜单.....");}
}
  • AdminUser 类
package user;public class AdminUser extends User{public AdminUser(String name) {super(name);}@Overridepublic 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);}@Overridepublic 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);}@Overridepublic 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);}@Overridepublic 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[]{};}@Overridepublic 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 {@Overridepublic void work(Book[] books) {System.out.println("查找图书.....");}
}
  • AddBook
package operation;import book.Book;public class AddBook {@Overridepublic 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{@Overridepublic void work(Book[] books) {System.out.println("查找图书.....");}
}
  • 修改后的AddBook
package operation;import book.Book;public class FindBook implements IOperation{@Overridepublic void work(Book[] books) {System.out.println("查找图书.....");}
}
  • DelBook
package operation;import book.Book;public class DelBook implements IOperation{@Overridepublic void work(Book[] books) {System.out.println("删除图书.....");}
}
  • ShowBook
package operation;import book.Book;public class ShowBook implements IOperation{@Overridepublic void work(Book[] books) {System.out.println("打印图书.....");}
}
  • ExitBook
package operation;import book.Book;public class ExitBook implements IOperation{@Overridepublic void work(Book[] books) {System.out.println("退出系统......");}
}

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

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

  • BorrowedBook
public class BorrowedBook implements IOperation{@Overridepublic void work(Book[] books) {System.out.println("借阅图书.....");}
}

ReturnBook

public class ReturnBook implements IOperation{@Overridepublic 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(),};}@Overridepublic 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()};}@Overridepublic 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){//下标posreturn 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{@Overridepublic 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{@Overridepublic 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{@Overridepublic 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{@Overridepublic 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类型,未被初始化,默认是falsepublic 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()方法@Overridepublic 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{@Overridepublic 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{@Overridepublic 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{@Overridepublic 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;}}//没有遇到breakif(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);}
}

在这里插入图片描述


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

相关文章:

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

【JavaSE】JavaSE小练习 —— 图书管理系统 一、系统功能二、涉及的知识点三、业务逻辑四、代码实现4.1 book 包4.2 user 包4.3 Main 类4.4 完善管理员菜单和普通用户菜单4.5 接着4.4的管理员菜单和普通用户菜单&#xff0c;进行操作选择&#xff08;1查找图书、2借阅图书.....…...

命令模式介绍及应用案例

命令模式介绍 命令模式&#xff08;Command Pattern&#xff09; 是一种行为设计模式&#xff0c;它将请求封装为一个对象&#xff0c;从而使你可以用不同的请求对客户进行参数化&#xff0c;并且支持请求的排队、记录日志、撤销操作等功能。命令模式的核心思想是将“请求”封…...

多线程(多线程案例)(续~)

目录 一、单例模式 1. 饿汉模式 2. 懒汉模式 二、阻塞队列 1. 阻塞队列是什么 2. 生产者消费者模型 3. 标准库中的阻塞队列 4. 自实现阻塞队列 三、定时器 1. 定时器是什么 2. 标准库中的定时器 欢迎观看我滴上一篇关于 多线程的博客呀&#xff0c;直达地址&#xf…...

python笔记之函数

函数初探 python在要写出函数很简单&#xff0c;通过关键字def即可写出&#xff0c;简单示例如下 def add(a, b):return ab 以上即可以定义出一个简单的函数&#xff1a;接收两个变量a和b&#xff0c;返回a和b相加的结果&#xff0c;当然这么说也不全对&#xff0c;原因就是…...

合合信息大模型加速器2.0实测:当AI开始“读心术“与“考古“

凌晨三点的编辑部&#xff0c;我盯着屏幕上密密麻麻的财务报表和如天书般的专利图纸&#xff0c;感觉咖啡因正在大脑中上演"黑凤凰"式崩溃。这时&#xff0c;合合信息的AI助手突然开口&#xff1a;"您需要的是自动关联32个数据表&#xff0c;还是让模型直接生成…...

一个判断A股交易状态的python脚本

最近在做股票数据相关的项目&#xff0c;需要用到判断某一天某个时刻A股的状态&#xff0c;比如休市&#xff0c;收盘&#xff0c;交易中等&#xff0c;发动脑筋想了一下&#xff0c;这个其实还是比较简单的&#xff0c;这里我把实现方法分享给大家。 思路 当天是否休市 对于某…...

【go】数组与切片

数组Array 重点&#xff1a; 数组是值类型 数组的定义 var 数组名 [数组大小] 数据类型,例如var intArr [5] int&#xff0c;定义完数组后数组里的元素有默认值。、 数组的地址&intArr、&intArr[0]。 数组占据连续的内存。 int通常是4字节&#xff08;32位&…...

hadoop集群配置-scp命令

scp 命令用于在不同主机之间复制文件或目录&#xff0c;在Hadoop集群配置中常用于将配置文件或相关资源分发到各个节点。以下是 scp 命令的基本用法和在Hadoop集群配置中的示例&#xff1a; 基本语法 scp [-r] [源文件或目录] [目标用户目标主机:目标路径] - -r &#xff1a;…...

闪记(FlashNote):让灵感快速成文的轻量级笔记工具

闪记&#xff08;FlashNote&#xff09;&#xff1a;让灵感快速成文的轻量级笔记工具 你是否经常遇到这样的情况&#xff1a;桌面上放了一大堆的新建123.txt&#xff0c;想记录一个想法&#xff0c;应该是一键开个一个快捷键然后瞬间记录就自动保存了&#xff0c;现在的很多笔记…...

打车APP订单系统逻辑梳理与实现

一、逻辑分析 打车 APP 订单系统是整个打车业务的核心&#xff0c;负责处理从乘客下单到行程结束的一系列流程&#xff0c;涉及乘客、司机和平台三方的交互。 乘客端 下单&#xff1a;乘客打开 APP&#xff0c;输入上车地点、目的地&#xff0c;选择车型等信息后提交订单。此时…...

《大模型部署》——ollama下载及大模型本地部署(详细快速部署)

ollama Ollama 是一款开源跨平台的大语言模型&#xff08;LLM&#xff09;运行工具&#xff0c;旨在简化本地部署和管理 AI 模型的流程。 下载ollama 进入官网下载https://ollama.com/ 选择需要的系统下载 下载完成后直接进行安装 下载大模型 选择想要部署的模型&#…...

【蓝桥杯速成】| 17.完全背包(一维easy版)

题目一&#xff1a;爬楼梯 问题描述 57. 爬楼梯&#xff08;第八期模拟笔试&#xff09; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 < m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;给定 n 是一个正整…...

移动端六大语言速记:第4部分 - 数据结构

移动端六大语言速记&#xff1a;第4部分 - 数据结构 本文对比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift这六种移动端开发语言的数据结构特性&#xff0c;帮助开发者快速掌握各语言的语法差异。 4. 数据结构 4.1 数组与列表 各语言数组与列表的语法对比&#xff1…...

开源鸿蒙分布式软总线技术研究报告

引言 在现代计算环境中&#xff0c;分布式系统的重要性日益凸显&#xff0c;尤其是在物联网&#xff08;IoT&#xff09;和无处不在的连接的背景下。各种智能设备数量的爆炸式增长以及用户对跨设备无缝体验的需求&#xff0c;推动了分布式操作系统的发展。开源鸿蒙正是在这样的…...

Geotools结合SLD实现矢量中文标注下的乱码和可用字体解析

目录 前言 一、需求溯源 1、原始的SLD渲染 2、最初的效果 二、问题修复 1、还是字符编码 2、如何选择可用的字体 3、如何查看支持的字体库 三、总结 前言 随着地理信息系统&#xff08;GIS&#xff09;技术的不断发展&#xff0c;矢量数据的可视化和标注成为了地理信息展…...

linux 服务器创建服务器启动后服务自启动

1、在/etc/systemd/system/下touch一个文件&#xff1a; touch /etc/systemd/system/your_application.service 2、在文件中写入&#xff1a; [Unit] Descriptionmodules-system Aftersyslog.target[Service] Typeforking Userroot Grouproot ExecStart/bin/bash /usr/loca…...

基于Python与CATIA V5的斐波那契螺旋线自动化建模技术解析

引言 斐波那契螺旋线&#xff08;Fibonacci Spiral&#xff09;作为自然界广泛存在的黄金比例曲线&#xff0c;在工业设计、产品造型、机械工程等领域具有重要应用价值。本文将以Python控制CATIA V5进行参数化建模为例&#xff0c;深入解析三维CAD环境中复杂数学曲线的自动化生…...

动态规划(11.按摩师)

题目链接&#xff1a;面试题 17.16. 按摩师 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; 状态表示&#xff1a; 对于简单的线性 dp &#xff0c;我们可以⽤「经验 题⽬要求」来定义状态表⽰&#xff1a; 以某个位置为结尾&#xff0c;巴拉巴拉&#xff1b;…...

CentOS下安装Docker,Docker下安装JDK\MYSQL\REDIS\NGINX

先用VM安装好Centos8.5&#xff0c;可以选择安装迷你版&#xff0c;我安装的是UI版。 然后用MobaXterm_Portable_v23.0_cn连上去&#xff0c;互访成功就可以往下操作。 1. 修改文件&#xff1a;就是要把之前的mirror替换成现在的vault cd /etc/yum.repos.d/sed -i s/mirrorl…...

demo.launch(inbrowser=True, share=True)无法生成共享网址

Gradio 的共享功能无法正常工作&#xff0c;原因是缺少一个名为 frpc_windows_amd64_v0.3 用到代码 app.demo.launch(show_errorTrue, inbrowserTrue, shareTrue) show_errorTrue&#xff1a;这个参数的作用是当应用在启动过程中出现错误时&#xff0c;会显示错误信息。这对于调…...

翻译: 人工智能如何让世界变得更美好二

Basic assumptions and framework 基本假设和框架 To make this whole essay more precise and grounded, it’s helpful to specify clearly what we mean by powerful AI (i.e. the threshold at which the 5-10 year clock starts counting), as well as laying out a fram…...

【vue】editor富文本输入全英文,谷歌浏览器:元素不会自动换行bug

【vue】editor富文本输入全英文&#xff0c;谷歌浏览器&#xff1a;元素不会自动换行bug 解决方案&#xff1a;给元素一个宽度 100% .editor {width: 100%; }...

XML标签格式转换为YOLO TXT格式

针对的是多边形&#xff08;<polygon>&#xff09;来描述对象的边界&#xff0c;而不是传统的矩形框&#xff08;<bndbox>&#xff09; import xml.etree.ElementTree as ET import os from pathlib import Path# 解析VOC格式的XML文件&#xff0c;提取目标框的标…...

# OpenCV实现人脸与微笑检测:从图像到视频的实战应用

OpenCV实现人脸与微笑检测&#xff1a;从图像到视频的实战应用 在计算机视觉领域&#xff0c;人脸检测和微笑检测是两个非常有趣且实用的任务。它们广泛应用于智能监控、社交媒体分析、人机交互等多个场景。本文将通过两个代码示例&#xff0c;详细介绍如何使用OpenCV实现人脸…...

【ubuntu24.04】挂载windows的共享文件夹

挂载windows的共享文件夹 ubutnu直接挂载windows共享文件夹&#xff0c;这样就能直接访问到windows里下载的文件了。 在 Ubuntu 中挂载 Windows 共享文件夹通常使用 CIFS 协议&#xff0c;下面给出一个常用的方法&#xff1a; 1. 安装 cifs-utils 首先&#xff0c;确保系统…...

基于Python的Django框架的个人博客管理系统

标题:基于Python的Django框架的个人博客管理系统 内容:1.摘要 本文围绕基于Python的Django框架构建个人博客管理系统展开。背景方面&#xff0c;随着互联网发展&#xff0c;个人博客成为信息分享与交流重要平台&#xff0c;传统博客管理系统在功能与灵活性上存在不足。目的是开…...

Kubernetes可视化面板——KubePi(Kubernetes Visualization Panel - kubepi)

Kubernetes可视化管理面板——KubePi 在云计算和容器化的大潮下&#xff0c;Kubernetes 已成为管理容器集群的事实标准。然而&#xff0c;面对复杂的集群管理和运维工作&#xff0c;一个直观、易用的可视化工具显得至关重要。KubePi 正是为此而生——一款专为简化 Kubernetes …...

【区块链安全 | 第二十三篇】单位和全局可用变量(一)

文章目录 单位和全局可用变量&#xff08;Units and Globally Available Variables&#xff09;以太单位&#xff08;Ether Units&#xff09;时间单位&#xff08;Time Units&#xff09;保留关键字 单位和全局可用变量&#xff08;Units and Globally Available Variables&am…...

6内存泄露问题的讨论

1.关注 内存泄露 是要融入到 DNA 中的事情 内存泄露是一个非常害怕, 非常严重的事情!! (不仅仅是内存泄露,包括文件描述符泄露等同类问题,都是非常严重的) 这种问题,不容易第一时间发现 2.实际场景中&#xff1a;特别是选择性关闭文件描述符 &#xff08;也是记得要关闭文件描…...

权重参数矩阵

目录 1. 权重参数矩阵的定义与作用 2. 权重矩阵的初始化与训练 3. 权重矩阵的解读与分析 (1) 可视化权重分布 (2) 统计指标分析 4. 权重矩阵的常见问题与优化 (1) 过拟合与欠拟合 (2) 梯度问题 (3) 权重对称性问题 5. 实际应用示例 案例1&#xff1a;全连接网络中的…...