优化系统
This commit is contained in:
@@ -15,11 +15,12 @@ type Claims struct {
|
||||
UserID int `json:"user_id"`
|
||||
Username string `json:"username"`
|
||||
TenantId int `json:"tenant_id"` // 租户ID
|
||||
UserType string `json:"user_type"` // 用户类型:"user" 或 "employee"
|
||||
jwt.RegisteredClaims
|
||||
}
|
||||
|
||||
// GenerateToken 生成JWT token
|
||||
func GenerateToken(userID int, username string, tenantId int) (string, error) {
|
||||
func GenerateToken(userID int, username string, tenantId int, userType string) (string, error) {
|
||||
// 设置token过期时间
|
||||
expirationTime := time.Now().Add(24 * time.Hour) // 24小时后过期
|
||||
|
||||
@@ -28,6 +29,7 @@ func GenerateToken(userID int, username string, tenantId int) (string, error) {
|
||||
UserID: userID,
|
||||
Username: username,
|
||||
TenantId: tenantId,
|
||||
UserType: userType,
|
||||
RegisteredClaims: jwt.RegisteredClaims{
|
||||
ExpiresAt: jwt.NewNumericDate(expirationTime),
|
||||
IssuedAt: jwt.NewNumericDate(time.Now()),
|
||||
|
||||
+113
-8
@@ -90,7 +90,7 @@ func GetKnowledgeById(id int, tenantId int) (*Knowledge, error) {
|
||||
WHERE k.knowledge_id = ? AND k.delete_time IS NULL
|
||||
`
|
||||
params := []interface{}{id}
|
||||
|
||||
|
||||
// 如果tenantId > 0,添加租户过滤
|
||||
if tenantId > 0 {
|
||||
querySQL += " AND k.tenant_id = ?"
|
||||
@@ -180,7 +180,7 @@ func GetAllKnowledge(page, pageSize int, status int8, categoryId int, share int8
|
||||
|
||||
whereSQL := "delete_time IS NULL"
|
||||
params := []interface{}{}
|
||||
|
||||
|
||||
// 如果tenantId > 0,添加租户过滤
|
||||
if tenantId > 0 {
|
||||
whereSQL += " AND k.tenant_id = ?"
|
||||
@@ -232,6 +232,111 @@ func GetAllKnowledge(page, pageSize int, status int8, categoryId int, share int8
|
||||
return knowledges, total, nil
|
||||
}
|
||||
|
||||
// GetKnowledgeCount 获取知识库数量(按租户)
|
||||
func GetKnowledgeCount(tenantId int) (int64, error) {
|
||||
o := orm.NewOrm()
|
||||
whereSQL := "delete_time IS NULL"
|
||||
params := []interface{}{}
|
||||
|
||||
// 如果tenantId > 0,添加租户过滤
|
||||
if tenantId > 0 {
|
||||
whereSQL += " AND tenant_id = ?"
|
||||
params = append(params, tenantId)
|
||||
}
|
||||
|
||||
var count int64
|
||||
err := o.Raw("SELECT COUNT(*) FROM yz_knowledge WHERE "+whereSQL, params...).QueryRow(&count)
|
||||
return count, err
|
||||
}
|
||||
|
||||
// GetKnowledgeCountWithGrowth 获取知识库总数量及增长率(按租户)
|
||||
// 返回:总数量、本月新增数量、上个月新增数量、增长率
|
||||
func GetKnowledgeCountWithGrowth(tenantId int) (int64, int64, int64, float64, error) {
|
||||
o := orm.NewOrm()
|
||||
|
||||
// 获取当前月份的开始和结束时间
|
||||
now := time.Now()
|
||||
currentYear := now.Year()
|
||||
currentMonth := int(now.Month())
|
||||
|
||||
// 当前月的开始时间
|
||||
currentMonthStart := time.Date(currentYear, time.Month(currentMonth), 1, 0, 0, 0, 0, time.Local)
|
||||
// 当前月的结束时间(下个月的第一天)
|
||||
nextMonth := currentMonth + 1
|
||||
nextYear := currentYear
|
||||
if nextMonth > 12 {
|
||||
nextMonth = 1
|
||||
nextYear++
|
||||
}
|
||||
currentMonthEnd := time.Date(nextYear, time.Month(nextMonth), 1, 0, 0, 0, 0, time.Local)
|
||||
|
||||
// 上个月的时间范围
|
||||
lastMonth := currentMonth - 1
|
||||
lastYear := currentYear
|
||||
if lastMonth < 1 {
|
||||
lastMonth = 12
|
||||
lastYear--
|
||||
}
|
||||
lastMonthStart := time.Date(lastYear, time.Month(lastMonth), 1, 0, 0, 0, 0, time.Local)
|
||||
lastMonthEnd := currentMonthStart
|
||||
|
||||
// 构建查询条件
|
||||
baseWhere := "delete_time IS NULL"
|
||||
tenantFilter := ""
|
||||
params := []interface{}{}
|
||||
|
||||
if tenantId > 0 {
|
||||
tenantFilter = " AND tenant_id = ?"
|
||||
params = append(params, tenantId)
|
||||
}
|
||||
|
||||
// 查询总数量(所有未删除的知识库)
|
||||
totalWhere := baseWhere + tenantFilter
|
||||
var totalCount int64
|
||||
totalParams := params
|
||||
if len(totalParams) == 0 {
|
||||
err := o.Raw("SELECT COUNT(*) FROM yz_knowledge WHERE " + totalWhere).QueryRow(&totalCount)
|
||||
if err != nil {
|
||||
return 0, 0, 0, 0, err
|
||||
}
|
||||
} else {
|
||||
err := o.Raw("SELECT COUNT(*) FROM yz_knowledge WHERE "+totalWhere, totalParams...).QueryRow(&totalCount)
|
||||
if err != nil {
|
||||
return 0, 0, 0, 0, err
|
||||
}
|
||||
}
|
||||
|
||||
// 查询本月新增数量(创建时间在当月范围内的)
|
||||
currentWhere := baseWhere + " AND create_time >= ? AND create_time < ?" + tenantFilter
|
||||
currentParams := append([]interface{}{currentMonthStart, currentMonthEnd}, params...)
|
||||
|
||||
var currentMonthCount int64
|
||||
err := o.Raw("SELECT COUNT(*) FROM yz_knowledge WHERE "+currentWhere, currentParams...).QueryRow(¤tMonthCount)
|
||||
if err != nil {
|
||||
return 0, 0, 0, 0, err
|
||||
}
|
||||
|
||||
// 查询上个月新增数量
|
||||
lastWhere := baseWhere + " AND create_time >= ? AND create_time < ?" + tenantFilter
|
||||
lastParams := append([]interface{}{lastMonthStart, lastMonthEnd}, params...)
|
||||
|
||||
var lastMonthCount int64
|
||||
err = o.Raw("SELECT COUNT(*) FROM yz_knowledge WHERE "+lastWhere, lastParams...).QueryRow(&lastMonthCount)
|
||||
if err != nil {
|
||||
return 0, 0, 0, 0, err
|
||||
}
|
||||
|
||||
// 计算增长率(本月新增相比上个月新增的增长率)
|
||||
var growthRate float64
|
||||
if lastMonthCount > 0 {
|
||||
growthRate = float64(currentMonthCount-lastMonthCount) / float64(lastMonthCount) * 100
|
||||
} else if currentMonthCount > 0 {
|
||||
growthRate = 100.0 // 上个月为0,这个月有数据,增长100%
|
||||
}
|
||||
|
||||
return totalCount, currentMonthCount, lastMonthCount, growthRate, nil
|
||||
}
|
||||
|
||||
// UpdateKnowledge 更新知识
|
||||
func UpdateKnowledge(id int, k *Knowledge, tenantId int) error {
|
||||
o := orm.NewOrm()
|
||||
@@ -240,7 +345,7 @@ func UpdateKnowledge(id int, k *Knowledge, tenantId int) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
// 如果tenantId > 0,验证租户ID是否匹配
|
||||
if tenantId > 0 && knowledge.TenantId != tenantId {
|
||||
return orm.ErrNoRows // 返回无记录错误,表示该知识不属于当前租户
|
||||
@@ -272,7 +377,7 @@ func DeleteKnowledge(id int, deleteBy string, tenantId int) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
// 如果tenantId > 0,验证租户ID是否匹配
|
||||
if tenantId > 0 && knowledge.TenantId != tenantId {
|
||||
return orm.ErrNoRows // 返回无记录错误,表示该知识不属于当前租户
|
||||
@@ -287,12 +392,12 @@ func DeleteKnowledge(id int, deleteBy string, tenantId int) error {
|
||||
func GetAllCategories(tenantId int) ([]*KnowledgeCategory, error) {
|
||||
o := orm.NewOrm()
|
||||
qs := o.QueryTable("yz_knowledge_category")
|
||||
|
||||
|
||||
// 如果tenantId > 0,添加租户过滤
|
||||
if tenantId > 0 {
|
||||
qs = qs.Filter("tenant_id", tenantId)
|
||||
}
|
||||
|
||||
|
||||
var categories []*KnowledgeCategory
|
||||
_, err := qs.OrderBy("sort_order").All(&categories)
|
||||
return categories, err
|
||||
@@ -310,12 +415,12 @@ func GetCategoryById(id int) (*KnowledgeCategory, error) {
|
||||
func GetAllTags(tenantId int) ([]*KnowledgeTag, error) {
|
||||
o := orm.NewOrm()
|
||||
qs := o.QueryTable("yz_knowledge_tags")
|
||||
|
||||
|
||||
// 如果tenantId > 0,添加租户过滤
|
||||
if tenantId > 0 {
|
||||
qs = qs.Filter("tenant_id", tenantId)
|
||||
}
|
||||
|
||||
|
||||
var tags []*KnowledgeTag
|
||||
_, err := qs.All(&tags)
|
||||
return tags, err
|
||||
|
||||
+221
-4
@@ -40,6 +40,7 @@ type MenuPermission struct {
|
||||
MenuType int `json:"menu_type"` // 1: 页面菜单, 2: API接口
|
||||
Permission string `json:"permission"` // 权限标识
|
||||
ParentId int `json:"parent_id"`
|
||||
Default int8 `json:"default"` // 默认可见性:0-全局,1-平台用户,2-租户用户
|
||||
}
|
||||
|
||||
func init() {
|
||||
@@ -64,7 +65,7 @@ func GetRoleMenus(roleId int) ([]int, error) {
|
||||
} 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)
|
||||
@@ -77,7 +78,7 @@ func GetRoleMenus(roleId int) ([]int, error) {
|
||||
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))])
|
||||
@@ -193,16 +194,232 @@ func GetRolePermissions(roleId int) (*RolePermission, error) {
|
||||
// 获取所有菜单权限列表(用于分配权限时展示,未删除的)
|
||||
func GetAllMenuPermissions() ([]*MenuPermission, error) {
|
||||
o := orm.NewOrm()
|
||||
var menus []*MenuPermission
|
||||
|
||||
_, err := o.Raw("SELECT id as menu_id, name as menu_name, path, menu_type, permission, parent_id FROM yz_menus WHERE delete_time IS NULL ORDER BY parent_id, `order`").QueryRows(&menus)
|
||||
// 查询菜单(菜单表没有default字段,直接使用0作为默认值)
|
||||
var resultsWithoutDefault []struct {
|
||||
MenuId int
|
||||
MenuName string
|
||||
Path string
|
||||
MenuType int
|
||||
Permission sql.NullString
|
||||
ParentId int
|
||||
}
|
||||
_, err := o.Raw("SELECT id as menu_id, name as menu_name, path, menu_type, permission, parent_id FROM yz_menus WHERE delete_time IS NULL ORDER BY parent_id, `order`").QueryRows(&resultsWithoutDefault)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("获取菜单列表失败: %v", err)
|
||||
}
|
||||
|
||||
// 转换为MenuPermission结构,default字段设为0(全局可见)
|
||||
menus := make([]*MenuPermission, 0, len(resultsWithoutDefault))
|
||||
for _, r := range resultsWithoutDefault {
|
||||
menu := &MenuPermission{
|
||||
MenuId: r.MenuId,
|
||||
MenuName: r.MenuName,
|
||||
Path: r.Path,
|
||||
MenuType: r.MenuType,
|
||||
ParentId: r.ParentId,
|
||||
Default: 0, // 默认值为0(全局可见),因为菜单表没有default字段
|
||||
}
|
||||
if r.Permission.Valid {
|
||||
menu.Permission = r.Permission.String
|
||||
} else {
|
||||
menu.Permission = ""
|
||||
}
|
||||
menus = append(menus, menu)
|
||||
}
|
||||
|
||||
return menus, nil
|
||||
}
|
||||
|
||||
// GetAllMenuPermissionsForUser 根据当前登录用户的权限获取可分配的菜单列表
|
||||
// userType: "user" 表示平台用户(可以看到所有菜单),"employee" 表示租户员工
|
||||
// roleId: 可选的角色ID,如果提供则根据该角色的default值过滤菜单
|
||||
// 设计说明:
|
||||
// - 平台用户:可以看到所有菜单,可以给任何角色分配任何菜单
|
||||
// - 租户员工:在权限分配界面(提供roleId时)只能看到平台管理员已经分配给自己的菜单(包括父菜单)
|
||||
// - 租户员工:在菜单显示时(不提供roleId时)只看到自己有权限的菜单
|
||||
func GetAllMenuPermissionsForUser(userId int, userType string, roleId int) ([]*MenuPermission, error) {
|
||||
o := orm.NewOrm()
|
||||
|
||||
// 如果提供了roleId,获取角色的default值用于过滤菜单
|
||||
var roleDefault int8 = 0 // 0表示全局,不进行过滤
|
||||
if roleId > 0 {
|
||||
role, err := GetRoleById(roleId)
|
||||
if err == nil && role != nil {
|
||||
roleDefault = role.Default
|
||||
}
|
||||
}
|
||||
|
||||
// 如果是平台用户,返回所有菜单(根据roleDefault过滤)
|
||||
if userType == "user" {
|
||||
allMenus, err := GetAllMenuPermissions()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 如果roleDefault>0,根据角色的default值过滤菜单
|
||||
if roleDefault > 0 {
|
||||
filteredMenus := make([]*MenuPermission, 0)
|
||||
for _, menu := range allMenus {
|
||||
// 角色default=1(平台用户角色):只能分配default=1或default=0的菜单
|
||||
// 角色default=2(租户用户角色):只能分配default=2或default=0的菜单
|
||||
if menu.Default == 0 || menu.Default == roleDefault {
|
||||
filteredMenus = append(filteredMenus, menu)
|
||||
}
|
||||
}
|
||||
return filteredMenus, nil
|
||||
}
|
||||
|
||||
return allMenus, nil
|
||||
}
|
||||
|
||||
// 如果是租户员工
|
||||
if userType == "employee" {
|
||||
// 获取员工信息
|
||||
var employee Employee
|
||||
err := o.Raw("SELECT * FROM yz_tenant_employees WHERE id = ? AND delete_time IS NULL", userId).QueryRow(&employee)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("员工不存在: %v", err)
|
||||
}
|
||||
|
||||
// 如果员工没有角色,返回空列表
|
||||
if employee.Role == 0 {
|
||||
return []*MenuPermission{}, nil
|
||||
}
|
||||
|
||||
// 获取员工角色的菜单ID列表(这是平台管理员分配给该员工的菜单)
|
||||
menuIds, err := GetRoleMenus(employee.Role)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("获取角色菜单失败: %v", err)
|
||||
}
|
||||
|
||||
// 如果没有权限,返回空列表
|
||||
if len(menuIds) == 0 {
|
||||
return []*MenuPermission{}, nil
|
||||
}
|
||||
|
||||
// 如果提供了roleId(权限分配界面),需要包含父菜单
|
||||
// 如果没有提供roleId(菜单显示),也需要包含父菜单(但这里已经在GetTenantMenus中处理了)
|
||||
// 为了性能优化,一次性查询所有菜单的父子关系
|
||||
type menuParent struct {
|
||||
Id int
|
||||
ParentId int
|
||||
}
|
||||
var allMenuParents []menuParent
|
||||
_, err = o.Raw("SELECT id, parent_id FROM yz_menus WHERE delete_time IS NULL").QueryRows(&allMenuParents)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("获取菜单父子关系失败: %v", err)
|
||||
}
|
||||
|
||||
// 构建菜单ID到父菜单ID的映射
|
||||
menuParentMap := make(map[int]int)
|
||||
for _, mp := range allMenuParents {
|
||||
menuParentMap[mp.Id] = mp.ParentId
|
||||
}
|
||||
|
||||
// 递归查找所有父菜单ID(使用内存中的映射,避免数据库查询)
|
||||
parentIds := make(map[int]bool)
|
||||
var findParents func(pid int)
|
||||
findParents = func(pid int) {
|
||||
if pid == 0 || parentIds[pid] {
|
||||
return
|
||||
}
|
||||
parentIds[pid] = true
|
||||
if parentId, exists := menuParentMap[pid]; exists && parentId > 0 {
|
||||
findParents(parentId)
|
||||
}
|
||||
}
|
||||
|
||||
// 为每个菜单查找其父菜单
|
||||
for _, menuId := range menuIds {
|
||||
if parentId, exists := menuParentMap[menuId]; exists && parentId > 0 {
|
||||
findParents(parentId)
|
||||
}
|
||||
}
|
||||
|
||||
// 合并原始菜单ID和父菜单ID
|
||||
allMenuIds := make(map[int]bool)
|
||||
for _, id := range menuIds {
|
||||
allMenuIds[id] = true
|
||||
}
|
||||
for pid := range parentIds {
|
||||
allMenuIds[pid] = true
|
||||
}
|
||||
|
||||
// 构建IN查询的占位符和参数
|
||||
finalMenuIds := make([]int, 0, len(allMenuIds))
|
||||
for id := range allMenuIds {
|
||||
finalMenuIds = append(finalMenuIds, id)
|
||||
}
|
||||
|
||||
placeholders := make([]string, len(finalMenuIds))
|
||||
args := make([]interface{}, len(finalMenuIds))
|
||||
for i, id := range finalMenuIds {
|
||||
placeholders[i] = "?"
|
||||
args[i] = id
|
||||
}
|
||||
|
||||
// 查询菜单(包括父菜单)
|
||||
type menuResult struct {
|
||||
MenuId int
|
||||
MenuName string
|
||||
Path string
|
||||
MenuType int
|
||||
Permission sql.NullString
|
||||
ParentId int
|
||||
}
|
||||
|
||||
var results []menuResult
|
||||
query := fmt.Sprintf("SELECT id as menu_id, name as menu_name, path, menu_type, permission, parent_id FROM yz_menus WHERE id IN (%s) AND delete_time IS NULL ORDER BY parent_id, `order`", strings.Join(placeholders, ","))
|
||||
_, err = o.Raw(query, args...).QueryRows(&results)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("获取菜单列表失败: %v", err)
|
||||
}
|
||||
|
||||
// 转换为MenuPermission结构
|
||||
menus := make([]*MenuPermission, 0, len(results))
|
||||
for _, r := range results {
|
||||
menu := &MenuPermission{
|
||||
MenuId: r.MenuId,
|
||||
MenuName: r.MenuName,
|
||||
Path: r.Path,
|
||||
MenuType: r.MenuType,
|
||||
ParentId: r.ParentId,
|
||||
Default: 0, // 默认值为0(全局可见),因为菜单表没有default字段
|
||||
}
|
||||
|
||||
// 处理permission字段
|
||||
if r.Permission.Valid {
|
||||
menu.Permission = r.Permission.String
|
||||
} else {
|
||||
menu.Permission = ""
|
||||
}
|
||||
|
||||
menus = append(menus, menu)
|
||||
}
|
||||
|
||||
// 如果roleDefault>0,根据角色的default值进一步过滤菜单
|
||||
// 但由于菜单表没有default字段,所有菜单都是default=0,所以这里实际上不会过滤
|
||||
if roleDefault > 0 {
|
||||
filteredMenus := make([]*MenuPermission, 0)
|
||||
for _, menu := range menus {
|
||||
// 角色default=1(平台用户角色):只能分配default=1或default=0的菜单
|
||||
// 角色default=2(租户用户角色):只能分配default=2或default=0的菜单
|
||||
// 由于菜单表没有default字段,所有菜单都是default=0,所以所有菜单都可以分配
|
||||
if menu.Default == 0 || menu.Default == roleDefault {
|
||||
filteredMenus = append(filteredMenus, menu)
|
||||
}
|
||||
}
|
||||
return filteredMenus, nil
|
||||
}
|
||||
|
||||
return menus, nil
|
||||
}
|
||||
|
||||
// 未知的用户类型,返回空列表
|
||||
return []*MenuPermission{}, nil
|
||||
}
|
||||
|
||||
// 为角色分配权限(菜单)- 更新JSON字段
|
||||
func AssignRolePermissions(roleId int, menuIds []int, createBy string) error {
|
||||
o := orm.NewOrm()
|
||||
|
||||
+30
-2
@@ -173,7 +173,9 @@ func GetRoleById(roleId int) (*Role, error) {
|
||||
}
|
||||
|
||||
// GetAllRoles 获取所有角色(未删除的)
|
||||
func GetAllRoles() ([]*Role, error) {
|
||||
// tenantId: 租户ID,0表示所有租户
|
||||
// userType: 用户类型,"user"表示平台用户,"employee"表示租户员工
|
||||
func GetAllRoles(tenantId int, userType string) ([]*Role, error) {
|
||||
o := orm.NewOrm()
|
||||
var roles []*Role
|
||||
|
||||
@@ -195,7 +197,33 @@ func GetAllRoles() ([]*Role, error) {
|
||||
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 delete_time IS NULL ORDER BY sort_order ASC, role_id ASC").QueryRows(&results)
|
||||
// 构建查询条件
|
||||
var query string
|
||||
var args []interface{}
|
||||
|
||||
// 如果是平台用户(user),可以看到所有角色
|
||||
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 {
|
||||
// 如果是租户员工(employee),根据 tenant_id 和 default 过滤
|
||||
// 规则:
|
||||
// 1. default=0: 全局角色,所有租户可见
|
||||
// 2. default=1: 平台用户角色,租户员工不可见
|
||||
// 3. default=2: 租户用户角色,只有对应租户可见
|
||||
// 4. tenant_id=0: 全局角色
|
||||
// 5. tenant_id=当前租户ID: 当前租户的角色
|
||||
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 {
|
||||
// tenantId=0,只返回全局角色(default=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 ORDER BY sort_order ASC, role_id ASC"
|
||||
args = []interface{}{}
|
||||
}
|
||||
}
|
||||
|
||||
_, err := o.Raw(query, args...).QueryRows(&results)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user