feat: 实现套餐管理模块,包含套餐系列、双状态管理、废弃模型清理
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 5m24s
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 5m24s
- 新增套餐系列管理 (CRUD + 状态切换) - 新增套餐管理 (CRUD + 启用/禁用 + 上架/下架双状态) - 清理 8 个废弃分佣模型及对应数据库表 - Package 模型新增建议成本价、建议售价、上架状态字段 - 完整的 Store/Service/Handler 三层实现 - 包含单元测试和集成测试 - 归档 add-package-module change - 新增多个 OpenSpec changes (订单支付、店铺套餐分配、一次性分佣、卡设备系列绑定)
This commit is contained in:
@@ -821,6 +821,91 @@ components:
|
||||
description: 提现单号
|
||||
type: string
|
||||
type: object
|
||||
DtoCreatePackageRequest:
|
||||
properties:
|
||||
data_amount_mb:
|
||||
description: 总流量额度(MB)
|
||||
minimum: 0
|
||||
nullable: true
|
||||
type: integer
|
||||
data_type:
|
||||
description: 流量类型 (real:真流量, virtual:虚流量)
|
||||
nullable: true
|
||||
type: string
|
||||
duration_months:
|
||||
description: 套餐时长(月数)
|
||||
maximum: 120
|
||||
minimum: 1
|
||||
type: integer
|
||||
package_code:
|
||||
description: 套餐编码
|
||||
maxLength: 100
|
||||
minLength: 1
|
||||
type: string
|
||||
package_name:
|
||||
description: 套餐名称
|
||||
maxLength: 255
|
||||
minLength: 1
|
||||
type: string
|
||||
package_type:
|
||||
description: 套餐类型 (formal:正式套餐, addon:附加套餐)
|
||||
type: string
|
||||
price:
|
||||
description: 套餐价格(分)
|
||||
minimum: 0
|
||||
type: integer
|
||||
real_data_mb:
|
||||
description: 真流量额度(MB)
|
||||
minimum: 0
|
||||
nullable: true
|
||||
type: integer
|
||||
series_id:
|
||||
description: 套餐系列ID
|
||||
minimum: 0
|
||||
nullable: true
|
||||
type: integer
|
||||
suggested_cost_price:
|
||||
description: 建议成本价(分)
|
||||
minimum: 0
|
||||
nullable: true
|
||||
type: integer
|
||||
suggested_retail_price:
|
||||
description: 建议售价(分)
|
||||
minimum: 0
|
||||
nullable: true
|
||||
type: integer
|
||||
virtual_data_mb:
|
||||
description: 虚流量额度(MB)
|
||||
minimum: 0
|
||||
nullable: true
|
||||
type: integer
|
||||
required:
|
||||
- package_code
|
||||
- package_name
|
||||
- package_type
|
||||
- duration_months
|
||||
- price
|
||||
type: object
|
||||
DtoCreatePackageSeriesRequest:
|
||||
properties:
|
||||
description:
|
||||
description: 描述
|
||||
maxLength: 500
|
||||
type: string
|
||||
series_code:
|
||||
description: 系列编码
|
||||
maxLength: 100
|
||||
minLength: 1
|
||||
type: string
|
||||
series_name:
|
||||
description: 系列名称
|
||||
maxLength: 255
|
||||
minLength: 1
|
||||
type: string
|
||||
required:
|
||||
- series_code
|
||||
- series_name
|
||||
type: object
|
||||
DtoCreatePermissionRequest:
|
||||
properties:
|
||||
parent_id:
|
||||
@@ -1963,6 +2048,130 @@ components:
|
||||
description: 已提现佣金(分)
|
||||
type: integer
|
||||
type: object
|
||||
DtoPackagePageResult:
|
||||
properties:
|
||||
list:
|
||||
description: 套餐列表
|
||||
items:
|
||||
$ref: '#/components/schemas/DtoPackageResponse'
|
||||
nullable: true
|
||||
type: array
|
||||
page:
|
||||
description: 当前页
|
||||
type: integer
|
||||
page_size:
|
||||
description: 每页数量
|
||||
type: integer
|
||||
total:
|
||||
description: 总数
|
||||
type: integer
|
||||
total_pages:
|
||||
description: 总页数
|
||||
type: integer
|
||||
type: object
|
||||
DtoPackageResponse:
|
||||
properties:
|
||||
created_at:
|
||||
description: 创建时间
|
||||
type: string
|
||||
data_amount_mb:
|
||||
description: 总流量额度(MB)
|
||||
type: integer
|
||||
data_type:
|
||||
description: 流量类型 (real:真流量, virtual:虚流量)
|
||||
type: string
|
||||
duration_months:
|
||||
description: 套餐时长(月数)
|
||||
type: integer
|
||||
id:
|
||||
description: 套餐ID
|
||||
minimum: 0
|
||||
type: integer
|
||||
package_code:
|
||||
description: 套餐编码
|
||||
type: string
|
||||
package_name:
|
||||
description: 套餐名称
|
||||
type: string
|
||||
package_type:
|
||||
description: 套餐类型 (formal:正式套餐, addon:附加套餐)
|
||||
type: string
|
||||
price:
|
||||
description: 套餐价格(分)
|
||||
type: integer
|
||||
real_data_mb:
|
||||
description: 真流量额度(MB)
|
||||
type: integer
|
||||
series_id:
|
||||
description: 套餐系列ID
|
||||
minimum: 0
|
||||
nullable: true
|
||||
type: integer
|
||||
shelf_status:
|
||||
description: 上架状态 (1:上架, 2:下架)
|
||||
type: integer
|
||||
status:
|
||||
description: 状态 (1:启用, 2:禁用)
|
||||
type: integer
|
||||
suggested_cost_price:
|
||||
description: 建议成本价(分)
|
||||
type: integer
|
||||
suggested_retail_price:
|
||||
description: 建议售价(分)
|
||||
type: integer
|
||||
updated_at:
|
||||
description: 更新时间
|
||||
type: string
|
||||
virtual_data_mb:
|
||||
description: 虚流量额度(MB)
|
||||
type: integer
|
||||
type: object
|
||||
DtoPackageSeriesPageResult:
|
||||
properties:
|
||||
list:
|
||||
description: 套餐系列列表
|
||||
items:
|
||||
$ref: '#/components/schemas/DtoPackageSeriesResponse'
|
||||
nullable: true
|
||||
type: array
|
||||
page:
|
||||
description: 当前页
|
||||
type: integer
|
||||
page_size:
|
||||
description: 每页数量
|
||||
type: integer
|
||||
total:
|
||||
description: 总数
|
||||
type: integer
|
||||
total_pages:
|
||||
description: 总页数
|
||||
type: integer
|
||||
type: object
|
||||
DtoPackageSeriesResponse:
|
||||
properties:
|
||||
created_at:
|
||||
description: 创建时间
|
||||
type: string
|
||||
description:
|
||||
description: 描述
|
||||
type: string
|
||||
id:
|
||||
description: 系列ID
|
||||
minimum: 0
|
||||
type: integer
|
||||
series_code:
|
||||
description: 系列编码
|
||||
type: string
|
||||
series_name:
|
||||
description: 系列名称
|
||||
type: string
|
||||
status:
|
||||
description: 状态 (1:启用, 2:禁用)
|
||||
type: integer
|
||||
updated_at:
|
||||
description: 更新时间
|
||||
type: string
|
||||
type: object
|
||||
DtoPermissionPageResult:
|
||||
properties:
|
||||
items:
|
||||
@@ -2873,6 +3082,102 @@ components:
|
||||
required:
|
||||
- status
|
||||
type: object
|
||||
DtoUpdatePackageParams:
|
||||
properties:
|
||||
data_amount_mb:
|
||||
description: 总流量额度(MB)
|
||||
minimum: 0
|
||||
nullable: true
|
||||
type: integer
|
||||
data_type:
|
||||
description: 流量类型 (real:真流量, virtual:虚流量)
|
||||
nullable: true
|
||||
type: string
|
||||
duration_months:
|
||||
description: 套餐时长(月数)
|
||||
maximum: 120
|
||||
minimum: 1
|
||||
nullable: true
|
||||
type: integer
|
||||
package_name:
|
||||
description: 套餐名称
|
||||
maxLength: 255
|
||||
minLength: 1
|
||||
nullable: true
|
||||
type: string
|
||||
package_type:
|
||||
description: 套餐类型 (formal:正式套餐, addon:附加套餐)
|
||||
nullable: true
|
||||
type: string
|
||||
price:
|
||||
description: 套餐价格(分)
|
||||
minimum: 0
|
||||
nullable: true
|
||||
type: integer
|
||||
real_data_mb:
|
||||
description: 真流量额度(MB)
|
||||
minimum: 0
|
||||
nullable: true
|
||||
type: integer
|
||||
series_id:
|
||||
description: 套餐系列ID
|
||||
minimum: 0
|
||||
nullable: true
|
||||
type: integer
|
||||
suggested_cost_price:
|
||||
description: 建议成本价(分)
|
||||
minimum: 0
|
||||
nullable: true
|
||||
type: integer
|
||||
suggested_retail_price:
|
||||
description: 建议售价(分)
|
||||
minimum: 0
|
||||
nullable: true
|
||||
type: integer
|
||||
virtual_data_mb:
|
||||
description: 虚流量额度(MB)
|
||||
minimum: 0
|
||||
nullable: true
|
||||
type: integer
|
||||
type: object
|
||||
DtoUpdatePackageSeriesParams:
|
||||
properties:
|
||||
description:
|
||||
description: 描述
|
||||
maxLength: 500
|
||||
nullable: true
|
||||
type: string
|
||||
series_name:
|
||||
description: 系列名称
|
||||
maxLength: 255
|
||||
minLength: 1
|
||||
nullable: true
|
||||
type: string
|
||||
type: object
|
||||
DtoUpdatePackageSeriesStatusParams:
|
||||
properties:
|
||||
status:
|
||||
description: 状态 (1:启用, 2:禁用)
|
||||
type: integer
|
||||
required:
|
||||
- status
|
||||
type: object
|
||||
DtoUpdatePackageShelfStatusParams:
|
||||
properties:
|
||||
shelf_status:
|
||||
description: 上架状态 (1:上架, 2:下架)
|
||||
type: integer
|
||||
required:
|
||||
- shelf_status
|
||||
type: object
|
||||
DtoUpdatePackageStatusParams:
|
||||
properties:
|
||||
status:
|
||||
description: 状态 (1:启用, 2:禁用)
|
||||
type: integer
|
||||
required:
|
||||
- status
|
||||
type: object
|
||||
DtoUpdatePasswordParams:
|
||||
properties:
|
||||
new_password:
|
||||
@@ -7062,6 +7367,664 @@ paths:
|
||||
summary: 发起提现申请
|
||||
tags:
|
||||
- 我的佣金
|
||||
/api/admin/package-series:
|
||||
get:
|
||||
parameters:
|
||||
- description: 页码
|
||||
in: query
|
||||
name: page
|
||||
schema:
|
||||
description: 页码
|
||||
minimum: 1
|
||||
type: integer
|
||||
- description: 每页数量
|
||||
in: query
|
||||
name: page_size
|
||||
schema:
|
||||
description: 每页数量
|
||||
maximum: 100
|
||||
minimum: 1
|
||||
type: integer
|
||||
- description: 系列名称(模糊搜索)
|
||||
in: query
|
||||
name: series_name
|
||||
schema:
|
||||
description: 系列名称(模糊搜索)
|
||||
maxLength: 255
|
||||
nullable: true
|
||||
type: string
|
||||
- description: 状态 (1:启用, 2:禁用)
|
||||
in: query
|
||||
name: status
|
||||
schema:
|
||||
description: 状态 (1:启用, 2:禁用)
|
||||
nullable: true
|
||||
type: integer
|
||||
responses:
|
||||
"200":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/DtoPackageSeriesPageResult'
|
||||
description: OK
|
||||
"400":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 请求参数错误
|
||||
"401":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 未认证或认证已过期
|
||||
"403":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 无权访问
|
||||
"500":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 服务器内部错误
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: 套餐系列列表
|
||||
tags:
|
||||
- 套餐系列管理
|
||||
post:
|
||||
requestBody:
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/DtoCreatePackageSeriesRequest'
|
||||
responses:
|
||||
"200":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/DtoPackageSeriesResponse'
|
||||
description: OK
|
||||
"400":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 请求参数错误
|
||||
"401":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 未认证或认证已过期
|
||||
"403":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 无权访问
|
||||
"500":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 服务器内部错误
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: 创建套餐系列
|
||||
tags:
|
||||
- 套餐系列管理
|
||||
/api/admin/package-series/{id}:
|
||||
delete:
|
||||
parameters:
|
||||
- description: ID
|
||||
in: path
|
||||
name: id
|
||||
required: true
|
||||
schema:
|
||||
description: ID
|
||||
minimum: 0
|
||||
type: integer
|
||||
responses:
|
||||
"400":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 请求参数错误
|
||||
"401":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 未认证或认证已过期
|
||||
"403":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 无权访问
|
||||
"500":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 服务器内部错误
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: 删除套餐系列
|
||||
tags:
|
||||
- 套餐系列管理
|
||||
get:
|
||||
parameters:
|
||||
- description: ID
|
||||
in: path
|
||||
name: id
|
||||
required: true
|
||||
schema:
|
||||
description: ID
|
||||
minimum: 0
|
||||
type: integer
|
||||
responses:
|
||||
"200":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/DtoPackageSeriesResponse'
|
||||
description: OK
|
||||
"400":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 请求参数错误
|
||||
"401":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 未认证或认证已过期
|
||||
"403":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 无权访问
|
||||
"500":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 服务器内部错误
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: 获取套餐系列详情
|
||||
tags:
|
||||
- 套餐系列管理
|
||||
put:
|
||||
parameters:
|
||||
- description: ID
|
||||
in: path
|
||||
name: id
|
||||
required: true
|
||||
schema:
|
||||
description: ID
|
||||
minimum: 0
|
||||
type: integer
|
||||
requestBody:
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/DtoUpdatePackageSeriesParams'
|
||||
responses:
|
||||
"200":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/DtoPackageSeriesResponse'
|
||||
description: OK
|
||||
"400":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 请求参数错误
|
||||
"401":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 未认证或认证已过期
|
||||
"403":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 无权访问
|
||||
"500":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 服务器内部错误
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: 更新套餐系列
|
||||
tags:
|
||||
- 套餐系列管理
|
||||
/api/admin/package-series/{id}/status:
|
||||
patch:
|
||||
parameters:
|
||||
- description: ID
|
||||
in: path
|
||||
name: id
|
||||
required: true
|
||||
schema:
|
||||
description: ID
|
||||
minimum: 0
|
||||
type: integer
|
||||
requestBody:
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/DtoUpdatePackageSeriesStatusParams'
|
||||
responses:
|
||||
"400":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 请求参数错误
|
||||
"401":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 未认证或认证已过期
|
||||
"403":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 无权访问
|
||||
"500":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 服务器内部错误
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: 更新套餐系列状态
|
||||
tags:
|
||||
- 套餐系列管理
|
||||
/api/admin/packages:
|
||||
get:
|
||||
parameters:
|
||||
- description: 页码
|
||||
in: query
|
||||
name: page
|
||||
schema:
|
||||
description: 页码
|
||||
minimum: 1
|
||||
type: integer
|
||||
- description: 每页数量
|
||||
in: query
|
||||
name: page_size
|
||||
schema:
|
||||
description: 每页数量
|
||||
maximum: 100
|
||||
minimum: 1
|
||||
type: integer
|
||||
- description: 套餐名称(模糊搜索)
|
||||
in: query
|
||||
name: package_name
|
||||
schema:
|
||||
description: 套餐名称(模糊搜索)
|
||||
maxLength: 255
|
||||
nullable: true
|
||||
type: string
|
||||
- description: 套餐系列ID
|
||||
in: query
|
||||
name: series_id
|
||||
schema:
|
||||
description: 套餐系列ID
|
||||
minimum: 0
|
||||
nullable: true
|
||||
type: integer
|
||||
- description: 状态 (1:启用, 2:禁用)
|
||||
in: query
|
||||
name: status
|
||||
schema:
|
||||
description: 状态 (1:启用, 2:禁用)
|
||||
nullable: true
|
||||
type: integer
|
||||
- description: 上架状态 (1:上架, 2:下架)
|
||||
in: query
|
||||
name: shelf_status
|
||||
schema:
|
||||
description: 上架状态 (1:上架, 2:下架)
|
||||
nullable: true
|
||||
type: integer
|
||||
- description: 套餐类型 (formal:正式套餐, addon:附加套餐)
|
||||
in: query
|
||||
name: package_type
|
||||
schema:
|
||||
description: 套餐类型 (formal:正式套餐, addon:附加套餐)
|
||||
nullable: true
|
||||
type: string
|
||||
responses:
|
||||
"200":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/DtoPackagePageResult'
|
||||
description: OK
|
||||
"400":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 请求参数错误
|
||||
"401":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 未认证或认证已过期
|
||||
"403":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 无权访问
|
||||
"500":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 服务器内部错误
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: 套餐列表
|
||||
tags:
|
||||
- 套餐管理
|
||||
post:
|
||||
requestBody:
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/DtoCreatePackageRequest'
|
||||
responses:
|
||||
"200":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/DtoPackageResponse'
|
||||
description: OK
|
||||
"400":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 请求参数错误
|
||||
"401":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 未认证或认证已过期
|
||||
"403":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 无权访问
|
||||
"500":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 服务器内部错误
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: 创建套餐
|
||||
tags:
|
||||
- 套餐管理
|
||||
/api/admin/packages/{id}:
|
||||
delete:
|
||||
parameters:
|
||||
- description: ID
|
||||
in: path
|
||||
name: id
|
||||
required: true
|
||||
schema:
|
||||
description: ID
|
||||
minimum: 0
|
||||
type: integer
|
||||
responses:
|
||||
"400":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 请求参数错误
|
||||
"401":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 未认证或认证已过期
|
||||
"403":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 无权访问
|
||||
"500":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 服务器内部错误
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: 删除套餐
|
||||
tags:
|
||||
- 套餐管理
|
||||
get:
|
||||
parameters:
|
||||
- description: ID
|
||||
in: path
|
||||
name: id
|
||||
required: true
|
||||
schema:
|
||||
description: ID
|
||||
minimum: 0
|
||||
type: integer
|
||||
responses:
|
||||
"200":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/DtoPackageResponse'
|
||||
description: OK
|
||||
"400":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 请求参数错误
|
||||
"401":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 未认证或认证已过期
|
||||
"403":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 无权访问
|
||||
"500":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 服务器内部错误
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: 获取套餐详情
|
||||
tags:
|
||||
- 套餐管理
|
||||
put:
|
||||
parameters:
|
||||
- description: ID
|
||||
in: path
|
||||
name: id
|
||||
required: true
|
||||
schema:
|
||||
description: ID
|
||||
minimum: 0
|
||||
type: integer
|
||||
requestBody:
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/DtoUpdatePackageParams'
|
||||
responses:
|
||||
"200":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/DtoPackageResponse'
|
||||
description: OK
|
||||
"400":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 请求参数错误
|
||||
"401":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 未认证或认证已过期
|
||||
"403":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 无权访问
|
||||
"500":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 服务器内部错误
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: 更新套餐
|
||||
tags:
|
||||
- 套餐管理
|
||||
/api/admin/packages/{id}/shelf:
|
||||
patch:
|
||||
parameters:
|
||||
- description: ID
|
||||
in: path
|
||||
name: id
|
||||
required: true
|
||||
schema:
|
||||
description: ID
|
||||
minimum: 0
|
||||
type: integer
|
||||
requestBody:
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/DtoUpdatePackageShelfStatusParams'
|
||||
responses:
|
||||
"400":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 请求参数错误
|
||||
"401":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 未认证或认证已过期
|
||||
"403":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 无权访问
|
||||
"500":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 服务器内部错误
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: 更新套餐上架状态
|
||||
tags:
|
||||
- 套餐管理
|
||||
/api/admin/packages/{id}/status:
|
||||
patch:
|
||||
parameters:
|
||||
- description: ID
|
||||
in: path
|
||||
name: id
|
||||
required: true
|
||||
schema:
|
||||
description: ID
|
||||
minimum: 0
|
||||
type: integer
|
||||
requestBody:
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/DtoUpdatePackageStatusParams'
|
||||
responses:
|
||||
"400":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 请求参数错误
|
||||
"401":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 未认证或认证已过期
|
||||
"403":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 无权访问
|
||||
"500":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
description: 服务器内部错误
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: 更新套餐状态
|
||||
tags:
|
||||
- 套餐管理
|
||||
/api/admin/password:
|
||||
put:
|
||||
requestBody:
|
||||
|
||||
@@ -2,6 +2,48 @@
|
||||
|
||||
本文档是测试连接管理的**唯一标准**,所有新测试必须遵循此规范。
|
||||
|
||||
## ⚠️ 运行测试前必须加载环境变量
|
||||
|
||||
**所有测试命令必须先加载 `.env.local` 环境变量**,否则测试将因缺少数据库/Redis 配置而失败。
|
||||
|
||||
### 命令格式
|
||||
|
||||
```bash
|
||||
# ✅ 正确:先 source 环境变量
|
||||
source .env.local && go test -v ./internal/service/xxx/...
|
||||
|
||||
# ✅ 正确:运行所有测试
|
||||
source .env.local && go test ./...
|
||||
|
||||
# ❌ 错误:直接运行测试(会因缺少配置而失败)
|
||||
go test -v ./internal/service/xxx/...
|
||||
```
|
||||
|
||||
### 环境变量文件
|
||||
|
||||
- **`.env.local`**: 本地开发/测试环境配置(不提交到 Git)
|
||||
- 包含数据库连接、Redis 地址、JWT 密钥等必要配置
|
||||
- 如果文件不存在,从 `.env.example` 复制并填写实际值
|
||||
|
||||
### 常见错误
|
||||
|
||||
如果看到以下错误,说明未加载环境变量:
|
||||
|
||||
```
|
||||
--- SKIP: TestXxx (0.00s)
|
||||
test_helpers.go:xx: 跳过测试:无法连接测试数据库
|
||||
```
|
||||
|
||||
或:
|
||||
|
||||
```
|
||||
panic: 配置加载失败: 缺少必要的数据库配置
|
||||
```
|
||||
|
||||
**解决方案**:确保运行 `source .env.local` 后再执行测试。
|
||||
|
||||
---
|
||||
|
||||
## 快速开始
|
||||
|
||||
```go
|
||||
|
||||
Reference in New Issue
Block a user