vue环境搭建相关介绍
一、路由管理器说明
1.route:译为路由,可以理解为单个路由或者某一个路由。
2.routes:路由集合,可以理解为多个route的集合。
3.router:路由器,可以理解为路由集合的管理者。例如,当我们在页面上点击某个按钮之后,router就会去routes中查找route,即路由管理者会去路由集合中寻找路由。
二、路由依赖
在package.json文件中添加路由依赖
"dependencies": {"axios": "^0.18.0","vue": "^2.5.2","vue-router": "^3.0.1","element-ui": "^2.3.7","js-cookie": "^2.2.0","nprogress": "^0.2.0","vuex": "^3.0.1","echarts": "^4.2.0-rc.2","normalize.css": "^8.0.0","v-charts": "^1.19.0","v-distpicker": "^1.0.20"},
三、路由引入
在main.js中引入路由
import Vue from 'vue'
import App from './App'
import router from './router'
new Vue({el: '#app',router,store,components: { App },template: '<App/>'
})
四、注册全局组件方式
如果需要把某一js文件注册为全局使用,则可以通过如下方式
import tools from '@/utils/tools' // 在main.js中引入文件
Vue.prototype.$tools=tools; //注册为全局变量
this.$tools.openNewWindowOut(this.backLink);
五、监听某个变量的变化
示例:在我们通过ajax获取某个url请求地址,通过该url打开弹出式窗口或被拦截,原因:当时用window.open()打开新浏览器窗口,如果这个url是通过ajax从后台获取,则会被浏览器拦截,因为浏览器监测到非用户行为打开新的浏览器窗口,认为这可能是广告或者不安全的操作;
怎么避免浏览器的这种拦截行为?已说明这种拦截的情况是因为非用户操作产生的,因为可通过确认框由用户确认后打开,基于这种方式,我们可事先在vue页面绑定某个变量,当用户触发操作之后,把通过ajax获取的url变量赋给绑定的变量,在监测这个事先绑定的变量值的变化,具体实现如下:
data(){backUrl:'',backLink:'',
},
methods:{// 用户点击按钮backClick(){if(this.backUrl){this.backLink = this.backUrl;}else{this.$message("请稍后,正在上架中....");}},
},
watch:{// 方法名和变量名相同backLink(){this.$tools.openNewWindowOut(this.backLink);this.backLink = null; //置空的原因:允许打开多个}
}
六、路由守卫
import router from './router'
// 顶部进度条
import NProgress from 'nprogress'
// token文件导入
import {getToken} from '@/utils/auth'import store from './store'
import { Message } from 'element-ui'// 不授权就可以访问的页面
const whitePageList = ['/login']
/*** 路由守卫* 在路由守卫中,只有next()是放行,其它的如:next('/login'),next(to),next({...to,replace:true})都不是放行,而是中断当前导航,执行新的导航* next('/login')说明:* 此含义并不是直接去/login路由,而是中断(中断指的是:不会执行router.afterEach(()=>{})),而是又进入一层路由守卫,这是to.path已经是新的路由,* 才执行next()放行。* 重点:在addRoutes()动态添加路由之后第一次访问被添加的路由,会出现白屏?* 这是因为刚刚addRoutes()完就立即访问,此时addRoutes()还没有执行结束,从而找不到刚添加的路由导致白屏,此时需要重新访问路由才可以。* 如何解决这种问题:* 使用next({..to,replace:true})来确保addRoutes()动态添加的路由已经完全被加载结束,* replace:true 告诉Vue,本次操作之后,不能通过浏览器后退按钮,返回前一个路由,* 因此也可以直接写为:next(...to),作用为:如果参数to不能找到对应的路由之后,就再执行router.beforeEach(),直到能够找到对应的路由为止;这就意外着,* 如果能够找到对应的路由,那么addRoutes()就执行结束了,接下来会执行一次正确的路由,因此需要合适的设置next(),否则会进入死循环。*/
router.beforeEach((to,from,next)=>{NProgress.start(); // 开始NProgress// 获取tokenif(getToken()){if(to.path === '/login'){next({path:'/'});NProgress.done(); // 结束NProgress}else{// 如果用户角色列表长度为0,则获取用户信息,动态生成路由列表if(store.getters.roles.length === 0){store.dispatch('GetInfo').then(res=>{let menus = res.data.menus;let username = res.data.username;store.dispatch('GenerateRoutes',{menus,username}).then(()=>{router.addRoutes(store.getters.addRouters); // 动态添加可访问路由表next({ ...to, replace: true })})}).catch(error=>{// 如果拉取用户信息出错,则登出重新登录store.dispatch('FedLogOut').then(res=>{Message.error(err || 'Verification failed, please login again');next('/');});})}else{next();}}}else{// 如果没有登录,又不在白名单则直接放开if(whitePageList.indexOf(to.path) != -1){next();}else{next('/login');NProgress.done(); // 结束NProgress}}
})// 路由之后
router.afterEach(()=>{NProgress.done(); // 结束NProgress
})
七、拦截请求和响应axios
import axios from 'axios'
import {Message,MessageBox } from 'element-ui'
import store from "../store";
import {getToken} from "./auth";/*** axios介绍:* 简单的讲,就是发送get和set请求的* 拦截请求和响应* 转换请求和响应数据* 自动转换json等*///创建axios实例
const service = axios.create({baseURL:process.env.BASE_API,timeout:15000 // 请求超时时间
})// request请求拦截器
service.interceptors.request.use(config=>{// 在发送请求之前,判断token是否存在,如果存在,则把token添加到请求头header中if(store.getters.token){config.headers.Authorization = getToken();}return config;
},error=>{console.log(error);/*** Promise:异步操作对象序列化* Promise是一个对象,用于表示异步操作的成功或失败的结果,一般有三种状态:* pending:初始状态,既不代表成功,也不代表失败,* fulfilled:意外着操作成功完成,也可以称为resolved状态* rejected:意外着操作失败* pending状态的Peomise对象,可能触发fulfilled状态,并传递一个值给相应的状态处理方法;也有可能触发rejected状态并给相应的状态处理方法传递失败的值,* 当出现上述任意一种状态时,Promise对象的then方法绑定的事件处理方法(handler)就会被调用(then方法的参数有两个:onfulfilled和onrejected,* 并且都为Function类型,事件处理方法会根据不同的状态调用不同的方法)。**/Promise.reject(error);
})// response拦截器
service.interceptors.response.use(response=>{const res = response.data;/*** 判断返回值状态,如果为200-正常响应,401-未登录异常,否则为错误或异常响应*/if(res.code !== 200){Message({message:res.message, // 错误响应的信息type:"error", // 提示信息类型duration:3 * 1000 //错误信息展示时间,单位为毫秒});if (res.code === 401 ){MessageBox.confirm('你已被登出,可以取消继续留在该页面,或者重新登录','确定登出',{confirmButtonText:'重新登录',cancelButtonClass:'取消',type:"error"}).then(()=>{ // then作用:当then之前的语句被执行之后,再异步执行then内部的程序,可防止数据初始化失败造成的页面无法加载. 可多个连续使用// 发送登出请求,重新载入当前页面location.reload();})}return Promise.reject('error');}else{return res;}
},error=>{console.log('err'+error);Message({message:error.message, // 错误响应的信息type:"error", // 提示信息类型duration:3 * 1000 //错误信息展示时间,单位为毫秒});
})export default service
八、多个组件共享某个状态Vuex
import Vue from 'vue'
import Vuex from 'vuex'
import getters from './getters'
import user from "./modules/user"
import permission from "./modules/permission";/*** Vuex介绍:* 重点:多个组件共享某个状态* Vuex是专门为vue.js开发的状态管理模式,它将集中存储管理应用中组件的状态,并用一定的规则保证状态朝着可预测的方向变化。* store :仓库 state:状态* VUE组件从store中读取状态,如果store中的状态发生变化,则相关的组件的状态将高效的更新。* 不能直接改变store中的state(状态),改变的方式只能是显式的提交(commit),方便跟踪某个状态的变化* 触发状态变更方式:store.commit('increment')*** this.$store.dispatch('isLogin', true):异步操作,数据提交至 actions ,可用于向后台提交数据* this.$store.commit('loginStatus', 1):同步操作,数据提交至 mutations ,可用于登录成功后读取用户信息写到缓存里* 虽然提交的方式不同,但都是传值个vuex的mutation,进而改变state*/
Vue.use(Vuex);const store = new Vuex.Store({modules: {user,permission},getters
})export default store
/*** Vuex中Getters的说明:* store(容器)中的state派生状态的管理* Getters可以认为是store的计算属性,其返回值会根据依赖缓存,并且只有依赖值发生变化后才会重新计算* 对外暴露的公共接口为:store.getter*/
const getters = {sideBar: state => state.app.sideBar,// 设备device:state => state.app.device,// 客户端缓存的用户名token:state => state.user.token,// 用户头像avatar: state => state.user.avatar,// 用户名name: state => state.user.name,// 登录用户所属角色roles: state => state.user.roles,// 动态路由设置addRouters: state => state.permission.addRouters,routers: state => state.permission.routers
}export default getters
import {getToken,setToken,removeToken} from "../../utils/auth"
import {login,loginOut,getInfo} from "../../api/login";/*** Vuex中各参数说明* state:* 单一状态树,此状态树包含整个应用层级会话的状态,* mutations:* 更改store容器中的状态的唯一方式就是提交mutation(突变),每一个mutation都有一个type(类型)和handler(回调函数),这个handler就是我们* 实际进行state更改的地方,并且会接收state作为第一个参数,特别注意的是,每个mutation必须是同步函数,其原理为:在回调函数中进行的状态更新是不了追踪的。* actions:* 前面说明,为了所有的应用层级别的会话状态的更新都是可追踪的,所以引入了只能进行同步操作的mutations,但是在vuex中,也引入了能进行一步操作的actions,* Actions包含任何的异步操作,虽然提交的是Mutation,但却不是直接更改状态。**/
const user = {state:{// 本地tokentoken:getToken(),// 用户名name:'',// 头像avatar:'',// 所属角色组roles:[]},mutations:{SET_TOKEN:(state,token)=>{state.token = token;},SET_NAME:(state,name)=>{state.name = name;},SET_AVATAR:(state,avatar)=>{state.avatar = avatar;},SET_ROLES:(state,roles)=>{state.roles = roles;}},actions:{// 登录Login({commit},userInfo){const userName = userInfo.userName.trim();return new Promise((resolve,reject)=>{login(userName, userInfo.passWord).then(response=>{const data = response.data;const tokenHeader = data.tokenHead + data.token;setToken(tokenHeader);// 提交突变状态commit('SET_TOKEN',tokenHeader);resolve();}).catch(error=>{reject(error);})})},// 获取用户信息GetInfo({commit},state){return new Promise((resolve,reject)=>{getInfo().then(response=>{const data = response.data;if(data.roles && data.roles.length > 0){commit('SET_ROLES',data.roles);}else{reject('getInfo: roles must be a non-null array !');}commit('SET_NAME',data.username);commit('SET_AVATAR',data.icon);resolve(response)}).catch(error=>{reject(error);})});},// 后台登出LogOut({commit},state){return new Promise((resolve, reject) => {loginOut().then(response=>{const data = response.data;// 突变会话级别的变量commit('SET_TOKEN','');commit('SET_ROLES',[]);// 删除本地tokenremoveToken();// 成功响应resolve();}).catch(error=>{reject(error)})});},// 前端登出FedLogOut({commit},state){return new Promise((resolve, reject) => {commit('SET_TOKEN', '')removeToken()resolve()});}}
}export default user
九、vue中svg的组件
import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon'// svg组件// 全局注册
Vue.component('svg-icon', SvgIcon)
const requireAll = requireContext => requireContext.keys().map(requireContext)
/* require.context("./test", false, /.test.js$/);这行代码就会去 test 文件夹(不包含子目录) 下面的找所有文件名以 .test.js 结尾的文件能被 require 的文件。更直白的说就是 我们可以通过正则匹配引入相应的文件模块。require.context有三个参数:directory:说明需要检索的目录useSubdirectories:是否检索子目录regExp: 匹配文件的正则表达式
*/
const req = require.context('./svg', false, /\.svg$/)
requireAll(req)
<template><svg :class="svgClass" aria-hidden="true"><use :xlink:href="iconName"></use></svg>
</template><script>
export default {name: 'svg-icon',props: {iconClass: {type: String,required: true},className: {type: String}},computed: {iconName() {return `#icon-${this.iconClass}`},svgClass() {if (this.className) {return 'svg-icon ' + this.className} else {return 'svg-icon'}}}
}
</script><style scoped>
.svg-icon {width: 1.2em;height: 1.2em;vertical-align: -0.18em;fill: currentColor;overflow: hidden;
}
</style>
十、passive和prevent区别
W3C规定,当一个from元素中只有一个输入框时,在该输入框中按下回车键该表单应该提交,如果希望阻止这一默认的行为,则需要在<el-from>标签上加上@submit.native.prevent.native:把一个vue组件转化为一个普通的HTML标签,并且该修饰符对普通HTML标签是没有任何作用的。prevent:阻止某些标签默认拥有的事件,如a[href="#"],button[type="submit"],这类标签会在冒泡结束后自动执行默认事件,passive:通俗点说就是每次事件产生,浏览器都会去查询一下是否有preventDefault阻止该次事件的默认动作。我们加上passive就是为了告诉浏览器,不用查询了,我们没用preventDefault阻止默认动作。** passive和prevent冲突,不能同时绑定在一个监听器上
相关文章:
vue环境搭建相关介绍
一、路由管理器说明 1.route:译为路由,可以理解为单个路由或者某一个路由。 2.routes:路由集合,可以理解为多个route的集合。 3.router:路由器,可以理解为路由集合的管理者。例如,当我们在页面…...
MyBatis系统学习(四)——MyBatis的关联映射和缓存机制
MyBatis 是一个优秀的持久层框架,它通过 XML 或注解将 Java 对象与 SQL 语句相映射,简化了 JDBC 代码,增强了 SQL 的灵活性。在复杂业务场景中,数据库表之间经常存在一对一、一对多、多对多的关联关系,MyBatis 提供了相…...
【iOS】present和push
【iOS】present和push present和push的比较 present和push都用于iOS的视图切换,并且切换都是可逆的,原始视图不会被销毁,还可以直接更改window的rootViewController来切换视图,但是这种方法不可逆,并且原始视图会被销毁…...

Axure RP 9最新安装程序及汉化包下载(支持Win、Mac版,附下载安装教程)
数月前Axure RP官方已经发布了Axure RP 9的消息,并计划在今年夏天发布beta版本。新版Axure RP 9将是该工具向前迈出的重要一步,其中包括一系列广泛的改进:全面的UI修改,新的设计和文档功能以及前所未有的内部优化。我们已经彻底重…...

k8s环境搭建(续)
查看节点信息并做快照 kubectl get nodes 将components.yml文件上传到master主机 创建nginx,会在添加一个新的pod kubectl run nginx --imagesnginx:latest 查看nginx的pod信息 [rootk8s-master ~]# kubectl get po -Aowide|grep nginx 出现错误,查…...

kali——binwalk的使用
目录 前言 使用方法 分析文件 分离文件 前言 binwalk是一个用于分析、逆向工程和提取固件映像的工具。 binwalk能够分析固件映像文件,识别其中包含的文件。例如,它可以从一个设备固件中提取出压缩文件或图片等嵌入内容。 使用方法 分析文件 binwa…...

Ubuntu 24.04中安装virtualenv
在Ubuntu 24.04中安装virtualenv,可以按照以下步骤进行: 1. 确保Python已安装: 在终端中输入python --version或python3 --version来检查Python的安装情况。 python3 --version2. 安装pip(如果尚未安装)&#x…...

一个简约的uniapp登录界面,基于uniapp+vue3+uview-plus
uniapp-vue3-template 一个简约的uniapp登录界面,基于uniappvue3uview-plus 页面主要包括:用户登录,手机验证码登录,用户注册,重置密码等页面 登录进去后为空白模板 源码在文末 界面 源码 uniapp登录界面源码...
系统架构设计师 需求分析篇二
📘 面向对象分析方法 1. 用例模型 📈 构建用例模型一般需要经历 4 个阶段: 识别参与者 🔍:识别与系统交互的所有事物。合并需求获得用例 🔗:将需求分配给予其相关的参与者。细化用例描述 &am…...

IP 协议分析《实验报告》
目录 一、 实验目的 二、实验设备和环境 三、实验记录 1、实验环境搭建 2、IP 协议分析 1.设置抓包接口 2.IP 报文分析 3.报文长度计算 4.生存时间 TTL 5.分析总结 3、IP分片 1.IP 分片简介 2.捕获分组 3.结果分析 一、 实验目的 1、掌握 IP 协议数据报格式&…...

人工智能开发实战matplotlib库应用基础
内容导读 matplotlib简介绘制直方图绘制撒点图 一、matplotlib简介 matplotlib是一个Python 2D绘图库,它以多种硬拷贝格式和跨平台的交互式环境生成高质量的图形。 matplotlib 尝试使容易的事情变得更容易,使困难的事情变得可能。 我们只需几行代码…...
Android 源码集成可卸载 APP
android系统包含三类APP: 1、可自由卸载APP安装在 /data/app目录下。 2、系统APP放在 /system/app目录。 3、特权APP放在 /system/priv-app目录。 系统编译后,打包前, /data分区不起作用,因此系统打包前,可以先将APP全部拷贝到 /…...

cJSON-轻量级解析模块、字符串的神——编织STM32C8T6与阿里云信息传递的纽带
编写方向:本人就不泛泛的编写一篇什么一文学会cJSON了,没什么突出点,也就我水水字数,你们看来看去也不懂,本人是从上阿里云传信息接触的cJSON的,我就此写一篇针对性的文章,希望对大家有用&#…...
【Git】Clone
当git clone失败时,出现 RPC failed; curl 92 HTTP/2 stream 0 was not closed cleanly: CANCEL (err 8) 错误,可能由于网络连接不稳定或仓库太大导致的。 可以尝试以下几种方法来解决这个问题: 增加 Git 的缓冲区大小: git confi…...

web开发 之 HTML、CSS、JavaScript、以及JavaScript的高级框架Vue(学习版2)
一、前言 接下来就是来解决这些问题 二、 Ajax 1.ajax javscript是网页三剑客之一,空用来控制网页的行为的 xml是一种标记语言,是用来存储数据的 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-…...

【课程学习】信号检测与估计II
b站 文章目录 1-概述 1-概述 线性、正交、平稳、高斯 研究线性模型,采用正交化方法,假设信号平稳,考虑信号的统计特性是高斯的。 本学期考虑,非线性、非正交、非平稳、非高斯。 阵列处理 1980-1990 MUSIC 稀疏性 2006-2012 LASS 时…...
【深度学习|PyTorch】基于 PyTorch 搭建 U-Net 深度学习语义分割模型——附代码及其解释!
【深度学习|PyTorch】基于 PyTorch 搭建 U-Net 深度学习语义分割模型——附代码及其解释! 【深度学习|PyTorch】基于 PyTorch 搭建 U-Net 深度学习语义分割模型——附代码及其解释! 论文地址: https://arxiv.org/abs/1505.04597 代码地址&a…...

DPDK基础入门(十):虚拟化
I/O虚拟化 全虚拟化:宿主机截获客户机对I/O设备的访问请求,然后通过软件模拟真实的硬件。这种方式对客户机而言非常透明,无需考虑底层硬件的情况,不需要修改操作系统。 半虚拟化:通过前端驱动/后端驱动模拟实现I/O虚拟…...

OpenCV_图像旋转超详细讲解
图像转置 transpose(src, dst); transpose()可以实现像素下标的x和y轴坐标进行对调:dst(i,j)src(j,i),接口形式 transpose(InputArray src, // 输入图像OutputArray dst, // 输出 ) 图像翻转 flip(src, dst, 1); flip()函数可以实现对图像的水平翻转…...
关于 OceanBase 4.x 中被truncate的 table 不再支持进回收站的原因
近期,OceanBase的问答社区中收到了不少用户的询问,关于OceanBase 3.x版本支持被truncate的table进入回收站的功能,为何在升级到4.x版本后不再支持了?为了解答大家的疑惑,我们将通过这篇文章来浅析 OceanBase在4.x版本中…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...