用MySQL+node+vue做一个学生信息管理系统(五):学生信息增删改的实现

先实现增加信息:
在这里插入图片描述

post参数的获取:express中接受post请求参数需要借助第三方包 body-parser
下载npm install body-parser

//引入body-parser模块
const bodyParser = require('body-parser');
//拦截所有请求,配置body-parser模块
//extended:false 方法内部使用querystring模块处理请求参数的格式,并且把参数保存在req当中
//extended:true 方法内部使用第三方模块qs处理请求参数的格式
app.use(bodyParser.urlencoded({extended:false}));
//接收请求
app.post('/add',(req,res)=>{//接收请求参数console.log(req.body);
})

req.body可以拿到全部的post请求参数,是一个json对象,以键值对的形式保存,键是input的name,值就是表单输入的内容,接下来只需要获取到值并且保存在MySQL数据库当中就行

在这里插入图片描述

通过结构赋值把需要的值拿到,然后插入到数据库,最后重定向到主页面

//接收请求
app.post('/add',(req,res)=>{//接收请求参数const { id, name, sex,class1}= req.body;var  addSql = 'INSERT INTO student(id,name,sex,class) VALUES(?,?,?,?)';var  addSqlParams = [id,name,sex,class1];connection.query(addSql,addSqlParams,function (err, result) {if(err){console.log('[INSERT ERROR] - ',err.message);return;}        console.log('--------------------------INSERT----------------------------');//console.log('INSERT ID:',result.insertId);        console.log('INSERT ID:',result);        console.log('-----------------------------------------------------------------\n\n');  });res.redirect('/index.html');
})

在这里插入图片描述

删除功能的实现:
思路:点击删除按钮的时候创建一个ajax对象,发送请求del,并且携带post学号的参数,post请求参数就是学号,在创建button按钮的时候把学号赋值给button按钮的id属性,点击button按钮时vue的e.target可以获取到触发事件的对象,e.target.id就可以获取到按钮的id属性,删除完之后如果使用node的redirect重定向因为是同一个页面而不会生效,我们需要在html文件中写location.href重定向才行

代码:
init.vue

<template><div id="init"><div class="div2"><div class="div21">学号</div><div class="div21">姓名</div><div class="div21">性别</div><div class="div21">班级</div><div class="div21"></div><div class="div21"></div></div><div class="div3" v-for="item in people"><div class="div31">{{item.id}}</div><div class="div31">{{item.name}}</div><div class="div31">{{item.sex}}</div><div class="div31">{{item.class}}</div><div class="div31"><router-link to='/update'>更改</router-link></div><div class="div31"><button @click="del" :id="item.id">删除</button></div></div><div class="div4"><router-link to='/add'>增加</router-link></div></div>
</template><script>export default {data(){return{msg:'66',people:[]}},mounted:function(){var xhr = new XMLHttpRequest();xhr.open('POST','http://localhost:3000/init');xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');xhr.send();var that = this;xhr.onload = function(){that.people = JSON.parse(xhr.responseText);}},methods:{del:function(e){console.log('del'+e.target.id);var xhr = new XMLHttpRequest();xhr.open('POST','http://localhost:3000/del');xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');xhr.send('id='+e.target.id);location.href='http://localhost:3000/index.html'}}
}</script><style scoped="scoped">#init{width: 800px;margin: auto;border: 1px solid transparent;}.div2{width: 100%;height: 50px;display: flex;}.div21{text-align: center;line-height: 50px;border: 1px solid aqua;flex: 1;}.div3{width: 100%;height: 50px;display: flex;}.div31{border: 1px solid aqua;text-align: center;line-height: 50px;flex: 1;}</style>
const express = require('express');
const app = express();
const path = require('path');
//引入body-parser模块
const bodyParser = require('body-parser');
//拦截所有请求,配置body-parser模块
//extended:false 方法内部使用querystring模块处理请求参数的格式,并且把参数保存在req当中
//extended:true 方法内部使用第三方模块qs处理请求参数的格式
app.use(bodyParser.urlencoded({extended:false}));//开放静态资源访问,只需要输入文件名即可,不需要输入文件夹
app.use(express.static(path.join(__dirname,'src')));app.all("*",function(req,res,next){//设置允许跨域的域名,*代表允许任意域名跨域res.header("Access-Control-Allow-Origin","*");//允许的header类型res.header("Access-Control-Allow-Headers","Origin,X-Requested-With,Accept,Content-type");res.header("Access-Control-Allow-Credentials",true);//跨域允许的请求方式res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");res.header("Content-Type","application/json;charset=utf-8")if (req.method.toLowerCase() == 'options')res.sendStatus(200);  //让options尝试请求快速结束elsenext();
});//引入MySQL模块
var mysql      = require('mysql');
//创建MySQL的连接
var connection = mysql.createConnection({host     : 'localhost',user     : 'root',password : '1234',database : 'students'
});//连接MySQL
connection.connect();//接收请求
app.post('/add',(req,res)=>{//接收请求参数const { id, name, sex,class1}= req.body;var  addSql = 'INSERT INTO student(id,name,sex,class) VALUES(?,?,?,?)';var  addSqlParams = [id,name,sex,class1];connection.query(addSql,addSqlParams,function (err, result) {if(err){console.log('[INSERT ERROR] - ',err.message);return;}        console.log('--------------------------INSERT----------------------------');//console.log('INSERT ID:',result.insertId);        console.log('INSERT ID:',result);        console.log('-----------------------------------------------------------------\n\n');  });res.redirect('/index.html');
})app.post('/update',(req,res)=>{res.send('update');
})app.post('/del',(req,res)=>{const {id}=req.body;var delSql = 'DELETE FROM student where id='+id;//删connection.query(delSql,function (err, result) {if(err){console.log('[DELETE ERROR] - ',err.message);return;}        console.log('--------------------------DELETE----------------------------');console.log('DELETE affectedRows',result.affectedRows);console.log('-----------------------------------------------------------------\n\n');  });
})app.post('/init',(req,res)=>{//query操作可以对数据库进行操作connection.query('SELECT * from student', function (err, result, fields) {if(err){//err.message会返回错误的信息console.log('[SELECT ERROR] - ',err.message);return;}console.log('--------------------------SELECT----------------------------');console.log(result);res.send(result);console.log('------------------------------------------------------------\n\n');  });})app.listen(3000);

修改数据思路:更改替换为<button id=“upd” @click=“upd” :id=“item.id”>更改
当点击更改按钮时,把数据保存在本地,同时也把这个数据发送给后台,在update.vue组件当中提取本地数据,给location.hash=‘/update’赋值,也会造成路由的变化。但是由于路由的组件是一加载完页面就加载了全部的路由,所以保存数据之后update组件当中的数据还是空,所以需要使用location.reload();重新刷新页面读取数据

在这里插入图片描述

在这里插入图片描述
app.js代码

var id = 0;
app.post('/server',(req,res)=>{console.log('server');id=req.body.id;console.log(id);
})app.post('/update',(req,res)=>{console.log('update');const {name,sex,class1}=req.body;var modSql = 'UPDATE student SET name = ?,sex = ?,class = ? WHERE Id = ?';var modSqlParams = [name,sex,class1,id];//改connection.query(modSql,modSqlParams,function (err, result) {if(err){console.log('[UPDATE ERROR] - ',err.message);return;}        console.log('--------------------------UPDATE----------------------------');console.log('UPDATE affectedRows',result.affectedRows);console.log('-----------------------------------------------------------------\n\n');});res.redirect('/index.html');
})

init.vue代码

upd:function(e){console.log('upd');sessionStorage.setItem('id',e.target.id);var xhr = new XMLHttpRequest();xhr.open('POST','http://localhost:3000/server');xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');xhr.send('id='+e.target.id);location.hash='/update';location.reload();}

完整代码:
app.js:

const express = require('express');
const app = express();
const path = require('path');
//引入body-parser模块
const bodyParser = require('body-parser');
//拦截所有请求,配置body-parser模块
//extended:false 方法内部使用querystring模块处理请求参数的格式,并且把参数保存在req当中
//extended:true 方法内部使用第三方模块qs处理请求参数的格式
app.use(bodyParser.urlencoded({extended:false}));//开放静态资源访问,只需要输入文件名即可,不需要输入文件夹
app.use(express.static(path.join(__dirname,'src')));app.all("*",function(req,res,next){//设置允许跨域的域名,*代表允许任意域名跨域res.header("Access-Control-Allow-Origin","*");//允许的header类型res.header("Access-Control-Allow-Headers","Origin,X-Requested-With,Accept,Content-type");res.header("Access-Control-Allow-Credentials",true);//跨域允许的请求方式res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");res.header("Content-Type","application/json;charset=utf-8")if (req.method.toLowerCase() == 'options')res.sendStatus(200);  //让options尝试请求快速结束elsenext();
});//引入MySQL模块
var mysql      = require('mysql');
//创建MySQL的连接
var connection = mysql.createConnection({host     : 'localhost',user     : 'root',password : '1234',database : 'students'
});//连接MySQL
connection.connect();//接收请求
app.post('/add',(req,res)=>{//接收请求参数const { id, name, sex,class1}= req.body;var  addSql = 'INSERT INTO student(id,name,sex,class) VALUES(?,?,?,?)';var  addSqlParams = [id,name,sex,class1];connection.query(addSql,addSqlParams,function (err, result) {if(err){console.log('[INSERT ERROR] - ',err.message);return;}        console.log('--------------------------INSERT----------------------------');//console.log('INSERT ID:',result.insertId);        console.log('INSERT ID:',result);        console.log('-----------------------------------------------------------------\n\n');  });res.redirect('/index.html');
})var id = 0;
app.post('/server',(req,res)=>{console.log('server');id=req.body.id;console.log(id);
})app.post('/update',(req,res)=>{console.log('update');const {name,sex,class1}=req.body;var modSql = 'UPDATE student SET name = ?,sex = ?,class = ? WHERE Id = ?';var modSqlParams = [name,sex,class1,id];//改connection.query(modSql,modSqlParams,function (err, result) {if(err){console.log('[UPDATE ERROR] - ',err.message);return;}        console.log('--------------------------UPDATE----------------------------');console.log('UPDATE affectedRows',result.affectedRows);console.log('-----------------------------------------------------------------\n\n');});res.redirect('/index.html');
})
app.post('/del',(req,res)=>{console.log('del');const {id}=req.body;var delSql = 'DELETE FROM student where id='+id;//删connection.query(delSql,function (err, result) {if(err){console.log('[DELETE ERROR] - ',err.message);return;}        console.log('--------------------------DELETE----------------------------');console.log('DELETE affectedRows',result.affectedRows);console.log('-----------------------------------------------------------------\n\n');  });
})app.post('/init',(req,res)=>{console.log('init');//query操作可以对数据库进行操作connection.query('SELECT * from student', function (err, result, fields) {if(err){//err.message会返回错误的信息console.log('[SELECT ERROR] - ',err.message);return;}console.log('--------------------------SELECT----------------------------');console.log(result);console.log('------------------------------------------------------------\n\n');res.send(result);});})app.listen(3000);

index.html:

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><div id="app"></div><script src="./bundle.js" type="text/javascript" charset="utf-8"></script></body>
</html>

app.vue

<template><div id="app"><router-view></router-view></div>
</template><script></script><style scoped="scoped"></style>

init.vue:

<template><div id="init"><div class="div2"><div class="div21">学号</div><div class="div21">姓名</div><div class="div21">性别</div><div class="div21">班级</div><div class="div21"></div><div class="div21"></div></div><div class="div3" v-for="item in people"><div class="div31">{{item.id}}</div><div class="div31">{{item.name}}</div><div class="div31">{{item.sex}}</div><div class="div31">{{item.class}}</div><div class="div31"><button id="upd" @click="upd" :id="item.id">更改</button></div><div class="div31"><button @click="del" :id="item.id">删除</button></div></div><div class="div4"><router-link to='/add'>增加</router-link></div></div>
</template><script>export default {data(){return{msg:'66',people:[]}},mounted:function(){var xhr = new XMLHttpRequest();xhr.open('POST','http://localhost:3000/init');xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');xhr.send();var that = this;xhr.onload = function(){that.people = JSON.parse(xhr.responseText);}},methods:{del:function(e){console.log('del'+e.target.id);var xhr = new XMLHttpRequest();xhr.open('POST','http://localhost:3000/del');xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');xhr.send('id='+e.target.id);location.href='http://localhost:3000/index.html'},upd:function(e){console.log('upd');sessionStorage.setItem('id',e.target.id);var xhr = new XMLHttpRequest();xhr.open('POST','http://localhost:3000/server');xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');xhr.send('id='+e.target.id);location.hash='/update';location.reload();}}
}</script><style scoped="scoped">#init{width: 800px;margin: auto;border: 1px solid transparent;}.div2{width: 100%;height: 50px;display: flex;}.div21{text-align: center;line-height: 50px;border: 1px solid aqua;flex: 1;}.div3{width: 100%;height: 50px;display: flex;}.div31{border: 1px solid aqua;text-align: center;line-height: 50px;flex: 1;}</style>

router.js:

import Vue from 'vue'
import Router from 'vue-router/dist/vue-router.js'
import init from '../components/init.vue'
import app from '../components/app.vue'
import add from '../components/add.vue'
import del from '../components/del.vue'
import update from '../components/update.vue'
Vue.use(Router);export default new Router({routes: [{path: '/',redirect:'/init'},{path: '/init',component: init},{path: '/add',name:'add',component: add},{path: '/del',name:'del',component: del},{path: '/update',name:'update',component: update},]
})

update.vue:

<template><div id="update"><form action="http://localhost:3000/update" method="post"><div class="div1"><div class="div11">学号</div><div class="div12"><input type="text" name="id" placeholder="请输入学号" id="num" disabled="disabled"></div></div><div class="div1"><div class="div11">姓名</div><div class="div12"><input type="text" name="name" placeholder="请输入姓名"></div></div><div class="div1"><div class="div11">性别</div><div class="div12"><input type="text" name="sex" placeholder="请输入性别"></div></div><div class="div1"><div class="div11">班级</div><div class="div12"><input type="text" name="class1" placeholder="请输入班级"></div></div><br><button type="submit">更改</button></form></div>
</template><script>window.onload=function(){var k = sessionStorage.getItem('id');console.log(k);if(k){var num = document.querySelector('#num');num.value=k;}
}</script><style>#update{width: 60%;height: 600px;margin: auto;border: 1px solid royalblue;}.div1{margin-top: 10px;margin-left: 10px;}
</style>

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

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

相关文章

视频太大怎么压缩变小?6款视频压缩软件免费版分享

视频太大怎么压缩得又小又清晰呢&#xff1f;无论是视频文件传输、视频文件存储&#xff0c;还是进行自媒体视频上传&#xff0c;都对视频文件的大小有一定的限制。高质量的视频文件往往伴随着文件占据大量存储空间&#xff0c;导致文件传输速度变慢。今天教大家6种视频压缩软件…

物理服务器架构和裸金属服务器架构的区别是?

物理服务器架构与裸金属服务器架构作为两种常见的服务器部署方式&#xff0c;各有其特点与优势。本文旨在通过对比两者的区别&#xff0c;并重点阐述裸金属服务器的优势&#xff0c;为学习者提供一份实用的学习指南。 一、物理服务器架构概述 物理服务器架构&#xff0c;顾名…

拥抱智能化,WMS系统让仓库管理精细化与人性化结合-亿发

在当今竞争激烈的市场环境中&#xff0c;仓库管理不再是简单的货物存储和流通&#xff0c;而是一个复杂而精细的管理系统。仓库管理系统&#xff08;Warehouse Management System, WMS&#xff09;作为现代仓库管理的核心技术&#xff0c;通过“有过程”的管理理念&#xff0c;…

GB/T22239-2019信息安全技术网络安全等级保护基本要求笔记

网络安全等级保护基本要求笔记 缩略语二级安全要求安全物理环境1、物理位置选择2、物理访问控制3、防盗窃和防破坏4、防雷击5、防火6、防水和防潮7、防静电8、温湿度控制9、电力供应10、电池防护 安全通信网络1、网络架构2、通信传输3、可信验证 安全区域边界1、边界防护2、访问…

真的假不了,假的真不了

大家好&#xff0c;我是瑶琴呀&#xff0c;拥有一头黑长直秀发的女程序员。 最近&#xff0c;17岁的中专生姜萍参加阿里巴巴 2024 年的全球数学竞赛&#xff0c;取得了 12 名的好成绩&#xff0c;一时间在网上沸腾不止。 从最开始的“数学天才”&#xff0c;到被质疑&#xff…

Markdown2Html全面使用教程:从入门到精通

文章目录 1. Markdown2Html简介1.1 项目地址与贡献方式1.2 功能特性概览1.3 自定义样式的支持1.4 多平台排版优化 2. 安装与配置2.1 使用npm安装2.2 配置个性化选项2.3 部署教程本地部署云服务部署静态网站托管 4.1 掘金的代码高亮与图片缩放4.2 知乎的标题样式与引用4.3 微信公…

问题记录:一个局部变量导致的内存泄露(cpp)

问题描述 最近在项目里面写了一个算法&#xff0c;居然有严重的内存泄露问题&#xff01;&#xff01;&#xff01;为了解决这个问题&#xff0c;花了好几天时间&#xff0c;慢慢排除问题&#xff0c;终于解决了&#xff0c;在此记录一下。 阶段一&#xff1a; 刚开始发现问…

STM32开发工具STM32CubeMX 6.11.1版本在Windows系统上的下载与安装配置

目录 前言一、STM32CubeMX安装二、使用配置总结 前言 STM32CubeMX是使用STM32微控制器的开发人员不可或缺的工具。该软件配置实用程序由意法半导体精心设计&#xff0c;提供了一个强大的平台&#xff0c;可以轻松高效地配置和初始化STM32器件。在其核心&#xff0c;STM32CubeM…

宠物洗澡机缺水提醒功能如何实现

如今随着养宠物的人越来越多&#xff0c;宠物用品也越来越多&#xff0c;宠物洗澡机也为养宠物的人带来很大方便&#xff0c;在宠物洗澡机内部通常会加一个缺液提醒功能&#xff0c;那么宠物洗澡机缺水提醒功能如何实现&#xff0c;其实只需加一个光电液位传感器即可。 光电液…

实战whisper第三天:fast whisper 语音识别服务器部署,可远程访问,可商业化部署(全部代码和详细部署步骤)

Fast Whisper 是对 OpenAI 的 Whisper 模型的一个优化版本,它旨在提高音频转录和语音识别任务的速度和效率。Whisper 是一种强大的多语言和多任务语音模型,可以用于语音识别、语音翻译和语音分类等任务。 Fast Whisper 的原理 Fast Whisper 是在原始 Whisper 模型的基础上进…

springboot dynamic配置多数据源

pom.xml引入jar包 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.2</version> </dependency> application配置文件配置如下 需要主要必须配置…

动手RAG: ocr调研

对于rag应用来说&#xff0c;文档是第一步&#xff0c;对于部分扫描件的文件来讲&#xff0c;主要就需要OCR. OCR tesseractppocrmmocr OCR包含几类&#xff0c; 自然场景中的文字识别&#xff0c;文档中的文字识别pipeline: 文本检测&#xff0c;文本识别&#xff0c;文…

Android 内存原理详解以及优化(二)

上一篇讲了内存原理&#xff0c;如果还没看可以先看上一篇&#xff1a;Android 内存原理详解以及优化&#xff08;一&#xff09; 这一篇我总结一下我们经常遇到的内存优化问题&#xff1a; 1.内存抖动 自定义view的ondraw是会被频繁调用的&#xff0c;那在这个方法里面就不能频…

全网最简单的Java设计模式【一】设计模式的定义、分类及七大设计原则

引言 Java设计模式从入门到精通-设计模式的定义、设计模式分类及七大设计原则 设计模式简介 在软件开发中&#xff0c;设计模式是解决常见设计问题的最佳实践。它们为开发者提供了一种通用的解决方案&#xff0c;使得代码更加灵活、可复用和可维护。在Java编程语言中&#x…

Linux--V4L2应用程序开发(二)改变亮度

一、思路流程 创建一个新线程用来控制亮度&#xff0c;线程通过读取用户输入来增加或减少亮度值&#xff0c;并使用 ioctl 函数将新亮度值设置到视频设备。 二、代码 /*创建线程来控制亮度*/ pthread_t thread; pthread_create(&thread, NULL, thread_brightness_contrl…

C++利用常量来防止形参误修改

#include<iostream> using namespace std;void displayInfo(const int& num) {// 函数体内不能修改num的值cout << "num " << num << endl; }int main() {int myNumber 5;displayInfo(myNumber);// 传递myNumber的引用&#xff0c;但不…

Latex 绘图:Tikz 包

参考文献&#xff1a; TiKZ入门教程 - LaTeX工作室 (latexstudio.net)Latex-TiKZ绘制数学平面几何图教程_latex绘制几何图形-CSDN博客【TikZ 简单学习(上)&#xff1a;基础绘制】Latex下的绘图宏包-CSDN博客LaTeX—Tikz 宏包入门使用教程 - 知乎 (zhihu.com)Latex 实时编译 &a…

安卓Framework开发快速分析日志及定位源码

文章目录 如何区分源码中 main system events 日志查看 Activity 生命周期日志分析 events 日志在源码中位置应用进程ID助分析具体应用ProtoLog 动态开关日志如何快速定位相关流程的代码位置 本文首发地址 https://h89.cn/archives/285.html 最新更新地址 https://gitee.com/ch…

代码随想录算法训练营第11天|232.用栈实现队列、225. 用队列实现栈、20. 有效的括号、1047. 删除字符串中的所有相邻重复项

打卡Day11 1.232.用栈实现队列2.225. 用队列实现栈3.20. 有效的括号4.1047. 删除字符串中的所有相邻重复项 1.232.用栈实现队列 题目链接&#xff1a;用栈实现队列 文档讲解&#xff1a; 代码随想录 思路&#xff1a;需要用两个栈来实现队列的先进先出。一个输入栈&#xff0…

2024年【建筑电工(建筑特殊工种)】考试报名及建筑电工(建筑特殊工种)考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 建筑电工(建筑特殊工种)考试报名参考答案及建筑电工(建筑特殊工种)考试试题解析是安全生产模拟考试一点通题库老师及建筑电工(建筑特殊工种)操作证已考过的学员汇总&#xff0c;相对有效帮助建筑电工(建筑特殊工种)考…