优化结构

This commit is contained in:
Yvan
2026-08-22 12:13:16 +08:00
parent d987244d0e
commit b27a66e9d3
200 changed files with 1794 additions and 1715 deletions
+39 -39
View File
@@ -4,11 +4,11 @@ import (
"context"
"encoding/json"
"errors"
"kra/internal/biz/system"
"strconv"
"strings"
"time"
"kra/internal/biz"
"kra/pkg/database/pagination"
"github.com/google/uuid"
@@ -16,40 +16,40 @@ import (
"gorm.io/gorm/clause"
)
func (r *userRepo) FindUserByUsername(ctx context.Context, username string) (*biz.User, error) {
func (r *userRepo) FindUserByUsername(ctx context.Context, username string) (*system.User, error) {
var po userPO
if err := r.data.DB().WithContext(ctx).Where("username = ?", username).First(&po).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, biz.ErrUserNotFound
return nil, system.ErrUserNotFound
}
return nil, err
}
return r.loadUser(ctx, &po)
}
func (r *userRepo) FindUserByID(ctx context.Context, id uint) (*biz.User, error) {
func (r *userRepo) FindUserByID(ctx context.Context, id uint) (*system.User, error) {
var po userPO
if err := r.data.DB().WithContext(ctx).First(&po, id).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, biz.ErrUserNotFound
return nil, system.ErrUserNotFound
}
return nil, err
}
return r.loadUser(ctx, &po)
}
func (r *userRepo) FindUserByUUID(ctx context.Context, value string) (*biz.User, error) {
func (r *userRepo) FindUserByUUID(ctx context.Context, value string) (*system.User, error) {
var po userPO
if err := r.data.DB().WithContext(ctx).Where("uuid = ?", value).First(&po).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, biz.ErrUserNotFound
return nil, system.ErrUserNotFound
}
return nil, err
}
return r.loadUser(ctx, &po)
}
func (r *userRepo) loadUser(ctx context.Context, po *userPO) (*biz.User, error) {
func (r *userRepo) loadUser(ctx context.Context, po *userPO) (*system.User, error) {
var authority authorityPO
if err := r.data.DB().WithContext(ctx).First(&authority, "authority_id = ?", po.AuthorityID).Error; err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return nil, err
@@ -58,7 +58,7 @@ func (r *userRepo) loadUser(ctx context.Context, po *userPO) (*biz.User, error)
if err := r.data.DB().WithContext(ctx).Table("sys_authorities").Joins("JOIN sys_user_authority ON sys_user_authority.sys_authority_authority_id = sys_authorities.authority_id").Where("sys_user_authority.sys_user_id = ? AND sys_authorities.deleted_at IS NULL", po.ID).Find(&authorityPOs).Error; err != nil {
return nil, err
}
authorities := make([]biz.Authority, 0, len(authorityPOs))
authorities := make([]system.Authority, 0, len(authorityPOs))
for _, item := range authorityPOs {
authorities = append(authorities, toBizAuthority(item))
}
@@ -70,12 +70,12 @@ func (r *userRepo) loadUser(ctx context.Context, po *userPO) (*biz.User, error)
if err := r.data.DB().WithContext(ctx).Table("sys_departments").Joins("JOIN sys_user_departments ON sys_user_departments.sys_department_id = sys_departments.id").Where("sys_user_departments.sys_user_id = ? AND sys_departments.deleted_at IS NULL", po.ID).Find(&departmentPOs).Error; err != nil {
return nil, err
}
departments := make([]biz.Department, 0, len(departmentPOs))
departments := make([]system.Department, 0, len(departmentPOs))
for _, item := range departmentPOs {
value := deptFromPO(item)
departments = append(departments, *value)
}
var primary *biz.Department
var primary *system.Department
if po.DeptID != 0 {
var primaryPO departmentPO
if err := r.data.DB().WithContext(ctx).First(&primaryPO, po.DeptID).Error; err == nil {
@@ -88,33 +88,33 @@ func (r *userRepo) loadUser(ctx context.Context, po *userPO) (*biz.User, error)
if err := r.data.DB().WithContext(ctx).Table("sys_positions").Joins("JOIN sys_user_positions ON sys_user_positions.sys_position_id = sys_positions.id").Where("sys_user_positions.sys_user_id = ? AND sys_positions.deleted_at IS NULL", po.ID).Find(&positionPOs).Error; err != nil {
return nil, err
}
positions := make([]biz.Position, 0, len(positionPOs))
positions := make([]system.Position, 0, len(positionPOs))
for _, item := range positionPOs {
positions = append(positions, *posFromPO(item))
}
return &biz.User{ID: po.ID, CreatedAt: po.CreatedAt, UpdatedAt: po.UpdatedAt, UUID: po.UUID, Username: po.Username, Password: po.Password, NickName: po.NickName, HeaderImg: po.HeaderImg, AuthorityID: po.AuthorityID, Authority: toBizAuthority(authority), Authorities: authorities, DeptID: po.DeptID, Department: primary, Departments: departments, Positions: positions, Phone: po.Phone, Email: po.Email, Enable: po.Enable, OriginSetting: setting, MustChangePassword: po.MustChangePassword, PasswordUpdatedAt: po.PasswordUpdatedAt}, nil
return &system.User{ID: po.ID, CreatedAt: po.CreatedAt, UpdatedAt: po.UpdatedAt, UUID: po.UUID, Username: po.Username, Password: po.Password, NickName: po.NickName, HeaderImg: po.HeaderImg, AuthorityID: po.AuthorityID, Authority: toBizAuthority(authority), Authorities: authorities, DeptID: po.DeptID, Department: primary, Departments: departments, Positions: positions, Phone: po.Phone, Email: po.Email, Enable: po.Enable, OriginSetting: setting, MustChangePassword: po.MustChangePassword, PasswordUpdatedAt: po.PasswordUpdatedAt}, nil
}
func toBizAuthority(po authorityPO) biz.Authority {
func toBizAuthority(po authorityPO) system.Authority {
var deletedAt *time.Time
if po.DeletedAt.Valid {
value := po.DeletedAt.Time
deletedAt = &value
}
return biz.Authority{CreatedAt: po.CreatedAt, UpdatedAt: po.UpdatedAt, DeletedAt: deletedAt, AuthorityID: po.AuthorityID, AuthorityName: po.AuthorityName, ParentID: po.ParentID, DataScope: po.DataScope, DefaultRouter: po.DefaultRouter}
return system.Authority{CreatedAt: po.CreatedAt, UpdatedAt: po.UpdatedAt, DeletedAt: deletedAt, AuthorityID: po.AuthorityID, AuthorityName: po.AuthorityName, ParentID: po.ParentID, DataScope: po.DataScope, DefaultRouter: po.DefaultRouter}
}
func baseBizUser(po *userPO) *biz.User {
func baseBizUser(po *userPO) *system.User {
setting := map[string]any(nil)
if po.OriginSetting != "" {
_ = json.Unmarshal([]byte(po.OriginSetting), &setting)
}
return &biz.User{ID: po.ID, CreatedAt: po.CreatedAt, UpdatedAt: po.UpdatedAt, UUID: po.UUID, Username: po.Username, Password: po.Password, NickName: po.NickName, HeaderImg: po.HeaderImg, AuthorityID: po.AuthorityID, DeptID: po.DeptID, Phone: po.Phone, Email: po.Email, Enable: po.Enable, OriginSetting: setting, MustChangePassword: po.MustChangePassword, PasswordUpdatedAt: po.PasswordUpdatedAt}
return &system.User{ID: po.ID, CreatedAt: po.CreatedAt, UpdatedAt: po.UpdatedAt, UUID: po.UUID, Username: po.Username, Password: po.Password, NickName: po.NickName, HeaderImg: po.HeaderImg, AuthorityID: po.AuthorityID, DeptID: po.DeptID, Phone: po.Phone, Email: po.Email, Enable: po.Enable, OriginSetting: setting, MustChangePassword: po.MustChangePassword, PasswordUpdatedAt: po.PasswordUpdatedAt}
}
func (r *userRepo) loadUsers(ctx context.Context, pos []userPO) ([]*biz.User, error) {
func (r *userRepo) loadUsers(ctx context.Context, pos []userPO) ([]*system.User, error) {
if len(pos) == 0 {
return []*biz.User{}, nil
return []*system.User{}, nil
}
db := r.data.DB().WithContext(ctx)
userIDs := make([]uint, 0, len(pos))
@@ -186,18 +186,18 @@ func (r *userRepo) loadUsers(ctx context.Context, pos []userPO) ([]*biz.User, er
positionByID[item.ID] = item
}
users := make([]*biz.User, 0, len(pos))
users := make([]*system.User, 0, len(pos))
for i := range pos {
po := &pos[i]
user := baseBizUser(po)
user.Authority = toBizAuthority(authorityByID[po.AuthorityID])
user.Authorities = make([]biz.Authority, 0, len(authorityByUser[po.ID]))
user.Authorities = make([]system.Authority, 0, len(authorityByUser[po.ID]))
for _, id := range authorityByUser[po.ID] {
if item, ok := authorityByID[id]; ok {
user.Authorities = append(user.Authorities, toBizAuthority(item))
}
}
user.Departments = make([]biz.Department, 0, len(departmentByUser[po.ID]))
user.Departments = make([]system.Department, 0, len(departmentByUser[po.ID]))
for _, id := range departmentByUser[po.ID] {
if item, ok := departmentByID[id]; ok {
user.Departments = append(user.Departments, *deptFromPO(item))
@@ -206,7 +206,7 @@ func (r *userRepo) loadUsers(ctx context.Context, pos []userPO) ([]*biz.User, er
if primary, ok := departmentByID[po.DeptID]; ok {
user.Department = deptFromPO(primary)
}
user.Positions = make([]biz.Position, 0, len(positionByUser[po.ID]))
user.Positions = make([]system.Position, 0, len(positionByUser[po.ID]))
for _, id := range positionByUser[po.ID] {
if item, ok := positionByID[id]; ok {
user.Positions = append(user.Positions, *posFromPO(item))
@@ -226,7 +226,7 @@ func (r *userRepo) HasAuthorityMenu(ctx context.Context, authorityID uint, name
return count > 0, err
}
func (r *userRepo) MenusByAuthority(ctx context.Context, authorityID uint) ([]*biz.Menu, error) {
func (r *userRepo) MenusByAuthority(ctx context.Context, authorityID uint) ([]*system.Menu, error) {
var pos []menuPO
err := r.data.DB().WithContext(ctx).Table("sys_base_menus").
Joins("JOIN sys_authority_menus ON sys_authority_menus.sys_base_menu_id = sys_base_menus.id").
@@ -235,13 +235,13 @@ func (r *userRepo) MenusByAuthority(ctx context.Context, authorityID uint) ([]*b
if err != nil {
return nil, err
}
byID := make(map[uint]*biz.Menu, len(pos))
byID := make(map[uint]*system.Menu, len(pos))
menuIDs := make([]uint, 0, len(pos))
for _, po := range pos {
menu := menuFromPO(po)
menu.MenuID = po.ID
menu.Children = nil
menu.Parameters = []*biz.MenuParameter{}
menu.Parameters = []*system.MenuParameter{}
menu.Buttons = nil
byID[po.ID] = menu
menuIDs = append(menuIDs, po.ID)
@@ -266,7 +266,7 @@ func (r *userRepo) MenusByAuthority(ctx context.Context, authorityID uint) ([]*b
menu.Buttons = append(menu.Buttons, value)
}
}
var roots []*biz.Menu
var roots []*system.Menu
for _, po := range pos {
menu := byID[po.ID]
if parent := byID[po.ParentID]; parent != nil {
@@ -278,7 +278,7 @@ func (r *userRepo) MenusByAuthority(ctx context.Context, authorityID uint) ([]*b
return roots, nil
}
func (r *userRepo) ListUsers(ctx context.Context, page, pageSize int, filter *biz.UserListFilter) ([]*biz.User, int64, error) {
func (r *userRepo) ListUsers(ctx context.Context, page, pageSize int, filter *system.UserListFilter) ([]*system.User, int64, error) {
db := r.data.DB().WithContext(ctx).Model(&userPO{})
order := "id desc"
if filter != nil {
@@ -314,11 +314,11 @@ func (r *userRepo) ListUsers(ctx context.Context, page, pageSize int, filter *bi
return users, total, err
}
func (r *userRepo) CreateUser(ctx context.Context, user *biz.User) (*biz.User, error) {
func (r *userRepo) CreateUser(ctx context.Context, user *system.User) (*system.User, error) {
return r.CreateUserWithAuthorities(ctx, user, nil)
}
func (r *userRepo) CreateUserWithAuthorities(ctx context.Context, user *biz.User, authorityIDs []uint) (*biz.User, error) {
func (r *userRepo) CreateUserWithAuthorities(ctx context.Context, user *system.User, authorityIDs []uint) (*system.User, error) {
requestedAuthorities := append([]uint{user.AuthorityID}, authorityIDs...)
if err := (&authorityAccessRepo{data: r.data}).checkAuthorityIDsAuth(ctx, requestedAuthorities); err != nil {
return nil, err
@@ -337,7 +337,7 @@ func (r *userRepo) CreateUserWithAuthorities(ctx context.Context, user *biz.User
}
now := time.Now()
po := userPO{UUID: user.UUID, Username: user.Username, Password: user.Password, NickName: user.NickName, HeaderImg: user.HeaderImg, AuthorityID: user.AuthorityID, Phone: user.Phone, Email: user.Email, Enable: user.Enable, PasswordUpdatedAt: &now, MustChangePassword: user.MustChangePassword}
var createdAuthorities []biz.Authority
var createdAuthorities []system.Authority
if err := r.data.DB().WithContext(ctx).Transaction(func(tx *gorm.DB) error {
// The compatible registration rejects an existing non-deleted username before creating the
// account. The username column is intentionally not unique for legacy
@@ -381,14 +381,14 @@ func (r *userRepo) CreateUserWithAuthorities(ctx context.Context, user *biz.User
return created, nil
}
func (r *userRepo) UpdateUser(ctx context.Context, user *biz.User) error {
func (r *userRepo) UpdateUser(ctx context.Context, user *system.User) error {
if err := r.checkUserUpdateAuth(ctx, user); err != nil {
return err
}
return r.updateUser(r.data.DB().WithContext(ctx), user)
}
func (r *userRepo) checkUserUpdateAuth(ctx context.Context, user *biz.User) error {
func (r *userRepo) checkUserUpdateAuth(ctx context.Context, user *system.User) error {
access := &authorityAccessRepo{data: r.data}
if err := access.checkUserIDAuth(ctx, user.ID, false); err != nil {
return err
@@ -399,7 +399,7 @@ func (r *userRepo) checkUserUpdateAuth(ctx context.Context, user *biz.User) erro
return nil
}
func (r *userRepo) UpdateSelfUser(ctx context.Context, user *biz.User) error {
func (r *userRepo) UpdateSelfUser(ctx context.Context, user *system.User) error {
updates := make(map[string]any)
if user.NickName != "" {
updates["nick_name"] = user.NickName
@@ -422,7 +422,7 @@ func (r *userRepo) UpdateSelfUser(ctx context.Context, user *biz.User) error {
return r.data.DB().WithContext(ctx).Model(&userPO{}).Where("id = ?", user.ID).Updates(updates).Error
}
func (r *userRepo) FillDepartmentNamePaths(ctx context.Context, user *biz.User) error {
func (r *userRepo) FillDepartmentNamePaths(ctx context.Context, user *system.User) error {
if user == nil || len(user.Departments) == 0 {
return nil
}
@@ -463,7 +463,7 @@ func (r *userRepo) FillDepartmentNamePaths(ctx context.Context, user *biz.User)
return nil
}
func (r *userRepo) updateUser(tx *gorm.DB, user *biz.User) error {
func (r *userRepo) updateUser(tx *gorm.DB, user *system.User) error {
updates := map[string]any{"nick_name": user.NickName, "header_img": user.HeaderImg, "phone": user.Phone, "email": user.Email, "enable": user.Enable}
if user.AuthorityID != 0 {
updates["authority_id"] = user.AuthorityID
@@ -471,7 +471,7 @@ func (r *userRepo) updateUser(tx *gorm.DB, user *biz.User) error {
return tx.Model(&userPO{}).Where("id = ?", user.ID).Updates(updates).Error
}
func (r *userRepo) UpdateUserWithAuthorities(ctx context.Context, user *biz.User, authorityIDs []uint) error {
func (r *userRepo) UpdateUserWithAuthorities(ctx context.Context, user *system.User, authorityIDs []uint) error {
access := &authorityAccessRepo{data: r.data}
if err := r.checkUserUpdateAuth(ctx, user); err != nil {
return err
@@ -520,12 +520,12 @@ func (r *userRepo) UpdatePassword(ctx context.Context, id uint, password string,
}
return r.data.DB().WithContext(ctx).Model(&userPO{}).Where("id = ?", id).Updates(updates).Error
}
func (r *userRepo) ListAuthorities(ctx context.Context) ([]*biz.Authority, error) {
func (r *userRepo) ListAuthorities(ctx context.Context) ([]*system.Authority, error) {
var pos []authorityPO
if err := r.data.DB().WithContext(ctx).Order("authority_id").Find(&pos).Error; err != nil {
return nil, err
}
result := make([]*biz.Authority, 0, len(pos))
result := make([]*system.Authority, 0, len(pos))
for _, po := range pos {
a := toBizAuthority(po)
result = append(result, &a)