Browse Source

页面管理

huangyan 8 months ago
parent
commit
19bc23c7b8

+ 146 - 0
app/controller/pageManage.go

@@ -0,0 +1,146 @@
+package controller
+
+import (
+	"Panel_development/app/e"
+	"Panel_development/app/model"
+	"Panel_development/app/service"
+	"Panel_development/unity"
+	"github.com/gin-gonic/gin"
+	"github.com/go-playground/validator/v10"
+	"strconv"
+)
+
+var PageManage service.Page = &model.PageManage{}
+
+// GetPageManage 获取页面管理
+func GetPageManage(c *gin.Context) {
+	var page unity.QueryPageParams
+	uid := unity.GetUId(c)
+	err := c.ShouldBindJSON(&page)
+	if err != nil {
+		e.ResponseWithMsg(c, e.JSONParsingFailed, e.JSONParsingFailed.GetMsg())
+		return
+	}
+	if uid == 0 {
+		e.ResponseWithMsg(c, e.ERROR, "用户不存在")
+		return
+	} else if uid == 1 {
+		result, total, err := unity.PaginateWithCondition(page, model.PageManage{}, nil)
+		if err != nil {
+			e.ResponseWithMsg(c, e.PaginationFailed, e.PaginationFailed.GetMsg())
+			return
+		}
+		e.ResPonsePage(c, result, total, page)
+		return
+	}
+	var manage model.PageManage
+	manage.UserId = uid
+	result, total, err := PageManage.GetPageManage(page, manage, nil)
+	if err != nil {
+		e.ResponseWithMsg(c, e.PaginationFailed, e.PaginationFailed.GetMsg())
+		return
+	}
+	e.ResPonsePage(c, result, total, page)
+}
+
+// AddPageManage 添加页面管理
+func AddPageManage(c *gin.Context) {
+	var page model.PageManage
+	if err := c.ShouldBindJSON(&page); err != nil {
+		e.ResponseWithMsg(c, e.JSONParsingFailed, e.JSONParsingFailed.GetMsg())
+		return
+	}
+	validate := validator.New()
+	if err := validate.Struct(page); err != nil {
+		e.ResponseWithMsg(c, e.ERROR, err.Error())
+		return
+	}
+	id := unity.GetUId(c)
+	if id == 0 {
+		e.ResponseWithMsg(c, e.TheUserIsEmpty, e.TheUserIsEmpty.GetMsg())
+		return
+	}
+	page.UserId = id
+	page.PanelId = unity.RandomId()
+	add, err := unity.Add(&page)
+	if err != nil {
+		e.ResponseWithMsg(c, e.ERROR, err.Error())
+		return
+	}
+	e.ResponseSuccess(c, add)
+}
+
+// UpdatePageManage 更新页面管理
+func UpdatePageManage(c *gin.Context) {
+	uid := unity.GetUId(c)
+	s := c.Query("id")
+	validate := validator.New()
+	err := validate.Var(s, "required,numeric")
+	if err != nil {
+		e.ResponseWithMsg(c, e.ERROR, "id不能为空")
+		return
+	}
+	id, _ := strconv.Atoi(s)
+	var page model.PageManage
+	if err = c.ShouldBindJSON(&page); err != nil {
+		e.ResponseWithMsg(c, e.JSONParsingFailed, e.JSONParsingFailed.GetMsg())
+		return
+	}
+	page.ID = uint(id)
+	page.UserId = uid
+	v := validator.New()
+	if err = v.Struct(page); err != nil {
+		e.ResponseWithMsg(c, e.ERROR, err.Error())
+		return
+	}
+	if uid == 0 {
+		e.ResponseWithMsg(c, e.TheUserIsEmpty, e.TheUserIsEmpty.GetMsg())
+		return
+	} else if uid == 1 {
+		_, err = unity.UpdateById(id, &page)
+		if err != nil {
+			e.ResponseWithMsg(c, e.UPDATEFAIL, e.UPDATEFAIL.GetMsg())
+			return
+		}
+		e.ResponseSuccess(c, nil)
+		return
+	}
+	err = PageManage.UpdatePageManage(page)
+	if err != nil {
+		e.ResponseWithMsg(c, e.UPDATEFAIL, e.UPDATEFAIL.GetMsg())
+		return
+	}
+	e.ResponseSuccess(c, nil)
+}
+
+// DeletePageManage 删除页面管理
+func DeletePageManage(c *gin.Context) {
+	uid := unity.GetUId(c)
+	s := c.Query("id")
+	validate := validator.New()
+	err := validate.Var(s, "required,numeric")
+	if err != nil {
+		e.ResponseWithMsg(c, e.ERROR, "id不能为空")
+		return
+	}
+	atoi, _ := strconv.Atoi(s)
+	if uid == 0 {
+		e.ResponseWithMsg(c, e.TheUserIsEmpty, e.TheUserIsEmpty.GetMsg())
+		return
+	} else if uid == 1 {
+		_, err = unity.DeleteById(atoi, model.PageManage{})
+		if err != nil {
+			e.ResponseWithMsg(c, e.DELETEFAIL, e.DELETEFAIL.GetMsg())
+			return
+		} else {
+			e.ResponseSuccess(c, nil)
+			return
+		}
+	}
+	err = PageManage.DeletePageManageById(uid, atoi)
+	if err != nil {
+		e.ResponseWithMsg(c, e.DELETEFAIL, err.Error())
+		return
+	}
+	e.ResponseSuccess(c, nil)
+}

+ 30 - 0
app/middleware/admin_middleware.go

@@ -0,0 +1,30 @@
+package middlewares
+
+import (
+	"Panel_development/app/e"
+	"Panel_development/nats"
+	"github.com/bytedance/sonic"
+	"github.com/gin-gonic/gin"
+	"time"
+)
+
+func AdminMiddleware() gin.HandlerFunc {
+	return func(c *gin.Context) {
+		header := c.GetHeader("Authorization")
+		request, err := nats.Nats.Request("login_token_validation", []byte(header), 3*time.Second)
+		if err != nil {
+			e.ResponseWithMsg(c, e.TokenIsInvalid, e.TokenIsInvalid.GetMsg())
+		} else {
+			var response UserResponse
+			sonic.Unmarshal(request.Data, &response)
+			users := response.User.(map[string]interface{})
+			role := users["role"].(string)
+			if role == "admin" {
+				c.Next()
+			} else {
+				e.ResponseWithMsg(c, e.TokenIsInvalid, e.TokenIsInvalid.GetMsg())
+				c.Abort()
+			}
+		}
+	}
+}

+ 24 - 0
app/middleware/cors.go

@@ -0,0 +1,24 @@
+package middlewares
+
+import (
+	"github.com/gin-gonic/gin"
+	"net/http"
+)
+
+func Cors() gin.HandlerFunc {
+	return func(c *gin.Context) {
+		method := c.Request.Method
+		origin := c.Request.Header.Get("Origin")
+		if origin != "" {
+			c.Header("Access-Control-Allow-Origin", "*") // 可将将 * 替换为指定的域名
+			c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE")
+			c.Header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization")
+			c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Cache-Control, Content-Language, Content-Type")
+			c.Header("Access-Control-Allow-Credentials", "true")
+		}
+		if method == "OPTIONS" {
+			c.AbortWithStatus(http.StatusNoContent)
+		}
+		c.Next()
+	}
+}

+ 35 - 0
app/middleware/login_middleware.go

@@ -0,0 +1,35 @@
+package middlewares
+
+import (
+	"Panel_development/app/e"
+	"Panel_development/nats"
+	"github.com/bytedance/sonic"
+	"github.com/gin-gonic/gin"
+	"time"
+)
+
+type UserResponse struct {
+	Code    int    `json:"code"`
+	Message string `json:"message"`
+	User    any    `json:"user,omitempty"`
+}
+
+func LoginMiddleware() gin.HandlerFunc {
+	return func(c *gin.Context) {
+		header := c.GetHeader("Authorization")
+		request, err := nats.Nats.Request("login_token_validation", []byte(header), 3*time.Second)
+		if err != nil {
+			e.ResponseWithMsg(c, e.TokenIsInvalid, e.TokenIsInvalid.GetMsg())
+		} else {
+			var response UserResponse
+			sonic.Unmarshal(request.Data, &response)
+			if response.Code == 200 {
+				c.Set("user", response.User)
+				c.Next()
+			} else {
+				e.ResponseWithMsg(c, e.TokenIsInvalid, e.TokenIsInvalid.GetMsg())
+				c.Abort()
+			}
+		}
+	}
+}

+ 65 - 0
app/model/pageManage.go

@@ -0,0 +1,65 @@
+package model
+
+import (
+	"Panel_development/global"
+	"Panel_development/unity"
+	"errors"
+	"gorm.io/gorm"
+)
+
+type PageManage struct {
+	gorm.Model
+	UserId  int    `gorm:"type:int;not null;comment:用户id" json:"userId" `
+	PanelId string `gorm:"type:varchar(255);not null;unique;comment:页面id" json:"panelId" `
+	Name    string `gorm:"type:varchar(255);not null;comment:页面名称" json:"name" `
+	Data    string `gorm:"type:longtext;comment:页面数据" json:"data" validate:"required"`
+}
+
+func (p PageManage) GetPageManage(params unity.QueryPageParams, model PageManage, queryCond interface{}) (result []PageManage, total int64, err error) {
+	//TODO implement me
+	var count int64
+	if queryCond != nil {
+		if err = global.DBLink.Model(model).Where(queryCond, params.Query).Where("user_id=?", model.UserId).Count(&count).Error; err != nil {
+			return nil, 0, err
+		}
+		// 计算查询的偏移量,并设置每次查询的记录数量
+		offset := (params.Page - 1) * params.Size
+		// 执行分页查询,包括偏移量设置、限制查询数量、排序及应用额外查询条件
+		if err = global.DBLink.Offset(offset).Limit(params.Size).Order(params.Desc).Where(queryCond, params.Query).Where("user_id=?", model.UserId).Find(&result).Error; err != nil {
+			return nil, 0, err
+		}
+	} else {
+		if err = global.DBLink.Model(model).Where("user_id=?", model.UserId).Count(&count).Error; err != nil {
+			return nil, 0, err
+		}
+		// 计算查询的偏移量,并设置每次查询的记录数量
+		offset := (params.Page - 1) * params.Size
+		// 执行分页查询,包括偏移量设置、限制查询数量、排序及应用额外查询条件
+		if err = global.DBLink.Offset(offset).Limit(params.Size).Order(params.Desc).Where("user_id=?", model.UserId).Find(&result).Error; err != nil {
+			return nil, 0, err
+		}
+	}
+	return result, count, nil
+}
+
+func (p PageManage) UpdatePageManage(manage PageManage) error {
+	//TODO implement me
+	tx := global.DBLink.Where("user_id=?", manage.UserId).Where("id=?", manage.ID).Updates(&manage)
+	if tx.RowsAffected > 0 {
+		return nil
+	}
+	return errors.New("更新失败")
+}
+
+func (p PageManage) DeletePageManageById(uid, id int) error {
+	//TODO implement me
+	tx := global.DBLink.Where("user_id=?", uid).Where("id=?", id).Delete(&PageManage{})
+	if tx.RowsAffected > 0 {
+		return nil
+	}
+	return errors.New("删除失败")
+}
+
+func (p PageManage) TableName() string {
+	return "page_manage"
+}

+ 4 - 1
app/router.go

@@ -1,6 +1,7 @@
 package app
 
 import (
+	middlewares "Panel_development/app/middleware"
 	"Panel_development/app/routers"
 	"Panel_development/global"
 	"github.com/gin-gonic/gin"
@@ -8,9 +9,11 @@ import (
 
 func InitRouter() error {
 	engine := gin.New()
-
+	engine.Use(middlewares.LoginMiddleware())
 	gin.SetMode(global.ServerSetting.Mode)
+	routers.AdminRouter(engine)
 	routers.ComponentClassRouter(engine)
 	routers.ComponentListRouter(engine)
+	routers.PageManageRouter(engine)
 	return engine.Run(global.ServerSetting.Port)
 }

+ 21 - 0
app/routers/admin.go

@@ -0,0 +1,21 @@
+package routers
+
+import (
+	"Panel_development/app/controller"
+	middlewares "Panel_development/app/middleware"
+	"github.com/gin-gonic/gin"
+)
+
+func AdminRouter(r *gin.Engine) {
+	group := r.Group("/api")
+	group.Use(middlewares.AdminMiddleware())
+	//组件分类
+	group.POST("/addcomponentclass", controller.AddComponentClassify)
+	group.DELETE("/componentclass", controller.DeleteComponentClassify)
+	group.PUT("/componentclass", controller.UpdateComponentClassify)
+	//组件列表
+	group.POST("/componentall", controller.ComponentListAll)
+	group.POST("/componentList", controller.AddComponentList)
+	group.PUT("/componentList", controller.UpdateComponentList)
+	group.DELETE("/componentList", controller.DeleteComponentList)
+}

+ 0 - 3
app/routers/componentclass.go

@@ -8,7 +8,4 @@ import (
 func ComponentClassRouter(r *gin.Engine) {
 	group := r.Group("/api")
 	group.GET("/componentclass", controller.GetComponentClassify)
-	group.POST("/addcomponentclass", controller.AddComponentClassify)
-	group.DELETE("/componentclass", controller.DeleteComponentClassify)
-	group.PUT("/componentclass", controller.UpdateComponentClassify)
 }

+ 0 - 4
app/routers/componentlist.go

@@ -8,8 +8,4 @@ import (
 func ComponentListRouter(r *gin.Engine) {
 	group := r.Group("/api")
 	group.GET("/componentList", controller.GetComponentList)
-	group.POST("/componentall", controller.ComponentListAll)
-	group.POST("/componentList", controller.AddComponentList)
-	group.PUT("/componentList", controller.UpdateComponentList)
-	group.DELETE("/componentList", controller.DeleteComponentList)
 }

+ 14 - 0
app/routers/pageManage.go

@@ -0,0 +1,14 @@
+package routers
+
+import (
+	"Panel_development/app/controller"
+	"github.com/gin-gonic/gin"
+)
+
+func PageManageRouter(r *gin.Engine) {
+	group := r.Group("/api")
+	group.POST("/pageManage", controller.GetPageManage)
+	group.POST("/addpageManage", controller.AddPageManage)
+	group.PUT("/pageManage", controller.UpdatePageManage)
+	group.DELETE("/pageManage", controller.DeletePageManage)
+}

+ 12 - 0
app/service/pageManage.go

@@ -0,0 +1,12 @@
+package service
+
+import (
+	"Panel_development/app/model"
+	"Panel_development/unity"
+)
+
+type Page interface {
+	DeletePageManageById(uid, id int) error
+	UpdatePageManage(manage model.PageManage) error
+	GetPageManage(params unity.QueryPageParams, model model.PageManage, queryCond interface{}) (result []model.PageManage, total int64, err error)
+}

+ 2 - 2
configs/config.yaml

@@ -30,12 +30,12 @@ server:
   # http服务信息
   insecureServingInfo:
   # 监听端口
-  port: ":8081"
+  port: ":8080"
 subMail:
   appid: "97173"
   signature: "f639a60e41ee0554921d89884f5ff87e"
 redis:
-  addr: "192.168.11.68:6379"
+  addr: "192.168.0.100:6379"
   password: ""
   db: 0
 nats:

+ 1 - 0
database/migrate.go

@@ -9,5 +9,6 @@ func Migrate(db *gorm.DB) {
 	db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(
 		model.ComponentClassify{},
 		model.ComponentList{},
+		model.PageManage{},
 	)
 }

+ 1 - 1
go.mod

@@ -6,7 +6,7 @@ require (
 	github.com/KyleBanks/depth v1.2.1 // indirect
 	github.com/PuerkitoBio/purell v1.1.1 // indirect
 	github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
-	github.com/bytedance/sonic v1.11.6 // indirect
+	github.com/bytedance/sonic v1.11.8 // indirect
 	github.com/bytedance/sonic/loader v0.1.1 // indirect
 	github.com/cespare/xxhash/v2 v2.1.2 // indirect
 	github.com/cloudwego/base64x v0.1.4 // indirect

+ 2 - 0
go.sum

@@ -6,6 +6,8 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV
 github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
 github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0=
 github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=
+github.com/bytedance/sonic v1.11.8 h1:Zw/j1KfiS+OYTi9lyB3bb0CFxPJVkM17k1wyDG32LRA=
+github.com/bytedance/sonic v1.11.8/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=
 github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM=
 github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
 github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=

+ 3 - 0
main.go

@@ -4,6 +4,7 @@ import (
 	"Panel_development/app"
 	"Panel_development/database"
 	"Panel_development/global"
+	"Panel_development/nats"
 	"Panel_development/simple_zap"
 	"Panel_development/unity"
 	"context"
@@ -24,6 +25,8 @@ func init() {
 	if err = unity.Translator("zh"); err != nil {
 		simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "注册本地化失败")
 	}
+	//nats
+	nats.SetupNats()
 }
 
 // @title 面板开发

+ 22 - 0
nats/Nats.go

@@ -0,0 +1,22 @@
+package nats
+
+import (
+	"Panel_development/global"
+	"Panel_development/simple_zap"
+	"context"
+	"fmt"
+	"github.com/nats-io/nats.go"
+)
+
+var Nats *nats.Conn
+
+func SetupNats() {
+	var err error
+	fmt.Println(global.NatsSetting.NatsServerUrl)
+	Nats, err = nats.Connect(global.NatsSetting.NatsServerUrl)
+	if err != nil {
+		simple_zap.WithCtx(context.Background()).Sugar().Warn(err, "nats 连接失败")
+		panic(err)
+	}
+	simple_zap.WithCtx(context.Background()).Sugar().Info(err, "nats 连接成功")
+}

+ 16 - 0
unity/getuid.go

@@ -0,0 +1,16 @@
+package unity
+
+import (
+	"github.com/gin-gonic/gin"
+)
+
+func GetUId(c *gin.Context) int {
+	//mustGet := c.MustGet("user")
+	value, exists := c.Get("user")
+	if exists {
+		users := value.(map[string]interface{})
+		id := int(users["ID"].(float64))
+		return id
+	}
+	return 0
+}

+ 17 - 0
unity/randomId.go

@@ -0,0 +1,17 @@
+package unity
+
+import (
+	"math/rand"
+	"time"
+)
+
+func RandomId() string {
+	const letterBytes = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+	rand.Seed(time.Now().UnixNano())
+
+	b := make([]byte, 32)
+	for i := range b {
+		b[i] = letterBytes[rand.Intn(len(letterBytes))]
+	}
+	return string(b)
+}

+ 13 - 7
unity/unity.go

@@ -41,16 +41,22 @@ func PaginateWithCondition[T any](params QueryPageParams, model T, queryCond int
 		if err = global.DBLink.Model(model).Where(queryCond, params.Query).Count(&count).Error; err != nil {
 			return nil, 0, err
 		}
+		// 计算查询的偏移量,并设置每次查询的记录数量
+		offset := (params.Page - 1) * params.Size
+		// 执行分页查询,包括偏移量设置、限制查询数量、排序及应用额外查询条件
+		if err = global.DBLink.Offset(offset).Limit(params.Size).Order(params.Desc).Where(queryCond, params.Query).Find(&result).Error; err != nil {
+			return nil, 0, err
+		}
 	} else {
 		if err = global.DBLink.Model(model).Count(&count).Error; err != nil {
 			return nil, 0, err
 		}
-	}
-	// 计算查询的偏移量,并设置每次查询的记录数量
-	offset := (params.Page - 1) * params.Size
-	// 执行分页查询,包括偏移量设置、限制查询数量、排序及应用额外查询条件
-	if err = global.DBLink.Offset(offset).Limit(params.Size).Order(params.Desc).Where(queryCond, params.Query).Find(&result).Error; err != nil {
-		return nil, 0, err
+		// 计算查询的偏移量,并设置每次查询的记录数量
+		offset := (params.Page - 1) * params.Size
+		// 执行分页查询,包括偏移量设置、限制查询数量、排序及应用额外查询条件
+		if err = global.DBLink.Offset(offset).Limit(params.Size).Order(params.Desc).Find(&result).Error; err != nil {
+			return nil, 0, err
+		}
 	}
 	return result, count, nil
 }
@@ -67,7 +73,7 @@ func AddGenericItem[T any](item T, mapper func(T) interface{}) error {
 func GetById[T any](id int, model T) (T, error) {
 	tx := global.DBLink.Where("id = ?", id).First(&model)
 	if tx.RowsAffected <= 0 {
-		return model, errors.New("查询失败")
+		return model, errors.New("查询失败,当前id不存在")
 	} else {
 		return model, nil
 	}