首页 > 其他 > 详细

vue后台管理系统项目

时间:2020-04-26 19:30:22      阅读:672      评论:0      收藏:0      [点我收藏+]

项目介绍

 

1.项目根目录文件

技术分享图片

 

 

 

2.源码子目录结构

技术分享图片

 

 

 

3.api目录

技术分享图片

 

 

 

4.assets目录

技术分享图片

 

 

 

5.components目录

技术分享图片

 

 

 

6.mixins目录

技术分享图片

 

 

 

7.permission目录

技术分享图片

 

 

 

8.router目录

技术分享图片

 

 

 

9.store目录

技术分享图片

 

 

 

10.styles目录

技术分享图片

 

 

 

11.utils目录

技术分享图片

 

 

 

 

 

 

项目文件介绍

 

1.安装element-ui组件实现按需加载

// 1.1.npm i element-ui -S

// 1.2.在babel.config.js中配置

module.exports = {

    plugins: [

        [
              ‘component‘,
              {
                libraryName: ‘element-ui‘,
                styleLibraryName: ‘theme-chalk‘
              }
        ],
    ]
     
}

// utils下新建文件Element.js按需加载组件

import Vue from ‘vue‘

// 按需引入

import {

  Button,

} from ‘element-ui‘

// 注册组件,之后就可以在所有组件中使用

Vue.use(Button)

/*
    注意:列如消息类组件,如:Message,Notification,MessageBox等
    
    不能像上面一样注册使用,否则还没有使用该组件该组件就会被初始化
*/


// 解决:绑定到vue原型上

Vue.prototype.$message = Message
Vue.prototype.$notify = Notification
Vue.prototype.$confirm = MessageBox

// 再组件使用时直接this调用即可

this.$message.success(‘注册成功‘)

// 如果想使用MessageBox中的确认弹框

this.$confirm.confirm()

 

2.封装二次请求使用起来更方便,在utils中新建request.js中写入

// 安装第三方请求工具axios

npm install axios

// request.js

import axios from ‘axios‘

// 处理javascript大数字的问题

// 安装 npm i json-bigint

import jsonBig from ‘json-bigint‘


import store from ‘@/store/index‘


// element-ui的加载组件和消息提示组件
import { message, Loading } from ‘element-ui‘

// 是我们项目的配置文件,项目的接口和其他的配置放在utils目录中的config.js中

import { config, loaddingConfig } from ‘@/utils/config‘

// 创建一个新的axios对象供我们使用
const request = axios.create({

  baseURL: `${config.baseURL}${config.prot}`,
  timeout: config.timeout
})


// 请求拦截器

// 注意在单独的js中使用Loading和在组件中使用有一点不同

/*

    1.在组件中使用

    const loading = this.$loading({
          lock: true,
          text: ‘Loading‘,
          spinner: ‘el-icon-loading‘,
          background: ‘rgba(0, 0, 0, 0.7)‘
     });


    关闭加载

    loading.close()


    2.在单独的js文件中使用

    Loading.service({

         lock: true,
         text: ‘Loading‘,
         spinner: ‘el-icon-loading‘,
         background: ‘rgba(0, 0, 0, 0.7)‘
    })

    关闭加载状态
    
    Loading.service().close()

*/ 

request.interceptors.request.use(config => {
  
  // 开始加载
  Loading.service(loaddingConfig)

  if (store.getters.getuserInfo.token) {

    // 每次登陆的时候将token插入到请求头中
    config.headers.authorization = store.getters.getuserInfo.token
  }

  return config

}, error => {

  // 取消失败终止
  Loading.service().close()
  return Promise.reject(error)
})



// 处理大数字的问题
request.defaults.transformResponse = [function (data) {
  try {
    return jsonBig.parse(data)
  } catch (err) {
    return data
  }
}]



// 响应拦截器
request.interceptors.response.use(response => {

  // 请求完毕取消加载
  Loading.service().close()
  return response
}, error => {

  Loading.service().close()

    // 处理请求错误的函数
  errorMsg(error.response)

  return Promise.reject(error)
})


// 异常处理
function errorMsg (error) {

  if (error) {

    return
  }

  switch (error.status) {
    case 400:
      message.error(‘亲,您查看的资料出现了错误‘)
      break
    case 401:
      message.error(‘请检查token,可能已经过期,需要重新登陆‘)
      tokenOverdue(error)
      break
    case 403:
      message.error(‘抱歉您的权限还需要升级‘)
      break
    case 404:
      message.error(‘资源被狗狗调走了‘)
      break
    case 408:
      message.error(‘请求超时,请重试‘)
      break
    case 500:
      message.error(‘可爱的服务器好像奔溃了‘)
      break
    case 502:
      message.error(‘请仔细检查您的网络‘)
      break
    case 504:
      message.error(‘您的网络很慢,已经超时,请重试‘)
      break
    case 503:
      message.error(‘当前服务不支持‘)
      break
    default:
      message.error(‘与服务器的连接断开了‘)
      break
  }
}


// token的过期处理

function tokenOverdue (error) {
  // 如果有token的话重新存储,刷新

  if (error.data.token) {
    // 将刷新的token重新存储到本地即可
    const userInfo = {
      ...store.getters.getuserInfo,
      token: error.data.token
    }
    
    // 将新的token重新存储到本地,
    store.commit(‘SET_USERINFO‘, userInfo)
    
    // 将错误的请求再重新发送刷新token
    return request(error.config)
  }
}


// 导出请求接口封装函数
export default (method, url, data = null) => {
  method = method.toUpperCase()

  if (method === ‘POST‘) {
    return request.post(url, data)
  } else if (method === ‘GET‘) {
    return request.get(url, { params: data })
  } else if (method === ‘DELETE‘) {
    return request.delete(url, { params: data })
  } else if (method === ‘PUT‘) {
    return request.put(url, data)
  }
}

 

3.创建api根目录,里面当接口文件

// user.js文件

import request from ‘@/utils/request‘

// 用户登陆 export const userLogin = params => request(‘GET‘, ‘/admin/user/login‘, params) // 用户注册 export const userRegister = params => request(‘GET‘, ‘/admin/user/register‘, params) // 获取用户的权限数据 export const getUserAuth = params => request(‘GET‘, ‘/admin/user/user_auth‘, params) // 获取用户头像 export const getUserImg = params => request(‘GET‘, ‘/admin/user/user_img‘, params) // 获取用户登陆时的头像 export const getLoginImg = params => request(‘GET‘, ‘/admin/user/login_img‘, params) // 修改用户资料 export const editUserInfo = data => request(‘POST‘, ‘/admin/user/edit_user‘, data)

 

4.require.context(path, Boolean, file)动态加载组件

 

  1.为什么使用:下一步components目录中的组件要引入使用,那么就存在一个问题,如果我们一个页面要引入很多组件那么就会有很多的import。

     此时可以通过使用require.context(path, Boolean, file) 之后就可以通过组件的name属性来调用组件

 

// 在components目录下新建 cptsRegister.js

// cptsRegister.js

import Vue from ‘vue‘

function capitalizeFirstLetter (str) {
  return str.charAt(0).toUpperCase() + str.slice(1)
}

// 用来匹配.vue的前缀函数
function validateFileName (str) {
  return /^\S+\.vue$/.test(str) && str.replace(/^\S+\/(\w+)\.vue$/, (res, $1) => capitalizeFirstLetter($1))
}

const requireComponent = require.context(‘./‘, true, /\.vue$/)

// 遍历匹配到的文件夹及文件名,并且遍历得到每一个
requireComponent.keys().forEach(filePath => {

  // 得到每一个.vue文件中的属性方法和组件的name值
  const componentConfig = requireComponent(filePath)
  // 得到文件名的前半部分index
  const fileName = validateFileName(filePath)
  // 判断如果是以index开头命名的就返回组件的name值来注册组件,否则就使用文件名来注册

  const componentName = fileName.toLowerCase() === ‘index‘ ? 
capitalizeFirstLetter(componentConfig.default.name) : fileName
  Vue.component(componentName, componentConfig.default || componentConfig)
})


// components目录下的cheking目录的vue

<template>

    <div class="container">
        我是一个组件
    </div>

</template>

<script>

export default {

    name: ‘Checking‘,
    
}

</script>


// 其他组件中使用,直接使用,无需引入和注册,但是必须和组件的name名字保持一致,是不是很棒

<Checking />

 

5.处理一下过滤器把

 

 

// 在utils目录下创建filters.js文件,我们一次性注册掉所有的过滤器

// filter.js

// 事件格式化第三方插件
import moment from ‘moment‘

const filters = {

  relativeTime (value) {
    return moment(value).startOf(‘second‘).fromNow()
  },

  formatTime (value, format = ‘YYYY-MM-DD HH:mm:ss‘) {
    return moment(value).format(format)
  },

  statusFilter (status) {
    const statusText = [‘审核通过‘, ‘草稿‘, ‘待审核‘, ‘审核失败‘]

    if (status === undefined) return []

    if (status.length) {

      status.forEach(item => {
        
        item.statusContent = statusText[item.status]
      })
    }
    return status
  }
}

export default filters


// 之后在main.js中一次性注册


import filterRegister from ‘./utils/filters‘

for (const key in filterRegister) {

  Vue.filter(key, filterRegister[key])
}

 

 

6.

 

vue后台管理系统项目

原文:https://www.cnblogs.com/zxuedong/p/12781723.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!