index.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <template>
  2. <PageWrapper title="二维码组件使用示例">
  3. <div class="flex flex-wrap">
  4. <CollapseContainer
  5. title="基础示例"
  6. :canExpan="true"
  7. class="text-center mb-6 qrcode-demo-item"
  8. >
  9. <QrCode :value="qrCodeUrl" />
  10. </CollapseContainer>
  11. <CollapseContainer title="渲染成img标签示例" class="text-center mb-6 qrcode-demo-item">
  12. <QrCode :value="qrCodeUrl" tag="img" />
  13. </CollapseContainer>
  14. <CollapseContainer title="配置样式示例" class="text-center mb-6 qrcode-demo-item">
  15. <QrCode
  16. :value="qrCodeUrl"
  17. :options="{
  18. color: { dark: '#55D187' },
  19. }"
  20. />
  21. </CollapseContainer>
  22. <CollapseContainer title="本地logo示例" class="text-center mb-6 qrcode-demo-item">
  23. <QrCode :value="qrCodeUrl" :logo="LogoImg" />
  24. </CollapseContainer>
  25. <CollapseContainer title="在线logo示例" class="text-center mb-6 qrcode-demo-item">
  26. <QrCode
  27. :value="qrCodeUrl"
  28. logo="https://vebn.oss-cn-beijing.aliyuncs.com/vben/logo.png"
  29. :options="{
  30. color: { dark: '#55D187' },
  31. }"
  32. />
  33. </CollapseContainer>
  34. <CollapseContainer title="logo配置示例" class="text-center mb-6 qrcode-demo-item">
  35. <QrCode
  36. :value="qrCodeUrl"
  37. :logo="{
  38. src: 'https://vebn.oss-cn-beijing.aliyuncs.com/vben/logo.png',
  39. logoSize: 0.2,
  40. borderSize: 0.05,
  41. borderRadius: 50,
  42. bgColor: 'blue',
  43. }"
  44. />
  45. </CollapseContainer>
  46. <CollapseContainer title="下载示例" class="text-center qrcode-demo-item">
  47. <QrCode :value="qrCodeUrl" ref="qrRef" :logo="LogoImg" />
  48. <a-button class="mb-2" type="primary" @click="download"> 下载 </a-button>
  49. <div class="msg"> (在线logo会导致图片跨域,需要下载图片需要自行解决跨域问题) </div>
  50. </CollapseContainer>
  51. <CollapseContainer title="配置大小示例" class="text-center qrcode-demo-item">
  52. <QrCode :value="qrCodeUrl" :width="300" />
  53. </CollapseContainer>
  54. <CollapseContainer title="扩展绘制示例" class="text-center qrcode-demo-item">
  55. <QrCode
  56. :value="qrCodeUrl"
  57. :width="200"
  58. :options="{ margin: 5 }"
  59. ref="qrDiyRef"
  60. :logo="LogoImg"
  61. @done="onQrcodeDone"
  62. />
  63. <a-button class="mb-2" type="primary" @click="downloadDiy"> 下载 </a-button>
  64. <div class="msg"> 要进行扩展绘制则不能将tag设为img </div>
  65. </CollapseContainer>
  66. </div>
  67. </PageWrapper>
  68. </template>
  69. <script lang="ts">
  70. import { defineComponent, ref, unref } from 'vue';
  71. import { QrCode, QrCodeActionType } from '/@/components/Qrcode/index';
  72. import LogoImg from '/@/assets/images/logo.png';
  73. import { CollapseContainer } from '/@/components/Container/index';
  74. import { PageWrapper } from '/@/components/Page';
  75. const qrCodeUrl = 'https://www.vvbin.cn';
  76. export default defineComponent({
  77. components: { CollapseContainer, QrCode, PageWrapper },
  78. setup() {
  79. const qrRef = ref<Nullable<QrCodeActionType>>(null);
  80. const qrDiyRef = ref<Nullable<QrCodeActionType>>(null);
  81. function download() {
  82. const qrEl = unref(qrRef);
  83. if (!qrEl) return;
  84. qrEl.download('文件名');
  85. }
  86. function downloadDiy() {
  87. const qrEl = unref(qrDiyRef);
  88. if (!qrEl) return;
  89. qrEl.download('Qrcode');
  90. }
  91. function onQrcodeDone({ ctx }) {
  92. if (ctx instanceof CanvasRenderingContext2D) {
  93. // 额外绘制
  94. ctx.fillStyle = 'black';
  95. ctx.font = '16px "微软雅黑"';
  96. ctx.textBaseline = 'bottom';
  97. ctx.textAlign = 'center';
  98. ctx.fillText('你帅你先扫', 100, 195, 200);
  99. }
  100. }
  101. return {
  102. onQrcodeDone,
  103. qrCodeUrl,
  104. LogoImg,
  105. download,
  106. downloadDiy,
  107. qrRef,
  108. qrDiyRef,
  109. };
  110. },
  111. });
  112. </script>
  113. <style scoped>
  114. .qrcode-demo-item {
  115. width: 30%;
  116. margin-right: 1%;
  117. }
  118. </style>