Q6:问题出在什么地方?

▼魔方 西西 提交于 2019-11-29 18:29:41

1.elementUI
 (1)鼠标悬浮文字提示------el-tooltip组件

 // 第1:el-tooltip要和i标签配合
<el-tooltip effect="dark" placement="bottom">
    <div slot="content"> //第2:本来el-tooltip是有一个content属性的,但是要展示多行或者说文本内容要有格式,没事,组件库提供了具名slot='content属性’
        <p v-for="item in messages" :key="item">
          {{item}}
        </p>
    </div>
    <i class="el-icon-information"></i>
</el-tooltip>


(2)滚动条-----el-scrollbar组件
 

  // 配合wrap-class="elements__dropdown"让其出现滚动条 并且css属性定义其height为父容器的高度的100%。但是elementUI组件库并没有引入(还存在问题,可以上网查)


(3)单选组合----el-radio-group组件和  el-radio-button
 

   el-radio-group(v-model="type", size="small")
          el-radio-button(label="templates") 模板
          el-radio-button(label="elements" :disabled="topoEditTemplate") 自定义
   // 主要是label标签和v-model的联动,并且lable值尽量用字符串


   (4)面包屑-----Breadcrumb 组件

   //显示当前页面的路径,快速返回之前的任意页面。
   <el-breadcrumb separator="/">
      <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
      <el-breadcrumb-item>活动详情</el-breadcrumb-item>
   </el-breadcrumb>
  // 类似
  <router-link
        v-for="route in breadcrumbData"
        :key="route.name"
        class="breadcrumb__item"
        :to="{name: route.name}">
        {{ route.meta && route.meta.name }}
   </router-link>

      
   其中separator="/"
   类似.breadcrumb__item::after {
        content: '/';
        color: #CBCBCB;
        margin-left: 8px;
      }


2.ES6
   (1).对象的解构赋值

//参考http://es6.ruanyifeng.com/#docs/destructuring学习(数组和对象的解构赋值)
let { templates } = tool.loadTopoElements(); //tool.loadTopoElements()返回 {templates ,elements}

   (2).import的使用


(3) Object.assign()方法

//公共文件 提供接口rules
Object.assign(op, {
   message: '存在不合法的字符'
}, rules);

//自己文件
 regexp: {
           regexp: /^[1-9]\d*$/,
           message: '漏洞ID必须是大于0的正整数。'
         }

//或
callback: {
   callback (v) {
       const MIN = 1;
       if (v < MIN) {
            return {
                 valid: false,
                 message: '请输入正整数'
            };
       }
       return {
            valid: true
       };
   }
}
 
接口rules对应比如对象:
   {
       regexp: /^[1-9]\d*$/,
       message: '漏洞ID必须是大于0的正整数。'
   }


3.项目中的各个文件什么意思?

(1).gitkeep文件
     git是不允许提交一个空的目录到版本库上的,可以在空的文件夹里面建立一个.gitkeep文件(空文件),然后提交上去去即可。
(2).browserslistrc文件
     浏览器 兼容处理 比如加css前缀
(3)eslintrc.js 文件
     编码规范 学会配置 
(4)babel.config.js
     转为es5
(5).npmrc
     npm install xxx
     内容registry=http://200.200.151.86:7001/
 (6)config.js
     项目配置文件 后台接口端口
(7)gulpfile.js 前端打包工具
     let gulp = require('gulp');
     gulp.task('xxx', []);
     相当于webpack.config.js
(8)package-lock.json
    比package.json更具体 学会配置package.json ,package.json项目中必须有但package-lock.json不提交也行
 (9)vue.config.js 项目中新增的配置参考vue-cli
 (10)Polyfill.js 
      Polyfill 是一块代码(通常是 Web 上的 JavaScript),用来为旧浏览器提供它没有原生支持的较新的功能
      比如我们看到项目中的一些ES6,7,8,9中的数组方法实现在此文件(可以参考MDN文档看看)


4.拓展

(1)http://qunee.com/ SVG转canvas 为了兼容ie版本 可以上github了解进一步了解拓扑
(2)通用网关接口(Common Gateway Interface/CGI):一种规范的接口文档
(3)TD :bug状态管理 new--fixed--fixed已审核
(4)前端 crypto-js 加解密库:https://www.jianshu.com/p/a47477e8126a 使用过MD5 ,另外也使用过base64


5.逻辑代码
(1)动态口令逻辑

//html:真假配合的不错
              <input ref="input"
                       :maxlength="6"
                       class="real-input"
                       @keyup="getNum"
                       @keydown="delNum"
                       v-model="tokenNum">
                <ul ref="codeInput"
                    class="code-input clearfloat">
                    <li v-for="(disInput, index) of disInputs"
                        :key="disInput.id">
                        <span v-if="tokenNum.length === index"
                              ref="spanText">{{content}}</span>
                        <input v-else
                               ref="virtualInput"
                               :maxlength="1"
                               v-model="disInput.value">
                    </li>
                </ul>
     其中 <span v-if="tokenNum.length === index"  ref="spanText">{{content}}</span> //tokenNum是一个输入的数字字符串,tokenNum.length === index意思就是让你输入的下一个获取焦点
//JS:这个配合好
       //设置span输入框中的内容为'|'
        setLine () {
            if (this.timer2) {
                clearInterval(this.timer2);
            }
            this.content = '|';
            this.timer1 = setInterval(() => {
                this.setSpace();
            }, SHOW);
        },

        //设置span输入框中的内容为空
        setSpace () {
            clearInterval(this.timer1);
            this.content = '';
            this.timer2 = setInterval(() => {
                this.setLine();
            }, HIDE);
        }
    },

    beforeDestroy () {
        clearInterval(this.timer1);
        clearInterval(this.timer2);
        this.timer1 = null;
        this.timer2 = null;
    }

//JS:这个也很优秀
       // 给显示的input框添加值
        getNum () {
            for (let i = 0; i < this.tokenNum.length; i++) {
                this.disInputs[i].value = this.tokenNum.charAt(i);//优秀
            }
        },

       // 删除显示input框的值
        delNum () {
            let e = event || window.event;
            if (e.keyCode === BACKSPACE) {
                if (this.tokenNum.length < LENGTH) {//优秀this.tokenNum.length < LENGTH
                    this.disInputs[this.tokenNum.length].value = ' ';
                }
            }
        },


(2)用户管理逻辑
 

 各个弹框注意:第一:加载过程   第二:按钮防止二次提交
   第一:加载动画: 表格加载 表单也要有加载动画 
  //规范:记得在每个组件 比如el-form  外面套一层容器 
 <div class="content" v-loading="loading"> 
           <el-form ></el-form>
  </div>
//加载:采用  元素上添加 v-loading="" ,data中定义布尔变量 ,两者结合  并在点击确定按钮是改变为true
  第二:按钮防止二次提交
   按钮上 :disabled="!formValid || loading"
finally(() => {
     this.loading = false;
});


(3)租户列表中重要的等级 容错处理和旧租户特殊处理

   tenant.hasOwnProperty('is_key_tenant') ? (+tenant.is_key_tenant).toString() : tenant.is_key_tenant = ''

  (4) edr规则库特殊处理

//  优化一:两个if合并,减少代码冗余
        let isFileExtentEdr = /^\.(zip|pkg|exe|cab)$/.test(fileExtent); //将IsfileExtentEdr改为isFileExtentEdr (规范)

        // 文件选择错误提示
        if ((this.type === 'vSEDR' && !isFileExtentEdr) || (this.type !== 'vSEDR' && fileExtent !== '.zip')) {
            this.$error('EDR类型可以上传.zip, .exe, .pkg, .cab文件,其他类型只可上传.zip'); // 错误提示合并 (具体提示找交互再确认一下)
            this.clearTnputFile(this.$el.querySelector('input[type="file"]'));
            return false;
        }
<!-- 优化二:借助accept属性 ,从而不需要手动判断文件类型。相应的就不需要文件选择错误提示,除非 手动去更改控制资源管理器预览的时候指定的文件类型 -->
    <div class='wrapper'>
        <!--input[type='file']的 accept属性  控制资源管理器预览的时候只能看见指定的文件类型-->
        <input v-if='this.type===' vSEDR' type="file" accept=".zip, .exe, .pkg, .cab" />
        <input v-else type="file" accept=".zip" />
    </div>


6.简单效果
(1).动态口令复制到粘贴板.

方法:使用 document.execCommand('copy')。
具体:
copyToken (pwd) {
            let input = document.getElementsByClassName('el-input__inner')[1];//获取input元素
            input.value = pwd;
            input.select(); // 选中input框中的value文本
            document.execCommand('copy'); // 执行浏览器复制命令
            input.value = '';//最后赋空 现实需要的道理
},


(2).input框添加焦点,input框添加焦点,他的value还是可以获取到的。这里联想到给input框加autofocus (一次性)和vue中自定义指令(一次性)
 

 @click绑定在容器时,获取到input,保证人为点击始终获取input焦点
  focus () {
            this.$refs.input.focus();
   },


(3)新增用户确定 密码长度变化  (真正理解v-model,理解为什么密码会变长)

this.form.password =Base64.encode(this.form.password);
改为如下
 let params = {
                user_desc: this.form.user_desc,
                user_name: this.form.user_name,
                password:this.editData ? delete this.form.password : Base64.encode(this.form.password),
                component_limit: this.form.component_limit
 }  


(4).项目中使用$router $route的区别

1.$router为VueRouter实例,想要导航到不同URL,则使用$router.push方法
2.$route为当前router跳转对象,里面可以获取name、path、query、params等

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!