综合案例 --- 个人信息设置 + Bootstrap5 提示框(Toast)

1. 获取个人信息

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>个人信息设置</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css">
    <link rel="stylesheet" href="http://at.alicdn.com/t/c/font_4512145_zn7nbghvkxg.css">
    <style>
        .message input, .message textarea {
            width: 300px;
        }
    </style>
</head>
<body>
<div>
    <h3>基本设置</h3>
    <form class="message">
        <div class="mb-3" style="width: 100px;height: 100px">
            <img src="../images/默认头像.png" alt=""
                 style="width: 100px;height: 100px;border-radius: 50%;margin-bottom: 10px" class="avatar">
            <label for="exampleFormControlInputAvatar" class="form-label"
                   style="border: 1px solid gray;border-radius: 15%;padding: 5px 10px">更换头像</label>
            <input type="file" class="form-control" id="exampleFormControlInputAvatar" name="avatar"
                   style="display: none">
        </div>
        <div class="mb-3" style="margin-top: 80px">
            <label for="exampleFormControlInputEmail" class="form-label">邮箱</label>
            <input type="email" class="form-control email" id="exampleFormControlInputEmail" name="email"
                   placeholder="请输入邮箱">
        </div>
        <div class="mb-3">
            <label for="exampleFormControlInputNickname" class="form-label">昵称</label>
            <input type="text" class="form-control nickname" id="exampleFormControlInputNickname" name="nickname"
                   placeholder="请输入昵称">
        </div>
        <div class="mb-3">
            <label for="exampleFormControlInputGender" class="form-label">性别</label>
            <div id="exampleFormControlInputGender">
                <input type="radio" class="gender" name="gender" value="1">男
                <input type="radio" class="gender" name="gender" value="0">女
            </div>

        </div>
        <div class="mb-3">
            <label for="exampleFormControlTextarea1" class="form-label">个人简介</label>
            <textarea class="form-control desc" id="exampleFormControlTextarea1" name="desc" rows="3"></textarea>
        </div>
    </form>
</div>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/form-serialize@0.7.2/index.min.js"></script>


<script>
    // 获取用户的基本信息,并将用户信息填写进form表单中
    const creator = "老孙"
    axios({
        url: "http://hmajax.itheima.net/api/settings",
        params: {
            creator
        }
    }).then(result => {
        const data = result.data.data
        console.log(data)
        Object.keys(data).forEach(key => {
            // 头像需要单独处理
            if (key === "avatar") {
                document.querySelector(".avatar").src = data[key]
            } else if (key === "gender") {    // 性别需要单独处理
                document.querySelectorAll(".gender").forEach(item => {
                    // 从服务器返回的gender是数组类型,需要转成字符串再进行比较
                    item.value === String(data[key]) ? item.checked = true : item.checked = false
                })
            } else {
                document.querySelector(`.message .${key}`).value = data[key]
            }
        })
    })

</script>
</body>
</html>

2. 修改头像

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>个人信息设置</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css">
    <link rel="stylesheet" href="http://at.alicdn.com/t/c/font_4512145_zn7nbghvkxg.css">
    <style>
        .message input, .message textarea {
            width: 300px;
        }
    </style>
</head>
<body>
<div>
    <h3>基本设置</h3>
    <form class="message">
        <div class="mb-3" style="width: 100px;height: 100px">
            <img src="../images/默认头像.png" alt=""
                 style="width: 100px;height: 100px;border-radius: 50%;margin-bottom: 10px" class="avatar">
            <label for="exampleFormControlInputAvatar" class="form-label"
                   style="border: 1px solid gray;border-radius: 15%;padding: 5px 10px">更换头像</label>
            <input type="file" class="form-control" id="exampleFormControlInputAvatar" name="avatar"
                   style="display: none">
        </div>
        <div class="mb-3" style="margin-top: 80px">
            <label for="exampleFormControlInputEmail" class="form-label">邮箱</label>
            <input type="email" class="form-control email" id="exampleFormControlInputEmail" name="email"
                   placeholder="请输入邮箱">
        </div>
        <div class="mb-3">
            <label for="exampleFormControlInputNickname" class="form-label">昵称</label>
            <input type="text" class="form-control nickname" id="exampleFormControlInputNickname" name="nickname"
                   placeholder="请输入昵称">
        </div>
        <div class="mb-3">
            <label for="exampleFormControlInputGender" class="form-label">性别</label>
            <div id="exampleFormControlInputGender">
                <input type="radio" class="gender" name="gender" value="1">男
                <input type="radio" class="gender" name="gender" value="0">女
            </div>

        </div>
        <div class="mb-3">
            <label for="exampleFormControlTextarea1" class="form-label">个人简介</label>
            <textarea class="form-control desc" id="exampleFormControlTextarea1" name="desc" rows="3"></textarea>
        </div>
    </form>
</div>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/form-serialize@0.7.2/index.min.js"></script>


<script>
    const creator = "老孙"
    axios({
        url: "http://hmajax.itheima.net/api/settings",
        params: {
            creator
        }
    }).then(result => {
        const data = result.data.data
        console.log(data)
        Object.keys(data).forEach(key => {
            if (key === "avatar") {
                document.querySelector(".avatar").src = data[key]
            } else if (key === "gender") {    
                document.querySelectorAll(".gender").forEach(item => {
                    item.value === String(data[key]) ? item.checked = true : item.checked = false
                })
            } else {
                document.querySelector(`.message .${key}`).value = data[key]
            }
        })
    })

    // 修改头像
    // 1. 发送请求提交数据到后端接口
    // 2. 将返回的url覆盖img的src
    document.querySelector("#exampleFormControlInputAvatar").addEventListener("change", function (e) {
        const fileObj = e.target.files[0]
        const formData = new FormData()
        formData.append("avatar", fileObj)
        formData.append("creator", creator)
        axios({
            url: "http://hmajax.itheima.net/api/avatar",
            method: "put",
            data: formData
        }).then(result => {
            console.log(result)
            if (result.status === 200) {
                document.querySelector(".avatar").src = result.data.data.avatar
            }
        })
    })

</script>
</body>
</html>

3. 修改信息

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>个人信息设置</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css">
    <link rel="stylesheet" href="http://at.alicdn.com/t/c/font_4512145_zn7nbghvkxg.css">
    <style>
        .message input, .message textarea {
            width: 300px;
        }
    </style>
</head>
<body>
<div>
    <h3>基本设置</h3>
    <form class="message">
        <div class="mb-3" style="width: 100px;height: 100px">
            <img src="../images/默认头像.png" alt=""
                 style="width: 100px;height: 100px;border-radius: 50%;margin-bottom: 10px" class="avatar">
            <label for="exampleFormControlInputAvatar" class="form-label"
                   style="border: 1px solid gray;border-radius: 15%;padding: 5px 10px">更换头像</label>
            <input type="file" class="form-control" id="exampleFormControlInputAvatar" name="avatar"
                   style="display: none">
        </div>
        <div class="mb-3" style="margin-top: 80px">
            <label for="exampleFormControlInputEmail" class="form-label">邮箱</label>
            <input type="email" class="form-control email" id="exampleFormControlInputEmail" name="email"
                   placeholder="请输入邮箱">
        </div>
        <div class="mb-3">
            <label for="exampleFormControlInputNickname" class="form-label">昵称</label>
            <input type="text" class="form-control nickname" id="exampleFormControlInputNickname" name="nickname"
                   placeholder="请输入昵称">
        </div>
        <div class="mb-3">
            <label for="exampleFormControlInputGender" class="form-label">性别</label>
            <div id="exampleFormControlInputGender">
                <input type="radio" class="gender" name="gender" value="1">男
                <input type="radio" class="gender" name="gender" value="0">女
            </div>

        </div>
        <div class="mb-3">
            <label for="exampleFormControlTextarea1" class="form-label">个人简介</label>
            <textarea class="form-control desc" id="exampleFormControlTextarea1" name="desc" rows="3"></textarea>
        </div>
        <div class="btn btn-primary save-btn">保存</div>
    </form>
</div>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/form-serialize@0.7.2/index.min.js"></script>

<script>
    const creator = "老孙"
    axios({
        url: "http://hmajax.itheima.net/api/settings",
        params: {
            creator
        }
    }).then(result => {
        const data = result.data.data
        console.log(data)
        Object.keys(data).forEach(key => {
            if (key === "avatar") {
                document.querySelector(".avatar").src = data[key]
            } else if (key === "gender") {    
                document.querySelectorAll(".gender").forEach(item => {
                    item.value === String(data[key]) ? item.checked = true : item.checked = false
                })
            } else {
                document.querySelector(`.message .${key}`).value = data[key]
            }
        })
    })

    document.querySelector("#exampleFormControlInputAvatar").addEventListener("change", function (e) {
        const fileObj = e.target.files[0]
        const formData = new FormData()
        formData.append("avatar", fileObj)
        formData.append("creator", creator)
        axios({
            url: "http://hmajax.itheima.net/api/avatar",
            method: "put",
            data: formData
        }).then(result => {
            console.log(result)
            if (result.status === 200) {
                document.querySelector(".avatar").src = result.data.data.avatar
            }
        })
    })
    
    // 修改个人信息
    // 1. 收集form表单的数据
    // 2. 将收集到的表单数据提交到后台服务器保存
    // 3. 重新写回到表单中
    document.querySelector(".save-btn").addEventListener("click", function () {
        const form = document.querySelector(".message")
        const formObj = serialize(form, {hash: true, empty: true})
        formObj.creator = creator
        formObj.gender = Number(formObj.gender)
        console.log(formObj)
        axios({
            url: "http://hmajax.itheima.net/api/settings",
            method: "put",
            data: formObj
        }).then(result => {
            const data = result.data.data
            Object.keys(data).forEach(key => {
                if (key === "avatar") {
                    document.querySelector(".avatar").src = data[key]
                } else if (key === "gender") {
                    document.querySelectorAll(".gender").forEach(item => {
                        if (item.value === String(data[key])) {
                            item.checked = true
                        }
                    })
                } else {
                    document.querySelector(`.${key}`).value = data[key]
                }
            })
        })
    })
</script>
</body>
</html>

4. 修改成功后的提示框

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>个人信息设置</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css">
    <link rel="stylesheet" href="http://at.alicdn.com/t/c/font_4512145_zn7nbghvkxg.css">
    <style>
        .message input, .message textarea {
            width: 300px;
        }
    </style>
</head>
<body>
<div>
    <h3 style="position: relative">基本设置</h3>
    <!-- 1. 提前配置好提示框的样式和内部信息,data-bs-delay为1.5s后消失 -->
    <div class="toast message-toast" data-bs-delay="1500" style="background-color: #d1e7dd;padding: 10px 10px;position: absolute;z-index: 10;float: left">操作成功</div>
    <div class="toast message-toast1" data-bs-delay="1500" style="background-color: #d1e7dd;padding: 10px 10px;position: absolute;z-index: 10;float: left">头像修改成功</div>
    <form class="message">
        <div class="mb-3" style="width: 100px;height: 100px">
            <img src="../images/默认头像.png" alt=""
                 style="width: 100px;height: 100px;border-radius: 50%;margin-bottom: 10px" class="avatar">
            <label for="exampleFormControlInputAvatar" class="form-label"
                   style="border: 1px solid gray;border-radius: 15%;padding: 5px 10px">更换头像</label>
            <input type="file" class="form-control" id="exampleFormControlInputAvatar" name="avatar"
                   style="display: none">
        </div>
        <div class="mb-3" style="margin-top: 80px">
            <label for="exampleFormControlInputEmail" class="form-label">邮箱</label>
            <input type="email" class="form-control email" id="exampleFormControlInputEmail" name="email"
                   placeholder="请输入邮箱">
        </div>
        <div class="mb-3">
            <label for="exampleFormControlInputNickname" class="form-label">昵称</label>
            <input type="text" class="form-control nickname" id="exampleFormControlInputNickname" name="nickname"
                   placeholder="请输入昵称">
        </div>
        <div class="mb-3">
            <label for="exampleFormControlInputGender" class="form-label">性别</label>
            <div id="exampleFormControlInputGender">
                <input type="radio" class="gender" name="gender" value="1">男
                <input type="radio" class="gender" name="gender" value="0">女
            </div>

        </div>
        <div class="mb-3">
            <label for="exampleFormControlTextarea1" class="form-label">个人简介</label>
            <textarea class="form-control desc" id="exampleFormControlTextarea1" name="desc" rows="3"></textarea>
        </div>
        <div class="btn btn-primary save-btn">保存</div>
    </form>
</div>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/form-serialize@0.7.2/index.min.js"></script>

<script>
    const creator = "老孙"

    axios({
        url: "http://hmajax.itheima.net/api/settings",
        params: {
            creator
        }
    }).then(result => {
        const data = result.data.data
        Object.keys(data).forEach(key => {
            if (key === "avatar") {
                document.querySelector(".avatar").src = data[key]
            } else if (key === "gender") {    
                document.querySelectorAll(".gender").forEach(item => {
                    item.value === String(data[key]) ? item.checked = true : item.checked = false
                })
            } else {
                document.querySelector(`.message .${key}`).value = data[key]
            }
        })
    })

    const toastDom1 = document.querySelector('.message-toast1')
    const toast1 = new bootstrap.Toast(toastDom1)
    document.querySelector("#exampleFormControlInputAvatar").addEventListener("change", function (e) {
        const fileObj = e.target.files[0]
        const formData = new FormData()
        formData.append("avatar", fileObj)
        formData.append("creator", creator)
        axios({
            url: "http://hmajax.itheima.net/api/avatar",
            method: "put",
            data: formData
        }).then(result => {
            console.log(result)
            if (result.status === 200) {
                document.querySelector(".avatar").src = result.data.data.avatar
                toast1.show()
            }
        })
    })


    const toastDom = document.querySelector('.message-toast')   
    const toast = new bootstrap.Toast(toastDom)   // 2. 实例化提示框
    document.querySelector(".save-btn").addEventListener("click", function () {
        const form = document.querySelector(".message")
        const formObj = serialize(form, {hash: true, empty: true})
        formObj.creator = creator
        formObj.gender = Number(formObj.gender)
        console.log(formObj)
        axios({
            url: "http://hmajax.itheima.net/api/settings",
            method: "put",
            data: formObj
        }).then(result => {
            if (result.status === 200) {
                const data = result.data.data
                Object.keys(data).forEach(key => {
                    if (key === "avatar") {
                        document.querySelector(".avatar").src = data[key]
                    } else if (key === "gender") {
                        document.querySelectorAll(".gender").forEach(item => {
                            if (item.value === String(data[key])) {
                                item.checked = true
                            }
                        })
                    } else {
                        document.querySelector(`.${key}`).value = data[key]
                    }
                })
                toast.show()   // 3. 显示提示框
            }

        })
    })
</script>
</body>
</html>

5. Toast 提示框使用流程

1. HTML标签片段

<!-- data-bs-delay="1500" 表示 1.5s 后消失 -->
<div class="toast message-toast" data-bs-delay="1500">操作成功</div>

2. CSS 控制样式和显示位置

.message-toast{
  background-color: #d1e7dd;
  padding: 10px 10px;
  position: absolute;
  top: 10px
  left:10px
  z-index: 10;
}

3. 调用

const toastDom = document.querySelector(".message-toast")
const toast = new bootstrap.Toast(toastDom)
toast.show()  // 显示
toast.hidde() // 隐藏
posted @ 2024-05-28 15:20  河图s  阅读(30)  评论(0)    收藏  举报