From e54aab64d2062c7585bc910983cea7bddd18dc89 Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Sun, 18 Jan 2026 20:10:54 +0800 Subject: [PATCH] add login summary --- src/App.vue | 2 + src/oj/api.ts | 4 + src/shared/components/Login.vue | 5 +- src/shared/components/LoginSummaryModal.vue | 87 +++++++++++++++++++++ src/shared/store/loginSummary.ts | 55 +++++++++++++ 5 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 src/shared/components/LoginSummaryModal.vue create mode 100644 src/shared/store/loginSummary.ts diff --git a/src/App.vue b/src/App.vue index baf7621..08713ec 100644 --- a/src/App.vue +++ b/src/App.vue @@ -6,6 +6,7 @@ import { useConfigStore } from "shared/store/config" import { useConfigUpdate } from "shared/composables/configUpdate" import { useMaxKB } from "shared/composables/maxkb" import { useUserStore } from "shared/store/user" +import LoginSummaryModal from "shared/components/LoginSummaryModal.vue" const isDark = useDark() const configStore = useConfigStore() @@ -60,6 +61,7 @@ provide("hljs", hljsInstance) > + diff --git a/src/oj/api.ts b/src/oj/api.ts index 3df84a9..04890df 100644 --- a/src/oj/api.ts +++ b/src/oj/api.ts @@ -297,6 +297,10 @@ export function getAIHeatmapData() { return http.get("ai/heatmap") } +export function getAILoginSummary() { + return http.get("ai/login_summary") +} + // ==================== 流程图相关API ==================== export function submitFlowchart(data: { diff --git a/src/shared/components/Login.vue b/src/shared/components/Login.vue index abf1c53..b650ef9 100644 --- a/src/shared/components/Login.vue +++ b/src/shared/components/Login.vue @@ -4,10 +4,12 @@ import { storeToRefs } from "pinia" import { useAuthModalStore } from "../store/authModal" import { useConfigStore } from "../store/config" import { useUserStore } from "../store/user" +import { useLoginSummaryStore } from "../store/loginSummary" const userStore = useUserStore() const configStore = useConfigStore() const authStore = useAuthModalStore() +const loginSummaryStore = useLoginSummaryStore() const { loginModalOpen, @@ -60,7 +62,8 @@ async function submit() { } if (!msg.value) { authStore.closeLoginModal() - userStore.getMyProfile() + await userStore.getMyProfile() + loginSummaryStore.open() } } }) diff --git a/src/shared/components/LoginSummaryModal.vue b/src/shared/components/LoginSummaryModal.vue new file mode 100644 index 0000000..8c1a608 --- /dev/null +++ b/src/shared/components/LoginSummaryModal.vue @@ -0,0 +1,87 @@ + + + diff --git a/src/shared/store/loginSummary.ts b/src/shared/store/loginSummary.ts new file mode 100644 index 0000000..e57d924 --- /dev/null +++ b/src/shared/store/loginSummary.ts @@ -0,0 +1,55 @@ +import { getAILoginSummary } from "oj/api" + +interface LoginSummary { + start: string + end: string + new_problem_count: number + submission_count: number + accepted_count: number + solved_count: number + flowchart_submission_count: number +} + +export const useLoginSummaryStore = defineStore("loginSummary", () => { + const show = ref(false) + const loading = ref(false) + const summary = ref(null) + const analysis = ref("") + const analysisError = ref("") + + async function fetchSummary() { + loading.value = true + analysis.value = "" + analysisError.value = "" + try { + const res = await getAILoginSummary() + summary.value = res.data.summary + analysis.value = res.data.analysis || "" + analysisError.value = res.data.analysis_error || "" + } catch (err) { + analysisError.value = "获取登录统计失败,请稍后再试" + } finally { + loading.value = false + } + } + + async function open() { + show.value = true + await fetchSummary() + } + + function close() { + show.value = false + } + + return { + show, + loading, + summary, + analysis, + analysisError, + fetchSummary, + open, + close, + } +})