Exception.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import './exception.less';
  2. import type { PropType } from 'vue';
  3. import { Result, Button } from 'ant-design-vue';
  4. import { defineComponent, ref, computed, unref } from 'vue';
  5. import { ExceptionEnum } from '/@/enums/exceptionEnum';
  6. import netWorkImg from '/@/assets/images/exception/net-work.png';
  7. import notDataImg from '/@/assets/images/no-data.png';
  8. import { useRoute } from 'vue-router';
  9. import { useGo, useRedo } from '/@/hooks/web/usePage';
  10. import { PageEnum } from '/@/enums/pageEnum';
  11. import { useI18n } from '/@/hooks/web/useI18n';
  12. interface MapValue {
  13. title: string;
  14. subTitle: string;
  15. btnText?: string;
  16. icon?: string;
  17. handler?: Fn;
  18. status?: string;
  19. }
  20. export default defineComponent({
  21. name: 'ErrorPage',
  22. props: {
  23. // 状态码
  24. status: {
  25. type: Number as PropType<number>,
  26. default: ExceptionEnum.PAGE_NOT_FOUND,
  27. },
  28. title: {
  29. type: String as PropType<string>,
  30. },
  31. subTitle: {
  32. type: String as PropType<string>,
  33. },
  34. full: {
  35. type: Boolean as PropType<boolean>,
  36. default: false,
  37. },
  38. },
  39. setup(props) {
  40. const statusMapRef = ref(new Map<string | number, MapValue>());
  41. const { query } = useRoute();
  42. const go = useGo();
  43. const redo = useRedo();
  44. const { t } = useI18n();
  45. const getStatus = computed(() => {
  46. const { status: routeStatus } = query;
  47. const { status } = props;
  48. return Number(routeStatus) || status;
  49. });
  50. const getMapValue = computed(
  51. (): MapValue => {
  52. return unref(statusMapRef).get(unref(getStatus)) as MapValue;
  53. }
  54. );
  55. const backLoginI18n = t('sys.exception.backLogin');
  56. const backHomeI18n = t('sys.exception.backHome');
  57. unref(statusMapRef).set(ExceptionEnum.PAGE_NOT_ACCESS, {
  58. title: '403',
  59. status: `${ExceptionEnum.PAGE_NOT_ACCESS}`,
  60. subTitle: t('sys.exception.subTitle403'),
  61. btnText: props.full ? backLoginI18n : backHomeI18n,
  62. handler: () => (props.full ? go(PageEnum.BASE_LOGIN) : go()),
  63. });
  64. unref(statusMapRef).set(ExceptionEnum.PAGE_NOT_FOUND, {
  65. title: '404',
  66. status: `${ExceptionEnum.PAGE_NOT_FOUND}`,
  67. subTitle: t('sys.exception.subTitle404'),
  68. btnText: props.full ? backLoginI18n : backHomeI18n,
  69. handler: () => (props.full ? go(PageEnum.BASE_LOGIN) : go()),
  70. });
  71. unref(statusMapRef).set(ExceptionEnum.ERROR, {
  72. title: '500',
  73. status: `${ExceptionEnum.ERROR}`,
  74. subTitle: t('sys.exception.subTitle500'),
  75. btnText: backHomeI18n,
  76. handler: () => go(),
  77. });
  78. unref(statusMapRef).set(ExceptionEnum.PAGE_NOT_DATA, {
  79. title: t('sys.exception.noDataTitle'),
  80. subTitle: '',
  81. btnText: t('common.redo'),
  82. handler: () => redo(),
  83. icon: notDataImg,
  84. });
  85. unref(statusMapRef).set(ExceptionEnum.NET_WORK_ERROR, {
  86. title: t('sys.exception.networkErrorTitle'),
  87. subTitle: t('sys.exception.networkErrorSubTitle'),
  88. btnText: 'Refresh',
  89. handler: () => redo(),
  90. icon: netWorkImg,
  91. });
  92. return () => {
  93. const { title, subTitle, btnText, icon, handler, status } = unref(getMapValue) || {};
  94. return (
  95. <Result
  96. class="exception "
  97. status={status as any}
  98. title={props.title || title}
  99. sub-title={props.subTitle || subTitle}
  100. >
  101. {{
  102. extra: () =>
  103. btnText && (
  104. <Button type="primary" onClick={handler}>
  105. {() => btnText}
  106. </Button>
  107. ),
  108. icon: () => (icon ? <img src={icon} /> : null),
  109. }}
  110. </Result>
  111. );
  112. };
  113. },
  114. });