浏览代码

Merge branch 'master' into feature/gn3.2_send_msg

# Conflicts:
#	utils/constants.go
xyxie 3 天之前
父节点
当前提交
d79ca9f0e5

+ 5 - 1
controllers/base_auth.go

@@ -53,6 +53,7 @@ type BaseAuthController struct {
 	SysUser *system.Admin
 	Session *system.SysSession
 	Lang    string `description:"当前语言类型,中文:zh;英文:en;默认:zh"`
+	GnToken string `description:"国能的token"`
 }
 
 //func (c *BaseAuthController) Prepare() {
@@ -569,7 +570,10 @@ func (c *BaseAuthController) Prepare() {
 
 	//接口权限校验
 	roleId := admin.RoleId
-	list, e := system.GetMenuButtonApisByRoleId(roleId)
+	// 单点登录逻辑
+	token := c.Ctx.GetCookie("token")
+	c.GnToken = token
+	list, e := services.GetMenuList(token, roleId)
 	if e != nil {
 		c.JSON(models.BaseResponse{Ret: 403, Msg: "获取接口权限出错!", ErrMsg: "获取接口权限出错!"}, false, false)
 		c.StopRun()

+ 120 - 0
controllers/data_manage/manual.go

@@ -6,6 +6,7 @@ import (
 	"eta_gn/eta_api/models"
 	"eta_gn/eta_api/models/data_manage"
 	"eta_gn/eta_api/models/system"
+	"eta_gn/eta_api/services"
 	"eta_gn/eta_api/utils"
 	"fmt"
 	"strconv"
@@ -43,6 +44,125 @@ func (this *ManualController) ManualSysUserSearch() {
 	//	return
 	//}
 
+	resp := make([]*data_manage.ManualSysUser, 0)
+	departments, e := system.GetSysDepartmentAll()
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprintf("获取部门失败, %v", e)
+		return
+	}
+	groups, e := system.GetFullGroup()
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprintf("获取分组失败, %v", e)
+		return
+	}
+	users := make([]*system.AdminItem, 0)
+	{
+		var cond string
+		var pars []interface{}
+		if keyWord != "" {
+			cond += ` AND (real_name LIKE ? OR admin_name LIKE ? OR mobile LIKE ? )  `
+			pars = utils.GetLikeKeywordPars(pars, keyWord, 3)
+		}
+		sysUsers, e := system.GetSysUserItems(cond, pars)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = fmt.Sprintf("获取用户失败, %v", e)
+			return
+		}
+		users = sysUsers
+	}
+
+	// 用户map
+	departmentAdmins := make(map[int][]*system.DepartmentUserTree, 0)
+	groupAdmins := make(map[int][]*system.DepartmentUserTree, 0)
+	for _, v := range users {
+		t := new(system.DepartmentUserTree)
+		t.NodeId = v.AdminId
+		t.NodeType = 3
+		t.NodeName = v.RealName
+		t.Children = make([]*system.DepartmentUserTree, 0)
+		if groupAdmins[v.GroupId] == nil {
+			groupAdmins[v.GroupId] = make([]*system.DepartmentUserTree, 0)
+		}
+		groupAdmins[v.GroupId] = append(groupAdmins[v.GroupId], t)
+
+		// 直属于部门
+		if v.GroupId == 0 {
+			if departmentAdmins[v.DepartmentId] == nil {
+				departmentAdmins[v.DepartmentId] = make([]*system.DepartmentUserTree, 0)
+			}
+			departmentAdmins[v.DepartmentId] = append(departmentAdmins[v.DepartmentId], t)
+		}
+	}
+
+	// 构建分组树(以前这里还有个keyword匹配,不知道用作干嘛的,先去掉吧)
+	groupTree := services.BuildGroupTreeV2(groups, groupAdmins)
+
+	// 部门
+	list := make([]*system.DepartmentUserTree, 0)
+	for _, v := range departments {
+		// 关键词查询时不显示空部门
+		if keyWord != "" && groupTree[v.DepartmentId] == nil && departmentAdmins[v.DepartmentId] == nil {
+			continue
+		}
+		t := new(system.DepartmentUserTree)
+		t.NodeId = v.DepartmentId
+		t.NodeType = 1
+		t.NodeName = v.DepartmentName
+		t.Children = make([]*system.DepartmentUserTree, 0)
+		if groupTree[v.DepartmentId] != nil {
+			t.Children = append(t.Children, groupTree[v.DepartmentId]...)
+		}
+		if departmentAdmins[v.DepartmentId] != nil {
+			t.Children = append(t.Children, departmentAdmins[v.DepartmentId]...)
+		}
+		list = append(list, t)
+	}
+	resp = ConvertDepartmentUserTree(list)
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+func ConvertDepartmentUserTree(users []*system.DepartmentUserTree) []*data_manage.ManualSysUser {
+	if users == nil || len(users) == 0 {
+		return nil
+	}
+	result := make([]*data_manage.ManualSysUser, 0, len(users))
+	for _, user := range users {
+		result = append(result, &data_manage.ManualSysUser{
+			ItemId:   user.NodeId,
+			ItemName: user.NodeName,
+			Children: ConvertDepartmentUserTree(user.Children),
+		})
+	}
+	return result
+}
+
+func (this *ManualController) ManualSysUserSearchBak() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.Ret = 408
+		return
+	}
+	keyWord := this.GetString("KeyWord")
+	//list, err := data.GetManualSysUser(keyWord)
+	//if err != nil {
+	//	br.Msg = "获取失败"
+	//	br.ErrMsg = "获取失败,Err:" + err.Error()
+	//	return
+	//}
+
 	resp := make([]*data_manage.ManualSysUser, 0)
 	departments, e := system.GetSysDepartmentAll()
 	if e != nil {

+ 39 - 67
controllers/sys_department.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"eta_gn/eta_api/models"
 	"eta_gn/eta_api/models/system"
+	"eta_gn/eta_api/services"
 	"eta_gn/eta_api/utils"
 	"fmt"
 	"strings"
@@ -208,7 +209,7 @@ func (this *SysDepartmentController) ListDepartment() {
 		return
 	}
 	departmentGroup := make(map[int][]*system.SysGroupList)
-	groupTeam := make(map[int][]*system.SysTeamList)
+	groupTeam := make(map[int][]*system.SysGroupList)
 	for _, v := range groups {
 		if departmentGroup[v.DepartmentId] == nil {
 			departmentGroup[v.DepartmentId] = make([]*system.SysGroupList, 0)
@@ -218,28 +219,33 @@ func (this *SysDepartmentController) ListDepartment() {
 		}
 		if v.ParentId > 0 {
 			if groupTeam[v.ParentId] == nil {
-				groupTeam[v.ParentId] = make([]*system.SysTeamList, 0)
+				groupTeam[v.ParentId] = make([]*system.SysGroupList, 0)
 			}
-			groupTeam[v.ParentId] = append(groupTeam[v.ParentId], &system.SysTeamList{
-				GroupId:    v.GroupId,
-				ParentId:   v.ParentId,
-				GroupName:  v.GroupName,
-				CreateTime: v.CreateTime,
+			groupTeam[v.ParentId] = append(groupTeam[v.ParentId], &system.SysGroupList{
+				GroupId:      v.GroupId,
+				DepartmentId: v.DepartmentId,
+				ParentId:     v.ParentId,
+				GroupName:    v.GroupName,
+				CreateTime:   v.CreateTime,
+				IsGroup:      true,
+				Child:        make([]*system.SysGroupList, 0),
 			})
 		}
 	}
 
 	// 数据重组
-	for _, groups := range departmentGroup {
-		for _, g := range groups {
-			g.IsGroup = true
-			if groupTeam[g.GroupId] != nil {
-				g.Child = groupTeam[g.GroupId]
-			} else {
-				g.Child = make([]*system.SysTeamList, 0)
-			}
-		}
+	for departmentId, groups := range departmentGroup {
+		//for _, g := range groups {
+		//	g.IsGroup = true
+		//	if groupTeam[g.GroupId] != nil {
+		//		g.Child = groupTeam[g.GroupId]
+		//	} else {
+		//		g.Child = make([]*system.SysTeamList, 0)
+		//	}
+		//}
+		departmentGroup[departmentId] = buildTree(groups, groupTeam)
 	}
+
 	for _, v := range departments {
 		v.IsDepartment = true
 		if departmentGroup[v.DepartmentId] != nil {
@@ -280,6 +286,18 @@ func (this *SysDepartmentController) ListDepartment() {
 	br.Data = resp
 }
 
+func buildTree(groups []*system.SysGroupList, groupTeam map[int][]*system.SysGroupList) []*system.SysGroupList {
+	for _, g := range groups {
+		g.IsGroup = true
+		if children, ok := groupTeam[g.GroupId]; ok {
+			g.Child = buildTree(children, groupTeam)
+		} else {
+			g.Child = make([]*system.SysGroupList, 0)
+		}
+	}
+	return groups
+}
+
 // DepartmentUserTree
 // @Title 获取部门及分组用户树
 // @Description 获取部门列表接口
@@ -353,60 +371,14 @@ func (this *SysDepartmentController) DepartmentUserTree() {
 		}
 	}
 
-	// 小组
-	groupTeams := make(map[int][]*system.DepartmentUserTree, 0)
-	for _, v := range groups {
-		if v.ParentId == 0 {
-			continue
-		}
-		// 关键词查询时不显示空组
-		if keywords != "" && groupAdmins[v.GroupId] == nil {
-			continue
-		}
-		t := new(system.DepartmentUserTree)
-		t.NodeId = v.GroupId
-		t.NodeName = v.GroupName
-		t.NodeType = 2
-		t.Children = make([]*system.DepartmentUserTree, 0)
-		t.Children = groupAdmins[v.GroupId]
-		if groupTeams[v.ParentId] == nil {
-			groupTeams[v.ParentId] = make([]*system.DepartmentUserTree, 0)
-		}
-		groupTeams[v.ParentId] = append(groupTeams[v.ParentId], t)
-	}
-
-	// 大组
-	departmentGroups := make(map[int][]*system.DepartmentUserTree, 0)
-	for _, v := range groups {
-		if v.ParentId > 0 {
-			continue
-		}
-		// 关键词查询时不显示空组
-		if keywords != "" && groupAdmins[v.GroupId] == nil && groupTeams[v.GroupId] == nil {
-			continue
-		}
-		t := new(system.DepartmentUserTree)
-		t.NodeId = v.GroupId
-		t.NodeName = v.GroupName
-		t.NodeType = 2
-		t.Children = make([]*system.DepartmentUserTree, 0)
-		if groupTeams[v.GroupId] != nil {
-			t.Children = append(t.Children, groupTeams[v.GroupId]...)
-		}
-		if groupAdmins[v.GroupId] != nil {
-			t.Children = append(t.Children, groupAdmins[v.GroupId]...)
-		}
-		if departmentGroups[v.DepartmentId] == nil {
-			departmentGroups[v.DepartmentId] = make([]*system.DepartmentUserTree, 0)
-		}
-		departmentGroups[v.DepartmentId] = append(departmentGroups[v.DepartmentId], t)
-	}
+	// 构建分组树(以前这里还有个keyword匹配,不知道用作干嘛的,先去掉吧)
+	groupTree := services.BuildGroupTreeV2(groups, groupAdmins)
 
 	// 部门
 	list := make([]*system.DepartmentUserTree, 0)
 	for _, v := range departments {
 		// 关键词查询时不显示空部门
-		if keywords != "" && departmentGroups[v.DepartmentId] == nil && departmentAdmins[v.DepartmentId] == nil {
+		if keywords != "" && groupTree[v.DepartmentId] == nil && departmentAdmins[v.DepartmentId] == nil {
 			continue
 		}
 		t := new(system.DepartmentUserTree)
@@ -414,8 +386,8 @@ func (this *SysDepartmentController) DepartmentUserTree() {
 		t.NodeType = 1
 		t.NodeName = v.DepartmentName
 		t.Children = make([]*system.DepartmentUserTree, 0)
-		if departmentGroups[v.DepartmentId] != nil {
-			t.Children = append(t.Children, departmentGroups[v.DepartmentId]...)
+		if groupTree[v.DepartmentId] != nil {
+			t.Children = append(t.Children, groupTree[v.DepartmentId]...)
 		}
 		if departmentAdmins[v.DepartmentId] != nil {
 			t.Children = append(t.Children, departmentAdmins[v.DepartmentId]...)

+ 2 - 1
controllers/sys_role.go

@@ -619,7 +619,8 @@ func (this *SysRoleController) ButtonList() {
 	}
 
 	roleId := sysUser.RoleId
-	list, e := system.GetMenuButtonsByRoleId(roleId)
+	//list, e := system.GetMenuButtonsByRoleId(roleId)
+	list, e := services.GetMenuList(this.GnToken, roleId)
 	if e != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取角色按钮权限失败, Err: " + e.Error()

+ 7 - 7
models/system/sys_group.go

@@ -78,13 +78,13 @@ func DeleteSysGroup(groupId int) (err error) {
 
 // 因前端显示需要,TopId字段用来当做一级部门id,DepartmentId为当前分组id
 type SysGroupList struct {
-	GroupId      int            `orm:"column(group_id);pk" json:"DepartmentId" description:"分组ID"`
-	ParentId     int            `json:"ParentId" description:"父级ID"`
-	DepartmentId int            `json:"TopId" description:"部门Id"`
-	GroupName    string         `json:"DepartmentName" description:"分组名称"`
-	Child        []*SysTeamList `gorm:"-" description:"小组"`
-	CreateTime   time.Time      `description:"创建时间"`
-	IsGroup      bool           `description:"是否为二级部门"`
+	GroupId      int             `orm:"column(group_id);pk" json:"DepartmentId" description:"分组ID"`
+	ParentId     int             `json:"ParentId" description:"父级ID"`
+	DepartmentId int             `json:"TopId" description:"部门Id"`
+	GroupName    string          `json:"DepartmentName" description:"分组名称"`
+	Child        []*SysGroupList `gorm:"-" description:"小组"`
+	CreateTime   time.Time       `description:"创建时间"`
+	IsGroup      bool            `description:"是否为二级部门"`
 }
 
 func GetSysGroupList() (items []*SysGroupList, err error) {

+ 157 - 0
services/system.go

@@ -1,8 +1,13 @@
 package services
 
 import (
+	"encoding/json"
 	"eta_gn/eta_api/models/system"
+	"eta_gn/eta_api/services/third"
 	"eta_gn/eta_api/utils"
+	"fmt"
+	"strconv"
+	"time"
 )
 
 func GetRoleTypeCode(roleType string) string {
@@ -45,3 +50,155 @@ func GetMenuTreeRecursive(list []*system.SysMenuItem, parentId int) []*system.Sy
 	}
 	return res
 }
+
+// BuildGroupTreeV2 构建分组树
+func BuildGroupTreeV2(groups []*system.SysFullGroup, groupAdmins map[int][]*system.DepartmentUserTree) map[int][]*system.DepartmentUserTree {
+	// 创建分组ID到节点的映射
+	groupMap := make(map[int]*system.DepartmentUserTree)
+	idList := make([]int, 0, len(groups))
+
+	// 初始化所有节点,不管父子顺序
+	for _, g := range groups {
+		idList = append(idList, g.GroupId)
+		node := &system.DepartmentUserTree{
+			NodeId:   g.GroupId,
+			NodeType: 2,
+			NodeName: g.GroupName,
+			Children: make([]*system.DepartmentUserTree, 0),
+		}
+
+		// 添加该分组的管理员
+		if admins, ok := groupAdmins[g.GroupId]; ok {
+			node.Children = append(node.Children, admins...)
+		}
+
+		groupMap[g.GroupId] = node
+	}
+
+	// 构建父子关系
+	//rootNodes := make([]*system.DepartmentUserTree, 0)
+
+	// 部门与分组的关系
+	groupTree := make(map[int][]*system.DepartmentUserTree)
+
+	for _, g := range groups {
+		node := groupMap[g.GroupId]
+
+		if g.ParentId == 0 || g.ParentId == -1 {
+			// 如果是根节点
+			//rootNodes = append(rootNodes, node)
+			nodeList, ok := groupTree[g.DepartmentId]
+			if !ok {
+				nodeList = make([]*system.DepartmentUserTree, 0)
+			}
+			groupTree[g.DepartmentId] = append(nodeList, node)
+		} else {
+			// 如果是非根节点,找到父节点并添加到父节点的Children中
+			parentNode, ok := groupMap[g.ParentId]
+			if !ok {
+				// 父节点不存在,继续处理下一个
+				continue
+			}
+			parentNode.Children = append(parentNode.Children, node)
+		}
+	}
+
+	return groupTree
+}
+
+// GetMenuList
+// @Description: 获取菜单列表
+// @author: Roc
+// @datetime 2025-06-10 11:16:34
+// @param token string
+// @param roleId int
+// @return items []*system.SysMenu
+// @return err error
+func GetMenuList(token string, roleId int) (items []*system.SysMenu, err error) {
+	items = make([]*system.SysMenu, 0)
+	if token == `` || utils.GnSciUserApiUrl == `` {
+		// 没有token,那么就直接通过角色吧
+		items, err = system.GetMenuButtonApisByRoleId(roleId)
+		if err != nil {
+			return
+		}
+
+		return
+	}
+
+	// 先从缓存里面获取,如果取不到,那么再去调用接口
+	key := fmt.Sprintf("%s%s", utils.CACHE_USER_MENU, utils.MD5(token))
+	//menuJsonStr, tmpErr := utils.Rc.RedisString(key)
+	//if tmpErr == nil && menuJsonStr != `` {
+	//	err = json.Unmarshal([]byte(menuJsonStr), &items)
+	//	if err == nil {
+	//		return
+	//	}
+	//}
+
+	resp, err := third.GetUserInfo(token)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	if resp.Info.Resource != nil && len(resp.Info.Resource) > 0 {
+
+		for _, v := range resp.Info.Resource {
+			var nameEn, path, iconPath, component, levelPath, buttonCode, api string
+			if v.NameEn != nil {
+				nameEn = *v.NameEn
+			}
+			if v.PATH != nil {
+				path = *v.PATH
+			}
+			if v.Icon != nil {
+				iconPath = *v.Icon
+			}
+			if v.Component != nil {
+				component = *v.Component
+			}
+			if v.LevelPath != nil {
+				levelPath = *v.LevelPath
+			}
+			if v.ButtonCode != nil {
+				buttonCode = *v.ButtonCode
+			}
+			if v.Api != nil {
+				api = *v.Api
+			}
+
+			var menuType int
+			if v.MenuType != `` {
+				menuType, _ = strconv.Atoi(v.MenuType)
+			}
+
+			items = append(items, &system.SysMenu{
+				MenuId:    v.MenuId,
+				ParentId:  v.ParentId,
+				Name:      v.MenuName,
+				Sort:      fmt.Sprint(v.OrderNum),
+				Path:      path,
+				IconPath:  iconPath,
+				Component: component,
+				//Hidden:     v.Hi,
+				IsLevel:    v.IsLevel,
+				LevelPath:  levelPath,
+				MenuType:   menuType,
+				ButtonCode: buttonCode,
+				//CreateTime: time.Time{},
+				//ModifyTime: time.Time{},
+				Api:    api,
+				NameEn: nameEn,
+			})
+		}
+	}
+
+	// 30分钟缓存,避免多次调用接口获取数据
+	menuJsonByte, tmpErr := json.Marshal(items)
+	if tmpErr == nil {
+		_ = utils.Rc.Put(key, menuJsonByte, 30*time.Minute)
+	}
+
+	return
+}

+ 136 - 0
services/third/gn.go

@@ -0,0 +1,136 @@
+package third
+
+import (
+	"encoding/json"
+	"errors"
+	"eta_gn/eta_api/utils"
+	"fmt"
+	"io"
+	"net/http"
+)
+
+type SciUserBaseInfoResp struct {
+	Code int    `json:"code"`
+	Msg  string `json:"msg"`
+	//Info  DeptItemResp `json:"info"`
+}
+
+type UserInfoResp struct {
+	SciUserBaseInfoResp
+
+	Info UserBaseInfResp `json:"info"`
+}
+
+type UserBaseInfResp struct {
+	Sub               string      `json:"sub"`
+	EmailVerified     bool        `json:"email_verified"`
+	UserName          string      `json:"user_name"`
+	Sex               string      `json:"sex"`
+	Phonenumber       interface{} `json:"phonenumber"`
+	DeptName          string      `json:"dept_name"`
+	Remark            string      `json:"remark"`
+	PreferredUsername string      `json:"preferred_username"`
+	GivenName         string      `json:"given_name"`
+	PostName          string      `json:"post_name"`
+	NickName          string      `json:"nick_name"`
+	PostCode          string      `json:"post_code"`
+	Name              string      `json:"name"`
+	DeptId            string      `json:"dept_id"`
+	FamilyName        string      `json:"family_name"`
+	Email             interface{} `json:"email"`
+	Status            string      `json:"status"`
+
+	Resource []MenuItemResp `json:"resource"`
+}
+
+type MenuItemResp struct {
+	PATH       *string `json:"PATH"`
+	ButtonCode *string `json:"button_code"`
+	MenuType   string  `json:"menu_type"`
+	UserName   string  `json:"user_name"`
+	Icon       *string `json:"icon"`
+	IsLevel    int     `json:"is_level"`
+	VISIBLE    string  `json:"VISIBLE"`
+	RoleName   string  `json:"role_name"`
+	Component  *string `json:"component"`
+	RoleId     int     `json:"role_id"`
+	LevelPath  *string `json:"level_path"`
+	NickName   string  `json:"nick_name"`
+	MenuName   string  `json:"menu_name"`
+	OrderNum   int     `json:"order_num"`
+	Api        *string `json:"api"`
+	MenuId     int     `json:"menu_id"`
+	ParentId   int     `json:"parent_id"`
+	NameEn     *string `json:"name_en"`
+}
+
+// GetUserInfo
+// @Description: 获取用户信息
+// @author: Roc
+// @datetime 2025-06-09 17:01:43
+// @param token string
+// @return resp *UserInfoResp
+// @return err error
+func GetUserInfo(token string) (resp *UserInfoResp, err error) {
+	urlPath := `index/getuserinfo?token=` + token
+	result, err := HttpUserGet(urlPath)
+	if err != nil {
+		return
+	}
+	//  解析响应结果
+	err = json.Unmarshal(result, &resp)
+	if err != nil {
+		return
+	}
+
+	return
+}
+
+// HttpUserGet
+// @Description: get请求
+// @author: Roc
+// @datetime 2025-06-05 14:40:36
+// @param urlPath string
+// @return []byte
+// @return error
+func HttpUserGet(urlPath string) ([]byte, error) {
+	if utils.GnSciUserApiUrl == `` {
+		return nil, errors.New("用户中心同步接口地址为空")
+	}
+	// 请求地址
+	getUrl := utils.GnSciUserApiUrl + urlPath
+	client := &http.Client{}
+	req, err := http.NewRequest("GET", getUrl, nil)
+	if err != nil {
+		return nil, err
+	}
+	resp, err := client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer resp.Body.Close()
+	result, err := io.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+
+	// 日志记录
+	utils.FileLog.Debug("用户中心平台:地址:" + getUrl + ";\n返回参数:" + string(result))
+
+	//  解析返回参数,判断是否是json
+	if !json.Valid(result) {
+		err = errors.New("返回参数不是json格式")
+	}
+
+	var respItem SciUserBaseInfoResp
+	err = json.Unmarshal(result, &respItem)
+	if err != nil {
+		return nil, err
+	}
+	if respItem.Code != 0 {
+		err = fmt.Errorf("HttpUserGet请求失败, Err: %d, ErrMsg: %s ", respItem.Code, respItem.Msg)
+		return nil, err
+	}
+
+	return result, err
+}

+ 10 - 0
utils/config.go

@@ -196,6 +196,10 @@ var (
 	ETA_FORUM_HUB_MD5_KEY string
 )
 
+var (
+	GnSciUserApiUrl string //卓创用户中心接口地址
+)
+
 // BusinessCode 商家编码
 var BusinessCode string
 
@@ -546,6 +550,12 @@ func init() {
 		ETA_FORUM_HUB_NAME_EN = config["eta_forum_hub_name_en"]
 		ETA_FORUM_HUB_MD5_KEY = config["eta_forum_hub_md5_key"]
 	}
+
+	// 国能地址
+	{
+		GnSciUserApiUrl = config["gn_sci_user_api_url"]
+	}
+
 	// 商家编码
 	BusinessCode = config["business_code"]
 	// eta_mini_bridge 小程序桥接服务地址

+ 1 - 0
utils/constants.go

@@ -219,6 +219,7 @@ const (
 	CACHE_KEY_BI_DASHBOARD_PREPARE_RESOURCE = "eta:bi_dashboard:prepare_resource" // 准备引用到看板的知识资源
 	CACHE_KEY_DATA_COLLECT_HANDLER          = "eta:data:collect:handler"          // 资产收藏处理队列
 	CACHE_REPORT_ICE_MSG_PUSH               = "eta:report:ice_msg:push:"           // 研报消息推送缓存
+	CACHE_USER_MENU                         = "eta:user:menu:"                    // 用户菜单权限
 )
 
 // 模板消息推送类型