本項目是一個基于Scala語言開發的圖書館管理系統。系統主要由以下幾個部分組成:數據訪問層(DAO)、數據模型層(Models)、服務層(Service)以及用戶界面層(UI)。以下是對項目中各個文件和文件夾的詳細解釋。
項目目錄結構
scala_tushu2/
│
├── .idea/ # IntelliJ IDEA的項目配置文件夾
├── out/ # 編譯輸出文件夾
├── src/ # 源代碼文件夾
│ ├── dao/ # 數據訪問層
│ ├── models/ # 數據模型層
│ ├── service/ # 服務層
│ └── ui/ # 用戶界面層
├── scripts/ # 腳本文件夾
├── scala_tushu2.iml # IntelliJ IDEA的模塊文件
├── books.txt # 圖書信息文件
├── borrow_records.txt # 借閱記錄文件
└── users.txt # 用戶信息文件
詳細文件解釋
1. 數據訪問層(DAO)
文件:BookDAO.scala
-
負責圖書信息的增刪改查操作。
-
提供與數據庫交互的方法,如添加新書、刪除書籍、更新書籍信息和查詢書籍。
package app.org package daoimport models.BookModelimport java.io.File 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(",")// 實例化一本書,保存到List中books += BookModel(id.toInt, name, author, available.toBoolean)}// 關閉連接source.close()books}// 保存圖書,將圖書寫入文件def saveBooks(books: ListBuffer[BookModel]): Unit = {val writer = new java.io.PrintWriter(new File("books.txt"))for (book <- books) {writer.println(book.id + "," + book.name + "," + book.author + "," + book.available)}writer.close()} }
文件:BorrowRecordDAO.scala
-
負責借閱記錄的增刪改查操作。
-
提供與數據庫交互的方法,如添加借閱記錄、刪除記錄、更新記錄和查詢記錄。
-
package app.org package daoimport models.BorrowRecordModelimport java.io.PrintWriter import scala.collection.mutable.ListBuffer import scala.io.Sourceclass BorrowRecordDAO {// 讀出借閱記錄def loadBorrowRecord(): 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)}borrowRecords}// 寫入借閱記錄def saveBorrowRecord(records: ListBuffer[BorrowRecordModel]): Unit = {val writer = new PrintWriter("borrow_records.txt")for (record <- records) {writer.println(record.userName + "," + record.bookID + "," + record.bookName + "," + record.borrowDate + "," + record.returnDate.getOrElse(""))}writer.close()} }
文件:UserDAO.scala
-
負責用戶信息的增刪改查操作。
-
提供與數據庫交互的方法,如添加新用戶、刪除用戶、更新用戶信息和查詢用戶信息。
-
package app.org package daoimport models.UserModelimport java.io.File import scala.collection.mutable.ListBufferclass 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(",")// 實例化一用戶,保存到List中users += UserModel(username,password,role)}// 關閉連接source.close()users}//保存用戶// 保存圖書,將圖書寫入文件def saveUsers(users: ListBuffer[UserModel]): Unit = {val writer = new java.io.PrintWriter(new File("users.txt"))for (user <- users) {writer.println(user.username + "," + user.password + "," + user.role)}writer.close()} }
2. 數據模型層(Models)
文件:BookModel.scala
-
定義圖書的數據模型。
-
包含圖書的屬性,如ID、書名、作者、是否可借等。
-
package app.org package models// 圖書類 // id,書名,作者,狀態 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 \t 這本書——$availableStr"} }
文件:BorrowRecordModel.scala
-
定義借閱記錄的數據模型。
-
包含借閱記錄的屬性,如用戶ID、書籍ID、借閱時間、歸還時間等。
-
package app.org package modelscase class BorrowRecordModel(userName:String, // 借書人bookID:Int, // 圖書IDbookName:String, // 書名borrowDate:String, // 借閱日期var returnDate:Option[String] =None // 歸還日期)
文件:UserModel.scala
-
定義用戶的數據模型。
-
包含用戶的屬性,如ID、用戶名、密碼、用戶類型(管理員或普通用戶)等。
-
package app.org package modelscase class UserModel(username:String,password:String,role:String)
3. 服務層(Service)
文件:BookService.scala
-
提供圖書相關的業務邏輯。
-
調用DAO層的方法,實現圖書的增刪改查等業務操作。
-
package app.org package serviceimport models.{BookModel, BorrowRecordModel} import 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.loadBorrowRecord()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)// 寫回txt文件中borrowRecordDAO.saveBorrowRecord(records)println("借閱成功,已保存借閱記錄!!!")true} else {println("這本書已經被借走了!!!")false}} else {false}}// 普通用戶,查詢自己的借閱記錄def queryBorrowRecords(username: String):ListBuffer[BorrowRecordModel] = {// 讀出全部的借閱記錄val records = borrowRecordDAO.loadBorrowRecord()// 過濾出當前用戶的借閱記錄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).getb.available = true// 2.3 把更新之后的狀態寫回txt文件中bookDAO.saveBooks(books)// 3.更新借閱記錄的狀態// 3.1 加載全部的借閱記錄val records = borrowRecordDAO.loadBorrowRecord()// 3.2 找到當前這本書的借閱記錄val r = records.find(r => r.bookID == bookId && r.userName ==username && r.returnDate.isEmpty).getr.returnDate = Some(LocalDateTime.now().toString)// 3.3 把更新之后的狀態寫回txt文件中borrowRecordDAO.saveBorrowRecord(records)truecase None => false}}// 添加圖書def addBook(book: BookModel): Unit = {// 1. 生成一個book ID// 查詢所有的圖書,找到最大的ID,+1var id = 1val books = bookDAO.loadBooks()if (books.nonEmpty) {id = books.map(_.id).max + 1}// 2. 更新val newBook = book.copy(id = id)// 3. 把新的圖書添加到books.txt中books += newBook// 4. 把更新之后的狀態寫回txt文件中bookDAO.saveBooks(books)}private def queryBooks(): ListBuffer[BookModel] = {// 1. 加載全部的圖書val books = bookDAO.loadBooks()// 2. 返回books}}
文件:UserService.scala
-
提供用戶相關的業務邏輯。
-
調用DAO層的方法,實現用戶的增刪改查等業務操作。
-
package app.org package serviceimport dao.UserDAOimport models.UserModelclass 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 addUser(username: String): Boolean = {// 1. 查詢用戶名是否已經存在val users = userDAO.loadUsers()val user =users.find( _.username == username)if (user.isEmpty) {// 可以繼續添加// 2.添加// 2.1 讀取所有的用戶// 2.2 創建新的用戶users += UserModel(username, "[\\d]", "普通用戶")// 2.3 保存用戶userDAO.saveUsers(users)true} else {false}} }
4. 用戶界面層(UI)
文件:LPT.scala
-
提供用戶界面的實現。
-
負責與用戶的交互,如顯示圖書列表、顯示借閱記錄、用戶登錄等。
-
package app.org package uiimport models.{BookModel, UserModel} import service.{BookService, UserService}import scala.io.StdIn import scala.io.StdIn.readLineclass LPT {private val BookService = new BookService()private val UserService = new UserService()// 輔助方法: 輸入圖書的信息,返回一個BookModel對象private def inputBookInfo(): BookModel = {println("請輸入圖書的名稱:")val name = readLine().trimprintln("請輸入圖書的作者:")val author = readLine().trimprintln("請輸入圖書是否可以外借(true/false):")val available = StdIn.readBoolean()// 初始設置編號為0BookModel(0,name, author, available)}// 顯示游客的菜單def showVisitorMenu(): Unit = {var running = truewhile (running) {println("歡迎來到我的圖書管理系統,請選擇:")println("1. 查看所有圖書")println("2. 查詢圖書")println("3. 登錄")println("4. 退出")// 獲取用戶操作val choice = StdIn.readLine().trimchoice 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().trimprintln("請輸入密碼:")val password = StdIn.readLine().trim// 調用service的方法,進行登錄val userOPT =UserService.authenticateUser(username, password)if (userOPT.isEmpty) {println("用戶名或密碼錯誤")} else {// 登錄成功,顯示登錄用戶的菜單val user = userOPT.getuser.role match {case "管理員" => showAdminMenu(user)case "普通用戶" => showUserMenu(user)}}case "4" =>running = falseprintln("感謝你的使用,下次再見")case _ => println("無效的選擇,請重新輸入")}}}// 顯示管理員的菜單def showAdminMenu(user: UserModel): Unit = {var running = truewhile (running) {println(s"歡迎管理員${user.username}來到我的圖書管理系統,請選擇:")println("1. 添加圖書")println("2. 查詢圖書")println("3. 添加用戶")println("4. 退出")// 獲取用戶的操作val choice = StdIn.readLine().trimchoice match {case "1" =>// 1.獲取圖書信息-書名,作者,狀態val book = inputBookInfo()// 2. 調用service的方法,做添加到books.txt中操作BookService.addBook(book)println(s"圖書《${book.name}》添加成功")case "2" =>// 提示用戶輸入查詢關鍵字println("請輸入查詢關鍵字:")val query = readLine().trimval results = BookService.searchBooks(query)if (results.nonEmpty) {println("=================查詢圖書的結果====================")results.foreach(println)println("=================以上是查詢圖書的結果!!!!====================")println()} else {println("沒有找到圖書")}case "3" =>// 1.獲取用戶信息-用戶名,密碼,角色val username = StdIn.readLine("請輸入用戶名:")// 2. 調用service的方法,做添加到users.txt中操作if (UserService.addUser(username)) {println(s"用戶${username}添加成功")} else {println("用戶添加失敗")}case "4" => running = falsecase _ => println("無效的選擇,請重新輸入")}}}// 顯示登錄用戶的菜單def showUserMenu(user: UserModel): Unit = {var running = truewhile (running) {println(s"歡迎用戶${user.username}來到我的圖書管理系統,請選擇:")println("1. 借閱圖書")println("2. 查詢借閱圖書")println("3. 還書")println("4. 退出")// 獲取用戶的操作val choice = StdIn.readLine().trimchoice match {case "1" =>// UI : 提示用戶輸入圖書ID。校驗:判斷是否整數try {val id = readLine("請輸入圖書的ID:").toIntprintln(id)BookService.borrowBook(user.username,id)} catch {case e: Exception =>println(e)println("輸入的圖書ID無效,請重新輸入:")}case "2" => println("查詢圖書")val borrowRecords = BookService.queryBorrowRecords(user.username)//if (borrowRecords.isEmpty) {println("您還沒有借閱過任何圖書!!!")} else {// 打印借閱記錄println("查詢結果,一共借了?本,?本已歸還,?本未歸還")for (record <- borrowRecords) {val returnDate = record.returnDate.getOrElse("未歸還")println(s"用戶名:${record.userName},圖書ID:${record.bookID},圖書名稱:${record.bookName},借閱日期:${record.borrowDate},歸還日期:$returnDate")}}case "3" => println("還書")try {val id = readLine("請輸入要歸還的圖書的ID:").toIntif(BookService.returnBook(user.username, id)) {println("歸還圖書成功!!!")} else {println("歸還圖書失敗,請檢查輸入的圖書ID是否正確")}} catch {case e: Exception =>println(e)println("輸入的圖書ID無效,請重新輸入")}case "4" => running = falsecase _ => println("無效的選擇,請重新輸入")}}}def showMenu(): Unit = {showVisitorMenu()} }
文件:Main.scala
Main.scala
文件是Scala應用程序的入口點,它通常包含 main
函數,該函數是程序執行的起始點。在這個圖書館管理系統中,Main.scala
可能承擔以下職責:
-
初始化系統:設置系統運行所需的環境,例如初始化數據庫連接、加載配置文件等。
-
啟動服務:啟動系統中的服務層,例如圖書服務、用戶服務等,這些服務可能負責處理業務邏輯。
-
用戶界面啟動:啟動用戶界面層,例如命令行界面或圖形用戶界面,允許用戶與系統交互。
-
運行主循環:對于需要持續運行的系統,
Main.scala
可能包含一個主循環,用于不斷監聽用戶輸入或處理后臺任務。 -
錯誤處理:設置全局錯誤處理機制,確保系統在遇到錯誤時能夠優雅地處理并給出用戶友好的反饋。
package app.orgimport ui.LPTobject Main {def main(args: Array[String]): Unit = {val m = new LPT()m.showMenu()} }
5. 其他文件
文件:books.txt
-
存儲圖書信息的文本文件。
-
每行包含圖書的ID、書名、作者和是否可借的信息。
文件:borrow_records.txt
-
存儲借閱記錄的文本文件。
-
每行包含用戶ID、圖書ID、借閱時間和歸還時間的信息。
文件:users.txt
-
存儲用戶信息的文本文件。
-
每行包含用戶的用戶名、密碼和用戶類型(管理員或普通用戶)的信息。
總結
本項目通過分層架構實現了一個圖書館管理系統,各層之間職責明確,便于維護和擴展。數據訪問層負責與數據庫的交互,數據模型層定義了系統中使用的數據結構,服務層實現了具體的業務邏輯,用戶界面層負責與用戶的交互。通過這種方式,系統具有良好的可讀性和可維護性。
?# # #本項目并不是完美的項目, 嗨有缺少的功能自行添加!!!!!!!!!!!!