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>
相关文章
|
2天前
|
存储 数据挖掘 数据库
服务器数据恢复—OceanStor存储数据恢复案例
华为OceanStor T系列某型号存储中有一组由24块机械硬盘组建的一组RAID5阵列。 运行过程中该存储设备RAID5阵列上多块硬盘出现故障离线,阵列失效,存储中数据无法访问。
|
8天前
|
运维 数据挖掘 索引
服务器数据恢复—Lustre分布式文件系统服务器数据恢复案例
5台节点服务器,每台节点服务器上有一组RAID5阵列。每组RAID5阵列上有6块硬盘(其中1块硬盘设置为热备盘,其他5块硬盘为数据盘)。上层系统环境为Lustre分布式文件系统。 机房天花板漏水导致这5台节点服务器进水,每台服务器都有至少2块硬盘出现故障。每台服务器中的RAID5阵列短时间内同时掉线2块或以上数量的硬盘,导致RAID崩溃,服务器中数据无法正常读取。
|
13天前
|
存储 数据挖掘
服务器数据恢复—V7000存储上多块Mdisk成员盘出现故障的数据恢复案例
服务器存储数据恢复环境: 一台V7000存储上共12块SAS机械硬盘(其中1块是热备盘),组建了2组Mdisk,创建了一个pool。挂载在小型机上作为逻辑盘使用,小型机上安装的AIX+Sybase。 服务器存储故障: V7000存储中磁盘出现故障,管理员发现问题后立即更换磁盘。新更换的硬盘在上线同步数据的时候,存储上另一块磁盘也出现问题,导致逻辑盘无法挂接在小型机上,业务暂时中断。V7000存储的管理界面上显示两块硬盘故障脱机。 pool无法加载,其中三个通用卷均无法挂载。
|
22天前
|
安全 数据挖掘
服务器数据恢复—RAID5阵列中两块硬盘离线导致阵列崩溃的数据恢复案例
服务器数据恢复环境: 两组分别由4块SAS接口硬盘组建的raid5阵列,两组raid5阵列划分LUN并由LVM管理,格式化为EXT3文件系统。 服务器故障: RAID5阵列中一块硬盘未知原因离线,热备盘自动激活上线替换离线硬盘。在热备盘上线过程中,raid5阵列中又有一块硬盘离线。热备盘同步失败,该raid阵列崩溃,LVM结构变得不完整,文件系统无法正常使用。
|
27天前
|
存储 监控 调度
云服务器成本优化深度解析与实战案例
本文深入探讨了云服务器成本优化的策略与实践,涵盖基本原则、具体策略及案例分析。基本原则包括以实际需求为导向、动态调整资源、成本控制为核心。具体策略涉及选择合适计费模式、优化资源配置、存储与网络配置、实施资源监控与审计、应用性能优化、利用优惠政策及考虑多云策略。文章还通过电商、制造企业和初创团队的实际案例,展示了云服务器成本优化的有效性,最后展望了未来的发展趋势,包括智能化优化、多云管理和绿色节能。
|
30天前
|
存储 运维 数据挖掘
服务器数据恢复—EVA存储中多块硬盘离线导致存储崩溃的数据恢复案例
一台HP EVA存储中有23块硬盘,挂接到一台windows server操作系统的服务器。 EVA存储上有三个硬盘指示灯亮黄灯,此刻存储还能正常使用。管理员在更换硬盘的过程中,又出现一块硬盘对应的指示灯亮黄灯,存储崩溃,无法使用了。
|
2月前
|
数据挖掘 Linux 数据库
服务器数据恢复—reiserfs文件系统数据恢复案例
服务器数据恢复环境: 一台服务器中有一组由4块SAS硬盘组建的RAID5阵列,上层安装linux操作系统统。分区结构:boot分区+LVM卷+swap分区(按照顺序),LVM卷中划分了一个reiserfs文件系统作为根分区。 服务器故障: 服务器操作系统在运行过程中由于未知原因崩溃,管理员重装操作系统后发现分区结构变为:boot分区+swap分区+LVM卷(按照顺序),LVM卷中文件系统位置有个空的reiserfs超级块。 用户方需要恢复reiserfs文件系统中所有数据,包含数据库、网站程序与网页、OA系统中所有办公文档。
服务器数据恢复—reiserfs文件系统数据恢复案例
|
1月前
|
数据挖掘 Linux Windows
服务器数据恢复—服务器raid0数据恢复及数据迁移的案例
某品牌服务器上有一组由两块SAS硬盘组建的raid0阵列,上层是windows server操作系统+ntfs文件系统。服务器上一个硬盘指示灯显示黄颜色,该指示灯对应的硬盘离线,raid不可用。
|
14天前
|
存储 数据挖掘
服务器数据恢复—ZFS文件系统下数据恢复案例
服务器存储数据恢复环境: ZFS Storage 7320存储阵列中有32块硬盘。32块硬盘分为4组,每组8块硬盘,共组建了3组RAIDZ,每组raid都配置了热备盘。 服务器存储故障: 服务器存储运行过程中突然崩溃,排除人为误操作、断电、进水和其他机房不稳定因素。管理员重启服务器存储,系统无法进入,需要恢复服务器存储中的数据。
|
2月前
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
56 3