Files
2026-10-26 22:42:29 +08:00

87 lines
3.7 KiB
Go

// Package admin 定义后台管理专用领域模型(RBAC)。
// 表名统一以 admin_ 为前缀,与小程序业务(users / mini_programs)物理隔离,
// 因此本包模型不进小程序数据隔离逻辑。
package admin
import "portal-mini-go/internal/pkg/types"
// User 是后台管理员账号。用户名全局唯一,密码以 bcrypt 哈希存储。
type User struct {
ID uint64 `gorm:"primaryKey;autoIncrement" json:"id"`
Username string `gorm:"column:username;type:varchar(64);uniqueIndex;not null" json:"username"`
PasswordHash string `gorm:"column:password_hash;type:varchar(255);not null" json:"-"`
Nickname string `gorm:"column:nickname;type:varchar(128)" json:"nickname"`
Status int8 `gorm:"column:status;type:tinyint;not null;default:1" json:"status"`
CreatedAt types.Time `json:"created_at"`
UpdatedAt types.Time `json:"updated_at"`
}
func (User) TableName() string { return "admin_users" }
// 管理员状态:0 禁用、1 启用。
const (
UserStatusDisabled int8 = 0
UserStatusEnabled int8 = 1
)
// Role 是后台角色,与权限多对多关联,再与管理员多对多关联。
type Role struct {
ID uint64 `gorm:"primaryKey;autoIncrement" json:"id"`
Code string `gorm:"column:code;type:varchar(64);uniqueIndex;not null" json:"code"`
Name string `gorm:"column:name;type:varchar(128);not null" json:"name"`
Description string `gorm:"column:description;type:varchar(512)" json:"description"`
Status int8 `gorm:"column:status;type:tinyint;not null;default:1" json:"status"`
CreatedAt types.Time `json:"created_at"`
UpdatedAt types.Time `json:"updated_at"`
}
func (Role) TableName() string { return "admin_roles" }
// Permission 是后台权限,分接口(api)与菜单(menu)两类。
// 接口权限 code 对应后端 API 守卫;菜单权限 code 用于前端动态渲染菜单树。
type Permission struct {
ID uint64 `gorm:"primaryKey;autoIncrement" json:"id"`
Code string `gorm:"column:code;type:varchar(128);uniqueIndex;not null" json:"code"`
Name string `gorm:"column:name;type:varchar(128);not null" json:"name"`
Type string `gorm:"column:type;type:varchar(16);not null;default:'api'" json:"type"`
Method string `gorm:"column:method;type:varchar(16)" json:"method"`
Path string `gorm:"column:path;type:varchar(255)" json:"path"`
ParentID uint64 `gorm:"column:parent_id;index" json:"parent_id"`
Sort int `gorm:"column:sort;not null;default:0" json:"sort"`
CreatedAt types.Time `json:"created_at"`
}
func (Permission) TableName() string { return "admin_permissions" }
// 权限类型。
const (
PermTypeAPI = "api"
PermTypeMenu = "menu"
)
// UserRole 管理员-角色关联(多对多中间表)。
type UserRole struct {
AdminID uint64 `gorm:"primaryKey;column:admin_id" json:"admin_id"`
RoleID uint64 `gorm:"primaryKey;column:role_id" json:"role_id"`
}
func (UserRole) TableName() string { return "admin_user_roles" }
// RolePermission 角色-权限关联(多对多中间表)。
type RolePermission struct {
RoleID uint64 `gorm:"primaryKey;column:role_id" json:"role_id"`
PermissionID uint64 `gorm:"primaryKey;column:permission_id" json:"permission_id"`
}
func (RolePermission) TableName() string { return "admin_role_permissions" }
// SuperAdminRoleCode 超级管理员角色 code。守卫层对其短路放行,
// 且菜单树返回完整菜单,无需逐条枚举权限分配。
const SuperAdminRoleCode = "super_admin"
// MenuNode 是菜单树节点,用于 /admin/info 返回前端渲染。
type MenuNode struct {
Permission
Children []MenuNode `json:"children,omitempty"`
}