图书管理系统汇报

news2024/11/27 14:36:32

【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.coloradmin.cn/o/2227902.html

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

相关文章

js 获取当前时间与前一个月时间

// 获取当前时间的毫秒数 var currentTimeMillis new Date().getTime();// 获取前一个月的Date对象 var dateLastMonth new Date(); dateLastMonth.setMonth(dateLastMonth.getMonth() - 1);// 获取前一个月的毫秒数 var timeMillisLastMonth dateLastMonth.getTime();conso…

Flutter InkWell组件去掉灰色遮罩

当InkerWell组件内部获取到焦点时&#xff0c;会展示一层灰色遮罩 将focusColor属性设置为透明即可 Flutter InkWell焦点效果源码分析 问题描述 当 InkWell 组件获得焦点时&#xff0c;会显示一层灰色遮罩效果。需要找出这个效果是由哪些组件控制的&#xff0c;以及具体的…

【SpringMVC】传递json,获取url参数,上传文件

【传递json数据】 【json概念】 一种轻量级数据交互格式&#xff0c;有自己的格式和语法&#xff0c;使用文本表示一个对象或数组的信息&#xff0c;其本质上是字符串&#xff0c;负责在不同的语言中数据传递与交换 json数据以字符串的形式体现 【json字符串与Java对象互转…

逆向 解密接口信息附Demo(二)

目录 前言1. 加密2. 解密 前言 原先写过另外一篇&#xff0c;推荐阅读&#xff1a;逆向 解密接口信息&#xff08;附Demo&#xff09; 下文以 https://login1.scrape.center/ 进行讲解&#xff0c; 1. 加密 登录过程中可以使用断点进行一步一步排查 或者在js文件中搜索enco…

【周末推荐】Windows无缝连接iPhone

关注“ONE生产力”&#xff0c;获取更多精彩推荐&#xff01; 又到了周末推荐时间了&#xff0c;今天我们介绍一个Windows内置的功能&#xff0c;能够帮助大家将自己的电脑和iPhone连接在一起。 很多用Windows的小伙伴羡慕macOS可以和iPhone无缝连接&#xff0c;轻松阅读和回…

015:地理信息系统开发平台ArcGIS Engine10.2与ArcGIS SDK for the Microsoft .NET Framework安装教程

摘要&#xff1a;本文详细介绍地理信息系统开发平台ArcGIS Engine10.2与ArcGIS SDK for the Microsoft .NET Framework的安装流程。 一、软件介绍 ArcGIS Engine 10.2是由Esri公司开发的一款强大的GIS&#xff08;地理信息系统&#xff09;开发平台。该软件基于ArcGIS 10.2 fo…

基于 Java 的 Spring Boot 和 Vue 的宠物领养系统设计与实现

需要代码 vx&#xff1a;Java980320 不收取任何费用 在这个宠物领养系统中&#xff0c;我们可以设定两个角色&#xff1a;管理员和普通用户。每个角色的功能和目标略有不同&#xff0c;以下分别介绍&#xff1a; 管理员 管理员的主要职责是确保平台的高效运行&#xff0c…

ES6 变量的解构赋值

数组的解构赋值 对象的解构赋值 字符串的解构赋值

关于我的数据结构与算法——初阶第二篇(排序)

&#xff08;叠甲&#xff1a;如有侵权请联系&#xff0c;内容都是自己学习的总结&#xff0c;一定不全面&#xff0c;仅当互相交流&#xff08;轻点骂&#xff09;我也只是站在巨人肩膀上的一个小卡拉米&#xff0c;已老实&#xff0c;求放过&#xff09;。 排序的概念及其运…

IDEA连接EXPRESS版本的SQL server数据库

我安装的版本是SQL2019-SSEI-Expr.exe 也就是EXPRESS版本的SQL Server安排非常简单和快速。 但是默认没有启动sa用户。 启动sa用户名密码登录 默认安装完以后没有启用。 使用Miscrosoft SQL Server Management Studio 使用Windows身份连接后。 在安全性》登录名中找到sa并修改…

Unity 实现的背包系统

Hello Inventory System Unity 实现的背包系统。 TEST 点击底部 TEST 按钮随机生成物品到 Chest &#xff1b;点击物品可以将其 “拿起” &#xff0c;按住键盘左侧的 Ctrl 键可以按半数拿起和放下&#xff1b;属于装备的物品可以点击右键装备上&#xff0c;显示在人物装备属性…

net mvc中使用vue自定义组件遇到的坑

自定义一个ButtonCounter.js组件 export default {data() {return {count: 0}},template: <van-button type"primary" click"count">You clicked me {{ count }} times.</van-button> }按照官网文档的意思&#xff0c;组件命名需要大写驼峰命…

docker基础篇(尚硅谷)

学习链接 docker1️⃣基础篇&#xff08;零基小白&#xff09; - 语雀文档 (即本篇) Docker与微服务实战&#xff08;基础篇&#xff09; Docker与微服务实战&#xff08;高级篇&#xff09;- 【上】 Docker与微服务实战&#xff08;高级篇&#xff09;- 【下】 文章目录 学习…

【密码学】CKKS全同态加密方案浅析

本文主要为翻译内容&#xff0c;原文地址&#xff1a;https://www.inferati.com/blog/fhe-schemes-ckks CKKS算法是2017年论文《Homomorphic Encryption for Arithmetic of Approximate Numbers》中提出的近似计算同态加密算法&#xff0c;论文的作者是Cheon等四位韩国研究…

Nginx + Lua + Redis:打造智能 IP 黑名单系统

Nginx Lua Redis&#xff1a;打造智能 IP 黑名单系统 nginx通过LuaRedis实现动态封禁IP 需求背景 在Web服务中&#xff0c;为了防止恶意用户或爬虫对服务器造成不必要的负载和潜在的安全威胁&#xff0c;我们可以通过设置动态IP黑名单来拒绝来自这些IP的请求。本文将详细介绍…

京东文字点选验证码识别

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 该文章模型已经上线ocr识别网站,欢迎测试!!,地址:https://yxlocr.windy-rain.cn/ocr/textclick/7 该验证码成品展示效果如下: 京东点选验证码数据集如下:…

2024最新的开源博客系统:vue3.x+SpringBoot 3.x 前后端分离

本文转载自&#xff1a;https://fangcaicoding.cn/article/54 大家好&#xff01;我是方才&#xff0c;目前是8人后端研发团队的负责人&#xff0c;拥有6年后端经验&3年团队管理经验&#xff0c;截止目前面试过近200位候选人&#xff0c;主导过单表上10亿、累计上100亿数据…

局域网 docker pull 使用代理拉取镜像

局域网 docker pull 使用代理拉取镜像 1、需求&#xff1a; 我有win主机&#xff0c;上面装有代理可连接dockerhub&#xff1b;我另有linux主机&#xff0c;直接pull因墙失败&#xff0c;想走win的代理访问dockerhub拉镜像&#xff1b;两台主机在同一个局域网中&#xff1b; …

项目1 yolov5鱼苗检测计数

yolov5鱼苗检测 1. yolov5鱼苗检测1.1. 环境配置1.2 Predict1.3 Validate1.4 Train1.5 生成 ONNX 2 代码解析2.1 模型2.2 数据集2.3 损失函数2.4 训练2.5 预测 之前做的项目&#xff0c;再回顾一下 环境&#xff1a;GPU1卡&#xff0c;CPU4核&#xff0c;每显卡12GB&#xff0c…

音视频入门基础:FLV专题(18)——Audio Tag简介

一、引言 根据《video_file_format_spec_v10_1.pdf》第75页&#xff0c;如果某个Tag的Tag header中的TagType值为8&#xff0c;表示该Tag为Audio Tag&#xff1a; 这时StreamID之后紧接着的就是AudioTagHeader&#xff0c;也就是说这时Tag header之后的就是AudioTagHeader&…