记一次Vue配置

258 阅读9分钟

项目介绍

项目归属:华为

项目名称:商臻系统管理—企业展会 Portal

技术栈:vueCli4 + vue2.6 + vue-i18n + ...

项目配置

配置国际化 ./plugins/myi18n.js

把国际化配置单独抽取

拓展 Vue 设置国际化的方法

设置国际化(页面显示 存储到 vuex 全局备用 设置国际化请求头)

import Vue18n from 'vue-i18n'
import store from "@/store/index"
import { setLang } from "@/utils/axios"

var zh = require("@/common/lang/cn")
var en = require("@/common/lang/en")

export default {
    install(Vue) {
        Vue.use(Vue18n)
        const i18n = new Vue18n({
            locale`zh-CN`,
            messages: {
                "zh-CN": zh,
                "en-US": en
            }
        })
        Vue.prototype.i18n = i18n
        Vue.prototype.setLang = (lang = `zh-CN`) => {
            // 配置国际化
            i18n.locale = lang
            // 根据不同国际化可能发送不同的接口,或者使用不同的参数
            store.commit(`setLang`, lang)
            // 根据国际化配置不同的请求头
            setLang(lang)
        }
    }
}

配置 axios ./utils/axios.js

配置过期时间

配置后端返回的正确 code 值

配置后端提示字段,比如返回格式为{ code:"90000", retMsg:"保存错误!", retData:null }

请求/响应拦截返回 Promise

暴露设置国际化的方法

暴露设置 token 的方法

import Axios from 'axios'

const baseURL = `http://192.168.28.170:8080/company_portal`,     // baseURL
    timeout = 7000,                                 // 过期时间
    successCode = [090011900159001490013],  // 正确的code值 [常规请求,文件上传,文件删除,预览模板,保存/修改模板]
    message = "retMsg";                             // 后端参数返回字段,比如{code:"90010",retMsg:"保存失败",retData:null}

Axios.defaults.timeout = timeout
Axios.defaults.baseURL = baseURL

// 请求拦截器
Axios.interceptors.request.use(config => config, error => Promise.reject(error))

// 响应拦截器
Axios.interceptors.response.use(
    response => successCode.indexOf(response.data.retCode) !== -1 ?
        Promise.resolve(response.data) : Promise.reject(response.data),
    error => {
        if (error && error.response) {
            switch (error.response.status) {
                case 400: error[message] = '请求错误(400)'break;
                case 401: error[message] = '未授权,请登录(401)'break;
                case 403: error[message] = '拒绝访问(403)'break;
                case 404: error[message] = `请求地址出错:${error.response.config.url}`break;
                case 405: error[message] = '请求方法未允许(405)'break;
                case 408: error[message] = '请求超时(408)'break;
                case 500: error[message] = '服务器内部错误(500)'break;
                case 501: error[message] = '服务未实现(501)'break;
                case 502: error[message] = '网络错误(502)'break;
                case 503: error[message] = '服务不可用(503)'break;
                case 504: error[message] = '网络超时(504)'break;
                case 505: error[message] = 'HTTP版本不受支持(505)'break;
                default: error[message] = `连接错误:${error[message]}`;
            }
        } else error[message] = '连接到服务器失败,请联系管理员'
        return Promise.reject(error)
    }
)

/**
 * 设置国际化
 * @param {String} lang 国际化
 */

const setLang = (lang) => Axios.defaults.headers["Accept-Language"] = `${lang},zh;q=0.5`

/**
 * 设置token
 * @param {String} token token
 */

const setToken = token => Axios.defaults.headers.common['Authorization'] = token

export {
    setLang, setToken
}

export default Axios

封装请求 ./utils/request.js

后端正确返回resolve

后端错误返回,提示并reject

配置loading

配置JSON请求和Form请求

接收参数:请求地址,是否显示全局loading,是否使用form提交方式

暴露get和post的方法

暴露显示全局loading和关闭全局loading的方法(特殊用途)

import Axios from './axios'
import { Message, Loading } from 'element-ui'

let config = {
    loadingnull,      // Loading 对象
    loadingCount: 0,     // Loading 计数器
    sendJson: `application/json;charset=UTF-8`// JSON请求
    sendForm: `multipart/form-data`,            // FORM请求
    con_service: {     // Loading 配置
        lock: true,
        text'Loading……',
        spinner'el-icon-loading',
        background'rgba(0, 0, 0, 0.7)',
    }
}

let { loading, loadingCount, sendJson, sendForm, con_service } = config

/**
 * 显示Loading
 */

const startLoading = () => loading = Loading.service(con_service)

/**
 * 关闭Loading
 */

const endLoading = () => loading.close()

/**
 * 根据计数确定是否loading
 */

const showFullScreenLoading = () => loadingCount++ === 0 && startLoading()

/**
 * 根据计数确定是否取消loading
 */

const tryHideFullScreenLoading = () => --loadingCount === 0 && endLoading()


/**
 * 封装请求
 * @param url 请求地址
 * @param params 请求参数
 * @param config 配置
 * @param config.loading 是否显示loading
 * @param config.formData 是否使用form请求
 * @returns {Promise}
 */

class Http {

    constructor() {
        this.post = this.post.bind(this)
        this.get = this.get.bind(this)
    }

    require = (method, url, params, { loading, formData }) => new Promise((resolve, reject) => {

        Axios.defaults.headers.post['Content-Type'] = sendJson

        // 如果显示loading
        loading && showFullScreenLoading()

        // 如果是form请求
        formData && (() => {
            let data = new FormData();
            for (const key in params) {
                data.append(key, params[key])
            }
            params = data
            Axios.defaults.headers.post['Content-Type'] = sendForm
        })()

        // 如果是get请求
        method === "get" && (() => {
            let data = {}
            for (let key in params) {
                data[key] = encodeURIComponent(params[key])
            }
            params = data
        })()

        // 发射请求
        Axios[method](url, params)
            .then(
                response => loading && tryHideFullScreenLoading() || resolve(response),
                err => {
                    loading && tryHideFullScreenLoading();
                    Message.error(err.retMsg);
                    reject(err);
                }
            )
    })

    get = (...data) => this.require("get", ...data)
    post = (...data) => this.require("post", ...data)
}

const { get, post } = new Http()

export {
    showFullScreenLoading,
    tryHideFullScreenLoading,
    post,
    get
}

请求样例 ./api/replace.js

暴露请求方法

根据不同的API设置是否要全局loading及请求方式(JSON或form)

import { post } from "@/utils/request"

// 模板首屏数据
const getTemplateUrl = `/company/template/create`
// 更新首屏数据
const modifyTemplateUrl = `/company/template/modify`
// 保存图片
const saveFileUrl = `/upload/resource/imgage`
// 删除图片
const deleteFileUrl = `/company/template/resource/delete`
// 预览模板数据
const previewTemplateUrl = `/company/template/preview`
// 保存模板数据
const saveTemplateUrl = `/company/template/save`
// 更新模板数据
const updateTemplateUrl = `/company/template/update`

// 请求是否显示loading 是否是form表单提交
const [loading, formData] = [truetrue]

/**
 * 请求模板数据
 * @param {Object} params 请求参数
 * @param {String} params.templateId 模板ID
 * @param {String} params.companyId 企业ID
 * @returns {Object} 结果
 */

export const getTemplate = (params = {}) => post(getTemplateUrl, params, { loading, formData })

/**
 * 请求模板数据
 * @param {Object} params 请求参数
 * @param {String} params.templateId 模板ID
 * @param {String} params.companyId 企业ID
 * @returns {Object} 结果
 */

export const modifyTemplate = (params = {}) => post(modifyTemplateUrl, params, { loading, formData })

/**
 * 上传图片
 * @param {Object} params 请求参数
 * @param {String} params.versionId 企业关联模板版本ID
 * @param {String} params.companyId 企业ID
 * @param {Number} params.showType 类别:1:banner 2:cover 3:video 4:3d 5:vr 6:logo
 * @param {Number} params.showSortNo 显示顺序,升序
 * @param {String} params.showUrl 跳转地址
 * @param {File} params.file 二进制流文件
 * @returns {Object} 结果
 */

export const saveFile = (params = {}) => post(saveFileUrl, params, { loading, formData })

/**
 * 删除图片
 * @param {Object} params 请求参数
 * @param {Object} params.id 请求参数
 */

export const deleteFile = (params = {}) => post(deleteFileUrl, params, { loading, formData })

/**
 * 预览模板
 * @param {Object} params 所有参数
 */

export const previewTemplate = (params = {}) => post(previewTemplateUrl, params, { loading })

/**
 * 保存模板数据
 * @param {Object} params 所有参数
 */

export const saveTemplate = (params = {}) => post(saveTemplateUrl, params, { loading })

/**
 * 更新模板
 * @param {Object} params 所有参数 
 */

export const updateTemplate = (params = {}) => post(updateTemplateUrl, params, { loading })