Error.vue 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. <script setup lang="ts">
  2. import pageError from '@/assets/svgs/404.svg'
  3. import networkError from '@/assets/svgs/500.svg'
  4. import noPermission from '@/assets/svgs/403.svg'
  5. import { propTypes } from '@/utils/propTypes'
  6. import { useI18n } from '@/hooks/web/useI18n'
  7. interface ErrorMap {
  8. url: string
  9. message: string
  10. buttonText: string
  11. }
  12. const { t } = useI18n()
  13. const errorMap: {
  14. [key: string]: ErrorMap
  15. } = {
  16. '404': {
  17. url: pageError,
  18. message: t('error.pageError'),
  19. buttonText: t('error.returnToHome')
  20. },
  21. '500': {
  22. url: networkError,
  23. message: t('error.networkError'),
  24. buttonText: t('error.returnToHome')
  25. },
  26. '403': {
  27. url: noPermission,
  28. message: t('error.noPermission'),
  29. buttonText: t('error.returnToHome')
  30. }
  31. }
  32. const props = defineProps({
  33. type: propTypes.string.validate((v: string) => ['404', '500', '403'].includes(v)).def('404')
  34. })
  35. const emit = defineEmits(['errorClick'])
  36. const btnClick = () => {
  37. emit('errorClick', props.type)
  38. }
  39. </script>
  40. <template>
  41. <div class="flex justify-center">
  42. <div class="text-center">
  43. <img width="350" :src="errorMap[type].url" alt="" />
  44. <div class="text-14px text-[var(--el-color-info)]">{{ errorMap[type].message }}</div>
  45. <div class="mt-20px">
  46. <ElButton type="primary" @click="btnClick">{{ errorMap[type].buttonText }}</ElButton>
  47. </div>
  48. </div>
  49. </div>
  50. </template>