sass-loader/vuex 等的引入说明

tips:vue-cli 4.x脚手架封装度更高,配置起来简单许多,旨在让用户把精力都放在编写业务代码中

vue-cli 4.x在创建时已经选择了相应依赖,因此项目创建好后,基本的依赖都有。不需要重复安装。

引入 element

vue-cli 4.x 引入 element 可谓是相当的方便,只需要执行下方语句,即可引入element

vue add element

有两个选项,根据需求选择,

  • How do you want to import Element? Import on demand #这里选择的是按需引入。只引入需要的组件,以达到减小项目体积的目的。
  • Choose the locale you want to load zh-CN # 选择加载环境,这里选择的是中文

需要使用什么组件,在plugins下的 element.js 中添加对应的组件。以减小项目体积。

TIPS:此种方式会自动引入样式

引入 axios

更多关于axios的信息,请看我另一篇文章,传送门

axios 是一个基于 Promise 用于浏览器和 nodejsHTTP 客户端,项目与后端的请求交互需要使用到 axios,执行以下命令,安装 axios 依赖。

npm i axios

1.基本使用

安装完成后,可以直接在界面上引入 axios 然后使用 axios.get 就能直接发起 get 请求。

import axios from 'axios'

axios.get('url').then((data) => {
console.log(data)
})

2.封装使用

2.1 开发环境配置请求地址

首先在.env.development文件中配置 需要发起 请求的地址,VUE_APP_BASE_RUL='https://www.fastmock.site/mock/37b157378200e4dbd5eecff887e20f81/lion/'

需要特别注意的是 .env.production.env.development文件 参数说明:

  • NODE_ENV - 是 “development”、“production” 、"test"或者自定义的值。具体的值取决于应用运行的模式
  • BASE_URL - 会和 vue.config.js 中的 publicPath 选项相符,即你的应用会部署到的基础路径
  • 除了 NODEENV 和 BASE_URL,其他的环境变量必须以 VUE_APP 开头
  • 项目中使用:process.env.环境变量名,eg:VUE_APP_BASE_URL

2.2 配置代理

然后,若要配置跨域处理的话,在vue.config.js文件中添加访问代理。

module.exports = {
publicPath: process.env.NODE_ENV === 'production' ? '/' : '/',
outputDir: 'dist', //默认输出到该文件夹,生成时会自动删除该文件
assetsDir: 'static',
lintOnSave: true, // 是否开启eslint保存检测
productionSourceMap: false, // 是否在构建生产包时生成sourcdeMap
chainWebpack: (config) => {
config.resolve.alias.set('@', resolve('src')).set('views', resolve('src/views'))
// config.optimization.runtimeChunk('single')
},
devServer: {
host: 'localhost',
port: '8080',
hot: true,
open: true,
overlay: {
warning: false,
error: true,
},
proxy: {
[process.env.VUE_APP_BASE_RUL]: {
target: process.env.VUE_APP_BASE_RUL,
changeOrigin: true,
secure: false,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_RUL]: '',
},
},
},
},
}

2.3 添加接口相关文件

相关文件说明:

    1. config.js:axios 默认配置,请求基本 url。
    1. axiosHttp.js:二次封装 axios 模块,包含拦截器等信息。
    1. index.js:请求接口汇总模块,聚合模块 API。 在 main.js 文件中按插件引入

在 src/api 文件夹下添加 config.js配置文件

const baseUrl = process.env.VUE_APP_BASE_RUL
export default {
method: 'get',
// 基础url前缀
baseURL: baseUrl,
// 请求头信息
headers: {
'Content-Type': 'application/json;charset=UTF-8',
},
// 参数
data: {},
// 设置超时时间
timeout: 10000,
// 返回数据类型
responseType: 'json',
}

在 src/api 文件夹下添加 axiosHttp.js配置文件

import axios from 'axios'
import qs from 'qs'
import router from '@/router'
import config from './config'
import { Message } from 'element-ui' axios.defaults.timeout = config.timeout
axios.defaults.headers = config.headers
axios.defaults.baseURL = config.baseURL // 请求拦截器
axios.interceptors.request.use(
(config) => {
// 触发loading效果
//判断是否存在token,如果存在,则在header上加上token
// let token = getStore('token')
// if (token) {
// config.headers.common['token'] = token
// }
if (config.method == 'post' || config.method == 'put') {
//将数据转成string
config.data = JSON.stringify(config.data)
} else if (config.method == 'get') {
//&& browser.isIE
//给Get添加时间戳 解决IE缓存问题
let symbol = config.url.indexOf('?') >= 0 ? '&' : '?'
config.url += symbol + '_=' + Date.now()
config.data = qs.stringify(config.data)
}
return config
},
(err) => {
// 关闭loading
// 失败提示
return Promise.resolve(err)
}
) // 响应拦截器
axios.interceptors.response.use(
(response) => {
// 关闭loading
if (!response || !response.data || !response.data.success) {
// 失败提示
} else if (response.data.data && response.data.code == 200) {
// 成功处理
}
if (response.data) {
switch (response.data.code) {
case 401:
// 返回 401 清除token信息并跳转到登录页面
// store.commit('LOGOUT')
Message.error('登录已失效,请重新登录')
setTimeout(function () {
router.replace({
path: '/login',
// 登录成功后跳入浏览的当前页面
query: { redirect: router.currentRoute.fullPath },
})
}, 1500)
break
case 402:
//402无权限操作
Message.error('无权限操作')
return new Promise(() => {}) //外部不会再处理
break
}
}
return response
},
(err) => {
// 关闭loading
// 提示异常
let errMessage = ''
if (err && err.response) {
switch (err.response.status) {
case 400:
errMessage = '请求错误'
break
case 401:
errMessage = '未授权,请登录'
break
case 403:
errMessage = '拒绝访问'
break
case 404:
errMessage = `请求发生错误`
// err.response.config.url
break
case 408:
errMessage = '请求超时'
break
case 500:
errMessage = '服务器内部错误'
break
case 501:
errMessage = '服务未实现'
break
case 502:
errMessage = '网关错误'
break
case 503:
errMessage = '服务不可用'
break
case 504:
errMessage = '网关超时'
break
case 505:
errMessage = 'HTTP版本不受支持'
break
default:
errMessage = '服务器开小差了,请稍后再试'
}
}
Message.error(errMessage)
//外部不会再处理
return new Promise(() => {})
}
)
export default {
Get(url, params = {}) {
return new Promise((resolve, reject) => {
axios
.get(url, { params })
.then((res) => {
resolve(res.data)
})
.catch((error) => {
reject(error)
//resolve(error)
})
})
},
Post(url, params = {}) {
return new Promise((resolve, reject) => {
axios
.post(url, params)
.then((res) => {
resolve(res.data)
})
.catch((error) => {
reject(error)
//resolve(error)
})
})
},
Delete(url, params = {}) {
return new Promise((resolve, reject) => {
axios
.delete(url, params)
.then((res) => {
resolve(res.data)
})
.catch((error) => {
reject(error)
//resolve(error)
})
})
},
Put(url, params = {}) {
return new Promise((resolve, reject) => {
axios
.put(url, params)
.then((res) => {
resolve(res.data)
})
.catch((error) => {
reject(error)
//resolve(error)
})
})
},
}

在 src/api/modules 文件夹下添加 user.js文件

import axios from '@/api/axiosHttp'

export const login = (params) => {
return axios.Post('/login', params)
} export const test = () => {
return axios.Get('/test')
}

在 src/api 文件夹下添加 index.js文件

/*
* 接口统一集成模块
*/
import * as user from '@/api/modules/user' // 默认全部导出
export default {
...user,
}

可以在 main.js 中将所有的 接口都挂在到原型链上,也可以界面引入需要的接口

  1. 需要使用原型链方式的,代码如下:
# main.js 文件
import api from '@/api'
Vue.prototype.$api = api # app.vue 文件
methods: {
loginFunc() {
this.$api.login({ username: 'admin', password: '123456' }).then((data) => {
this.$message({
type: 'success',
message: JSON.stringify(data),
})
})
},
},
  1. 单个界面引入需要的接口
# app.vue 文件
import { login } from '@/api/modules/user'
export default {
name: 'app',
components: {
},
data() {
return {}
},
methods: {
loginFunc() {
console.log(login)
// console.log(this.$api.user.login)
login({ username: 'admin', password: '123456' }).then((data) => {
this.$message({
type: 'success',
message: JSON.stringify(data),
})
})
},
},
}

原文地址:http://book.levy.net.cn/doc/frontend/uiframe/utils_import.html

Vue管理系统前端系列二相关工具引入及封装的更多相关文章

  1. Vue管理系统前端系列一vue-cli4.x 初始化项目

    目录 项目介绍 技术基础 开发环境 安装工具 快速原型开发 创建项目 配置相关说明 目录结构 项目介绍 lion-ui 是一个基于 RBAC 的管理系统前端项目,采用 vue 和 element-ui ...

  2. Vue管理系统前端系列三登录页和首页及`vuex`管理登录状态

    目录 登录页面设计 vuex 对应 用户模块 丰富界面 首页相关代码 登录页面设计 该节记录了登录界面的设计,以及 vuex 的简单实用,然后将首页简单搭建完成. 先看最终效果图 先在 views 文 ...

  3. Vue管理系统前端系列四组件拆分封装

    目录 组件封装 首页布局拆分后结构 拆分后代码 状态管理中添加 app 模块 组件封装 在上一篇记录中,首页中有太多的代码,为了避免代码的臃肿,需要对主要的功能模块拆分,来让代码看起来更简洁,且能进行 ...

  4. Vue管理系统前端系列六动态路由-权限管理实现

    目录 为什么要使用动态路由? 主流的两种实现方式 前端控制 后端控制 后端控制路由 实现 添加菜单接口 及 菜单状态管理 根据得到的菜单生成动态路由 根据 vuex 中的暂存的菜单生成侧边菜单栏 退出 ...

  5. Vue管理系统前端系列五自定义主题

    目录 自定义主题 1.安装「主题生成工具」 2.安装白垩主题 3.新建颜色挑选组件 自定义主题 1.安装「主题生成工具」 由于主题工具需要依赖于 node-sass,而node-sass版本兼容性并不 ...

  6. 手牵手,从零学习Vue源码 系列二(变化侦测篇)

    系列文章: 手牵手,从零学习Vue源码 系列一(前言-目录篇) 手牵手,从零学习Vue源码 系列二(变化侦测篇) 陆续更新中... 预计八月中旬更新完毕. 1 概述 Vue最大的特点之一就是数据驱动视 ...

  7. 【转】手摸手,带你用vue撸后台 系列二(登录权限篇)

    前言 拖更有点严重,过了半个月才写了第二篇教程.无奈自己是一个业务猿,每天被我司的产品虐的死去活来,之前又病了一下休息了几天,大家见谅. 进入正题,做后台项目区别于做其它的项目,权限验证与安全性是非常 ...

  8. 三、VUE项目BaseCms系列文章:axios 的封装

    项目开发中 ajax 是不可缺少的,一个好的封装可以减少我们很多的重复代码,维护也更方便.在 vue 开发中我们用的比较多的就是 axios.下面代码是项目中用到的 axios 的封装. http.j ...

  9. 【转】手摸手,带你用vue撸后台 系列三(实战篇)

    前言 在前面两篇文章中已经把基础工作环境构建完成,也已经把后台核心的登录和权限完成了,现在手摸手,一起进入实操. Element 去年十月份开始用vue做管理后台的时候毫不犹豫的就选择了Elemen, ...

随机推荐

  1. 【Unity3D】简单常用的功能实现1——鼠标点击实现移动

    [鼠标点击实现移动] 第一步,在要移动的GameObject的Inspector面板中添加角色控制器组件并调整参数. 参数的调整可以依照Scene面板,如下图的绿色线框(角色控制器组件是一种胶囊形状的 ...

  2. NanoHTTPD服务

    需要导入nanohttpd2.3,jar包 继承NanoHTTPD public class HttpServer extends NanoHTTPD { public HttpServer(int ...

  3. ASP.NET Core中的响应压缩

    介绍     响应压缩技术是目前Web开发领域中比较常用的技术,在带宽资源受限的情况下,使用压缩技术是提升带宽负载的首选方案.我们熟悉的Web服务器,比如IIS.Tomcat.Nginx.Apache ...

  4. 完了!TCP出了大事!

    前情回顾:<非中间人就不能劫持TCP了吗?> 不速之客 夜黑风高,乌云蔽月. 两位不速之客,身着黑衣,一高一矮,潜入Linux帝国. 这一潜就是一个多月,直到他们收到了一条消息······ ...

  5. PHP array_pad() 函数

    实例 返回 5 个元素,并将 "blue" 值插入到数组的新元素中: <?php$a=array("red","green");pri ...

  6. idea安装testng插件后,无法使用调用testng里面的类

    1.已经安装好idea的testng插件,并且应用上相关的两个插件. 2.已经导入maven仓库的testng.jar,并且重启过idea后:发现不能调用. 本人在百度很多相关资料,始终没有找到解决方 ...

  7. [转]HashMap详解

    转自微信公众号  安琪拉的博客 1. HashMap的内部数据结构? JDK1.8版本的,内部使用数组 + 链表 / 红黑树:数据结构如下图: 2. HashMap的数据插入原理吗? 1.判断数组是否 ...

  8. .net core编写转发服务

    我有个小伙伴问我,他需要写一个转发服务的他有很多功能要通过他的服务转发~ 技术栈又不一定asp.net core,我就想起泥水老前辈的BeetleX.FastHttpApi 中午午休,折腾了一会儿前辈 ...

  9. UML科普文,一篇文章掌握14种UML图

    前言 上一篇文章写了一篇建造者模式,其中有几个UML类图,有的读者反馈看不懂了,我们今天就来解决一哈. 什么是UML? UML是Unified Model Language的缩写,中文是统一建模语言, ...

  10. 大型企业都在用的Python反爬虫手段,破了它!

    SVG 映射反爬虫 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人 ...