From c6d8ea02ade42a78e9f4a2304e8e1c5f67853d91 Mon Sep 17 00:00:00 2001 From: wujingjing <gersonwu@qq.com> Date: 星期四, 06 三月 2025 16:17:06 +0800 Subject: [PATCH] 创建工单 --- src/layout/component/header/Header.vue | 130 +++++++++++++++++++++++++------------------ 1 files changed, 76 insertions(+), 54 deletions(-) diff --git a/src/layout/component/header/Header.vue b/src/layout/component/header/Header.vue index 5e71acb..980d7e6 100644 --- a/src/layout/component/header/Header.vue +++ b/src/layout/component/header/Header.vue @@ -1,56 +1,17 @@ <template> - <div class="top_text flex justify-between px-6 items-center"> + <div class="top_text flex justify-between px-6 items-center" :class="sidebarIsShow ? 'px-6' : 'pl-[unset] pr-6'"> <div class="flex-items-center"> - <div class="flex-items-center space-x-3 mr-4 pr-4 border border-solid border-r-1 border-l-0 border-y-0 border-gray-300" v-if="!sidebarIsShow"> - <el-tooltip content="灞曞紑渚ф爮" placement="right" effect="dark"> - <span - class="ywifont ywicon-cebianlan text-gray-700 active:text-gray-800 !text-[20px] cursor-pointer" - @click="emit('toggleSidebar',true)" - ></span> - </el-tooltip> - <div - class="flex-items-center rounded-full border border-solid px-2 py-1 space-x-1 cursor-pointer border-blue-400 text-blue-500 hover:bg-blue-500 hover:text-white" - @click="newChatClick" - > - <span class="ywifont ywicon-jia"></span> - <span>鏂板璇�</span> - </div> - </div> + <div + class="flex-items-center space-x-3 mr-4 pr-4 border border-solid border-r-1 border-l-0 border-y-0 border-gray-300" + v-if="!sidebarIsShow" + ></div> <div v-if="routerMeta.showTitle" class="font-bold flex items-center"> <span class="flex-center cursor-pointer" v-if="routerMeta.showBack" @click="goBack"> <SvgIcon name="ele-ArrowLeft" /> </span> - <span class="text-sm"> + <span class=""> {{ routerMeta.title }} </span> - </div> - </div> - - <div class="notice"> - <el-badge :value="`${state.announcementList.length}`"> - <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"> - <div class="notice_box_header"> - <span>鏈�鏂板叕鍛�</span> - </div> - <div class="notice_box_body"> - <div - class="notice_item" - v-for="item in state.announcementList" - :key="item.notify_id" - @click="announcementContentClick(item)" - > - <div class="flex items-center"> - <p class="set-circle"></p> - <p>{{ item.notify_message }}</p> - </div> - - <p class="text-right mr-[19px]"> - <span>{{ item.notify_time }}</span> - </p> - </div> - </div> </div> </div> <el-dialog @@ -71,16 +32,42 @@ </template> </el-dialog> </div> + <div class="notice" v-if="!isSharePage"> + <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"> + <div class="notice_box_header"> + <span>鏈�鏂板叕鍛�</span> + </div> + <div class="notice_box_body"> + <div class="notice_item" v-for="item in state.announcementList" :key="item.notify_id" @click="announcementContentClick(item)"> + <div class="flex items-center"> + <p class="set-circle"></p> + <p>{{ item.notify_message }}</p> + </div> + + <p class="text-right mr-[19px]"> + <span>{{ item.notify_time }}</span> + </p> + </div> + </div> + </div> + </div> </template> <script setup lang="ts"> -import { computed, onMounted, onUnmounted, reactive, triggerRef } from 'vue'; +import { onClickOutside } from '@vueuse/core'; +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'; - -const emit = defineEmits(['toggleSidebar']) +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, @@ -89,7 +76,24 @@ 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(); res.messages?.forEach((element) => { @@ -98,14 +102,22 @@ 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 = () => { @@ -124,7 +136,16 @@ const handleCloseAnnouncement = () => { state.isAnnouncementDialog = false; }; - +// 鍖哄煙鍏抽棴鏈�鏂板叕鍛� +onClickOutside( + noticeRef, + () => { + state.isShowAnnouncement = false; + }, + { + ignore: ['.el-overlay-dialog'], + } +); const newChatClick = () => { newChatRoomClick(); }; @@ -143,20 +164,21 @@ height: 42px; background-color: #fff; top: 0; - z-index: 0; + z-index: 1; } .notice { position: fixed; top: 18px; right: 30px; - z-index: 12; + z-index: 1; .set-notice { font-size: 12px; font-weight: 400; letter-spacing: 0; line-height: 17.38px; color: #9598b3; + z-index: 0; } .notice_box_show { width: 300px !important; @@ -171,7 +193,7 @@ } .notice_box { position: absolute; - z-index: 12; + z-index: 1; top: calc(100% + 20px); right: -10px; width: 0; -- Gitblit v1.9.3