sign-in-code.vue 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. <template>
  2. <vxe-modal v-model="dialogVisible" :title="title" show-zoom resize show-footer destroy-on-close transfer @hide="close" :width="width" :z-index="1002">
  3. <template #default>
  4. <div>
  5. <div v-if="info" ref="codeImgRef" style="width: 400px; margin: 0 auto;">
  6. <div class="mb-6 f-w-6 f-s-16 c-333">{{ info?.trainingName }}</div>
  7. <div class="mb-6">培训时间:{{ info?.trainingStart }}~{{ info?.trainingEnd }}</div>
  8. <div class="mb-6">培训方式:{{ selectDictLabel(dict.dm_training_join_type, info.joinType) }}</div>
  9. <div class="mb-6">联系电话:{{ info?.tel }}</div>
  10. <div>签到二维码</div>
  11. <div class="d-flex j-c a-c pd-20">
  12. <vueQr :text="VITE_APP_SHARE_QR_CODE_URL + '/meeting-sign-in?meetid=' + info?.id" :size="300"></vueQr>
  13. </div>
  14. </div>
  15. </div>
  16. <div class="d-flex j-c">
  17. <el-button @click="saveImg">保存签到二维码</el-button>
  18. </div>
  19. </template>
  20. </vxe-modal>
  21. </template>
  22. <script setup name="SignInCode" lang="ts">
  23. import { propTypes } from '@/utils/propTypes';
  24. import vueQr from 'vue-qr/src/packages/vue-qr.vue';
  25. import html2canvas from 'html2canvas';
  26. const emit = defineEmits(['update:show', 'close', 'success']);
  27. const props = defineProps({
  28. show: propTypes.bool.def(false),
  29. title: propTypes.string.def('签到二维码'),
  30. width: propTypes.number.def(500),
  31. info: propTypes.any.def(null),
  32. dict: propTypes.object.def({})
  33. });
  34. const VITE_APP_SHARE_QR_CODE_URL = ref(import.meta.env.VITE_APP_SHARE_QR_CODE_URL);
  35. const dialogVisible = ref(false);
  36. const close = () => {
  37. emit('update:show', false);
  38. emit('close', false);
  39. };
  40. const codeImgRef = ref<HTMLElement | null>(null);
  41. const saveImg = () => {
  42. html2canvas(codeImgRef.value, {
  43. useCORS: true,
  44. allowTaint: false,
  45. scale: 2
  46. }).then((canvas) => {
  47. const url = canvas.toDataURL('image/png');
  48. const a: any = document.createElement('a');
  49. a.download = `${props?.info?.trainingName}-签到二维码.png`;
  50. a.href = url;
  51. a.click();
  52. });
  53. };
  54. watch(
  55. () => props.show,
  56. (val) => {
  57. dialogVisible.value = val;
  58. },
  59. { immediate: true }
  60. );
  61. </script>