Kaynağa Gözat

增加部分功能

wucan 1 ay önce
ebeveyn
işleme
a89da972c3
8 değiştirilmiş dosya ile 166 ekleme ve 11 silme
  1. 2 3
      bootstrap/mongodb.go
  2. 127 0
      controller/v1/file.go
  3. 4 3
      controller/v1/user.go
  4. 7 2
      controller/v1/userBehavior.go
  5. 8 1
      go.mod
  6. 10 0
      model/file.go
  7. 7 1
      route/api.go
  8. 1 1
      utils/time.go

+ 2 - 3
bootstrap/mongodb.go

@@ -14,13 +14,12 @@ func InitializeMongo() *mongo.Client {
 
 	var url string
 	if config.Get("app.local") == "local" {
-		url = "mongodb://localhost:27017"
+		//url = "mongodb://localhost:27017"
+		url = "mongodb://admin:admin@124.223.73.12:27017"
 	} else {
 		url = "mongodb://admin:admin@localhost:27017"
 	}
 
-	url = "mongodb://admin:admin@124.223.73.12:27017"
-
 	client, _ := mongo.Connect(mongoOption.Client().ApplyURI(url))
 	//client, _ := mongo.Connect(mongoOption.Client().ApplyURI("mongodb://localhost:27017"))
 	err := client.Ping(context.Background(), readpref.Primary())

+ 127 - 0
controller/v1/file.go

@@ -0,0 +1,127 @@
+package v1
+
+import (
+	"context"
+	"designs/app/common/request"
+	"designs/global"
+	"designs/model"
+	"designs/response"
+	"fmt"
+	"github.com/gin-gonic/gin"
+	"github.com/tencentyun/cos-go-sdk-v5"
+	"net/http"
+	"net/url"
+	"path/filepath"
+	"time"
+)
+
+func FileList(c *gin.Context) {
+	form := request.Check(c, &struct {
+		Offset *int   `form:"offset" binding:"required"`
+		Limit  *int   `form:"limit" binding:"required"`
+		Search string `form:"search" binding:""`
+	}{})
+
+	query := global.App.DB.Table("file")
+	if form.Search != "" {
+		query = query.Where("fileName", "like", "%"+form.Search+"%")
+	}
+	var count int64
+	err := query.Count(&count).Error
+	if err != nil {
+		response.Fail(c, 1001, err.Error())
+		return
+	}
+
+	var files []model.File
+	err = query.Offset(*form.Offset).Limit(*form.Limit).Scan(&files).Error
+	if err != nil {
+		response.Fail(c, 1002, err.Error())
+		return
+	}
+
+	response.Success(c, gin.H{
+		"count": count,
+		"data":  files,
+	})
+}
+
+func FileDelete(c *gin.Context) {
+	form := request.Check(c, &struct {
+		FileId int `form:"fileId" json:"fileId" binding:"required"`
+	}{})
+	var d interface{}
+	err := global.App.DB.Table("file").Where("id", form.FileId).Delete(d).Error
+	if err != nil {
+		response.Fail(c, 2001, err.Error())
+		return
+	}
+
+	//删除本地文件和云端文件
+
+	response.Success(c, gin.H{})
+
+}
+
+func LocalFileToService(c *gin.Context) {
+	form := request.Check(c, &struct {
+		FilePath string `form:"filePath" json:"filePath" binding:"required"`
+	}{})
+
+	path, err := FileToService(form.FilePath)
+	if err != nil {
+		response.Fail(c, 1004, err.Error())
+		return
+	}
+
+	now := model.XTime{
+		Time: time.Now(),
+	}
+
+	//存储到mysql
+	err = global.App.DB.Table("file").Create(&model.File{
+		CreatedAt: now,
+		UpdatedAt: now,
+		FileName:  filepath.Base(form.FilePath),
+		LocalPath: form.FilePath,
+		CosPath:   path,
+	}).Error
+	if err != nil {
+		response.Fail(c, 2001, err.Error())
+		return
+	}
+
+	response.Success(c, gin.H{
+		"file_path": path,
+	})
+}
+
+func FileToService(filePath string) (string, error) {
+	// 将 examplebucket-1250000000 和 COS_REGION 修改为用户真实的信息
+	// 存储桶名称,由 bucketname-appid 组成,appid 必须填入,可以在 COS 控制台查看存储桶名称。https://console.cloud.tencent.com/cos5/bucket
+	// COS_REGION 可以在控制台查看,https://console.cloud.tencent.com/cos5/bucket, 关于地域的详情见 https://cloud.tencent.com/document/product/436/6224
+	u, _ := url.Parse("https://chunhao-1257323087.cos.ap-shanghai.myqcloud.com")
+	// 用于 Get Service 查询,默认全地域 service.cos.myqcloud.com
+	su, _ := url.Parse("https://service.cos.myqcloud.com")
+	b := &cos.BaseURL{BucketURL: u, ServiceURL: su}
+	// 1.永久密钥
+	client := cos.NewClient(b, &http.Client{
+		Transport: &cos.AuthorizationTransport{
+			SecretID:  "AKIDgQ2TzTq381nQrAJKBC8tSqCNM9lBQTQB", // 用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考 https://cloud.tencent.com/document/product/598/37140
+			SecretKey: "gBVWO4dzCD5qeKoy30phTBi7NXYYM2b0",     // 用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考 https://cloud.tencent.com/document/product/598/37140
+		},
+	})
+
+	key := filepath.Base(filePath)
+	res, _, err := client.Object.Upload(
+		context.Background(), key, filePath, nil,
+	)
+	fmt.Println(res)
+	if err != nil {
+		return "", err
+	}
+
+	ourl := client.Object.GetObjectURL(key)
+
+	return ourl.Host + ourl.Path, nil
+}

+ 4 - 3
controller/v1/user.go

@@ -269,21 +269,22 @@ func Upload(c *gin.Context) {
 	// 获取文件
 	file, err := c.FormFile("file")
 	if err != nil {
-		c.JSON(400, gin.H{"error": "未选择文件"})
+		response.Fail(c, 400, "未选择文件")
 		return
 	}
 
 	// 存储路径生成
 	saveDir := fmt.Sprintf("uploads/%s", time.Now().Format("2006-01-02"))
+
 	os.MkdirAll(saveDir, 0755)
+
 	savePath := filepath.Join(saveDir, file.Filename)
 
 	// 保存文件
 	if err := c.SaveUploadedFile(file, savePath); err != nil {
-		c.JSON(500, gin.H{"error": "文件保存失败"})
+		response.Fail(c, 500, "文件保存失败")
 		return
 	}
-	fmt.Println(savePath)
 
 	response.Success(c, gin.H{
 		"path": savePath,

+ 7 - 2
controller/v1/userBehavior.go

@@ -1230,7 +1230,7 @@ func BehaviorListCake(c *gin.Context) {
 		filterListTotalDuration[name] = filter
 	}
 
-	if form.TotalAdReqCount != "" {
+	if form.TotalAdReqCount != "" && form.TotalAdEposedCount == "" {
 		totalDuration := strings.Split(strings.Replace(form.TotalAdReqCount, ",", ",", -1), ",")
 
 		for k, _ := range totalDuration {
@@ -1300,7 +1300,7 @@ func BehaviorListCake(c *gin.Context) {
 		//})
 	}
 
-	if form.TotalAdEposedCount != "" {
+	if form.TotalAdEposedCount != "" && form.TotalAdReqCount == "" {
 		totalDuration := strings.Split(strings.Replace(form.TotalAdEposedCount, ",", ",", -1), ",")
 
 		for k, _ := range totalDuration {
@@ -1370,6 +1370,11 @@ func BehaviorListCake(c *gin.Context) {
 		//})
 	}
 
+	if form.TotalAdEposedCount != "" && form.TotalAdReqCount != "" {
+		response.Fail(c, 1002, "筛选条件无效")
+		return
+	}
+
 	if len(filterList) == 0 {
 		filterList = filterListTotalDuration
 	}

+ 8 - 1
go.mod

@@ -21,7 +21,14 @@ require (
 	gorm.io/gorm v1.25.11
 )
 
-require github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
+require (
+	github.com/clbanning/mxj v1.8.4 // indirect
+	github.com/google/go-querystring v1.1.0 // indirect
+	github.com/mitchellh/mapstructure v1.5.0 // indirect
+	github.com/mozillazg/go-httpheader v0.4.0 // indirect
+	github.com/tencentyun/cos-go-sdk-v5 v0.7.65 // indirect
+	github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
+)
 
 require (
 	filippo.io/edwards25519 v1.1.0 // indirect

+ 10 - 0
model/file.go

@@ -0,0 +1,10 @@
+package model
+
+type File struct {
+	Id        int    `json:"id" gorm:"primary_key"`
+	FileName  string `json:"file_name" gorm:"column:fileName;"`
+	LocalPath string `json:"local_path" gorm:"column:localPath;"`
+	CosPath   string `json:"cos_path" gorm:"column:cosPath;"`
+	CreatedAt XTime  `json:"createdAt" gorm:"column:createdAt; "`
+	UpdatedAt XTime  `json:"updatedAt" gorm:"column:updatedAt; "`
+}

+ 7 - 1
route/api.go

@@ -15,7 +15,7 @@ func SetApiGroupRoutes(router *gin.RouterGroup) {
 	router.POST("/user/getSysTime", v1.GetSysTime)
 
 	router.GET("/download", v1.DownloadFile) //文件下载
-	router.POST("/download/upload", v1.Upload)
+	router.POST("/upload", v1.Upload)
 
 	GroupV1 := router.Group("")
 	GroupV1.Use(middleware.TokenAuthMiddleware()).Use()
@@ -76,6 +76,12 @@ func SetApiGroupRoutes(router *gin.RouterGroup) {
 
 		GroupV1.POST("/user/userAdsCake", v1.UserAdsCake)
 		GroupV1.POST("/user/behaviorListCake", v1.BehaviorListCake)
+
+		//文件上传l
+		router.POST("/file/localFileToService", v1.LocalFileToService) //
+		router.POST("/file/fileList", v1.FileList)                     //
+		router.POST("/file/fileDelete", v1.FileDelete)                 //
+
 	}
 
 	router.POST("/SetUserBehaviorBak", v1.SetUserBehaviorBak)       //测试接口

+ 1 - 1
utils/time.go

@@ -105,7 +105,7 @@ func CompareDates(dateA, dateB string) (bool, string) {
 
 	diff := int(tA.Sub(tB).Hours() / 24)
 
-	valuableDiff := []int{1, 2, 3, 4, 5, 6, 7, 14, 30}
+	valuableDiff := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 14, 30}
 
 	if InArray(diff, valuableDiff) {
 		return true, "+" + strconv.Itoa(diff) + "day"