图书馆管理系统——控制台打印版本
一:模式介绍:
1.采用MVC的模式
补充:1.视图层是用来和用户打交道的,处理用户的输入,将一些从控制台得来的数据返回出去,以及提示用户的操作
2.数据操作类:用来操作数据的增删改查,
3.逻辑调度层:通过将调度视图层和数据层的数据关系,将整个系统串联起来,实现功能
二:代码
1.实体类:
1.1)就是表示图书属性的类
1 import java.util.Objects; 2 3 public class Book { 4 private String name; 5 private Double price; 6 private Integer year; 7 private Integer month; 8 9 public Book() {}; 10 11 public String getName() { 12 return name; 13 } 14 15 public void setName(String name) { 16 this.name = name; 17 } 18 19 public Double getPrice() { 20 return price; 21 } 22 23 public void setPrice(Double price) { 24 this.price = price; 25 } 26 27 public Integer getYear() { 28 return year; 29 } 30 31 public void setYear(Integer year) { 32 this.year = year; 33 } 34 35 public Integer getMonth() { 36 return month; 37 } 38 39 public void setMonth(Integer month) { 40 this.month = month; 41 } 42 43 @Override 44 public String toString() { 45 return "Book{" + 46 "name='" + name + '\'' + 47 ", price=" + price + 48 ", year=" + year + 49 ", month=" + month + 50 '}'; 51 } 52 53 @Override 54 public boolean equals(Object o) { 55 if (this == o) return true; 56 if (o == null || getClass() != o.getClass()) return false; 57 Book book = (Book) o; 58 return Objects.equals(name, book.name) && 59 Objects.equals(year, book.year) && 60 Objects.equals(month, book.month); 61 } 62 63 @Override 64 public int hashCode() { 65 return Objects.hash(name, year, month); 66 } 67 }
1.2)图书管理系统有一个登录的界面,这里另外写一个登录的类
1 import java.util.Objects; 2 import java.util.Scanner; 3 4 /** 5 * 这是一个登录类 6 */ 7 public class Login{ 8 //定义默认的密码和登录名 9 private String loginName = "白杨树"; 10 private String password = "winterFlower"; 11 12 public Login() { 13 } 14 15 public String getLoginName() { 16 return loginName; 17 } 18 19 public void setLoginName(String loginName) { 20 this.loginName = loginName; 21 } 22 23 public String getPassword() { 24 return password; 25 } 26 27 public void setPassword(String password) { 28 this.password = password; 29 } 30 31 @Override 32 public boolean equals(Object o) { 33 if (this == o) return true; 34 if (o == null || getClass() != o.getClass()) return false; 35 Login login = (Login) o; 36 return Objects.equals(loginName, login.loginName) && 37 Objects.equals(password, login.password); 38 } 39 40 @Override 41 public int hashCode() { 42 return Objects.hash(loginName, password); 43 } 44 45 public boolean register(Login login){ 46 if(this.loginName.equals(login.getLoginName()) && this.password.equals(login.getPassword())){ 47 System.out.println("登录成功"); 48 }else{ 49 System.out.println("你输入的登录名或者密码错误,请重新输入"); 50 return register(login); 51 } 52 return true; 53 } 54 }
2.视图层:
1 import java.util.ArrayList; 2 import java.util.Iterator; 3 import java.util.Scanner; 4 @SuppressWarnings("all") 5 public class LibraryView { 6 private static Scanner input = new Scanner(System.in); 7 8 /** 9 * 这是一个欢迎登录的界面 10 * @return 11 */ 12 public Login loginMenu(){ 13 System.out.println("欢迎登陆"); 14 System.out.println("请输入登录名和密码"); 15 String loginName = input.nextLine(); 16 String password = input.nextLine(); 17 //创建登录对象 18 Login login = new Login(); 19 login.setLoginName(loginName); 20 login.setPassword(password); 21 return login; 22 } 23 24 /** 25 * 这是一个功能选择视图 26 * 1.添加图书 27 * 2.修改图书信息 28 * 3.删除图书 29 * 4.根据图书名称模糊查找 30 * 5.查看所有图书 31 * 0.退出系统 32 * @return 33 */ 34 public int chooseFunction(){ 35 System.out.println("请根据提示选择你的操作功能"); 36 System.out.println("1-添加图书,2-修改图书信息,3-删除图书,4-根据图书名称模糊查找,5-查看所有图书,0-退出系统"); 37 String num = input.nextLine(); 38 int number = -1; 39 try{ 40 number = Integer.parseInt(num); 41 }catch (NumberFormatException e){ 42 System.out.println("请你重写输入一个数字"); 43 return chooseFunction(); 44 } 45 return number; 46 } 47 48 49 /** 50 * 这是一个添加图书的视图 51 * @return 52 */ 53 public Book addView(){ 54 System.out.println("请输入图示的名字和价格"); 55 String bookName = input.nextLine(); 56 String price = input.nextLine(); 57 double money = -1; 58 try{ 59 money = Double.parseDouble(price); 60 }catch (NumberFormatException e){ 61 System.out.println("请你输入一个数字"); 62 return addView(); 63 } 64 //创建一个图书对象 65 Book book = new Book(); 66 book.setName(bookName); 67 book.setPrice(money); 68 return book; 69 } 70 71 public Book updateView(){ 72 System.out.println("请输入新的图书名字和价格"); 73 String bookName = input.nextLine(); 74 String price = input.nextLine(); 75 double money = -1; 76 try{ 77 money = Double.parseDouble(price); 78 }catch (NumberFormatException e){ 79 System.out.println("请你输入一个数字"); 80 return updateView(); 81 } 82 //创建图书对象 83 Book book = new Book(); 84 book.setName(bookName); 85 book.setPrice(money); 86 return book; 87 } 88 89 /** 90 * 这是提示用户输入他要修改图书的名字 91 * @return 92 */ 93 public String updateByName(){ 94 System.out.println("请输入你要修改的图书名字"); 95 String bookName = input.nextLine(); 96 return bookName; 97 } 98 99 /** 100 * 获取要修改图书的出版年份 101 * @return 102 */ 103 public int updateByYear(){ 104 System.out.println("请输入你要修改图书的出版年份"); 105 String time = input.nextLine(); 106 int year = -1; 107 try{ 108 year = Integer.parseInt(time); 109 }catch (NumberFormatException e){ 110 System.out.println("请输入一个年份"); 111 return updateByYear(); 112 } 113 if(year<1000 || year>9999){ 114 System.out.println("请输入一个四位数的年份"); 115 return updateByYear(); 116 } 117 return year; 118 } 119 120 /** 121 * 获取要修改图书的出版月份 122 * @return 123 */ 124 public int updateByMoth(){ 125 System.out.println("请输入你要修改图书的出版月份"); 126 String time1 = input.nextLine(); 127 int month = -1; 128 try{ 129 month = Integer.parseInt(time1); 130 }catch (NumberFormatException e){ 131 System.out.println("请输入一个年份"); 132 return updateByMoth(); 133 } 134 if(month<1 || month>12){ 135 System.out.println("请输入一个四位数的年份"); 136 return updateByYear(); 137 } 138 return month; 139 } 140 141 /** 142 * 键盘输入我们要修改的图书,并将修改后的图书返回出去 143 * @param book 144 * @return 145 */ 146 public Book newInformation(Book book) { 147 System.out.println("请输入新的图书名字"); 148 String bookName = input.nextLine(); 149 System.out.println("请输入新的图书价格,年份和月份"); 150 String money = input.nextLine(); 151 String year = input.nextLine(); 152 String month = input.nextLine(); 153 double price = -1; 154 int year1 = -1; 155 int month1 = -1; 156 try { 157 price = Double.parseDouble(money); 158 year1 = Integer.parseInt(year); 159 month1 = Integer.parseInt(month); 160 } catch (NumberFormatException e) { 161 System.out.println("请输入正确的价格或者年份和月份"); 162 return newInformation(book); 163 } 164 if ((year1 < 1000 || year1 > 9999) && (month1 < 1 || month1 > 12)) { 165 System.out.println("请输入正确的年份和月份"); 166 return newInformation(book); 167 } 168 book.setName(bookName); 169 book.setPrice(price); 170 book.setMonth(month1); 171 book.setYear(year1); 172 return book; 173 } 174 /** 175 * 这是展示所有图书的界面 176 */ 177 public void show(ArrayList<Book>list){ 178 if(!list.isEmpty()){ 179 Iterator<Book> iterator = list.iterator(); 180 while(iterator.hasNext()){ 181 Book text = iterator.next(); 182 System.out.println(text); 183 } 184 } 185 else{ 186 System.out.println("null"); 187 } 188 } 189 190 }
3.数据操作层:
1 import java.util.ArrayList; 2 import java.util.Calendar; 3 import java.util.Iterator; 4 5 public class LibraryDao { 6 //创建一个集合来存储图书 7 private static ArrayList<Book> list = new ArrayList<>(10000); 8 9 //新增图书 10 public boolean add(Book book) { 11 if (list.contains(book)) { 12 return false; 13 } 14 //年份 15 int year = getYear(); 16 //月份 17 int month = getMonth(); 18 //设置年份和月份 19 book.setYear(year); 20 book.setMonth(month); 21 list.add(book); 22 return true; 23 } 24 25 /** 26 * 由系统获取年份 27 * 28 * @return 29 */ 30 public int getYear() { 31 //获取日期对象 32 Calendar cl = Calendar.getInstance(); 33 //调用获取年份的方法 34 Integer year = Integer.valueOf(cl.get(Calendar.YEAR)); 35 return year; 36 } 37 38 /** 39 * 由系统获取月份 40 * 41 * @return 42 */ 43 public int getMonth() { 44 //获取日期对象 45 Calendar cl = Calendar.getInstance(); 46 //调用获取年份的方法 47 Integer month = Integer.valueOf(cl.get(Calendar.MONTH)); 48 return month; 49 } 50 51 /** 52 * 查找要修改的图书 53 * @param bookName 54 * @param year 55 * @param month 56 * @return 57 */ 58 public Book findBook(String bookName, int year, int month) { 59 //遍历集合,查看集合中的图书是否有我们要修改的 60 if (!list.isEmpty()) { 61 Iterator<Book> iterator = list.iterator(); 62 while (iterator.hasNext()) { 63 Book text = iterator.next(); 64 if (text.getName().equals(bookName) && text.getYear() == year && text.getMonth() == month) { 65 return text; 66 } 67 } 68 } 69 return null; 70 } 71 72 /** 73 * 删除图书 74 * @param book 75 */ 76 public void delete(Book book){ 77 list.remove(book); 78 } 79 80 81 /** 82 * 根据图书名称模糊查找 83 * @param 84 * @return 85 */ 86 public Book findByName(String name){ 87 //遍历集合中的每一本书 88 if(!list.isEmpty()){ 89 Iterator<Book> iterator = list.iterator(); 90 while (iterator.hasNext()) { 91 Book text = iterator.next(); 92 if(text.getName().equals(name)){ 93 return text; 94 } 95 } 96 } 97 return null; 98 } 99 100 /** 101 查看所有图书 102 * @return 103 */ 104 public ArrayList<Book> printAll() { 105 return list; 106 } 107 }
4.逻辑调度层:一般是在Main方法中,但是为了让代码结构更加简洁,将逻辑调度另在一个类中写一个方法,这样在Main()方法中只用调用这个方法就可以了。
4.1)
1 import java.util.ArrayList; 2 3 public class Administrator { 4 static LibraryView view = new LibraryView(); 5 static LibraryDao dao = new LibraryDao(); 6 //管理员操作的动作 7 public static void operateByAdministrator(){ 8 //定义一个数来控制循环跳出去 9 int number = -1; 10 while(number!=0){ 11 int num = view.chooseFunction(); 12 switch (num){ 13 case 1: 14 Book book = view.addView(); 15 dao.add(book); 16 break; 17 case 2: 18 //修改图书 19 //1.获取要修改的图书的信息 20 String name = view.updateByName(); 21 int year = view.updateByYear(); 22 int month = view.updateByMoth(); 23 //2.获取要修改的图书 24 Book book1 = dao.findBook(name, year, month); 25 if(book1!=null) { 26 Book book4 = view.newInformation(book1); 27 //将修改的图书打印出来 28 System.out.println(book4.toString()); 29 }else { 30 System.out.println("你查找的图书并不存在"); 31 } 32 break; 33 case 3: 34 //删除 35 //1.获取要删除的图书的信息 36 String name1 = view.updateByName(); 37 int year1 = view.updateByYear(); 38 int month1 = view.updateByMoth(); 39 //2.获取要修改的图书 40 Book book2 = dao.findBook(name1, year1, month1); 41 if(book2!=null) { 42 dao.delete(book2); 43 }else { 44 System.out.println("你要删除的图书并不存在的图书并不存在"); 45 } 46 break; 47 case 4: 48 //根据图书名字模糊查询图书 49 String name3 = view.updateByName(); 50 Book book3 = dao.findByName(name3); 51 if(book3!=null) { 52 //将找到的图书打印出来 53 System.out.println(book3.toString()); 54 }else{ 55 System.out.println("你要查找的图书并不存在"); 56 } 57 break; 58 case 5: 59 //展示所有图书 60 ArrayList<Book> books = dao.printAll(); 61 view.show(books); 62 break; 63 case 0: 64 num = 0; 65 return; 66 } 67 } 68 } 69 }
4.2)
1 public class Test { 2 public static void main(String[] args) { 3 //创建视图对象 4 LibraryView view = new LibraryView(); 5 //创建登录对象 6 Login login = new Login(); 7 //登录视图,返回一个登录对象 8 Login ll = view.loginMenu();//ll为返回的登录对象 9 boolean flag = login.register(ll); 10 if(flag){ 11 /** 12 * 如果登录成功,接下来就由管理自己操作,所以此处重新创建一个管理员类 13 */ 14 //创建管理员类对象 15 Administrator.operateByAdministrator(); 16 17 } 18 19 } 20 }
三:结语:
1.坚持就是胜利,让我们一起好好努力吧,绝对是不可以放弃的,宝贝加油!
2.引用老师的一句话:“早起的鸟儿有虫吃,乱写的代码有bug”。(深有体会,哈哈哈)