diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 636de6c..7eb0bd9 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -52,14 +52,6 @@ const navLinks = [ > 管理后台 - - 用户管理 - (null) + +async function fetchUserCount() { + try { + const res = await fetch('/api/admin/users/count', { + headers: { Authorization: `Bearer ${authStore.token}` }, + }) + if (res.ok) { + const data = await res.json() + userCount.value = data.count + const stat = stats.value.find(s => s.label === '用户总数') + if (stat) stat.value = String(data.count) + } + } catch {} +} + onMounted(async () => { await authStore.fetchUser() + fetchUserCount() }) +function handleStatClick(route: string) { + if (route) router.push(route) +} + function handleLogout() { authStore.logout() router.push('/') @@ -26,11 +48,13 @@ function handleLogout() {

管理后台

-
+
diff --git a/internal/handler/user.go b/internal/handler/user.go index 934e989..c3e3a2c 100644 --- a/internal/handler/user.go +++ b/internal/handler/user.go @@ -44,6 +44,12 @@ func formatUser(u *model.User) userResponse { } } +func GetUserCount(c *gin.Context) { + var count int64 + db.DB.Model(&model.User{}).Count(&count) + c.JSON(http.StatusOK, gin.H{"count": count}) +} + func ListUsers(c *gin.Context) { var users []model.User db.DB.Order("id asc").Find(&users) diff --git a/internal/router/router.go b/internal/router/router.go index 4deae44..620f37f 100644 --- a/internal/router/router.go +++ b/internal/router/router.go @@ -26,6 +26,7 @@ func Setup(r *gin.Engine) { admin := r.Group("/api/admin") admin.Use(middleware.AuthMiddleware(), middleware.AdminMiddleware()) { + admin.GET("/users/count", handler.GetUserCount) admin.GET("/users", handler.ListUsers) admin.POST("/users", handler.CreateUser) admin.PUT("/users/:id", handler.UpdateUser)