package backend import ( "context" "errors" "fmt" "kpt-tmr-group/model" "kpt-tmr-group/pkg/jwt" "kpt-tmr-group/pkg/tool" "kpt-tmr-group/pkg/xerr" operationPb "kpt-tmr-group/proto/go/backend/operation" "strconv" "strings" "gorm.io/gorm" ) // Auth 用户登录 func (s *StoreEntry) Auth(ctx context.Context, auth *operationPb.UserAuth) (*operationPb.SystemToken, error) { systemUser := &model.SystemUser{} if err := s.DB.Where("name = ?", auth.UserName).Find(systemUser).Error; err != nil { return nil, xerr.WithStack(err) } if systemUser.Password != auth.Password { return nil, xerr.Customf("密码错误,来自用户:%s", auth.UserName) } token, err := jwt.GenerateToken(systemUser.Name, systemUser.Password) if err != nil { return nil, xerr.WithStack(err) } if token == "" { return nil, xerr.Custom("获取token错误") } return &operationPb.SystemToken{ Token: token, }, nil } // GetUserInfo 获取用户信息 func (s *StoreEntry) GetUserInfo(ctx context.Context, token string) (*operationPb.UserAuth, error) { systemUser := &model.SystemUser{} claims, err := jwt.ParseToken(token) if err != nil { return nil, xerr.WithStack(err) } if claims.Username == "" { return nil, xerr.Custom("token解析失败") } if err = s.DB.Where("name = ?", claims.Username).First(systemUser).Error; err != nil { return nil, xerr.WithStack(err) } systemRole := make([]*model.SystemRole, 0) roleIdStr := strings.Split(systemUser.RoleIds, ",") if len(roleIdStr) > 0 { roleIds := make([]int, 0) for _, v := range roleIdStr { roleId, _ := strconv.Atoi(v) roleIds = append(roleIds, roleId) } if err = s.DB.Find(&systemRole, roleIds).Error; err != nil { return nil, xerr.WithStack(err) } } return systemUser.SystemUserFormat(systemRole), nil } // CreateSystemUser 创建系统用户 func (s *StoreEntry) CreateSystemUser(ctx context.Context, req *operationPb.AddSystemUser) error { systemUsers := &model.SystemUser{ Name: req.Name, EmployeeName: req.EmployeeName, Phone: req.Phone, Password: tool.Md5String(model.InitManagerPassword), CreateUser: req.CreateUser, IsShow: req.IsShow, } systemUsers.SystemUserRoleFormat(req) if err := s.DB.Create(systemUsers).Error; err != nil { return xerr.WithStack(err) } return nil } // SearchSystemUserList 查询系统用户 func (s *StoreEntry) SearchSystemUserList(ctx context.Context, req *operationPb.SearchUserRequest) (*model.SystemUserResponse, error) { systemUser := make([]*model.SystemUser, 0) var count int64 = 0 pref := s.DB.Model(new(model.SystemUser)).Where("is_delete = ?", operationPb.IsShow_OK) if req.Name != "" { pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%")) } if req.EmployeeName != "" { pref.Where("employee_name like ?", fmt.Sprintf("%s%s%s", "%", req.EmployeeName, "%")) } if req.IsShow > 0 { pref.Where("is_show = ?", req.IsShow) } if err := pref.Order("id desc").Count(&count).Limit(int(req.Pagination.PageSize)).Offset(int(req.Pagination.PageOffset)). Find(&systemUser).Debug().Error; err != nil { return nil, xerr.WithStack(err) } return &model.SystemUserResponse{ Page: req.Pagination.Page, Total: int32(count), List: model.SystemUserSlice(systemUser).ToPB(), }, nil } // EditSystemUser 编辑用户 func (s *StoreEntry) EditSystemUser(ctx context.Context, req *operationPb.AddSystemUser) error { systemUser := &model.SystemUser{Id: req.Id} if err := s.DB.First(systemUser).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return xerr.Custom("该数据不存在!") } return xerr.WithStack(err) } updateData := &model.SystemUser{ Name: req.Name, EmployeeName: req.EmployeeName, Phone: req.Phone, CreateUser: req.CreateUser, } updateData.SystemUserRoleFormat(req) if err := s.DB.Model(new(model.SystemUser)).Omit("is_show", "password", "is_delete"). Where("id = ?", systemUser.Id). Updates(updateData).Error; err != nil { return xerr.WithStack(err) } return nil } // DeleteSystemUser 删除系统用户 func (s *StoreEntry) DeleteSystemUser(ctx context.Context, userId int64) error { systemUser := &model.SystemUser{ Id: userId, } if err := s.DB.First(systemUser).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return xerr.Custom("该用户不存在") } return xerr.WithStack(err) } if err := s.DB.Model(systemUser).Update("is_delete", operationPb.IsShow_NO).Error; err != nil { return xerr.WithStack(err) } return nil } // IsShowSystemUser 用户是否启用 func (s *StoreEntry) IsShowSystemUser(ctx context.Context, req *operationPb.IsShowSystemUserRequest) error { systemUser := &model.SystemUser{ Id: req.UserId, } if err := s.DB.First(systemUser).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return xerr.Custom("该用户不存在") } return xerr.WithStack(err) } if err := s.DB.Model(systemUser).Update("is_show", req.IsShow).Error; err != nil { return xerr.WithStack(err) } return nil } // GetSystemUserPermissions 返回系统用户相关菜单权限 func (s *StoreEntry) GetSystemUserPermissions(ctx context.Context, token string) (*operationPb.SystemUserMenuPermissions, error) { // 解析token claims, err := jwt.ParseToken(token) if err != nil { return nil, xerr.WithStack(err) } if err = claims.Valid(); err != nil { return nil, xerr.WithStack(err) } // 根据用户token获取用户数据 systemUser := &model.SystemUser{Name: claims.Username} if err = s.DB.Where("name = ?", claims.Username).First(systemUser).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, xerr.Custom("该用户数据不存在") } return nil, xerr.WithStack(err) } roleIds := systemUser.SystemUserRoleToSlice() // 获取用户角色数据 systemRoles := make([]*model.SystemRole, 0) if err = s.DB.Find(&systemRoles, roleIds).Error; err != nil { return nil, xerr.WithStack(err) } systemUserMenuPermissions := &operationPb.SystemUserMenuPermissions{ PastureList: make([]*operationPb.AddPastureRequest, 0), MenuList: make([]*operationPb.AddMenuRequest, 0), MobileList: make([]*operationPb.AddMobileRequest, 0), } for _, role := range systemRoles { mobileIds := role.RoleForMobileToSlice() pastureIds := role.RoleForPastureToSlice() menuIds := role.RoleForMenuToSlice() item := s.GetPermissionsPastureList(ctx, mobileIds, pastureIds, menuIds) systemUserMenuPermissions.PastureList = append(systemUserMenuPermissions.PastureList, item.PastureList...) systemUserMenuPermissions.MenuList = append(systemUserMenuPermissions.MenuList, item.MenuList...) systemUserMenuPermissions.MobileList = append(systemUserMenuPermissions.MobileList, item.MobileList...) } return systemUserMenuPermissions, nil } // CreateSystemRole 添加角色 func (s *StoreEntry) CreateSystemRole(ctx context.Context, req *operationPb.AddRoleRequest) error { role := model.NewSystemRole(req) if err := s.DB.Create(role).Debug().Error; err != nil { return xerr.WithStack(err) } return nil } // EditSystemRole 编辑角色 func (s *StoreEntry) EditSystemRole(ctx context.Context, req *operationPb.AddRoleRequest) error { role := &model.SystemRole{Id: req.Id} if err := s.DB.First(role).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return xerr.Custom("该数据不存在") } return xerr.WithStack(err) } updateSystemUser := &model.SystemRole{ Id: req.Id, Name: req.Name, Remarks: req.Remarks, CreateUser: req.CreateUser, } updateSystemUser.RolePermissionsFormat(req) if err := s.DB.Omit("is_show"). Where("id = ?", role.Id). Updates(updateSystemUser).Error; err != nil { return xerr.WithStack(err) } return nil } // DeleteSystemRole 删除系统角色 func (s *StoreEntry) DeleteSystemRole(ctx context.Context, roleId int64) error { systemRole := &model.SystemRole{ Id: roleId, } if err := s.DB.First(systemRole).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return xerr.Custom("该数据不存在") } return xerr.WithStack(err) } if err := s.DB.Model(systemRole).Update("is_show", operationPb.IsShow_NO).Error; err != nil { return xerr.WithStack(err) } return nil } // SearchSystemRoleList 查询系统角色 func (s *StoreEntry) SearchSystemRoleList(ctx context.Context, req *operationPb.SearchRoleRequest) (*model.SystemRoleResponse, error) { systemRole := make([]*model.SystemRole, 0) var count int64 = 0 pref := s.DB.Model(new(model.SystemRole)).Where("is_show = ?", operationPb.IsShow_OK) if req.Name != "" { pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%")) } if err := pref.Order("id desc").Count(&count).Limit(int(req.Pagination.PageSize)).Offset(int(req.Pagination.PageOffset)). Find(&systemRole).Debug().Error; err != nil { return nil, xerr.WithStack(err) } return &model.SystemRoleResponse{ Page: req.Pagination.Page, Total: int32(count), List: model.SystemRoleSlice(systemRole).ToPB(), }, nil } // CreateSystemMenu 添加系统菜单权限 func (s *StoreEntry) CreateSystemMenu(ctx context.Context, req *operationPb.AddMenuRequest) error { systemMenu := &model.SystemMenu{ Name: req.Name, MenuType: req.MenuType, Title: req.Title, Path: req.Path, Component: req.Component, Icon: req.Icon, Sort: req.Sort, Redirect: req.Redirect, ParentId: req.ParentId, IsShow: operationPb.IsShow_OK, IsDelete: operationPb.IsShow_OK, } if err := s.DB.Create(systemMenu).Error; err != nil { return xerr.WithStack(err) } return nil } // EditSystemMenu 编辑系统菜单权限 func (s *StoreEntry) EditSystemMenu(ctx context.Context, req *operationPb.AddMenuRequest) error { systemMenu := &model.SystemMenu{Id: req.Id} if err := s.DB.First(systemMenu).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return xerr.Custom("该数据不存在!") } return xerr.WithStack(err) } updateData := &model.SystemMenu{ Name: req.Name, MenuType: req.MenuType, Title: req.Title, Path: req.Path, Component: req.Component, Icon: req.Icon, Sort: req.Sort, Redirect: req.Redirect, ParentId: req.ParentId, } if err := s.DB.Model(new(model.SystemMenu)).Omit("is_show"). Where("id = ?", systemMenu.Id). Updates(updateData).Error; err != nil { return xerr.WithStack(err) } return nil } // IsShowSystemMenu 菜单是否启用 func (s *StoreEntry) IsShowSystemMenu(ctx context.Context, req *operationPb.IsShowSystemMenuRequest) error { systemMenu := &model.SystemMenu{Id: req.MenuId} if err := s.DB.First(systemMenu).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return xerr.Custom("该数据不存在") } return xerr.WithStack(err) } if err := s.DB.Model(systemMenu).Update("is_show", req.IsShow).Error; err != nil { return xerr.WithStack(err) } return nil } // SearchSystemMenuList 菜单列表查询 func (s *StoreEntry) SearchSystemMenuList(ctx context.Context, req *operationPb.SearchMenuRequest) (*model.SystemMenuResponse, error) { systemMenu := make([]*model.SystemMenu, 0) var count int64 = 0 pref := s.DB.Model(new(model.SystemMenu)).Where("is_delete = ?", operationPb.IsShow_OK) if req.Name != "" { pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%")) } if err := pref.Order("id desc").Count(&count).Limit(int(req.Pagination.PageSize)).Offset(int(req.Pagination.PageOffset)). Find(&systemMenu).Debug().Error; err != nil { return nil, xerr.WithStack(err) } return &model.SystemMenuResponse{ Page: req.Pagination.Page, Total: int32(count), List: model.SystemMenuSlice(systemMenu).ToPB(), }, nil } // DeleteSystemMenu 删除系统菜单 func (s *StoreEntry) DeleteSystemMenu(ctx context.Context, menuId int64) error { systemMenu := &model.SystemMenu{Id: menuId} if err := s.DB.First(systemMenu).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return xerr.Custom("该数据不存在") } return xerr.WithStack(err) } if err := s.DB.Model(systemMenu).Update("is_delete", operationPb.IsShow_NO).Error; err != nil { return xerr.WithStack(err) } return nil }