Files
yunzerwebsiteallinone/go/controllers/backend_modules.go
T
2026-09-16 00:22:17 +08:00

102 lines
3.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package controllers
import (
"fmt"
"strings"
"server/models"
"server/pkg/jwtutil"
"server/services"
beego "github.com/beego/beego/v2/server/web"
)
// tenantModuleItem 模块列表返回项:在模块基础信息上补充套餐开通状态,
// locked=true 表示该模块不在当前租户已购套餐内(前端置灰并提示购买套餐)。
type tenantModuleItem struct {
models.SystemModules
Locked bool `json:"locked"`
}
// BackendModulesController backend 模块接口(yz_system_modules)
type BackendModulesController struct {
beego.Controller
}
func (c *BackendModulesController) backendModulesClaims() (*jwtutil.Claims, error) {
auth := c.Ctx.Request.Header.Get("Authorization")
if auth == "" {
return nil, fmt.Errorf("未登录")
}
parts := strings.SplitN(auth, " ", 2)
if len(parts) != 2 || parts[0] != "Bearer" {
return nil, fmt.Errorf("认证信息格式错误")
}
claims, err := jwtutil.ParseToken(parts[1])
if err != nil {
return nil, fmt.Errorf("无效的token")
}
if claims.UserType != "backend" {
return nil, fmt.Errorf("无权访问")
}
return claims, nil
}
func (c *BackendModulesController) jsonErr(httpStatus, bizCode int, msg string) {
c.Ctx.Output.SetStatus(httpStatus)
c.Data["json"] = map[string]interface{}{"code": bizCode, "msg": msg}
_ = c.ServeJSON()
}
// GetTenantList GET /backend/modules/getTenantList
// 返回当前 backend 账号可见的模块(status=1 且 is_show=1)。
// 同时按当前租户已购套餐标记 locked:未开通的功能模块前端置灰、禁止跳转并提示购买套餐。
func (c *BackendModulesController) GetTenantList() {
claims, err := c.backendModulesClaims()
if err != nil {
c.jsonErr(401, 401, err.Error())
return
}
var rows []models.SystemModules
_, err = models.Orm.QueryTable(new(models.SystemModules)).
Filter("delete_time__isnull", true).
Filter("status", 1).
Filter("is_show", 1).
OrderBy("sort", "id").
All(&rows)
if err != nil {
c.jsonErr(500, 500, "获取失败:"+err.Error())
return
}
// 租户已开通的模块编码集合(来自租户绑定/生效套餐)
allowed := map[string]bool{}
packageName := ""
if tid := uint64(claims.TenantId); tid > 0 {
allowed = services.GetTenantModuleCodes(tid)
if pkg, e := services.GetTenantPackage(tid); e == nil && pkg != nil {
packageName = pkg.Name
}
}
list := make([]tenantModuleItem, 0, len(rows))
for _, m := range rows {
// 安全兜底:租户未绑定套餐或套餐未配置任何功能模块时不做锁定,
// 避免套餐数据缺失导致全部功能不可用。
locked := len(allowed) > 0 && !allowed[strings.TrimSpace(m.Code)]
list = append(list, tenantModuleItem{SystemModules: m, Locked: locked})
}
c.Data["json"] = map[string]interface{}{
"code": 200,
"msg": "获取成功",
"data": map[string]interface{}{
"list": list,
"total": len(list),
"package_name": packageName,
"purchase_url": services.GetPackagePurchaseURL(),
},
}
_ = c.ServeJSON()
}