【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)
  }
}
相关推荐
HelloWorld1024!4 分钟前
c++核心之万字详解 * 和 & 所有用法(指针、引用、取地址、解引用、常量修饰)
开发语言
qqqweiweiqq5 分钟前
Jetson Orin nx 无法train pi0
人工智能·python·深度学习
AAA大运重卡何师傅(专跑国道)7 分钟前
scrapling框架源码5/19
python
Legendary_00811 分钟前
解析 PD Sink 与 LDR6500U:Type-C 取电的核心密码
c语言·开发语言
xingyuzhisuan11 分钟前
Jupyter Notebook 云GPU配置全解析(含实操+选型指南)
ide·python·jupyter·gpu算力
冴羽yayujs17 分钟前
JavaScript 9 个先有库再有 API 的故事
开发语言·javascript·ecmascript
ITIRONMAN18 分钟前
开源data-compare:轻量级数据对比工具
人工智能·python
回忆2012初秋19 分钟前
.NET 8.0 实战:基于 MQTTnet 封装高可用的 MQTT 发布/订阅工具类
开发语言·mqtt·.net
云姜.30 分钟前
如何快速使用Langchain上手编程
python·langchain
油丶酸萝卜别吃35 分钟前
JavaScript 深度合并函数 deepMerge 实现指南(附完整测试用例)
开发语言·javascript·测试用例