Files
smartmate/backend/dao/user.go
LoveLosita 78aa38a6f3 Version:0.0.1.dev.260202
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,修改了一些图片引用和格式上小错误。📝
2026-02-02 21:32:21 +08:00

75 lines
1.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}