Browse Source

更改存储为mongoDB

huangyan 1 năm trước cách đây
mục cha
commit
f2b5de6c5b
8 tập tin đã thay đổi với 312 bổ sung111 xóa
  1. 204 111
      app/controller/file.go
  2. 4 0
      configs/config.yaml
  3. 27 0
      global/mongo.go
  4. 7 0
      global/setting.go
  5. 9 0
      go.mod
  6. 42 0
      go.sum
  7. 18 0
      log/app.log
  8. 1 0
      main.go

+ 204 - 111
app/controller/file.go

@@ -3,12 +3,12 @@ package controller
 import (
 	"context"
 	"file_upload/app/e"
-	"file_upload/app/model"
 	"file_upload/global"
 	"file_upload/simple_zap"
-	"github.com/bytedance/sonic"
 	"github.com/gin-gonic/gin"
 	"github.com/go-playground/validator/v10"
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/mongo/options"
 	"go.uber.org/zap"
 )
 
@@ -18,76 +18,84 @@ type Body struct {
 	Type bool
 }
 
-//	func FuileUpload(c *gin.Context) {
-//		const maxMemory = 1 << 20
-//		if err := c.Request.ParseMultipartForm(maxMemory); err != nil {
-//			e.ResponseWithMsg(c, e.ERROR, "获取文件失败")
-//			simple_zap.WithCtx(context.Background()).Sugar().Warn(err)
-//			return
-//		}
-//		file, err := c.FormFile("previewImage")
-//		formFile, err := c.FormFile("excalidrawLib")
-//		if err != nil {
-//			e.ResponseWithMsg(c, e.ERROR, "获取文件失败")
-//			simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取文件失败")
-//			return
-//		}
-//		title := c.PostForm("name")
-//		if err := c.SaveUploadedFile(file, "./upload/"+file.Filename+title+"."+"png"); err != nil {
-//			e.ResponseWithMsg(c, e.ERROR, "保存文件失败")
-//			simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "保存文件失败")
-//			return
-//		}
-//		if err := c.SaveUploadedFile(formFile, "./upload/"+formFile.Filename+title+"."+"excalidrawlib"); err != nil {
-//			e.ResponseWithMsg(c, e.ERROR, "保存文件失败")
-//			simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "保存文件失败")
-//			return
-//		}
-//		e.ResponseSuccess(c, e.SUCCESS)
+//func SaveFile(c *gin.Context) {
+//	file := Body{}
+//	err := c.BindJSON(&file)
+//	if err != nil {
+//		simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取参数失败")
+//		e.ResponseWithMsg(c, e.JSONParsingFailed, e.JSONParsingFailed.GetMsg())
+//		return
 //	}
-//
-//	func FileDwon(c *gin.Context) {
-//		filname := "cec.json"
-//		filpath := "./upload/" + filname
-//		if _, err := os.Stat(filpath); os.IsNotExist(err) {
-//			simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "文件获取失败")
-//			c.AbortWithStatus(http.StatusNotFound)
-//			return
-//		}
-//		// 设置 Content-Disposition 响应头,提供默认的文件名
-//		c.Header("Content-Disposition", "attachment; filename="+filname)
-//		// 发送文件内容
-//		c.File(filpath)
+//	m := map[string]any{
+//		"type": file.Type,
+//		"data": file.Data,
+//	}
+//	marshal, err := sonic.Marshal(m)
+//	if err != nil {
+//		simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "序列化失败")
+//		e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
+//		return
+//	}
+//	result, err := global.Rdb.Exists(context.Background(), file.Name).Result()
+//	if result == 1 {
+//		e.ResponseWithMsg(c, e.AlreadyExists, e.AlreadyExists.GetMsg())
+//		return
 //	}
+//	set := global.Rdb.Set(context.Background(), file.Name, marshal, 0)
+//	if set.Err() != nil {
+//		simple_zap.WithCtx(context.Background()).Sugar().Warn(set.Err(), "保存文件失败")
+//		e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
+//		return
+//	}
+//	e.ResponseSuccess(c, e.SUCCESS)
+//}
+
+// SaveFile 保存文件到MongoDB
+// 参数:
+// - c *gin.Context: Gin框架的上下文对象,用于处理HTTP请求和响应
+// 无返回值
 func SaveFile(c *gin.Context) {
+	// 解析请求体中的文件信息
 	file := Body{}
 	err := c.BindJSON(&file)
 	if err != nil {
+		// 日志记录参数解析失败
 		simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取参数失败")
+		// 返回参数解析失败的响应
 		e.ResponseWithMsg(c, e.JSONParsingFailed, e.JSONParsingFailed.GetMsg())
 		return
 	}
-	m := map[string]any{
+	// 准备将文件信息序列化为BSON格式(MongoDB使用的数据格式)
+	doc := bson.M{
+		"name": file.Name,
 		"type": file.Type,
 		"data": file.Data,
 	}
-	marshal, err := sonic.Marshal(m)
+	// 检查文件是否已存在
+	filter := bson.M{"name": file.Name}
+	count, err := global.MongoCon.CountDocuments(context.TODO(), filter)
 	if err != nil {
-		simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "序列化失败")
+		// 日志记录查询失败
+		simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "查询文件是否存在失败")
+		// 返回错误响应
 		e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
 		return
 	}
-	result, err := global.Rdb.Exists(context.Background(), file.Name).Result()
-	if result == 1 {
+	if count > 0 {
+		// 返回文件已存在的响应
 		e.ResponseWithMsg(c, e.AlreadyExists, e.AlreadyExists.GetMsg())
 		return
 	}
-	set := global.Rdb.Set(context.Background(), file.Name, marshal, 0)
-	if set.Err() != nil {
-		simple_zap.WithCtx(context.Background()).Sugar().Warn(set.Err(), "保存文件失败")
+	// 保存文件到MongoDB
+	_, err = global.MongoCon.InsertOne(context.TODO(), doc)
+	if err != nil {
+		// 日志记录保存文件失败
+		simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "保存文件失败")
+		// 返回保存文件失败的响应
 		e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
 		return
 	}
+	// 返回文件保存成功的响应
 	e.ResponseSuccess(c, e.SUCCESS)
 }
 
@@ -96,69 +104,115 @@ func SaveFile(c *gin.Context) {
 // - c *gin.Context: Gin框架的上下文对象,用于处理HTTP请求和响应
 // 返回值:
 // - 无
+//
+//	func TemplateItem(c *gin.Context) {
+//		type Types struct {
+//			Type bool `json:"type"`
+//		}
+//		t := &Types{}
+//		c.BindJSON(&t)
+//		var allKeys []string  // 存储所有检索到的模板项的键名
+//		var cursor uint64 = 0 // 用于分页查询的游标
+//		// 循环检索模板项,直到遍历完所有项或出现错误
+//		for {
+//			keys, newCursor, err := global.Rdb.Scan(context.Background(), cursor, "*", 100).Result() // 每次检索最多100个键名
+//			if err != nil {
+//				// 记录日志并返回错误信息
+//				simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取模板失败")
+//				e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
+//				return
+//			}
+//			allKeys = append(allKeys, keys...) // 将检索到的键名添加到allKeys列表
+//			cursor = newCursor                 // 更新游标
+//			if cursor == 0 {
+//				break // 如果游标为0,表示已遍历完所有项,退出循环
+//			}
+//		}
+//		m := make(map[string]any) // 创建一个map用于存储模板项的键名和对应的值
+//		// 遍历所有键名,获取其对应的值
+//		for _, key := range allKeys {
+//			result, err := global.Rdb.Get(context.Background(), key).Result()
+//			if err != nil {
+//				// 记录日志并返回错误信息
+//				simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取模板失败")
+//				e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
+//				return
+//			}
+//			file := model.Root{}
+//			//marshal, err := sonic.Marshal(result)
+//			err = sonic.Unmarshal([]byte(result), &file)
+//			if err != nil {
+//				// 记录日志并返回错误信息
+//				simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "序列化失败")
+//				e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
+//				return
+//			}
+//			if t.Type == file.Type {
+//				m[key] = result // 将键名和对应的值添加到map中
+//			}
+//		}
+//		// 返回所有模板项的键值对
+//		e.ResponseSuccess(c, m)
+//	}
 func TemplateItem(c *gin.Context) {
 	type Types struct {
 		Type bool `json:"type"`
 	}
 	t := &Types{}
 	c.BindJSON(&t)
-	var allKeys []string  // 存储所有检索到的模板项的键名
-	var cursor uint64 = 0 // 用于分页查询的游标
-	// 循环检索模板项,直到遍历完所有项或出现错误
-	for {
-		keys, newCursor, err := global.Rdb.Scan(context.Background(), cursor, "*", 100).Result() // 每次检索最多100个键名
-		if err != nil {
-			// 记录日志并返回错误信息
-			simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取模板失败")
-			e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
-			return
-		}
-		allKeys = append(allKeys, keys...) // 将检索到的键名添加到allKeys列表
-		cursor = newCursor                 // 更新游标
-		if cursor == 0 {
-			break // 如果游标为0,表示已遍历完所有项,退出循环
-		}
-	}
-	m := make(map[string]any) // 创建一个map用于存储模板项的键名和对应的值
-	// 遍历所有键名,获取其对应的值
-	for _, key := range allKeys {
-		result, err := global.Rdb.Get(context.Background(), key).Result()
-		if err != nil {
-			// 记录日志并返回错误信息
-			simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取模板失败")
-			e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
-			return
-		}
-		file := model.Root{}
-		//marshal, err := sonic.Marshal(result)
-		err = sonic.Unmarshal([]byte(result), &file)
-		if err != nil {
-			// 记录日志并返回错误信息
-			simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "序列化失败")
-			e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
-			return
-		}
-		if t.Type == file.Type {
-			m[key] = result // 将键名和对应的值添加到map中
-		}
-	}
-	// 返回所有模板项的键值对
-	e.ResponseSuccess(c, m)
+	filter := bson.M{
+		"type": t.Type,
+	}
+	var result []bson.M
+	opts := options.Find()
+	opts.SetProjection(bson.M{"_id": 0})
+	cur, err := global.MongoCon.Find(context.Background(), filter, opts)
+	if err != nil {
+		// 记录日志并返回错误信息
+		simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取模板失败")
+		e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
+		return
+	}
+	err = cur.All(context.Background(), &result)
+	if err != nil {
+		// 记录日志并返回错误信息
+		simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取模板失败")
+		e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
+		return
+	}
+	e.ResponseSuccess(c, result)
 }
 
 // GetTemplate 从服务器获取模板
+//func GetTemplate(c *gin.Context) {
+//	name := c.Query("name")
+//	if name == "" {
+//		e.ResponseWithMsg(c, e.ERROR, "参数错误")
+//		return
+//	}
+//	result, err := global.Rdb.Get(context.Background(), name).Result()
+//	if err != nil {
+//		simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取文件失败")
+//		e.ResponseWithMsg(c, e.ERROR, "获取文件失败")
+//		return
+//	}
+//	e.ResponseSuccess(c, result)
+//}
+
 func GetTemplate(c *gin.Context) {
 	name := c.Query("name")
 	if name == "" {
 		e.ResponseWithMsg(c, e.ERROR, "参数错误")
 		return
 	}
-	result, err := global.Rdb.Get(context.Background(), name).Result()
+	var result map[string]interface{}
+	err := global.MongoCon.FindOne(context.Background(), bson.M{"name": name}).Decode(&result)
 	if err != nil {
 		simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取文件失败")
 		e.ResponseWithMsg(c, e.ERROR, "获取文件失败")
 		return
 	}
+
 	e.ResponseSuccess(c, result)
 }
 
@@ -169,14 +223,51 @@ func DeleteTemplate(c *gin.Context) {
 		e.ResponseWithMsg(c, e.ERROR, "参数错误")
 		return
 	}
-	err := global.Rdb.Del(context.Background(), name).Err()
+	one, err := global.MongoCon.DeleteOne(context.Background(), bson.M{"name": name})
+	//err := global.Rdb.Del(context.Background(), name).Err()
 	if err != nil {
 		simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "删除文件失败")
 		e.ResponseWithMsg(c, e.ERROR, "删除文件失败")
 		return
 	}
-	e.ResponseSuccess(c, e.SUCCESS)
+	if one.DeletedCount > 0 {
+		e.ResponseSuccess(c, one)
+		return
+	}
+	e.ResponseWithMsg(c, e.ERROR, "删除文件失败")
 }
+
+//	func SearchTemplate(c *gin.Context) {
+//		query := c.Query("name")
+//		validate := validator.New()
+//		validate.Var("name", "required")
+//		if query == "" {
+//			e.ResponseWithMsg(c, e.ERROR, "参数错误")
+//			return
+//		}
+//		result, err := global.Rdb.Keys(context.Background(), "*"+query+"*").Result()
+//		if err != nil {
+//			simple_zap.Logger.Error("查询失败", zap.Error(err))
+//			e.ResponseWithMsg(c, e.ERROR, "查询失败")
+//			return
+//		}
+//		if len(result) == 0 {
+//			simple_zap.Logger.Info("查询失败")
+//			e.ResponseWithMsg(c, e.ERROR, "未找到文件")
+//			return
+//		}
+//		m := make(map[string]any)
+//		for _, v := range result {
+//			re, err := global.Rdb.Get(context.Background(), v).Result()
+//			if err != nil {
+//				simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取文件失败")
+//				e.ResponseWithMsg(c, e.ERROR, "获取文件失败")
+//				return
+//			}
+//			m[v] = re
+//		}
+//		e.ResponseSuccess(c, m)
+//	}
 func SearchTemplate(c *gin.Context) {
 	query := c.Query("name")
 	validate := validator.New()
@@ -185,26 +276,28 @@ func SearchTemplate(c *gin.Context) {
 		e.ResponseWithMsg(c, e.ERROR, "参数错误")
 		return
 	}
-	result, err := global.Rdb.Keys(context.Background(), "*"+query+"*").Result()
+	//result, err := global.Rdb.Keys(context.Background(), "*"+query+"*").Result()
+	fileter := bson.M{"name": bson.M{"$regex": query}}
+	var result []bson.M
+	find := options.Find()
+	find.SetProjection(bson.M{"_id": 0})
+	cursor, err := global.MongoCon.Find(context.Background(), fileter, find)
 	if err != nil {
 		simple_zap.Logger.Error("查询失败", zap.Error(err))
 		e.ResponseWithMsg(c, e.ERROR, "查询失败")
 		return
 	}
-	if len(result) == 0 {
-		simple_zap.Logger.Info("查询失败")
-		e.ResponseWithMsg(c, e.ERROR, "未找到文件")
-		return
-	}
-	m := make(map[string]any)
-	for _, v := range result {
-		re, err := global.Rdb.Get(context.Background(), v).Result()
-		if err != nil {
-			simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取文件失败")
-			e.ResponseWithMsg(c, e.ERROR, "获取文件失败")
-			return
-		}
-		m[v] = re
-	}
-	e.ResponseSuccess(c, m)
+	err = cursor.All(context.Background(), &result)
+
+	//m := make(map[string]any)
+	//for _, v := range result {
+	// re, err := global.Rdb.Get(context.Background(), v).Result()
+	// if err != nil {
+	//    simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取文件失败")
+	//    e.ResponseWithMsg(c, e.ERROR, "获取文件失败")
+	//    return
+	// }
+	// m[v] = re
+	//}
+	e.ResponseSuccess(c, result)
 }

+ 4 - 0
configs/config.yaml

@@ -40,6 +40,10 @@ redis:
   db: 0
 nats:
   NatsServer_Url: "nats://127.0.0.0:4222"
+mongo:
+    url: "mongodb://bzd_file:X7EeS6Yja5tGfXBR@116.204.6.184:27017/bzd_file"
+    password: "123456"
+    db: 0
 swag:
   # 将环境变量 NAME_OF_ENV_VARIABLE设置为任意值,则 /swagger/*any 返回404响应
   enable: "NAME_OF_ENV_VARIABLE"

+ 27 - 0
global/mongo.go

@@ -0,0 +1,27 @@
+package global
+
+import (
+	"context"
+	"file_upload/simple_zap"
+	"go.mongodb.org/mongo-driver/mongo"
+	"go.mongodb.org/mongo-driver/mongo/options"
+	"go.mongodb.org/mongo-driver/mongo/readpref"
+)
+
+var MongoCon *mongo.Collection
+
+func SetupMongo() {
+	clientOptions := options.Client().ApplyURI(MongoSetting.Url)
+	connect, err := mongo.Connect(context.TODO(), clientOptions)
+	if err != nil {
+		simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "mongo 出现异常")
+		panic(err)
+	}
+	err = connect.Ping(context.TODO(), readpref.Primary())
+	if err != nil {
+		simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "mongo 连接失败")
+		panic(err)
+	}
+	database := connect.Database("bzd_file")
+	MongoCon = database.Collection("file")
+}

+ 7 - 0
global/setting.go

@@ -48,6 +48,11 @@ type Redis struct {
 type Swagger struct {
 	Enable string `json:"enable"`
 }
+type Mongo struct {
+	Url      string `json:"url"`
+	Password string `json:"password"`
+	DB       int    `json:"db"`
+}
 
 var (
 	DatabaseSetting *DatabaseSettingS
@@ -57,6 +62,7 @@ var (
 	SubMailSetting  *SubMail
 	RedisSetting    *Redis
 	SwaggerSetting  *Swagger
+	MongoSetting    *Mongo
 )
 
 // SetupSetting 读取配置到全局变量
@@ -69,6 +75,7 @@ func SetupSetting() error {
 	err = s.ReadSection("SubMail", &SubMailSetting)
 	err = s.ReadSection("Redis", &RedisSetting)
 	err = s.ReadSection("Swagger", &SwaggerSetting)
+	err = s.ReadSection("Mongo", &MongoSetting)
 	if err != nil {
 		return err
 	}

+ 9 - 0
go.mod

@@ -23,9 +23,11 @@ require (
 	github.com/go-playground/universal-translator v0.18.1 // indirect
 	github.com/go-playground/validator/v10 v10.19.0 // indirect
 	github.com/goccy/go-json v0.10.2 // indirect
+	github.com/golang/snappy v0.0.1 // indirect
 	github.com/google/go-cmp v0.6.0 // indirect
 	github.com/hashicorp/hcl v1.0.0 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
+	github.com/klauspost/compress v1.17.0 // indirect
 	github.com/klauspost/cpuid/v2 v2.2.7 // indirect
 	github.com/leodido/go-urn v1.4.0 // indirect
 	github.com/magiconair/properties v1.8.7 // indirect
@@ -33,6 +35,7 @@ require (
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
+	github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
 	github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
 	github.com/pelletier/go-toml/v2 v2.2.0 // indirect
 	github.com/sagikazarmark/locafero v0.4.0 // indirect
@@ -44,11 +47,17 @@ require (
 	github.com/subosito/gotenv v1.6.0 // indirect
 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
 	github.com/ugorji/go/codec v1.2.12 // indirect
+	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
+	github.com/xdg-go/scram v1.1.2 // indirect
+	github.com/xdg-go/stringprep v1.0.4 // indirect
+	github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
+	go.mongodb.org/mongo-driver v1.15.0 // indirect
 	go.uber.org/multierr v1.10.0 // indirect
 	golang.org/x/arch v0.7.0 // indirect
 	golang.org/x/crypto v0.22.0 // indirect
 	golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
 	golang.org/x/net v0.24.0 // indirect
+	golang.org/x/sync v0.5.0 // indirect
 	golang.org/x/sys v0.19.0 // indirect
 	golang.org/x/text v0.14.0 // indirect
 	google.golang.org/protobuf v1.33.0 // indirect

+ 42 - 0
go.sum

@@ -39,6 +39,8 @@ github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC
 github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
 github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
 github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
@@ -46,6 +48,8 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM=
+github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
 github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
 github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
 github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
@@ -69,6 +73,8 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
 github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0=
+github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
 github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
@@ -116,6 +122,17 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS
 github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
 github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
 github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
+github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
+github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
+github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
+github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
+github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
+github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
+github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
+github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc=
+go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c=
 go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
 go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
 go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
@@ -125,18 +142,43 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
 golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
 golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc=
 golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
 golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
 golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
 golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
 golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
+golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
 golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
 golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
 golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
 google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

+ 18 - 0
log/app.log

@@ -117,3 +117,21 @@
 {"level":"warn","time":"2024-04-17T21:08:26.251+0800","lineNum":"global/redis.go:24","func":"file_upload/global.SetupRedisLink","message":"redis连接失败dial tcp 116.204.6.184:6379: i/o timeout"}
 {"level":"warn","time":"2024-04-17T21:40:56.616+0800","lineNum":"controller/file.go:112","func":"file_upload/app/controller.TemplateItem","message":"dial tcp 116.204.6.184:6379: i/o timeout获取模板失败"}
 {"level":"error","time":"2024-04-18T09:54:19.371+0800","lineNum":"controller/file.go:191","func":"file_upload/app/controller.SearchTemplate","message":"查询失败","error":"ERR wrong number of arguments for 'sinter' command"}
+{"level":"warn","time":"2024-04-18T14:12:14.471+0800","lineNum":"global/mongo.go:17","func":"file_upload/global.SetupMongo","message":"error parsing uri: scheme must be \"mongodb\" or \"mongodb+srv\"mongo 出现异常"}
+{"level":"warn","time":"2024-04-18T14:13:59.288+0800","lineNum":"global/mongo.go:22","func":"file_upload/global.SetupMongo","message":"server selection error: server selection timeout, current topology: { Type: Unknown, Servers: [{ Addr: 116.204.6.184:27017, Type: Unknown, Last error: dial tcp 116.204.6.184:27017: i/o timeout }, ] }mongo 连接失败"}
+{"level":"warn","time":"2024-04-18T14:17:04.891+0800","lineNum":"global/mongo.go:22","func":"file_upload/global.SetupMongo","message":"server selection error: server selection timeout, current topology: { Type: Unknown, Servers: [{ Addr: 116.204.6.184:27017, Type: Unknown, Last error: dial tcp 116.204.6.184:27017: i/o timeout }, ] }mongo 连接失败"}
+{"level":"warn","time":"2024-04-18T14:20:52.509+0800","lineNum":"global/mongo.go:22","func":"file_upload/global.SetupMongo","message":"server selection error: server selection timeout, current topology: { Type: Unknown, Servers: [{ Addr: 116.204.6.184:27017, Type: Unknown, Last error: dial tcp 116.204.6.184:27017: i/o timeout }, ] }mongo 连接失败"}
+{"level":"warn","time":"2024-04-18T14:31:54.505+0800","lineNum":"global/mongo.go:22","func":"file_upload/global.SetupMongo","message":"server selection error: server selection timeout, current topology: { Type: Unknown, Servers: [{ Addr: 116.204.6.184:27017, Type: Unknown, Last error: dial tcp 116.204.6.184:27017: i/o timeout }, ] }mongo 连接失败"}
+{"level":"warn","time":"2024-04-18T14:33:00.632+0800","lineNum":"global/mongo.go:22","func":"file_upload/global.SetupMongo","message":"server selection error: server selection timeout, current topology: { Type: Unknown, Servers: [{ Addr: 116.204.6.184:27017, Type: Unknown, Last error: dial tcp 116.204.6.184:27017: i/o timeout }, ] }mongo 连接失败"}
+{"level":"info","time":"2024-04-18T15:42:32.925+0800","lineNum":"controller/file.go:223","func":"file_upload/app/controller.SearchTemplate","message":"查询失败"}
+{"level":"info","time":"2024-04-18T15:47:22.746+0800","lineNum":"controller/file.go:226","func":"file_upload/app/controller.SearchTemplate","message":"查询失败"}
+{"level":"warn","time":"2024-04-18T16:21:27.323+0800","lineNum":"controller/file.go:147","func":"file_upload/app/controller.TemplateItem","message":"\"Syntax error at index 3: invalid char\\n\\n\\t\\n\\nssh-rsa AAAAB3NzaC1yc2EAAAADAQ\\n\\t...^............................\\n\"序列化失败"}
+{"level":"warn","time":"2024-04-18T16:27:58.475+0800","lineNum":"controller/file.go:147","func":"file_upload/app/controller.TemplateItem","message":"\"Syntax error at index 3: invalid char\\n\\n\\t\\n\\nssh-rsa AAAAB3NzaC1yc2EAAAADAQ\\n\\t...^............................\\n\"序列化失败"}
+{"level":"warn","time":"2024-04-18T16:28:43.954+0800","lineNum":"controller/file.go:147","func":"file_upload/app/controller.TemplateItem","message":"\"Syntax error at index 3: invalid char\\n\\n\\t\\n\\nssh-rsa AAAAB3NzaC1yc2EAAAADAQ\\n\\t...^............................\\n\"序列化失败"}
+{"level":"warn","time":"2024-04-18T16:30:16.483+0800","lineNum":"controller/file.go:184","func":"file_upload/app/controller.GetTemplate","message":"mongo: no documents in result获取文件失败"}
+{"level":"warn","time":"2024-04-18T16:33:17.251+0800","lineNum":"controller/file.go:147","func":"file_upload/app/controller.TemplateItem","message":"\"Syntax error at index 3: invalid char\\n\\n\\t\\n\\nssh-rsa AAAAB3NzaC1yc2EAAAADAQ\\n\\t...^............................\\n\"序列化失败"}
+{"level":"warn","time":"2024-04-18T16:34:05.614+0800","lineNum":"controller/file.go:147","func":"file_upload/app/controller.TemplateItem","message":"\"Syntax error at index 3: invalid char\\n\\n\\t\\n\\nssh-rsa AAAAB3NzaC1yc2EAAAADAQ\\n\\t...^............................\\n\"序列化失败"}
+{"level":"warn","time":"2024-04-18T16:35:01.965+0800","lineNum":"controller/file.go:147","func":"file_upload/app/controller.TemplateItem","message":"\"Syntax error at index 3: invalid char\\n\\n\\t\\n\\nssh-rsa AAAAB3NzaC1yc2EAAAADAQ\\n\\t...^............................\\n\"序列化失败"}
+{"level":"warn","time":"2024-04-18T16:35:27.373+0800","lineNum":"controller/file.go:147","func":"file_upload/app/controller.TemplateItem","message":"\"Syntax error at index 3: invalid char\\n\\n\\t\\n\\nssh-rsa AAAAB3NzaC1yc2EAAAADAQ\\n\\t...^............................\\n\"序列化失败"}
+{"level":"warn","time":"2024-04-18T16:42:42.296+0800","lineNum":"controller/file.go:147","func":"file_upload/app/controller.TemplateItem","message":"\"Syntax error at index 3: invalid char\\n\\n\\t\\n\\nssh-rsa AAAAB3NzaC1yc2EAAAADAQ\\n\\t...^............................\\n\"序列化失败"}
+{"level":"warn","time":"2024-04-18T16:42:44.482+0800","lineNum":"controller/file.go:147","func":"file_upload/app/controller.TemplateItem","message":"\"Syntax error at index 3: invalid char\\n\\n\\t\\n\\nssh-rsa AAAAB3NzaC1yc2EAAAADAQ\\n\\t...^............................\\n\"序列化失败"}

+ 1 - 0
main.go

@@ -13,6 +13,7 @@ func init() {
 		simple_zap.WithCtx(context.Background()).Sugar().Warn(err)
 		return
 	}
+	global.SetupMongo()
 	global.SetupRedisLink()
 }
 func main() {