Ajax图书管理系统-完整代码与细节部分详细讲解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在写这篇博客前看了很多相关博客,觉得不够全面,所以打算写一个细致版本的图书管理系统博客。希望对大家有帮助!

一、知识储备

相信很多朋友都是从哔站视频过来的。有卡在bookstrap的,也有卡在bug处停下来的。
但是我们在学写这个系统时候其实并不需要学习bookstrap。重要的是jquery语法的了解储备以及ajax的jq封装写法储备。

二、样式代码

如果你并不能利用bookstrap写出代码,可以复制粘贴这个:你将获得一个比较标准的前端样式:

<!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>Document</title>
    <script src="./jquery.min.js"></script>
    <link rel="stylesheet" href="./bootstrap-3.3.7/css/bootstrap.min.css">
</head>

<body style="padding: 15px">
    <!-- 添加图书panel面板 -->

    <div class="panel panel-primary">
        <div class="panel-heading">
            <h3 class="panel-title">添加新图书</h3>
        </div>
        <div class="panel-body form-inline">

            <div class="input-group">
                <div class="input-group-addon">书名</div>
                <input type="text" class="form-control" id="iptBookname" placeholder="请输入书名">
            </div>

            <div class="input-group">
                <div class="input-group-addon">作者</div>
                <input type="text" class="form-control" id="iptAuthor" placeholder="请输入作者">
            </div>

            <div class="input-group">
                <div class="input-group-addon">出版社</div>
                <input type="text" class="form-control" id="iptPublisher" placeholder="请输入出版社">
            </div>

            <button id="btnAdd" class="btn btn-primary">添加</button>

        </div>
    </div>

    <!-- 图书表格部分 -->

    <table class="table table-bordered table-hover">
        <thead>
            <tr>
                <th>ID</th>
                <th>书名</th>
                <th>作者</th>
                <th>出版社</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody id="tb">

        </tbody>
    </table>

三,·此案例需要了解的东西

这部分大家可以浅过一遍,权当复习。全是本次demo跟ajax没有太大关系的细节部分,也就是咱的js基础部分!

3.1 简单接口文档的读法

a.url完整路径:请求根路径url地址 + 具体api
b.调用方式:post&&get
c.数据实例
d.status,如果你的操作成功,会有一个status的固定值,固定值可以在接口文档中看到。所以我们在验证操作是否成功时可以利用status,示例代码:

if (res.status != 200) {
	return alert('获取数据失败');
}

e.属性名称也需从接口文档中获取

3.2 jq中的事件委托

3.2.1 事件冒泡

<body>
    <div class="father">
        <div class="son"></div>
    </div>

    <script>
        var father = document.querySelector('.father');
        var son = document.querySelector('.son');
        father.addEventListener('click', function() {
            alert('我是father');
        })
        son.addEventListener('click', function(e) {
            alert('我是son');
            // e.stopPropagation();
        })
    </script>

大家看以上代码,当我们点击父亲元素:
在这里插入图片描述

当我们点击子元素:
先出现:
在这里插入图片描述
再出现:
在这里插入图片描述
这就叫做事件冒泡:当事件发生后,这个事件就要开始传播(从里到外或者从外向里)。为什么要传播呢?因为事件源本身(可能)并没有处理事件的能力,即处理事件的函数(方法)并未绑定在该事件源上。
解决事件冒泡只需要一条代码:

e.stopPropagation();

或者我们可以把事件绑定在父元素身上也可以避免事件冒泡。

3.2.2 事件捕获

当我们理解事件冒泡,事件委托就能够简单理解了。
跟冒泡刚好相反,事件冒泡是子->父,而事件捕获是父->子,可结合此图理解:
在这里插入图片描述
右边是刚刚讲的事件冒泡,而左边则是所谓的事件捕获。
而我们本次项目代码书写则需要利用事件流的处理机制——事件委托。

3.2.3 事件委托

大家来看如下代码


    <ul>
        <li>知否知否应是绿肥红瘦</li>
        <li>知否知否应是绿肥红瘦</li>
        <li>知否知否应是绿肥红瘦</li>
        <li>知否知否应是绿肥红瘦</li>
        <li>知否知否应是绿肥红瘦</li>
    </ul>

    <script>
        //给父节点添加监听器
        var ul = document.querySelector('ul');
        ul.addEventListener('click', function(e) {
            alert('弹出');
            e.target.style.backgroundColor = 'pink';
        })
    </script>

我们绑定了父元素,但是点击小li也可以弹出相关信息。这就是利用了事件委托。==在做项目时,我们虽然不能绑定动态生成的元素,但是我们可以绑定它的父亲元素。利用这一原理,它的子元素也可以“被绑定”。这就叫做事件委托。==在后面的项目代码阐述中将结合此原理进行讲解。

3.3 join()的五种用法

概括性作用:将array数组中每个元素都转化为字符串,用自定义的连接符进行分割

3.1 将数组中每一个元素转化为字符串–join.()

        var array = ['hello','world'];
        console.log(array.join());

最后得到的结果
在这里插入图片描述

3.2 将字符组成单词,意为无缝链接–join.(‘’)

        var array1 = ['h','e','l','l','o'];
        console.log(array1.join(''));

在这里插入图片描述

3.3 分割功能,将单词组成句子-join(’ '),引号中有空格

        var array2 = ['i','like','you'];
        console.log(array2.join(' '));

在这里插入图片描述
利用的是分割功能,如果是别的符号也可以起到分割作用

        var array2 = ['i','like','you'];
        console.log(array2.join('-'));

在这里插入图片描述

3.4 判断返回是否为空

join(‘’)返回空可以有效判断数组是不是一个空字符数组

3.5 绑定事件,渲染界面

这是最重要最强大的功能。在后面的代码中我们可以深刻体现

四,整体代码及讲解

4.1 获取数据代码

            function getBookList() {
                $.get('http://www.liulongbin.top:3006/api/getbooks', function (res) {
                    if (res.status != 200) {
                        return alert('获取数据失败');
                    }
                    console.log(res);
                    var rows = [];
                    $.each(res.data, function (i, item) {
                        rows.push('<tr><td>' + item.id + '</td><td>' + item.bookname + '</td><td>' + item.author + '</td><td>' + item.publisher + '</td><td><a href="javascript:;" class="del" data-id="' + item.id + '">删除</a></td></tr>');
                    })
                    $('#tb').empty().append(rows.join(''));
                })
            }
            getBookList();

讲解:利用get获取信息。status是判断是否执行成功的标准。如果是固定数,在这里是200(看接口内的规定),则执行成功,否则失败。
这里先定义一个空数组。将数据拼接好后放入数组中。
然后再渲染界面前清空页面,最后渲染。

细节:
a.放入数组中语句的规范性
b.渲染前清空
c.最后需要调用

4.2 删除图书

            $('tbody').on('click', '.del', function () {
                var id = $(this).attr('data-id');
                $.get('http://www.liulongbin.top:3006/api/delbook',{id: id},function(res) {
                    if(res.status !=  200) {
                        return alert('删除图书失败');
                    }
                    getBookList();
                })
            })

先绑定事件。这里绑定的是tbody。因为a是动态生成的,无法直接绑定。利用的原理如第三大块。
接着是调用get接口。没有单独的删除接口,根据接口文档调用get。一切需要查看接口文档为主。然后再执行删除。
再调用文档时候要注意id,id是我们自定义的属性。选择相应的id删除(id作为携带数据)

细节:
a.a的事件委托
b.自定义id的写法

4.3 添加图书

            $('#btnAdd').on('click', function() {
                var bookname = $('#iptBookname').val().trim();
                var author = $('#iptAuthor').val().trim();
                var publisher = $('#iptPublisher').val().trim();
                if(bookname.length <= 0 && author.length <= 0 && publisher.length <= 0) {
                    return alert('请填写完整的图书信息!');
                }
                $.post('http://www.liulongbin.top:3006/api/addbook',{bookname: bookname,author: author,publisher: publisher}, function(res) {
                if(res.status !== 201) {
                    return alert('添加失败');
                }
                getBookList();
                $('#iptBookname').val('');
                $('#iptAuthor').val('');
                $('#iptPublisher').val('');
            })
            })


这一部分先获取了图书的属性,val是获取输入框的内容,trim用于去掉字符串中的空格。做完这些后判断数据,如若满足条件则调用post接口添加数据。再添加完后需要清空输入框中的内容。

细节:
a.图书属性的获取,val(),trim() 的利用
b.再提交完后要清空输入框便于下一次使用

五,代码整合

可以拿去直接调试哦!

<!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>Document</title>
    <script src="./jquery.min.js"></script>
    <link rel="stylesheet" href="./bootstrap-3.3.7/css/bootstrap.min.css">
</head>

<body style="padding: 15px">
    <!-- 添加图书panel面板 -->

    <div class="panel panel-primary">
        <div class="panel-heading">
            <h3 class="panel-title">添加新图书</h3>
        </div>
        <div class="panel-body form-inline">

            <div class="input-group">
                <div class="input-group-addon">书名</div>
                <input type="text" class="form-control" id="iptBookname" placeholder="请输入书名">
            </div>

            <div class="input-group">
                <div class="input-group-addon">作者</div>
                <input type="text" class="form-control" id="iptAuthor" placeholder="请输入作者">
            </div>

            <div class="input-group">
                <div class="input-group-addon">出版社</div>
                <input type="text" class="form-control" id="iptPublisher" placeholder="请输入出版社">
            </div>

            <button id="btnAdd" class="btn btn-primary">添加</button>

        </div>
    </div>

    <!-- 图书表格部分 -->

    <table class="table table-bordered table-hover">
        <thead>
            <tr>
                <th>ID</th>
                <th>书名</th>
                <th>作者</th>
                <th>出版社</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody id="tb">

        </tbody>
    </table>

    <script>
        $(function () {
            //获取图书列表数据
            function getBookList() {
                $.get('http://www.liulongbin.top:3006/api/getbooks', function (res) {
                    if (res.status != 200) {
                        return alert('获取数据失败');
                    }
                    console.log(res);
                    var rows = [];
                    $.each(res.data, function (i, item) {
                        rows.push('<tr><td>' + item.id + '</td><td>' + item.bookname + '</td><td>' + item.author + '</td><td>' + item.publisher + '</td><td><a href="javascript:;" class="del" data-id="' + item.id + '">删除</a></td></tr>');
                    })
                    $('#tb').empty().append(rows.join(''));
                })
            }
            getBookList();
            $('tbody').on('click', '.del', function () {
                var id = $(this).attr('data-id');
                $.get('http://www.liulongbin.top:3006/api/delbook',{id: id},function(res) {
                    if(res.status !=  200) {
                        return alert('删除图书失败');
                    }
                    getBookList();
                })
            })

            $('#btnAdd').on('click', function() {
                var bookname = $('#iptBookname').val().trim();
                var author = $('#iptAuthor').val().trim();
                var publisher = $('#iptPublisher').val().trim();
                if(bookname.length <= 0 && author.length <= 0 && publisher.length <= 0) {
                    return alert('请填写完整的图书信息!');
                }
                $.post('http://www.liulongbin.top:3006/api/addbook',{bookname: bookname,author: author,publisher: publisher}, function(res) {
                if(res.status !== 201) {
                    return alert('添加失败');
                }
                getBookList();
                $('#iptBookname').val('');
                $('#iptAuthor').val('');
                $('#iptPublisher').val('');
            })
            })


        })

    </script>


</body>

</html>

六,总结

这个demo让我们复习了js的事件流,以及数组的一些常用方法。巩固了jq封装的ajax用法。也让我们体会到实践的重要性。

最后,谢谢大家支持,有问题有疑惑评论区见,我将尽力解答。

码字不易,如若欣赏,请点个小心心叭~

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
先回顾一下Ajax技术引入对传统Web开发挑战: <br><br> n 开发方式模糊 <br><br> 传统的MVC开发方式可以说是深入民心了,Ajax引入使得传统以Html内嵌java的jsp视图 <br> “消失了”,代替的是发起请求的页面本身,而此时视图展现内容的方式,主要是Javascript <br> 操作Html。这种转变打破了传统方式易于开发、维护等的优雅特性,使得开发模糊化,复杂 <br> 化。特别地,当前市场上提供了形形色色的所谓Ajax框架,它们开发模型和理念也是千变万 <br> 化,各不相同。这进一步模糊了Web开发模式,使得Web开发更加复杂化。 <br><br> n 系统异构性 <br><br> 传统模型是纯服务端编程,Model、View、Controller都是由java单一语言开发,不存在语言 <br> 差异性带来的数据对象序列化问题;Ajax的引入使得View必须由Javascript语言开发,使原 <br> 来纯粹服务端编程模型演变成“客户端--服务端”的异构编程模型。Java与Javascript语言上 <br> 差异性所带来的对象序列化、数据转换等问题,是这个异构编程模型的最大挑战。同时,对于 <br> Web开发人员来说,除了java之外,意味着Javascript语言和DOM(DocumentObjectModel) <br> 文档对象模型是必须掌握的基本技能。 <br><br> n 数据传输交换复杂性 <br><br> 异构性导致数据传输交换的复杂性。针对传输的性能、数据的格式、序列化的深度、数据的解 <br> 析与展现等诸多复杂问题必须要有一套满足开发需求的良好解决方案。 <br>
酒店管理系统分为前台和后台两个部分,其中后台供管理管理系统之用,包括客房类型设置模块、客房设置模块以及操作员设置三个子模块,具体的功能模块如下。 客房类型设置模块:该模块用来管理酒店的所有客房类型,包括新增客房类型、编辑已有客房类型、删除客房类型等功能。 客房设置模块:该模块用来管理酒店的所有客房信息,包括新增客房、编辑已有客房、删除客房等功能。 操作员设置模块:该模块用来管理酒店的操作员信息,包括新增操作员、编辑已有操作员信息、删除操作信息等功能。 系统前台供酒店所有工作人员使用,包括入住登记模块、结账模块、预定模块、客户管理模块以及业务统计五个模块。具体的功能模块如下。 入住登记模块:该模块用来登记客户的入住信息,其中入住信息包括登记信息、客人信息以及费用信息三部分。) P5 k. \1 G' {5 N$ s 结账模块:该模块用来处理客户的退房信息,只需要知道客户所住的房间号码,就能进行退房结账。 预定模块:该模块用来处理客户的预定信息,除了可以新增预定信息外,还可以对已有的预定信息进行管理。 客户管理模块:该模块用来管理客户的登记信息,包括新增客户信息、编译已有客户信息、删除客户信息等功能。 业务统计模块:该模块用来统计酒店的客房出租率,并且已图形报表的形式来显示出租率信息。( Y: E* i$ c& [ 本系统的开发工具具体如下。$ B2 M( g/ I6 @1 M ● 系统开发平台:MyEclipse 6.5。 ● 数据库管理系统软件:MySQL 5.0。* w# t% Q. @$ ~& G ● java开发包:JDK 5.0以上。$ [( v5 F7 n2 l ^ ● Web服务器:Tomcat 6.0。 本系统采用MVC架构模式开发,具体技术如下。 ● AJAX框架:使用ExtJS技术开发 ● 显示层:使用JSP技术开发 ● 数据访问层:使用DAO模式开发 ● 持久层:使用hibernate框架开发

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值