refactor: 重构后端架构为 go-zero 框架,优化项目结构
主要变更: - 采用 go-zero 框架替代 Gin,提升开发效率 - 重构项目结构,API 文件模块化组织 - 将 model 移至 api/internal/model 目录 - 移除 common 包,改为标准 pkg 目录结构 - 实现统一的仓储模式,支持配置驱动数据库切换 - 简化测试策略,专注 API 集成测试 - 更新 CLAUDE.md 文档,提供详细的开发指导 技术栈更新: - 框架: Gin → go-zero v1.6.0+ - 代码生成: 引入 goctl 工具 - 架构模式: 四层架构 → go-zero 三层架构 (Handler→Logic→Model) - 项目布局: 遵循 Go 社区标准和 go-zero 最佳实践
This commit is contained in:
@ -3,10 +3,9 @@ package service
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"photography-backend/internal/models"
|
||||
"photography-backend/internal/utils"
|
||||
"photography-backend/internal/model/entity"
|
||||
|
||||
"go.uber.org/zap"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
@ -36,7 +35,7 @@ type UserListParams struct {
|
||||
|
||||
// UserListResponse 用户列表响应
|
||||
type UserListResponse struct {
|
||||
Users []models.User `json:"users"`
|
||||
Users []entity.User `json:"users"`
|
||||
Total int64 `json:"total"`
|
||||
Page int `json:"page"`
|
||||
Limit int `json:"limit"`
|
||||
@ -78,14 +77,14 @@ func (s *UserService) GetUsers(ctx context.Context, params UserListParams) (*Use
|
||||
// 计算总数
|
||||
var total int64
|
||||
countQuery := query
|
||||
if err := countQuery.Model(&models.User{}).Count(&total).Error; err != nil {
|
||||
if err := countQuery.Model(&entity.User{}).Count(&total).Error; err != nil {
|
||||
s.logger.Error("Failed to count users", zap.Error(err))
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 分页查询
|
||||
offset := (params.Page - 1) * params.Limit
|
||||
var users []models.User
|
||||
var users []entity.User
|
||||
if err := query.
|
||||
Order("created_at DESC").
|
||||
Offset(offset).
|
||||
@ -108,8 +107,8 @@ func (s *UserService) GetUsers(ctx context.Context, params UserListParams) (*Use
|
||||
}
|
||||
|
||||
// GetUserByID 根据ID获取用户
|
||||
func (s *UserService) GetUserByID(ctx context.Context, id uint) (*models.User, error) {
|
||||
var user models.User
|
||||
func (s *UserService) GetUserByID(ctx context.Context, id uint) (*entity.User, error) {
|
||||
var user entity.User
|
||||
if err := s.db.WithContext(ctx).First(&user, id).Error; err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, errors.New("user not found")
|
||||
@ -122,8 +121,8 @@ func (s *UserService) GetUserByID(ctx context.Context, id uint) (*models.User, e
|
||||
}
|
||||
|
||||
// GetUserByUsername 根据用户名获取用户
|
||||
func (s *UserService) GetUserByUsername(ctx context.Context, username string) (*models.User, error) {
|
||||
var user models.User
|
||||
func (s *UserService) GetUserByUsername(ctx context.Context, username string) (*entity.User, error) {
|
||||
var user entity.User
|
||||
if err := s.db.WithContext(ctx).Where("username = ?", username).First(&user).Error; err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, errors.New("user not found")
|
||||
@ -136,8 +135,8 @@ func (s *UserService) GetUserByUsername(ctx context.Context, username string) (*
|
||||
}
|
||||
|
||||
// GetUserByEmail 根据邮箱获取用户
|
||||
func (s *UserService) GetUserByEmail(ctx context.Context, email string) (*models.User, error) {
|
||||
var user models.User
|
||||
func (s *UserService) GetUserByEmail(ctx context.Context, email string) (*entity.User, error) {
|
||||
var user entity.User
|
||||
if err := s.db.WithContext(ctx).Where("email = ?", email).First(&user).Error; err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, errors.New("user not found")
|
||||
@ -150,9 +149,9 @@ func (s *UserService) GetUserByEmail(ctx context.Context, email string) (*models
|
||||
}
|
||||
|
||||
// CreateUser 创建用户
|
||||
func (s *UserService) CreateUser(ctx context.Context, req *models.CreateUserRequest) (*models.User, error) {
|
||||
func (s *UserService) CreateUser(ctx context.Context, req *entity.CreateUserRequest) (*entity.User, error) {
|
||||
// 验证用户名唯一性
|
||||
var existingUser models.User
|
||||
var existingUser entity.User
|
||||
if err := s.db.WithContext(ctx).Where("username = ?", req.Username).First(&existingUser).Error; err == nil {
|
||||
return nil, errors.New("username already exists")
|
||||
}
|
||||
@ -169,7 +168,7 @@ func (s *UserService) CreateUser(ctx context.Context, req *models.CreateUserRequ
|
||||
return nil, err
|
||||
}
|
||||
|
||||
user := &models.User{
|
||||
user := &entity.User{
|
||||
Username: req.Username,
|
||||
Email: req.Email,
|
||||
Password: string(hashedPassword),
|
||||
@ -187,9 +186,9 @@ func (s *UserService) CreateUser(ctx context.Context, req *models.CreateUserRequ
|
||||
}
|
||||
|
||||
// UpdateUser 更新用户
|
||||
func (s *UserService) UpdateUser(ctx context.Context, id uint, req *models.UpdateUserRequest) (*models.User, error) {
|
||||
func (s *UserService) UpdateUser(ctx context.Context, id uint, req *entity.UpdateUserRequest) (*entity.User, error) {
|
||||
// 检查用户是否存在
|
||||
var user models.User
|
||||
var user entity.User
|
||||
if err := s.db.WithContext(ctx).First(&user, id).Error; err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, errors.New("user not found")
|
||||
@ -202,7 +201,7 @@ func (s *UserService) UpdateUser(ctx context.Context, id uint, req *models.Updat
|
||||
|
||||
if req.Username != nil {
|
||||
// 验证用户名唯一性
|
||||
var existingUser models.User
|
||||
var existingUser entity.User
|
||||
if err := s.db.WithContext(ctx).Where("username = ? AND id != ?", *req.Username, id).First(&existingUser).Error; err == nil {
|
||||
return nil, errors.New("username already exists")
|
||||
}
|
||||
@ -211,7 +210,7 @@ func (s *UserService) UpdateUser(ctx context.Context, id uint, req *models.Updat
|
||||
|
||||
if req.Email != nil {
|
||||
// 验证邮箱唯一性
|
||||
var existingUser models.User
|
||||
var existingUser entity.User
|
||||
if err := s.db.WithContext(ctx).Where("email = ? AND id != ?", *req.Email, id).First(&existingUser).Error; err == nil {
|
||||
return nil, errors.New("email already exists")
|
||||
}
|
||||
@ -238,9 +237,9 @@ func (s *UserService) UpdateUser(ctx context.Context, id uint, req *models.Updat
|
||||
}
|
||||
|
||||
// UpdateCurrentUser 更新当前用户信息
|
||||
func (s *UserService) UpdateCurrentUser(ctx context.Context, id uint, req *models.UpdateCurrentUserRequest) (*models.User, error) {
|
||||
func (s *UserService) UpdateCurrentUser(ctx context.Context, id uint, req *entity.UpdateCurrentUserRequest) (*entity.User, error) {
|
||||
// 检查用户是否存在
|
||||
var user models.User
|
||||
var user entity.User
|
||||
if err := s.db.WithContext(ctx).First(&user, id).Error; err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, errors.New("user not found")
|
||||
@ -253,7 +252,7 @@ func (s *UserService) UpdateCurrentUser(ctx context.Context, id uint, req *model
|
||||
|
||||
if req.Username != nil {
|
||||
// 验证用户名唯一性
|
||||
var existingUser models.User
|
||||
var existingUser entity.User
|
||||
if err := s.db.WithContext(ctx).Where("username = ? AND id != ?", *req.Username, id).First(&existingUser).Error; err == nil {
|
||||
return nil, errors.New("username already exists")
|
||||
}
|
||||
@ -262,7 +261,7 @@ func (s *UserService) UpdateCurrentUser(ctx context.Context, id uint, req *model
|
||||
|
||||
if req.Email != nil {
|
||||
// 验证邮箱唯一性
|
||||
var existingUser models.User
|
||||
var existingUser entity.User
|
||||
if err := s.db.WithContext(ctx).Where("email = ? AND id != ?", *req.Email, id).First(&existingUser).Error; err == nil {
|
||||
return nil, errors.New("email already exists")
|
||||
}
|
||||
@ -283,7 +282,7 @@ func (s *UserService) UpdateCurrentUser(ctx context.Context, id uint, req *model
|
||||
// DeleteUser 删除用户
|
||||
func (s *UserService) DeleteUser(ctx context.Context, id uint) error {
|
||||
// 检查用户是否存在
|
||||
var user models.User
|
||||
var user entity.User
|
||||
if err := s.db.WithContext(ctx).First(&user, id).Error; err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return errors.New("user not found")
|
||||
@ -302,9 +301,9 @@ func (s *UserService) DeleteUser(ctx context.Context, id uint) error {
|
||||
}
|
||||
|
||||
// ChangePassword 修改密码
|
||||
func (s *UserService) ChangePassword(ctx context.Context, id uint, req *models.ChangePasswordRequest) error {
|
||||
func (s *UserService) ChangePassword(ctx context.Context, id uint, req *entity.ChangePasswordRequest) error {
|
||||
// 检查用户是否存在
|
||||
var user models.User
|
||||
var user entity.User
|
||||
if err := s.db.WithContext(ctx).First(&user, id).Error; err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return errors.New("user not found")
|
||||
@ -335,8 +334,8 @@ func (s *UserService) ChangePassword(ctx context.Context, id uint, req *models.C
|
||||
}
|
||||
|
||||
// ValidateCredentials 验证用户凭据
|
||||
func (s *UserService) ValidateCredentials(ctx context.Context, username, password string) (*models.User, error) {
|
||||
var user models.User
|
||||
func (s *UserService) ValidateCredentials(ctx context.Context, username, password string) (*entity.User, error) {
|
||||
var user entity.User
|
||||
|
||||
// 根据用户名或邮箱查找用户
|
||||
if err := s.db.WithContext(ctx).Where("username = ? OR email = ?", username, username).First(&user).Error; err != nil {
|
||||
@ -361,16 +360,16 @@ func (s *UserService) ValidateCredentials(ctx context.Context, username, passwor
|
||||
}
|
||||
|
||||
// GetUserStats 获取用户统计信息
|
||||
func (s *UserService) GetUserStats(ctx context.Context) (*models.UserStats, error) {
|
||||
var stats models.UserStats
|
||||
func (s *UserService) GetUserStats(ctx context.Context) (*entity.UserStats, error) {
|
||||
var stats entity.UserStats
|
||||
|
||||
// 总用户数
|
||||
if err := s.db.WithContext(ctx).Model(&models.User{}).Count(&stats.Total).Error; err != nil {
|
||||
if err := s.db.WithContext(ctx).Model(&entity.User{}).Count(&stats.Total).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 活跃用户数
|
||||
if err := s.db.WithContext(ctx).Model(&models.User{}).
|
||||
if err := s.db.WithContext(ctx).Model(&entity.User{}).
|
||||
Where("is_active = ?", true).Count(&stats.Active).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -380,7 +379,7 @@ func (s *UserService) GetUserStats(ctx context.Context) (*models.UserStats, erro
|
||||
Role string `json:"role"`
|
||||
Count int64 `json:"count"`
|
||||
}
|
||||
if err := s.db.WithContext(ctx).Model(&models.User{}).
|
||||
if err := s.db.WithContext(ctx).Model(&entity.User{}).
|
||||
Select("role, COUNT(*) as count").
|
||||
Where("is_active = ?", true).
|
||||
Group("role").
|
||||
@ -395,7 +394,7 @@ func (s *UserService) GetUserStats(ctx context.Context) (*models.UserStats, erro
|
||||
|
||||
// 本月新增用户
|
||||
startOfMonth := time.Now().AddDate(0, 0, -time.Now().Day()+1)
|
||||
if err := s.db.WithContext(ctx).Model(&models.User{}).
|
||||
if err := s.db.WithContext(ctx).Model(&entity.User{}).
|
||||
Where("created_at >= ?", startOfMonth).
|
||||
Count(&stats.ThisMonth).Error; err != nil {
|
||||
return nil, err
|
||||
@ -403,7 +402,7 @@ func (s *UserService) GetUserStats(ctx context.Context) (*models.UserStats, erro
|
||||
|
||||
// 今日新增用户
|
||||
startOfDay := time.Now().Truncate(24 * time.Hour)
|
||||
if err := s.db.WithContext(ctx).Model(&models.User{}).
|
||||
if err := s.db.WithContext(ctx).Model(&entity.User{}).
|
||||
Where("created_at >= ?", startOfDay).
|
||||
Count(&stats.Today).Error; err != nil {
|
||||
return nil, err
|
||||
@ -415,7 +414,7 @@ func (s *UserService) GetUserStats(ctx context.Context) (*models.UserStats, erro
|
||||
// IsUsernameAvailable 检查用户名是否可用
|
||||
func (s *UserService) IsUsernameAvailable(ctx context.Context, username string) (bool, error) {
|
||||
var count int64
|
||||
if err := s.db.WithContext(ctx).Model(&models.User{}).
|
||||
if err := s.db.WithContext(ctx).Model(&entity.User{}).
|
||||
Where("username = ?", username).Count(&count).Error; err != nil {
|
||||
return false, err
|
||||
}
|
||||
@ -425,7 +424,7 @@ func (s *UserService) IsUsernameAvailable(ctx context.Context, username string)
|
||||
// IsEmailAvailable 检查邮箱是否可用
|
||||
func (s *UserService) IsEmailAvailable(ctx context.Context, email string) (bool, error) {
|
||||
var count int64
|
||||
if err := s.db.WithContext(ctx).Model(&models.User{}).
|
||||
if err := s.db.WithContext(ctx).Model(&entity.User{}).
|
||||
Where("email = ?", email).Count(&count).Error; err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user