[Uni-app]生成动态验证码

目录

一、使用背景

二、完整代码示例

三、代码详解


一、使用背景

当我们在设计前端用户登陆界面时,除了用户账号和用户密码的校验,往往还需要简单的动态验证码验证是否为人机。例如,以下是某登录界面的图示,最下方一栏为动态验证码,当用户看不清时,可以点击验证码图片切换另一组验证码。

二、完整代码示例

<template>
  <div class="dynamic-code">
    <div class="code-container">
      <div class="code">{{ code }}</div>
    </div>
    <button @click="generateCode">看不清,换一张</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      code: '', // 存储验证码
      characters: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', // 允许的字符
    };
  },
  methods: {
    generateRandomCode() {
      // 生成随机四位数字加大小写字母验证码
      let result = '';
      for (let i = 0; i < 4; i++) {
        const randomIndex = Math.floor(Math.random() * this.characters.length);
        result += this.characters[randomIndex];
      }
      this.code = result;
    },
    generateCode() {
      this.generateRandomCode();
    },
  },
  mounted() {
    this.generateCode(); // 组件挂载后生成验证码
  },
};
</script>

<style>
.dynamic-code {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  height: 100vh;
}

.code-container {
  font-size: 24px;
  font-weight: bold;
  margin-bottom: 20px;
  padding: 10px 20px;
  border: 2px solid #333;
  border-radius: 5px;
}

button {
  font-size: 18px;
  padding: 10px 20px;
  background-color: #007aff;
  color: #fff;
  border: none;
  border-radius: 5px;
  cursor: pointer;
}
</style>

运行结果展示

当我们点击“看不清,换一张”时,验证码内容也会随之切换

三、代码详解

首先,我们在template里写好框架。同时为button组件绑定好generateCode事件,在实际情况中,我们可以直接给验证码图片绑定该事件,但在本案中为了方便显示切换过程,故将两者分离

<template>
  <div class="dynamic-code">
    <div class="code-container">
      <div class="code">{{ code }}</div>
    </div>
    <button @click="generateCode">看不清,换一张</button>
  </div>
</template>

之后,我们在script中写好事件实现代码。在data中,我们设置characters的值为'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',即让验证码内容从大小写字母和数字中随机生成;在methods方法中,我们写下 generateRandomCode()来在characters中随机抽取四个字符并将其拼接到result中,最后把result赋值给code用来存储验证码;在generateCode()中调用刚刚写的函数,同时使用mounted挂载,事件部分便全部完成。

<script>
export default {
  data() {
    return {
      code: '', // 存储验证码
      characters: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', // 允许的字符
    };
  },
  methods: {
    generateRandomCode() {
      // 生成随机四位数字加大小写字母验证码
      let result = '';
      for (let i = 0; i < 4; i++) {
        const randomIndex = Math.floor(Math.random() * this.characters.length);
        result += this.characters[randomIndex];
      }
      this.code = result;
    },
    generateCode() {
      this.generateRandomCode();
    },
  },
  mounted() {
    this.generateCode(); // 组件挂载后生成验证码
  },
};
</script>

最后,我们在style中写好每个组件的样式,这里可以根据需求在.code-container中调整验证码字符的样式,以让其看起来更加“难以分辨”

<style>
.dynamic-code {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  height: 100vh;
}

.code-container {
  font-size: 24px;
  font-weight: bold;
  margin-bottom: 20px;
  padding: 10px 20px;
  border: 2px solid #333;
  border-radius: 5px;
}

button {
  font-size: 18px;
  padding: 10px 20px;
  background-color: #007aff;
  color: #fff;
  border: none;
  border-radius: 5px;
  cursor: pointer;
}
</style>

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Uni-app是一款跨平台开发框架,而Uni-Cloud则是一个为开发者提供云端服务的平台。实现图形验证码可以使用Uni-Cloud的云函数功能,具体步骤如下: 1. 在Uni-Cloud中创建一个云函数,命名为`getVerificationCode`; 2. 在云函数中引入`jimp`模块,用于生成验证码图片。 ```javascript const jimp = require('jimp'); ``` 3. 定义生成验证码的函数`generateCode`,该函数接受两个参数,分别是验证码长度和验证码图片的宽度和高度。 ```javascript async function generateCode(length, width, height) { const code = [...Array(length)].map(() => (~~(Math.random() * 36)).toString(36)).join(''); const image = new jimp(width, height, '#fff'); const font = await jimp.loadFont(jimp.FONT_SANS_64_BLACK); image.print(font, 0, 0, code); return { code, buffer: await image.getBufferAsync(jimp.MIME_PNG) }; } ``` 4. 在云函数的主函数中,调用`generateCode`函数生成验证码,并将验证码的`code`和图片的`buffer`返回给前端。 ```javascript exports.main = async (event) => { const { length = 4, width = 200, height = 100 } = event.queryStringParameters || {}; const { code, buffer } = await generateCode(length, width, height); return { code: 0, message: 'success', data: { code, buffer: buffer.toString('base64') } }; }; ``` 5. 在前端页面中,通过Uni-Cloud的API调用云函数,获取验证码图片的`base64`编码,并将其显示在页面上。 ```javascript uniCloud.callFunction({ name: 'getVerificationCode', data: { length: 4, width: 200, height: 100 }, success(res) { const { code, buffer } = res.result.data; if (code === 0) { const base64ImgUrl = `data:image/png;base64,${buffer}`; // 将base64编码转换成图片并显示在页面上 } }, fail(err) { console.error(err); } }); ``` 以上就是使用Uni-Cloud实现图形验证码的步骤。需要注意的是,本示例仅供参考,实际使用时还需要进行适当的修改和优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值