yunzer_go/server/models/role.go
2025-11-07 15:12:09 +08:00

375 lines
12 KiB
Go

package models
import (
"database/sql"
"encoding/json"
"strings"
"time"
"github.com/beego/beego/v2/client/orm"
)
// Role 角色
type Role struct {
RoleId int `orm:"pk;auto;column(role_id)" json:"roleId"`
TenantId int `orm:"column(tenant_id)" json:"tenantId"`
Default int8 `orm:"column(default);default(2)" json:"default"` // 1-租户1, 2-所有租户, 3-租户专属
RoleCode string `orm:"size(50);unique" json:"roleCode"`
RoleName string `orm:"size(100)" json:"roleName"`
Description string `orm:"type(text);null" json:"description"`
MenuIds []int `orm:"-" json:"menuIds"` // 前端菜单ID
MenuIdsJson sql.NullString `orm:"column(menu_ids);type(json);null" json:"-"` // 库JSON字段
Status int8 `orm:"default(1)" json:"status"` // 1启用 0禁用
SortOrder int `orm:"default(0)" json:"sortOrder"` // 排序
CreateTime time.Time `orm:"auto_now_add;type(datetime)" json:"createTime"`
UpdateTime time.Time `orm:"auto_now;type(datetime)" json:"updateTime"`
DeleteTime *time.Time `orm:"null;type(datetime)" json:"deleteTime"`
CreateBy string `orm:"size(50);null" json:"createBy"`
UpdateBy string `orm:"size(50);null" json:"updateBy"`
}
// AfterRead 解析MenuIdsJson
func (r *Role) AfterRead() {
if r.MenuIdsJson.Valid && r.MenuIdsJson.String != "" && r.MenuIdsJson.String != "[]" {
jsonStr := strings.TrimSpace(r.MenuIdsJson.String)
jsonStr = strings.ReplaceAll(jsonStr, "\n", "")
jsonStr = strings.ReplaceAll(jsonStr, "\r", "")
err := json.Unmarshal([]byte(jsonStr), &r.MenuIds)
if err != nil {
r.MenuIds = []int{}
}
} else {
r.MenuIds = []int{}
}
}
// BeforeInsert 序列化MenuIds到MenuIdsJson
func (r *Role) BeforeInsert() {
if len(r.MenuIds) > 0 {
jsonData, _ := json.Marshal(r.MenuIds)
r.MenuIdsJson = sql.NullString{String: string(jsonData), Valid: true}
} else {
r.MenuIdsJson = sql.NullString{String: "[]", Valid: true}
}
}
// BeforeUpdate 序列化MenuIds到MenuIdsJson
func (r *Role) BeforeUpdate() {
if len(r.MenuIds) > 0 {
jsonData, _ := json.Marshal(r.MenuIds)
r.MenuIdsJson = sql.NullString{String: string(jsonData), Valid: true}
} else {
r.MenuIdsJson = sql.NullString{String: "[]", Valid: true}
}
}
func (r *Role) TableName() string {
return "yz_roles"
}
func init() {
orm.RegisterModel(new(Role))
}
// GetRoleById 按ID获取角色
func GetRoleById(roleId int) (*Role, error) {
o := orm.NewOrm()
type roleResult struct {
RoleId int
TenantId int
Default int8
RoleCode string
RoleName string
Description string
MenuIdsJson sql.NullString
Status int8
SortOrder int
CreateTime time.Time
UpdateTime time.Time
DeleteTime *time.Time
CreateBy string
UpdateBy string
}
var result roleResult
err := o.Raw("SELECT role_id, tenant_id, `default`, role_code, role_name, description, status, sort_order, create_time, update_time, delete_time, create_by, update_by FROM yz_roles WHERE role_id = ? AND delete_time IS NULL", roleId).QueryRow(
&result.RoleId, &result.TenantId, &result.Default, &result.RoleCode, &result.RoleName, &result.Description,
&result.Status, &result.SortOrder, &result.CreateTime, &result.UpdateTime,
&result.DeleteTime, &result.CreateBy, &result.UpdateBy,
)
if err != nil {
return nil, err
}
var menuIdsStr string
err2 := o.Raw("SELECT IFNULL(JSON_UNQUOTE(JSON_EXTRACT(menu_ids, '$')), '[]') FROM yz_roles WHERE role_id = ? AND delete_time IS NULL", roleId).QueryRow(&menuIdsStr)
if err2 != nil {
err3 := o.Raw("SELECT CAST(IFNULL(menu_ids, '[]') AS CHAR) FROM yz_roles WHERE role_id = ? AND delete_time IS NULL", roleId).QueryRow(&menuIdsStr)
if err3 != nil {
menuIdsStr = "[]"
}
}
if menuIdsStr != "" && menuIdsStr != "[]" && menuIdsStr != "null" {
result.MenuIdsJson = sql.NullString{String: menuIdsStr, Valid: true}
} else {
result.MenuIdsJson = sql.NullString{String: "[]", Valid: true}
}
if result.DeleteTime != nil {
return nil, orm.ErrNoRows
}
role := &Role{
RoleId: result.RoleId,
TenantId: result.TenantId,
Default: result.Default,
RoleCode: result.RoleCode,
RoleName: result.RoleName,
Description: result.Description,
MenuIdsJson: result.MenuIdsJson,
Status: result.Status,
SortOrder: result.SortOrder,
CreateTime: result.CreateTime,
UpdateTime: result.UpdateTime,
DeleteTime: result.DeleteTime,
CreateBy: result.CreateBy,
UpdateBy: result.UpdateBy,
}
role.AfterRead()
return role, nil
}
// GetAllRoles 获取所有角色
func GetAllRoles(tenantId int, userType string) ([]*Role, error) {
o := orm.NewOrm()
var roles []*Role
var results []struct {
RoleId int
TenantId int
Default int8
RoleCode string
RoleName string
Description string
MenuIdsJson sql.NullString
Status int8
SortOrder int
CreateTime time.Time
UpdateTime time.Time
DeleteTime *time.Time
CreateBy string
UpdateBy string
}
var query string
var args []interface{}
if userType == "user" {
query = "SELECT role_id, tenant_id, `default`, role_code, role_name, description, CAST(IFNULL(menu_ids, '[]') AS CHAR) as menu_ids, status, sort_order, create_time, update_time, delete_time, create_by, update_by FROM yz_roles WHERE delete_time IS NULL ORDER BY sort_order ASC, role_id ASC"
args = []interface{}{}
} else {
if tenantId > 0 {
query = "SELECT role_id, tenant_id, `default`, role_code, role_name, description, CAST(IFNULL(menu_ids, '[]') AS CHAR) as menu_ids, status, sort_order, create_time, update_time, delete_time, create_by, update_by FROM yz_roles WHERE delete_time IS NULL AND ((`default` = 0) OR (`default` = 2 AND (tenant_id = ? OR tenant_id = 0))) ORDER BY sort_order ASC, role_id ASC"
args = []interface{}{tenantId}
} else {
query = "SELECT role_id, tenant_id, `default`, role_code, role_name, description, CAST(IFNULL(menu_ids, '[]') AS CHAR) as menu_ids, status, sort_order, create_time, update_time, delete_time, create_by, update_by FROM yz_roles WHERE delete_time IS NULL AND `default` = 0 ORDER BY sort_order ASC, role_id ASC"
args = []interface{}{}
}
}
_, err := o.Raw(query, args...).QueryRows(&results)
if err != nil {
return nil, err
}
for _, r := range results {
role := &Role{
RoleId: r.RoleId,
TenantId: r.TenantId,
Default: r.Default,
RoleCode: r.RoleCode,
RoleName: r.RoleName,
Description: r.Description,
MenuIdsJson: r.MenuIdsJson,
Status: r.Status,
SortOrder: r.SortOrder,
CreateTime: r.CreateTime,
UpdateTime: r.UpdateTime,
DeleteTime: r.DeleteTime,
CreateBy: r.CreateBy,
UpdateBy: r.UpdateBy,
}
role.AfterRead()
roles = append(roles, role)
}
return roles, nil
}
// GetRoleByTenantId 按租户ID获取角色
func GetRoleByTenantId(tenantId int) ([]*Role, error) {
o := orm.NewOrm()
var roles []*Role
var results []struct {
RoleId int
TenantId int
Default int8
RoleCode string
RoleName string
Description string
MenuIdsJson sql.NullString
Status int8
SortOrder int
CreateTime time.Time
UpdateTime time.Time
DeleteTime *time.Time
CreateBy string
UpdateBy string
}
_, err := o.Raw("SELECT role_id, tenant_id, `default`, role_code, role_name, description, CAST(IFNULL(menu_ids, '[]') AS CHAR) as menu_ids, status, sort_order, create_time, update_time, delete_time, create_by, update_by FROM yz_roles WHERE (tenant_id = ? OR tenant_id = 0) AND delete_time IS NULL ORDER BY sort_order ASC, role_id ASC", tenantId).QueryRows(&results)
if err != nil {
return nil, err
}
for _, r := range results {
role := &Role{
RoleId: r.RoleId,
TenantId: r.TenantId,
Default: r.Default,
RoleCode: r.RoleCode,
RoleName: r.RoleName,
Description: r.Description,
MenuIdsJson: r.MenuIdsJson,
Status: r.Status,
SortOrder: r.SortOrder,
CreateTime: r.CreateTime,
UpdateTime: r.UpdateTime,
DeleteTime: r.DeleteTime,
CreateBy: r.CreateBy,
UpdateBy: r.UpdateBy,
}
role.AfterRead()
roles = append(roles, role)
}
return roles, nil
}
// GetRoleByCode 按角色代码获取角色
func GetRoleByCode(roleCode string) (*Role, error) {
o := orm.NewOrm()
type roleResult struct {
RoleId int
TenantId int
Default int8
RoleCode string
RoleName string
Description string
MenuIdsJson sql.NullString
Status int8
SortOrder int
CreateTime time.Time
UpdateTime time.Time
DeleteTime *time.Time
CreateBy string
UpdateBy string
}
var result roleResult
err := o.Raw("SELECT role_id, tenant_id, `default`, role_code, role_name, description, status, sort_order, create_time, update_time, delete_time, create_by, update_by FROM yz_roles WHERE role_code = ? AND delete_time IS NULL", roleCode).QueryRow(
&result.RoleId, &result.TenantId, &result.Default, &result.RoleCode, &result.RoleName, &result.Description,
&result.Status, &result.SortOrder, &result.CreateTime, &result.UpdateTime,
&result.DeleteTime, &result.CreateBy, &result.UpdateBy,
)
if err != nil {
return nil, err
}
var menuIdsStr string
err2 := o.Raw("SELECT IFNULL(JSON_UNQUOTE(JSON_EXTRACT(menu_ids, '$')), '[]') FROM yz_roles WHERE role_code = ? AND delete_time IS NULL", roleCode).QueryRow(&menuIdsStr)
if err2 == nil && menuIdsStr != "" && menuIdsStr != "[]" {
result.MenuIdsJson = sql.NullString{String: menuIdsStr, Valid: true}
}
role := &Role{
RoleId: result.RoleId,
TenantId: result.TenantId,
Default: result.Default,
RoleCode: result.RoleCode,
RoleName: result.RoleName,
Description: result.Description,
MenuIdsJson: result.MenuIdsJson,
Status: result.Status,
SortOrder: result.SortOrder,
CreateTime: result.CreateTime,
UpdateTime: result.UpdateTime,
DeleteTime: result.DeleteTime,
CreateBy: result.CreateBy,
UpdateBy: result.UpdateBy,
}
role.AfterRead()
return role, nil
}
// CreateRole 创建角色
func CreateRole(role *Role) error {
o := orm.NewOrm()
role.BeforeInsert()
// 自动处理default
defaultValue := role.Default
if defaultValue == 0 {
if role.TenantId == 0 {
defaultValue = 2
} else {
defaultValue = 3
}
}
res, err := o.Raw("INSERT INTO yz_roles (tenant_id, `default`, role_code, role_name, description, menu_ids, status, sort_order, create_time, update_time, create_by, update_by) VALUES (?, ?, ?, ?, ?, CAST(? AS JSON), ?, ?, NOW(), NOW(), ?, ?)",
role.TenantId, defaultValue, role.RoleCode, role.RoleName, role.Description, role.MenuIdsJson.String, role.Status, role.SortOrder, role.CreateBy, role.UpdateBy).Exec()
if err != nil {
return err
}
lastInsertId, err := res.LastInsertId()
if err != nil {
createdRole, queryErr := GetRoleByCode(role.RoleCode)
if queryErr == nil && createdRole != nil {
role.RoleId = createdRole.RoleId
}
return nil
}
role.RoleId = int(lastInsertId)
return nil
}
// UpdateRole 更新角色
func UpdateRole(role *Role) error {
o := orm.NewOrm()
role.BeforeUpdate()
// 自动处理default
defaultValue := role.Default
if defaultValue == 0 {
if role.TenantId == 0 {
defaultValue = 2
} else {
defaultValue = 3
}
}
_, err := o.Raw("UPDATE yz_roles SET tenant_id = ?, `default` = ?, role_code = ?, role_name = ?, description = ?, menu_ids = CAST(? AS JSON), status = ?, sort_order = ?, update_time = NOW(), update_by = ? WHERE role_id = ? AND delete_time IS NULL",
role.TenantId, defaultValue, role.RoleCode, role.RoleName, role.Description, role.MenuIdsJson.String, role.Status, role.SortOrder, role.UpdateBy, role.RoleId).Exec()
return err
}
// DeleteRole 软删除角色
func DeleteRole(roleId int, updateBy string) error {
o := orm.NewOrm()
_, err := o.Raw("UPDATE yz_roles SET delete_time = NOW(), update_by = ? WHERE role_id = ? AND delete_time IS NULL", updateBy, roleId).Exec()
return err
}