global.js 5.21 KB
import { loadingText, messageDuration, title, publicPath } from '@/config'
import * as lodash from 'lodash'
import { Loading, Message, MessageBox, Notification } from 'element-ui'
import store from '@/store'
import router from '@/router'
import { getAccessToken } from '@/utils/accessToken'
import { getUsername } from '@/utils/username'

const layout = store.getters['settings/layout']
const hostPath = `${window.location.protocol}//${window.location.host}${publicPath}`

const install = (Vue, opts = {}) => {
  /* 全局标题 */
  Vue.prototype.$baseTitle = (() => {
    return title
  })()
  /* 全局加载层 */
  Vue.prototype.$baseLoading = (index, text) => {
    let loading
    if (!index) {
      loading = Loading.service({
        lock: true,
        text: text || loadingText,
        background: 'hsla(0,0%,100%,.8)',
      })
    } else {
      loading = Loading.service({
        lock: true,
        text: text || loadingText,
        spinner: 'app-loading-type' + index,
        background: 'hsla(0,0%,100%,.8)',
      })
    }
    return loading
  }
  /* 全局Message */
  Vue.prototype.$baseMessage = (message, type) => {
    return new Promise((resolve) => {
      Message({
        offset: 60,
        showClose: false,
        message: message,
        type: type || 'success',
        dangerouslyUseHTMLString: true,
        duration: messageDuration,
        onClose: () => resolve(),
      })
    })
  }

  /* 全局Alert */
  Vue.prototype.$baseAlert = (content, title, callback) => {
    MessageBox.alert(content, title || '温馨提示', {
      confirmButtonText: '确定',
      dangerouslyUseHTMLString: true,
      callback: (action) => {
        if (callback) {
          callback(action)
        }
      },
    })
  }

  /* 全局Confirm */
  Vue.prototype.$baseConfirm = (content, title, callback1, callback2) => {
    MessageBox.confirm(content, title || '温馨提示', {
      confirmButtonText: '确定',
      cancelButtonText: '取消',
      closeOnClickModal: false,
      type: 'warning',
    })
      .then(() => {
        if (callback1) {
          callback1()
        }
      })
      .catch(() => {
        if (callback2) {
          callback2()
        }
      })
  }

  /* 全局Notification */
  Vue.prototype.$baseNotify = (message, title, type, position, offset) => {
    Notification({
      title: title,
      message: message,
      position: position || 'top-right',
      type: type || 'success',
      duration: messageDuration,
      offset: offset || 50,
    })
  }

  /* 全局TableHeight */
  Vue.prototype.$baseTableHeight = (adjustHeight, isDialog) => {
    let height = window.innerHeight
    let paddingHeight = 270
    if (isDialog) {
      height = height - 80
    } else {
      if ('number' == typeof adjustHeight) {
        height = height - paddingHeight + adjustHeight
      } else {
        height = height - paddingHeight
      }
    }
    return height
  }

  /* 全局lodash */
  Vue.prototype.$baseLodash = lodash
  /* 全局事件总线 */
  Vue.prototype.$baseEventBus = new Vue()

  /* tabs的通用操作 */
  Vue.prototype.$tabs = {
    open: (url) => {
      if (!url) {
        console.error(`URL can not be empty when open new tab.`)
        return
      }
      // 是否完整的url地址
      if (/^http(s?)\:\/\/.*$/.test(url)) {
        // 是完整的url地址而且是当前系统的地址
        if (url.startsWith(hostPath)) {
          router.push(url.replace(hostPath, ''))
        } else {
          // 非当前系统的地址
          window.open(url)
        }
      } else {
        router.push(url)
      }
    },
    close: (route, isBack = false) => {
      const fullScreenState = store.getters['routes/fullScreenState']
      // 是否全屏方式打开的页面
      if (fullScreenState) {
        window.close()
      } else {
        store
          .dispatch('tabsBar/delVisitedRoute', route || router.currentRoute)
          .then((visitedRoutes) => {
            const latestView = visitedRoutes.slice(-1)[0]
            if (isBack) {
              router.go(-1)
            } else if (latestView) {
              router.push({ path: latestView.path, query: latestView.query })
            } else {
              router.push('/')
            }
          })
      }
    },
    replace: (route) => {
      Vue.prototype.$tabs.close()
      route && setTimeout(() => router.replace(route), 100)
    },
    reload: () => {
      let viewElementAry = document.getElementsByName('app-base-main')
      if (!viewElementAry || viewElementAry.length != 1) {
        window.location.reload()
      } else {
        let viewInst = viewElementAry[0].__vue__
        if (!viewInst || !viewInst._isVue) {
          window.location.reload()
        }
        window.location.reload()
      }
    },
  }

  /**
   * 附件
   */
  Vue.prototype.$file = {
    header: () => {
      return { Authorization: `Bearer ${getAccessToken()}` }
    },
    actionUrl: `${context.portal}/system/file/v1/upload`,
    previewUrl: `${context.portal}/onlinePreview`,
    downloadUrl: `${context.portal}/system/file/v1/downloadFile`,
    watermarkOptions: () => {
      return {
        text: `门户POC ${getUsername()} 1001`,
      }
    },
  }
}

if (typeof window !== 'undefined' && window.Vue) {
  install(window.Vue)
}

export default install