|
|
@@ -511,17 +511,46 @@ func (r *ErmcpRole) GetDataEx() (interface{}, error) {
|
|
|
|
|
|
// ErmcpRoleMenuEx 角色菜单(分层级)
|
|
|
type ErmcpRoleMenuEx struct {
|
|
|
- Menu ErmcpRoleMenu // 父级菜单
|
|
|
- SubMenu []ErmcpRoleMenu // 子级菜单
|
|
|
+ Menu ErmcpRoleMenu // 父级菜单
|
|
|
+ SubMenu []ErmcpRoleMenuEx // 子级菜单
|
|
|
}
|
|
|
|
|
|
// add 添加子级菜单
|
|
|
-func (r *ErmcpRoleMenuEx) add(menu ErmcpRoleMenu) {
|
|
|
- if menu.PARENTCODE == r.Menu.RESOURCECODE {
|
|
|
+func (r *ErmcpRoleMenuEx) add(menu ErmcpRoleMenuEx) {
|
|
|
+ if menu.Menu.PARENTCODE == r.Menu.RESOURCECODE {
|
|
|
r.SubMenu = append(r.SubMenu, menu)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// addEx 添加子级菜单(不包括PARENTCODE为空的)
|
|
|
+func (r *ErmcpRoleMenuEx) addEx(menus []ErmcpRoleMenu) {
|
|
|
+ for _, v := range menus {
|
|
|
+ if v.PARENTCODE == r.Menu.RESOURCECODE {
|
|
|
+ e := ErmcpRoleMenuEx{Menu: v, SubMenu: make([]ErmcpRoleMenuEx, 0)}
|
|
|
+ // 递归构建子菜单
|
|
|
+ e.addEx(menus)
|
|
|
+
|
|
|
+ r.SubMenu = append(r.SubMenu, e)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// setRold 设置菜单权限(包括子菜单)
|
|
|
+func (r *ErmcpRoleMenuEx) setRold(menus []ErmcpRoleMenu) {
|
|
|
+ for _, v := range menus {
|
|
|
+ if r.Menu.RESOURCECODE == v.RESOURCECODE {
|
|
|
+ r.Menu.ISHADROLE = true
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 递归设置子菜单权限
|
|
|
+ for i := range r.SubMenu {
|
|
|
+ s := &r.SubMenu[i]
|
|
|
+ s.setRold(menus)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// ErmcpRoleMenu 角色菜单
|
|
|
type ErmcpRoleMenu struct {
|
|
|
USERID int64 `json:"userid" xorm:"'USERID'"` // 用户id
|
|
|
@@ -536,6 +565,8 @@ type ErmcpRoleMenu struct {
|
|
|
ICONAME string `json:"iconame" xorm:"'ICONAME'"` // 菜单图标
|
|
|
REMARK string `json:"remark" xorm:"'REMARK'"` // 菜单备注
|
|
|
|
|
|
+ ISHADROLE bool `json:"ishadrole" xorm:"-"` // 是否有权限
|
|
|
+
|
|
|
FilterRoleId string `json:"-"` // 查询过滤条件, 角色 - 逗号隔开
|
|
|
}
|
|
|
|
|
|
@@ -545,7 +576,7 @@ func (r *ErmcpRoleMenu) calc() {
|
|
|
func (r *ErmcpRoleMenu) buildSql() string {
|
|
|
var sqlId utils.SQLVal = "select distinct t.userid," +
|
|
|
" t.roleid," +
|
|
|
- " t.resourcecode," +
|
|
|
+ " f.resourcecode," +
|
|
|
" f.resourcename," +
|
|
|
" f.resourcelevel," +
|
|
|
" f.menutype," +
|
|
|
@@ -556,7 +587,7 @@ func (r *ErmcpRoleMenu) buildSql() string {
|
|
|
" f.remark" +
|
|
|
" from ermcp_memberfuncmenu t" +
|
|
|
" inner join funcmenulist f" +
|
|
|
- " on t.resourcecode = f.resourcecode" +
|
|
|
+ " on t.resourcecode = f.resourcecode and f.menutype = 3" +
|
|
|
" where t.isvalid = 1"
|
|
|
if r.USERID > 0 {
|
|
|
sqlId.And("t.userid", r.USERID)
|
|
|
@@ -565,39 +596,78 @@ func (r *ErmcpRoleMenu) buildSql() string {
|
|
|
sqlId.Join(fmt.Sprintf(" and t.roleid in(%v)", r.FilterRoleId))
|
|
|
}
|
|
|
sqlId.Join(" order by f.resourcelevel, f.sort")
|
|
|
+
|
|
|
return sqlId.String()
|
|
|
}
|
|
|
|
|
|
// GetDataEx 查询角色菜单
|
|
|
func (r *ErmcpRoleMenu) GetDataEx() (interface{}, error) {
|
|
|
- sData := make([]ErmcpRoleMenu, 0)
|
|
|
- err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
|
|
|
- for i := range sData {
|
|
|
- sData[i].calc()
|
|
|
- }
|
|
|
+ // sData := make([]ErmcpRoleMenu, 0)
|
|
|
+ // err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
|
|
|
+ // for i := range sData {
|
|
|
+ // sData[i].calc()
|
|
|
+ // }
|
|
|
// 构建层级树
|
|
|
sDataEx := make([]ErmcpRoleMenuEx, 0)
|
|
|
- // 最多构建4层
|
|
|
- for level := int32(1); level <= 4; level++ {
|
|
|
- for _, v := range sData {
|
|
|
- if v.RESOURCELEVEL == level {
|
|
|
- val := ErmcpRoleMenuEx{Menu: v, SubMenu: make([]ErmcpRoleMenu, 0)}
|
|
|
- for _, v2 := range sData {
|
|
|
- // 获取子菜单
|
|
|
- if v2.ROLEID == v.ROLEID && v2.PARENTCODE == v.RESOURCECODE {
|
|
|
- val.SubMenu = append(val.SubMenu, v2)
|
|
|
- }
|
|
|
- }
|
|
|
- // 第一层固定要, 不管有没有子菜单
|
|
|
- if val.Menu.RESOURCELEVEL == 1 {
|
|
|
- sDataEx = append(sDataEx, val)
|
|
|
- } else if val.Menu.RESOURCELEVEL > 1 && len(val.SubMenu) > 0 {
|
|
|
- // 第二层开始,有子菜单内容的才要
|
|
|
- sDataEx = append(sDataEx, val)
|
|
|
- }
|
|
|
- }
|
|
|
+ // // 最多构建4层
|
|
|
+ // for level := int32(1); level <= 4; level++ {
|
|
|
+ // for _, v := range sData {
|
|
|
+ // if v.RESOURCELEVEL == level {
|
|
|
+ // val := ErmcpRoleMenuEx{Menu: v, SubMenu: make([]ErmcpRoleMenu, 0)}
|
|
|
+ // for _, v2 := range sData {
|
|
|
+ // // 获取子菜单
|
|
|
+ // if v2.ROLEID == v.ROLEID && v2.PARENTCODE == v.RESOURCECODE {
|
|
|
+ // val.SubMenu = append(val.SubMenu, v2)
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // // 第一层固定要, 不管有没有子菜单
|
|
|
+ // if val.Menu.RESOURCELEVEL == 1 {
|
|
|
+ // sDataEx = append(sDataEx, val)
|
|
|
+ // } else if val.Menu.RESOURCELEVEL > 1 && len(val.SubMenu) > 0 {
|
|
|
+ // // 第二层开始,有子菜单内容的才要
|
|
|
+ // sDataEx = append(sDataEx, val)
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+
|
|
|
+ // 获取所有菜单
|
|
|
+ sData := make([]ErmcpRoleMenu, 0)
|
|
|
+ sql := "select 0 userid," +
|
|
|
+ " 0 roleid," +
|
|
|
+ " f.resourcecode," +
|
|
|
+ " f.resourcename," +
|
|
|
+ " f.resourcelevel," +
|
|
|
+ " f.menutype," +
|
|
|
+ " f.parentcode," +
|
|
|
+ " f.url," +
|
|
|
+ " f.sort," +
|
|
|
+ " f.iconame," +
|
|
|
+ " f.remark" +
|
|
|
+ " from funcmenulist f" +
|
|
|
+ " where f.menutype = 3"
|
|
|
+ err := db.GetEngine().SQL(sql).Find(&sData)
|
|
|
+ // 先创建PARENTCODE为空的记录
|
|
|
+ for _, v := range sData {
|
|
|
+ if v.PARENTCODE == "" {
|
|
|
+ sDataEx = append(sDataEx, ErmcpRoleMenuEx{Menu: v, SubMenu: make([]ErmcpRoleMenuEx, 0)})
|
|
|
}
|
|
|
}
|
|
|
+ // 再构建所有子菜单
|
|
|
+ for i := range sDataEx {
|
|
|
+ v := &sDataEx[i]
|
|
|
+ v.addEx(sData)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取有权限的菜单
|
|
|
+ rData := make([]ErmcpRoleMenu, 0)
|
|
|
+ err = db.GetEngine().SQL(r.buildSql()).Find(&rData)
|
|
|
+ // 判断权限
|
|
|
+ for i := range sDataEx {
|
|
|
+ s := &sDataEx[i]
|
|
|
+ s.setRold(rData)
|
|
|
+ }
|
|
|
+
|
|
|
return sDataEx, err
|
|
|
}
|
|
|
|