mirror of
https://github.com/likeshop-github/likeadmin_go.git
synced 2025-12-24 13:07:57 +08:00
177 lines
5.8 KiB
Go
177 lines
5.8 KiB
Go
package system
|
|
|
|
import (
|
|
"errors"
|
|
"github.com/fatih/structs"
|
|
"gorm.io/gorm"
|
|
"likeadmin/admin/schemas/req"
|
|
"likeadmin/admin/schemas/resp"
|
|
"likeadmin/config"
|
|
"likeadmin/core"
|
|
"likeadmin/core/request"
|
|
"likeadmin/core/response"
|
|
"likeadmin/model/system"
|
|
"likeadmin/util"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
var SystemAuthRoleService = systemAuthRoleService{}
|
|
|
|
//systemAuthRoleService 系统角色服务实现类
|
|
type systemAuthRoleService struct{}
|
|
|
|
//All 角色所有
|
|
func (roleSrv systemAuthRoleService) All() (res []resp.SystemAuthRoleSimpleResp) {
|
|
var roles []system.SystemAuthRole
|
|
if err := core.DB.Order("sort desc, id desc").Find(&roles).Error; err != nil {
|
|
core.Logger.Errorf("All Find err: err=[%+v]", err)
|
|
panic(response.SystemError)
|
|
}
|
|
response.Copy(&res, roles)
|
|
return
|
|
}
|
|
|
|
//List 根据角色ID获取菜单ID
|
|
func (roleSrv systemAuthRoleService) List(page request.PageReq) response.PageResp {
|
|
var res response.PageResp
|
|
response.Copy(&res, page)
|
|
limit := page.PageSize
|
|
offset := page.PageSize * (page.PageNo - 1)
|
|
roleModel := core.DB.Model(&system.SystemAuthRole{})
|
|
var count int64
|
|
if err := roleModel.Count(&count).Error; err != nil {
|
|
core.Logger.Errorf("List Count err: err=[%+v]", err)
|
|
panic(response.SystemError)
|
|
}
|
|
var roles []system.SystemAuthRole
|
|
if err := roleModel.Limit(limit).Offset(offset).Order("sort desc, id desc").Find(&roles).Error; err != nil {
|
|
core.Logger.Errorf("List Find err: err=[%+v]", err)
|
|
panic(response.SystemError)
|
|
}
|
|
var roleResp []resp.SystemAuthRoleResp
|
|
response.Copy(&roleResp, roles)
|
|
for i := 0; i < len(roleResp); i++ {
|
|
roleResp[i].Menus = []uint{}
|
|
roleResp[i].Member = roleSrv.getMemberCnt(roleResp[i].ID)
|
|
}
|
|
return response.PageResp{
|
|
PageNo: page.PageNo,
|
|
PageSize: page.PageSize,
|
|
Count: count,
|
|
Lists: roleResp,
|
|
}
|
|
}
|
|
|
|
//Detail 角色详情
|
|
func (roleSrv systemAuthRoleService) Detail(id uint) (res resp.SystemAuthRoleResp) {
|
|
var role system.SystemAuthRole
|
|
err := core.DB.Where("id = ?", id).Limit(1).First(&role).Error
|
|
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
|
|
panic(response.AssertArgumentError.Make("角色已不存在!"))
|
|
} else if err != nil {
|
|
core.Logger.Errorf("Detail First err: err=[%+v]", err)
|
|
panic(response.SystemError)
|
|
}
|
|
response.Copy(&res, role)
|
|
res.Member = roleSrv.getMemberCnt(role.ID)
|
|
res.Menus = SystemAuthPermService.SelectMenuIdsByRoleId(role.ID)
|
|
return
|
|
}
|
|
|
|
//getMemberCnt 根据角色ID获取成员数量
|
|
func (roleSrv systemAuthRoleService) getMemberCnt(roleId uint) (count int64) {
|
|
core.DB.Model(&system.SystemAuthAdmin{}).Where(
|
|
"role = ? AND is_delete = ?", roleId, 0).Count(&count)
|
|
return
|
|
}
|
|
|
|
//Add 新增角色
|
|
func (roleSrv systemAuthRoleService) Add(addReq req.SystemAuthRoleAddReq) {
|
|
var role system.SystemAuthRole
|
|
if r := core.DB.Where("name = ?", strings.Trim(addReq.Name, " ")).Limit(1).First(&role); r.RowsAffected > 0 {
|
|
panic(response.AssertArgumentError.Make("角色名称已存在!"))
|
|
}
|
|
response.Copy(&role, addReq)
|
|
role.Name = strings.Trim(addReq.Name, " ")
|
|
// 事务
|
|
err := core.DB.Transaction(func(tx *gorm.DB) error {
|
|
txErr := tx.Create(&role).Error
|
|
if txErr != nil {
|
|
core.Logger.Errorf("Add Create err: txErr=[%+v]", txErr)
|
|
return txErr
|
|
}
|
|
SystemAuthPermService.BatchSaveByMenuIds(role.ID, addReq.MenuIds, tx)
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
core.Logger.Errorf("Add Transaction err: err=[%+v]", err)
|
|
panic(response.SystemError)
|
|
}
|
|
}
|
|
|
|
//Edit 编辑角色
|
|
func (roleSrv systemAuthRoleService) Edit(editReq req.SystemAuthRoleEditReq) {
|
|
err := core.DB.Where("id = ?", editReq.ID).Limit(1).First(&system.SystemAuthRole{}).Error
|
|
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
|
|
panic(response.AssertArgumentError.Make("角色已不存在!"))
|
|
} else if err != nil {
|
|
core.Logger.Errorf("Edit First err: err=[%+v]", err)
|
|
panic(response.SystemError)
|
|
}
|
|
var role system.SystemAuthRole
|
|
if r := core.DB.Where("id != ? AND name = ?", editReq.ID, strings.Trim(editReq.Name, " ")).Limit(1).First(&role); r.RowsAffected > 0 {
|
|
panic(response.AssertArgumentError.Make("角色名称已存在!"))
|
|
}
|
|
role.ID = editReq.ID
|
|
roleMap := structs.Map(editReq)
|
|
delete(roleMap, "ID")
|
|
delete(roleMap, "MenuIds")
|
|
roleMap["Name"] = strings.Trim(editReq.Name, " ")
|
|
// 事务
|
|
err = core.DB.Transaction(func(tx *gorm.DB) error {
|
|
txErr := tx.Model(&role).Updates(roleMap).Error
|
|
if txErr != nil {
|
|
core.Logger.Errorf("Edit Updates err: txErr=[%+v]", txErr)
|
|
return txErr
|
|
}
|
|
SystemAuthPermService.BatchDeleteByRoleId(editReq.ID, tx)
|
|
SystemAuthPermService.BatchSaveByMenuIds(editReq.ID, editReq.MenuIds, tx)
|
|
SystemAuthPermService.CacheRoleMenusByRoleId(editReq.ID)
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
core.Logger.Errorf("Edit Transaction err: err=[%+v]", err)
|
|
panic(response.SystemError)
|
|
}
|
|
}
|
|
|
|
//Del 删除角色
|
|
func (roleSrv systemAuthRoleService) Del(id uint) {
|
|
err := core.DB.Where("id = ?", id).Limit(1).First(&system.SystemAuthRole{}).Error
|
|
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
|
|
panic(response.AssertArgumentError.Make("角色已不存在!"))
|
|
} else if err != nil {
|
|
core.Logger.Errorf("Del First err: err=[%+v]", err)
|
|
panic(response.SystemError)
|
|
}
|
|
if r := core.DB.Where("role = ? AND is_delete = ?", id, 0).Limit(1).Find(&system.SystemAuthAdmin{}); r.RowsAffected > 0 {
|
|
panic(response.AssertArgumentError.Make("角色已被管理员使用,请先移除!"))
|
|
}
|
|
// 事务
|
|
err = core.DB.Transaction(func(tx *gorm.DB) error {
|
|
txErr := tx.Delete(&system.SystemAuthRole{}, "id = ?", id).Error
|
|
if txErr != nil {
|
|
core.Logger.Errorf("Del Delete err: txErr=[%+v]", txErr)
|
|
return txErr
|
|
}
|
|
SystemAuthPermService.BatchDeleteByRoleId(id, tx)
|
|
util.RedisUtil.HDel(config.AdminConfig.BackstageRolesKey, strconv.Itoa(int(id)))
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
core.Logger.Errorf("Del Transaction err: err=[%+v]", err)
|
|
panic(response.SystemError)
|
|
}
|
|
}
|