add search function

This commit is contained in:
2025-03-03 00:59:52 +08:00
parent 58c58546d2
commit 4d0f628586
29 changed files with 982 additions and 142 deletions

View File

@@ -9,7 +9,7 @@ import (
"github.com/redis/go-redis/v9"
"github.com/zeromicro/go-zero/core/logx"
"gorm.io/gorm"
"mime/multipart"
"net/http"
"schisandra-album-cloud-microservices/app/auth/api/internal/svc"
"schisandra-album-cloud-microservices/app/auth/api/internal/types"
"schisandra-album-cloud-microservices/app/auth/model/mysql/model"
@@ -19,6 +19,7 @@ import (
"schisandra-album-cloud-microservices/common/nsqx"
"schisandra-album-cloud-microservices/common/storage/config"
"strconv"
"time"
)
type NsqImageProcessConsumer struct {
@@ -60,7 +61,7 @@ func (c *NsqImageProcessConsumer) HandleMessage(msg *nsq.Message) error {
}
// 将文件信息存入数据库
storageId, err := c.saveFileInfoToDB(message.UID, message.Result.Bucket, message.Result.Provider, message.FileHeader, message.Result, message.FaceID, message.FilePath, locationId, message.Result.AlbumId)
storageId, err := c.saveFileInfoToDB(message.UID, message.Result.Bucket, message.Result.Provider, message.FileName, message.FileSize, message.Result, message.FaceID, message.FilePath, locationId, message.Result.AlbumId)
if err != nil {
return err
}
@@ -71,6 +72,46 @@ func (c *NsqImageProcessConsumer) HandleMessage(msg *nsq.Message) error {
// 删除缓存
c.afterImageUpload(message.UID)
zincFileInfo := types.ZincFileInfo{
FaceID: message.FaceID,
FileName: message.FileName,
FileSize: message.FileSize,
UID: message.UID,
FilePath: message.FilePath,
ThumbPath: message.ThumbPath,
CreatedAt: time.Now().UTC(),
StorageId: storageId,
Provider: message.Result.Provider,
Bucket: message.Result.Bucket,
FileType: message.Result.FileType,
IsAnime: message.Result.IsAnime,
TagName: message.Result.TagName,
Landscape: message.Result.Landscape,
TopCategory: message.Result.TopCategory,
IsScreenshot: message.Result.IsScreenshot,
Width: message.Result.Width,
Height: message.Result.Height,
Longitude: message.Result.Longitude,
Latitude: message.Result.Latitude,
ThumbW: message.Result.ThumbW,
ThumbH: message.Result.ThumbH,
ThumbSize: message.Result.ThumbSize,
AlbumId: message.Result.AlbumId,
HasQrcode: message.Result.HasQrcode,
Country: country,
Province: province,
City: city,
}
err = c.svcCtx.ZincClient.CreateFileUploadIndex(constant.ZincIndexNameStorageInfo)
if err != nil {
return err
}
_, err = c.insertFileInfoTOZinc(constant.ZincIndexNameStorageInfo, storageId, zincFileInfo)
if err != nil {
return err
}
return nil
}
@@ -225,7 +266,7 @@ func (c *NsqImageProcessConsumer) saveFileThumbnailInfoToDB(uid string, filePath
}
// 将 EXIF 和文件信息存入数据库
func (c *NsqImageProcessConsumer) saveFileInfoToDB(uid, bucket, provider string, header *multipart.FileHeader, result types.File, faceId int64, filePath string, locationID, albumId int64) (int64, error) {
func (c *NsqImageProcessConsumer) saveFileInfoToDB(uid, bucket, provider string, fileName string, fileSize int64, result types.File, faceId int64, filePath string, locationID, albumId int64) (int64, error) {
tx := c.svcCtx.DB.Begin()
defer func() {
if r := recover(); r != nil {
@@ -238,8 +279,8 @@ func (c *NsqImageProcessConsumer) saveFileInfoToDB(uid, bucket, provider string,
UserID: uid,
Provider: provider,
Bucket: bucket,
FileName: header.Filename,
FileSize: strconv.FormatInt(header.Size, 10),
FileName: fileName,
FileSize: strconv.FormatInt(fileSize, 10),
FileType: result.FileType,
Path: filePath,
FaceID: faceId,
@@ -261,6 +302,7 @@ func (c *NsqImageProcessConsumer) saveFileInfoToDB(uid, bucket, provider string,
Tag: result.TagName,
IsAnime: strconv.FormatBool(result.IsAnime),
Category: result.TopCategory,
HasQrcode: strconv.FormatBool(result.HasQrcode),
}
err = tx.ScaStorageExtra.Create(scaStorageExtra)
if err != nil {
@@ -292,6 +334,22 @@ func (c *NsqImageProcessConsumer) afterImageUpload(uid string) {
// 删除所有匹配的键
if err := c.svcCtx.RedisClient.Del(c.ctx, keys...).Err(); err != nil {
logx.Errorf("删除缓存键 %s 失败: %v", keyPattern, err)
}
}
func (c *NsqImageProcessConsumer) insertFileInfoTOZinc(indexName string, docID int64, message types.ZincFileInfo) (int64, error) {
url := fmt.Sprintf("%s/api/%s/_doc/%v", c.svcCtx.ZincClient.BaseURL, indexName, docID)
resp, err := c.svcCtx.ZincClient.Client.R().
SetBasicAuth(c.svcCtx.ZincClient.Username, c.svcCtx.ZincClient.Password).
SetHeader("Content-Type", "application/json").
SetBody(message).
Put(url)
if err != nil {
return 0, fmt.Errorf("请求失败: %w", err)
}
if resp.StatusCode() != http.StatusOK {
return 0, fmt.Errorf("插入失败 (状态码 %d): %s", resp.StatusCode(), resp.String())
}
return docID, nil
}