mirror of
https://github.com/go-admin-team/go-admin.git
synced 2026-09-21 10:13:01 +00:00
数据库连接初始化优化
权限部分修改
This commit is contained in:
@@ -51,6 +51,7 @@ type SysRoleControl struct {
|
||||
Remark string `form:"remark" comment:"备注"` // 备注
|
||||
Admin bool `form:"admin" comment:"是否管理员"`
|
||||
DataScope string `form:"dataScope" comment:"是否管理员"`
|
||||
MenuIds []int `json:"menuIds"`
|
||||
}
|
||||
|
||||
// Bind 映射上下文中的结构体数据
|
||||
@@ -86,6 +87,7 @@ func (s *SysRoleControl) Generate() (*system.SysRole, error) {
|
||||
Remark: s.Remark,
|
||||
Admin: s.Admin,
|
||||
DataScope: s.DataScope,
|
||||
MenuIds: s.MenuIds,
|
||||
}, nil
|
||||
}
|
||||
|
||||
@@ -131,4 +133,5 @@ func (s *SysRoleById) GenerateM() (*models.SysRole, error) {
|
||||
type RoleDataScopeReq struct {
|
||||
RoleId int `json:"roleId" binding:"required"`
|
||||
DataScope string `json:"dataScope" binding:"required"`
|
||||
DeptIds []int `json:"deptIds"`
|
||||
}
|
||||
|
||||
@@ -2,12 +2,16 @@ 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"
|
||||
orm "go-admin/common/global"
|
||||
"go-admin/common/log"
|
||||
"go-admin/common/service"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type SysRole struct {
|
||||
@@ -48,35 +52,66 @@ func (e *SysRole) GetSysRole(d *dto.SysRoleById, model *system.SysRole) error {
|
||||
log.Errorf("msgID[%s] db error:%s", msgID, err)
|
||||
return err
|
||||
}
|
||||
if db.Error != nil {
|
||||
if err != nil {
|
||||
log.Errorf("msgID[%s] db error:%s", msgID, err)
|
||||
return err
|
||||
}
|
||||
data.MenuIds, err = e.GetRoleMenuId(data.RoleId)
|
||||
if err != nil {
|
||||
log.Errorf("msgID[%s] get menuIds error, %s", msgID, err.Error())
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// InsertSysRole 创建SysRole对象
|
||||
func (e *SysRole) InsertSysRole(model *system.SysRole) error {
|
||||
func (e *SysRole) InsertSysRole(c *system.SysRole) error {
|
||||
var err error
|
||||
var data system.SysRole
|
||||
msgID := e.MsgID
|
||||
|
||||
err = e.Orm.Model(&data).
|
||||
Create(model).Error
|
||||
tx := e.Orm.Begin()
|
||||
defer func() {
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
} else {
|
||||
tx.Commit()
|
||||
}
|
||||
}()
|
||||
|
||||
err = tx.Model(&data).
|
||||
Create(c).Error
|
||||
if err != nil {
|
||||
log.Errorf("msgID[%s] db error:%s", msgID, err)
|
||||
return err
|
||||
}
|
||||
if len(c.MenuIds) > 0 {
|
||||
s := SysRoleMenu{}
|
||||
s.Orm = e.Orm
|
||||
s.MsgID = msgID
|
||||
err = s.ReloadRule(tx, c.RoleId, c.MenuIds)
|
||||
if err != nil {
|
||||
log.Errorf("msgID[%s] reload casbin rule error, %", msgID, err.Error())
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// UpdateSysRole 修改SysRole对象
|
||||
func (e *SysRole) UpdateSysRole(c *system.SysRole) error {
|
||||
var err error
|
||||
var data system.SysRole
|
||||
msgID := e.MsgID
|
||||
|
||||
db := e.Orm.Model(&data).
|
||||
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 {
|
||||
log.Errorf("msgID[%s] db error:%s", msgID, err)
|
||||
@@ -85,6 +120,23 @@ func (e *SysRole) UpdateSysRole(c *system.SysRole) error {
|
||||
if db.RowsAffected == 0 {
|
||||
return errors.New("无权更新该数据")
|
||||
}
|
||||
|
||||
var t system.RoleMenu
|
||||
err = t.DeleteRoleMenu(tx, c.RoleId)
|
||||
if err != nil {
|
||||
log.Errorf("msgID[%s] delete role menu error, %", msgID, err.Error())
|
||||
return err
|
||||
}
|
||||
if len(c.MenuIds) > 0 {
|
||||
s := SysRoleMenu{}
|
||||
s.Orm = e.Orm
|
||||
s.MsgID = msgID
|
||||
err = s.ReloadRule(tx, c.RoleId, c.MenuIds)
|
||||
if err != nil {
|
||||
log.Errorf("msgID[%s] reload casbin rule error, %", msgID, err.Error())
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -94,7 +146,16 @@ func (e *SysRole) RemoveSysRole(d *dto.SysRoleById) error {
|
||||
var data system.SysRole
|
||||
msgID := e.MsgID
|
||||
|
||||
db := e.Orm.Model(&data).Delete(&data, d.GetId())
|
||||
tx := e.Orm.Begin()
|
||||
defer func() {
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
} else {
|
||||
tx.Commit()
|
||||
}
|
||||
}()
|
||||
|
||||
db := tx.Model(&data).Delete(&data, d.GetId())
|
||||
if db.Error != nil {
|
||||
err = db.Error
|
||||
log.Errorf("MsgID[%s] Delete error: %s", msgID, err)
|
||||
@@ -104,5 +165,67 @@ func (e *SysRole) RemoveSysRole(d *dto.SysRoleById) error {
|
||||
err = errors.New("无权删除该数据")
|
||||
return err
|
||||
}
|
||||
s := SysRoleMenu{}
|
||||
s.Orm = db
|
||||
s.MsgID = msgID
|
||||
err = s.DeleteRoleMenu(tx, d.Id)
|
||||
if err != nil {
|
||||
log.Errorf("msgID[%s] insert role menu error, %", msgID, err.Error())
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// 获取角色对应的菜单ids
|
||||
func (e *SysRole) GetRoleMenuId(roleId int) ([]int, error) {
|
||||
menuIds := make([]int, 0)
|
||||
menuList := make([]models.MenuIdList, 0)
|
||||
if err := orm.Eloquent.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
|
||||
}
|
||||
|
||||
@@ -0,0 +1,113 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"go-admin/app/admin/models"
|
||||
"go-admin/app/admin/models/system"
|
||||
"go-admin/common/log"
|
||||
"go-admin/common/service"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type SysRoleMenu struct {
|
||||
service.Service
|
||||
}
|
||||
|
||||
func (e *SysRoleMenu) ReloadRule(tx *gorm.DB, roleId int, menuId []int) (err error) {
|
||||
var role system.SysRole
|
||||
|
||||
msgID := e.MsgID
|
||||
|
||||
menu := make([]models.Menu, 0)
|
||||
roleMenu := make([]system.RoleMenu, len(menuId))
|
||||
casbinRule := make([]models.CasbinRule, 0)
|
||||
//先删除所有的
|
||||
err = e.DeleteRoleMenu(tx, roleId)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
// 在事务中做一些数据库操作(从这一点使用'tx',而不是'db')
|
||||
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("menu_id in (?)", menuId).
|
||||
//Select("path, action, menu_id, menu_type").
|
||||
Find(&menu).Error
|
||||
if err != nil {
|
||||
log.Errorf("msgID[%s] get menu error, %s", msgID, err.Error())
|
||||
return
|
||||
}
|
||||
for i := range menu {
|
||||
roleMenu[i] = system.RoleMenu{
|
||||
RoleId: role.RoleId,
|
||||
MenuId: menu[i].MenuId,
|
||||
RoleName: role.RoleKey,
|
||||
}
|
||||
if menu[i].MenuType == "A" {
|
||||
casbinRule = append(casbinRule, models.CasbinRule{
|
||||
PType: "p",
|
||||
V0: role.RoleKey,
|
||||
V1: menu[i].Path,
|
||||
V2: menu[i].Action,
|
||||
})
|
||||
}
|
||||
}
|
||||
err = tx.Create(&roleMenu).Error
|
||||
if err != nil {
|
||||
log.Errorf("msgID[%s] batch create role's menu error, %s", msgID, err.Error())
|
||||
return
|
||||
}
|
||||
if len(casbinRule) > 0 {
|
||||
err = tx.Create(&casbinRule).Error
|
||||
if err != nil {
|
||||
log.Errorf("msgID[%s] batch create casbin rule error, %s", msgID, err.Error())
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (e *SysRoleMenu) DeleteRoleMenu(tx *gorm.DB, roleId int) (err error) {
|
||||
msgID := e.MsgID
|
||||
err = tx.Where("role_id = ?", roleId).
|
||||
Delete(&system.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(&system.RoleMenu{}).Error
|
||||
if err != nil {
|
||||
log.Errorf("msgID[%s] delete role's menu error, %s", msgID, err.Error())
|
||||
return
|
||||
}
|
||||
var role system.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) ([]system.MenuPath, error) {
|
||||
var r []system.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
|
||||
}
|
||||
Reference in New Issue
Block a user