tedsign vue3 web-端框架中封装一个验证码组件 以及对应node 接口逻辑说明

一个这样的组件

我直接上代码了

复制代码
<template>
  <t-loading size="small" :loading="loading" show-overlay>
    <div class="container" @click="refresh">
      <div v-if="svg" class="svg" v-html="svg" />
      <img v-else class="base64" :src="base64" alt="" />
    </div>
  </t-loading>
</template>
<script lang="ts" setup>
import { MessagePlugin } from 'tdesign-vue-next';
import { onMounted, ref } from 'vue';

import { getCaptcha } from '@/api/login';

const emit = defineEmits(['update:modelValue', 'change']);
// base64
const base64 = ref('');
// svg2
const svg = ref('');
const loading = ref(false)

async function refresh() {
  loading.value = true
    await getCaptcha({ height: 40,
      width: 150,
    })
    .then(({ captchaId, data }) => {
      if (data.includes(';base64,')) {
        base64.value = data;
      } else {
        svg.value = data;
      }
      emit('update:modelValue', captchaId);
      emit('change', {
        base64,
        svg,
        captchaId,
      });
    })
    .catch((err) => {
      MessagePlugin.error(err.message);
    }).finally(()=>{
      loading.value = false
    });
}

onMounted(() => {
  refresh();
});

defineExpose({
  refresh,
});
</script>
<style lang="less" scoped>
.container {
  height: 40px;
  width: 150px;
  cursor: pointer;
  .svg {
    height: 100%;
    position: relative;
  }
  .base64 {
    height: 100%;
  }
}
</style>

组件的使用

复制代码
  <t-form-item class="captcha-code" name="captchaCode">
        <t-input v-model="formData.captchaCode" size="large" placeholder="请输入验证码" />
        <t-button size="large">
          <template #content>
            <captcha
              ref="captchaRef"
              v-model="formData.captchaId"
              @change="
                () => {
                  formData.captchaCode = '';
                }
              "
            ></captcha>
          </template>
        </t-button>
      </t-form-item>

顺便在这里提一下 我这对接的是node 的接口 验证码是后端返回的svg 我把验证码svg 后端逻辑也说一下啊

复制代码
import * as svgCaptcha from 'svg-captcha';
import * as svgToDataURL from 'mini-svg-data-uri';
这里用到了两个插件

  /**
   * 验证码
   * @param type 图片验证码类型 svg
   * @param width 宽
   * @param height 高
   */
  async captcha(type: string, width = 150, height = 50) {
    const svg = svgCaptcha.create({
      ignoreChars: 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM',
      width,
      height,
    });
    const result = {
      captchaId: uuid(),
      data: svg.data.replace(/"/g, "'"),
    };
    // 文字变白
    const rpList = [
      '#111',
      '#222',
      '#333',
      '#444',
      '#555',
      '#666',
      '#777',
      '#888',
      '#999',
    ];
    rpList.forEach(rp => {
      result.data = result.data['replaceAll'](rp, '#fff');
    });
    if (type === 'base64') {
      result.data = svgToDataURL(result.data);
    }
    // 半小时过期
    await this.cacheManager.set(
      `verify:img:${result.captchaId}`,
      svg.text.toLowerCase(),
      { ttl: 1800 }
    );
    return result;
  }  

以上的node 的service 接口的逻辑

这是前端收到的data

相关推荐
陈随易16 小时前
Postman 被曝自动往 Claude Code 和 Codex 装插件
前端·后端·程序员
云-缩影17 小时前
拆解 AI 图像生成应用的后端架构:ECS、OSS 和大模型 API 怎么配合
java·spring boot·后端
Dream-Y.ocean18 小时前
鸿蒙PC平台宅匠 3D 室内设计适配实战:基于 Electron 壳方案的 Three.js 双渲染引擎与参数化户型编辑器开发
javascript·3d·harmonyos
考虑考虑19 小时前
Posrgresql恢复.backup文件
数据库·后端·postgresql
Csvn19 小时前
性能监控
前端
Highcharts.js19 小时前
Highcharts Gantt使用符号的自定义数据标签开发甘特图示例
javascript·甘特图·highcharts·图表开发·实战代码·响应式图表
无奈何杨19 小时前
风控决策系统决策流,策略模式,权重、顺序、投票、最坏
后端
Csvn19 小时前
构建工具
前端
FRing0320 小时前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
Patrick_Wilson20 小时前
Go 为什么需要 defer?从函数怎么收尾说起
后端·go·编程语言