node+mysql+express实现登录/注册/修改密码/删除用户 接口

时间:2021-10-23 20:50:54

实现用户的注册、登录、修改密码、删除用户操作

用到的数据库:nodecms;表:user

node+mysql+express实现登录/注册/修改密码/删除用户 接口

目录结构:

node+mysql+express实现登录/注册/修改密码/删除用户 接口

db目录下存放数据库操作语句:

  userSQL.js 用户有关的操作语句

router目录 接口路由文件

  user.js 用户接口路由

connect.js 数据库连接

index.html前端测试页面

index.js 入口文件

package.json

{
"name": "api",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "hotnode index.js"
},
"author": "yanxiafei",
"license": "ISC",
"dependencies": {
"body-parser": "^1.19.0",
"cookie-parser": "^1.4.4",
"cors": "^2.8.5",
"express": "^4.17.1",
"mysql": "^2.17.1"
}
}

入口index.js

const { app, pool } =require('./connect')
const user = require('./router/user')
app.all('*', (req, res, next) => {
//这里处理全局拦截,一定要写在最上面
next()
})
app.get('/', (req,res) => { //首页路由
res.sendFile(__dirname+'/'+'index.html')
})
app.all('/', (req, res) => {
pool.getConnection((err, conn) => {
res.json({ type: 'test'})
pool.releaseConnection(conn) // 释放连接池,等待别的连接使用
})
})
app.use('/user', user)
app.listen(8088, () => {
console.log('服务启动','localhost:8088')
})

connect.js

创建连接池

const mysql = require('mysql')
const express = require('express')
const app = express()
const router = express.Router(); // 解析参数
const bodyParser = require('body-parser')
// json请求
app.use(bodyParser.json())
// 表单请求
app.use(bodyParser.urlencoded({extended: false}))
/**
* 配置mysql
*/
const option = {
host: 'localhost',
user: 'root',
password: 'root',
port: '3306',
database: 'nodecms',
connectTimeout: 5000, //连接超时
multipleStatements: false //是否允许一个query中包含多条sql语句
}
let pool;
repool()
function Res ({ code = 200, msg = '', data = {} }) {
this.code = code;
this.msg = msg;
this.data = data;
}
function resJson (_res, result) {
return _res.json(new Res(result))
}
// 断线重连机制
function repool() {
// 创建连接池
pool = mysql.createPool({
...option,
waitForConnections: true, //当无连接池可用时,等待(true)还是抛错(false)
connectionLimit: 100, //连接数限制
queueLimit: 0 //最大连接等待数(0为不限制)
})
pool.on('error', err => {
err.code === 'PROTOCOL_CONNECTION_LOST' && setTimeout(repool, 2000)
})
app.all('*', (_,__, next) => {
pool.getConnection( err => {
err && setTimeout(repool, 2000) || next()
})
})
}
module.exports = { app, pool, router, resJson }

router/user.js

用户操作接口

const { pool, router, resJson } = require('../connect')
const userSQL = require('../db/userSQL')
/**
* 用户登录功能
*/
router.get('/login', (req, res) => {
let user = {
username: req.query.name,
password: req.query.password
}
let _res = res;
// 判断参数是否为空
if (!user.username) {
return resJson(_res, {
code: -1,
msg: '用户名不能为空'
})
}
if (!user.password) {
return resJson(_res, {
code: -1,
msg: '密码不能为空'
})
}
let _data;
// 从连接池获取连接
pool.getConnection((err, conn) => {
conn.query(userSQL.queryByNamePassword, [user.username, user.password], (e, result) => {
if (e) _data = {
code: -1,
msg: e
}
//通过用户名和密码索引查询数据,有数据说明用户存在且密码正确,只能返回登录成功,否则返回用户名不存在或登录密码错误
if (result && result.length) {
_data = {
msg: '登录成功',
data: {
userInfo: {
username: user.username
}
}
}
} else {
_data = {
code: -1,
msg: '用户名不存在或登录密码错误'
}
}
resJson(_res, _data)
})
pool.releaseConnection(conn) // 释放连接池,等待别的连接使用
})
}) /**
* 注册用户功能
*/ router.get('/register', (req, res) => {
// 获取前台页面传过来的参数
let user = {
username: req.query.name,
realname: req.query.realname,
password: req.query.password
}
let _res = res;
// 判断参数是否为空
if (!user.username) {
return resJson(_res, {
code: -1,
msg: '用户名不能为空'
})
}
if (!user.realname) {
return resJson(_res, {
code: -1,
msg: '真实姓名不能为空'
})
}
if (!user.password) {
return resJson(_res, {
code: -1,
msg: '密码不能为空'
})
}
let _data;
// 整合参数
// 从连接池获取连接
pool.getConnection((err, conn) => {
// 查询数据库该用户是否已存在
conn.query(userSQL.queryByName, user.username, (e, r) => {
if (e) _data = {
code: -1,
msg: e
}
if (r) {
//判断用户列表是否为空
if (r.length) {
//如不为空,则说明存在此用户
_data = {
code: -1,
msg: '用户已存在'
}
} else {
//插入用户信息
conn.query(userSQL.insert, user, (err, result) => {
if (result) {
_data = {
msg: '注册成功'
}
} else {
_data = {
code: -1,
msg: '注册失败'
}
}
})
}
}
setTimeout(() => {
//把操作结果返回给前台页面
resJson(_res, _data)
}, 200);
})
pool.releaseConnection(conn) // 释放连接池,等待别的连接使用
})
})
/**
* 修改密码
*/
router.get('/updatePassword', (req, res) => {
let user = {
username: req.query.name,
oldPassword: req.query.oldPassword,
newPassword: req.query.newPassword,
againPassword: req.query.againPassword
}
let _res = res;
// 判断参数是否为空
if (!user.username) {
return resJson(_res, {
code: -1,
msg: '用户名不能为空'
})
}
if (!user.oldPassword) {
return resJson(_res, {
code: -1,
msg: '旧密码不能为空'
})
}
if (!user.newPassword) {
return resJson(_res, {
code: -1,
msg: '新密码不能为空'
})
}
if (!user.againPassword || user.againPassword !== user.newPassword) {
return resJson(_res, {
code: -1,
msg: '请确认新密码或两次新密码不一致'
})
}
// 整合参数
// 从连接池获取连接
pool.getConnection((err, conn) => {
// 查询数据库该用户是否已存在
conn.query(userSQL.queryByNamePassword, [user.username, user.oldPassword], (e, r) => {
if (e) _data = {
code: -1,
msg: e
}
if (r) {
//判断用户列表是否为空
if (r.length) {
//如不为空,则说明存在此用户且密码正确
conn.query(userSQL.updateUser, [{
password: user.newPassword
}, user.username], (err, result) => {
console.log(err)
if (result) {
_data = {
msg: '密码修改成功'
}
} else {
_data = {
code: -1,
msg: '密码修改失败'
}
}
}) } else {
_data = {
code: -1,
msg: '用户不存在或旧密码输入错误'
}
}
}
setTimeout(() => {
//把操作结果返回给前台页面
resJson(_res, _data)
}, 200);
})
pool.releaseConnection(conn) // 释放连接池,等待别的连接使用
})
})
/**
* 删除用户
*/
router.get('/deleteUser', (req, res) => {
// 获取前台页面传过来的参数
let user = {
username: req.query.name
}
let _res = res;
// 判断参数是否为空
if (!user.username) {
return resJson(_res, {
code: -1,
msg: '用户名不能为空'
})
}
let _data;
// 整合参数
// 从连接池获取连接
pool.getConnection((err, conn) => {
// 查询数据库该用户是否已存在
conn.query(userSQL.queryByName, user.username, (e, r) => {
if (e) _data = {
code: -1,
msg: e
}
if (r) {
//判断用户列表是否为空
if (r.length) {
//如不为空,则说明存在此用户
conn.query(userSQL.deleteUser, user.username, (err, result) => {
if (err) _data = {
code: -1,
msg: e
}
if (result) {
_data = {
msg: '删除用户操作成功'
}
}
})
} else {
_data = {
code: -1,
msg: '用户不存在,操作失败'
}
}
}
setTimeout(() => {
//把操作结果返回给前台页面
resJson(_res, _data)
}, 200);
})
pool.releaseConnection(conn) // 释放连接池,等待别的连接使用
})
})
module.exports = router;

db/userSQL.js

操作数据库语句-用户增删改查


const userSQL = {
queryAll: 'select * from user', // 查询所有用户
queryByName: 'select * from user where username=?', // 通过用户名索引查询用户
queryByNamePassword: 'select * from user where username=? and password=?', // 通过用户名和密码索引查询用户
insert: 'insert into user set ?', // 插入新用户
updateUser: 'update user set ? where username=?',// 更新用户信息
deleteUser: 'delete from user where username=?' // 删除用户
} module.exports = userSQL

index.html

前端测试html页面

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
form {
width: 300px;
margin: 30px;
padding: 30px 50px 50px;
border: 1px solid #dcdcdc;
float: left;
} label {
display: flex;
line-height: 30px;
margin-bottom: 20px;
} span {
width: 100px; } input {
flex: 1;
border: 1px solid #dcdcdc;
} input[type="submit"] {
color: #fff;
background: #f43553;
width: 100%;
height: 40px;
line-height: 40px;
}
</style>
</head> <body>
<form action="http://localhost:8088/user/login">
<h2>登录</h2>
<label for="">
<span>用户名</span>
<input type="text" name="name" />
</label>
<label for="">
<span>密码</span>
<input type="password" name="password" />
</label>
<input type="submit" value="提交">
</form>
<form action="http://localhost:8088/user/register">
<h2>注册</h2>
<label for="">
<span>用户名</span>
<input type="text" name="name" />
</label>
<label for="">
<span>真实姓名</span>
<input type="text" name="realname" />
</label>
<label for="">
<span>密码</span>
<input type="password" name="password" />
</label>
<input type="submit" value="提交">
</form>
<form action="http://localhost:8088/user/updatePassword">
<h2>修改密码</h2>
<label for="">
<span>用户名</span>
<input type="text" name="name" />
</label>
<label for="">
<span>密码</span>
<input type="text" name="oldPassword" />
</label>
<label for="">
<span>密码</span>
<input type="text" name="newPassword" />
</label>
<label for="">
<span>密码</span>
<input type="text" name="againPassword" />
</label>
<input type="submit" value="提交">
</form>
<form action="http://localhost:8088/user/deleteUser">
<h2>删除用户</h2>
<label for="">
<span>用户名</span>
<input type="text" name="name" />
</label>
<input type="submit" value="提交">
</form>
</body> </html>

node+mysql+express实现登录/注册/修改密码/删除用户 接口

测试npm start:

注册:

node+mysql+express实现登录/注册/修改密码/删除用户 接口

注册成功

node+mysql+express实现登录/注册/修改密码/删除用户 接口

已存在测试:

node+mysql+express实现登录/注册/修改密码/删除用户 接口

登录测试

正常情况:

node+mysql+express实现登录/注册/修改密码/删除用户 接口

输入错误:

node+mysql+express实现登录/注册/修改密码/删除用户 接口

修改密码

node+mysql+express实现登录/注册/修改密码/删除用户 接口

删除用户

正常情况

node+mysql+express实现登录/注册/修改密码/删除用户 接口

再查看数据库,数据已经删除了

node+mysql+express实现登录/注册/修改密码/删除用户 接口

用户不存在时

node+mysql+express实现登录/注册/修改密码/删除用户 接口