123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- <script lang="ts" setup>
- import type { NotificationItem } from '@vben/layouts';
- import { computed, ref, watch } from 'vue';
- import { AuthenticationLoginExpiredModal } from '@vben/common-ui';
- import { VBEN_DOC_URL, VBEN_GITHUB_URL } from '@vben/constants';
- import { useWatermark } from '@vben/hooks';
- import { BookOpenText, CircleHelp, MdiGithub } from '@vben/icons';
- import {
- BasicLayout,
- LockScreen,
- Notification,
- UserDropdown,
- } from '@vben/layouts';
- import { preferences } from '@vben/preferences';
- import { useAccessStore, useUserStore } from '@vben/stores';
- import { openWindow } from '@vben/utils';
- import { $t } from '#/locales';
- import { useAuthStore } from '#/store';
- import LoginForm from '#/views/_core/authentication/login.vue';
- const notifications = ref<NotificationItem[]>([
- {
- avatar: 'https://avatar.vercel.sh/vercel.svg?text=VB',
- date: '3小时前',
- isRead: true,
- message: '描述信息描述信息描述信息',
- title: '收到了 14 份新周报',
- },
- {
- avatar: 'https://avatar.vercel.sh/1',
- date: '刚刚',
- isRead: false,
- message: '描述信息描述信息描述信息',
- title: '朱偏右 回复了你',
- },
- {
- avatar: 'https://avatar.vercel.sh/1',
- date: '2024-01-01',
- isRead: false,
- message: '描述信息描述信息描述信息',
- title: '曲丽丽 评论了你',
- },
- {
- avatar: 'https://avatar.vercel.sh/satori',
- date: '1天前',
- isRead: false,
- message: '描述信息描述信息描述信息',
- title: '代办提醒',
- },
- ]);
- const userStore = useUserStore();
- const authStore = useAuthStore();
- const accessStore = useAccessStore();
- const { destroyWatermark, updateWatermark } = useWatermark();
- const showDot = computed(() =>
- notifications.value.some((item) => !item.isRead),
- );
- const menus = computed(() => [
- {
- handler: () => {
- openWindow(VBEN_DOC_URL, {
- target: '_blank',
- });
- },
- icon: BookOpenText,
- text: $t('ui.widgets.document'),
- },
- {
- handler: () => {
- openWindow(VBEN_GITHUB_URL, {
- target: '_blank',
- });
- },
- icon: MdiGithub,
- text: 'GitHub',
- },
- {
- handler: () => {
- openWindow(`${VBEN_GITHUB_URL}/issues`, {
- target: '_blank',
- });
- },
- icon: CircleHelp,
- text: $t('ui.widgets.qa'),
- },
- ]);
- const avatar = computed(() => {
- return userStore.userInfo?.avatar ?? preferences.app.defaultAvatar;
- });
- async function handleLogout() {
- await authStore.logout(false);
- }
- function handleNoticeClear() {
- notifications.value = [];
- }
- function handleMakeAll() {
- notifications.value.forEach((item) => (item.isRead = true));
- }
- watch(
- () => preferences.app.watermark,
- async (enable) => {
- if (enable) {
- await updateWatermark({
- content: `${userStore.userInfo?.username}`,
- });
- } else {
- destroyWatermark();
- }
- },
- {
- immediate: true,
- },
- );
- </script>
- <template>
- <BasicLayout @clear-preferences-and-logout="handleLogout">
- <template #user-dropdown>
- <UserDropdown
- :avatar
- :menus
- :text="userStore.userInfo?.realName"
- description="ann.vben@gmail.com"
- tag-text="Pro"
- @logout="handleLogout"
- />
- </template>
- <template #notification>
- <Notification
- :dot="showDot"
- :notifications="notifications"
- @clear="handleNoticeClear"
- @make-all="handleMakeAll"
- />
- </template>
- <template #extra>
- <AuthenticationLoginExpiredModal
- v-model:open="accessStore.loginExpired"
- :avatar
- >
- <LoginForm />
- </AuthenticationLoginExpiredModal>
- </template>
- <template #lock-screen>
- <LockScreen :avatar @to-login="handleLogout" />
- </template>
- </BasicLayout>
- </template>
|