网络编程下的图书管理系统

项目简介

通过网络编程的传输方式来实现图书管理系统的增删查改操作,这个传输过程也类似于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();
        }
    }

}

到这步,整个图书管理系统就完成了。
效果如下:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值