feat: build core architecture & implement user auth modules 🚀 feat: 搭建核心架构并实现用户认证模块 🚀 Framework Migration: Switched from Hertz to Gin, providing a more idiomatic and lightweight web foundation. ⚡ 框架迁移:从 Hertz 切换至 Gin,构建了更符合 Go 惯例且轻量级的 Web 基础。⚡ Architectural Overhaul: Refactored the 3-layer architecture from global-variable-based calls to Explicit Dependency Injection (DI) via New... factory functions. This significantly improves testability and decoupling. 🏗️ 架构重构:将三层架构从基于“全局变量”的调用重构为通过 New... 工厂函数实现的显式依赖注入 (DI)。这大幅提升了代码的可测试性与解耦程度。🏗️ User Auth: Completed and tested Register, Login, and Token Refresh APIs with robust error handling and Bcrypt password hashing. 🔐 用户认证:完成了注册、登录与 Token 刷新接口并通过测试,包含健壮的错误处理与 Bcrypt 密码哈希加密。🔐 Config Management: Integrated Viper for centralized, environment-aware configuration management. ⚙️ 配置管理:集成了 Viper,实现了中心化且具备环境感知能力的配置管理。⚙️ DevOps & Docs: Added docker-compose.yml for seamless MySQL 8.0 & environment setup. 🐳 Updated README.md with corrections for mistakes in image quoting and formats. 📝 运维与文档: 新增 docker-compose.yml,实现 MySQL 8.0 环境的一键启动。🐳 更新 README.md,修改了一些图片引用和格式上小错误。📝
75 lines
1.7 KiB
Go
75 lines
1.7 KiB
Go
package dao
|
||
|
||
import (
|
||
"errors"
|
||
"time"
|
||
|
||
"github.com/smartflow/backend/model"
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
// UserDAO 用户数据访问对象
|
||
// 负责用户相关的数据库操作
|
||
type UserDAO struct {
|
||
// 这是一个口袋,用来装数据库连接实例
|
||
db *gorm.DB
|
||
}
|
||
|
||
// NewUserDAO 创建UserDAO实例
|
||
// NewUserDAO 接收一个 *gorm.DB,并把它塞进结构体的口袋里
|
||
func NewUserDAO(db *gorm.DB) *UserDAO {
|
||
return &UserDAO{
|
||
db: db,
|
||
}
|
||
}
|
||
|
||
// Create 创建新用户
|
||
// 插入新用户信息到数据库
|
||
func (dao *UserDAO) Create(username, phoneNumber, password string) (*model.User, error) {
|
||
// 创建User实例
|
||
user := &model.User{
|
||
Username: username,
|
||
PhoneNumber: phoneNumber,
|
||
Password: password, // 注意:实际项目中应该对密码进行加密处理
|
||
TokenLimit: 100000, // 默认值
|
||
TokenUsage: 0, // 初始使用量为0
|
||
LastResetAt: time.Now(), // 设置为当前时间
|
||
}
|
||
|
||
// 插入数据
|
||
if err := dao.db.Create(user).Error; err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
return user, nil
|
||
}
|
||
|
||
func (dao *UserDAO) IfUsernameExists(name string) (bool, error) {
|
||
err := dao.db.Where("username = ?", name).First(&model.User{}).Error
|
||
if err != nil {
|
||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||
return false, nil
|
||
}
|
||
return true, err
|
||
}
|
||
return true, nil
|
||
}
|
||
|
||
func (dao *UserDAO) GetUserHashedPasswordByName(name string) (string, error) {
|
||
var user model.User
|
||
err := dao.db.Where("username = ?", name).First(&user).Error
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
return user.Password, nil
|
||
}
|
||
|
||
func (dao *UserDAO) GetUserIDByName(name string) (int, error) {
|
||
var user model.User
|
||
err := dao.db.Where("username = ?", name).First(&user).Error
|
||
if err != nil {
|
||
return -1, err
|
||
}
|
||
return int(user.ID), nil
|
||
}
|