123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- package controller
- import (
- "context"
- "encoding/base64"
- "file_upload/app/e"
- "file_upload/global"
- "file_upload/simple_zap"
- "file_upload/utils"
- "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"
- "os"
- )
- type Body struct {
- Name string
- Data any
- Type bool
- }
- // 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
- }
- // 检查文件是否已存在
- 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, "查询文件是否存在失败")
- // 返回错误响应
- e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
- return
- }
- if count > 0 {
- // 返回文件已存在的响应
- e.ResponseWithMsg(c, e.AlreadyExists, e.AlreadyExists.GetMsg())
- return
- }
- var url string = "https://erp.baozhida.cn/assets/icon-91f5d92f.png"
- // 准备将文件信息序列化为BSON格式(MongoDB使用的数据格式)
- m, ok := file.Data.(map[string]any)
- if ok {
- elements := m["elements"].([]any)
- for _, v := range elements {
- imageurl := v.(map[string]any)["url"]
- if imageurl != nil {
- _, data := utils.ParseBase64ImageString(imageurl.(string))
- decodeString, err := base64.StdEncoding.DecodeString(data)
- if err != nil {
- simple_zap.WithCtx(context.TODO()).Sugar().Warn(err, "base64解码失败")
- e.ResponseWithMsg(c, e.ERROR, "图片转换失败")
- return
- }
- optputpath := "./upload" + "/" + file.Name + ".png"
- create, err := os.Create(optputpath)
- if err != nil {
- simple_zap.WithCtx(context.TODO()).Sugar().Warn(err, "创建文件失败")
- e.ResponseWithMsg(c, e.ERROR, "创建文件失败")
- return
- }
- defer create.Close()
- _, err = create.Write(decodeString)
- if err != nil {
- simple_zap.WithCtx(context.TODO()).Sugar().Warn(err, "写入文件失败")
- e.ResponseWithMsg(c, e.ERROR, "写入文件失败")
- return
- }
- simple_zap.WithCtx(context.TODO()).Sugar().Info("文件写入成功")
- url = "http://localhost:8080/dwonload/" + file.Name + ".png"
- }
- }
- }
- doc := bson.M{
- "name": file.Name,
- "type": file.Type,
- "data": file.Data,
- "url": url,
- }
- // 保存文件到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)
- }
- func TemplateItem(c *gin.Context) {
- type Types struct {
- Type bool `json:"type"`
- }
- t := &Types{}
- c.BindJSON(&t)
- filter := bson.M{
- "type": t.Type,
- }
- var result []bson.M
- opts := options.Find()
- opts.SetProjection(bson.M{
- "_id": 0,
- "data": 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)
- }
- func GetTemplate(c *gin.Context) {
- name := c.Query("name")
- if name == "" {
- e.ResponseWithMsg(c, e.ERROR, "参数错误")
- return
- }
- 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)
- }
- // DeleteTemplate 删除模板
- func DeleteTemplate(c *gin.Context) {
- name := c.Query("name")
- if name == "" {
- e.ResponseWithMsg(c, e.ERROR, "参数错误")
- return
- }
- 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
- }
- 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()
- fileter := bson.M{"name": bson.M{"$regex": query}}
- var result []bson.M
- find := options.Find()
- find.SetProjection(bson.M{
- "_id": 0,
- "data": 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
- }
- err = cursor.All(context.Background(), &result)
- e.ResponseSuccess(c, result)
- }
|