如何构建一个高效安全的图书管理系统

文章目录

        • 技术栈
        • 功能需求
        • 实现步骤
          • 1. 准备开发环境
          • 2. 创建项目结构
          • 3. 配置数据库
          • 4. 创建实体类
          • 5. 创建仓库接口
          • 6. 创建服务类
          • 7. 创建控制器
          • 8. 创建前端页面
          • 9. 运行项目

技术栈
  • 前端:HTML5、CSS3、JavaScript
  • 后端:Java(Spring Boot框架)
  • 数据库:SQLite(或 MySQL、PostgreSQL 等)
功能需求
  1. 用户管理

    • 用户注册与登录
    • 用户信息管理
  2. 图书管理

    • 添加、删除和修改书籍信息
    • 图书搜索功能
  3. 借阅管理

    • 借阅和归还书籍
    • 查看借阅记录
  4. 系统设置

    • 参数配置(如借阅期限、最大借阅数量)
实现步骤
1. 准备开发环境

确保你的开发环境中安装了 JDK 和 IDE(如 IntelliJ IDEA 或 Eclipse)。然后,创建一个新的 Spring Boot 项目。

你可以使用 Spring Initializr 来快速创建项目:

  • 访问 Spring Initializr
  • 选择 Maven 项目,Java 语言,Spring Boot 版本(例如 2.7.x)
  • 添加依赖:Spring Web, Thymeleaf, Spring Data JPA, SQLite JDBC
  • 下载并解压项目
2. 创建项目结构

创建项目的文件结构如下:

library-management-system/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── example/
│   │   │           └── librarymanagement/
│   │   │               ├── controller/
│   │   │               ├── model/
│   │   │               ├── repository/
│   │   │               ├── service/
│   │   │               └── LibraryManagementApplication.java
│   │   └── resources/
│   │       ├── static/
│   │       ├── templates/
│   │       └── application.properties
└── pom.xml
3. 配置数据库

编辑 src/main/resources/application.properties 文件,配置 SQLite 数据库连接。

spring.datasource.url=jdbc:sqlite:./library.db
spring.datasource.driver-class-name=org.sqlite.JDBC
spring.jpa.database-platform=org.hibernate.dialect.SQLiteDialect
spring.jpa.hibernate.ddl-auto=update
4. 创建实体类

model 包下创建实体类。

// User.java
package com.example.librarymanagement.model;import javax.persistence.*;
import java.util.Set;@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String username;private String password;private String email;@OneToMany(mappedBy = "user")private Set<Borrow> borrows;// Getters and Setters
}// Book.java
package com.example.librarymanagement.model;import javax.persistence.*;
import java.util.Set;@Entity
public class Book {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String isbn;private String title;private String author;private String publisher;private String publicationDate;private String category;private int stock;@OneToMany(mappedBy = "book")private Set<Borrow> borrows;// Getters and Setters
}// Borrow.java
package com.example.librarymanagement.model;import javax.persistence.*;@Entity
public class Borrow {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@ManyToOne@JoinColumn(name = "user_id")private User user;@ManyToOne@JoinColumn(name = "book_id")private Book book;private String borrowDate;private String returnDate;// Getters and Setters
}
5. 创建仓库接口

repository 包下创建仓库接口。

// UserRepository.java
package com.example.librarymanagement.repository;import com.example.librarymanagement.model.User;
import org.springframework.data.jpa.repository.JpaRepository;public interface UserRepository extends JpaRepository<User, Long> {
}// BookRepository.java
package com.example.librarymanagement.repository;import com.example.librarymanagement.model.Book;
import org.springframework.data.jpa.repository.JpaRepository;public interface BookRepository extends JpaRepository<Book, Long> {
}// BorrowRepository.java
package com.example.librarymanagement.repository;import com.example.librarymanagement.model.Borrow;
import org.springframework.data.jpa.repository.JpaRepository;public interface BorrowRepository extends JpaRepository<Borrow, Long> {
}
6. 创建服务类

service 包下创建服务类。

// UserService.java
package com.example.librarymanagement.service;import com.example.librarymanagement.model.User;
import com.example.librarymanagement.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public List<User> getAllUsers() {return userRepository.findAll();}public User getUserById(Long id) {return userRepository.findById(id).orElse(null);}public User createUser(User user) {return userRepository.save(user);}public User updateUser(Long id, User userDetails) {User user = userRepository.findById(id).orElse(null);if (user != null) {user.setUsername(userDetails.getUsername());user.setPassword(userDetails.getPassword());user.setEmail(userDetails.getEmail());return userRepository.save(user);}return null;}public void deleteUser(Long id) {userRepository.deleteById(id);}
}// BookService.java
package com.example.librarymanagement.service;import com.example.librarymanagement.model.Book;
import com.example.librarymanagement.repository.BookRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class BookService {@Autowiredprivate BookRepository bookRepository;public List<Book> getAllBooks() {return bookRepository.findAll();}public Book getBookById(Long id) {return bookRepository.findById(id).orElse(null);}public Book createBook(Book book) {return bookRepository.save(book);}public Book updateBook(Long id, Book bookDetails) {Book book = bookRepository.findById(id).orElse(null);if (book != null) {book.setIsbn(bookDetails.getIsbn());book.setTitle(bookDetails.getTitle());book.setAuthor(bookDetails.getAuthor());book.setPublisher(bookDetails.getPublisher());book.setPublicationDate(bookDetails.getPublicationDate());book.setCategory(bookDetails.getCategory());book.setStock(bookDetails.getStock());return bookRepository.save(book);}return null;}public void deleteBook(Long id) {bookRepository.deleteById(id);}
}// BorrowService.java
package com.example.librarymanagement.service;import com.example.librarymanagement.model.Borrow;
import com.example.librarymanagement.repository.BorrowRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class BorrowService {@Autowiredprivate BorrowRepository borrowRepository;public List<Borrow> getAllBorrows() {return borrowRepository.findAll();}public Borrow getBorrowById(Long id) {return borrowRepository.findById(id).orElse(null);}public Borrow createBorrow(Borrow borrow) {return borrowRepository.save(borrow);}public void deleteBorrow(Long id) {borrowRepository.deleteById(id);}
}
7. 创建控制器

controller 包下创建控制器类。

// UserController.java
package com.example.librarymanagement.controller;import com.example.librarymanagement.model.User;
import com.example.librarymanagement.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@GetMappingpublic List<User> getAllUsers() {return userService.getAllUsers();}@GetMapping("/{id}")public User getUserById(@PathVariable Long id) {return userService.getUserById(id);}@PostMappingpublic User createUser(@RequestBody User user) {return userService.createUser(user);}@PutMapping("/{id}")public User updateUser(@PathVariable Long id, @RequestBody User userDetails) {return userService.updateUser(id, userDetails);}@DeleteMapping("/{id}")public void deleteUser(@PathVariable Long id) {userService.deleteUser(id);}
}// BookController.java
package com.example.librarymanagement.controller;import com.example.librarymanagement.model.Book;
import com.example.librarymanagement.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/books")
public class BookController {@Autowiredprivate BookService bookService;@GetMappingpublic List<Book> getAllBooks() {return bookService.getAllBooks();}@GetMapping("/{id}")public Book getBookById(@PathVariable Long id) {return bookService.getBookById(id);}@PostMappingpublic Book createBook(@RequestBody Book book) {return bookService.createBook(book);}@PutMapping("/{id}")public Book updateBook(@PathVariable Long id, @RequestBody Book bookDetails) {return bookService.updateBook(id, bookDetails);}@DeleteMapping("/{id}")public void deleteBook(@PathVariable Long id) {bookService.deleteBook(id);}
}// BorrowController.java
package com.example.librarymanagement.controller;import com.example.librarymanagement.model.Borrow;
import com.example.librarymanagement.service.BorrowService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/borrows")
public class BorrowController {@Autowiredprivate BorrowService borrowService;@GetMappingpublic List<Borrow> getAllBorrows() {return borrowService.getAllBorrows();}@GetMapping("/{id}")public Borrow getBorrowById(@PathVariable Long id) {return borrowService.getBorrowById(id);}@PostMappingpublic Borrow createBorrow(@RequestBody Borrow borrow) {return borrowService.createBorrow(borrow);}@DeleteMapping("/{id}")public void deleteBorrow(@PathVariable Long id) {borrowService.deleteBorrow(id);}
}
8. 创建前端页面

src/main/resources/templates 目录下创建 Thymeleaf 模板文件,用于展示用户界面。

<!-- index.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Library Management System</title><link rel="stylesheet" th:href="@{/css/style.css}">
</head>
<body>
<header><h1>Library Management System</h1><nav><a th:href="@{/users}">Users</a><a th:href="@{/books}">Books</a><a th:href="@{/borrows}">Borrows</a></nav>
</header>
<main><p>Welcome to the Library Management System!</p>
</main>
<footer><p>&copy; 2024 Library Management System</p>
</footer>
</body>
</html>
9. 运行项目

启动项目,访问 http://localhost:8080,即可看到图书管理系统的首页。

mvn spring-boot:run

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

架构03-事务处理

零、文章目录 架构03-事务处理 1、本地事务实现原子性和持久性 &#xff08;1&#xff09;事务类型 **本地事务&#xff1a;**单个服务、单个数据源**全局事务&#xff1a;**单个服务、多个数据源**共享事务&#xff1a;**多个服务、单个数据源**分布式事务&#xff1a;**多…

基于深度学习的手势识别算法

基于深度学习的手势识别算法 概述算法原理核心逻辑效果演示使用方式参考文献 概述 本文基于论文 [Simple Baselines for Human Pose Estimation and Tracking[1]](ECCV 2018 Open Access Repository (thecvf.com)) 实现手部姿态估计。 手部姿态估计是从图像或视频帧集中找到手…

硬件基础22 反馈放大电路

目录 一、反馈的基本概念与分类 1、什么是反馈 2、直流反馈与交流反馈 3、正反馈与负反馈 4、串联反馈与并联反馈 5、电压反馈与电流反馈 二、负反馈四种组态 1、电压串联负反馈放大电路 2、电压并联负反馈放大电路 3、电流串联负反馈放大电路 4、电流并联负反馈放大…

亚马逊开发视频人工智能模型,The Information 报道

根据《The Information》周三的报道&#xff0c;电子商务巨头亚马逊&#xff08;AMZN&#xff09;已开发出一种新的生成式人工智能&#xff08;AI&#xff09;&#xff0c;不仅能处理文本&#xff0c;还能处理图片和视频&#xff0c;从而减少对人工智能初创公司Anthropic的依赖…

Spring Boot教程之十二: Spring – RestTemplate

Spring – RestTemplate 由于流量大和快速访问服务&#xff0c;REST API越来越受欢迎。REST 不是一种协议或标准方式&#xff0c;而是一组架构约束。它也被称为 RESTful API 或 Web API。当发出客户端请求时&#xff0c;它只是通过 HTTP 将资源状态的表示传输给请求者或端点。传…

通过 JNI 实现 Java 与 Rust 的 Channel 消息传递

做纯粹的自己。“你要搞清楚自己人生的剧本——不是父母的续集&#xff0c;不是子女的前传&#xff0c;更不是朋友的外篇。对待生命你不妨再大胆一点&#xff0c;因为你好歹要失去它。如果这世上真有奇迹&#xff0c;那只是努力的另一个名字”。 一、crossbeam_channel 参考 cr…

CSS笔记(一)炉石传说卡牌设计1

目标 我要通过html实现一张炉石传说的卡牌设计 问题 其中必须就要考虑到各个元素的摆放&#xff0c;形状的调整来达到满意的效果。通过这个联系来熟悉一下CSS的基本操作。 1️⃣ 基本概念 在CSS里面有行元素&#xff0c;块元素&#xff0c;内联元素&#xff0c;常见的行元…

GAMES101:现代计算机图形学入门-笔记-09

久违的101图形学回归咯 今天的话题应该是比较轻松的&#xff1a;聊一聊在渲染中比较先进的topics Advanced Light Transport 首先是介绍一系列比较先进的光线传播方法&#xff0c;有无偏的如BDPT&#xff08;双向路径追踪&#xff09;&#xff0c;MLT&#xff08;梅特罗波利斯…

Oracle 数据库 IDENTITY 列

IDENTITY列是Oracle数据库12c推出的新特性。之所以叫IDENTITY列&#xff0c;是由于其支持ANSI SQL 关键字 IDENTITY&#xff0c;其内部实现还是使用SEQUENCE。 不过推出这个新语法也是应该的&#xff0c;毕竟MyQL已经有 AUTO_INCREMENT列&#xff0c;而SQL Server也已经有IDENT…

前端学习笔记之文件下载(1.0)

因为要用到这样一个场景&#xff0c;需要下载系统的使用教程&#xff0c;所以在前端项目中就提供了一个能够下载系统教程的一个按钮&#xff0c;供使用者进行下载。 所以就试着写一下这个功能&#xff0c;以一个demo的形式进行演示&#xff0c;在学习的过程中也发现了中文路径…

【阅读记录-章节4】Build a Large Language Model (From Scratch)

文章目录 4. Implementing a GPT model from scratch to generate text4.1 Coding an LLM architecture4.1.1 配置小型 GPT-2 模型4.1.2 DummyGPTModel代码示例4.1.3 准备输入数据并初始化 GPT 模型4.1.4 初始化并运行 GPT 模型 4.2 Normalizing activations with layer normal…

Python PDF转JPG图片小工具

Python PDF转JPG图片小工具 1.简介 将单个pdf装换成jpg格式图片 Tip: 1、软件窗口默认最前端&#xff0c;不支持调整窗口大小&#xff1b; 2、可通过按钮选择PDF文件&#xff0c;也可以直接拖拽文件到窗口&#xff1b; 3、转换质量有5个档位&#xff0c;&#xff08;0.25&a…

使用SOAtest进行功能回归测试

持续集成是将所有开发人员的工作副本合并到共享的主线上。这个过程使软件开发对开发人员来说更容易访问、更快、风险更小。 阅读这篇文章&#xff0c;让我们了解如何配置Parasoft SOAtest作为持续集成过程的一部分&#xff0c;来执行功能测试和回归测试。我们将介绍如何使用主…

ais_server 学习笔记

ais_server 学习笔记 一前序二、ais init1、时序图如下2. 初始化一共分为以下几个重要步骤&#xff1a;2.1.1、在ais_server中启动main函数&#xff0c;然后创建AisEngine&#xff0c;接着初始化AisEngine2.1.2、解析/var/camera_config.xml 文件&#xff0c;获取相关配置参数。…

L1G3000 任务-浦语提示词工程

基础任务 (完成此任务即完成闯关) 背景问题&#xff1a;近期相关研究指出&#xff0c;在处理特定文本分析任务时&#xff0c;语言模型的表现有时会遇到挑战&#xff0c;例如在分析单词内部的具体字母数量时可能会出现错误。任务要求&#xff1a;利用对提示词的精确设计&#xf…

Unity之一键创建自定义Package包

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity之一键创建自定义Package包 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取&#xff01; …

python的Flask框架使用

python的Flask框架使用 python环境搭建conda安装python自带的虚拟环境&#xff1a;venv python环境搭建 官网地址 点击downloads 选择你需要的版本&#xff0c;我这里使用的3.12.6 选择Windows installer (64-bit) 选择自定义安装&#xff0c;勾选以管理员权限安装&#xff0…

网络原理(一)—— http

什么是 http http 是一个应用层协议&#xff0c;全称为“超文本传输协议”。 http 自 1991 年诞生&#xff0c;目前已经发展为最主流使用的一种应用层协议。 HTTP 往往基于传输层的 TCP 协议实现的&#xff0c;例如 http1.0&#xff0c;http1.0&#xff0c;http2.0 http3 是…

103.【C语言】数据结构之建堆的时间复杂度分析

1.向下调整的时间复杂度 推导 设树高为h 发现如下规律 按最坏的情况考虑(即调整次数最多) 第1层,有个节点,最多向上调整h-1次 第2层,有个节点,最多向上调整h-2次 第3层,有个节点,最多向上调整h-3次 第4层,有个节点,最多向上调整h-4次 ... 第h-1层,有个节点,最多向上调整1次 第…

用Python爬虫“偷窥”1688商品详情:一场数据的奇妙冒险

引言&#xff1a;数据的宝藏 在这个信息爆炸的时代&#xff0c;数据就像是一座座等待挖掘的宝藏。而对于我们这些电商界的探险家来说&#xff0c;1688上的商品详情就是那些闪闪发光的金子。今天&#xff0c;我们将化身为数据的海盗&#xff0c;用Python这把锋利的剑&#xff0…