index.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. <script lang="ts" setup>
  2. import type { CaptchaPoint } from '@vben/common-ui';
  3. import { reactive, ref } from 'vue';
  4. import { Page, PointSelectionCaptcha } from '@vben/common-ui';
  5. import { Card, Input, InputNumber, message, Switch } from 'ant-design-vue';
  6. import { $t } from '#/locales';
  7. import { captchaImage, hintImage } from './base64';
  8. const selectedPoints = ref<CaptchaPoint[]>([]);
  9. const params = reactive({
  10. captchaImage,
  11. captchaImageUrl: '',
  12. height: undefined,
  13. hintImage,
  14. hintImageUrl: '',
  15. hintText: '唇,燕,碴,找',
  16. paddingX: undefined,
  17. paddingY: undefined,
  18. showConfirm: true,
  19. showHintImage: true,
  20. title: '',
  21. width: undefined,
  22. });
  23. const handleConfirm = (points: CaptchaPoint[], clear: () => void) => {
  24. message.success({
  25. content: `captcha points: ${JSON.stringify(points)}`,
  26. });
  27. clear();
  28. selectedPoints.value = [];
  29. };
  30. const handleRefresh = () => {
  31. selectedPoints.value = [];
  32. };
  33. const handleClick = (point: CaptchaPoint) => {
  34. selectedPoints.value.push(point);
  35. };
  36. </script>
  37. <template>
  38. <Page
  39. :description="$t('page.examples.captcha.pageDescription')"
  40. :title="$t('page.examples.captcha.pageTitle')"
  41. >
  42. <Card :title="$t('page.examples.captcha.basic')" class="mb-4">
  43. <div class="mb-3 flex items-center justify-start">
  44. <Input
  45. v-model:value="params.title"
  46. :placeholder="$t('page.examples.captcha.titlePlaceholder')"
  47. class="w-64"
  48. />
  49. <Input
  50. v-model:value="params.captchaImageUrl"
  51. :placeholder="$t('page.examples.captcha.captchaImageUrlPlaceholder')"
  52. class="ml-8 w-64"
  53. />
  54. <div class="ml-8 flex w-96 items-center">
  55. <Switch
  56. v-model:checked="params.showHintImage"
  57. :checked-children="$t('page.examples.captcha.hintImage')"
  58. :un-checked-children="$t('page.examples.captcha.hintText')"
  59. class="mr-4 w-40"
  60. />
  61. <Input
  62. v-show="params.showHintImage"
  63. v-model:value="params.hintImageUrl"
  64. :placeholder="$t('page.examples.captcha.hintImagePlaceholder')"
  65. />
  66. <Input
  67. v-show="!params.showHintImage"
  68. v-model:value="params.hintText"
  69. :placeholder="$t('page.examples.captcha.hintTextPlaceholder')"
  70. />
  71. </div>
  72. <Switch
  73. v-model:checked="params.showConfirm"
  74. :checked-children="$t('page.examples.captcha.showConfirm')"
  75. :un-checked-children="$t('page.examples.captcha.hideConfirm')"
  76. class="ml-8 w-28"
  77. />
  78. </div>
  79. <div class="mb-3 flex items-center justify-start">
  80. <div>
  81. <InputNumber
  82. v-model:value="params.width"
  83. :min="1"
  84. :placeholder="$t('page.examples.captcha.widthPlaceholder')"
  85. :precision="0"
  86. :step="1"
  87. class="w-64"
  88. >
  89. <template #addonAfter>px</template>
  90. </InputNumber>
  91. </div>
  92. <div class="ml-8">
  93. <InputNumber
  94. v-model:value="params.height"
  95. :min="1"
  96. :placeholder="$t('page.examples.captcha.heightPlaceholder')"
  97. :precision="0"
  98. :step="1"
  99. class="w-64"
  100. >
  101. <template #addonAfter>px</template>
  102. </InputNumber>
  103. </div>
  104. <div class="ml-8">
  105. <InputNumber
  106. v-model:value="params.paddingX"
  107. :min="1"
  108. :placeholder="$t('page.examples.captcha.paddingXPlaceholder')"
  109. :precision="0"
  110. :step="1"
  111. class="w-64"
  112. >
  113. <template #addonAfter>px</template>
  114. </InputNumber>
  115. </div>
  116. <div class="ml-8">
  117. <InputNumber
  118. v-model:value="params.paddingY"
  119. :min="1"
  120. :placeholder="$t('page.examples.captcha.paddingYPlaceholder')"
  121. :precision="0"
  122. :step="1"
  123. class="w-64"
  124. >
  125. <template #addonAfter>px</template>
  126. </InputNumber>
  127. </div>
  128. </div>
  129. <PointSelectionCaptcha
  130. :captcha-image="params.captchaImageUrl || params.captchaImage"
  131. :height="params.height || 220"
  132. :hint-image="
  133. params.showHintImage ? params.hintImageUrl || params.hintImage : ''
  134. "
  135. :hint-text="params.hintText"
  136. :padding-x="params.paddingX"
  137. :padding-y="params.paddingY"
  138. :show-confirm="params.showConfirm"
  139. :width="params.width || 300"
  140. class="float-left"
  141. @click="handleClick"
  142. @confirm="handleConfirm"
  143. @refresh="handleRefresh"
  144. >
  145. <template #title>
  146. {{ params.title || $t('page.examples.captcha.captchaCardTitle') }}
  147. </template>
  148. </PointSelectionCaptcha>
  149. <ol class="float-left p-5">
  150. <li v-for="point in selectedPoints" :key="point.i" class="flex">
  151. <span class="mr-3 w-16">{{
  152. $t('page.examples.captcha.index') + point.i
  153. }}</span>
  154. <span class="mr-3 w-52">{{
  155. $t('page.examples.captcha.timestamp') + point.t
  156. }}</span>
  157. <span class="mr-3 w-16">{{
  158. $t('page.examples.captcha.x') + point.x
  159. }}</span>
  160. <span class="mr-3 w-16">{{
  161. $t('page.examples.captcha.y') + point.y
  162. }}</span>
  163. </li>
  164. </ol>
  165. </Card>
  166. </Page>
  167. </template>