實現用戶的注冊、登錄、修改密碼、刪除用戶操作
用到的數據庫:nodecms;表:user
目錄結構:
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>
測試npm start:
注冊:
注冊成功
已存在測試:
登錄測試
正常情況:
輸入錯誤:
修改密碼
刪除用戶
正常情況
再查看數據庫,數據已經刪除了