208 lines
5.2 KiB
Go
208 lines
5.2 KiB
Go
package system
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
|
|
"git.echol.cn/loser/ai_proxy/server/global"
|
|
"git.echol.cn/loser/ai_proxy/server/model/system"
|
|
"git.echol.cn/loser/ai_proxy/server/model/system/request"
|
|
"git.echol.cn/loser/ai_proxy/server/model/system/response"
|
|
"git.echol.cn/loser/ai_proxy/server/utils"
|
|
"github.com/golang-jwt/jwt/v5"
|
|
"golang.org/x/crypto/bcrypt"
|
|
)
|
|
|
|
type UserService struct{}
|
|
|
|
// Login 用户登录
|
|
func (s *UserService) Login(req *request.LoginRequest) (resp response.LoginResponse, err error) {
|
|
var user system.SysUser
|
|
err = global.GVA_DB.Where("username = ?", req.Username).First(&user).Error
|
|
if err != nil {
|
|
return resp, errors.New("用户名或密码错误")
|
|
}
|
|
|
|
// 验证密码
|
|
err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(req.Password))
|
|
if err != nil {
|
|
return resp, errors.New("用户名或密码错误")
|
|
}
|
|
|
|
// 检查用户状态
|
|
if user.Status != "active" {
|
|
return resp, errors.New("用户已被禁用")
|
|
}
|
|
|
|
// 生成 JWT Token
|
|
token, err := s.generateToken(user.ID, user.Username, user.Role)
|
|
if err != nil {
|
|
return resp, errors.New("生成Token失败")
|
|
}
|
|
|
|
resp.Token = token
|
|
resp.User = response.UserInfo{
|
|
ID: user.ID,
|
|
Username: user.Username,
|
|
Nickname: user.Nickname,
|
|
Email: user.Email,
|
|
Phone: user.Phone,
|
|
Avatar: user.Avatar,
|
|
Role: user.Role,
|
|
Status: user.Status,
|
|
}
|
|
|
|
return resp, nil
|
|
}
|
|
|
|
// Register 用户注册
|
|
func (s *UserService) Register(req *request.RegisterRequest) (user system.SysUser, err error) {
|
|
// 检查用户名是否存在
|
|
var count int64
|
|
global.GVA_DB.Model(&system.SysUser{}).Where("username = ?", req.Username).Count(&count)
|
|
if count > 0 {
|
|
return user, errors.New("用户名已存在")
|
|
}
|
|
|
|
// 加密密码
|
|
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
|
|
if err != nil {
|
|
return user, errors.New("密码加密失败")
|
|
}
|
|
|
|
// 生成 API Key
|
|
apiKey, err := utils.GenerateRandomString(32)
|
|
if err != nil {
|
|
return user, errors.New("生成API Key失败")
|
|
}
|
|
apiKey = "ak-" + apiKey
|
|
|
|
user = system.SysUser{
|
|
Username: req.Username,
|
|
Password: string(hashedPassword),
|
|
Email: req.Email,
|
|
Role: "user",
|
|
Status: "active",
|
|
APIKey: apiKey,
|
|
}
|
|
|
|
err = global.GVA_DB.Create(&user).Error
|
|
return user, err
|
|
}
|
|
|
|
// GetUserInfo 获取用户信息
|
|
func (s *UserService) GetUserInfo(userID uint) (info response.UserInfo, err error) {
|
|
var user system.SysUser
|
|
err = global.GVA_DB.First(&user, userID).Error
|
|
if err != nil {
|
|
return info, errors.New("用户不存在")
|
|
}
|
|
|
|
info = response.UserInfo{
|
|
ID: user.ID,
|
|
Username: user.Username,
|
|
Nickname: user.Nickname,
|
|
Email: user.Email,
|
|
Phone: user.Phone,
|
|
Avatar: user.Avatar,
|
|
Role: user.Role,
|
|
Status: user.Status,
|
|
}
|
|
|
|
return info, nil
|
|
}
|
|
|
|
// GetUserList 获取用户列表
|
|
func (s *UserService) GetUserList(page, pageSize int) (list []response.UserInfo, total int64, err error) {
|
|
var users []system.SysUser
|
|
offset := (page - 1) * pageSize
|
|
|
|
db := global.GVA_DB.Model(&system.SysUser{})
|
|
err = db.Count(&total).Error
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
err = db.Limit(pageSize).Offset(offset).Order("created_at DESC").Find(&users).Error
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, user := range users {
|
|
list = append(list, response.UserInfo{
|
|
ID: user.ID,
|
|
Username: user.Username,
|
|
Nickname: user.Nickname,
|
|
Email: user.Email,
|
|
Phone: user.Phone,
|
|
Avatar: user.Avatar,
|
|
Role: user.Role,
|
|
Status: user.Status,
|
|
})
|
|
}
|
|
|
|
return list, total, nil
|
|
}
|
|
|
|
// UpdateUser 更新用户
|
|
func (s *UserService) UpdateUser(req *request.UpdateUserRequest) error {
|
|
updates := map[string]interface{}{}
|
|
|
|
if req.Nickname != "" {
|
|
updates["nickname"] = req.Nickname
|
|
}
|
|
if req.Email != "" {
|
|
updates["email"] = req.Email
|
|
}
|
|
if req.Phone != "" {
|
|
updates["phone"] = req.Phone
|
|
}
|
|
if req.Avatar != "" {
|
|
updates["avatar"] = req.Avatar
|
|
}
|
|
if req.Role != "" {
|
|
updates["role"] = req.Role
|
|
}
|
|
if req.Status != "" {
|
|
updates["status"] = req.Status
|
|
}
|
|
|
|
return global.GVA_DB.Model(&system.SysUser{}).Where("id = ?", req.ID).Updates(updates).Error
|
|
}
|
|
|
|
// DeleteUser 删除用户
|
|
func (s *UserService) DeleteUser(userID uint) error {
|
|
return global.GVA_DB.Delete(&system.SysUser{}, userID).Error
|
|
}
|
|
|
|
// GetAPIKey 获取用户的 API Key
|
|
func (s *UserService) GetAPIKey(userID uint) (string, error) {
|
|
var user system.SysUser
|
|
err := global.GVA_DB.Select("api_key").First(&user, userID).Error
|
|
return user.APIKey, err
|
|
}
|
|
|
|
// RegenerateAPIKey 重新生成 API Key
|
|
func (s *UserService) RegenerateAPIKey(userID uint) (string, error) {
|
|
randomStr, err := utils.GenerateRandomString(32)
|
|
if err != nil {
|
|
return "", errors.New("生成API Key失败")
|
|
}
|
|
apiKey := "ak-" + randomStr
|
|
err = global.GVA_DB.Model(&system.SysUser{}).Where("id = ?", userID).Update("api_key", apiKey).Error
|
|
return apiKey, err
|
|
}
|
|
|
|
// generateToken 生成 JWT Token
|
|
func (s *UserService) generateToken(userID uint, username, role string) (string, error) {
|
|
claims := jwt.MapClaims{
|
|
"user_id": userID,
|
|
"username": username,
|
|
"role": role,
|
|
"exp": time.Now().Add(24 * time.Hour).Unix(),
|
|
}
|
|
|
|
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
|
|
return token.SignedString([]byte(global.GVA_CONFIG.JWT.SigningKey))
|
|
}
|