前後端分離
1、解決跨域問題
1.1 、後端配置
1.1.1、 配置類
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 任意路徑
.allowedOrigins("*") //允許所有域
.allowedMethods("GET","HEAD","PUT","DELETE") //允許的方法
.allowCredentials(true)
.maxAge(3600)
.allowedHeaders("*"); //允許跨的域
}
1.1.2、注解
2、前端處理
vue工程中建立vue.config.js檔案
/**
* 請求代理對象,解決跨域問題
* 攔截http請求
* target:攔截目标位址
* pathRewrite:攔截的位址是否修改
* **/
let proxyObj = {};
proxyObj['/']={
ws:false,
target:'http://localhost:80',
changeOrigin:true,
pathRewrite:{
'^/':''
}
}
module.exports={
//生産伺服器
devServer:{
host:'localhost',
port:8080,
//代理對象
proxy:proxyObj
}
}
2、前端處理
2.1、axios處理
首先安裝axios
npm install axios
2.1.1、局部配置
import Axios from 'axios'
Axios.get('http://localhost:8081/blogs/'+(currentPage)+'/3').then(function (data) {
......
});
2.1.2、全局配置
配置一
import axios from 'axios';
Vue.prototype.axios = axios;
this.axios.get('http://localhost:8081/blogs/'+this.id).then(function (resp) {
......
});
配置二
import axios from 'axios';
Vue.prototype.$axios = axios;
//全局配置
axios.defaults.baseURL='http://localhost:8081/'
axios.defaults.headers.common['Authorization'] = 'Token '
axios.defaults.headers.post['Content-type'] = 'application/urlencode'
axios.defaults.headers.get['Accepts'] = 'application/json'
//使用
_this.$axios.get('/blogs/'+(currentPage)+'/3').then(function (data) {
......
});
2.2、 封裝axios方法
2.2.1 key/value形式
import axios from "axios";
/**
* 封裝post請求
* */
let base= '';
export const postRequest = (url,params)=>{
return axios({
method:'post',
url:`${base}${url}`,
data:params,//對象key/value
transformRequest: [function (params) {
let ret = '';
for (let item in params){
//encodeURIComponent()函數可把字元串作為URI元件進行編碼
ret += encodeURIComponent(item)+'='+encodeURIComponent(params[item])+'&';
}
return ret;
}],
headers:{
'Content-Type':'application/x-www-form-urlencoded',
}
});
}
/**
* 封裝put請求
* */
export const putRequest = (url,params)=>{
return axios({
method:'put',
url:`${base}${url}`,
data:params,//對象key/value
transformRequest: [function (params) {
let ret = '';
for (let item in params){
//encodeURIComponent()函數可把字元串作為URI元件進行編碼
ret += encodeURIComponent(item)+'='+encodeURIComponent(params[item])+'&';
}
return ret;
}],
headers:{
'Content-Type':'application/x-www-form-urlencoded',
}
});
}
/**
* 封裝delete請求
* */
export const deleteRequest = (url)=>{
return axios({
method:'delete',
url:`${base}${url}`,
});
}
/**
* 封裝delete請求
* */
export const deleteRequest = (url,params)=>{
return axios({
method:'delete',
url:`${base}${url}`,
data:params,//對象key/value
transformRequest: [function (params) {
let ret = '';
for (let item in params){
//encodeURIComponent()函數可把字元串作為URI元件進行編碼
ret += encodeURIComponent(item)+'='+encodeURIComponent(params[item])+'&';
}
return ret;
}],
headers:{
'Content-Type':'application/x-www-form-urlencoded',
}
});
}
2.2.2 JSON形式
//.js檔案引入方式
import { Message } from 'element-ui';
import axios from 'axios'
import router from '../router'
/**封裝響應
* 響應的攔截器
* success回調
* error回調
* 失敗的情況:
* 1.業務的失敗。如删除失敗,服務端的響應還是200,進入success
* 2.服務端的異常資訊,進入error,請求一定失敗
* **/
axios.interceptors.response.use(success=>{
console.log(success);
/**
* success.data.status 傳回的json
* 業務錯誤
* axios的resp傳回空,直接判斷是否為空,沒有則請求失敗
* **/
if (success.status && success.status ==200 && success.data.status==500){
Message.error({message:success.data.msg})
return;
}
/**
* 輸出服務端傳回的消息
* **/
if (success.data.msg){
Message.success({message:success.data.msg});
}
/**
* 傳回json
* 傳回到axios請求調用中
*
* **/
return success.data;
},error=>{ //一定失敗
if (error.response.status == 504 || error.response.status == 404){
Message.error({message:'伺服器被吃( ╯□╰ )了'})
}else if (error.response.status == 403){
Message.error({message:'權限不足,請聯系管理者'})
}else if (error.response.status == 401){
Message.error({message:'賬戶已過期,請重新登陸'})
//傳回到登入界面
router.replace("/")
}else {
if (error.response.data.msg){
Message.error({message:error.response.data.msg})
} else{
Message.error({message:'未知錯誤'})
}
}
return;
})
/**
* 定義請求
* base 可以統一加字首
* transformRequest
* **/
let base = '';
export const postKeyValueRequest=(url,params)=>{
return axios({
method:'post',
url:`${base}${url}`, //`` 字元串拼接
data:params,
transformRequest:[function (data) {
let ret = '';
for (let i in data) {
//key->value加&
ret+=encodeURIComponent(i)+'='+encodeURIComponent(data[i])+'&'
}
//console.log(ret)
return ret;
}],
headers:{
'Content-Type':'application/x-www-form-urlencoded'
}
})
}
/**
* GET
* POST 傳遞JSON
* PUT 傳遞JSON
* DELETE 請求
* **/
export const postRequest=(url,params)=>{
return axios({
method:'post',
url:`${base}${url}`,
data:params,
})
}
export const putRequest=(url,params)=>{
return axios({
method:'put',
url:`${base}${url}`,
data:params,
})
}
export const getRequest=(url,params)=>{
return axios({
method:'get',
url:`${base}${url}`,
data:params,
})
}
export const deleteRequest=(url,params)=>{
return axios({
method:'delete',
url:`${base}${url}`,
data:params,
})
}
2.3、axios過濾器
//.js檔案引入方式
import { Message } from 'element-ui';
import axios from 'axios'
import router from '../router'
/**封裝響應
* 響應的攔截器
* success回調
* error回調
* 失敗的情況:
* 1.業務的失敗。如删除失敗,服務端的響應還是200,進入success
* 2.服務端的異常資訊,進入error,請求一定失敗
* **/
axios.interceptors.response.use(success=>{
console.log(success);
/**
* success.data.status 傳回的json
* 業務錯誤
* axios的resp傳回空,直接判斷是否為空,沒有則請求失敗
* **/
if (success.status && success.status ==200 && success.data.status==500){
Message.error({message:success.data.msg})
return;
}
/**
* 輸出服務端傳回的消息
* **/
if (success.data.msg){
Message.success({message:success.data.msg});
}
/**
* 傳回json
* 傳回到axios請求調用中
*
* **/
return success.data;
},error=>{ //一定失敗
if (error.response.status == 504 || error.response.status == 404){
Message.error({message:'伺服器被吃( ╯□╰ )了'})
}else if (error.response.status == 403){
Message.error({message:'權限不足,請聯系管理者'})
}else if (error.response.status == 401){
Message.error({message:'賬戶已過期,請重新登陸'})
//傳回到登入界面
router.replace("/")
}else {
if (error.response.data.msg){
Message.error({message:error.response.data.msg})
} else{
Message.error({message:'未知錯誤'})
}
}
return;
})
2.4 、ES6新特性
1.5以前
const _this = this;
_this.$axios.get('/blogs/'+(currentPage)+'/3').then(function (data) {
_this......
});
新特性
this.$axios.delete('http://localhost:8081/blogs/'+_this.id).then(resp=>{
this.....
});
2.5、element UI
安裝
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);
導入提示框
import {Message} from "element-ui";
Message({
message: '删除部落格成功',
type: 'success'
});
2.6 字元串拼接
let ids = '?';
//拼接字元
this.multipleSelection.forEach(item => {
ids += 'ids=' + item.id + '&';
})