From ae18397ca62132ea77c68e6a0ca8fc5ebc86e784 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=8C=97?= Date: Mon, 2 Feb 2026 17:44:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=90=91=E7=94=A8=E6=88=B7=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E7=AE=A1=E7=90=86=E5=91=98=E8=B0=83=E6=95=B4=E4=BD=99?= =?UTF-8?q?=E9=A2=9D=E7=9A=84=E5=A4=87=E6=B3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 为RedeemCode DTO添加notes字段(仅用于admin_balance/admin_concurrency类型) - 更新mapper使其有条件地包含备注信息 - 在用户兑换历史UI中显示备注 - 备注以斜体显示,悬停时显示完整内容 用户现在可以看到管理员调整其余额的原因说明。 Changes: - backend/internal/handler/dto/types.go: RedeemCode添加notes字段 - backend/internal/handler/dto/mappers.go: 条件性填充notes - frontend/src/api/redeem.ts: TypeScript接口添加notes - frontend/src/views/user/RedeemView.vue: UI显示备注信息 --- backend/internal/handler/dto/mappers.go | 10 +++++++++- backend/internal/handler/dto/types.go | 4 ++++ frontend/src/api/redeem.ts | 4 +++- frontend/src/views/user/RedeemView.vue | 8 ++++++++ 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/backend/internal/handler/dto/mappers.go b/backend/internal/handler/dto/mappers.go index d58a8a29..886a5535 100644 --- a/backend/internal/handler/dto/mappers.go +++ b/backend/internal/handler/dto/mappers.go @@ -321,7 +321,7 @@ func RedeemCodeFromServiceAdmin(rc *service.RedeemCode) *AdminRedeemCode { } func redeemCodeFromServiceBase(rc *service.RedeemCode) RedeemCode { - return RedeemCode{ + out := RedeemCode{ ID: rc.ID, Code: rc.Code, Type: rc.Type, @@ -335,6 +335,14 @@ func redeemCodeFromServiceBase(rc *service.RedeemCode) RedeemCode { User: UserFromServiceShallow(rc.User), Group: GroupFromServiceShallow(rc.Group), } + + // For admin_balance/admin_concurrency types, include notes so users can see + // why they were charged or credited by admin + if (rc.Type == "admin_balance" || rc.Type == "admin_concurrency") && rc.Notes != "" { + out.Notes = &rc.Notes + } + + return out } // AccountSummaryFromService returns a minimal AccountSummary for usage log display. diff --git a/backend/internal/handler/dto/types.go b/backend/internal/handler/dto/types.go index 938d707c..4cfaef5f 100644 --- a/backend/internal/handler/dto/types.go +++ b/backend/internal/handler/dto/types.go @@ -198,6 +198,10 @@ type RedeemCode struct { GroupID *int64 `json:"group_id"` ValidityDays int `json:"validity_days"` + // Notes is only populated for admin_balance/admin_concurrency types + // so users can see why they were charged or credited + Notes *string `json:"notes,omitempty"` + User *User `json:"user,omitempty"` Group *Group `json:"group,omitempty"` } diff --git a/frontend/src/api/redeem.ts b/frontend/src/api/redeem.ts index 9e1c7d94..22abf4d8 100644 --- a/frontend/src/api/redeem.ts +++ b/frontend/src/api/redeem.ts @@ -14,7 +14,9 @@ export interface RedeemHistoryItem { status: string used_at: string created_at: string - // 订阅类型专用字段 + // Notes from admin for admin_balance/admin_concurrency types + notes?: string + // Subscription-specific fields group_id?: number validity_days?: number group?: { diff --git a/frontend/src/views/user/RedeemView.vue b/frontend/src/views/user/RedeemView.vue index 96158596..5850c084 100644 --- a/frontend/src/views/user/RedeemView.vue +++ b/frontend/src/views/user/RedeemView.vue @@ -312,6 +312,14 @@

{{ t('redeem.adminAdjustment') }}

+ +

+ {{ item.notes }} +