feat: add TenantDetail and UserDetail views with comprehensive functionality

- Implemented TenantDetail.vue to display tenant information, manage tenant status, and handle tenant renewals.
- Added user management features in UserDetail.vue, including user status updates and role management.
- Integrated data loading for tenant users and orders in TenantDetail.vue.
- Included search and pagination functionalities for owned and joined tenants in UserDetail.vue.
- Enhanced user experience with toast notifications for success and error messages.
This commit is contained in:
2025-12-24 15:10:49 +08:00
parent 40776b78e2
commit 8fa321dbf6
18 changed files with 4106 additions and 190 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -585,6 +585,44 @@ definitions:
description: TypeDescription 流水类型中文说明(用于前端展示)。
type: string
type: object
dto.OrderBuyerLite:
properties:
id:
type: integer
username:
type: string
type: object
dto.OrderStatisticsResponse:
properties:
by_status:
items:
$ref: '#/definitions/dto.OrderStatisticsRow'
type: array
total_amount_paid_sum:
type: integer
total_count:
type: integer
type: object
dto.OrderStatisticsRow:
properties:
amount_paid_sum:
type: integer
count:
type: integer
status:
$ref: '#/definitions/consts.OrderStatus'
status_description:
type: string
type: object
dto.OrderTenantLite:
properties:
code:
type: string
id:
type: integer
name:
type: string
type: object
dto.PurchaseContentForm:
properties:
idempotency_key:
@@ -613,6 +651,119 @@ definitions:
description: Order is the created or existing order record (may be nil for
owner/free-path without order).
type: object
dto.SuperOrderDetail:
properties:
buyer:
$ref: '#/definitions/dto.OrderBuyerLite'
order:
$ref: '#/definitions/models.Order'
tenant:
$ref: '#/definitions/dto.OrderTenantLite'
type: object
dto.SuperOrderItem:
properties:
amount_discount:
type: integer
amount_original:
type: integer
amount_paid:
type: integer
buyer:
$ref: '#/definitions/dto.OrderBuyerLite'
created_at:
type: string
currency:
$ref: '#/definitions/consts.Currency'
id:
type: integer
paid_at:
type: string
refunded_at:
type: string
status:
$ref: '#/definitions/consts.OrderStatus'
status_description:
type: string
tenant:
$ref: '#/definitions/dto.OrderTenantLite'
type:
$ref: '#/definitions/consts.OrderType'
updated_at:
type: string
type: object
dto.SuperOrderRefundForm:
properties:
force:
description: Force indicates bypassing the default refund window check (paid_at
+ 24h).
type: boolean
idempotency_key:
description: IdempotencyKey ensures refund request is processed at most once.
type: string
reason:
description: Reason is the human-readable refund reason used for audit.
type: string
type: object
dto.SuperTenantUserItem:
properties:
tenant_user:
$ref: '#/definitions/models.TenantUser'
user:
$ref: '#/definitions/dto.SuperUserLite'
type: object
dto.SuperUserLite:
properties:
created_at:
type: string
id:
type: integer
roles:
items:
$ref: '#/definitions/consts.Role'
type: array
status:
$ref: '#/definitions/consts.UserStatus'
status_description:
type: string
updated_at:
type: string
username:
type: string
verified_at:
type: string
type: object
dto.TenantAdminUserLite:
properties:
id:
type: integer
username:
type: string
type: object
dto.TenantCreateForm:
properties:
admin_user_id:
type: integer
code:
maxLength: 64
type: string
duration:
description: Duration 租户有效期(天),从“创建时刻”起算;与续期接口保持一致。
enum:
- 7
- 30
- 90
- 180
- 365
type: integer
name:
maxLength: 128
type: string
required:
- admin_user_id
- code
- duration
- name
type: object
dto.TenantExpireUpdateForm:
properties:
duration:
@@ -628,6 +779,10 @@ definitions:
type: object
dto.TenantItem:
properties:
admin_users:
items:
$ref: '#/definitions/dto.TenantAdminUserLite'
type: array
code:
type: string
config:
@@ -640,16 +795,19 @@ definitions:
type: string
id:
type: integer
income_amount_paid_sum:
description: IncomeAmountPaidSum 累计收入金额单位CNY按 orders 聚合得到的已支付净收入(不含退款中/已退款订单)。
type: integer
name:
type: string
owner:
$ref: '#/definitions/dto.TenantOwnerUserLite'
status:
$ref: '#/definitions/consts.TenantStatus'
status_description:
type: string
updated_at:
type: string
user_balance:
type: integer
user_count:
type: integer
user_id:
@@ -661,6 +819,13 @@ definitions:
uuid:
type: string
type: object
dto.TenantOwnerUserLite:
properties:
id:
type: integer
username:
type: string
type: object
dto.TenantStatusUpdateForm:
properties:
status:
@@ -675,25 +840,17 @@ definitions:
dto.UserItem:
properties:
balance:
description: 全局可用余额:分/最小货币单位;用户在所有已加入租户内共享该余额;默认 0
type: integer
balance_frozen:
description: 全局冻结余额:分/最小货币单位;用于下单冻结等;默认 0
type: integer
created_at:
type: string
deleted_at:
$ref: '#/definitions/gorm.DeletedAt'
id:
type: integer
metas:
items:
type: integer
type: array
owned:
$ref: '#/definitions/models.Tenant'
password:
type: string
joined_tenant_count:
type: integer
owned_tenant_count:
type: integer
roles:
items:
$ref: '#/definitions/consts.Role'
@@ -702,10 +859,6 @@ definitions:
$ref: '#/definitions/consts.UserStatus'
status_description:
type: string
tenants:
items:
$ref: '#/definitions/models.Tenant'
type: array
updated_at:
type: string
username:
@@ -713,6 +866,16 @@ definitions:
verified_at:
type: string
type: object
dto.UserRolesUpdateForm:
properties:
roles:
items:
$ref: '#/definitions/consts.Role'
minItems: 1
type: array
required:
- roles
type: object
dto.UserStatistics:
properties:
count:
@@ -733,6 +896,33 @@ definitions:
required:
- status
type: object
dto.UserTenantItem:
properties:
code:
type: string
expired_at:
type: string
joined_at:
type: string
member_status:
$ref: '#/definitions/consts.UserStatus'
member_status_description:
type: string
name:
type: string
owner:
$ref: '#/definitions/dto.TenantOwnerUserLite'
role:
items:
$ref: '#/definitions/consts.TenantUserRole'
type: array
tenant_id:
type: integer
tenant_status:
$ref: '#/definitions/consts.TenantStatus'
tenant_status_description:
type: string
type: object
gorm.DeletedAt:
properties:
time:
@@ -1342,6 +1532,173 @@ paths:
$ref: '#/definitions/dto.LoginResponse'
tags:
- Super
/super/v1/orders:
get:
consumes:
- application/json
parameters:
- in: query
name: amount_paid_max
type: integer
- in: query
name: amount_paid_min
type: integer
- description: Asc specifies comma-separated field names to sort ascending by.
in: query
name: asc
type: string
- in: query
name: content_id
type: integer
- in: query
name: content_title
type: string
- in: query
name: created_at_from
type: string
- in: query
name: created_at_to
type: string
- description: Desc specifies comma-separated field names to sort descending
by.
in: query
name: desc
type: string
- in: query
name: id
type: integer
- description: Limit is page size; only values in {10,20,50,100} are accepted
(otherwise defaults to 10).
in: query
name: limit
type: integer
- description: Page is 1-based page index; values <= 0 are normalized to 1.
in: query
name: page
type: integer
- in: query
name: paid_at_from
type: string
- in: query
name: paid_at_to
type: string
- enum:
- created
- paid
- refunding
- refunded
- canceled
- failed
in: query
name: status
type: string
x-enum-varnames:
- OrderStatusCreated
- OrderStatusPaid
- OrderStatusRefunding
- OrderStatusRefunded
- OrderStatusCanceled
- OrderStatusFailed
- in: query
name: tenant_code
type: string
- in: query
name: tenant_id
type: integer
- in: query
name: tenant_name
type: string
- enum:
- content_purchase
in: query
name: type
type: string
x-enum-varnames:
- OrderTypeContentPurchase
- in: query
name: user_id
type: integer
- in: query
name: username
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
allOf:
- $ref: '#/definitions/requests.Pager'
- properties:
items:
$ref: '#/definitions/dto.SuperOrderItem'
type: object
summary: 订单列表
tags:
- Super
/super/v1/orders/{orderID}:
get:
consumes:
- application/json
parameters:
- description: OrderID
format: int64
in: path
name: orderID
required: true
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/dto.SuperOrderDetail'
summary: 订单详情
tags:
- Super
/super/v1/orders/{orderID}/refund:
post:
consumes:
- application/json
description: 该接口只负责将订单从 paid 推进到 refunding并提交异步退款任务退款入账与权益回收由 worker 异步完成。
parameters:
- description: OrderID
format: int64
in: path
name: orderID
required: true
type: integer
- description: Form
in: body
name: form
required: true
schema:
$ref: '#/definitions/dto.SuperOrderRefundForm'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/models.Order'
summary: 订单退款(平台)
tags:
- Super
/super/v1/orders/statistics:
get:
consumes:
- application/json
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/dto.OrderStatisticsResponse'
summary: 订单统计信息
tags:
- Super
/super/v1/tenants:
get:
consumes:
@@ -1351,11 +1708,29 @@ paths:
in: query
name: asc
type: string
- in: query
name: code
type: string
- in: query
name: created_at_from
type: string
- in: query
name: created_at_to
type: string
- description: Desc specifies comma-separated field names to sort descending
by.
in: query
name: desc
type: string
- in: query
name: expired_at_from
type: string
- in: query
name: expired_at_to
type: string
- in: query
name: id
type: integer
- description: Limit is page size; only values in {10,20,50,100} are accepted
(otherwise defaults to 10).
in: query
@@ -1379,6 +1754,9 @@ paths:
- TenantStatusPendingVerify
- TenantStatusVerified
- TenantStatusBanned
- in: query
name: user_id
type: integer
produces:
- application/json
responses:
@@ -1394,7 +1772,47 @@ paths:
summary: 租户列表
tags:
- Super
post:
consumes:
- application/json
parameters:
- description: Form
in: body
name: form
required: true
schema:
$ref: '#/definitions/dto.TenantCreateForm'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/models.Tenant'
summary: 创建租户并设置租户管理员
tags:
- Super
/super/v1/tenants/{tenantID}:
get:
consumes:
- application/json
parameters:
- description: TenantID
format: int64
in: path
name: tenantID
required: true
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/dto.TenantItem'
summary: 租户详情
tags:
- Super
patch:
consumes:
- application/json
@@ -1440,6 +1858,71 @@ paths:
summary: 更新租户状态
tags:
- Super
/super/v1/tenants/{tenantID}/users:
get:
consumes:
- application/json
parameters:
- description: TenantID
format: int64
in: path
name: tenantID
required: true
type: integer
- description: Limit is page size; only values in {10,20,50,100} are accepted
(otherwise defaults to 10).
in: query
name: limit
type: integer
- description: Page is 1-based page index; values <= 0 are normalized to 1.
in: query
name: page
type: integer
- description: Role 按角色过滤可选member/tenant_admin。
enum:
- member
- tenant_admin
in: query
name: role
type: string
x-enum-varnames:
- TenantUserRoleMember
- TenantUserRoleTenantAdmin
- description: Status 按成员状态过滤可选pending_verify/verified/banned。
enum:
- pending_verify
- verified
- banned
in: query
name: status
type: string
x-enum-varnames:
- UserStatusPendingVerify
- UserStatusVerified
- UserStatusBanned
- description: UserID 按用户ID过滤可选
in: query
name: user_id
type: integer
- description: Username 按用户名模糊查询(可选,支持包含匹配)。
in: query
name: username
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
allOf:
- $ref: '#/definitions/requests.Pager'
- properties:
items:
$ref: '#/definitions/dto.SuperTenantUserItem'
type: object
summary: 租户成员列表(平台侧)
tags:
- Super
/super/v1/tenants/statuses:
get:
consumes:
@@ -1465,11 +1948,20 @@ paths:
in: query
name: asc
type: string
- in: query
name: created_at_from
type: string
- in: query
name: created_at_to
type: string
- description: Desc specifies comma-separated field names to sort descending
by.
in: query
name: desc
type: string
- in: query
name: id
type: integer
- description: Limit is page size; only values in {10,20,50,100} are accepted
(otherwise defaults to 10).
in: query
@@ -1479,6 +1971,16 @@ paths:
in: query
name: page
type: integer
- description: Role filters users containing a role (user/super_admin).
enum:
- user
- super_admin
in: query
name: role
type: string
x-enum-varnames:
- RoleUser
- RoleSuperAdmin
- enum:
- pending_verify
- verified
@@ -1490,12 +1992,19 @@ paths:
- UserStatusPendingVerify
- UserStatusVerified
- UserStatusBanned
- in: query
name: tenantID
- description: TenantID filters users by membership in the given tenant.
in: query
name: tenant_id
type: integer
- in: query
name: username
type: string
- in: query
name: verified_at_from
type: string
- in: query
name: verified_at_to
type: string
produces:
- application/json
responses:
@@ -1508,7 +2017,51 @@ paths:
items:
$ref: '#/definitions/dto.UserItem'
type: object
summary: 户列表
summary: 户列表
tags:
- Super
/super/v1/users/{userID}:
get:
consumes:
- application/json
parameters:
- description: UserID
format: int64
in: path
name: userID
required: true
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/dto.UserItem'
summary: 用户详情
tags:
- Super
/super/v1/users/{userID}/roles:
patch:
consumes:
- application/json
parameters:
- description: UserID
format: int64
in: path
name: userID
required: true
type: integer
- description: Form
in: body
name: form
required: true
schema:
$ref: '#/definitions/dto.UserRolesUpdateForm'
produces:
- application/json
responses: {}
summary: 更新用户角色
tags:
- Super
/super/v1/users/{userID}/status:
@@ -1534,6 +2087,78 @@ paths:
summary: 更新用户状态
tags:
- Super
/super/v1/users/{userID}/tenants:
get:
consumes:
- application/json
parameters:
- description: UserID
format: int64
in: path
name: userID
required: true
type: integer
- in: query
name: code
type: string
- in: query
name: created_at_from
type: string
- in: query
name: created_at_to
type: string
- description: Limit is page size; only values in {10,20,50,100} are accepted
(otherwise defaults to 10).
in: query
name: limit
type: integer
- in: query
name: name
type: string
- description: Page is 1-based page index; values <= 0 are normalized to 1.
in: query
name: page
type: integer
- description: Role filters tenant_users.role containing a role (tenant_admin/member).
enum:
- member
- tenant_admin
in: query
name: role
type: string
x-enum-varnames:
- TenantUserRoleMember
- TenantUserRoleTenantAdmin
- description: Status filters tenant_users.status.
enum:
- pending_verify
- verified
- banned
in: query
name: status
type: string
x-enum-varnames:
- UserStatusPendingVerify
- UserStatusVerified
- UserStatusBanned
- in: query
name: tenant_id
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
allOf:
- $ref: '#/definitions/requests.Pager'
- properties:
items:
$ref: '#/definitions/dto.UserTenantItem'
type: object
summary: 用户加入的租户列表
tags:
- Super
/super/v1/users/statistics:
get:
consumes: