| | |
| | | </el-dialog> |
| | | </div> |
| | | <div class="notice" v-if="!isSharePage"> |
| | | <el-badge :value="`${state.announcementList.length}`"> |
| | | <el-badge :value="`${state.announcementList.length}`" :hidden="announcementIsRead || state.announcementList?.length === 0"> |
| | | <el-button link size="small" icon="ele-Message" class="set-notice" @click="handleAnnouncementClick">系统公告</el-button> |
| | | </el-badge> |
| | | <div class="notice_box notice_box_show" v-show="state.isShowAnnouncement" ref="noticeRef"> |
| | |
| | | |
| | | <script setup lang="ts"> |
| | | import { onClickOutside } from '@vueuse/core'; |
| | | import { computed, onMounted, onUnmounted, reactive, ref, triggerRef } from 'vue'; |
| | | import { computed, onMounted, onUnmounted, reactive, ref } from 'vue'; |
| | | import { systemNotifyList } from '/@/api/ai/chat'; |
| | | import router from '/@/router'; |
| | | import { isSharePage, newChatRoomClick } from '/@/stores/chatRoom'; |
| | | import emitter from '/@/utils/mitt'; |
| | | import { storeToRefs } from 'pinia'; |
| | | import pinia from '/@/stores'; |
| | | import { useThemeConfig } from '/@/stores/themeConfig'; |
| | | import { Local } from '/@/utils/storage'; |
| | | import { userInfoKey } from '/@/utils/request'; |
| | | const props = defineProps(['sidebarIsShow']); |
| | | let state = reactive({ |
| | | isShowAnnouncement: false, |
| | |
| | | announcementContent: '', |
| | | announcementTime: '', |
| | | }); |
| | | //#region ====================== 公告是否看过 ====================== |
| | | const userInfo = ref(Local.get(userInfoKey)); |
| | | const readKey = `announcementIsRead_${userInfo.value?.id}`; |
| | | const getIsRead = () => { |
| | | if (!userInfo.value?.id) return false; |
| | | const isRead = Local.get(readKey) ?? false; |
| | | return isRead; |
| | | }; |
| | | |
| | | const setRead = (isRead: boolean) => { |
| | | if (!userInfo.value?.id) return; |
| | | announcementIsRead.value = isRead; |
| | | Local.set(readKey, isRead); |
| | | }; |
| | | const announcementIsRead = ref(getIsRead()); |
| | | |
| | | //#endregion |
| | | const noticeRef = ref(null); |
| | | const getSystemNotify = async () => { |
| | | const res = await systemNotifyList(); |
| | |
| | | state.announcementList = res.messages?.sort(sortData).slice(0, 5) ?? []; |
| | | }; |
| | | const routerMeta = computed(() => router.currentRoute.value.meta); |
| | | const stores = useThemeConfig(pinia); |
| | | const { themeConfig } = storeToRefs(stores); |
| | | const globalTitle = computed(() => themeConfig.value.globalTitle); |
| | | |
| | | const setHeaderTitle = (title: string) => { |
| | | routerMeta.value.title = title; |
| | | triggerRef(routerMeta); |
| | | // routerMeta.value.title = title; |
| | | // triggerRef(routerMeta); |
| | | |
| | | document.title = `${title} - ${globalTitle.value}`; |
| | | }; |
| | | |
| | | const handleAnnouncementClick = () => { |
| | | state.isShowAnnouncement = !state.isShowAnnouncement; |
| | | if (!announcementIsRead.value && state.isShowAnnouncement) { |
| | | setRead(true); |
| | | } |
| | | }; |
| | | |
| | | const goBack = () => { |