refactor: 优化 SSE 连接及在线用户展示逻辑

This commit is contained in:
Ray.Hao
2026-03-24 10:16:11 +08:00
parent dd52225378
commit e59347ea82
3 changed files with 11 additions and 10 deletions

View File

@@ -11,9 +11,6 @@ import type {
MobileUpdateForm,
EmailUpdateForm,
OptionItem,
UserEventQueryParams,
UserEventItem,
LoginDeviceItem,
} from "@/types/api";
const USER_BASE_URL = "/api/v1/users";

View File

@@ -135,6 +135,13 @@ function createSseConnection(options: UseSseOptions = {}) {
eventSource.onerror = handleError;
eventSource.onmessage = handleMessage;
// 注册所有已订阅的事件处理器
eventHandlers.forEach((_, eventName) => {
if (eventName !== "message") {
eventSource!.addEventListener(eventName, handleCustomEvent(eventName) as EventListener);
}
});
log("正在建立 SSE 连接...");
};

View File

@@ -131,16 +131,13 @@
<div class="flex-x-between">
<span class="text-xs font-medium text-[--el-text-color-secondary]">在线用户</span>
<el-tag
size="small"
:type="
isConnected ? 'success' : connectionState === 'CONNECTING' ? 'warning' : 'danger'
"
size="small"
effect="plain"
class="inline-flex"
>
<el-icon class="mr-1">
<Loading v-if="!isConnected && connectionState === 'CONNECTING'" />
<CircleCheck v-else-if="isConnected" />
<CircleClose v-else />
</el-icon>
SSE {{ sseStatusText }}
</el-tag>
</div>
@@ -390,7 +387,7 @@ import type { VisitStatsDetail, VisitTrendDetail } from "@/types/api";
import { useUserStore } from "@/store/modules/user";
import { formatGrowthRate } from "@/utils";
import { useTransition, useDateFormat } from "@vueuse/core";
import { CircleCheck, CircleClose, Loading, Clock, Menu } from "@element-plus/icons-vue";
import { Clock, Menu } from "@element-plus/icons-vue";
import { useOnlineCount, useRecentMenus } from "@/composables";
const router = useRouter();