基于bootStrap、axios、form-serialize的图书管理系统

效果图如下:

 

 

 

html文件

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>图书管理系统</title>
    <!--引入Bootstrap.css-->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
    <!--引入核心样式-->
    <link href="./css/index.css" rel="stylesheet">
</head>
<body>
    <!--主体区域-->
    <div class="container">
         <div class="top">
           <div class="top-left">
            <h3>图书管理</h3>
           </div>
           <div class="top-right">
            <!--通过属性控制弹框的显示或隐藏-->
            <button type="button" data-bs-toggle="modal" data-bs-target=".add-modal" style="background-color:#539ACB"> + 添加</button>
           </div>
         </div>
         <!--数据列表-->
         <table class="table">
          <thead class="table-light">
               <tr>
                <th style="width:150px;">序号</th>
                <th>书名</th>
                <th>作者</th>
                <th>出版社</th>
                <th style="width:180px;">操作</th>
               </tr>
          </thead>
          <tbody class="list">
            <tr>
              <td>1</td>
              <td>JavaScript程序设计</td>
              <td>马特.费里斯比</td>
              <td>人民邮电出版社</td>
              <td>
                <span class="del">删除</span>
                
                <span class="edit">编辑</span>
              </td>
            </tr>
          </tbody>
         </table>

    </div>
   <!--新增弹出框-->
    <div class="modal fade add-modal" tabindex="-1">
      <div class="modal-dialog">
          <!--弹框内容-->
      <div class="modal-content">
          <!--弹框头部-->
      <div class="modal-header top">
        <span>添加图书</span>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <!--弹框身体-->
      <div class="modal-body form-wrap">
        <!--新增表单-->
        <form class="add-form">
          <div class="mb-3">
            <label class="form-label">书名</label>
            <input type="text"  class="form-control bookname" name="bookname" placeholder="请输入书籍名称">
          </div>
          <div class="mb-3">
            <label class="form-label">作者</label>
            <input type="text" class="form-control author" name="author" placeholder="请输入作者名称">
          </div>
          <div class="mb-3">
            <label class="form-label">出版社</label>
            <input type="text" class="form-control publisher" name="publisher" placeholder="请输入出版社名称">
          </div>
        </form>
      </div>
      <!--弹框底部-->
      <div class="modal-footer bth-group">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">关闭</button>
        <button type="button" class="btn btn-primary add-bth">保存</button>
      </div>
      </div>
      </div>
      </div>        
    <!--编辑弹出框-->
    <div class="modal fade edit-modal" tabindex="-1">
      <div class="modal-dialog">
          <!--弹框内容-->
      <div class="modal-content">
          <!--弹框头部-->
      <div class="modal-header">
        <span>编辑图书</span>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <!--弹框身体-->
      <div class="modal-body form-wrap">
        <!--编辑表单-->
       <form class="edit-form">
        <input type="hidden" class="id" name="id">
        <div class="mb-3">
          <label class="form-label">书名</label>
          <input type="text" class="form-control bookname" name="bookname" placeholder="请输入书籍名称">
        </div>
        <div class="mb-3">
          <label class="form-label">作者</label>
          <input type="text" class="form-control author" name="author" placeholder="请输入作者名称">
        </div>
        <div class="mb-3">
          <label class="form-label">出版社</label>
          <input type="text" class="form-control publisher" name="publisher" placeholder="请输入出版社的名称">
        </div>
       </form>
      </div>
      <!--弹框底部-->
      <div class="modal-footer bth-group">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">关闭</button>
        <button type="button" class="btn btn-primary edit-bth">修改</button>
      </div>
      </div>
      </div>
      </div>
    <!--引入bootStrap.js-->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.min.js"></script>
    <!--引入axios.js-->
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    <!--引入form-serialize-->
    <script src="../lib/form-serialize.js"></script>
    <!--引入核心逻辑-->
    <script src="./js/index.js"></script>
</body>
</html>

 css文件

*{
    padding:0;
    margin:0;
}
.container{
    height:1000px;
    width:1400px;
    border:2px solid black;
    margin:10px auto;
}
.top{
    height:50px;
    margin-top:10px; 
}
.top-left{
   margin-left:50px;
    margin-top:10px;
    
    float:left;
}
.top-right{
    margin-right:50px;
    margin-top:10px;
    float:right;

}

.table{
   width:1200px;
   margin:10px auto;
   border:2px solid black;
}
.table-light th{
    background-color:#939ca7;
    color:#ffffff;
    font-size:16px;
    text-align: center;
    font-weight: 500;
    border-right: 1px solid lightgray;
}
.table tbody td {
    color: #696F77;
   text-align:center;
  }
.del{
    color: #E5964C;
    cursor: pointer;
}
.edit{
    color: #539ACB;
    cursor: pointer;
}

js文件

/**
 * 目标1:渲染图书列表
 * 1.1获取数据
 * 1.2渲染数据
 * 
 */
const creator='老张';
//封装-获取并渲染图书列表函数
function getBooksList(){
    //1.1获取数据
    axios({
        url:'http://hmajax.itheima.net/api/books',
        params:{
            //外号:获取对应数据
            creator
        }
    }).then(result=>{
        console.log(result)
        const bookList=result.data.data
        console.log(bookList)
        //1.2渲染数据
        //开始一个映射操作,将列表中的每个元素转化为HTML的tr
        const htmlStr=bookList.map((item,index)=>{//index为下标的索引,其中${index+1}表示要替换的变量
            return `<tr>
              <td>${index +1}</td>  
              <td>${item.bookname}</td>
              <td>${item.author}</td>
              <td>${item.publisher}</td>
              <td data-id=${item.id}>
              <span class="del">删除</span>   
              <span class="edit">编辑</span>
              </td>
             </tr>`}).join('')
            console.log(htmlStr)
            //获取tbody
            const tbody=document.querySelector('.list');
            tbody.innerHTML=htmlStr;
    
})


}
//网页加载运行,获取并渲染列表一次
getBooksList()
/**
 * 目标2:新增图书
 * 2.1 新增弹框-显示和隐藏
 * 2.2 收集表单数据,并提交到服务器保存
 * 2.3 刷新图书列表
 */
//2.1 新增弹框-显示和隐藏
//创建弹框对象
const addModalDom=document.querySelector('.add-modal');
const modal=new bootstrap.Modal(addModalDom);
//保存按钮-点击-隐藏弹框
const bth=document.querySelector('.add-bth');
bth.addEventListener('click',()=>{
   
//2.2 收集表单数据,并提交到服务器保存
//获取表单
const addForm=document.querySelector('.add-form');
//使用serialize函数,收集表单元素
const data=serialize(addForm,{hash:true,empty:true});
console.log(data)
//把数据提交到服务器
axios({
    url:'http://hmajax.itheima.net/api/books',
    method:'post',
    data:{
       ...data, //...为展开语法
       creator
    }
}).then(result=>{
    console.log(result)
    //添加成功后,重新请求并渲染图书列表
    getBooksList()
    //重置表单
    addForm.reset();
    //隐藏弹框
    modal.hide();
})

})
/**
 * 目标3:删除图书
 * 3.1 删除元素绑定点击事件-获取图书id
 * 3.2 调用删除接口
 * 3.3 刷新图书列表
 */
//删除元素-点击
document.querySelector('.list').addEventListener('click',e=>{
    //获取触发事件目标元素,判断点击的是删除元素
    if(e.target.classList.contains('del')){
        //获取图书id(自定义属性id)
     const theId=e.target.parentNode.dataset.id
     console.log(theId) 
    //调用删除接口
    axios({
        url:`http://hmajax.itheima.net/api/books/${theId}`,//路径传参(模版字符串)
        method:'delete'

    }).then(()=>{
        //刷新图书列表
        getBooksList()
    })
}
    
})
/**
 * 目标4:编辑图书
 * 4.1编辑弹框-显示和隐藏
 * 4.2获取当前编辑图书数据-回显到编辑表单中
 * 4.3提交保存修改,并刷新列表
 */
//编辑弹框-显示和隐藏
//创建弹框对象
const editDom=document.querySelector('.edit-modal');
const editModal=new bootstrap.Modal(editDom);
//编辑按钮-点击-弹框显示(编辑元素和删除元素都是动态创建的,即需要事件委托)
document.querySelector('.list').addEventListener('click',e=>{
    //获取触发事件的目标元素,判断点击的是编辑元素
    if(e.target.classList.contains('edit')){
       //获取当前编辑图书数据-回显到编辑表单中
       //取出图书id
       const theId=e.target.parentNode.dataset.id
       //获取图书的详情数据
       axios({
        url:`http://hmajax.itheima.net/api/books/${theId}`
       }).then(result=>{
        const bookObj=result.data.data
        document.querySelector('.edit-form .id').value=bookObj.id;
        document.querySelector('.edit-form .bookname').value=bookObj.bookname;
        document.querySelector('.edit-form .author').value=bookObj.author;
        document.querySelector('.edit-form .publisher').value=bookObj.publisher;
        
       })
          editModal.show(); 
    }
})
//修改按钮-点击-弹框隐藏
document.querySelector('.edit-bth').addEventListener('click',()=>{
    //提交保存修改,并刷新列表
    //第一种方法
    const editForm=document.querySelector('.edit-form');
    const bookObj=serialize(editForm,{hash:true,empty:true})
    
    axios({
        url:`http://hmajax.itheima.net/api/books/${bookObj.id}`,
        method:'PUT',
        data:{
            bookname:bookObj.bookname,
            author:bookObj.author,
            publisher:bookObj.publisher,
            creator

        }
    //第二种方法
    // const editForm=document.querySelector('.edit-form');
    // const {id,bookname,author,publisher}=serialize(editForm,{hash:true,empty:true})
    // axios({
    //     url:`http://hmajax.itheima.net/api/books/${id}`,
    //     method:'PUT',
    //     data:{
    //     bookname,
    //     author,
    //      publisher,
    //       creator
        
    //             }

    }).then(result=>{
        console.log(result)
        getBooksList()
        //隐藏弹框
        editModal.hide()
    })
    
    
})

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

^涵梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值