后台管理系统中工具库的实践(一)

399 阅读2分钟

一、vue-i18n

vue-i18n是一个使项目实现国际化的插件,很多UI组件库也提供了多种语言包供导入使用。

使用步骤

1、安装

npm install vue-i18n --save-dev

2、在src下新建language文件夹,用于放置不同语种的变量与语言的映射关系,组件库的语言包也可以导入到文件中。(以中文为例如下)

import zhLocale from 'element-ui/lib/locale/lang/zh-CN' // 导入组件库语言包
const zh={// 自定义关键词
    message:{
        'login':'登录',
        'log_out':'退出',
        'username':'用户名',
        'background_management_system':'后台管理系统',
        ...zhLocale
    }
}
export default zh

3、在language文件夹下新建index.js,将不同语言导入并生成message对象

import en from './en'
import zh from './zh-ch'
const message={
    'en':en,
    'zh':zh
}
export default message

4、在main.js中引入vue-i18n并挂载到Vue实例,构建vue-i18n实例并添加语言标识和映射

Vue.use(VueI18n)
const i18n=new VueI18n({
  locale: window.localStorage.getItem('lang')=='zh'?'zh':'en',// 语言标识 
  messages
})
Vue.use(Element, {// 在注册Element时设置i18n的处理方法
  i18n: (key, value) => i18n.t(key, value)
})

5、使用

  • html中:{{$t('message.username')}}
  • JS中:$t('message.username')
  • 切换语言时,可通过localStorage保存到浏览器
    switchLang(){
      this.$i18n.locale=this.$i18n.locale=='zh'?'en':'zh';
      window.localStorage.setItem("lang",this.$i18n.locale);
    }

二、icon

阿里巴巴矢量图网提供了大量免费的矢量图,可以选择图标的颜色和大小,通过svg、png、svg元素等形式应用在项目中。

使用步骤

1、创建SvgIcon组件,对调用时传入的iconClass、className进行计算处理并返回最终得到样式

  <svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners">
   <use :xlink:href="iconName" />
 </svg>
  props: {
   iconClass: {
     type: String,
     required: true
   },
   className: {
     type: String,
     default: ''
   }
 },
 computed: {
   iconName() {
     return `#icon-${this.iconClass}`
   },
   svgClass() {
     if (this.className) {
       return 'svg-icon ' + this.className
     } else {
       return 'svg-icon'
     }
   },
}

2、在main.js中将SvgIcon组件注册为全局组件

import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon'// svg component
Vue.component('svg-icon', SvgIcon)

3、在src新建icon文件夹,icon下新建svg文件夹,里面放置项目使用的svg图片。

4、在HTML使用,可以传入iconClass和className控制图标的类别和样式。

<svg-icon icon-class="user" />

改造

1、目前所有的 svg-sprite 都是通过 iconfont 的 iconfont.js 生成的,是一段用js来生成svg的代码,所有图标 icon 都很不直观。

使用 webpack loader 的svg-sprite-loader将多个 svg 打包成 svg-sprite 。vue-cli默认情况下会使用 url-loader 对svg进行处理,会将它放在/img 目录下,所以这时候我们引入svg-sprite-loader 会引发一些冲突。

因此,使用 webpack 的 exclude 和 include ,让svg-sprite-loader只处理你指定文件夹下面的 svg,url-loaer只处理除此文件夹之外的所以 svg。

2、自动导入

创建一个专门放置图标 icon 的文件夹如:@/src/icons,使用 webpack 的 require.context。

require.context("./test", false, /.test.js$/):在 test 文件夹(不包含子目录)下面的找所有文件名以 .test.js 结尾的文件能被 require 的文件。即通过正则匹配引入相应的文件模块。

const requireAll = requireContext => requireContext.keys().map(requireContext)
const req = require.context('./svg', false, /\.svg$/)
requireAll(req)

三、vue-count-to

一个简单好用的数字滚动插件,可以设置 startVal 和 endVal等参数,它会自动判断计数或倒计时。支持vue-ssr。

使用步骤

1、安装依赖

npm install vue-count-to

2、在Vue组件使用

<template>
  <countTo :startVal='startVal' :endVal='endVal' :duration='3000'></countTo>
</template>

<script>
  import countTo from 'vue-count-to';
  export default {
    components: { countTo },
    data () {
      return {
        startVal: 0,
        endVal: 2017
      }
    }
  }
</script>
  • 参数列表

  • 函数列表

四、mockjs 与 easy-mock

前端用来模拟请求与返回数据的解决方案。

  • mock:基于webpack-dev-serve实现,在启动前端服务时,mock-server就会自动启动;另外还通过 chokidar 来观察 mock 文件夹内容的变化。在发生变化时会清除之前注册的mock-api接口,重新动态挂载新的接口,从而支持热更新。

  • easy-mock:纯前端可视化,并且能快速生成模拟数据的持久化服务。

使用步骤

1、安装Mockjs

npm install mockjs

2、在根目录建立mock文件夹,放置index.js(mock入口,可以导入模块)和mock-server.js(启动mock-serve)两个文件

3、在vue.config.js编写请求代理

    proxy: {
      // change xxx-api/login => mock/login
      // detail: https://cli.vuejs.org/config/#devserver-proxy
      [process.env.VUE_APP_BASE_API]: {
        target: `http://127.0.0.1:${port}/mock`,
        changeOrigin: true,
        pathRewrite: {
          ['^' + process.env.VUE_APP_BASE_API]: ''
        }
      }
    },
    after: require('./mock/mock-server.js')

4、本地 Mock 数据与线上数据切换:通过环境变量实现不同环境下,请求不同的 api 地址。

# .env.development
VUE_APP_BASE_API = '/dev-api' #注入本地 api 的根路径
# .env.production
VUE_APP_BASE_API = '/prod-api' #注入线上 api 的根路径
// 根据环境变量创建axios实例,让它具有不同的baseURL
const service = axios.create({
  baseURL: process.env.BASE_API, // api 的 base_url
  timeout: 5000 // request timeout
})

mockjs 常用语法

mockjs 语法文档

1、数据模板定义

  • 'name|min-max': number (返回min-max任意一位数字)
  • 'name|min-max.dmin-dmax': number (返回min-max任意一位数字,小数位数dmin-dmax位)
  • 'name|1': boolean (返回布尔值)
  • 'name|1': array (返回数组中任意一个元素)
  • 'name|+1': array (按顺序返回数组中一个元素)
  • 'name': regexp (根据正则表达式返回)

2、数据占位符定义

  • 布尔值:Mock.mock('@boolean')

  • 整数:Mock.mock('@integer')
    一定范围内的整数:Mock.mock('@integer(min, max)')

  • 浮点数: Mock.mock('@float')
    一定范围内,一定小数位数的浮点数: Mock.mock('@float(60, 100, 3, 5)')

  • 字符串 :Mock.mock('@string')
    一定长度的字符串:Mock.mock('@string(5)')
    小写字符串: Mock.mock('@string("lower", 5)')

    大写字符串: Mock.mock('@string("upper", 5)')

    数值字符串:Mock.mock('@string("number", 5)')

    标识符字符串:Mock.mock('@string("symbol", 5)')

    规定字符范围的字符串:Mock.mock('@string("aeiou", 5)')

  • 时间:Mock.mock('@datetime("yyyy-MM-dd A HH:mm:ss")')