13图书归还-云图书管理系统(Vue3+Spring Boot+element plus)

目录

  • 1 接口地址
  • 2 后台代码
      • RecordController
      • BookController
  • 3 view/books/BookRecordsVue中前端框架搭建
  • 4 api/record.js文件写查询用户借阅记录的接口代码
  • 5 api/book.js中写归还图书、查询当前借阅图书接口代码
  • 6 BookRecordsVue中导入接口函数,并调用
  • 7 运行效果

1 接口地址

### 用户借阅历史
GET http://localhost:8082/record/pastBorrowedRecords

### 用户当前所借图书
GET http://localhost:8082/book/currentBorrowedBooks

### 图书归还
GET http://localhost:8082/book/returnBook

2 后台代码

RecordController

    //历史借阅记录
    @GetMapping("/pastBorrowedRecords")
    public Result pastBorrowedRecords(){
        User user = ThreadLocalUtil.get();
        LambdaQueryWrapper<Record> recordWrapper = new LambdaQueryWrapper<>();
        recordWrapper.eq(Record::getRecordBorrower,user.getUserName());
        List<Record> recordList = iRecordService.list(recordWrapper);
        System.out.println("曾经的借阅记录");
        return Result.success(recordList);
    }

BookController

    //用户归还图书功能
    @GetMapping("/returnBook")
    public Result returnBook(@RequestParam("bookId") Integer bookId){
//        获取用户信息
        User loginUser = ThreadLocalUtil.get();

        //通过book_id查找需要归还的图书
        Book bookMsg = iBookService.getById(bookId);
        String TheBorrowtime = bookMsg.getBookBorrowtime();

//      获取当前时间
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String TheRemandtime = LocalDate.now().format(formatter);
        UpdateWrapper<Book> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("book_borrower",loginUser.getUserName())
                .eq("book_status","1")
                .eq("book_id",bookId)
                .set("book_status","0")
                .set("book_borrower",null)
                .set("book_borrowtime",null)
                .set("book_returntime",null);
        boolean result = iBookService.update(updateWrapper); // 调用 update 方法

//      图书状态修改之后 还需要新增一条借阅记录
        Record record = new Record();
        record.setRecordBookname(bookMsg.getBookName());
        record.setRecordBorrower(loginUser.getUserName());
        record.setRecordBookisbn(bookMsg.getBookIsbn());
        record.setRecordBorrowtime(TheBorrowtime);
        record.setRecordRemandtime(TheRemandtime);
        boolean result1 = iRecordService.save(record); // 调用 save 方法
        if (result1) {
            System.out.println("Record updated successfully.");
            return Result.success("归还图书成功");
        } else {
            return Result.error("归还失败,可能没有借阅信息或者是其他问题!");
        }
    }
 //用户借阅图书功能
    @GetMapping("/borrowBook")
    public Result userBorrowBook(String bookId){
       User user = ThreadLocalUtil.get();
//      查询用户当前借了是否达到三本书,如果达到,禁止借阅
        QueryWrapper<Book> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("book_borrower",user.getUserName());
        List<Book> books = iBookService.list(queryWrapper);
        if(books.size()>=3){
            return Result.error("借阅图书失败,借阅图书数量已达上限!");
        }
        //定义时间格式
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        //获取当前时间 格式为 yyyy-MM-dd
        String borrowTime = LocalDate.now().format(dateFormatter);
        //设置还书时间为当前时间的30天之后
        String returnTime =  LocalDate.now().plusDays(30).format(dateFormatter);
        //通过book_id查找需要借阅的图书
        UpdateWrapper<Book> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("book_id",bookId)
                .set("book_borrower",user.getUserName())
                .set("book_status","1")
                .set("book_borrowtime",borrowTime)
                .set("book_returntime",returnTime);

        boolean result = iBookService.update(updateWrapper); // 调用 update 方法
        if (result) {
            return Result.success("借阅图书成功");
        } else {
            return Result.error("借阅失败,可能图书已被其他人借阅或者是其他问题!");
        }
    }

3 view/books/BookRecordsVue中前端框架搭建

<script setup>
import { ref, computed } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'

// 默认显示第一个tab
const activeTab = ref('current')
// 图书表单数据模型
const bookModel = ref({
    bookId: 0,
    bookName: '',
    bookIsbn: '',
    bookPress: '',
    bookAuthor: '',
    bookPagination: '',
    bookPrice: '',
    bookUploadtime: '',
    bookStatus: '',
    bookBorrower: '',
    bookBorrowtime: '',
    bookReturntime: ''
})

// 借阅记录的数据模型
const recordModel = ref({
    recordId: 0,
    recordBookname: '',
    recordBookisbn: '',
    recordBorrower: '',
    recordBorrowtime: '',
    recordRemandtime: ''
})

// 当前借阅的图书列表
const currentBorrowedBooks = ref([

    // 其他当前借阅的图书项...
])

// 曾经的借阅记录列表
const pastBorrowedRecords = ref([

    // 其他借阅记录项...
])



// 获取用户当前借阅的图书
const getUsersCurrentBorrowedBooks = async () => {

}

// 获取用户曾经的借阅记录
const getUsersPastBorrowedRecords = async () => {

}

// 初始化时获取用户当前借阅的图书和曾经的借阅记录
getUsersCurrentBorrowedBooks()
getUsersPastBorrowedRecords()

// 归还图书
const returnBookToBackend = (book) => {

}
</script>

<template>
    <el-card class="page-container">
        <el-tabs v-model="activeTab" @tab-click="handleTabClick">
            <el-tab-pane label="当前借阅" name="current">
                <el-table :data="currentBorrowedBooks" style="width: 100%">
                    <el-table-column prop="bookName" label="书名"></el-table-column>
                    <el-table-column prop="bookAuthor" label="作者"></el-table-column>
                    <el-table-column prop="bookPress" label="出版社"></el-table-column>
                    <el-table-column prop="bookBorrowtime" label="借阅时间"></el-table-column>
                    <el-table-column label="操作" width="180">
                        <template #default="{ row }">
                            <el-button type="danger" @click="returnBook(row)">归还</el-button>
                        </template>
                    </el-table-column>
                </el-table>
            </el-tab-pane>
            <el-tab-pane label="借阅记录" name="past">
                <el-table :data="pastBorrowedRecords" style="width: 100%"
                    :default-sort="{ prop: 'recordRemandtime', order: 'ascending' }">
                    <el-table-column prop="recordBookname" label="书名"></el-table-column>
                    <el-table-column prop="recordBookisbn" label="ISBN"></el-table-column>
                    <el-table-column prop="recordBorrower" label="借阅人"></el-table-column>
                    <el-table-column prop="recordBorrowtime" label="借阅时间" sortable></el-table-column>
                    <el-table-column prop="recordRemandtime" label="归还时间" sortable></el-table-column>
                </el-table>
            </el-tab-pane>
        </el-tabs>
    </el-card>
</template>

<style scoped>
.page-container {
    padding: 20px;
}
</style>

效果如下
在这里插入图片描述

4 api/record.js文件写查询用户借阅记录的接口代码

// 导入request
import request from '@/utils/request'

// 查询用户借阅记录
export const pastBorrowedRecordsService = () => {
    return request.get('/record/pastBorrowedRecords')
}

5 api/book.js中写归还图书、查询当前借阅图书接口代码

// 用户当前借阅的图书
export const userBorrowListService = () => {
    return request.get('/book/currentBorrowedBooks')
}

// 归还图书 发送get请求
export const bookReturnService = (bookId) => {
    return request.get('/book/returnBook', { params: { bookId: bookId } })
}

6 BookRecordsVue中导入接口函数,并调用

//导入用户当前借阅 userBorrowListService
import { userBorrowListService } from '@/api/book'
// 获取用户当前借阅的图书
const getUsersCurrentBorrowedBooks = async () => {
    // 这里可以调用后端API获取用户当前借阅的图书
    // 假设这里有一个返回当前借阅图书的模拟函数
    const result = await userBorrowListService()
    currentBorrowedBooks.value = result.data
}

//导入用户借阅历史接口 pastBorrowedRecordsService
import { pastBorrowedRecordsService } from '@/api/record'
// 获取用户曾经的借阅记录
const getUsersPastBorrowedRecords = async () => {
    // 这里可以调用后端API获取用户曾经的借阅记录
    // 假设这里有一个返回借阅记录的模拟函数
    const result = await pastBorrowedRecordsService()
    pastBorrowedRecords.value = result.data
}

// 初始化时获取用户当前借阅的图书和曾经的借阅记录
getUsersCurrentBorrowedBooks()
getUsersPastBorrowedRecords()

// 导入 bookReturnService
import { bookReturnService } from '@/api/book'
// 归还图书
const returnBook = (book) => {
    // 提醒是否要归还这本书
    return ElMessageBox.confirm('确定要归还《' + book.bookName + '》吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
    }).then(() => {
        // 用户点击了确定
        // 这里可以调用后端API归还图书
        return bookReturnService(book.bookId).then(result => {
            ElMessage.success(result.data ? result.data : '图书已归还')
            getUsersCurrentBorrowedBooks();
            getUsersPastBorrowedRecords();

        })
    })
}

7 运行效果

在这里插入图片描述

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

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

相关文章

C++/初识C++

目录 一、前言 二、正文 1C语言第一个程序&#xff1a; 1.1C的第一个程序&#xff1a; 2.命名空间 2.1 namespace的价值 2.2namespace的定义 2.3namespace的正常使用 3.C输出和输入 三、结言 一、前言 点来不及悼念C语言&#xff0c;接下来出场的是新的语言C。不同于C…

【数据采集工具】Sqoop从入门到面试学习总结

国科大学习生活&#xff08;期末复习资料、课程大作业解析、大厂实习经验心得等&#xff09;: 文章专栏&#xff08;点击跳转&#xff09; 大数据开发学习文档&#xff08;分布式文件系统的实现&#xff0c;大数据生态圈学习文档等&#xff09;: 文章专栏&#xff08;点击跳转&…

unity Gpu优化

不一样的视角&#xff0c;深度解读unity性能优化。unity性能优化&#xff0c;unity内存优化&#xff0c;cpu优化&#xff0c;gpu优化&#xff0c;资源优化&#xff0c;资源包、资源去重优化&#xff0c;ugui优化。 gpu优化静态批处理静态批处理原理规则静态合批的原理静态合批的…

2023年华为杯数学建模竞赛B题论文和代码

DFT类矩阵的整数分解逼近 离散傅里叶变换&#xff08;Discrete Fourier Transform&#xff0c;DFT&#xff09;傅里叶分析方法是信号分析的最基本方法&#xff0c;傅里叶变换是傅里叶分析的核心&#xff0c;通过它把信号从时间域变换到频率域&#xff0c;进而研究信号的频谱结构…

SSM四川工商学院学生宿舍管理系统---附源码54633

摘 要 从20年代开始&#xff0c;计算机疯狂的出现在人们的生活以及工作当中&#xff0c;成为人们生活、工作的好帮手&#xff0c;计算机深入到每家每户当中&#xff0c;网络办公&#xff0c;网络教学更是替换了传统手工记录管理的方式&#xff0c;使用计算机办公可以不必局限于…

MySQL-12.DQL-聚合函数

一.DQL-分组查询 二.聚合函数 -- DQL:分组查询 -- 聚合函数 -- 1.统计该企业员工数量 count select count(id) from tb_emp; select count(job) from tb_emp;select count(A) from tb_emp; select count(*) from tb_emp;-- 2.统计该企业最早入职的员工 min select min(entr…

SQL第18课挑战题

1. 创建一个名为customerswithorders的视图&#xff0c;其中包含customers表中的所有列&#xff0c;但仅仅是那些已下订单的列。提示&#xff1a;可以在orders表上使用join来仅仅过滤所需的顾客&#xff0c;然后使用select来确保用有正确的数据。 创建视图&#xff1a;

电影台词摘抄(十一)——Banana!

Scarlet&#xff1a;Do you know who this is? Kevin&#xff1a;Uh. La cucaracha? n.伊丽莎白(女子名) Scarlet&#xff1a;This is Queen Elizabeth, ruler of England.Oh, I love England, Their music, the …

Linux - 环境变量 | 命令行参数 | 进程基础

文章目录 一、了解冯诺依曼体系结构1、概念2、对数据层面3、实例二、操作系统1、概念2、设计OS的目的3、定位4、操作系统怎么管理&#xff1f; 三、进程1、概念2、怎么管理进程3、描述进程-PCB4、描述进程怎么运行&#xff08;粗略&#xff09;5、进程属性6、创建子进程7、创建…

bash之基本运算符

一.算术运算符 vim test.sh #!/bin/basha10 b20valexpr $a $b echo "a b : $val"valexpr $a - $b echo "a - b : $val"valexpr $a \* $b echo "a * b : $val"valexpr $b / $a echo "b / a : $val"valexpr $b % $a echo "b % a …

c++STL——map与set的使用及介绍

目录 前言&#xff1a; 1. 关联式容器 2. 键值对 3. 树形结构的关联式容器 3.1 set 3.1.1 set的介绍 3.1.2 set的使用 1. set的模板参数列表 2. set的构造 3. set的迭代器 4. set的容量 5. set修改操作 6. set的使用举例 3.2 map 3.2.1 map的介绍 3.2.2 map的…

Vue3浮动按钮(FloatButton)

效果如下图&#xff1a;在线预览 APIs FloatButton 参数说明类型默认值left按钮定位的左边距&#xff0c;单位 pxnumber | stringundefinedright按钮定位的右边距&#xff0c;单位 pxnumber | string24top按钮定位的上边距&#xff0c;单位 pxnumber | stringundefinedbottom…

spring 如何将mutipartFile转存到本地磁盘

两者的区别和联系 MutipartFile是spring的一部分&#xff0c;File则是java的标准类MutipartFile用于接收web传递的文件&#xff0c;File操作本地系统的文件 MutipartFile 转换File的三种方式 使用MutipartFile 自带的transferTo方法使用java自带的FileOutPutStream流使用java自…

使用Langchain-chatchat搭建RAG应用,并使用postman进行测试验证

Github地址&#xff1a;https://github.com/chatchat-space/Langchain-Chatchat 一、概述 LangChain-Chatchat (原 Langchain-ChatGLM)&#xff0c;一种利用 langchain 思想实现的基于本地知识库的问答应用&#xff0c;目标期望建立一套对中文场景与开源模型支持友好、可离线运…

React(一) 认识React、熟悉类组件、JSX书写规范、嵌入变量表达式、绑定属性

文章目录 一、初始React1. React的基本认识2. Hello案例2.1 三个依赖2.2 渲染页面2.3 hello案例完整代码 二、类组件1. 封装类组件2. 组件里的数据3. 组件里的函数 (重点)4. 案例练习(1) 展示电影列表 三、JSX语法1. 认识JSX2. JSX书写规范及注释3. JSX嵌入变量作为子元素4. JS…

android app执行shell命令视频课程补充android 10/11适配-千里马android

(https://blog.csdn.net/learnframework/article/details/120103471) https://blog.csdn.net/learnframework/article/details/120103471 hi&#xff0c;有学员在学习跨进程通信专题课程时候&#xff0c;在实战app执行一个shell命令的项目时候&#xff0c;对课程本身的android …

推荐算法的学习

文章目录 前言1、模型1.1 从本领域模型的发展历史中学习1.1.1 在历史中总结发展规律和趋势1.1.2 发现模型之间的共性&#xff0c;方便记忆 1.2 从其他领域的发展中学习1.2.1 注意力机制1.2.2 残差网络 1.3 实践该怎么办&#xff1f; 2、 特征2.1 数据源的选择与建立2.2 特征构造…

Element中el-table组件设置max-height右侧出现空白列的解决方法

之前就出现过这个情况&#xff0c;没理过&#xff0c;因为不影响啥除了不美观...但今天看着实在是难受&#xff0c;怎么都不顺眼(可能是我自己烦躁--) 试了很多网上的方法&#xff0c;都不得行&#xff0c;后面发现了这篇文章&#xff0c;解决了! 感谢&#xff01; Element中t…

PageHelper循环依赖问题

1. 问题 2. 原因 项目中SpringBoot的版本为2.7.18。 SpringBoot2.6.x后不推荐使用循环依赖&#xff0c;也就是说从2.6.x版本开始&#xff0c;如果项目里还存在循环依赖&#xff0c;SpringBoot将拒绝启动&#xff01; 3. 解决 去pageHelper github看&#xff0c;才看到新版本…

Pandas缺失值处理

目录 NaN 加载包含缺失的数据 查看缺失值 通过info函数查看缺失值 通过isnull函数查看缺失值 通过notnull函数查看缺失值 通过isnull().sum()统计空值 缺失值处理 准备数据 dropna删除缺失值 fillna平均值填充缺失值 fillna前后值填充缺失值 interpolate线性插值 …