refactor🎨:更新角色模块

This commit is contained in:
wenjianzhang
2021-06-15 19:03:37 +08:00
parent 13f09d6059
commit 5afe67bd1b
8 changed files with 286 additions and 270 deletions
+6
View File
@@ -214,19 +214,25 @@ func (e SysMenu) GetMenuRole(c *gin.Context) {
// @Security Bearer
func (e SysMenu) GetMenuIDS(c *gin.Context) {
s := new(service.SysMenu)
r := service.SysRole{}
m := dto.SysRoleByName{}
err := e.MakeContext(c).
MakeOrm().
Bind(&m, binding.JSON).
MakeService(&s.Service).
MakeService(&r.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
r.GetWithName(&m)
var data models.RoleMenu
data.RoleName = c.GetString("role")
data.UpdateBy = user.GetUserId(c)
result, err := data.GetIDS(s.Orm)
if err != nil {
e.Logger.Errorf("GetIDS error, %s", err.Error())
e.Error(500, err, "获取失败")
+3 -3
View File
@@ -232,7 +232,7 @@ func (e SysRole) Update2Status(c *gin.Context) {
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, fmt.Sprintf("更新角色状态失败,失败原因:%s ", err.Error()))
e.Error(500, err, fmt.Sprintf("更新角色状态失败,失败原因:%s ", err.Error()))
return
}
req.SetUpdateBy(user.GetUserId(c))
@@ -273,10 +273,10 @@ func (e SysRole) Update2DataScope(c *gin.Context) {
DeptIds: req.DeptIds,
}
data.UpdateBy = user.GetUserId(c)
err = s.UpdateDataScope(data)
err = s.UpdateDataScope(&req).Error
if err != nil {
e.Error(http.StatusInternalServerError, err, "")
return
}
e.OK(nil, "操作成功")
}
}
+8 -8
View File
@@ -1,11 +1,11 @@
package models
//sys_role_dept
type SysRoleDept struct {
RoleId int `gorm:"size:11;primaryKey"`
DeptId int `gorm:"size:11;primaryKey"`
}
func (SysRoleDept) TableName() string {
return "sys_role_dept"
}
//type SysRoleDept struct {
// RoleId int `gorm:"size:11;primaryKey"`
// DeptId int `gorm:"size:11;primaryKey"`
//}
//
//func (SysRoleDept) TableName() string {
// return "sys_role_dept"
//}
+159 -168
View File
@@ -1,171 +1,162 @@
package models
import (
"fmt"
"github.com/casbin/casbin/v2"
"github.com/go-admin-team/go-admin-core/sdk/pkg"
"gorm.io/gorm"
//type RoleMenu struct {
// RoleId int `gorm:""`
// MenuId int `gorm:""`
// RoleName string `gorm:"size:128"`
// models.ControlBy
//}
//
//func (RoleMenu) TableName() string {
// return "sys_role_menu"
//}
//
//type MenuPath struct {
// Path string `json:"path"`
//}
//
//func (rm *RoleMenu) Get(tx *gorm.DB) ([]RoleMenu, error) {
// var r []RoleMenu
// table := tx.Table("sys_role_menu")
// if rm.RoleId != 0 {
// table = table.Where("role_id = ?", rm.RoleId)
//
// }
// if err := table.Find(&r).Error; err != nil {
// return nil, err
// }
// return r, nil
//}
//
//func (rm *RoleMenu) GetPermis(tx *gorm.DB) ([]string, error) {
// var r []SysMenu
// table := tx.Select("sys_menu.permission").Table("sys_menu").Joins("left join sys_role_menu on sys_menu.menu_id = sys_role_menu.menu_id")
//
// table = table.Where("role_id = ?", rm.RoleId)
//
// table = table.Where("sys_menu.menu_type in('F','C')")
// if err := table.Find(&r).Error; err != nil {
// return nil, err
// }
// var list []string
// for i := 0; i < len(r); i++ {
// list = append(list, r[i].Permission)
// }
// return list, nil
//}
//
//func (rm *RoleMenu) GetIDS(tx *gorm.DB) ([]MenuPath, error) {
// var r []MenuPath
// table := tx.Select("sys_menu.path").Table("sys_role_menu")
// table = table.Joins("left join sys_role on sys_role.role_id=sys_role_menu.role_id")
// table = table.Joins("left join sys_menu on sys_menu.id=sys_role_menu.menu_id")
// table = table.Where("sys_role.role_name = ? and sys_menu.type=1", rm.RoleName)
// if err := table.Find(&r).Error; err != nil {
// return nil, err
// }
// return r, nil
//}
//
//func (rm *RoleMenu) DeleteRoleMenu(tx *gorm.DB, roleId int) error {
// if err := tx.Table("sys_role_dept").Where("role_id = ?", roleId).Delete(&rm).Error; err != nil {
// return err
// }
// if err := tx.Table("sys_role_menu").Where("role_id = ?", roleId).Delete(&rm).Error; err != nil {
// return err
// }
// var role SysRole
// if err := tx.Table("sys_role").Where("role_id = ?", roleId).First(&role).Error; err != nil {
// return err
// }
// sql3 := "delete from sys_casbin_rule where v0= '" + role.RoleKey + "';"
// if err := tx.Exec(sql3).Error; err != nil {
// return err
// }
// return nil
//
//}
//
//// 该方法即将弃用
//func (rm *RoleMenu) BatchDeleteRoleMenu(tx *gorm.DB, roleIds []int) error {
// if err := tx.Table("sys_role_menu").Where("role_id in (?)", roleIds).Delete(&rm).Error; err != nil {
// return err
// }
// var role []SysRole
// if err := tx.Table("sys_role").Where("role_id in (?)", roleIds).Find(&role).Error; err != nil {
// return err
// }
// sql := ""
// for i := 0; i < len(role); i++ {
// sql += "delete from sys_casbin_rule where v0= '" + role[i].RoleName + "';"
// }
// if err := tx.Exec(sql).Error; err != nil {
// return err
// }
// if err := tx.Commit().Error; err != nil {
// return err
// }
// return nil
//
//}
"go-admin/common/models"
)
type RoleMenu struct {
RoleId int `gorm:""`
MenuId int `gorm:""`
RoleName string `gorm:"size:128"`
models.ControlBy
}
func (RoleMenu) TableName() string {
return "sys_role_menu"
}
type MenuPath struct {
Path string `json:"path"`
}
func (rm *RoleMenu) Get(tx *gorm.DB) ([]RoleMenu, error) {
var r []RoleMenu
table := tx.Table("sys_role_menu")
if rm.RoleId != 0 {
table = table.Where("role_id = ?", rm.RoleId)
}
if err := table.Find(&r).Error; err != nil {
return nil, err
}
return r, nil
}
func (rm *RoleMenu) GetPermis(tx *gorm.DB) ([]string, error) {
var r []SysMenu
table := tx.Select("sys_menu.permission").Table("sys_menu").Joins("left join sys_role_menu on sys_menu.menu_id = sys_role_menu.menu_id")
table = table.Where("role_id = ?", rm.RoleId)
table = table.Where("sys_menu.menu_type in('F','C')")
if err := table.Find(&r).Error; err != nil {
return nil, err
}
var list []string
for i := 0; i < len(r); i++ {
list = append(list, r[i].Permission)
}
return list, nil
}
func (rm *RoleMenu) GetIDS(tx *gorm.DB) ([]MenuPath, error) {
var r []MenuPath
table := tx.Select("sys_menu.path").Table("sys_role_menu")
table = table.Joins("left join sys_role on sys_role.role_id=sys_role_menu.role_id")
table = table.Joins("left join sys_menu on sys_menu.id=sys_role_menu.menu_id")
table = table.Where("sys_role.role_name = ? and sys_menu.type=1", rm.RoleName)
if err := table.Find(&r).Error; err != nil {
return nil, err
}
return r, nil
}
func (rm *RoleMenu) DeleteRoleMenu(tx *gorm.DB, roleId int) error {
if err := tx.Table("sys_role_dept").Where("role_id = ?", roleId).Delete(&rm).Error; err != nil {
return err
}
if err := tx.Table("sys_role_menu").Where("role_id = ?", roleId).Delete(&rm).Error; err != nil {
return err
}
var role SysRole
if err := tx.Table("sys_role").Where("role_id = ?", roleId).First(&role).Error; err != nil {
return err
}
sql3 := "delete from sys_casbin_rule where v0= '" + role.RoleKey + "';"
if err := tx.Exec(sql3).Error; err != nil {
return err
}
return nil
}
// 该方法即将弃用
func (rm *RoleMenu) BatchDeleteRoleMenu(tx *gorm.DB, roleIds []int) error {
if err := tx.Table("sys_role_menu").Where("role_id in (?)", roleIds).Delete(&rm).Error; err != nil {
return err
}
var role []SysRole
if err := tx.Table("sys_role").Where("role_id in (?)", roleIds).Find(&role).Error; err != nil {
return err
}
sql := ""
for i := 0; i < len(role); i++ {
sql += "delete from sys_casbin_rule where v0= '" + role[i].RoleName + "';"
}
if err := tx.Exec(sql).Error; err != nil {
return err
}
if err := tx.Commit().Error; err != nil {
return err
}
return nil
}
func (rm *RoleMenu) Insert(tx *gorm.DB, enforcer *casbin.SyncedEnforcer, roleId int, menuId []int) error {
var err error
var (
role SysRole
menu []SysMenu
casbinRules []CasbinRule // casbinRule 待插入队列
)
// 在事务中做一些数据库操作(从这一点使用'tx',而不是'db'
if err = tx.Table("sys_role").Where("role_id = ?", roleId).First(&role).Error; err != nil {
return err
}
if err = tx.Table("sys_menu").Where("menu_id in (?)", menuId).Find(&menu).Error; err != nil {
return err
}
//ORM不支持批量插入所以需要拼接 sql 串
sysRoleMenuSql := "INSERT INTO `sys_role_menu` (`role_id`,`menu_id`,`role_name`) VALUES "
for i, m := range menu {
// 拼装'role_menu'表批量插入SQL语句
sysRoleMenuSql += fmt.Sprintf("(%d,%d,'%s')", role.RoleId, m.MenuId, role.RoleKey)
if i == len(menu)-1 {
sysRoleMenuSql += ";" //最后一条数据 以分号结尾
} else {
sysRoleMenuSql += ","
}
if m.MenuType == "A" {
// 加入队列
casbinRules = append(casbinRules,
CasbinRule{
V0: role.RoleKey,
V1: m.Path,
V2: m.Action,
})
}
}
// 执行批量插入sys_role_menu
if err = tx.Exec(sysRoleMenuSql).Error; err != nil {
return err
}
// 执行批量插入sys_casbin_rule
if len(casbinRules) > 0 {
if err = tx.Create(&casbinRules).Error; err != nil {
return err
}
}
return nil
}
func (rm *RoleMenu) Delete(tx *gorm.DB, RoleId string, MenuID string) (bool, error) {
rm.RoleId, _ = pkg.StringToInt(RoleId)
table := tx.Table("sys_role_menu").Where("role_id = ?", RoleId)
if MenuID != "" {
table = table.Where("menu_id = ?", MenuID)
}
if err := table.Delete(&rm).Error; err != nil {
return false, err
}
return true, nil
}
//func (rm *RoleMenu) Insert(tx *gorm.DB, enforcer *casbin.SyncedEnforcer, roleId int, menuId []int) error {
// var err error
// var (
// role SysRole
// menu []SysMenu
// casbinRules []CasbinRule // casbinRule 待插入队列
// )
// // 在事务中做一些数据库操作(从这一点使用'tx',而不是'db'
// if err = tx.Table("sys_role").Where("role_id = ?", roleId).First(&role).Error; err != nil {
// return err
// }
// if err = tx.Table("sys_menu").Where("menu_id in (?)", menuId).Find(&menu).Error; err != nil {
// return err
// }
// //ORM不支持批量插入所以需要拼接 sql 串
// sysRoleMenuSql := "INSERT INTO `sys_role_menu` (`role_id`,`menu_id`,`role_name`) VALUES "
//
// for i, m := range menu {
// // 拼装'role_menu'表批量插入SQL语句
// sysRoleMenuSql += fmt.Sprintf("(%d,%d,'%s')", role.RoleId, m.MenuId, role.RoleKey)
// if i == len(menu)-1 {
// sysRoleMenuSql += ";" //最后一条数据 以分号结尾
// } else {
// sysRoleMenuSql += ","
// }
// if m.MenuType == "A" {
// // 加入队列
// casbinRules = append(casbinRules,
// CasbinRule{
// V0: role.RoleKey,
// V1: m.Path,
// V2: m.Action,
// })
// }
// }
// // 执行批量插入sys_role_menu
// if err = tx.Exec(sysRoleMenuSql).Error; err != nil {
// return err
// }
//
// // 执行批量插入sys_casbin_rule
// if len(casbinRules) > 0 {
// if err = tx.Create(&casbinRules).Error; err != nil {
// return err
// }
// }
// return nil
//}
//
//func (rm *RoleMenu) Delete(tx *gorm.DB, RoleId string, MenuID string) (bool, error) {
// rm.RoleId, _ = pkg.StringToInt(RoleId)
// table := tx.Table("sys_role_menu").Where("role_id = ?", RoleId)
// if MenuID != "" {
// table = table.Where("menu_id = ?", MenuID)
// }
// if err := table.Delete(&rm).Error; err != nil {
// return false, err
// }
// return true, nil
//
//}
+1
View File
@@ -15,6 +15,7 @@ type SysRole struct {
Params string `json:"params" gorm:"-"`
MenuIds []int `json:"menuIds" gorm:"-"`
DeptIds []int `json:"deptIds" gorm:"-"`
SysDept []SysDept `json:"sysDept" gorm:"many2many:sys_role_dept;foreignKey:RoleId;joinForeignKey:role_id;references:DeptId;joinReferences:dept_id;"`
SysMenu *[]SysMenu `json:"sysMenu" gorm:"many2many:sys_role_menu;foreignKey:RoleId;joinForeignKey:role_id;references:MenuId;joinReferences:menu_id;"`
models.ControlBy
models.ModelTime
+17 -3
View File
@@ -46,6 +46,8 @@ type SysRoleControl struct {
DataScope string `form:"dataScope"`
SysMenu []models.SysMenu `form:"sysMenu"`
MenuIds []int `form:"menuIds"`
SysDept []models.SysDept `form:"sysDept"`
DeptIds []int `form:"deptIds"`
common.ControlBy
}
@@ -71,6 +73,7 @@ func (s *SysRoleControl) Generate(model *models.SysRole) {
model.Admin = s.Admin
model.DataScope = s.DataScope
model.SysMenu = &s.SysMenu
model.SysDept = s.SysDept
}
@@ -80,8 +83,8 @@ func (s *SysRoleControl) GetId() interface{} {
}
type UpdateStatusReq struct {
RoleId int `form:"roleId" comment:"角色编码"` // 角色编码
Status string `form:"status" comment:"状态"` // 状态
RoleId int `form:"roleId" comment:"角色编码"` // 角色编码
Status string `form:"status" comment:"状态"` // 状态
common.ControlBy
}
@@ -96,6 +99,9 @@ func (s *UpdateStatusReq) GetId() interface{} {
return s.RoleId
}
type SysRoleByName struct {
RoleName string `form:"role"` // 角色编码
}
// SysRoleById 获取单个或者删除的结构体
type SysRoleById struct {
@@ -126,6 +132,14 @@ type RoleDataScopeReq struct {
DeptIds []int `json:"deptIds"`
}
func (s *RoleDataScopeReq) Generate(model *models.SysRole) {
if s.RoleId != 0 {
model.RoleId = s.RoleId
}
model.DataScope = s.DataScope
model.DeptIds = s.DeptIds
}
type DeptIdList struct {
DeptId int `json:"DeptId"`
}
}
+51 -43
View File
@@ -2,6 +2,7 @@ package service
import (
"errors"
"gorm.io/gorm/clause"
"github.com/casbin/casbin/v2"
@@ -152,10 +153,8 @@ func (e *SysRole) Update(c *dto.SysRoleControl, cb *casbin.SyncedEnforcer) error
}
// Remove 删除SysRole
func (e *SysRole) Remove(d *dto.SysRoleById) error {
func (e *SysRole) Remove(c *dto.SysRoleById) error {
var err error
var data models.SysRole
tx := e.Orm.Begin()
defer func() {
if err != nil {
@@ -164,31 +163,21 @@ func (e *SysRole) Remove(d *dto.SysRoleById) error {
tx.Commit()
}
}()
var model = models.SysRole{}
tx.Preload("SysMenu").Preload("SysDept").First(&model, c.GetId())
db := tx.Select(clause.Associations).Delete(&model)
s := SysRoleMenu{}
s.Orm = tx
s.Log = e.Log
for _, roleId := range d.Ids {
err = s.DeleteRoleMenu(tx, roleId)
if err != nil {
e.Log.Errorf("insert role menu error, %", err.Error())
return err
}
}
db := tx.Model(&data).Delete(&data, d.Ids)
if db.Error != nil {
err = db.Error
e.Log.Errorf("Delete error: %s", err)
e.Log.Errorf("db error:%s", err)
return err
}
if db.RowsAffected == 0 {
err = errors.New("无权删除该数据")
return err
return errors.New("无权更新该数据")
}
return nil
}
// 获取角色对应的菜单ids
// GetRoleMenuId 获取角色对应的菜单ids
func (e *SysRole) GetRoleMenuId(roleId int) ([]int, error) {
menuIds := make([]int, 0)
model := models.SysRole{}
@@ -203,7 +192,8 @@ func (e *SysRole) GetRoleMenuId(roleId int) ([]int, error) {
return menuIds, nil
}
func (e *SysRole) UpdateDataScope(c *models.SysRole) (err error) {
func (e *SysRole) UpdateDataScope(c *dto.RoleDataScopeReq) *SysRole {
var err error
tx := e.Orm.Begin()
defer func() {
if err != nil {
@@ -212,36 +202,34 @@ func (e *SysRole) UpdateDataScope(c *models.SysRole) (err error) {
tx.Commit()
}
}()
err = tx.Model(&models.SysRole{}).Where("role_id = ?", c.RoleId).Select("data_scope", "update_by").Updates(c).Error
var dlist = make([]models.SysDept, 0)
var model = models.SysRole{}
tx.Preload("SysDept").First(&model, c.DeptIds)
tx.Where("id in ?", c.DeptIds).Find(&dlist)
err = tx.Model(&model).Association("SysDept").Delete(model.SysDept)
if err != nil {
return err
e.Log.Errorf("delete SysDept error:%s", err)
_ = e.AddError(err)
return e
}
err = tx.Where("role_id = ?", c.RoleId).Delete(&models.SysRoleDept{}).Error
if err != nil {
return err
c.Generate(&model)
model.SysDept = dlist
db := tx.Model(&model).Session(&gorm.Session{FullSaveAssociations: true}).Debug().Save(&model)
if db.Error != nil {
e.Log.Errorf("db error:%s", err)
_ = e.AddError(err)
return e
}
if c.DataScope == "2" {
deptRoles := make([]models.SysRoleDept, len(c.DeptIds))
for i := range c.DeptIds {
deptRoles[i] = models.SysRoleDept{
RoleId: c.RoleId,
DeptId: c.DeptIds[i],
}
}
err = tx.Create(&deptRoles).Error
if err != nil {
return err
}
if db.RowsAffected == 0 {
_ = e.AddError(errors.New("无权更新该数据"))
return e
}
return err
return e
}
// UpdateStatus 修改SysRole对象status
func (e *SysRole) UpdateStatus(c *dto.UpdateStatusReq) error {
var err error
tx := e.Orm.Debug().Begin()
defer func() {
if err != nil {
@@ -254,7 +242,6 @@ func (e *SysRole) UpdateStatus(c *dto.UpdateStatusReq) error {
tx.First(&model, c.GetId())
c.Generate(&model)
db := tx.Session(&gorm.Session{FullSaveAssociations: true}).Debug().Save(&model)
if db.Error != nil {
e.Log.Errorf("db error:%s", err)
return err
@@ -262,6 +249,27 @@ func (e *SysRole) UpdateStatus(c *dto.UpdateStatusReq) error {
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
return nil
}
// Get 获取SysRole对象
func (e *SysRole) GetWithName(d *dto.SysRoleByName, model *models.SysRole) error {
var err error
db := e.Orm.Where("role_name = ?",d.RoleName).First(model)
err = db.Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
err = errors.New("查看对象不存在或无权查看")
e.Log.Errorf("db error:%s", err)
return err
}
if err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
model.MenuIds, err = e.GetRoleMenuId(model.RoleId)
if err != nil {
e.Log.Errorf("get menuIds error, %s", err.Error())
return err
}
return nil
}
+41 -45
View File
@@ -1,11 +1,7 @@
package service
import (
log "github.com/go-admin-team/go-admin-core/logger"
"github.com/go-admin-team/go-admin-core/sdk/service"
"gorm.io/gorm"
"go-admin/app/admin/models"
)
// SysRoleMenu 即将弃用结构体
@@ -71,44 +67,44 @@ type SysRoleMenu struct {
// return
//}
func (e *SysRoleMenu) DeleteRoleMenu(tx *gorm.DB, roleId int) (err error) {
msgID := e.MsgID
err = tx.Where("role_id = ?", roleId).
Delete(&models.SysRoleDept{}).Error
if err != nil {
log.Errorf("msgID[%s] delete role's dept error, %s", msgID, err.Error())
return
}
err = tx.Where("role_id = ?", roleId).
Delete(&models.RoleMenu{}).Error
if err != nil {
log.Errorf("msgID[%s] delete role's menu error, %s", msgID, err.Error())
return
}
var role models.SysRole
err = tx.Where("role_id = ?", roleId).
First(&role).Error
if err != nil {
log.Errorf("msgID[%s] get role error, %s", msgID, err.Error())
return
}
err = tx.Where("v0 = ?", role.RoleKey).
Delete(&models.CasbinRule{}).Error
if err != nil {
log.Errorf("msgID[%s] delete casbin rule error, %s", msgID, err.Error())
return
}
return
}
func (e *SysRoleMenu) GetIDS(tx *gorm.DB, roleName string) ([]models.MenuPath, error) {
var r []models.MenuPath
table := tx.Select("sys_menu.path").Table("sys_role_menu")
table = table.Joins("left join sys_role on sys_role.role_id=sys_role_menu.role_id")
table = table.Joins("left join sys_menu on sys_menu.id=sys_role_menu.menu_id")
table = table.Where("sys_role.role_name = ? and sys_menu.type=1", roleName)
if err := table.Find(&r).Error; err != nil {
return nil, err
}
return r, nil
}
//func (e *SysRoleMenu) DeleteRoleMenu(tx *gorm.DB, roleId int) (err error) {
// msgID := e.MsgID
// err = tx.Where("role_id = ?", roleId).
// Delete(&models.SysRoleDept{}).Error
// if err != nil {
// log.Errorf("msgID[%s] delete role's dept error, %s", msgID, err.Error())
// return
// }
// err = tx.Where("role_id = ?", roleId).
// Delete(&models.RoleMenu{}).Error
// if err != nil {
// log.Errorf("msgID[%s] delete role's menu error, %s", msgID, err.Error())
// return
// }
// var role models.SysRole
// err = tx.Where("role_id = ?", roleId).
// First(&role).Error
// if err != nil {
// log.Errorf("msgID[%s] get role error, %s", msgID, err.Error())
// return
// }
// err = tx.Where("v0 = ?", role.RoleKey).
// Delete(&models.CasbinRule{}).Error
// if err != nil {
// log.Errorf("msgID[%s] delete casbin rule error, %s", msgID, err.Error())
// return
// }
// return
//}
//
//func (e *SysRoleMenu) GetIDS(tx *gorm.DB, roleName string) ([]models.MenuPath, error) {
// var r []models.MenuPath
// table := tx.Select("sys_menu.path").Table("sys_role_menu")
// table = table.Joins("left join sys_role on sys_role.role_id=sys_role_menu.role_id")
// table = table.Joins("left join sys_menu on sys_menu.id=sys_role_menu.menu_id")
// table = table.Where("sys_role.role_name = ? and sys_menu.type=1", roleName)
// if err := table.Find(&r).Error; err != nil {
// return nil, err
// }
// return r, nil
//}