Files
go-admin/app/admin/service/sys_role.go
T
2021-03-07 15:37:14 +08:00

225 lines
4.7 KiB
Go

package service
import (
"errors"
"gorm.io/gorm"
"go-admin/app/admin/models"
"go-admin/app/admin/models/system"
"go-admin/app/admin/service/dto"
cDto "go-admin/common/dto"
"go-admin/common/service"
)
type SysRole struct {
service.Service
}
// GetSysRolePage 获取SysRole列表
func (e *SysRole) GetSysRolePage(c *dto.SysRoleSearch, list *[]system.SysRole, count *int64) error {
var err error
var data system.SysRole
err = e.Orm.Model(&data).
Scopes(
cDto.MakeCondition(c.GetNeedSearch()),
cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
).
Find(list).Limit(-1).Offset(-1).
Count(count).Error
if err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
return nil
}
// GetSysRole 获取SysRole对象
func (e *SysRole) GetSysRole(d *dto.SysRoleById, model *system.SysRole) error {
var err error
db := e.Orm.First(model, d.GetId())
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(e.Orm, model.RoleId)
if err != nil {
e.Log.Errorf("get menuIds error, %s", err.Error())
return err
}
return nil
}
// InsertSysRole 创建SysRole对象
func (e *SysRole) InsertSysRole(c *system.SysRole) error {
var err error
var data system.SysRole
tx := e.Orm.Begin()
defer func() {
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
err = tx.Model(&data).
Create(c).Error
if err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
if len(c.MenuIds) > 0 {
s := SysRoleMenu{}
s.Orm = e.Orm
s.Log = e.Log
err = s.ReloadRule(tx, c.RoleId, c.MenuIds)
if err != nil {
e.Log.Errorf("reload casbin rule error, %", err.Error())
return err
}
}
return nil
}
// UpdateSysRole 修改SysRole对象
func (e *SysRole) UpdateSysRole(c *system.SysRole) error {
var err error
tx := e.Orm.Debug().Begin()
defer func() {
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
db := tx.Model(&c).
Where(c.GetId()).Updates(c)
if db.Error != nil {
e.Log.Errorf("db error:%s", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
var t system.RoleMenu
err = t.DeleteRoleMenu(tx, c.RoleId)
if err != nil {
e.Log.Errorf("delete role menu error, %", err.Error())
return err
}
if len(c.MenuIds) > 0 {
s := SysRoleMenu{}
s.Orm = e.Orm
s.Log = e.Log
err = s.ReloadRule(tx, c.RoleId, c.MenuIds)
if err != nil {
e.Log.Errorf("reload casbin rule error, %", err.Error())
return err
}
}
return nil
}
// RemoveSysRole 删除SysRole
func (e *SysRole) RemoveSysRole(d *dto.SysRoleById) error {
var err error
var data system.SysRole
tx := e.Orm.Begin()
defer func() {
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
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)
return err
}
if db.RowsAffected == 0 {
err = errors.New("无权删除该数据")
return err
}
return nil
}
// 获取角色对应的菜单ids
func (e *SysRole) GetRoleMenuId(tx *gorm.DB, roleId int) ([]int, error) {
menuIds := make([]int, 0)
menuList := make([]models.MenuIdList, 0)
if err := tx.Table("sys_role_menu").
Select("sys_role_menu.menu_id").
Where("role_id = ? ", roleId).
Where(" sys_role_menu.menu_id not in(select sys_menu.parent_id from sys_role_menu "+
"LEFT JOIN sys_menu on sys_menu.menu_id=sys_role_menu.menu_id where role_id =? and parent_id is not null)", roleId).
Find(&menuList).Error; err != nil {
return nil, err
}
for i := 0; i < len(menuList); i++ {
menuIds = append(menuIds, menuList[i].MenuId)
}
return menuIds, nil
}
func (e *SysRole) UpdateDataScope(c *system.SysRole) (err error) {
tx := e.Orm.Begin()
defer func() {
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
err = tx.Model(&system.SysRole{}).Where("role_id = ?", c.RoleId).Select("data_scope, update_by").Updates(c).Error
if err != nil {
return err
}
err = tx.Where("role_id = ?", c.RoleId).Delete(&system.SysRoleDept{}).Error
if err != nil {
return err
}
if c.DataScope == "2" {
deptRoles := make([]system.SysRoleDept, len(c.DeptIds))
for i := range c.DeptIds {
deptRoles[i] = system.SysRoleDept{
RoleId: c.RoleId,
DeptId: c.DeptIds[i],
}
}
err = tx.Create(&deptRoles).Error
if err != nil {
return err
}
}
return err
}