file.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. package controller
  2. import (
  3. "context"
  4. "encoding/base64"
  5. "file_upload/app/e"
  6. "file_upload/global"
  7. "file_upload/simple_zap"
  8. "file_upload/utils"
  9. "github.com/gin-gonic/gin"
  10. "github.com/go-playground/validator/v10"
  11. "go.mongodb.org/mongo-driver/bson"
  12. "go.mongodb.org/mongo-driver/mongo/options"
  13. "go.uber.org/zap"
  14. "os"
  15. )
  16. type Body struct {
  17. Name string
  18. Data any
  19. Type bool
  20. }
  21. // SaveFile 保存文件到MongoDB
  22. // 参数:
  23. // - c *gin.Context: Gin框架的上下文对象,用于处理HTTP请求和响应
  24. // 无返回值
  25. func SaveFile(c *gin.Context) {
  26. // 解析请求体中的文件信息
  27. file := Body{}
  28. err := c.BindJSON(&file)
  29. if err != nil {
  30. // 日志记录参数解析失败
  31. simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取参数失败")
  32. // 返回参数解析失败的响应
  33. e.ResponseWithMsg(c, e.JSONParsingFailed, e.JSONParsingFailed.GetMsg())
  34. return
  35. }
  36. // 检查文件是否已存在
  37. filter := bson.M{"name": file.Name}
  38. count, err := global.MongoCon.CountDocuments(context.TODO(), filter)
  39. if err != nil {
  40. // 日志记录查询失败
  41. simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "查询文件是否存在失败")
  42. // 返回错误响应
  43. e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
  44. return
  45. }
  46. if count > 0 {
  47. // 返回文件已存在的响应
  48. e.ResponseWithMsg(c, e.AlreadyExists, e.AlreadyExists.GetMsg())
  49. return
  50. }
  51. var url string = "https://erp.baozhida.cn/assets/icon-91f5d92f.png"
  52. // 准备将文件信息序列化为BSON格式(MongoDB使用的数据格式)
  53. m, ok := file.Data.(map[string]any)
  54. if ok {
  55. elements := m["elements"].([]any)
  56. for _, v := range elements {
  57. imageurl := v.(map[string]any)["url"]
  58. if imageurl != nil {
  59. _, data := utils.ParseBase64ImageString(imageurl.(string))
  60. decodeString, err := base64.StdEncoding.DecodeString(data)
  61. if err != nil {
  62. simple_zap.WithCtx(context.TODO()).Sugar().Warn(err, "base64解码失败")
  63. e.ResponseWithMsg(c, e.ERROR, "图片转换失败")
  64. return
  65. }
  66. optputpath := "./upload" + "/" + file.Name + ".png"
  67. create, err := os.Create(optputpath)
  68. if err != nil {
  69. simple_zap.WithCtx(context.TODO()).Sugar().Warn(err, "创建文件失败")
  70. e.ResponseWithMsg(c, e.ERROR, "创建文件失败")
  71. return
  72. }
  73. defer create.Close()
  74. _, err = create.Write(decodeString)
  75. if err != nil {
  76. simple_zap.WithCtx(context.TODO()).Sugar().Warn(err, "写入文件失败")
  77. e.ResponseWithMsg(c, e.ERROR, "写入文件失败")
  78. return
  79. }
  80. simple_zap.WithCtx(context.TODO()).Sugar().Info("文件写入成功")
  81. url = "http://localhost:8080/dwonload/" + file.Name + ".png"
  82. }
  83. }
  84. }
  85. doc := bson.M{
  86. "name": file.Name,
  87. "type": file.Type,
  88. "data": file.Data,
  89. "url": url,
  90. }
  91. // 保存文件到MongoDB
  92. _, err = global.MongoCon.InsertOne(context.TODO(), doc)
  93. if err != nil {
  94. // 日志记录保存文件失败
  95. simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "保存文件失败")
  96. // 返回保存文件失败的响应
  97. e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
  98. return
  99. }
  100. // 返回文件保存成功的响应
  101. e.ResponseSuccess(c, e.SUCCESS)
  102. }
  103. func TemplateItem(c *gin.Context) {
  104. type Types struct {
  105. Type bool `json:"type"`
  106. }
  107. t := &Types{}
  108. c.BindJSON(&t)
  109. filter := bson.M{
  110. "type": t.Type,
  111. }
  112. var result []bson.M
  113. opts := options.Find()
  114. opts.SetProjection(bson.M{
  115. "_id": 0,
  116. "data": 0,
  117. })
  118. cur, err := global.MongoCon.Find(context.Background(), filter, opts)
  119. if err != nil {
  120. // 记录日志并返回错误信息
  121. simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取模板失败")
  122. e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
  123. return
  124. }
  125. err = cur.All(context.Background(), &result)
  126. if err != nil {
  127. // 记录日志并返回错误信息
  128. simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取模板失败")
  129. e.ResponseWithMsg(c, e.ERROR, e.ERROR.GetMsg())
  130. return
  131. }
  132. e.ResponseSuccess(c, result)
  133. }
  134. func GetTemplate(c *gin.Context) {
  135. name := c.Query("name")
  136. if name == "" {
  137. e.ResponseWithMsg(c, e.ERROR, "参数错误")
  138. return
  139. }
  140. var result map[string]interface{}
  141. err := global.MongoCon.FindOne(context.Background(), bson.M{"name": name}).Decode(&result)
  142. if err != nil {
  143. simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "获取文件失败")
  144. e.ResponseWithMsg(c, e.ERROR, "获取文件失败")
  145. return
  146. }
  147. e.ResponseSuccess(c, result)
  148. }
  149. // DeleteTemplate 删除模板
  150. func DeleteTemplate(c *gin.Context) {
  151. name := c.Query("name")
  152. if name == "" {
  153. e.ResponseWithMsg(c, e.ERROR, "参数错误")
  154. return
  155. }
  156. one, err := global.MongoCon.DeleteOne(context.Background(), bson.M{"name": name})
  157. //err := global.Rdb.Del(context.Background(), name).Err()
  158. if err != nil {
  159. simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "删除文件失败")
  160. e.ResponseWithMsg(c, e.ERROR, "删除文件失败")
  161. return
  162. }
  163. if one.DeletedCount > 0 {
  164. e.ResponseSuccess(c, one)
  165. return
  166. }
  167. e.ResponseWithMsg(c, e.ERROR, "删除文件失败")
  168. }
  169. func SearchTemplate(c *gin.Context) {
  170. query := c.Query("name")
  171. validate := validator.New()
  172. validate.Var("name", "required")
  173. if query == "" {
  174. e.ResponseWithMsg(c, e.ERROR, "参数错误")
  175. return
  176. }
  177. //result, err := global.Rdb.Keys(context.Background(), "*"+query+"*").Result()
  178. fileter := bson.M{"name": bson.M{"$regex": query}}
  179. var result []bson.M
  180. find := options.Find()
  181. find.SetProjection(bson.M{
  182. "_id": 0,
  183. "data": 0,
  184. })
  185. cursor, err := global.MongoCon.Find(context.Background(), fileter, find)
  186. if err != nil {
  187. simple_zap.Logger.Error("查询失败", zap.Error(err))
  188. e.ResponseWithMsg(c, e.ERROR, "查询失败")
  189. return
  190. }
  191. err = cursor.All(context.Background(), &result)
  192. e.ResponseSuccess(c, result)
  193. }