vue項目使用node連接數(shù)據(jù)庫的方法(前后端分離)
學習關鍵語句:
vue連接mysql數(shù)據(jù)庫
vue項目連接后臺數(shù)據(jù)庫配置
vue通過node連接MySQL數(shù)據(jù)庫
寫在前面
為了快速學習nodejs制作后端并和數(shù)據(jù)庫進行交互的方法,所以趕緊寫一篇這樣的文章出來,如果你對這篇文章中提到的內(nèi)容有所疑惑,請飛快的將你的疑惑輸入到下方評論區(qū)中!
另外一個真實原因是我在做這個練習時很難找到完整的教學性文章 , 所以決定分享一下經(jīng)驗
注意:本文在2022/8/16號已進行完善,此次完善的內(nèi)容如下
- 變?yōu)楦险鎸嶍椖康哪夸浗Y構
- axios請求二次封裝
- 前端跨域處理完善
文章末尾附帶本文項目文件鏈接
對于搜索自己問題找到這篇文章的網(wǎng)友,可以參考右邊的菜單目錄快速定位到你可能想找的內(nèi)容
編寫順序
- 編寫前端頁面
- 編寫后端node服務器
- 編寫node連接數(shù)據(jù)庫
- 編寫數(shù)據(jù)庫交互
- 編寫前后端交互
開始
1.編寫前端頁面
這里使用vue2腳手架快速搭建項目
vue create node-app
選擇 babel, router即可
建立好之后如下圖
刪除無需內(nèi)容
APP.vue
只保留路由切換
Home.vue 和 About.vue 全部清空,重新建立vue文件模板(template + script + style)
制作登錄頁和首頁
將 Home.vue 當做登錄頁面, About.vue當做首頁,這樣就不用麻煩配置路由了,當做演示就很方便
登錄頁
登錄頁的功能需求 : 輸入賬號密碼完成登錄操作,并根據(jù)登錄情況給出響應提示
制作登錄頁面, 放置兩個 input 輸入框和一個 button 按鈕,并給上最基本的樣式
Home.vue
<template> <div class="home"> 用戶名 <input type="text" v-model="form.username" /><br /> 秘密碼 <input type="password" v-model="form.password" /><br /> <button @click="login">登錄</button> </div> </template> <script> export default { name: 'Home', data() { return { form: { username: '', password: '' } } }, methods: { login() { } } } </script> <style> * { margin: 5px; padding: 5px; } button { width: 50px; height: 30px; } </style>
首頁
首頁就用來修改密碼好了, 修改保存在數(shù)據(jù)庫中的密碼
首頁功能需求 : 修改用戶密碼 , 查看用戶個人信息
About.vue
<template> <div style="display:flex"> <div> 用戶名:<input type='text' v-model='form.username' /><br /> 新密碼:<input type='text' v-model='form.newPassword' /><br /> 新密碼:<input type='text' v-model='form.rePassword' /><br /> <button @click='update'>確認</button> <button @click='getUser'>查詢</button> </div> <div class="div2" v-if="userInfo.nickname"> <h3>用戶信息</h3> <div> 昵稱:{{userInfo.nickname}} </div> <div v-if="userInfo.gender != '無'"> 性別:{{userInfo.gender}} </div> <div v-if="userInfo.age != ''"> 年齡:{{userInfo.age}} </div> </div> </div> </template> <script> export default { data() { return { form: { username: '', newPassword: '', rePassword: '' }, userInfo: {} } }, methods: { getUser() { }, update() { } } } </script> <style> </style>
到這里,前端頁面除了交互以外就已經(jīng)完成了
接下來我們來編寫后端 node服務器
2.制作后端 node 服務器
初始化項目
新建文件夾, 起名為 node-server , 新建文件 app.js , 在終端中初始化項目
npm init npm i
完成之后 node-server 文件夾中會出現(xiàn)以下目錄
編寫 app.js
我們想要制作服務器, 這里使用 express 來實現(xiàn)
npm i --save express
當然了, 我們還需要解決跨域問題, 這里使用 cors 來解決
npm i --save cors
現(xiàn)在我們來考慮前端傳參問題
對于get請求,其參數(shù)是直接拼接在url后面的,解析也相對容易。在express框架中,get請求的參數(shù)全部都被放置在了request對象的query中。
post請求有多種形式可以發(fā)送數(shù)據(jù),這取決于post請求的請求頭Content-type的內(nèi)容,常見的有三種:
- multipart/form-data
- application/x-www-form-urlencoded
- application/json
為此,我們引入中間件來解決讀取參數(shù)的問題
這里使用 body-parser 和 connect-multiparty 來解決
npm i --save body-parser
npm i --save connect-multiparty
接下來編寫 app.js 文件
app.js
// 導入 express const express = require('express') // 創(chuàng)建 app const app = express() // 設置跨域訪問 const cors = require('cors') app.use(cors()) // 處理POST參數(shù) const bodyParser = require('body-parser') const multiparty = require('connect-multiparty') // 處理 x-www-form-urlencoded app.use(bodyParser.urlencoded({ extended:true })); // 處理 application/json app.use(bodyParser.json()) // 處理 mutipart/form-data app.use(multiparty()) // 測試接口能否正常調(diào)用 app.get('/info', (req, res) => { res.send("Hello shaoyahu !") }) // 啟動 app.listen(3000, () => { console.log('express server running at http://127.0.0.1:' + 3000); })
接下來我們在控制臺使用 node 命令就可以啟動服務器了
node app.js
最先看到控制臺打印了消息
接下來我們在瀏覽器中打開看一看效果
太棒了 ! 我們已經(jīng)完成了最簡單的接口
3.編寫 node 連接數(shù)據(jù)庫
編寫 mysql.js 文件
我們在 node-server 文件夾下新建文件 mysql.js
首先, 我們需要安裝 mysql
本機安裝
本機安裝 mysql 服務請參考其他文章 , 這里不做詳細介紹 , 大致行動為 : 下載安裝包 , 點擊安裝 , 配置
安裝 mysql 依賴
npm i --save mysql
編寫 mysql.js 文件
mysql.js
let mysql = require('mysql') const db_config = { host: 'localhost', user: '請輸入你自己的賬號, 一般為 root', password: '請輸入你自己的密碼, 一般也為 root', port: "3306",// 默認使用3306端口號 database: 'node_app'// 使用你自己創(chuàng)建的數(shù)據(jù)庫名稱,我這里使用 node_app } // 進行數(shù)據(jù)庫交互 function conMysql(sql) { let connect = mysql.createConnection(db_config) // 開始鏈接數(shù)據(jù)庫 connect.connect(function (err) { if (err) { console.log(`mysql連接失敗: ${err}!`) } else { console.log('mysql連接成功!') } }) // 返回一個Promise承諾對象 return new Promise((resolve, reject) => { connect.query(sql, (err, result) => { if (err) { reject(err) } else { // 此處需要將返回數(shù)據(jù)轉(zhuǎn)為JSON再轉(zhuǎn)回來,否則原數(shù)據(jù)不為任何數(shù)據(jù)類型 let res = JSON.parse(JSON.stringify(result)) closeMysql(connect) resolve(res) } }); }) } // 查詢成功后關閉mysql function closeMysql(connect) { connect.end((err) => { if (err) { console.log(`mysql關閉失敗:${err}!`) } else { console.log('mysql關閉成功!') } }) } // 導出方法 exports.conMysql = conMysql
測試數(shù)據(jù)庫連接
我們在數(shù)據(jù)庫中新建一張表 userinfo , 里面提前插入兩條數(shù)據(jù)
繼續(xù)編寫 app.js 文件獲取這兩條數(shù)據(jù)
app.js
在原有的基礎上新增一個接口 , 位置放在 /info 下就可以
// 引入 mysql 方法 let { conMysql } = require('./mysql') // 獲取全部用戶信息,測試數(shù)據(jù)庫連接的上不上 app.get('/getUser', (req, res) => { let sql = 'select * from userinfo' conMysql(sql).then(result => { res.send(result) }) })
同樣我們在瀏覽器中打開
測試成功 !
4.實現(xiàn)登錄、修改密碼和獲取用戶信息接口
接下來就是最重要的部分了 , 我們來實現(xiàn)登錄、修改密碼和獲取用戶信息的接口 , 同樣的里面還包含了數(shù)據(jù)庫的交互
但是 , 在此之前 , 我們先來統(tǒng)一返回的數(shù)據(jù)格式
app.js
我們創(chuàng)建一個類來返回數(shù)據(jù)
// 創(chuàng)建統(tǒng)一的返回報文對象 class Response { constructor(isSucceed, msg, code, data) { this.isSucceed = isSucceed; this.msg = msg; this.code = code; this.data = data; } }
登錄
app.js
登錄方法我們使用 post 請求,想來沒人希望自己的賬號密碼被人一眼看見吧
// 登錄 app.post('/login', (req, res) => { let sql = `select * from userinfo where username = '${req.body.username}'` conMysql(sql).then(result => { if (result[0].password === req.body.password) { let response = new Response(true, '登錄成功', 200, result) res.send(response) } else { let response = new Response(false, '用戶名或密碼錯誤', 400) res.status(400).send(response) } }).catch(err => { res.status(500).send('數(shù)據(jù)庫連接出錯!') }) })
其中 , res.send() 方法默認返回狀態(tài)碼為 200 , 可以通過增加調(diào)用 .status() 方法返回想要返回的狀態(tài)碼
修改密碼
app.js
修改密碼我們使用 post 請求
// 修改密碼 app.post('/updatePassword', (req, res) => { let sql = `update userinfo set password = '${req.body.newPassword}' where username = '${req.body.username}'` conMysql(sql).then(result => { if (result.affectedRows == 1) { let response = new Response(true, '修改成功', 200, result) res.send(response) } else { let response = new Response(false, '修改失敗,請稍后重試', 400) res.status(400).send(response) } }).catch(err => { res.status(500).send('數(shù)據(jù)庫連接出錯!') }) })
獲取用戶個人信息
app.js
獲取用戶個人信息我們使用 get 請求
// 獲取當前用戶信息 app.get('/getUserInfo', (req, res) => { let sql = `select * from userinfo where username = '${req.query.username}'` conMysql(sql).then(result => { let response = new Response(true, '獲取成功', 200, result) res.send(response) }).catch(err => { res.status(500).send('數(shù)據(jù)庫連接出錯!') }) })
這樣一來 , 我們登錄、修改密碼和獲取個人信息都已經(jīng)完成了 , 接下來只需要完成前后端交互就可以了 , 很顯然的是 , 接下來的事應該是由前端開發(fā)來完成了 , 所有如果有哪位有意向于前端開發(fā)的朋友閱讀到這里 , 就可以嘗試自己動手完成接下來的工作了
5.完成前后端交互
前后端交互我們使用 axios
安裝依賴
$ npm i --save axios
二次封裝axios和請求
在src同級目錄下新建文件 axios.js
打開axios.js文件,我們進行簡單封裝
axios.js
進行簡單的封裝,不添加攔截器
為了簡潔,同時相同請求地址的域名都是相同的,我們就可以將域名提出來統(tǒng)一放在最前面
const axios = require('axios') const service = axios.create({ baseURL: 'http://localhost:3000' }) export default service
接下來進行請求的封裝
在src目錄下新建 api 文件夾同時在該文件夾下新增文件 user.js 專門存放和用戶有關的接口請求
我們在 user.js 中封裝三個方法,分別是登錄,修改密碼和查看個人信息
user.js
import axios from '../../axios' // 用戶登錄 export function userLogin(data) { return axios.post(`/login`, data) } // 修改密碼 export function updatePassword(data) { return axios.post('/updatePassword', data) } // 獲取用戶信息 export function getUserInfo(username){ return axios.get('/getUserInfo?username=' + username) }
當然了,前端也是會遇到跨域問題的,我們這里使用代理服務器來解決跨域問題
在src同級目錄下新增 vue.config.js 文件
vue.config.js
module.exports = { devServer: { proxy: { '/api': { target: 'http://localhost:3000', changeOrigin: true, pathRewrite: { '^/api': '' } }, }, } }
由于我們將所有的 /api 都使用域名進行重寫
所以我們再來修改 axios.js 文件
axios.js
const axios = require('axios') const service = axios.create({ baseURL: '/api' }) export default service
好了這樣一來我們和發(fā)送請求相關的文件便寫好了,現(xiàn)在要去寫交互頁面了
添加登錄功能
Home.vue
首先需要引入請求方法
import { userLogin } from '../api/user'
再只需要對上面的 login 方法進行補充就可以了
login() { userLogin(this.form) .then((res) => { alert(res.data.msg) this.$router.push('about') }) .catch((err) => { alert(err.response.data.msg) }) }
這樣就可以完成登錄功能了 , 接下來我們來處理修改密碼
添加修改密碼功能
About.vue
首先需要引入請求方法
import { updatePassword, getUserInfo } from '../api/user'
再只需要對上面的 update 和 getUser 方法進行補充就可以了
getUser() { getUserInfo(this.form.username).then(res => { this.userInfo = res.data.data[0] }).catch((err) => { console.log(err) }) }, update() { if ( this.form.username == '' || this.form.newPassword == '' || this.form.rePassword == '' ) { alert('數(shù)據(jù)不能為空') return } updatePassword(this.form) .then((res) => { alert(res.data.msg) this.$router.push('/') alert('修改密碼后請重新登錄') }) .catch((err) => { alert(err.response.data.msg) }) }
結束
如此一來 , 一個簡單的前后端分離的項目就是有了雛形 , 雖然實現(xiàn)的功能非常簡陋 , 但能讓我在 js 這條路上再進一步 , 就是說非常高興了
如果你對文中的內(nèi)容有所疑惑或者覺得不對勁 , 請趕快到評論區(qū)給我留言 , 千萬別耽誤了
文件鏈接
最后附上文件鏈接: https://dyyidc.jb51.net/202212/yuanma/vue_node_270703_jb51.rar
到此這篇關于vue項目使用node連接數(shù)據(jù)庫(前后端分離)的文章就介紹到這了,更多相關vue使用node連接數(shù)據(jù)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
vue使用keep-alive實現(xiàn)組件切換時保存原組件數(shù)據(jù)方法
這篇文章主要介紹了vue使用keep-alive實現(xiàn)組件切換時保存原組件數(shù)據(jù)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10前端vue3打印功能實現(xiàn)(多頁打印、不使用插件)
在Vue項目中實現(xiàn)打印功能是前端開發(fā)中常見需求之一,這篇文章主要介紹了前端vue3打印功能實現(xiàn)的全部過程,文中介紹的方法實現(xiàn)了多頁打印并且不使用插件,需要的朋友可以參考下2024-09-09