【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)
  }
}
相关推荐
小咕聊编程38 分钟前
基于Python的豆瓣电影数据可视化系统构建分析
开发语言·python·信息可视化
小小张说故事2 小时前
Python 的 dict 为什么查询是 O(1)?拆开哈希表、扰动函数与扩容阈值
python
脏脏a2 小时前
延迟与画质:远程控制的生命线
开发语言·php
像风一样的男人@3 小时前
python --基于scp的文件传输助手
开发语言·python
一条破秋裤3 小时前
SDIO Wi‑Fi 设备的驱动向insmod + 反向rmmod
开发语言·php
m0_639906943 小时前
Java 重写 Override 与重载 Overload 区别、访问修饰符、static 关键字
java·开发语言
Evand J3 小时前
【MATLAB例程】平面下,5基站对待定位点的定位。基于距离辅助下的AOA。完整代码下载链接
开发语言·matlab·平面·定位·导航·测距·aoa
用户0332126663673 小时前
使用 Python 在 Word 文档中添加、修改和删除变量
python
GIS数据转换器3 小时前
基于CIM的城市智慧供热监管服务平台
java·大数据·开发语言·人工智能·后端·物联网·struts
专注仿真3 小时前
动态规划算法详解
人工智能·python·大模型训练·控制算法