package dao import ( "StuAcaWorksAI/proto" "gorm.io/gorm" "log" ) type File struct { gorm.Model // 存储文件名 FileStoreName string `gorm:"column:file_store_name;type:varchar(255);uniqueIndex:idx_file_name"` NeedAuth bool `gorm:"column:need_auth"` FileName string `gorm:"column:file_name"` FileSize int `gorm:"column:file_size"` FileType string `gorm:"column:file_type"` FilePath string `gorm:"column:file_path"` AuthID int `gorm:"column:auth_id"` Md5 string `gorm:"column:md5;type:varchar(255);uniqueIndex:idx_file_name"` } type FileAuth struct { gorm.Model AuthID int `gorm:"column:auth_id"` FileID int `gorm:"column:file_id"` UserFileName string `gorm:"column:user_file_name;type:varchar(255);uniqueIndex:idx_file_name"` //对于同一个文件,不同用户有不同的文件名 UploadType string `gorm:"column:upload_type"` // 上传类型: im,avatar,file,config,config为系统文件 IsPrivate int `gorm:"column:is_private"` // 是否私有,私有文件只能自己下载或者通过分享链接下载,1为私有,0为公开 ShareCode string `gorm:"column:share_code"` // 分享码,用于分享时的验证,构建分享链接 } type ConfigFile struct { gorm.Model AuthID int `gorm:"column:auth_id"` FileName string `gorm:"column:file_name"` FilePath string `gorm:"column:file_path"` } type FileAuthListResp struct { FileAuth FileStoreName string `gorm:"column:file_store_name;type:varchar(255);uniqueIndex:idx_file_name"` } type UserFileListResp struct { FileAuth FileStoreName string `json:"file_store_name" form:"file_store_name"` } func CreateFile(fileStoreName, fileName, fileType, filePath, md5Str string, fileSize, authID int, NeedAuth bool) File { file := File{FileStoreName: fileStoreName, FileName: fileName, FileType: fileType, FilePath: filePath, FileSize: fileSize, AuthID: authID, NeedAuth: NeedAuth, Md5: md5Str} result := DB.Create(&file) if result.Error != nil { return File{} } return file } func DeleteFileByID(id, user int) bool { res := DB.Model(&File{}).Where("id = ? and auth_id = ?", id, user).Delete(&File{}) if res.Error != nil { return false } return true } func FindFileByID(id, auth_id int) File { var file File DB.Where("id = ? and auth_id = ?", id, auth_id).First(&file) return file } func FindFileByNames(fileName string, auth_id int) File { var file File DB.Where("file_name = ? and auth_id = ?", fileName, auth_id).First(&file) return file } func FindFileByName(fileName string) File { var file File DB.Where("file_store_name = ?", fileName).First(&file) return file } func FindFileByAuthID(auth_id int) []File { var files []File DB.Where("auth_id = ?", auth_id).Find(&files) return files } func UpdateFileByID(id, auth_id int, fileStoreName, fileName, fileType, filePath string, fileSize int) bool { pd := FindFileByID(id, auth_id) if pd.ID == 0 { return false } result := DB.Model(&File{}).Where("id = ? and auth_id = ?", id, auth_id).Updates(File{FileStoreName: fileStoreName, FileName: fileName, FileType: fileType, FilePath: filePath, FileSize: fileSize}) if result.Error != nil { return false } return true } func DeleteFileByAuthID(auth_id int) bool { res := DB.Model(&File{}).Where("auth_id = ?", auth_id).Delete(&File{}) if res.Error != nil { return false } return true } func DeleteFileById(id int) bool { res := DB.Model(&File{}).Where("id = ?", id).Delete(&File{}) if res.Error != nil { return false } return true } func FindFileByMd5(md5 string) File { var file File if proto.Config.SERVER_SQL_LOG { DB.Debug().Where("md5 = ?", md5).First(&file) } else { DB.Where("md5 = ?", md5).First(&file) } return file } func CreateFileAuth(authID, fileID int, userFileName, uploadType string, isPrivate int, shareCode string) FileAuth { fileAuth := FileAuth{AuthID: authID, FileID: fileID, UserFileName: userFileName, UploadType: uploadType, IsPrivate: isPrivate, ShareCode: shareCode} var result *gorm.DB if proto.Config.SERVER_SQL_LOG { result = DB.Debug().Create(&fileAuth) } else { result = DB.Create(&fileAuth) } if result.Error != nil { return FileAuth{} } return fileAuth } func CreateConfigFile(file ConfigFile) (id uint, err error) { var result *gorm.DB if proto.Config.SERVER_SQL_LOG { result = DB.Debug().Create(&file) } else { result = DB.Create(&file) } return file.ID, result.Error } func FindConfigFileByID(id int, user_id int) ConfigFile { var file ConfigFile if proto.Config.SERVER_SQL_LOG { DB.Debug().Where("id = ? and auth_id = ?", id, user_id).First(&file) } else { DB.Where("id = ? and auth_id = ?", id, user_id).First(&file) } return file } func DeleteConfigFileByID(id int) error { var res *gorm.DB if proto.Config.SERVER_SQL_LOG { res = DB.Debug().Delete(&ConfigFile{}, id) } else { res = DB.Delete(&ConfigFile{}, id) } return res.Error } func UpdateConfigFileByID(id int, file ConfigFile) error { var res *gorm.DB if proto.Config.SERVER_SQL_LOG { res = DB.Debug().Model(&ConfigFile{}).Where("id = ?", id).Updates(&file) } else { res = DB.Model(&ConfigFile{}).Where("id = ?", id).Updates(&file) } return res.Error } func FindConfigFileByAuthID(auth_id int) []ConfigFile { var files []ConfigFile if proto.Config.SERVER_SQL_LOG { DB.Debug().Where("auth_id = ?", auth_id).Find(&files) } else { DB.Where("auth_id = ?", auth_id).Find(&files) } return files } // 通用通过用户id及类型查询 func FileUserFileList(userID int, fileType string) ([]FileAuth, []File) { var fileAuths []FileAuth var files []File query := DB.Where("file_auths.auth_id = ? AND file_auths.upload_type = ?", userID, fileType). Joins("LEFT JOIN files ON file_auths.file_id = files.id") if proto.Config.SERVER_SQL_LOG { query = query.Debug() } // 先查询 FileAuth 相关记录 resultAuth := query.Find(&fileAuths) if resultAuth.Error != nil { log.Printf("查询文件认证列表时出错,UserID: %d, FileType: %s, 错误信息: %v", userID, fileType, resultAuth.Error) return nil, nil } // 如果有 FileAuth 记录,再查询对应的 File 记录 if len(fileAuths) > 0 { fileIDs := make([]int, 0, len(fileAuths)) for _, auth := range fileAuths { fileIDs = append(fileIDs, auth.FileID) // 假设 FileAuth 结构体中有 FileID 字段 } resultFiles := DB.Where("id IN ?", fileIDs).Find(&files) if resultFiles.Error != nil { log.Printf("查询文件列表时出错,UserID: %d, FileType: %s, 错误信息: %v", userID, fileType, resultFiles.Error) return nil, nil } } return fileAuths, files } // 通过文件名及用户id查询(文件名模糊查询),索引不生效查询较慢 func FindFileByUserFileName(fileName string, userID int) []FileAuth { var files []FileAuth if proto.Config.SERVER_SQL_LOG { DB.Debug().Where("auth_id = ? and user_file_name LIKE ?", userID, "%"+fileName+"%").Find(&files) } else { DB.Where("auth_id = ? and user_file_name LIKE ?", userID, "%"+fileName+"%").Find(&files) } return files } // 删除文件 func DeleteFileAuthByID(id int) error { var res *gorm.DB if proto.Config.SERVER_SQL_LOG { res = DB.Debug().Delete(&FileAuth{}, id) } else { res = DB.Delete(&FileAuth{}, id) } return res.Error } // 修改文件名(暂时只能改文件名) func UpdateFileAuthByID(id int, file FileAuth) error { var res *gorm.DB if proto.Config.SERVER_SQL_LOG { res = DB.Debug().Model(&FileAuth{}).Where("id = ?", id).Updates(&file) } else { res = DB.Model(&FileAuth{}).Where("id = ?", id).Updates(&file) } return res.Error } // 根据FileAuth的id查询 func FindFileAuthByID(id int) FileAuth { var file FileAuth if proto.Config.SERVER_SQL_LOG { DB.Debug().Where("id = ?", id).First(&file) } else { DB.Where("id = ?", id).First(&file) } return file } // 获取用户文件占用空间 type UserFileSpace struct { TotalSize int `gorm:"column:total_size"` } func GetUserFileSpace(userID int) UserFileSpace { var space UserFileSpace if proto.Config.SERVER_SQL_LOG { DB.Debug().Raw("SELECT SUM(file_size) as total_size FROM file_auths left join files on file_auths.file_id = files.id where file_auths.auth_id=? AND file_auths.deleted_at IS NULL", userID).Scan(&space) } else { DB.Raw("SELECT SUM(file_size) as total_size FROM file_auths left join files on file_auths.file_id = files.id where file_auths.auth_id= ? AND file_auths.deleted_at IS NULL ", userID).Scan(&space) } return space } func FindFileAuthByName(fileName string, userID int) FileAuth { var file FileAuth var db2 *gorm.DB if proto.Config.SERVER_SQL_LOG { db2 = DB.Debug() } else { db2 = DB } db2.Where("user_file_name = ? and auth_id = ?", fileName, userID).First(&file) return file }