‘老生常谈’ - 图书管理系统

news2024/11/19 8:47:54

在软件开发中,增、删、改、查这几个业务非常常见

基于axios从服务器拿到需要数据,进行渲染、封装,新增数据并不是一条一条渲染,而是整体重新渲染;

对于该系统新增数据:收集表单数据、提交服务器保存 ->重新获取列表

对于删除数据,事件委托,请求服务器删除数据,重新渲染界面

获取id ->调用删除接口->重新渲染

调用删除接口,需要id信息,但不能更改(最好隐藏);收集修改信息,提交给接口

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="shortcut icon" href="https://www.bilibili.com/favicon.ico">
  <link rel="stylesheet" href="../bootstrap-5.3.0-alpha1-dist/css/bootstrap.min.css">

  <style>
    @font-face {
      font-family: 'icomoon';
      src: url('fonts/icomoon.eot?au9n7q');
      src: url('fonts/icomoon.eot?au9n7q#iefix') format('embedded-opentype'),
        url('fonts/icomoon.ttf?au9n7q') format('truetype'),
        url('fonts/icomoon.woff?au9n7q') format('woff'),
        url('fonts/icomoon.svg?au9n7q#icomoon') format('svg');
      font-weight: normal;
      font-style: normal;
      font-display: block;
    }

    thead {
      background-color: rgba(119, 119, 119, 0.746);
      color: #fff;
    }

    .box {
      width: 900px;
      margin: 50px auto;
      position: relative;
    }

    .btn1 {
      width: 50px;
      height: 20px;
      background-color: #2d4acd;
      color: #fff;
      position: absolute;
      right: 0px;
      padding: 0;
      font-size: 10px;
      line-height: 8px;
      top: 9px;
    }

    .del {
      color: red;
    }

    .edit {
      color: rgb(11, 196, 196);
    }

    .del,
    .edit {
      cursor: pointer;
    }

    .form-control {
      width: 80%;
    }

    .box1 {
      margin: 12px;
      margin-right: 10px;
    }
  </style>
</head>

<body>

  <div class="modal fade myModal" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel"
    aria-hidden="true">
    <div class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <h1 class="modal-title fs-5" id="exampleModalLabel">添加图书</h1>
          <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
        </div>

        <form class="modal-body">
          <div class="box1">
            <label class="form-label" style="font-weight: bold;">书名</label>
            <input type="text" name="bookname" class="form-control">
          </div>

          <div class="box1">
            <label class="form-label" style="font-weight: bold;">作者</label>
            <input type="text" name="author" class="form-control">
          </div>

          <div class="box1">
            <label class="form-label" style="font-weight: bold;">出版社</label>
            <input type="text" name="publisher" class="form-control">
          </div>
        </form>

        <div class="modal-footer">
          <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
          <button type="button" class="btn btn_save btn-primary">Save changes</button>
        </div>
      </div>
    </div>
  </div>

  <div class="box">

    <button type="button" class="btn1 btn-primary" data-toggle="modal" data-target="#exampleModal">
      +添加
    </button>

    <h2 class="sub-header">图书管理</h2>

    <table class="table table-striped">
      <thead>
        <tr>
          <th>#</th>
          <th>书名</th>
          <th>作者</th>
          <th>出版社</th>
          <th style="width: 180px;">操作</th>
        </tr>
      </thead>
      <tbody>
      </tbody>
    </table>
  </div>


  <div class="modal fade myModal2" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel"
    aria-hidden="true">
    <div class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <h1 class="modal-title fs-5" id="exampleModalLabel">编辑图书</h1>
          <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
        </div>

        <form class="save_modal-body">
          <input type="hidden" name="id" class="form-control">
          <div class="box1">
            <label class="form-label" style="font-weight: bold;">书名</label>
            <input type="text" name="bookname" class="form-control bookname" value="">
          </div>

          <div class="box1">
            <label class="form-label" style="font-weight: bold;">作者</label>
            <input type="text" name="author" class="form-control author" value="">
          </div>

          <div class="box1">
            <label class="form-label" style="font-weight: bold;">出版社</label>
            <input type="text" name="publisher" class="form-control publisher" value="">
          </div>
        </form>

        <div class="modal-footer">
          <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
          <button type="button" class="btn edit_btn_save btn-primary">Save changes</button>
        </div>
      </div>
    </div>
  </div>

  <script src="../form-serialize.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  <script src="../bootstrap-5.3.0-alpha1-dist/js/bootstrap.min.js"></script>
  <script>

    const save = document.querySelector('.btn_save')
    const myModal = document.querySelector('.myModal')
    const modal = new bootstrap.Modal(myModal)
    const add = document.querySelector('.btn1')
    const tbody = document.querySelector('tbody')
    const form = document.querySelector('.modal-body')
    const creator = 'wwx'

    const save_form = document.querySelector('.save_modal-body')
    const myModal2 = document.querySelector('.myModal2')
    const modal2 = new bootstrap.Modal(myModal2)
    const edit_save = document.querySelector('.edit_btn_save')

    function render() {
      axios({
        url: 'http://hmajax.itheima.net/api/books',
        params: {
          creator
        }
      }).then(result => {
        console.log(result)
        const booklist = result.data.data.map((item, index) => {
          return `
          <tr>
          <td class="b_id">${index + 1}</td>
          <td class="b_name">${item.bookname}</td>
          <td class="writer">${item.author}</td>
          <td class="press">${item.publisher}</td>
          <td data-id="${result.data.data[index].id}">
            <span class="del">删除</span>
            &nbsp;&nbsp;
            <span class="edit">编辑</span>
          </td>
        </tr>
          `
        }).join('')
        tbody.innerHTML = booklist
      })
    }

    render()



    //添加图书
    add.addEventListener('click', function () {
      modal.show()
    })

    tbody.addEventListener('click', function (e) {
      if (e.target.classList.contains('del')) {
        const id = e.target.parentNode.dataset.id
        axios({
          url: `http://hmajax.itheima.net/api/books/${id}`,
          method: 'delete'
        }).then(result => {
          render()
        })
      }
    })

    save.addEventListener('click', function () {
      const bookobj = serialize(form, { hash: true, empty: true })
      axios({
        url: 'http://hmajax.itheima.net/api/books',
        method: 'post',
        data: {
          ...bookobj,
          creator
        }
      }).then(result => {
        render()
        form.reset()
        modal.hide()
      })

    })



    //编辑图书
    tbody.addEventListener('click', function (e) {
      if (e.target.classList.contains('edit')) {
        const id = e.target.parentNode.dataset.id
        document.querySelector('[name=id]').value = id
        axios({
          url: `http://hmajax.itheima.net/api/books/${id}`
        }).then(result => {
          const bookobj = result.data.data
          document.querySelector('.save_modal-body .bookname').value = bookobj.bookname
          document.querySelector('.save_modal-body .author').value = bookobj.author
          document.querySelector('.save_modal-body .publisher').value = bookobj.publisher
        })
        modal2.show()
      }
    })

    edit_save.addEventListener('click', function (e) {
      const bookobj = serialize(save_form, { hash: true, empty: true })
      const { id } = bookobj
      console.log(bookobj)
      axios({
        url: `http://hmajax.itheima.net/api/books/${id}`,
        method: 'put',
        data: {
          ...bookobj,
          creator
        }
      }).then(result => {
        render()
        modal2.hide()
      })

    })


  </script>
</body>

</html>

效果:

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

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

相关文章

C++ 实战项目之 Boost 搜索引擎

项目地址&#xff1a;https://gitee.com/Vertas/boost-searcher-project 1. 项目背景 日常生活中我们使用过很多搜索引擎&#xff0c;比如百度&#xff0c;搜狗&#xff0c;360搜索等。我们今天是要实现一个像百度这样的搜索引擎嘛&#xff1f;那是不可能的&#xff0c;因为像…

听 GPT 讲 client-go 源代码 (24)

分享更多精彩内容&#xff0c;欢迎关注&#xff01; File: client-go/applyconfigurations/batch/v1/jobstatus.go 在client-go的applyconfigurations/batch/v1/jobstatus.go文件中&#xff0c;定义了与Job的状态相关的配置和操作。 文件中定义了以下几个结构体&#xff1a; Jo…

投标中项目组织结构的设置以及调整(样式表,多级列表)

投标中项目组织结构的设置以及调整&#xff08;样式表&#xff0c;多级列表&#xff09;&#xff1a; 投标项目中需要处理大规模的文字排版&#xff0c;就是需要用到样式表&#xff08;解决层级关系&#xff09;&#xff0c;多级列表&#xff08;解决自动编号的问题&#xff0…

WatiN——Web自动化测试(三)【弹出窗口处理】

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Day25:安全开发-PHP应用文件管理模块包含上传遍历写入删除下载安全

目录 PHP文件操作安全 文件包含 文件删除 文件编辑 文件下载 云产品OSS存储对象去存储文件(泄漏安全) 思维导图 PHP知识点 功能&#xff1a;新闻列表&#xff0c;会员中心&#xff0c;资源下载&#xff0c;留言版&#xff0c;后台模块&#xff0c;模版引用&#xff0c;框…

7个实用的CSS技巧

1. First letter drop 首字母丢失 我们可以使用 :first-letter 来删除文本的第一个字母&#xff1a; p:first-letter {font-size: 200%;color: #8A2BE2; }:first-letter 选择器用于指定元素的首字母样式&#xff0c;它仅适用于块级元素。效果如下: codepen.io/OMGZui/pen/… …

Qt 5.14.2 网络编程揭秘:构建高效HTTP客户端与文件下载器

引言 在当今的软件开发世界中&#xff0c;网络通信已成为不可或缺的一部分。Qt&#xff0c;作为一个跨平台的C框架&#xff0c;为我们提供了强大的网络编程能力。本文将带你深入Qt的网络模块&#xff0c;探索如何使用QNetworkAccessManager、QNetworkRequest和QNetworkReply等核…

读《文明之光》第1册总结

人类几千年的文明史和地球的历史相比&#xff0c;实在是太短暂了&#xff0c;大约相当于几分钟和一年的关系。人类已经走过的路&#xff0c;相比今后要走的漫漫长路&#xff0c;只能算是刚刚起步。如果跳出一个个具体事件&#xff0c;站在历史的高度去看&#xff0c;我们会发现…

找出单身狗1,2

目录 1. 单身狗12. 单身狗2 1. 单身狗1 题目如下&#xff1a; 思路&#xff1a;一部分人可能会使用对数组排序&#xff0c;遍历数组的方式去找出只出现一次的数字&#xff0c;但这种方法的时间复杂度过高&#xff0c;有时候可能会不满足要求。 有一种十分简便的方法是使用异或…

类与对象(三)--static成员、友元

文章目录 1.static成员1.1概念&#x1f3a7;面试题✒️1.2static的特性&#x1f3a7;1.3思考&#x1f3a7; 2.友元2.1什么是友元&#xff1f;&#x1f3a7;2.2两种友元关系&#xff1a;&#x1f3a7; 1.static成员 1.1概念&#x1f3a7; &#x1f50e; static关键字用于声明类…

Python教程,python从入门到精通 第1天 温习笔记

1.1 字面量 1.2 注释 1.3 变量 1.4 数据类型 1.5 数据类型转换 1.6 标识符 1.7 运算符 1.8 字符串的三种定义方式 1.9 字符串拼接 1.10 字符串格式化 1.11 掌握格式化字符串的过程中做数字的精度控制 1.12 掌握快速字符串格式化的方式 1.13 字符串格式化&#xff0d;表达式的格…

动态规划基础模型总结

前言 动态规划是用一个数来表示一堆状态&#xff0c;可以看成是对暴搜的优化 暴搜一个一个数枚举过去&#xff0c;但DP是一堆堆数枚举&#xff0c;效率会快很多&#xff1b; 状态数用几维表示&#xff1a;从小到大考虑&#xff0c;看怎么样才能够让答案清楚表达出来 需要一定的…

下载一些ROS的包的方式

ROS Index 我们可以去ROS Index网站下载一些我们需要的包。打开浏览器在网址框输入index.ros.org。或者点击此处链接ROS Index 在这个网站中我们可以浏览并找到我们需要的包&#xff0c;也可以下载它的源代码或者仅安装到我们的系统中来使用。&#xff08;安装过程在终端中进行…

LeetCode的使用方法

LeetCode的使用方法 一、LeetCode是什么&#xff1f;1.LeetCode简介2.LeetCode官网 二、LeetCode的使用方法1.注册账号2.力扣社区力扣编辑器 2.1 讨论发起讨论参与讨论关注讨论 2.2 文章撰写文章关注文章 3.力扣面试官版测评面试招聘竞赛 4.力扣学习LeetBook 书架我的阅读猜您喜…

【PyTorch】进阶学习:探索BCEWithLogitsLoss的正确使用---二元分类问题中的logits与标签形状问题

【PyTorch】进阶学习&#xff1a;探索BCEWithLogitsLoss的正确使用—二元分类问题中的logits与标签形状问题 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、Py…

智能指针基础知识【C++】【RAII思想 || unique_ptr || shared_ptrweak_ptr || 循环引用问题】

目录 一&#xff0c;为什么需要智能指针 二&#xff0c;内存泄露的基本认识 1. 内存泄露分类 2. 常见的内存检测工具 3&#xff0c;如何避免内存泄露 三&#xff0c;智能指针的使用与原理 1. RAII思想 2. 智能指针 &#xff08;1. unique_ptr &#xff08;2. shared_…

【重制版】WSDM 2024 2023时空时序论文总结

&#x1f31f;【紧跟前沿】“时空探索之旅”与你一起探索时空奥秘&#xff01;&#x1f680; 欢迎大家关注时空探索之旅 WSDM 2024于2024年3月4日-3月8日在墨西哥梅里达&#xff08;Mrida, Mxico&#xff09;正在举行。目前官网已经放出了所有被录用论文的表单&#xff08;链接…

2024037期传足14场胜负前瞻

2024037期售止时间为3月9日&#xff08;周六&#xff09;20点00分&#xff0c;敬请留意&#xff1a; 本期深盘多&#xff0c;1.5以下赔率4场&#xff0c;1.5-2.0赔率5场&#xff0c;其他场次是平半盘、平盘。本期14场整体难度中等。以下为基础盘前瞻&#xff0c;大家可根据自身…

干货 | MSC细胞培养 “秘籍”

MSC培养细节&#xff0c;这里有您想知道的~ MSC&#xff1a;间充质干细胞&#xff0c;是一群贴壁生长、形态类似于成纤维细胞的多能成体干细胞&#xff0c;存在于脐带、骨髓和脂肪组织等多种组织中&#xff0c;并且可以分化成多种不同的组 实验数据分享 1、样本&#xff1a;冻…

ChatGLM:CPU版本如何安装和部署使用

前段时间想自己部署一个ChatGLM来训练相关的物料当做chatgpt使用&#xff0c;但是奈何没有gpu机器&#xff0c;只能使用cpu服务器尝试使用看看效果 我部署的 Chinese-LangChain 这个项目&#xff0c;使用的是LLM&#xff08;ChatGLM&#xff09;embedding(GanymedeNil/text2vec…