mirror of
https://codeup.aliyun.com/67762337eccfc218f6110e0e/vue/fe-manage.git
synced 2025-12-10 03:16:44 +08:00
295 lines
7.0 KiB
Vue
295 lines
7.0 KiB
Vue
<template>
|
|
<a-modal
|
|
:visible="true"
|
|
:footer="null"
|
|
:title="null"
|
|
:centere="true"
|
|
:closable="false"
|
|
style="margin-top: 400px"
|
|
:zIndex="9999"
|
|
@cancel="close"
|
|
>
|
|
<div id="qrcode" class="QR">
|
|
<div class="qr_header"></div>
|
|
<div class="qr_main">
|
|
<div class="qrm_header">
|
|
|
|
<span>{{ title }}</span>
|
|
<div class="close_exit" @click="close"></div>
|
|
</div>
|
|
<div class="downloadCode" style="">
|
|
<div class="qrm_body">
|
|
<div class="qrm_body_info" style=" text-align: center;
|
|
display: flex;
|
|
align-self: center;
|
|
flex-wrap: wrap;
|
|
flex-direction: column-reverse;
|
|
align-content: center;
|
|
justify-content: center;
|
|
margin-bottom: 10px;
|
|
">
|
|
|
|
<div class="codename" :title="name">{{ name }}</div>
|
|
|
|
|
|
</div>
|
|
<QrcodeVue :value="url" :size="size" style="width: 200px; height: 200px"></QrcodeVue>
|
|
</div>
|
|
</div>
|
|
<div v-if="copyAble" class="codeUrl" :style="{ display: 'flex'}">
|
|
<div class="codeUrlLink">链接</div>
|
|
<a-input :value="url" disabled class="codeUrlInp"/>
|
|
<a-input
|
|
:value="url"
|
|
id="courseUrl"
|
|
class="codeUrlInp"
|
|
style="position: absolute; opacity: 0; z-index: -1"
|
|
/>
|
|
<div @click="copyUrl" class="codeUrlCopy">复制链接</div>
|
|
</div>
|
|
<div class="qrm_footer">
|
|
<span style="color: #387df7; cursor: pointer" @click="download(200)">下载二维码</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</a-modal>
|
|
</template>
|
|
<script setup>
|
|
import {defineProps, onMounted} from "vue";
|
|
import html2canvas from "html2canvas";
|
|
import QrcodeVue from "qrcode.vue";
|
|
import {message} from "ant-design-vue";
|
|
|
|
const props = defineProps({
|
|
close: {
|
|
type: Function,
|
|
default: () => ({})
|
|
},
|
|
ok: {
|
|
type: Function,
|
|
default: () => ({})
|
|
},
|
|
url: String,
|
|
copyAble: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
size: {
|
|
type: Number,
|
|
default: 800
|
|
},
|
|
name: String,
|
|
createName: String,
|
|
courseName: String,
|
|
title: {
|
|
type: String,
|
|
default: "二维码"
|
|
},
|
|
cancel: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
duration: {
|
|
type: Number,
|
|
default: 0
|
|
},
|
|
});
|
|
|
|
onMounted(() => props.duration && setTimeout(() => props.close(), props.duration));
|
|
|
|
function download() {
|
|
html2canvas(
|
|
document.querySelector(".downloadCode"),
|
|
{ useCORS: true,
|
|
allowTaint: true,
|
|
logging: true,
|
|
}
|
|
).then((canvas) => {
|
|
let a = document.createElement("a");
|
|
a.style.display = "none";
|
|
a.download = `${new Date().getTime()}.png`;
|
|
a.href = canvas.toDataURL("image/png");
|
|
document.body.appendChild(a);
|
|
a.click();
|
|
}).catch((err) => console.log('html2canvas',err));
|
|
}
|
|
|
|
function copyUrl() {
|
|
const input = document.createElement("input"); // 创建input对象
|
|
input.value = props.url;
|
|
document.body.appendChild(input); // 添加临时实例
|
|
input.select(); // 选择实例内容
|
|
document.execCommand("Copy"); // 执行复制
|
|
document.body.removeChild(input); // 删除临时实例
|
|
message.success("复制成功!");
|
|
}
|
|
</script>
|
|
<style lang="scss" scoped>
|
|
.QR {
|
|
z-index: 9999;
|
|
width: 520px;
|
|
background: #ffffff;
|
|
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.21);
|
|
position: absolute;
|
|
left: 50%;
|
|
top: 10%;
|
|
transform: translate(-50%, -50%);
|
|
|
|
.qr_header {
|
|
position: absolute;
|
|
width: calc(100%);
|
|
height: 40px;
|
|
background: linear-gradient(
|
|
rgba(78, 166, 255, 0.2) 0%,
|
|
rgba(78, 166, 255, 0) 100%
|
|
);
|
|
}
|
|
|
|
.qr_main {
|
|
width: 100%;
|
|
position: relative;
|
|
|
|
.qrm_header {
|
|
display: flex;
|
|
align-items: center;
|
|
padding-top: 20px;
|
|
padding-left: 26px;
|
|
font-size: 16px;
|
|
|
|
.title {
|
|
font-size: 16px;
|
|
font-weight: 600;
|
|
color: #333333;
|
|
line-height: 22px;
|
|
}
|
|
|
|
.close_exit {
|
|
position: absolute;
|
|
right: 42px;
|
|
cursor: pointer;
|
|
width: 20px;
|
|
height: 20px;
|
|
background-image: url(@/assets/images/coursewareManage/close.png);
|
|
background-size: 100% 100%;
|
|
}
|
|
}
|
|
|
|
.qrm_body {
|
|
width: 100%;
|
|
padding-top: 22px;
|
|
padding-bottom: 32px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
.qrm_body_info{
|
|
width: 100%;
|
|
|
|
}
|
|
.codename {
|
|
font-size: 18px;
|
|
font-weight: 400;
|
|
color: #333333;
|
|
line-height: 25px;
|
|
margin-bottom: 5px;
|
|
margin-left: 20px;
|
|
margin-right: 20px;
|
|
text-align: left;
|
|
overflow: hidden;
|
|
white-space: nowrap;
|
|
text-overflow: ellipsis;
|
|
max-width: 300px;
|
|
}
|
|
// .codename:hover{
|
|
// overflow: visible;
|
|
// }
|
|
}
|
|
|
|
.codeUrl {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
margin-bottom: 24px;
|
|
|
|
.codeUrlLink {
|
|
width: 72px;
|
|
height: 40px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 14px;
|
|
font-weight: 400;
|
|
color: #c7cbd2;
|
|
line-height: 20px;
|
|
border: 1px solid #c7cbd2;
|
|
border-right: 0px solid #c7cbd2;
|
|
}
|
|
|
|
.codeUrlInp {
|
|
width: 305px;
|
|
height: 40px;
|
|
border: 1px solid #c7cbd2;
|
|
}
|
|
|
|
.ant-input-disabled {
|
|
background-color: rgba(0, 0, 0, 0) !important;
|
|
}
|
|
|
|
.ant-input[disabled] {
|
|
background-color: rgba(0, 0, 0, 0) !important;
|
|
}
|
|
|
|
.codeUrlCopy {
|
|
width: 96px;
|
|
height: 40px;
|
|
background-color: #4ea6ff;
|
|
border-radius: 8px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 14px;
|
|
font-weight: 400;
|
|
color: #ffffff;
|
|
line-height: 20px;
|
|
cursor: pointer;
|
|
margin-left: 8px;
|
|
}
|
|
}
|
|
|
|
.qrm_footer {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
margin-bottom: 44px;
|
|
|
|
.qrmbtn {
|
|
width: 80px;
|
|
height: 32px;
|
|
display: flex;
|
|
line-height: 32px;
|
|
justify-content: center;
|
|
border-radius: 4px;
|
|
border: 1px solid #387df7;
|
|
cursor: pointer;
|
|
|
|
.btntext {
|
|
color: #387df7;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
.codeModal {
|
|
.ant-modal {
|
|
.ant-modal-content {
|
|
width: 479px !important;
|
|
}
|
|
}
|
|
}
|
|
</style>
|
|
<style lang="scss">
|
|
.ant-modal-body {
|
|
padding: 0 !important;
|
|
}
|
|
|
|
</style> |