node+ajax实战案例(3)
3.用户注册实现
3.1.注册用户功能的实现逻辑
1 用户在表单上输入注册信息
2 点击注册后,收集用户在表单上输入的注册信息并且发送给后台
3 后台接收用户发送过来的注册信息
4 后台需要处理数据并且去连接数据库
5 后台把接收到的用户信息写入到数据库中
3.2.收集用户输入的信息并且发送这些信息到后台
在register.html文件中加入js代码
<script>
var oReg = document.getElementById('reg');
var oUser = document.getElementById('username');
var oPass = document.getElementById('password');
var oRePass = document.getElementById('repassword');
oReg.onclick = function () {
if(oPass.value !== oRePass.value){
alert('两次密码不一致,请重新输入');
return;
}
ajax({
method: 'post',
data: 'username='+oUser.value+'&password='+oPass.value+'&repassword='+oRePass.value,
url: '/register',
success: function (data) {
//后台返回数据 根据后台返回的数
if(data.status === 0){
window.location.href = '/login.html';
}else {
alert(data.message);
}
}
})
}
</script>
3.3.后台接收用户信息并且做处理
在index.js文件中加入js代码
if(url_obj.pathname === '/register' && req.method === 'POST'){
var user_info = '';
req.on('data',function (chunk) {
user_info+=chunk;
});
req.on('end', function (err) {
console.log(user_info);
res.setHeader('content-type', 'text/html;charset=utf-8');
var user_obj = queryString.parse(user_info);
//判断两次输入密码是否一致
if(user_obj.password !== user_obj.repassword ){
res.write('{"status":1, "message": "两次输入密码不一致"}', 'utf-8');
res.end();
return;
}
//判断用户名或者密码是否为空
if(user_obj.password == '' || user_obj.username == ''){
res.write('{"status":1, "message": "用户名和密码不能为空"}', 'utf-8');
res.end();
return;
}
});
return;
}
3.4.连接数据库并且实现数据保存
在连接数据库之前,需要先创建数据库,并且设计好对应的表,这里我们去数据库中创建一个ajaxdemo的数据库,并且在里面创建一张数据表,数据表的结构为:
id int primary key auto_crement
username varchar not null
password varchar not null
在indexjs文件头部引入mysql模块,并且连接数据库
mysql模块是一个第三方的模块,不是nodejs内置的模块,所以需要通过npm来安装
npm install mysql --save-dev
接下来就可以使用mysql模块了
//引入数据库模块 创建连接对象
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : 'root',
database : 'ajaxdemo'
});
connection.connect();
拼接mysql命令并且发送命令插入数据
if(!err){
var sql = 'INSERT INTO admin(username, password) VALUE("'+user_obj.username+'", "'+user_obj.password+'")';
connection.query(sql, function (error, result) {
if(!error && result.length !== 0) {
res.write('{"status":0, "message": "注册成功"}')
res.end();
}
});
}
完整的index.js文件注册逻辑代码
var http = require("http");
var url = require("url");
var fs = require("fs");
var querystring = require("querystring");
//引入数据库
var mysql = require('mysql');
//创建一个连接的到一个对象
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : 'root',
database: 'ajaxdemo'
});
//连接数据库
connection.connect(function(err) {
if (err) {
console.error('error connecting: ' + err.stack);
return;
}
console.log('connected as id ' + connection.threadId);
});
var app = http.createServer(function (req, res) {
// 需求: 当用户访问 "/" 返回index.html 用户访问 /login-bak.html 返回login.html文件
var url_obj = url.parse(req.url);
//每次调用render 是根据请求的 url_obj.pathname 有一个pathname出现就会执行一次render
// pathname -- 用户的请求 ----> render
//1 "/" url_obj.pathname "/" render("./template"+ "/", res)
//2 "/css/index-bak.css" render("./template"+"/css/index-bak.css", res);
//3 "/login-bak.html" render("./template"+"/login-bak.html", res);
if(url_obj.pathname === "/"){
render("./template/index.html", res);
//直接返回 不会去执行后面的代码
return;
}
//处理注册功能逻辑
if(url_obj.pathname === "/register" && req.method === "POST"){
//1 接收前台发送过来的数据
var user_info = '';
req.on("data", function (chunk) {
user_info += chunk;
});
req.on("end", function (err) {
if(!err){
console.log(user_info);
var user_obj = querystring.parse(user_info);
res.setHeader('content-type', 'text/html;charset=utf-8');
//判断是否为空
if(user_obj.username === '' || user_obj.password === ''){
res.write('{"status":1, "message":"用户名和密码不能为空"}', 'utf-8');
res.end();
return;
}
//判断密码是否一致
if(user_obj.password !== user_obj.repassword){
res.write('{"status":1, "message":"两次密码输入不一样"}', 'utf-8');
res.end();
return;
}
// 把信息写入到数据库
console.log(user_obj);
var sql = 'INSERT INTO admin(username, password) VALUE("'+user_obj.username+'", "'+user_obj.password+'")';
connection.query(sql,function (error, result) {
//如果没有错误 并且result长度不为0 返回注册成功
// console.log("error:", error);
// console.log("result:", result);
// 如果没有出错 error 是null--false, result 是一个数组
// 如果出错 error有东西对象 !就变成false result --undifined
if(!error && result && result.length !== 0){
res.write('{"status":0, "message":"注册成功"}', 'utf-8');
res.end();
return;
}
})
}
})
// res.write('{"name":"hello world!"}');
// res.end();
return;
}
render("./template"+url_obj.pathname, res);
});
app.listen(5000, function (err) {
if(!err){
console.log("listening on 5000...");
}
})
function render(path, res) {
//binary 二进制
fs.readFile(path, 'binary', function (err, data) {
if(!err){
res.write(data, 'binary');
res.end();
}
})
}
3.5.前端根据后台返回的数据进行自己的业务逻辑处理
<script>
var oReg = document.getElementById('reg');
var oUser = document.getElementById('username');
var oPass = document.getElementById('password');
var oRePass = document.getElementById('repassword');
oReg.onclick = function () {
if(oPass.value !== oRePass.value){
alert('两次密码不一致,请重新输入');
return;
}
ajax({
method: 'post',
data: 'username='+oUser.value+'&password='+oPass.value+'&repassword='+oRePass.value,
url: '/register',
success: function (data) {
//data为后台返回数据 根据后台返回的数据做具体的业务逻辑
if(data.status === 0){
//如果没有错误就跳转到登录页让用户登录
window.location.href = '/login.html';
}else {
//如果注册失败就弹出对应的消息
alert(data.message);
}
}
})
}
</script>
螺钉课堂视频课程地址:http://edu.nodeing.com
node+ajax实战案例(3)的更多相关文章
- node+ajax实战案例(2)
2.静态资源渲染 2.1.创建http服务器 var http = require('http'); var url = require('url'); var app = http.createSe ...
- node+ajax实战案例(6)
8.删除客户 8.1.发送id到后台 删除用户信息比较简单,只需要把对应行的id发送到后台就可以了 oTable.onclick = function (ev) { var ev = ev || ev ...
- node+ajax实战案例(5)
6.添加客户 6.1.点击添加按钮,弹出表单框 // 添加用户 显示对话框 var addBtn = document.getElementById('add-btn'); var addUser = ...
- node+ajax实战案例(4)
4.用户登录实现 4.1.用户登录实现思路 1 用户输入登录信息,点击登录的时候把用户登录的这些信息收集起来,然后组装数据通过ajax方式发送到后台 2 后台接到用户输入的登录信息,把这些信息拿去和数 ...
- node+ajax实战案例(1)
1.mysql入门 1.1.数据库相关概念 1.1.1.什么是数据? 描述事物的符号记录称为数据,描述事物的符号可以是数字.文字.声音.图片.视频等,有多种表现形式,都可以经过数字化后存入计算机 1. ...
- 《Node.js实战(双色)》作者之一——吴中骅访谈录
- 如何从40亿整数中找到不存在的一个 webservice Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库 WPF实战案例-打印 RabbitMQ与.net core(五) topic类型 与 headers类型 的Exchange
如何从40亿整数中找到不存在的一个 前言 给定一个最多包含40亿个随机排列的32位的顺序整数的顺序文件,找出一个不在文件中的32位整数.(在文件中至少确实一个这样的数-为什么?).在具有足够内存的情况 ...
- Flume实战案例运维篇
Flume实战案例运维篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Flume概述 1>.什么是Flume Flume是一个分布式.可靠.高可用的海量日志聚合系统,支 ...
- 使用Zabbix监控Nginx服务实战案例
使用Zabbix监控Nginx服务实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.编译安装nginx步骤详解并开启状态页 博主推荐阅读: https://www.cn ...
随机推荐
- Java实现 LeetCode 230 二叉搜索树中第K小的元素
230. 二叉搜索树中第K小的元素 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 说明: 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数. ...
- Java实现 蓝桥杯VIP 算法提高 产生数
算法提高 产生数 时间限制:1.0s 内存限制:256.0MB 问题描述 给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15). 规则: 一位数可变换成另一个一位数: 规则 ...
- Java实现 蓝桥杯VIP 算法提高 洗牌
算法提高 洗牌 时间限制:1.0s 内存限制:256.0MB 问题描述 小弱T在闲暇的时候会和室友打扑克,输的人就要负责洗牌.虽然小弱T不怎么会洗牌,但是他却总是输. 渐渐地小弱T发现了一个规律:只要 ...
- 类似-Xms、-Xmn这些参数的含义:
类似-Xms.-Xmn这些参数的含义: 答: 堆内存分配: JVM初始分配的内存由-Xms指定,默认是物理内存的1/64 JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4 默认空余堆内存小于 ...
- java实现圆周率与级数
** 圆周率与级数** 圆周率 我国古代数学家对圆周率方面的研究工作,成绩是突出的.三国时期的刘徽.南北朝时期的祖冲之都在这个领域取得过辉煌战绩. 有了计算机,圆周率的计算变得十分容易了.如今,人们创 ...
- cocos2dx获得字体的宽高
Android: 1.在CCImage中添加下面的方法: //头文件声明略. cocos2d::CCSize CCImage::getStringSize(const char *text, cons ...
- 彻底解决go get golang.org/x等包失败与VSCode golang插件安装失败问题
由于某种众所周知的一些原因,https://golang.org/ golang 的官方域名是被墙了的,这也就导致了, 在广大 go 开发者使用 golang 的时候,总会出现 go get 失败的问 ...
- 移除VS解决方案中的TFS版本控制
项目每次会弹出提示 正在打开的解决方案已绑定到以下 Azure DevOps Server 上的源代码管理: xxxxx.是否要联系此服务器以尝试启用源代码管理集成? 移除VS解决方案中的TFS版本控 ...
- 指定web默认首页,导致访问路径的问题
今天写了一个登陆页面,登陆成功跳转时,url中的路径不对 这是目录结构 |-web |---login |-----login.jsp |---success |-----success.jsp 这是 ...
- TD课程通的最终版评价
相较之前的软件,功能得到了完善,同时也修复了BUG,还增加了辅助工具,可以查询一周的占用情况,省空间,很方便. 添加课程表的功能也得到了完善,同时增加了链接到教务系统的功能,方便查询相关的课程.问题是 ...