Web APIs——综合案例

news2024/11/23 12:45:51

1、学生就业统计表

2、渲染业务

根据持久化数据渲染页面

步骤:

①:读取localstorage本地数据

  • 如果有数据则转换为对象放到变量里面一会使用它渲染页面
  • 如果没有则用默认空数组[]
  • 为了测试效果,可以先把initData存入本地存储看效果

②:根据数据渲染页面。遍历数组,根据数据生成tr,里面填充数据,最后追加给tboby

(提示)可以利用map()和join()数组方法实现字符串拼接

  1. 渲染业务要封装成一个函数render
  2. 使用map方法遍历数组,里面更换数据,然后返回有数据的tr数组
  3. 通过join方法把map返回的数组转换为字符串
  4. 把字符串通过innerHTML赋值给tbody 

3、新增业务

点击新增按钮,页面显示新的数据

步骤:

①:给form注册提交事件,要阻止默认提交事件(阻止默认行为)

②:非空判断

如果年龄、性别、薪资有一个值为空,则return返回’输入不能为空‘中断程序

③:给arr数组追加对象,里面存储表单获取过来的数据

④:渲染页面和重置表单(reset()方法)

⑤:把数组数据存储到本地存储里面,利用JSON.stringify()存储为JSON字符串

 4、删除业务

点击删除按钮,可以删除对应的数据

步骤:

①:采用事件委托形式,给tbody注册点击事件

②:得到当前点击的索引号。渲染数据的时候,动态给a链接添加自定义属性data-id="0"

③:根据索引号,利用splice删除数组这条数据

④:重新渲染页面

⑤:把最新arr数组存入本地存储

5、关于stuId的处理

思路:

①:新增加序号应该是最后一条数据的stuId + 1

  • 数组[数组的长度-1].stuId + 1

②:但是要判断,如果没有数据则是直接赋值为1,否则就采用上面的做法

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

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  <title>学生就业统计表</title>
  <link rel="stylesheet" href="css/index.css" />
</head>

<body>
  <h1>新增学员</h1>
  <form class="info" autocomplete="off">
    姓名:<input type="text" class="uname" name="uname" />
    年龄:<input type="text" class="age" name="age" />
    性别: <select name="gender" class="gender">
      <option value="男">男</option>
      <option value="女">女</option>
    </select>
    薪资:<input type="text" class="salary" name="salary" />
    就业城市:<select name="city" class="city">
      <option value="北京">北京</option>
      <option value="上海">上海</option>
      <option value="广州">广州</option>
      <option value="深圳">深圳</option>
      <option value="曹县">曹县</option>
    </select>
    <button class="add">录入</button>
  </form>

  <h1>就业榜</h1>
  <!-- <div class="title">共有数据<span>0</span>条</div> -->
  <table>
    <thead>
      <tr>
        <th>学号</th>
        <th>姓名</th>
        <th>年龄</th>
        <th>性别</th>
        <th>薪资</th>
        <th>就业城市</th>
        <th>时间</th>
        <th>操作</th>
      </tr>
    </thead>
    <tbody>
      <!-- 
        <tr>
          <td>1</td>
          <td>迪丽热巴</td>
          <td>22</td>
          <td>女</td>
          <td>20000</td>
          <td>上海</td>
          <td>2099/9/9 08:08:08</td>
          <td>
            <a href="javascript:">
              <i class="iconfont icon-shanchu"></i>
              删除
              </a>
          </td>
        </tr> 
        -->
    </tbody>
  </table>
  <script>
  // 参考数据
      const initData = [
        {
          stuId: 1,
          uname: '迪丽热巴',
          age: 22,
          gender: '女',
          salary: '20000',
          city: '上海',
          time: '2099/9/9 08:08:08'
        }
      ]

      // localStorage.setItem('data',JSON.stringify(initData))
      // 1. 渲染业务
      // 1.1 先读取本地存储的数据
      // (1)本地存储有数据则记得转换为对象然后存储到变量里面,后期用于渲染页面
      // (2)如果没有数据,则用 空 数组来代替
      const arr = JSON.parse(localStorage.getItem('data')) || []

      // 1.2 利用map和join方法来渲染页面
      const tbody = document.querySelector('tbody')
      function render(){
        // (1) 利用map遍历数组,返回对应tr的数组
        const trArr = arr.map(function(ele,index){
          return `
          <tr>
            <td>${ele.stuId}</td>
            <td>${ele.uname}</td>
            <td>${ele.age}</td>
            <td>${ele.gender}</td>
            <td>${ele.salary}</td>
            <td>${ele.city}</td>
            <td>${ele.time}</td>
            <td>
              <a href="javascript:" data-id={"${index}"}>
                <i class="iconfont icon-shanchu"></i>
                删除
              </a>
            </td>
          </tr> `
        })
        console.log(trArr)
        // (2) 把数组转换为字符串 join
        // (3) 把生成的字符串追加给tbody
        tbody.innerHTML = trArr.join('')
        // 显示共计有几条数据
        // document.querySelector('.title span').innerHTML = arr.length
      }
      render()

      // 2. 新增业务
      // 2.1 form表单注册提交事件,阻止默认行为
      const info = document.querySelector('.info')
      const uname = document.querySelector('.uname')
      const  age = document.querySelector('.age')
      const salary = document.querySelector('.salary')
      const gender = document.querySelector('.gender')
      const city = document.querySelector('.city')
      info.addEventListener('submit',function(e){
        // 阻止默认行为
        e.preventDefault()
        // 2.2 非空判断
        if(!uname.value || !age.value || !salary.value) {
          return alert('输入内容不能为空')
        }
        // 2.3 给arr数组追加对象,里面存储 表单获取过来的数据
        arr.push({
          // 处理stuId: 数组最后一条数据的stuId + 1
          stuId: arr.length ? arr[arr.length -1].stuId + 1 : 1,
          uname: uname.value,
          age: age.value,
          salary: salary.value,
          gender:gender.value,
          city:city.value,
          time: new Date().toLocaleString()
        })
        // 2.4 渲染页面和重置表单(reset()方法)
        render()
        this.reset() // 重置表单
        // 2.5 把数组重新存入本地存储里面,记得转换为JSON字符串存储
        localStorage.setItem('data',JSON.stringify(arr))
      })
      
      // 3. 删除业务
      // 3.1 采用事件委托形式,给tbody注册点击事件
      tbody.addEventListener('click', function(e){
        // 判断是否点击的是删除按钮
        if(e.target.tagName === 'A'){
          // alert(11)
          // 3.2 得到当前点击的索引号,渲染数据的时候,动态给a链接添加自定义属性例如data-id="0"
          console.log(e.target.dataset.id)
          // 确认框确认是否要删除
          if(confirm('您确定要删除这条数据嘛?'))
            // 3.3 根据索引号,利用splice 删除数组这条数据
            arr.splice(e.target.dataset.id,1)
            // 3.4 重新渲染页面
            render()
            // 3.5 把最新arr数组存入本地存储
            localStorage.setItem('data',JSON.stringify(arr))
        }
      })
  </script>
</body>

</html>

CSS

* {
  margin: 0;
  padding: 0;
  box-sizing: content-box;
}


a {
  text-decoration: none;
  color:#721c24;
}
h1 {
  text-align: center;
  color:#333;
  margin: 20px 0;
 
}
table {
  margin:0 auto;
  width: 800px;
  border-collapse: collapse;
  color:#004085;
}
th {
  padding: 10px;
  background: #cfe5ff;
  
  font-size: 20px;
  font-weight: 400;
}
td,th {
  border:1px solid #b8daff;
}
td {
  padding:10px;
  color:#666;
  text-align: center;
  font-size: 16px;
}
tbody tr {
  background: #fff;
}
tbody tr:hover {
  background: #e1ecf8;
}
.info {
  width: 900px;
  margin: 50px auto;
  text-align: center;
}
.info  input, .info select {
  width: 80px;
  height: 27px;
  outline: none;
  border-radius: 5px;
  border:1px solid #b8daff;
  padding-left: 5px;
  box-sizing: border-box;
  margin-right: 15px;
}
.info button {
  width: 60px;
  height: 27px;
  background-color: #004085;
  outline: none;
  border: 0;
  color: #fff;
  cursor: pointer;
  border-radius: 5px;
}
.info .age {
  width: 50px;
}

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

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

相关文章

超声波热量表和电磁热量表有哪些区别?

随着我们能源消耗日益增长&#xff0c;热量计量已成为节能减排、能源管理的重要手段。热量表是用于测量热能消耗的仪表&#xff0c;其中超声波热量表和电磁热量表是常见的两种类型。下面&#xff0c;就由小编来为大家详细的介绍下超声波热量表和电磁热量表的区别&#xff0c;一…

电影《二手杰作》观后感

上周看了电影《二手杰作》,在看电影的时候&#xff0c;自己感觉其实多少有些文艺范&#xff0c;或者有些尴尬的&#xff0c;但是在电影里还好&#xff0c;不过整个故事看下来&#xff0c;多少有点代入感&#xff0c;不多但还是有点。 故事情节&#xff0c;比较简单&#xff0c…

为你摘星辰

欢迎来到程序小院 为你摘星辰 玩法&#xff1a;鼠标控制人物方向&#xff0c;点击鼠标键上升人物&#xff0c;经过⭐️⭐️吃掉获得分数&#xff0c;共三次生命&#xff0c;碰到红色障碍物减去一次生命&#xff0c; 人物掉落底部游戏结束&#xff0c;看你获得多少分^^。开始游…

Linux C基础(9)

1、指针的算术元素 总结&#xff1a; p n:pn对于p向地址增大的方向移动n个数据实际的变化&#xff1a;p sizeof(数据类型)*np - n:p-n对于p向地址减小的方向移动n个数据实际的变化&#xff1a;p - sizeof(数据类型)*np:p向地址增大的方向移动1个数据实际的变化&#xff1a;p …

【手把手教你】将python程序打包成exe可执行文件

1. 安装环境 pip install pyinstaller6.0.02. 打包文件 pyinstaller -D “要启动的文件名“.py比如我的命令就是&#xff1a;pyinstaller -D eval.py 执行完后&#xff0c;会生两个文件夹dist和bulib两个文件和一个xxx.spec文件 3. 删除生成的文件 删除生成的bulid和dist文…

Java实现调用openAI接口返回流式数据

一&#xff0c;添加依赖 <dependency><groupId>com.github.plexpt</groupId><artifactId>chatgpt</artifactId><version>4.0.7</version> </dependency>二&#xff0c;重写SseEmitter 改为UTF-8编码 import org.springframe…

TSINGSEE青犀智能分析网关工服识别算法,如何最大限度保障工人安全?

众所周知&#xff0c;TSINGSEE青犀智能分析网关算法繁多&#xff0c;大多数算法已经和大家讲解过了&#xff0c;今天就和大家聊一聊工服识别算法。工服识别算法一般应用于工地、化工、煤矿等场所&#xff0c;用来监督检测施工人员是否按照要求着工服&#xff0c;最大程度保障人…

助力网络安全攻防演练 | 中睿天下获国网蒙东电力数字化事业部感谢信

近日&#xff0c;中睿天下因积极协助和支撑国网蒙东电力数字化事业部在2023年国家网络安全专项演习期间的工作&#xff0c;有效保障了护网行动期间网络的安全稳定运行&#xff0c;因而获得了国网蒙东电力数字化事业部的高度认可&#xff0c;并向我司致书面表扬信&#xff0c;这…

Aria2 任意文件写入漏洞复现

漏洞描述 Aria2 是一款轻量级、多协议、多源下载工具&#xff08;支持 HTTP/HTTPS、FTP、BitTorrent、Metalink&#xff09;&#xff0c;内置 XML-RPC 和 JSON-RPC 接口。 我们可以使用 RPC 接口来操作 aria2 并将文件下载到任意目录&#xff0c;从而造成任意文件写入漏洞。 …

【CSS】transition、transform以及animation

1.CSS transition 介绍 通常当 CSS 的属性值更改后&#xff0c;浏览器会立即更新相应的样式。 在 CSS3 中加入了一项过渡功能&#xff0c;通过该功能&#xff0c;我们可以将元素从一种样式在指定时间内平滑的过渡到另一种样式&#xff0c;类似于简单的动画&#xff0c;但无需…

Android中Toast与Snack

1. Toast : 使用Toast类的makeText()方法创建Toast对象&#xff0c;makeText()方法有两个参数&#xff0c;第一个参数为显示Tosat的上下文环境&#xff0c;第二个参数为显示时长&#xff08; Toast.LENGTH_LONG 或 Toast.LENGTH_SHORT &#xff09;。 使用Toast类的show()方法…

lvgl 转换和使用新字体

一、背景 如果lvgl 提供的默认字体不符合我们的显示要求&#xff0c;我们可以在网上下载开源字体&#xff0c;或者利用系统自带&#xff08;注意版权问题&#xff09;的字体文件转换lvgl 能识别和调用的字体。 或者为了压缩存储空间&#xff0c;某些字体我们只需要个别字符&…

向量数据库:释放数据潜能,重塑信息世界

前言 想必各位开发者一定使用过关系型数据库MySQL去存储我们的项目的数据&#xff0c;也有部分人使用过非关系型数据库Redis去存储我们的一些热点数据作为缓存&#xff0c;提高我们系统的响应速度&#xff0c;减小我们MySQL的压力。那么你有听说过向量数据库吗&#xff1f;知道…

Docker本地部署Drupal并实现公网访问

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS&#xff0c;适用于各种不同的网站项目&#xff0c;从小型个人博客到大型企业级门户网站。它的学习…

多篇论文介绍-Wiou

论文地址 目录 https://arxiv.org/pdf/2301.10051.pdf 01 CIEFRNet&#xff1a;面向高速公路的抛洒物检测算法 02改进 YOLOv5 的 PDC 钻头复合片缺损识别 03 基于SimAM注意力机制的DCN-YOLOv5水下目标检测 04 基于改进YOLOv7-tiny 算法的输电线路螺栓缺销检测 05 基于改…

用友U8定制版在集简云:无需API即可集成客服系统和用户运营

无代码开发的新时代 在这个信息化、自动化的时代&#xff0c;无代码开发已经成为一种新的趋势。集简云就是这样的一款工具&#xff0c;可以轻松连接用友U8 定制版与近千款软件系统&#xff0c;无需开发、无需代码知识就可以打通各种软件之间的数据连接&#xff0c;构建自动化与…

【代码随想录】算法训练计划16

【代码随想录】算法训练计划04 1、111. 二叉树的最小深度 题目&#xff1a; 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 思路&#xff1a; 用递归&#xff0…

HashMap源码分析(一)

存储结构 说明&#xff1a;本次讲解的HashMap是jdk1.8中的实现&#xff0c;其他版本可能有差异 内部是由Node节点数组组成&#xff0c;Node节点之间又由链表或红黑树组成。 图是网上找的&#xff0c;实在不想画 属性介绍 //存储数据的数组&#xff0c;初次使用时初始化&…

Opencv for unity 下载

GitHub - EnoxSoftware/VideoPlayerWithOpenCVForUnityExample: This example shows how to convert VideoPlayer texture to OpenCV Mat using AsyncGPUReadback. OpenCV for Unity | Integration | Unity Asset Store

【原创】java+jsp+servlet简单图书管理系统设计与实现

摘要&#xff1a; 图书管理系统是一个专门针对图书馆管理而设计的系统&#xff0c;它可以帮助图书管理员有效的对图书进行管理&#xff0c;在图书管理系统的设计中&#xff0c;首先要考虑的是系统的需求分析&#xff0c;该系统的设计与实现涉及多个方面&#xff0c;包括数据库…