scala图书借阅系统完整代码

src目录下的scala类

dao_bookDAO

package org.app
package dao

import models.BookModel

import scala.collection.mutable.ListBuffer

//图书,数据操作
class BookDAO {
  //加载图书,从文件中读入
  def loadBooks(): ListBuffer[BookModel] = {
    val books = new ListBuffer[BookModel]()
    val source =scala.io.Source.fromFile("books.txt")
    for (line <- source.getLines()){
      val Array(id, name, author,available) = line.split(",")
      //
       books += BookModel(id.toInt, name, author, available.toBoolean)
    }
    //关闭连接
    source.close()
    books
  }

//保存图书,将图书写入文件
def saveBooks(books:ListBuffer[BookModel]):Unit ={
	val writer = new java.io.PrintWriter(new java.io.File("books.txt"))
	for(book <- books){
	writer.println(book.id + "," + book.name + "," + book.author + "," + book.available)
}
writer.close()
}
}
复制代码
dao_BorrowRecordDAO
package org.app
package dao

import org.app.models.BorrowRecordModel

import scala.collection.mutable.ListBuffer
import scala.io.Source

class BorrowRecordDAO{
  // 读出借阅记录
  def loadBorrowRecords(): ListBuffer[BorrowRecordModel] = {
    val borrowRecords = ListBuffer[BorrowRecordModel]()
    val lines = Source.fromFile("borrow_records.txt")
    for(line <- lines.getLines()){
      val parts = line.split(",")

      borrowRecords += BorrowRecordModel(
        parts(0),
        parts(1).toInt,
        parts(2),
        parts(3),
        if(parts.length>4)Some(parts(4))else None
      )
      //      val Array(userName,bookID,bookName,borrowDate,returnDate) = line.split(",")
      //      borrowRecords += BorrowRecordModel(userName,bookID.toInt,bookName,borrowDate,Some(returnDate))
    }
    borrowRecords
  }

  // 写入借阅记录
  def saveBorrowRecords(records: ListBuffer[BorrowRecordModel]): Unit = {
    val writer = new java.io.PrintWriter("borrow_records.txt")
    for(record <- records){
      writer.println(record.userName+","+record.bookID+","+record.bookName+","+record.borrowDate+","+record.returnDate.getOrElse(""))
    }
    writer.close()
  }
}

dao_UserDAO

package org.app
package dao

import models.{BookModel, UserModel}

import scala.collection.mutable.ListBuffer

class UserDAO {

  //加载所有的用户
  def loadUsers():ListBuffer[UserModel]={
    val users = new ListBuffer[UserModel]()
    val source = scala.io.Source.fromFile("users.txt")
    for (line <- source.getLines()) {
      val Array(username,password,role) = line.split(",")
      //
      users += UserModel(username,password,role)
    }
    //关闭连接
    source.close()
    users
  }

  //保存图书,将图书写入文件
  def saveUsers(users: ListBuffer[UserModel]): Unit = {
    val writer = new java.io.PrintWriter(new java.io.File("books.txt"))
    for (user <- users) {
      writer.println(user.username+ "," + user.password + "," + user.role)
    }
    writer.close()
  }
}

models_BookModel

package org.app
package models

//图书类
//id,书名,作者,available:是否外借
case class BookModel(id:Int,name:String,author:String,var available:Boolean) {
  override def toString:String = {
    val availableStr = if(available) "可外借" else "已借出"
    s"编号:$id \t $name \t $author,$availableStr"
  }

}

models_BorrowRecordModel

package org.app
package models

//借阅记录类
case class BorrowRecordModel (
  userName: String,   //借书人
  bookID:Int,          //书籍ID
  bookName: String,      //书籍名称
  borrowDate: String,      //借书日期
  var returnDate: Option[String] = None       //还书日期
                             )

models_UserModel

package org.app
package models

case class UserModel (
                     username:String,
                       password:String,
                     role:String //普通用户
                     ){


}

service_BookService

package org.app
package service

import org.app.dao.{BookDAO, BorrowRecordDAO}
import org.app.models.{BookModel, BorrowRecordModel}

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 = {
    //service//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)
        //TODO 添加一条借书的记录
        //读出当前全部记录
        //添加一条
        records += BorrowRecordModel(username, b.id, b.name, LocalDateTime.now().toString)
        //写回文件
        borrowRecordDAO.saveBorrowRecords(records)
        println("借阅成功")
        true
      } else {
        println("这本书被借走了")
        false
      }
    } else {
      false
    }
  }

  def queryBorrowRecords(username: String): ListBuffer[BorrowRecordModel] = {
    //1.把所有的记录全读出来
    val records = borrowRecordDAO.loadBorrowRecords()
    //2.过滤出当前用户借阅的记录
    records.filter(r => r.userName == username)
  }

  //普通用户,归还自己借得某一本书
  def returnBook(username: String, bookId: Int): Boolean = {
    //1.确定这本书是她本人借的还处于没有归还的状态
    queryBorrowRecords(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文件中
        //3.更新借阅记录的状态
        //3.1加载全部的借阅记录
        val records = borrowRecordDAO.loadBorrowRecords()
        //3.2 找到当前这本书的借阅记录,bookID,useranme,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.把新的图书写入到.txt文件中
    books += newBook
    //4.写入到.txt文件中
    bookDAO.saveBooks(books)
  }
}

service_UserService

package org.app
package service

import dao.UserDAO
import org.app.models.UserModel

class UserService {
  private val userDAO = new UserDAO()
  //身份校验
  def authenticateUser(username:String,password:String):Option[UserModel]={
    //根据用户名和密码查询,是否符合要求
    val users = userDAO.loadUsers()
    users.find(user=>user.username==username && user.password == password)
  }
  def addUsre(username: String): Boolean = {
    //1.查询用户名是否已经存在
    val users = userDAO.loadUsers()
    val user = users.find(_.username == username)
    if(user.isEmpty){
      //2.如果不存在,则添加
      //2.1 读出所有的用户
      //2.2 创建新的用户.设置用户密码,123,类别,普通用户
       users += UserModel(username,"123","普通用户")
      //2.3 将用户添加文件合中
      userDAO.saveUsers(users)
      true
    }else{
      false
    }
  }
}

UI_library

package org.app
package ui

import org.app.models.{BookModel, UserModel}
import org.app.service.{BookService, UserService}

import scala.io.StdIn
import scala.io.StdIn.readLine

class library {

  private val BookService = new BookService()
  private val UserService = new UserService()
  //调用方法,输入图书的信息,返回BookModel
  private def inputBookInfo(): BookModel = {
    println("请输入图书名称:")
    val name = readLine().trim
    println("请输入图书作者:")
    val author = readLine().trim
    println("请输入图书是否借出:(ture/false):")
    val available = StdIn.readBoolean()
    //初始设置编号为0
    BookModel(0,name, author, available)

  }
  // 显示游客的菜单
  def showVisitorMenu(): Unit = {
    var running = true
    while (running) {
      println("欢迎来到我的图书管理系统, 请选择")
      println("1. 查看所有图书")
      println("2. 查询图书")
      println("3. 登录")
      println("4. 离开")

      // 获取用户的操作
      val choice = StdIn.readLine().trim
      choice match {
        case "1" =>
          // 调用业务逻辑层的方法
          val results = BookService.searchBooks("")
          if(results.nonEmpty){
            results.foreach(println)
          } else {
            println("没有找到图书")
          }
        case "2" =>
          // 提示用户输入查询关键字
          val query = readLine("请输入查询关键字(书名,作者):").trim
          // 根据关键字去查询图书列表,找到满足条件的书
          val results = BookService.searchBooks(query)
          // 显示出来
          if(results.nonEmpty){
            println("=======查询图书的结果:=======")
            results.foreach(println)
          } else {
            println("没有找到图书")
          }
        case "3" =>
          println("请输入用户名:")
          val username = StdIn.readLine().trim
          println("请输入密码:")
          val password = StdIn.readLine().trim
          // 调用Service的方法,进行登录
          val userOpt = UserService.authenticateUser(username, password)
          if(userOpt.isEmpty){
            println("用户名或密码错误")
          } else {
            println("登录成功")
            // 登录成功,显示登录用户的菜单
            val user = userOpt.get
            user.role match {
              case "管理员" => showAdminMenu(user)
              case "普通用户" => showUserMenu(user)
            }
          }
        case "4" =>
          running = false
          println("感谢你的使用,下次再见")
        case _ => println("无效的选择")
      }
    }
  }

  // 显示管理员的菜单
  def showAdminMenu(user:UserModel): Unit = {
    var running = true
    while (running) {
      println(s"欢迎管理员:${user.username},来到我的图书管理系统, 请选择")
      println("1. 添加图书")
      println("2. 查询图书")
      println("3. 添加用户")
      println("4. 退出")

      // 获取用户的操作
      val choice = StdIn.readLine().trim
      choice match {
        case "1" =>
          //1.获取图书信息,书名,作者,状态
        val book = inputBookInfo()
          println(book)
        //2. 调用Service的方法,进行图书的添加books.txt文件中
            BookService.addBook(book)
          println(s"图书:${book.name}添加成功 ")
        case "2" => println("查询图书")
        case "3" =>
          //1.获取用户信息,用户名
        val username = StdIn.readLine("请输入用户名: ")
          if(UserService.addUsre(username)){
            println(s"用户:${username}添加成功 ")
          }else{
            println(s"用户:${username}添加失败 ")
          }
        //2. 调用Service的方法,进行用户的添加users.txt文件中
        case "4" => running = false
        case _ => println("无效的选择")
      }
    }
  }
  // 显示登录用户的菜单
  def showUserMenu(user:UserModel): Unit = {
    var running = true
    while (running) {
      println(s"欢迎用户:${user.username},来到我的图书管理系统, 请选择")
      println("1. 借阅图书")
      println("2. 查询借阅图书")
      println("3. 还书图书")
      println("4. 退出")

      // 获取用户的操作
      val choice = StdIn.readLine().trim
      choice match {
        case "1" =>
          // UI: 提示用户输入图书的ID。校验:判断是不是整数
          try {
            val id = readLine("请输入图书的ID:").toInt
            BookService.borrowBook(user.username, id)
          } catch {
            case e:Exception =>
              println(e)
              println("输入的图书ID无效")
          }

        case "2" =>
          println("查询借阅图书")
          // 在BookService中实现根据用户名去查询借阅图书
          val borrowRecords = BookService.queryBorrowRecords(user.username)
          //判断是否为空
          if(borrowRecords.isEmpty){
            println("没有借阅记录")
          }else{
            //遍历借阅记录
            for(record <- borrowRecords){
              println(record)
              val returnDate = record.returnDate.getOrElse("未归还")
              println(s"书名:${record.bookName}  借阅日期:${record.borrowDate}  归还日期:${returnDate}")
            }
          }
        case "3" =>
          try {
          val id = readLine("请输入要还书图书的ID:").toInt
          if(BookService.returnBook(user.username, id)){
            println("归还图书成功")
          }else{
            println("归还图书失败")
          }
        } catch {
          case e: Exception =>
            println(e)
            println("输入的图书ID无效")
        }
        case "4" => running = false
        case _ => println("无效的选择")
      }
    }
  }

  def showMenu(): Unit = {
    showVisitorMenu()
  }
}

Main方法

package org.app

import org.app.ui.library

object Main {
  def main(args: Array[String]): Unit = {
    val m = new library()
    m.showMenu()


  }

}

books.txt文件

复制代码
1,人性的弱点,卡耐基,false
2,理想国,柏拉图,true
3,埃隆・马斯克传,艾萨克森,true
4,苏东坡传,林语堂,true
5,杨苡口述自传,杨苡、余斌,true
6,曾国藩传,张宏杰,true
7,知行合一王阳明,度阴山,true
8,暮色将尽,戴安娜・阿西尔,true
9,你当像鸟飞往你的山,塔拉・韦斯特弗,true
10,邓小平时代,傅高义,true

borrow_records.txt文件

借书还书会自动更新记录

users.txt文件

复制代码
fan,123,普通用户
adimin,123,管理员
相关推荐
西猫雷婶37 分钟前
python学opencv|读取图像(十九)使用cv2.rectangle()绘制矩形
开发语言·python·opencv
liuxin334455661 小时前
学籍管理系统:实现教育管理现代化
java·开发语言·前端·数据库·安全
海绵波波1071 小时前
flask后端开发(10):问答平台项目结构搭建
后端·python·flask
码农W1 小时前
QT--静态插件、动态插件
开发语言·qt
ke_wu2 小时前
结构型设计模式
开发语言·设计模式·组合模式·简单工厂模式·工厂方法模式·抽象工厂模式·装饰器模式
code04号2 小时前
python脚本:批量提取excel数据
开发语言·python·excel
小王爱吃月亮糖2 小时前
C++的23种设计模式
开发语言·c++·qt·算法·设计模式·ecmascript
hakesashou2 小时前
python如何打乱list
开发语言·python
网络风云2 小时前
【魅力golang】之-反射
开发语言·后端·golang
Q_19284999062 小时前
基于Spring Boot的电影售票系统
java·spring boot·后端