图书管理系统【重构版】

目录

前言

项目需求

书写文档

数据库设计

项目设计

代码设计

IndexView类

Login类

Register类

总结

前言


        好久没有写项目博客了,回想起上次写项目博客的时候还是在上次,这次介绍的项目也都是老朋友了——图书管理系统。有的小伙伴就要提问了,咋又是图书管理系统,旧活新整 ?其实呢,这次的项目跟上次区别还是蛮大的,但也是有相似的地方,各位看客切莫急躁,且听我娓娓道来~

本项目的数据是存储在MySql数据库中,严格按照项目结构图和多个说明文档实现,而且是合作完成的,很庆幸能有一个好的搭档,做起事来能够达到事半功倍的效果。虽然过程也会有许些坎坷,但是在历经十天左右的努力之后,还是有收获到不少的成果。

项目需求


基本上没有什么固定的要求,都是根据项目功能结构图以及结合实际做出的功能设计。

项目功能结构图:

书写文档


针对于本项目的设计一共编写了四个文档:

  • 软件需求说明书
  • 数据库设计说明书
  • 概要设计说明书
  • 接口设计说明书

通过编写设计说明书的文档,可算是给我上了一课。众所周知,开发软件可不仅仅是写代码这么简单,在此之前,还需要做很多准备工作。比如需求分析、可行性报告、设计说明书等等一系列的文档,学过软件工程的小伙伴应该都被这些文档支配过,可以说是枯燥无味,且枯燥,且无味...

好在这次编写的文档是基于其他项目文档进行整改所完成的,这就节省了很多时间,被文档折磨了三天过后,我们才毅然决然的决定开始编写代码。

数据库设计


根据在此之前所编写好的数据库说明书文档,在MySql数据中创建对应的数据库和数据表。

文档部分内容:

 

数据库中表的设计:

项目设计


根据在此之前所编写好的概要设计说明书文档,在IDEA中创建对应的包和类。

文档部分内容:

IDEA中包和类的设计:

项目整体包和文件的设计

File文件夹

各个文档说明书

lib文件夹

为连接数据库和德鲁伊连接池的导的jar包

逻辑层 的包和各个类
数据处理层 的包和各个类
实体层 的包和各个类
接口层 的包和各个类
界面层 的包和各个类

代码设计


由于本项目是合作项目,所以代码的编写是分工完成的,博主就只针对于自己编写的部分代码进行介绍。

IndexView类

public class IndexView {
    public static void main(String[] args) {
        while (true) {
            System.out.println("*************************************");
            System.out.println("*** ? ? ? 《图书管理系统》 ? ? ? ***");
            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("*************************************");
            System.out.print("请输入你的选择:");
            char c1 = TSUtility.readMenuSelection03();

            switch (c1) {
                case '1':
                    Login.adminLogin();
                    break;
                case '2':
                    Register.adminRegister();
                    break;
                case '3':
                    //静态代理
                    ForgetPassword forgetPassword = new ForgetPassword();
                    Proxy proxy = new Proxy(forgetPassword);
                    proxy.forgetPassword();
                    break;
                case '4':
                    LogInfo.selectLoginLog();
                    break;
                case '5':
                    UpdatePassword.updatePassword();
                    break;
                case '6':
                    System.out.print("确认退出?(Y/N)");
                    char t = TSUtility.readConfirmSelection();
                    if (t == 'Y') {
                        System.out.println("您已退出系统!");
                        System.exit(0); //JVM退出,程序运行结束
                    } else {
                        System.out.println("您已取消退出系统!");
                        System.out.println();
                    }
            }
        }
    }
}

Login类

public class Login {
    private static String UserName = null;

    //用户登录
    public static void adminLogin() {
        AdminDAL ad = new AdminDAL();

        System.out.print("请输入用户名:");
        String username = TSUtility.readKeyBoard(20, false);
        //获取该用户名下的记录信息
        Admin admin = ad.selectAdminInfoByUserName(username);
        //用户名不存在时,结束该方法
        if (admin == null) {
            System.out.println("用户名不存在!");
            System.out.println();
            return;
        } else UserName = username;

        //获取用户密码
        String password = admin.getPassword();
        System.out.print("请输入密码:");
        String pw = TSUtility.readKeyBoard(15, false);
        //判断密码是否正确
        if (!password.equals(pw)) {
            System.out.println("密码错误!");
        } else {
            LogInfo.insertLoginLog(username + " 进入系统!");
            //延时加载
            try {
                TSUtility.loadSpecialEffects();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            //获取登录账户的类别
            String userType = admin.getUserType();
            System.out.println("当前用户:" + username);
            //根据不同的类别进入不同的界面操作
            if (userType.equals("manager")) {
                ManagerView.managerShow();
            } else if (userType.equals("operator")) {
                OperatorView.operatorShow();
            }
        }
        System.out.println();
    }

    //返回该用户名(退出系统时,记录日志信息使用)
    public static String returnUserName() {
        return UserName;
    }
}

Register类

public class Register {
    private static Scanner sc = new Scanner(System.in);
    private static AdminDAL ad = new AdminDAL();
    private static EmployeesDAL ed = new EmployeesDAL();

    //用户注册
    public static void adminRegister() {
        System.out.println("1.操作员(operator)  2.管理员(manager)");
        System.out.print("请输入想要注册的账户类别(1、2):");
        String adminType = sc.nextLine();

        if (adminType.length() != 1) {
            System.out.println("输入错误!");
        } else {
            switch (adminType) {
                case "1":
                    System.out.print("请输入员工编号(8位):");
                    String s = sc.nextLine();
                    String employeesId = TSUtility.isEmployeesId(s);

                    //判断该员工是否已经存在,并且有账号
                    Admin admin1 = ad.selectAdminInfoByEmployeesId(employeesId);
                    if (admin1 != null) {
                        System.out.println("该员工已有账户,无法注册!");
                    } else {
                        //判断该员工信息是否存在,有无账号
                        Employees employees = ed.selectEmployeesInfoById(employeesId);
                        if (employees != null) {
                            System.out.println("员工信息存在,可直接注册账户");
                            System.out.print("请输入用户名:");
                            String username = TSUtility.readKeyBoard(20, false);
                            //获取用户名,判断用户名是否已经存在
                            boolean b2 = isUserName(username);
                            if (b2) {
                                System.out.println("该用户名已存在!");
                            } else {
                                System.out.print("请输入密码:");
                                String pw = TSUtility.readKeyBoard(15, false);
                                //创建用户对象并赋值
                                Admin admin = new Admin();
                                admin.setEmployeesId(employeesId);
                                admin.setUserName(username);
                                admin.setPassword(pw);
                                admin.setUserType("operator");
                                //注册
                                ad.insertAdmin(admin);
                                System.out.println("注册成功!");
                            }
                        } else {
                            //添加员工信息和注册账户
                            insertAdminAndEmployees(employeesId, "operator");
                        }
                    }
                    break;
                case "2":
                    System.out.println("该类别权限较高,需要输入验证码!");
                    System.out.print("请输入验证码:");
                    String yzm = sc.nextLine();
                    //判断验证码是否正确
                    if (!yzm.equals("1024")) {
                        System.out.println("验证失败!");
                    } else {
                        System.out.println("验证成功!");
                        System.out.print("请输入员工编号(8位):");
                        String s1 = sc.nextLine();
                        String employeesId1 = TSUtility.isEmployeesId(s1);

                        //判断该员工是否已经存在,并且有账号
                        Admin admin = ad.selectAdminInfoByEmployeesId(employeesId1);
                        if (admin != null) {
                            System.out.println("该员工已有账户,无法注册!");
                        } else {
                            //添加员工信息和注册账户
                            insertAdminAndEmployees(employeesId1, "manager");
                        }
                    }
                    break;
                default:
                    System.out.println("输入错误!");
            }
        }
        System.out.println();
    }

    //判断用户名是否存在
    public static boolean isUserName(String username) {
        //设置一个状态值
        boolean b = false;
        //获取用户名,判断用户名是否已经存在
        List<Admin> admins = ad.selectAllUserName();
        for (Admin a : admins) {
            if (a.getUserName().equals(username)) {
                b = true;
                break;
            }
        }
        return b;
    }

    //添加员工信息和注册账户
    public static void insertAdminAndEmployees(String employeesId, String userType) {
        System.out.print("员工姓名:");
        String name = TSUtility.readKeyBoard(20, false);
        System.out.print("员工电话(11位):");
        String phone = sc.nextLine();
        String employeesPhone = TSUtility.isTell(phone);

        System.out.print("请输入用户名:");
        String username = TSUtility.readKeyBoard(20, false);
        //获取用户名,判断用户名是否已经存在
        boolean b2 = isUserName(username);
        if (b2) {
            System.out.println("该用户名已存在!");
        } else {
            System.out.print("请输入密码:");
            String pw = TSUtility.readKeyBoard(15, false);
            //创建员工对象并赋值
            Employees employees = new Employees();
            employees.setEmployeesId(employeesId);
            employees.setEmployeesName(name);
            employees.setEmployeesJob(userType);
            employees.setEmployeesPhone(employeesPhone);
            //添加员工信息
            ed.insertOperator(employees);

            //创建用户对象并赋值
            Admin admin = new Admin();
            admin.setEmployeesId(employeesId);
            admin.setUserName(username);
            admin.setPassword(pw);
            admin.setUserType(userType);
            //注册账户
            ad.insertAdmin(admin);
            System.out.println("注册成功!");
        }
    }
}

主界面展示:

说明:红色部分是使用数据库连接池的提示部分,不是错误信息。

总结


        本次项目代码的编写跟之前的图书管理系统比起来会多一些,但这是合作的项目,个人编写的还没有上一次独立编写的多,就这很灵性。难度差距不是很大,主要原理跟之前没有太大的差距。在本次项目的实现中,印象最深刻的就是文档的编写,那才是折磨人的地方,在还没有编写代码之前要事先设计好各个包和类的名称、属性以及功能等,很难做到能够考虑的很全面,因为编写代码的时候根据情况会有一些差异,或者说是突然想到了一个之前没有想到的点,就这很不太友好了...

本项目就介绍到这里,感兴趣的小伙伴可以在博主的主页获取完整代码。

ps:刚刚上传的资源 (11.7),预计2-10个工作日之后才能审核成功显示出来!


本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>