美文网首页前端大杂烩
兰陵王-后台管理系统框架

兰陵王-后台管理系统框架

作者: 写写而已 | 来源:发表于2020-04-09 18:52 被阅读0次
兰陵王

是一个基于Vue的前端系统管理框架,集成状态管理,动态路由,自主登录,权限控制,路由切换现场保留等功能

Build Setup

# install dependencies
npm install

# serve with hot reload at localhost:8080
npm start

# build for production with minification
npm run build

# build for production and view the bundle analyzer report
npm run build --report

前置的几个原则

  • 代码请务必遵守JavaScript Standard Style 规范,不用的包和变量务必删除,有必要的话可以采用eslint,代码自动格式化,养成良好的团队协作习惯
  • 所有的js,api接口最好采用用到时加载,不用不加载的原则,比如select下拉选择,尽量在用户focus时加载,如果需要提前显示,可以手动拼装下拉选项
  • 所有的加载,下载中务必增加loading状态,避免用户焦虑
  • 所有的按钮尽量在loading时增加loading等待状态,且loading时禁用点击
  • 共用的js,比如vue,vuex,axios尽量使用公司内部的cdn,大的包采用外链导入,外链导入可以优化打包速度和并行加载速度,其他优点这里不做展开

集成了自主登录,无需配置host,支持ip+端口号访问,方便开发阶段各个设备的兼容性测试

登录页面

请注意登录环境与base.target跨域代理的域名必须一致,登录页面只在开发阶段使用,发布后用户登录依旧使用公司统一鉴权

axios请求前置处理,请注意api接口配置是根据项目而定

// 请求状态判断
axios.defaults.timeout = 1000 * 60
axios.interceptors.request.use(
    function(config) {
        // 特殊接口,外部非data sync接口
        if (config.url.indexOf('/api') === 0 || config.url.indexOf('/sso') === 0) {
            config.baseURL = ''
        } else {
            // 要注意的地方
            config.baseURL = '/api/bi-data-sync'
        }
        config.withCredentials = true
        return config
    },
    function(error) {
        return Promise.reject(error)
    }
)

接口错误,已对错误状态比如未授权,请求超时添加全局处理,如果有需要的话依然可以被catch捕捉到

// 返回状态判断
axios.interceptors.response.use(
    response => {
        let res = response.data
        if (res.code == 11) {
            if (process.env.NODE_ENV !== 'production') {
                window.location.href = '#/login'
            } else {
                window.location.href = '/'
            }
        }
        return response
    },
    error => {
        console.log('------ Request Error ------')
        console.log(error)
        let msg = error.message
        if (msg.indexOf('timeout') > -1) {
            ELEMENT.Message({ type: 'error', duration: 0, showClose: true, message: `请求超时,请稍后重试~` })
        } else {
            ELEMENT.Message({ type: 'error', message: msg })
        }
        return Promise.reject(error)
    }
)
// 如何捕获
DataSource.getList({
    keyword: this.params.keyword,
    pageNo: this.pageInfo.pageNo,
    pageSize: this.pageInfo.pageSize
}).then(res => {
    this.xoading.main = false
    if (res.code == 0) {
        this.tableData = res.data.records
        this.pageInfo.total = res.data.total
    } else {
        this.$message.error(res.message)
    }
}).catch(err => {
    this.xoading.main = false
})

使用minxs混入全局data,methods,computed。常用的方法,请求加载中,主表放到data内,无需再在每个组件创建

// src/mixins.js
// 基本接口请求
import * as Base from '@api/Base'
// 统一基本配置项
import Configs from '@configs/index'
// 状态管理
import { mapGetters } from 'Vuex'
export default {
    data() {
        return {
            // 表单分页信息
            pageInfo: {
                // 当前查看的页码
                pageNo: 1,
                // 表总数量
                total: 0,
                // 每页数量,默认20
                pageSize: Configs.pageSize,
                // 分页组件支持的功能
                layout: Configs.pageLayout,
                // 可选择的分页数下拉选项
                sizes: Configs.pageSizes
            },
            // 通用加载状态
            xoading: {
                // 页面内主内容加载中,适用于主table
                main: false
            },
            // 主表被复选选中项目
            mainSelected: []
        }
    },
    computed: {
        ...mapGetters([
            // 服务器枚举信息
            'serviceEnum',
            // 用户信息
            'userInfo',
        ])
    },
    methods: {
        // 初始化请求主表内容
        init() {
            this.pageInfo.pageNo = 1
            this.get()
        },
        // 每页需要的数量变动
        sizeChange(val) {
            this.pageInfo.pageNo = 1
            this.pageInfo.pageSize = val
            this.init()
        },
        // 分页页码变动
        pageChange(val) {
            this.pageInfo.pageNo = val
            this.get()
        },
        // 匹配枚举 返回label  this.matchEnum('PULL_INCRE_TYPE', 'day_all')
        matchEnum(type, key) {
            let enums = this.serviceEnum[type]
            let name = ''
            if (enums) {
                for (let item of enums) {
                    if (item.value == key) {
                        name = item.name
                        break
                    }
                }
            }
            return name
        },
        // 主表复选项变动
        mainSelectionChange(rows) {
            this.mainSelected = rows
        }
    }
}
// views/data-source.vue
// 用到则引入
import Mixins from '@/mixins'
export default {
    name: '/datasource',
    mixins: [Mixins]
}

资源引用

<link rel="stylesheet" href="https://statics-lib.zmlearn.com/element-ui/2.8.2/theme-chalk/index.css">
<script src="https://statics-lib.zmlearn.com/vue/2.6.6/vue.min.js"></script>
<script src="https://statics-lib.zmlearn.com/element-ui/2.8.2/index.js"></script>
<script src="https://statics-lib.zmlearn.com/vue-router/3.0.2/vue-router.min.js"></script>
<script src="https://statics-lib.zmlearn.com/axios/0.18.0/axios.min.js"></script>
<script src="https://statics-lib.zmlearn.com/vuex/3.1.0/vuex.min.js"></script>
<link rel="stylesheet" href="https://at.alicdn.com/t/font_1641218_uwp7vntqdta.css">

样式文件通过cdn外链引入,也可以引入本地js,如果想要自定义Element UI的样式,请参考Element自定义主题样式,然后下载资源引入即可

Vue CLI 如何引入资源?

处理静态资源

注意我们推荐将资源作为你的模块依赖图的一部分导入,这样它们会通过 webpack 的处理并获得如下好处:

  • 脚本和样式表会被压缩且打包在一起,从而避免额外的网络请求。
  • 文件丢失会直接在编译时报错,而不是到了用户端才产生 404 错误。
  • 最终生成的文件名包含了内容哈希,因此你不必担心浏览器会缓存它们的老版本。

其他功能请在启动后查看,这里不做具体解释。
©TEEMO. 2020

For a detailed explanation on how things work, check out the guide and docs for vue-loader.

相关文章

网友评论

    本文标题:兰陵王-后台管理系统框架

    本文链接:https://www.haomeiwen.com/subject/xelhmhtx.html