当前位置: 首页 > article >正文

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

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)
  }
}


http://www.kler.cn/a/459798.html

相关文章:

  • Spring Boot 中的 classpath详解
  • 免费又开源:企业级物联网平台的新选择 ThingsPanel
  • Spring Boot 中 TypeExcludeFilter 的作用及使用示例
  • word怎么添加链接,点击直接到参考文献
  • [2474].第04节:Activiti官方画流程图方式
  • Node.js 函数
  • 【信号滤波 (下)】采样条件,多种滤波算法对比(Matlab/C++)
  • 【技术实战】R语言统计分析与可视化从入门到精通
  • 【C#】int与byte[]数组互转
  • Hugging Face Dataset的 dataset_info.json 文件详解
  • 基于STM32智能电流表_V2.0版
  • React里通过使用classNames优化类名控制
  • 【2025最新计算机毕业设计】基于SpringBoot+Vue社区居民健康检测系统(高质量项目,可定制)【提供源码+答辩PPT+文档+项目部署】
  • 【Unity3D】ECS入门学习(七)缓存区组件 IBufferElementData
  • “AI智能安全管理系统:让安全无处不在
  • QTday5
  • 数据结构与算法Python版 图的应用与广度优先搜索
  • SQL 实战:日期与时间函数 – 统计数据的时间跨度与趋势
  • CSS系列(45)-- Scope详解
  • 谷歌浏览器的网页安全检测功能
  • Flutter快速动态生成APP启动图标logo的便捷方式
  • 代码随想录Day56 108. 冗余连接,109. 冗余连接II。
  • 自学记录HarmonyOS Next的HMS AI API 13:语音合成与语音识别
  • C语言控制台AI五子棋
  • IP组播基础
  • Kubernetes 的资源管理方式(二)