Scala图书管理系统

张裕  金牌会员 | 2024-12-31 10:55:49 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 506|帖子 506|积分 1518



 

  1. package org.app
  2. package dao
  3. import org.app.models.BookModel
  4. import scala.collection.mutable.ListBuffer
  5. //图书,数据操作层
  6. class BookDAO {
  7.   //加载图书,从文件中读入
  8.   def loadBooks(): ListBuffer[BookModel] = {
  9.     val books = new ListBuffer[BookModel]()
  10.     val source = scala.io.Source.fromFile("books.txt")
  11.     for(line <- source.getLines()){
  12.       println(line)
  13.       val Array(id, name, author, available) = line.split(",")
  14.       //实例化一本书,保存到List
  15.       books += BookModel(id.toInt, name, author, available.toBoolean)
  16.     }
  17.     //关闭连接
  18.     source.close()
  19.     books
  20.   }
  21.   //保存图书,将图书写入文件
  22.   def saveBooks(books: ListBuffer[BookModel]): Unit = {
  23.     val writer = new java.io.PrintWriter(new java.io.File("books.txt"))
  24.     for(book <- books){
  25.       writer.println(book.id + "," + book.name + "," + book.author + "," + book.available)
  26.     }
  27.     writer.close()
  28.   }
  29. }
复制代码
  1. package org.app
  2. package dao
  3. import models.BorrowRecordModel
  4. import scala.collection.mutable.ListBuffer
  5. import scala.io.Source
  6. class BorrowRecordDAO {
  7.   // 读出借阅记录
  8.   def loadBorrowRecords(): ListBuffer[BorrowRecordModel] = {
  9.     val borrowRecords = ListBuffer[BorrowRecordModel]()
  10.     val lines = Source.fromFile("borrow_records.txt")
  11.     for (line <- lines.getLines()) {
  12.       val parts = line.split(",")
  13.       borrowRecords += BorrowRecordModel(
  14.         parts(0),
  15.         parts(1).toInt,
  16.         parts(2),
  17.         parts(3),
  18.         if(parts.length>4) Some(parts(4)) else None
  19.       )
  20.     }
  21.     borrowRecords
  22.   }
  23.   // 写入借阅记录
  24.   def saveBorrowRecords(records: ListBuffer[BorrowRecordModel]): Unit = {
  25.     val writer = new java.io.PrintWriter("borrow_records.txt")
  26.     for (record <- records) {
  27.       writer.println(record.userName + "," + record.bookID + "," + record.bookName + "," + record.borrowDate + "," + record.returnDate.getOrElse(""))
  28.     }
  29.     writer.close()
  30.   }
  31. }
复制代码
  1. package org.app
  2. package dao
  3. import models.UserModel
  4. import scala.collection.mutable.ListBuffer
  5. class UserDAO {
  6.   //加载所有的用户
  7.   def loadUsers(): ListBuffer[UserModel] = {
  8.     val users = new ListBuffer[UserModel]()
  9.     val source = scala.io.Source.fromFile("users.txt")
  10.     for (line <- source.getLines()) {
  11.       val Array(username,password,role) = line.split(",")
  12.       //实例化一本书,保存到List
  13.       users += UserModel(username,password,role)
  14.     }
  15.     //关闭连接
  16.     source.close()
  17.     users
  18.   }
  19.   //保存用户,将用户列表写入文件
  20.   def saveUsers(users: ListBuffer[UserModel]): Unit = {
  21.     val writer = new java.io.PrintWriter(new java.io.File("users.txt"))
  22.     for (user <- users) {
  23.       writer.println(user.username + "," + user.password + "," + user.role)
  24.     }
  25.     writer.close()
  26.   }
  27. }
复制代码
  1. package org.app
  2. package models
  3. //借阅记录类
  4. case class BorrowRecordModel (
  5.                              userName:String, // 借书人
  6.                              bookID:Int, // 书ID
  7.                              bookName:String, // 书名
  8.                              borrowDate:String, // 借书日期
  9.                              var returnDate:Option[String] = None // 归还日期
  10.                              )
复制代码
  1. package org.app
  2. package models
  3. case class UserModel(
  4.                     username:String,
  5.                     password:String,
  6.                     role:String //普通用户,管理员
  7.                     ) {
  8. }
复制代码
  1. package org.app
  2. package service
  3. import models.{BookModel, BorrowRecordModel}
  4. import org.app.dao.{BookDAO, BorrowRecordDAO}
  5. import java.time.LocalDateTime
  6. import scala.collection.mutable.ListBuffer
  7. class BookService {
  8.   private val bookDAO = new BookDAO()
  9.   private val borrowRecordDAO = new BorrowRecordDAO()
  10.   //查询所有的图书
  11.   //  def searchBooks(query:String): 图书列表List(Book对象)
  12.   def searchBooks(query: String): ListBuffer[BookModel] = {
  13.     //从文本文件中读取书本信息,并保存列表中,返回
  14.     val books = bookDAO.loadBooks()
  15.     query match {
  16.       case "" => books //没有条件,就返回全部
  17.       case _ => books.filter(b => b.name.contains(query) || b.author.contains(query)) //有条件,就过滤
  18.     }
  19.   }
  20.   // 普通用户. 借阅图书
  21.   def borrowBook(username: String, bookId: Int): Boolean = {
  22.     // (1)根据图书的ID. 查询图书. 判断图书是否存在
  23.     val books = bookDAO.loadBooks()
  24.     // 所有的借阅记录
  25.     val records = borrowRecordDAO.loadBorrowRecords()
  26.     val book = books.find(b => b.id == bookId)
  27.     if (book.nonEmpty) {
  28.       val b = book.get
  29.       //     (2)判断图书是否已经被借出
  30.       if (b.available) {
  31.         // (3)借阅图书 更新这本书的状态
  32.         b.available = false
  33.         //把更新之后的图书的信息写回txt文件
  34.         bookDAO.saveBooks(books)
  35.         //添加一条借阅记录
  36.         records += BorrowRecordModel(username, b.id, b.name, LocalDateTime.now().toString)
  37.         //写借阅记录回文件
  38.         borrowRecordDAO.saveBorrowRecords(records)
  39.         println("借阅成功.已保存借阅记录!")
  40.         true
  41.       } else {
  42.         println("这本书被借走了")
  43.         false
  44.       }
  45.     } else {
  46.       println("没有找到这本书")
  47.       false
  48.     }
  49.   }
  50.   // 普通用户,查询自己的借阅记录
  51.   def queryBorrowedBooks(username: String): ListBuffer[BorrowRecordModel] = {
  52.     //    1.把所有的记录全部读出来
  53.     val records = borrowRecordDAO.loadBorrowRecords()
  54.     //    2.过滤出当前用户的借阅记录
  55.     records.filter(r => r.userName == username)
  56.   }
  57.   // 普通用户.归还自己借的某一本书
  58.   def returnBook(username: String, bookId: Int): Boolean = {
  59.     // 1.确定这本书是他本人借的并处于没有归还的状态
  60.     queryBorrowedBooks(username).find(r => r.bookID == bookId && r.returnDate.isEmpty) match {
  61.       case Some(record) =>
  62.         // 2.更新书的状态
  63.         // 2.1 加载全部的书
  64.         val books = bookDAO.loadBooks()
  65.         // 2.2 选择当前这本书
  66.         val b = books.find(_.id == bookId).get
  67.         b.available = true
  68.         // 2.3 把更新之后的状态写回.txt文件
  69.         bookDAO.saveBooks(books)
  70.         // 3.更新借阅记录的状态
  71.         //        3.1 加载全部的借阅记录
  72.         val records = borrowRecordDAO.loadBorrowRecords()
  73.         //        3.2 找到当前这本书的借阅记录 bookID,userName,returnDate = None
  74.         val r = records.find(r => r.bookID == bookId && r.userName == username && r.returnDate.isEmpty).get
  75.         r.returnDate = Some(LocalDateTime.now().toString)
  76.         //        3.3 把更新之后的状态写回.txt文件
  77.         borrowRecordDAO.saveBorrowRecords(records)
  78.         true
  79.       case None => false
  80.     }
  81.   }
  82.   // 添加图书
  83.   def addBook(book: BookModel): Unit = {
  84.     // 1. 生成一个book ID
  85.     // 查询所有图书. 找到最大的ID,+1
  86.     var id = 1
  87.     val books = bookDAO.loadBooks()
  88.     if(books.nonEmpty){
  89.       id = books.map(_.id).max + 1
  90.     }
  91.     // 2. 更新ID
  92.     val newBook = book.copy(id = id)
  93.     // 3. 把新的图书添加到books
  94.     books += newBook
  95.     // 4.写回到.txt中
  96.     bookDAO.saveBooks(books)
  97.   }
  98. }
复制代码
  1. package org.app
  2. package service
  3. import dao.UserDAO
  4. import org.app.models.UserModel
  5. class UserService {
  6.   private val userDAO = new UserDAO()
  7.   //身份校验
  8.   def authenticateUser(username: String, password: String): Option[UserModel] = {
  9.     //去根据用户名和密码查询,是否有符合要求的用户
  10.     val users = userDAO.loadUsers()
  11.     users.find(user => user.username == username && user.password == password)
  12.   }
  13.   // 添加用户
  14.   def addUser(username: String): Boolean = {
  15.     // 1.检查用户名是否已经存在
  16.     val users = userDAO.loadUsers()
  17.     val user = users.find(_.username == username)
  18.     if (user.isEmpty) {
  19.       // 可以继续添加
  20.       // 2.添加
  21.       // 2.1读出所有的用户
  22.       // 2.2添加新的用户.设置用户密码:123.类型:普通用户
  23.       users += UserModel(username, "123", "普通用户")
  24.       // 2.3保存到文件中
  25.       userDAO.saveUsers(users)
  26.       true
  27.     }else{
  28.       false
  29.     }
  30.   }
  31. }
复制代码
  1. package org.app
  2. package ui
  3. import org.app.models.{BookModel, UserModel}
  4. import org.app.service.{BookService, UserService}
  5. import scala.io.StdIn
  6. import scala.io.StdIn.readLine
  7. class LibrarayPresentation {
  8.   private val BookService = new BookService()
  9.   private val UserService = new UserService()
  10.   // 辅助方法. 输入图书的信息. 返回一个BookModel对象
  11.   private def inputBookInfo(): BookModel = {
  12.     println("请输入图书名称:")
  13.     val name = readLine().trim
  14.     println("请输入图书作者:")
  15.     val author = readLine().trim
  16.     println("请输入图书是否可以外借(true/false):")
  17.     val available = StdIn.readBoolean()
  18.     // 初始设置编号为0
  19.     BookModel(0, name, author, available)
  20.   }
  21.   //显示游客的菜单
  22.   def showVisitorMenu(): Unit = {
  23.     var running = true
  24.     while (running) {
  25.       println("欢迎来到我的图书管理系统,请选择")
  26.       println("1.查看所有图书")
  27.       println("2.查询图书")
  28.       println("3.登录")
  29.       println("4.离开")
  30.       //获取用户的操作
  31.       val choice = StdIn.readLine().trim
  32.       choice match {
  33.         case "1" =>
  34.           println("查看所有图书")
  35.           // TODO 查看所有图书
  36.           //调用业务逻辑层的方法
  37.           val results = BookService.searchBooks("")
  38.           if (results.nonEmpty) {
  39.             results.foreach(println)
  40.           } else {
  41.             println("没有找到图书")
  42.           }
  43.         case "2" => println("查询图书")
  44.           //提示用户输入查询关键字
  45.           val query = readLine("请输入查询关键字(书名,作者):").trim
  46.           //根据关键字去查询图书列表,找到满足条件的书
  47.           val results = BookService.searchBooks(query)
  48.           //显示出来
  49.           if (results.nonEmpty) {
  50.             println("======查询图书的结果:======")
  51.             results.foreach(println)
  52.           } else {
  53.             println("没有找到图书")
  54.           }
  55.         case "3" =>
  56.           println("请输入用户名:")
  57.           val username = StdIn.readLine().trim
  58.           println("请输入密码:")
  59.           val password = StdIn.readLine().trim
  60.           //调用Service的方法,进行登录
  61.           val userOpt = UserService.authenticateUser(username, password)
  62.           if (userOpt.isEmpty) {
  63.             println("用户名或密码错误")
  64.           } else {
  65.             println("登录成功")
  66.             //登录成功,显示登录用户的菜单
  67.             val user = userOpt.get
  68.             user.role match {
  69.               case "管理员" => showAdminMenu(user)
  70.               case "普通用户" => showUserMenu(user)
  71.             }
  72.           }
  73.         case "4" =>
  74.           running = false
  75.           println("感谢您的使用,下次再见")
  76.         case _ => println("无效的选择")
  77.       }
  78.     }
  79.   }
  80.   //显示管理员的菜单
  81.   def showAdminMenu(user: UserModel): Unit = {
  82.     var running = true
  83.     while (running) {
  84.       println(s"欢迎管理员:${user.username},来到我的图书管理系统,请选择")
  85.       println("1.添加图书")
  86.       println("2.查询图书")
  87.       println("3.添加用户")
  88.       println("4.退出")
  89.       //获取用户的操作
  90.       val choice = StdIn.readLine().trim
  91.       choice match {
  92.         case "1" =>
  93.           // 1.获取图书信息-书名.作者.状态
  94.           val book = inputBookInfo()
  95.           println(book)
  96.           // 2.调用service层的方法. 做添加到books.txt中操作
  97.           BookService.addBook(book)
  98.           println(s"图书《${book.name}》添加成功")
  99.         case "2" => println("2.查询图书")
  100.         case "3" =>
  101.         // 1.获取用户信息-用户名
  102.         val username = StdIn.readLine("请输入用户名:")
  103.           // 2.调用service层的方法. 做添加到users.txt中操作
  104.           if(UserService.addUser(username)){
  105.             println("用户添加成功")
  106.           }else{
  107.             println("用户添加失败")
  108.           }
  109.         case "4" => running = false
  110.         case _ => println("无效的选择")
  111.       }
  112.     }
  113.   }
  114.   //显示登录用户的菜单
  115.   def showUserMenu(user: UserModel): Unit = {
  116.     var running = true
  117.     while (running) {
  118.       println(s"欢迎用户:${user.username},来到我的图书管理系统,请选择")
  119.       println("1.借阅图书")
  120.       println("2.查询借阅记录")
  121.       println("3.还书")
  122.       println("4.退出")
  123.       //获取用户的操作
  124.       val choice = StdIn.readLine().trim
  125.       choice match {
  126.         case "1" =>
  127.           //UI:提示用户输入图书的ID. 校验:判断是不是整数
  128.           try {
  129.             val id = readLine("请输入图书的ID:").toInt
  130.             BookService.borrowBook(user.username, id)
  131.           } catch {
  132.             case e: Exception =>
  133.               println(e)
  134.               println("输入的图书ID无效")
  135.           }
  136.         case "2" =>
  137.           // 在BookService中实现根据用户名去查询借阅图书的方法
  138.           val borrowRecords = BookService.queryBorrowedBooks(user.username)
  139.           // 判断是否为空
  140.           if (borrowRecords.isEmpty) {
  141.             println("没有借阅记录")
  142.           } else {
  143.             //遍历借阅记录
  144.             println("查询结果.一共借了?本.换了?本.?本未归还")
  145.             for (record <- borrowRecords) {
  146.               val returnDate = record.returnDate.getOrElse("未归还")
  147.               println(s"书名:${record.bookName} 借阅日期:${record.borrowDate} 归还日期:$returnDate")
  148.             }
  149.           }
  150.         case "3" =>
  151.           try {
  152.             val id = readLine("请输入要归还的图书ID:").toInt
  153.             if (BookService.returnBook(user.username, id)) {
  154.               println("归还图书成功")
  155.             } else {
  156.               println("归还图书失败")
  157.             }
  158.           } catch {
  159.             case e: Exception =>
  160.               println(e)
  161.               println("输入的图书ID无效")
  162.           }
  163.         case "4" => running = false
  164.         case _ => println("无效的选择")
  165.       }
  166.     }
  167.   }
  168.   def showMenu(): Unit = {
  169.     showVisitorMenu()
  170.   }
  171. }
复制代码
演示

 结果如下:

 

 


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张裕

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表