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

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: