diff --git a/GQA-BACKEND/service/private/api.go b/GQA-BACKEND/service/private/api.go index e16f9e5..9b95099 100644 --- a/GQA-BACKEND/service/private/api.go +++ b/GQA-BACKEND/service/private/api.go @@ -5,6 +5,7 @@ import ( "github.com/Junvary/gin-quasar-admin/GQA-BACKEND/global" "github.com/Junvary/gin-quasar-admin/GQA-BACKEND/model" "github.com/Junvary/gin-quasar-admin/GQA-BACKEND/utils" + "gorm.io/gorm" ) type ServiceApi struct{} @@ -33,8 +34,31 @@ func (s *ServiceApi) EditApi(toEditApi model.SysApi) (err error) { if toEditApi.Stable == "yesNo_yes" { return errors.New(utils.GqaI18n("StableCantDo")) } - err = global.GqaDb.Save(&toEditApi).Error - return err + return global.GqaDb.Transaction(func(tx *gorm.DB) error { + var oldApi model.SysApi + if err = tx.Where("id = ?", toEditApi.Id).First(&oldApi).Error; err != nil { + return err + } + if err = tx.Save(&toEditApi).Error; err != nil { + return err + } + var oldRoleApiList []model.SysRoleApi + if err = tx.Where("api_group = ? and api_method = ? and api_path = ?", oldApi.ApiGroup, oldApi.ApiMethod, oldApi.ApiPath). + Find(&oldRoleApiList).Error; err != nil { + return err + } + // 将oldRoleApiList中的ApiGroup、ApiMethod、ApiPath替换成toEditApi中的ApiGroup、ApiMethod、ApiPath并保存回数据库 + for _, oldRoleApi := range oldRoleApiList { + oldRoleApi.ApiGroup = toEditApi.ApiGroup + oldRoleApi.ApiMethod = toEditApi.ApiMethod + oldRoleApi.ApiPath = toEditApi.ApiPath + if err = tx.Where("api_group = ? and api_method = ? and api_path = ?", oldApi.ApiGroup, oldApi.ApiMethod, oldApi.ApiPath). + Updates(&oldRoleApi).Error; err != nil { + return err + } + } + return nil + }) } func (s *ServiceApi) AddApi(toAddApi model.SysApi) (err error) { @@ -50,8 +74,16 @@ func (s *ServiceApi) DeleteApiById(id uint) (err error) { if sysApi.Stable == "yesNo_yes" { return errors.New(utils.GqaI18n("StableCantDo")) } - err = global.GqaDb.Where("id = ?", id).Unscoped().Delete(&sysApi).Error - return err + return global.GqaDb.Transaction(func(tx *gorm.DB) error { + if err = tx.Where("id = ?", id).Unscoped().Delete(&sysApi).Error; err != nil { + return err + } + if err = tx.Where("api_group = ? and api_method = ? and api_path = ?", sysApi.ApiGroup, sysApi.ApiMethod, sysApi.ApiPath). + Delete(&model.SysRoleApi{}).Error; err != nil { + return err + } + return nil + }) } func (s *ServiceApi) QueryApiById(id uint) (err error, apiInfo model.SysApi) { diff --git a/GQA-BACKEND/service/private/dept.go b/GQA-BACKEND/service/private/dept.go index 85fadc8..33d748d 100644 --- a/GQA-BACKEND/service/private/dept.go +++ b/GQA-BACKEND/service/private/dept.go @@ -48,10 +48,6 @@ func (s *ServiceDept) EditDept(toEditDept model.SysDept) (err error) { if err = global.GqaDb.Where("id = ?", toEditDept.Id).First(&sysDept).Error; err != nil { return err } - if sysDept.Stable == "yesNo_yes" { - return errors.New(utils.GqaI18n("StableCantDo") + toEditDept.DeptCode) - } - //err = global.GqaDb.Updates(&toEditDept).Error err = global.GqaDb.Save(&toEditDept).Error return err } @@ -66,24 +62,26 @@ func (s *ServiceDept) AddDept(toAddDept model.SysDept) (err error) { } func (s *ServiceDept) DeleteDeptById(id uint) (err error) { - var sysDept model.SysDept - if err = global.GqaDb.Where("id = ?", id).First(&sysDept).Error; err != nil { - return err - } - if sysDept.Stable == "yesNo_yes" { - return errors.New(utils.GqaI18n("StableCantDo") + sysDept.DeptCode) - } - if err = global.GqaDb.Where("id = ?", id).Unscoped().Delete(&sysDept).Error; err != nil { + return global.GqaDb.Transaction(func(tx *gorm.DB) error { + var sysDept model.SysDept + if err = tx.Where("id = ?", id).First(&sysDept).Error; err != nil { + return err + } + if err = tx.Where("id = ?", id).Unscoped().Delete(&sysDept).Error; err != nil { + return err + } + var sysDeptUser model.SysDeptUser + err = tx.Where("sys_dept_dept_code = ?", sysDept.DeptCode).Delete(&sysDeptUser).Error return err - } - var sysDeptUser model.SysDeptUser - err = global.GqaDb.Where("sys_dept_dept_code = ?", sysDept.DeptCode).Delete(&sysDeptUser).Error - return err + }) } func (s *ServiceDept) QueryDeptById(id uint) (err error, deptInfo model.SysDept) { var dept model.SysDept - err = global.GqaDb.Preload("LeaderUser").Preload("CreatedByUser").Preload("UpdatedByUser").First(&dept, "id = ?", id).Error + err = global.GqaDb.Preload("LeaderUser"). + Preload("CreatedByUser"). + Preload("UpdatedByUser"). + First(&dept, "id = ?", id).Error return err, dept } @@ -98,7 +96,9 @@ func (s *ServiceDept) QueryUserByDept(deptCode *model.RequestDeptCode) (err erro func (s *ServiceDept) RemoveDeptUser(toDeleteDeptUser *model.RequestDeptUser) (err error) { var deptUser model.SysDeptUser - err = global.GqaDb.Where("sys_dept_dept_code = ? and sys_user_username = ?", toDeleteDeptUser.DeptCode, toDeleteDeptUser.Username).Delete(&deptUser).Error + err = global.GqaDb. + Where("sys_dept_dept_code = ? and sys_user_username = ?", toDeleteDeptUser.DeptCode, toDeleteDeptUser.Username). + Delete(&deptUser).Error return err } diff --git a/GQA-BACKEND/service/private/menu.go b/GQA-BACKEND/service/private/menu.go index fdfba20..e30175d 100644 --- a/GQA-BACKEND/service/private/menu.go +++ b/GQA-BACKEND/service/private/menu.go @@ -5,6 +5,7 @@ import ( "github.com/Junvary/gin-quasar-admin/GQA-BACKEND/global" "github.com/Junvary/gin-quasar-admin/GQA-BACKEND/model" "github.com/Junvary/gin-quasar-admin/GQA-BACKEND/utils" + "gorm.io/gorm" ) type ServiceMenu struct{} @@ -50,13 +51,15 @@ func (s *ServiceMenu) EditMenu(toEditMenu model.SysMenu) (err error) { if sysMenu.Stable == "yesNo_yes" { return errors.New(utils.GqaI18n("StableCantDo") + toEditMenu.Title) } - //先删除关联button表中menu_name的记录 - var menuButton model.SysButton - if err = global.GqaDb.Where("menu_name = ?", toEditMenu.Name).Delete(&menuButton).Error; err != nil { + return global.GqaDb.Transaction(func(tx *gorm.DB) error { + //先删除关联button表中menu_name的记录 + var menuButton model.SysButton + if err = tx.Where("menu_name = ?", toEditMenu.Name).Delete(&menuButton).Error; err != nil { + return err + } + err = tx.Save(&toEditMenu).Error return err - } - err = global.GqaDb.Save(&toEditMenu).Error - return err + }) } func (s *ServiceMenu) AddMenu(toAddMenu model.SysMenu) (err error) { @@ -72,8 +75,18 @@ func (s *ServiceMenu) DeleteMenuById(id uint) (err error) { if sysMenu.Stable == "yesNo_yes" { return errors.New(utils.GqaI18n("StableCantDo") + sysMenu.Title) } - err = global.GqaDb.Where("id = ?", id).Unscoped().Delete(&sysMenu).Error - return err + return global.GqaDb.Transaction(func(tx *gorm.DB) error { + if err = tx.Where("id = ?", id).Unscoped().Delete(&sysMenu).Error; err != nil { + return err + } + if err = tx.Where("sys_menu_name = ?", sysMenu.Name).Delete(&model.SysRoleMenu{}).Error; err != nil { + return err + } + if err = tx.Where("menu_name = ?", sysMenu.Name).Delete(&model.SysButton{}).Error; err != nil { + return err + } + return nil + }) } func (s *ServiceMenu) QueryMenuById(id uint) (err error, menuInfo model.SysMenu) { diff --git a/GQA-BACKEND/service/private/role.go b/GQA-BACKEND/service/private/role.go index 4abe3d5..10a7672 100644 --- a/GQA-BACKEND/service/private/role.go +++ b/GQA-BACKEND/service/private/role.go @@ -37,7 +37,11 @@ func (s *ServiceRole) EditRole(toEditRole model.SysRole) (err error) { return err } if sysRole.Stable == "yesNo_yes" { - return errors.New(utils.GqaI18n("StableCantDo") + toEditRole.RoleCode) + return errors.New(utils.GqaI18n("StableCantDo") + sysRole.RoleCode) + } + //不允许改变RoleCode + if sysRole.RoleCode != toEditRole.RoleCode { + return errors.New(utils.GqaI18n("EditFailed") + sysRole.RoleCode) } //err = global.GqaDb.Updates(&toEditRole).Error err = global.GqaDb.Save(&toEditRole).Error @@ -61,25 +65,30 @@ func (s *ServiceRole) DeleteRoleById(id uint) (err error) { if sysRole.Stable == "yesNo_yes" { return errors.New(utils.GqaI18n("StableCantDo") + sysRole.RoleCode) } - roleCode := sysRole.RoleCode - // 删除 sys_role_api 表的权限 - err = global.GqaDb.Where("role_code = ?", roleCode).Delete(model.SysRoleApi{}).Error - // 删除 sys_role 表的数据 - err = global.GqaDb.Unscoped().Delete(&sysRole).Error - if err != nil { - return err - } - // 删除 sys_user_role 表的对应关系 - err = global.GqaDb.Where("sys_role_role_code = ?", roleCode).Delete(&model.SysUserRole{}).Error - if err != nil { - return err - } - // 删除 sys_role_menu 表的对应关系 - err = global.GqaDb.Where("sys_role_role_code = ?", roleCode).Delete(&model.SysRoleMenu{}).Error - if err != nil { - return err - } - return err + return global.GqaDb.Transaction(func(tx *gorm.DB) error { + roleCode := sysRole.RoleCode + // 删除 sys_role 表的数据 + if err = tx.Unscoped().Delete(&sysRole).Error; err != nil { + return err + } + // 删除 sys_role_api 表的权限 + if err = tx.Where("role_code = ?", roleCode).Delete(model.SysRoleApi{}).Error; err != nil { + return err + } + // 删除 sys_user_role 表的对应关系 + if err = tx.Where("sys_role_role_code = ?", roleCode).Delete(&model.SysUserRole{}).Error; err != nil { + return err + } + // 删除 sys_role_menu 表的对应关系 + if err = tx.Where("sys_role_role_code = ?", roleCode).Delete(&model.SysRoleMenu{}).Error; err != nil { + return err + } + // 删除sys_role_button 表的对应关系 + if err = tx.Where("sys_role_role_code = ?", roleCode).Delete(&model.SysRoleButton{}).Error; err != nil { + return err + } + return nil + }) } func (s *ServiceRole) QueryRoleById(id uint) (err error, roleInfo model.SysRole) { @@ -95,29 +104,31 @@ func (s *ServiceRole) GetRoleMenuList(roleCode *model.RequestRoleCode) (err erro } func (s *ServiceRole) EditRoleMenu(toEditRoleMenu *model.RequestRoleMenuEdit) (err error) { - err = global.GqaDb.Where("sys_role_role_code=?", toEditRoleMenu.RoleCode).Delete(&model.SysRoleMenu{}).Error - if err != nil { - return err - } - err = global.GqaDb.Where("sys_role_role_code=?", toEditRoleMenu.RoleCode).Delete(&model.SysRoleButton{}).Error - if err != nil { - return err - } - if len(toEditRoleMenu.RoleMenu) != 0 { - err = global.GqaDb.Model(&model.SysRoleMenu{}).Create(&toEditRoleMenu.RoleMenu).Error - if err != nil { + return global.GqaDb.Transaction(func(tx *gorm.DB) error { + if err = tx.Where("sys_role_role_code=?", toEditRoleMenu.RoleCode).Delete(&model.SysRoleMenu{}).Error; err != nil { return err } - } - if len(toEditRoleMenu.RoleButton) != 0 { - err = global.GqaDb.Model(&model.SysRoleButton{}).Create(&toEditRoleMenu.RoleButton).Error - if err != nil { + if err = tx.Where("sys_role_role_code=?", toEditRoleMenu.RoleCode).Delete(&model.SysRoleButton{}).Error; err != nil { return err } - } - defaultPage := toEditRoleMenu.DefaultPage - err = global.GqaDb.Model(&model.SysRole{}).Where("role_code = ?", toEditRoleMenu.RoleCode).Update("default_page", defaultPage).Error - return nil + if len(toEditRoleMenu.RoleMenu) != 0 { + err = tx.Model(&model.SysRoleMenu{}).Create(&toEditRoleMenu.RoleMenu).Error + if err != nil { + return err + } + } + if len(toEditRoleMenu.RoleButton) != 0 { + err = tx.Model(&model.SysRoleButton{}).Create(&toEditRoleMenu.RoleButton).Error + if err != nil { + return err + } + } + defaultPage := toEditRoleMenu.DefaultPage + err = tx.Model(&model.SysRole{}). + Where("role_code = ?", toEditRoleMenu.RoleCode). + Update("default_page", defaultPage).Error + return err + }) } func (s *ServiceRole) GetRoleApiList(roleCode *model.RequestRoleCode) (err error, api []model.SysRoleApi) { @@ -127,13 +138,16 @@ func (s *ServiceRole) GetRoleApiList(roleCode *model.RequestRoleCode) (err error } func (s *ServiceRole) EditRoleApi(toEditRoleApi *model.RequestEditRoleApi) (err error) { - err = global.GqaDb.Where("role_code = ?", toEditRoleApi.RoleCode).Delete(&model.SysRoleApi{}).Error - - if len(toEditRoleApi.RoleApi) != 0 { - err = global.GqaDb.Model(&model.SysRoleApi{}).Create(&toEditRoleApi.RoleApi).Error - return err - } - return nil + return global.GqaDb.Transaction(func(tx *gorm.DB) error { + if err = tx.Where("role_code = ?", toEditRoleApi.RoleCode).Delete(&model.SysRoleApi{}).Error; err != nil { + return err + } + if len(toEditRoleApi.RoleApi) != 0 { + err = tx.Model(&model.SysRoleApi{}).Create(&toEditRoleApi.RoleApi).Error + return err + } + return nil + }) } func (s *ServiceRole) QueryUserByRole(roleCode *model.RequestRoleCode) (err error, user []model.SysUser) { @@ -150,7 +164,9 @@ func (s *ServiceRole) RemoveRoleUser(toRemoveRoleUser *model.RequestRoleUser) (e if toRemoveRoleUser.Username == "admin" && toRemoveRoleUser.RoleCode == "super-admin" { return errors.New(utils.GqaI18n("CantRemoveAdminFromAdmin")) } - err = global.GqaDb.Where("sys_role_role_code = ? and sys_user_username = ?", toRemoveRoleUser.RoleCode, toRemoveRoleUser.Username).Delete(&roleUser).Error + err = global.GqaDb. + Where("sys_role_role_code = ? and sys_user_username = ?", toRemoveRoleUser.RoleCode, toRemoveRoleUser.Username). + Delete(&roleUser).Error return err } diff --git a/GQA-BACKEND/service/private/user.go b/GQA-BACKEND/service/private/user.go index 581e45f..23f95a0 100644 --- a/GQA-BACKEND/service/private/user.go +++ b/GQA-BACKEND/service/private/user.go @@ -48,14 +48,18 @@ func (s *ServiceUser) EditUser(toEditUser model.SysUser) (err error) { if sysUser.Stable == "yesNo_yes" { return errors.New(utils.GqaI18n("StableCantDo") + toEditUser.Username) } - global.GqaDb.Where("sys_user_username = ?", toEditUser.Username).Delete(&model.SysDeptUser{}) - if err = global.GqaDb.Where("id = ?", toEditUser.Id).First(&sysUser).Error; err != nil { + return global.GqaDb.Transaction(func(tx *gorm.DB) error { + if err = tx.Where("sys_user_username = ?", toEditUser.Username).Delete(&model.SysDeptUser{}).Error; err != nil { + return err + } + if err = tx.Where("id = ?", toEditUser.Id).First(&sysUser).Error; err != nil { + return err + } + toEditUser.Password = sysUser.Password + //err = global.GqaDb.Updates(&toEditUser).Error + err = tx.Save(&toEditUser).Error return err - } - toEditUser.Password = sysUser.Password - //err = global.GqaDb.Updates(&toEditUser).Error - err = global.GqaDb.Save(&toEditUser).Error - return err + }) } func (s *ServiceUser) AddUser(toAddUser *model.SysUser) (err error) { @@ -83,16 +87,18 @@ func (s *ServiceUser) DeleteUserById(id uint) (err error) { if sysUser.Stable == "yesNo_yes" { return errors.New(utils.GqaI18n("StableCantDo") + sysUser.Username) } - if err = global.GqaDb.Where("id = ?", id).Unscoped().Delete(&sysUser).Error; err != nil { - return err - } - var sysDeptUser model.SysDeptUser - if err = global.GqaDb.Where("sys_user_username = ?", sysUser.Username).Delete(&sysDeptUser).Error; err != nil { + return global.GqaDb.Transaction(func(tx *gorm.DB) error { + if err = tx.Where("id = ?", id).Unscoped().Delete(&sysUser).Error; err != nil { + return err + } + var sysDeptUser model.SysDeptUser + if err = tx.Where("sys_user_username = ?", sysUser.Username).Delete(&sysDeptUser).Error; err != nil { + return err + } + var sysUserRole model.SysUserRole + err = tx.Where("sys_user_username = ?", sysUser.Username).Delete(&sysUserRole).Error return err - } - var sysUserRole model.SysUserRole - err = global.GqaDb.Where("sys_user_username = ?", sysUser.Username).Delete(&sysUserRole).Error - return err + }) } func (s *ServiceUser) GetUserByUsername(username string) (err error, userInfo model.SysUser) { diff --git a/GQA-FRONTEND/src/config/config.js b/GQA-FRONTEND/src/config/config.js index 0df0340..74f1f83 100644 --- a/GQA-FRONTEND/src/config/config.js +++ b/GQA-FRONTEND/src/config/config.js @@ -1,13 +1,6 @@ -export const DemoMode = false -export const AllowList = [ - '/login', - '/new-tab/add-ywd' -] -export const GqaConsoleLogo = () => { - console.info('Welcome to Gin-Quasar-Admin!') - console.info('Github: https://github.com/Junvary/gin-quasar-admin ') - console.info('Expecting Your Star!') -} +// 演示模式开关 +export const DemoMode = true +// 演示模式禁止的API export const ForbiddenUrl = [ 'user/edit-user', 'user/delete-user-by-id', @@ -40,4 +33,15 @@ export const ForbiddenUrl = [ 'user-online/kick-online-user', 'cron/start-cron', 'cron/stop-cron' -] \ No newline at end of file +] +// 路由白名单 +export const AllowList = [ + '/login', + '/new-tab/add-ywd' +] +// 控制台打印内容 +export const GqaConsoleLogo = () => { + console.info('Welcome to Gin-Quasar-Admin!') + console.info('Github: https://github.com/Junvary/gin-quasar-admin ') + console.info('Expecting Your Star!') +} diff --git a/GQA-FRONTEND/src/pages/System/Role/modules/recordDetail.vue b/GQA-FRONTEND/src/pages/System/Role/modules/recordDetail.vue index 69f8eae..bfe6019 100644 --- a/GQA-FRONTEND/src/pages/System/Role/modules/recordDetail.vue +++ b/GQA-FRONTEND/src/pages/System/Role/modules/recordDetail.vue @@ -13,11 +13,10 @@ + :label="($t('Role') + $t('Name'))" :rules="[val => val && val.length > 0 || $t('NeetInput')]" />