Files
hfb_sys/backend/internal/modules/adminauth/service.go
T
ymlandClaude Opus 4.6 59093f8fd5 feat: 添加客服在线状态和聊天粘贴图片功能
**客服在线状态:**
- 后端:添加 admin_users.support_status 字段(online/offline/busy)
- 接口:PUT /admin/me/support-status 更新状态
- 前端:管理员顶部导航显示状态切换器(仅客服权限可见)
- 转接对话框显示客服在线状态和智能排序(在线优先)

**聊天粘贴图片:**
- 用户端、移动端、管理端聊天输入框支持 Ctrl+V/Cmd+V 直接粘贴图片
- 自动调用图片压缩和上传逻辑,与文件选择上传保持一致
- 最多支持粘贴9张图片

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-05 19:23:34 +08:00

71 lines
1.8 KiB
Go

package adminauth
import (
"errors"
"hfb_sys/backend/internal/modules/auth"
)
var (
ErrDependencyUnavailable = errors.New("dependency unavailable")
ErrInvalidCredential = errors.New("invalid credential")
ErrCaptchaInvalid = errors.New("captcha invalid")
ErrAdminDisabled = errors.New("admin disabled")
ErrInvalidRefreshToken = errors.New("invalid refresh token")
)
type Service struct {
repo *Repository
jwt *auth.JWTManager
}
func NewService(repo *Repository, jwt *auth.JWTManager) *Service {
return &Service{repo: repo, jwt: jwt}
}
func (s *Service) Refresh(refreshToken string) (*auth.TokenPair, error) {
if s.jwt == nil {
return nil, ErrDependencyUnavailable
}
claims, err := s.jwt.ParseSubject(refreshToken, "refresh", "admin")
if err != nil {
return nil, ErrInvalidRefreshToken
}
pair, err := s.jwt.GenerateSubjectPair(claims.UserID, claims.Phone, "admin")
if err != nil {
return nil, err
}
return &pair, nil
}
func (s *Service) Captcha() (*CaptchaDTO, error) {
if s.repo == nil {
return nil, ErrDependencyUnavailable
}
return s.repo.Captcha()
}
func (s *Service) Login(username string, password string, captchaID string, captchaCode string) (LoginResult, error) {
if s.repo == nil {
return LoginResult{}, ErrDependencyUnavailable
}
if username == "" || password == "" || captchaID == "" || captchaCode == "" {
return LoginResult{}, ErrInvalidCredential
}
return s.repo.Login(username, password, captchaID, captchaCode)
}
func (s *Service) Me(adminID uint64) (*AdminDTO, error) {
if s.repo == nil {
return nil, ErrDependencyUnavailable
}
return s.repo.FindByID(adminID)
}
func (s *Service) UpdateSupportStatus(adminID uint64, status string) error {
if s.repo == nil {
return ErrDependencyUnavailable
}
return s.repo.UpdateSupportStatus(adminID, status)
}