ErrorReporter.vue 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <template>
  2. <div class="nana-error-report-container">
  3. <Transition name="nana-scale-transform">
  4. <div v-if="messageItems.length > 0" class="nana-error-report" @click="showError">
  5. <img :src="ErrorIcon" />
  6. <span>{{ errorCount }}</span>
  7. <img :src="WarningIcon" />
  8. <span>{{ warningCount }}</span>
  9. </div>
  10. </Transition>
  11. </div>
  12. <a-modal v-model:open="showModal" title="错误报告" width="60%" height="80%">
  13. <a-alert
  14. v-for="(item, index) in messageItems"
  15. :key="index"
  16. :message="item.message"
  17. :type="item.type"
  18. :description="item.detail"
  19. />
  20. <template #footer>
  21. <a-button @click="messageItems = [];showModal = false">清空</a-button>
  22. <a-button @click="showModal = false">关闭</a-button>
  23. </template>
  24. </a-modal>
  25. </template>
  26. <script setup lang="ts">
  27. import { onMounted, provide, ref } from 'vue';
  28. import WarningIcon from '../AlertIcons/warning.svg';
  29. import ErrorIcon from '../AlertIcons/error.svg';
  30. export interface ErrorReportItem {
  31. time?: number,
  32. message: string,
  33. detail?: string,
  34. type: 'error' | 'warning' | 'info',
  35. }
  36. export interface ErrorReportRef {
  37. logError(info: ErrorReportItem): void;
  38. }
  39. const messageItems = ref<ErrorReportItem[]>([]);
  40. const errorCount = ref(0);
  41. const warningCount = ref(0);
  42. const showModal = ref(false);
  43. function logError(info: ErrorReportItem) {
  44. messageItems.value.push(info);
  45. if (info.type === 'error')
  46. errorCount.value++;
  47. if (info.type === 'warning')
  48. warningCount.value++;
  49. }
  50. function showError() {
  51. showModal.value = true;
  52. }
  53. provide<ErrorReportRef>("ErrorReporter", {
  54. logError,
  55. });
  56. onMounted(() => {
  57. (window as any).$error = logError;
  58. })
  59. </script>
  60. <style lang="scss">
  61. .nana-error-report-container {
  62. position: fixed;
  63. top: 2rem;
  64. left: 0;
  65. right: 0;
  66. display: flex;
  67. flex-direction: row;
  68. justify-content: center;
  69. pointer-events: none;
  70. z-index: 100;
  71. img {
  72. width: 1rem;
  73. height: 1rem;
  74. }
  75. span {
  76. color: #333;
  77. }
  78. }
  79. .nana-error-report {
  80. display: flex;
  81. flex-direction: row;
  82. align-items: center;
  83. width: auto;
  84. gap: 0.5rem;
  85. background-color: #fff;
  86. padding: 0.6rem;
  87. border-radius: 0.5rem;
  88. pointer-events: all;
  89. }
  90. </style>