mirror of
https://github.com/palxiao/poster-design.git
synced 2025-06-08 03:19:59 +08:00
138 lines
3.3 KiB
Vue
138 lines
3.3 KiB
Vue
<!--
|
|
* @Author: ShawnPhang
|
|
* @Date: 2022-03-13 15:59:52
|
|
* @Description: 二维码
|
|
* @LastEditors: ShawnPhang <site: book.palxp.com>
|
|
* @LastEditTime: 2023-06-29 15:54:10
|
|
-->
|
|
<template>
|
|
<div
|
|
:id="`${params.uuid}`"
|
|
ref="widgetRef"
|
|
:class="['w-qrcode', { 'layer-lock': params.lock }]"
|
|
:style="{
|
|
position: 'absolute',
|
|
left: params.left - parent.left + 'px',
|
|
top: params.top - parent.top + 'px',
|
|
width: params.width + 'px',
|
|
height: params.height + 'px',
|
|
opacity: params.opacity,
|
|
}"
|
|
>
|
|
<QRCode
|
|
ref="qrcode"
|
|
v-bind="state.qrCodeOptions"
|
|
:width="width"
|
|
:height="width"
|
|
class="target"
|
|
:image="params.url"
|
|
:value="params.value"
|
|
/>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
// 图片组件
|
|
// const NAME = 'w-qrcode'
|
|
|
|
// import { mapGetters, mapActions, useStore } from 'vuex'
|
|
import QRCode from '@/components/business/qrcode'
|
|
import { TWQrcodeSetting } from './wQrcodeSetting';
|
|
import { computed, nextTick, onMounted, onUpdated, reactive, ref, watch } from 'vue';
|
|
// import { useSetupMapGetters } from '@/common/hooks/mapGetters';
|
|
import { Options } from 'qr-code-styling';
|
|
import { useForceStore, useWidgetStore } from '@/store';
|
|
import { storeToRefs } from 'pinia';
|
|
|
|
type TProps = {
|
|
params: TWQrcodeSetting & {
|
|
rotate?: number
|
|
lock?: boolean
|
|
}
|
|
parent: {
|
|
top: number
|
|
left: number
|
|
}
|
|
}
|
|
|
|
type TState = {
|
|
qrCodeOptions: Options
|
|
}
|
|
|
|
// const store = useStore()
|
|
const forceStore = useForceStore()
|
|
const widgetStore = useWidgetStore()
|
|
const props = defineProps<TProps>()
|
|
const state = reactive<TState>({
|
|
qrCodeOptions: {}
|
|
})
|
|
// const { dActiveElement } = useSetupMapGetters(['dActiveElement'])
|
|
const { dActiveElement } = storeToRefs(widgetStore)
|
|
const width = computed(() => Number(props.params.width))
|
|
const widgetRef = ref<HTMLElement | null>(null)
|
|
|
|
watch(
|
|
() => props.params,
|
|
() => {
|
|
changeValues()
|
|
},
|
|
{ immediate: true, deep: true, }
|
|
)
|
|
|
|
onUpdated(() => {
|
|
updateRecord()
|
|
forceStore.setUpdateRect()
|
|
// store.commit('updateRect')
|
|
})
|
|
|
|
onMounted(async () => {
|
|
updateRecord()
|
|
await nextTick()
|
|
if (widgetRef.value){
|
|
props.params.rotate && (widgetRef.value.style.transform += `rotate(${props.params.rotate})`)
|
|
}
|
|
})
|
|
// ...mapActions(['updateWidgetData']),
|
|
function updateRecord() {
|
|
if (dActiveElement.value?.uuid === props.params.uuid) {
|
|
let record = dActiveElement.value?.record
|
|
if (!widgetRef.value) return
|
|
record.width = widgetRef.value.offsetWidth
|
|
record.height = widgetRef.value.offsetHeight
|
|
}
|
|
// this.updateZoom()
|
|
}
|
|
|
|
function changeValues() {
|
|
state.qrCodeOptions = {
|
|
qrOptions: { typeNumber: 0, mode: 'Byte', errorCorrectionLevel: 'H' },
|
|
// dotsOptions: { color: '#999999' },
|
|
dotsOptions: {
|
|
type: props.params.dotType,
|
|
color: props.params.dotColor,
|
|
gradient: {
|
|
type: 'linear',
|
|
rotation: props.params.dotRotation,
|
|
colorStops: [
|
|
{ offset: 0, color: props.params.dotColor },
|
|
{ offset: 1, color: props.params.dotColorType === 'single' ? props.params.dotColor : props.params.dotColor2 },
|
|
],
|
|
},
|
|
},
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="less" scoped>
|
|
// .w-qrcode {
|
|
// overflow: hidden;
|
|
// }
|
|
</style>
|
|
<style lang="less">
|
|
// .QRCodeVue3 {
|
|
// &_img {
|
|
// width: 100%;
|
|
// }
|
|
// }
|
|
</style>
|