-
-
-
-
-
- 消息中心
-
-
+
+
@@ -229,16 +227,37 @@ const reminderForm = ref({
// 计算属性
const notifications = computed(() => notificationService.getAllNotifications())
-const unreadCount = computed(() => notificationService.unreadCount.value)
+const unreadCount = computed(() => {
+ const count = notificationService.unreadCount.value
+ // 确保返回有效的数字,避免NaN
+ if (typeof count === 'number' && !isNaN(count) && isFinite(count)) {
+ return count
+ }
+ return 0
+})
const totalCount = computed(() => notifications.value.length)
-const pendingCount = computed(() => notificationService.pendingCount.value)
-const equipmentCount = computed(() =>
- notificationService.equipmentBorrowCount.value +
- notificationService.equipmentReturnCount.value +
- notificationService.equipmentMaintenanceCount.value +
- notificationService.equipmentAlertCount.value
-)
-const urgentCount = computed(() => notificationService.urgentCount.value)
+const pendingCount = computed(() => {
+ const count = notificationService.pendingCount.value
+ if (typeof count === 'number' && !isNaN(count) && isFinite(count)) {
+ return count
+ }
+ return 0
+})
+const equipmentCount = computed(() => {
+ const borrowCount = notificationService.equipmentBorrowCount.value || 0
+ const returnCount = notificationService.equipmentReturnCount.value || 0
+ const maintenanceCount = notificationService.equipmentMaintenanceCount.value || 0
+ const alertCount = notificationService.equipmentAlertCount.value || 0
+
+ return borrowCount + returnCount + maintenanceCount + alertCount
+})
+const urgentCount = computed(() => {
+ const count = notificationService.urgentCount.value
+ if (typeof count === 'number' && !isNaN(count) && isFinite(count)) {
+ return count
+ }
+ return 0
+})
const hasUrgentNotifications = computed(() => urgentCount.value > 0)
// 过滤后的消息列表
@@ -644,6 +663,11 @@ onUnmounted(() => {
clearInterval(reminderCheckInterval)
}
})
+
+// 暴露方法给父组件
+defineExpose({
+ toggleDropdown
+})
diff --git a/src/types/auto-imports.d.ts b/src/types/auto-imports.d.ts
index eab6be6..369aad4 100644
--- a/src/types/auto-imports.d.ts
+++ b/src/types/auto-imports.d.ts
@@ -70,6 +70,6 @@ declare global {
// for type re-export
declare global {
// @ts-ignore
- export type { Component, ComponentPublicInstance, ComputedRef, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, VNode, WritableComputedRef } from 'vue'
+ export type { Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
import('vue')
}
diff --git a/src/types/components.d.ts b/src/types/components.d.ts
index 2c3bca4..7fa6b1b 100644
--- a/src/types/components.d.ts
+++ b/src/types/components.d.ts
@@ -7,68 +7,7 @@ export {}
declare module 'vue' {
export interface GlobalComponents {
- ApprovalAssistant: typeof import('./../components/ApprovalAssistant/index.vue')['default']
- Avatar: typeof import('./../components/Avatar/index.vue')['default']
- Breadcrumb: typeof import('./../components/Breadcrumb/index.vue')['default']
- CellCopy: typeof import('./../components/CellCopy/index.vue')['default']
- Chart: typeof import('./../components/Chart/index.vue')['default']
- ColumnSetting: typeof import('./../components/GiTable/src/components/ColumnSetting.vue')['default']
- CronForm: typeof import('./../components/GenCron/CronForm/index.vue')['default']
- CronModal: typeof import('./../components/GenCron/CronModal/index.vue')['default']
- DateRangePicker: typeof import('./../components/DateRangePicker/index.vue')['default']
- DayForm: typeof import('./../components/GenCron/CronForm/component/day-form.vue')['default']
- FilePreview: typeof import('./../components/FilePreview/index.vue')['default']
- GiCellAvatar: typeof import('./../components/GiCell/GiCellAvatar.vue')['default']
- GiCellGender: typeof import('./../components/GiCell/GiCellGender.vue')['default']
- GiCellStatus: typeof import('./../components/GiCell/GiCellStatus.vue')['default']
- GiCellTag: typeof import('./../components/GiCell/GiCellTag.vue')['default']
- GiCellTags: typeof import('./../components/GiCell/GiCellTags.vue')['default']
- GiCodeView: typeof import('./../components/GiCodeView/index.vue')['default']
- GiDot: typeof import('./../components/GiDot/index.tsx')['default']
- GiEditTable: typeof import('./../components/GiEditTable/GiEditTable.vue')['default']
- GiFooter: typeof import('./../components/GiFooter/index.vue')['default']
- GiForm: typeof import('./../components/GiForm/src/GiForm.vue')['default']
- GiIconBox: typeof import('./../components/GiIconBox/index.vue')['default']
- GiIconSelector: typeof import('./../components/GiIconSelector/index.vue')['default']
- GiIframe: typeof import('./../components/GiIframe/index.vue')['default']
- GiOption: typeof import('./../components/GiOption/index.vue')['default']
- GiOptionItem: typeof import('./../components/GiOptionItem/index.vue')['default']
- GiPageLayout: typeof import('./../components/GiPageLayout/index.vue')['default']
- GiSpace: typeof import('./../components/GiSpace/index.vue')['default']
- GiSplitButton: typeof import('./../components/GiSplitButton/index.vue')['default']
- GiSplitPane: typeof import('./../components/GiSplitPane/index.vue')['default']
- GiSplitPaneFlexibleBox: typeof import('./../components/GiSplitPane/components/GiSplitPaneFlexibleBox.vue')['default']
- GiSvgIcon: typeof import('./../components/GiSvgIcon/index.vue')['default']
- GiTable: typeof import('./../components/GiTable/src/GiTable.vue')['default']
- GiTag: typeof import('./../components/GiTag/index.tsx')['default']
- GiThemeBtn: typeof import('./../components/GiThemeBtn/index.vue')['default']
- HourForm: typeof import('./../components/GenCron/CronForm/component/hour-form.vue')['default']
- Icon403: typeof import('./../components/icons/Icon403.vue')['default']
- Icon404: typeof import('./../components/icons/Icon404.vue')['default']
- Icon500: typeof import('./../components/icons/Icon500.vue')['default']
- IconBorders: typeof import('./../components/icons/IconBorders.vue')['default']
- IconTableSize: typeof import('./../components/icons/IconTableSize.vue')['default']
- IconTreeAdd: typeof import('./../components/icons/IconTreeAdd.vue')['default']
- IconTreeReduce: typeof import('./../components/icons/IconTreeReduce.vue')['default']
- ImageImport: typeof import('./../components/ImageImport/index.vue')['default']
- ImageImportWizard: typeof import('./../components/ImageImportWizard/index.vue')['default']
- IndustrialImageList: typeof import('./../components/IndustrialImageList/index.vue')['default']
- JsonPretty: typeof import('./../components/JsonPretty/index.vue')['default']
- MinuteForm: typeof import('./../components/GenCron/CronForm/component/minute-form.vue')['default']
- MonthForm: typeof import('./../components/GenCron/CronForm/component/month-form.vue')['default']
- NotificationCenter: typeof import('./../components/NotificationCenter/index.vue')['default']
- ParentView: typeof import('./../components/ParentView/index.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
- SecondForm: typeof import('./../components/GenCron/CronForm/component/second-form.vue')['default']
- SplitPanel: typeof import('./../components/SplitPanel/index.vue')['default']
- TextCopy: typeof import('./../components/TextCopy/index.vue')['default']
- TurbineGrid: typeof import('./../components/TurbineGrid/index.vue')['default']
- UserSelect: typeof import('./../components/UserSelect/index.vue')['default']
- Verify: typeof import('./../components/Verify/index.vue')['default']
- VerifyPoints: typeof import('./../components/Verify/Verify/VerifyPoints.vue')['default']
- VerifySlide: typeof import('./../components/Verify/Verify/VerifySlide.vue')['default']
- WeekForm: typeof import('./../components/GenCron/CronForm/component/week-form.vue')['default']
- YearForm: typeof import('./../components/GenCron/CronForm/component/year-form.vue')['default']
}
}