系统功能:
- 用户密码和账号的的验证
- 使用接口来实现图书业务功能(新增图书、删除图书、根据图书的编号查询图书、出库、入库)和用户的使用功能
- 使用IO流实现图书基础信息和用户对象在文件中的输入输出(序列化)
- 使用配置文件来验证登录者的在系统中的角色(超级管理员、操作员、用户)来分配相应的系统使用权限
- 使用集合map来保存图书的基本信息,并作为IO流输入输出的对象,使用集合set储存用户对象
- 视图的基本功能:根据登陆者的角色的不同,显示不同的功能页面(未全部实现)
- 。。。
package LibraryManagementSystemV3;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 进行图书对象信息的封装--对每一类的图书进行存放
* 与图书的对应关系是多对一的关系
* 可以想图书信息库中添加书籍的条件是 isbn相同 && bookId不相同
* @author 李志文
* @version 1.8
* @date 2019年8月14日 上午9:18:57
* @content JAVA代码
* @motto 代码千万条,可读第一条。代码不规范,error多两行。
*/
public class BookInfo implements Serializable{
private static final long serialVersionUID = -146632597963102188L;
//进行图对象的序列化
private String isbn;//图书的编号(内部)
private String name;//图书的名称
private String author;//作者
private String Publisher;//发布者
private int inStoreCount;//管藏量
private double price;//图书的价格
private Date publishDate;
//定义构造方法 重写toString 和equals方法
//创建一个集合来保存同一编号的书籍的信息
//私有属性只能通过get、set那你进行赋值
//或者构造方法进行赋值
private List<Book> bookList;
public void add(Book book)
{
if(bookList==null)
{
bookList=new ArrayList<>();
}
if(book==null)
return;
//判断图书的类型是否存在
if(!(book instanceof Book))
{
return;
}
//判断书籍的信息库中的isbn和传入的对象对应的isbn是否一致
//判断是否是同类书籍
if(!(this.isbn.equals(book.getIsbn())))
{
return;
}
if(bookList.contains(book))
return;
//将传入的图书对象的信息输入到Book实体对应的bookinfo的属性中
book.setBookinfo(this);
//将对象添加到集合中去
bookList.add(book);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPublisher() {
return Publisher;
}
public void setPublisher(String publisher) {
Publisher = publisher;
}
public int getInStoreCount() {
return inStoreCount;
}
public void setInStoreCount(int inStoreCount) {
this.inStoreCount = inStoreCount;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public Date getPublishDate() {
return publishDate;
}
public void setPublishDate(Date publishDate) {
this.publishDate = publishDate;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
}
package LibraryManagementSystemV3;
import java.io.Serializable;
/**
* 实体的book类 用域图书信息的可视化和公开化
* @author 李志文
* @version 1.8
* @date 2019年8月14日 上午9:55:19
* @content JAVA代码
* @motto 代码千万条,可读第一条。代码不规范,error多两行。
*/
public class Book implements Serializable{
private static final long serialVersionUID = -7983098816579079561L;
private String isbn;
private String bookId;//图书的编号(一一对应)
private BookInfo bookinfo;
//使用枚举类型来判断图书的可借状态
private bookState state;
/**
* 重写equals方法来判断传入的图书对象是否适合添加到list数组中去
*/
@Override
public boolean equals(Object obj) {
if(obj==null)
return false;
if(obj instanceof Book)
return false;
Book book=(Book)obj;
return this.getBookId().equals(book.getBookId());
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getBookId() {
return bookId;
}
public void setBookId(String bookId) {
this.bookId = bookId;
}
public BookInfo getBookinfo() {
return bookinfo;
}
public void setBookinfo(BookInfo bookinfo) {
this.bookinfo = bookinfo;
}
public bookState getState() {
return state;
}
public void setState(bookState state) {
this.state = state;
}
}
/**
* 借书的状态
* @author 李志文
* @version 1.8
* @date 2019年8月14日 上午10:02:21
* @content JAVA代码
* @motto 代码千万条,可读第一条。代码不规范,error多两行。
*/
enum bookState{
可借,
不可借,
缺货,
损坏
}
package LibraryManagementSystemV3;
import java.io.Serializable;
/**
* 创建一个通用的接口-实相增删改查的相关操作(通用方法)
* 使用泛型
* @author 李志文
* @version 1.8
* @date 2019年8月14日 下午2:21:31
* @content JAVA代码
* @motto 代码千万条,可读第一条。代码不规范,error多两行。
*/
import java.util.Map;
public interface Biz<T> extends Serializable{
/** 添加对应的元素*/
public boolean add(T t);
/** 删除对应的元素*/
public boolean del(T t);
/** 修改传入的元素 并返回修改好的元素*/
public T update(T t);
/** 根据传入的id进行查询 并返回对应的结果*/
public T findByid(String id);
/** 查询所有的信息 并发挥键值对*/
public Map<String,T> findAll();
}
package LibraryManagementSystemV3;
import LibraryManagementSystemV3.BookInfo;
public interface BookInfoBiz extends Biz<BookInfo>{
public BookInfo findByIsbn(String isbn);
/**
* 出库
* @param isbn 图书的编号
* @param outCount 出库的数量
* @return 是否出库成功
*/
public boolean outStore(String isbn,int outCount);
/**
* 入库
* @param isbn 图书的编号
* @param inCount 入库的数量
* @return 是否入库成功
*/
public boolean inStore(String isbn,int inCount);
}
package LibraryManagementSystemV3;
import java.util.Map;
import LibraryManagementSystemV3.BookInfo;
public class BookInfoBizImpl implements BookInfoBiz{
//序列化的随机编号
private static final long serialVersionUID = -1074143200333136341L;
/**
* 向图书信息库中添加图书
*/
@Override
public boolean add(BookInfo bookInfo) {
//1、从文件中获取所有的bookinfomap
//2、将传入的bookinfo put进去
//3、写回到文件中去
if(bookInfo==null)
{
return false;
}
Map<String,BookInfo> bookInfoMap=findAll();
if(bookInfoMap==null)
{
return false;
}
if(bookInfoMap.containsKey(bookInfo))
{
return false;
}
bookInfoMap.put(bookInfo.getIsbn(),bookInfo);
//将其再写入到文件中去
FileUtil.bookSaveMap(bookInfoMap);
return true;
}
/**
* 删除图书信息库中该类图书的所有信息
*/
@Override
public boolean del(BookInfo bookInfo) {
if(null==bookInfo)
{
return false;
}
Map<String,BookInfo> bookInfoMap=findAll();
if(bookInfoMap==null)
{
return false;
}
if(!(bookInfoMap.containsKey(bookInfo.getIsbn())))
{
return false;
}
//将其进行删除操作
bookInfoMap.remove(bookInfo.getIsbn());
//再将其写入到文件中去
FileUtil.bookSaveMap(bookInfoMap);
return true;
}
/***
* 在图书信息库中修改该类图书的对应信息
*/
@Override
public BookInfo update(BookInfo bookInfo) {
if(bookInfo==null)
{
return null;
}
Map<String,BookInfo> bookInfoMap=findAll();
if(null==bookInfoMap)
{
return null;
}
if(!(bookInfoMap.containsKey(bookInfo.getIsbn())))
{
return null;
}
//重新进行put 到map中去
bookInfoMap.put(bookInfo.getIsbn(),bookInfo);
FileUtil.bookSaveMap(bookInfoMap);
return bookInfo;
}
/**
* 使用Id来实现图书信息的查询
*/
@Override
public BookInfo findByid(String id) {
throw new UnsupportedOperationException("BookInfoBiz中不支持根据id来进行查询!");
}
/**
* 从文件这种读取所有的类别的图书信息
*/
@Override
public Map<String, BookInfo> findAll() {
return FileUtil.bookReaderMap();
}
/**
* 出库
*/
@Override
public boolean outStore(String isbn, int outCount) {
BookInfo bookInfo=findByIsbn(isbn);
if(bookInfo==null)
{
return false;
}
//取出Map数组
Map<String,BookInfo> bookInfoMap=findAll();
//出库数量违法
if(bookInfo.getInStoreCount()<outCount)
{
return false;
}
//进行出库
bookInfo.setInStoreCount(bookInfo.getInStoreCount()-outCount);
bookInfoMap.put(isbn, bookInfo);
//将其再写入到文件中去
FileUtil.bookSaveMap(bookInfoMap);
return true;
}
/**
* 入库
*/
@Override
public boolean inStore(String isbn, int inCount) {
BookInfo bookInfo=findByIsbn(isbn);
if(bookInfo==null)
{
return false;
}
Map<String,BookInfo> bookInfoMap=findAll();
if(bookInfoMap==null)
{
return false;
}
//进行入库操作
bookInfo.setInStoreCount(bookInfo.getInStoreCount()+inCount);
//放回到Map数组中去
bookInfoMap.put(isbn, bookInfo);
//写入到文件中去
FileUtil.bookSaveMap(bookInfoMap);
return true;
}
/**
* 通过书籍编号进行查图书的相关的信息
*/
@Override
public BookInfo findByIsbn(String isbn) {
if(isbn==null||"".equals(isbn)==true)
{
return null;
}
Map<String,BookInfo>bookInfoMap=findAll();
if(bookInfoMap==null)
{
return null;
}
if(!(bookInfoMap.containsKey(isbn)))
{
return null;
}
return bookInfoMap.get(isbn);
}
}
package LibraryManagementSystemV3;
import LibraryManagementSystemV3.BookInfoBiz;
/**
* 图书的角色类
* @author 李志文
* @version 1.8
* @date 2019年8月15日 上午10:39:55
* @content JAVA代码
* @motto 代码千万条,可读第一条。代码不规范,error多两行。
*/
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
public class Role implements Serializable{
private static final long serialVersionUID = 3348329615583361522L;
private String name; //显示给用户的名称
private String key; //对应配置文件中的权限key
private List<String> permissions; //权限集合-保存在配置文件中
private BookInfoBiz bookInfoBiz;
private UserBiz userBiz;
public Role()
{
setName("默认角色");
setKey("default");
bookInfoBiz=new BookInfoBizImpl();
userBiz=new UserBizImpl();
CreatePermissions(key);
}
public Role(String name,String key)
{
this.setName(name);
this.setKey(key);
bookInfoBiz=new BookInfoBizImpl();
userBiz=new UserBizImpl();
CreatePermissions(key);
System.out.println("角色"+name+"拥有以下权限:");
for (String permission : permissions) {
System.out.println(permission+",");
}
System.out.println();
}
private void CreatePermissions(String key) {
Properties props=new Properties();
try {
props.load(Role.class.getResourceAsStream("FIle_permission.properties"));
} catch (IOException e) {
e.printStackTrace();
}
//通过权限key拿到对应的权限字符串
String strPermission=props.getProperty(key);
if(null==permissions)
{
permissions=new ArrayList<>();
}
permissions.clear();
String []permissionArray=strPermission.split(",");
for (String permission : permissionArray) {
if("".equals(permission))
continue;
permissions.add(permission.trim());
}
}
/**
* 判断是否有权限执行传入点的 该操作方法点的名称
* @param optName 操作方法的名称
* @return 是否可以使用该名称
*/
private boolean checkPermission(String optName)
{
if(permissions==null||permissions.size()==0)
{
return false;
}
for(String permission:permissions)
{
if(optName.equals(permission))
{
return true;
}
if(permission.equals("bookinfobiz.*")&&optName.startsWith("bookinfobiz"))
{
return true;
}
if(permission.equals("userbiz.*")&&optName.startsWith("userbiz"))
{
return true;
}
}
return false;
}
/**
* 确认权限后再入库
* @param isbn 书籍的编号
* @param InCount 书籍入库的数量
* @return 是否入库成功
*/
public boolean inStore(String isbn,int InCount)
{
if(checkPermission("bookinfobiz.instore")==true)
{
bookInfoBiz.inStore(isbn, InCount);
return true;
}
else
{
throw new NosuchpermissionException(name+"没有操作<bookinfobiz.instore>的权限");
}
}
/**
* 判断用户登录是否合法
* @param user 传入的用户对象
* @return 是否可以登录
*/
public User login(User user)
{
if(checkPermission("userbiz.login")==true)
{
return userBiz.login(user);
}
else
{
throw new NosuchpermissionException(name+"没有操作<userbiz.login>的权限");
}
}
/**
* 确认身份后进行出库操作
* @param isbn 书籍的编号
* @param InCount 书籍出库的数量
* @return 是否出库成功
*/
public boolean outStore(String isbn,int InCount)
{
if(checkPermission("bookinfobiz.instore")==true)
{
return bookInfoBiz.outStore(isbn, InCount);
}
else
{
throw new NosuchpermissionException(name+"没有操作<bookinfobiz.instore>的权限");
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public List<String> getPermissions() {
return permissions;
}
public void setPermissions(List<String> permissions) {
this.permissions = permissions;
}
public BookInfoBiz getBookInfoBiz() {
return bookInfoBiz;
}
public void setBookInfoBiz(BookInfoBiz bookInfoBiz) {
this.bookInfoBiz = bookInfoBiz;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
}
记录的登陆者的键值所对应的系统使用权限的配置文件
#key= value
administrator=bookinfobiz.*,userbiz.*
oparator=userbiz.*
default=userbiz.login
package LibraryManagementSystemV3;
public class NosuchpermissionException extends RuntimeException {
private static final long serialVersionUID = -8380085720015067812L;
public NosuchpermissionException()
{
super();
System.out.println("此操作没有权限异常");
}
public NosuchpermissionException(String message)
{
super(message);
}
}
package LibraryManagementSystemV3;
import java.util.Scanner;
/**
* 显示菜单
* @author 李志文
* @version 1.8
* @date 2019年8月15日 下午2:25:46
* @content JAVA代码
* @motto 代码千万条,可读第一条。代码不规范,error多两行。
*/
public class ShowView {
private Scanner input=null;
private User loginUser=null; //当前登录的用户
private Role role=null; //当前的角色 来使用对应的方法
public ShowView()
{
input=new Scanner(System.in);
}
public void showWelcom()
{
System.out.println("\t\t========== 欢迎使用图书管理系统 ==========\t\t");
System.out.println("\t\t========== 1、登录图书管理系统 ==========\t\t");
System.out.println("\t\t========== 2、退出图书管理系统 ==========\t\t");
System.out.print("请您输入选择:");
String choice=input.next();
if("1".equals(choice))
{
showLoginView();
switch (this.role.getKey()) {
case "administrator":
showMainView_administrator();
break;
case "oparator":
showMainView_operator();
default:
break;
}
}
else
{
System.out.println("已成功退出系统!");
}
}
public User showLoginView()
{
User loginUser=new User();
System.out.print("请输入用户名:");
loginUser.setUserName(input.next());
System.out.print("请输入密码:");
loginUser.setPassord(input.next());
//需要通过业务方法来判断输入的用户对象是否合法
//如果合法,将当前登录的用户保存到this.loginUser备用,再设置当前登录点的角色
//以便显示相应的菜单及调用相应的方法
this.loginUser=loginUser.getRole().login(loginUser);
if(this.loginUser==null)
{
return null;
}
else
{
this.role=this.loginUser.getRole();
return this.loginUser;
}
}
public void showMainView_administrator()
{
System.out.println("管理员界面");
}
public void showMainView_operator()
{
System.out.println("操作员界面");
}
}
package LibraryManagementSystemV3;
import LibraryManagementSystemV3.User;
/**
* 用户业务类
* @author 李志文
* @version 1.8
* @date 2019年8月16日 上午7:30:56
* @content JAVA代码
* @motto 代码千万条,可读第一条。代码不规范,error多两行。
*/
public interface UserBiz extends Biz<User>{
public User login(User user);
}
package LibraryManagementSystemV3;
import java.util.Map;
import java.util.Set;
import LibraryManagementSystemV3.User;
public class UserBizImpl implements UserBiz{
private static final long serialVersionUID = -830680802568438275L;
@Override
public boolean add(User t) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean del(User t) {
// TODO Auto-generated method stub
return false;
}
@Override
public User update(User t) {
// TODO Auto-generated method stub
return null;
}
@Override
public User findByid(String id) {
// TODO Auto-generated method stub
return null;
}
@Override
public Map<String, User> findAll() {
return null;
}
@Override
public User login(User user) {
Set<User> userSet=FileUtil.userRead();
if(userSet==null||userSet.size()==0)
{
return null;
}
for (User temp : userSet) {
if(user.equals(temp))
{
return temp;
}
}
return null;
}
}
package LibraryManagementSystemV3;
public class NosuchpermissionException extends RuntimeException {
private static final long serialVersionUID = -8380085720015067812L;
public NosuchpermissionException()
{
super();
System.out.println("此操作没有权限异常");
}
public NosuchpermissionException(String message)
{
super(message);
}
}
package LibraryManagementSystemV3;
import LibraryManagementSystemV3.Role;
import java.io.Serializable;
import java.util.Date;
/**
* 用户类 ---实现用户的登陆环节
* @author 李志文
* @version 1.8
* @date 2019年8月15日 下午2:46:21
* @content JAVA代码
* @motto 代码千万条,可读第一条。代码不规范,error多两行。
*/
public class User implements Serializable{
private static final long serialVersionUID = -7688869767859624525L;
private String userName; //用户的名称
private String passord; //用户的密码
private Role role; //当前用户的角色
private Date lastedLoginTime; //上次登陆时间
public User()
{
role=new Role();
}
public User(Role role)
{
if(role==null)
{
role=new Role();
}
setRole(role);
}
@Override
public boolean equals(Object obj) {
if(null==obj||!(obj instanceof User) )
{
return false;
}
User user=(User) obj;
return this.userName.equals(user.getUserName())&&this.passord.equals(user.getPassord());
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassord() {
return passord;
}
public void setPassord(String passord) {
this.passord = passord;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
public Date getLastedLoginTime() {
return lastedLoginTime;
}
public void setLastedLoginTime(Date lastedLoginTime) {
this.lastedLoginTime = lastedLoginTime;
}
}