Pārlūkot izejas kodu

优化“查询账户管理角色详情”接口

zhou.xiaoning 4 gadi atpakaļ
vecāks
revīzija
2d98b18720
4 mainītis faili ar 4803 papildinājumiem un 4226 dzēšanām
  1. 1935 2028
      docs/docs.go
  2. 1935 2028
      docs/swagger.json
  3. 833 140
      docs/swagger.yaml
  4. 100 30
      models/ermcpAccMgr.go

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1935 - 2028
docs/docs.go


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1935 - 2028
docs/swagger.json


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 833 - 140
docs/swagger.yaml


+ 100 - 30
models/ermcpAccMgr.go

@@ -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
 }
 

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels