SiteMessagePopup.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <template>
  2. <transition
  3. name="fade"
  4. mode="out-in"
  5. appear
  6. :duration="{ enter: 500, leave: 300 }"
  7. >
  8. <div v-if="unreadMessage" :key="unreadMessage.id" class="popup">
  9. <h5
  10. style=" padding: 5px; background:#3c8dbd;
  11. border-radius:6px 6px 0px 0px; font-size:14px;
  12. font-weight:500;
  13. color:rgba(255,255,255,1);
  14. line-height:20px;"
  15. >
  16. {{ unreadMessage.title }}
  17. </h5>
  18. <p
  19. style="text-overflow: ellipsis; text-indent: 2em; text-align: left; height: 100px; overflow: hidden; margin: 20px;"
  20. >
  21. {{ unreadMessageContent }}
  22. </p>
  23. <div style="text-align: left; margin-left: 20px; margin-bottom: 10px;">
  24. <router-link :to="'/home/site-message/' + unreadMessage.id">
  25. 详情 >>>
  26. </router-link>
  27. <span
  28. @click="ignoreMessage"
  29. style="display: inline-block; margin-left: 20px; cursor: pointer;"
  30. >忽略</span
  31. >
  32. </div>
  33. </div>
  34. </transition>
  35. </template>
  36. <script>
  37. import { mapState } from "vuex";
  38. export default {
  39. name: "SiteMessagePopup",
  40. data() {
  41. let ignoreMessageIds = window.sessionStorage.getItem("ignoreMessageIds");
  42. if (ignoreMessageIds) {
  43. ignoreMessageIds = JSON.parse(ignoreMessageIds);
  44. } else {
  45. ignoreMessageIds = [];
  46. }
  47. return {
  48. siteMessages: [],
  49. ignoreMessageIds
  50. };
  51. },
  52. methods: {
  53. ignoreMessage() {
  54. this.ignoreMessageIds.push(this.unreadMessage.id + "-" + this.user.id);
  55. window.sessionStorage.setItem(
  56. "ignoreMessageIds",
  57. JSON.stringify(this.ignoreMessageIds)
  58. );
  59. },
  60. async getUnreadNoticeList() {
  61. try {
  62. this.$httpWithoutBar
  63. .get("/api/ecs_exam_work/notice/getUserNoticeList?hasRead=false")
  64. .then(response => {
  65. this.siteMessages = response.data;
  66. setTimeout(() => {
  67. this.getUnreadNoticeList();
  68. }, 5000);
  69. });
  70. } catch (error) {
  71. console.log("tag", error);
  72. }
  73. }
  74. },
  75. created() {
  76. this.getUnreadNoticeList();
  77. },
  78. computed: {
  79. ...mapState({ user: state => state.user }),
  80. unreadMessage() {
  81. const unreadMessages = this.siteMessages
  82. .filter(v => v.hasRead === false)
  83. .filter(
  84. v =>
  85. this.ignoreMessageIds.includes(v.id + "-" + this.user.id) === false
  86. )
  87. .reverse();
  88. this.$emit("changeUnreadMessageCount", unreadMessages.length);
  89. if (unreadMessages.length > 0) {
  90. return unreadMessages[0];
  91. } else {
  92. return null;
  93. }
  94. },
  95. unreadMessageContent() {
  96. const div = document.createElement("div");
  97. div.innerHTML = this.unreadMessage.content;
  98. const text = div.textContent || div.innerText || "";
  99. return text.slice(0, 90) + (text.length > 90 ? "..." : "");
  100. }
  101. }
  102. };
  103. </script>
  104. <style scoped>
  105. .popup {
  106. position: fixed;
  107. bottom: 20px;
  108. right: 20px;
  109. width: 320px;
  110. height: 200px;
  111. background: rgba(255, 255, 255, 1);
  112. box-shadow: 0px 2px 10px 0px rgba(0, 0, 0, 0.1);
  113. border-radius: 6px;
  114. border: 1px solid rgba(221, 221, 221, 1);
  115. }
  116. </style>