图书管理系统重构版
Posted South.return
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图书管理系统重构版相关的知识,希望对你有一定的参考价值。
目录
前言
好久没有写项目博客了,回想起上次写项目博客的时候还是在上次,这次介绍的项目也都是老朋友了——图书管理系统。有的小伙伴就要提问了,咋又是图书管理系统,旧活新整 ?其实呢,这次的项目跟上次区别还是蛮大的,但也是有相似的地方,各位看客切莫急躁,且听我娓娓道来~
本项目的数据是存储在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个工作日之后才能审核成功显示出来!
以上是关于图书管理系统重构版的主要内容,如果未能解决你的问题,请参考以下文章