项目改造操作(图书管理系统为例)

news2025/1/4 19:31:15

目录

后端

概述

获取所有的读者的借阅卡号

获取所有的未被借阅的图书编号

进行借阅

前端

后端

概述

本模块主要完成对图书的借阅处理。需要实现三个接口,第一个是获取所有的读者的借阅卡号,第二个是获取所有的未被借阅的图书编号,第三个则是根据借阅卡的卡号和图书编号进行借阅。

获取所有的读者的借阅卡号

接口路径:/users/getAllCardNumber

Query参数:无

返回值形式:JSON 统一封装的对象R进行响应

{
  "status": 200,//状态码
  "msg": "获取成功",//响应信息
  "data": [//返回数据==》所有的读者编号
    "65125544"
  ],
  "map": {}
}

 UsersController

    @GetMapping("getAllCardNumber")
    public R getAllCardNumber() {
       List<Long> list=usersService.getAllCardNumber();
       return R.ok(list,"获取成功");
    }

 UsersService

 List<Long> getAllCardNumber();

UsersServiceImpl

    @Override
    public List<Long> getAllCardNumber() {

        List<Users> list = this.list();
        List<Long> collect = list.stream().map(item -> {
            Long cardNumber = item.getCardNumber();
            return cardNumber;
        }).collect(Collectors.toList());
        return collect;

    }

测试 

GET http://localhost:8888/users/getAllCardNumber

获取所有的未被借阅的图书编号

 接口路径:/books/getAllNotBorrowBoook

Query参数:无

返回值形式:JSON 统一封装的对象R进行响应

{
  "status": 200,//状态码
  "msg": "获取成功",//响应信息
  "data": [//返回数据==》未被借阅的书籍编号
    "65125544"
  ],
  "map": {}
}

 BooksController

    @GetMapping("getAllNotBorrowBook")
    public R getAllNotBorrowBook() {
        List<String> list= booksService.getAllNotBorrowBook();
        return R.ok(list,"获取成功");

    }

 BooksService

    List<String> getAllNotBorrowBook();

  BooksServiceImpl

    @Override
    public List<String> getAllNotBorrowBook() {
        List<Books> list = this.list();
        List<String> collect = list.stream().filter(item -> {
            if ("已借出".equals(item.getBookStatus())) {
                return false;
            } else {
                return true;
            }
        }).map(item -> {
            return item.getBookNumber();
        }).collect(Collectors.toList());
        return  collect;
    }

测试 

GET http://localhost:8888/users/getAllCardNumber

进行借阅

 接口路径:/booksBorrow/borrowBook

Query参数:BooksBorrowDTO

返回值形式:JSON 统一封装的对象R进行响应

{
  "status": 200,//状态码
  "msg": "获取成功",//响应信息
  "data":true,//成功还是失败的响应
  "map": {}
}

 BooksBorrowController

    /**
     * 借书
     * @param booksBorrowDTO
     * @return
     */
    @PostMapping("borrowBook")
    public R borrowBookByCardNumberAndBookNumber(@RequestBody BooksBorrowDTO booksBorrowDTO) {
        System.out.println("1234");
        boolean b= booksBorrowService.borrowBook(booksBorrowDTO);
        if (b==false){
            return R.error("借书失败(请校验数据,IBSN或借书凭证出错,或者该书已借出异常)");
        }else {
            return R.ok("借书成功");
        }

    }

BooksBorrowService

 boolean borrowBook(BooksBorrowDTO booksBorrowDTO);

BooksBorrowServiceImpl

   @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean borrowBook(BooksBorrowDTO booksBorrowDTO) {
        /**
         *  1.接受前端请求中的参数(借阅证号、图书编号、借阅时间)
         *  2.先根据借阅证号查询是否有此用户存在,不存在直接返回错误信息
         *  3.用户存在,根据图书编号查询图书表,查询是否有图书存在并且该图书的状态是未借出
         *  4.用户存在,图书存在,且未借出 说明可以借出该图书
         *  5.#获取用户的规则编号#,根据编号查询出规则(判断空),获取规则的可借天数
         *  6.设置期限天数为当前时间+规则的可借天数 设置归还日期为空
         *  7.调用bookBorrow,进行插入记录
         *  8.如果插入成功,修改在图书表中对应图书编号的状态为已借出
         *  9.判断是否更新成功
         *  10.插入成功+更新成功,则返回请求状态码200和请求信息
         */
        // 图书编号
        Integer bookNumber = booksBorrowDTO.getBookNumber();
        // 借阅证号
        Long cardNumber = booksBorrowDTO.getCardNumber();
        // 借阅时间
        LocalDateTime borrowDate = booksBorrowDTO.getBorrowDate();
        LambdaQueryWrapper<Users> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Users::getCardNumber, cardNumber);
        Users users = usersMapper.selectOne(queryWrapper);
        if (users == null) {
            return false;
        }
        LambdaQueryWrapper<Books> queryWrapper1 = new LambdaQueryWrapper<>();
        queryWrapper1.eq(Books::getBookNumber, bookNumber);
        Books book = booksMapper.selectOne(queryWrapper1);
        if ((book == null) || (book.getBookStatus().equals(Constant.BOOKDISABLE))) {
            return false;
        }

        // 规则编号
        Integer ruleNumber = users.getRuleNumber();
        LambdaQueryWrapper<BookRule> queryWrapper2 = new LambdaQueryWrapper<>();
        queryWrapper2.eq(BookRule::getBookRuleId, ruleNumber);
        BookRule bookRule = bookRuleMapper.selectOne(queryWrapper2);
        if (bookRule == null) {
            return false;
        }
        // 可借天数
        Integer bookDays = bookRule.getBookDays();
        LocalDateTime closeDate = borrowDate.plusDays(bookDays);
        BooksBorrow booksBorrow1 = new BooksBorrow();
        booksBorrow1.setBorrowId(null);
        booksBorrow1.setBookNumber(bookNumber);
        booksBorrow1.setCardNumber(cardNumber);
        booksBorrow1.setBorrowDate(borrowDate);
        booksBorrow1.setCloseDate(closeDate);
        booksBorrow1.setReturnDate(null);
        boolean flag = this.save(booksBorrow1);
        if (!flag) {
            return false;
        }
        book.setBookStatus(Constant.BOOKDISABLE);
        int update = booksMapper.update(book, queryWrapper1);
        if (update==0) {
            return false;
        }
        Violation violation = new Violation();
        BeanUtils.copyProperties(booksBorrow1, violation, "borrowId");
        violation.setViolationId(null);
        violation.setViolationMessage("");
        violation.setBookNumber(book.getBookNumber());
        violation.setViolationAdminId(booksBorrowDTO.getBookAdminId());
        int save = violationMapper.insert(violation);
        if (save==0) {
            return false;
        }
       return true;
    }

前端

在\compone\BookManage\下建立BorrowBook.vue

在compone\ManageHome.vue中添加

          <el-menu-item index="borrowbook" @click="saveNavState('borrowbook')">
            <i class="el-icon-collection"></i>
            <span slo="title">借阅图书</span>
          </el-menu-item>

在route下的index.js添加:

import BorrowBook from '../components/BookManage/BorrowBook.vue'

{ path: '/borrowbook', component: BorrowBook },

 BorrowBook.vue

<template>
  <div class="borrowbook_container">
    <div class="header"><p>借阅图书 </p></div>
    <div class="banner">
      
    借阅证号:<br> <el-select v-model.number="borrowInfo.cardNumber"  placeholder="请选择借阅证号">
    <el-option
      v-for="item in cardNumbers"
      :key="item"
      :label="item"
      :value="item">
    </el-option>
  </el-select>
   图书编号:<br> <el-select v-model.number="borrowInfo.bookNumber"  placeholder="请选择图书编号">
    <el-option
      v-for="item in userNumbers"
      :key="item"
      :label="item"
      :value="item">
    </el-option>
  </el-select>
     
      <!-- <div class="card_number">
        <el-input placeholder="请输入借阅证号" v-model.number="borrowInfo.cardNumber">
          <el-button slot="prepend" icon="el-icon-notebook-2"></el-button>
        </el-input>
      </div> -->
      <!-- <div class="book_number">
        <el-input placeholder="请输入图书编号" v-model.number="borrowInfo.bookNumber">
          <el-button slot="prepend" icon="el-icon-collection"></el-button
        ></el-input>
      </div> -->
      <div class="borrow_date">
        <el-date-picker
          v-model="borrowInfo.borrowDate"
          type="datetime"
          placeholder="选择日期时间"
          default-time="12:00:00"
          value-format="yyyy-MM-dd HH:mm:ss"
        >
        </el-date-picker>
      </div>
      <div class="borrow_button">
        <el-button type="primary" @click="borrowBook">借阅</el-button>
      </div>
    </div>
  </div>
</template>

<script>

export default {
  data() {
    return {
        value: '',
        userNumbers:[],
      cardNumbers:[],
      borrowInfo: {
        cardNumber: "",
        bookNumber: "",
        borrowDate: "",
        bookAdminId:0
      },
    };
  },
  methods: {
    async borrowBook(){
      // console.log(this.borrowInfo.borrowDate);
      this.borrowInfo.bookAdminId = parseInt(window.sessionStorage.getItem('bookAdminId')) 
      const {data:res} = await this.$http.post('booksBorrow/borrowBook',this.borrowInfo)
      // console.log(res);
      if(res.status !== 200){
        return this.$message.error(res.msg)
      }
      this.$message.success(res.msg)
      // 清空数据
      this.borrowInfo.bookNumber = "";
      this.borrowInfo.cardNumber = "";
      this.borrowInfo.borrowDate = "";
    },
      async getAllCardNumber(){
      // console.log(this.borrowInfo.borrowDate);
      this.cardNumbers=[];
      const {data:res} = await this.$http.get('/users/getAllCardNumber')
      if(res.status !== 200){
        return this.$message.error(res.msg)
      }
      this.$message.success(res.msg);
      this.cardNumbers=res.data;
      console.log(123)
      console.log(this.cardNumbers)
    },
    async getAllNotBorrowBook(){
      // console.log(this.borrowInfo.borrowDate);
      this.userNumbers=[];
      const {data:res} = await this.$http.get('/books/getAllNotBorrowBook')
      if(res.status !== 200){
        return this.$message.error(res.msg)
      }
      this.$message.success(res.msg);
      this.userNumbers=res.data;
      console.log(123)
      console.log(this.cardNumbers)
    }
    
  },
  
    created() {
    this.getAllCardNumber();
    this.getAllNotBorrowBook();
  },
};
</script>

<style lang="less" scoped>
.borrowbook_container {
  display: flex;
  flex-direction: column;
  align-items: center;
  .header {
    width: 100%;
    height: 100px;
    // background-color: pink;
    p {
      color: black;
      font-size: 30px;
      text-align: center;
      line-height: 60px;
    }
  }
  .banner {
    display: flex;
    flex-direction: column;
    align-items: center;
    width: 60%;
    height: 400px;
    // background-color: brown;
    div {
      margin-top: 15px;
      // margin-left: ;
    }
    .borrow_date {
      margin-left: 8px;
    }
    .borrow_button {
      margin-top: 30px;
    }
  }
}
</style>

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

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

相关文章

Spring Boot 启动注解分析

文章目录 1. SpringBootApplication2. EnableAutoConfiguration3. AutoConfigurationImportSelector3.1 isEnabled3.2 getCandidateConfigurations 3.3 removeDuplicates3.4 getExclusions3.5 checkExcludedClasses3.6 removeAll3.7 filter 虽然我们在日常开发中&#xff0c;S…

【Golang】golang中http请求的context传递到异步任务的坑

文章目录 前言一、HTTP请求的Context传递到异步任务的坑 前言 在golang中&#xff0c;context.Context可以用来用来设置截止日期、同步信号&#xff0c;传递请求相关值的结构体。 与 goroutine 有比较密切的关系。 在web程序中&#xff0c;每个Request都需要开启一个goroutin…

使用docker部署nginx并支持https

配置nginx支持https&#xff0c;其实也简单&#xff0c;搞个证书&#xff0c;然后修改下配置文件就好了。我以前一篇文章&#xff08;使用docker部署多个nginx站点并配置负载均衡&#xff09;为例&#xff0c;做个记录。 如前所述&#xff0c;我使用docker&#xff0c;部署了3…

一文带你看懂软件测试(功能、接口、性能、自动化)详解

全文2000字&#xff0c;预计阅读时间10分钟&#xff0c;建议先点赞收藏慢慢看 一、软件测试功能测试 测试用例编写是软件测试的基本技能&#xff1b;也有很多人认为测试用例是软件测试的核心&#xff1b;软件测试中最重要的是设计和生成有效的测试用例&#xff1b;测试用例是测…

面了个京东拿30k出来的,牛逼到家了。。。

今天上班开早会就是新人见面仪式&#xff0c;听说来了个很厉害的大佬&#xff0c;年纪还不大&#xff0c;是上家公司离职过来的&#xff0c;薪资已经达到中高等水平&#xff0c;很多人都好奇不已&#xff0c;能拿到这个薪资应该人不简单&#xff0c;果然&#xff0c;自我介绍的…

RK平台如何配置USB功能

简介 RK平台基本能够通过dts配置就能实现USB功能。为了方便理解&#xff0c;我这里分三部分来介绍&#xff0c;包括&#xff1a;usb-phy&#xff0c;usb控制器&#xff0c;usb供电。 usb-phy usb-phy负责最底层的信号转换&#xff0c;主要是硬件的差分信号转换成数字信号传给…

十条ChatGPT常用的Prompt

Prompt 本文数据来源&#xff1a;Will 3.6-6.16 硅谷&#xff0c;原作者&#xff1a;rowancheung 一&#xff0c;简化复杂的信息 Prompt&#xff1a; 将&#xff08;主题&#xff09;分解成更小、更容易理解的部分。使用类比和现实生活中的例子来简化概念并使其更相关 Brea…

Python之并发多线程操作

一、threading模块介绍 multiprocess模块的完全模仿了threading模块的接口&#xff0c;二者在使用层面&#xff0c;有很大的相似性 二、开启线程的两种方式 方式一 #方式一 from threading import Thread import time def sayhi(name):time.sleep(2)print(%s say hello %na…

最大公约数(GCD) 与 最小公倍数(LCM)的 定义、关系、求法

最大公约数 与 最小公倍数 约数 和 倍数最大公约数最小公倍数 最大公约数与最小公倍数的关系求最大公约数、最小公倍数例一例二 约数 和 倍数 如果数 a a a能被数 b b b整除&#xff0c; a a a就叫做 b b b的倍数&#xff0c; b b b就叫做 a a a的约数。 约数和倍数都表示一个…

从0-1实战react项目

文章目录 1. 安装2. 完成一个组件开发3. 添加路由3. 引入element-react1. 运行发现报错./node_modules/element-react/dist/npm/es5/src/locale/format.js2. 接着又报错The <Router /> component appears to be a function component that returns a class instance. Cha…

[SpringBoot]关于Profile配置文件关于Slf4j日志

关于Profile配置文件 在Spring系列框架中&#xff0c;关于配置文件&#xff0c;允许同时存在多个配置文件&#xff08;例如同时存在a.yml、b.yml等&#xff09;&#xff0c;并且&#xff0c;你可以按需切换某个配置文件&#xff0c;这些默认不生效、需要被激活才生效的配置&am…

【ProtoBuf】protobuf序列化协议

Protobuf介绍 Protobuf (Protocol Buffers) 是谷歌开发的一款无关平台&#xff0c;无关语言&#xff0c;可扩展&#xff0c;轻量级高效的序列化结构的数据格式&#xff0c;用于将自定义数据结构序列化成字节流&#xff0c;和将字节流反序列化为数据结构。所以很适合做数据存储…

容器底层实现技术

一、Namespace 和 Cgroup 1、容器技术发展历史 2、Docker 容器实现原理 1. Docker 容器在实现上通过 namespace 技术实现进程隔离&#xff0c; 通过Cgroup 技术实现容器进程可用资源的限制 3、Namespace Namespace &#xff1a;命名空间 1. 作用&#xff1a;资源隔离 2. 原理&…

web前端课程作业设计:个人简历

一.说明 今天博主的web前端选修课结课了&#xff0c;期末大作业也提交了&#xff0c;今天写一篇博客把我的大作业分享给大家。 二.题目 1. 大作业题目 个人简历主页设计 2. 内容要求 应尽量包含以下内容&#xff1a; 包含个人基本信息、教育背景、个人风采、与我联系四块…

企业四要素核验-企业四要素核验接口-api接口

接口地址&#xff1a; https://登录后显示/pyi/184/358(支持:http/https)) 在线查询&#xff1a;https://www.wapi.cn/api_detail/184/358.html 网站地址&#xff1a;https://www.wapi.cn 返回格式&#xff1a;json,xml 请求方式&#xff1a;GET,POST 请求说明&#xff1a; …

【实用篇】Elasticsearch01

分布式搜索引擎01 – elasticsearch基础 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 例如&#xff1a; 在GitHub搜索…

智慧公厕系统如何通过物联网技术提高公厕的管理效率

智慧公厕系统可以通过物联网技术&#xff0c;实现公共卫生间的智能化管理和服务&#xff0c;提高管理效率。本文将详细介绍智慧公厕系统如何通过物联网技术提高公共卫生间的管理效率&#xff0c;从硬件、软件、系统等方面逐一分析。 XP-智慧厕所方案-HYF20230328&#xff08;16…

工业企业为什么要用边缘计算网关?

在我们进入智能制造和工业4.0的新时代&#xff0c;工业企业的数据需求正急速增长。传感器&#xff0c;机器和设备每分钟都在产生大量数据&#xff0c;它们对实时处理和分析的需求比以往任何时候都要强烈。这就是为什么工业企业需要边缘计算网关。 边缘计算网关在物联网架构中担…

大数据:Apache hive分布式sql计算平台,hive架构,hive部署,hive初体验

大数据&#xff1a;Apache hive分布式sql计算平台 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&a…

Java002——JDK的安装以及配置环境变量

为什么要安装jdk 1、JDK 全称 Java Development Kit&#xff0c;意为 Java 开发工具。&#xff0c;要想开发java程序就必须安装JDK。没有JDK的话&#xff0c;无法编译运行Java程序。 2、JDK包含的基本组件包括以下文件&#xff1a;   javac.exe,用于编译java文件&#xff0c…