vue 项目整体配置

main.js

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import axios from 'axios'
import promise from 'es6-promise'
import {mockUrl, devUrl} from '../public/static-assets/config/api'
import {baseFilters} from '../public/static-assets/config/base-filters'
import formats from '../public/static-assets/config/formats'
import stateCodesList from '../public/static-assets/config/state-codes-list'

//import 'element-ui/lib/theme-chalk/index.css'
import 'element-ui/theme/index.css'


Vue.use(Badge);
Vue.use(Breadcrumb);
Vue.use(BreadcrumbItem);
Vue.use(Button);
Vue.use(Row);
Vue.use(Col);


const runEnv = "dev"; //测试环境: "mock"  "dev"

promise.polyfill();
Vue.config.productionTip = false;

Vue.prototype.$baseUrl = (function () {
  if(runEnv === "mock"){
    return mockUrl;
  }else if(runEnv === "dev"){
    return devUrl;
  }
})();


/*
* 约定状态代码
*/
Vue.prototype.$stateCodesList = stateCodesList;
/*
* 时间格式转换
*/
Vue.prototype.$formats = formats;
/*
* 基础filter
*/
Vue.prototype.$baseFilters = baseFilters;

let token = sessionStorage.getItem('token')
const HTTP = axios.create({
    //baseURL: baseUrl,
    timeout: 6000,
    headers: {
        'X-Custom-Header': 'foobar',
        common:{
            'Authorization' :'Bearer ' + token,
        },
        post:{
            'Content-Type' : "application/x-www-form-urlencoded",
        }
    }
});

if(runEnv === "dev"){
    router.beforeEach((to, from, next) => {
        // 判断该路由是否需要登录权限
        if (to.meta.requireAuth) {
            // 通过获取当前的token是否存在
            if (token !== 'null') {
                next()
            } else {
                alert('token已失效,请重新登录!')
                window.location.href = window.location.host
            }
        } else {
            next()
        }
    })

    const CancelToken = axios.CancelToken;
    const source = CancelToken.source();


    HTTP.interceptors.response.use(
        response => {
            return response;
        },
        error => {
            console.log(error)
            if (error.response.status === 401) {
                source.cancel(); // 取消其他正在进行的请求
                alert('未授权,请重新登录!');
                sessionStorage.removeItem('token')
                window.location.href = '/'
            } else if (error.response.status === 404) {
                //alert('404,接口未找到!')
            } else if (error.response.status === 500) {
                //alert('500,应用程序错误!')
            }
            if (axios.isCancel(error)) { // 取消请求的情况下,终端Promise调用链
                return new Promise(() => {});
            } else {
                return Promise.reject(error);
            }
        }
    );
}



// 如果在mock环境和get请求时,自动添加扩展名,为方便dev和mock同步测试
HTTP.interceptors.request.use(config => {
    let url = config.url;
        if ((config.method === 'get' && runEnv === 'mock') || url.indexOf("/static-assets/code" ) !== -1) {
            if(url.indexOf("?") !== -1){
                config.url = url.split("?")[0]+'.json?'+url.split("?")[1];
            }else{
                config.url = url+'.json';
            }

        }

        return config
    }
);

Vue.prototype.$HTTP = HTTP;



new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

api 来源切换

public/statice-assets/config/api.js

const apiHostDev = "http://192.168.0.102:7777/api/"; //dev 数据路径
const apiHostLocal = "/static-assets/";  //mock 数据路径
let mockUrl = {
    global: apiHostLocal + 'api/global', //全局
    authenticate: apiHostLocal + 'api/global/authenticate', //鉴权
    project: apiHostLocal + 'api/project', //项目
},
    devUrl = {
        authenticate: apiHostDev + 'global/authenticate', //鉴权
        common: apiHostDev + 'global/common', //公用
    }



export {mockUrl,devUrl}

根据状态码改变状态名称的全局方法,用法,this.$baseFilters.politicsStatusFile(xxx)

public/statice-assets/config/base-filters.js

import stateCodesList from './state-codes-list'

let baseFilters = {
//状态判断
    politicsStatusFile:function(value){
        var state = '';
        switch (value) {
            case stateCodesList.politicsStatusMasses:
                state = '群众';
                break;
            case stateCodesList.politicsStatusParty:
                state = '党员';
                break;

            default:
        }
        return state;
    },
    //文件后缀名
    fileExtensionFilter: function (path) {
        if (!path) return '';
        var arr = path.split('.'),
            extension = arr[arr.length-1].toLowerCase(),
            extensionName = '';
        switch (extension) {
            case 'doc':
            case 'docx':
                extensionName = 'doc';
                break;
            case 'excel':
                extensionName = 'excel';
                break;
            case 'pdf':
                extensionName = 'pdf';
                break;
            case 'zip':
            case 'rar':
                extensionName = 'zip';
                break;
            default:
        }
        return extensionName;
    },
    //手机验证
    validatePhone:function(rule, value, callback){
        if (value === '') {
            callback(new Error('请输入证明人电话'));
        } else{
            if(!(/^1[3456789]\d{9}$/.test(value))) {
                callback(new Error('请输入正确的手机号'));
            }else{
                callback();
            }

        }
    }
};


export {baseFilters};

状态码对应 this.$stateCodesList.accountNormal

public/statice-assets/config/state-codes-list.js

const stateCodesList = {
    //基本信息相关
    accountNormal: 1,//正常
    accountForbidden: 2,//禁用
};
export default stateCodesList;

时间格式化
this.$formats.YYYYMMDDByHoriLine(1594690376049)
// 2020-07-14

public/statice-assets/config/formats.js

import moment from "moment"

let formats = {

    //短横线分割 YYYY-MM-DD
    YYYYMMDDByHoriLine:function(time){
        return moment(time).format('YYYY-MM-DD')
    },
    //短横线分割 YYYY-MM-DD HH:mm
    YYYYMMDDHHmmByHoriLine:function(time){
        return moment(time).format('YYYY-MM-DD HH:mm')
    },
    //中文字符分割 YYYY年MM月DD日
    YYYYMMDDByCharacters:function(time){
        return moment(time).format('YYYY年MM月DD日')
    },
    //中文字符分割 YYYY年MM月DD日 HH时mm分
    YYYYMMDDHHmmByCharacters:function(time){
        return moment(time).format('YYYY年MM月DD日 HH时mm分')
    },
    //中文字符分割 YYYY年MM月
    YYYYMMByCharacters:function(time){
        return moment(time).format('YYYY年M月')
    },
    //中文字符分割 YYYY年MM月DD日 HH:mm
    YYYYMMDDHHmmByCharactersHoriLine:function(time){
    return moment(time).format('YYYY年MM月DD日 HH:mm')
}

};
export default formats;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339