课设作业图书管理系统

用户注册,登录 

播放地址 课设作业图书管理系统_哔哩哔哩_bilibili

对图书进行增删改查

package com.xwr.controller;

import com.xwr.entity.Book;
import com.xwr.entity.Category;
import com.xwr.service.BookService;
import com.xwr.service.CategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.Map;

/**
* 图书控制器
*/
@Controller
@RequestMapping("/book")
public class BookController {

private final BookService bookService;
private final CategoryService categoryService;

@Autowired
public BookController(BookService bookService, CategoryService categoryService) {
this.bookService = bookService;
this.categoryService = categoryService;
}

/**
* 显示图书列表页面
*/
@GetMapping("/list")
public String list(
@RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
@RequestParam(value = "pageSize", defaultValue = "5") int pageSize,
@RequestParam(value = "title", required = false) String title,
@RequestParam(value = "author", required = false) String author,
@RequestParam(value = "categoryId", required = false) Integer categoryId,
Model model,
HttpSession session) {

// 检查用户是否已登录
if (session.getAttribute("loginUser") == null) {
// 未登录,重定向到登录页面
return "redirect:/user/login";
}

// 查询分类列表
List<Category> categories = categoryService.findAll();
model.addAttribute("categories", categories);

// 查询条件不为空时,执行条件查询
if (title != null && !title.isEmpty() || author != null && !author.isEmpty() || categoryId != null) {
List<Book> books = bookService.findByCondition(title, author, categoryId);
model.addAttribute("books", books);
model.addAttribute("title", title);
model.addAttribute("author", author);
model.addAttribute("categoryId", categoryId);
} else {
// 执行分页查询
Map<String, Object> pageInfo = bookService.findByPage(pageNum, pageSize);
model.addAttribute("pageInfo", pageInfo);
}

return "book/list";
}

/**
* 显示图书详情页面
*/
@GetMapping("/detail/{id}")
public String detail(@PathVariable("id") Integer id, Model model) {
Book book = bookService.findById(id);
model.addAttribute("book", book);
return "book/detail";
}

/**
* 显示添加图书页面
*/
@GetMapping("/add")
public String showAddForm(Model model) {
List<Category> categories = categoryService.findAll();
model.addAttribute("categories", categories);
return "book/add";
}

/**
* 显示编辑图书页面
*/
@GetMapping("/edit/{id}")
public String showEditForm(@PathVariable("id") Integer id, Model model) {
Book book = bookService.findById(id);
List<Category> categories = categoryService.findAll();
model.addAttribute("book", book);
model.addAttribute("categories", categories);
return "book/edit";
}

/**
* 删除图书
*/
@GetMapping("/delete/{id}")
public String delete(@PathVariable("id") Integer id) {
bookService.delete(id);
return "redirect:/book/list";
}
}

package com.xwr.controller;

import com.xwr.entity.Book;
import com.xwr.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
* 图书REST控制器
* 用于处理AJAX请求和文件上传
*/
@RestController
@RequestMapping("/api/book")
public class BookRestController {

private final BookService bookService;

@Autowired
public BookRestController(BookService bookService) {
this.bookService = bookService;
}

/**
* 注册自定义日期编辑器
*/
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
}

/**
* 添加图书
*/
@PostMapping("/add")
public Map<String, Object> add(Book book, @RequestParam(value = "coverImage", required = false) MultipartFile coverImage, HttpServletRequest request) {
Map<String, Object> result = new HashMap<>();

try {
// 处理上传图片
if (coverImage != null && !coverImage.isEmpty()) {
String uploadPath = request.getServletContext().getRealPath("/upload/");
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) {
uploadDir.mkdirs();
}

// 生成唯一文件名
String originalFilename = coverImage.getOriginalFilename();
String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
String fileName = UUID.randomUUID().toString() + extension;

// 保存文件
File destFile = new File(uploadPath + fileName);
coverImage.transferTo(destFile);

// 设置图片路径
book.setImageUrl("/upload/" + fileName);
}

// 保存图书信息
boolean success = bookService.add(book);
result.put("success", success);
result.put("message", success ? "添加成功" : "添加失败");
result.put("book", book);
} catch (IOException e) {
result.put("success", false);
result.put("message", "上传图片失败: " + e.getMessage());
} catch (Exception e) {
result.put("success", false);
result.put("message", "添加失败: " + e.getMessage());
}

return result;
}

/**
* 更新图书
*/
@PostMapping("/update")
public Map<String, Object> update(Book book, @RequestParam(value = "coverImage", required = false) MultipartFile coverImage, HttpServletRequest request) {
Map<String, Object> result = new HashMap<>();

try {
// 如果有新上传的图片
if (coverImage != null && !coverImage.isEmpty()) {
String uploadPath = request.getServletContext().getRealPath("/upload/");
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) {
uploadDir.mkdirs();
}

// 生成唯一文件名
String originalFilename = coverImage.getOriginalFilename();
String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
String fileName = UUID.randomUUID().toString() + extension;

// 保存文件
File destFile = new File(uploadPath + fileName);
coverImage.transferTo(destFile);

// 设置新的图片路径
book.setImageUrl("/upload/" + fileName);
}

// 更新图书信息
boolean success = bookService.update(book);
result.put("success", success);
result.put("message", success ? "更新成功" : "更新失败");
} catch (IOException e) {
result.put("success", false);
result.put("message", "上传图片失败: " + e.getMessage());
} catch (Exception e) {
result.put("success", false);
result.put("message", "更新失败: " + e.getMessage());
}

return result;
}

/**
* 删除图书
*/
@PostMapping("/delete/{id}")
public Map<String, Object> delete(@PathVariable("id") Integer id) {
Map<String, Object> result = new HashMap<>();

try {
// 删除图书
boolean success = bookService.delete(id);
result.put("success", success);
result.put("message", success ? "删除成功" : "删除失败");
} catch (Exception e) {
result.put("success", false);
result.put("message", "删除失败: " + e.getMessage());
}

return result;
}
}

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

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

相关文章

springboot 配置加密

springboot 配置加密 [TOC](springboot 配置加密) 前言一、在配置类赋值之前解密二、修改赋值后加密的配置类 前言 在一些国家项目中经常会要求不能暴露数据库链接和密码, 所以需要对配置文件里面的一些配置进行加密处理。 解决方法有两种&#xff1a;一种是在配置加载后还没给…

【操作系统】macOS软件提示“已损坏,打不开”的解决方案

macOS软件提示“已损坏&#xff0c;打不开”的解决方案 在使用 macOS 系统时&#xff0c;不少用户都遇到过这样的情况&#xff1a;当尝试打开某个应用程序时&#xff0c;系统弹出提示“xxx 已损坏&#xff0c;打不开。您应该将它移到废纸篓”&#xff0c;或者显示“无法打开‘…

数据库系统概论(二十)数据库恢复技术

数据库系统概论&#xff08;二十&#xff09;数据库恢复技术 前言一、事务的基本概念1. 什么是事务&#xff1f;2. 事务的两种"打开方式"2.1 隐式事务2.2 显式事务&#xff1a;自己动手打包操作 3. 事务的四大"铁律3.1 原子性3.2 一致性3.3 隔离性3.4 持久性 4.…

java将pdf文件转换为图片工具类

一、相关依赖 <!-- PDFBox for PDF processing --><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version></dependency>二、工具类 import org.apache.pdfbox.p…

零门槛探索国产数据库硬核实力 —— 金仓数据库在线体验平台体验记

1、 金仓数据库在线体验平台 最近&#xff0c;我发现了一个超棒的数据库宝藏 —— 金仓数据库在线体验平台。它在金仓社区上线后&#xff0c;凭借 “零门槛体验 多场景交互” 的特点&#xff0c;迅速吸引了众多数据库爱好者的目光&#xff0c;我也忍不住去体验了一番。 2、 …

Linux基本操作指令和vim编译器

基本指令 查看日期与日历 data 指令 显示日期 用法1&#xff1a;data CST&#xff1a;China Standard Time 时区&#xff0c;中国标准时间 用法2&#xff1a; data 指定格式 常用格式&#xff1a; “%Y-%m-%d”(%F): 2025-06-16“%H:%M:%S”(%T): 20:19:45“%F%T”用法3&am…

“从HTTP到TCP/IP的旅程“-----深入浅出Java Web通信

先放结构图&#xff1a; 一、引言&#xff1a;网络通信就像寄快递 想象一下我们在网上买了一本书&#xff0c;整个配送过程是这样的&#xff1a; 应用层&#xff1a;你在购物网站填好收货地址&#xff08;HTTP请求&#xff09;传输层&#xff1a;快递公司把包裹打包&#xf…

docker build使用代理以实现构建过程中下载Github源码等操作

在通过Dockerfile构建docker容器的过程中&#xff0c;经常会需要在构建过程中拉取Github上的代码。当宿主机配好代理&#xff0c;但容器内是一个隔离的环境&#xff0c;若想在容器内访问&#xff0c;则需再打通容器和宿主机之间的代理配置。 方法一&#xff1a; 若宿主机上的…

Docker 快速搭建一个基于 GPT-Vis 组件的统计图表生成服务

以下是对工具简单介绍&#xff1a; 可以在服务端使用 GPT-Vis 统计图表组件直接渲染成图片支持Docker一键部署&#xff0c;提供统计图表渲染生成API接口支持多种GPT-Vis支持的组件&#xff0c;包括折线图、柱形图、饼图、面积图、条形图、直方图、散点图、词云图、雷达图、思维…

hal库练习1

要求&#xff1a;一个按键实现呼吸灯的控制&#xff0c;一个按键控制LED灯的闪烁&#xff0c;串口发送数据控制灯的开关 定时器配置 1.选择需要的定时器2.配置基础参数&#xff08;根据时钟树给定时器输入的时钟&#xff09;3.打开中断4.在主函数里打开中断 定时器扫描按键 …

java线程(4)

程序(program) 是为完成制定任务,用某种语言编写的一组指令的集合.简单的话说:就是我们写的代码. 进程 1.进程是指进行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存空间,当我们使用迅雷,又启动了一个进程,操作系统将为迅雷分配新的内存空间. 2、…

02《F8Framework》核心入口 FF8.cs

FF8.cs类是 F8Framework的核心入口 采用单例模式 提供对各个功能模块的全局访问 【特点】通过静态类FF8统一访问所有功能 1.模块化设计&#xff1a; 每个功能独立 通过 ModuleCenter 统一管理 2.懒加载机制&#xff1a; …

【硬件】相机的硬件测试

相机测试 author: Alla Imatest 提供超过 30 种测试项目&#xff0c;主要包括&#xff1a; 1&#xff09;图像基础参数‌&#xff1a;MTF&#xff08;调制传递函数&#xff09;、畸变、均匀性、动态范围 2&#xff09;色彩与光学特性‌&#xff1a;白平衡误差、饱和度、gamma …

Profinet与Modbus TCP协议转换技术:西门子S7-1500(主站)和欧姆龙NJ PLC的高效数据交换

一、项目背景 某大型现代化智慧农业养殖场致力于打造全方位智能化的养殖环境。其养殖系统中&#xff0c;环境监测与调控部分选用了西门子S7-1500PLC作为Profinet协议主站。该PLC凭借强大的运算能力和丰富的功能模块&#xff0c;能够精准地采集和处理养殖场内的温度、湿度、空气…

希尔伯特变换,实信号转复信号的FPGA实现思路

希尔伯特变换将实信号转复信号的原理 将实信号的相位推迟90度后作为复信号的虚部。 错误实现方式 实信号经过希尔伯特滤波后得到复信号的虚部&#xff0c;之后直接与实信号组成复信号。而由于滤波器本身会对信号延时&#xff0c;故I路与Q路并不是相差90度&#xff0c;所以此方…

多模态大语言模型演进:从视觉理解到具身智能的技术突破

多模态大语言模型演进:从视觉理解到具身智能的技术突破 多模态大语言模型(MLLMs)正在重塑人工智能的边界,实现从"看见"到"理解"再到"行动"的全链条智能。本文将深入解析苹果最新多模态研究进展,揭示视觉-语言模型十年演进的技术脉络,剖析…

window显示驱动开发—渲染管道

支持 Direct3D 版本 10 的图形硬件可以使用共享可编程着色器核心进行设计。 GPU) (图形处理单元可以编程着色器核心&#xff0c;这些着色器核心可以跨构成呈现管道的功能块进行计划。 这种负载均衡意味着硬件开发人员不需要使用每种着色器类型&#xff0c;而只需要使用执行呈现…

时序数据库Apache IoTDB核心技术深度解析

一、引言 ‌背景‌&#xff1a;5G技术加速了IoT领域的发展&#xff0c;物联网设备数据的收集、存储和计算需求日益增长。Apache IoTDB作为一款专为物联网时序数据设计的软件系统&#xff0c;在2020年被Apache基金会认可为顶级项目。 二、IoT领域发展趋势 ‌5G与IoT‌&#x…

Next.js面试题:API深度解析

Next.js面试题&#xff1a;API深度解析 Next.js 通过 App Router 的引入彻底改变了 Web 开发范式。在这个新时代&#xff0c;深入理解 Next.js 的 API 函数不再只是锦上添花&#xff0c;而是技术面试中的关键区分点。这些函数构成了构建高性能、可扩展、现代化 Web 应用的基石…

Docker-MCP quickstart

项目概述 Docker-MCP 是一个 支持mcp的Docker 管理服务器&#xff0c;它允许 客户端 通过 MCP&#xff08;Model Control Protocol&#xff09;接口直接与 Docker 进行交互。该项目提供了一套工具&#xff0c;使 AI 助手能够创建容器、部署 Docker Compose 、获取容器日志以及…