375 lines
12 KiB
Go
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
|
|
}
|