db目錄下存放數據庫操做語句:
userSQL.js 用戶有關的操做語句
router目錄 接口路由文件
user.js 用戶接口路由
connect.js 數據庫鏈接
index.html前端測試頁面
index.js 入口文件html
{ "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" } }
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') })
建立鏈接池前端
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 }
用戶操做接口node
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;
操做數據庫語句-用戶增刪改查mysql
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
前端測試html頁面sql
<!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>
再查看數據庫,數據已經刪除了
數據庫