minio接入 & 聊天功能完善

This commit is contained in:
2025-07-21 19:29:10 +08:00
parent 441130af83
commit be93d7ef13
27 changed files with 5236 additions and 34 deletions

View File

@@ -3,8 +3,12 @@ package mysql
import (
"acquaintances/biz/model"
"acquaintances/biz/model/user"
"encoding/base64"
"errors"
"fmt"
"golang.org/x/crypto/scrypt"
"gorm.io/gorm"
"time"
"github.com/cloudwego/hertz/pkg/common/hlog"
)
@@ -123,3 +127,64 @@ func FindUser(keyword *string) (*user.UserInfoReq, error) {
}
return res, nil
}
// CheckLogin 验证登录(适配 Scrypt 加密)
func CheckLogin(username, password string) (*model.User, error) {
var user model.User
// 1. 查询用户(支持 user_id/手机号/用户名登录)
result := DB.Model(&model.User{}).Where(
"user_id = ? OR mobile = ? OR user_name = ?",
username, username, username,
).First(&user)
// 2. 处理查询错误
if result.Error != nil {
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
return nil, fmt.Errorf("用户名或密码错误") // 模糊错误,防枚举
}
return nil, fmt.Errorf("登录失败:%w", result.Error)
}
// 3. 检查用户状态
//TODO
// 4. 验证密码(核心:使用 Scrypt 算法校验)
// 4.1 解码存储的盐值(加密时用 base64.URLEncoding
salt, err := base64.URLEncoding.DecodeString(user.UserSalt)
if err != nil {
return nil, fmt.Errorf("密码验证失败")
}
// 4.2 用相同算法计算输入密码的哈希
const keyLen = 10
inputHash, err := scrypt.Key([]byte(password), salt, 16384, 8, 1, keyLen)
if err != nil {
return nil, fmt.Errorf("密码验证失败")
}
// 4.3 对比计算结果与存储的密码哈希
storedHash := user.UserPassword
inputHashBase64 := base64.StdEncoding.EncodeToString(inputHash)
if inputHashBase64 != storedHash {
return nil, fmt.Errorf("用户名或密码错误")
}
// 5. 更新最后登录信息
return &user, updateLastLoginInfo(user.ID, getClientIP())
}
// 辅助函数:更新登录信息
func updateLastLoginInfo(userID uint, loginIP string) error {
now := time.Now()
return DB.Model(&model.User{}).Where("id = ?", userID).Updates(map[string]interface{}{
"last_login_ip": loginIP,
"last_login_time": &now,
}).Error
}
// 辅助函数获取客户端IP
func getClientIP() string {
//TODO
return "127.0.0.1"
}