vue项目--iview企业项目后台管理----问题及解决
1. 基于vue cli3.0打包:npm run serve运行项目。 vue cli3.0安装过程中中途取消,再次安装时,
需要删除C:\Users\Administrator\AppData\Roaming下的npm-cache文件删除,再重新安装。
2. 安装iview:
下载:npm install --save iview
引入main.js:
import iView from 'iview'
import 'iview/dist/styles/iview.css'
Vue.use(iView)
3. css预处理器如stylus和less/sass在修改第三方插件样式时:
方法一: .box >>> .第三方样式插件。
方法二: .box /deep/ .第三方样式插件。如果是less只能用这个方法修改。.box{/deep/.cc{#要修改的第三方插件样式}}
4. 动态绑定class:
<p class="p2" :class="{action_color:actionIndex==index}" :style="{fontSize:size_f}">{{item.p2}}</p>
5. 对于vue项目中的图片的加载:
5.1 图片放在static文件夹下。
5.2 图片放在非static文件夹下时,require("../1.png")需要用require()去加载图片。
6. iview中的导航菜单 跳转路由:在Menu标签绑定@on-select="hanle" hanle(e){console.log(e+"是MenuItem/Submenu的name值")} ,accordion始终保证了只有一个菜单是展开的。
<Menu mode="horizontal" accordion :theme="theme1" active-name="1" @on-select="hanle">
<MenuItem name="1">
<Icon type="ios-paper" />
内容管理
</MenuItem>
<Submenu name="2">
<template slot="title">
<Icon type="ios-stats" />
统计分析
</template>
</Submenu >
7.解决跨域问题:
方法1:在vue.config.js里面设置跨域代理请求:
devServer:{ //设置跨域,即将本文件内任何没有匹配到的静态文件,都指向跨域地址http://localhost:4000
proxy:'http://localhost:4000'
}
在发送axios请求里执行:
axios.post("/login",{uname:"Ace",upwd:"1234"}).then(data=>{})
方法二:
在发送axios请求里执行:
axios.post("http://localhost:3000/login",{uname:"Ace",upwd:"1234"}).then(data=>{})
在后台(如node的app.js)设置跨域:
app.all("*",(req,res,next)=>{ //*代表所有请求。
req.header("Access-Contral-Allow-Origin","*");
req.header("Access-Contral-Allow-Headers","X-Requested-Width,Content-Type");
req.header("Access-Contral-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
next();
})
8. img标签src直接通过接口获取验证码图片:
<img :src="imgSrc" @click="changeIdentifyingCode" />
imgSrc:"/apsbmp/servlet/captchaCode"
在vue.config. devServer:{ //设置跨域,都指向跨域地址http://202.105.247.89:30337
proxy:'http://202.105.247.89:30337'
}
changeIdentifyingCode(){ //点击图片切换验证码
this.imgSrc="/apsbmp/servlet/captchaCode?rid="+ Math.random();
}
9. 导航守卫:即没有登录的情况下,不允许跳转到admin页面
在router/index.js下:
const IS_LOGIN=false //是否登录的判断,该判断是可以通过cookie中是否保存有登录信息决定
router.beforeEach((to, from, next) => { //导航守卫,即没有登录的情况下,不允许跳转到admin页面
if(to.name !=="login"){ //如果即将跳转的页面不是登录页面
if(IS_LOGIN) {
next() //如果已即登录,就直接跳转
}else{
next({name:'login'}) //如果没有登录,就跳转到登录页面
}
}else{ //如果即将跳转的页面是登录页面
if(IS_LOGIN) {
next({name:'admin'}) //如果已即登录,就直接跳转首页,{name:'home'}也可是'/home'
}else{
next() //如果没有登录,就直接跳转
}
}
})
10. 项目打包:npm run build
在 vue.config.js中
const BASE_URL=process.env.NODE_ENV==='procution'?'/iview-admin':'./' ; #生产环境下要"./"
并在router/index.js下: 重定向"/"路由指向。
{
path:"/",
redirect:"/login"
},
{
path: '/login',
name: 'login',
component:() => import('@/views/Login.vue')
},
11. 安装echarts: npm install echarts --save,文档 参考:http://echarts.baidu.com/echarts2/doc/example.html
12. CryptoJS加密插件:
下载:
npm install crypto-js --save;
引入:
var CryptoJS = require("crypto-js");
或者:import CryptoJS from "crypto-js"
export var encryption=(word)=>{ //加密函数,Word是明文
var key = CryptoJS.enc.Utf8.parse("apsbmphebaoshare");
var srcs = CryptoJS.enc.Utf8.parse(word);
var encrypted = CryptoJS.AES.encrypt(srcs, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
return encrypted.toString();
}
export var decryptedData=(word)=>{ //解密,word是加密后的
var key = CryptoJS.enc.Utf8.parse("apsbmphebaoshare");
var decrypt = CryptoJS.AES.decrypt(word, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
return CryptoJS.enc.Utf8.stringify(decrypt).toString();
}
13. axios请求添加超时时间和修改请求头。
axios({
url:url,
method:"post",
timeout: 3000 ,//设置超时时间30s
headers:{
'platform':'pc'
}
}).then(data=>{})
或者:
axios.post(url,
{uname:a,
upwd:b
},{
headers:{
'platform':'pc'
},
timeout:3000,
}
}).then(data=>{})
14: vue单页应用如何在页面刷新时保留store状态数据:
在app.vue里面:
created(){
//在页面加载时读取localStorage里的状态信息
localStorage.getItem("userMsg") && this.$store.replaceState(Object.assign(this.$store.state,JSON.parse(localStorage.getItem("userMsg"))));
//在页面刷新时将vuex里的信息保存到localStorage里
window.addEventListener("beforeunload",()=>{
localStorage.setItem("userMsg",JSON.stringify(this.$store.state))
})
}
15. vue中的props传值,在子组件的methods中通过this获取值,有时候能获取到,有时候不能获取到,是因为this指向问题:
方法1:https://www.cnblogs.com/pssp/p/5216085.html。
方法2:存在cookie中,用的时候,在cookie获取。
16. 判断一个对象是否为空对象:JSON.stringify(hbUserStatus) !='{}'
17. 路由传参:
1.params:传参,不能穿对象。
路由配置:
{
path:"business_details/:name",
component: () => import( '@/components/admin_base/right_main/business_management/business_details.vue'),
}
传参:this.$router.push(`/admin/business_details/${params.row}`)
接收参数:this.$route.params.paramsInfo
2.query:传参,可以穿对象。
路由配置:
{
path:"business_details",
component: () => import( '@/components/admin_base/right_main/business_management/business_details.vue'),
}
传参:this.$router.push({
path:"/admin/business_details",
query:{
paramsInfo:params.row
}
})
接收参数:this.$route.query.paramsInfo
{
"hbType":"1",
"hbParentId":"0",
"children":[
{"hbType":"2",
"hbParentId":"1",
"children":[
{"hbType":"3",
"hbParentId":"3",
"children":"null",
"hbRemark":"",
"label":"片区AAA",
"value":"5"}
],
"hbRemark":"",
"label":"片区AA",
"value":"3"}
],
"hbRemark":"",
"label":"片区A",
"value":"1"
}
18.登录框密码框input框禁止复制、粘贴、剪切和右键功能,最大输入长度,禁止输入空格
<Input v-model="uname" size="large" placeholder="请输入用户名" :maxlength="11" onKeypress="javascript:if(event.keyCode == 32)event.returnValue = false;"
onpaste="return false" oncontextmenu="return false" oncopy="return false" oncut="return false" />
19.iview中enter按下事件:<Input v-model="uname" size="large" placeholder="请输入用户名" :maxlength="11" @keyup.enter.native="keyUpHandle"/>
keyUpHandle(e){ //enter键盘按下事件
var keyCode = window.event? e.keyCode:e.which;
if(keyCode == 13){
this.loginHandle();
}
},
20. 解决从后台获取的数据有时候无法显示在页面的bugl; 通过v-if="dataList.length<=0",v-else解决。
<div v-if="dataList.length<=0">加载中.....</div>
<div class="box fl" v-for="item in dataList" v-else></div>
21. 获取url后面的参数值
getUrlKey(name) { //获取url后面的参数,name是参数名。
return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [, ""])[1].replace(/\+/g, '%20')) || null;
},
22. 注意props传递数组和对象时的写法,不然容易报错。
props:{
parent:{
type:Array,
default:()=>[]
},
data:{
type:Object,
default:()=>{()}
}
},
22. 避免数据data是动态axios获取,在使用/传递时需要判断 v-if="data.length>0",否则可能传递空值
<new-area :parent="dataList" @addAreaSettingPage="addAreaSettingPage" :data="data" v-if="data.length>0"></new-area>
23 .禁止复制,剪切,粘贴,右键,空格:
<Input v-model="upwd" size="large" :maxlength="15"
onpaste="return false" oncontextmenu="return false" oncopy="return false" oncut="return false"
onKeypress="javascript:if(event.keyCode == 32)event.returnValue = false;"/>
24. 日期选择器DatePicker禁止输入::editable="false"
<DatePicker type="datetime" :clearable="false" :disabled="isDisabled" format="yyyy-MM-dd HH:mm"
placeholder="请选择开始时间" style="width: 350px" v-model="hbStartTime" :editable="false">
</DatePicker>
25.将json对象转化为json字符串,再判断该字符串是否为"{}"
var data = {};
data.data.beans.length == 0
var b = (JSON.stringify(data) == "{}");
if(data.data.beans.length == 0){
this.$Message.info("获取beans信息为空");
return;
}
if(JSON.stringify(data.data.beans.object) == "{}"){
this.$Message.info("获取object信息为空");
return;
}
26. 修改iview表的操作为图片:
render: (h, params) => {
return h('div', [
h('img', {
attrs:{
src:require("../../../../assets/img/admin/ed.png"),
alt:"编辑",
title:"编辑",
},
style: {
width:"30px",
height:"30px",
padding:"5px",
},
on: {
click: () => {
}
}
}),
]);
}
27. 下拉搜索输入框搜索按钮的颜色和输入框获得焦点时的边框颜色:
.search_color_hover
28. 解决modal弹框footer边线的问题:
.footerBorder
29. iview表格组件Table隔行变色:
:stripeVal="true"
30. 弹窗的按钮颜色以及禁止关闭,以及没有弹框头。
<Modal
v-model="delLists"
@on-ok="okDel"
:mask-closable="false"
:closable="false"
class="footerBorder"
width="300px"
@on-cancel="cancelDel">
<p style="display: flex;align-items: center;margin-top: 10px;">
<Icon type="ios-information-circle" size="18" style="margin-right: 5px;"></Icon>
你确定要删除该维护人员吗?
</p>
<div slot="footer" >
<Button type="primary" size="default" class="gradColor" @click="okDel">确定</Button>
<Button size="default" @click="cancelDel">取消</Button>
</div>
</Modal>
31. 图片上传:
<Upload
class="abs lrtb-center"
type="drag"
style="width: 100%;height: 100%;"
action="/apsbmp/ueditor/fileUpload.do"
:on-success="successUploadHandle1"
name="upfile"
:max-size="2048" 最大2M
:on-exceeded-size="handleMaxSize"
:on-error="errorUploadHandle"
:format="['jpg','png']"
:on-format-error="handleFormatError"
:show-upload-list="false"
>
<div style="padding: 0;width: 109px;height: 145px;background: #F3F3F3;" >
<div v-show="!hbPopupImg" style="padding-top: 20px;">
<Icon type="ios-add-circle" size="30" style="color: #CCCCCC;margin-bottom: 10px;"/>
<div class="tCenter">
<p>上传弹框图片</p>
<p>支持jpg、png</p>
<p>长宽比为1.5:2</p>
</div>
</div>
<img :src="hbPopupImg" alt="弹窗图片" class="wh" v-show="hbPopupImg" style="width: 109px;height: 145px;"/>
</div>
</Upload>
32.浅谈css3新单位vw、vh、vmin、vmax的使用详解及撑开整个页面:参考https://www.jb51.net/css/589835.html
33. store刷新页面时,数据丢失,通过本地存储:
在App.vue中设置:
created(){
//在页面加载时读取localStorage里的状态信息
localStorage.getItem("userMsg") && this.$store.replaceState(Object.assign(this.$store.state,
JSON.parse(localStorage.getItem("userMsg"))));
//在页面刷新时将vuex里的信息保存到localStorage里
window.addEventListener("beforeunload",()=>{
localStorage.setItem("userMsg",JSON.stringify(this.$store.state))
})
}
- Vue 项目中遇到的跨域问题及解决方法(后台php)
- 解决Maven管理的项目下"Missing artifact xxx bundle"问题
- 用gradle管理android项目出现的问题以及解决方法
- MVN:Maven bundle error:解决Maven管理的项目下"Missing artifact xxx bundle"问题
- 【phpcms-v9】解决后台栏目管理只显示顶级栏目名而不显示子栏目名的问题?
- 项目管理-解决问题是从简单到复杂再回归简单的过程
- 项目开发中的小问题解决-----asp.net当后台传值到前台方法中 0001变成1 解决方法
- 完美企业后台管理项目架构,apache shiro,bootstrap,spring,springMVC,mybatis,github,gradle
- Eclipse中发布Maven管理的Web项目时找不到类的问题根源和解决办法
- 中小民营如何解决企业绩效管理常见问题?
- 新建maven管理的web项目,java目录不全的问题解决方法
- ActiveMQ部署步骤和后台管理网站Service Unavailable问题解决笔记
- 解决Maven管理的项目下"Missing artifact xxx bundle"问题
- 企业SOA应用性能管理问题和解决策略
- 用gradle管理android项目出现的问题以及解决方法
- ERP能解决企业经营管理的所有问题吗?
- 项目管理的文化差异解决方法 解决生活婆媳问题
- ERP能解决企业经营管理的所有问题吗?
- 解决博易博客后台文章管理页面无法显示分页的问题