java基础项目:图书管理系统(详解)

news2024/9/20 16:55:42

java基础学习后适合写的测试语法和代码熟练度的小项目(学校学java,总得练一练的)

文章目录

  • 架构 / 流程
      • 架构
      • 流程
      • 具体内容
  • 代码实现
    • books
      • Book(图书类)
      • BookList(图书列表类)
    • user
      • User(用户抽象类)
      • AdminUser(管理员用户)
      • NormalUser(普通用户)
    • Main类
    • operations
      • IOperation(操作接口)
      • ExitOperation(退出系统)
        • 操作运行过程
      • AddOperation(新增图书)
      • DelOperation(删除图书)
      • DisplayOperation(显示图书)
      • BorrowOperation(借阅图书)
      • ReturnOperation(归还图书)
      • FindOperation(查找图书)
  • 完整代码

架构 / 流程

架构

图书管理系统一共包含了以下部分:

  1. 实体类: 主要包括 图书类(Book)图书列表类(BookList) 。其中,Book 包含了书名、作者和价格等属性;而 BookList 则封装了一个数组,用于存储多个 Book 对象。
  2. 操作接口:主要包括图书管理系统中各种操作的接口 (IOperation) ,如查找图书、借出图书、归还图书等。这个接口定义了一个 work() 方法,来执行对应的操作。
  3. 操作实现类: 主要包括了上述操作接口的实现类,下文会进行列举。这些实现类都实现了 IOperation 接口,并重写了 work() 方法,以实现对应的图书管理操作。
  4. 用户类: 主要包括一个 抽象类 User 类(以及AdminUser, NormalUser) ,用于模拟用户在图书管理系统中进行的各种操作。该类包括了一个 iOperation 数组,用于存储不同的操作接口实现类。
  5. 程序入口类: 主要包括了一个 Main 类,作为整个程序的入口。该类主要包括一个菜单方法,用于显示可选的操作列表,并提供了一个样例的用户界面,让用户可以通过输入数字选择不同的操作。

流程

流程如下:

  1. 当用户启动图书管理系统时,系统显示一个菜单,让用户选择对应的操作。
  2. 用户输入对应的数字,选择要执行的操作。
  3. 系统根据用户输入的数字,调用相应的操作接口实现类的 work() 方法,执行对应的图书管理操作。
  4. 操作结束后,系统重新显示菜单,等待用户继续输入操作选项。
  5. 如果用户选择退出系统,程序结束执行。

具体内容

在这里插入图片描述
如图所示,我们在src下建立三个包,分别为

  1. 实体类books 存放图书类Book / 图书列表类BookList
  2. 操作类:
  • AddOperation: 新增图书
  • BorrowOperation:借阅图书
  • DelOperation:删除图书
  • DisplayOperation:显示图书
  • ExitOperation:退出系统
  • FindOperation:查找图书
  • IOperation:操作接口
  • ReturnOperation:归还图书
  1. 用户类:
  • AdminUser:管理员用户
  • NormalUser:普通用户
  • User:用户类
  1. 入口类:Main

代码实现

books

Book(图书类)

图书类没有复杂的函数实现,主要有以下内容

  1. 图书基本信息(成员变量)
  2. 构造函数
  3. getter && setter 相应的图书信息
  4. tostring函数用于返回输出图书信息

代码中有相应注释,不再过多赘述

package books;

public class Book {
    // 图书的信息
    private String name;    // 书名
    private String author;  // 作者
    private int price;  // 价格
    private String type;    // 类型
    private boolean IsBorrowed; // 是否被借阅

    // 构造函数
    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
        //IsBorrowed = isBorrowed;
    }

    // getter && setter
    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;
    }

    // 调用时将返回图书信息(字符串形式)
    public String toString(){
        return "Book{"
                +"name="+getName()+", "
                +"author="+getAuthor()+", "
                +"price="+getPrice()+", "
                +"type="+getType()+", "
                +"isborrowed="+isBorrowed()
                +"}";
    }
}

BookList(图书列表类)

BookList包含一个Book类型的数组用于存放book图书一些操作函数

具体在代码中注释写道

package books;

public class BookList {
    public Book[] books = new Book[10]; // 图书类数组
    public int usedSize;//存储当前书的个数

    // 无参构造:初始化Booklist
    // 存三本书
    public BookList(){
        books[0] = new Book("三国演义","罗贯中",68,"小说");
        books[1] = new Book("水浒传","施耐庵",68,"小说");
        books[2] = new Book("西游记","吴承恩",67,"小说");

        this.usedSize = 3;
    }

    // 获取当前存储的书的个数
    public int getUsedSize() {
        return usedSize;
    }

    //有效书的数量
    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }

    // 返回book类数组的相应下标
    // 用于通过位置查找图书
    public Book getPos(int pos){
        return books[pos];
    }

    // 特定位置设置图书对象
    public void setBooks(Book book,int pos){
        books[pos] = book;
    }
}

user

User(用户抽象类)

  1. User为一个抽象类,主要用于声明两种用户都会执行的操作
  2. 其中需要注意的内容有:
  • menu方法(打印菜单:不同类型用户的操作不一样,所以菜单不一样)
  • IOperation类数组,用于存放用户可以执行的全部操作,通过输入chioce执行队形的操作
package user;

import books.BookList;
import operations.IOperation;

public abstract class User {
    protected String name;  // 成员变量:姓名
    protected IOperation iOperation[]; // iOperation类数组 - 用于存放可执行的操作
    public User(String name){
        this.name = name;
    }   // 构造函数

    public abstract int menu(); // 菜单:管理员用户和普通用户的操作不同

    // 执行操作
    // iOperation在后文
    // iOperation[] 存放不同用户可以执行的操作
    // 通过输入chioce来执行相应的操作
    public void doOperation(int choice, BookList bookList){
        iOperation[choice].work(bookList);
    } 
}

AdminUser(管理员用户)

  1. AdminUser类:管理员用户,主要内容包括Iopetation类的数组,和一个对应的操作菜单
  2. 以下是IOperation数组中包含的操作:
  • 查询图书:FindOperation()
  • 添加图书:AddOperation()
  • 删除图书:DelOperation()
  • 显示图书:DisplayOperation()
  • 退出系统:ExitOperaion()
package user;

import operations.*;
import user.User;

import java.util.Scanner;

public class AdminUser extends User {   // 继承User类

    // 构造函数
    public AdminUser(String name) {
        super(name);

        // 对应管理员用户可执行的操作
        this.iOperation = new IOperation[]{
                new ExitOperaion(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new DisplayOperation()
        };
    }

    // 对应管理员用户的菜单
    public int menu(){
        System.out.println("****************************************");
        System.out.println("hello"+ "\t" + name+ "\t" + "欢迎使用图书管理系统");
        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(普通用户)

  1. 普通用户类NormalUser内部和管理员用户并无差别
  2. 以下是普通用户IOperation数组中的操作
  • 查找图书:FindOperation()
  • 借阅图书:BorrowOperation()
  • 归还图书:ReturnOperation()
  • 显示图书:DisplayOperation()
  • 退出系统:ExitOperaion()
package user;

import operations.*;
import user.User;

import java.util.Scanner;

public class NormalUser extends User {

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

        // 创建iOperation数组 存普通用户可执行的操作
        this.iOperation = new IOperation[]{
                new ExitOperaion(),
                new FindOperation(),
                new BorrowOperation(),
                new ReturnOperation(),
                new DisplayOperation()
        };
    }

    // 普通用户的对应的菜单
    public int menu(){
        System.out.println("****************************************");
        System.out.println("hello"+ "\t" + name+ "\t" + "欢迎使用图书管理系统");
        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;
    }
}

Main类

  1. Main类主要包含Login方法,即实现用户登陆操作
  2. 主要步骤如下:
  • 创建一个空的 BookList 对象(bookList)用于存放图书信息。
  • 调用 Login 方法来进行用户登录操作,获取一个 User 对象(user)。这个 User 对象代表着当前登录的用户,可以执行特定的操作以管理图书列表。
  • 用while(true)使程序可以持续进行,直到用户进行退出程序操作(chioce = 0)
import books.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;

import java.util.Scanner;

public class Main {
    // Login()方法 - 用户登陆
    public static User Login() {
        System.out.println("请输入您的姓名:");
        Scanner scanner = new Scanner(System.in);
        String Username = scanner.nextLine();
        while (true) {
            System.out.println("请输入您的身份:> 管理员(1)/普通用户(2)");
            int choice = scanner.nextInt();
            if (choice == 1) {
                return new AdminUser(Username);
            } else if (choice == 2) {
                return new NormalUser(Username);
            }else{
                System.out.println("输入错误,请重新输入");
            }
        }
    }

public static void main(String[] args) {
    BookList bookList = new BookList(); // 创建一个Booklist类对象,存放图书信息

    //登陆
    User user = Login(); // 执行Login()方法,登陆
    // 执行选项
    // 用while(true)使程序可以持续进行,直到用户进行退出程序操作(chioce = 0)
    while(true){
        int choice = user.menu();
        user.doOperation(choice,bookList);
        }
    }
}

operations

IOperation(操作接口)

  • 接口(IOperation) ,该接口包含了一个名为 work 的方法,这个方法接受一个 BookList 对象作为参数
  • 接口中定义的 work 方法 接受一个 BookList 对象作为参数。这个参数是一个封装了多个图书对象的列表对象,在执行具体操作时,我们可以通过该列表对象来访问和修改列表中的图书信息。
package operations;

import books.BookList;

public interface IOperation {
    void work(BookList bookList);
}

ExitOperation(退出系统)

重写IOperation的work方法进行功能实现,实现比较简单,直接使用System.exit(0)退出即可

这里主要讲一下是程序是怎样读取操作到退出的(运行过程):

操作运行过程

具体过程如图所示:
在这里插入图片描述

以下为ExitOperation的实现

package operations;

import books.BookList;

public class ExitOperaion implements IOperation{
    @Override
    public void work(BookList bookList){
    System.exit(0);//退出系统操作
    }
}

AddOperation(新增图书)

  1. 从控制台获取用户输入的图书的名称、作者、类型和价格等信息,然后根据这些信息创建一个新的 Book 对象。
  2. 将这个新创建的 Book 对象存储在当前可用的位置(即 bookList.usedSize 所代表的位置),并将 bookList.usedSize 的值加 1,表示图书列表中有效的书的数量已经增加了一个
package operations;

import books.Book;
import books.BookList;

import java.util.Scanner;

public class AddOperation implements IOperation{
    public void work(BookList bookList){
    	// 添加图书
        System.out.println("添加图书");

		// 添加图书信息
        //先输入nextLine后输入nextInt
        //不然需要在nextInt后读取回车
        System.out.println("请输入要添加的图书名");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();

        System.out.println("请输入要添加的图书作者");
        String author = scanner.nextLine();

        System.out.println("请输入要添加的图书类型");
        String type = scanner.nextLine();

        System.out.println("请输入要添加的图书价格");
        int price = scanner.nextInt();


        Book book = new Book(name,author,price,type);
        //获取当前存放书的位置
        int currentSize= bookList.usedSize;
        //把书存放在指定位置(下标即对应位置)
        bookList.setBooks(book,currentSize);
        //将书的有效个数+1
        bookList.setUsedSize(currentSize+1);
    }
}

DelOperation(删除图书)

  1. 首先输入要删除的图书,然后遍历此时的bookList数组,查找是否有这本书
  2. 如果有再执行删除操作,没有打印提示信息
  3. 删除操作:将待删除的书后面的书向前移动1位
  4. 执行删除操作后 将booklist最后一位置空
package operations;

import books.Book;
import books.BookList;
import sun.font.FontRunIterator;

import java.util.Scanner;

public class DelOperation implements IOperation{
    @Override
    public void work(BookList bookList){
        System.out.println("删除图书");
        System.out.println("请输入要删除的图书名");

        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int currentSize = bookList.getUsedSize();
        int index = -1;//是否存在该图书的标志

        // 遍历bookList查找是否存在要删除的图书
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getPos(i);
            if(name.equals(book.getName())){
                index = i;  // 找到该书就改变index的值,退出循环
                break;
            }
        }
        
        // 此时判断是否进行删除操作
        if(index == -1){
            System.out.println("要删除的图书不存在");
        }else{
            // 执行删除操作,讲此时index后的所有元素前移1位即可
            for (int i = index; i < currentSize-1; i++) {
                //把i+1下标的书放到i下标
                Book book = bookList.getPos(i+1);
                bookList.setBooks(book,i);
            }
            //每次删除后进行置空
            bookList.setBooks(null,currentSize-1);
            bookList.setUsedSize(currentSize-1);
            System.out.println(name+"已被删除");
        }
    }
}

DisplayOperation(显示图书)

  • 遍历打印数组元素book即可
package operations;

import books.Book;
import books.BookList;
import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;

public class DisplayOperation implements IOperation{
    @Override
    public void work(BookList bookList){
        System.out.println("显示图书");
        System.out.println("****************************************");

        // 遍历数组打印book即可(book是一个返回图书信息的)
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getPos(i);
            System.out.println(book);
        }
    }
}

BorrowOperation(借阅图书)

  • 和前面的操作大同小异,通过遍历数组,通过name.equals(book.getName())比较输入的name是否和数组中书名有相同的,最后更新借阅状态
package operations;

import books.Book;
import books.BookList;

import java.util.Scanner;

public class BorrowOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书");

        System.out.println("请输入要借阅的图书名");

        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();

        int currentSize = bookList.getUsedSize();

        // 遍历booklist 读取所有图书信息
        int flag = 0; // 最后判断是否借阅成功
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getPos(i);

            if (name.equals(book.getName())) {
                if (book.isBorrowed()) {
                    flag = 1;
                    System.out.println("该书已经被借出");
                } else {
                    book.setBorrowed(true);
                    System.out.println("图书借阅成功");
                    flag = 1;
                    break;
                }
            }
        }
        if(flag == 0){
            System.out.println("要借阅的图书不存在");
        }
    }
}

ReturnOperation(归还图书)

  • 和借阅图书一样的操作,如果归还成功后进行book.setBorrowed(false) 即将该书的借阅状态设为未被借阅(isBorrwed = false)
package operations;

import books.Book;
import books.BookList;

import java.util.Scanner;

public class ReturnOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书");

        System.out.println("请输入要归还的图书名");

        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();

        int currentSize = bookList.getUsedSize();

        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getPos(i);
            if(name.equals(book.getName())){
                book.setBorrowed(false);
                System.out.println("图书归还成功");
                break;
            }
        }
        System.out.println("要归还的图书不存在");
    }
}

FindOperation(查找图书)

  1. 遍历数组对比输入的name和书名是否相同,如果找到了就打印图书信息
package operations;

import books.Book;
import books.BookList;

import java.util.Scanner;

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

        // 遍历数组 查找书籍
        int CurentSize = bookList.getUsedSize();//数组此时的书的数量
        for (int i = 0; i < CurentSize; i++) {
            Book book = bookList.getPos(i);
            if(name.equals(book.getName())){
                System.out.println("找到了这本书!\n"+book);   // 输出提示并打印图书信息
                return;
            }
        }
        System.out.println("这本书不存在");
    }
}

完整代码

java项目图书管理系统

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

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

相关文章

U盘数据恢复怎么做?分享4个恢复方法!

案例&#xff1a;u盘数据恢复 【我之前丢失的u盘前两天突然找到了&#xff0c;但是我将它插入电脑后很多数据都读不出来了&#xff0c;遇到u盘无法读取的情况怎么办呀&#xff1f;怎么才能恢复u盘数据呢&#xff1f;】 u盘是一种便携式存储设备&#xff0c;广泛用于数据传输和…

使用Inno Setup将QT开发的软件制作成安装包(仅Windwos平台)

使用Inno Setup将QT开发的软件制作成安装包&#xff08;仅Windwos平台&#xff09; 前言 在使用QT完成软件开发后要把软件给别人使用&#xff0c;我之前是打包发布后直接弄成压缩包发给别人&#xff0c;但是接收的人就要通过解压软件解压才能使用软件&#xff0c;如果没有解压…

WizardKM:Empowering Large Language Models to Follow Complex Instructions

WizardKM:Empowering Large Language Models to Follow Complex Instructions Introduction参考 Introduction 作者表明当前nlp社区的指令数据比较单一&#xff0c;大部分都是总结、翻译的任务&#xff0c;但是在真实场景中&#xff0c;人们有各式各样的需求&#xff0c;这限制…

MyBats

一、MyBatis简介 1. MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下&#xff0c; iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。 iBatis一词来…

【Python | 基础语法篇】02、标识符、运算符、字符串扩展及数据输入

目录 一、标识符 1.1 什么是标识符 1.2 标识符命名规则 1.2.1 标识符命名规则 - 内容限定 1.2.2 标识符命名规则 - 大小写敏感 1.2.3 标识符命名规则 - 不可使用关键字 1.3 案例演示 1.4 变量命名规范 1.4.1 变量命名规范 - 见名知意 ​1.4.2 变量命名规范 - 下划线…

Spring aop如何寻找advisor

1.bean的生命周期第一步回去解析所有的advisor 2.第四个是我们之前开启的注解EnableAspectJAutoProxy 3.org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessBeforeInstantiation 4.org.springframework.aop.framework.autoproxy.AbstractAutoP…

ChatGPT的提示的一些高级知识

作为一个大型语言模型(LLM)接口&#xff0c;ChatGPT有令人印象深刻的潜力&#xff0c;但是真正能否用好取决与我们的提示&#xff08;Prompt &#xff09;&#xff0c;一个好的提示可以让ChatGPT晋升到一个更好的层次。 在这篇文章中&#xff0c;我们将介绍关于提示的一些高级…

可视化 | Flask+Pyecharts可视化模板二

文章目录 &#x1f3f3;️‍&#x1f308; 1. 系统说明界面&#x1f3f3;️‍&#x1f308; 2. 柱状图示例界面&#x1f3f3;️‍&#x1f308; 3. 散点图示例界面&#x1f3f3;️‍&#x1f308; 4. 折线图示例界面&#x1f3f3;️‍&#x1f308; 5. 饼图示例界面&#x1f3f…

单链表——你需要掌握的那些内容

如有错误&#xff0c;感谢不吝赐教、交流 文章目录 前言本文涉及题目&#xff1a;设计链表有无头结点的区别头指针无头结点有头结点为什么需要头结点呢&#xff1f;注意&#xff1a; 单链表&#xff0c;本文使用Java实现定义链表节点定义一个链表类并初始化get(int index)addA…

HAproxy与web集群

文章目录 一、HAproxy1.HAProxy是什么2.HAProxy的核心能力和关键特性3.LVS、Nginx、HAproxy的区别&#xff1a; 二、实验步骤1.Haproxy搭建 Web 群集 总结 一、HAproxy 1.HAProxy是什么 HAProxy是一个免费的负载均衡软件&#xff0c;可以运行于大部分主流的Linux操作系统上。…

儿童生长发育迟缓的鉴别和干预

&#xff08;英国&#xff09;国家临床医学研究所&#xff08;NICE&#xff09;2017年发布关于婴儿/儿童生长发育迟缓的鉴别、评估和监测的指南&#xff0c;该指南确定了生长发育的界值&#xff0c;指出了诱因及危险因素&#xff0c;并提出了干预的方案。 ▼Part1&#xff1a;…

“无人值守”时代已来,千巡翼X4给出怎样的答案?

随着技术和产品的逐渐成熟&#xff0c;无人机在各行业的应用越来越普遍&#xff0c;但如何进一步解放人力&#xff0c;提高运营效率&#xff0c;还有很大的探索空间。针对作业频率高、重复性高、周期性强、作业环境艰险危险等痛点&#xff0c;用户迫切需要更高效、更智能的全自…

LeetCode876. 链表的中间结点

876. 链表的中间结点 描述示例解题思路以及代码解法1解法2 描述 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 示例1 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释…

希尔排序的实现

希尔排序是插入排序的一种升级&#xff0c;其基本思想是&#xff1a; 先选定一个整数&#xff0c;把待排序文件中所有记录分成个组&#xff0c;所有距离为的记录分在同一组内&#xff0c;并对每 一组内的记录进行排序。然后&#xff0c;取&#xff0c;重复上述分组和排序的工 作…

可执行Jar项目

一个复杂Jar的运行&#xff0c;要解决classpath问题&#xff0c;否则运行时会有ClassNotFoundException抛出。而用java&#xff0c;需要手动维护一个classpath文件&#xff0c;或者将所有的库位置放到命令行参数里。有没有更好的办法&#xff1f; Jar库目录方式 核心配置在于两…

算法训练Day40:343. 整数拆分 96.不同的二叉搜索树

文章目录 整数拆分题解&#xff08;动态规划&#xff09;贪心 不同的二叉搜索树题解 整数拆分 CategoryDifficultyLikesDislikesContestSlugProblemIndexScorealgorithmsMedium (62.22%)11660--0 Tags 数学 | 动态规划 Companies 给定一个正整数 n &#xff0c;将其拆分为…

推荐几个免费的在线文本转语音网站(支持中英文多种语音)

如果你正在寻找一款免费的在线文本转语音工具&#xff0c;那么你来对地方了&#xff01;本文将介绍几个完全免费的在线文本转语音网站&#xff0c;推荐收藏下来以备不时之需。 No.1 免费文本转语音&#xff08;TTSMaker&#xff09; TTSMaker是第一个推荐的工具&#xff0c;这…

院内导航方案怎么样?什么地图可以用于医院导航系统?

什么地图可以用于医院导航系统&#xff1f;随着医疗事业的不断发展&#xff0c;医院的建制规模越来越大&#xff0c;在医疗能力得到增强的同时&#xff0c;由于楼宇众多&#xff0c;院内寻路难度难免增加。不少前来医院就诊的患者经常会有“寻路难”的困扰。此时一张一目了然的…

从在线监测与故障诊断系统视角,探讨动设备安全运行的重要性

在工业生产中&#xff0c;动设备是生产线的重要组成部分&#xff0c;但是随着设备运行时间的不断延长&#xff0c;设备的损耗逐渐加大&#xff0c;设备故障和损坏的风险也随之增加&#xff0c;给生产效率和安全带来不小的影响。因此&#xff0c;如何保证动设备的安全运行成为了…

更简单的存取Bean的方式(一)-五大类注解

目录 使用类注解 前置工作 Bean命名规则 五大类的实现 JavaEE标准分层 之前我们存储Bean时,是在spring-config.xml文件中添加bean注册内容来实现的 通过"注解"我们可以替代这一项工作 更加简单的存储方式: 使用类注解 五大类注解: Controller(控制器):用来控制…