【Scala】图书项目系统代码演练3.1/BookService

Scala 复制代码
package org.app
package service

import models.{BookModel, BorrowRecordModel}

import org.app.dao.{BookDAO, BorrowRecordDAO}

import java.time.LocalDateTime
import scala.collection.mutable.ListBuffer

// 图书业务逻辑层
class BookService {

  private val bookDAO = new BookDAO()
  private val borrowRecordDAO = new BorrowRecordDAO()

  // 查询所有的图书
  //  def searchBooks(query:String): 图书列表List(Book对象)
  def searchBooks(query:String):ListBuffer[BookModel] = {
    // 从文本文件中读取书本信息,并保存列表中,返回
    val books = bookDAO.loadBooks()
     query match {
       case "" => books // 没有条件,就返回全部
       case _ => books.filter(b => b.name.contains(query) || b.author.contains(query)) // 有条件,就过滤
     }
  }

  // 普通用户,借阅图书
  def borrowBook(username:String, bookId:Int):Boolean = {
      // (1)根据图书的ID,查询图书,判断图书是否存在
      val books = bookDAO.loadBooks()
      // 所有的借阅记录
      val records = borrowRecordDAO.loadBorrowRecords()

      val book = books.find(b => b.id == bookId)
      if(book.nonEmpty){
        val b = book.get
       //   (2)判断图书是否已经被借出
        if(b.available){
          // (3)借阅图书 更新这本书的状态
          b.available = false
          // 把更新之后的图书的信息写回txt文件
          bookDAO.saveBooks(books)
          // 添加一条借阅记录
        records += BorrowRecordModel(username, b.id,b.name, LocalDateTime.now().toString)
        // 写借阅记录回文件
        borrowRecordDAO.saveBorrowRecords(records)
          println("借阅成功,已保存借阅记录!")
          true
        } else {
          println("这本书被借走了")
          false
        }
      } else {
        println("没有找到这本书")
        false
    }
  }
  //普通用户,查询自己的借阅记录
  def queryBorrowedBooks(username: String):ListBuffer[BorrowRecordModel] = {
    //  1.把所有的记录全读出来
    val records = borrowRecordDAO.loadBorrowRecords()
    //  2.过滤出当前用户的借阅记录
    records.filter(r => r.userName == username)
  }

  // 普通用户.归还自己借的某一本书
  def returnBook(username: String, bookId: Int): Boolean = {
    // 1.确定这本书是他本人借的并处于没有归还的状态
    queryBorrowedBooks(username).find(r => r.bookID == bookId && r.returnDate.isEmpty) match {
      case Some(record) =>
        // 2.更新书的状态
        // 2.1 加载全部的书
        val books = bookDAO.loadBooks()
        // 2.2 选择当前这本书
        val b = books.find(_.id == bookId).get
        b.available = true
        // 2.3 把更新之后的状态写回.txt文件
        bookDAO.saveBooks(books)
        // 3.更新借阅记录的状态
        //        3.1 加载全部的借阅记录
        val records = borrowRecordDAO.loadBorrowRecords()
        //        3.2 找到当前这本书的借阅记录 bookID,userName,returnDate = None
        val r = records.find(r => r.bookID == bookId && r.userName == username && r.returnDate.isEmpty).get
        r.returnDate = Some(LocalDateTime.now().toString)
        //        3.3 把更新之后的状态写回.txt文件
        borrowRecordDAO.saveBorrowRecords(records)
        true
      case None => false
    }
  }

  // 添加图书
  def addBook(book: BookModel): Unit = {
    // 1. 生成一个book ID
    // 查询所有图书. 找到最大的ID,+1
    var id = 1
    val books = bookDAO.loadBooks()
    if (books.nonEmpty) {
      id = books.map(_.id).max + 1
    }
    // 2. 更新ID
    val newBook = book.copy(id = id)
    // 3. 把新的图书添加到books
    books += newBook
    // 4.写回到.txt中
    bookDAO.saveBooks(books)
  }
}
相关推荐
装不满的克莱因瓶33 分钟前
链式法则如何传递参数误差 —— 深入理解神经网络中的梯度传播
人工智能·python·深度学习·神经网络·数学·机器学习·ai
Anastasiozzzz34 分钟前
从有限状态机到智能体图:传统 FSM 与 Agent Graph的演进
java·人工智能·python·ai
fqbqrr6 小时前
2606C++,C++构的多态
开发语言·c++
biter down6 小时前
从 0 到 1 搭建 Python 接口自动化测试框架(博客系统实战)
开发语言·python
肖永威8 小时前
Python多业务并行计算框架插件化演进:从硬编码到动态注册
python·插件化·并行计算·动态注册
yz_aiks8 小时前
Linux Jar包配置Systemd自启动实战:从排查到配置全流程
linux·python·jar·自启动·systemd
threelab8 小时前
Three.js 物理模拟着色器 | 三维可视化 / AI 提示词
开发语言·前端·javascript·人工智能·3d·着色器
武器大师728 小时前
lv_binding_js 代码解读
开发语言·javascript·ecmascript
不知名的老吴8 小时前
线程的生命周期之线程“插队“
java·开发语言·python