1.常用语法,增删查改
-- 1.查询语句 select
-- 语法: select * from 表名称
-- 注意点:关键字不区分大小写
-- SELECT * FROM users
-- 2.查询指定列
-- 语法: select 列名称 * from 表名称
-- select id, password from users
-- 3.insert into 插入新的数据行
-- insert into 语句用于向数据表中插入新的数据行
-- 语法:insert into users (列1, 列2...) values ('值1', '值2')
-- 注意点:列和值要一一对应,多个列和多个值之间,要使用逗号分隔
-- insert into users (username, password) values ('ton', '1111')
-- select * from users
-- 4.update 语句
-- Update 语句用于修改表中的数据
-- 用update指定要更新的表
-- set 指定列
-- where 指定更新的条件
-- 语法:update 表名称 set 列名称 = 新值 where 列名称 = 某值
-- 示例:
-- 4.1. 更新某一行中的一个列
-- update users set username = 'cccc' where id = 2
-- 4.2 更新某一行中的若干列
-- 注意点:记得提供更新条件,不然会导致整张表数据都更新,一定要慎重!
-- update users set password = '222222', status = 1 where id = 3
-- 5.delete 语句用于删除表中的行
-- 语法解读:从指定的表中,根据where条件,删除对应数据行
-- 语法:delete from 表名称 where 列名称 = 值
-- delete from users where id = 2
-- 6.where 子句
-- 演示 where 子句的使用
-- select * from users where id>=2
-- select * from users where username<>'ls'
-- select * from users where username!='ls'
-- 7.使用 and 来显示所有状态为0且id小于3的用户
-- select * from users where status=0 and id<3
-- 8.使用 or 来显示所有状态为1 或 username 为 zs 的用户
-- select * from users where status=1 or username='zs'
-- 9.对users表中的数据,按照 status 字段进行升序排序
-- select * from users order by status
-- 10.按照 id 对结果进行降序的排序 desc 表示降序排序 asc 表示升序排序(默认情况下,就是升序排序的)
-- select * from users order by id desc
-- 11.对 users 表中的数据,先按照 status 进行降序排序,再按照 username 字母的顺序,进行升序的排序
-- select * from users order by status desc, username asc
-- 12.使用 count(*) 来统计 users 表中,状态为 0 用户的总数量
-- select count(*) from users where status=0
-- 13.使用 AS 关键字给列起别名
-- select count(*) as total from users where status=0
-- select username as uname, password as upwd from users
2.在vscode中连接数据库
-
基本思路:
① 安装操作 MySQL 数据库的第三方模块(mysql)
② 通过 mysql 模块连接到 MySQL 数据库
③ 通过 mysql 模块执行 SQL 语句
-
实现步骤:
-
1.安装与配置 mysql 模块
-
mysql 模块是托管于 npm 上的第三方模块。它提供了在 Node.js 项目中连接和操作 MySQL 数据库的能力
npm install mysql
-
2.配置 mysql 模块
-
在使用 mysql 模块操作 MySQL 数据库之前,必须先对 mysql 模块进行必要的配置
-
可以新建
mySql.js
文件// 1.导入mysql模块 const mysql = require('mysql') // 2.建立与mysql数据库的连接 const db = mysql.createPool({ host: '127.0.0.1', // 数据库的ip地址 user: 'root', // 登录数据库的账号 password: '123456', // 登录数据库的密码 database: 'my_db_01' // 指定要操作的数据库 }) // 3.检测mysql模块能否正常工作 (有问题...) // db.query('SELCET 1', (err, res) => { // // 判断是否出错 // if (err) return console.log(err.message) // // 连接成功,没有出错 // console.log(res) // 结果是: // }) // 可以看看能否查询users表中的所有的用户数据 db.query('select * from users', (err, res) => { // 查询失败 if (err) return console.log(err.message) // 查询成功 console.log(res) })
-
-
3.在模块中进行增删改查操作
// 1.导入mysql模块
const mysql = require('mysql')
// 2.建立与mysql数据库的连接
const db = mysql.createPool({
host: '127.0.0.1', // 数据库的ip地址
user: 'root', // 登录数据库的账号
password: '123456', // 登录数据库的密码
database: 'my_db_01' // 指定要操作的数据库
})
// // 3.检测mysql模块能否正常工作
// db.query('SELCET 1', (err, res) => {
// // 判断是否出错
// if (err) return console.log(err.message)
// // 连接成功,没有出错
// console.log(res)
// })
// 4.查询users表中的所有的用户数据
// db.query('select * from users', (err, res) => {
// // 查询失败
// if (err) return console.log(err.message)
// // 查询成功
// console.log(res)
// })
// 5.插入数据
// 要插入的数据对象
// const user = { username: 'tony', password: '11111'}
// // 待执行的sql语句,其中英文的 ? 表示占位符
// const sqlStr = 'insert into users (username,password) values (?, ?)'
// // 使用数组的形式,依次为 ? 占位符指定具体的值
// db.query(sqlStr, [user.username, user.password], (err, res) => {
// // 插入失败
// if (err) return console.log(err.message)
// // 插入成功
// if (res.affectedRows === 1) {
// console.log(res)
// console.log('插入数据成功!')
// }
// })
// 6.插入数据的便捷方式
// 向表中新增数据时,如果数据对象的每个属性和数据表的字段一一对应,则可以通过如下方式快速插入数据
// 要插入的数据对象
/* const user = { username: 'tony1', password: '11111'}
// 待执行的sql语句,其中英文的 ? 表示占位符
const sqlStr = 'insert into users set ?'
// 直接将数据对象当作占位符的值
db.query(sqlStr, user, (err, res) => {
// 插入失败
if (err) return console.log(err.message)
// 插入成功
if (res.affectedRows === 1) {
console.log(res)
console.log('插入数据成功!')
}
}) */
// 7.更新数据
// 指定要更新的对象信息
// const user = { id: 4, username: 'ccc', password: '25555'}
// 要执行的sql语句
// const sqlStr = 'update users set username=?, password=? where id=?'
// // 调用db.query()执行sql语句的同时,使用数组依次为占位符指定具体的值
// db.query(sqlStr, [user.username, user.password, user.id], (err, res) => {
// // 插入失败
// if (err) return console.log(err.message)
// // 插入成功
// if (res.affectedRows === 1) { console.log('修改成功') }
// })
// 8.更新数据的便捷方式
// 更新表数据时,如果数据对象的每个属性和数据表的字段一一对应,则可以通过如下方式快速更新表数据
// 指定要更新的对象信息
// const user = { id: 6, username: 'hahahh', password: '25555'}
// // 要执行的sql语句
// const sqlStr = 'update users set ? where id=?'
// // 调用db.query()执行sql语句的同时,使用数组依次为占位符指定具体的值
// db.query(sqlStr, [user, user.id], (err, res) => {
// // 插入失败
// if (err) return console.log(err.message)
// // 插入成功
// if (res.affectedRows === 1) { console.log('修改成功') }
// })
// 9.删除数据
// 在删除数据时,推荐根据 id 这样的唯一标识,来删除对应的数据
// 要执行的sql语句
// const sqlStr = 'delete from users where id=?'
// // 调用db.query()执行sql语句的同时,使用数组依次为占位符指定具体的值
// // 注意点:如果sql语句中有多个占位符,则必须使用数组为每个占位符指定具体的值
// // 如果sql语句中只有一个占位符,则可以省略数组
// db.query(sqlStr, 4, (err, res) => {
// if (err) return console.log(err.message) // 删除失败
// if (res.affectedRows === 1) { console.log('删除成功') } // 删除成功
// })
// 10.标记删除
/*
使用 DELETE 语句,会把真正的把数据从表中删除掉
为了保险起见,推荐使用标记删除的形式,来模拟删除的动作
所谓的标记删除,就是在表中设置类似于 status 这样的状态字段,来标记当前这条数据是否被删除
当用户执行了删除的动作时,我们并没有执行 DELETE 语句把数据删除掉,而是执行了 UPDATE 语句,将这条数据对应 的 status 字段标记为删除即可
*/
db.query('update users set status=1 where id=?', 6, (err, res) => {
if (err) return console.log(err.message) // 删除失败
if (res.affectedRows === 1) { console.log('删除数据成功') } // 删除成功
})
4.在 Express 中使用 Session 认证
// 导入 express 模块
const express = require('express')
// 创建 express 的服务器实例
const app = express()
// TODO_01:请配置 Session 中间件
// 1.导入session中间键
const session = require('express-session')
// 2.配置session中间件
app.use(session({
secret: 'keyboard cat', // secret 属性的值可以为任意字符串
resave: false, // 固定写法
saveUninitialized: true // 固定写法
}))
// 托管静态页面
app.use(express.static('./pages'))
// 解析 POST 提交过来的表单数据
app.use(express.urlencoded({ extended: false }))
// 登录的 API 接口
app.post('/api/login', (req, res) => {
// 判断用户提交的登录信息是否正确
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.islogin = true // 将用户的登录状态,存储到session中
res.send({ status: 0, msg: '登录成功' })
})
// 获取用户姓名的接口
app.get('/api/username', (req, res) => {
// TODO_03:请从 Session 中获取用户的名称,响应给客户端
// 判断用户是否登录
if (!req.session.islogin) {
return res.send({status: 1, msg: 'fail'})
}
// 用户已登录
res.send({status: 0, msg: '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')
})
5.在 Express 中使用 JWT
// 导入 express 模块
const express = require('express')
// 创建 express 的服务器实例
const app = express()
// TODO_01:安装并导入 JWT 相关的两个包,分别是 jsonwebtoken 和 express-jwt
// 1.导入生成jwt字符串的包
const jwt = require('jsonwebtoken')
// 2.导入将jwt字符串转换为json对象的包
const expressJWT = require('express-jwt')
// 允许跨域资源共享
const cors = require('cors')
app.use(cors())
// 解析 post 表单数据的中间件
const bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({ extended: false }))
// TODO_02:定义 secret 密钥,建议将密钥命名为 secretKey, 本质就是字符串
const secretKey = 'thisastringtoken'
// TODO_04:注册将 JWT 字符串解析还原成 JSON 对象的中间件
// expressJWT({secret: secretKey}) 就是用来解析token的中间件
// .unless({path: [/^\/api\//]}) 是用来指定那些接口不需要访问权限
// app.use(expressJWT({ secret: secretKey }).unless({path: [/^\/api\//]}))
app.use(expressJWT({ secret: secretKey}).unless({path: [/^\/api\//]}))
// 登录接口
app.post('/api/login', function (req, res) {
// 将 req.body 请求体中的数据,转存为 userinfo 常量
const userinfo = req.body
// 登录失败
if (userinfo.username !== 'admin' || userinfo.password !== '000000') {
return res.send({
status: 400,
message: '登录失败!'
})
}
// 登录成功
// TODO_03:在登录成功之后,调用 jwt.sign() 方法生成 JWT 字符串。并通过 token 属性发送给客户端
res.send({
status: 200,
message: '登录成功!',
// 调用 jsonwebtoken 包提供的 sign() 方法,将用户的信息加密成 JWT 字符串,响应给客户端
// 三个参数分别是:用户信息对象、加密密钥、配置对象
token: jwt.sign({ username: userinfo.username}, secretKey, {expiresIn: '30s'})
})
})
// 这是一个有权限的 API 接口
app.get('/admin/getinfo', function (req, res) {
// TODO_05:使用 req.user 获取用户信息,并使用 data 属性将用户信息发送给客户端
res.send({
status: 200,
message: '获取用户信息成功!',
data: req.user // 要发送给客户端的用户信息
})
})
// TODO_06:使用全局错误处理中间件,捕获解析 JWT 失败后产生的错误
app.use((err,req,res,next) => {
// token解析失败导致的错误
if (err.name === 'UnauthorizedError') {
return res.send({status: 401, message: '无效的token'})
}
// 其他原因导致的错误
res.send({status: 500, message:'未知错误'})
})
// 调用 app.listen 方法,指定端口号并启动web服务器
app.listen(8888, function () {
console.log('Express server running at http://127.0.0.1:8888')
})