node.js入门,day6

node.js

  • 数据库基本概念
  • 安装并配置MySQL
  • MySQL基本使用
    • 使用MySQL Workbench管理数据库
    • 使用SQL管理数据库
    • SQL的SELECT语句
    • SQL的INSERT INTO语句
    • SQL的UPDATE语句
    • SQL的DELETE语句
    • SQL的WHERE语句
    • SQL的AND和OR运算符
    • SQL的ORDER BY语句 (排序语句)
    • SQL的COUNT(*)函数
  • 演示如何保存和打开.sql文件
  • 在项目中操作MySQL
    • 安装与配置mysql模块
    • 使用mysql模块操作mysql数据库
  • 前后端的身份认证
    • 开发模式
    • 身份认证
    • session认证机制
    • express中使用session认证

数据库基本概念

node.js入门,day6_第1张图片
node.js入门,day6_第2张图片
在这里插入图片描述
在这里插入图片描述

node.js入门,day6_第3张图片
node.js入门,day6_第4张图片
node.js入门,day6_第5张图片

安装并配置MySQL

node.js入门,day6_第6张图片node.js入门,day6_第7张图片
素材下载地址:https://pan.baidu.com/s/1HfNYzCdfrVUR-StdSUChoA 密码:1234。下载完成后找到day5的资料。
node.js入门,day6_第8张图片
在vs code中打开预览,按照教程一步步安装。
在这里插入图片描述

MySQL基本使用

使用MySQL Workbench管理数据库

根据教程里的设置,密码为:admin123
node.js入门,day6_第9张图片
node.js入门,day6_第10张图片
node.js入门,day6_第11张图片
node.js入门,day6_第12张图片
node.js入门,day6_第13张图片
node.js入门,day6_第14张图片
node.js入门,day6_第15张图片
最后设置的数据库如下图
node.js入门,day6_第16张图片
node.js入门,day6_第17张图片

使用SQL管理数据库

node.js入门,day6_第18张图片
node.js入门,day6_第19张图片

SQL的SELECT语句

node.js入门,day6_第20张图片
注意:SQL语句中的关键字对大小写不敏感。SELECT等效于select,FROM等效于from。打开MySQL Workbench如下图,创建一个代码编辑器。
node.js入门,day6_第21张图片
通过sql语句把users表中所有数据查询出来,点击下图红框即可运行编写的sql语句。
node.js入门,day6_第22张图片
获取名为"username"和"password”的列的内容(从名为"users”的数据库表),在写新代码时要把旧代码注释掉。
node.js入门,day6_第23张图片
代码小结:

-- 通过sql语句把users表中所有数据查询出来
-- select * from users 在写新代码时要把旧代码注释掉。
-- 获取名为"username"和"password”的列的内容(从名为"users”的数据库表)
select username,password from users

SQL的INSERT INTO语句

node.js入门,day6_第24张图片
向users 表中,插入一条username为 tony stark,password 为098123的用户数据,示例如下:
node.js入门,day6_第25张图片
代码小结:

-- 通过sql语句把users表中所有数据查询出来
-- 在写新代码时要把旧代码注释掉。
-- select * from users 
-- 获取名为"username"和"password”的列的内容(从名为"users”的数据库表)
-- select username,password from users
-- 向users 表中,插入一条username为 tony stark,password 为098123的用户数据
-- insert into users (username,password) values ('tony stark','098123')

SQL的UPDATE语句

node.js入门,day6_第26张图片
把users表中id为3的用户密码,更新为888888。示例如下:
node.js入门,day6_第27张图片
代码小结:

-- 通过sql语句把users表中所有数据查询出来
-- 在写新代码时要把旧代码注释掉。
-- select * from users 
-- 获取名为"username"和"password”的列的内容(从名为"users”的数据库表)
-- select username,password from users
-- 向users 表中,插入一条username为 tony stark,password 为098123的用户数据
-- insert into users (username,password) values ('tony stark','098123')
-- 把users表中id为3的用户密码,更新为888888
update users set password='888888' where id =3

SQL的DELETE语句

node.js入门,day6_第28张图片
从users表中,删除id为3的用户。
node.js入门,day6_第29张图片
node.js入门,day6_第30张图片
代码小结:

-- 通过sql语句把users表中所有数据查询出来
-- 在写新代码时要把旧代码注释掉。
-- select * from users 
-- 获取名为"username"和"password”的列的内容(从名为"users”的数据库表)
-- select username,password from users
-- 向users 表中,插入一条username为 tony stark,password 为098123的用户数据
-- insert into users (username,password) values ('tony stark','098123')
-- 把users表中id为3的用户密码,更新为888888
-- update users set password='888888' where id =3
-- 从users表中,删除id为3的用户
delete from users where id=3

SQL的WHERE语句

node.js入门,day6_第31张图片
node.js入门,day6_第32张图片
node.js入门,day6_第33张图片
node.js入门,day6_第34张图片
代码小结:

-- 通过sql语句把users表中所有数据查询出来
-- 在写新代码时要把旧代码注释掉。
-- select * from users 
-- 获取名为"username"和"password”的列的内容(从名为"users”的数据库表)
-- select username,password from users
-- 向users 表中,插入一条username为 tony stark,password 为098123的用户数据
-- insert into users (username,password) values ('tony stark','098123')
-- 把users表中id为3的用户密码,更新为888888
-- update users set password='888888' where id =3
-- 从users表中,删除id为3的用户
-- delete from users where id=3
-- 演示where子句的使用,查询status为1的用户
-- select * from users where status=1
-- 演示where子句的使用,查询id大于2的用户
-- select * from users where id>2
-- 演示where子句的使用,查询用户名不是admin的用户
-- select * from users where username<>'admin'

SQL的AND和OR运算符

node.js入门,day6_第35张图片
演示and用法
node.js入门,day6_第36张图片
or运算符示例
node.js入门,day6_第37张图片
代码小结

-- 通过sql语句把users表中所有数据查询出来
-- 在写新代码时要把旧代码注释掉。
-- select * from users 
-- 获取名为"username"和"password”的列的内容(从名为"users”的数据库表)
-- select username,password from users
-- 向users 表中,插入一条username为 tony stark,password 为098123的用户数据
-- insert into users (username,password) values ('tony stark','098123')
-- 把users表中id为3的用户密码,更新为888888
-- update users set password='888888' where id =3
-- 从users表中,删除id为3的用户
-- delete from users where id=3
-- 演示where子句的使用,查询status为1的用户
-- select * from users where status=1
-- 演示where子句的使用,查询id大于2的用户
-- select * from users where id>2
-- 演示where子句的使用,查询用户名不是admin的用户
-- select * from users where username<>'admin'
-- 使用and来显示所有状态为0且id小于3的用户
-- select *from users where status=0 and id<3
-- 使用or来显示所有状态为1或username为张三的用户
select * from users where status=1 or username='张三'

SQL的ORDER BY语句 (排序语句)

node.js入门,day6_第38张图片
node.js入门,day6_第39张图片
node.js入门,day6_第40张图片
node.js入门,day6_第41张图片
代码小结:

-- 通过sql语句把users表中所有数据查询出来
-- 在写新代码时要把旧代码注释掉。
-- select * from users 
-- 获取名为"username"和"password”的列的内容(从名为"users”的数据库表)
-- select username,password from users
-- 向users 表中,插入一条username为 tony stark,password 为098123的用户数据
-- insert into users (username,password) values ('tony stark','098123')
-- 把users表中id为3的用户密码,更新为888888
-- update users set password='888888' where id =3
-- 从users表中,删除id为3的用户
-- delete from users where id=3
-- 演示where子句的使用,查询status为1的用户
-- select * from users where status=1
-- 演示where子句的使用,查询id大于2的用户
-- select * from users where id>2
-- 演示where子句的使用,查询用户名不是admin的用户
-- select * from users where username<>'admin'
-- 使用and来显示所有状态为0且id小于3的用户
-- select *from users where status=0 and id<3
-- 使用or来显示所有状态为1或username为张三的用户
-- select * from users where status=1 or username='张三'
-- 对users表中的数据,按照status字段按照默认的升序进行排序
-- select * from users order by status
-- 按照id 对表中的数据进行降序的排序,desc表示降序,asc表示升序
-- select * from users order by id desc
-- 多重排序,对users表中的数据,先按照 status进行降序排序,再按照username字母的顺序,进行升序的排序
select * from users order by status desc,username asc

SQL的COUNT(*)函数

node.js入门,day6_第42张图片
node.js入门,day6_第43张图片
node.js入门,day6_第44张图片
node.js入门,day6_第45张图片
代码小结:

-- 通过sql语句把users表中所有数据查询出来
-- 在写新代码时要把旧代码注释掉。
-- select * from users 
-- 获取名为"username"和"password”的列的内容(从名为"users”的数据库表)
-- select username,password from users
-- 向users 表中,插入一条username为 tony stark,password 为098123的用户数据
-- insert into users (username,password) values ('tony stark','098123')
-- 把users表中id为3的用户密码,更新为888888
-- update users set password='888888' where id =3
-- 从users表中,删除id为3的用户
-- delete from users where id=3
-- 演示where子句的使用,查询status为1的用户
-- select * from users where status=1
-- 演示where子句的使用,查询id大于2的用户
-- select * from users where id>2
-- 演示where子句的使用,查询用户名不是admin的用户
-- select * from users where username<>'admin'
-- 使用and来显示所有状态为0且id小于3的用户
-- select *from users where status=0 and id<3
-- 使用or来显示所有状态为1或username为张三的用户
-- select * from users where status=1 or username='张三'
-- 对users表中的数据,按照status字段按照默认的升序进行排序
-- select * from users order by status
-- 按照id 对表中的数据进行降序的排序,desc表示降序,asc表示升序
-- select * from users order by id desc
-- 多重排序,对users表中的数据,先按照 status进行降序排序,再按照username字母的顺序,进行升序的排序
-- select * from users order by status desc,username asc
-- 使用count(*)来统计users表中,状态为0用户的总数量
-- select count(*) from users where status=0
-- 使用AS关键字给列起别名
select count(*) as total from users where status=0

演示如何保存和打开.sql文件

保存按钮如下
node.js入门,day6_第46张图片
打开已保存的按钮如下
node.js入门,day6_第47张图片

在项目中操作MySQL

node.js入门,day6_第48张图片

安装与配置mysql模块

node.js入门,day6_第49张图片
在vs code的终端中输入安装命令npm i mysql
在这里插入图片描述
node.js入门,day6_第50张图片
node.js入门,day6_第51张图片

以操作前文建立的my_db_01数据库为例
node.js入门,day6_第52张图片
新建一个45.js文件如下
在这里插入图片描述
代码如下

// 1.导入mysql 模块
const mysql = require('mysql')
// 2.建立与MySQL数据库的连接关系
const db = mysql.createPool({
    host: '127.0.0.1',//数据库的IP地址
    user: 'root',// 登录数据库的账号
    password: 'admin123',// 登录数据库的密码
    database: 'my_db_01',// 指定要操作哪个数据库
})
// 测试mysql模块能否正常工作,select 1没有实质性作用,只是用来测试
db.query('select 1', (err, results) => {
    // mysql 模块工作报错
    if (err) return console.log(err.message);
    // 正常工作,没报错
    console.log(results);
})

终端运行45.js,查看打印输出内容
在这里插入图片描述

使用mysql模块操作mysql数据库

node.js入门,day6_第53张图片
新建46.js
在这里插入图片描述

代码如下

// 1.导入mysql 模块
const mysql = require('mysql')
// 2.建立与MySQL数据库的连接关系
const db = mysql.createPool({
    host: '127.0.0.1',//数据库的IP地址
    user: 'root',// 登录数据库的账号
    password: 'admin123',// 登录数据库的密码
    database: 'my_db_01',// 指定要操作哪个数据库
})

// 查询users表中所有数据
//注意:如果执行的是select查询语句,则执行的结果是数组
const sqlstr = 'select * from users'
db.query(sqlstr, (err, results) => {
    //查询数据失败
    if (err) return console.log(err.message)
    //查询数据成功
    console.log(results)
})

终端运行后,查询到的内容与我们数据库内容一致。注意:如果执行的是select查询语句,则执行的查询结果是数组的形式显示出来。
node.js入门,day6_第54张图片
node.js入门,day6_第55张图片
修改46.js代码

// 1.导入mysql 模块
const mysql = require('mysql')
// 2.建立与MySQL数据库的连接关系
const db = mysql.createPool({
    host: '127.0.0.1',//数据库的IP地址
    user: 'root',// 登录数据库的账号
    password: 'admin123',// 登录数据库的密码
    database: 'my_db_01',// 指定要操作哪个数据库
})

// 查询users表中所有数据
//注意:如果执行的是select查询语句,则执行的结果是数组
// const sqlstr = 'select * from users'
// db.query(sqlstr, (err, results) => {
//     //查询数据失败
//     if (err) return console.log(err.message)
//     //查询数据成功
//     console.log(results)
// })

//向users表中,新增一条数据,其中 username 的值为 Spider-Man,password 的值为 pcc123
const user = { username: 'Spider-Man', password: 'pcc123'}
//定义待执行的sQL语句,在sql中,英文的?表示占位符
const sqlStr = 'insert into users (username,password) values (?,?)'
//执行sQL语句,调用db.query()方法
db.query(sqlStr, [user.username, user.password], (err, results) => {
    //执行sQL语句失败了
    if (err) return console.log(err.message)
    // 执行成功了,使用results.affectedRows属性判断
    //注意:如果执行的是insert into插入语句,则results是一个对象
    // 可以通过affectedRows属性,来判断是否插入数据成功
    if (results.affectedRows === 1) {
        console.log('执行插入语句成功了');
    }

})

终端运行,注意:如果执行的是insert into插入语句,则results是一个对象,可以通过affectedRows属性,来判断是否插入数据成功。
在这里插入图片描述
查看数据库里的内容如下:为什么id是6呢,因为曾经有个id为5的数据,被删除了,该id就被占用过了,以后不再使用了。id的唯一性。
node.js入门,day6_第56张图片
node.js入门,day6_第57张图片
修改46.js代码

// 1.导入mysql 模块
const mysql = require('mysql')
// 2.建立与MySQL数据库的连接关系
const db = mysql.createPool({
    host: '127.0.0.1',//数据库的IP地址
    user: 'root',// 登录数据库的账号
    password: 'admin123',// 登录数据库的密码
    database: 'my_db_01',// 指定要操作哪个数据库
})

// 查询users表中所有数据
//注意:如果执行的是select查询语句,则执行的结果是数组
// const sqlstr = 'select * from users'
// db.query(sqlstr, (err, results) => {
//     //查询数据失败
//     if (err) return console.log(err.message)
//     //查询数据成功
//     console.log(results)
// })

//向users表中,新增一条数据,其中 username 的值为 Spider-Man,password 的值为 pcc123
// const user = { username: 'Spider-Man', password: 'pcc123'}
// //定义待执行的sQL语句,在sql中,英文的?表示占位符
// const sqlStr = 'insert into users (username,password) values (?,?)'
// //执行sQL语句,调用db.query()方法
// db.query(sqlStr, [user.username, user.password], (err, results) => {
//     //执行sQL语句失败了
//     if (err) return console.log(err.message)
//     // 执行成功了,使用results.affectedRows属性判断
//     //注意:如果执行的是insert into插入语句,则results是一个对象
//     // 可以通过affectedRows属性,来判断是否插入数据成功
//     if (results.affectedRows === 1) {
//         console.log('执行插入语句成功了');
//     }
// })

// 演示插入数据的便捷方式,如果数据对象的每个属性和数据表的字段一一对应,则可用以下方法
const user = { username: 'Iron-Man', password: '999' }
//定义待执行的sQL语句,在sql中,英文的?表示占位符
const sqlStr = 'insert into users set ?'
//执行sQL语句,调用db.query()方法,直接将数据对象作为插入的值
db.query(sqlStr, user, (err, results) => {
    //执行sQL语句失败了
    if (err) return console.log(err.message)
    // 执行成功了,使用results.affectedRows属性判断
    //注意:如果执行的是insert into插入语句,则results是一个对象
    // 可以通过affectedRows属性,来判断是否插入数据成功
    if (results.affectedRows === 1) {
        console.log('执行插入语句成功了');
    }
})

终端运行,然后点击刷新数据库,即可看到新增成功。
node.js入门,day6_第58张图片
node.js入门,day6_第59张图片
node.js入门,day6_第60张图片
修改46.js代码

// 1.导入mysql 模块
const mysql = require('mysql')
// 2.建立与MySQL数据库的连接关系
const db = mysql.createPool({
    host: '127.0.0.1',//数据库的IP地址
    user: 'root',// 登录数据库的账号
    password: 'admin123',// 登录数据库的密码
    database: 'my_db_01',// 指定要操作哪个数据库
})

// 查询users表中所有数据
//注意:如果执行的是select查询语句,则执行的结果是数组
// const sqlstr = 'select * from users'
// db.query(sqlstr, (err, results) => {
//     //查询数据失败
//     if (err) return console.log(err.message)
//     //查询数据成功
//     console.log(results)
// })

//向users表中,新增一条数据,其中 username 的值为 Spider-Man,password 的值为 pcc123
// const user = { username: 'Spider-Man', password: 'pcc123'}
// //定义待执行的sQL语句,在sql中,英文的?表示占位符
// const sqlStr = 'insert into users (username,password) values (?,?)'
// //执行sQL语句,调用db.query()方法
// db.query(sqlStr, [user.username, user.password], (err, results) => {
//     //执行sQL语句失败了
//     if (err) return console.log(err.message)
//     // 执行成功了,使用results.affectedRows属性判断
//     //注意:如果执行的是insert into插入语句,则results是一个对象
//     // 可以通过affectedRows属性,来判断是否插入数据成功
//     if (results.affectedRows === 1) {
//         console.log('执行插入语句成功了');
//     }
// })

// 演示插入数据的便捷方式,如果数据对象的每个属性和数据表的字段一一对应,则可用以下方法
// const user = { username: 'Iron-Man9', password: '999' }
// //定义待执行的sQL语句,在sql中,英文的?表示占位符
// const sqlStr = 'insert into users set ?'
// //执行sQL语句,调用db.query()方法,直接将数据对象作为插入的值
// db.query(sqlStr, user, (err, results) => {
//     //执行sQL语句失败了
//     if (err) return console.log(err.message)
//     // 执行成功了,使用results.affectedRows属性判断
//     //注意:如果执行的是insert into插入语句,则results是一个对象
//     // 可以通过affectedRows属性,来判断是否插入数据成功
//     if (results.affectedRows === 1) {
//         console.log('执行插入语句成功了');
//     }
// })

// 演示更新用户信息
const user = {
    id: 6, username: 'aaa', password: '000'
}
//定义SQL语句
const sqlstr = 'update users set username=?,password=? where id=?'
//执行sQL语句
//注意:执行了update语句之后,执行的结果,也是一个对象,可以通过 affectedRows判断是否更新成功
db.query(sqlstr, [user.username, user.password, user.id], (err, results) => {
    if (err) return console.log(err.message)
    if (results.affectedRows === 1) {
        console.log('更新成功')
    }
})

终端运行,注意:执行了update语句之后,执行的结果,也是一个对象,可以通过 affectedRows判断是否更新成功。
在这里插入图片描述
数据库内容发生改变了。
node.js入门,day6_第61张图片
node.js入门,day6_第62张图片
修改46.js代码

// 1.导入mysql 模块
const mysql = require('mysql')
// 2.建立与MySQL数据库的连接关系
const db = mysql.createPool({
    host: '127.0.0.1',//数据库的IP地址
    user: 'root',// 登录数据库的账号
    password: 'admin123',// 登录数据库的密码
    database: 'my_db_01',// 指定要操作哪个数据库
})

// 查询users表中所有数据
//注意:如果执行的是select查询语句,则执行的结果是数组
// const sqlstr = 'select * from users'
// db.query(sqlstr, (err, results) => {
//     //查询数据失败
//     if (err) return console.log(err.message)
//     //查询数据成功
//     console.log(results)
// })

//向users表中,新增一条数据,其中 username 的值为 Spider-Man,password 的值为 pcc123
// const user = { username: 'Spider-Man', password: 'pcc123'}
// //定义待执行的sQL语句,在sql中,英文的?表示占位符
// const sqlStr = 'insert into users (username,password) values (?,?)'
// //执行sQL语句,调用db.query()方法
// db.query(sqlStr, [user.username, user.password], (err, results) => {
//     //执行sQL语句失败了
//     if (err) return console.log(err.message)
//     // 执行成功了,使用results.affectedRows属性判断
//     //注意:如果执行的是insert into插入语句,则results是一个对象
//     // 可以通过affectedRows属性,来判断是否插入数据成功
//     if (results.affectedRows === 1) {
//         console.log('执行插入语句成功了');
//     }
// })

// 演示插入数据的便捷方式,如果数据对象的每个属性和数据表的字段一一对应,则可用以下方法
// const user = { username: 'Iron-Man9', password: '999' }
// //定义待执行的sQL语句,在sql中,英文的?表示占位符
// const sqlStr = 'insert into users set ?'
// //执行sQL语句,调用db.query()方法,直接将数据对象作为插入的值
// db.query(sqlStr, user, (err, results) => {
//     //执行sQL语句失败了
//     if (err) return console.log(err.message)
//     // 执行成功了,使用results.affectedRows属性判断
//     //注意:如果执行的是insert into插入语句,则results是一个对象
//     // 可以通过affectedRows属性,来判断是否插入数据成功
//     if (results.affectedRows === 1) {
//         console.log('执行插入语句成功了');
//     }
// })

// 演示更新用户信息
// const user = {
//     id: 6, username: 'aaa', password: '000'
// }
// //定义SQL语句
// const sqlstr = 'update users set username=?,password=? where id=?'
// //执行sQL语句
// //注意:执行了update语句之后,执行的结果,也是一个对象,可以通过 affectedRows判断是否更新成功。
// db.query(sqlstr, [user.username, user.password, user.id], (err, results) => {
//     if (err) return console.log(err.message)
//     if (results.affectedRows === 1) {
//         console.log('更新成功')
//     }
// })

// 演示更新数据的便捷方式
const user = {
    id: 9, username: 'bbb', password: '77788'
}
//定义SQL语句
const sqlstr = 'update users set ? where id=?'
//执行sQL语句
//注意:执行了update语句之后,执行的结果,也是一个对象,可以通过 affectedRows判断是否更新成功。
db.query(sqlstr, [user, user.id], (err, results) => {
    if (err) return console.log(err.message)
    if (results.affectedRows === 1) {
        console.log('更新成功')
    }
})

终端运行
在这里插入图片描述node.js入门,day6_第63张图片
node.js入门,day6_第64张图片
修改46.js代码

// 1.导入mysql 模块
const mysql = require('mysql')
// 2.建立与MySQL数据库的连接关系
const db = mysql.createPool({
    host: '127.0.0.1',//数据库的IP地址
    user: 'root',// 登录数据库的账号
    password: 'admin123',// 登录数据库的密码
    database: 'my_db_01',// 指定要操作哪个数据库
})

// 查询users表中所有数据
//注意:如果执行的是select查询语句,则执行的结果是数组
// const sqlstr = 'select * from users'
// db.query(sqlstr, (err, results) => {
//     //查询数据失败
//     if (err) return console.log(err.message)
//     //查询数据成功
//     console.log(results)
// })

//向users表中,新增一条数据,其中 username 的值为 Spider-Man,password 的值为 pcc123
// const user = { username: 'Spider-Man', password: 'pcc123'}
// //定义待执行的sQL语句,在sql中,英文的?表示占位符
// const sqlStr = 'insert into users (username,password) values (?,?)'
// //执行sQL语句,调用db.query()方法
// db.query(sqlStr, [user.username, user.password], (err, results) => {
//     //执行sQL语句失败了
//     if (err) return console.log(err.message)
//     // 执行成功了,使用results.affectedRows属性判断
//     //注意:如果执行的是insert into插入语句,则results是一个对象
//     // 可以通过affectedRows属性,来判断是否插入数据成功
//     if (results.affectedRows === 1) {
//         console.log('执行插入语句成功了');
//     }
// })

// 演示插入数据的便捷方式,如果数据对象的每个属性和数据表的字段一一对应,则可用以下方法
// const user = { username: 'Iron-Man9', password: '999' }
// //定义待执行的sQL语句,在sql中,英文的?表示占位符
// const sqlStr = 'insert into users set ?'
// //执行sQL语句,调用db.query()方法,直接将数据对象作为插入的值
// db.query(sqlStr, user, (err, results) => {
//     //执行sQL语句失败了
//     if (err) return console.log(err.message)
//     // 执行成功了,使用results.affectedRows属性判断
//     //注意:如果执行的是insert into插入语句,则results是一个对象
//     // 可以通过affectedRows属性,来判断是否插入数据成功
//     if (results.affectedRows === 1) {
//         console.log('执行插入语句成功了');
//     }
// })

// 演示更新用户信息
// const user = {
//     id: 6, username: 'aaa', password: '000'
// }
// //定义SQL语句
// const sqlstr = 'update users set username=?,password=? where id=?'
// //执行sQL语句
// //注意:执行了update语句之后,执行的结果,也是一个对象,可以通过 affectedRows判断是否更新成功。
// db.query(sqlstr, [user.username, user.password, user.id], (err, results) => {
//     if (err) return console.log(err.message)
//     if (results.affectedRows === 1) {
//         console.log('更新成功')
//     }
// })

// 演示更新数据的便捷方式
// const user = {
//     id: 9, username: 'bbb', password: '77788'
// }
// //定义SQL语句
// const sqlstr = 'update users set ? where id=?'
// //执行sQL语句
// //注意:执行了update语句之后,执行的结果,也是一个对象,可以通过 affectedRows判断是否更新成功。
// db.query(sqlstr, [user, user.id], (err, results) => {
//     if (err) return console.log(err.message)
//     if (results.affectedRows === 1) {
//         console.log('更新成功')
//     }
// })

// 演示删除id为6的用户数据,
const sqlstr = 'delete from users where id=?'
//如果SQL语句中有多个占位符 ?,则必须使用数组为每个占位符指定具体的值
//如果SQL语句中只有一个占位符 ? 问号,则可以省略数组,比如这里只有一个id=?,一个占位符,所以直接传1个数就好了
db.query(sqlstr, 6,(err,results) => {
    if (err) return console.log(err.message)
    //注意:执行 delete语句之后,结果也是一个对象,也会包含affectedRows属性
    if (results.affectedRows == 1) {
        console.log('删除数据成功')
    }
})

终端运行,在通过mysql workbench工具查看数据库,里边确实没有id为6的数据了
在这里插入图片描述
node.js入门,day6_第65张图片
node.js入门,day6_第66张图片
修改46.js代码

// 1.导入mysql 模块
const mysql = require('mysql')
// 2.建立与MySQL数据库的连接关系
const db = mysql.createPool({
    host: '127.0.0.1',//数据库的IP地址
    user: 'root',// 登录数据库的账号
    password: 'admin123',// 登录数据库的密码
    database: 'my_db_01',// 指定要操作哪个数据库
})

// 查询users表中所有数据
//注意:如果执行的是select查询语句,则执行的结果是数组
// const sqlstr = 'select * from users'
// db.query(sqlstr, (err, results) => {
//     //查询数据失败
//     if (err) return console.log(err.message)
//     //查询数据成功
//     console.log(results)
// })

//向users表中,新增一条数据,其中 username 的值为 Spider-Man,password 的值为 pcc123
// const user = { username: 'Spider-Man', password: 'pcc123'}
// //定义待执行的sQL语句,在sql中,英文的?表示占位符
// const sqlStr = 'insert into users (username,password) values (?,?)'
// //执行sQL语句,调用db.query()方法
// db.query(sqlStr, [user.username, user.password], (err, results) => {
//     //执行sQL语句失败了
//     if (err) return console.log(err.message)
//     // 执行成功了,使用results.affectedRows属性判断
//     //注意:如果执行的是insert into插入语句,则results是一个对象
//     // 可以通过affectedRows属性,来判断是否插入数据成功
//     if (results.affectedRows === 1) {
//         console.log('执行插入语句成功了');
//     }
// })

// 演示插入数据的便捷方式,如果数据对象的每个属性和数据表的字段一一对应,则可用以下方法
// const user = { username: 'Iron-Man9', password: '999' }
// //定义待执行的sQL语句,在sql中,英文的?表示占位符
// const sqlStr = 'insert into users set ?'
// //执行sQL语句,调用db.query()方法,直接将数据对象作为插入的值
// db.query(sqlStr, user, (err, results) => {
//     //执行sQL语句失败了
//     if (err) return console.log(err.message)
//     // 执行成功了,使用results.affectedRows属性判断
//     //注意:如果执行的是insert into插入语句,则results是一个对象
//     // 可以通过affectedRows属性,来判断是否插入数据成功
//     if (results.affectedRows === 1) {
//         console.log('执行插入语句成功了');
//     }
// })

// 演示更新用户信息
// const user = {
//     id: 6, username: 'aaa', password: '000'
// }
// //定义SQL语句
// const sqlstr = 'update users set username=?,password=? where id=?'
// //执行sQL语句
// //注意:执行了update语句之后,执行的结果,也是一个对象,可以通过 affectedRows判断是否更新成功。
// db.query(sqlstr, [user.username, user.password, user.id], (err, results) => {
//     if (err) return console.log(err.message)
//     if (results.affectedRows === 1) {
//         console.log('更新成功')
//     }
// })

// 演示更新数据的便捷方式
// const user = {
//     id: 9, username: 'bbb', password: '77788'
// }
// //定义SQL语句
// const sqlstr = 'update users set ? where id=?'
// //执行sQL语句
// //注意:执行了update语句之后,执行的结果,也是一个对象,可以通过 affectedRows判断是否更新成功。
// db.query(sqlstr, [user, user.id], (err, results) => {
//     if (err) return console.log(err.message)
//     if (results.affectedRows === 1) {
//         console.log('更新成功')
//     }
// })

// 演示删除id为6的用户数据,
// const sqlstr = 'delete from users where id=?'
// //如果SQL语句中有多个占位符 ?,则必须使用数组为每个占位符指定具体的值
// //如果SQL语句中只有一个占位符 ? 问号,则可以省略数组,比如这里只有一个id=?,一个占位符,所以直接传1个数就好了
// db.query(sqlstr, 6,(err,results) => {
//     if (err) return console.log(err.message)
//     //注意:执行 delete语句之后,结果也是一个对象,也会包含affectedRows属性
//     if (results.affectedRows == 1) {
//         console.log('删除数据成功')
//     }
// })

// 标记删除演示 ,使id为9的用户数据状态status变为1,表示被删除了
const sqlstr = 'update users set status=? where id=?'
// 因为这里有多个占位符? 问号,所以采用了数组的形式为每个占位符指定具体的值
db.query(sqlstr, [1, 9], (err, results) => {
    if (err) return console.log(err.message)
    if (results.affectedRows == 1) {
        console.log('标记删除成功')
    }
})

数据库查看效果如下
node.js入门,day6_第67张图片

前后端的身份认证

开发模式

目前有两种开发模式,一种是服务器端渲染的web开发模式,一种是前后端分离的web开发模式。
node.js入门,day6_第68张图片
node.js入门,day6_第69张图片
node.js入门,day6_第70张图片
node.js入门,day6_第71张图片
node.js入门,day6_第72张图片

身份认证

node.js入门,day6_第73张图片
node.js入门,day6_第74张图片
node.js入门,day6_第75张图片

session认证机制

node.js入门,day6_第76张图片
注意:现实生活中的会员卡身份认证方式,在 Web开发中的专业术语叫做Cookie
node.js入门,day6_第77张图片node.js入门,day6_第78张图片
在浏览器中按F12找到cookie,可以看到是一些键值对。不同域名下的Cookie各自独立,每当客户端发起请求时,会自动把当前域名下所有未过期的Cookie一同发送到服务器。
node.js入门,day6_第79张图片
node.js入门,day6_第80张图片
node.js入门,day6_第81张图片
node.js入门,day6_第82张图片
node.js入门,day6_第83张图片
node.js入门,day6_第84张图片

express中使用session认证

node.js入门,day6_第85张图片
node.js入门,day6_第86张图片
node.js入门,day6_第87张图片
node.js入门,day6_第88张图片
node.js入门,day6_第89张图片
新建工程文件夹
node.js入门,day6_第90张图片
其中index.html代码

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="./jquery.js"></script>
</head>

<body>
  <h1>首页</h1>

  <button id="btnLogout">退出登录</button>

  <script>
    $(function () {

      // 页面加载完成后,自动发起请求,获取用户姓名
      $.get('/api/username', function (res) {
        // status 为 0 表示获取用户名称成功;否则表示获取用户名称失败!
        if (res.status !== 0) {
          alert('您尚未登录,请登录后再执行此操作!')
          location.href = './login.html'
        } else {
          alert('欢迎您:' + res.username)
        }
      })

      // 点击按钮退出登录
      $('#btnLogout').on('click', function () {
        // 发起 POST 请求,退出登录
        $.post('/api/logout', function (res) {
          if (res.status === 0) {
            // 如果 status 为 0,则表示退出成功,重新跳转到登录页面
            location.href = './login.html'
          }
        })
      })
    })
  </script>
</body>

</html>

login.html

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="./jquery.js"></script>
</head>

<body>
  <!-- 登录表单 -->
  <form id="form1">
    <div>账号:<input type="text" name="username" /></div>
    <div>密码:<input type="password" name="password" /></div>
    <button>登录</button>
  </form>

  <script>
    $(function () {
      // 监听表单的提交事件
      $('#form1').on('submit', function (e) {
        // 阻止默认提交行为
        e.preventDefault()
        // 发起 POST 登录请求
        $.post('/api/login', $(this).serialize(), function (res) {
          // status 为 0 表示登录成功;否则表示登录失败!
          if (res.status === 0) {
            location.href = './index.html'
          } else {
            alert('登录失败!')
          }
        })
      })
    })
  </script>
</body>

</html>

app.js代码

// 导入 express 模块
const express = require('express')
// 创建 express 的服务器实例
const app = express()

// TODO_01:请配置 Session 中间件
const session = require('express-session')
app.use(session({
  secret: 'hahaha',//加密数据交流
  resave: false, //固定写法
  saveUninitialized: true //固定写法
}))
// 托管静态页面
app.use(express.static('./pages'))
// 解析 POST 提交过来的表单数据
app.use(express.urlencoded({ extended: false }))

// 登录的 API 接口
app.post('/api/login', (req, res) => {
  // 判断用户提交的登录信息是否正确,账号:admin,密码:000000
  if (req.body.username !== 'admin' || req.body.password !== '000000') {
    return res.send({ status: 1, msg: '登录失败' })
  }

  // TODO_02:请将登录成功后的用户信息,保存到 Session 中
  req.session.user = req.body //用户登录信息存储到session
  req.session.isLoign=true //用户登录状态存储为true
  res.send({ status: 0, msg: '登录成功' })
})

// 获取用户姓名的接口
app.get('/api/username', (req, res) => {
  // TODO_03:请从 Session 中获取用户的名称,响应给客户端
  // 判断用户是否登录
  if (!req.session.isLoign) {
    // 如果未登录
   return res.send({status:1,message:'fail'})
  }
  // 如果登录了
  res.send({status:0,message:'success',username:req.session.user.username})
})

// 退出登录的接口
app.post('/api/logout', (req, res) => {
  // TODO_04:清空 Session 信息
  req.session.destroy()
  res.send({
    status: 0,
    msg:'退出登陆成功'
  })
})

// 调用 app.listen 方法,指定端口号并启动web服务器
app.listen(80, function () {
  console.log('Express server running at http://127.0.0.1:80')
})

jquery.js代码是下载的完整文件。方便在index.html中引入,使用了本地引入的方法。
node.js入门,day6_第91张图片
然后终端输入node .\app.js。然后运行
在这里插入图片描述
在浏览器打开生成的地址。
node.js入门,day6_第92张图片
node.js入门,day6_第93张图片
node.js入门,day6_第94张图片
可以看到登录后,有了cookie。
在这里插入图片描述

你可能感兴趣的:(前端,node.js,前端,后端)