AJAX案例——图片上传个人信息操作

server/2025/2/6 3:09:54/

黑马程序员视频地址:

AJAX-Day02-11.图片上传https://www.bilibili.com/video/BV1MN411y7pw?vd_source=0a2d366696f87e241adc64419bf12cab&spm_id_from=333.788.videopod.episodes&p=26

图片上传

  <!-- 文件选择元素 --><input type="file" class="upload">
    //绑定改变事件document.querySelector(".upload").addEventListener("change", e => {//获取图片文件const imgFile = e.target.files[0]    //图片资源保存在files中//使用 FormData 携带图片文件    因为服务器要求以form-data(表单)的样式上传const imgForm = new FormData()imgForm.append("img", imgFile)    //服务器要求将图片资源放在表单中的img属性里提交//提交到服务器axios({url: "https://hmajax.itheima.net/api/uploadimg",method: "POST",data: imgForm}).then(result => {imgUrl = result.data.data.url    //返回的图片链接})})

案例:网站换肤

document.querySelector(".bg-ipt").addEventListener("change", e => {//将图片挂载到表单中的img属性上const imgDom = new FormData() //创建表单实例对象imgDom.append("img", e.target.files[0])//将图片数据传给表单的img属性//上传到服务器axios({url: "https://hmajax.itheima.net/api/uploadimg",method: "POST",data: imgDom}).then(result => {const bgUrl = result.data.data.url//设置为body背景图document.body.style.backgroundImage = `url(${bgUrl})`//保存图片链接到本地存储localStorage.setItem("bgUrl", bgUrl)})
})//从本地存储中读取上一次上传的背景图并加载到页面上
const bgUrl = localStorage.getItem("bgUrl")
bgUrl && (document.body.style.backgroundImage = `url(${bgUrl})`) //使用逻辑中断判断是否要执行加载背景图代码

个人信息设置

1.渲染数据

//获取用户数据
const creator = "USER_A001"
axios({url: "https://hmajax.itheima.net/api/settings",params: {creator}
}).then(result => {//渲染数据const dataObj = result.data.data  /** * dataObj数据详情{"avatar": "http://hmajax.itheima.net/avatar/avatar2.png","nickname": "itheima","email": "itheima@itcast.cn","desc": "我是USER_A001","gender": 0}* Object.keys(dataObj)数据详情,["avatar","nickname","email","desc","gender"]*/Object.keys(dataObj).forEach(key => {if(key === "avatar") //avatar的属性值设置不同,应单独处理{document.querySelector(".prew").src = dataObj[key]}else if(key === "gender")  //gender无法直接赋值,也应单独处理{const gender = document.querySelectorAll(".gender")    //获取两种选项的控件/** * gender数据:{"0": {男选项控件},"1": {女选项控件}}*/const numData = dataObj[key] //获取dataObj属性中的gender值(0 or 1)gender[numData].checked = true  //gender[numData]相应获取控件}else{document.querySelector(`.${key}`).value = dataObj[key]    //其他数据的渲染}})
})

2.修改头像

//上传图片
document.querySelector(".upload").addEventListener("change", e => { //改变事件
const newAvatar = e.target.files[0] //上传的图片数据
const avatarDom = new FormData()  //创建表单实例对象
avatarDom.append("avatar", newAvatar) //将图片数据添加到表单实例对象上
avatarDom.append("creator", creator)  //将用户代号添加到表单实例对象上
axios({url: "https://hmajax.itheima.net/api/avatar",method: "PUT",data: avatarDom
}).then(result => {//获取服务器返回的图片链接const newAvatarimg = result.data.data.avatar//将新的头像回显到页面中document.querySelector(".prew").src = newAvatarimg
})
})

3.修改信息

//修改个人信息
document.querySelector(".submit").addEventListener("click", () => {//收集表单数据const formObj = document.querySelector(".user-form")const newUserForm = serialize(formObj, {hash: true, empty: true})newUserForm.creator = creator //添加用户标识属性newUserForm.gender = +newUserForm.gender //将gender属性转化为数字//提交数据axios({url: "https://hmajax.itheima.net/api/settings",method: "PUT",data: newUserForm})
})

提示框

//HTML代码
<!-- toast 提示框 --><div class="toast my-toast" data-bs-delay="1500">    <!--data-bs-delay持续时间ms--><div class="toast-body"><div class="alert alert-success info-box">操作成功</div></div></div>//JS代码const myToastDom = document.querySelector(".my-toast")const myToast = new bootstrap.Toast(myToastDom)myToast.show()

http://www.ppmy.cn/server/165310.html

相关文章

react中如何获取dom元素

实现代码 const inputRef useRef(null) inputRef.current.focus()

《苍穹外卖》项目学习记录-Day11用户统计

返回的数据由前端这个折线图来约定的&#xff0c;也就是说折线图对这个数据有这样的要求&#xff0c;我们去适应前端的这个数据格式&#xff0c;也就是前端需要什么样的数据&#xff0c;我们后端给它什么样的数据。 统计指定时间区间之内的每一天的用户数量&#xff0c;每一天的…

QMK启用摇杆和鼠标按键功能

虽然选择了触摸屏&#xff0c;我仍选择为机械键盘嵌入摇杆模块&#xff0c;这本质上是对"操作连续性"的执着。   值得深思的是&#xff0c;本次开发过程中借助DeepSeek的代码生成与逻辑推理&#xff0c;其展现的能力已然颠覆传统编程范式&#xff0c;需求描述可自动…

Hive:窗口函数[ntile, first_value,row_number() ,rank(),dens_rank()]和自定义函数

ntile 分组 它把有序的数据集合 平均分配 到 指定的数量&#xff08;num &#xff09;个桶中 , 将桶号分配给每一行。如果不能平均分配&#xff0c;则优先分配较小编号的桶&#xff0c;并且各个桶中能放的行数最多相差1。 被称作窗口函数、序列函数或分析函数, 本质上是一种…

Vue06

目录 一、声明式导航-导航链接 1.需求 2.解决方案 3.通过router-link自带的两个样式进行高亮 二、声明式导航的两个类名 1.router-link-active 2.router-link-exact-active 三、声明式导航-自定义类名&#xff08;了解&#xff09; 1.问题 2.解决方案 3.代码演示 四…

物联网智能项目之——智能家居项目的实现!

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于物联网智能项目之——智能家居项目…

【4】阿里面试题整理

[1]. 介绍一下数据库死锁 数据库死锁是指两个或多个事务&#xff0c;由于互相请求对方持有的资源而造成的互相等待的状态&#xff0c;导致它们都无法继续执行。 死锁会导致事务阻塞&#xff0c;系统性能下降甚至应用崩溃。 比如&#xff1a;事务T1持有资源R1并等待R2&#x…

工业相机如何获得更好的图像色彩

如何获得更好的图像色彩 大部分的工业自动化检测中对物体的色彩信息并不敏感&#xff0c;因此会使用黑白的相机&#xff0c;但是在显微镜成像、颜色分类识别等领域&#xff0c;相机的色彩还原就显得格外重要&#xff0c;在调节相机色彩方面的参数时&#xff0c;有以下几个方面需…