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 @@
+
+
+
+
+
+
+ 统计区间:{{ rangeText }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AI 分析
+
+ {{ loginSummaryStore.analysisError }}
+
+
+
+
+
+
+
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,
+ }
+})