From 0a9cbe6987b2d7e237a011f8a45f6f09cf7e6bce Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期二, 13 一月 2026 11:02:55 +0800
Subject: [PATCH] fix: 公告类型字段,另加一个配置功能(类似字典功能),并且也作为消息通知通知到每个人
---
src/layout/components/Navbar.vue | 152 ++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 127 insertions(+), 25 deletions(-)
diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue
index 2574903..03e2101 100644
--- a/src/layout/components/Navbar.vue
+++ b/src/layout/components/Navbar.vue
@@ -1,31 +1,52 @@
<template>
<div class="navbar">
<div>
- <hamburger id="hamburger-container" :is-active="appStore.sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
+ <hamburger id="hamburger-container" :is-active="appStore.sidebar.opened" class="hamburger-container"
+ @toggleClick="toggleSideBar" />
<breadcrumb v-if="!settingsStore.topNav" id="breadcrumb-container" class="breadcrumb-container" />
</div>
-<!-- <top-nav v-if="settingsStore.topNav" id="topmenu-container" class="topmenu-container" />-->
+ <!-- <top-nav v-if="settingsStore.topNav" id="topmenu-container" class="topmenu-container" />-->
<div class="center-menu">
- <span class="label">{{userStore.currentFactoryName}}</span>
+ <span class="label">{{ userStore.currentFactoryName }}</span>
<el-dropdown @command="handleFactoryChange" class="right-menu-item hover-effect" trigger="click">
- <div class="avatar-wrapper">
- <el-icon><Switch /></el-icon>
+ <div>
+ <el-icon size="20">
+ <Switch />
+ </el-icon>
</div>
<template #dropdown>
- <el-dropdown-menu >
- <el-dropdown-item
- v-for="item in factoryList"
- :key="item.deptId"
- :command="item"
- >
+ <el-dropdown-menu>
+ <el-dropdown-item v-for="item in factoryList" :key="item.deptId" :command="item">
{{ item.deptName }}
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
-
</div>
<div class="right-menu">
+ <!-- 娑堟伅閫氱煡 -->
+ <el-popover
+ v-model:visible="notificationVisible"
+ :width="500"
+ placement="bottom-end"
+ trigger="click"
+ :popper-options="{ modifiers: [{ name: 'offset', options: { offset: [0, 10] } }] }"
+ popper-class="notification-popover"
+ >
+ <template #reference>
+ <div class="notification-container right-menu-item hover-effect">
+ <el-badge :value="unreadCount" :hidden="unreadCount === 0" class="notification-badge">
+ <el-icon :size="20" style="cursor: pointer;">
+ <Bell />
+ </el-icon>
+ </el-badge>
+ </div>
+ </template>
+ <NotificationCenter
+ @unreadCountChange="handleUnreadCountChange"
+ ref="notificationCenterRef"
+ />
+ </el-popover>
<div class="avatar-container">
<el-dropdown @command="handleCommand" class="right-menu-item hover-effect" trigger="click">
<div class="avatar-wrapper">
@@ -53,6 +74,7 @@
<script setup>
import { ElMessageBox } from 'element-plus'
+import { Bell } from '@element-plus/icons-vue'
import Breadcrumb from '@/components/Breadcrumb'
import TopNav from '@/components/TopNav'
import Hamburger from '@/components/Hamburger'
@@ -61,6 +83,7 @@
import HeaderSearch from '@/components/HeaderSearch'
import RuoYiGit from '@/components/RuoYi/Git'
import RuoYiDoc from '@/components/RuoYi/Doc'
+import NotificationCenter from './NotificationCenter/index.vue'
import useAppStore from '@/store/modules/app'
import useUserStore from '@/store/modules/user'
import useSettingsStore from '@/store/modules/settings'
@@ -72,9 +95,16 @@
const userStore = useUserStore()
const settingsStore = useSettingsStore()
const factoryList = ref([])
+const notificationVisible = ref(false)
+const notificationCenterRef = ref(null)
+const unreadCount = ref(0)
function toggleSideBar() {
appStore.toggleSideBar()
}
+// const redirect = ref(undefined)
+// watch(route, (newRoute) => {
+// redirect.value = newRoute.query && newRoute.query.redirect
+// }, { immediate: true })
function handleCommand(command) {
switch (command) {
@@ -111,12 +141,12 @@
}
function getUserLoginFacotryList() {
- if(userStore.id){
- userLoginFacotryList({userId:userStore.id}).then(res => {
+ if (userStore.id) {
+ userLoginFacotryList({ userId: userStore.id }).then(res => {
console.log('res', res)
factoryList.value = res.data
})
- }else {
+ } else {
factoryList.value = []
}
}
@@ -126,26 +156,62 @@
handleLogin(command.deptId);
}
-function handleLogin(currentFatoryId){
+function handleLogin(currentFatoryId) {
const loginForm = {
username: Cookies.get("username"),
password: Cookies.get("password") === undefined ? null : decrypt(Cookies.get("password")),
currentFatoryId: currentFatoryId
}
userStore.loginCheckFactory(loginForm).then(res => {
- const query = route.query
- const otherQueryParams = Object.keys(query).reduce((acc, cur) => {
- if (cur !== "redirect") {
- acc[cur] = query[cur]
- }
- return acc
- }, {})
- router.push({ path: redirect.value || "/", query: otherQueryParams })
- }).catch(() => {
+ forceReload();
+ }).catch((err) => {
+ console.log(err)
})
+}
+function forceReload() {
+ const currentUrl = window.location.origin + window.location.pathname;
+ const timestamp = new Date().getTime();
+ window.location.href = `${currentUrl}?reload=${timestamp}`;
}
getUserLoginFacotryList();
+
+// 娑堟伅閫氱煡鐩稿叧
+function handleUnreadCountChange(count) {
+ unreadCount.value = count
+}
+
+// 缁勪欢鎸傝浇鏃跺姞杞芥湭璇绘暟閲忓拰瀹氭椂鍒锋柊
+let unreadCountTimer = null
+onMounted(() => {
+ // 寤惰繜鍔犺浇锛岀‘淇濈粍浠跺凡娓叉煋
+ nextTick(() => {
+ if (notificationCenterRef.value) {
+ notificationCenterRef.value.loadUnreadCount()
+ }
+ })
+ // 瀹氭椂鍒锋柊鏈鏁伴噺锛堟瘡30绉掞級
+ unreadCountTimer = setInterval(() => {
+ if (notificationCenterRef.value) {
+ notificationCenterRef.value.loadUnreadCount()
+ }
+ }, 30000)
+})
+
+// 鐩戝惉 popover 鏄剧ず鐘舵�侊紝鎵撳紑鏃跺姞杞芥秷鎭垪琛�
+watch(notificationVisible, (val) => {
+ if (val && notificationCenterRef.value) {
+ nextTick(() => {
+ notificationCenterRef.value.loadMessages()
+ })
+ }
+})
+
+onUnmounted(() => {
+ if (unreadCountTimer) {
+ clearInterval(unreadCountTimer)
+ }
+})
</script>
<style lang='scss' scoped>
@@ -155,15 +221,20 @@
position: relative;
background: var(--navbar-bg);
box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
+
.center-menu {
line-height: 50px;
position: absolute;
left: 50%;
transform: translateX(-50%);
+ display: flex;
+ align-items: center;
+
.label {
font-weight: bold;
font-size: 18px;
color: #333333;
+ margin-right: 10px;
}
}
@@ -235,6 +306,19 @@
}
}
+ .notification-container {
+ margin-right: 20px;
+ display: flex;
+ align-items: center;
+ cursor: pointer;
+
+ .notification-badge {
+ :deep(.el-badge__content) {
+ border: none;
+ }
+ }
+ }
+
.avatar-container {
margin-right: 40px;
@@ -260,4 +344,22 @@
}
}
}
+
+</style>
+
+<style lang="scss">
+.notification-popover {
+ padding: 0 !important;
+
+ .el-popover__title {
+ display: none;
+ }
+
+ .el-popover__body {
+ padding: 0 !important;
+ }
+}
+.el-badge__content.is-fixed{
+ top: 12px;
+}
</style>
--
Gitblit v1.9.3