package dao import ( "StuAcaWorksAI/proto" "gorm.io/gorm" ) 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"` } 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 { var files []FileAuth if proto.Config.SERVER_SQL_LOG { DB.Debug().Where("auth_id = ? and upload_type = ?", userID, fileType).Find(&files) } else { DB.Where("auth_id = ? and upload_type = ?", userID, fileType).Find(&files) } return 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 }