任务三
This commit is contained in:
@@ -0,0 +1,269 @@
|
||||
package system
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
|
||||
"kra/internal/biz/system"
|
||||
"kra/internal/data/model"
|
||||
"kra/internal/data/query"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type authorityRepo struct {
|
||||
db *gorm.DB
|
||||
}
|
||||
|
||||
// NewAuthorityRepo 创建角色仓储
|
||||
func NewAuthorityRepo(db *gorm.DB) system.AuthorityRepo {
|
||||
return &authorityRepo{db: db}
|
||||
}
|
||||
|
||||
func (r *authorityRepo) Create(ctx context.Context, auth *system.Authority) error {
|
||||
m := &model.SysAuthority{
|
||||
AuthorityID: int64(auth.AuthorityId),
|
||||
AuthorityName: &auth.AuthorityName,
|
||||
DefaultRouter: &auth.DefaultRouter,
|
||||
}
|
||||
if auth.ParentId != nil {
|
||||
parentId := int64(*auth.ParentId)
|
||||
m.ParentID = &parentId
|
||||
}
|
||||
return r.db.WithContext(ctx).Create(m).Error
|
||||
}
|
||||
|
||||
func (r *authorityRepo) Update(ctx context.Context, auth *system.Authority) error {
|
||||
updates := map[string]any{
|
||||
"authority_name": auth.AuthorityName,
|
||||
"default_router": auth.DefaultRouter,
|
||||
}
|
||||
if auth.ParentId != nil {
|
||||
updates["parent_id"] = *auth.ParentId
|
||||
}
|
||||
return r.db.WithContext(ctx).Model(&model.SysAuthority{}).
|
||||
Where("authority_id = ?", auth.AuthorityId).
|
||||
Updates(updates).Error
|
||||
}
|
||||
|
||||
func (r *authorityRepo) Delete(ctx context.Context, authorityId uint) error {
|
||||
return r.db.WithContext(ctx).Unscoped().
|
||||
Where("authority_id = ?", authorityId).
|
||||
Delete(&model.SysAuthority{}).Error
|
||||
}
|
||||
|
||||
func (r *authorityRepo) FindByID(ctx context.Context, authorityId uint) (*system.Authority, error) {
|
||||
m, err := query.SysAuthority.WithContext(ctx).
|
||||
Where(query.SysAuthority.AuthorityID.Eq(int64(authorityId))).First()
|
||||
if err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, nil
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
return toBizAuthority(m), nil
|
||||
}
|
||||
|
||||
func (r *authorityRepo) FindByIDWithDataAuthority(ctx context.Context, authorityId uint) (*system.AuthorityFull, error) {
|
||||
m, err := query.SysAuthority.WithContext(ctx).
|
||||
Where(query.SysAuthority.AuthorityID.Eq(int64(authorityId))).First()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 获取数据权限
|
||||
var dataAuthIds []model.SysDataAuthorityID
|
||||
r.db.WithContext(ctx).Where("sys_authority_authority_id = ?", authorityId).Find(&dataAuthIds)
|
||||
|
||||
var dataAuthorities []*system.Authority
|
||||
for _, da := range dataAuthIds {
|
||||
auth, _ := r.FindByID(ctx, uint(da.DataAuthorityIDAuthorityID))
|
||||
if auth != nil {
|
||||
dataAuthorities = append(dataAuthorities, auth)
|
||||
}
|
||||
}
|
||||
|
||||
return &system.AuthorityFull{
|
||||
Authority: *toBizAuthority(m),
|
||||
DataAuthorityId: dataAuthorities,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (r *authorityRepo) FindByParentID(ctx context.Context, parentId uint) ([]*system.AuthorityFull, error) {
|
||||
list, err := query.SysAuthority.WithContext(ctx).
|
||||
Where(query.SysAuthority.ParentID.Eq(int64(parentId))).Find()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
result := make([]*system.AuthorityFull, len(list))
|
||||
for i, m := range list {
|
||||
// 获取数据权限
|
||||
var dataAuthIds []model.SysDataAuthorityID
|
||||
r.db.WithContext(ctx).Where("sys_authority_authority_id = ?", m.AuthorityID).Find(&dataAuthIds)
|
||||
|
||||
var dataAuthorities []*system.Authority
|
||||
for _, da := range dataAuthIds {
|
||||
auth, _ := r.FindByID(ctx, uint(da.DataAuthorityIDAuthorityID))
|
||||
if auth != nil {
|
||||
dataAuthorities = append(dataAuthorities, auth)
|
||||
}
|
||||
}
|
||||
|
||||
result[i] = &system.AuthorityFull{
|
||||
Authority: *toBizAuthority(m),
|
||||
DataAuthorityId: dataAuthorities,
|
||||
}
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (r *authorityRepo) FindChildren(ctx context.Context, authorityId uint) ([]*system.AuthorityFull, error) {
|
||||
return r.FindByParentID(ctx, authorityId)
|
||||
}
|
||||
|
||||
func (r *authorityRepo) HasUsers(ctx context.Context, authorityId uint) (bool, error) {
|
||||
var count int64
|
||||
err := r.db.WithContext(ctx).Model(&model.SysUserAuthority{}).
|
||||
Where("sys_authority_authority_id = ?", authorityId).Count(&count).Error
|
||||
return count > 0, err
|
||||
}
|
||||
|
||||
func (r *authorityRepo) HasChildren(ctx context.Context, authorityId uint) (bool, error) {
|
||||
count, err := query.SysAuthority.WithContext(ctx).
|
||||
Where(query.SysAuthority.ParentID.Eq(int64(authorityId))).Count()
|
||||
return count > 0, err
|
||||
}
|
||||
|
||||
func (r *authorityRepo) GetParentAuthorityID(ctx context.Context, authorityId uint) (uint, error) {
|
||||
m, err := query.SysAuthority.WithContext(ctx).
|
||||
Where(query.SysAuthority.AuthorityID.Eq(int64(authorityId))).First()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
if m.ParentID == nil {
|
||||
return 0, nil
|
||||
}
|
||||
return uint(*m.ParentID), nil
|
||||
}
|
||||
|
||||
func (r *authorityRepo) SetDataAuthority(ctx context.Context, authorityId uint, dataAuthorityIds []uint) error {
|
||||
return r.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
|
||||
// 删除旧的数据权限
|
||||
if err := tx.Where("sys_authority_authority_id = ?", authorityId).
|
||||
Delete(&model.SysDataAuthorityID{}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 创建新的数据权限
|
||||
for _, daId := range dataAuthorityIds {
|
||||
da := &model.SysDataAuthorityID{
|
||||
SysAuthorityAuthorityID: int64(authorityId),
|
||||
DataAuthorityIDAuthorityID: int64(daId),
|
||||
}
|
||||
if err := tx.Create(da).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
func (r *authorityRepo) SetMenuAuthority(ctx context.Context, authorityId uint, menuIds []uint) error {
|
||||
return r.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
|
||||
// 删除旧的菜单权限
|
||||
if err := tx.Where("sys_authority_authority_id = ?", authorityId).
|
||||
Delete(&model.SysAuthorityMenu{}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 创建新的菜单权限
|
||||
for _, menuId := range menuIds {
|
||||
am := &model.SysAuthorityMenu{
|
||||
SysAuthorityAuthorityID: int64(authorityId),
|
||||
SysBaseMenuID: int64(menuId),
|
||||
}
|
||||
if err := tx.Create(am).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
func (r *authorityRepo) GetMenuIds(ctx context.Context, authorityId uint) ([]uint, error) {
|
||||
var menus []model.SysAuthorityMenu
|
||||
if err := r.db.WithContext(ctx).Where("sys_authority_authority_id = ?", authorityId).
|
||||
Find(&menus).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ids := make([]uint, len(menus))
|
||||
for i, m := range menus {
|
||||
ids[i] = uint(m.SysBaseMenuID)
|
||||
}
|
||||
return ids, nil
|
||||
}
|
||||
|
||||
func (r *authorityRepo) CopyAuthorityBtns(ctx context.Context, oldAuthorityId, newAuthorityId uint) error {
|
||||
var btns []model.SysAuthorityBtn
|
||||
if err := r.db.WithContext(ctx).Where("authority_id = ?", oldAuthorityId).
|
||||
Find(&btns).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if len(btns) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
newAuthorityIdInt64 := int64(newAuthorityId)
|
||||
for i := range btns {
|
||||
btns[i].AuthorityID = &newAuthorityIdInt64
|
||||
}
|
||||
|
||||
return r.db.WithContext(ctx).Create(&btns).Error
|
||||
}
|
||||
|
||||
func (r *authorityRepo) DeleteAuthorityRelations(ctx context.Context, authorityId uint) error {
|
||||
return r.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
|
||||
// 删除菜单权限
|
||||
if err := tx.Where("sys_authority_authority_id = ?", authorityId).
|
||||
Delete(&model.SysAuthorityMenu{}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 删除数据权限
|
||||
if err := tx.Where("sys_authority_authority_id = ?", authorityId).
|
||||
Delete(&model.SysDataAuthorityID{}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 删除用户角色关联
|
||||
if err := tx.Where("sys_authority_authority_id = ?", authorityId).
|
||||
Delete(&model.SysUserAuthority{}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 删除按钮权限
|
||||
if err := tx.Where("authority_id = ?", authorityId).
|
||||
Delete(&model.SysAuthorityBtn{}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
// 转换函数
|
||||
func toBizAuthority(m *model.SysAuthority) *system.Authority {
|
||||
auth := &system.Authority{
|
||||
AuthorityId: uint(m.AuthorityID),
|
||||
AuthorityName: safeString(m.AuthorityName),
|
||||
DefaultRouter: safeString(m.DefaultRouter),
|
||||
}
|
||||
if m.ParentID != nil {
|
||||
parentId := uint(*m.ParentID)
|
||||
auth.ParentId = &parentId
|
||||
}
|
||||
return auth
|
||||
}
|
||||
@@ -249,6 +249,40 @@ func (r *menuRepo) FindBaseMenuByID(ctx context.Context, id uint) (*system.BaseM
|
||||
return toBizBaseMenu(&menu, params, btns), nil
|
||||
}
|
||||
|
||||
// FindBaseMenuByName 根据名称获取基础菜单
|
||||
func (r *menuRepo) FindBaseMenuByName(ctx context.Context, name string) (*system.BaseMenu, error) {
|
||||
var menu model.SysBaseMenu
|
||||
if err := r.db.WithContext(ctx).Where("name = ?", name).First(&menu).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return toBizBaseMenu(&menu, nil, nil), nil
|
||||
}
|
||||
|
||||
// CheckMenuInAuthority 检查菜单是否在角色权限中
|
||||
func (r *menuRepo) CheckMenuInAuthority(ctx context.Context, authorityId uint, menuName string) (bool, error) {
|
||||
// 获取角色的菜单ID列表
|
||||
var menuIds []string
|
||||
if err := r.db.WithContext(ctx).Model(&model.SysAuthorityMenu{}).
|
||||
Where("sys_authority_authority_id = ?", authorityId).
|
||||
Pluck("sys_base_menu_id", &menuIds).Error; err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
if len(menuIds) == 0 {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
// 检查菜单名称是否在这些菜单中
|
||||
var count int64
|
||||
if err := r.db.WithContext(ctx).Model(&model.SysBaseMenu{}).
|
||||
Where("name = ? AND id IN (?)", menuName, menuIds).
|
||||
Count(&count).Error; err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
return count > 0, nil
|
||||
}
|
||||
|
||||
// FindAllBaseMenus 获取所有基础菜单
|
||||
func (r *menuRepo) FindAllBaseMenus(ctx context.Context) ([]*system.BaseMenu, error) {
|
||||
var menus []model.SysBaseMenu
|
||||
|
||||
Reference in New Issue
Block a user