首页 > 其他分享 >ajax个人信息案例

ajax个人信息案例

时间:2022-11-17 20:27:15浏览次数:60  
标签:province city const item 个人信息 value 案例 ajax data

案例分析:

如图所示,页面加载时有数据回填,同时实现select表单同步和图片上传,保存后上传至服务器等功能

HTML模板:


<!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/[email protected]/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://unpkg.com/[email protected]/dist/js/bootstrap.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/axios.min.js"></script>
  <script src="./lib/form-serialize.js"></script>
 
</body>

</html>

一.页面回填

通过获取内置个人信息进行页面回填

<script>
    // 前缀基地址
    axios.defaults.baseURL = 'http://ajax-api.itheima.net/'
    // 获取标签方法$
    function $(id) {
        return document.querySelector('#' + id)
    }
    // 数据回填方法
    async function getInfo() {
        const res = await axios.get('api/settings')
        const { nickname, province, city, area, avatar } = res.data.data
        // 昵称
        $('nickname').value = nickname
        // 头像地址
        $('avatar').src = avatar
        // 给头像框input进行赋值,方便后期拿取数据
        $('avatarInp').value = avatar
        // 省数据
        const provinceAll = await axios.get('api/province')
        $('province').innerHTML += provinceAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
        $('province').value = province
        // 市数据
        const cityAll = await axios.get('api/city?pname=' + province)
        $('city').innerHTML += cityAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
        $('city').value = city
        // 区数据
        const areaAll = await axios.get(`api/area?pname=${province}&cname=${city}`)
        $('area').innerHTML += areaAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
        $('area').value = area

    }
    // 调用回填方法
    getInfo()
</script>

二.省市区下拉框的联动

<script>
    // 省数据下拉框
    $('province').addEventListener('change', async () => {
        // 获取省下市数据
        const cityAll = await axios.get('api/city?pname=' + $('province').value)
        // 渲染市数据
        $('city').innerHTML = cityAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
        // 获取市下区数据
        const areaAll = await axios.get(`api/area?pname=${$('province').value}&cname=${$('city').value}`)
        // 渲染区数据
        $('area').innerHTML = areaAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
    })

    $('city').addEventListener('change', async () => {
        const areaAll = await axios.get(`api/area?pname=${$('province').value}&cname=${$('city').value}`)
        $('area').innerHTML = areaAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
    })
</script>

三.头像图片上传功能

<script>
    // 图片上传功能
    $('upload').addEventListener('change', (e) => {
        // 非空判断
        if (e.target.files.length === 0) {
            return
        }
        // 创建FormData接收
        const fd = new FormData()
        // 将图片数据添加到fd中
        fd.append('avatar', e.target.files[0])
        // 图片上传接口
        axios.post('api/file', fd).then(res => {
            console.log(res);
            $('avatar').src = res.data.data.url
            //  给头像框input进行赋值,方便拿取数据
            $('avatarInp').value = res.data.data.url
        })
    })
    // 图片点击事件
    $('avatar').addEventListener('click', () => {
        // 优化图片上传功能
        $('upload').click()
    })      
</script>

四.将数据上传至服务器保存

<script>
    // 上传点击事件
    $('uploadAll').addEventListener('click', async (e) => {
        // 取消默认刷新操作
        e.preventDefault()
        // 用serialize获取表单中所有内容(前面给头像框input赋值的应用)
        const userFormall = serialize($('userForm'), { hash: true })
        try {
            // 执行成功,上传数据并弹出ok弹框
            await axios.put('api/settings', userFormall)
            alert('ok')
        } catch (error) {
            alert('error')
        }
    })
</script>

五.个人经验

①省市区下拉框联动时,操作省数据联动市数据时,仍需对区数据进行联动

②给图片input框的value赋值,方便最后上传服务器时用serialize获取数据

③附完整源码

<!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/[email protected]/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" id="userForm">
            <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" id="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" id="province">
                        <option value="">--省--</option>
                    </select>
                    <select class="form-select col-4" name="city" id="city">
                        <option value="">--市--</option>
                    </select>
                    <select class="form-select col-4" name="area" id="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" id="avatarInp" />
                    <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="..." id="avatar" />
                        <figcaption class="figure-caption" id="load">修改头像</figcaption>
                    </figure>
                </div>
            </div>
            <div class="row mb-3">
                <label class="col-3"></label>
                <div class="col-9">
                    <button class="btn btn-primary"   id="uploadAll">保存</button>
                </div>
            </div>
        </form>
    </div>

    <script src="https://unpkg.com/[email protected]/dist/js/bootstrap.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/axios.min.js"></script>
    <script src="./lib/form-serialize.js"></script>
    <script>
        // 前缀基地址
        axios.defaults.baseURL = 'http://ajax-api.itheima.net/'
        // 获取标签方法$
        function $(id) {
            return document.querySelector('#' + id)
        }
        // 数据回填方法
        async function getInfo() {
            const res = await axios.get('api/settings')
            const { nickname, province, city, area, avatar } = res.data.data
            // 昵称
            $('nickname').value = nickname
            // 头像地址
            $('avatar').src = avatar
            // 给头像框input进行赋值,方便后期拿取数据
            $('avatarInp').value = avatar
            // 省数据
            const provinceAll = await axios.get('api/province')
            $('province').innerHTML += provinceAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
            $('province').value = province
            // 市数据
            const cityAll = await axios.get('api/city?pname=' + province)
            $('city').innerHTML += cityAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
            $('city').value = city
            // 区数据
            const areaAll = await axios.get(`api/area?pname=${province}&cname=${city}`)
            $('area').innerHTML += areaAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
            $('area').value = area

        }
        // 调用回填方法
        getInfo()

        // 省数据下拉框
        $('province').addEventListener('change', async () => {
            // 获取省下市数据
            const cityAll = await axios.get('api/city?pname=' + $('province').value)
            // 渲染市数据
            $('city').innerHTML = cityAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
            // 获取市下区数据
            const areaAll = await axios.get(`api/area?pname=${$('province').value}&cname=${$('city').value}`)
            // 渲染区数据
            $('area').innerHTML = areaAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
        })

        $('city').addEventListener('change', async () => {
            const areaAll = await axios.get(`api/area?pname=${$('province').value}&cname=${$('city').value}`)
            $('area').innerHTML = areaAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
        })

        // 图片上传功能
        $('upload').addEventListener('change',(e)=>{
            // 非空判断
            if(e.target.files.length===0){
                return
            }
            // 创建FormData接收
            const fd = new FormData()
            // 将图片数据添加到fd中
            fd.append('avatar', e.target.files[0])
            // 图片上传接口
            axios.post('api/file',fd).then(res=>{
                console.log(res);
                $('avatar').src = res.data.data.url
                //  给头像框input进行赋值,方便拿取数据
                $('avatarInp').value = res.data.data.url
            })
        })
        // 图片点击事件
        $('avatar').addEventListener('click',()=>{
            // 优化图片上传功能
            $('upload').click()
        })
      
        // 上传点击事件
        $('uploadAll').addEventListener('click', async (e)=>{
            // 取消默认刷新操作
            e.preventDefault()
            // 用serialize获取表单中所有内容(前面给头像框input赋值的应用)
            const userFormall = serialize($('userForm'),{hash:true})
            try {
                // 执行成功,上传数据并弹出ok弹框
                await axios.put('api/settings',userFormall)
                alert('ok')
            } catch (error) {
                alert('error')
            }
        })
    </script>
</body>

</html>

标签:province,city,const,item,个人信息,value,案例,ajax,data
From: https://www.cnblogs.com/Ayako/p/16900651.html

相关文章

  • CSS属性2_盒子模型和CSS案例_注册页面
    CSS属性2_盒子模型:1.盒子模型:控制布局margin:外边距padding:内边距默认情况下内边距会影响整个盒子的大小box-sizing:border-box;设置盒子的属性,让width和height就......
  • 案例解析:电商销售数据可视化管理系统
    电商行业的快速发展得益于数字化经济的快速发展,大家纷纷借助大数据、5G等技术将自己的企业精细化管理。 电商销售数据可视化操作一般分为4步:①了解拥有的数据②确定想......
  • pytho案例
    发邮件2022年7月31日14:37importosfromopenpyxlimportload_workbookimportwin32com.clientaswin32wb=load_workbook("``邮件地址``.xlsx")ws=wb.activ......
  • 聚水潭对接金蝶云星空案例
    01系统说明:聚水潭:是由上海聚水潭网络科技有限公司基于SaaS模式开发的商家ERP软件系统,公司创始团队聚集了一群来自阿里、麦包包等知名企业的技术、仓管、市场营销精英,具有......
  • 五、国网信通数据中台案例
    在互联网时代,企业需要快速响应、挖掘、引领用户需求,此时,借助平台的力量是企业生存、发展的关键因素。多年以来,不少企业已经建立了“前台+后台”的平台化架构。 前台是企......
  • SQL优化案例4(肇庆某项目)
    泽就找我优化条SQL,反馈执行时间很慢需要1分钟才能出结果,然后安排!--原SQLselecthiber.dmcod                             ......
  • SQL改写案例1
    一开发哥们找我改写SQL,他写的逻辑始终不对,安排!--他写的SQL:#order_id是主键withaas(selectstr_to_date(regist_time,'%Y-%m-%d')asregist_timefrominno_busi_info......
  • Linux内存泄露案例分析和内存管理分享
    作者:李遵举一、问题近期我们运维同事接到线上LB(负载均衡)服务内存报警,运维同事反馈说LB集群有部分机器的内存使用率超过80%,有的甚至超过90%,而且内存使用率还再不停的增长......
  • SQL优化案例2(白云区短信项目)
    京华开发一哥们找我优化条报表SQL,反馈执行时间很慢需要18s才能出结果,安排。#原SQL    SELECT    2ASTYPE,    to_char(a."create_time",'yyy......
  • PG-SQL优化案例1(某卫健委项目)
    10月24日同事让我优化条SQL语句,卫建委项目,客户说在ORACLE5s能出结果,在我们数据库跑出结果要30s。SQL、执行计划、索引如下:SELECTORDER_CREATE_TIME,       ......