Ajax_02学习笔记(源码 + 图书管理业务 + 以及 个人信息修改功能)

Ajax_02

01_Bootstrap框架-控制弹框的使用

代码
<!-- 引入bootstrap.css -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet"><button type="button" class="btn btn-primary"  data-bs-toggle="modal" data-bs-target=".my-box">显示弹框
</button><!-- 弹框代码 -->
<div class="modal my-box" tabindex="-1"><div class="modal-dialog"><div class="modal-content"><div class="modal-header"><h5 class="modal-title">Modal title</h5><button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button></div><div class="modal-body"><p>Modal body text goes here.</p></div><div class="modal-footer"><button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button><button type="button" class="btn btn-primary">Save changes</button></div></div></div>
</div><!-- 引入bootstrap.js -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.min.js"></script>
  • 通过自定义属性,控制弹框的显示和隐藏.自己能够控制属性,从而进行更改

02_通过js方式控制弹框

目标:使用JS控制弹框,显示和隐藏

  1. 创建弹框对象

  2. 调用弹框对象内置方法

    .show() 显示

    .hide() 隐藏

代码示例
<!-- 引入bootstrap.css -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet"><button type="button" class="btn btn-primary edit-btn">编辑姓名
</button><div class="modal name-box" tabindex="-1"><div class="modal-dialog"><div class="modal-content"><div class="modal-header"><h5 class="modal-title">请输入姓名</h5><button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button></div><div class="modal-body"><form action=""><span>姓名:</span><input type="text" class="username"></form></div><div class="modal-footer"><button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button><button type="button" class="btn btn-primary save-btn">保存</button></div></div></div>
</div><!-- 引入bootstrap.js -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.min.js"></script><script>// 1、创建弹框对象const modalDom = document.querySelector('.name-box')const modal = new bootstrap.Modal(modalDom)// 编辑姓名 -> 点击 -> 赋予一个默认的姓名 -> 弹框显示document.querySelector('.edit-btn').addEventListener('click', () => {document.querySelector('.username').value = '默认姓名'// 2、显示弹框modal.show()})// 保存 -> 点击 -> 获取姓名打印 -> 弹框隐藏document.querySelector('.save-btn').addEventListener('click', () => {const username = document.querySelector('.username').valueconsole.log('模拟把姓名保存到服务器上',username)// 3、隐藏弹框modal.hide()})</script>
  • 关于这两种方式控制弹框的显示和隐藏,至于怎么选择,我们取决于业务逻辑,如果只是单纯的控制显示和隐藏,那么直接使用bootstrap属性控制即可,反正就得使用js控制

图书管理业务

需求: 对服务器的图书数据进行 增、删、改、查。功能的实现,同时实时动态的渲染刷新页面内容

根据功能模块分为四个业务模块,下面有各个业务的实现步骤

01_ 渲染图书列表业务

* 目标1:渲染图书列表

* 1.1 获取数据

* 1.2 渲染数据

业务1代码
// 固定的携带参数别名
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.dataconsole.log(bookList)// 1.2 渲染数据const htmlStr = bookList.map((item,index) => {return `<tr><td>${index + 1}</td><td>${item.bookname}</td><td>${item.author}</td><td>${item.publisher}</td><td><span class="del">删除</span><span class="edit">编辑</span></td></tr>`}).join('')console.log(htmlStr)document.querySelector('.list').innerHTML = htmlStr})
}
// 网页加载运行,获取并渲染列表一次
getBooksList()

02_新增图书业务

目标2:新增图书

​ * 2.1 新增弹框 -> 显示和隐藏

​ * 2.2 收集表单数据,并提交给服务器

​ * 2.3 刷新图书列表、同时重置表单

业务2代码
// 2.1 创建一个弹框对象
const addModalDom = document.querySelector('.add-modal')
const addModal = new bootstrap.Modal(addModalDom)
// 给保存按钮添加点击事件
document.querySelector('.add-btn').addEventListener('click', () => {// 2.2 收集表单数据,并提交给服务器const form = document.querySelector('.add-form')// 使用serialize插件的函数获取拥有anme属性的表单值const data = serialize(form, { hash: true, empty: true })// 使用对象解构对获取的值进行处理,用于提交数据const { bookname, author, publisher } = dataconsole.log(data)// 2.2.1 向服务器发送提交请求(提交到服务器)axios({url: 'http://hmajax.itheima.net/api/books',method: 'post',data: {...data,creator}}).then(result => {console.log(result)// 2.3 服务器响应后我们需要重新渲染图书数据列表getBooksList()// 重置表单form.reset()// 隐藏弹框addModal.hide()})
})

这里的显示,我们使用bootstrap属性控制就可以了,但是隐藏我们需要提交数据,所以我们使用js来控制。

03_删除图书业务

* 目标3: 删除图书

* 3.1 删除元素绑定点击事件 -> 获取图书id

* 3.2 调用删除接口

* 3.3 刷新图书列表

业务3代码
// 3.1 删除元素 -> 点击(事件委托) 动态创建,我们委托父级
document.querySelector('.list').addEventListener('click', e => {// console.log(e.target)// 判断用户点击的元素if (e.target.classList.contains('del')) {// console.log('点击删除元素')// 获取图书id(我们动态创建的自定义属性id)const theId = e.target.parentNode.dataset.idconsole.log(theId)// 3.2 调用删除接口axios({// 使用模板字符串  路径传参url: `http://hmajax.itheima.net/api/books/${theId}`,method: 'DELETE'}).then(result => {// 3.3 刷新图书列表getBooksList()console.log(result)}).catch(error => {console.log(error)console.log(error.response.data.message)})}
})

04_编辑图书业务

* 目标4 :编辑图书

* 4.1 编辑弹框 -> 显示和隐藏

* 4.2 获取当前编辑图书数据 -> 回显到编辑表单中

* 4.3 提交保存修改 ,并刷新列表

业务4代码
// 4.1 编辑弹框 -> 显示和隐藏 (使用js方式控制)
const editDom = document.querySelector('.edit-modal')
// 通过bootstrap.Modal构造函数创建一个实例对象
const editModal = new bootstrap.Modal(editDom)
// 给编辑元素 -> 绑定 ->委托事件
document.querySelector('.list').addEventListener('click', e => {// 判断点击的是否为 edit 这个类 的标签if (e.target.classList.contains('edit')) {// console.log('编辑')// 4.2 获取当前编辑图书数据 -> 回显到编辑表单中const theId = e.target.parentNode.dataset.id// console.log(theId)axios({// 路径传参  嵌入进去url: `http://hmajax.itheima.net/api/books/${theId}`,method: 'GET',}).then(result => {const bookObj = result.data.data// document.querySelector('.edit-form .bookname').value = bookObj.bookname// document.querySelector('.edit-form .author').value = bookObj.author// 数据对象“属性”和标签“类名”一致// 遍历数据对象,使用属性去获取对应标签,快速赋值const keys = Object.keys(bookObj) //['id', 'bookname', 'author', 'publisher']keys.forEach(key => {document.querySelector(`.edit-form .${key}`).value = bookObj[key]})})// 给弹框对象添加show方法,让编辑框显示出来editModal.show()}
})//  修改按钮 -> 点击 -> 隐藏按钮
document.querySelector('.edit-btn').addEventListener('click', () => {// 4.3 提交保存修改 ,并刷新列表const editForm = document.querySelector('.edit-form')const bookObj = serialize(editForm ,{ hash: true ,empty: true })// 下面是保存正在编辑的图书id ,隐藏起来:无需让用户修改// <input type="hidden" class="id" name="id" value="228500">axios({url: `http://hmajax.itheima.net/api/books/${bookObj.id}`,method: 'PUT',data: {...bookObj,creator}}).then(() => {// 修改成功以后,重新获取并刷新列表getBooksList()// 隐藏弹框editModal.hide()})})

业务总结

  • 核心的步骤

* 业务1:渲染图书列表

* 1.1 获取数据

* 1.2 渲染数据

业务2:新增图书

​ * 2.1 新增弹框 -> 显示和隐藏

​ * 2.2 收集表单数据,并提交给服务器

​ * 2.3 刷新图书列表、同时重置表单

* 业务3: 删除图书

* 3.1 删除元素绑定点击事件 -> 获取图书id

* 3.2 调用删除接口

* 3.3 刷新图书列表

* 业务4 :编辑图书

  • 显示和隐藏

* 4.2 获取当前编辑图书数据 -> 回显到编辑表单中

* 4.3 提交保存修改 ,并刷新列表

在所有的查询和请求中,只要服务器的数据发生变化,同时也需要渲染刷新页面的内容.

图片上传

上传-图片

注意1:上传的图片必须在2MB以内
注意2:服务器端oss(阿里云对象存储)为了安全性,图片url网址不能直接在浏览器地址栏访问
请用img/背景图方式进行使用

* 目标:图片上传,显示到网页上

* 1. 获取图片文件

* 2. 使用 FormData 携带图片文件

* 3. 提交到服务器,获取图片url网址使用

代码示例
          // 1.获取选择文件按钮,同时注册一个变化事件document.querySelector('.upload').addEventListener('change', e => {console.log(e.target.files[0])// 2. 使用 FormData 构造函数 携带图片文件夹const imgs = new FormData()// 调用实例对象中 append 方法,传入图片imgs.append('img',e.target.files[0])// 3. 提交到服务器,获取图片url网址使用axios({url: 'http://hmajax.itheima.net/api/uploadimg',method: 'POST',data: imgs}).then(result => {console.log(result.data.data)const imgUrl = result.data.data.urldocument.querySelector('.my-img').src = imgUrl})})

携带的参数具体需要参考接口文档。

网站背景更换

  • 目标:网站-更换背景
    1. 选择图片上传,设置body背景
    1. 上传成功时,"保存"图片url网址
    1. 网页运行后,"获取"url网址使用
代码示例
//1、选择图片上传,给body设置背景图片
// 1.2 获取按钮进行上传
document.querySelector('.bg-ipt').addEventListener('change', e => {console.log(e.target.files[0])// 表单事件对象const fd = new FormData()fd.append('img' , e.target.files[0])axios({url: 'http://hmajax.itheima.net/api/uploadimg',method: 'POST',data: fd}).then(result => {const res = result.data.data.url// 更换body的背景图document.body.style.backgroundImage = `url(${res})`// 2、上传成功时,"保存"图片url网址 到本地,防止刷新丢失localStorage.setItem('bgImg',res)})
})// 3. 网页运行后,"获取"url网址使用
const bgUrl = localStorage.getItem('bgImg')
console.log(bgUrl)
// 逻辑与中断,本地有服务器提交后的url的话,那么就执行后面的,否则为空值不执行
bgUrl && (document.body.style.backgroundImage = `url(${bgUrl})`)
  • 在上传图片的基础上增加了存储到本地的功能需求,同时没有url返回,不执行更换背景。

个人信息业务

01_信息渲染

* 目标1:信息渲染

* 1.1 获取用户的数据

* 1.2 回显数据到标签上

模块一代码
// 业务1、信息渲染// 1.1 获取用户的数据
const creator = 'cv爱好者'
axios({url: 'http://hmajax.itheima.net/api/settings',method: 'GET',params: {creator}
}).then(result => {const userObj = result.data.dataconsole.log(userObj)// 1.2 回显数据到标签上const user = Object.keys(userObj)user.forEach(item => {if (item === 'avatar') {// 单独赋予默认头像document.querySelector('.prew').src = userObj[item]} else if (item === 'gender') {// 单独赋予默认性别 [男radio元素 ,女radio元素]const getGender = document.querySelectorAll('.gender')  //获取到伪数组,节点列表// 获取到性别数字; 0 男 1 女const gNum = userObj[item]// 通过性别数字,作为下标,找到对应性别单选框,设置选中状态getGender[gNum].checked = true} else {// 赋予默认内容document.querySelector(`.${item}`).value = userObj[item]}})
})

02_ 头像修改

* 目标2: 头像修改

* 2.1 选择头像文件

* 2.1 提交保存 + 回显

模块二代码
//点击事件 ,上传头像 
document.querySelector('.upload').addEventListener('change' ,e => {console.log(e.target.files[0])// 使用表单事件对象 FormData 构造函数 目的就是提交服务器得到url网址const newImg = new FormData()newImg.append('avatar',e.target.files[0])newImg.append('creator',creator)// 2.1 提交保存 + 回显axios({url: 'http://hmajax.itheima.net/api/avatar',method: 'PUT',data: newImg}).then(result => {// 得到图片url网址const imgUrl = result.data.data.avatar// 把头像回显到页面上document.querySelector('.prew').src = imgUrl})
})

03_信息修改_ + 弹框提示

* 目标3 ;信息修改

* 3.1: 收集表单信息

* 3.2: 提交到服务器保存

* 目标4: 提示框显示

* 4.1: 创建toast对象(弹框对象)

* 4.2: 调用show方法 -> 显示提示框

模块三 + 模块四 代码示例
// 注册事件
document.querySelector('.submit').addEventListener('click', () => {const form = document.querySelector('.user-form')// 使用serialize插件获取表单元素const formObj = serialize(form , { hash: true , empty: true})// 添加一个别名属性到收集的表单中formObj.creator = creator// 将性别数字转为 数字型formObj.gender = + formObj.gender// 3.2: 提交到服务器保存axios({url: 'http://hmajax.itheima.net/api/settings',method: 'PUT',data: formObj}).then(result => {// 4.1: 创建toast对象(弹框对象)const toastDom = document.querySelector('.my-toast')const toast = new bootstrap.Toast(toastDom)// 4.2: 调用show方法 -> 显示提示框toast.show()})
})

有几个经典的处理数据的方式,将会再改文章后进行单独补充。也希望自己能够坚持的重复的掌握好学习过的知识技术方式,不断地积累。

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

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

相关文章

nlohmann::json 中文乱码解决方案

// UTF8字符串转成GBK字符串 std::string U2G(const std::string& utf8) {int nwLen MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, NULL, 0);wchar_t* pwBuf new wchar_t[nwLen 1];//加1用于截断字符串 memset(pwBuf, 0, nwLen * 2 2);MultiByteToWideChar(CP_U…

hadoop 3.1.3集群搭建 ubuntu20

相关 hyper-v安装ubuntu-20-server hyper-v建立快照 hyper-v快速创建虚拟机-导入导出虚拟机 准备 虚拟机设置 采用hyper-v方式安装ubuntu-20虚拟机和koolshare hostnameiph01192.168.66.20h02192.168.66.21h03192.168.66.22 静态IP 所有机器都需要按需设置 sudo vim /e…

C语言技巧 ----------调试----------程序员必备技能

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; &#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382;…

【css】nth-child选择器实现表格的斑马纹效果

nth-child() 选择器可以实现为所有偶数&#xff08;或奇数&#xff09;的表格行添加css样式&#xff0c;even&#xff1a;偶数&#xff0c;odd&#xff1a;奇数。 代码&#xff1a; <style> table {border-collapse: collapse;width: 100%; }th, td {text-align: cente…

MySQL 判断字段是否包含数字或者纯数字

使用mysql原生函数FIND_IN_SET查询包含某个数字 select * from text where find_in_set(1,name) 使用regexp正则匹配纯数字 select * from text where (name REGEXP [^0-9.])0; 当 REGEXP ‘[^0-9.]’ 结果为 0 ,代表为纯数字 当 REGEXP ‘[^0-9.]’ 结果为1 ,代表不为纯数…

kube-state-metrics暴露k8s中的监控指标

kube-state-metrics 是一个用于从 Kubernetes 集群中生成各种资源对象状态指标的工具。 通过Deployment等配置完成安装 https://github.com/kubernetes/kube-state-metrics/tree/main/examples/standard 根据官方给定的配置添加至k8s上 注意需要RBAC授权 启动项 要使 kube…

在C语言中内嵌汇编语言

在C语言中内嵌的汇编指令包含大部分的ARM和Thumb指令&#xff0c;不过其使用与汇编文件中的指令有些不同&#xff0c;存在一些限制&#xff0c;主要有以下几个方面&#xff1a; &#xff08;1&#xff09;不能直接向PC寄存器赋值&#xff0c;程序跳转要使用B或者BL指令&#x…

Promise用法

学习了promise之后&#xff0c;有点懂但让我说又说不出来&#xff0c;参考别人的记录一下。 1.什么是promise&#xff1f; 2.promise解决了什么问题 3.es6 promise语法 &#xff08;1&#xff09;then链式操作语法 &#xff08;2&#xff09;catch的语法 &#xff08;3&#xf…

Git Bash 教程!【不是所有人都会用Git】

我不太会用github...... 写这篇文章希望能顺利...... 【写在前面】介绍一下git bash的复制粘贴的快捷键&#xff0c;以防后续不会&#xff1a; 开始&#xff1a; 首先下一个windows&#xff1a;git for windows(地址&#xff1a;Git - Downloading Package (git-scm.com)) &a…

P3957 [NOIP2017 普及组] 跳房子

[NOIP2017 普及组] 跳房子 题目背景 NOIP2017 普及组 T4 题目描述 跳房子&#xff0c;也叫跳飞机&#xff0c;是一种世界性的儿童游戏&#xff0c;也是中国民间传统的体育游戏之一。 跳房子的游戏规则如下&#xff1a; 在地面上确定一个起点&#xff0c;然后在起点右侧画…

基于遗传算法的试题组卷(二)

实例讲解 一、准备工作 1、问题实体 问题实体包含编号、类型&#xff08;类型即题型&#xff0c;分为五种&#xff1a;单选&#xff0c;多选&#xff0c;判断&#xff0c;填空&#xff0c;问答&#xff0c; 分别用1、2、3、4、5表示&#xff09;、分数、难度系数、知识点。一…

【MySQL】触发器 (十二)

🚗MySQL学习第十二站~ 🚩本文已收录至专栏:MySQL通关路 ❤️文末附全文思维导图,感谢各位点赞收藏支持~ 一.引入 触发器是与表有关的数据库对象,作用在insert/update/delete语句执行之前(BEFORE)或之后(AFTER),自动触发并执行触发器中定义的SQL语句集合。它可以协助应…

解决Win11右键菜单问题

✅作者简介&#xff1a;大家好&#xff0c;我是Cisyam&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Cisyam-Shark的博客 &#x1f49e;当前专栏&#xff1a; 程序日常 ✨特色专栏&…

【MyBatis】 框架原理

目录 10.3【MyBatis】 框架原理 10.3.1 【MyBatis】 整体架构 10.3.2 【MyBatis】 运行原理 10.4 【MyBatis】 核心组件的生命周期 10.4.1 SqlSessionFactoryBuilder 10.4.2 SqlSessionFactory 10.4.3 SqlSession 10.4.4 Mapper Instances 与 Hibernate 框架相比&#…

【HAL库】STM32CubeMX开发----STM32F407----LAN8720A----移植FreeModbus实现ModbusTCP

前言 本次实验以 STM32F407VET6 芯片为MCU&#xff0c;使用 25MHz 外部时钟源。 以太网PHY层芯片为 LAN8720A&#xff0c;移植FreeModbus实现ModbusTCP网口通信。 具体内容参考文章&#xff1a;【HAL库】STM32CubeMX开发----STM32F407----ETHLAN8720ALWIP----ping通 本次移植…

零基础强化学习入门分享

&#xff08;一&#xff09;前言&#xff1a;强化学习入门顺序。 以前主要学习硬件PCB单片机等知识&#xff0c;后来接触的项目也大多与电气相关&#xff0c;从一窍不通到稍微找到点门道&#xff0c;中间走过不少弯路&#xff0c;误打误撞中&#xff0c;也留下了一些经验。 我的…

微服务——elasticsearch

初识ES——什么是elasticsearch elasticsearch的发展 初识ES——正向索引和倒排索引 初识ES——es与mysql的概念对比 类比到mysql中是表结构约束 概念对比 初始ES——安装es和kibana 1.部署单点es 1.1创建网络 要安装es容器和kibana容器并让他们之间相连&#xff0c;这里…

RabbitMQ-API

这里写目录标题 Hello word 模式添加依赖生产者消费者获取信道工具类 Work Queues模式消费者代码 C1开启多线程运行启动 消费者代码 C2生产者代码 消息应答自动应答消息应答的方法Multiple 的解释消息自动重新入队消息手动应答代码消费者API 队列持久化消息持久化不公平分发消息…

redis 高级篇 redis 源码的读取分析

一 redis源码分析 1.1 源码分析 1每一个kv键值对应有一个dictEntry。 2.底层数据结构

zabbix简易入门:基本的网络监控、WEB监控

我们越来越发现&#xff1a;网络越来越复杂&#xff0c;网络、应用、云端……故障点随时可能发生&#xff0c;而我们不能人工盯着所有的问题&#xff0c;所以&#xff0c;网管软件是必须的。那么没有预算的情况下&#xff0c;我们只好自己布署简单的网管软件了。 zabbix网站上可…