图书管理系统汇报

【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 修改密码

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

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

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

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

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

相关文章

清晰易懂的JavaScript进阶部分——DOM操作 (节点获取,节点属性修改,节点创建与插入,CSS样式的修改)

DOM操作&#xff08;Document Object Model 文档对象模型&#xff09;指的是通过JavaScript来操作网页的结构和内容。DOM提供了一种以文档树形式表示HTML或XML文档的方式&#xff0c;可以使用JavaScript来访问和修改网页的元素、属性和文本内容&#xff0c;且提供了一系列的函数…

服务器虚拟化

前言 服务器虚拟化是一种技术&#xff0c;它通过将一台物理服务器的软件环境分割成多个独立分区&#xff0c;使每个分区都能模拟出一台完整的虚拟服务器。这种技术利用虚拟化技术充分发挥服务器的硬件性能&#xff0c;提高运营效率&#xff0c;节约能源并降低经济成本。 通过…

如何在Linux下部署自己的ZFile开源网盘

ZFile 项目介绍 ZFile是一个功能强大、灵活的开源网盘系统&#xff0c;为用户提供安全便捷的文件存储和共享方案。 项目概述 ZFile由ZFile, Inc.开发和维护&#xff0c;基于Docusaurus构建。其用户友好的界面支持多种文件存储和共享功能&#xff0c;并具备高度的可定制性和扩…

StandardThreadExecutor源码解读与使用(tomcat的线程池实现类)

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java源码解读-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 目录 1.前言 2.线程池基础知识回顾 2.1.线程池的组成 2.2.工作流程 2…

VBA字典与数组第二十讲:如何在代码运行时创建数组

《VBA数组与字典方案》教程&#xff08;10144533&#xff09;是我推出的第三套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;字典是VBA的精华&#xff0c;我要求学员必学。7.1.3.9教程和手册掌握后&#xff0c;可以解决大多数工作中遇到的实际问题。…

J2:ResNet50v2算法实战与解析

J2周&#xff1a;ResNet50V2算法实战与解析 论文解读1、ResNetV2结构与ResNet结构对比☕2、关于残差结构的不同尝试☕3、关于激活的尝试☕ Pytorch实现ResNet50V2算法1、导入库并设置GPU2、导入和检查数据3、划分数据集4、搭建ResNet-50V2模型Residual BlockStack&#xff08;堆…

MFC图形函数学习04——画矩形函数

MFC中绘制矩形函数是MFC的基本绘图函数&#xff0c;它的大小和位置由左上角和右下角的坐标决定&#xff1b;若想绘制的矩形边框线型、线宽、颜色以及填充颜色都还需要其它函数的配合。 一、绘制矩形函数 原型&#xff1a;BOOL Rectangle(int x1,int y1,int x2,int y2); …

新手BUG:在声明了返回值的函数中不写返回值

本文对两个分别以int和string为返回值类型的函数进行分析&#xff0c;说明了在有返回值的函数中不写返回值会产生的问题。然后给出在编译阶段检查出这样的问题的办法。 一、背景 在软件测试环节发现&#xff0c;函数会在返回之前coredump。经过排查发现&#xff0c;在这个会…

机器人技术革新:人工智能的强力驱动

内容概要 在当今世界&#xff0c;机器人技术与人工智能的结合正如星星与大海&#xff0c;彼此辉映。随着科技的不断进步&#xff0c;人工智能不仅仅是为机器人赋予了“聪明的大脑”&#xff0c;更是推动了整个行业的快速发展。回顾机器人技术的发展历程&#xff0c;我们会发现…

外网访问 Immich 照片管理软件

Immich 是一个自托管的照片和视频备份的平台&#xff0c;它允许用户在私有服务器上存储、管理和分享他们的照片&#xff0c;视频等媒体文件。 第一步&#xff0c;本地部署安装 Immich 1&#xff0c;检查 Docker 服务状态&#xff0c;确保 Docker 正常运行。 systemctl statu…

电脑软件:推荐一款免费且实用的电脑开关机小工具

目录 一、软件简介 二、软件功能 三、软件特点 四、使用说明 五、软件下载 今天给大家推荐一款免费且实用的电脑开关机小工具KShutdown&#xff0c;有需要的朋友可以下载试一下&#xff01; 一、软件简介 KShutdown是一款精巧且实用的定时自动关机小工具&#xff0c;对于…

Manus在虚拟现实仿真模拟中的应用案例分享

Manus虚拟现实手套作为一种高精度的人机交互设备&#xff0c;在仿真模拟领域展现出了巨大的应用潜力。通过提供实时、准确的手指动作捕捉数据&#xff0c;Manus手套为多个行业带来了前所未有的仿真体验&#xff0c;推动了技术发展和应用创新。 技术特点 1. 高精度手指跟踪 Ma…

ensp中acl的使用

拓扑图及其要求如下 基础配置 检查此上R2配置错误&#xff0c;undo重新写 检查手写配置无误 按要求写配置 要求1完成 因为一个接口的入或者出方向上 只能调用一张acl表格&#xff0c;所以要求二照样在R1上面写 要求3

5. STM32之TIM实验--输出比较(PWM输出,电机,四轴飞行器,智能车,机器人)--(实验5:PWM驱动直流电机)

作者:Whappy,日期:2024.10.29,决战STM32 直流电机的控制就比较简单了,只有数据线和地线,正接正转,反接反转,为了方便,本实验采用H桥电路来控制电机的正反转,H桥电路也很简单,就是4个MOS管构成的2路推挽输出电路. 注:基本上大功率器件,单片机基本上是无法驱动的,都是要靠一部分…

Python基础知识汇总(建议收藏再观看)!

1.执行脚本的两种方式 Python a.py 直接调用Python解释器执行文件 chomd x a.py ./a.py #修改a.py文件的属性&#xff0c;为可执行&#xff0c;在用 ./ 执行a.py 文件 2、简述位、字节的关系 1bytes8bit ,2**8256,可以代表256中变化&#xff0c; 3、简述 ascii、unicode、…

Java中IO的高级操作

目录 缓冲流 缓冲字节输入流&#xff1a; 缓冲字节输出流&#xff1a; 缓冲字符输入流&#xff1a; 缓冲字符输出流&#xff1a; 转换流 转换流字符输入&#xff1a; 转换流字符输出&#xff1a; 练习案例&#xff1a; 打印流 字节打印流&#xff1a; 字符打印流&a…

Matlab高光谱遥感

原文链接&#xff1a;Matlab高光谱遥感https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247623643&idx5&sne4557ed43728f851140b100f42286988&chksmfa8da23ccdfa2b2a4d795bf4087f672faaa7082d1f52e046616ab7bf196a6eef89ea553d06b1&token1392391660&…

ssm+jsp663数学课程评价系统的设计与开发

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…

openssl-ec-chn命令手册

openssl-ec命令处理EC&#xff08;Elliptic Curve&#xff0c;椭圆曲线&#xff09;密钥。使密钥可以在各种形式之间转换&#xff0c;并打印出其组件。注意&#xff1a;OpenSSL使用“SEC 1:椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;”中指定的私钥格…

(JVM)深入JAVA底层 JVM(Java 虚拟机)!带你认识JVM、程序计数器、JVM栈和方法栈还有堆内存!看看JAVA针对这些内存空间都做了什么吧!

1. 什么是JVM java 二进制字节码的运行环境&#xff0c;简称&#xff1a;java 虚拟机&#xff08;Java Virtual Machine&#xff09; 2. 好处是什么 一次编写&#xff0c;到处运行自动内存管理&#xff0c;GC垃圾回收功能数组下标越界检查多态… 3. jdk、jre、jvm 4. 学习J…