图书管理案例

83 阅读1分钟

html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <!-- 引入 lib 目录下的 bootstrap 样式表 -->
    <link rel="stylesheet" href="./lib/bootstrap-v4.6.0.css" />
    <style>
      :root {
        font-size: 15px;
      }

      body {
        padding-top: 15px;
      }
    </style>
  </head>

  <body>
    <!-- 栅格系统 -->
    <div class="container-fluid">
      <!-- 栅格系统中的一行 -->
      <div class="row">
        <!-- 左侧的表格,占了 8 列 -->
        <div class="col-sm-8">
          <table
            class="table table-bordered table-striped table-dark table-hover text-center"
          >
            <thead>
              <!-- 表头行 -->
              <tr>
                <th scope="col">Id</th>
                <th scope="col">书名</th>
                <th scope="col">作者</th>
                <th scope="col">出版社</th>
                <th scope="col">操作</th>
              </tr>
            </thead>
            <tbody>
              <!-- 表格中的每一行 -->
              <!-- <tr>
                <th scope="row">xxx</th>
                <td>xxx</td>
                <td>xxx</td>
                <td>xxx</td>
                <td>
                  <button type="button" class="btn btn-link btn-sm">
                    删除
                  </button>
                </td>
              </tr> -->
            </tbody>
          </table>
        </div>

        <!-- 右侧的添加区域,占了 4 列 -->
        <div class="col-sm-4">
          <!-- 添加图书的卡片 -->
          <div class="card text-white bg-secondary sticky-top">
            <div class="card-header">添加新图书</div>
            <form class="card-body bg-light" id="addForm">
              <!-- 书名 -->
              <div class="input-group mb-3">
                <div class="input-group-prepend">
                  <span class="input-group-text">书名</span>
                </div>
                <input
                  type="text"
                  class="form-control"
                  placeholder="请输入图书名称"
                  name="bookname"
                />
              </div>
              <!-- 作者 -->
              <div class="input-group mb-3">
                <div class="input-group-prepend">
                  <span class="input-group-text">作者</span>
                </div>
                <input
                  type="text"
                  class="form-control"
                  placeholder="请输入作者名字"
                  name="author"
                />
              </div>
              <!-- 出版社 -->
              <div class="input-group mb-3">
                <div class="input-group-prepend">
                  <span class="input-group-text">出版社</span>
                </div>
                <input
                  type="text"
                  class="form-control"
                  placeholder="请输入出版社名称"
                  name="publisher"
                />
              </div>
              <!-- 添加按钮 -->
              <!-- submit有默认的提交行为,后期我们需要在axios操作时候阻止默认行为 -->
              <button class="btn btn-dark btnadd" type="submit">添加</button>
            </form>
          </div>
        </div>
      </div>
    </div>

    <!-- 编辑模态框 -->
    <div
      class="modal fade"
      id="myModal"
      tabindex="-1"
      role="dialog"
      aria-labelledby="myModalLabel"
    >
      <div class="modal-dialog" role="document">
        <div class="modal-content">
          <div class="modal-header">
            <button
              type="button"
              class="close"
              data-dismiss="modal"
              aria-label="Close"
            >
              <span aria-hidden="true">&times;</span>
            </button>
            <h4 class="modal-title" id="myModalLabel">编辑图书</h4>
          </div>
          <div class="modal-body">
            <form>
              <div class="form-group row">
                <label for="bookname" class="col-sm-2 col-form-label"
                  >书名</label
                >
                <div class="col-sm-10">
                  <input
                    type="text"
                    class="form-control"
                    id="bookname"
                    placeholder="请输入书名"
                  />
                </div>
              </div>
              <div class="form-group row">
                <label for="author" class="col-sm-2 col-form-label">作者</label>
                <div class="col-sm-10">
                  <input
                    type="text"
                    class="form-control"
                    id="author"
                    placeholder="请输入作者"
                  />
                </div>
              </div>
              <div class="form-group row">
                <label for="publisher" class="col-sm-2 col-form-label"
                  >出版商</label
                >
                <div class="col-sm-10">
                  <input
                    type="text"
                    class="form-control"
                    id="publisher"
                    placeholder="请输入出版商"
                  />
                </div>
              </div>
            </form>
          </div>
          <div class="modal-footer">
            <button type="button" class="btn btn-default" data-dismiss="modal">
              取消
            </button>
            <button type="button" class="btn btn-primary btnConfirm">确定</button>
          </div>
        </div>
      </div>
    </div>

    <script src="./lib/axios.js"></script>
    <script src="./lib/jquery.js"></script>
    <script src="./lib/bootstrap-4.6.1-dist/js/bootstrap.js"></script>
    <script src="./js/index.js"></script>
  </body>
</html>

js

$(function() {
  // 获取元素
  let tbody = document.querySelector('tbody')
  let btnadd = document.querySelector('.btnadd')
  let editbookname = document.querySelector('#bookname')
  let editauthor = document.querySelector('#author')
  let editpublisher = document.querySelector('#publisher')
  let btnConfirm = document.querySelector('.btnConfirm')
  // 书名
  let bookname = document.querySelector('[name="bookname"]')
  // 作者
  let author = document.querySelector('[name="author"]')
  // 出版商
  let publisher = document.querySelector('[name="publisher"]')
  // 1.页面加载实现数据的动态渲染
  // 套路:axios请求,接收响应数据,遍历拼接生成动态结构
  // 获取所有图书的接口信息:
  // url:  http://www.itcbc.com:3006/api/getbooks
  // 请求方式: GET
  function init() {
    axios({
      url: 'http://www.itcbc.com:3006/api/getbooks',
      method: 'get'
    }).then(result => {
      let htmlStr = ''
      result.data.data.forEach(function(value, index) {
        htmlStr += `<tr>
                    <th scope="row">${index + 1}</th>
                    <td>${value.bookname}</td>
                    <td>${value.author}</td>
                    <td>${value.publisher}</td>
                    <td>
                      <button type="button" class="btn btn-link btn-sm btndel" data-id='${
                        value.id
                      }'>
                        删除
                      </button>
                      <button type="button" class="btn btn-link btn-sm btnedit" data-bookname='${
                        value.bookname
                      }' data-author='${value.author}' data-publisher='${
          value.publisher
        }' data-id='${value.id}'>
                        编辑
                      </button>
                    </td>
                  </tr>`
      })
      tbody.innerHTML = htmlStr
    })
  }

  init()

  // 实现图书的新增
  // url:  http://www.itcbc.com:3006/api/addbook
  // 请求方式: post
  // 新增的固定套路
  // 1.准备好后台接口所需要的数据:一定要参照接口要求生成数据,特别是数据的键
  // 2.axios请求,传递参数
  // 3.接收响应数据,进行用户提示,重新渲染
  btnadd.addEventListener('click', function(e) {
    e.preventDefault()
    // 点击按钮之后再获取表单元素的数据
    let data = {
      bookname: bookname.value,
      author: author.value,
      publisher: publisher.value
    }
    axios({
      url: 'http://www.itcbc.com:3006/api/addbook',
      method: 'post',
      // post,put,patch的 参数传递都是使用data选项
      data
    }).then(result => {
      if (result.data.status == 0) {
        alert(result.data.message)
        bookname.value = author.value = publisher.value = ''
        // 重新渲染列表结构
        init()
      } else {
        alert('图书添加失败')
      }
    })
  })

  // 3.实现图书的删除
  // url:  http://www.itcbc.com:3006/api/delbook
  // 请求方式: DELETE
  // 参数:当前你想删除和的图书的id
  // 删除的套路:准备好数据id,axios请求传递id,接收响应结果给出用户提示,重新渲染
  // 动态生成的元素的事件绑定一定要使用事件委托
  tbody.addEventListener('click', function(e) {
    // contains:判断元素是否包含某个名称的类样式
    if (e.target.classList.contains('btndel')) {
      if (confirm('请问是否真的需要抛弃我?')) {
        let id = e.target.dataset.id
        axios({
          url: 'http://www.itcbc.com:3006/api/delbook',
          method: 'DELETE',
          params: {
            id
          }
        }).then(result => {
          if (result.data.status == 0) {
            alert(result.data.message)
            // 重新渲染列表结构
            init()
          } else {
            alert('图书删除失败')
          }
        })
      }
    }
  })

  // 4.实现图书的修改
  let id
  // 4.1 弹出编辑模态框,填充默认数据
  tbody.addEventListener('click', function(e) {
    if (e.target.classList.contains('btnedit')) {
      let data = e.target.dataset
      // 将id存储到全局变量
      id = data.id
      // 展示模态框
      $('#myModal').modal('show')
      editbookname.value = data.bookname
      editauthor.value = data.author
      editpublisher.value = data.publisher
    }
  })
  // 4.2 实现编辑功能:axios
  btnConfirm.addEventListener('click', function() {
    let data = {
      id: id,
      bookname: editbookname.value,
      author: editauthor.value,
      publisher: editpublisher.value
    }
    axios({
      url: 'http://www.itcbc.com:3006/api/updatebook',
      method: 'PUT',
      // post,put,patch的 参数传递都是使用data选项
      data
    }).then(result => {
      if (result.data.status == 0) {
        alert(result.data.message)
        bookname.value = author.value = publisher.value = ''
        $('#myModal').modal('hide')
        // 重新渲染列表结构
        init()
      } else {
        alert('图书编辑失败')
      }
    })
  })
})