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

news2024/12/26 21:09:15

NodeJs实战-待办列表-增删改查

  • 项目结构
  • 增加表单提交事件
    • 修改 index.html
  • NodeJS 服务端增删改查
    • 修改 server.js
  • 效果图
    • 初始页面
    • 输入 1111,点击添加
    • 输入 1111 点击完成

项目结构

在这里插入图片描述

增加表单提交事件

修改 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 点击完成

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/14294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

对抗生成网络GAN系列——f-AnoGAN原理及缺陷检测实战

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;专栏推荐&#xff1a;深度学习网络原理与实战 &#x1f34a;近期目标&#xff1a;写好专栏的每一篇文章 &#x1f34a;支持小苏&#xff1a;点赞&#x1f44d;&#x1f3fc;、…

[iOS- Mac终端上传Git and 生成Token]

前言 我先写了如何上传的每一步&#xff0c;都有截图&#xff0c;在文章的后面写了出现的问题&#xff0c;即网上找到的解决方法&#xff01;&#xff01;&#xff01;谨以此篇博客纪念我忙了一个晚上的麻烦 累死个人 首先要配置好git 这里不多说了Mac上传Git 搞了我一下午晚…

异常检测 | MATLAB实现基于支持向量机和孤立森林的数据异常检测(结合t-SNE降维和DBSCAN聚类)

异常检测 | MATLAB实现基于支持向量机和孤立森林的数据异常检测(结合t-SNE降维和DBSCAN聚类) 目录 异常检测 | MATLAB实现基于支持向量机和孤立森林的数据异常检测(结合t-SNE降维和DBSCAN聚类)效果一览基本介绍模型准备模型设计参考资料效果一览 基本介绍 提取有用的特征,机器…

遨博机械臂——ROS通讯机制

文章目录知识目标1. 遨博机械臂SDK二次开发接口2. 机械臂MoveIt!低级控制器配置3. aubo ROS中间件通讯机制知识目标 学习遨博机械臂SDK开发常用接口&#xff1b;学习MoveIt!功能包中机械臂控制器的配置通用流程&#xff1b;学习遨博ROS驱动与底层SDK与上层move_group之间的通讯…

记录一次成功的frida编译

长期接手python外包和爬虫&#xff0c;私聊哦 文章目录前言一、Frida是什么&#xff1f;二、Frida一些资源相关三、Frida源码编译准备1.安装包准备2.环境变量配置四、开始编译源码结束前言 某社交平台X信的风控越发恶心&#xff0c;目前面临项目被砍的风险&#xff0c;做了n多…

学生HTML个人网页作业作品----(画家企业8页)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 公司官网网站 | 企业官网 | 酒店官网 | 等网站的设计与制 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&#xff1a;结构 CSS&#…

ScanContext 论文详解 - 用途:Lidar SLAM 回环检测、空间描述符

深蓝学院&#xff08;深蓝学院 - 专注人工智能与自动驾驶的学习平台&#xff09;是专注于人工智能的在线教育平台&#xff0c;已有数万名伙伴在深蓝学院平台学习&#xff0c;很多都来自于国内外知名院校&#xff0c;比如清华、北大等。​ 来源&#xff1a; “深蓝前沿教育” …

汽车以太网线束测试及如何破局

今日&#xff0c;AEM联合维信仪器在深圳国际会展中心参加了第二十四届中国国际高新技术成果交易会https://baike.baidu.com/item/%E7%AC%AC%E4%BA%8C%E5%8D%81%E5%9B%9B%E5%B1%8A%E4%B8%AD%E5%9B%BD%E5%9B%BD%E9%99%85%E9%AB%98%E6%96%B0%E6%8A%80%E6%9C%AF%E6%88%90%E6%9E%9C%…

【自然语言处理(NLP)】基于注意力机制的中-英机器翻译

【自然语言处理&#xff08;NLP&#xff09;】基于注意力机制的中-英机器翻译 作者简介&#xff1a;在校大学生一枚&#xff0c;华为云享专家&#xff0c;阿里云专家博主&#xff0c;腾云先锋&#xff08;TDP&#xff09;成员&#xff0c;云曦智划项目总负责人&#xff0c;全国…

Java常用类和对象---尚硅谷Java入门视频学习

1.Object 常用方法&#xff1a; toString() 将对象转换成字符串。 toString默认打印的就是对象的内存地址&#xff0c;所以&#xff0c;为了能够更直观理解对象的内容&#xff0c;可以重写这个方法 hashCode() 获取对象的内存地址 equals() 判断两个对象是否相等, 如果相等&…

Netty-RPC

RPC&#xff1a;&#xff08;Remote Procedure Call&#xff09;-- 远程过程调用 &#xff08;1&#xff09;一个计算机通信协议。该协议允许运行与A计算机的程序调用运行于另一台计算机的子程序&#xff0c;而程序员无需额外滴为这个交互作用编程。 &#xff08;2&#xff09…

华为机试 - 考古学家

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 有一个考古学家发现一个石碑&#xff0c;但是很可惜&#xff0c;发现时其已经断成多段&#xff0c;原地发现n个断口整齐的石碑碎片。为了破解石碑内容&#xff0c;考古学家希望有程序能帮忙计算复原后…

[附源码]java毕业设计旅游管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[数据结构]二叉树之堆的实现

&#x1f941;作者&#xff1a; 华丞臧. &#x1f4d5;​​​​专栏&#xff1a;【数据结构】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449; LeetCode刷题网站…

各种信息收集

谷歌hack语法 site: baidu.com 搜索关于baidu.com的相关子域名网站 黑客 site:baidu.com 搜索关于baidu.com的子域名网站中有关字符“黑客”的网页 inurl: admin/login.php 搜索含有"admin/login.php"的url inurl: login site:baidu.com …

ATF SMC处理

文章目录ATF SMC上下文结构体SMC handler实现ATF SMC上下文结构体 ATF在处理SMC的时候会把CPU的寄存器保存起来&#xff0c;退出SMC的时候恢复现场。使用qemu_v8.mk编译出来的ATF没有定义CTX_INCLUDE_EL2_REGS&#xff0c;CTX_INCLUDE_FPREGS和CTX_INCLUDE_PAUTH_REGS。 lib/c…

Pytorch的grid_sample是如何实现对grid求导的?(源码解读)

Pytorch的grid_sample是如何实现对grid求导的&#xff1f;&#xff08;源码解读&#xff09; 这里本人的参考源码是grid_sample的CPU内核的CPP实现&#xff1a;https://github.com/pytorch/pytorch/blob/b039a715ce4e9cca82ae3bf72cb84652957b2844/aten/src/ATen/native/cpu/G…

【Detectron2】代码库学习-4. LazyConfig 配置文件

目录1. 配置文件2. LazyConfig 导入导出3. 递归实例化4. 基于LazyConfig的训练步骤4.1 导入依赖库4.2 日志初始化4.3 训练4.4 评估4.5 训练流程4.6 主函数入口5. TipsDetectron2是Facebook AI Research(FAIR)推出的基于Pytorch的视觉算法开源框架&#xff0c;主要聚焦于目标检测…

力扣160 - 相交链表【双指针妙解】

链表也能相交~一、题目描述二、思路分析与罗列三、整体代码展示四、总结与提炼一、题目描述 原题传送门 示例 1&#xff1a; 输入&#xff1a;intersectVal 8, listA [4,1,8,4,5], listB [5,6,1,8,4,5], skipA 2, skipB 3 输出&#xff1a;Intersected at ‘8’ 解释&…

MySQL索引

索引索引的相关概念索引分类索引的底层数据结构及其原理主键索引&二级索引聚集和非聚集索引哈西索引&&自适应哈西索引索引和慢查询日志索引优化索引的相关概念 什么是索引&#xff1f;索引其实就是一个数据结构。当表中的数据量到达几十万甚至上百万的时候&#x…