This commit is contained in:
hero920103 committed 2026-10-19 01:13:17 +08:00
1 parent 5718a00e31
commit 1850ac640e
226 files changed
+37772 -12071

No files matched your search

+66 -14
View File
@@ -9,7 +9,7 @@ import (
"time"
"server/models"
"server/pkg/jwtutil"
"server/pkg/identity"
"server/services"
beego "github.com/beego/beego/v2/server/web"
@@ -32,6 +32,18 @@ func (c *PlatformTenantPackageController) jsonErr(httpStatus, bizCode int, msg s
_ = c.ServeJSON()
}
// requirePlatform 套餐与配额是平台侧经营数据,全部路由都挂在 /platform 下。
// 此前每个方法各自解析令牌、且没有一个判端——租户令牌即可改自己的套餐上限和
// 用户数配额,等于把计费开关交给了付费方。失败时已写好响应,调用方必须立即 return。
func (c *PlatformTenantPackageController) requirePlatform() bool {
if _, err := identity.Claims(c.Ctx.Request.Header.Get("Authorization"), identity.EndPlatform); err != nil {
code := identity.Status(err)
c.jsonErr(code, code, err.Error())
return false
}
return true
}
func (c *PlatformTenantPackageController) jsonOK(data interface{}, msg string) {
if msg == "" {
msg = "success"
@@ -46,22 +58,11 @@ func (c *PlatformTenantPackageController) jsonOK(data interface{}, msg string) {
// currentOperator 解析当前平台账号名(用于增购记录留痕;取不到时返回空串,不阻断请求)
func (c *PlatformTenantPackageController) currentOperator() string {
auth := c.Ctx.Request.Header.Get("Authorization")
if auth == "" {
return ""
}
parts := strings.SplitN(auth, " ", 2)
if len(parts) != 2 || parts[0] != "Bearer" {
return ""
}
claims, err := jwtutil.ParseToken(parts[1])
claims, err := identity.Claims(c.Ctx.Request.Header.Get("Authorization"), identity.EndPlatform)
if err != nil || claims == nil {
return ""
}
if strings.TrimSpace(claims.Username) != "" {
return claims.Username
}
return ""
return strings.TrimSpace(claims.Username)
}
func (c *PlatformTenantPackageController) readBody(target interface{}) bool {
@@ -144,6 +145,9 @@ func loadPackageModules(packageIDs []uint64) map[uint64][]tenantPackageModuleIte
// GetPackageList GET /platform/tenantPackage/list
func (c *PlatformTenantPackageController) GetPackageList() {
if !c.requirePlatform() {
return
}
keyword := strings.TrimSpace(c.GetString("keyword"))
status := strings.TrimSpace(c.GetString("status"))
@@ -220,6 +224,9 @@ func moduleCodes(items []tenantPackageModuleItem) []string {
// GetPackageSelectList GET /platform/tenantPackage/select/list
func (c *PlatformTenantPackageController) GetPackageSelectList() {
if !c.requirePlatform() {
return
}
var rows []models.SystemTenantPackage
_, err := models.Orm.QueryTable(new(models.SystemTenantPackage)).
Filter("delete_time__isnull", true).
@@ -262,6 +269,9 @@ func (c *PlatformTenantPackageController) GetPackageSelectList() {
// GetPackageDetail GET /platform/tenantPackage/detail/:id
func (c *PlatformTenantPackageController) GetPackageDetail() {
if !c.requirePlatform() {
return
}
id := parseUint64Param(c.Ctx.Input.Param(":id"))
if id == 0 {
c.jsonErr(400, 400, "参数错误")
@@ -285,11 +295,17 @@ func (c *PlatformTenantPackageController) GetPackageDetail() {
// GetPurchaseURL GET /platform/tenantPackage/purchaseUrl
// 套餐购买链接:租户端未开通功能卡片「购买」按钮的跳转地址
func (c *PlatformTenantPackageController) GetPurchaseURL() {
if !c.requirePlatform() {
return
}
c.jsonOK(map[string]interface{}{"purchase_url": services.GetPackagePurchaseURL()}, "获取成功")
}
// SavePurchaseURL POST /platform/tenantPackage/purchaseUrl
func (c *PlatformTenantPackageController) SavePurchaseURL() {
if !c.requirePlatform() {
return
}
var p struct {
PurchaseURL string `json:"purchase_url"`
}
@@ -306,6 +322,9 @@ func (c *PlatformTenantPackageController) SavePurchaseURL() {
// GetModuleOptions GET /platform/tenantPackage/moduleOptions
// 可加入套餐的功能模块清单(取 yz_system_modules 中启用且未删除的模块)
func (c *PlatformTenantPackageController) GetModuleOptions() {
if !c.requirePlatform() {
return
}
var rows []models.SystemModules
_, err := models.Orm.QueryTable(new(models.SystemModules)).
Filter("delete_time__isnull", true).
@@ -372,6 +391,9 @@ func savePackageModules(packageID uint64, modules []string) error {
// CreatePackage POST /platform/tenantPackage/create
func (c *PlatformTenantPackageController) CreatePackage() {
if !c.requirePlatform() {
return
}
var p tenantPackagePayload
if !c.readBody(&p) {
return
@@ -435,6 +457,9 @@ func (c *PlatformTenantPackageController) CreatePackage() {
// EditPackage POST /platform/tenantPackage/edit/:id
func (c *PlatformTenantPackageController) EditPackage() {
if !c.requirePlatform() {
return
}
id := parseUint64Param(c.Ctx.Input.Param(":id"))
if id == 0 {
c.jsonErr(400, 400, "参数错误")
@@ -543,6 +568,9 @@ func clearOtherDefaultPackages(keepID uint64) {
// DeletePackage DELETE /platform/tenantPackage/delete/:id(软删)
// 注意:基础套餐(code=basic)为系统内置兜底套餐(套餐到期自动降级目标),任何情况下不允许删除。
func (c *PlatformTenantPackageController) DeletePackage() {
if !c.requirePlatform() {
return
}
id := parseUint64Param(c.Ctx.Input.Param(":id"))
if id == 0 {
c.jsonErr(400, 400, "参数错误")
@@ -606,6 +634,9 @@ type quotaPackagePayload struct {
// GetQuotaPackageList GET /platform/tenantQuotaPackage/list
func (c *PlatformTenantPackageController) GetQuotaPackageList() {
if !c.requirePlatform() {
return
}
onlyEnabled := c.GetString("enabled") == "1"
qs := models.Orm.QueryTable(new(models.SystemTenantUserQuotaPackage)).Filter("delete_time__isnull", true)
if onlyEnabled {
@@ -621,6 +652,9 @@ func (c *PlatformTenantPackageController) GetQuotaPackageList() {
// CreateQuotaPackage POST /platform/tenantQuotaPackage/create
func (c *PlatformTenantPackageController) CreateQuotaPackage() {
if !c.requirePlatform() {
return
}
var p quotaPackagePayload
if !c.readBody(&p) {
return
@@ -654,6 +688,9 @@ func (c *PlatformTenantPackageController) CreateQuotaPackage() {
// EditQuotaPackage POST /platform/tenantQuotaPackage/edit/:id
func (c *PlatformTenantPackageController) EditQuotaPackage() {
if !c.requirePlatform() {
return
}
id := parseUint64Param(c.Ctx.Input.Param(":id"))
if id == 0 {
c.jsonErr(400, 400, "参数错误")
@@ -703,6 +740,9 @@ func (c *PlatformTenantPackageController) EditQuotaPackage() {
// DeleteQuotaPackage DELETE /platform/tenantQuotaPackage/delete/:id(软删)
func (c *PlatformTenantPackageController) DeleteQuotaPackage() {
if !c.requirePlatform() {
return
}
id := parseUint64Param(c.Ctx.Input.Param(":id"))
if id == 0 {
c.jsonErr(400, 400, "参数错误")
@@ -735,6 +775,9 @@ type setTenantPackagePayload struct {
// SetTenantPackage POST /platform/tenant/setPackage
// 为租户绑定套餐;sync_quota 为 true(默认)时按套餐包含用户数与现有上限取较大值同步。
func (c *PlatformTenantPackageController) SetTenantPackage() {
if !c.requirePlatform() {
return
}
var p setTenantPackagePayload
if !c.readBody(&p) {
return
@@ -758,6 +801,9 @@ func (c *PlatformTenantPackageController) SetTenantPackage() {
// GetTenantQuotaInfo GET /platform/tenant/quotaInfo?tid=1
// 返回租户套餐、用户数使用情况、可增购规格与单价
func (c *PlatformTenantPackageController) GetTenantQuotaInfo() {
if !c.requirePlatform() {
return
}
tid, _ := c.GetUint64("tid")
if tid == 0 {
c.jsonErr(400, 400, "tid 不能为空")
@@ -916,6 +962,9 @@ type rechargeQuotaPayload struct {
// RechargeTenantQuota POST /platform/tenant/rechargeQuota
// 用户数增购:单个增购(单价 x 人数)或 按加购套餐(如 5人/500元)
func (c *PlatformTenantPackageController) RechargeTenantQuota() {
if !c.requirePlatform() {
return
}
var p rechargeQuotaPayload
if !c.readBody(&p) {
return
@@ -1001,6 +1050,9 @@ func (c *PlatformTenantPackageController) RechargeTenantQuota() {
// GetQuotaOrders GET /platform/tenant/quotaOrders?tid=1
func (c *PlatformTenantPackageController) GetQuotaOrders() {
if !c.requirePlatform() {
return
}
tid, _ := c.GetUint64("tid")
if tid == 0 {
c.jsonErr(400, 400, "tid 不能为空")