当前位置: 首页 > news >正文

复制 生成二维码

一、安装插件

1、复制

npm install -g copy-to-clipboard

import copy from 'copy-to-clipboard';

2、生成二维码 & 下载

npm install -g qrcode

import QRCode from 'qrcode.react';

二、功能:生成二维码 & 下载

效果图

1、常规使用(下载图片模糊)

会有个问题:生成的二维码设置了 28px,下载的时候也是 28px,使用图片放大下载的图片就模糊。

        renderer: ({ record }) => {const url = record.get('registrationUrl');const downloadQRCode = () => {const canvas = document.getElementById('qrCodeEl');const image = canvas.toDataURL('image/png');const link = document.createElement('a');link.download = 'qrcode.png';link.href = image;link.click();};return (<>{url && (<div className={styles.registrationSource_down}><QRCodeid="qrCodeEl"value={url}size={28}level="H"includeMargin={true}style={{ border: '1px solid rgb(233, 238, 242)' }}/><span style={{ cursor: 'pointer' }} onClick={downloadQRCode}><imgsrc={require('@/assets/imgs/down.png')}alt="下载二维码"/></span></div>)}</>);},

2、隐藏大尺寸二维码(推荐)

        renderer: ({ record }) => {const url = record.get('registrationUrl');const downloadRef = useRef<HTMLDivElement>(null);const downloadQRCode = () => {if (!downloadRef.current) return;const canvas = downloadRef.current.querySelector('canvas');if (!canvas) return;const image = canvas.toDataURL('image/png');const link = document.createElement('a');link.download = 'qrcode.png';link.href = image;link.click();};return (<>{url && (<div className={styles.registrationSource_down}>{/* 显示用小尺寸(28px) */}<QRCodevalue={url}size={28}level="H"includeMargin={true}style={{ border: '1px solid rgb(233, 238, 242)' }}/>{/* 隐藏的大尺寸(100px)仅用于下载 */}<div style={{ display: 'none' }} ref={downloadRef}><QRCodevalue={url}size={160}level="H"includeMargin={true}/></div><span style={{ cursor: 'pointer' }} onClick={downloadQRCode}><imgsrc={require('@/assets/imgs/down.png')}alt="下载二维码"/></span></div>)}</>);},

三、复制

效果图

1、功能实现

        renderer: ({ record }) => {const url = record.get('registrationUrl');const handleCopy = () => {copy(url);message.success(languageConfig('tips.copySuccess', '复制成功!'),1.5,'top',);};return (<><span>{url}</span><spanstyle={{ marginLeft: '6px', cursor: 'pointer' }}onClick={handleCopy}><img src={require('@/assets/imgs/copy.svg')} alt="" /></span></>);},

四、具体场景

需求:根据'输入内容'生成url(可复制),再根据url生成图片(可下载)

效果图

1、功能实现

import {Form,Modal,useDataSet,message,TextField,Button,
} from 'choerodon-ui/pro';
import React, { useEffect, useRef, useState } from 'react';
import { LabelLayout } from 'choerodon-ui/pro/lib/form/enum';
import { FieldType } from 'choerodon-ui/dataset/data-set/enum';
import formatterCollections from 'hzero-front/lib/utils/intl/formatterCollections';
import {commonModelPrompt,languageConfig,prdTemCode,
} from '@/language/language';
import {RegistrationRecord,RegistrationSourceCreateProps,
} from '@/interface/registrationSource/main';
import { organizationId } from '@/common/config';
import {getRegistrationSourceDetail,postRegistrationSourceEdit,
} from '@/api/registrationSource/main';
import '@/assets/styles/c7n.less';
import { ButtonColor, FuncType } from 'choerodon-ui/pro/lib/button/enum';
import copy from 'copy-to-clipboard';
import QRCode from 'qrcode.react';
import styles from '../list/main.less';const CreateModel: React.FC<RegistrationSourceCreateProps> = ({/** 控制弹框显示/隐藏 */visible,/** 设置弹框显示/隐藏的回调函数 */setVisible,/** 弹框关闭后回调函数 */onSelect,infoData,
}) => {const { edit, id } = infoData;const url = 'http://wwww.shuaishuaige.com/login';/** ds */const [, setUpdateDs] = useState(new Date().getTime());const formDataDs = useDataSet(() => {return {autoCreate: true,fields: [{name: 'registrationSource',type: FieldType.string,label: languageConfig('registrationSource.label.registrationSource','注册来源',),placeholder: languageConfig('registrationSource.label.registrationSource','注册来源',),maxLength: 30,required: true,},{name: 'registrationCode',type: FieldType.string,},{name: 'registrationUrl',type: FieldType.string,},],events: {update: () => {setUpdateDs(new Date().getTime());},},};}, []);/** 详情 */const getDetail = async () => {const res = await getRegistrationSourceDetail({ id });// console.log('详情res', res);formDataDs.current?.set({...res,});};useEffect(() => {if (visible) {formDataDs.loadData([{}]);if (edit) {getDetail();}openModal();}}, [visible]);/** 弹框打开 */const openModal = () => {Modal.open({title: edit? languageConfig('btn.edit.registrationSource', '编辑注册来源'): languageConfig('btn.add.registrationSource', '新增注册来源'),style: { width: '400px' },closable: true,maskClosable: true,keyboardClosable: false,onClose: () => {setVisible(false);},children: <Box />,onOk: async () => {const validate = await formDataDs.current?.validate(true);if (!validate) return false;const {id,objectVersionNumber,registrationSource,registrationCode,registrationUrl,} = formDataDs.current?.toData() || {};// 提交参数const params: RegistrationRecord = {registrationSource,registrationCode,registrationUrl,registrationStatus: 'Y',tenantId: organizationId,...(id ? { id, objectVersionNumber } : {}),};const res = await postRegistrationSourceEdit(params);if (res.failed) {message.error(res.message, 1.5, 'top');return false;}message.success(languageConfig('tips.operationSuccess', '操作成功!'),1.5,'top',);onSelect();},});};/** 内容 */const Box = () => {const [forceUpdate, setForceUpdate] = useState(false);useEffect(() => {const handler = () => {setForceUpdate(prev => !prev);};formDataDs.addEventListener('update', handler);return () => formDataDs.removeEventListener('update', handler);}, []);/** 复制 */const handleCopy = () => {const { registrationUrl } = formDataDs.current?.toData() || {};copy(registrationUrl);message.success(languageConfig('tips.copySuccess', '复制成功!'),1.5,'top',);};/** 下载 */const downloadRef = useRef<HTMLDivElement>(null);const downloadQRCode = () => {if (!downloadRef.current) return;const canvas = downloadRef.current.querySelector('canvas');if (!canvas) return;const image = canvas.toDataURL('image/png');const link = document.createElement('a');link.download = 'qrcode.png';link.href = image;link.click();};/** 生成url 和 图片 */const handleGenerate = async () => {const { registrationSource, registrationCode } =formDataDs.current?.toData() || {};// 1、code 不存在if (!registrationCode) {// 调用 apiconst res = await postRegistrationSourceEdit({registrationSource,tenantId: organizationId,});if (res.failed) {message.error(res.message, 1.5, 'top');return false;}formDataDs.loadData([res]);// url 接接const linkUrl = `${url}?RE=${res?.registrationCode}`;formDataDs.current?.set('registrationUrl', linkUrl);}// 2、code 存在const linkUrl = `${url}?RE=${formDataDs.current?.get('registrationCode',)}`;formDataDs.current?.set('registrationUrl', linkUrl);};return (<div className="ltc-c7n-style"><FormdataSet={formDataDs}columns={1}labelWidth={180}labelLayout={LabelLayout.vertical}useColon={false}><TextFieldname="registrationSource"onChange={val => {if (val === null) {formDataDs.current?.set('registrationUrl', '');}}}clearButton/><div style={{ marginTop: '4px' }}><ButtonfuncType={FuncType.raised}color={ButtonColor.primary}disabled={formDataDs.current?.get('registrationSource') ? false : true}onClick={handleGenerate}>{languageConfig('registrationSource.btn.generateUrl','生成url & 二维码',)}</Button></div>{formDataDs.current?.get('registrationUrl') && (<><div className={styles.registrationSource_url}><div className={styles.registrationSource_url_title}>{languageConfig('monthlyReports.label.registrationUrl','注册url',)}</div><div className={styles.registrationSource_url_text}><span>{formDataDs.current?.get('registrationUrl')}</span><Button funcType={FuncType.link} onClick={handleCopy}>{languageConfig('tips.copy', '复制')}</Button></div><divclassName={styles.registrationSource_url_title}style={{ marginTop: '16px' }}>{languageConfig('monthlyReports.label.registrationQrCode','注册二维码',)}</div><div className={styles.registrationSource_url_qrCode}>{/* 二维码 */}<div className={styles.registrationSource_url_qrCode_pic}>{/* 显示用小尺寸(64px) */}<QRCodevalue={formDataDs.current?.get('registrationUrl')}size={64}level="H"includeMargin={true}style={{ border: '1px solid rgb(233, 238, 242)' }}/>{/* 隐藏的大尺寸(100px)仅用于下载 */}<div style={{ display: 'none' }} ref={downloadRef}><QRCodevalue={formDataDs.current?.get('registrationUrl')}size={160}level="H"includeMargin={true}/></div></div>{/* 下载 */}<Button funcType={FuncType.link} onClick={downloadQRCode}>{languageConfig('tips.qrCodeTip', '下载')}</Button></div></div></>)}</Form></div>);};return <></>;
};export default formatterCollections({code: [prdTemCode, commonModelPrompt],
})(CreateModel);

相关文章:

  • 高德是中国的还是外国的深圳网站关键词排名优化
  • 网站建设功能评估表论坛排名
  • 邦策网站建设长沙网站推广
  • 做网站美工的前途怎么样百度网盘搜索引擎入口官网
  • 网页设计网站怎么放到域名里百度识图在线使用
  • 建设网站专业公司哪家好宁波网站关键词排名推广
  • 麒麟V10操作系统离线安装Docker、Docker compose和1Panel
  • 鸿蒙 Stack 组件深度解析:层叠布局的核心应用与实战技巧
  • 6.24_JAVA_微服务_Elasticsearch搜索
  • 用Rust写平衡三进制加法器
  • 华为云Flexus+DeepSeek征文|基于华为云Flexus Dify复用优秀 AI Agent 应用教程
  • TMS汽车热管理系统HILRCP解决方案
  • FastMCP+python简单测试
  • Jenkins+Jmeter+Ant接口持续集成
  • 信创建设,如何统一管理异构服务器的认证、密码、权限管理等?
  • 配置自己的NTP 服务器做时间同步
  • 从零学习linux(2)——管理
  • 缺少 XML 验证与资源注入修复
  • Revisiting Image Deblurring with an Efficient ConvNet论文阅读
  • Joblib库多进程/线程使用(一):使用generator参数实现边响应边使用
  • leetcode61.旋转链表
  • 物流业最后的“人工堡垒”即将失守?机器人正式接管卡车装卸工作
  • java数据类型详解篇
  • 【机器学习深度学习】机器学习核心概念图谱:样本、目标函数、损失函数、特征及训练
  • 【源码】Reactive 源码
  • 【CS创世SD NAND征文】基于全志V3S与CS创世SD NAND的物联网智能路灯网关数据存储方案