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.rhkb.cn/news/419127.html

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

相关文章

从零开始写论文:如何借助ChatGPT生成完美摘要?

AIPaperGPT&#xff0c;论文写作神器~ https://www.aipapergpt.com/ 在写论文的过程中&#xff0c;摘要是一个非常重要的部分&#xff0c;它能够帮助读者快速理解论文的核心内容&#xff0c;决定是否进一步阅读全文。但是许多学生在写摘要的时候常常感到困惑&#xff0c;不知…

基于Java的宿舍报修管理系统的设计与实现(论文+源码)_kaic

基于Java的宿舍报修管理系统的设计与实现(论文源码)_kaic 摘  要 随着教育改革‎‏的不断‎‏深入&#xff0c;‎‏学校宿‎‏舍的管‎‏理体系‎‏也在不‎‏断地完‎‏善&#xff0c;校园后勤服务是学校管理的重要工作&#xff0c;学校提供优秀的后勤服务&#xff0c;能提…

自制游戏手柄--电位器的使用

在前面的讨论中&#xff0c;我们考虑了使用陀螺仪来获取手柄的运动情况来进行瞄准&#xff0c; 自制实战吃鸡手柄原理-CSDN博客 也可以使用图像识别来实现&#xff0c;这里我们再考虑下使用电位器来获取运动状态&#xff0c;一个电位器可以获取到一个平面上的旋转情况&#x…

C++——类与对象(二)

目录 引言 类的默认成员函数 构造函数 1.构造函数的概念 2.注意事项 初始化列表 1.初始化列表的概念 2.注意事项 析构函数 1.析构函数的概念 2.注意事项 拷贝构造函数 1.拷贝构造函数的概念 2.注意事项 运算符重载 1.运算符重载的概念 2.注意事项 赋值运算符…

开源网安引领AIGC+开发安全,智能防护铸就软件安全新高度

近日&#xff0c;国内网络安全领域知名媒体数说安全正式发布了《2024年中国网络安全市场100强》和《2024年中国网络安全十大创新方向》。开源网安凭借在市场表现力、资源支持力以及产品在AI方向的创新力上的优秀表现成功入选百强榜单&#xff0c;并被评为“AIGC开发安全”典型厂…

Percona 开源监控方案 PMM 详解

文章目录 前言1. 安装部署1.1 Server 安装1.2 Client 安装 2. 监控数据库2.1 MySQL2.2 PostgreSQL 3. Dashboard 介绍总结 前言 Percona Monitoring and Management (PMM) 是 Percona 公司基于业界流行的组件 Prometheus 和 Grafana 设计开发的一体化数据库监控解决方案。本篇…

【H2O2|全栈】关于HTML(3)HTML基础(二)

HTML相关知识 目录 HTML相关知识 前言 准备工作 标签的具体分类&#xff08;二&#xff09; 本文中的标签在什么位置使用&#xff1f; 本期前置知识点 超文本 超文本引用和源属性 图片标签 锚链接 iframe 锚点 预告和回顾 后话 前言 本系列博客将分享HTML相关…

【数据结构】你知道什么是二叉树的顺序存储结构吗?

文章目录 前言1. 顺序结构2. 实现顺序结构二叉树2.1 堆的概念与结构2.2 堆的实现2.2.1 向上调整算法2.2.2 向下调整算法 3. 结语 前言 二叉树一般可以使用两种结构存储&#xff0c;一种顺序结构&#xff0c;一种链式结构。本文将要介绍的是二叉树的顺序存储结构。 1. 顺序结构…

python安装以及访问openAI API

安装python 我是python小白&#xff0c;所以需要一步一步来&#xff0c;先安装。 一口吃不成胖子&#xff0c;记住。 从官网下载python&#xff0c;目前最新版本是3.12&#xff0c;但是据说稳定版3.11更好一点&#xff0c;所以&#xff0c;下载3.11&#xff0c;注意不要下载…

stm32的内部时钟源 | RC震荡电路

文章目录 前言学习了解 前言 了解到 内部高速RC振荡器&#xff08;HSI&#xff09;就是RC震荡器实现的&#xff0c;故想对RC震荡做些了解与分析。 学习了解 【不需要晶振&#xff0c;也可产生时钟脉冲&#xff01;RC振荡器的工作原理&#xff0c;维恩电桥振荡器&#xff01;…

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节&#xff0c;字符串小于等于15直接保存在栈上&#xff0c;超过之后才会使用new分配。

Kafka 分布式消息系统详细介绍

Kafka 分布式消息系统 一、Kafka 概述1.1 Kafka 定义1.2 Kafka 设计目标1.3 Kafka 特点 二、Kafka 架构设计2.1 基本架构2.2 Topic 和 Partition2.3 消费者和消费者组2.4 Replica 副本 三、Kafka 分布式集群搭建3.1 下载解压3.1.1 上传解压 3.2 修改 Kafka 配置文件3.2.1 修改z…

axure之变量

一、设置我们的第一个变量 1、点击axure上方设置一个全局变量a 3 2、加入按钮、文本框元件点击按钮文档框展示变量值。 交互选择【单击时】【设置文本】再点击函数。 点击插入变量和函数直接选择刚刚定义的全局变量&#xff0c;也可以直接手动写入函数(注意写入格式。) 这…

Gitflow基础知识

0.理想状态 现状 听完后的理想状态 没使用过 git 知道 git 是什么&#xff0c;会用 git 基础流程命令 用过 git&#xff0c;但只通过图形化界面操作 脱离图形化界面操作&#xff0c;通过 git 命令操作 会 git 命令 掌握 gitflow 规范&#xff0c;合理使用 rebase 和解决…

spark sql 优化

1. 配置 比例内存 : core 1:2 2. 增加 core 数可以增加 执行任务的 线程数 3. 计算有大表&#xff0c;并发生shuffle 时&#xff0c;生成的任务数是由spark.sql.shuffle.partitions 决定的&#xff0c;所以针对大表shuffle &#xff0c;要增加spark.sql.shuffle.partitio…

C++笔记20•数据结构:哈希(Hash)•

哈希 1.无序的关联式容器&#xff08;unordered_map&unordered_set&#xff09; unordered_map与unordered_set几乎与map与set是一样的&#xff0c;只是性能unordered_map与unordered_set比map与set更优一些。还有就是unordered_map与unordered_set是无序的&#xff0c;…

差异基因富集分析(R语言——GOKEGGGSEA)

接着上次的内容&#xff0c;上篇内容给大家分享了基因表达量怎么做分组差异分析&#xff0c;从而获得差异基因集&#xff0c;想了解的可以去看一下&#xff0c;这篇主要给大家分享一下得到显著差异基因集后怎么做一下通路富集。 1.准备差异基因集 我就直接把上次分享的拿到这…

服务器流量监控工具vnStat的简单使用以及关于Linux的软中断信号(signal)的一点内容

一、服务器流量监控工具vnStat的简单使用 vnStat是为Linux和BSD设计的基于控制台的网络流量监控工具&#xff0c;通过它可以非常方便在命令行查看流量统计情况。它可以保留某个或多个所选择的网络接口的网络流量日志。为了生成日志&#xff0c;vnStat使用内核提供的信息。换句话…

misc流量分析

一、wireshark语法 1、wireshark过滤语法 &#xff08;1&#xff09;过滤IP地址 ip.srcx.x..x.x 过滤源IP地址 ip.dstx.x.x.x 过滤目的IP ip.addrx.x.x.x 过滤某个IP &#xff08;2&#xff09;过滤端口号 tcp.port80tcp.srcport80 显示TCP的源端口80tcp.dstport80 显示…

Python和C++多尺度导图

&#x1f3af;要点 热化学属性观测蒙特卡罗似然比灵敏度分析时间尺度上动力学化学催化反应动力学建模自动微分电化学分析模型反应动力学数学模型渔业生态不确定性模型敏感性分析空间统计地理模型分析技术多维数据表征实现生成艺术图案流苏物体长度比&#xff0c;面积比和复杂度…