diff --git a/backend/internal/modules/adminaudit/dto.go b/backend/internal/modules/adminaudit/dto.go index f6dfafb..5fbe553 100644 --- a/backend/internal/modules/adminaudit/dto.go +++ b/backend/internal/modules/adminaudit/dto.go @@ -7,10 +7,18 @@ import ( ) type Query struct { - ActorID uint64 - Action string - BizType string - Limit int + ActorID uint64 + Action string + BizType string + Page int + PageSize int +} + +type PaginatedResult struct { + Items interface{} `json:"items"` + Total int64 `json:"total"` + Page int `json:"page"` + PageSize int `json:"page_size"` } type LogDTO struct { diff --git a/backend/internal/modules/adminaudit/handler.go b/backend/internal/modules/adminaudit/handler.go index ecba3a5..885cdef 100644 --- a/backend/internal/modules/adminaudit/handler.go +++ b/backend/internal/modules/adminaudit/handler.go @@ -18,17 +18,32 @@ func NewHandler(service *Service) *Handler { return &Handler{service: service} } +func parsePagination(c *gin.Context) (int, int) { + page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) + pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20")) + if page < 1 { + page = 1 + } + if pageSize < 1 { + pageSize = 20 + } + if pageSize > 100 { + pageSize = 100 + } + return page, pageSize +} + func (h *Handler) List(c *gin.Context) { query, ok := parseQuery(c) if !ok { return } - items, err := h.service.List(query) + result, err := h.service.List(query) if err != nil { writeAuditError(c, err) return } - response.OK(c, gin.H{"items": items}) + response.OK(c, result) } func parseQuery(c *gin.Context) (Query, bool) { @@ -41,16 +56,11 @@ func parseQuery(c *gin.Context) (Query, bool) { } query.ActorID = value } - if raw := c.Query("limit"); raw != "" { - value, err := strconv.Atoi(raw) - if err != nil || value <= 0 { - response.BadRequest(c, "查询条数不正确") - return query, false - } - query.Limit = value - } query.Action = c.Query("action") query.BizType = c.Query("biz_type") + page, pageSize := parsePagination(c) + query.Page = page + query.PageSize = pageSize return query, true } diff --git a/backend/internal/modules/adminaudit/repository.go b/backend/internal/modules/adminaudit/repository.go index 9ff8c11..5a1ae0a 100644 --- a/backend/internal/modules/adminaudit/repository.go +++ b/backend/internal/modules/adminaudit/repository.go @@ -3,6 +3,8 @@ package adminaudit import ( "time" + "hfb_sys/backend/internal/model" + "gorm.io/datatypes" "gorm.io/gorm" ) @@ -15,37 +17,42 @@ func NewRepository(db *gorm.DB) *Repository { return &Repository{db: db} } -func (r *Repository) List(query Query) ([]LogDTO, error) { - limit := query.Limit - if limit <= 0 || limit > 500 { - limit = 200 - } - +func (r *Repository) List(query Query) (*PaginatedResult, error) { db := r.db.Table("audit_logs AS al"). Select(`al.id, al.actor_type, al.actor_id, COALESCE(au.username, '') AS actor_username, COALESCE(au.nickname, '') AS actor_nickname, al.action, al.biz_type, al.biz_id, al.ip, al.user_agent, al.detail, al.created_at`). Joins("LEFT JOIN admin_users AS au ON au.id = al.actor_id AND al.actor_type = ?", "admin") + countDB := r.db.Model(&model.AuditLog{}) if query.ActorID > 0 { db = db.Where("al.actor_id = ?", query.ActorID) + countDB = countDB.Where("actor_id = ?", query.ActorID) } if query.Action != "" { db = db.Where("al.action = ?", query.Action) + countDB = countDB.Where("action = ?", query.Action) } if query.BizType != "" { db = db.Where("al.biz_type = ?", query.BizType) + countDB = countDB.Where("biz_type = ?", query.BizType) } + var total int64 + if err := countDB.Count(&total).Error; err != nil { + return nil, err + } + + offset := (query.Page - 1) * query.PageSize var rows []auditLogRow - if err := db.Order("al.id DESC").Limit(limit).Scan(&rows).Error; err != nil { + if err := db.Order("al.id DESC").Offset(offset).Limit(query.PageSize).Scan(&rows).Error; err != nil { return nil, err } items := make([]LogDTO, 0, len(rows)) for _, row := range rows { items = append(items, row.toDTO()) } - return items, nil + return &PaginatedResult{Items: items, Total: total, Page: query.Page, PageSize: query.PageSize}, nil } type auditLogRow struct { diff --git a/backend/internal/modules/adminaudit/service.go b/backend/internal/modules/adminaudit/service.go index 2f51af4..8b624fc 100644 --- a/backend/internal/modules/adminaudit/service.go +++ b/backend/internal/modules/adminaudit/service.go @@ -12,7 +12,7 @@ func NewService(repo *Repository) *Service { return &Service{repo: repo} } -func (s *Service) List(query Query) ([]LogDTO, error) { +func (s *Service) List(query Query) (*PaginatedResult, error) { if s.repo == nil { return nil, ErrDependencyUnavailable } diff --git a/backend/internal/modules/notification/dto.go b/backend/internal/modules/notification/dto.go index 782e335..620f36b 100644 --- a/backend/internal/modules/notification/dto.go +++ b/backend/internal/modules/notification/dto.go @@ -13,3 +13,10 @@ type NotificationDTO struct { ReadAt *time.Time `json:"read_at"` CreatedAt time.Time `json:"created_at"` } + +type PaginatedResult struct { + Items interface{} `json:"items"` + Total int64 `json:"total"` + Page int `json:"page"` + PageSize int `json:"page_size"` +} diff --git a/backend/internal/modules/notification/handler.go b/backend/internal/modules/notification/handler.go index 8928321..348c406 100644 --- a/backend/internal/modules/notification/handler.go +++ b/backend/internal/modules/notification/handler.go @@ -18,18 +18,34 @@ func NewHandler(service *Service) *Handler { return &Handler{service: service} } +func parsePagination(c *gin.Context) (int, int) { + page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) + pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20")) + if page < 1 { + page = 1 + } + if pageSize < 1 { + pageSize = 20 + } + if pageSize > 100 { + pageSize = 100 + } + return page, pageSize +} + func (h *Handler) List(c *gin.Context) { userID, ok := currentUserID(c) if !ok { response.Unauthorized(c, "缺少用户上下文") return } - items, err := h.service.List(userID) + page, pageSize := parsePagination(c) + result, err := h.service.List(userID, page, pageSize) if err != nil { writeNotificationError(c, err) return } - response.OK(c, gin.H{"items": items}) + response.OK(c, result) } func (h *Handler) MarkRead(c *gin.Context) { diff --git a/backend/internal/modules/notification/repository.go b/backend/internal/modules/notification/repository.go index 9d50731..c415edc 100644 --- a/backend/internal/modules/notification/repository.go +++ b/backend/internal/modules/notification/repository.go @@ -25,16 +25,21 @@ func NewRepository(db *gorm.DB) *Repository { return &Repository{db: db} } -func (r *Repository) List(userID uint64) ([]NotificationDTO, error) { +func (r *Repository) List(userID uint64, page, pageSize int) (*PaginatedResult, error) { + var total int64 + if err := r.db.Model(&model.Notification{}).Where("user_id = ?", userID).Count(&total).Error; err != nil { + return nil, err + } + offset := (page - 1) * pageSize var rows []model.Notification - if err := r.db.Where("user_id = ?", userID).Order("id DESC").Limit(100).Find(&rows).Error; err != nil { + if err := r.db.Where("user_id = ?", userID).Order("id DESC").Offset(offset).Limit(pageSize).Find(&rows).Error; err != nil { return nil, err } items := make([]NotificationDTO, 0, len(rows)) for _, row := range rows { items = append(items, toDTO(row)) } - return items, nil + return &PaginatedResult{Items: items, Total: total, Page: page, PageSize: pageSize}, nil } func (r *Repository) MarkRead(userID uint64, id uint64) error { diff --git a/backend/internal/modules/notification/service.go b/backend/internal/modules/notification/service.go index c2be3f6..477a34e 100644 --- a/backend/internal/modules/notification/service.go +++ b/backend/internal/modules/notification/service.go @@ -12,11 +12,11 @@ func NewService(repo *Repository) *Service { return &Service{repo: repo} } -func (s *Service) List(userID uint64) ([]NotificationDTO, error) { +func (s *Service) List(userID uint64, page, pageSize int) (*PaginatedResult, error) { if s.repo == nil { return nil, ErrDependencyUnavailable } - return s.repo.List(userID) + return s.repo.List(userID, page, pageSize) } func (s *Service) MarkRead(userID uint64, id uint64) error { diff --git a/backend/internal/modules/wallet/dto.go b/backend/internal/modules/wallet/dto.go index ecc86c2..cb5de60 100644 --- a/backend/internal/modules/wallet/dto.go +++ b/backend/internal/modules/wallet/dto.go @@ -29,10 +29,18 @@ type LedgerDTO struct { } type AdminLedgerQuery struct { - UserID uint64 - OrderID uint64 - BizType string - Limit int + UserID uint64 + OrderID uint64 + BizType string + Page int + PageSize int +} + +type PaginatedResult struct { + Items interface{} `json:"items"` + Total int64 `json:"total"` + Page int `json:"page"` + PageSize int `json:"page_size"` } type AdminLedgerDTO struct { diff --git a/backend/internal/modules/wallet/handler.go b/backend/internal/modules/wallet/handler.go index 1a6c5f3..64daeba 100644 --- a/backend/internal/modules/wallet/handler.go +++ b/backend/internal/modules/wallet/handler.go @@ -32,18 +32,34 @@ func (h *Handler) Balance(c *gin.Context) { response.OK(c, account) } +func parsePagination(c *gin.Context) (int, int) { + page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) + pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20")) + if page < 1 { + page = 1 + } + if pageSize < 1 { + pageSize = 20 + } + if pageSize > 100 { + pageSize = 100 + } + return page, pageSize +} + func (h *Handler) Ledger(c *gin.Context) { userID, ok := currentUserID(c) if !ok { response.Unauthorized(c, "缺少用户上下文") return } - items, err := h.service.Ledger(userID) + page, pageSize := parsePagination(c) + result, err := h.service.Ledger(userID, page, pageSize) if err != nil { writeWalletError(c, err) return } - response.OK(c, gin.H{"items": items}) + response.OK(c, result) } func (h *Handler) Recharge(c *gin.Context) { @@ -70,12 +86,12 @@ func (h *Handler) AdminLedger(c *gin.Context) { if !ok { return } - items, err := h.service.AdminLedger(query) + result, err := h.service.AdminLedger(query) if err != nil { writeWalletError(c, err) return } - response.OK(c, gin.H{"items": items}) + response.OK(c, result) } func parseAdminLedgerQuery(c *gin.Context) (AdminLedgerQuery, bool) { @@ -96,15 +112,10 @@ func parseAdminLedgerQuery(c *gin.Context) (AdminLedgerQuery, bool) { } query.OrderID = value } - if raw := c.Query("limit"); raw != "" { - value, err := strconv.Atoi(raw) - if err != nil || value <= 0 { - response.BadRequest(c, "查询条数不正确") - return query, false - } - query.Limit = value - } query.BizType = c.Query("biz_type") + page, pageSize := parsePagination(c) + query.Page = page + query.PageSize = pageSize return query, true } diff --git a/backend/internal/modules/wallet/repository.go b/backend/internal/modules/wallet/repository.go index b2f3cd4..0c2ca3c 100644 --- a/backend/internal/modules/wallet/repository.go +++ b/backend/internal/modules/wallet/repository.go @@ -45,16 +45,21 @@ func (r *Repository) Account(userID uint64) (*AccountDTO, error) { return toAccountDTO(account), nil } -func (r *Repository) Ledger(userID uint64) ([]LedgerDTO, error) { +func (r *Repository) Ledger(userID uint64, page, pageSize int) (*PaginatedResult, error) { + var total int64 + if err := r.db.Model(&model.WalletLedger{}).Where("user_id = ?", userID).Count(&total).Error; err != nil { + return nil, err + } + offset := (page - 1) * pageSize var rows []model.WalletLedger - if err := r.db.Where("user_id = ?", userID).Order("id DESC").Limit(100).Find(&rows).Error; err != nil { + if err := r.db.Where("user_id = ?", userID).Order("id DESC").Offset(offset).Limit(pageSize).Find(&rows).Error; err != nil { return nil, err } items := make([]LedgerDTO, 0, len(rows)) for _, row := range rows { items = append(items, toLedgerDTO(row)) } - return items, nil + return &PaginatedResult{Items: items, Total: total, Page: page, PageSize: pageSize}, nil } func (r *Repository) Recharge(userID uint64, amount float64) (*AccountDTO, error) { @@ -75,12 +80,7 @@ func (r *Repository) Recharge(userID uint64, amount float64) (*AccountDTO, error return r.Account(userID) } -func (r *Repository) AdminLedger(query AdminLedgerQuery) ([]AdminLedgerDTO, error) { - limit := query.Limit - if limit <= 0 || limit > 500 { - limit = 200 - } - +func (r *Repository) AdminLedger(query AdminLedgerQuery) (*PaginatedResult, error) { db := r.db.Table("wallet_ledger AS wl"). Select(`wl.id, wl.ledger_no, wl.user_id, COALESCE(u.phone, '') AS user_phone, COALESCE(u.nickname, '') AS user_nickname, wl.order_id, COALESCE(ro.order_no, '') AS order_no, @@ -89,21 +89,31 @@ func (r *Repository) AdminLedger(query AdminLedgerQuery) ([]AdminLedgerDTO, erro Joins("LEFT JOIN users AS u ON u.id = wl.user_id"). Joins("LEFT JOIN rental_orders AS ro ON ro.id = wl.order_id") + countDB := r.db.Model(&model.WalletLedger{}) if query.UserID > 0 { db = db.Where("wl.user_id = ?", query.UserID) + countDB = countDB.Where("user_id = ?", query.UserID) } if query.OrderID > 0 { db = db.Where("wl.order_id = ?", query.OrderID) + countDB = countDB.Where("order_id = ?", query.OrderID) } if query.BizType != "" { db = db.Where("wl.biz_type = ?", query.BizType) + countDB = countDB.Where("biz_type = ?", query.BizType) } - var items []AdminLedgerDTO - if err := db.Order("wl.id DESC").Limit(limit).Scan(&items).Error; err != nil { + var total int64 + if err := countDB.Count(&total).Error; err != nil { return nil, err } - return items, nil + + offset := (query.Page - 1) * query.PageSize + var items []AdminLedgerDTO + if err := db.Order("wl.id DESC").Offset(offset).Limit(query.PageSize).Scan(&items).Error; err != nil { + return nil, err + } + return &PaginatedResult{Items: items, Total: total, Page: query.Page, PageSize: query.PageSize}, nil } func AppendEntries(tx *gorm.DB, entries ...Entry) error { diff --git a/backend/internal/modules/wallet/service.go b/backend/internal/modules/wallet/service.go index 89da186..d7b46c5 100644 --- a/backend/internal/modules/wallet/service.go +++ b/backend/internal/modules/wallet/service.go @@ -23,11 +23,11 @@ func (s *Service) Account(userID uint64) (*AccountDTO, error) { return s.repo.Account(userID) } -func (s *Service) Ledger(userID uint64) ([]LedgerDTO, error) { +func (s *Service) Ledger(userID uint64, page, pageSize int) (*PaginatedResult, error) { if s.repo == nil { return nil, ErrDependencyUnavailable } - return s.repo.Ledger(userID) + return s.repo.Ledger(userID, page, pageSize) } func (s *Service) Recharge(userID uint64, req RechargeRequest) (*AccountDTO, error) { @@ -40,7 +40,7 @@ func (s *Service) Recharge(userID uint64, req RechargeRequest) (*AccountDTO, err return s.repo.Recharge(userID, req.Amount) } -func (s *Service) AdminLedger(query AdminLedgerQuery) ([]AdminLedgerDTO, error) { +func (s *Service) AdminLedger(query AdminLedgerQuery) (*PaginatedResult, error) { if s.repo == nil { return nil, ErrDependencyUnavailable } diff --git a/frontend/src/api/adminAudit.ts b/frontend/src/api/adminAudit.ts index afd0551..d7d4897 100644 --- a/frontend/src/api/adminAudit.ts +++ b/frontend/src/api/adminAudit.ts @@ -1,5 +1,7 @@ import { apiClient } from './client' +import { type PaginatedResult } from './orders' + export interface AdminAuditLog { id: number actor_type: string @@ -19,7 +21,8 @@ export interface AdminAuditQuery { actor_id?: string action?: string biz_type?: string - limit?: number + page?: number + page_size?: number } interface ApiResponse { @@ -30,6 +33,6 @@ interface ApiResponse { export async function fetchAdminAuditLogs(query: AdminAuditQuery = {}) { const params = Object.fromEntries(Object.entries(query).filter(([, value]) => value !== '' && value !== undefined)) - const { data } = await apiClient.get>('/admin/audit-logs', { params }) - return data.data.items + const { data } = await apiClient.get>>('/admin/audit-logs', { params }) + return data.data } diff --git a/frontend/src/api/adminWallet.ts b/frontend/src/api/adminWallet.ts index 01635e2..07be54f 100644 --- a/frontend/src/api/adminWallet.ts +++ b/frontend/src/api/adminWallet.ts @@ -1,5 +1,7 @@ import { apiClient } from './client' +import { type PaginatedResult } from './orders' + export interface AdminWalletLedger { id: number ledger_no: string @@ -22,7 +24,8 @@ export interface AdminWalletLedgerQuery { user_id?: string order_id?: string biz_type?: string - limit?: number + page?: number + page_size?: number } interface ApiResponse { @@ -33,6 +36,6 @@ interface ApiResponse { export async function fetchAdminWalletLedger(query: AdminWalletLedgerQuery = {}) { const params = Object.fromEntries(Object.entries(query).filter(([, value]) => value !== '' && value !== undefined)) - const { data } = await apiClient.get>('/admin/wallet/ledger', { params }) - return data.data.items + const { data } = await apiClient.get>>('/admin/wallet/ledger', { params }) + return data.data } diff --git a/frontend/src/api/notifications.ts b/frontend/src/api/notifications.ts index d39209f..2a5c53c 100644 --- a/frontend/src/api/notifications.ts +++ b/frontend/src/api/notifications.ts @@ -1,5 +1,7 @@ import { apiClient } from './client' +import { type PaginatedResult } from './orders' + export interface NotificationItem { id: number user_id: number @@ -18,9 +20,11 @@ interface ApiResponse { data: T } -export async function fetchNotifications() { - const { data } = await apiClient.get>('/notifications') - return data.data.items +export async function fetchNotifications(page = 1, pageSize = 20) { + const { data } = await apiClient.get>>('/notifications', { + params: { page, page_size: pageSize }, + }) + return data.data } export async function markNotificationRead(id: number) { diff --git a/frontend/src/api/orders.ts b/frontend/src/api/orders.ts index d16d06d..f9ad03c 100644 --- a/frontend/src/api/orders.ts +++ b/frontend/src/api/orders.ts @@ -84,6 +84,13 @@ interface ApiResponse { data: T } +export interface PaginatedResult { + items: T[] + total: number + page: number + page_size: number +} + export async function createOrder(listingId: number) { const { data } = await apiClient.post>('/orders', { listing_id: listingId, diff --git a/frontend/src/api/wallet.ts b/frontend/src/api/wallet.ts index 781d248..77c40da 100644 --- a/frontend/src/api/wallet.ts +++ b/frontend/src/api/wallet.ts @@ -1,5 +1,7 @@ import { apiClient } from './client' +import { type PaginatedResult } from './orders' + export interface WalletAccount { user_id: number available_balance: number @@ -33,9 +35,11 @@ export async function fetchWalletBalance() { return data.data } -export async function fetchWalletLedger() { - const { data } = await apiClient.get>('/wallet/ledger') - return data.data.items +export async function fetchWalletLedger(page = 1, pageSize = 20) { + const { data } = await apiClient.get>>('/wallet/ledger', { + params: { page, page_size: pageSize }, + }) + return data.data } export async function rechargeWallet(amount: number) { diff --git a/frontend/src/views/account/NotificationsView.vue b/frontend/src/views/account/NotificationsView.vue index 1890ebe..7bc4f38 100644 --- a/frontend/src/views/account/NotificationsView.vue +++ b/frontend/src/views/account/NotificationsView.vue @@ -7,18 +7,28 @@ import { formatDateTime } from '@/utils/time' const loading = ref(false) const notifications = ref([]) +const currentPage = ref(1) +const currentPageSize = ref(20) +const total = ref(0) onMounted(loadNotifications) async function loadNotifications() { loading.value = true try { - notifications.value = await fetchNotifications() + const result = await fetchNotifications(currentPage.value, currentPageSize.value) + notifications.value = result.items + total.value = result.total } finally { loading.value = false } } +function handleSizeChange() { + currentPage.value = 1 + loadNotifications() +} + async function markRead(id: number) { await markNotificationRead(id) ElMessage.success('已标记为已读') @@ -51,5 +61,17 @@ async function markRead(id: number) { + +
+ +
diff --git a/frontend/src/views/account/WalletView.vue b/frontend/src/views/account/WalletView.vue index a0e2b66..131a48f 100644 --- a/frontend/src/views/account/WalletView.vue +++ b/frontend/src/views/account/WalletView.vue @@ -9,6 +9,9 @@ import { formatDateTime } from '@/utils/time' const loading = ref(false) const account = ref(null) const ledger = ref([]) +const currentPage = ref(1) +const currentPageSize = ref(20) +const total = ref(0) const rechargeAmount = ref(100) const recharging = ref(false) @@ -17,14 +20,24 @@ onMounted(loadWallet) async function loadWallet() { loading.value = true try { - const [balance, rows] = await Promise.all([fetchWalletBalance(), fetchWalletLedger()]) + const [balance, result] = await Promise.all([fetchWalletBalance(), fetchWalletLedger(currentPage.value, currentPageSize.value)]) account.value = balance - ledger.value = rows + ledger.value = result.items + total.value = result.total } finally { loading.value = false } } +function handleSizeChange() { + currentPage.value = 1 + loadWallet() +} + +function loadLedgerPage() { + loadWallet() +} + async function handleRecharge() { recharging.value = true try { @@ -92,6 +105,18 @@ function readError(error: unknown, fallback: string) { + +
+ +
diff --git a/frontend/src/views/admin/AdminAuditLogsView.vue b/frontend/src/views/admin/AdminAuditLogsView.vue index 3af6f29..0749ef9 100644 --- a/frontend/src/views/admin/AdminAuditLogsView.vue +++ b/frontend/src/views/admin/AdminAuditLogsView.vue @@ -8,22 +8,30 @@ import { formatDateTime } from '@/utils/time' const loading = ref(false) const logs = ref([]) const activeLog = ref(null) +const currentPage = ref(1) +const currentPageSize = ref(20) +const total = ref(0) const filters = reactive({ actor_id: '', action: '', biz_type: '', - limit: 200, }) const highRiskCount = computed(() => logs.value.filter((item) => item.action.includes('freeze') || item.action.includes('update')).length) -const uniqueActors = computed(() => new Set(logs.value.map((item) => item.actor_id)).size) onMounted(loadLogs) async function loadLogs() { loading.value = true try { - logs.value = await fetchAdminAuditLogs(filters) + const query = { + ...filters, + page: currentPage.value, + page_size: currentPageSize.value, + } + const result = await fetchAdminAuditLogs(query) + logs.value = result.items + total.value = result.total } finally { loading.value = false } @@ -33,10 +41,15 @@ function resetFilters() { filters.actor_id = '' filters.action = '' filters.biz_type = '' - filters.limit = 200 + currentPage.value = 1 void loadLogs() } +function handleSizeChange() { + currentPage.value = 1 + loadLogs() +} + function actorName(row: AdminAuditLog) { return row.actor_nickname || row.actor_username || `${row.actor_type} ${row.actor_id}` } @@ -59,7 +72,7 @@ function actionType(action: string) {
重置 @@ -69,12 +82,8 @@ function actionType(action: string) {
- 当前结果 - {{ logs.length }} 条 -
-
- 操作管理员 - {{ uniqueActors }} 人 + 总条数 + {{ total }} 条
高风险动作 @@ -94,13 +103,8 @@ function actionType(action: string) { - - - - - @@ -112,17 +116,12 @@ function actionType(action: string) { - - - - - + @@ -132,8 +131,6 @@ function actionType(action: string) { - - @@ -144,9 +141,23 @@ function actionType(action: string) { +
+ +
+

{{ activeLog.action }} · {{ activeLog.biz_type }} #{{ activeLog.biz_id || '-' }}

+

操作人:{{ actorName(activeLog) }} · IP:{{ activeLog.ip }}

+

User-Agent:{{ activeLog.user_agent }}

{{ detailText(activeLog) }}
diff --git a/frontend/src/views/admin/AdminWalletLedgerView.vue b/frontend/src/views/admin/AdminWalletLedgerView.vue index 3cf0b05..b896d1f 100644 --- a/frontend/src/views/admin/AdminWalletLedgerView.vue +++ b/frontend/src/views/admin/AdminWalletLedgerView.vue @@ -8,11 +8,13 @@ import { formatDateTime } from '@/utils/time' const loading = ref(false) const ledger = ref([]) +const currentPage = ref(1) +const currentPageSize = ref(20) +const total = ref(0) const filters = reactive({ user_id: '', order_id: '', biz_type: '', - limit: 200, }) const inAmount = computed(() => @@ -21,16 +23,20 @@ const inAmount = computed(() => const outAmount = computed(() => ledger.value.filter((item) => item.direction === 'out').reduce((sum, item) => sum + Number(item.amount || 0), 0), ) -const frozenAmount = computed(() => - ledger.value.filter((item) => item.balance_type === 'frozen').reduce((sum, item) => sum + Number(item.amount || 0), 0), -) onMounted(loadLedger) async function loadLedger() { loading.value = true try { - ledger.value = await fetchAdminWalletLedger(filters) + const query = { + ...filters, + page: currentPage.value, + page_size: currentPageSize.value, + } + const result = await fetchAdminWalletLedger(query) + ledger.value = result.items + total.value = result.total } finally { loading.value = false } @@ -40,10 +46,15 @@ function resetFilters() { filters.user_id = '' filters.order_id = '' filters.biz_type = '' - filters.limit = 200 + currentPage.value = 1 void loadLedger() } +function handleSizeChange() { + currentPage.value = 1 + loadLedger() +} + function money(value: number) { return `¥${value.toFixed(2)}` } @@ -65,7 +76,7 @@ function directionLabel(direction: string) {
重置 @@ -75,8 +86,8 @@ function directionLabel(direction: string) {
- 当前结果 - {{ ledger.length }} 笔 + 总条数 + {{ total }} 笔
入账合计 @@ -86,10 +97,6 @@ function directionLabel(direction: string) { 出账合计 {{ money(outAmount) }}
-
- 冻结相关金额 - {{ money(frozenAmount) }} -
@@ -107,20 +114,16 @@ function directionLabel(direction: string) { - - - - + - +