本章节给大家介绍一个基于Java简单实现图书馆借书管理系统的设计与实现
💕💕文末获取源码
项目概述
项目总体分为俩种角色,分别是管理员和阅读者,管理员可以登录系统中,进行图书管理,上架下架图书,对用户进行管理、对读者进行管理、查看借阅记录管理等,读者角色可以登录系统查询图书信息、借阅和归还图书、查看个人借阅记录、编辑个人信息等。
项目功能简单,数据库也只有4张表,分别为管理员表,读者表,图书表和借阅记录表,但基本实现了图书馆对图书借书的管理功能,大家可以在这个基础上面灵活增加功能。
项目架构
采用B/S的架构实现,整体遵循MVC的设计思想,采用的是前后端分离的技术。
开发系统:Windows架构模式:MVC/前后端分离JDK版本:Java JDK1.8开发工具:idea或者eclipse数据库版本: mysql数据库可视化工具: navicat后端:java,spring,springmvc,springboot,mybatis,tomcat等前端:html,css,javascript,vue等
项目实现
所有的代码文件都有详细的注释,不用担心看不懂代码的。
BookController
图书的控制器类:
@RestController@RequestMapping("/book")public class BookController extends BaseController {@Resourceprivate BookService bookService;/*** 分页查询所有数据** @param page 分页对象* @param book 查询实体* @return 所有数据*/@GetMapping("/list")public R selectAll(Page<Book> page, Book book) {return result(this.bookService.page(page, book));}/*** 添加图书** @param book 图书* @return 是否添加成功*/@PostMapping("/add")public R addBook(@RequestBody Book book) {return result(bookService.save(book));}/*** 修改图书** @param book 图书* @return 是否修改成功*/@PostMapping("/update")public R updateBook(@RequestBody Book book) {return result(bookService.updateById(book));}/*** 根据图书编号批量删除图书** @param isbns 图书编号表* @return 是否删除成功*/@GetMapping("/delete")public R deleteBook(@RequestParam List<String> isbns) {return result(bookService.removeByIds(isbns));}//======================= 读者操作接口 ======================/*** 借阅图书** @param isbn图书编号* @param readerId 读者编号* @return 是否借阅成功*/@GetMapping("/lendBook")public R lendBook(String isbn, Long readerId) {return result(bookService.lendBook(isbn, readerId));}/*** 归还图书** @param isbn图书编号* @param readerId 读者编号* @return 是否归还成功*/@GetMapping("/returnBook")public R returnBook(String isbn, Long readerId) {return result(bookService.returnBook(isbn, readerId));}}
图书service
的实现类:
@Service("bookService")public class BookServiceImpl extends ServiceImpl<BookMapper, Book> implements BookService {@Resourceprivate LendRecordService lendRecordService;/*** 分页查询图书** @param page 分页* @param book 查询信息* @return 图书列表,图书总计*/@Overridepublic Map<String, Object> page(Page<Book> page, Book book) {String author = book.getAuthor();String bookName = book.getBookName();QueryWrapper<Book> wrapper = new QueryWrapper<>();wrapper.lambda().like(!StringUtils.isEmpty(author), Book::getAuthor, author).like(!StringUtils.isEmpty(bookName), Book::getBookName, bookName);Page<Book> selectPage = this.baseMapper.selectPage(page, wrapper);Map<String, Object> map = new HashMap<>();map.put("list", selectPage.getRecords());map.put("total", selectPage.getTotal());return map;}/*** 借阅图书* 根据图书的isbn编号借阅图书* 如果当前图书未被借阅(status为0),修改status为1,同时新增一条借阅记录** @param isbn图书编号* @param readerId 读者编号* @return 是否借阅成功*/@Overridepublic boolean lendBook(String isbn, Long readerId) {Book book = this.baseMapper.selectById(isbn);book.setStatus("1");int res = this.baseMapper.updateById(book);// 新增借阅记录LendRecord lendRecord = new LendRecord();lendRecord.setIsbn(isbn);lendRecord.setReaderId(readerId);lendRecord.setLendDate(new Date());boolean save = lendRecordService.save(lendRecord);return res == 1 && save;}/*** 归还图书** @param isbn图书编号* @param readerId 读者编号* @return 是否归还成功*/@Overridepublic boolean returnBook(String isbn, Long readerId) {Book book = this.baseMapper.selectById(isbn);book.setStatus("0");int res = this.baseMapper.updateById(book);// 更新借阅记录状态QueryWrapper<LendRecord> wrapper = new QueryWrapper<>();wrapper.lambda().eq(LendRecord::getStatus, "0").eq(LendRecord::getIsbn, isbn).eq(LendRecord::getReaderId, readerId);LendRecord lendRecord = lendRecordService.getOne(wrapper);lendRecord.setReturnDate(new Date());lendRecord.setStatus("1");boolean update = lendRecordService.update(lendRecord, wrapper);return res == 1 && update;}}
系统登录处理控制器LoginController
:
@RestControllerpublic class LoginController extends BaseController {@Resourceprivate AdminService adminService;@Resourceprivate ReaderService readerService;/*** 登录** @param loginBody 登录信息* @return 随机字符串uuid*/@PostMapping("/login")public R login(@RequestBody LoginBody loginBody) {String username = loginBody.getUsername();String password = loginBody.getPassword();String role = loginBody.getRole();Object user = null;if (!StringUtils.isEmpty(role)) {if ("reader".equals(role)) {// 读者登录QueryWrapper<Reader> wrapper = new QueryWrapper<>();wrapper.lambda().eq(Reader::getUsername, username).eq(Reader::getPassword, password);user = readerService.getOne(wrapper);} else if ("admin".equals(role)) {// 管理员登录QueryWrapper<Admin> wrapper = new QueryWrapper<>();wrapper.lambda().eq(Admin::getUsername, username).eq(Admin::getPassword, password);user = adminService.getOne(wrapper);}}if (user != null) {// 登录成功String uuid = UUIDUtils.getUUID();Long userId = "admin".equals(role) ? ((Admin) user).getId() : ((Reader) user).getReaderId();LoginUser.addUser(uuid, role, userId);LoginUser.addVisitCount(); // 访问数量加1return result(uuid, "登录成功!");} else {return result(R.ERROR, "登录失败! 账号或密码错误!");}}/*** 获取用户信息** @param token 令牌* @return 用户信息*/@GetMapping("/getInfo")public R getInfo(String token) {if (!StringUtils.isEmpty(token)) {User u = LoginUser.getUserByToken(token);if (u != null) {// token验证成功String role = u.getRole();Long userId = u.getUserId();Object user = null;if ("reader".equals(role)) {// 获取读者信息QueryWrapper<Reader> wrapper = new QueryWrapper<>();wrapper.lambda().eq(Reader::getReaderId, userId);user = readerService.getOne(wrapper);} else if ("admin".equals(role)) {// 获取管理员信息QueryWrapper<Admin> wrapper = new QueryWrapper<>();wrapper.lambda().eq(Admin::getId, userId);user = adminService.getOne(wrapper);}return result(user);}}return result(R.SUCCESS, "暂未登录!");}/*** 获取访问数量** @return 访问数量*/@GetMapping("/visitCount")public R visitCount() {return result(LoginUser.getVisitCount());}}
部分功能展示
登录页面
管理员和读者可以通过账号密码登录系统中:
管理员角色
管理员首页
管理员首页展示了所有的借阅次数,总共访问数,总共的图书数量以及总共的读者数量,同时还了图表显示:
图书管理
管理员可以上架新的图书,可以修改,删除图书:
读者管理
管理员可以看到所有的系统读者,还可以增加读者,修改密码等等:
借阅管理
管理员可以查看所有的系统图书的借阅记录:
读者角色
图书查询
读者可以通过图书名称或者图书的作者查询系统的图书列表,对于未借阅的图书,读者可以点击借阅即可借阅图书,然后对于自己已借阅的图书可以进行归还:
查看自己的借阅记录
对于读者在系统上面的借阅记录,可以在借阅管理进行查看:
个人信息
读者可以在个人中心进行信息修改:
结语(文末获取源码)
💟💟如果大家有任何疑虑,欢迎在下方 位置 ☟☟☟ 添加详细交流。