messageInstruction.vue 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <template>
  2. <div class="messageInstruction">
  3. <div class="messageItem" :class="item.type" v-for="item in messageList" :key="item.id">
  4. <div class="icon">
  5. <svg v-if="['success'].includes(item.type)" viewBox="0 0 1024 1024"><path d="M512 85.333333c235.648 0 426.666667 191.018667 426.666667 426.666667s-191.018667 426.666667-426.666667 426.666667S85.333333 747.648 85.333333 512 276.352 85.333333 512 85.333333z m-74.965333 550.4L346.453333 545.152a42.666667 42.666667 0 1 0-60.330666 60.330667l120.704 120.704a42.666667 42.666667 0 0 0 60.330666 0l301.653334-301.696a42.666667 42.666667 0 1 0-60.288-60.330667l-271.530667 271.488z" fill="#67C239"></path></svg>
  6. <svg v-if="['pptMessage'].includes(item.type)" viewBox="0 0 1024 1024" ><path d="M512 85.333c-234.667 0-426.667 192-426.667 426.667s192 426.667 426.667 426.667 426.667-192 426.667-426.667S746.667 85.333 512 85.333z m21.333 640h-42.666c-12.8 0-21.334-8.533-21.334-21.333v-42.667c0-12.8 8.534-21.333 21.334-21.333h42.666c12.8 0 21.334 8.533 21.334 21.333V704c0 12.8-8.534 21.333-21.334 21.333zM512 554.667c-25.6 0-42.667-17.067-42.667-42.667V341.333c0-25.6 17.067-42.666 42.667-42.666s42.667 17.066 42.667 42.666V512c0 25.6-17.067 42.667-42.667 42.667z" fill="#FCCF00"></path></svg>
  7. <!-- <svg v-if="['pptMessage'].includes(item.type)" viewBox="0 0 1024 1024"><path d="M512 28.444444C244.906667 28.444444 28.444444 244.906667 28.444444 512s216.462222 483.555556 483.555556 483.555556 483.555556-216.462222 483.555556-483.555556S779.093333 28.444444 512 28.444444z m30.225067 755.5584A30.190933 30.190933 0 0 1 512 814.222222a30.190933 30.190933 0 0 1-30.225067-30.225066A30.190933 30.190933 0 0 1 512 753.777778a30.190933 30.190933 0 0 1 30.225067 30.225066z m0-120.888888A30.190933 30.190933 0 0 1 512 693.327644a30.190933 30.190933 0 0 1-30.225067-30.225066V240.008533A30.190933 30.190933 0 0 1 512 209.772089a30.190933 30.190933 0 0 1 30.225067 30.225067v423.105422z" fill="#FCCF00"></path></svg> -->
  8. </div>
  9. <div class="message" v-html="item.message"></div>
  10. <div class="close" @click="close(item.id)" v-if="item.showClose">
  11. <svg viewBox="0 0 1025 1024"><path d="M997.553471 154.252491 639.804427 512.001535 997.553471 869.751602l0 0c16.34988 16.374439 26.450623 38.948897 26.450623 63.898376 0 49.899981-40.450041 90.350022-90.351045 90.350022-24.949479 0-47.549519-10.100743-63.897353-26.475181l0 0L512.003581 639.775775 154.255561 997.525842l0 0c-16.34988 16.374439-38.948897 26.475181-63.899399 26.475181-49.901004 0-90.350022-40.450041-90.350022-90.350022 0-24.950502 10.099719-47.523938 26.449599-63.898376l0 0 357.750067-357.750067L26.454716 154.252491l0 0c-16.34988-16.350903-26.449599-38.949921-26.449599-63.900423 0-49.899981 40.449018-90.348999 90.350022-90.348999 24.950502 0 47.550543 10.099719 63.899399 26.474158l0 0 357.748021 357.749044L869.754672 26.477228l0 0c16.348857-16.374439 38.948897-26.474158 63.897353-26.474158 49.901004 0 90.351045 40.449018 90.351045 90.348999C1024.00307 115.301547 1013.902327 137.901588 997.553471 154.252491L997.553471 154.252491z" fill="#1A1A1A"></path></svg>
  12. </div>
  13. </div>
  14. </div>
  15. </template>
  16. <script setup>
  17. import { onMounted, ref } from 'vue'
  18. const messageList = ref([])
  19. const success = (data) => {
  20. if (typeof data === 'string') {
  21. let _id = Date.now()
  22. messageList.value.push({
  23. id: _id,
  24. type: 'success',
  25. message: data,
  26. showClose: data.showClose || false
  27. })
  28. setTimeout(() => {
  29. messageList.value = messageList.value.filter(item => item.id !== _id)
  30. }, 3000)
  31. } else if (typeof data === 'object' && data.message && data.duration) {
  32. let _id = Date.now()
  33. messageList.value.push({
  34. id: _id,
  35. type: 'success',
  36. message: data.message,
  37. showClose: data.showClose || false
  38. })
  39. setTimeout(() => {
  40. messageList.value = messageList.value.filter(item => item.id !== _id)
  41. }, data.duration)
  42. }
  43. }
  44. const pptMessage = (data) => {
  45. if (typeof data === 'string') {
  46. let _id = Date.now()
  47. messageList.value.push({
  48. id: _id,
  49. type: 'pptMessage',
  50. message: data,
  51. showClose: data.showClose || true
  52. })
  53. setTimeout(() => {
  54. messageList.value = messageList.value.filter(item => item.id !== _id)
  55. }, 3000)
  56. } else if (typeof data === 'object' && data.message && data.duration) {
  57. let _id = Date.now()
  58. messageList.value.push({
  59. id: _id,
  60. type: 'pptMessage',
  61. message: data.message,
  62. showClose: data.showClose || true
  63. })
  64. setTimeout(() => {
  65. messageList.value = messageList.value.filter(item => item.id !== _id)
  66. }, data.duration)
  67. }
  68. }
  69. const close = (id) => {
  70. messageList.value = messageList.value.filter(item => item.id !== id)
  71. }
  72. defineExpose({
  73. success,
  74. pptMessage,
  75. close
  76. })
  77. </script>
  78. <style lang="scss" scoped>
  79. .messageInstruction {
  80. position: fixed;
  81. top: 80px;
  82. left: 50%;
  83. transform: translate(-50%, 0%);
  84. width: auto;
  85. height: auto;
  86. z-index: 9999;
  87. display: flex;
  88. flex-direction: column;
  89. gap: .5rem;
  90. }
  91. .messageItem{
  92. padding: 15px 20px;
  93. border-radius: .2rem;
  94. font-size: 1rem;
  95. display: flex;
  96. align-items: center;
  97. justify-content: space-between;
  98. background: #FFFFFF;
  99. box-shadow: 0 0 .2rem rgba(0, 0, 0, 0.1);
  100. transition: .3s;
  101. }
  102. .messageItem>.icon{
  103. width: 1.3rem;
  104. height: 1.3rem;
  105. margin-right: .8rem;
  106. display: flex;
  107. align-items: center;
  108. justify-content: center;
  109. //margin-top: -.1rem;
  110. line-height: 1rem;
  111. }
  112. .messageItem>.icon>svg{
  113. width: 100%;
  114. height: 100%;
  115. }
  116. .messageItem>.close{
  117. width: .6rem;
  118. height: .6rem;
  119. margin-left: 1.5rem;
  120. display: flex;
  121. align-items: center;
  122. justify-content: center;
  123. margin-top: .3rem;
  124. }
  125. .messageItem>.close>svg{
  126. width: 100%;
  127. height: 100%;
  128. cursor: pointer;
  129. }
  130. .messageItem>.message{
  131. flex: 1;
  132. max-width: 50vh;
  133. }
  134. .messageItem {
  135. animation: slideDownFadeIn 0.3s ease-out;
  136. }
  137. @keyframes slideDownFadeIn {
  138. from {
  139. opacity: 0;
  140. transform: translateY(-20px);
  141. }
  142. to {
  143. opacity: 1;
  144. transform: translateY(0);
  145. }
  146. }
  147. </style>