前端前端框架 : layui数据可视化框架 : echarts后端IOC容器 : SpringMVC框架 : SpringMVCORM框架 : 缓存技术:Redis
数据库:Mysql日志框架 : Log4j安全框架 : Shiro
一,功能
- 管理员登录
- 图书借阅信息管理
- 图书信息管理
- 管理员更改密码
- 退出系统
二,工具
- Eclipse Version: 2018-09 (4.9.0)
- MySQL Workbench 8.0 CE
- mysql-connector-java-8.0.13.jar
代码已经上传github,下载地址:Github
读者子系统功能描述
1.读者个人信息修改
本模块完成完成读者个人信息的修改功能,读者可以自行维护个人信息。
读者借书记录查看
读者借书记录查看模块完成读者的个人的借书情况查看功能,读者可以查看自己的历史借书及归还情况。
图书排行
图书排行模块完成查询图书馆的图书信息的排行功能,读者可以看到哪些是热门的借阅的图书。对于图书的借阅次数有所了解。
图书浏览
读者可以查看馆内的藏书的信息,了解图书的详细情况,并对图书是否借出有所掌握。
管理员子系统功能描述
图书馆详细信息
图书管理详细信息模块完成管理员对图书馆的详细信息设置的功能。
新增出版社
新增出版社模块完成添加出版社的功能。
出版社管理
出版社管理模块完成出版社信息的查询及删除功能,对出版社信息进行维护。
新增会员信息
新增会员信息模块完成读者信息的添加功能。管理员在后台完成读者信息的添加操作。
会员信息管理
会员信息管理模块完成读者信息的查询及删除功能。
新书上架
新书上架模块完成新书的添加功能。管理员对新到的图书进行添加。
图书维护模块
图书维护模块完成本馆图书的查询及删除的功能。
图书借阅管理
图书借况管理模块完成本馆的图书借况功能,管理员可以选择读者并选择要借阅的图书进行图书借阅。
图书归还管理
图书归还管理模块,完成读者图书归还的功能,管理员可以看到所有的未归还的图书,通过操作实现某本图书的归还操作。
历史借出名细
历史借出名细模块完成管理员查看历史借况情况的功能,管理员可以看到哪位读者在什么时间借阅了哪本书以及图书的归还时间。
图书排行榜
图书排行榜模块完成查看图书借况次数的统计功能
五、JAVA层次分析
(1)逻辑图
(2)包结构,采用MVC三层架构组织各个模块
六、主要Java代码分析
Dao类(以BookDao为例)
package pers.cyz.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import pers.cyz.model.Book;
import pers.cyz.util.DBUtil;
/**
* 数据库图书表信息数据访问对象类,包含增加图书信息、删除图书信息
* 、更新图书信息、查询图书信息、查询借阅信息和归还图书
*
* @author 1651200111 陈彦志
*/
public class BookDao {
/**
* 增加图书信息
*/
public void addBook(Book book) throws Exception{
// 首先拿到数据库的连接
Connection con = DBUtil.getConnection();
String sql="insert into tb_books"
// ISBN、书名、图书价格、图书作者、出版社
+ "(ISBN, book_name, book_price, book_author, published_house,"
// 分类号、借书人姓名、借书人电话、借书日期,已借天数
+ "book_category, borrower_name, borrower_phone) "
+ "values("
/*
* 参数用?表示,相当于占位符,然后在对参数进行赋值。当真正执行时,
* 这些参数会加载在SQL语句中,把SQL语句拼接完整才去执行。这样就会减少对数据库的操作
*/
+ "?,?,?,?,?,?,?,?)";
/*
* prepareStatement这个方法会将SQL语句加载到驱动程序conn集成程序中,
* 但是并不直接执行,而是当它调用execute()方法的时候才真正执行;
*/
PreparedStatement psmt = con.prepareStatement(sql);
// 先对应SQL语句,给SQL语句传递参数
psmt.setString(1, book.getISBN());
psmt.setString(2, book.getBookName());
psmt.setFloat(3, book.getPrice());
psmt.setString(4, book.getAuthor());
psmt.setString(5, book.getPublishHouse());
psmt.setString(6, book.getBookCategory());
if (book.getBorrowerName() == null || book.getBorrowerName() == "") {
psmt.setString(7, null);
}
else {
psmt.setString(7, book.getBorrowerName());
}
if (book.getBorrowerPhone() == null || book.getBorrowerPhone() == "") {
psmt.setString(8, null);
}
else {
psmt.setString(8, book.getBorrowerPhone());
}
//执行SQL语句
psmt.execute();
}
/**
* 删除图书信息
*/
public void delBook(int ID) throws SQLException{
// 首先拿到数据库的连接
Connection con=DBUtil.getConnection();
String sql="" +
"DELETE FROM tb_books "+
// 参数用?表示,相当于占位符
"WHERE ID = ?";
// 预编译sql语句
PreparedStatement psmt = con.prepareStatement(sql);
// 先对应SQL语句,给SQL语句传递参数
psmt.setInt(1, ID);
// 执行SQL语句
psmt.execute();
}
/**
* 更新图书信息
*/
public void changeBook(Book book) throws SQLException{
// 首先拿到数据库的连接
Connection con=DBUtil.getConnection();
String sql="update tb_books "
+ "set ISBN = ?, book_name = ?, book_price = ?, book_author = ?"
+ ",published_house = ?, book_category = ?, borrower_name = ?, borrower_phone = ? "
// 参数用?表示,相当于占位符
+ "where ID = ?";
// 预编译sql语句
PreparedStatement psmt = con.prepareStatement(sql);
// 先对应SQL语句,给SQL语句传递参数
psmt.setString(1, book.getISBN());
psmt.setString(2, book.getBookName());
psmt.setFloat(3, book.getPrice());
psmt.setString(4, book.getAuthor());
psmt.setString(5, book.getPublishHouse());
psmt.setString(6, book.getBookCategory());
if (book.getBorrowerName().equals("")) {
psmt.setString(7, null);
}
else {
psmt.setString(7, book.getBorrowerName());
}
if (book.getBorrowerPhone().equals("")) {
psmt.setString(8, null);
}
else {
psmt.setString(8, book.getBorrowerPhone());
}
psmt.setInt(9, book.getID());
// 执行SQL语句
psmt.execute();
}
/**
* 查询书籍信息
*/
public List<Book> query() throws Exception{
Connection con = DBUtil.getConnection();
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select "
// ISBN、书名、作者、图书价格、出版社
+ "ID, ISBN, book_name, book_author, book_price, published_house, "
// 分类号、借书人姓名、借书人电话
+ "book_category, borrower_name, borrower_phone "
+ "from tb_books");
List<Book> bookList = new ArrayList<Book>();
Book book = null;
// 如果对象中有数据,就会循环打印出来
while (rs.next()){
book = new Book();
book.setID(rs.getInt("ID"));
book.setISBN(rs.getString("ISBN"));
book.setBookName(rs.getString("book_name"));
book.setAuthor(rs.getString("book_author"));
book.setPrice(rs.getFloat("book_price"));
book.setPublishHouse(rs.getString("published_house"));
book.setBookCategory(rs.getString("book_category"));
book.setBorrowerName(rs.getString("borrower_name"));
book.setBorrowerPhone(rs.getString("borrower_phone"));
bookList.add(book);
}
return bookList;
}
/**
* 查询借阅信息
*
* @return
* bookList
*/
public List<Book> borrowQuery() throws Exception{
Connection con = DBUtil.getConnection();
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(""
// ID、书名、借书人姓名、借书人电话
+ "SELECT ID, book_name, borrower_name, borrower_phone "
+ "FROM tb_books "
+ "WHERE borrower_name IS NOT NULL"
);
List<Book> bookList = new ArrayList<Book>();
Book book = null;
// 如果对象中有数据,就会循环打印出来
while (rs.next()){
book = new Book();
book.setID(rs.getInt("ID"));
book.setBookName(rs.getString("book_name"));
book.setBorrowerName(rs.getString("borrower_name"));
book.setBorrowerPhone(rs.getString("borrower_phone"));
bookList.add(book);
}
return bookList;
}
/**
* 更新图书信息,归还图书
*/
public void returnBook(Book book) throws SQLException{
// 首先拿到数据库的连接
Connection con=DBUtil.getConnection();
String sql="UPDATE tb_books "
// ISBN、图书名称、作者、价格
+ "SET "
// 借书人姓名、借书人电话
+ "borrower_name = ?, borrower_phone = ? "
// 参数用?表示,相当于占位符
+ "WHERE ID = ?";
// 预编译sql语句
PreparedStatement psmt = con.prepareStatement(sql);
// 先对应SQL语句,给SQL语句传递参数
psmt.setString(1, book.getBorrowerName());
psmt.setString(2, book.getBorrowerPhone());
psmt.setInt(3, book.getID());
// 执行SQL语句
psmt.execute();
}
}
util类(以BackgroundImage为例)
package pers.cyz.util;
import java.awt.Container;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
/**
* 设置背景图片类
*
* @author 1651200111 陈彦志
*/
public class BackgroundImage {
public BackgroundImage(JFrame frame,Container container,String ImageName) {
// 限定加载图片路径
ImageIcon icon= new ImageIcon("res/" + ImageName);
final JLabel labelBackground = new JLabel();
ImageIcon iconBookManageSystemBackground = icon;
labelBackground.setIcon(iconBookManageSystemBackground);
// 设置label的大小
labelBackground.setBounds(0,0,iconBookManageSystemBackground.getIconWidth()
,iconBookManageSystemBackground.getIconHeight());
// 将背景图片标签放入桌面面板的最底层
frame.getLayeredPane().add(labelBackground,new Integer(Integer.MIN_VALUE));
// 将容器转换为面板设置为透明
JPanel panel = (JPanel)container;
panel.setOpaque(false);
}
}
重点内容 :
将图片标签放在窗体底层面板,然后将窗体转化为容器,将容器面板设为透明,背景图片就设置好了,之后就可以直接在该容器中添加组件
将所有两个或两个以上类需要用到的代码段全部封装到了公共类。
整体按照MVC三层架构组织