批量更新
This commit is contained in:
+28
-15
@@ -50,33 +50,46 @@ func init() {
|
||||
func GetRoleMenus(roleId int) ([]int, error) {
|
||||
o := orm.NewOrm()
|
||||
var menuIdsJson sql.NullString
|
||||
var menuIdsStr string
|
||||
|
||||
// 方法1: 尝试使用 JSON_UNQUOTE 读取 JSON 字段
|
||||
err := o.Raw("SELECT IFNULL(JSON_UNQUOTE(JSON_EXTRACT(menu_ids, '$')), '[]') FROM yz_roles WHERE role_id = ? AND delete_time IS NULL", roleId).QueryRow(&menuIdsJson)
|
||||
|
||||
// 如果方法1失败或结果为空,尝试方法2: 直接 CAST
|
||||
if err != nil {
|
||||
fmt.Printf("方法1失败,尝试方法2: %v\n", err)
|
||||
err = nil // 重置错误,尝试方法2
|
||||
}
|
||||
|
||||
if err != nil || !menuIdsJson.Valid || menuIdsJson.String == "" || menuIdsJson.String == "[]" {
|
||||
fmt.Printf("方法1结果无效,尝试方法2\n")
|
||||
err2 := o.Raw("SELECT CAST(IFNULL(menu_ids, '[]') AS CHAR) FROM yz_roles WHERE role_id = ? AND delete_time IS NULL", roleId).QueryRow(&menuIdsJson)
|
||||
err := 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 err == nil && menuIdsStr != "" && menuIdsStr != "[]" {
|
||||
menuIdsJson = sql.NullString{String: menuIdsStr, Valid: true}
|
||||
fmt.Printf("GetRoleMenus: 方法1成功,角色 %d 的 menu_ids: %s\n", roleId, menuIdsStr[:min(100, len(menuIdsStr))])
|
||||
} else {
|
||||
// 方法1失败,尝试方法2: 直接 CAST
|
||||
if err != nil {
|
||||
fmt.Printf("GetRoleMenus: 方法1失败 (%v),尝试方法2\n", err)
|
||||
} else {
|
||||
fmt.Printf("GetRoleMenus: 方法1结果为空,尝试方法2\n")
|
||||
}
|
||||
|
||||
// 重置变量
|
||||
menuIdsStr = ""
|
||||
err2 := o.Raw("SELECT CAST(IFNULL(menu_ids, '[]') AS CHAR) FROM yz_roles WHERE role_id = ? AND delete_time IS NULL", roleId).QueryRow(&menuIdsStr)
|
||||
if err2 != nil {
|
||||
// 如果角色不存在,返回空数组而不是错误(兼容性处理)
|
||||
if err2 == orm.ErrNoRows {
|
||||
fmt.Printf("角色 %d 不存在\n", roleId)
|
||||
fmt.Printf("GetRoleMenus: 角色 %d 不存在\n", roleId)
|
||||
return []int{}, nil
|
||||
}
|
||||
fmt.Printf("读取角色 %d 的 menu_ids 失败: %v\n", roleId, err2)
|
||||
return nil, fmt.Errorf("获取角色菜单失败: %v", err2)
|
||||
fmt.Printf("GetRoleMenus: 方法2也失败,角色 %d 的 menu_ids 读取失败: %v\n", roleId, err2)
|
||||
return []int{}, nil // 返回空数组而不是错误,保持兼容性
|
||||
}
|
||||
|
||||
if menuIdsStr != "" && menuIdsStr != "[]" && menuIdsStr != "null" {
|
||||
menuIdsJson = sql.NullString{String: menuIdsStr, Valid: true}
|
||||
fmt.Printf("GetRoleMenus: 方法2成功,角色 %d 的 menu_ids: %s\n", roleId, menuIdsStr[:min(100, len(menuIdsStr))])
|
||||
} else {
|
||||
fmt.Printf("GetRoleMenus: 方法2结果也为空,角色 %d 的 menu_ids 为空或 null\n", roleId)
|
||||
return []int{}, nil
|
||||
}
|
||||
}
|
||||
|
||||
// 如果 menuIdsJson 无效或为空,返回空数组
|
||||
if !menuIdsJson.Valid || menuIdsJson.String == "" {
|
||||
fmt.Printf("角色 %d 的 menu_ids 为空或无效\n", roleId)
|
||||
fmt.Printf("GetRoleMenus: 角色 %d 的 menu_ids 最终为空或无效\n", roleId)
|
||||
return []int{}, nil
|
||||
}
|
||||
|
||||
|
||||
+76
-12
@@ -14,6 +14,7 @@ import (
|
||||
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"`
|
||||
@@ -90,6 +91,7 @@ func GetRoleById(roleId int) (*Role, error) {
|
||||
type roleResult struct {
|
||||
RoleId int
|
||||
TenantId int
|
||||
Default int8
|
||||
RoleCode string
|
||||
RoleName string
|
||||
Description string
|
||||
@@ -105,8 +107,8 @@ func GetRoleById(roleId int) (*Role, error) {
|
||||
|
||||
var result roleResult
|
||||
// 先读取其他字段(不包括 menu_ids),因为 Beego ORM 可能无法直接读取 JSON 类型
|
||||
err := o.Raw("SELECT role_id, tenant_id, 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.RoleCode, &result.RoleName, &result.Description,
|
||||
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,
|
||||
)
|
||||
@@ -150,6 +152,7 @@ func GetRoleById(roleId int) (*Role, error) {
|
||||
role := &Role{
|
||||
RoleId: result.RoleId,
|
||||
TenantId: result.TenantId,
|
||||
Default: result.Default,
|
||||
RoleCode: result.RoleCode,
|
||||
RoleName: result.RoleName,
|
||||
Description: result.Description,
|
||||
@@ -178,6 +181,7 @@ func GetAllRoles() ([]*Role, error) {
|
||||
var results []struct {
|
||||
RoleId int
|
||||
TenantId int
|
||||
Default int8
|
||||
RoleCode string
|
||||
RoleName string
|
||||
Description string
|
||||
@@ -191,7 +195,7 @@ func GetAllRoles() ([]*Role, error) {
|
||||
UpdateBy string
|
||||
}
|
||||
|
||||
_, err := o.Raw("SELECT role_id, tenant_id, 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").QueryRows(&results)
|
||||
_, 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 delete_time IS NULL ORDER BY sort_order ASC, role_id ASC").QueryRows(&results)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -200,6 +204,7 @@ func GetAllRoles() ([]*Role, error) {
|
||||
role := &Role{
|
||||
RoleId: r.RoleId,
|
||||
TenantId: r.TenantId,
|
||||
Default: r.Default,
|
||||
RoleCode: r.RoleCode,
|
||||
RoleName: r.RoleName,
|
||||
Description: r.Description,
|
||||
@@ -228,6 +233,7 @@ func GetRoleByTenantId(tenantId int) ([]*Role, error) {
|
||||
var results []struct {
|
||||
RoleId int
|
||||
TenantId int
|
||||
Default int8
|
||||
RoleCode string
|
||||
RoleName string
|
||||
Description string
|
||||
@@ -241,7 +247,7 @@ func GetRoleByTenantId(tenantId int) ([]*Role, error) {
|
||||
UpdateBy string
|
||||
}
|
||||
|
||||
_, err := o.Raw("SELECT role_id, tenant_id, 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)
|
||||
_, 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
|
||||
}
|
||||
@@ -250,6 +256,7 @@ func GetRoleByTenantId(tenantId int) ([]*Role, error) {
|
||||
role := &Role{
|
||||
RoleId: r.RoleId,
|
||||
TenantId: r.TenantId,
|
||||
Default: r.Default,
|
||||
RoleCode: r.RoleCode,
|
||||
RoleName: r.RoleName,
|
||||
Description: r.Description,
|
||||
@@ -272,9 +279,31 @@ func GetRoleByTenantId(tenantId int) ([]*Role, error) {
|
||||
// GetRoleByCode 根据角色代码获取角色
|
||||
func GetRoleByCode(roleCode string) (*Role, error) {
|
||||
o := orm.NewOrm()
|
||||
var role Role
|
||||
|
||||
err := o.QueryTable("yz_roles").Filter("role_code", roleCode).Filter("delete_time__isnull", true).One(&role)
|
||||
// 使用Raw查询以正确读取所有字段,包括 default 和 menu_ids
|
||||
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
|
||||
}
|
||||
@@ -283,11 +312,28 @@ func GetRoleByCode(roleCode string) (*Role, error) {
|
||||
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 != "[]" {
|
||||
role.MenuIdsJson = sql.NullString{String: menuIdsStr, Valid: true}
|
||||
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
|
||||
return role, nil
|
||||
}
|
||||
|
||||
// CreateRole 创建角色
|
||||
@@ -296,8 +342,17 @@ func CreateRole(role *Role) error {
|
||||
role.BeforeInsert()
|
||||
|
||||
// 使用Raw插入以正确处理JSON字段,并获取插入后的ID
|
||||
res, err := o.Raw("INSERT INTO yz_roles (tenant_id, 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, role.RoleCode, role.RoleName, role.Description, role.MenuIdsJson.String, role.Status, role.SortOrder, role.CreateBy, role.UpdateBy).Exec()
|
||||
// 如果没有设置 default 值,根据 tenant_id 自动设置:tenant_id=0 时 default=2,否则 default=3
|
||||
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
|
||||
}
|
||||
@@ -324,8 +379,17 @@ func UpdateRole(role *Role) error {
|
||||
role.BeforeUpdate()
|
||||
|
||||
// 使用Raw更新以正确处理JSON字段
|
||||
_, err := o.Raw("UPDATE yz_roles SET tenant_id = ?, 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, role.RoleCode, role.RoleName, role.Description, role.MenuIdsJson.String, role.Status, role.SortOrder, role.UpdateBy, role.RoleId).Exec()
|
||||
// 如果没有设置 default 值,根据 tenant_id 自动设置:tenant_id=0 时 default=2,否则 default=3
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user