您好,登錄后才能下訂單哦!
注意:后臺服務更改之后需要重啟服務;前端配置文件更改之后也需要重新跑命令npm run dev
一、使用express提供后臺服務,輸出接口
后臺目錄結(jié)構(gòu):
main.js
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('Hello World');
})
app.get('/getUserInfo', function(req, res, next){ //用于前臺調(diào)用的接口,地址:http://127.0.0.1:8888/getUserInfo
console.log('get用戶請求數(shù)據(jù)為:');
console.log(req.query);
res.json({
code:200,
data:{
message:'你好'
},
message:'success'
});
});
var server = app.listen(8888, function () {
var host = server.address().address
var port = server.address().port
console.log(host,port)
console.log("your application is running on http://localhost:8888")
})
---解釋---:
(1)、app.get()表示接收所有前端來的get請求方式,同理,app.post(),app.delete()分別表示接受前端發(fā)來的post請求與delete請求方式。
(2)、app.get(path, callback [, callback ...]):傳參,第一個參數(shù)是路徑,后面的參數(shù)都是是回調(diào)函數(shù),可以放1個或者多個回調(diào)函數(shù),一般只用到1個回調(diào),本例也只用了1個回調(diào)。官方對這個方法的解釋是:Routes HTTP GET requests to the specified path with the specified callback functions,意即‘用指定回調(diào)方法向指定路徑發(fā)送http get請求’,通俗講就是對path參數(shù)表示的接口執(zhí)行一些操作,這些操作寫在第二個參數(shù)即回調(diào)函數(shù)內(nèi)。
(3) app.get()中的第二個參數(shù)---回調(diào)函數(shù):該回調(diào)函數(shù)接受3個參數(shù),按照大多數(shù)人的不成文的書寫慣例,這三個傳參寫作req, res, next。第一個參數(shù)表示http請求對象(request),第二個參數(shù)表示response對象,第三個參數(shù)是next函數(shù),表示將控制權(quán)交給下一個中間件。next有點復雜不詳說,只要記住一個請求結(jié)束后,不要后面寫next(),常見的res.send(),res.json()都屬于請求結(jié)束,后面不要再寫next()了.
(4)res.json(obj) 表示返回一個json對象,該對象的詳細數(shù)據(jù)就是括號里的東西啦。
二、前端使用vue-cli腳手架
前端目錄結(jié)構(gòu):
1、先解決跨域問題
在config/index.js文件里面的module.exports對象里面的proxyTable里面加上以下代理:
proxyTable: {
'/gsafetyapi': {
target: 'http://127.0.0.1:8888/', //要代理的服務地址,要加http
changeOrigin: true, //是否跨域
secure: false, //如果是https接口,需要配置這個參數(shù)
timeout: 480000,
pathRewrite: {
'^/gsafetyapi': '' //這里理解成用gsafetyapi代替target里面的地址
}
},
},
2、封裝axios和接口地址集合
新建文件夾plugins
http.js
import axios from 'axios';
import apiConfig from "./api.js"
import qs from 'qs'
axios.defaults.baseURL = process.env.NODE_ENV === 'development' ? 'gsafetyapi' : ''; //開發(fā)的時候加代理,生產(chǎn)環(huán)境不用加代理
// 請求攔截
axios.interceptors.request.use(config => {
// 1. 這個位置就請求前最后的配置
// 2. 當然你也可以在這個位置 加入你的后端需要的用戶授權(quán)信息
return config
}, error => {
return Promise.reject(error)
})
// 響應攔截
axios.interceptors.response.use(response => {
// 請求成功
// 1. 根據(jù)自己項目需求定制自己的攔截
// 2. 然后返回數(shù)據(jù)
return response;
}, error => {
// 請求失敗
if (error && error.response) {
switch (error.response.status) {
case 400:
// 對400錯誤您的處理\
break
case 401:
// 對 401 錯誤進行處理
break
default:
// 如果以上都不是的處理
return Promise.reject(error);
}
}
})
export default {
/**
* get 請求
* @param api_name 接口路由
* @param params 接口參數(shù)
* @param time 如果請求話費了超過 `time` 的時間,請求將被中斷
* @returns {AxiosPromise<any>}
*/
// get(apiKey, data) {
// return axios.get(apiConfig[apiKey], data);
// },
get(api_name, params, time) {
let url = apiConfig[api_name];
return axios({
method: 'get',
url: url,
params: params,
timeout: time || 60000,
})
},
/**
* post 請求
*
* @param api_name 接口路由
* @param params 接口參數(shù)
* @param time 如果請求話費了超過 `time` 的時間,請求將被中斷
* @returns {AxiosPromise<any>}
*/
post(api_name, params, time) {
let url = apiConfig[api_name];
return axios({
method: 'post',
url: url,
params: qs.stringify(params),
timeout: time || 60000,
})
},
}
封裝api的文件
api.js
export default {
getCompanyDepartmentTree: "/api/v1/user-center-service/companyDepartment/getCompanyDepartmentTree", //獲取組織架構(gòu)數(shù)據(jù)
getUserInfo:"/getUserInfo"
}
3、全局注冊封裝好的axios
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
// 已在webpack.base.conf中使用別名設置了要使用import命令加載的Vue構(gòu)建版本(僅運行時或獨立運行)
import Vue from 'vue'
import App from './App'
import router from './router'
import http from '../plugins/http'
Vue.config.productionTip = false
Vue.prototype.$http = http;
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
components: { App },
template: '<App/>'
})
4、調(diào)接口:http://127.0.0.1:8888/getUserInfo
created () {
this.$http
.get("getUserInfo",{name:'kate'}).then(res => {
console.log(res)
});
}
三、數(shù)據(jù)庫使用mongodb
1、安裝,直接安裝在c盤下
2、配置環(huán)境變量
3、創(chuàng)建數(shù)據(jù)庫文件的存放位置
在D盤下新建mongodb文件夾,
mongodb文件夾里面新建data文件夾,data文件夾里面新建db和log文件夾
mongodb文件夾里面新建mongo.config配置文件,文件內(nèi)容:
##數(shù)據(jù)文件 此處=后對應到數(shù)據(jù)所存放的目錄
dbpath=d:\mongodb\data\db
##日志文件 此處=后對應到日志文件所在路徑
logpath=d:\mongodb\data\log\mongodb.log
##錯誤日志采用追加模式,配置這個選項后mongodb的日志會追加到現(xiàn)有的日志文件,而不是從新創(chuàng)建一個新文件
logappend=true
#啟用日志文件,默認啟用
journal=true
#這個選項可以過濾掉一些無用的日志信息,若需要調(diào)試使用請設置為false
quiet=true
#端口號 默認為27017
port=27017
4、
net start MongoDB 開啟服務
net stop MongoDB 關(guān)閉服務
5、現(xiàn)在搭建的是本地數(shù)據(jù)庫,數(shù)據(jù)庫地址:http://localhost:27017/
6、mongoose 數(shù)據(jù)模型
直接用 node.js 也可以連接數(shù)據(jù)庫進行讀寫,但mongoose 這個插件除了封裝這個基本功能之外,還提供了很多其他的服務。
安裝:npm install mongoose --save
var mongoose = require('mongoose');
//鏈接數(shù)據(jù)庫
mongoose.connect('mongodb://localhost:27017/db',function(err){
if(err){
console.log('數(shù)據(jù)庫連接失敗')
}else{
console.log('數(shù)據(jù)庫連接成功')
var server = app.listen(8888, function(){
console.log("Server is running on http://localhost:8888");
});
}
});
7、建立schema,類似于一個collection集合的概念,類似于mysql的一張表,定義schema,就是定義這張表的表結(jié)構(gòu),要存什么格式的數(shù)據(jù),每一條數(shù)據(jù)都是這張表的一行,
注意:這種schema不具備操作數(shù)據(jù)庫的能力
let mongoose = require('mongoose');
let userScheam = new mongoose.Schema({
//賬戶名
account:String,
pass:String,
checkPass:String,
age:Number
})
module.exports = userScheam;
8、定義好了Schema,接下就是生成Model。
model是由schema生成的模型,可以對數(shù)據(jù)庫進行操作
//表有了,下面需要借助model,來對數(shù)據(jù)庫的表進行操作
let mongoose = require('mongoose');
let userSchema = require('../schemas/userSchema');
module.exports = new mongoose.model('User',userSchema); //User是給這個模型起的名字,后面是要操作的那個表的表名
//User才具有了對表進行增刪改查的api
9、在路由文件前面,引入該model,然后就可以使用
var User = require('./models/userModel');
User.save(); User.find();等等增刪改查方法
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。