feat: request health api for session keep-alive (#4949)

#### What type of PR is this?

/area console
/kind improvement
/milestone 2.11.0

#### What this PR does / why we need it:

在 Console 和 UC 轮询 /actuator/health 接口保持登录会话,目前是 5min 请求一次。

#### Which issue(s) this PR fixes:

Fixes #4947 

#### Does this PR introduce a user-facing change?

```release-note
优化 Console 的登录会话保活机制。
```
pull/4955/head
Ryan Wang 2023-11-30 12:10:08 +08:00 committed by GitHub
parent 6e70d2e047
commit 8f83df415c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 27 additions and 0 deletions

View File

@ -39,6 +39,7 @@ import { usePageUpdateMutate } from "./composables/use-page-update-mutate";
import { useAutoSaveContent } from "@console/composables/use-auto-save-content"; import { useAutoSaveContent } from "@console/composables/use-auto-save-content";
import { useContentSnapshot } from "@console/composables/use-content-snapshot"; import { useContentSnapshot } from "@console/composables/use-content-snapshot";
import { useSaveKeybinding } from "@console/composables/use-save-keybinding"; import { useSaveKeybinding } from "@console/composables/use-save-keybinding";
import { useSessionKeepAlive } from "@/composables/use-session-keep-alive";
const router = useRouter(); const router = useRouter();
const { t } = useI18n(); const { t } = useI18n();
@ -373,6 +374,9 @@ const handlePreview = async () => {
useSaveKeybinding(handleSave); useSaveKeybinding(handleSave);
// Keep session alive
useSessionKeepAlive();
// Upload image // Upload image
async function handleUploadImage(file: File) { async function handleUploadImage(file: File) {
if (!isUpdateMode.value) { if (!isUpdateMode.value) {

View File

@ -39,6 +39,7 @@ import { contentAnnotations } from "@/constants/annotations";
import { useAutoSaveContent } from "@console/composables/use-auto-save-content"; import { useAutoSaveContent } from "@console/composables/use-auto-save-content";
import { useContentSnapshot } from "@console/composables/use-content-snapshot"; import { useContentSnapshot } from "@console/composables/use-content-snapshot";
import { useSaveKeybinding } from "@console/composables/use-save-keybinding"; import { useSaveKeybinding } from "@console/composables/use-save-keybinding";
import { useSessionKeepAlive } from "@/composables/use-session-keep-alive";
const router = useRouter(); const router = useRouter();
const { t } = useI18n(); const { t } = useI18n();
@ -398,6 +399,9 @@ const handlePreview = async () => {
useSaveKeybinding(handleSave); useSaveKeybinding(handleSave);
// Keep session alive
useSessionKeepAlive();
// Upload image // Upload image
async function handleUploadImage(file: File) { async function handleUploadImage(file: File) {
if (!isUpdateMode.value) { if (!isUpdateMode.value) {

View File

@ -0,0 +1,15 @@
import { useUserStore } from "@/stores/user";
import { useQuery } from "@tanstack/vue-query";
import { computed } from "vue";
export function useSessionKeepAlive() {
const { isAnonymous } = useUserStore();
useQuery({
queryKey: ["health", "keep-session-alive"],
queryFn: () => fetch("/actuator/health"),
refetchInterval: 1000 * 60 * 5, // 5 minutes
refetchOnWindowFocus: true,
enabled: computed(() => !isAnonymous),
});
}

View File

@ -32,6 +32,7 @@ import PostSettingEditModal from "./components/PostSettingEditModal.vue";
import HasPermission from "@/components/permission/HasPermission.vue"; import HasPermission from "@/components/permission/HasPermission.vue";
import { provide } from "vue"; import { provide } from "vue";
import type { ComputedRef } from "vue"; import type { ComputedRef } from "vue";
import { useSessionKeepAlive } from "@/composables/use-session-keep-alive";
const router = useRouter(); const router = useRouter();
const { t } = useI18n(); const { t } = useI18n();
@ -350,6 +351,9 @@ async function handleUploadImage(file: File) {
}); });
return data; return data;
} }
// Keep session alive
useSessionKeepAlive();
</script> </script>
<template> <template>