数据库连接初始化优化

权限部分修改
This commit is contained in:
linwenxiang
2021-02-21 14:06:13 +08:00
parent 4979fd659f
commit deeb82048b
37 changed files with 726 additions and 721 deletions
+3
View File
@@ -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"`
}
+131 -8
View File
@@ -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
}
+113
View File
@@ -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
}