部分重构

This commit is contained in:
2026-03-31 20:06:53 +08:00
parent 6d79836682
commit 498cc78dce
43 changed files with 6049 additions and 131 deletions
@@ -0,0 +1,98 @@
package repository
import (
"ops/models"
"gorm.io/gorm"
)
type FileRepository interface {
CreateFile(file *models.TabFileInfo_) error
GetFileByID(fileID uint) (*models.TabFileInfo_, error)
GetFileByHash(hash string) (*models.TabFileInfo_, error)
GetFilesByUser(userID uint, fileType string, page, entries int) ([]models.TabFileInfo_, int64, error)
UpdateFile(file *models.TabFileInfo_) error
DeleteFile(fileID uint) error
IncrementFileUsage(fileID uint) error
GetFilesByType(fileType string, limit int) ([]models.TabFileInfo_, error)
}
type fileRepository struct {
db *gorm.DB
}
func NewFileRepository(db *gorm.DB) FileRepository {
return &fileRepository{db: db}
}
func (r *fileRepository) CreateFile(file *models.TabFileInfo_) error {
return r.db.Create(file).Error
}
func (r *fileRepository) GetFileByID(fileID uint) (*models.TabFileInfo_, error) {
var file models.TabFileInfo_
if err := r.db.First(&file, fileID).Error; err != nil {
return nil, err
}
return &file, nil
}
func (r *fileRepository) GetFileByHash(hash string) (*models.TabFileInfo_, error) {
var file models.TabFileInfo_
if err := r.db.Where("sha256 = ?", hash).First(&file).Error; err != nil {
return nil, err
}
return &file, nil
}
func (r *fileRepository) GetFilesByUser(userID uint, fileType string, page, entries int) ([]models.TabFileInfo_, int64, error) {
var files []models.TabFileInfo_
var total int64
query := r.db.Model(&models.TabFileInfo_{}).Where("user_id = ?", userID)
if fileType != "" {
query = query.Where("type = ?", fileType)
}
// 获取总数
if err := query.Count(&total).Error; err != nil {
return nil, 0, err
}
// 获取分页数据
offset := entries * (page - 1)
if err := query.Order("date DESC").Offset(offset).Limit(entries).Find(&files).Error; err != nil {
return nil, 0, err
}
return files, total, nil
}
func (r *fileRepository) UpdateFile(file *models.TabFileInfo_) error {
return r.db.Save(file).Error
}
func (r *fileRepository) DeleteFile(fileID uint) error {
return r.db.Delete(&models.TabFileInfo_{}, fileID).Error
}
func (r *fileRepository) IncrementFileUsage(fileID uint) error {
return r.db.Model(&models.TabFileInfo_{}).
Where("id = ?", fileID).
Update("const", gorm.Expr("const + ?", 1)).Error
}
func (r *fileRepository) GetFilesByType(fileType string, limit int) ([]models.TabFileInfo_, error) {
var files []models.TabFileInfo_
query := r.db.Where("type = ?", fileType).Order("const DESC")
if limit > 0 {
query = query.Limit(limit)
}
if err := query.Find(&files).Error; err != nil {
return nil, err
}
return files, nil
}
@@ -0,0 +1,72 @@
package repository
import (
"ops/models"
"gorm.io/gorm"
)
type PurchaseRepository interface {
GetOrders(userID uint, search string, page, entries int) ([]models.TabPurchaseOrder, int64, error)
GetOrderByID(orderID uint) (*models.TabPurchaseOrder, error)
CreateOrder(order *models.TabPurchaseOrder) error
CreateCost(cost *models.TabPurchaseCosts) error
GetOrderCosts(orderID uint) ([]models.TabPurchaseCosts, error)
}
type purchaseRepository struct {
db *gorm.DB
}
func NewPurchaseRepository(db *gorm.DB) PurchaseRepository {
return &purchaseRepository{db: db}
}
func (r *purchaseRepository) GetOrders(userID uint, search string, page, entries int) ([]models.TabPurchaseOrder, int64, error) {
var orders []models.TabPurchaseOrder
var total int64
query := r.db.Model(&models.TabPurchaseOrder{}).Where("user_id = ?", userID)
if search != "" {
query = query.Where("title LIKE ? OR part_name LIKE ? OR remark LIKE ? OR tracking_number LIKE ?",
"%"+search+"%", "%"+search+"%", "%"+search+"%", "%"+search+"%")
}
// 获取总数
if err := query.Count(&total).Error; err != nil {
return nil, 0, err
}
// 获取分页数据
offset := entries * (page - 1)
if err := query.Order("created_at DESC").Offset(offset).Limit(entries).Find(&orders).Error; err != nil {
return nil, 0, err
}
return orders, total, nil
}
func (r *purchaseRepository) GetOrderByID(orderID uint) (*models.TabPurchaseOrder, error) {
var order models.TabPurchaseOrder
if err := r.db.First(&order, orderID).Error; err != nil {
return nil, err
}
return &order, nil
}
func (r *purchaseRepository) CreateOrder(order *models.TabPurchaseOrder) error {
return r.db.Create(order).Error
}
func (r *purchaseRepository) CreateCost(cost *models.TabPurchaseCosts) error {
return r.db.Create(cost).Error
}
func (r *purchaseRepository) GetOrderCosts(orderID uint) ([]models.TabPurchaseCosts, error) {
var costs []models.TabPurchaseCosts
if err := r.db.Where("order_id = ?", orderID).Find(&costs).Error; err != nil {
return nil, err
}
return costs, nil
}
@@ -0,0 +1,347 @@
package repository
import (
"errors"
"time"
"gorm.io/gorm"
"ops/internal/database"
)
// UserRepository 用户数据访问接口
type UserRepository interface {
Create(user *database.TabUser) error
FindByID(id uint) (*database.TabUser, error)
FindByName(name string) (*database.TabUser, error)
FindByEmail(email string) (*database.TabUser, error)
FindByPhone(phone string) (*database.TabUser, error)
Update(user *database.TabUser) error
Delete(id uint) error
ExistsByName(name string) (bool, error)
}
// UserInfoRepository 用户信息数据访问接口
type UserInfoRepository interface {
Create(userInfo *database.TabUserInfo) error
FindByUserID(userID uint) (*database.TabUserInfo, error)
Update(userInfo *database.TabUserInfo) error
Delete(userID uint) error
}
// CookieRepository Cookie数据访问接口
type CookieRepository interface {
Create(cookie *database.TabCookie) error
FindByValue(cookieValue string) (*database.TabCookie, error)
FindByUserID(userID uint) ([]*database.TabCookie, error)
DeleteByValue(cookieValue string) error
DeleteByUserID(userID uint) error
DeleteExpired() error
}
// userRepo 用户仓库实现
type userRepo struct {
db *gorm.DB
}
// NewUserRepository 创建用户仓库实例
func NewUserRepository(db *gorm.DB) UserRepository {
return &userRepo{db: db}
}
// Create 创建用户
func (r *userRepo) Create(user *database.TabUser) error {
if user == nil {
return errors.New("user is nil")
}
if user.Name == "" {
return errors.New("username is required")
}
return r.db.Create(user).Error
}
// FindByID 通过ID查找用户
func (r *userRepo) FindByID(id uint) (*database.TabUser, error) {
if id == 0 {
return nil, errors.New("invalid user ID")
}
var user database.TabUser
err := r.db.First(&user, id).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, nil
}
return nil, err
}
return &user, nil
}
// FindByName 通过用户名查找用户
func (r *userRepo) FindByName(name string) (*database.TabUser, error) {
if name == "" {
return nil, errors.New("username is required")
}
var user database.TabUser
err := r.db.Where("name = ?", name).First(&user).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, nil
}
return nil, err
}
return &user, nil
}
// FindByEmail 通过邮箱查找用户
func (r *userRepo) FindByEmail(email string) (*database.TabUser, error) {
// TabUser表目前没有email字段,这里返回nil
return nil, nil
}
// FindByPhone 通过手机号查找用户
func (r *userRepo) FindByPhone(phone string) (*database.TabUser, error) {
// TabUser表目前没有phone字段,这里返回nil
return nil, nil
}
// Update 更新用户信息
func (r *userRepo) Update(user *database.TabUser) error {
if user == nil {
return errors.New("user is nil")
}
if user.ID == 0 {
return errors.New("user ID is required")
}
return r.db.Save(user).Error
}
// Delete 删除用户
func (r *userRepo) Delete(id uint) error {
if id == 0 {
return errors.New("invalid user ID")
}
return r.db.Delete(&database.TabUser{}, id).Error
}
// ExistsByName 检查用户名是否存在
func (r *userRepo) ExistsByName(name string) (bool, error) {
if name == "" {
return false, errors.New("username is required")
}
var count int64
err := r.db.Model(&database.TabUser{}).Where("name = ?", name).Count(&count).Error
if err != nil {
return false, err
}
return count > 0, nil
}
// userInfoRepo 用户信息仓库实现
type userInfoRepo struct {
db *gorm.DB
}
// NewUserInfoRepository 创建用户信息仓库实例
func NewUserInfoRepository(db *gorm.DB) UserInfoRepository {
return &userInfoRepo{db: db}
}
// Create 创建用户信息
func (r *userInfoRepo) Create(userInfo *database.TabUserInfo) error {
if userInfo == nil {
return errors.New("user info is nil")
}
if userInfo.UserID == 0 {
return errors.New("user ID is required")
}
return r.db.Create(userInfo).Error
}
// FindByUserID 通过用户ID查找用户信息
func (r *userInfoRepo) FindByUserID(userID uint) (*database.TabUserInfo, error) {
if userID == 0 {
return nil, errors.New("invalid user ID")
}
var userInfo database.TabUserInfo
err := r.db.Where("user_id = ?", userID).First(&userInfo).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, nil
}
return nil, err
}
return &userInfo, nil
}
// Update 更新用户信息
func (r *userInfoRepo) Update(userInfo *database.TabUserInfo) error {
if userInfo == nil {
return errors.New("user info is nil")
}
if userInfo.UserID == 0 {
return errors.New("user ID is required")
}
return r.db.Save(userInfo).Error
}
// Delete 删除用户信息
func (r *userInfoRepo) Delete(userID uint) error {
if userID == 0 {
return errors.New("invalid user ID")
}
return r.db.Where("user_id = ?", userID).Delete(&database.TabUserInfo{}).Error
}
// cookieRepo Cookie仓库实现
type cookieRepo struct {
db *gorm.DB
}
// NewCookieRepository 创建Cookie仓库实例
func NewCookieRepository(db *gorm.DB) CookieRepository {
return &cookieRepo{db: db}
}
// Create 创建Cookie
func (r *cookieRepo) Create(cookie *database.TabCookie) error {
if cookie == nil {
return errors.New("cookie is nil")
}
if cookie.Value == "" {
return errors.New("cookie value is required")
}
if cookie.UserID == 0 {
return errors.New("user ID is required")
}
if cookie.ExpiresAt == 0 {
cookie.ExpiresAt = time.Now().Add(7 * 24 * time.Hour).Unix()
}
if cookie.CreateAt == 0 {
cookie.CreateAt = time.Now().Unix()
}
return r.db.Create(cookie).Error
}
// FindByValue 通过Cookie值查找
func (r *cookieRepo) FindByValue(cookieValue string) (*database.TabCookie, error) {
if cookieValue == "" {
return nil, errors.New("cookie value is required")
}
var cookie database.TabCookie
err := r.db.Where("value = ?", cookieValue).First(&cookie).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, nil
}
return nil, err
}
return &cookie, nil
}
// FindByUserID 通过用户ID查找所有Cookie
func (r *cookieRepo) FindByUserID(userID uint) ([]*database.TabCookie, error) {
if userID == 0 {
return nil, errors.New("invalid user ID")
}
var cookies []*database.TabCookie
err := r.db.Where("user_id = ?", userID).Find(&cookies).Error
if err != nil {
return nil, err
}
return cookies, nil
}
// DeleteByValue 通过Cookie值删除
func (r *cookieRepo) DeleteByValue(cookieValue string) error {
if cookieValue == "" {
return errors.New("cookie value is required")
}
return r.db.Where("value = ?", cookieValue).Delete(&database.TabCookie{}).Error
}
// DeleteByUserID 通过用户ID删除所有Cookie
func (r *cookieRepo) DeleteByUserID(userID uint) error {
if userID == 0 {
return errors.New("invalid user ID")
}
return r.db.Where("user_id = ?", userID).Delete(&database.TabCookie{}).Error
}
// DeleteExpired 删除过期的Cookie
func (r *cookieRepo) DeleteExpired() error {
now := time.Now().Unix()
return r.db.Where("expires_at < ?", now).Delete(&database.TabCookie{}).Error
}
// EnhancedUserInfo 增强的用户信息结构
type EnhancedUserInfo struct {
database.TabUser
UserInfo database.TabUserInfo
AvatarURL string
}
// GetEnhancedUserInfo 获取增强的用户信息
func GetEnhancedUserInfo(db *gorm.DB, userID uint) (*EnhancedUserInfo, error) {
if userID == 0 {
return nil, errors.New("invalid user ID")
}
var user database.TabUser
var userInfo database.TabUserInfo
// 获取用户基本信息
err := db.First(&user, userID).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, nil
}
return nil, err
}
// 获取用户详细信息
err = db.Where("user_id = ?", userID).First(&userInfo).Error
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return nil, err
}
// 构建头像URL
avatarURL := "/static/default_avatar.png"
if userInfo.AvatarPath != "" {
avatarURL = "/file/" + userInfo.AvatarPath
}
return &EnhancedUserInfo{
TabUser: user,
UserInfo: userInfo,
AvatarURL: avatarURL,
}, nil
}