Files
EdgeAdmin/internal/configloaders/admin_module.go

239 lines
5.4 KiB
Go

package configloaders
import (
teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
"github.com/TeaOSLab/EdgeAdmin/internal/rpc"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/systemconfigs"
"github.com/iwind/TeaGo/maps"
)
type AdminModuleCode = string
const (
AdminModuleCodeDashboard AdminModuleCode = "dashboard" // 看板
AdminModuleCodeServer AdminModuleCode = "server" // 网站
AdminModuleCodeNode AdminModuleCode = "node" // 节点
AdminModuleCodeDNS AdminModuleCode = "dns" // DNS
AdminModuleCodeNS AdminModuleCode = "ns" // 域名服务
AdminModuleCodeAdmin AdminModuleCode = "admin" // 系统用户
AdminModuleCodeUser AdminModuleCode = "user" // 平台用户
AdminModuleCodeFinance AdminModuleCode = "finance" // 财务
AdminModuleCodePlan AdminModuleCode = "plan" // 套餐
AdminModuleCodeLog AdminModuleCode = "log" // 日志
AdminModuleCodeSetting AdminModuleCode = "setting" // 设置
AdminModuleCodeTicket AdminModuleCode = "ticket" // 工单
AdminModuleCodeCommon AdminModuleCode = "common" // 只要登录就可以访问的模块
)
var sharedAdminModuleMapping = map[int64]*AdminModuleList{} // adminId => AdminModuleList
func loadAdminModuleMapping() (map[int64]*AdminModuleList, error) {
if len(sharedAdminModuleMapping) > 0 {
return sharedAdminModuleMapping, nil
}
rpcClient, err := rpc.SharedRPC()
if err != nil {
return nil, err
}
modulesResp, err := rpcClient.AdminRPC().FindAllAdminModules(rpcClient.Context(0), &pb.FindAllAdminModulesRequest{})
if err != nil {
return nil, err
}
mapping := map[int64]*AdminModuleList{}
for _, m := range modulesResp.AdminModules {
list := &AdminModuleList{
IsSuper: m.IsSuper,
Fullname: m.Fullname,
Theme: m.Theme,
}
for _, pbModule := range m.Modules {
list.Modules = append(list.Modules, &systemconfigs.AdminModule{
Code: pbModule.Code,
AllowAll: pbModule.AllowAll,
Actions: pbModule.Actions,
})
}
mapping[m.AdminId] = list
}
sharedAdminModuleMapping = mapping
return sharedAdminModuleMapping, nil
}
func NotifyAdminModuleMappingChange() error {
locker.Lock()
defer locker.Unlock()
sharedAdminModuleMapping = map[int64]*AdminModuleList{}
_, err := loadAdminModuleMapping()
return err
}
// CheckAdmin 检查用户是否存在
func CheckAdmin(adminId int64) bool {
locker.Lock()
defer locker.Unlock()
// 如果还没有数据,则尝试加载
if len(sharedAdminModuleMapping) == 0 {
_, _ = loadAdminModuleMapping()
}
_, ok := sharedAdminModuleMapping[adminId]
return ok
}
// AllowModule 检查模块是否允许访问
func AllowModule(adminId int64, module string) bool {
locker.Lock()
defer locker.Unlock()
if module == AdminModuleCodeCommon {
return true
}
if len(sharedAdminModuleMapping) == 0 {
_, _ = loadAdminModuleMapping()
}
list, ok := sharedAdminModuleMapping[adminId]
if ok {
return list.Allow(module)
}
return false
}
// FindFirstAdminModule 获取管理员第一个可访问模块
func FindFirstAdminModule(adminId int64) (module AdminModuleCode, ok bool) {
locker.Lock()
defer locker.Unlock()
list, ok2 := sharedAdminModuleMapping[adminId]
if ok2 {
if list.IsSuper {
return AdminModuleCodeDashboard, true
} else if len(list.Modules) > 0 {
return list.Modules[0].Code, true
}
}
return
}
// FindAdminFullname 查找某个管理员名称
func FindAdminFullname(adminId int64) string {
locker.Lock()
defer locker.Unlock()
list, ok := sharedAdminModuleMapping[adminId]
if ok {
return list.Fullname
}
return ""
}
// FindAdminTheme 查找某个管理员选择的风格
func FindAdminTheme(adminId int64) string {
locker.Lock()
defer locker.Unlock()
list, ok := sharedAdminModuleMapping[adminId]
if ok {
return list.Theme
}
return ""
}
// UpdateAdminTheme 设置某个管理员的风格
func UpdateAdminTheme(adminId int64, theme string) {
locker.Lock()
defer locker.Unlock()
list, ok := sharedAdminModuleMapping[adminId]
if ok {
list.Theme = theme
}
}
// AllModuleMaps 所有权限列表
func AllModuleMaps() []maps.Map {
var m = []maps.Map{
{
"name": "看板",
"code": AdminModuleCodeDashboard,
"url": "/dashboard",
},
{
"name": "网站列表",
"code": AdminModuleCodeServer,
"url": "/servers",
},
{
"name": "边缘节点",
"code": AdminModuleCodeNode,
"url": "/clusters",
},
{
"name": "域名解析",
"code": AdminModuleCodeDNS,
"url": "/dns",
},
}
if teaconst.IsPlus {
m = append(m, maps.Map{
"name": "智能DNS",
"code": AdminModuleCodeNS,
"url": "/ns",
})
}
m = append(m, []maps.Map{
{
"name": "平台用户",
"code": AdminModuleCodeUser,
"url": "/users",
},
{
"name": "系统用户",
"code": AdminModuleCodeAdmin,
"url": "/admins",
},
{
"name": "财务管理",
"code": AdminModuleCodeFinance,
"url": "/finance",
},
}...)
if teaconst.IsPlus {
m = append(m, []maps.Map{
{
"name": "套餐管理",
"code": AdminModuleCodePlan,
"url": "/plans",
},
{
"name": "工单系统",
"code": AdminModuleCodeTicket,
"url": "/tickets",
},
}...)
}
m = append(m, []maps.Map{
{
"name": "日志审计",
"code": AdminModuleCodeLog,
"url": "/log",
},
{
"name": "系统设置",
"code": AdminModuleCodeSetting,
"url": "/settings",
},
}...)
return m
}