Files
xk-admin/apps/web-antd/src/app.vue

97 lines
2.6 KiB
Vue
Raw Normal View History

2024-05-19 21:20:42 +08:00
<script lang="ts" setup>
2025-07-19 16:47:52 +08:00
import { computed, ref, watch } from 'vue';
2024-05-19 21:20:42 +08:00
2024-07-31 00:19:17 +08:00
import { useAntdDesignTokens } from '@vben/hooks';
import { preferences, usePreferences } from '@vben/preferences';
2025-07-19 16:47:52 +08:00
import { useUserStore as useVbenUserStore } from '@vben/stores';
2024-06-01 23:15:29 +08:00
2024-06-22 00:25:13 +08:00
import { App, ConfigProvider, theme } from 'ant-design-vue';
2024-06-08 19:49:06 +08:00
import { antdLocale } from '#/locales';
import { GlobalContextMenu } from '#/components/context-menu';
import DoctorTransferFloat from '#/components/doctor-transfer-float/DoctorTransferFloat.vue';
2025-07-19 16:47:52 +08:00
import { useWebSocket } from '#/views/business/chat/composables/useWebSocket';
import { useChatStore } from '#/views/business/chat/stores/chat';
import { useUserStore } from '#/views/business/chat/stores/user';
2024-05-19 21:20:42 +08:00
defineOptions({ name: 'App' });
2025-07-19 16:47:52 +08:00
const { connectWebSocket } = useWebSocket();
const userStore = useUserStore();
const chatStore = useChatStore();
const vbenUserStore = useVbenUserStore();
// 用户信息加载状态跟踪
const userInfoLoaded = ref(false);
// 监听userInfo加载完成
watch(
() => vbenUserStore.userInfo,
(newUserInfo) => {
if (newUserInfo) {
console.log('用户信息已加载:', newUserInfo)
userStore.currentUser = newUserInfo;
userStore.login(newUserInfo);
userInfoLoaded.value = true;
}
},
{ immediate: true },
2025-04-07 17:02:39 +08:00
);
2024-05-19 21:20:42 +08:00
2024-06-01 23:15:29 +08:00
const { isDark } = usePreferences();
2024-07-31 00:19:17 +08:00
const { tokens } = useAntdDesignTokens();
2024-05-19 21:20:42 +08:00
const tokenTheme = computed(() => {
2024-06-22 00:25:13 +08:00
const algorithm = isDark.value
2024-05-19 21:20:42 +08:00
? [theme.darkAlgorithm]
: [theme.defaultAlgorithm];
2024-06-01 23:15:29 +08:00
if (preferences.app.compact) {
2024-06-22 00:25:13 +08:00
algorithm.push(theme.compactAlgorithm);
2024-05-19 21:20:42 +08:00
}
2024-06-22 00:25:13 +08:00
2024-05-19 21:20:42 +08:00
return {
2024-06-22 00:25:13 +08:00
algorithm,
2024-07-31 00:19:17 +08:00
token: tokens,
2024-05-19 21:20:42 +08:00
};
});
2025-07-19 16:47:52 +08:00
const initWebsocket = () => {
// 确保用户信息已加载
if (!userStore.currentUser) return;
// 初始化数据库
chatStore.initDB();
// 加载好友列表(使用用户ID)
2025-07-22 16:55:09 +08:00
chatStore.loadFriends(userStore.presetUsers, userStore.currentUser?.doctor_id);
2025-07-19 16:47:52 +08:00
// 创建WebSocket连接
connectWebSocket();
};
// 当userInfo加载完成后再执行初始化
watch(userInfoLoaded, (loaded) => {
if (loaded) {
2025-12-23 11:05:12 +08:00
initWebsocket();
2025-07-19 16:47:52 +08:00
}
});
/** 诊所医生账号显示传方悬浮窗(有 doctor_id 且绑定门店) */
const showDoctorTransferFloat = computed(() => {
const info = vbenUserStore.userInfo as Record<string, any> | null;
if (!info) return false;
return !!(info.doctor_id && info.store_id);
});
2024-05-19 21:20:42 +08:00
</script>
<template>
<ConfigProvider :locale="antdLocale" :theme="tokenTheme">
<App>
<RouterView />
<GlobalContextMenu />
<DoctorTransferFloat v-if="showDoctorTransferFloat" />
</App>
</ConfigProvider>
2024-05-19 21:20:42 +08:00
</template>