任务三

This commit is contained in:
Yvan
2026-01-07 11:53:56 +08:00
parent 05e12a2e2a
commit a017d93dbf
10 changed files with 1082 additions and 119 deletions
+38 -62
View File
@@ -73,11 +73,9 @@ func (r *userRepo) UpdateSelfSetting(ctx context.Context, id uint, setting json.
func (r *userRepo) Delete(ctx context.Context, id uint) error {
return r.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
// 删除用户
if err := tx.Where("id = ?", id).Delete(&model.SysUser{}).Error; err != nil {
return err
}
// 删除用户角色关联
if err := tx.Where("sys_user_id = ?", id).Delete(&model.SysUserAuthority{}).Error; err != nil {
return err
}
@@ -94,16 +92,15 @@ func (r *userRepo) FindByID(ctx context.Context, id uint) (*system.User, error)
}
func (r *userRepo) FindByIDWithAuthorities(ctx context.Context, id uint) (*system.User, error) {
var m model.SysUser
err := r.db.WithContext(ctx).
Preload("Authorities").
Preload("Authority").
Where("id = ?", id).
First(&m).Error
m, err := query.SysUser.WithContext(ctx).
Preload(query.SysUser.Authority).
Preload(query.SysUser.Authorities).
Where(query.SysUser.ID.Eq(int64(id))).
First()
if err != nil {
return nil, err
}
return toModelUserWithAuthorities(&m), nil
return toModelUserWithAuthorities(m), nil
}
func (r *userRepo) FindByUUID(ctx context.Context, uuidStr string) (*system.User, error) {
@@ -115,16 +112,15 @@ func (r *userRepo) FindByUUID(ctx context.Context, uuidStr string) (*system.User
}
func (r *userRepo) FindByUUIDWithAuthorities(ctx context.Context, uuidStr string) (*system.User, error) {
var m model.SysUser
err := r.db.WithContext(ctx).
Preload("Authorities").
Preload("Authority").
Where("uuid = ?", uuidStr).
First(&m).Error
m, err := query.SysUser.WithContext(ctx).
Preload(query.SysUser.Authority).
Preload(query.SysUser.Authorities).
Where(query.SysUser.UUID.Eq(uuidStr)).
First()
if err != nil {
return nil, err
}
return toModelUserWithAuthorities(&m), nil
return toModelUserWithAuthorities(m), nil
}
func (r *userRepo) FindByUsername(ctx context.Context, username string) (*system.User, error) {
@@ -136,49 +132,48 @@ func (r *userRepo) FindByUsername(ctx context.Context, username string) (*system
}
func (r *userRepo) FindByUsernameWithAuthorities(ctx context.Context, username string) (*system.User, error) {
var m model.SysUser
err := r.db.WithContext(ctx).
Preload("Authorities").
Preload("Authority").
Where("username = ?", username).
First(&m).Error
m, err := query.SysUser.WithContext(ctx).
Preload(query.SysUser.Authority).
Preload(query.SysUser.Authorities).
Where(query.SysUser.Username.Eq(username)).
First()
if err != nil {
return nil, err
}
return toModelUserWithAuthorities(&m), nil
return toModelUserWithAuthorities(m), nil
}
func (r *userRepo) List(ctx context.Context, page, pageSize int, filters map[string]string) ([]*system.User, int64, error) {
db := r.db.WithContext(ctx).Model(&model.SysUser{})
u := query.SysUser
q := u.WithContext(ctx)
if v, ok := filters["username"]; ok && v != "" {
db = db.Where("username LIKE ?", "%"+v+"%")
q = q.Where(u.Username.Like("%" + v + "%"))
}
if v, ok := filters["nick_name"]; ok && v != "" {
db = db.Where("nick_name LIKE ?", "%"+v+"%")
q = q.Where(u.NickName.Like("%" + v + "%"))
}
if v, ok := filters["phone"]; ok && v != "" {
db = db.Where("phone LIKE ?", "%"+v+"%")
q = q.Where(u.Phone.Like("%" + v + "%"))
}
if v, ok := filters["email"]; ok && v != "" {
db = db.Where("email LIKE ?", "%"+v+"%")
q = q.Where(u.Email.Like("%" + v + "%"))
}
var total int64
if err := db.Count(&total).Error; err != nil {
total, err := q.Count()
if err != nil {
return nil, 0, err
}
var list []model.SysUser
offset := (page - 1) * pageSize
err := db.Preload("Authorities").Preload("Authority").Offset(offset).Limit(pageSize).Find(&list).Error
list, err := q.Preload(u.Authority).Preload(u.Authorities).Offset(offset).Limit(pageSize).Find()
if err != nil {
return nil, 0, err
}
users := make([]*system.User, len(list))
for i := range list {
users[i] = toModelUserWithAuthorities(&list[i])
users[i] = toModelUserWithAuthorities(list[i])
}
return users, total, nil
}
@@ -193,20 +188,16 @@ func (r *userRepo) UpdateAuthorityID(ctx context.Context, id uint, authorityId u
func (r *userRepo) SetUserAuthorities(ctx context.Context, adminAuthorityID, userId uint, authorityIds []uint) error {
return r.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
// 查询用户是否存在
var user model.SysUser
if err := tx.Where("id = ?", userId).First(&user).Error; err != nil {
return errors.New("查询用户数据失败")
}
// 删除旧的用户角色关联
if err := tx.Where("sys_user_id = ?", userId).Delete(&model.SysUserAuthority{}).Error; err != nil {
return err
}
// 检查管理员权限并创建新的用户角色关联
for _, aid := range authorityIds {
// 检查管理员是否有权限分配该角色
if err := checkAuthorityIDAuth(tx, adminAuthorityID, aid); err != nil {
return err
}
@@ -219,7 +210,6 @@ func (r *userRepo) SetUserAuthorities(ctx context.Context, adminAuthorityID, use
}
}
// 更新用户默认角色
if len(authorityIds) > 0 {
if err := tx.Model(&model.SysUser{}).Where("id = ?", userId).Update("authority_id", authorityIds[0]).Error; err != nil {
return err
@@ -229,13 +219,10 @@ func (r *userRepo) SetUserAuthorities(ctx context.Context, adminAuthorityID, use
})
}
// checkAuthorityIDAuth 检查管理员是否有权限分配该角色
func checkAuthorityIDAuth(tx *gorm.DB, adminAuthorityID, targetAuthorityID uint) error {
// 如果是超级管理员(888),直接通过
if adminAuthorityID == 888 {
return nil
}
// 检查目标角色是否是管理员的子角色
var authority model.SysAuthority
if err := tx.Where("authority_id = ? AND parent_id = ?", targetAuthorityID, adminAuthorityID).First(&authority).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
@@ -255,7 +242,6 @@ func (r *userRepo) CheckUserHasAuthority(ctx context.Context, userId, authorityI
}
func (r *userRepo) GetAuthorityMenuRouters(ctx context.Context, authorityId uint) ([]string, error) {
// 获取角色的菜单ID列表
var authorityMenus []model.SysAuthorityMenu
if err := r.db.WithContext(ctx).Where("sys_authority_authority_id = ?", authorityId).Find(&authorityMenus).Error; err != nil {
return nil, err
@@ -265,13 +251,11 @@ func (r *userRepo) GetAuthorityMenuRouters(ctx context.Context, authorityId uint
return []string{}, nil
}
// 获取菜单ID
menuIDs := make([]string, len(authorityMenus))
menuIDs := make([]int64, len(authorityMenus))
for i, am := range authorityMenus {
menuIDs[i] = am.MenuID
menuIDs[i] = am.SysBaseMenuID
}
// 获取菜单的name(路由)
var menus []model.SysBaseMenu
if err := r.db.WithContext(ctx).Where("id IN ?", menuIDs).Find(&menus).Error; err != nil {
return nil, err
@@ -337,15 +321,9 @@ func toModelUser(m *model.SysUser) *system.User {
if m.NickName != nil {
u.NickName = *m.NickName
}
if m.SideMode != nil {
u.SideMode = *m.SideMode
}
if m.HeaderImg != nil {
u.HeaderImg = *m.HeaderImg
}
if m.BaseColor != nil {
u.BaseColor = *m.BaseColor
}
if m.AuthorityID != nil {
u.AuthorityId = uint(*m.AuthorityID)
}
@@ -374,16 +352,14 @@ func toModelUserWithAuthorities(m *model.SysUser) *system.User {
u := toModelUser(m)
// 转换Authority
if m.Authority != nil {
u.Authority = &system.Authority{
AuthorityId: uint(m.Authority.AuthorityID),
AuthorityName: safeString(m.Authority.AuthorityName),
DefaultRouter: safeString(m.Authority.DefaultRouter),
}
if m.Authority.ParentID != nil {
pid := uint(*m.Authority.ParentID)
u.Authority.ParentId = &pid
}
u.Authority = &system.Authority{
AuthorityId: uint(m.Authority.AuthorityID),
AuthorityName: safeString(m.Authority.AuthorityName),
DefaultRouter: safeString(m.Authority.DefaultRouter),
}
if m.Authority.ParentID != nil {
pid := uint(*m.Authority.ParentID)
u.Authority.ParentId = &pid
}
// 转换Authorities