jq发送网络请求案例--渲染数据、增删改查

发布于:2023-01-04 ⋅ 阅读:(271) ⋅ 点赞:(0)

1. 案例需求

向接口发送网络请求,将数据渲染在页面上,并实现对应的增删改查功能
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 需要用到的jQuery静态方法:

Storage setItem() 方法
setItem() 方法设置指定存储对象项的值。
setItem() 方法属于 Storage 对象,它可以是 localStorage 对象,也可以是 sessionStorage 对象。(本案例中我们仅用sessionStorage对象就可以)
sessionStorage 对象仅存储一个会话的数据(关闭浏览器选项卡时数据将被删除)。
用法:
向 sessionStorage 中保存数据的语法: sessionStorage.setItem(“key”, “value”);
从 sessionStorage 中读取数据的语法:var lastname = sessionStorage.getItem(“key”);

ajaxSetup() 方法
为所有ajax设置默认值
语法:$.ajaxSetup({name:value, name:value, … })

trigger() 方法
trigger() 方法触发被选元素的指定事件类型。
语法:$(selector).trigger(eventObj)
eventObj,规定事件发生时运行的函数。

forEach()方法
对数组的每个元素执行一次给定的函数
语法:arr.forEach(callback(currentValue, index, array),thisArg)
callback,为数组中每个元素执行的函数,该函数接收一至三个参数
currentValue ,数组中正在处理的当前元素。
index (可选),数组中正在处理的当前元素的索引。
array (可选),forEach() 方法正在操作的数组。
thisArg (可选)参数,当执行回调函数 callback 时,用作 this 的值。

3. 代码搭建

3.1 案例思路

几乎所有事件都要发送网络请求,网络请求的数据格式或请求头均由接口决定。本案例的难点在于模态框的网络请求。由于修改按钮和新增按钮共用一个模态框,所以可以共用一个网络请求。唯一不同的是新增按钮不需要传送产品的id,而修改按钮在发送网络请求时需要传送产品的id。因此在模态框的确定按钮中,我们需要判断是发送哪种请求。

3.2 页面结构

先搭建好页面结构

<style>
    /* 初始化table样式 */
    table,
    th,
    td {
      border: 1px solid #ccc;
      border-collapse: collapse;
      text-align: center;
      line-height: 30px;
      width: 1200px;
      margin-top: 10px;
    }

    /* 初始化模态框遮罩样式 */
    .dialog {
      width: 100%;
      height: 100vh;
      background-color: rgba(0, 0, 0, 0.5);
      position: absolute;
      top: 0;
      left: 0;
      line-height: 40px;
      /* 隐藏模态框 */
      display: none;
    }

    /* 初始化模态框样式 */
    .dialog .container {
      font-size: 18px;
      width: 60%;
      height: 400px;
      margin: calc((100vh - 400px)/2) auto;
      background-color: #fff;
    }

    .dialog .container .dialog_header {
      background-color: bisque;
    }

    .dialog .container .dialog_footer button {
      position: relative;
      left: 350px;
      display: inline-block;
      width: 50px;
      background-color: bisque;
    }
</style>
<body>
  <button id="login">登录</button>
  <button id="load">加载数据</button>
  <input type="text">
  <select name="status" id="">
    <option value="正常">正常</option>
    <option value="下架">下架</option>
  </select>
  <button id="toSearch">查询</button>
  <button id="toAdd">新增</button>
  <!-- 表格展示数据 -->
  <table>
    <thead>
      <tr>
        <th>序号</th>
        <th>产品编号</th>
        <th>名称</th>
        <th>价格</th>
        <th>状态</th>
        <th>所属栏目</th>
        <th>操作</th>
      </tr>
    </thead>
    <tbody>
      <!-- 表格内容通过发送网络请求渲染出来 -->
    </tbody>
  </table>
  <!-- 模态框 默认不显示 -->
  <div class="dialog">
    <div class="container">
      <div class="dialog_header">
        新增产品信息
      </div>
      <div class="dialog_center">
        <div>
          产品名称: <input type="text" name="name">
        </div>
        <div>
          状态: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;正常<input type="radio" name="status" value="正常">
          下架<input type="radio" name="status" value="下架">
        </div>
        <div>
          价格: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" name="price" id="">
        </div>
        <div>
          产品描述: <textarea name="description" cols="30" rows="10"></textarea>
        </div>
      </div>
      <div class="dialog_footer">
        <button class="cancel">取消</button>
        <button class="submit">确定</button>
      </div>
    </div>
  </div>
</body>

未渲染的页面效果:
在这里插入图片描述

3.3 局部jq代码

在script标签中需要引进jquery和Qs组件库

 //引入本地jq
 <script src="./jquery-3.6.0.js"></script>
 //引入在线Qs
 <script src="https://cdn.bootcdn.net/ajax/libs/qs/6.11.0/qs.min.js"></script>

打开浏览器时,首先要模拟登录事件,获得后续活动的访问权限。

//声明全局ajax请求基础路径
      var baseURL = "http://43.142.186.151:8002";
      var user=null
      //登录按钮:点击登录 获取token 存储起来 配置到ajax全局对象中
      $('#login').click(function () {
        var obj = {
          username: "admin1",
          password: 123321
        };
        //发送登录请求
        $.ajax({
          url: baseURL + "/user/login",
          //根据接口需求配置请求方法和请求头
          method: "post",
          headers: {
            "Content-Type": "application/json"
          },
          data: JSON.stringify(obj),
          success(res) {
            // console.log(res.data.token);
            //存储token
            sessionStorage.setItem('token', res.data.token);
            //配置全局headers
            $.ajaxSetup({
              headers: {
                "Authorization": sessionStorage.getItem('token')
              }
            })
            // 登录的同时,直接获取数据
            $("#load").trigger('click')
          },
          error(err) { }
        })
      });

模拟加载事件

  //load按钮加载数据事件
      var obj = {
        page: 1,
        pageSize: 20
      }
      $("#load").click(function () {
        $('tbody').empty();
        $.ajax({
          url: baseURL + "/product/pageQuery",
          method: "get",
          data: Qs.stringify(obj),
          success(res) {
            // console.log(res);
            //将获得的数据插入到页面中
            res.data.list.forEach(function (item, index) {
              var newTr = `
                <tr>
                  <td>${index + 1}</td>
                  <td>${item.id}</td>
                  <td>${item.name}</td>
                  <td>${item.price}</td>
                  <td>${item.status}</td>
                  <td>${item.category.name}</td>
                  <td>
                    <button class='toDelete' id='${item.id}'>删除</button>
                    <button class='toEdit' item='${JSON.stringify(item)}'>修改</button>
                  </td>
                </tr>
              `
              $(newTr).appendTo('tbody')
            })
          },
          error(err) { }
        })
      })

防止刷新时丢失数据:


      //解决页面刷新数据丢失问题
      var token = sessionStorage.getItem('token');
      // console.log(token);
      if (token) {
        $.ajaxSetup({
          headers: {
            'Authorization': token
          }
        })
        // 模拟点击加载数据
        $('#load').trigger('click')
      } else {
        // 假设token失效 
        $('#login').trigger('click');
      }

查询按钮事件

$('#toSearch').click(function () {
        $('tbody').empty();
        let temp = {
          ...obj,
          name: $('input:first').val(),
          status: $('select:first').val()
        }
        $.ajax({
          url: baseURL + "/product/pageQuery",
          method: "get",
          data: Qs.stringify(temp),
          success(res) {
            console.log(res);
            res.data.list.forEach(function (item, index) {
              var newTr = `
								<tr>
									<td>${index + 1}</td>	
									<td>${item.id}</td>	
									<td>${item.name}</td>	
									<td>${item.price}</td>	
									<td>${item.status}</td>	
									<td>${item.category.name}</td>	
									<td><button class='toDelete' id='${item.id}'>删除</button><button>修改</button></td>	
								</tr>
							`
              $('tbody').append(newTr)
            })
          },
          error(err) { }
        })
      })

模态框按钮事件

//确定按钮
$('.submit').click(function () {
        //获取输入框中输入的信息
        var name = $('input[name=name]').val();
        var status = $('input[type=radio]:checked').val();
        var price = $('input[name=price]').val();
        var description = $('textarea[name=description]').val()
        $.ajax({
          url: baseURL + '/product/saveOrUpdate',
          method: "post",
          data: {
            id:user?user.id:"",
            name,
            status,
            price,
            description,
            productCategoryId:9441
          },
          success(res){
            console.log(res);
            $('.dialog').fadeOut()
            alert(res.message)
            $('#load').trigger('click')
          },
          error(err){}
        })
      })
       //取消按钮
      $('.cancel').click(function () {
          $('.dialog').fadeOut()
        })

新增按钮事件:

$('#toAdd').click(function () {
        $('.dialog').fadeIn()
        var name = $('input[name=name]').val("");
        var status = $('input[type=radio]').val("checked",false);
        var price = $('input[name=price]').val("");
        var description = $('textarea[name=description]').val("")
        //修改模态框标题为修改产品信息
				$('.dialog_header').html('新增产品信息');
      })

表格删除按钮事件:
由于表格中的按钮是通过网络请求渲染上去的,所以需要通过事件代理才能绑定上事件,修改按钮也一样。

$('table tbody').on('click', '.toDelete', function () {
        //获取当前行 产品的id
        var id = $(this).attr('id');
        // console.log(id);
        var result = confirm('确定删除吗?')
        if (result) {
          $.ajax({
            url: baseURL + "/product/deleteById",
            method: "get",
            // 第一个id是后端需要的参数 
            // 第二个id是自己点击按钮获取的变量id
            data: { id: id },
            success(res) {
              console.log(res);
              alert(res.message)
              //刷新页面
              $("#load").trigger('click')
            },
            error(err) { }
          })
        } else {
          $('confirm').fadeOut()
        }

      });

表格修改按钮事件:

$('table tbody').on('click','.toEdit', function () {
        $('.dialog').fadeIn()
        user=$(this).attr('item');
        user=JSON.parse(user);
        console.log(user);
        $('input[name=name]').val(user.name);
        $('input[type=radio][value='+user.status+']').prop("checked",true);
        $('input[name=price]').val(user.price);
        $('textarea[name=description]').val()
        // 修改模态框标题为修改产品信息
				$('.dialog_header').html('修改产品信息');
      })


3.4 完整案例代码

<!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>产品管理</title>
  <script src="./jquery-3.6.0.js"></script>
  <script src="https://cdn.bootcdn.net/ajax/libs/qs/6.11.0/qs.min.js"></script>
  <style>
    /* 初始化table样式 */
    table,
    th,
    td {
      border: 1px solid #ccc;
      border-collapse: collapse;
      text-align: center;
      line-height: 30px;
      width: 1200px;
      margin-top: 10px;
    }

    /* 初始化模态框遮罩样式 */
    .dialog {
      width: 100%;
      height: 100vh;
      background-color: rgba(0, 0, 0, 0.5);
      position: absolute;
      top: 0;
      left: 0;
      line-height: 40px;
      /* 隐藏模态框 */
      display: none;
    }

    /* 初始化模态框样式 */
    .dialog .container {
      font-size: 18px;
      width: 60%;
      height: 400px;
      margin: calc((100vh - 400px)/2) auto;
      background-color: #fff;
    }

    .dialog .container .dialog_header {
      background-color: bisque;
    }

    .dialog .container .dialog_footer button {
      position: relative;
      left: 350px;
      display: inline-block;
      width: 50px;
      background-color: bisque;
    }
  </style>
  <script>
    //入口函数
    $(function () {
      //声明全局ajax请求基础路径
      var baseURL = "http://43.142.186.151:8002";
      var user=null
      //登录按钮:点击登录 获取token 存储起来 配置到ajax全局对象中
      $('#login').click(function () {
        var obj = {
          username: "admin1",
          password: 123321
        };
        //发送登录请求
        $.ajax({
          url: baseURL + "/user/login",
          method: "post",
          headers: {
            "Content-Type": "application/json"
          },
          data: JSON.stringify(obj),
          success(res) {
            // console.log(res.data.token);
            //存储token
            sessionStorage.setItem('token', res.data.token);
            //配置全局headers
            $.ajaxSetup({
              headers: {
                "Authorization": sessionStorage.getItem('token')
              }
            })
            // 登录的同时,直接获取数据
            $("#load").trigger('click')
          },
          error(err) { }
        })
      });

      //load按钮加载数据事件
      var obj = {
        page: 1,
        pageSize: 20
      }
      $("#load").click(function () {
        $('tbody').empty();
        $.ajax({
          url: baseURL + "/product/pageQuery",
          method: "get",
          data: Qs.stringify(obj),
          success(res) {
            // console.log(res);
            res.data.list.forEach(function (item, index) {
              var newTr = `
                <tr>
                  <td>${index + 1}</td>
                  <td>${item.id}</td>
                  <td>${item.name}</td>
                  <td>${item.price}</td>
                  <td>${item.status}</td>
                  <td>${item.category.name}</td>
                  <td>
                    <button class='toDelete' id='${item.id}'>删除</button>
                    <button class='toEdit' item='${JSON.stringify(item)}'>修改</button>
                  </td>
                </tr>
              `
              $(newTr).appendTo('tbody')
            })
          },
          error(err) { }
        })
      })

      //解决页面刷新数据丢失问题
      var token = sessionStorage.getItem('token');
      // console.log(token);
      if (token) {
        $.ajaxSetup({
          headers: {
            'Authorization': token
          }
        })
        // 模拟点击加载数据
        $('#load').trigger('click')
      } else {
        // 假设token失效 
        $('#login').trigger('click');
      }

      //查询按钮事件 按照名称查询
      $('#toSearch').click(function () {
        $('tbody').empty();
        let temp = {
          ...obj,
          name: $('input:first').val(),
          status: $('select:first').val()
        }
        $.ajax({
          url: baseURL + "/product/pageQuery",
          method: "get",
          data: Qs.stringify(temp),
          success(res) {
            console.log(res);
            res.data.list.forEach(function (item, index) {
              var newTr = `
								<tr>
									<td>${index + 1}</td>	
									<td>${item.id}</td>	
									<td>${item.name}</td>	
									<td>${item.price}</td>	
									<td>${item.status}</td>	
									<td>${item.category.name}</td>	
									<td><button class='toDelete' id='${item.id}'>删除</button><button>修改</button></td>	
								</tr>
							`
              $('tbody').append(newTr)
            })
          },
          error(err) { }
        })
      })

      //模态框确定按钮事件
      $('.submit').click(function () {
        //获取输入框中输入的信息
        var name = $('input[name=name]').val();
        var status = $('input[type=radio]:checked').val();
        var price = $('input[name=price]').val();
        var description = $('textarea[name=description]').val()
        $.ajax({
          url: baseURL + '/product/saveOrUpdate',
          method: "post",
          data: {
            id:user?user.id:"",
            name,
            status,
            price,
            description,
            productCategoryId:9441
          },
          success(res){
            console.log(res);
            $('.dialog').fadeOut()
            alert(res.message)
            $('#load').trigger('click')
          },
          error(err){}
        })
      })
      //取消按钮
      $('.cancel').click(function () {
          $('.dialog').fadeOut()
        })
      // 新增按钮事件
      $('#toAdd').click(function () {
        $('.dialog').fadeIn()
        var name = $('input[name=name]').val("");
        var status = $('input[type=radio]').val("checked",false);
        var price = $('input[name=price]').val("");
        var description = $('textarea[name=description]').val("")
        //修改模态框标题为修改产品信息
				$('.dialog_header').html('新增产品信息');
      })
      //删除按钮事件 事件代理
      $('table tbody').on('click', '.toDelete', function () {
        //获取当前行 产品的id
        var id = $(this).attr('id');
        // console.log(id);
        var result = confirm('确定删除吗?')
        if (result) {
          $.ajax({
            url: baseURL + "/product/deleteById",
            method: "get",
            // 第一个id是后端需要的参数 
            // 第二个id是自己点击按钮获取的变量id
            data: { id: id },
            success(res) {
              console.log(res);
              alert(res.message)
              //刷新页面
              $("#load").trigger('click')
            },
            error(err) { }
          })
        } else {
          $('confirm').fadeOut()
        }

      });
      //修改按钮事件 修改产品信息
      $('table tbody').on('click','.toEdit', function () {
        $('.dialog').fadeIn()
        user=$(this).attr('item');
        user=JSON.parse(user);
        console.log(user);
        $('input[name=name]').val(user.name);
        $('input[type=radio][value='+user.status+']').prop("checked",true);
        $('input[name=price]').val(user.price);
        $('textarea[name=description]').val()
        // 修改模态框标题为修改产品信息
				$('.dialog_header').html('修改产品信息');
      })


    })





  </script>
</head>

<body>
  <button id="login">登录</button>
  <button id="load">加载数据</button>
  <input type="text">
  <select name="status" id="">
    <option value="正常">正常</option>
    <option value="下架">下架</option>
  </select>
  <button id="toSearch">查询</button>
  <button id="toAdd">新增</button>
  <!-- 表格展示数据 -->
  <table>
    <thead>
      <tr>
        <th>序号</th>
        <th>产品编号</th>
        <th>名称</th>
        <th>价格</th>
        <th>状态</th>
        <th>所属栏目</th>
        <th>操作</th>
      </tr>
    </thead>
    <tbody>
      <!-- 表格内容通过发送网络请求渲染出来 -->
    </tbody>
  </table>
  <!-- 模态框 -->
  <div class="dialog">
    <div class="container">
      <div class="dialog_header">
        新增产品信息
      </div>
      <div class="dialog_center">
        <div>
          产品名称: <input type="text" name="name">
        </div>
        <div>
          状态: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;正常<input type="radio" name="status" value="正常">
          下架<input type="radio" name="status" value="下架">
        </div>
        <div>
          价格: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" name="price" id="">
        </div>
        <div>
          产品描述: <textarea name="description" cols="30" rows="10"></textarea>
        </div>
      </div>
      <div class="dialog_footer">
        <button class="cancel">取消</button>
        <button class="submit">确定</button>
      </div>
    </div>
  </div>
</body>

</html>

网站公告

今日签到

点亮在社区的每一天
去签到