dao

package
v1.2.0 Latest Latest
Warning

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

Go to latest
Published: Aug 31, 2025 License: MIT Imports: 3 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 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 *models.UploadChunk) error

Create 创建分片记录

func (*ChunkDAO) DeleteByUploadID

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

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

func (*ChunkDAO) DeleteChunksByUploadIDs added in v1.2.0

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

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

func (*ChunkDAO) FirstOrCreateChunk

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

FirstOrCreateChunk 创建或更新分片记录

func (*ChunkDAO) GetByHash

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

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

func (*ChunkDAO) GetByUploadID

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

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

func (*ChunkDAO) GetChunkByIndex

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

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

func (*ChunkDAO) GetIncompleteUploads

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

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

func (*ChunkDAO) GetOldChunks added in v1.2.0

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

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

func (*ChunkDAO) GetUploadList

func (dao *ChunkDAO) GetUploadList(page, pageSize int) ([]models.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 DAOManager

type DAOManager struct {

	// DAO 实例
	FileCode    *FileCodeDAO
	User        *UserDAO
	UserSession *UserSessionDAO
	Chunk       *ChunkDAO
	KeyValue    *KeyValueDAO
	// contains filtered or unexported fields
}

DAOManager 数据访问对象管理器

func NewDAOManager

func NewDAOManager(db *gorm.DB) *DAOManager

NewDAOManager 创建新的 DAO 管理器

func (*DAOManager) BeginTransaction

func (dm *DAOManager) BeginTransaction() *gorm.DB

BeginTransaction 开始事务

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 added in v1.2.0

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) 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 KeyValueDAO

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

KeyValueDAO 键值对数据访问对象

func NewKeyValueDAO

func NewKeyValueDAO(db *gorm.DB) *KeyValueDAO

NewKeyValueDAO 创建新的键值对DAO

func (*KeyValueDAO) BatchSet

func (dao *KeyValueDAO) BatchSet(kvMap map[string]string) error

BatchSet 批量设置键值对

func (*KeyValueDAO) Count

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

Count 统计键值对数量

func (*KeyValueDAO) Create

func (dao *KeyValueDAO) Create(kv *models.KeyValue) error

Create 创建新的键值对

func (*KeyValueDAO) Delete

func (dao *KeyValueDAO) Delete(key string) error

Delete 删除键值对

func (*KeyValueDAO) GetAll

func (dao *KeyValueDAO) GetAll() ([]models.KeyValue, error)

GetAll 获取所有键值对

func (*KeyValueDAO) GetByKey

func (dao *KeyValueDAO) GetByKey(key string) (*models.KeyValue, error)

GetByKey 根据键获取值

func (*KeyValueDAO) GetByKeys

func (dao *KeyValueDAO) GetByKeys(keys []string) ([]models.KeyValue, error)

GetByKeys 根据多个键获取值

func (*KeyValueDAO) Search

func (dao *KeyValueDAO) Search(searchKey string) ([]models.KeyValue, error)

Search 搜索键值对

func (*KeyValueDAO) SetValue

func (dao *KeyValueDAO) SetValue(key, value string) error

SetValue 设置键值对(如果存在则更新,不存在则创建)

func (*KeyValueDAO) Update

func (dao *KeyValueDAO) Update(kv *models.KeyValue) error

Update 更新键值对

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) 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 更新用户状态

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