优化分页和筛选功能:实现服务端分页和筛选,修复总数不匹配问题

- 优化设备管理、版本管理、用户管理、在线实例、公告管理页面的分页功能
- 后端添加筛选参数支持(application_id, status, type, search等)
- 前端移除冗余的前端筛选逻辑,改为服务端筛选
- 修复分页总数与筛选数据不匹配的问题
- 优化云端变量记录页面的时间筛选和搜索功能
- 修复DateTimePicker组件关闭后不自动更新的问题
This commit is contained in:
2026-05-08 13:45:21 +08:00
parent 4c060c494d
commit d0ef52ab4f
12 changed files with 542 additions and 155 deletions
+41 -7
View File
@@ -3,6 +3,7 @@ package admin
import (
"fmt"
"log"
"strconv"
"time"
"verification-platform-backend/internal/database"
"verification-platform-backend/internal/model"
@@ -57,10 +58,14 @@ func handleGetUsers(c *gin.Context) {
userID := c.GetUint("user_id")
log.Printf("[DEBUG] handleGetUsers called, userID: %d", userID)
var users []model.AppUser
var appHeartbeatTimeoutMap map[uint]int
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
applicationID := c.Query("application_id")
statusFilter := c.Query("status")
var users []model.AppUser
var appHeartbeatTimeoutMap map[uint]int
if applicationID != "" {
var appID uint
if _, err := fmt.Sscanf(applicationID, "%d", &appID); err != nil {
@@ -81,8 +86,13 @@ func handleGetUsers(c *gin.Context) {
}
appHeartbeatTimeoutMap[app.ID] = timeout
query := database.DB.Preload("Application").Where("application_id = ?", appID)
if statusFilter != "" {
query = query.Where("status = ?", statusFilter)
}
if app.UserID == userID {
if err := database.DB.Preload("Application").Where("application_id = ?", appID).Find(&users).Error; err != nil {
if err := query.Find(&users).Error; err != nil {
response.Error(c, 500, "获取用户列表失败")
return
}
@@ -102,7 +112,11 @@ func handleGetUsers(c *gin.Context) {
}
if len(cardUserIDs) > 0 {
if err := database.DB.Preload("Application").Where("id IN ?", cardUserIDs).Find(&users).Error; err != nil {
query = database.DB.Preload("Application").Where("id IN ?", cardUserIDs)
if statusFilter != "" {
query = query.Where("status = ?", statusFilter)
}
if err := query.Find(&users).Error; err != nil {
response.Error(c, 500, "获取用户列表失败")
return
}
@@ -137,7 +151,11 @@ func handleGetUsers(c *gin.Context) {
}
if len(ownAppIDs) > 0 {
if err := database.DB.Preload("Application").Where("application_id IN ?", ownAppIDs).Find(&users).Error; err != nil {
query := database.DB.Preload("Application").Where("application_id IN ?", ownAppIDs)
if statusFilter != "" {
query = query.Where("status = ?", statusFilter)
}
if err := query.Find(&users).Error; err != nil {
response.Error(c, 500, "获取用户列表失败")
return
}
@@ -179,8 +197,12 @@ func handleGetUsers(c *gin.Context) {
}
if len(allCardUserIDs) > 0 {
query := database.DB.Preload("Application").Where("id IN ?", allCardUserIDs)
if statusFilter != "" {
query = query.Where("status = ?", statusFilter)
}
var appUsers []model.AppUser
if err := database.DB.Preload("Application").Where("id IN ?", allCardUserIDs).Find(&appUsers).Error; err != nil {
if err := query.Find(&appUsers).Error; err != nil {
log.Printf("[DEBUG] Failed to get users: %v", err)
} else {
users = append(users, appUsers...)
@@ -246,9 +268,21 @@ func handleGetUsers(c *gin.Context) {
})
}
offset := (page - 1) * pageSize
end := offset + pageSize
if offset > len(usersWithStatus) {
offset = len(usersWithStatus)
}
if end > len(usersWithStatus) {
end = len(usersWithStatus)
}
paginatedUsers := usersWithStatus[offset:end]
responseData := gin.H{
"users": usersWithStatus,
"users": paginatedUsers,
"total": totalCount,
"page": page,
"page_size": pageSize,
"online_count": onlineCount,
"offline_count": offlineCount,
"banned_count": bannedCount,