Browse Source

菜单权限

hsun 1 year ago
parent
commit
76dcb3fcdc
5 changed files with 466 additions and 0 deletions
  1. 127 0
      controllers/sys_menu.go
  2. 74 0
      models/system/sys_menu.go
  3. 250 0
      models/system/sys_role_admin.go
  4. 9 0
      routers/commentsRouter.go
  5. 6 0
      routers/router.go

+ 127 - 0
controllers/sys_menu.go

@@ -0,0 +1,127 @@
+package controllers
+
+import (
+	"hongze/hongze_ETA_mobile_api/models"
+	"hongze/hongze_ETA_mobile_api/models/system"
+	"hongze/hongze_ETA_mobile_api/utils"
+	"strconv"
+	"strings"
+)
+
+type SysMenuController struct {
+	BaseAuthController
+}
+
+// @Title 获取用户权限菜单
+// @Description 获取用户权限菜单接口
+// @Success 200 {object} system.MenuListResp
+// @router /menu/list [get]
+func (this *SysMenuController) SysMenuList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		return
+	}
+	roleId := sysUser.RoleId
+	//roleId=1
+	if roleId <= 0 {
+		br.Msg = "参数错误"
+		return
+	}
+	roleIds := strconv.Itoa(roleId)
+	//查询账号绑定的其他角色
+	otherRoles, err := system.GetRoleIdsByAdminId(sysUser.AdminId)
+	if err != nil {
+		br.Msg = "获取其他角色失败"
+		br.ErrMsg = "获取其他角色失败,Err:" + err.Error()
+		return
+	}
+	if len(otherRoles) > 0 {
+		for _, v := range otherRoles {
+			roleIds += "," + strconv.Itoa(v.RoleId)
+		}
+	}
+	groupId := 0
+	if utils.RunMode == "release" {
+		groupId = 37
+	} else {
+		groupId = 61
+	}
+	//共享客户组下的用户
+	shareSellerMap := make(map[int]bool, 0)
+	subAdmins, err := system.GetAdminByGroupId(groupId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取销售失败"
+		br.ErrMsg = "获取销售失败,Err:" + err.Error()
+		return
+	}
+	for _, admin := range subAdmins {
+		shareSellerMap[admin.AdminId] = true
+	}
+
+	list, err := system.GetMenuListByRoleIds(roleIds)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	lenList := len(list)
+	for i := 0; i < lenList; i++ {
+		item := list[i]
+		child, err := system.GetMenuByParentIdRoleIds(roleIds, item.MenuId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取子菜单数据失败,Err:" + err.Error()
+			return
+		}
+		lenChild := len(child)
+		for ci := 0; ci < lenChild; ci++ {
+			if child[ci].Name == "领取列表" {
+				if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_SELLER {
+					child[ci].Name = "权益客户"
+				} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER {
+					child[ci].Name = "ficc客户"
+				}
+			}
+		}
+		for i, menu := range child {
+			if menu.Name == "正式客户共享" && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN &&
+				sysUser.AdminId != 66 && sysUser.AdminId != 15 {
+				//如果不是admin角色、共享客户分组下用户、楼颖丹账号、王沛账号 就不显示该页面
+				if ok, _ := shareSellerMap[sysUser.AdminId]; !ok {
+					child = append(child[:i], child[i+1:]...)
+				}
+			}
+		}
+
+		if strings.Contains(item.Name, "出差管理") && sysUser.AdminId == 66 {
+			cm := new(system.ChildMenu)
+			cm.MenuId = 10000
+			cm.Name = "出差审批"
+			cm.Path = "businessTripApproval"
+			cm.Component = "businessTripApproval"
+			cm.IconPath = ""
+			cm.Hidden = false
+			child = append(child, cm)
+		}
+		//if lenChild > 1 {
+		//	list[i].IsLevel = 2
+		//} else {
+		//	list[i].IsLevel = 1
+		//	list[i].LevelPath = ""
+		//}
+		list[i].Children = child
+	}
+	resp := new(system.MenuListResp)
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 74 - 0
models/system/sys_menu.go

@@ -0,0 +1,74 @@
+package system
+
+import "github.com/beego/beego/v2/client/orm"
+
+type MenuList struct {
+	MenuId    int          `description:"导航唯一标识"`
+	IsLevel   int          `description:"1,只有一级;2,有多级"`
+	Name      string       `json:"name" description:"导航名称"`
+	Path      string       `json:"path"`
+	IconPath  string       `json:"icon_path"`
+	LevelPath string       `json:"level_path"`
+	Component string       `json:"component"`
+	Hidden    bool         `json:"hidden"`
+	Children  []*ChildMenu `json:"children"`
+}
+
+type ChildMenu struct {
+	MenuId    int    `description:"导航唯一标识"`
+	Name      string `json:"name" description:"导航名称"`
+	Path      string `json:"path"`
+	Component string `json:"component"`
+	IconPath  string `json:"icon_path"`
+	Hidden    bool   `json:"hidden"`
+}
+
+type MenuListResp struct {
+	List []*MenuList
+}
+
+func GetMenuList(roleId int) (items []*MenuList, err error) {
+	sql := ` SELECT a.* FROM sys_menu AS a
+			INNER JOIN sys_role_menu AS b ON a.menu_id=b.menu_id
+			INNER JOIN sys_role AS c ON b.role_id=c.role_id
+			WHERE c.role_id=?
+			AND a.parent_id=0 
+            ORDER BY sort ASC `
+	_, err = orm.NewOrm().Raw(sql, roleId).QueryRows(&items)
+	return
+}
+
+func GetMenuByParentId(roleId, parentId int) (items []*ChildMenu, err error) {
+	sql := ` SELECT a.* FROM sys_menu AS a
+			INNER JOIN sys_role_menu AS b ON a.menu_id=b.menu_id
+			INNER JOIN sys_role AS c ON b.role_id=c.role_id
+			WHERE c.role_id=?
+			AND a.parent_id=? 
+            ORDER BY sort ASC `
+	_, err = orm.NewOrm().Raw(sql, roleId, parentId).QueryRows(&items)
+	return
+}
+
+// GetMenuListByRoleIds 根据管理员多个角色查询菜单ID
+func GetMenuListByRoleIds(roleIds string) (items []*MenuList, err error) {
+	sql := ` SELECT DISTINCT a.* FROM sys_menu AS a
+			INNER JOIN sys_role_menu AS b ON a.menu_id=b.menu_id
+			INNER JOIN sys_role AS c ON b.role_id=c.role_id
+			WHERE c.role_id in (` + roleIds + `)
+			AND a.parent_id=0 
+            ORDER BY sort ASC `
+	_, err = orm.NewOrm().Raw(sql).QueryRows(&items)
+	return
+}
+
+// GetMenuByParentIdRoleIds 根据管理员多个角色查询子菜单ID
+func GetMenuByParentIdRoleIds(roleIds string, parentId int) (items []*ChildMenu, err error) {
+	sql := ` SELECT DISTINCT a.* FROM sys_menu AS a
+			INNER JOIN sys_role_menu AS b ON a.menu_id=b.menu_id
+			INNER JOIN sys_role AS c ON b.role_id=c.role_id
+			WHERE c.role_id in (` + roleIds + `)
+			AND a.parent_id=? 
+            ORDER BY a.sort ASC`
+	_, err = orm.NewOrm().Raw(sql, parentId).QueryRows(&items)
+	return
+}

+ 250 - 0
models/system/sys_role_admin.go

@@ -0,0 +1,250 @@
+package system
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"hongze/hongze_ETA_mobile_api/utils"
+	"time"
+)
+
+type SysRoleAdmin struct {
+	Id         int       `orm:"column(id);pk" description:"自增ID"`
+	AdminId    int       `orm:"column(admin_id);" description:"系统用户id"`
+	RoleId     int       `orm:"column(role_id);" description:"角色ID"`
+	CreateTime time.Time `orm:"column(create_time);" description:"创建时间"`
+}
+
+type RoleAdminItem struct {
+	SysRoleAdminId  int    `description:"管理员账号和角色映射表id"`
+	AdminId         int    `description:"系统用户id"`
+	AdminName       string `description:"系统用户名称"`
+	RealName        string `description:"系统用户姓名"`
+	Enabled         int    `description:"1:有效,0:禁用"`
+	Mobile          string `description:"手机号"`
+	RoleId          int    `description:"角色Id"`
+	RoleTypeCode    string `description:"角色编码"`
+	DepartmentId    int    `description:"部门id"`
+	DepartmentName  string `description:"部门名称"`
+	DepartmentGroup string `description:"部门分组"`
+	TeamId          int    `description:"小组id"`
+	GroupId         int    `description:"分组id"`
+	GroupName       string `description:"分组名称"`
+	Authority       int    `description:"管理权限,0:无,1:部门负责人,2:小组负责人,或者ficc销售主管,4:ficc销售组长"`
+	LabelVal        int    `description:"标签:1:超级管理员,2:管理员,3:部门经理,4:组长,5:ficc销售主管"`
+}
+
+func (sa *SysRoleAdmin) TableName() string {
+	return "sys_role_admin"
+}
+
+// GetRoleIdsByAdminId 根据管理员账号查询角色ID
+func GetRoleIdsByAdminId(adminId int) (items []*SysRoleAdmin, err error) {
+	sql := `SELECT * from sys_role_admin where admin_id = ?`
+	_, err = orm.NewOrm().Raw(sql, adminId).QueryRows(&items)
+	return
+}
+
+// GetRoleIdsByAdminIdRoleId 根据管理员账号和角色查询
+func GetRoleIdsByAdminIdRoleId(adminId int, roleId int) (item *SysRoleAdmin, err error) {
+	sql := `SELECT * from sys_role_admin where admin_id = ? and role_id=?`
+	err = orm.NewOrm().Raw(sql, adminId, roleId).QueryRow(&item)
+	return
+}
+
+// GetRoleAdminList 查询对应角色绑定的管理员列表
+func GetRoleAdminList(condition string, pars []interface{}, startSize, pageSize int) (list []*RoleAdminItem, err error) {
+	sql := `SELECT
+	s.id as sys_role_admin_id,
+	a.admin_id,
+	a.admin_name,
+	a.real_name,
+	a.mobile,
+	a.department_id,
+	a.department_name,
+	a.enabled,
+	a.role_id,
+	a.role_type_code ,
+	a.group_id,
+	a.authority,
+	a.group_name
+FROM
+	sys_role_admin s
+	INNER JOIN admin a ON s.admin_id = a.admin_id 
+where 1=1`
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY s.id DESC limit ?, ?`
+	_, err = orm.NewOrm().Raw(sql, pars, startSize, pageSize).QueryRows(&list)
+	return
+}
+
+// GetRoleAdminListTotal 查询对应角色绑定的管理员列表总数
+func GetRoleAdminListTotal(condition string, pars []interface{}) (total int64, err error) {
+	sql := `SELECT
+	count(*)
+FROM
+	sys_role_admin s
+	INNER JOIN admin a ON s.admin_id = a.admin_id 
+where 1=1`
+	if condition != "" {
+		sql += condition
+	}
+	err = orm.NewOrm().Raw(sql, pars).QueryRow(&total)
+	return
+}
+
+// CheckRoleAdminByAdminIds 判断是否已经绑定过该角色
+func CheckRoleAdminByAdminIds(adminIds string, roleId int) (list []*SysRoleAdmin, err error) {
+	sql := `SELECT
+	s.*
+FROM
+	sys_role_admin s
+	LEFT JOIN admin a ON s.admin_id = a.admin_id 
+where s.role_id=? and s.admin_id in (` + adminIds + `)`
+	_, err = orm.NewOrm().Raw(sql, roleId).QueryRows(&list)
+	return
+}
+
+// AddRoleAdminBatch 批量新增留言版管理员
+func AddRoleAdminBatch(admins []*SysRoleAdmin) (err error) {
+	o := orm.NewOrm()
+	_, err = o.InsertMulti(len(admins), admins)
+	return
+}
+
+// DeleteRoleAdmin 删除管理员和角色的绑定
+func DeleteRoleAdmin(SysRoleAdminId int) (err error) {
+	sql := `DELETE FROM sys_role_admin WHERE id=? `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, SysRoleAdminId).Exec()
+	return
+}
+
+// GetRoleAdminById 根据ID查询绑定记录
+func GetRoleAdminById(SysRoleAdminId int) (item *SysRoleAdmin, err error) {
+	sql := `SELECT
+	*
+FROM
+	sys_role_admin 
+where id=?`
+	err = orm.NewOrm().Raw(sql, SysRoleAdminId).QueryRow(&item)
+	return
+}
+
+// GetEnglishAuthRoleAdminList 查询英文权限管理员列表
+func GetEnglishAuthRoleAdminList(condition string, pars []interface{}, startSize, pageSize int) (total int, list []*RoleAdminItem, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+				s.id as sys_role_admin_id,
+				a.admin_id,
+				a.admin_name,
+				a.real_name,
+				a.mobile,
+				a.department_id,
+				a.department_name,
+				a.enabled,
+				a.role_id,
+				a.role_type_code ,
+				a.group_id,
+				a.authority,
+				a.group_name
+			FROM
+				sys_role_admin AS s
+			JOIN sys_role AS r ON s.role_id = r.role_id
+			JOIN admin AS a ON s.admin_id = a.admin_id
+			WHERE
+				1 = 1 `
+	sql += condition
+	sql += ` GROUP BY s.admin_id `
+
+	totalSQl := `SELECT COUNT(1) total FROM (` + sql + `) z`
+	if err = o.Raw(totalSQl, pars).QueryRow(&total); err != nil {
+		return
+	}
+
+	sql += ` ORDER BY s.create_time DESC,s.admin_id ASC LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
+	return
+}
+
+// DeleteRoleAdminByAdminIdAndRoleIds 通过管理员ID及角色IDs删除绑定
+func DeleteRoleAdminByAdminIdAndRoleIds(adminId int, roleIds []int) (err error) {
+	if len(roleIds) == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	sql := `DELETE FROM sys_role_admin WHERE admin_id = ? AND role_id IN (` + utils.GetOrmInReplace(len(roleIds)) + `) `
+	_, err = o.Raw(sql, adminId, roleIds).Exec()
+	return
+}
+
+// CheckEnglishAuthRoleAdminByAdminIds 通过管理员IDs判断是否已经绑定过英文权限角色
+func CheckEnglishAuthRoleAdminByAdminIds(adminIds []int, roleCodes []string) (list []*SysRoleAdmin, err error) {
+	if len(adminIds) == 0 || len(roleCodes) == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	sql := `SELECT
+				s.*
+			FROM
+				sys_role_admin AS s
+			JOIN sys_role AS r ON s.role_id = r.role_id
+			JOIN admin AS a ON s.admin_id = a.admin_id
+			WHERE
+				s.admin_id IN (` + utils.GetOrmInReplace(len(adminIds)) + `) AND r.role_type_code IN (` + utils.GetOrmInReplace(len(roleCodes)) + `)
+			GROUP BY
+				s.admin_id`
+	_, err = o.Raw(sql, adminIds, roleCodes).QueryRows(&list)
+	return
+}
+
+// EnglishAuthRoleDetail 英文权限角色详情
+type EnglishAuthRoleDetail struct {
+	AdminId      int    `description:"用户ID"`
+	RoleTypeCode string `description:"角色类型编码"`
+}
+
+// GetAdminEnglishAuthRoleDetail 获取用户英文权限详情
+func GetAdminEnglishAuthRoleDetail(adminId int, roleCodes []string) (list []*EnglishAuthRoleDetail, err error) {
+	if len(roleCodes) == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	sql := `SELECT
+				s.admin_id, r.role_type_code
+			FROM
+				sys_role_admin AS s
+			JOIN sys_role AS r ON s.role_id = r.role_id
+			JOIN admin AS a ON s.admin_id = a.admin_id
+			WHERE
+				s.admin_id = ? AND r.role_type_code IN (` + utils.GetOrmInReplace(len(roleCodes)) + `)`
+	_, err = o.Raw(sql, adminId, roleCodes).QueryRows(&list)
+	return
+}
+
+// EditEnglishAuthRoleAdmin 编辑管理员英文权限
+func EditEnglishAuthRoleAdmin(adminId int, englishRoleIds []int, roleAdmins []*SysRoleAdmin) (err error) {
+	o := orm.NewOrm()
+	tx, e := o.Begin()
+	if e != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+		} else {
+			_ = tx.Commit()
+		}
+	}()
+
+	// 删除原绑定关系
+	sql := `DELETE FROM sys_role_admin WHERE admin_id = ? AND role_id IN (` + utils.GetOrmInReplace(len(englishRoleIds)) + `)`
+	_, err = tx.Raw(sql, adminId, englishRoleIds).Exec()
+	if err != nil {
+		return
+	}
+
+	// 新增绑定关系
+	_, err = o.InsertMulti(len(roleAdmins), roleAdmins)
+	return
+}

+ 9 - 0
routers/commentsRouter.go

@@ -1276,6 +1276,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:SysMenuController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:SysMenuController"],
+        beego.ControllerComments{
+            Method: "SysMenuList",
+            Router: `/menu/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:SysUserAuthController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:SysUserAuthController"],
         beego.ControllerComments{
             Method: "CheckPwd",

+ 6 - 0
routers/router.go

@@ -111,6 +111,12 @@ func init() {
 				&english_report.EnglishReportEmailController{},
 			),
 		),
+
+		web.NSNamespace("/system",
+			web.NSInclude(
+				&controllers.SysMenuController{},
+			),
+		),
 	)
 	web.AddNamespace(ns)
 }