Ajax实现个人信息修改上传服务器案例(综合练习)

简介: Ajax(await async)的使用、对象解构语法、DOM对象的使用

下图所示,本文实现的效果(文末有源代码)

38d0b8112d254f0f9d143be2b3992c27.gif

本案例整体思路:

442aa40667264292889dfdf656b9a197.png

开始操作啦!

先引入我们的基地址与axios库,获取表单的dom元素

<script src="https://cdn.jsdelivr.net/npm/axios@0.27.2/dist/axios.min.js"></script>
  <script>
    // 设置基地址,省略url重复的写法
    axios.defaults.baseURL = 'http://ajax-api.itheima.net'
    // 获取表单需要的所有dom元素,方便后面的dom操作
    const nickname = document.querySelector('[name="nickname"]')
    const province = document.querySelector('[name="province"]')
    const city = document.querySelector('[name="city"]')
    const area = document.querySelector('[name="area"]')
    const img = document.querySelector('.rounded')

一、制作渲染省市县封装模块

async function getUserInfo() {
      // 获取个人信息
      const { data } = await axios.get('/api/settings')
      console.log(data);
      // 渲染生成昵称与头像
      img.src = data.data.avatar
      nickname.value = data.data.nickname
      // 1.先从服务器获取省份的数据
      const { data: data1 } = await axios.get('/api/province')
      console.log(data1);
      //2获取下拉框
      province.innerHTML = data1.data.map(item => `<option value="${item}">${item}</option>`).join('')
      province.value = data.data.province
    //市 
      const { data: data2 } = await axios.get(`/api/city?pname=${data.data.province}`)
      console.log(data2);
      city.innerHTML = data2.data.map(item => `<option value="${item}">${item}</option>`).join('')
      city.value = data.data.city
      // 地区
      const { data: data3 } = await axios.get(`/api/area?pname=${data.data.province}&cname=${data.data.city}`)
      console.log(data3);
      area.innerHTML = data3.data.map(item => `<option value="${item}">${item}</option>`).join('')
      area.value = data.data.area
    }
    // 调用函数
    getUserInfo()

二、省市地区联动

// 1、开始做省市联动,change事件:当改变的时候才触发
    province.addEventListener('change', async function () {
      console.log(province.value);
      const { data: data2 } = await axios.get(`/api/city?pname=${province.value}`)
      console.log(data2);
      city.innerHTML = data2.data.map(item => `<option value="${item}">${item}</option>`).join('')
      // 3、最后开始做三级(省市县)联动
      const { data: data3 } = await axios.get(`/api/area?pname=${province.value}&cname=${city.value}`)
      console.log(data3);
      area.innerHTML = data3.data.map(item => `<option value="${item}">${item}</option>`).join('')
    })
    // 2、开始做市与县
    city.addEventListener('change', async function () {
      console.log(city.value);
      const { data: data3 } = await axios.get(`/api/area?pname=${province.value}&cname=${city.value}`)
      console.log(data3);
      area.innerHTML = data3.data.map(item => `<option value="${item}">${item}</option>`).join('')
    })

三、图片(线上)预览

// 开始做图片预览
    document.querySelector('#upload').addEventListener('change',function(){
      const file =this.files[0]
      // URL.createObjectURL将我们的文件转线上
      const url =URL.createObjectURL(file)
      img.src=url
    }) 
    // 点击图片触发<input type="file" id="upload" /> 这个设置了hidden看不到(美观一点所以隐藏了css设置了hidden属性)
    img.addEventListener('click',function(){
      document.querySelector('#upload').click()
    })

四、个人信息修改保存模块

// ----修改个人信息
    document.querySelector('.btn-primary').addEventListener('click',async function(e){
      e.preventDefault()
      // 图片保存
      const fd = new FormData()
      // 文件放在FormData容器中用id名调用文件的位置
      fd.append('avatar',upload.files[0])
       const {data:data1}=await axios.post('/api/file',fd)
       console.log(data1);
      //  信息保存
      const { data } = await axios.put('/api/settings',{
        nickname:nickname.value,
        province:province.value,
        city:city.value,
        area:area.value,
        avatar:data1.data.url
      })
      console.log(data);
      getUserInfo()
    })

附上,本文的源代码

<!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>08.案例_个人信息修改</title>
  <link rel="stylesheet" href="https://unpkg.com/bootstrap@5.1.3/dist/css/bootstrap.min.css" />
  <style>
    .form-select {
      width: 103px;
      display: inline-block;
    }
    .col-form-label {
      text-align: right;
    }
    .figure-img {
      width: 100px;
      height: 100px;
      cursor: pointer;
    }
    #upload {
      display: none;
    }
  </style>
</head>
<body>
  <div class="container">
    <h1 class="p-5">个人设置</h1>
    <form class="col-6">
      <div class="row mb-3">
        <label class="col-form-label col-3">昵称:</label>
        <div class="col-9">
          <input class="form-control col-9" type="text" name="nickname" />
        </div>
      </div>
      <div class="row mb-3">
        <label class="col-form-label col-3">籍贯:</label>
        <div class="col-9">
          <select class="form-select col-4" name="province">
            <option value="">--省--</option>
          </select>
          <select class="form-select col-4" name="city">
            <option value="">--市--</option>
          </select>
          <select class="form-select col-4" name="area">
            <option value="">--区--</option>
          </select>
        </div>
      </div>
      <div class="row mb-3">
        <label class="col-form-label col-3">头像:</label>
        <div class="col-9">
          <!--  -->
          <input class="form-control col-9" type="hidden" name="avatar" />
          <figure class="figure">
            <input type="file" id="upload" />
            <img src="https://yanxuan-item.nosdn.127.net/12a882699bd531a1bd428bffe1989525.jpg"
              class="figure-img img-fluid rounded" alt="..." />
            <figcaption class="figure-caption">修改头像</figcaption>
          </figure>
        </div>
      </div>
      <div class="row mb-3">
        <label class="col-3"></label>
        <div class="col-9">
          <button class="btn btn-primary">保存</button>
        </div>
      </div>
    </form>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/axios@0.27.2/dist/axios.min.js"></script>
  <script>
    // 设置基地址,省略url重复的写法
    axios.defaults.baseURL = 'http://ajax-api.itheima.net'
    // 获取表单需要的所有dom元素,方便后面的dom操作
    const nickname = document.querySelector('[name="nickname"]')
    const province = document.querySelector('[name="province"]')
    const city = document.querySelector('[name="city"]')
    const area = document.querySelector('[name="area"]')
    const img = document.querySelector('.rounded')
    async function getUserInfo() {
      // 获取个人信息
      const { data } = await axios.get('/api/settings')
      console.log(data);
      // 渲染生成昵称与头像
      img.src = data.data.avatar
      nickname.value = data.data.nickname
      // 1.先从服务器获取省份的数据
      const { data: data1 } = await axios.get('/api/province')
      console.log(data1);
      //2获取下拉框
      province.innerHTML = data1.data.map(item => `<option value="${item}">${item}</option>`).join('')
      province.value = data.data.province
    //市 
      const { data: data2 } = await axios.get(`/api/city?pname=${data.data.province}`)
      console.log(data2);
      city.innerHTML = data2.data.map(item => `<option value="${item}">${item}</option>`).join('')
      city.value = data.data.city
      // 地区
      const { data: data3 } = await axios.get(`/api/area?pname=${data.data.province}&cname=${data.data.city}`)
      console.log(data3);
      area.innerHTML = data3.data.map(item => `<option value="${item}">${item}</option>`).join('')
      area.value = data.data.area
    }
    // 调用函数
    getUserInfo()
    // 1、开始做省市联动,change事件:当改变的时候才触发
    province.addEventListener('change', async function () {
      console.log(province.value);
      const { data: data2 } = await axios.get(`/api/city?pname=${province.value}`)
      console.log(data2);
      city.innerHTML = data2.data.map(item => `<option value="${item}">${item}</option>`).join('')
      // 3、最后开始做三级(省市县)联动
      const { data: data3 } = await axios.get(`/api/area?pname=${province.value}&cname=${city.value}`)
      console.log(data3);
      area.innerHTML = data3.data.map(item => `<option value="${item}">${item}</option>`).join('')
    })
    // 2、开始做市与县
    city.addEventListener('change', async function () {
      console.log(city.value);
      const { data: data3 } = await axios.get(`/api/area?pname=${province.value}&cname=${city.value}`)
      console.log(data3);
      area.innerHTML = data3.data.map(item => `<option value="${item}">${item}</option>`).join('')
    })
    // 开始做图片预览
    document.querySelector('#upload').addEventListener('change',function(){
      const file =this.files[0]
      // URL.createObjectURL将我们的文件转线上
      const url =URL.createObjectURL(file)
      img.src=url
    }) 
    // 点击图片触发<input type="file" id="upload" /> 这个设置了hidden看不到(美观一点所以隐藏了css设置了hidden属性)
    img.addEventListener('click',function(){
      document.querySelector('#upload').click()
    })
    // ----修改个人信息
    document.querySelector('.btn-primary').addEventListener('click',async function(e){
      e.preventDefault()
      // 图片保存
      const fd = new FormData()
      // 文件放在FormData容器中用id名调用文件的位置
      fd.append('avatar',upload.files[0])
       const {data:data1}=await axios.post('/api/file',fd)
       console.log(data1);
      //  信息保存
      const { data } = await axios.put('/api/settings',{
        nickname:nickname.value,
        province:province.value,
        city:city.value,
        area:area.value,
        avatar:data1.data.url
      })
      console.log(data);
      getUserInfo()
    })
  </script>
</body>
</html>
相关文章
|
3月前
|
存储 Oracle 关系型数据库
服务器数据恢复—光纤存储上oracle数据库数据恢复案例
一台光纤服务器存储上有16块FC硬盘,上层部署了Oracle数据库。服务器存储前面板2个硬盘指示灯显示异常,存储映射到linux操作系统上的卷挂载不上,业务中断。 通过storage manager查看存储状态,发现逻辑卷状态失败。再查看物理磁盘状态,发现其中一块盘报告“警告”,硬盘指示灯显示异常的2块盘报告“失败”。 将当前存储的完整日志状态备份下来,解析备份出来的存储日志并获得了关于逻辑卷结构的部分信息。
|
5月前
|
存储 数据挖掘
服务器数据恢复—EMC存储raid5阵列数据恢复案例
服务器存储数据恢复环境: EMC某型号存储中有一组由8块硬盘组建的raid5磁盘阵列。 服务器存储故障: raid5阵列中有2块硬盘离线,存储不可用,上层应用崩了。
|
4月前
|
数据挖掘
服务器数据恢复——服务器异常断电造成raid5阵列故障的数据恢复案例
某服务器上有一组由12块硬盘组建的raid5磁盘阵列。 机房供电不稳定导致机房中该服务器非正常断电,重启服务器后管理员发现服务器无法正常使用。 意外断电可能会导致服务器上的raid模块损坏。
|
11天前
|
Unix 应用服务中间件 索引
服务器数据恢复—LUN映射出错导致文件系统共享冲突的数据恢复案例
SUN光纤存储系统中有一组由6个硬盘组建的RAID6,划分为若干LUN,MAP到跑不同业务的服务器上,这些服务器上运行的是SOLARIS操作系统。 服务器不存在物理故障。由于公司业务变化,需要增加一台服务器跑新的应用。服务器管理员在原服务器在线的状态下,将其中一个lun映射到一台新服务器上。实际上,这个刚映射过去的卷已经map到了solaris生产系统上的某个lun上了。映射到新服务器后,服务器对这个卷进行初始化的操作,原solaris系统上的磁盘报错,重启服务器后这个卷已经无法挂载。 服务器管理员寻求sun原厂工程师的帮助。sun工程师检测后执行了fsck操作。执行完成后文件系统挂载成功。查
|
5月前
|
数据挖掘 Linux
服务器数据恢复—服务器重装系统导致分区改变的数据恢复案例
服务器上有一组由raid卡组建的raid5磁盘阵列。上层安装linux才做系统,采用XFS文件系统,划分了3个分区。 管理员将服务器的操作系统重装后,发现服务器上的分区发生了改变:一个分区消失,其他分区不可访问。
|
5月前
|
存储 运维 数据挖掘
服务器数据恢复—EqualLogic存储硬盘出现坏道的数据恢复案例
一台EqualLogic某型号存储中有一组由16块SAS硬盘组建的RAID5阵列。上层采用VMFS文件系统,存放虚拟机文件,上层一共分了4个卷。 磁盘故障导致存储不可用,且设备已经过保。
|
6月前
|
存储 固态存储 文件存储
服务器数据恢复—NAS存储精简lv的故障的数据恢复案例
NAS数据恢复环境: QNAP TS-532X NAS设备中有两块1T的SSD固态硬盘和3块5T的机械硬盘。三块机械硬盘组建了一组RAID5阵列,两块固态硬盘组建RAID1阵列。划分了一个存储池,并通过精简LVM划分了7个lv。 NAS故障: 硬盘故障导致无法正常进入系统,7个lv分区丢失。
|
1月前
|
存储 数据挖掘 Linux
服务器数据恢复—重装系统导致OceanStor存储上的分区无法访问的数据恢复案例
服务器存储数据恢复环境: 华为OceanStor某型号存储+扩展盘柜,存储中的硬盘组建了raid5磁盘阵列,上层分配了1个lun。 linux操作系统,划分了两个分区,分区一通过lvm扩容,分区二为xfs文件系统。 服务器存储故障: 工作人员重装系统操作失误导致磁盘分区变化,分区二无法访问,数据丢失。
|
17天前
|
存储 数据挖掘 Windows
服务器数据恢复—RAIDZ上层ZFS文件系统数据恢复案例
一台服务器有32块硬盘,采用Windows操作系统。 服务器在正常运行的时候突然变得不可用。没有异常断电、进水、异常操作、机房不稳定等外部因素。服务器管理员重启服务器,但是服务器无法进入系统。管理员联系北亚企安数据恢复工程师要求恢复服务器数据。
|
2月前
|
存储 算法 数据挖掘
服务器数据恢复—昆腾存储StorNext文件系统数据恢复案例
一台昆腾存储设备中有一组raid5磁盘阵列。阵列上有两块硬盘先后离线,raid5磁盘阵列不可用。

热门文章

最新文章