|
@@ -2,70 +2,91 @@
|
|
<div class="message">
|
|
<div class="message">
|
|
<el-popover placement="bottom" :width="310" trigger="click">
|
|
<el-popover placement="bottom" :width="310" trigger="click">
|
|
<template #reference>
|
|
<template #reference>
|
|
- <el-badge :value="5" class="item">
|
|
|
|
|
|
+ <el-badge v-if="newNotice > 0" :value="newNotice" class="item">
|
|
<i :class="'iconfont icon-xiaoxi'" class="toolBar-icon"></i>
|
|
<i :class="'iconfont icon-xiaoxi'" class="toolBar-icon"></i>
|
|
</el-badge>
|
|
</el-badge>
|
|
|
|
+ <i v-else :class="'iconfont icon-xiaoxi'" class="toolBar-icon"></i>
|
|
</template>
|
|
</template>
|
|
<el-tabs v-model="activeName">
|
|
<el-tabs v-model="activeName">
|
|
- <el-tab-pane label="通知(5)" name="first">
|
|
|
|
|
|
+ <el-tab-pane :label="`待办通知(${newNotice})`" name="first">
|
|
<div class="message-list">
|
|
<div class="message-list">
|
|
- <div class="message-item">
|
|
|
|
- <img src="@/assets/images/msg01.png" alt="" class="message-icon" />
|
|
|
|
- <div class="message-content">
|
|
|
|
- <span class="message-title">一键三连 Geeker-Admin 🧡</span>
|
|
|
|
- <span class="message-date">一分钟前</span>
|
|
|
|
|
|
+ <template v-for="(item, index) in newsList" :key="index">
|
|
|
|
+ <div class="message-item">
|
|
|
|
+ <img src="@/assets/images/msg01.png" alt="" class="message-icon" />
|
|
|
|
+ <div class="message-content">
|
|
|
|
+ <el-button link type="primary" @click="onNewsClick(index)">{{ item.message }}</el-button>
|
|
|
|
+ <span class="message-date">{{ item.time }}</span>
|
|
|
|
+ </div>
|
|
|
|
+ <span v-if="item.read" class="el-tag el-tag--success el-tag--mini read">已读</span>
|
|
|
|
+ <span v-else class="el-tag el-tag--danger el-tag--mini read">未读</span>
|
|
</div>
|
|
</div>
|
|
- </div>
|
|
|
|
- <div class="message-item">
|
|
|
|
- <img src="@/assets/images/msg02.png" alt="" class="message-icon" />
|
|
|
|
- <div class="message-content">
|
|
|
|
- <span class="message-title">一键三连 Geeker-Admin 💙</span>
|
|
|
|
- <span class="message-date">一小时前</span>
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
- <div class="message-item">
|
|
|
|
- <img src="@/assets/images/msg03.png" alt="" class="message-icon" />
|
|
|
|
- <div class="message-content">
|
|
|
|
- <span class="message-title">一键三连 Geeker-Admin 💚</span>
|
|
|
|
- <span class="message-date">半天前</span>
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
- <div class="message-item">
|
|
|
|
- <img src="@/assets/images/msg04.png" alt="" class="message-icon" />
|
|
|
|
- <div class="message-content">
|
|
|
|
- <span class="message-title">一键三连 Geeker-Admin 💜</span>
|
|
|
|
- <span class="message-date">一星期前</span>
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
- <div class="message-item">
|
|
|
|
- <img src="@/assets/images/msg05.png" alt="" class="message-icon" />
|
|
|
|
- <div class="message-content">
|
|
|
|
- <span class="message-title">一键三连 Geeker-Admin 💛</span>
|
|
|
|
- <span class="message-date">一个月前</span>
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
|
|
+ </template>
|
|
</div>
|
|
</div>
|
|
</el-tab-pane>
|
|
</el-tab-pane>
|
|
- <el-tab-pane label="消息(0)" name="second">
|
|
|
|
|
|
+ <!-- <el-tab-pane label="消息(0)" name="second">
|
|
<div class="message-empty">
|
|
<div class="message-empty">
|
|
<img src="@/assets/images/notData.png" alt="notData" />
|
|
<img src="@/assets/images/notData.png" alt="notData" />
|
|
<div>暂无消息</div>
|
|
<div>暂无消息</div>
|
|
</div>
|
|
</div>
|
|
</el-tab-pane>
|
|
</el-tab-pane>
|
|
- <el-tab-pane label="代办(0)" name="third">
|
|
|
|
|
|
+ <el-tab-pane label="待办(0)" name="third">
|
|
<div class="message-empty">
|
|
<div class="message-empty">
|
|
<img src="@/assets/images/notData.png" alt="notData" />
|
|
<img src="@/assets/images/notData.png" alt="notData" />
|
|
<div>暂无代办</div>
|
|
<div>暂无代办</div>
|
|
</div>
|
|
</div>
|
|
- </el-tab-pane>
|
|
|
|
|
|
+ </el-tab-pane> -->
|
|
</el-tabs>
|
|
</el-tabs>
|
|
</el-popover>
|
|
</el-popover>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
-import { ref } from 'vue'
|
|
|
|
|
|
+import { storeToRefs } from 'pinia'
|
|
|
|
+import { reactive, ref, onMounted, watch, nextTick } from 'vue'
|
|
|
|
+import useNoticeStore from '@/stores/modules/notice'
|
|
|
|
+import { useRouter } from 'vue-router'
|
|
|
|
+const router = useRouter()
|
|
|
|
+const noticeStore = storeToRefs(useNoticeStore())
|
|
|
|
+// const { readAll } = useNoticeStore()
|
|
const activeName = ref('first')
|
|
const activeName = ref('first')
|
|
|
|
+const newNotice = ref(0)
|
|
|
|
+// 定义变量内容
|
|
|
|
+const state = reactive({
|
|
|
|
+ loading: false
|
|
|
|
+})
|
|
|
|
+const newsList = ref([]) as any
|
|
|
|
+//点击消息,写入已读
|
|
|
|
+const onNewsClick = (item: any) => {
|
|
|
|
+ newsList.value[item].read = true
|
|
|
|
+ //并且写入pinia
|
|
|
|
+ noticeStore.state.value.notices = newsList.value
|
|
|
|
+ router.push({ path: `/index` }).then(() => {
|
|
|
|
+ nextTick(() => {
|
|
|
|
+ window.location.reload()
|
|
|
|
+ })
|
|
|
|
+ })
|
|
|
|
+}
|
|
|
|
+/**
|
|
|
|
+ * 初始化数据
|
|
|
|
+ * @returns
|
|
|
|
+ */
|
|
|
|
+const getTableData = async () => {
|
|
|
|
+ state.loading = true
|
|
|
|
+ newsList.value = noticeStore.state.value.notices
|
|
|
|
+ state.loading = false
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+onMounted(() => {
|
|
|
|
+ nextTick(() => {
|
|
|
|
+ getTableData()
|
|
|
|
+ })
|
|
|
|
+})
|
|
|
|
+//用深度监听 消息
|
|
|
|
+watch(
|
|
|
|
+ () => noticeStore.state.value.notices,
|
|
|
|
+ newVal => (newNotice.value = newVal.filter((item: any) => !item.read).length),
|
|
|
|
+ { deep: true }
|
|
|
|
+)
|
|
</script>
|
|
</script>
|
|
|
|
|
|
<style scoped lang="scss">
|
|
<style scoped lang="scss">
|
|
@@ -80,6 +101,7 @@ const activeName = ref('first')
|
|
.message-list {
|
|
.message-list {
|
|
display: flex;
|
|
display: flex;
|
|
flex-direction: column;
|
|
flex-direction: column;
|
|
|
|
+ min-height: 260px;
|
|
.message-item {
|
|
.message-item {
|
|
display: flex;
|
|
display: flex;
|
|
align-items: center;
|
|
align-items: center;
|
|
@@ -92,10 +114,14 @@ const activeName = ref('first')
|
|
width: 40px;
|
|
width: 40px;
|
|
height: 40px;
|
|
height: 40px;
|
|
margin: 0 20px 0 5px;
|
|
margin: 0 20px 0 5px;
|
|
|
|
+ .img {
|
|
|
|
+ cursor: pointer;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
.message-content {
|
|
.message-content {
|
|
display: flex;
|
|
display: flex;
|
|
flex-direction: column;
|
|
flex-direction: column;
|
|
|
|
+ margin-right: 2px;
|
|
.message-title {
|
|
.message-title {
|
|
margin-bottom: 5px;
|
|
margin-bottom: 5px;
|
|
}
|
|
}
|