图书管理系统汇报

【1A536】图书管理系统汇报

  • 项目介绍
    • 1.用户登录注册功能
    • 1. 1用户角色管理
    • 2.图书管理功能
      • 2.1 添加图书
      • 2.2 编辑图书
      • 2.3 删除图书
    • 3.图书搜索和筛选
      • 3.1 图书搜索
      • 3.2 图书筛选
    • 4.图书借阅、图书归还
      • 4.1 图书借阅
      • 4.2 图书归还
    • 5.用户信息管理
      • 5.1上传头像
      • 5.2修改头像
      • 5.3 修改密码

项目介绍

本项目提供用户和管理员两种角色,支持图书的添加、编辑、删除、搜索和筛选功能,同时具备用户信息管理和借阅功能,确保图书管理高效便捷。

1.用户登录注册功能

在这里插入图片描述
注册部分(前端代码):

在这里插入图片描述

注册部分(后端代码):

//用户注册@PostMapping("/register")public Result register(@RequestBody User registerUser){System.out.println("register");// 查询用户QueryWrapper<User> queryWrapper1 = new QueryWrapper<>();queryWrapper1.eq("user_name", registerUser.getUserName());User userone = userService.getOne(queryWrapper1); // 调用 getOne 方法if (userone != null) {return Result.error("用户名已存在");}QueryWrapper<User> queryWrapper2 = new QueryWrapper<>();queryWrapper2.eq("user_email", registerUser.getUserEmail());User usertwo = userService.getOne(queryWrapper2); // 调用 getOne 方法if (usertwo != null) {return Result.error("邮箱已存在");}//        加密String md5Pwd = Md5Util.getMD5String(registerUser.getUserPassword());User user = new User();user.setUserName(registerUser.getUserName());user.setUserPassword(md5Pwd);user.setUserEmail(registerUser.getUserEmail());user.setUserRole("user");user.setUserStatus("0");//       调用插入数据的方法userService.save(user);UserStatistics userStatistics = new UserStatistics();userStatistics.setUserName(user.getUserName());userStatistics.setActivityCount(0);iUserStatisticsService.save(userStatistics);return Result.success();}

登录部分(前端代码):

在这里插入图片描述

登录部分(后端代码):

   @PostMapping("/login")public Result<String> login(@RequestBody User user){LambdaQueryWrapper<User> wrapper=new LambdaQueryWrapper<>();wrapper.eq(User::getUserName,user.getUserName()).eq(User::getUserPassword, Md5Util.getMD5String(user.getUserPassword()));User userOne = userService.getOne(wrapper);if(userOne!=null){if(userOne.getUserStatus().equals("1")) return Result.error("用户已被封禁");HashMap<String, Object> claims = new HashMap<>();claims.put("userId",user.getUserId());claims.put("userName",user.getUserName());String token = JwtUtil.genToken(claims);redisTemplate.opsForValue().set(token,userOne,30, TimeUnit.MINUTES);return Result.success(token);}else{return Result.error("用户名密码错误");}}

1. 1用户角色管理

功能介绍

  • 系统支持用户和管理员两种角色,不同角色有不同的权限。
  • 管理员可以添加、编辑和删除图书,普通用户只能借阅图书。

前端代码:

在这里插入图片描述在这里插入图片描述
roleCheck 函数用于检查当前用户的登录状态和角色信息。它通过发送一个 HTTP GET 请求到后端 API 获取用户数据,并根据返回的数据进行相应的处理。如果用户未登录或请求失败,将重定向到首页;如果用户已登录且请求成功,则更新用户的角色、名称和头像URL,并将其存储在本地存储中。
在这里插入图片描述在这里插入图片描述


后端代码:
在这里插入图片描述在这里插入图片描述

2.图书管理功能

2.1 添加图书

  • 功能介绍:通过抽屉组件实现,用户可以填写图书的详细信息并保存。

前端代码

在这里插入图片描述在这里插入图片描述
后端代码:
在这里插入图片描述

2.2 编辑图书

  • 功能介绍:点击表格中的“编辑”按钮,弹出抽屉组件,预填当前图书的信息,用户可以进行修改。

前端代码:
在这里插入图片描述当点击edit后,弹出抽屉,进行图书编辑,当点击提交时,调用点击事件的confirmClick方法进行提交表在这里插入图片描述在这里插入图片描述
后端代码:
在这里插入图片描述

2.3 删除图书

  • 功能介绍:点击表格中的“删除”按钮,弹出确认框,确认后删除图书。

前端代码:
在这里插入图片描述在这里插入图片描述在这里插入图片描述
主要看这个handleDelete方法,获取行内元素row的id字段以及token作为deleteBook的参数。所以deleteBook才是删除图书的关键,下面可以发现,发通过axios发了一个delete请求,请求体参数就是id和token在这里插入图片描述

后端代码:
在这里插入图片描述
查看后端代码发现,请求参数正是id跟token,通过对用户进行校验判断用户权限,权限通过后删除图书。

3.图书搜索和筛选

3.1 图书搜索

  • 功能介绍:通过输入框输入图书名或ISBN,实时过滤显示结果。

在这里插入图片描述
搜索功能的实现,@input是当输入框的值发生变化时,触发 inputValue 方法,重点看该方法,它用于处理输入框值变化时的逻辑,根据输入的值过滤图书数据。
在这里插入图片描述

3.2 图书筛选

  • 功能介绍:通过下拉选择框选择图书状态(全部、可借阅、不可借阅),动态更新表格数据。

在这里插入图片描述
这里@change 属性: 监听选择框值的变化,触发handleSelectChange 方法。
在这里插入图片描述

4.图书借阅、图书归还

4.1 图书借阅

  • 功能介绍:用户可以点击图书列表中的“借阅”按钮,借阅图书。借阅成功后,图书状态会更新为“不可借阅”。

后端代码

@PostMapping("/borrow/{id}")public Result borrowBook(@PathVariable String  id, String token){Book byId = bookService.getById(id);User user = checkInfo(token);if (user == null){return Result.error("用户未登录,无权限");}LambdaQueryWrapper<Book> userBorrowedBooksQuery = new LambdaQueryWrapper<>();userBorrowedBooksQuery.eq(Book::getBookBorrower, user.getUserName()).eq(Book::getBookStatus, "0"); // 假设 "0" 表示已借出Long borrowedBooksCount = bookService.count(userBorrowedBooksQuery);if (borrowedBooksCount >= 3) {return Result.error("您已达到最大借书数量,无法再借书");}LambdaQueryWrapper<BookStatistics> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(BookStatistics::getBookName,byId.getBookName());BookStatistics stats = IBookStatisticsService.getOne(queryWrapper);if(stats==null){return Result.error("该书不存在");}stats.setBorrowCount(stats.getBorrowCount() + 1);IBookStatisticsService.updateById(stats);UpdateWrapper<Book> wrapper = new UpdateWrapper<>();wrapper.eq("book_id",id).set("book_borrower",user.getUserName()).set("book_status","0").set("book_borrowtime",LocalDate.now().toString()).set("book_returntime", LocalDate.now().plus(30, ChronoUnit.DAYS).toString());boolean update = bookService.update(wrapper);return Result.success(update);}

前端代码
在这里插入图片描述
在这里插入图片描述

4.2 图书归还

  • 功能介绍:用户可以点击图书列表中的“借阅”按钮,借阅图书。借阅成功后,图书状态会更新为“不可借阅”。

前端代码
在这里插入图片描述在这里插入图片描述

后端代码

@PutMapping("/backBook/{id}")public Result<String> backBook(@PathVariable String id,String token){User user = checkInfo(token);if(user==null){return Result.error("用户未登录,无权限");}UpdateWrapper<Book> updateWrapper = new UpdateWrapper<>();updateWrapper.eq("book_id",id).set("book_status","1").set("book_borrower","").set("book_borrowtime","").set("book_returntime","");boolean update = bookService.update(updateWrapper);QueryWrapper<Book> queryWrapper = new QueryWrapper<>();queryWrapper.eq("book_id",id);Book book = bookService.getOne(queryWrapper);Record newRecord = new Record();LocalDate now = LocalDate.now();newRecord.setRecordBookname(book.getBookName());newRecord.setRecordBorrower(user.getUserName());newRecord.setRecordBookisbn(book.getBookIsbn());newRecord.setRecordAuthor(book.getBookAuthor());newRecord.setRecordPress(book.getBookPress());newRecord.setRecordBorrowtime(now.toString());newRecord.setRecordRemandtime(now.plusMonths(1).toString());boolean save = recordService.save(newRecord);if(update&&save){LambdaQueryWrapper<UserStatistics> queryWrapper1 = new LambdaQueryWrapper<>();queryWrapper1.eq(UserStatistics::getUserName,user.getUserName());UserStatistics getOne = iUserStatisticsService.getOne(queryWrapper1);if(getOne==null){return Result.error("该用户不存在");}getOne.setActivityCount(getOne.getActivityCount() + 1);iUserStatisticsService.updateById(getOne);return Result.success("还书成功");}else {return Result.error("还书失败");}}

5.用户信息管理

5.1上传头像

要做头像上传,就得有存储的地方,阿里云OSS对象存储正好满足我们的需求。
通过阿里云官网,可查看找到OSS对象存储工具类

  • ENDPOINT:阿里云 OSS 的服务端点。
  • ID:阿里云 Access Key ID。
  • KEY:阿里云 Access Key
    Secret。 BUCKET_NAME:存储容器名称。

后端代码:

在这里插入图片描述
在这里插入图片描述

前端代码:
在这里插入图片描述

5.2修改头像

  • 功能介绍:用户可以通过上传图片来修改自己的头像,上传成功后自动刷新页面。

后端代码:
在这里插入图片描述

前端代码:在这里插入图片描述
主要就是这个avatarUpload方法上传头像,查看该方法发现
在这里插入图片描述

5.3 修改密码

  • 功能介绍:用户可以点击菜单中的“修改密码”选项,弹出对话框进行密码修改。

前端代码:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

后端代码:
在这里插入图片描述

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

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

相关文章

执行Django项目的数据库迁移命令时报错:(1050, “Table ‘django_session‘ already exists“);如何破?

一、问题描述&#xff1a; 当我们写Django时&#xff0c;由于自己的操作不当&#xff0c;导致执行数据库迁移命令时报错&#xff0c;报错的种类有很多&#xff0c;例如&#xff1a; 迁移文件冲突&#xff1a;可能你有多个迁移文件试图创建同一个表。数据库状态与迁移文件不同…

蓝牙BLE开发——红米手机无法搜索蓝牙设备?

解决 红米手机&#xff0c;无法搜索附近蓝牙设备 具体型号当时忘记查看了&#xff0c;如果你遇到有以下选项&#xff0c;记得打开~ 设置权限

java设计模式之创建者模式(5种)

设计模式 软件设计模式&#xff0c;又称为设计模式&#xff0c;是一套被反复利用&#xff0c;代码设计经验的总结&#xff0c;他是在软件设计过程中的一些不断发生的问题&#xff0c;以及该问题的解决方案。 **创建者模式又分为以下五个模式&#xff1a;**用来描述怎么“将对象…

SpringSecurity框架(入门)

简介&#xff1a; Spring Security 是一个用于构建安全的 Java 应用程序的框架&#xff0c;尤其适用于基于Spring的应用程序。它提供了全面的安全控制&#xff0c;从认证&#xff08;Authentication&#xff09;到授权&#xff08;Authorization&#xff09;&#xff0c;以及…

广东网站设计提升你网站在搜索引擎中的排名

在当今网络盛行的时代&#xff0c;拥有一个设计优良的网站&#xff0c;对企业的在线发展至关重要。特别是对于广东地区的企业来说&#xff0c;网站设计不仅仅是美观的问题&#xff0c;更直接影响着搜索引擎中的排名。因此&#xff0c;精心策划和设计的网站&#xff0c;能够显著…

Cuebric:用AI重新定义3D创作的未来

一、简介 Cuebric 是一家成立于2022年夏天的好莱坞创新公司,致力于为电影、电视、游戏和时尚等行业提供先进的AI多模态SaaS平台。自2024年1月正式推出以来,Cuebric 已经在市场上获得了广泛的认可和积极的反馈。目前,该平台正处于1.0版本的beta测试阶段,已募集约50万美元的…

计算机的错误计算(一百四十)

摘要 探讨 MATLAB 中函数 的计算精度。 从计算机的错误计算&#xff08;一百三十九&#xff09;知&#xff0c;对于对数运算&#xff0c;当真数在 1 附近时&#xff0c;计算机的输出会出现较大误差。为此&#xff0c;IEEE 754-2019 中专门定义有函数 其目的就是当自变量在 …

《Python游戏编程入门》注-第4章2

《Python游戏编程入门》的“4.2.2 键盘事件”中介绍了通过键盘事件来监听键盘按键的方法。 1 键盘事件 玩家点击键盘中某个按键实际上包含了两个动作&#xff1a;点击按键和释放按键&#xff0c;也就是按键按下和松开。按键按下的对应的事件是KEYDOWN&#xff0c;按键松开对应…

《高频电子线路》 —— 高频谐振功放(2)

动态特性与负载特性 动态特性 静态特性是指&#xff0c;不考虑负载阻抗的时候获得的&#xff0c;即转移特性曲线和输出特性曲线。 考虑负载时&#xff0c;电流变化的时候&#xff0c;负载上的电压就会变化&#xff0c;管子上面的Vce也会变化。 考虑负载的反作用后&#xff0c…

SpringBoot 下的Excel文件损坏与内容乱码问题

序言 随着打包部署的方式的改变&#xff0c;原本正常运行的代码可能带来一些新的问题&#xff0c;比如我们现在使用SpringBoot 的方式生成Jar包直接运行&#xff0c;就会对我们再在Resource下的Excel文件产生影响&#xff0c;导入与预期不符的情况发生cuiyaonan2000163.com 比…

「Mac畅玩鸿蒙与硬件12」鸿蒙UI组件篇2 - Image组件的使用

在鸿蒙应用开发中,Image 组件用于加载和显示图片资源,并提供多种属性来控制图片的显示效果和适配方式。本篇将带你学习如何在鸿蒙应用中加载本地和远程图片、设置图片样式以及实现简单的图片轮播功能。 关键词 Image 组件图片加载本地资源远程图片图片轮播一、Image 组件基础…

上海亚商投顾:沪指缩量调整 华为概念股午后爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 市场全天震荡调整&#xff0c;沪指、深成指午后跌超1%&#xff0c;创业板指一度跌逾2%&#xff0c;尾盘跌幅有…

vim命令及shell命令

目录 vim命令 vim三种工作模式 光标的跳转 复制粘贴 剪切删除 撤销回滚替换 翻页 其他 shell编程命令 判断用户的参数 可用的整数比较运算符 常见的字符串比较运算符 if条件测试语句 for条件循环语句 vim命令 vim三种工作模式 Vim编辑器中设置了三种模式: 命令…

Z 检验和 T 检验之间的区别

目录 一、说明 二、什么是假设检验&#xff1f; 三、假设检验基础 3.1 假设检验的基本概念 3.2 、执行假设验证的步骤 3.3 临界值、P 值 3.4 方向假设 3.5 非方向假设检验s 四、什么是 Z 检验统计量&#xff1f; 五、Z 检验示例 5.1 单样本 Z 检验 5.2 双样本 Z 检…

Qt限制QGraphicsScene QGraphicsItem内部的移动范围

用过QGraphicsView的都知道&#xff0c;原点一般设定在view和item的中心&#xff0c;所以帮助文档和这个网友说的不一定跟我们对的上&#xff1a; 关于Qt限制QGraphicsScene内部Item的移动范围_qgraphicsitem限制移动范围-CSDN博客 首先&#xff0c;设定view的scenerect&…

【Redis】浅析Redis大Key

目录 1、什么是Redis大Key 2、大 Key 是怎么产生的 3、大 Key 导致的问题 4、如何快速找到 Redis 大 Key 5、大 Key 优化策略 6、总结 我们在使用 Redis 的过程中&#xff0c;如果未能及时发现并处理 Big keys&#xff08;下文称为“大Key”&#xff09;&#xff0c;可能…

Jedis操作和springboot整合redis

Jedis-springboot整合redis Jedis 引入jedis依赖 注意事项 测试相关数据类型 Key String List set hash zset 案例 spring boot整合redis 引入相关依赖 在application.properties中配置redis 配置 创建redis配置类 创建测试类 Jedis 引入jedis依赖 <depen…

GenAI 生态系统现状:不止大语言模型和向量数据库

自 20 个月前 ChatGPT 革命性的推出以来&#xff0c;生成式人工智能&#xff08;GenAI&#xff09;领域经历了显著的发展和创新。最初&#xff0c;大语言模型&#xff08;LLMs&#xff09;和向量数据库吸引了最多的关注。然而&#xff0c;GenAI 生态系统远不止这两个部分&#…

HTML、JavaScript和CSS实现注册页面设计

目录 一、实现要求 二、实现页面图 1、注册页面 2.用户ID、用户名、口令验证成功后显示页面 三、用户ID、用户名、口令、确定口令验证逻辑js代码 1、验证用户ID 2、验证用户名 3、验证口令密码 四、总结 五、代码仓库 一、实现要求 综合使用HTML、JavaScript和CSS进…

Vue前端开发:事件绑定方式

事件定义 在Vue中&#xff0c;当一个元素通过使用v-on或语法糖指令绑定某个事件后&#xff0c;则完成了事件被定义的过程&#xff0c;在这定义的过程中&#xff0c;指令的后面是定义事件的名称&#xff0c;等号的后面是事件被触发后执行的函数&#xff0c;当然&#xff0c;也可…