Ajax-案例-图书管理

1.5k 词
案例-图书管理

图书管理#

序号 书名 作者 出版社 操作
1 JavaScript程序设计 马特·弗里斯比 人民邮电出版社 删除 编辑

案例-图书管理#

渲染列表#

自己的图书数据:给自己起个外号,并告诉服务器,默认会有三本书,基于这三本书做数据的增删改查

'起外号'是因为不同的用户有不同的数据,这里暂时以 '外号'作为不同用户的唯一标识

// 封装渲染函数
// 外号
const creator = 'changfeng_E'

function getBookList() {
    // 1.1获取数据
    axios({
        url: 'http://hmajax.itheima.net/api/books',
        params: {
            creator
        }
    }).then(res => {
        console.log(res);
        const bookList = res.data.data;
        console.log(bookList);
        // 渲染数据
        const htmlStr = bookList.map((item, idx) => {
            return `<tr>
            <td>${idx+1}</td>
            <td>${item.bookname}</td>
            <td>${item.author}</td>
            <td>${item.publisher}</td>
            <td>
                <span class="del">删除</span>
                <span class="edit">编辑</span>
            </td>
        </tr>`
        }).join('')
        document.querySelector('.list').innerHTML = htmlStr
    })
}

增-新增图书#

新增图书-弹框(显示隐藏)->收集数据&提交保存->刷新-图书列表

// 2.1创建弹框对象
const addModalDom = document.querySelector('.add-modal')
const addModal = new bootstrap.Modal(addModalDom);
// 保存按钮点击事件
document.querySelector('.add-btn').addEventListener('click', function() {
    const addForm = document.querySelector('.add-form')
    const bookObj = serialize(addForm, { hash: true, empty: true })
    console.log(bookObj);
    // 提交到服务器
    axios({
        url: 'http://hmajax.itheima.net/api/books',
        method: 'post',
        data: {
            // 需要传入的参数与表单数据相比只多一个creator,可以使用展开运算符展开bookObj,再加上一个creator即可
            // 当然用对象解构也可
            ...bookObj,
            creator
        }
    }).then(res => {
        console.log(res);
        // 2.3添加成功后重新渲染
        getBookList();
        // 重置表单
        addForm.reset();
        // 隐藏modal
        addModal.hide()
    });
})

删-删除图书#

绑定点击事件,获取图书id->调用删除接口->刷新图书列表

// 3.1删除元素点击事件绑定
// 删除元素为动态创建的,所以点击事件使用事件委托来绑定,委托到父级.list上
document.querySelector('.list').addEventListener('click', function(e) {
    // 获取触发事件的目标元素
    const del = e.target
    console.log(del);
    // 若是删除元素则可删除
    if (del.classList.contains('del')) {
        console.log('点击了删除元素');
        // 获取图书id(自定义属性id)
        const bookId = del.parentNode.dataset.id
        console.log(bookId);
        // 3.2调用删除接口
        axios({
            url: `http://hmajax.itheima.net/api/books/${bookId}`,
            method: 'delete'
        }).then(res => {
            console.log(res);
            // 刷新页面
            getBookList()
        })
    }
})

改-编辑图书#

编辑图书-弹框(显示隐藏)->表单(数据回显)->保存修改&刷新列表

// 4.1编辑弹框-显示隐藏
const editDom = document.querySelector('.edit-modal')
const editModal = new bootstrap.Modal(editDom);
// 编辑元素点击事件
document.querySelector('.list').addEventListener('click', function(e) {
    const edit = e.target
    console.log(edit.classList);
    if (edit.classList.contains('edit')) {
        console.log('点击了编辑元素');
        // 4.2获取图书数据回显到编辑表单
        const bookId = edit.parentNode.dataset.id;
        console.log(bookId);
        axios({
            url: `http://hmajax.itheima.net/api/books/${bookId}`
        }).then(res => {
            console.log(res);
            const bookObj = res.data.data;
            // 数据对象的属性和标签类名一致
            // 遍历数据对象,使用属性去获取对应的标签,快速赋值
            const keys = Object.keys(bookObj)
            keys.forEach(key => {
                document.querySelector(`.edit-form .${key}`).value = bookObj[key]
            })
        })
        editModal.show()
    }
});
// 修改按钮-点击-隐藏弹框
document.querySelector('.edit-btn').addEventListener('click', function() {
    // 4.3提交保存修改,刷新列表
    const editForm = document.querySelector('.edit-form')
    const { id, bookname, author, publisher } = serialize(editForm, { hash: true, empty: true });
    axios({
        url: `http://hmajax.itheima.net/api/books/${id}`,
        method: 'put',
        data: {
            bookname,
            author,
            publisher,
            creator
        }
    }).then(res => {
        // 修改成功后,重新获取并刷新列表
        getBookList()
            // 隐藏弹框
        editModal.hide()
    })
})