【Java】—— 图书管理系统
基于往期学习的类和对象、继承、多态、抽象类和接口来完成一个控制台版本的 “图书管理系统”
在控制台界面中实现用户与程序交互
任务目标:
1、系统中能够表示多本图书的信息
2、提供两种用户(普通用户,管理员)
3、普通用户:查看书籍列表,查找图书,借书,还书
4、管理员:查看书籍列表,查找图书,新增图书,删除图书
任务实现:
1、图书类
创建一个包 library 用来表示 图书管理系统 ,再创建 Book 类表示 一本的图书信息
在类里创建需要用到的属性(书名,作者,价格,类型,是否被借出)
package library;public class Book {private String name; //书名private String author; //作者private double price; //价格private String type; //类型private Boolean isBorrowed; //是否被借出//构造方法//当新增图书时,默认是未被借出public Book(String name, String author, double price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;this.isBorrowed = false;}//提供 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 double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public String getType() {return type;}public void setType(String type) {this.type = type;}public Boolean getBorrowed() {return isBorrowed;}public void setBorrowed(Boolean borrowed) {isBorrowed = borrowed;}
}
2、图书列表类
创建一个 BookList 类用来管理多个书籍对象
package library;public class BookList {//创建数组来记录多本书的信息private Book[] books = new Book[100];private int size = 0;//当前数组中有效元素的个数//构造方法public BookList(){//默认添加几本书,方便后续测试books[0] = new Book("西游记","吴承恩",100.0,"古典名著");books[1] = new Book("高等数学","高斯",90.0,"自然科学");books[2] = new Book("福尔摩斯探案集","阿瑟·柯南·道尔",110,"悬疑推理小说");size = 3;}//提供 get/set 方法public int getSize() {return size;}public void setSize(int size) {this.size = size;}public Book getBook(int index){return books[index];}public void setBooks(int index,Book book){books[index] = book;}
}
3、用户类
因为 普通用户 和 管理员 是从 用户 中根据不同的权限分离出来的,这里就涉及到了 继承 的知识,让 子类 继承 父类 来减少代码量
package library.User;import library.IOperation;//用户父类,派生出子类管理员和普通用户
public abstract class User {//这里用 protected 修饰 name,可以让子类直接获取到,不用 get/set 方法protected String name;//当前这个类能够进行哪些操作,就往这个数组中添加对应的对象protected IOperation[] operations;//构造方法public User(String name) {this.name = name;}//管理员和普通用户的权限不一样,菜单面板也有所不同,//但是在父类中没有办法确定使用哪个菜单,所以可以写成抽象类,让子类去进行重写//通过返回用户输入的序号来决定执行不同的操作,所以使用 int 类//写成 抽象方法 后就需要将这个父类写成 抽象类public abstract int menu();
}
父类写到这,我们就可以去创建子类
4、普通用户类(NormalUser)
import java.util.Scanner;public class NormalUser extends User{public NormalUser(String name) {super(name);}@Overridepublic int menu() {//打印普通用户的菜单System.out.println("===========================");System.out.println("欢迎您" + name + "!");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;}
}
5、管理员类(Admin)
import java.util.Scanner;public class NormalUser extends User{public NormalUser(String name) {super(name);}@Overridepublic int menu() {//打印普通用户的菜单System.out.println("===========================");System.out.println("欢迎您" + name + "!");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;}
}
写到这里 书 和 用户 的代码还没有进行交互,这就是面向对象程序设计的典型特点,先创建核心的类/对象,把 核心类/对象属性、方法 搞出来,再通过主逻辑把多个 类/对象 串起来。
6、基本操作接口
创建接口是为了保证所有的类都提供 work 方法,保证 work 的参数都是一致的,也方便之后调用
(这里不使用 接口 使用 抽象类 也是可以的,主要是因为当前没有什么实例属性需要子类来继承(前文中的用户,有 name 属性需要被继承,所以所以使用了抽象类),当两种写法都可以时,优先考虑使用接口)
通过 Operation 把 用户 和 书 关联起来
package library.operation;import library.BookList;//通过这个接口来表示用户的一种基本操作
public interface IOperation {//给出抽象方法//此处操作的 work 方法,是针对 “多本书” 来进行操作的//后续再创建操作相关的具体的类,实现这个接口,就要进一步实现这里的操作void work(BookList bookList);}
把操作单独提取成类
这些类都要实现自 IOperation 接口,并且重写其中的 work 方法
package library.operation;import library.BookList;public class AddOperation implements IOperation{@Overridepublic void work(BookList bookList) {}
}
由于当前每个操作都实现了 IOperation 接口,就只需要给这两种用户添加一个 IOperation[ ] 的数组保存能够支持的操作有什么就可以了
回到 普通用户 和 管理员 创建好数组,并在数组里写上要实现的操作
普通用户的操作
数组是 普通用户 和 管理员 都需要,所以直接在父类创建即可
public NormalUser(String name) {super(name);operations = new IOperation[]{new ExitOperation(),new ListOperation(),new FindOperation(), new BorrowOperation(), new ReturnOperation()};}
注意这里创建的是数组,元素和元素直接用 “,”隔开。
数组创建写在构造方法内,实例化一个用户,都要操作可以调用
管理员的操作
public Admin(String name) {super(name);operations = new IOperation[]{new ExitOperation(),new ListOperation(),new FindOperation(),new AddOperation(),new DelOperation()};}
7、Main 类
当我们准备好了所有对象(书、用户、操作),就可以通过一个主逻辑将所有内容串起来
7.1 创建书籍管理对象
BookList bookList = new BookList();
7.2 创建用户对象
这里的身份有两个,所以需要写一个方法,让用户自己选择一个身份
//实例化用户对象
User user = login();//选择身份方法
private static User login(){//让用户输入自己的身份Scanner scanner = new Scanner(System.in);System.out.println("请输入您的姓名:");String name = scanner.next();System.out.println("请输入你的身份:(1 普通用户,2 管理员)");int role = scanner.nextInt();if(role == 1){return new NormalUser(name);} else if (role == 2) {return new Admin(name);}else {System.out.println("输入有误");return null;}
}
7.3 构建一个主循环
用户可以不断选择要进行的操作
while(true){}
7.4 显示用户对应的菜单
while(true){//这里会触发多态,根据实际指向来决定是谁的菜单int choice = user.menu();
}
7.5 根据序号,执行对应操作
//给user 提供一个对应的 “执行” 的方法,最终都是落到对应的 IOperation 对象上
user.work(choice,bookList);//回到 User 类里创建对应方法
public void work(int choice, BookList bookList){//这个操作,是通过输入的 choise 值选择数组中对应的那个操作//这里每个操作的下标要和菜单上的序号一一对应//这里还可以添加一个判断,判断输入的数字是否合法if(choice < 0 && choice > operations.length){System.out.println("输入的选项非法");return;}operations[choice].work(bookList);
}
当主逻辑写到这里,就可以进行测试了
测试顺利就可以进入最后的 操作实现
8、IOperation 操作实现
8.1 ExitOperation
package library.operation;import library.BookList;public class ExitOperation implements IOperation{@Overridepublic void work(BookList bookList) {//只需要结束整个程序System.out.println("Goodbye!");//这里的参数是程序的退出码,不重要System.exit(0);}
}
8.2 ListOperation
package library.operation;import library.Book;
import library.BookList;public class ListOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("查看书籍列表");for(int i = 0 ; i< bookList.getSize();i++){Book book = bookList.getBook(i);System.out.println("[" + i + "]" + book);}}
}
通过 for 循环对我们存储书的数组进行遍历,循环的次数来自父类的 size ,循环里分别指向图书列表每一个,最后进行打印,这里在打印时添加一个下标,方便之后进行利用下标进行删除
我们会看到打印出来的结果是一段哈希码,我们需要再写一个 toString 方法,回到 Book类中
@Override
public String toString() {return "[" + name + "," + author + "," + price + "," + type + "," + isBorrowed + "]";
}
这样就把我们的书籍列表打印出来了
8.3 AddOperation
让用户输入新的书籍,并添加到书籍列表中
package library.operation;import jdk.swing.interop.SwingInterOpUtils;
import library.Book;
import library.BookList;import java.util.Scanner;public class AddOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("新增图书");Scanner scanner = new Scanner(System.in);System.out.println("请输入一个书名:");String name = scanner.next();System.out.println("请输入作者:");String author = scanner.next();System.out.println("请输入价格:");Double price = scanner.nextDouble();System.out.println("请输入类型:");String type = scanner.next();Book book = new Book(name,author,price,type);int size = bookList.getSize();bookList.setBooks(size,book);bookList.setSize(size + 1);System.out.println("新增图书完成");}
}
通过 书 的四个属性创建一本新的书,先获取 size 再通过 size 来找到 书 存放的位置,最后让 size+1 表示当前图书的有效位置
可以看到已经成功将新书存入书籍列表中了
8.4 DelOperation
在写删除之前先来了解一个小知识,当我们进行删除文件时,总是能非常快速的完成,无论文件大小,删除都是一瞬间。因为在硬盘里,当你进行删除时,硬盘会将你所删除的这个文件在的位置声明这里没有东西,实际上你的文件还是存在,只是之后新的数据会覆盖在这个区域上。这也是文件误删后可以通过技术手段进行找回的原因
在这写删除仍然使用这个概念,当我们删除图书时,只需要将有效图书个数-1就可以,书依然存在数组里但是不会显示出来。
这里又牵出了一个问题,有效个数-1只会让最后一本图书不显示,当删除的书不是最末尾的书呢,所以这里可以将问题转换,如果要删除其中一本,只要让这本和最末尾的书进行交换即可
package library.operation;import library.BookList;import java.util.Scanner;public class DelOperation implements IOperation{@Overridepublic void work(BookList bookList) {Scanner scanner = new Scanner(System.in);System.out.println("输入要删除的图书序号");//创建变量 index 来记录要删除的图书的序号int index = scanner.nextInt();//判断一下序号是否在范围内if(index<0 || index>=bookList.getSize()){System.out.println("序号有误");return ;}//判断删除的序号是不是最后一本if(index == bookList.getSize() -1){//如果是最后一本,就把 Size-1 bookList.setSize(bookList.getSize() -1);}else {//如果不是最后一本,就要把最后一本复制到删除的序号位置// 修改图书(要修改的下标,要修改的图书 (最后一本书的下标))bookList.setBooks(index,bookList.getBook(bookList.getSize()-1));//最后也要让 Size-1bookList.setSize(bookList.getSize() -1);}System.out.println("删除成功");}
}
删除前:
进行删除:
删除后:
原来在最后的福尔摩斯探案集就来到原来高等数学的位置,这样就算删除成功了
8.5 BorrowOperation
借阅只需要修改单个属性即可
package library.operation;import library.Book;
import library.BookList;import java.util.Scanner;public class BorrowOperation implements IOperation{@Overridepublic void work(BookList bookList) {Scanner scanner = new Scanner(System.in);System.out.println("输入要借阅的图书序号");int index = scanner.nextInt();//这里将我们要借阅的图书实例化,才可以修改它的 BorrowBook book = bookList.getBook(index);//因为Borrwed属性是布尔值,所以不需要去写 == trueif(book.getBorrowed()){System.out.println("该书已被借阅");}else {//借阅成功后修改属性book.setBorrowed(true);System.out.println("借阅成功");}}
}
借阅过程:
借阅结果:
8.6 ReturnOperation
归还图书也差不多,只需要修改一些内容
package library.operation;import library.Book;
import library.BookList;import java.util.Scanner;public class ReturnOperation implements IOperation{@Overridepublic void work(BookList bookList) {Scanner scanner = new Scanner(System.in);System.out.println("输入要归还的图书序号");int index = scanner.nextInt();Book book = bookList.getBook(index);if(book.getBorrowed()){book.setBorrowed(false);System.out.println("归还成功");}else {System.out.println("该书未被借阅");}}
}
8.7 FindOperation
这里写简单一些,只通过书名来查找书的序号
package library.operation;import library.Book;
import library.BookList;import java.util.Scanner;public class FindOperation implements IOperation{@Overridepublic void work(BookList bookList) {//输入姓名Scanner scanner = new Scanner(System.in);String name = scanner.next();//对所有图书进行遍历for(int i = 0;i< bookList.getSize();i++){//对图书进行实例化Book book = bookList.getBook(i);//判断字符串是否相等需要用到equalsif(book.getName().equals(name)){//相等则打印书籍信息System.out.println(book);}}System.out.println("查找结束");}
}
完
相关文章:
【Java】—— 图书管理系统
基于往期学习的类和对象、继承、多态、抽象类和接口来完成一个控制台版本的 “图书管理系统” 在控制台界面中实现用户与程序交互 任务目标: 1、系统中能够表示多本图书的信息 2、提供两种用户(普通用户,管理员) 3、普通用户…...
初识Linux · 线程同步
目录 前言: 认识条件变量 认识接口 快速使用接口 生产消费模型 前言: 前文我们介绍了线程互斥,线程互斥是为了防止多个线程对临界资源访问的时候出现了对一个变量同时操作的情况,对于线程互斥来说,我们使用到了锁…...
游戏引擎学习第40天
仓库 : https://gitee.com/mrxiao_com/2d_game 整理了一些需要完成的任务,确保所有内容都已清理完成,因为需要为后续的数学部分打好基础。下一步将认真开始处理数学相关内容,因此在此之前,需要彻底梳理未完成的事项,清…...
概率论——假设检验
解题步骤: 1、提出假设H0和H1 2、定类型,摆公式 3、计算统计量和拒绝域 4、定论、总结 Z检验 条件: 对μ进行检验,并且总体方差已知道 例题: 1、假设H0为可以认为是570N,H1为不可以认为是570N 2、Z…...
【Pandas】pandas isnull
Pandas2.2 General Top-level missing data 方法描述isna(obj)用于检测数据中的缺失值isnull(obj)用于检测数据中的缺失值notna(obj)用于检测数据中的非缺失值notnull(obj)用于检测数据中的非缺失值 pandas.isnull() pandas.isnull() 是 Pandas 库中的一个函数,…...
Rust HashMap使用
Rust 的 HashMap 是一个功能强大的数据结构,它结合了哈希表的高效性和 Rust 编程语言的内存安全特性。通过提供常数时间复杂度的查找、插入和删除操作,以及丰富的 API,它在许多实际应用中都非常有用。 示例代码: use std::colle…...
Spring Boot如何实现防盗链
一、什么是盗链 盗链是个什么操作,看一下百度给出的解释:盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的…...
TIM输入捕获---STM
一、简介 IC输入捕获 输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存在CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数 每个高级定时器和通用定时器都拥有4个输入捕获通道 可配置为PWMI模…...
核密度估计——从直方图到核密度(核函数)估计_带宽选择
参考 核密度估计(KDE)原理及实现-CSDN博客 机器学习算法(二十一):核密度估计 Kernel Density Estimation(KDE)_算法_意念回复-GitCode 开源社区 引言 在统计学中,概率密度估计是一种重要的方法࿰…...
javaScript Tips
一键去掉鼠标的图标 document.body.style.cursor none; 获取一个随机颜色 const randomHex () >#${Math.floor(Math.random() * 0xffffff).toString(16).padEnd(6, 0)}; 生成随机字符串,各种随机基本都是这个原理 const randomString () > Math.rand…...
【Ubuntu】清理、压缩VirtualBox磁盘空间大小
1、说明 本人为虚拟机创建了两个硬盘:root.vdi 和 hoom.vdi,在创建虚拟机时,分别挂载在/root目录和/home目录下。 下面演示分别清理、压缩两个磁盘的空间。 2、清理空间 1)清理 root.vid sudo dd if=/dev/zero of=/EMPTY bs=1M;sudo rm -f /EMPTY输出信息中会提示,如…...
若依 ruoyi VUE el-select 直接获取 选择option 的 label和value
1、最新在研究若依这个项目,我使用的是前后端分离的方案,RuoYi-Vue-fast(后端) RuoYi-Vue-->ruoyi-ui(前端)。RuoYi-Vue-fast是单应用版本没有区分那么多的modules 自己开发起来很方便,这个项目运行起来很方便,但是需要自定义的…...
C++小小复习一下
类,对象,成员变量,成员函数 特点:面向对象程序设计---因为要创建对象来调用类里面的函数或者成员变量 比如你的对象是一个生物-人:他会有自己的一些属性:身高,体重,性别等…...
JavaWeb学习(4)(四大域、HttpSession原理(面试)、SessionAPI、Session实现验证码功能)
目录 一、web四大域。 (1)基本介绍。 (2)RequestScope。(请求域) (3)SessionScope。(会话域) (4)ApplicationScope。(应用域) (5)PageScope。(页面域) 二、Ht…...
quartz 架构详解
Quartz是一个开源的作业调度框架,完全由Java编写,主要用于定时任务的调度和管理。Quartz的架构主要包括以下几个核心组件: 1.调度器(Scheduler):调度器是Quartz的核心组件,负责管理Qua…...
Redis安装和Python练习(Windows11 + Python3.X + Pycharm社区版)
环境 Windows11 Python3.X Pycharm社区版 思路 1 github下载redis压缩包 ,安装并启动redis服务,在Pycharm中运行python程序,连接redis服务,熟悉redis的使用和巩固python语言。 2 python开发环境的搭建参考 https://mp.csdn.…...
明年 iPhone 将搭载苹果自研 5G 基带芯片
明年 iPhone 将搭载苹果自研 5G 基带芯片 据彭博社记者 Mark Gurman 透露,苹果首款自主研发 5G 基带芯片即将面世。 苹果首款自研 5G 基带芯片将命名为「Sinope」,将应用在 2025 年发布的 iPhone SE、iPhone 17 Slim 版以及低端系列的 iPad 系列。「Si…...
1.1 Beginner Level学习之“编写简单的发布服务器和订阅服务器”(第十二节)
学习大纲: 1. 编写发布服务器节点 在ROS中,**节点(Node)**是与ROS网络通信的基本单位。在这个部分,我们将创建一个简单的发布节点(talker),它会不断向话题(topic&#x…...
C语言 字符串操作函数
strncpy() 用于将一个字符串的一部分拷贝到另一个字符串中。 char* strncpy(char* destination, const char* source, size_t num);参数:destination 是目标字符串的指针,表示将要拷贝到的位置source 是源字符串的指针,表示要拷贝的字符串num…...
论文概览 |《Cities》2024.07 Vol.150(上)
本次给大家整理的是《Cities》杂志2024年07月第150期的论文的题目和摘要,一共包括90篇SCI论文!由于论文过多,我们将通过两篇文章进行介绍,本篇文章介绍第1--第45篇论文! 论文1 Spatiotemporal infection dynamics: Linking indiv…...
查看Windows系统上的Redis服务器是否设置了密码
查看 Redis 配置文件 1.找到 Redis 配置文件: 通常Redis配置文件名为 redis.windows.conf 或 redis.conf,它位于Redis安装目录中。 2.打开配置文件: 使用文本编辑器(如Notepad、VS Code等)打开该文件。 3.查找 re…...
30天学会Go--第6天 GO语言 RESTful API 学习与实践
30天学会Go–第6天 GO语言 RESTful API 学习与实践 文章目录 30天学会Go--第6天 GO语言 RESTful API 学习与实践一、 RESTful API 的设计原则1.1 RESTful API 的核心概念1.2 RESTful API 的 URL 设计1.3 RESTful API 的数据格式 二、 实现 RESTful API2.1 定义数据模型2.2 实现…...
数据分析特征标准化方法及其Python实现
数据分析特征标准化方法及其Python实现 1、概述 在数据分析中,对特征进行标准化主要是: 1、消除量纲影响 不同特征可能具有不同的量纲和数量级。 例如,一个特征可能是以米为单位的长度,而另一个特征可能是以秒为单位的时间。直接使用这些具有不同量纲的原始数据进行分析…...
【推导过程】常用共轭先验分布
文章目录 相关教程相关文献常用共轭先验分布预备知识贝叶斯统计后验分布的计算 正态均值(方差已知)的共轭先验分布是正态分布二项分布中的成功概率 θ 的共轭先验分布是贝塔分布正态均值(方差已知)的共轭先验分布是倒伽玛分布 作者:小猪快跑 基础数学&计算数学&…...
notepad++安装教程(超详细)
1.下载地址(可以私信博主) https://notepad-plus.en.softonic.com/download 2.解压安装...
Django快速入门
目录 1 创建django工程2 运行django3 Django工程目录详解4 开始一个app5 CBV和FBV6 使用模板7 使用模板语言8 自定义simple_tag Django 是用 Python 写的一个自由和开放源码 web 应用程序框架。 web框架是一套组件,能帮助你更快、更容易地开发web站点。当你开始构建…...
ISO45001职业健康安全管理体系认证流程
前期准备 领导决策:企业高层领导需认识到实施 ISO 45001 体系的重要性和必要性,做出认证决策,并承诺提供必要的资源支持。成立工作小组:由企业各相关部门人员组成工作小组,明确各成员的职责和分工,确保工作…...
Elasticsearch一分钟
参考 FST有穷状态转换器/咆哮位图/增量缩紧 Es技术难点 架构...
MFC中如何创建一个非模态对话框
对话框是编程中常用的一个控件,非模态对话框与用户交互更加友好,用户不必关闭对话框就能进行其他操作,比如拷贝黏贴,对比数据,执行其他命令。 由于无模态对话经常使用,且用法类似,因此我把它写…...
【设计模式】单例模式 在java中的应用
文章目录 引言什么是单例模式单例模式的应用场景单例模式的优缺点优点缺点 单例模式的基本实现饿汉式单例模式懒汉式单例模式双重检查锁定静态内部类枚举单例 单例模式的线程安全问题多线程环境下的单例模式线程安全的实现方式1. **懒汉式单例模式(线程不安全&#…...
北京2024年CSP-S/J 及NOIP游记
北京2024年CSP-S/J 及NOIP游记 2024.9 开学2024.9 CSP-S12024.9 停课2024.10假期 误入歧途2024.10 CSP-S2 冲刺 2024.9 开学 开学升入初三,9月的前半个月一直在搞文化课(把文化课搞得风生水起),经历了1天的校运动会(摆…...
vue 纯前端对接阿里云oss文件上传封装,支持批量多文件上传,大文件上传时拿到上传进度。
使用阿里云上传先看官方文档(阿里云官方文档) 我这边只做了简单上传和分片上传,也包含了粘贴上传和拖拽上传。 1.首页先安装 npm i ali-oss2.在utils下创建uploadOss.js const OSS require(ali-oss) import { getOsstoken } from /api/in…...
YOLO系列发展历程:从YOLOv1到YOLO11,目标检测技术的革新与突破
文章目录 前言一、YOLOv1:单阶段目标检测的开端二、YOLOv2:更精准的实时检测三、YOLOv3:阶梯特征融合四、YOLOv4:性能和速度的新平衡五、YOLOv5:易用性和扩展性的加强六、YOLOv6:工业部署的利器七、YOLOv7&…...
认识Java中的异常(半成品)
1.异常的概念与体系结构 1.1在Java中,将程序执行过程中发生的不正常行为称为异常.比如 1.算数异常 public class Main1 {public static void main(String[] args){System.out.println(10/0);} } //异常信息为:Exception in thread "main" java.lang.ArithmeticExc…...
Sqoop 指令语法手册
目录 help指令list-databases参数描述示例 codegen参数描述 Sqoop create-hive-table参数描述 eval参数描述 Export参数描述 import参数描述 import-all-tables参数描述 import-mainframe参数描述 job参数描述 list-tables参数描述 merge参数描述 help指令 sqoop help 下面的S…...
网络安全 - SQL Injection
1.1.1 摘要 日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码被流传于网络,连日来引发众多网民对自己账号、密码等互联网信息被盗取的普遍担忧。 网络…...
spi 发送与接收 移位写法
spi _tx 发送模块 片选信号cs可以在top顶层控制模块产生 timescale 1ns / 1psmodule spi_rom#(parameter SIZE 8 )(input wire clk ,input wire rst_n,input wire [SIZE-1:0] data ,input wire …...
MyBatis关联映射
目录 一、什么是关联注解? 二、数据库建表 1.学生表 2.教师表 三、一般查询 (1)创建StudentTeacher类 (2)mapper层 (3)Dao接口 (4)Test类 (5&#x…...
通过华为鲲鹏认证的软件产品如何助力信创产业
软件通过华为鲲鹏认证与信创产业有着密切的联系。鲲鹏认证是华为推动信创产业发展的一项重要举措,通过该认证,软件可以在华为的生态系统中实现更好的兼容性和性能优化,从而推动信创产业的全面发展和国产化替代。 鲲鹏认证的定义和重要性 鲲…...
陈志刚解读:国家数据基础设施建设解读(附下载)
本期分享陈志刚解读:国家数据基础设施建设解读,从背景意图、概念内涵、发展愿景与总体功能、总体架构、重点方向、算力底座、网络支撑、安全防护和组织保障十个方面展开,共52页ppt。 加入星球可获取完整版资料 篇幅限制,部分内容…...
QT 中 sqlite 数据库使用
一、前提 --pro文件添加sql模块QT core gui sql二、使用 说明 --用于与数据库建立连接QSqlDatabase--执行各种sql语句QSqlQuery--提供数据库特定的错误信息QSqlError查看qt支持的驱动 QStringList list QSqlDatabase::drivers();qDebug()<<list;连接 sqlite3 数据库 …...
VPN设备
定义: 虚拟专用网络指的是在公用网络上建立专用网络的技术。之所以称为虚拟网主要是因为整个VPN网络的任意两个节点之间的连接并没 有传统专网所需的端到端的物理链路,而是架构在公用网络服务商所提供的网络平台之上的逻辑网络,用户数据在逻辑链路中传输…...
centos部署SkyWalking并在springcloud项目中用法举例
文章目录 场景SkyWalking介绍部署部署Storage [单机版Elasticsearch]部署SkyWalking OAP [下载地址](https://skywalking.apache.org/downloads/#SkyWalkingAPM)部署SkyWalking Java AgentspringCloud 使用举例 场景 SkyWalking是应用性能监控平台,可用于分布式系统…...
[创业之路-186]:《华为战略管理法-DSTE实战体系》-1-为什么UTStarcom死了,华为却活了,而且越活越好?
目录 前言 一、市场定位与战略选择 二、技术创新能力 三、企业文化与团队建设 四、应对危机的能力 五、客户为中心的理念 六、市场适应性与战略灵活性 七、技术创新与研发投入 八、企业文化与团队建设 九、应对危机的能力 前言 UT斯达康(UTStarcom&#…...
算法设计5_分支限界法
分支限界法 分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树,裁剪那些不能得到最优解的子树以提高搜索效率。 步骤: ① 定义解空间(对解编码); ② 确定解空间的树结构; ③ 按BFS等方式搜索: a.每个活…...
【设计模式系列】状态模式(二十三)
一、什么是状态模式 状态模式(State Pattern)是一种行为设计模式,其核心目的是管理一个对象在其内部状态改变时的行为变化,其核心理念是将对象的行为和状态分离。这种模式通过将每个状态相关的行为封装在独立的类中,使…...
github创建发布分支
创建一个名为 latest 的分支,并将其作为稳定版本分支。以下是操作步骤: 1. 创建 latest 分支 首先,确保你在 master 分支(或当前的稳定版本分支)上,并且已经提交了所有更改。然后,你可以创建一…...
【Linux】网络服务
声明,以下内容均学习自《Linux就该这么学》一书 1、创建网络会话 Linux系统使用NetworkManager提供网络服务,它是一种动态管理网络配置的守护进程,能够让网络设备保持连接状态。 nmcli nmcli是一款基于命令行的网络配置工具,它…...
错题:Linux C语言
题目:手写代码:判断一个数(int类型的整数)中有有多少1 题目:手写代码:判断一个数(转换成二进制表示时)有几个1 #include <stdio.h> int main(int argc, const char *argv[]) { //判断一个数…...
机器学习期末速成
文章参考自B站机器学习期末速成课 本文仅作者个人复习使用 一、机器学习分类 聚类和分类的区别: 分类:一开始就知道有哪些类别 聚类:一开始不知道有哪些类别 损失函数:简单来说就是你预测出来的结果和真实值的差距。 0-1损失函数…...