repository

package
v1.9.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 24, 2025 License: MIT Imports: 5 Imported by: 0

README

DAO 层迁移文档

概述

我们已经将所有数据库操作逻辑迁移到了 internal/dao 文件夹中,实现了数据访问层的统一管理。这种架构提供了更好的代码组织和维护性。

创建的 DAO 文件

1. /internal/dao/dao_manager.go
  • 作用: DAO 管理器,统一管理所有 DAO 实例
  • 核心功能:
    • 统一创建和管理所有 DAO 实例
    • 提供数据库连接和事务管理
    • 作为服务层与数据层的桥梁
2. /internal/dao/file_code.go
  • 作用: 文件代码相关的数据库操作
  • 主要方法:
    • Create() - 创建文件记录
    • GetByID(), GetByCode() - 查询文件
    • Update(), UpdateColumns() - 更新文件
    • Delete(), DeleteByFileCode() - 删除文件
    • Count(), CountToday(), CountActive() - 统计方法
    • List() - 分页查询
    • GetExpiredFiles() - 获取过期文件
    • GetByHash() - 根据哈希查找重复文件
3. /internal/dao/user.go
  • 作用: 用户相关的数据库操作
  • 主要方法:
    • Create() - 创建用户
    • GetByID(), GetByUsername(), GetByEmail() - 查询用户
    • GetByUsernameOrEmail() - 登录查询
    • Update(), UpdateColumns() - 更新用户
    • UpdatePassword(), UpdateStatus() - 专项更新
    • CheckExists(), CheckEmailExists() - 存在性检查
    • Count(), CountActive(), CountTodayRegistrations() - 统计
    • List() - 分页查询用户列表
4. /internal/dao/user_session.go
  • 作用: 用户会话相关的数据库操作
  • 主要方法:
    • Create() - 创建会话
    • GetBySessionID() - 根据会话ID查询
    • CountActiveSessionsByUserID() - 统计用户活跃会话
    • GetOldestSessionByUserID() - 获取最老会话
    • UpdateIsActive() - 更新会话状态
    • DeactivateUserSessions() - 停用用户所有会话
    • CleanExpiredSessions() - 清理过期会话
5. /internal/dao/chunk.go
  • 作用: 分片上传相关的数据库操作
  • 主要方法:
    • Create() - 创建分片记录
    • GetByHash(), GetByUploadID() - 查询分片信息
    • GetChunkByIndex() - 根据索引获取分片
    • UpdateUploadProgress() - 更新上传进度
    • UpdateChunkCompleted() - 标记分片完成
    • CountCompletedChunks() - 统计完成的分片
    • DeleteByUploadID() - 删除上传相关记录
6. /internal/dao/key_value.go
  • 作用: 配置键值对的数据库操作
  • 主要方法:
    • Create(), Update() - 基础CRUD
    • GetByKey(), GetByKeys() - 查询键值对
    • SetValue() - 设置键值(存在则更新,不存在则创建)
    • BatchSet() - 批量设置
    • Search() - 搜索键值对
    • Count() - 统计数量
7. /internal/dao/admin.go
  • 作用: 管理员相关的数据库操作
  • 主要方法:
    • GetDB() - 获取数据库连接(兼容现有代码)
    • BeginTransaction() - 开始事务

使用示例

在服务层中使用 DAO
// 服务结构体中添加 DAO 管理器
type AdminService struct {
    db             *gorm.DB
    config         *config.Config
    storageManager *storage.StorageManager
    daoManager     *dao.DAOManager  // 新增
}

// 初始化服务时创建 DAO 管理器
func NewAdminService(db *gorm.DB, config *config.Config, storageManager *storage.StorageManager) *AdminService {
    return &AdminService{
        db:             db,
        config:         config,
        storageManager: storageManager,
        daoManager:     dao.NewDAOManager(db),  // 新增
    }
}

// 使用 DAO 方法替代直接的数据库操作
func (s *AdminService) GetStats() (map[string]interface{}, error) {
    stats := make(map[string]interface{})

    // 旧方式:s.db.Model(&models.FileCode{}).Count(&totalFiles)
    // 新方式:
    totalFiles, err := s.daoManager.FileCode.Count()
    if err != nil {
        return nil, err
    }
    stats["total_files"] = totalFiles

    // ... 其他统计
    return stats, nil
}

迁移的好处

1. 代码组织更清晰
  • 数据访问逻辑集中在 DAO 层
  • 服务层专注于业务逻辑
  • 更好的分层架构
2. 可维护性提升
  • 数据库操作统一管理
  • 减少重复代码
  • 更容易进行单元测试
3. 扩展性更好
  • 可以轻松添加新的数据操作方法
  • 支持复杂查询的封装
  • 便于缓存层的集成
4. 错误处理更统一
  • 统一的错误处理策略
  • 更好的错误信息返回
  • 便于日志记录和监控

后续工作建议

1. 完成其他服务的迁移
  • 继续将 share.go, chunk.go, user.go 等服务迁移到使用 DAO
  • 逐步移除服务层中的直接数据库操作
2. 添加事务支持
// 在 DAO 中支持事务操作
func (s *UserService) DeleteUserWithFiles(userID uint) error {
    return s.daoManager.GetDB().Transaction(func(tx *gorm.DB) error {
        // 使用事务删除用户相关数据
        if err := s.daoManager.FileCode.DeleteByUserID(tx, userID); err != nil {
            return err
        }
        if err := s.daoManager.UserSession.DeleteByUserID(tx, userID); err != nil {
            return err
        }
        return s.daoManager.User.Delete(tx, user)
    })
}
3. 添加缓存层
  • 在 DAO 层添加 Redis 缓存支持
  • 对热点数据进行缓存优化
4. 性能优化
  • 添加数据库查询性能监控
  • 优化复杂查询
  • 添加索引建议

测试验证

当前代码已经通过编译测试,说明基础架构正确。建议进行以下测试:

  1. 单元测试: 为每个 DAO 方法编写单元测试
  2. 集成测试: 测试 DAO 与服务层的集成
  3. 性能测试: 验证迁移后的性能表现

这个 DAO 层的迁移为 FileCodeBox 项目提供了更好的架构基础,有利于后续的维护和扩展。

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type AdminOperationLogDAO added in v1.9.5

type AdminOperationLogDAO struct {
	// contains filtered or unexported fields
}

AdminOperationLogDAO 管理后台运维日志

func NewAdminOperationLogDAO added in v1.9.5

func NewAdminOperationLogDAO(db *gorm.DB) *AdminOperationLogDAO

func (*AdminOperationLogDAO) Create added in v1.9.5

func (*AdminOperationLogDAO) List added in v1.9.5

type ChunkDAO

type ChunkDAO struct {
	// contains filtered or unexported fields
}

ChunkDAO 分片上传数据访问对象

func NewChunkDAO

func NewChunkDAO(db *gorm.DB) *ChunkDAO

NewChunkDAO 创建新的分片DAO

func (*ChunkDAO) CountCompletedChunks

func (dao *ChunkDAO) CountCompletedChunks(uploadID string) (int64, error)

CountCompletedChunks 统计已完成的分片数量

func (*ChunkDAO) Create

func (dao *ChunkDAO) Create(chunk *db.UploadChunk) error

Create 创建分片记录

func (*ChunkDAO) DeleteByUploadID

func (dao *ChunkDAO) DeleteByUploadID(uploadID string) error

DeleteByUploadID 删除上传相关的所有分片记录

func (*ChunkDAO) DeleteChunksByUploadIDs

func (dao *ChunkDAO) DeleteChunksByUploadIDs(uploadIDs []string) (int, error)

DeleteChunksByUploadIDs 批量删除指定上传ID的所有分片记录

func (*ChunkDAO) FirstOrCreateChunk

func (dao *ChunkDAO) FirstOrCreateChunk(chunk *db.UploadChunk) error

FirstOrCreateChunk 创建或更新分片记录

func (*ChunkDAO) GetByHash

func (dao *ChunkDAO) GetByHash(chunkHash string, fileSize int64) (*db.UploadChunk, error)

GetByHash 根据哈希和文件大小获取分片信息

func (*ChunkDAO) GetByUploadID

func (dao *ChunkDAO) GetByUploadID(uploadID string) (*db.UploadChunk, error)

GetByUploadID 根据上传ID获取控制记录

func (*ChunkDAO) GetChunkByIndex

func (dao *ChunkDAO) GetChunkByIndex(uploadID string, chunkIndex int) (*db.UploadChunk, error)

GetChunkByIndex 根据上传ID和分片索引获取分片

func (*ChunkDAO) GetIncompleteUploads

func (dao *ChunkDAO) GetIncompleteUploads(olderThan int) ([]db.UploadChunk, error)

GetIncompleteUploads 获取未完成的上传(用于清理)

func (*ChunkDAO) GetOldChunks

func (dao *ChunkDAO) GetOldChunks(cutoffTime time.Time) ([]db.UploadChunk, error)

GetOldChunks 获取超过指定时间的未完成分片上传

func (*ChunkDAO) GetUploadList

func (dao *ChunkDAO) GetUploadList(page, pageSize int) ([]db.UploadChunk, int64, error)

GetUploadList 获取上传列表(用于管理和清理)

func (*ChunkDAO) GetUploadedChunkIndexes

func (dao *ChunkDAO) GetUploadedChunkIndexes(uploadID string) ([]int, error)

GetUploadedChunkIndexes 获取已上传分片的索引列表

func (*ChunkDAO) UpdateChunkCompleted

func (dao *ChunkDAO) UpdateChunkCompleted(uploadID string, chunkIndex int, chunkHash string) error

UpdateChunkCompleted 更新分片完成状态

func (*ChunkDAO) UpdateUploadProgress

func (dao *ChunkDAO) UpdateUploadProgress(uploadID string, completedChunks int) error

UpdateUploadProgress 更新上传进度

type FileCodeDAO

type FileCodeDAO struct {
	// contains filtered or unexported fields
}

FileCodeDAO 文件代码数据访问对象

func NewFileCodeDAO

func NewFileCodeDAO(db *gorm.DB) *FileCodeDAO

NewFileCodeDAO 创建新的文件代码DAO

func (*FileCodeDAO) CheckCodeExists

func (dao *FileCodeDAO) CheckCodeExists(code string, excludeID uint) (bool, error)

CheckCodeExists 检查代码是否存在(排除指定ID)

func (*FileCodeDAO) Count

func (dao *FileCodeDAO) Count() (int64, error)

Count 统计文件总数

func (*FileCodeDAO) CountActive

func (dao *FileCodeDAO) CountActive() (int64, error)

CountActive 统计活跃文件数量

func (*FileCodeDAO) CountByUserID

func (dao *FileCodeDAO) CountByUserID(userID uint) (int64, error)

CountByUserID 统计用户上传的文件数量

func (*FileCodeDAO) CountToday

func (dao *FileCodeDAO) CountToday() (int64, error)

CountToday 统计今天的文件数量

func (*FileCodeDAO) CountTodayUploads

func (dao *FileCodeDAO) CountTodayUploads() (int64, error)

CountTodayUploads 统计今天的上传数量

func (*FileCodeDAO) Create

func (dao *FileCodeDAO) Create(fileCode *models.FileCode) error

Create 创建新的文件记录

func (*FileCodeDAO) Delete

func (dao *FileCodeDAO) Delete(id uint) error

Delete 删除文件记录

func (*FileCodeDAO) DeleteByFileCode

func (dao *FileCodeDAO) DeleteByFileCode(fileCode *models.FileCode) error

DeleteByFileCode 删除文件记录

func (*FileCodeDAO) DeleteByUserID

func (dao *FileCodeDAO) DeleteByUserID(tx *gorm.DB, userID uint) error

DeleteByUserID 删除用户的所有文件

func (*FileCodeDAO) DeleteExpiredFiles

func (dao *FileCodeDAO) DeleteExpiredFiles(expiredFiles []models.FileCode) (int, error)

DeleteExpiredFiles 批量删除过期文件

func (*FileCodeDAO) GetByCode

func (dao *FileCodeDAO) GetByCode(code string) (*models.FileCode, error)

GetByCode 根据代码获取文件记录

func (*FileCodeDAO) GetByHash

func (dao *FileCodeDAO) GetByHash(fileHash string, fileSize int64) (*models.FileCode, error)

GetByHash 根据文件哈希获取文件记录

func (*FileCodeDAO) GetByHashAndSize

func (dao *FileCodeDAO) GetByHashAndSize(fileHash string, size int64) (*models.FileCode, error)

GetByHashAndSize 根据文件哈希和大小获取文件记录

func (*FileCodeDAO) GetByID

func (dao *FileCodeDAO) GetByID(id uint) (*models.FileCode, error)

GetByID 根据ID获取文件记录

func (*FileCodeDAO) GetByUserID

func (dao *FileCodeDAO) GetByUserID(userID uint, fileID uint) (*models.FileCode, error)

GetByUserID 获取用户的文件记录

func (*FileCodeDAO) GetExpiredFiles

func (dao *FileCodeDAO) GetExpiredFiles() ([]models.FileCode, error)

GetExpiredFiles 获取过期文件

func (*FileCodeDAO) GetFilesByUserID

func (dao *FileCodeDAO) GetFilesByUserID(userID uint) ([]models.FileCode, error)

GetFilesByUserID 获取用户的所有文件

func (*FileCodeDAO) GetFilesByUserIDWithPagination

func (dao *FileCodeDAO) GetFilesByUserIDWithPagination(userID uint, page, pageSize int) ([]models.FileCode, int64, error)

GetFilesByUserIDWithPagination 获取用户的文件列表(带分页)

func (*FileCodeDAO) GetTotalSize

func (dao *FileCodeDAO) GetTotalSize() (int64, error)

GetTotalSize 获取文件总大小

func (*FileCodeDAO) GetTotalSizeByUserID

func (dao *FileCodeDAO) GetTotalSizeByUserID(userID uint) (int64, error)

GetTotalSizeByUserID 获取用户文件总大小

func (*FileCodeDAO) List

func (dao *FileCodeDAO) List(page, pageSize int, search string) ([]models.FileCode, int64, error)

List 分页获取文件列表

func (*FileCodeDAO) Update

func (dao *FileCodeDAO) Update(fileCode *models.FileCode) error

Update 更新文件记录

func (*FileCodeDAO) UpdateColumns

func (dao *FileCodeDAO) UpdateColumns(id uint, updates map[string]interface{}) error

UpdateColumns 更新指定字段

type RepositoryManager

type RepositoryManager struct {
	User        *UserDAO
	FileCode    *FileCodeDAO
	Chunk       *ChunkDAO
	UserSession *UserSessionDAO
	Upload      *ChunkDAO
	TransferLog *TransferLogDAO
	AdminOpLog  *AdminOperationLogDAO
	// contains filtered or unexported fields
}

RepositoryManager 数据访问管理器

func NewRepositoryManager

func NewRepositoryManager(db *gorm.DB) *RepositoryManager

NewRepositoryManager 创建新的数据访问管理器

func (*RepositoryManager) BeginTransaction

func (m *RepositoryManager) BeginTransaction() *gorm.DB

BeginTransaction 开始事务

func (*RepositoryManager) DB added in v1.7.1

func (m *RepositoryManager) DB() *gorm.DB

DB 返回底层 gorm.DB 引用(只读)

type TransferLogDAO added in v1.9.5

type TransferLogDAO struct {
	// contains filtered or unexported fields
}

func NewTransferLogDAO added in v1.9.5

func NewTransferLogDAO(db *gorm.DB) *TransferLogDAO

func (*TransferLogDAO) Create added in v1.9.5

func (dao *TransferLogDAO) Create(log *models.TransferLog) error

func (*TransferLogDAO) List added in v1.9.5

List 返回传输日志,支持基本筛选和分页

func (*TransferLogDAO) WithDB added in v1.9.5

func (dao *TransferLogDAO) WithDB(db *gorm.DB) *TransferLogDAO

type UserDAO

type UserDAO struct {
	// contains filtered or unexported fields
}

UserDAO 用户数据访问对象

func NewUserDAO

func NewUserDAO(db *gorm.DB) *UserDAO

NewUserDAO 创建新的用户DAO

func (*UserDAO) CheckEmailExists

func (dao *UserDAO) CheckEmailExists(email string, excludeID uint) (*models.User, error)

CheckEmailExists 检查邮箱是否存在(排除指定ID)

func (*UserDAO) CheckExists

func (dao *UserDAO) CheckExists(username, email string) (*models.User, error)

CheckExists 检查用户是否存在(用户名或邮箱)

func (*UserDAO) Count

func (dao *UserDAO) Count() (int64, error)

Count 统计用户总数

func (*UserDAO) CountActive

func (dao *UserDAO) CountActive() (int64, error)

CountActive 统计活跃用户数

func (*UserDAO) CountAdminUsers

func (dao *UserDAO) CountAdminUsers() (int64, error)

CountAdminUsers 统计管理员用户数量

func (*UserDAO) CountTodayRegistrations

func (dao *UserDAO) CountTodayRegistrations() (int64, error)

CountTodayRegistrations 统计今天注册的用户数

func (*UserDAO) Create

func (dao *UserDAO) Create(user *models.User) error

Create 创建新用户

func (*UserDAO) Delete

func (dao *UserDAO) Delete(tx *gorm.DB, user *models.User) error

Delete 删除用户

func (*UserDAO) GetAllUsers

func (dao *UserDAO) GetAllUsers(page, pageSize int) ([]models.User, int64, error)

GetAllUsers 获取所有用户(管理员用途)

func (*UserDAO) GetByEmail

func (dao *UserDAO) GetByEmail(email string) (*models.User, error)

GetByEmail 根据邮箱获取用户

func (*UserDAO) GetByID

func (dao *UserDAO) GetByID(id uint) (*models.User, error)

GetByID 根据ID获取用户

func (*UserDAO) GetByUsername

func (dao *UserDAO) GetByUsername(username string) (*models.User, error)

GetByUsername 根据用户名获取用户

func (*UserDAO) GetByUsernameOrEmail

func (dao *UserDAO) GetByUsernameOrEmail(usernameOrEmail string) (*models.User, error)

GetByUsernameOrEmail 根据用户名或邮箱获取用户

func (*UserDAO) List

func (dao *UserDAO) List(page, pageSize int, search string) ([]models.User, int64, error)

List 分页获取用户列表

func (*UserDAO) Update

func (dao *UserDAO) Update(user *models.User) error

Update 更新用户信息

func (*UserDAO) UpdateColumns

func (dao *UserDAO) UpdateColumns(id uint, updates map[string]interface{}) error

UpdateColumns 更新指定字段

func (*UserDAO) UpdatePassword

func (dao *UserDAO) UpdatePassword(id uint, passwordHash string) error

UpdatePassword 更新用户密码

func (*UserDAO) UpdateStatus

func (dao *UserDAO) UpdateStatus(id uint, status string) error

UpdateStatus 更新用户状态

func (*UserDAO) UpdateUserFields

func (dao *UserDAO) UpdateUserFields(id uint, user models.User) error

UpdateUserFields 更新用户字段(结构化方式)

func (*UserDAO) UpdateUserProfile

func (dao *UserDAO) UpdateUserProfile(id uint, user *models.User) error

UpdateUserProfile 更新用户资料(用户自己更新)

type UserSessionDAO

type UserSessionDAO struct {
	// contains filtered or unexported fields
}

UserSessionDAO 用户会话数据访问对象

func NewUserSessionDAO

func NewUserSessionDAO(db *gorm.DB) *UserSessionDAO

NewUserSessionDAO 创建新的用户会话DAO

func (*UserSessionDAO) CleanExpiredSessions

func (dao *UserSessionDAO) CleanExpiredSessions() error

CleanExpiredSessions 清理过期会话

func (*UserSessionDAO) CountActiveSessionsByUserID

func (dao *UserSessionDAO) CountActiveSessionsByUserID(userID uint) (int64, error)

CountActiveSessionsByUserID 统计用户的活跃会话数

func (*UserSessionDAO) Create

func (dao *UserSessionDAO) Create(session *models.UserSession) error

Create 创建新会话

func (*UserSessionDAO) DeactivateUserSessions

func (dao *UserSessionDAO) DeactivateUserSessions(userID uint) error

DeactivateUserSessions 停用用户的所有会话

func (*UserSessionDAO) DeleteByUserID

func (dao *UserSessionDAO) DeleteByUserID(tx *gorm.DB, userID uint) error

DeleteByUserID 删除用户的所有会话

func (*UserSessionDAO) GetBySessionID

func (dao *UserSessionDAO) GetBySessionID(sessionID string) (*models.UserSession, error)

GetBySessionID 根据会话ID获取会话

func (*UserSessionDAO) GetOldestSessionByUserID

func (dao *UserSessionDAO) GetOldestSessionByUserID(userID uint) (*models.UserSession, error)

GetOldestSessionByUserID 获取用户最老的会话

func (*UserSessionDAO) GetUserSessions

func (dao *UserSessionDAO) GetUserSessions(userID uint, page, pageSize int) ([]models.UserSession, int64, error)

GetUserSessions 获取用户的会话列表

func (*UserSessionDAO) UpdateIsActive

func (dao *UserSessionDAO) UpdateIsActive(session *models.UserSession, isActive bool) error

UpdateIsActive 更新会话活跃状态

func (*UserSessionDAO) UpdateIsActiveByID

func (dao *UserSessionDAO) UpdateIsActiveByID(id uint, isActive bool) error

UpdateIsActiveByID 根据ID更新会话活跃状态

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL