图书管理系统(JDBC , MySQL)

目录

一、项目说明

二、基本设计概念和处理流程

1、基本设计

2、处理流程:

3、概念结构设计

三、项目功能:

四 、总结


前言:
        长期以来,人们使用传统的人工方式管理图书馆的日常业务,其操作流程比较烦琐。在借书时,读者首先将要借的书和借阅证交给工作人员,然后工作人员将每本书的信息卡片和读者的借阅证放在一个小格栏里,最后在借阅证和每本书贴的借阅条上填写借阅信息。在还书时,读者首先将要还的书交给工作人员,工作人员根据图书信息找到相应的书卡和借阅证,并填好相应的还书信息。太过于繁琐了!所以,我们需求设计一个图书管理系统来方便学生的借书和图书馆管理书籍。

 

一、项目说明


1、读者信息管理:能够对读者的基本信息进行管理,包括新增读者,如学校新来一名教师,想要借书,就必须先添加读者信息;读者信息的修改,如学生转到别的专业,此时要修改学生的基本信息;删除读者的信息,比如某个学生中途退学了,可以将其信息删除。查询读者的信息,比如有同学拾到了一张借阅卡,卡上有学生的编号,通过此号来查询学生的联系电话,从而可以找到学生。
2、图书信息管理:能够对图书的基本信息进行管理,包括新增图书,学校每年会购进新书,此时需要将新书的信息录入系统中;图书信息的修改,如学生借书后将图书丢失,此时需要修改图书的总数量,使总数减1;删除图书,学校在购进新书的同时,每年会对过期的图书进行清理,不再提供借阅,此时就需要将这些图书的信息从系统中删除。查询图书的信息,比如要查看有哪些是Java相关的书籍或者指定ISBN号的图书等。
3、图书借阅信息管理:能够对图书的借阅信息进行记录,包括读者信息、图书信息、借阅时间等信息。
4、图书归还信息管理:能够对图书的借阅信息进行记录,包括读者信息、图书信息、归还时间、是否超期、罚金等信息。
5、系统用户信息管理:能够对系统用户的信息进行管理,包括增加新的系统操作用户,对当前系统用户的密码进行修改,以及删除某一用户。

二、基本设计概念和处理流程

1、基本设计

图书管理系统(JDBC , MySQL)_第1张图片


2、处理流程:

管理员

图书管理系统(JDBC , MySQL)_第2张图片


操作员:

图书管理系统(JDBC , MySQL)_第3张图片


3、概念结构设计

图书管理系统(JDBC , MySQL)_第4张图片


三、项目功能:

登录模块:包括登录功能(根据两种身份(管理员或者操作员)进行登录),如果没有用户信息,则需要进入注册功能进行注册。(登录用户信息的读取和存储都应连通数据库表操作)还需要提供忘记密码,查看登录日志记录(日志可通过I/O流放在相对应的文件里),修改密码等基本功能。
管理员模块:管理员主要包含四大基本功能:员工工作日志记录(记录了每个操作员的登录时间和各种操作信息,日志可通过I/O流放在相对应的文件里),图书借阅金额设定,对操作员信息进行管理(增删改查),图书逾期罚金总账单查询(该账单记录了所有预期的图书的逾期金额明细和最后图书馆所有书的逾期总金额数)。


操作员模块


(1)读者信息管理:包括读者信息添加和读者信息查询与修改功能。用户登录成功之后,可以浏览所有读者的信息,也可以检索特定读者的信息;同时,可以对读者信息进行维护,包括增加、删除及修改。具体信息包括读者类型(读者的类型决定着他可以借到书的最大数量和最大归还天数)、读者姓名、出生日期、性别、电话、所在院系、注册日期等。(相关存储数据,通过数据库存储,JDBC进行操作

(2)图书信息管理:包括图书信息添加和图书信息查询与修改功能。用户登录成功之后,可以浏览所有图书信息和检索特定图书的信息;也可以对图书信息进行维护。包括添加图书、删除图书以及修改图书信息。具体信息包括:图书ISBN、图书名称、作者、出版社、出版日期、印刷次数、单价、图书类别等。(相关存储数据,通过数据库存储,JDBC进行操作

(3)图书借阅管理:包括图书借阅和图书归还功能。图书借阅功能,先输入读者的编号,然后输入要借阅的图书的信息,记录系统当前时间即借阅时间;图书归还功能,输入读者的编号,选择其名下已借阅的图书,判断当前日期即归还日期与借阅日期的差值是否超过了规定的期限,计算罚金,从而进行图书的归还操作。具体信息包括:借阅日期、归还日期、罚金。由于要计算罚金,故需要知道该读者的读者类型,根据类型判断其可借图书天数、可借图书数量等。(相关存储数据,通过数据库存储,JDBC进行操作

(4)基础信息维护:包括图书类别设置、读者类别设置及罚金设置。图书类别设置,可以对图书的类别进行增加、删除、修改和查询;读者类别设置可以对读者的类别进行增加、删除、修改和查询;罚金设置,可以指定超期一天的罚金标准。(相关存储数据,通过数据库存储,JDBC进行操作
 


四、数据库表的设计

图书管理系统(JDBC , MySQL)_第5张图片图书管理系统(JDBC , MySQL)_第6张图片


结构

包图:

包图说明:本系统基于五层架构,分为界面层(UI)、逻辑层(BLL)、数据处理层(DAL)、接口层(IDAL)、实体层(Entity)。前面三层都需要引用实体类,因为需要通过实体层来传递参数,数据处理层需要引用一个SQLHelper的助手类。

图书管理系统(JDBC , MySQL)_第7张图片

在这里,博主分了下面几个包 :

图书管理系统(JDBC , MySQL)_第8张图片

界面展示包View(里面放的全是界面展示类);

功能实现包Service(放的各个功能的实现类);

 实体类包EntityClass(放各个需要用到的实体类);

数据包LogFile(存放管理员和员工的日志记录数据,这两部分的数据,博主这里用的IO流存入的);

驱动包lib (存放各个需要用到的驱动包);

接口包Port (存放各个接口类);

工具包Utility (存放连接MySQL用到的工具包,以及为了简化代码的工具包);

resources (存放了,连接池连接MySQL的数据文件);

图书管理系统(JDBC , MySQL)_第9张图片图书管理系统(JDBC , MySQL)_第10张图片


管理员登录:

首先,我们进入到图书管理系统,进入的方式就是通过用户的账号和密码的输入匹配。

管理员登录:

设计该功能时,我们选择将数据保存在数据库,也就是用 MySQL 来做。

图书管理系统(JDBC , MySQL)_第11张图片

 其次就是管理员数据的数据管理:

图书管理系统(JDBC , MySQL)_第12张图片

 这些实现类都是用接口进行规范的。


基本信息维护模块

该模块下有,读者类别的设置,图书类别的设置,还有罚金的设置;

读者类别,就是当我们再添加读者时,可以将读者类别当做读者类的一个属性添加进去。

就比如说,我们当前添加的读者类型为学生,那么就在可以单独设置学生的可借阅图书的天数和图书的数量。

同理,图书类别的设置,就可以把图书进行分类。

罚金的设置:可以根据不同类型的读者,设置不同类型的罚金。同理,给不同的图书类型也添上相应的罚金。最后的总罚金,我们使用的是两者的相加计算得来的。

图书管理系统(JDBC , MySQL)_第13张图片


 部分代码展示:

管理员信息管理:

public class AdminiPortImpl extends BaseDao implements AdminiPort {

    static String name, password;

    @Override
    //注册管理员
    public void registAdmin() throws Exception {
        Connection conn = DuridConnectionPool.getConnection();

        System.out.println(" 注册管理员界面 ");


        /*String sql1="select * from Admin";*/


        System.out.println("请输入您的姓名:");
        name = TSUtility.readKeyBoard(4, false);
        System.out.println("请输入您的密码(至多六位) :");
        password = TSUtility.readKeyBoard(6,false);
        String sql = "insert into admin(adminName,adminPassword) values (?,?)";

        //调用BaseDao中通用的方法update
        update(conn, sql, name, password);
        TSUtility.WriteTheLog1(TSUtility.getTheCurrentTime()+"\t"+name+" 已注册管理员!");
        //
        //加载
        TSUtility.loadSpecialEffects();
        System.out.println("注册成功!");
        //关闭资源
        JDBCUtils.closeResources(conn);

    }

    @Override
    //修改密码
    public void updatePassword() throws Exception {
        System.out.println(" 修改管理员密码界面 ");

        Connection connection = DuridConnectionPool.getConnection();
        String sql = "SELECT * FROM `admin`";
        List Amdin = getBeanList(connection, sql);
        int n=0;
        if (Amdin.size() != 0) {
            System.out.println("编号" + "\t" + "账户名" + "\t" + "密码");
            for (Admin admin : Amdin) {
                n++;
                System.out.print(n + "\t" + admin.getAdminName() + "\t" + admin.getAdminPassword());
                System.out.println();
            }
            boolean flag = true;
            while (flag) {
                System.out.println("请输入你要修改的编号:");
                int count = 0;
                int where = 0;
                int i = TSUtility.readInt();
                /*for (int j = 0; j < Amdin.size(); j++) {
                    if (Amdin.get(j).getAdminId() == i) {
                        count++;
                        where = j;
                    }
                }*/
                if (i>Amdin.size()) {
                    System.out.println("没有你输入的编号,是(Y/y)否(N/n)继续修改?");
                    char c = TSUtility.readConfirmSelection();
                    if (c == 'N' || c == 'n') {
                        flag = false;
                    }
                } else {
                    System.out.println("请输入您的新密码(最多六位)(回车跳过..修改为原密码!)");
                    String s = TSUtility.readString(6, Amdin.get(where).getAdminPassword());
                    String sql2 = "UPDATE `admin` SET `adminPassword`=? WHERE `adminId`=?";
                    update(connection, sql2, s, i);
                    TSUtility.WriteTheLog1(TSUtility.getTheCurrentTime()+"\t"+name+" 已修改密码为!"+s);
                    System.out.println("修改成功!");
                    flag = false;
                }
            }
        } else {
            System.out.println("没有数据!");
        }

    }

    @Override
    //登录管理员
    public void loginAdmin() throws Exception {
        Connection connection = DuridConnectionPool.getConnection();
        String sql = "SELECT * FROM `admin`";
        List Amdin = getBeanList(connection, sql);
        System.out.println(" 管理员登录界面 ");
        System.out.println("");
        boolean flog = true;
        while (flog) {

            if (Amdin.size()==0){
                System.out.println("没有数据,请先注册一个管理员!");
                flog=false;
            }else{
                System.out.println("请输入您的姓名:");
                name = TSUtility.readKeyBoard(4, false);
                System.out.println("请输入您的密码(至多六位) :");
                password = TSUtility.readKeyBoard(6,false);


                int n = 0;
                for (int i = 0; i < Amdin.size(); i++) {
                    n++;
                    if (name.equals(Amdin.get(i).getAdminName()) && password.equals(Amdin.get(i).getAdminPassword())) {

                        System.out.println("登录成功!正进入管理员功能界面,欢迎使用!");
                        //加载
                        TSUtility.loadSpecialEffects();
                        TSUtility.WriteTheLog1(TSUtility.getTheCurrentTime()+"\t"+name+"已登录管理员界面!");

                        AdministratorLoginView.AdministratorLogin();
                        flog=false;
                        break;
                    }
                    if (n == Amdin.size()) {
                        System.out.println("账号或者密码有误!是否重新登录(是y/否n)");
                        char c = TSUtility.readConfirmSelection();
                        if (c == 'N' || c == 'n') {
                            flog = false;
                            System.out.println(" 返回登录界面中... ");
                            System.out.println();
                        }
                    }
                }

            }
        }
    }

  

}

 德鲁伊连接池:

public class DuridConnectionPool {

    public static Connection getConnection() throws Exception {
        Properties pro = new Properties();
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
        pro.load(is);
        DataSource ds = DruidDataSourceFactory.createDataSource(pro);
        Connection conn = ds.getConnection();
        return conn;
    }

    /*public static void main(String[] args) throws Exception {
        System.out.println(getConnection());
    }*/
}

四 、总结

使用了两种设计模式:代理模式以及工厂方法模式。

这次最重要的就是把需求文档完善好,这样可以尽量地减少在后续的代码实现过程中的失误。

这次的项目是合作版,有利于与队友的合作沟通。通过Git工具的使用,我们之间的代码实现了互通,并且效率得到了很好的解决,挺好用的一个工具,推荐使用!

图书管理系统(JDBC , MySQL)_第14张图片

你可能感兴趣的:(mysql,数据库,java,抽象工厂模式,jdbc)