vite+vue3+typescript+elementPlus前端实现电子证书查询系统

实现背景:之前电子证书的实现是后端实现的,主要采用GD库技术,在底图上添加文字水印和图片水印实现的。这里采用前端技术实现电子证书的呈现以及点击证书下载,优点是:后端给前端传递的是一组数据,不需要传证书的图片,交互所需数据流大大减少了。后端不需要生成证书,就不需要额外开辟存储证书的空间,当用户量很大时,节省开支。

前端技术栈:vite+vue3+typescript+elementPlus

证书查询首页实现,代码如下:

<template><el-row class="header"><el-col :span="24"><el-text>电子证书查询系统</el-text></el-col></el-row><el-row class="main"><el-col :span="24"><el-card style="max-width: 680px" shadow="always"><template #header><div class="card-header"><span>证书查询系统</span></div></template><el-formref="ruleFormRef":model="ruleForm":rules="rules"label-width="auto"class="demo-ruleForm":size="formSize":label-position="labelPosition"status-icon><el-form-item label="&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" prop="name"><el-input v-model="ruleForm.name" placeholder="请输入姓名" /></el-form-item><el-form-item label="身份证号" prop="idNo"><el-input v-model="ruleForm.idNo" placeholder="请输入身份证号" /></el-form-item><el-form-item label="证书编号" prop="certificateNo"><el-input v-model="ruleForm.certificateNo" placeholder="请输入证书编号" /></el-form-item><el-form-item><el-button type="primary" @click="submitForm(ruleFormRef)"> 查询 </el-button></el-form-item></el-form></el-card></el-col></el-row>
</template><script lang="ts" setup name="CertificateIndex">
import { reactive, ref } from 'vue'
import type { ComponentSize, FormInstance, FormRules, FormProps } from 'element-plus'
import { ElMessage } from 'element-plus'
import { createItem } from '../services/crudService'
import { useRouter } from 'vue-router'const router = useRouter()interface RuleForm {name: stringidNo: stringcertificateNo: string
}const formSize = ref<ComponentSize>('large')
const labelPosition = ref<FormProps['labelPosition']>('left')
const ruleFormRef = ref<FormInstance>()
const ruleForm = reactive<RuleForm>({name: '',idNo: '',certificateNo: ''
})const rules = reactive<FormRules<RuleForm>>({name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],idNo: [{ required: true, message: '请输入身份证号', trigger: 'blur' }],certificateNo: [{ required: true, message: '请输入证书编号', trigger: 'blur' }]
})const submitForm = async (formEl: FormInstance | undefined) => {if (!formEl) return// Validate the formawait formEl.validate()// If validation passes, call createItem with the form dataconst { data } = await createItem(ruleForm)if (!data.id) {ElMessage({message: '暂无此人相关证书!',type: 'warning'})return}router.push({ name: 'CertificateDetail', query: { data: JSON.stringify(data) } })
}
</script><style scoped style="scss">
.header {background-color: #1174c2;width: 100%;height: 50px;.el-col {text-align: center;vertical-align: center;padding: 0.5rem 0;.el-text {font-size: 1.5rem;color: #fff;}}
}.main {margin-top: 100px;.el-col {.el-card {margin: 0 auto;.card-header {text-align: center;vertical-align: center;font-size: 1.5rem;background-color: #1174c2;color: #fff;width: 100%;padding: 0.8rem 0;}.el-form {.el-form-item {margin: 2rem auto;}.el-button {font-size: 1.5rem;padding: 1.5rem 0;width: 100%;background-color: #1174c2;}}}}
}
</style>

证书查询首页实现,效果呈现如下:

在这里插入图片描述

电子证书查询结果实现,代码如下:

<template><div class="main"><divclass="card-header p-2 w-full bg-[#1174c2] text-[#fff] text-center text-xl fixed top-0 left-0 w-full z-50"><span>电子证书查询结果</span></div><el-card shadow="always" class="mt-20"><div class="content" ref="contentToCapture"><div class="logo w-28 h-10 mt-4"></div><div class="text-center mt-20 mb-6 text-lg dirBlod font-bold">内部审核员证书</div><div class="mb-4 main"><img:src="crossOriginImageSrc"alt="Cross-origin image"style="width: 88px; height: 118px"fit="cover"/><div class="text-base mt-6">{{ form.name }}</div></div><div class="id text-base mb-4 dirBlod text-center">ID: {{ form.idNo }}</div><div class="text text-base"><div class="mb-4 dirBlod text-center">兹证明其参加了 {{ form.course }}</div><div class="ml-4 dirBlod">内部审核员培训课程并经考核合格,特发此证。</div></div><div class="footer mt-20"><div class="text-xs"><div class="dirBlod leading-6">发证日期 {{ form.authorizationDate }}</div><div class="dirBlod leading-6">编号 {{ form.certificateNo }}</div><div class="dirBlod leading-6">查询 {{ form.url }}</div></div><div class="text-base dirBlod gz-bg"><div class="gz-bg-img"></div>xx教育培训有限公司</div></div></div><div @click="captureAndDownload" class="text-center mt-5 text-blue-600 cursor-pointer">证书下载</div></el-card></div>
</template><script lang="ts" setup name="CertificateDetail">
import { ref, reactive, onMounted } from 'vue'
import { useRoute } from 'vue-router'
import html2canvas from 'html2canvas'
import { saveAs } from 'file-saver'
// 后端基本路径
const url = '/dev-api'
const route = useRoute()
const form = reactive(JSON.parse(route.query.data as string))
const crossOriginImageSrc = ref(url + form.path) // 示例跨域图片
const contentToCapture = ref<HTMLDivElement>()async function captureAndDownload() {if (!contentToCapture.value) returntry {const canvas = await html2canvas(contentToCapture.value, {useCORS: true // 允许跨域请求})const imgDataUrl = canvas.toDataURL('image/png')const uniqueBlobUrl = URL.createObjectURL(new Blob([await fetch(imgDataUrl).then((res) => res.blob())], { type: 'image/png' }))saveAs(uniqueBlobUrl, 'screenshot.png')} catch (error) {console.error('Error capturing screenshot:', error)}
}
</script>
<style scoped lang="scss">
.main {display: flex;flex-direction: column;justify-content: center;align-items: center;
}
.card-header {height: 50px;
}
.el-card {margin-top: 60px;margin-bottom: 60px;width: 620px;
}.content {position: relative;background: url(@/assets/images/bg.png) no-repeat;background-size: 100% 100%;height: 880px;padding: 106px;font-family: 'dirBlod', sans-serif;.logo {background: url(@/assets/images/logo.png) no-repeat;background-size: 100% 100%;}
}.footer {display: flex;justify-content: space-between;align-items: center;
}
.dirBlod {font-family: 'dirBlod', sans-serif;
}
.gz-bg {position: relative;.gz-bg-img {position: absolute;top: -280%;left: 20%;width: 120px;height: 120px;background: url(@/assets/images/seal.png) no-repeat;background-size: 100% 100%;}
}
</style>

电子证书查询结果实现,效果呈现如下:

在这里插入图片描述
小结:
1、节省了存储电子证书图片的空间;
2、后端负责数据,前端负责呈现,实现更加灵活

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/52277.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据分析训练模型后输出模型评估报告

数据分析训练模型后输出模型评估报告 1、模型评估指标 1.1、概念: A:n个正样本,检测到是真值的数量 B:m个负样本,检测到是真值的数量 C:n个正样本,检测到假值的数量 D:m个负样本,检测到假值的数量 1.2、准确率(Accuracy) 正确预测的样本数量与总样本数量的比值。…

笔记整理—内核!启动!—kernel部分(1)从汇编阶段到start_kernel

kernel起始与ENTRY(stext)&#xff0c;和uboot一样&#xff0c;都是从汇编阶段开始的&#xff0c;因为对于kernel而言&#xff0c;还没进行栈的维护&#xff0c;所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。 内核起始部分代码被解压代码调用&#xff0c…

Pinterest账号被封?试试这几种解封方法

Pinterest作为一个充满创意与灵感的视觉社交平台&#xff0c;吸引着大量用户和企业前来展示、收藏和分享他们的作品。然而&#xff0c;如同其他社交媒体平台一样&#xff0c;Pinterest也设立了一套严格的使用规则和监测机制&#xff0c;以保障平台内容的质量和用户的良好体验。…

2024 年keil5 注册机

注册鸡地址 百度网盘

Helm Deploy Online Rancher v2.9.1

文章目录 准备安装查看下载 准备 $ kubectl get node NAME STATUS ROLES AGE VERSION kube-master01 Ready control-plane 19d v1.29.5 kube-node01 Ready <none> 19d v1.29.5 kube-node02 Ready <none&…

SpringBoot+Redis极简整合

1 前言 Redis是现在最受欢迎的NoSQL数据库之一&#xff0c;下面将以最简洁的代码演示&#xff0c;在SpringBoot中使用redis。 2 下载安装Redis 2.1 下载 Redis3.x windows安装版下载地址 2.2 安装到任意位置 一直Next到完即可。 2.3 启动 打开安装目录&#xff0c;点击…

Bootstrap前端框架Glyphicons字体图标

115工具网收集提供Bootstrap前端框架Glyphicons字体图标库对照表​​​​​​​&#xff0c;Bootstrap前端UI,Glyphicons字体图标调用,Bootstrap按钮字体图标对照表,包括250多个来自Glyphicon Halflings的字体图标.项目中引用Bootstrap相关文件后即可直接调用下列图标class&quo…

使用图论技巧——有遍数限制的最短路

给定一个 n个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c; 边权可能为负数。 请你求出从 11 号点到 n 号点的最多经过 k 条边的最短距离&#xff0c;如果无法从 1 号点走到 n 号点&#xff0c;输出 impossible。 注意&#xff1a;图中可能 存在负权回路…

HTML生日蛋糕

目录 写在前面 完整代码 代码分析 系列文章 写在最后 写在前面 HTML实现的生日蛋糕来喽&#xff0c;小编亲测&#xff0c;发给好友可以直接打开哦。在代码的第183行可以写下对朋友的祝福&#xff0c;快拿去送给你的好朋友吧&#xff01; 完整代码 <!DOCTYPE html>…

整合Redis和RedisCacheManger

整合redis springboot在现在的版本中操作Redis数据库用到了lettuce&#xff0c;而不是Jedis&#xff0c;他们各有各的特点。Jedis以Redis命令作为方法名称&#xff0c;学习成本低&#xff0c;简单实用。但是Jedis实例是线程不安全的&#xff0c;多线程环境下需要基于连接池来使…

VSCode安装配置C语言(保姆级教程)

目录 引言 一、VS Code的卸载 1.卸载VS Code应用 ​编辑2.删除安装的插件 3.删除配置的信息 二、VS Code的安装 1.下载vscode 2.安装VS Code 三、VS Code配置C语言环境 1.安装插件 2.下载MinGW 3.添加路径 4.确认gcc位置 ​四、运行C语言程序 ​总结 引言 Vi…

揭开面纱--机器学习

一、人工智能三大概念 1.1 AI、ML、DL 1.1.1 什么是人工智能? AI&#xff1a;Artificial Intelligence 人工智能 AI is the field that studies the synthesis and analysis of computational agents that act intelligently AI is to use computers to analog and instead…

ja-netfilter的前世今生和非对称加密的欺骗原理

文章目录 ja-netfilter起源官网插件插件配置文件插件的综合应用更多用法 非对称加密欺骗原理非对称加密和数字证书激活过程和欺骗手段分析代码示例第一步&#xff1a;生成自签名证书脚本第二步&#xff1a;使用自签名证书对产品激活信息进行签名 样例数据样例激活码&#xff08…

go 和 java 技术选型思考

背景&#xff1a; go和java我这边自身都在使用&#xff0c;感受比较深&#xff0c;java使用了有7年多&#xff0c;go也就是今年开始的&#xff0c;公司需要所以就学了使用&#xff0c;发现这两个语言都很好&#xff0c;需要根据场景选择&#xff0c;我写下我这边的看法。 关于…

计算机网络27——Linux1

1、虚拟机网络前方路径内容&#xff1a;用户名机器名&#xff1a;/$ $表示普通用户&#xff0c;#表示root用户 2、Linux不分盘&#xff0c;都是绝对路径 /表示根目录&#xff0c;表示计算机文件夹下 ~是当前用户的家&#xff0c;表示home文件夹下自己的文件夹 3、bin文件夹…

Linux编译运行cpp源文件

安装build-essential包 打开Linux虚拟机后&#xff0c;打开terminal&#xff0c;输入以下指令&#xff0c;通过 apt 包管理器安装 build-essential 包&#xff0c;这个包包含了编译软件所需的基本工具和库。 sudo apt install build-essential 编写源代码 打开Text Editor…

MASt3R:从3D的角度来实现图像匹配(更新中)

Abstract 图像匹配是 3D 视觉中所有性能最佳算法和pipeline的核心组件。 然而&#xff0c;尽管匹配从根本上来说是一个 3D 问题&#xff0c;与相机姿态和场景几何结构有内在联系&#xff0c;但它通常被视为一个 2D 问题。因为匹配的目标是建立 2D 像素字段之间的对应关系&#…

STM32的GPIO使用

一、使用流程 1.使用RCC开启GPIO时钟 2.使用GPIO_Init 函数初始化GPIO 3.使用输出或输入函数控制GPIO口 二、RCC的常用函数 函数内容可通过这两个文件进行查看&#xff1a; RCC常用函数如下&#xff1a; void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalS…

我与Linux的爱恋:yum和vim以及gcc的使用

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;Linux的学习 文章目录 ​1.Linux软件包管理器yum2.Linux开发工具3.Linux编译器 vimvim的基本概念vim的基本操作vim正常模式命令集vim末行模式命令集vim操作总结批量化注释批量化去注释简…

Windows自动化应用程序已启动/未启动,有进程无进程情况-拽起应用程序

问题分析: 应用程序能够自动登录, 可以打开后自动登录情况 我的处理方案是: 先通过 pywinauto打开应用程序, 然后,关闭前台 然后通过WinAppDriver去再次连接, 把应用置于前台 从而继续后面的元素定位 # 需要启动Hworkfrom pywinauto.application import Application# 启动Appli…