vue登录图片验证码/vue加载二进制图片

写在前面

需求:登录页获取图片验证码,后端以二进制流的形式返回。

一、效果:

1587960536.jpg

二、代码

本文vue中请求的axios所用为vue-element-admin中封装的request

<template>
 <div class="login-container" :style="bg">
   <h4 class="login-title"><img :src=logo alt="" class="logo">高密度空气质量监测原型系统</h4>
   <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" autocomplete="on" label-position="left">
     <div class="title-container">
       <h3 class="title">系统登录</h3>
     </div>
     <el-form-item prop="username">
       <span class="svg-container">
         <svg-icon icon-class="user" />
       </span>
       <el-input
         ref="username"
         v-model="loginForm.username"
         placeholder="用户名"
         name="username"
         type="text"
         tabindex="1"
         autocomplete="on"
       />
     </el-form-item>

     <el-tooltip v-model="capsTooltip" content="Caps lock is On" placement="right" manual>
       <el-form-item prop="password">
         <span class="svg-container">
           <svg-icon icon-class="password" />
         </span>
         <el-input
           :key="passwordType"
           ref="password"
           v-model="loginForm.password"
           :type="passwordType"
           placeholder="密码"
           name="password"
           tabindex="2"
           autocomplete="on"
           @keyup.native="checkCapslock"
           @blur="capsTooltip = false"
           @keyup.enter.native="handleLogin"
         />
         <span class="show-pwd" @click="showPwd">
           <svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'" />
         </span>
       </el-form-item>
     </el-tooltip>
     <el-form-item prop="validateCode" style="border: none">
       <div style="width: 160px;border:1px solid #889aa4;border-radius: 5px;display: inline-block">
         <span class="svg-container">
         <svg-icon icon-class="message" />
        </span>
         <el-input
           ref="validateCode"
           v-model="loginForm.validateCode"
           placeholder="验证码"
           name="validateCode"
           type="text"
           tabindex="1"
           autocomplete="on" style="width: 78%"
         />
       </div>
       <div class="yzm_picture_div">
         <img :src="codeImg"/>
       </div>
       <div class="yzm_text_div">
         <a href="javascript:void(0);" @click="loadCode">看不清,换一张?</a>
       </div>
     </el-form-item>
     <el-form-item style="background: #fff;border: none">
       <div class="tips">
         <p><a @click="finduser">忘记用户名?</a><a @click="findpass">忘记密码?</a></p>
       </div>
     </el-form-item>
     <el-form-item style="background: #fff;border: none">
       <el-button :loading="loading" type="primary" @click.native.prevent="handleLogin" style=" width: 47%;">登录</el-button>
       <el-button @click="register" type="primary" style=" width: 47%;">注册</el-button>
     </el-form-item>
   </el-form>
 </div>
</template>
<script>
 import { validUsername } from '@/utils/validate'
 import { getCode } from '@/api/user'
 import SocialSign from './components/SocialSignin'
 import LangSelect from '@/components/LangSelect'
 import backgroundImage from "../../assets/bg_login.png";
 import logo from "../../assets/logo2.png";
 export default {
   name: 'Login',
   components: { LangSelect, SocialSign },
   data() {
     const validateUsername = (rule, value, callback) => {
       if (value =='') {
         callback(new Error('请输入登录名'))
       } else {
         if (value.length > 20) {
           callback(new Error('请输入小于20位登录名'))
         } else {
           callback()
         }
       }
     }
     const validatePassword = (rule, value, callback) => {
       if (value.length < 6 ||value.length > 20) {
         callback(new Error('请输入6-20位密码'))
       } else {
         callback()
       }
     }
     return {
       backgroundImage,
       logo,
       codeImg:'',
       bg:{
         background:`url(${backgroundImage})`,
         backgroundSize:'100% 100%'
       },
       loginForm: {
         validateCode:'',
         username: '',
         password: '' //BKa531*$%_6
       },
       loginRules: {
         validateCode:  [{ required: true, message: '请输入验证码', trigger: 'blur' },
         { min: 4, max: 4, message: '请输入右侧4位数验证码', trigger: 'blur' }],
         username: [{ required: true, trigger: 'blur', validator: validateUsername }],
         password: [{ required: true, trigger: 'blur', validator: validatePassword }]
       },
       passwordType: 'password',
       capsTooltip: false,
       loading: false,
       showDialog: false,
       redirect: undefined,
       otherQuery: {}
     }
   },
   created() {
       this.loadCode();
     // window.addEventListener('storage', this.afterQRScan)
   },
   mounted() {
     if (this.loginForm.username == '') {
       this.$refs.username.focus()
     } else if (this.loginForm.password == '') {
       this.$refs.password.focus()
     }
     else if (this.loginForm.validateCode == '') {
       this.$refs.validateCode.focus()
     }
   },
   destroyed() {
     // window.removeEventListener('storage', this.afterQRScan)
   },
   methods: {
     register(){
       this.$router.push({path: '/register'});
     },
     loadCode() {
       getCode().then(res => {  //获取验证码
         this.codeImg=window.URL.createObjectURL(res);
         })
     }
   }
 }
</script>

三、请求

image.png

三、请求(其他网友,正常axios)

首先axios请求必须加上responseType: 'blob',
  export function getPicture(obj) {
    return request({
      url: '/display/getDetailPicture',
      method: 'get',
      responseType: 'blob',
      params: obj
    })
  }
getPicture({ id: id }).then(response => {
      this.picUrl = window.URL.createObjectURL(response);
    });
直接用不就可以了
<img style="width:200px;height:200px" :src="picUrl" alt />

四:主要代码截图

image.png

image.png

备注:要其他代码或有问题,可联系我,看到会回复

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容

  • 基于Vue的一些资料 内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 element★...
    尝了又尝阅读 1,142评论 0 1
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    随行者pgl阅读 3,306评论 0 15
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    你猜_3214阅读 11,043评论 0 118
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    王喂马_阅读 6,448评论 1 77
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    小姜先森o0O阅读 9,408评论 0 72