NodeJs实战-待办列表(2)-待办列表增删

项目结构

在这里插入图片描述

增加表单提交事件

修改 index.html

  1. 引入 jquery
<script type="text/javascript" src="https://code.jquery.com/jquery-3.6.1.min.js"></script>
  1. 增加添加、完成按钮事件
<script type="text/javascript">
        $(function() {
            $("#add").on('click', function(){
                add();
            });
            $("#complete").on('click', function(){
                complete();
            });
        });

        function add() {
            var item = $("#item_text").val().trim();
            if (item.length == 0) {
                alert('输入数据不能为空');
            }
            $.ajax({
                url: "/add",
                method: 'GET',
                data: {
                    item: item
                },
                success: function(result) {
                    console.log(result);
                }
            });
        }

        function complete() {
            var item = $("#item_text").val().trim();
            if (item.length == 0) {
                alert('输入数据不能为空');
            }
            $.ajax({
                url: "/complete",
                method: 'GET',
                data: {
                    item: item
                },
                success: function(result) {
                    console.log(result);
                }
            });
        }
    </script>

完整的 index.html 如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>待办列表</title>
    <script type="text/javascript" src="https://code.jquery.com/jquery-3.6.1.min.js"></script>
    <script type="text/javascript">
        $(function() {
            $("#add").on('click', function(){
                add();
            });
            $("#complete").on('click', function(){
                complete();
            });
        });

        function add() {
            var item = $("#item_text").val().trim();
            if (item.length == 0) {
                alert('输入数据不能为空');
            }
            $.ajax({
                url: "/add",
                method: 'GET',
                data: {
                    item: item
                },
                success: function(result) {
                    console.log(result);
                }
            });
        }

        function complete() {
            var item = $("#item_text").val().trim();
            if (item.length == 0) {
                alert('输入数据不能为空');
            }
            $.ajax({
                url: "/complete",
                method: 'GET',
                data: {
                    item: item
                },
                success: function(result) {
                    console.log(result);
                }
            });
        }
    </script>
</head>
<body>
    <h1>待办列表</h1>
    <form method="post" >
        <p><input id="item_text" type="text" name="item" /></p>
        <p><input id="add" type="submit" value="添加" /></p>
        <p><input id="complete" type="submit" value="完成" /></p>
    </form>
    <ul><li>%</li></ul>
</body>
</html>
  1. 保存 index.html
  2. 给添加、完成按钮增加点击
  3. 点击添加的时候,执行待办事项添加。点击完成,完成待办事项
  4. 启动服务
F:\Github\Nodejs\todolist>node server.js
Server running at http://127.0.0.1:3000/

在这里插入图片描述

NodeJS 服务端增删改查

修改 server.js

  1. 服务端使用 set 存储待办事项
var todoSet = new Set();
  1. 如何解析 url 参数,使用 url 模块,示例代码如下
F:\Github\Nodejs\todolist>node
Welcome to Node.js v18.12.1.
Type ".help" for more information.
> require('url').parse('http://127.0.0.1:3000/')
Url {
  protocol: 'http:',
  slashes: true,
  auth: null,
  host: '127.0.0.1:3000',
  port: '3000',
  hostname: '127.0.0.1',
  hash: null,
  search: null,
  query: null,
  pathname: '/',
  path: '/',
  href: 'http://127.0.0.1:3000/'
}
> require('url').parse('http://127.0.0.1:3000/com?item=1')
Url {
  protocol: 'http:',
  slashes: true,
  auth: null,
  host: '127.0.0.1:3000',
  port: '3000',
  hostname: '127.0.0.1',
  hash: null,
  search: '?item=1',
  query: 'item=1',
  pathname: '/com',
  path: '/com?item=1',
  href: 'http://127.0.0.1:3000/com?item=1'
}
  1. 服务端处理不同 url 逻辑
    var urlParse = parse(request.url);
	var urlPath = urlParse.pathname;
	switch (urlPath) {
		case '/add':
			var itemData = findItemData(urlParse);
			if (itemData.length == 0) {
				sendMsg(response, '输入数据有误');
			}
			add(itemData);
			break;
		case '/complete':
			var itemData = findItemData(urlParse);
			if (itemData.length == 0) {
				sendMsg(response, '输入数据有误');
			}
			var res = complete(itemData);
			sendMsg(response, res);
			break;
	}
  1. 完整代码
const http = require('http');
const fs = require('fs');
const parse = require('url').parse;

const hostname = '127.0.0.1';
const port = 3000;

var todoSet = new Set();

function send404(response) {
    response.writeHead(404, {'Content-Type': 'text/plain'});
    response.write('Error 404: resource not found.');
    response.end();
}

function sendMsg(response, msg) {
}

function readFile(response, filePath) {
	fs.readFile(filePath, (err, data) => {
		if (err) {
			return send404(response);
		}
		var html = data.toString();
		html = html.replace('%', Array.from(todoSet).join('</li><li>'));
		response.writeHead(200, {'Content-Type': 'text/html'});
		response.end(html);
	});
}

function add(itemData) {
	todoSet.add(itemData);
}

function complete(itemData) {
	// 判断代办事项是否已添加
	if (!todoSet.has(itemData)) {
		return itemData + '待办事项不存在';
	}
	if (todoSet.delete(itemData)) {
		return itemData + '待办事项删除成功';
	}
	return itemData + '待办事项删除失败';
}

function findItemData(urlParse) {
	if (urlParse.query.length > 0) {
		var queryArray = urlParse.query.split('=');
		if (queryArray.length >= 2) {
			return queryArray[1];
		}
	}
	return '';
}

const server = http.createServer((request, response) => {
	var urlParse = parse(request.url);
	var urlPath = urlParse.pathname;
	switch (urlPath) {
		case '/add':
			var itemData = findItemData(urlParse);
			if (itemData.length == 0) {
				sendMsg(response, '输入数据有误');
			}
			add(itemData);
			break;
		case '/complete':
			var itemData = findItemData(urlParse);
			if (itemData.length == 0) {
				sendMsg(response, '输入数据有误');
			}
			var res = complete(itemData);
			sendMsg(response, res);
			break;
	}
	var filePath = 'public/index.html';
    var absPath = './' + filePath;
	readFile(response, absPath);
});

server.listen(port, hostname, () => {
	console.log(`Server running at http://${hostname}:${port}/`)
})

效果图

index.html、server.js 保存好了之后,启动服务

F:\Github\Nodejs\todolist>node server.js
Server running at http://127.0.0.1:3000/

初始页面

在这里插入图片描述

输入 1111,点击添加

列表增加 1111
在这里插入图片描述
再继续增加一个 2222
在这里插入图片描述

输入 1111 点击完成

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chengdu.S

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值