项目简介
通过网络编程的传输方式来实现图书管理系统的增删查改操作,这个传输过程也类似于web应用的前后端数据传输,前端发来请求,通过对请求的处理之后交由后端接口去处理并返回所需要的数据。
需求分析
1、需要有管理员登录页,以及管理员验证功能
2、实现基本的增删查改操作,还有各种排序查找方式
实现过程
思路
1、需要设计好相对应的实体类以及相应属性
代码如下
Book类
package com.networkBook.entity;
import java.io.Serializable;
import java.util.Date;
import java.util.Objects;
public class Books implements Serializable {
private String name;//书名
private int pageNum;//书本页数
private double price;//价格
private Date date;//日期
public Books() {
}
public Books(String name, int pageNum, double price, Date date) {
this.name = name;
this.pageNum = pageNum;
this.price = price;
this.date = date;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Books books = (Books) o;
return pageNum == books.pageNum && Double.compare(books.price, price) == 0 && Objects.equals(name, books.name) && Objects.equals(date, books.date);
}
@Override
public int hashCode() {
return Objects.hash(name, pageNum, price, date);
}
@Override
public String toString() {
return "Books{" +
"name='" + name + '\'' +
", pageNum=" + pageNum +
", price=" + price +
", date=" + date +
'}';
}
}
Admin类
package com.networkBook.entity;
import java.io.Serializable;
import java.util.Objects;
public class Admin implements Serializable {
private String name;//管理员登录名
private String password;//密码
public Admin(String name, String password) {
this.name = name;
this.password = password;
}
public Admin() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Admin admin = (Admin) o;
return Objects.equals(name, admin.name) && Objects.equals(password, admin.password);
}
@Override
public int hashCode() {
return Objects.hash(name, password);
}
@Override
public String toString() {
return "Admin{" +
"name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
2、这里仿照mvc模式,所以也有相对应的Service和Controller,并且用文件存储加List集合方式来仿照数据库的操作
代码如下:
BookService类
package com.networkBook.service;
import com.networkBook.entity.Books;
import java.util.List;
public interface BookService {
public boolean add(Books books);
public boolean update(Books books1,Books books2);
public boolean delete(Books books);
public Books findByName(String name);
public List<Books> findAll();
}
BookServiceImpl类
package com.networkBook.service.impl;
import com.networkBook.entity.Books;
import com.networkBook.service.BookService;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class BookServiceImpl implements BookService {
private List<Books> booksList = new ArrayList<>();
private File file = new File("/Users/mac/Downloads/books.txt");
/**
* 从文件中读取
* @throws IOException
* @throws ClassNotFoundException
*/
public void readFromFile() throws IOException, ClassNotFoundException {
if(file.length()>0) {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(this.file));
Object obj = ois.readObject();
if (obj instanceof List) {
booksList = (List) obj;
}
ois.close();
}
}
public void writeToFile() throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(this.file));
oos.writeObject(this.booksList);
oos.close();
}
@Override
public boolean add(Books books) {
booksList.add(books);
return true;
}
@Override
public boolean update(Books books1, Books books2) {
booksList.remove(books1);
booksList.add(books2);
return true;
}
@Override
public boolean delete(Books books) {
booksList.remove(books);
return true;
}
@Override
public Books findByName(String name) {
for (Books books:booksList) {
if (books.getName().contains(name)){
return books;
}
}
return null;
}
@Override
public List<Books> findAll() {
return booksList;
}
}
AdminService类
package com.networkBook.service;
import com.networkBook.entity.Admin;
public interface AdminService {
public boolean login(Admin admin);
}
AdminServiceImpl类
package com.networkBook.service.impl;
import com.networkBook.entity.Admin;
import com.networkBook.service.AdminService;
public class AdminServiceImpl implements AdminService {
private Admin a = new Admin("admin","123456");
@Override
public boolean login(Admin admin) {
if (admin.equals(a))
return true;
else
return false;
}
}
由于Admin的功能只有一个登陆验证,所以都写在BookController中
BookController类
package com.networkBook.controller;
import com.networkBook.entity.Admin;
import com.networkBook.entity.Books;
import com.networkBook.service.impl.AdminServiceImpl;
import com.networkBook.service.impl.BookServiceImpl;
import java.io.IOException;
import java.util.List;
public class BookController {
private AdminServiceImpl adminService = new AdminServiceImpl();
private BookServiceImpl bookService = new BookServiceImpl();
public void readFromFile() throws IOException, ClassNotFoundException {
bookService.readFromFile();
}
public void writeToFile() throws IOException {
bookService.writeToFile();
}
public boolean login(Admin admin){
return adminService.login(admin);
}
public boolean add(Books books){
return bookService.add(books);
}
public boolean update(Books books1,Books books2){
return bookService.update(books1,books2);
}
public boolean delete(Books books){
return bookService.delete(books);
}
public Books findByName(String name){
return bookService.findByName(name);
}
public List<Books> findAll(){
return bookService.findAll();
}
}
3、以控制台输出的方式模仿前端页面
代码如下
BookViews类
package com.networkBook.view;
import com.networkBook.entity.Admin;
import com.networkBook.entity.Books;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class BookViews {
private Scanner scanner = new Scanner(System.in);
private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
public void welcome(){
System.out.println("欢迎来到****图书管理系统");
}
public Admin login(){
System.out.println("请输入用户名:");
String name = scanner.nextLine();
System.out.println("请输入密码:");
String password = scanner.nextLine();
Admin admin = new Admin(name,password);
return admin;
}
public void loginSuccess(){
System.out.println("登录成功!");
}
public void loginFailed(){
System.out.println("登录失败!");
}
public void success(){
System.out.println("操作成功");
}
public void failed(){
System.out.println("操作失败");
}
public int menu(){
System.out.println("请选择你要进行的操作:");
System.out.println("1 添加图书信息");
System.out.println("2 修改图书信息");
System.out.println("3 删除图书信息");
System.out.println("4 通过名称模糊查询");
System.out.println("5 价格从低到高查看图书信息");
System.out.println("6 价格从高到底查看图书信息");
System.out.println("7 新旧顺序查看图书信息");
System.out.println("0 退出");
int num = -1;
try{
num = scanner.nextInt();
}catch (Exception e){
System.out.println("请输入正确的序号");
menu();
}
return num;
}
public Books add(){
Books books = new Books();
try {
System.out.println("请输入书名:");
String name = scanner.next();
System.out.println("请输入书页:");
int pageNum = Integer.parseInt(scanner.next());
System.out.println("请输入价格:");
double price = Double.parseDouble(scanner.next());
System.out.println("请输入出版日期:(格式:yyyy-MM-dd)");
Date date = format.parse(scanner.next());
books.setName(name);
books.setPageNum(pageNum);
books.setPrice(price);
books.setDate(date);
}catch (ParseException e) {
System.out.println("输入信息有误,请重新输入");
add();
}
return books;
}
public String update(){
System.out.println("请输入要修改的书名");
return scanner.next();
}
public void exsit(){
System.out.println("该图书已存在");
}
public void notExsit(){
System.out.println("该图书不存在");
}
public Books newBook(){
System.out.println("请输入新的图书信息:");
return add();
}
public String delete(){
System.out.println("请输入要删除的图书书名");
return scanner.next();
}
public int deleteConfirm(){
System.out.println("确认删除该图书:");
System.out.println("1 确定");
System.out.println("0 返回上一层");
int num = -1;
try {
num = Integer.parseInt(scanner.next());
}catch (Exception e){
System.out.println("请输入正确的指令");
deleteConfirm();
}
return num;
}
public String findByName(){
System.out.println("请输入要查询的图书名称简称");
return scanner.next();
}
public void printBook(Books books){
System.out.println("图书信息如下");
System.out.println("书名:"+ books.getName());
System.out.println("页数:"+ books.getPageNum());
System.out.println("价格:"+ books.getPrice());
System.out.println("发版日期:"+ books.getDate());
}
/**
* 从低到高排序
* @param booksList
*/
public void sortByPriceLow(List<Books> booksList){
Collections.sort(booksList, new Comparator<Books>() {
@Override
public int compare(Books o1, Books o2) {
return (int) (o1.getPrice()-o2.getPrice());
}
});
ListIterator listIterator = booksList.listIterator();
while (listIterator.hasNext()){
printBook((Books)listIterator.next());
}
}
/**
* 从低到高排序
* @param booksList
*/
public void sortByPriceHigh(List<Books> booksList){
Collections.sort(booksList, new Comparator<Books>() {
@Override
public int compare(Books o1, Books o2) {
return (int) (o2.getPrice()-o1.getPrice());
}
});
ListIterator listIterator = booksList.listIterator();
while (listIterator.hasNext()){
printBook((Books)listIterator.next());
}
}
/**
* 从旧到新排序
* @param booksList
*/
public void sortByDate(List<Books> booksList){
Collections.sort(booksList, new Comparator<Books>() {
@Override
public int compare(Books o1, Books o2) {
return (int) (o1.getDate().getTime()-o2.getDate().getTime());
}
});
ListIterator listIterator = booksList.listIterator();
while (listIterator.hasNext()){
printBook((Books)listIterator.next());
}
}
}
4、服务器与客户端,服务器用了ServerSocket对象来与客户端的Socket对象相连接,接收客户端发出的请求,以及响应信息;要注意Socket的端口号要一致才能连接上。
代码如下:
BookServer类
package com.networkBook.test;
import com.networkBook.controller.BookController;
import com.networkBook.entity.Admin;
import com.networkBook.entity.Books;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;
public class BookServer {
private ServerSocket serverSocket;
private BookController bookController = new BookController();
public static void main(String[] args) {
BookServer bookServer = new BookServer();
bookServer.start();
}
public void start(){
try {
serverSocket = new ServerSocket(9999);
System.out.println("服务器已启动");
bookController.readFromFile();
while (true){
Socket socket = serverSocket.accept();
System.out.println("一个客户端已连接");
new Thread(new Runnable() {
@Override
public void run() {
receive(socket);
}
}).start();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (serverSocket!=null){
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void receive(Socket socket){
OutputStream os = null;
InputStream is = null;
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
try {
os = socket.getOutputStream();
is = socket.getInputStream();
oos = new ObjectOutputStream(os);
ois = new ObjectInputStream(is);
Admin admin = (Admin) ois.readObject();
boolean login = bookController.login(admin);
oos.writeBoolean(login);
oos.flush();
menu(oos,ois);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(ois!=null) {
ois.close();
}
if(oos!=null) {
oos.close();
}
if(socket!=null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void menu(ObjectOutputStream oos, ObjectInputStream ois) throws Exception {
while(true){
int num = ois.readInt();
switch (num){
case 0:
System.out.println("一个客户端断开连接");
bookController.writeToFile();
return;
case 1:
add(oos,ois);
break;
case 2:
update(oos,ois);
break;
case 3:
delete(oos,ois);
break;
case 4:
findByName(oos,ois);
break;
case 5:
sortByPriceLow(oos,ois);
break;
case 6:
sortByPriceHeigh(oos,ois);
break;
case 7:
sortByDate(oos,ois);
break;
}
}
}
public void add(ObjectOutputStream oos, ObjectInputStream ois) throws Exception {
Books books = (Books) ois.readObject();
Books books1 = bookController.findByName(books.getName());
oos.writeObject(books1);
oos.flush();
if (books1==null){
boolean add = bookController.add(books);
oos.writeBoolean(add);
oos.flush();
}
}
public void update(ObjectOutputStream oos, ObjectInputStream ois) throws Exception {
Books books1 = bookController.findByName((String) ois.readObject());
oos.writeObject(books1);
oos.flush();
if (books1 != null){
Books books2 = (Books) ois.readObject();
boolean update = bookController.update(books1,books2);
oos.writeBoolean(update);
oos.flush();
}
}
public void delete(ObjectOutputStream oos, ObjectInputStream ois) throws Exception {
Books books = bookController.findByName((String) ois.readObject());
oos.writeObject(books);
oos.flush();
if (books != null){
int num = ois.readInt();
while (true){
switch (num){
case 0:
return;
case 1:
boolean delete = bookController.delete(books);
oos.writeBoolean(delete);
oos.flush();
break;
}
}
}
}
public void findByName(ObjectOutputStream oos, ObjectInputStream ois) throws Exception {
Books books = bookController.findByName((String) ois.readObject());
oos.writeObject(books);
oos.flush();
}
public void sortByPriceLow(ObjectOutputStream oos, ObjectInputStream ois) throws Exception {
List<Books> booksList = bookController.findAll();
Books[] books = new Books[booksList.size()];
booksList.toArray(books);
oos.writeObject(books);
oos.flush();
}
public void sortByPriceHeigh(ObjectOutputStream oos, ObjectInputStream ois) throws Exception {
List<Books> booksList = bookController.findAll();
Books[] books = new Books[booksList.size()];
booksList.toArray(books);
oos.writeObject(books);
oos.flush();
}
public void sortByDate(ObjectOutputStream oos, ObjectInputStream ois) throws Exception {
List<Books> booksList = bookController.findAll();
Books[] books = new Books[booksList.size()];
booksList.toArray(books);
oos.writeObject(books);
oos.flush();
}
}
BookClient类
package com.networkBook.test;
import com.networkBook.entity.Admin;
import com.networkBook.entity.Books;
import com.networkBook.view.BookViews;
import java.io.*;
import java.net.Socket;
import java.util.Arrays;
import java.util.List;
public class BookClient {
private Socket socket;
private BookViews bookViews = new BookViews();
public static void main(String[] args) {
BookClient bookClient = new BookClient();
bookClient.link();
}
public void link(){
OutputStream os = null;
InputStream is = null;
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
try {
socket = new Socket("127.0.0.1", 9999);
System.out.println("服务器连接成功");
os = socket.getOutputStream();
is = socket.getInputStream();
oos = new ObjectOutputStream(os);
ois = new ObjectInputStream(is);
Admin admin = bookViews.login();
System.out.println(admin);
oos.writeObject(admin);
oos.flush();
if (ois.readBoolean()){
bookViews.loginSuccess();
menu(oos,ois);
}else {
bookViews.loginFailed();
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
if(ois!=null) {
ois.close();
}
if(oos!=null) {
oos.close();
}
if(socket!=null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void menu(ObjectOutputStream oos, ObjectInputStream ois) throws Exception {
while(true){
int num = bookViews.menu();
oos.writeInt(num);
oos.flush();
switch (num){
case 0:
return;
case 1:
add(oos,ois);
break;
case 2:
update(oos,ois);
break;
case 3:
delete(oos,ois);
break;
case 4:
findByName(oos,ois);
break;
case 5:
sortByPriceLow(oos,ois);
break;
case 6:
sortByPriceHeigh(oos,ois);
break;
case 7:
sortByDate(oos,ois);
break;
}
}
}
public void add(ObjectOutputStream oos, ObjectInputStream ois) throws Exception {
Books books = bookViews.add();
oos.writeObject(books);
oos.flush();
Books books1 = (Books) ois.readObject();
if (books1==null){
if (ois.readBoolean()){
bookViews.success();
bookViews.printBook(books);
}else {
bookViews.failed();
}
}else {
bookViews.exsit();
}
}
public void update(ObjectOutputStream oos, ObjectInputStream ois) throws Exception{
String name = bookViews.update();
oos.writeObject(name);
oos.flush();
Books books = (Books) ois.readObject();
if (books!=null){
Books books1 = bookViews.newBook();
oos.writeObject(books1);
oos.flush();
if (ois.readBoolean()){
bookViews.success();
bookViews.printBook(books1);
}else {
bookViews.failed();
}
}else {
bookViews.notExsit();
}
}
public void delete(ObjectOutputStream oos, ObjectInputStream ois) throws Exception {
String name = bookViews.delete();
oos.writeObject(name);
oos.flush();
Books books = (Books) ois.readObject();
if (books != null){
while (true) {
int num = bookViews.deleteConfirm();
oos.writeInt(num);
oos.flush();
switch (num){
case 0:
return;
case 1:
if (ois.readBoolean()){
bookViews.success();
}else {
bookViews.failed();
}
}
}
}else {
bookViews.notExsit();
}
}
public void findByName(ObjectOutputStream oos, ObjectInputStream ois) throws Exception {
String name = bookViews.findByName();
oos.writeObject(name);
oos.flush();
Books books = (Books) ois.readObject();
if (books!=null){
bookViews.success();
bookViews.printBook(books);
}else {
bookViews.notExsit();
}
}
public void sortByPriceLow(ObjectOutputStream oos, ObjectInputStream ois) throws Exception {
Books[] books = (Books[]) ois.readObject();
List<Books> booksList = Arrays.asList(books);
if (booksList.size()>0){
bookViews.sortByPriceLow(booksList);
}else {
bookViews.notExsit();
}
}
public void sortByPriceHeigh(ObjectOutputStream oos, ObjectInputStream ois) throws Exception {
Books[] books = (Books[]) ois.readObject();
List<Books> booksList = Arrays.asList(books);
if (booksList.size()>0){
bookViews.sortByPriceHigh(booksList);
}else {
bookViews.notExsit();
}
}
public void sortByDate(ObjectOutputStream oos, ObjectInputStream ois) throws Exception {
Books[] books = (Books[]) ois.readObject();
List<Books> booksList = Arrays.asList(books);
if (booksList.size()>0){
bookViews.sortByDate(booksList);
}else {
bookViews.notExsit();
}
}
}
到这步,整个图书管理系统就完成了。
效果如下: