记录自己遇到的问题,以备查询。
http.js
import axios from 'axios'
import router from '../router'
//自己写的工具类
import utils from './utils'
//具体配置参数参考https://github.com/axios/axios
// `timeout` 指定请求超时的毫秒数(0 表示无超时时间)
// 如果请求话费了超过 `timeout` 的时间,请求将被中断
axios.defaults.timeout = 15000
// `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
// 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
axios.defaults.baseURL = '/api'
//router.beforeEach 注册一个全局前置守卫
router.beforeEach((to, from, next) => {
let userinfo = Cookies.get('KEY_USERINFO')
// 如果存在用户信息 或 路由不需要登录验证、放行,否则跳转登录路由
if (userinfo || to.meta.requireAuth == false) {
next()
} else {
next({
path: '/login'
})
}
})
// http request 拦截器
axios.interceptors.request.use(
config => {
config.data = JSON.stringify(config.data)
config.headers = {
'Content-Type': 'application/json;charset=utf-8'
}
return config
},
error => {
return Promise.reject(error)
}
)
// http response 拦截器
axios.interceptors.response.use(
response => {
console.log(response)
return response
},
error => {
return Promise.reject(error)
}
)
/**
* 封装get方法
* @param url 请求路径
* @param data 请求参数
* @param encrypt 参数是否加密,默认加密
* @returns {Promise}
*/
export function fetch (url, params = {}, encrypt = true) {
if (encrypt) {
//参数加密
utils.paramsEncrypt(params)
}
return new Promise((resolve, reject) => {
axios.get(url, {params})
.then(response => {
resolve(response.data)
})
.catch(err => {
console.log(response)
reject(err)
})
})
}
/**
* 封装post请求
* @param url 请求路径
* @param data 请求参数
* @param encrypt 参数是否加密,默认加密
* @returns {Promise}
*/
export function post (url, params = {}, encrypt = true) {
if (encrypt) {
utils.paramsEncrypt(params)
}
return new Promise((resolve, reject) => {
axios.post(url, params)
.then(response => {
resolve(response.data)
}, err => {
reject(err)
})
})
}
/**
main.js
import {post,fetch} from './utils/http'
Vue.prototype.$post = post;
Vue.prototype.$fetch = fetch;
**/
utils.js
import Cookies from 'js-cookie'
import CryptoJS from 'crypto-js/crypto-js'
export const key = CryptoJS.enc.Utf8.parse('xxxxx') // 十六位十六进制数作为密钥
export const iv = CryptoJS.enc.Utf8.parse('xxxxxxxxxxx') // 十六位十六进制数作为密钥偏移量
/** g工具JS */
export default {
/** 加密 */
encrypt (word) {
let encrypted = CryptoJS.AES.encrypt(word.toString(), key,// AES加密
{
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7 // 后台用的是pad.Pkcs5,前台对应为Pkcs7
})
return encrypted.toString()
},
/** 解密 */
decrypt (word) {
let decrypted = CryptoJS.AES.decrypt(word, key,// AES解密
{
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
})
return CryptoJS.enc.Utf8.stringify(decrypted)
},
/** 参数加密 */
paramsEncrypt (params = {}) {
for (let prop in params) {
if (params[prop] != null) {
params[prop] = this.encrypt(params[prop])
}
}
},
goTop(){
document.body.scrollTop = 0
document.documentElement.scrollTop = 0
},
openUrl(url){
let reg = /(http|https):\/\/([\w.]+\/?)\S*/
if(!reg.test(url)){
url = '//'+url
}
window.open(url, '_blank')
},
download(url){
window.open(url, '_blank')
},
//将对象的所有属性至为null
objectSetNull(obj){
for (let item in obj){
obj[item] = null
}
return obj
},
}