2.0.2 • Published 2 years ago

mat-vuebase v2.0.2

Weekly downloads
-
License
MIT
Repository
-
Last release
2 years ago

mat-vuebase

安装项目依赖库

npm install mat-vuebase

插件介绍

基于 Vue2 实现基础项目搭建,内置axios,cookie封装,提供内置组件及方法,详情配置说明如下

安装外部依赖包:
npm install axios js-cookie

注: 使用element-ui时,提供内置布局组件,安装依赖包,样式文件需要单独引入   ps:其他UI框架按需安装
npm install element-ui

初始化插件(main.js)

    import Vue from 'vue';
    import App from './App';
    import Base from 'mat-vuebase';
    // ……
    Vue.use(Base, {
        root: App,  /* 入口文件, 默认提供BaseApp组件(修改ui框架后将不可用,此项需配置) */
        pages: null,  /* require.context('@/views', true, /.router.js$/) -- 加载所有模块的 routers */
        modules: null,  /* require.context('@/views', true, /.module.js$/) -- 加载所有模块的 stores */
        dialogs: null,  /* require.context('@/dialogs', true, /.vue$/) -- 加载dialogs目录下所有的弹框 */
        components: null, /* require.context('@/components', true, /.vue$/) -- 加载components目录下所有的自定义组件 */
        filters: null,  /* require.context('@/filters', true, /\.filter\.js$/) -- 加载filters目录下所有的自定义过滤器 */
        directives: null,  /* require.context('@/directives', true, /.js$/) -- 加载directives目录下所有的自定义指令 */
        menus: [],  /* require('@/data/current_menu') -- 加载菜单栏 */
        managerMode: false,  /* 管理者模式 -- 默认为false,解除所有路由,服务配置限制;为true时需要验证登录信息,开启身份认证限制,路由限制, serviceConfigs 配置生效 */
        frame: false,  /* UI框架 -- 默认为false,不使用ui框架 */
        layoutConfigs: {  /* 项目布局配置 */
            title: '管理中心',   /* 项目标题 */
            logo: require('assets/logo.svg'),  /* logo头像,默认使用内置svg */
            showLogo: true,  /* 是否展示logo */
            isAdmin: true,  /* 是否是后台系统(展示导航菜单,头部) */
            hasAnimation: false,  /* 是否开启路由跳转时的动画效果 */
            fixedMenu: false  /* 是否固定菜单栏(为打开状态) */
        },
        routerConfigs: {  /* 路由配置 */
            redirectPath: '/404',  /* 重定向path为 / 的路径 */
            mode: 'hash',  /* 路由模式 (history / hash) */
            base: '',  /* 配置单页应用的基路径 */
            savedPosition: true,  /* 路由跳转时是否开启页面定位 */
            checkPrivilege: true,  /* 是否校验路由权限 -- 为false时将开放所有已加载的routers访问权限, */
            whiteList: [],  /* 可选项 -- 设置路由白名单,不进行路由鉴权校验(例如:['/index']) */
            meta: {
                bind: 'bind',  /* 菜单栏绑定的导航定位字段名 */
                keepAlive: 'cache',  /* 缓存路由的字段名 */
                privilege: 'privilege',  /* 权限码绑定的字段名 */
                hasBack: 'hasBack',  /* 是否可返回上一页的字段名 */
                breadcrumb: 'breadcrumb'  /* 面包屑字段名 */
            }
        },
        serviceConfigs: {  /* 服务配置 */
            tokenKey: 'jurisdictionId',  // 设置cookie变量名
            loginPath: '/login',  /* 登录页的地址(可以是路由path,可以是外链地址),默认定位到内置的login页 */
            loginApi: 'public/login',  /* 用户登录的接口地址 */
            userInfoApi: '/auth/getUserInfo',  /* 获取用户信息的接口地址 */
            privilegeApi: '/auth/getPrivilege'  /* 获取权限码的接口地址 */
        },
        menuMeta: {  /* 菜单信息元数据(未开放自定义字段配置) */
            menuId: 'menuId',  /* 菜单项ID */
            menuName: 'menuName',  /* 菜单项名称 */
            menuCode: 'menuCode',  /* 菜单项编码(对应权限码) */
            icon: 'icon',  /* 菜单项图标 */
            parentId: 'parentId',  /* 菜单项父级ID */
            route: 'route',  /* 菜单项跳转地址 路由name */
            children: 'children',  /* 菜单项子菜单 */
            url: 'url'  /* 外链地址 (当route为null时) */
        },
        before: (to, from, next) => {
            // 路由前置守卫
            next()
        },
        after: () => {
            // 路由后置守卫
        }
    });
    // ……
    /* 监听base配置加载完成后挂载vue实例 */
    Vue.prototype.$base.$on('finish.load', () => {
        // ……
        new Vue({
            router: Base.router,
            store: Base.store,
            render: h => Base.render(h)
        }).$mount('#app')
    })

自定义UI框架

插件基于element-ui配置,默认为关闭状态,不使用任何ui框架,可配置为element,使用其他框架时按需修改环境配置

import element from 'element-ui';

/* 引入element组件库样式文件 */
import 'element-ui/lib/theme-chalk/index.css';   --- 可通过cdn方式引入,优化性能

/* UI框架为element时且使用默认提供的BaseApp组件作为根入口时,需加载自定义样式文件 */
import 'mat-vuebase/dist/style.css';

*** 自定义框架frame的几种方法
1. frame: element  -- 便捷式,传模块
2. frame: { name: element, options: {} } -- 配置项式,可传参数
3. frame: (Vue) => { Vue.use(element, {}) }  -- 函数形式

开发,生产环境配置

index.html配置

*** process.env.VUE_APP_STATIC_URL = https://cdn.bootcdn.net/ajax/libs

<link rel="stylesheet" href="<%= process.env.VUE_APP_STATIC_URL %>/element-ui/<%= process.env.EXTERNALS_VERSION['element-ui'] %>/theme-chalk/index.css">
<% if (process.env.NODE_ENV !=='development' ) { %>
  <script src="<%= process.env.VUE_APP_STATIC_URL %>/vue/<%= process.env.EXTERNALS_VERSION['vue'] %>/vue.min.js"></script>
  <script src="<%= process.env.VUE_APP_STATIC_URL %>/vuex/<%= process.env.EXTERNALS_VERSION['vuex'] %>/vuex.min.js"></script>
  <script src="<%= process.env.VUE_APP_STATIC_URL %>/vue-router/<%= process.env.EXTERNALS_VERSION['vue-router'] %>/vue-router.min.js"></script>
  <script src="<%= process.env.VUE_APP_STATIC_URL %>/axios/<%= process.env.EXTERNALS_VERSION['axios'] %>/axios.min.js"></script>
  <script src="<%= process.env.VUE_APP_STATIC_URL %>/element-ui/<%= process.env.EXTERNALS_VERSION['element-ui'] %>/index.min.js"></script>
<% } %>

webpack配置

*** 设置 不打包到bundle的依赖包 ( 开发环境: externals 设置为 {}, 增加 alias 配置 )

let externals = {
    vue: 'Vue',
    vuex: 'Vuex',
    'vue-router': 'VueRouter',
    'element-ui': 'ELEMENT',
    axios: 'axios'
}

configureWebpack: {
    externals,
    alias: {
        '@': resolve('src'),
        ELEMENT: 'element-ui',
        Vue: 'vue',
        Vuex: 'vuex',
        VueRouter: 'vue-router'
    }
}

dialog统一调用方法

# **dialog.vue
import { DialogMixin } from 'mat-vuebase'
……
mixins: [DialogMixin]

# 在组件中使用弹框 (分为私有和全局公用两种使用方式)

1.私有
import Dialog from './dialogs/Dialog'

2.公共 (配置dialogs文件下)
无需引入,通过组件name唯一识别

this.$dialog.show(弹框组件名, data, callback) //打开弹窗,data: 传递给弹框的数据,callback:弹框关闭后的回调
this.$dialog.close(name, ret) // 关闭弹窗,name: 弹框的实例对象,ret: 传递给callback的参数

### 
this.$dialog 实际是将传入的组件挂载到body节点上,与vue实例的根节点同级
因此该方法逻辑上可挂载所有自定义组件,不过受限于在根实例之外,存在样式无法渲染的问题

axios的使用

import { http } from 'mat-vuebase'

/* 1.初始化配置axios */

http.setBaseUrl('v1')  // 设置接口前缀

http.setDataCode('code')  // 设置响应data判断字段名

http.setSuccessCode(200)  // 设置请求成功下的状态标识

http.setDataMessage('message')  // 设置响应提示字段名

http.setTimeout(1000)  // 设置统一timeout,默认为1000s

http.addHeader('Auth-Token', 123)  // 设置自定义请求标头(可添加多个)

/* 
    设置默认错误响应提示消息,ret: 响应请求体
    注:element框架时使用内置配置,设置此项后将覆盖
*/
http.setDefaultPrompt((ret) => {})  

/* 
    设置自定义错误响应回调,此项仅可设置http请求状态码为200的响应
    注:优先级高于默认,返回值为true时,覆盖defaultPrompt的配置,否则两者将同时触发
 */
http.setErrorPrompt((ret) => {})  

/* 2.调用 */

// url: 接口名,params: 请求参数,config: 可选配置参数
get方法:  http.get(`${url}?${params}`, config)
post方法:  http.post(url, params, config)
delete方法:  http.delete(url, params, config)
put方法:  http.put(url, params, config)

内置方法

this.$base.setMenuVisible(boolean)  // 设置是否可见菜单栏
this.$base.setDomainVisible(boolean)  // 设置是否可见导航条
this.$base.checkPrivilege(code)  // 检查是否存在某个权限码, code: 权限码
this.$base.userLogin(params, tokeKey)  // 用户登录时调用的统一方法(是个回调函数) -- params: 请求参数 ,tokeKey: token字段名(例如: 'data.token')

#####
this.$base.$public中绑定了公共可用方法,如下:

1.debounce(handler, delay)      --- 防抖
2.throttle(handler, delay)      --- 节流
3.deepClone(obj)                --- 对象深拷贝

内置接口配置

    import { InterfaceHelper } from 'mat-vuebase'

    /* 设置鉴权接口字段索引 */
    InterfaceHelper.setAuthorityField({
        loginDataField: 'data.token',   // 登录接口的字段索引
        userInfoField: 'data',          // 获取用户信息的字段索引
        privilegesField: 'privileges'   // 获取权限码的字段索引
    })    
    

版本更新

2.0.2  ————  修复已知bug,修改默认框架配置,修改配置说明