Files
certd/packages/ui/certd-client/src/layout/layout-basic.vue

98 lines
2.8 KiB
Vue
Raw Normal View History

<script lang="ts" setup>
import { BasicLayout, LockScreen, UserDropdown } from "/@/vben/layouts";
import { computed, onErrorCaptured, onMounted, provide, ref } from "vue";
2025-04-12 23:59:03 +08:00
import { useUserStore } from "/@/store/user";
import VipButton from "/@/components/vip-button/index.vue";
import TutorialButton from "/@/components/tutorial/index.vue";
2025-04-12 23:59:03 +08:00
import { useSettingStore } from "/@/store/settings";
2025-03-07 18:01:51 +08:00
import PageFooter from "./components/footer/index.vue";
import { useRouter } from "vue-router";
import MaxKBChat from "/@/components/ai/index.vue";
const userStore = useUserStore();
2025-03-07 18:01:51 +08:00
const router = useRouter();
const menus = computed(() => [
2025-03-07 18:01:51 +08:00
{
handler: () => {
router.push("/certd/mine/user-profile");
},
icon: "fa-solid:book",
2025-05-10 21:31:32 +08:00
text: "账号信息",
},
]);
const avatar = computed(() => {
2025-03-07 18:01:51 +08:00
const avt = userStore.getUserInfo?.avatar;
return avt ? `/api/basic/file/download?key=${avt}` : "";
});
async function handleLogout() {
await userStore.logout(true);
}
const settingStore = useSettingStore();
const sysPublic = computed(() => {
return settingStore.sysPublic;
});
const siteInfo = computed(() => {
return settingStore.siteInfo;
});
2025-05-10 21:31:32 +08:00
onErrorCaptured(e => {
console.error("ErrorCaptured:", e);
// notification.error({ message: e.message });
//阻止错误向上传递
return false;
});
onMounted(async () => {
await settingStore.checkUrlBound();
});
function goGithub() {
window.open("https://github.com/certd/certd");
}
const settingsStore = useSettingStore();
const chatBox = ref();
const openChat = (q: string) => {
chatBox.value.openChat({ q });
};
provide("fn:ai.open", openChat);
</script>
<template>
<BasicLayout @clear-preferences-and-logout="handleLogout">
<template #user-dropdown>
2025-03-07 18:01:51 +08:00
<UserDropdown :avatar="avatar" :menus="menus" :text="userStore.userInfo?.nickName || userStore.userInfo?.username" description="" tag-text="" @logout="handleLogout" />
</template>
<template #lock-screen>
<LockScreen :avatar @to-login="handleLogout" />
</template>
<template #header-right-0>
<div v-if="!settingStore.isComm" class="hover:bg-accent ml-1 mr-2 cursor-pointer rounded-full hidden md:block">
<tutorial-button class="flex-center header-btn" />
2025-03-11 22:25:14 +08:00
</div>
2025-03-07 18:01:51 +08:00
<div class="hover:bg-accent ml-1 mr-2 cursor-pointer rounded-full">
<vip-button class="flex-center header-btn" mode="nav" />
</div>
<div v-if="!settingStore.isComm" class="hover:bg-accent ml-1 mr-2 cursor-pointer rounded-full">
<fs-button shape="circle" type="text" icon="ion:logo-github" :text="null" @click="goGithub" />
2025-05-11 10:22:10 +08:00
</div>
</template>
<template #footer>
2025-03-07 18:01:51 +08:00
<PageFooter></PageFooter>
<MaxKBChat v-if="settingsStore.sysPublic.aiChatEnabled !== false" ref="chatBox" />
</template>
</BasicLayout>
</template>
<style lang="less">
.header-btn {
font-size: 14px;
2025-03-07 18:01:51 +08:00
padding: 5px;
}
</style>