用node.js写一个简单的图书管理界面——功能:添加,删除,修改数据

news2024/12/26 0:28:52

涉及到的模块:

var fs = require(‘fs’)——内置模块
var ejs = require(‘ejs’)——第三方模块
var mysql = require(‘mysql’)——第三方模块
var express = require(‘express’)——第三方模块
var bodyParser = require(‘body-parser’)——第三方中间件

需要安装的模块:

npm install express@4
npm install ejs
npm install mysql
npm install body-parser

一.先将数据库中的信息输出到浏览器页面

思路:创建一个book-list.html文件作为ejs模块文件,连接mysql数据库,将数据库中的信息,渲染到book-list.html文件中,输出给客户端

1. 连接mysql数据库并判断数据库连接是否成功

var client = mysql.createConnection({
    host: 'localhost',
    port: '3306',
    user: 'root',
    password: 'root',
    database: 'Library'
})
//判断数据库连接是否成功
client.connect(function (err) {
    if (err) {
        console.log('[query] - :' + err);
    }
    console.log('[connection connect] Mysql数据连接成功!')
});

2.创建并启动服务器

// 创建服务器
var app = express();
// 下面这段代码是使用Express框架中的body-parser中间件来解析HTTP请求体中的URL编码数据。
// 当extended参数设置为false时,它只支持扩展的URL编码格式(即不包含嵌套对象)。
app.use(bodyParser.urlencoded({
    extended: false
}));
// 启动服务器
app.listen(52273, function () {
    console.log('服务器监听地址 http://127.0.0.1:52273');
});

3.将数据库中的信息输出到网页

// 显示图示列表
app.get('/', function (request, response) {
    // 读取模版文件
    fs.readFile('book-list.html', 'utf-8', function (error, data) {
        // 执行SQL语句
        client.query('SELECT * FROM books', function (error, results) {
            // 相应数据
            console.log('shuju:' + results)
            response.send(ejs.render(data, {
                data: results
            }));
            // console.log('shuju:'+results)
        });
    });
});

4.book-list.html文件内容

<style>
    table {
        padding: 0;
        position: relative;
        margin: 0 auto;
    }
    td {
        text-align: center;
        border: solid 1px black;
    }
</style>
<body>
    <h1 style="text-align: center;">图书列表</h1>
    <a href="/insert" id="add">添加数据</a>
    <br />
    <table width="1000px">
        <tr>
            <th>ID</th>
            <th>书名</th>
            <th>作者</th>
            <th>出版社</th>
            <th>删除</th>
            <th>编辑</th>
        </tr>
        <% data.forEach((item,index)=> { %>
            <tr>
                <td>
                    <%= item.id %>
                </td>
                <td>
                    <%= item.bookname %>
                </td>
                <td>
                    <%= item.author %>
                </td>
                <td>
                    <%= item.press %>
                </td>
                <td><a href="/delete/<%= item.id %>">删除</a></td>
                <td><a href="/edit/<%= item.id %>">编辑</a></td>
            </tr>
            <% });%>
    </table>

5.浏览器效果图

在这里插入图片描述

二.完成添加数据功能

思路:创建一个book-insert.html文件作为添加数据的网页,点击添加数据是跳转到此网页,get请求响应此文件的内容,再用post请求处理提交的内容,提交完后强制跳转到根网页
注意:添加数据跳转网页的地址在book-list.html文件中已经定好了:‘/insert’

1.用get请求先把book-insert.html文件响应给客户

app.get('/insert', function (request, response) {
    // 读取模版文件
    fs.readFile('book-insert.html', 'utf-8', function (error, data) {
        // 响应数据
        response.send(data)
    });
});

2.再用post请求将用户提交的信息进行处理

app.post('/insert', function (request, response) {
    // 声明body
    var body = request.body;
    // 执行SQL语句
    client.query('INSERT INTO books (bookname,author,press) VALUES (?,?,?)', [
        body.bookname, body.author, body.press
    ], function () {
        // 响应数据
        response.redirect('./')
    });
});

3.book-insert.html文件内容

<h3>添加图书</h3>
    <hr/>
    <form action="" method="post">
        <fieldset>
            <legend>添加数据</legend>
            <table>
                <tr>
                    <td><label for="">图书名称</label></td>
                    <td><input type="text" name="bookname" id=""></td>
                </tr>
                <tr>
                    <td><label for="">作者</label></td>
                    <td><input type="text" name="author" id=""></td>
                </tr>
                <tr>
                    <td><label for="">出版社</label></td>
                    <td><input type="text" name="press" id=""></td>
                </tr>
            </table>
            <input type="submit" name="" id="">
        </fieldset>
    </form>

4.book-insert.html文件效果

在这里插入图片描述

三.完成删除和修改效果

注意:需要创一个修改信息的静态网页:book-edit.html

1.删除

思路:此效果比较简单,得到删除信息的id后直接执行SQL语句删除即可

app.get('/delete/:id', function (request, response) {
    // 执行sql语句
    client.query('DELETE FROM books WHERE id=?', [request.params.id], function () {
        response.redirect('/');
    });
});

book-edit.html网页内容:

<h1>修改图书</h1>
    <hr/>
    <form action="" method="post">
        <fieldset>
            <legend>修改图书信息</legend>
            <table>
                <tr>
                    <td><label for="">ID</label></td>
                    <td><input type="text" name="id" id="" value="<% data.id %>" disabled></td>
                </tr>
                <tr>
                    <td><label for="">书名</label></td>
                    <td><input type="text" name="bookname" id="" value="<% data.bookname %>"></td>
                </tr>
                <tr>
                    <td><label for="">作者</label></td>
                    <td><input type="text" name="author" id="" value="<% data.author %>" ></td>
                </tr>
                <tr>
                    <td><label for="">出版社</label></td>
                    <td><input type="text" name="press" id="" value="<% data.press %>" ></td>
                </tr>
            </table>
            <input type="submit" name="" id="">
        </fieldset>
    </form>

book-edit.html网页效果:

在这里插入图片描述

2.修改

思路:此效果就比较复杂了
两个路由处理程序:一个用于显示编辑表单(GET请求),另一个用于处理表单提交并更新数据库中的记录(POST请求)。

GET请求

1.当用户访问/edit/:id时,服务器会读取名为book-edit.html的模板文件。
2.然后,它会执行一个SQL查询,从books表中获取与给定ID匹配的书籍信息。
3.最后,它将渲染模板并将查询结果作为数据传递给模板,然后将渲染后的HTML发送给客户端。

app.get('/edit/:id', function (request, response) {
    // 读取模版信息
    fs.readFile('book-edit.html', 'utf-8', function (error, data) {
        // 执行sql语句
        client.query('SELECT * FROM books WHERE id = ?', [
            request.params.id], function (error, result) {
                // 响应数据
                response.send(ejs.render(data, {
                    data: result[0]
                }));
            });
    });
});

POST请求

1.当用户提交编辑表单时,服务器会接收到一个包含表单数据的POST请求。
2.服务器会从请求体中提取书籍信息(书名、作者和出版社),并使用这些信息更新数据库中相应ID的书籍记录。
3.更新完成后,服务器将强制跳转到主页(‘/’)。

app.post('/edit/:id', function (request, response) {
    // 声明body
    var body = request.body;
    // 执行sql语句
    client.query('UPDATE books SET bookname=?,author=?,press=? WHERE id=?',
        [body.bookname, body.author, body.press, request.params.id], function () {
            // 响应信息
            response.redirect('/')
        })
})

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

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

相关文章

华为HCIP Datacom H12-821 卷38

1.多选题 下面关于 BGP中的公认属性的描述&#xff0c;正确的是 A、公认必遵属性是所有BGP路由器都识别&#xff0c;且必须存在于Updata消息中心 B、BGP必须识别所有公认属性 C、公认属性分为公认必遵和可选过渡两种 D、公认任意属性是所有BGP造由器都可以识别&#xff0c…

217.贪心算法:加油站(力扣)

代码解决 class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int curtotol 0; // 当前累积油量int tatol 0; // 总的油量减去总的花费油量int start 0; // 起始加油站的索引// 遍历所有加油站for (int i 0; i &…

【Android面试八股文】你说ARouter采用APT技术,那么谈一下你对APT技术的理解,还有那些框架是采用APT技术呀?JavaPoet

一、谈一下你对APT技术的理解 1.1 对APT技术的理解 APT(Annotation Processing Tool)是一种在编译期间处理注解的技术,它允许开发者在编译时扫描和处理 Java 源代码中的注解信息,生成额外的源代码、资源文件或者其他文件。以下是对APT技术的一些理解和应用场景: 工作原理…

期货量化交易客户端开源教学第九节——新用户注册

一、新用户注册界面设计&#xff1a; 注册时采用手机号注册&#xff0c;客户端发送新号注册申请由后台做审核&#xff0c;后台审核通过后向注册的手机号发送注册成功的消息。注册过的手机号不能再二次注册。 界面验证代码 private{ Private declarations }FVerf: AnsiString; …

【React Native】做了一个简约的雷达图组件

本文目录 【React Native】做了一个简约的雷达图组件获取组件实现思路用法示例简易用法自定义美化 结语 【React Native】做了一个简约的雷达图组件 最近在使用 react-native 中需要绘制雷达图&#xff0c;没有找到合适的小组件&#xff08;大的图表库未直接提供&#xff0c;需…

【活动预告】Apache IoTDB TsFile 智慧能源应用“上会”啦!

2024 年&#xff0c;站在中国数字经济产业升级和数据要素市场化建设的时代交汇点上&#xff0c;为进一步推动全球数据库产业进步&#xff0c;由中国通信标准化协会、大数据技术标准推进委员会主办的“2024 可信数据库发展大会”将于 2024 年 7 月 16-17 日&#xff0c;在北京朝…

Mac M1安装配置Hadoop+Flink SQL环境

Flink 1.18.1 Hadoop 3.4.0 一、准备工作 系统&#xff1a;Mac M1 (MacOS Sonoma 14.3.1) JDK&#xff1a;jdk1.8.0_381 &#xff08;注意&#xff1a;尽量一定要用JDK8&#xff0c;少用高版本&#xff09; Scala&#xff1a;2.12 JDK安装在本机的/opt/jdk1.8.0_381.jdk/C…

海外ASO:iOS与谷歌优化的相同点和区别

海外ASO是针对iOS的App Store和谷歌的Google Play这两个主要海外应用商店进行的优化过程&#xff0c;两个不同的平台需要采取不同的优化策略&#xff0c;以下是对iOS优化和谷歌优化的详细解析&#xff1a; 一、iOS优化&#xff08;App Store&#xff09; 1、关键词覆盖 选择关…

【公益案例展】中国电信安全大模型——锻造安全行业能量转化的高性能引擎...

‍ 电信安全公益案例 本项目案例由电信安全投递并参与数据猿与上海大数据联盟联合推出的 #榜样的力量# 《2024中国数智产业最具社会责任感企业》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 以GPT系列为代表的大模型技术&#xff0c;展现了人工智能技术与应…

Macos 远程登录 Ubuntu22.04 桌面

这里使用的桌面程序为 xfce, 而 gnome 桌面则测试失败。 1,安装 在ubuntu上&#xff0c;安装 vnc server与桌面程序xfce sudo apt install xfce4 xfce4-goodies tightvncserver 2&#xff0c;第一次启动和配置 $ tightvncserver :1 设置密码。 然后修改配置&#xff1a…

3d为什么删掉模型不能返回?---模大狮模型网

在展览3D模型设计行业中&#xff0c;设计师们经常面临一个关键问题&#xff1a;一旦删除了模型的某些部分&#xff0c;为什么很难或者无法恢复原始状态?这不仅是技术上的挑战&#xff0c;更是设计过程中需要深思熟虑的重要考量。本文将探讨这一问题的原因及其在实际工作中的影…

传输层协议之UDP

1、端口号 我们在应用层创建的套接字&#xff0c;是需要通过bind()接口绑定我们的IP地址与端口号的&#xff0c;这是因为数据从传输层向上交付到应用层时&#xff0c;需要用端口号来查找特定的服务进程。一般在网络通信时&#xff0c;用IP地址标识一台主机&#xff0c;用端口号…

查找PPT中某种字体的全部对应文字

本文章的目的是找到某种字体的文字&#xff0c;而不是替换某种字体的文字&#xff0c;也不是将某种字体全部替换为另外一种文字。 第一步&#xff1a;在PPT中按下ALTF11 出现以下窗口 第二步&#xff1a;点击插入->模块 第三步&#xff1a;将以下代码输入到窗体中 Sub F…

【备战秋招】——算法题目训练和总结day4

【备战秋招】——算法题目训练和总结day4&#x1f60e; 前言&#x1f64c;Fibonacci数列我的题解思路分享代码分享 单词搜索我的题解思路分享代码分享 杨辉三角我的题解思路分享代码分享 总结撒花&#x1f49e; &#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢…

C++的缺省参数、函数重载和引用

缺省参数 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时&#xff0c;如果没有指定实参 则采⽤该形参的缺省值&#xff0c;否则使⽤指定的实参&#xff0c;缺省参数分为全缺省和半缺省参数。(有些地⽅把 缺省参数也叫默认参数)&#xff0c;要注意的是…

相对位移(鼠标)和绝对位移(触摸屏)

引言 EV_REL 表示相对位移(比如鼠标)&#xff0c; EV_ABS 表 示绝对位置(比如触摸屏) 为什么鼠标是相对位移&#xff0c;触摸屏绝对位置? 总结 在Linux操作系统中&#xff0c;输入设备如鼠标和触摸屏通过事件设备接口(Event Device Interface)来与系统交互。这个接口定义了一…

java《字符串基础篇》--字符串全套知识点总结及其配套习题逐语句分析(附带全套源代码)

一、前言 从今天开始就要学习字符串了&#xff0c;java中的字符串和其他编程语言的有些许不同&#xff0c;不过大家也不必担心&#xff0c;基本的原理都是相同的&#xff0c;只是代码的实现有些许差异&#xff0c;问题不大。对于字符串习题方面都是些最基础的题目&#xff0c;…

Matlab结合ChatGPT—如何计算置信区间?

​前面分享了带置信区间的折线图和带置信区间的折线散点图的绘图教程&#xff1a; 很多人表示&#xff0c;昆哥&#xff0c;图是很好看啦&#xff0c;但咱不会求置信区间啊&#xff0c;咋办嘞&#xff1f; 说实话&#xff0c;这种事情属于数据处理&#xff0c;一般都是在画图前…

Hadoop3:HDFS-通过配置黑白名单对集群进行扩缩容,并实现数据均衡(实用)

一、集群情况介绍 我的本地虚拟机&#xff0c;一共有三个节点&#xff0c;hadoop102、hadoop103、hadoop104 二、白名单 创建白名单文件whitelist&#xff0c;通过白名单的配置&#xff0c;只允许集群包含102和103两台机器可以存储数据&#xff0c;104无法存储数据。 需求 …

CSS实现超链接标签:鼠标光标为手形、取消下划线、当鼠标悬停时显示下划线

1、鼠标光标为手形 cursor: pointer; 2、显示/取消下划线 text-decoration: none; /* 文本取消下划线 */ text-decoration: underline; /* 文本添加下划线 */ 3、伪类选择器 伪类选择器是 CSS 中已经定义好的选择器&#xff0c;因此程序员不能随意命令。伪类选择器…