vue介面請求加密
阿新 • • 發佈:2018-11-22
1. 安裝vue專案 npm init webpack project
2 安裝iview npm i iview --save (這裡是結合iview框架使用的 可根據自己的需求安裝 當然也可以不安裝)
3 在src目錄下建一個utils資料夾 裡面需要放5個js 都是封裝好的js檔案 功能不僅僅侷限於加密 可以研究一下 你會學到很多東西
1.api.js
/** * 為vue例項新增http方法 * Vue.use(http) */ import http from './http' export default { /** * install鉤子 * @param {Vue} Vue Vue */ install (Vue) { Vue.prototype.http = http } }
2. filters.js
// 公共使用的filters import Vue from 'vue'; import {getTime, getPrdType} from '../utils/time'; // 區分支付方式的filter Vue.filter('paywayType', function (value) { return value; }); // 時間 Vue.filter('newdate', function (value) { return getTime(value); }); // 時間-分鐘 Vue.filter('minute', function (str, n) { const num = parseInt(n); return str.split(' ')[num]; }); // 分割以:連線多個引數的string Vue.filter('valStr', function (str, n) { const num = parseInt(n); return str.split(':')[num]; }); // 根據提供時間計算倒計時 Vue.filter('countDown', function (str) { const dateStr = new Date(str).getTime(); const timeNow = new Date().getTime(); const countDown = dateStr - timeNow; const countDownDay = Math.floor((dateStr - timeNow) / 86400000);// 計算剩餘天數 const countDownHour = Math.floor((dateStr - timeNow) / 3600000 % 24);// 計算剩餘小時 const countDownMin = Math.floor((dateStr - timeNow) / 60000 % 60);// 計算剩餘分鐘 // const countDownSec = Math.floor((dateStr - timeNow) / 1000 % 60);// 計算剩餘秒 if (countDown <= 0) { return '- - - -'; } else { return countDownDay + '天' + countDownHour + '小時' + countDownMin + '分鐘'; } }); // 取絕對值 Vue.filter('numberFn', function (numberStr) { return Math.abs(numberStr); }); // 處理圖片地址的filter Vue.filter('imgSrc', function (src) { const env = getPrdType(); switch (env) { case 'pre': return `https://preres.bldz.com/${src}`; case 'pro': return `https://res.bldz.com/${src}`; case 'test': default: return `https://testimg.bldz.com/${src}`; } }); // 直接轉化剩餘時間 Vue.filter('dateShow', function (dateStr) { const countDownDay = Math.floor(dateStr / 86400);// 計算剩餘天數 const countDownHour = Math.floor(dateStr / 3600 % 24);// 計算剩餘小時 const countDownMin = Math.floor(dateStr / 60 % 60);// 計算剩餘分鐘 // const countDownSec = Math.floor((dateStr - timeNow) / 1000 % 60);// 計算剩餘秒 if (dateStr <= 0) { return '- - - -'; } else if (countDownDay <= 0 && countDownHour <= 0) { return countDownMin + '分鐘'; } else if (countDownDay <= 0) { return countDownHour + '小時' + countDownMin + '分鐘'; } else { return countDownDay + '天' + countDownHour + '小時' + countDownMin + '分鐘'; } }); // 處理圖片 Vue.filter('imgLazy', function (src) { return { src, error: '../static/images/load-failure.png', loading: '../static/images/default-picture.png' }; }); Vue.filter('imgHandler', function (src) { return src.replace(/,jpg/g, '.jpg'); });
3.http.js
import axios from 'axios' import utils from '../utils/utils' import {Modal} from 'iview' // import qs from 'qs'; axios.defaults.timeout = 1000*60 axios.defaults.baseURL = '' const defaultHeaders = { Accept: 'application/json, text/plain, */*; charset=utf-8', 'Content-Type': 'application/json; charset=utf-8', Pragma: 'no-cache', 'Cache-Control': 'no-cache' } // 設定預設頭 Object.assign(axios.defaults.headers.common, defaultHeaders) const methods = ['get', 'post', 'put', 'delete'] const http = {} methods.forEach(method => { http[method] = axios[method].bind(axios) }) export default http export const addRequestInterceptor = axios.interceptors.request.use.bind(axios.interceptors.request) // request前自動新增api配置 addRequestInterceptor( (config) => { if (utils.getlocal('token')) { // 判斷是否存在token,如果存在的話,則每個http header都加上token config.headers.Authentication = utils.getlocal('token') } // config.url = `/api${config.url}` return config }, (error) => { return Promise.reject(error) } ) export const addResponseInterceptor = axios.interceptors.response.use.bind(axios.interceptors.response) addResponseInterceptor( (response) => { // 在這裡統一前置處理請求響應 if (Number(response.status) === 200) { // 全域性notify有問題,還是自己處理吧 // return Promise.reject(response.data) // window.location.href = './' // this.$router.push({ path: './' }) } return Promise.resolve(response.data) }, (error) => { if (error.response) { const title = '溫馨提示'; const content = '<p>登入過期請重新登入</p>' switch (error.response.status) { case 401: // 返回 401 跳轉到登入頁面 Modal.error({ title: title, content: content, onOk: () => { localStorage.removeItem("lefthidden") localStorage.removeItem("leftlist") localStorage.removeItem("token") localStorage.removeItem("userInfo") localStorage.removeItem("headace") localStorage.removeItem("sideleft") utils.delCookie("user"); window.location.href = './' } }) break } } return Promise.reject(error || '出錯了') } )
4. time.js
// 常用的工具api
const test = 'test';
const pre = 'pre';
const pro = 'pro';
export function judeType (param, typeString) {
if (Object.prototype.toString.call(param) === typeString) return true;
return false;
};
export function isPrd () {
return process.env.NODE_ENV === 'production';
};
export function getPrdType () {
return ENV;
};
export const ls = {
put (key, value) {
if (!key || !value) return;
window.localStorage[key] = JSON.stringify(value);
},
get (key) {
if (!key) return null;
const tem = window.localStorage[key];
if (!tem) return null;
return JSON.parse(tem);
},
// 設定cookie
setCookie (key, value, time) {
if (time) {
let date = new Date();
date.setDate(date.getDate() + time);
document.cookie = key + '=' + value + ';expires=' + date.toGMTString() + ';path=/';
} else {
document.cookie = key + '=' + value + ';path=/';
}
},
// 獲取cookie
getCookie (key) {
let array = document.cookie.split('; ');
array.map(val => {
let [valKey, value] = val.split('=');
if (valKey === key) {
return decodeURI(value);
}
});
return '';
}
};
/**
* 判斷元素有沒有該class
* @param {*} el
* @param {*} className
*/
export function hasClass (el, className) {
let reg = new RegExp('(^|\\s)' + className + '(\\s|$)');
return reg.test(el.className);
}
/**
* 為元素新增class
* @param {*} el
* @param {*} className
*/
export function addClass (el, className) {
if (hasClass(el, className)) return;
let newClass = el.className.spilt(' ');
newClass.push(className);
el.className = newClass.join(' ');
}
export function removeClass (el, className) {
if (!hasClass(el, className)) return;
let reg = new RegExp('(^|\\s)' + className + '(\\s|$)', 'g');
el.className = el.className.replace(reg, ' ');
}
/**
* 將資料儲存在標籤裡
* @param {*} el
* @param {*} name
* @param {*} val
*/
export function getData (el, name, val) {
let prefix = 'data-';
if (val) {
return el.setAttribute(prefix + name, val);
}
return el.getAttribute(prefix + name);
}
export function isIphone () {
return window.navigator.appVersion.match(/iphone/gi);
}
/**
* 計算元素和視窗的位置關係
* @param {*} el
*/
export function getRect (el) {
if (el instanceof window.SVGElement) {
let rect = el.getBoundingClientRect();
return {
top: rect.top,
left: rect.left,
width: rect.width,
height: rect.height
};
} else {
return {
top: el.offsetTop,
left: el.offsetLeft,
width: el.offsetWidth,
height: el.offsetHeight
};
}
}
/**
* 獲取不確定資料的方法api
* @param {Array} p 引數陣列
* @param {Object} o 物件
*/
export function getIn (p, o) {
return p.reduce(function (xs, x) {
return (xs && xs[x]) ? xs[x] : null;
}, o);
}
/**
* 時間戳改為年月日格式時間
* @param {*} p 時間戳
*/
export function getTime (p) {
let myDate = new Date(p);
let year = myDate.getFullYear();
let month = myDate.getMonth() + 1;
let date = myDate.getDate();
if (month >= 10) {
month = '' + month;
} else {
month = '0' + month;
}
if (date >= 10) {
date = '' + date;
} else {
date = '0' + date;
}
return year + '-' + month + '-' + date;
}
export function debounce (method, delay) {
let timer = null;
return function () {
let context = this;
let args = arguments;
clearTimeout(timer);
timer = setTimeout(function () {
method.apply(context, args);
}, delay);
};
}
5 utils.js
// 獲取cookie、
export function getCookie (name) {
if (document.cookie.length > 0){
let c_start = document.cookie.indexOf(name + '=')
if (c_start != -1) {
c_start = c_start + name.length + 1
let c_end = document.cookie.indexOf(';', c_start)
if (c_end == -1) c_end = document.cookie.length
return unescape(document.cookie.substring(c_start, c_end))
}
}
return ''
}
// 設定cookie,增加到vue例項方便全域性呼叫
export function setCookie (cname, value, expiredays) {
let exdate = new Date()
exdate.setDate(exdate.getDate() + expiredays)
document.cookie = cname + '=' + escape(value) + ((expiredays == null) ? '' : ';expires=' + exdate.toGMTString())
}
// 刪除cookie
export function delCookie (name) {
let exp = new Date()
exp.setTime(exp.getTime() - 1)
let cval = getCookie(name)
if (cval != null) {
document.cookie = name + '=' + cval + ';expires=' + exp.toGMTString()
}
}
// 設定localstorage
export function putlocal (key, value) {
if (!key || !value) return
window.localStorage[key] = JSON.stringify(value)
}
// 獲取localstorage
export function getlocal (key) {
if (!key) return null
const tem = window.localStorage[key]
if (!tem) return null
return JSON.parse(tem)
}
/**
* use_iframe_download function - 通過 iframe 下載檔案
*
* @param {String} download_path 需下載檔案的連結
* @return {Void}
*/
export const use_iframe_download = download_path => {
const $iframe = document.createElement('iframe')
$iframe.style.height = '0px'
$iframe.style.width = '0px'
document.body.appendChild($iframe)
$iframe.setAttribute('src', download_path)
setTimeout(function () { $iframe.remove() }, 20000)
}
function requestTimeout (xhr) {
const timer = setTimeout(() => {
timer && clearTimeout(timer)
xhr.abort()
}, 5000)
return timer
}
// 匯出
export function exporttable (httpUrl,token, formData, callback) {
let i = formData.entries();
let param = "?Authentication="+token;
do{
var v = i.next();
if(!v.done){
param+="&"+v.value[0]+"="+v.value[1];
}
}while(!v.done);
// console.log(param);
window.open(httpUrl+param)
// var xhr = new XMLHttpRequest()
// if (xhr.withCredentials === undefined){
// return false
// };
// xhr.open("post", httpUrl)
// // xhr.timeout=5000
// xhr.setRequestHeader("Authentication", token)
// xhr.responseType = "blob"
// let timer = requestTimeout(xhr)
// xhr.onreadystatechange = function () {
// timer && clearTimeout(timer)
// if (xhr.readyState !== 4) {
// timer = requestTimeout(xhr)
// return
// }
// if (this.status === 200) {
// var blob = this.response
// var contentType = this.getResponseHeader('content-type')
// var fileName = contentType.split(";")[1].split("=")[1]
// fileName = decodeURI(fileName)
// let aTag = document.createElement('a')
// // 下載的檔名
// aTag.download = fileName
// aTag.href = URL.createObjectURL(blob)
// aTag.click()
// URL.revokeObjectURL(blob)
callback && callback(true)
// } else {
// callback && callback(false)
// }
// }
// xhr.send(formData);
}
// 獲取當前時間
export function getNowFormatDate() {
var date = new Date();
var seperator1 = "-";
var seperator2 = ":";
var month = date.getMonth() + 1;
var strDate = date.getDate();
if (month >= 1 && month <= 9) {
month = "0" + month;
}
if (strDate >= 0 && strDate <= 9) {
strDate = "0" + strDate;
}
var currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate
+ " " + date.getHours() + seperator2 + date.getMinutes()
+ seperator2 + date.getSeconds();
return currentdate;
}
// 時間格式化
export function formatDate(date, fmt) {
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
}
let o = {
'M+': date.getMonth() + 1,
'd+': date.getDate(),
'h+': date.getHours(),
'm+': date.getMinutes(),
's+': date.getSeconds()
};
for (let k in o) {
if (new RegExp(`(${k})`).test(fmt)) {
let str = o[k] + '';
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : padLeftZero(str));
}
}
return fmt;
};
function padLeftZero(str) {
return ('00' + str).substr(str.length);
}
export default {
getCookie,
setCookie,
delCookie,
putlocal,
getlocal,
exporttable,
getNowFormatDate,
formatDate
}
4.配置main.js
import Vue from 'vue'
import App from './App'
import router from './router'
import VueRouter from 'vue-router';
import iView from 'iview';
import 'iview/dist/styles/iview.css'
import http from './utils/http'
import Api from './utils/api'
import utils from './utils/utils'
import './utils/filters'
Vue.config.productionTip = false
Vue.use(VueRouter);
Vue.use(iView);
Vue.use(http)
Vue.use(Api)
Vue.use(utils)
/* eslint-disable no-new */
global.BASE_URL = process.env.API_HOST
new Vue({
el: '#app',
router,
components: { App },
template: '<App/>'
})
5.找到config資料夾下的dev.env.js
module.exports = merge(prodEnv, {
NODE_ENV: '"development"',
API_HOST: '"開發環境介面地址"'
})
6.頁面中具體使用方法
<template>
<div class="hello">
<Select v-model="model8" clearable style="width:200px">
<Option v-for="item in cityList" :value="item.productCode" :key="item.productCode">{{item.productName }}</Option>
</Select>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
data () {
return {
cityList:[],
model8:"code"
}
},
mounted(){
this.http
.post(BASE_URL + "請求路徑",{})
.then(data => {
if (data.code == "success") {
this.cityList = data.data;
this.cityList.splice(0,0,{ productCode: "code", productName: "所有產品" })
}
})
.catch(err => {
console.log(err);
});
}
}
</script>
<style scoped>
</style>