DESKTOP-HN5QP3V\Administrator hace 4 semanas
padre
commit
96dfefab51
Se han modificado 8 ficheros con 283 adiciones y 18 borrados
  1. 61 6
      app/router/router.go
  2. 115 0
      app/task/version_test.go
  3. 1 1
      main-admin/main.go
  4. 4 3
      main-point/main.go
  5. 13 0
      main-report/build.bat
  6. 74 0
      main-report/main.go
  7. 1 1
      main-subscribe/main.go
  8. 14 7
      pkg/file/file.go

+ 61 - 6
app/router/router.go

@@ -9,24 +9,67 @@ import (
 	"github.com/gin-gonic/gin"
 )
 
-// NewRouter 路由配置
-func NewRouter() *gin.Engine {
+func newBaseRouter() *gin.Engine {
 	r := gin.New()
 	// 中间件, 顺序不能改
 	r.Use(middleware.Session(os.Getenv("SESSION_SECRET")))
 	r.Use(middleware.Cors())
 	r.Use(gin.Recovery())
+	return r
+}
+
+// NewRouter 路由配置
+func NewRouter() *gin.Engine {
+	r := newBaseRouter()
+	registerVersionRouter(r)
+	registerAdminRouter(r)
+	registerPointRouter(r)
+	registerSubscribeRouter(r)
+	registerHotUpdateRouter(r)
+	registerReportRouter(r)
+	return r
+}
+
+// NewAdminRouter 后台管理服务路由
+func NewAdminRouter() *gin.Engine {
+	r := newBaseRouter()
+	registerVersionRouter(r)
+	registerAdminRouter(r)
+	registerHotUpdateRouter(r)
+	return r
+}
+
+// NewPointRouter 埋点服务路由
+func NewPointRouter() *gin.Engine {
+	r := newBaseRouter()
+	registerPointRouter(r)
+	return r
+}
+
+// NewReportRouter 客户端上报服务路由
+func NewReportRouter() *gin.Engine {
+	r := newBaseRouter()
+	registerReportRouter(r)
+	return r
+}
+
+// NewSubscribeRouter 订阅服务路由
+func NewSubscribeRouter() *gin.Engine {
+	r := newBaseRouter()
+	registerSubscribeRouter(r)
+	return r
+}
 
-	// 路由
+func registerVersionRouter(r *gin.Engine) {
 	apiv1 := r.Group("/api/v1")
 	{
-		//apiv1.POST("upload/data", v1.UploadReport)
-
 		apiv1.POST("version/check", v1.CheckVersion)
 		apiv1.POST("version/server", v1.ServerVersion)
 		apiv1.GET("channel/all", v1.ChannelAll)
 	}
+}
 
+func registerAdminRouter(r *gin.Engine) {
 	webv1 := r.Group("/web/v1")
 	{
 		webv1.POST("auth/login", v1.AdminLogin)
@@ -46,12 +89,16 @@ func NewRouter() *gin.Engine {
 			authed.POST("channel/delete", v1.ChannelDelete)
 		}
 	}
+}
 
+func registerPointRouter(r *gin.Engine) {
 	pointv1 := r.Group("/point/v1")
 	{
 		pointv1.POST("thinkingdata", v1.ThinkingData)
 	}
+}
 
+func registerSubscribeRouter(r *gin.Engine) {
 	subscribev1 := r.Group("/subscribe/v1")
 	{
 		subscribev1.POST("/open", v1.Open)   // 标记开启订阅
@@ -60,7 +107,9 @@ func NewRouter() *gin.Engine {
 		subscribev1.POST("/send", v1.Send)   // 触发订阅直接发送
 		subscribev1.POST("/task", v1.Task)   // 触发订阅任务发送
 	}
+}
 
+func registerHotUpdateRouter(r *gin.Engine) {
 	hotupdateR := r.Group("/hotupdate")
 	{
 		hotupdateR.GET("/getversion", hotupdate.GetVersion)
@@ -86,5 +135,11 @@ func NewRouter() *gin.Engine {
 	//	}
 	//
 
-	return r
+}
+
+func registerReportRouter(r *gin.Engine) {
+	apiv1 := r.Group("/api/v1")
+	{
+		apiv1.POST("upload/data", v1.UploadReport)
+	}
 }

+ 115 - 0
app/task/version_test.go

@@ -0,0 +1,115 @@
+package task
+
+import (
+	"dsbqj-admin/model/mongo/version"
+	"testing"
+)
+
+func TestVersionsCheckEnvVersionAndDefault(t *testing.T) {
+	versions := VersionInit()
+	channel := new(ChannelVersions)
+
+	releaseDefault := &version.Version{Channel: "wx", EnvVersion: "release", Version: "1.0.0", Url: "正式服默认地址", Default: true}
+	releaseExact := &version.Version{Channel: "wx", EnvVersion: "release", Version: "1.0.1", Url: "正式服版本地址"}
+	trialDefault := &version.Version{Channel: "wx", EnvVersion: "trial", Version: "1.0.0", Url: "体验服默认地址", Default: true}
+	trialExact := &version.Version{Channel: "wx", EnvVersion: "trial", Version: "1.0.1", Url: "体验服版本地址"}
+
+	for _, v := range []*version.Version{releaseDefault, releaseExact, trialDefault, trialExact} {
+		channel.VList.Push(v)
+		channel.VMap.Set(versionMapKey(v.Version, NormalizeEnvVersion(v.EnvVersion)), v)
+	}
+
+	versions.VChannels.Set("wx", channel)
+
+	if got := versions.Check("1.0.1", "wx", "trial"); got != trialDefault {
+		t.Fatalf("传入体验版环境版本时应优先返回体验版默认地址,实际返回 %#v", got)
+	}
+
+	if got := versions.Check("1.0.1", "wx", "release"); got != releaseDefault {
+		t.Fatalf("传入正式服环境版本时应优先返回正式服默认地址,实际返回 %#v", got)
+	}
+
+	if got := versions.Check("1.0.1", "wx", ""); got != releaseExact {
+		t.Fatalf("未传环境版本应返回正式服地址,实际返回 %#v", got)
+	}
+
+	if got := versions.Check("1.0.1", "wx", ""); got == nil || got.Version != "1.0.1" {
+		t.Fatalf("未传环境版本时应优先按版本号返回任意环境版本,实际返回 %#v", got)
+	}
+
+	if got := versions.Check("9.9.9", "wx", "trial"); got != trialDefault {
+		t.Fatalf("体验版未知版本应返回体验版默认地址,实际返回 %#v", got)
+	}
+
+	if got := versions.Check("9.9.9", "wx", "develop"); got != releaseDefault {
+		t.Fatalf("开发版未知版本应返回正式服默认地址,实际返回 %#v", got)
+	}
+}
+
+func TestVersionsCheckWithoutEnvVersionUsesVersionFirst(t *testing.T) {
+	versions := VersionInit()
+	channel := new(ChannelVersions)
+
+	releaseDefault := &version.Version{Channel: "wx", EnvVersion: "release", Version: "1.0.0", Url: "正式服默认地址", Default: true}
+	trialExact := &version.Version{Channel: "wx", EnvVersion: "trial", Version: "0.2.0", Url: "体验版版本地址"}
+
+	for _, v := range []*version.Version{releaseDefault, trialExact} {
+		channel.VList.Push(v)
+		channel.VMap.Set(versionMapKey(v.Version, NormalizeEnvVersion(v.EnvVersion)), v)
+	}
+	versions.VChannels.Set("wx", channel)
+
+	if got := versions.Check("0.2.0", "wx", ""); got != trialExact {
+		t.Fatalf("未传环境版本时应按版本号命中体验版版本,实际返回 %#v", got)
+	}
+
+	if got := versions.Check("9.9.9", "wx", ""); got != releaseDefault {
+		t.Fatalf("未传环境版本且版本号不存在时应返回正式服默认地址,实际返回 %#v", got)
+	}
+}
+
+func TestVersionsCheckEnvVersionPriority(t *testing.T) {
+	versions := VersionInit()
+	channel := new(ChannelVersions)
+
+	releaseDefault := &version.Version{Channel: "wx", EnvVersion: "release", Version: "1.0.0", Url: "正式服默认地址", Default: true}
+	releaseExact := &version.Version{Channel: "wx", EnvVersion: "release", Version: "1.0.1", Url: "正式服版本地址"}
+	trialDefault := &version.Version{Channel: "wx", EnvVersion: "trial", Version: "2.0.0", Url: "体验版默认地址", Default: true}
+	trialExact := &version.Version{Channel: "wx", EnvVersion: "trial", Version: "1.0.1", Url: "体验版版本地址"}
+
+	for _, v := range []*version.Version{releaseDefault, releaseExact, trialDefault, trialExact} {
+		channel.VList.Push(v)
+		channel.VMap.Set(versionMapKey(v.Version, NormalizeEnvVersion(v.EnvVersion)), v)
+	}
+	versions.VChannels.Set("wx", channel)
+
+	if got := versions.Check("1.0.1", "wx", "release"); got != releaseDefault {
+		t.Fatalf("传入正式服环境版本时应优先返回正式服默认地址,实际返回 %#v", got)
+	}
+
+	if got := versions.Check("1.0.1", "wx", "trial"); got != trialDefault {
+		t.Fatalf("传入体验版环境版本时应优先返回体验版默认地址,实际返回 %#v", got)
+	}
+}
+
+func TestVersionsCheckEnvVersionWithoutDefault(t *testing.T) {
+	versions := VersionInit()
+	channel := new(ChannelVersions)
+
+	releaseExact := &version.Version{Channel: "wx", EnvVersion: "release", Version: "1.0.1", Url: "正式服版本地址"}
+	trialExact := &version.Version{Channel: "wx", EnvVersion: "trial", Version: "1.0.1", Url: "体验版版本地址"}
+
+	for _, v := range []*version.Version{releaseExact, trialExact} {
+		channel.VList.Push(v)
+		channel.VMap.Set(versionMapKey(v.Version, NormalizeEnvVersion(v.EnvVersion)), v)
+	}
+	versions.VChannels.Set("wx", channel)
+
+	if got := versions.Check("1.0.1", "wx", "release"); got != releaseExact {
+		t.Fatalf("正式服没有默认地址时应返回正式服版本地址,实际返回 %#v", got)
+	}
+
+	if got := versions.Check("1.0.1", "wx", "trial"); got != trialExact {
+		t.Fatalf("体验版没有默认地址时应返回体验版版本地址,实际返回 %#v", got)
+	}
+}

+ 1 - 1
main-admin/main.go

@@ -59,7 +59,7 @@ func main() {
 	}
 
 	// 装载路由
-	routersInit := router.NewRouter()
+	routersInit := router.NewAdminRouter()
 	readTimeout := 60 * time.Second
 	writeTimeout := 200 * time.Second
 	endPoint := fmt.Sprintf(":%s", os.Getenv("LISTEN_PORT"))

+ 4 - 3
main-point/main.go

@@ -5,12 +5,13 @@ import (
 	"dsbqj-admin/pkg/logger"
 	"dsbqj-admin/pkg/validator"
 	"fmt"
-	"github.com/gin-gonic/gin"
-	"github.com/joho/godotenv"
 	"log"
 	"net/http"
 	"os"
 	"time"
+
+	"github.com/gin-gonic/gin"
+	"github.com/joho/godotenv"
 )
 
 // @title           后端接口API文档
@@ -51,7 +52,7 @@ func main() {
 	}
 
 	// 装载路由
-	routersInit := router.NewRouter()
+	routersInit := router.NewPointRouter()
 	readTimeout := 60 * time.Second
 	writeTimeout := 200 * time.Second
 	endPoint := fmt.Sprintf(":%s", os.Getenv("LISTEN_PORT"))

+ 13 - 0
main-report/build.bat

@@ -0,0 +1,13 @@
+SET CGO_ENABLED=0
+SET GOOS=linux
+SET GOARCH=amd64
+echo now the CGO_ENABLED:
+ go env CGO_ENABLED
+
+echo now the GOOS:
+ go env GOOS
+
+echo now the GOARCH:
+ go env GOARCH
+
+go build -o ../bin/report-server main.go

+ 74 - 0
main-report/main.go

@@ -0,0 +1,74 @@
+package main
+
+import (
+	"dsbqj-admin/app/router"
+	"dsbqj-admin/model/mysql"
+	"dsbqj-admin/pkg/cache"
+	"dsbqj-admin/pkg/logger"
+	"dsbqj-admin/pkg/validator"
+	"fmt"
+	"log"
+	"net/http"
+	"os"
+	"time"
+
+	"github.com/gin-gonic/gin"
+	"github.com/joho/godotenv"
+)
+
+// @title           后端接口API文档
+// @version         1.0
+// @description     这里展示所有当前web端API接口信息
+
+// @host      localhost:30101
+// @BasePath  /web/v1
+
+// @securityDefinitions.apikey cxy_token
+// @name __CXY_TOKEN_
+// @in header
+// @securityDefinitions.apikey cxy_uid
+// @name __CXY_UID_
+// @in header
+
+func main() {
+	err := godotenv.Load()
+	if err != nil {
+		log.Fatal("Error loading .env file")
+		return
+	}
+	validator.Init()
+	logger.Init("")
+	cache.Redis()
+	//oss.Init()
+	//sms.Init()
+
+	// 连接数据库
+	mysql.Database(os.Getenv("MYSQL_DSN"))
+	//mongo.Database(os.Getenv("MONGO_DSN"))
+
+	// 启动任务
+	//task.Init().Run()
+
+	if os.Getenv("GIN_MODE") == "release" {
+		gin.SetMode(gin.ReleaseMode)
+	}
+
+	// 装载路由
+	routersInit := router.NewReportRouter()
+	readTimeout := 60 * time.Second
+	writeTimeout := 200 * time.Second
+	endPoint := fmt.Sprintf(":%s", os.Getenv("LISTEN_PORT"))
+	maxHeaderBytes := 1 << 20
+
+	server := &http.Server{
+		Addr:           endPoint,
+		Handler:        routersInit,
+		ReadTimeout:    readTimeout,
+		WriteTimeout:   writeTimeout,
+		MaxHeaderBytes: maxHeaderBytes,
+	}
+
+	logger.Info("start http version listening %s", endPoint)
+	err = server.ListenAndServe()
+	fmt.Println(err)
+}

+ 1 - 1
main-subscribe/main.go

@@ -51,7 +51,7 @@ func main() {
 	}
 
 	// 装载路由
-	routersInit := router.NewRouter()
+	routersInit := router.NewSubscribeRouter()
 	readTimeout := 60 * time.Second
 	writeTimeout := 200 * time.Second
 	endPoint := fmt.Sprintf("0.0.0.0:%s", os.Getenv("LISTEN_PORT"))

+ 14 - 7
pkg/file/file.go

@@ -6,6 +6,7 @@ import (
 	"mime/multipart"
 	"os"
 	"path"
+	"path/filepath"
 )
 
 // GetSize get the file size
@@ -67,23 +68,29 @@ func Open(name string, flag int, perm os.FileMode) (*os.File, error) {
 
 // MustOpen maximize trying to open the file
 func MustOpen(fileName, filePath string) (*os.File, error) {
-	dir, err := os.Getwd()
-	if err != nil {
-		return nil, fmt.Errorf("os.Getwd err: %v", err)
+	src := filePath
+	if src == "" {
+		src = "."
+	}
+	if !filepath.IsAbs(src) {
+		dir, err := os.Getwd()
+		if err != nil {
+			return nil, fmt.Errorf("os.Getwd err: %v", err)
+		}
+		src = filepath.Join(dir, src)
 	}
 
-	src := dir + "/" + filePath
 	perm := CheckPermission(src)
 	if perm == true {
 		return nil, fmt.Errorf("file.CheckPermission Permission denied src: %s", src)
 	}
 
-	err = IsNotExistMkDir(src)
+	err := IsNotExistMkDir(src)
 	if err != nil {
 		return nil, fmt.Errorf("file.IsNotExistMkDir src: %s, err: %v", src, err)
 	}
-	
-	f, err := Open(src+fileName, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0644)
+
+	f, err := Open(filepath.Join(src, fileName), os.O_APPEND|os.O_CREATE|os.O_RDWR, 0644)
 	if err != nil {
 		return nil, fmt.Errorf("Fail to OpenFile :%v", err)
 	}