From 58a0c9e8c3f3d3057e26d3ae6efa25d96c216963 Mon Sep 17 00:00:00 2001 From: junleea <354425203@qq.com> Date: Fri, 28 Mar 2025 20:28:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dfile=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E6=9C=AA=E8=AE=BE=E7=BD=AE=E5=88=B0=E7=94=A8=E6=88=B7,?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9F=A5=E8=AF=A2=E6=95=B0=E6=8D=AE=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dao/file.go | 38 ++++++++++++++++++++++++-------------- handler/file.go | 4 ++-- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/dao/file.go b/dao/file.go index 8dbf48a..8366939 100644 --- a/dao/file.go +++ b/dao/file.go @@ -37,13 +37,7 @@ type ConfigFile struct { } type FileAuthListResp 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"` // 分享码,用于分享时的验证,构建分享链接 + FileAuth FileStoreName string `gorm:"column:file_store_name;type:varchar(255);uniqueIndex:idx_file_name"` } @@ -191,8 +185,10 @@ func FindConfigFileByAuthID(auth_id int) []ConfigFile { } // 通用通过用户id及类型查询 -func FileUserFileList(userID int, fileType string) []FileAuthListResp { - var files []FileAuthListResp +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") @@ -200,13 +196,27 @@ func FileUserFileList(userID int, fileType string) []FileAuthListResp { query = query.Debug() } - result := query.Find(&files) - if result.Error != nil { - log.Printf("查询文件列表时出错,UserID: %d, FileType: %s, 错误信息: %v", userID, fileType, result.Error) - return nil + // 先查询 FileAuth 相关记录 + resultAuth := query.Find(&fileAuths) + if resultAuth.Error != nil { + log.Printf("查询文件认证列表时出错,UserID: %d, FileType: %s, 错误信息: %v", userID, fileType, resultAuth.Error) + return nil, nil } - return files + // 如果有 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查询(文件名模糊查询),索引不生效查询较慢 diff --git a/handler/file.go b/handler/file.go index 397d64d..20e2e92 100644 --- a/handler/file.go +++ b/handler/file.go @@ -34,8 +34,8 @@ func GetUserFileList(c *gin.Context) { var req GetUserFileListReq if err := c.ShouldBind(&req); err == nil { if req.Type == "all" { - fileList := dao.FileUserFileList(user_id, proto.UserFileTypeFile) - c.JSON(http.StatusOK, gin.H{"code": proto.SuccessCode, "msg": "success", "data": fileList}) + fileList, files := dao.FileUserFileList(user_id, proto.UserFileTypeFile) + c.JSON(http.StatusOK, gin.H{"code": proto.SuccessCode, "msg": "success", "data": fileList, "files": files}) } else if req.Type == "search" { fileList := dao.FindFileByUserFileName(req.FileName, user_id) c.JSON(http.StatusOK, gin.H{"code": proto.SuccessCode, "msg": "success", "data": fileList})