图书馆系统源码详解

本项目是一个基于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
  • 负责图书信息的增删改查操作。

  1. 提供与数据库交互的方法,如添加新书、删除书籍、更新书籍信息和查询书籍。

    package app.org
    package dao
    
    import models.BookModel
    
    import 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 dao
    
    import models.BorrowRecordModel
    
    import java.io.PrintWriter
    import scala.collection.mutable.ListBuffer
    import scala.io.Source
    
    class 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 dao
    
    import models.UserModel
    
    import java.io.File
    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(",")
          // 实例化一用户,保存到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 models
    
    case class BorrowRecordModel(
                                userName:String,               // 借书人
                                bookID:Int,                  // 图书ID
                                bookName:String,           // 书名
                                borrowDate:String,          // 借阅日期
                                var returnDate:Option[String] =None   // 归还日期
                                )
    

文件:UserModel.scala
  • 定义用户的数据模型。

  • 包含用户的属性,如ID、用户名、密码、用户类型(管理员或普通用户)等。

  • package app.org
    package models
    
    case class UserModel(
                        username:String,
                        password:String,
                        role:String
                        )
    

3. 服务层(Service)

文件:BookService.scala
  • 提供图书相关的业务逻辑。

  • 调用DAO层的方法,实现图书的增删改查等业务操作。

  • package app.org
    package service
    
    import 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).get
            b.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).get
            r.returnDate = Some(LocalDateTime.now().toString)
            // 3.3 把更新之后的状态写回txt文件中
            borrowRecordDAO.saveBorrowRecord(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. 更新
        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 service
    
    import dao.UserDAO
    
    import 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 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 ui
    
    import models.{BookModel, UserModel}
    import service.{BookService, UserService}
    
    import scala.io.StdIn
    import scala.io.StdIn.readLine
    
    class LPT {
    
      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("请输入图书是否可以外借(true/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 {
                // 登录成功,显示登录用户的菜单
                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()
              // 2. 调用service的方法,做添加到books.txt中操作
              BookService.addBook(book)
              println(s"图书《${book.name}》添加成功")
            case "2" =>
              // 提示用户输入查询关键字
              println("请输入查询关键字:")
              val query = readLine().trim
              val 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 = 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
                println(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:").toInt
                if(BookService.returnBook(user.username, id)) {
                  println("归还图书成功!!!")
                } else {
                  println("归还图书失败,请检查输入的图书ID是否正确")
                }
              } catch {
                case e: Exception =>
                  println(e)
                  println("输入的图书ID无效,请重新输入")
              }
            case "4" => running = false
            case _ => println("无效的选择,请重新输入")
          }
        }
      }
    
      def showMenu(): Unit = {
        showVisitorMenu()
      }
    }
    

文件:Main.scala

Main.scala 文件是Scala应用程序的入口点,它通常包含 main 函数,该函数是程序执行的起始点。在这个图书馆管理系统中,Main.scala 可能承担以下职责:

  1. 初始化系统:设置系统运行所需的环境,例如初始化数据库连接、加载配置文件等。

  2. 启动服务:启动系统中的服务层,例如图书服务、用户服务等,这些服务可能负责处理业务逻辑。

  3. 用户界面启动:启动用户界面层,例如命令行界面或图形用户界面,允许用户与系统交互。

  4. 运行主循环:对于需要持续运行的系统,Main.scala 可能包含一个主循环,用于不断监听用户输入或处理后台任务。

  5. 错误处理:设置全局错误处理机制,确保系统在遇到错误时能够优雅地处理并给出用户友好的反馈。

    package app.org
    
    import ui.LPT
    
    
    
    object Main {
      def main(args: Array[String]): Unit = {
        val m = new LPT()
        m.showMenu()
      }
    }
    

5. 其他文件

文件:books.txt
  • 存储图书信息的文本文件。

  • 每行包含图书的ID、书名、作者和是否可借的信息。

文件:borrow_records.txt
  • 存储借阅记录的文本文件。

  • 每行包含用户ID、图书ID、借阅时间和归还时间的信息。

文件:users.txt
  • 存储用户信息的文本文件。

  • 每行包含用户的用户名、密码和用户类型(管理员或普通用户)的信息。

总结

本项目通过分层架构实现了一个图书馆管理系统,各层之间职责明确,便于维护和扩展。数据访问层负责与数据库的交互,数据模型层定义了系统中使用的数据结构,服务层实现了具体的业务逻辑,用户界面层负责与用户的交互。通过这种方式,系统具有良好的可读性和可维护性。

 # # #本项目并不是完美的项目, 嗨有缺少的功能自行添加!!!!!!!!!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/975539.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NIO-Reactor模型梳理与demo实现

关于NIO&#xff0c;我们在上一篇 linux下网络编程socket&select&epoll的底层实现原理 就介绍了网络阻塞IO、以及基于事件驱动的非阻塞IO。对于NIO的API基本使用是java提供的接口&#xff0c;然后我们在业务上对NIO的使用&#xff0c;也是有不同的使用方法的。然后在我…

数据结构与算法-搜索-双向搜索 和 A*算法(字串变换,八数码,第k短路)

双向搜索&#xff1a; 双向搜索是一种优化的搜索策略&#xff0c;常用于在状态空间中寻找从起始点到目标点的路径或满足特定条件的状态 基本概念 双向搜索指的是从起始点和目标点同时出发进行搜索的方法。传统的单向搜索&#xff0c;如深度优先搜索&#xff08;DFS&#xff09…

Java实现斗地主-做牌以及对牌排序

卡牌类 public class Card {private String size;//大小private String color;//花色private int value;//权值public Card() {}public Card(String size, String color, int value) {this.size size;this.color color;this.value value;}public String toString(){return …

Tesla T4 显卡 Linux 64-bit Ubuntu 24.04 驱动和cuda系统支持版本

搜索结果 | <dd~ProductName> | <dd~OSName> | NVIDIA 操作系统和硬件平台&#xff1a;页面展示的是适用于Linux 64位操作系统&#xff0c;版本为Ubuntu 24.04&#xff0c;并且专门为Tesla T4等NVIDIA数据中心GPU提供驱动程序。 驱动版本&#xff1a;页面列出了不…

申请SSL证书,如何完成域名验证

一、前言 给大家分享一下Lets Encrypt 证书申请时&#xff0c;如何完成域名验证这一步操作的方法。 二、为什么要进行域名验证 申请SSL证书时进行域名验证的主要原因是确保证书只颁发给有权控制特定域名的实体。这是为了保证互联网的安全性和信任&#xff0c;防止恶意方获取不…

Innovus中快速获取timing path逻辑深度的golden脚本

在实际项目中我们经常会遇到一条timing path级数特别多&#xff0c;可能是一两页都翻不完。此时&#xff0c;我们大都需要手工去数这条path上到底有哪些是设计本身的逻辑&#xff0c;哪些是PR工具插入的buffer和inverter。 数字IC后端手把手培训教程 | Clock Gating相关clock …

MySQL | MySQL库、表的基本操作01

MySQL库、表的基本操作01 一、库操作1.1 查看数据库1.2 创建数据库1.3 选择数据库1.4 查看创建数据库的SQL语句1.5 修改数据库1.6 删除数据库 二、表操作2.1 创建数据表2.2 查看表2.3 查看表结构2.4 查看创建数据库的SQL语句2.5 修改表2.6 删除表 ⚠️MySQL版本 8.0 一、库操作…

Cocos Creator Shader入门实战(一):材质和Effect的了解

引擎版本&#xff1a;3.8.5 环境&#xff1a; Windows 简介 在Cocos Creator中&#xff0c;游戏炫彩缤纷的效果是借助着色器(Shader)来实现的。 Cocos主要基于OpenGL ES&#xff0c;而Shader的编写则是在可编程渲染管线中基于修改&#xff1a;顶点着色器(Vertex) 和 片段着色…

【2025深度学习环境搭建-1】在Win11上用WSL2和Docker解锁GPU加速

建议有&#xff1a; 较新的win11电脑&#xff0c;GPU是nvidia一点点Linux基础一点点Docker基础 一、安装WSL2 【控制面板】》【程序】》【启用或关闭Windows功能】 打开三个功能&#xff1a;【Hyper-V】【Virtual Machine Platform】【适用于Linux的Windows子系统】 可能看…

每天五分钟深度学习pytorch:使用Inception模块搭建GoogLeNet模型

本文重点 前面我们学习了Incetption模块,它的作用类似于vgg块对于VGG网络模型一样,本文我们使用Inception搭建GoogLeNet网络,如果使用卷积层开始从头开始搭建GoogleNet,那么这样看起来会很不清晰,我们使用已经封装好的Inception来搭建GoogLeNet网络 关键点 关键点在于I…

Open WebUI 是什么

Open WebUI 是什么 Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台,旨在完全离线运行。它支持各种 LLM 运行器,如 Ollama 和 OpenAI 兼容的 API,并内置了 RAG 推理引擎,使其成为强大的 AI 部署解决方案。 https://github.com/open-webui/open-webui 🚀 …

ssh与服务器

目录 前言&#xff1a; 一、密码连接 二、密钥对连接 1.将公钥放在服务器 2.ssh连接 三、禁用密码 1.进入服务器/etc/ssh文件夹 2.打开sshd_config文件&#xff0c;进行如下配置 3.有可能还需要更改其他文件夹 4.重启ssh服务 四、config 五.ssh与github 1.本地创建…

图像处理篇---图像处理中常见参数

文章目录 前言一、分贝&#xff08;dB&#xff09;的原理1.公式 二、峰值信噪比&#xff08;PSNR, Peak Signal-to-Noise Ratio&#xff09;1.用途2.公式3.示例 三、信噪比&#xff08;SNR, Signal-to-Noise Ratio&#xff09;1.用途2.公式3.示例 四、动态范围&#xff08;Dyna…

剖析IO原理和零拷贝机制

目录 1 Linux的五种IO模型1.1 模型调用的函数1.1.1 recv函数1.1.2 select函数1.1.3 poll函数1.1.4 epoll函数1.1.5 sigaction函数 1.2 IO模型1.2.1 阻塞IO模型1.2.2 非阻塞IO模型1.2.3 IO复用模型1.2.4 信号驱动IO模型1.2.5 异步IO模型1.2.6 IO模型比较 2 Java的BIO、NIO、AIO2…

DeepSeek 助力 Vue 开发:打造丝滑的滑块(Slider)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

vivado 在ip引出来emio 没有显示

原因是IP核 block design 里面需要ctrs 保存了 再generate output

C进阶 自定义类型

目录 前言 一 结构体 二 结构体的存储 三 位段 四 枚举 五 联合体 总结 前言 我们之前学习的int char double ......都是内置类型&#xff0c;但是我们今天所学习的是自定义类型&#xff0c;比如联合体&#xff0c;结构体&#xff0c;枚举 一 结构体 结构体是一…

四、综合案例(Unity2D)

一、2D渲染 1、2D相机基本设置 上面是透视&#xff0c;下面是正交 2、图片资源 在Unity中&#xff0c;常规图片导入之后&#xff0c;一般不在Unity中直接使用&#xff0c;而是转为精灵图Sprite 将图片更改为即可使用Unity内置的图片切割功能 无论精灵图片是单个的还是多个的…

使用大语言模型对接OA系统,实现会议室预定功能

随着人工智能技术的不断进步&#xff0c;越来越多的企业开始借助 AI 助手来提高工作效率&#xff0c;尤其是在日常事务的自动化处理中。比如&#xff0c;在许多公司里&#xff0c;会议室的预定是一个常见且频繁的需求&#xff0c;通常需要员工手动检查空闲时间并做出选择。而通…

游戏引擎学习第113天

仓库:https://gitee.com/mrxiao_com/2d_game_2 黑板&#xff1a;优化的基本过程 在游戏编程中&#xff0c;优化是一个非常重要的学习内容&#xff0c;尤其是想要成为专业开发者时。优化的核心是理解代码的执行速度&#xff0c;以及如何提升其性能。在这个阶段&#xff0c;已经…