Browse Source

权限管理调整

huwei 1 month ago
parent
commit
db6231e150

+ 1 - 0
server/config/config.go

@@ -46,6 +46,7 @@ func Init(cfgfile string) {
 		InitEtcd()
 		InitElastic()
 		InitCOSClient()
+		InitEntranceIamClient()
 
 		feishu.InitFeiShuClient()
 	})

+ 32 - 32
server/config/database.go

@@ -19,14 +19,14 @@ var (
 	LDB      *gorm.DB
 	GDB1     *gorm.DB
 	GDBGroup map[int]*gorm.DB
-	AdminDB  *gorm.DB
+	//AdminDB  *gorm.DB
 )
 
 func InitDatabase() {
 	initDefaultDB()
 	initGraveDB()
 	initLoginDB()
-	initAdminDB()
+	//initAdminDB()
 }
 
 func initDefaultDB() {
@@ -60,36 +60,36 @@ func initDefaultDB() {
 	DB = db
 }
 
-func initAdminDB() {
-	connString := os.Getenv("ADMIN_MYSQL_DSN")
-	newLogger := logger.New(
-		log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
-		logger.Config{
-			SlowThreshold:             time.Second, // Slow SQL threshold
-			LogLevel:                  logger.Info, // Log level(这里记得根据需求改一下)
-			IgnoreRecordNotFoundError: true,        // Ignore ErrRecordNotFound error for logger
-			Colorful:                  false,       // Disable color
-		},
-	)
-
-	db, err := gorm.Open(mysql.Open(connString), &gorm.Config{
-		Logger:                 newLogger,
-		SkipDefaultTransaction: true,
-	})
-
-	if connString == "" || err != nil {
-		logrus.Fatalf("mysql lost: %v", err)
-	}
-	sqlDB, err := db.DB()
-	if err != nil {
-		logrus.Fatalf("mysql lost: %v", err)
-	}
-
-	sqlDB.SetMaxIdleConns(10)
-	sqlDB.SetMaxOpenConns(20)
-	sqlDB.SetConnMaxLifetime(2 * time.Hour)
-	AdminDB = db
-}
+//func initAdminDB() {
+//	connString := os.Getenv("ADMIN_MYSQL_DSN")
+//	newLogger := logger.New(
+//		log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
+//		logger.Config{
+//			SlowThreshold:             time.Second, // Slow SQL threshold
+//			LogLevel:                  logger.Info, // Log level(这里记得根据需求改一下)
+//			IgnoreRecordNotFoundError: true,        // Ignore ErrRecordNotFound error for logger
+//			Colorful:                  false,       // Disable color
+//		},
+//	)
+//
+//	db, err := gorm.Open(mysql.Open(connString), &gorm.Config{
+//		Logger:                 newLogger,
+//		SkipDefaultTransaction: true,
+//	})
+//
+//	if connString == "" || err != nil {
+//		logrus.Fatalf("mysql lost: %v", err)
+//	}
+//	sqlDB, err := db.DB()
+//	if err != nil {
+//		logrus.Fatalf("mysql lost: %v", err)
+//	}
+//
+//	sqlDB.SetMaxIdleConns(10)
+//	sqlDB.SetMaxOpenConns(20)
+//	sqlDB.SetConnMaxLifetime(2 * time.Hour)
+//	AdminDB = db
+//}
 
 func initGraveDB() {
 	GDBGroup = make(map[int]*gorm.DB)

+ 47 - 0
server/config/entrance_grpc.go

@@ -0,0 +1,47 @@
+package config
+
+import (
+	"entrance-grpc/iam"
+	"github.com/sirupsen/logrus"
+	"google.golang.org/grpc"
+	"google.golang.org/grpc/credentials/insecure"
+	"google.golang.org/grpc/keepalive"
+	"os"
+	"time"
+)
+
+var iamClient iam.IamClient
+var conn *grpc.ClientConn
+
+func InitEntranceIamClient() {
+	if os.Getenv("ADMIN_GRPC_SERVER") == "" {
+		logrus.Warnf("ADMIN_GRPC_SERVER is empty")
+		return
+	}
+	var err error
+	conn, err = grpc.NewClient(os.Getenv("ADMIN_GRPC_SERVER"),
+		grpc.WithTransportCredentials(insecure.NewCredentials()),
+		grpc.WithKeepaliveParams(keepalive.ClientParameters{
+			Time:                30 * time.Second, // 发送 ping 的间隔
+			Timeout:             10 * time.Second, // 等待 ack 的超时
+			PermitWithoutStream: true,             // 即使没有活跃流也发送 ping
+		}),
+	)
+
+	if err != nil {
+		logrus.Warnf("did not connect: %v", err)
+	}
+
+	iamClient = iam.NewIamClient(conn)
+}
+
+func GetIamClient() iam.IamClient {
+	if iamClient == nil {
+		InitEntranceIamClient()
+	}
+	return iamClient
+}
+
+func CloseGrpcConn() {
+	conn.Close()
+}

+ 2 - 2
server/config/menu.go

@@ -87,7 +87,7 @@ var menus = map[string]string{
 }
 
 func GetMenuName(p string) string {
-	q := query.Use(AdminDB).AdminOperation
+	q := query.Use(DB).AdminOperation
 	operation, err := q.WithContext(context.Background()).Where(q.API.Eq(p)).First()
 	if err != nil {
 		logrus.Error("GetMenuName", "err", err)
@@ -103,7 +103,7 @@ func GetMenuName(p string) string {
 }
 
 func GetAllOptions() []*model.AdminOperation {
-	q := AdminDB.Model(&model.AdminOperation{})
+	q := DB.Model(&model.AdminOperation{})
 	allOperation := make([]*model.AdminOperation, 0)
 	err := q.Find(&allOperation).Error
 	if err != nil {

+ 36 - 37
server/config/permissions.go

@@ -7,8 +7,6 @@ import (
 	"gadmin/internal/gorm/model"
 	"gadmin/internal/gorm/query"
 	"gadmin/utility/character"
-	jsoniter "github.com/json-iterator/go"
-	"github.com/sirupsen/logrus"
 	"net/http"
 )
 
@@ -182,20 +180,21 @@ func ValidityAuth(roleId int64, method, path string, systemId int32) (err error)
 		return errors.New("当前登录用户角色信息异常,请退出重新登录")
 	}
 
-	rdb := query.Use(AdminDB).AdminRole
-	result, err := rdb.Where(rdb.ID.Eq(roleId)).First()
-	if err != nil {
-		logrus.Warnf("AdminRole... err:%+v", err)
-		return
-	}
-
-	if result == nil {
-		return errors.New("获取角色信息失败")
-	}
+	//rdb := query.Use(AdminDB).AdminRole
+	//result, err := rdb.Where(rdb.ID.Eq(roleId)).First()
+	//if err != nil {
+	//	logrus.Warnf("AdminRole... err:%+v", err)
+	//	return
+	//}
+	//
+	//if result == nil {
+	//	return errors.New("获取角色信息失败")
+	//}
+	//
+	//if result.Status != 1 {
+	//	return errors.New("角色权限已被禁用")
+	//}
 
-	if result.Status != 1 {
-		return errors.New("角色权限已被禁用")
-	}
 	//rpdb := query.Use(AdminDB).AdminRolePermission
 	//var possess []int
 	//err = rpdb.Where(rpdb.SystemID.Eq(systemId), rpdb.RoleID.Eq(int32(roleId))).Pluck(rpdb.PermissionID, &possess)
@@ -248,31 +247,31 @@ type Permission struct {
 }
 
 // GetAllPermissions 获取所有权限
-func GetAllPermissions() ([]*Permission, error) {
-	q := query.Use(AdminDB).AdminPermission
-	permissionList, err := q.WithContext(context.Background()).Order(q.ID).Find()
-	if err != nil {
-		return nil, err
-	}
-	var result []*Permission
-	for _, v := range permissionList {
-		apis := make([]string, 0)
-		if err := jsoniter.UnmarshalFromString(v.Apis, &apis); err != nil {
-			return nil, err
-		}
-		result = append(result, &Permission{
-			ID:   v.ID,
-			Name: v.Name,
-			Apis: apis,
-		})
-	}
-	return result, nil
-}
+//func GetAllPermissions() ([]*Permission, error) {
+//	q := query.Use(AdminDB).AdminPermission
+//	permissionList, err := q.WithContext(context.Background()).Order(q.ID).Find()
+//	if err != nil {
+//		return nil, err
+//	}
+//	var result []*Permission
+//	for _, v := range permissionList {
+//		apis := make([]string, 0)
+//		if err := jsoniter.UnmarshalFromString(v.Apis, &apis); err != nil {
+//			return nil, err
+//		}
+//		result = append(result, &Permission{
+//			ID:   v.ID,
+//			Name: v.Name,
+//			Apis: apis,
+//		})
+//	}
+//	return result, nil
+//}
 
 // GetRoleSystemPermissions 获取角色下的权限
 func GetRoleSystemPermissions(roleId, systemId int64) ([]*model.AdminOperation, error) {
-	rpq := query.Use(AdminDB).AdminRolePermission
-	oq := query.Use(AdminDB).AdminOperation
+	rpq := query.Use(DB).AdminRolePermission
+	oq := query.Use(DB).AdminOperation
 	pIds := make([]int32, 0)
 	err := rpq.Where(rpq.RoleID.Eq(int32(roleId)), rpq.SystemID.Eq(int32(systemId))).Pluck(rpq.PermissionID, &pIds)
 	if err != nil {

+ 20 - 17
server/go.mod

@@ -1,10 +1,11 @@
 module gadmin
 
-go 1.22
+go 1.23.9
 
-toolchain go1.22.6
+toolchain go1.23.10
 
 require (
+	entrance-grpc v0.0.0-00010101000000-000000000000
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/docker/docker v23.0.1+incompatible
 	github.com/elastic/go-elasticsearch/v8 v8.7.1
@@ -14,7 +15,7 @@ require (
 	github.com/go-sql-driver/mysql v1.7.0
 	github.com/golang/protobuf v1.5.4
 	github.com/google/btree v1.1.2
-	github.com/google/uuid v1.3.1
+	github.com/google/uuid v1.6.0
 	github.com/gorilla/websocket v1.5.0
 	github.com/jinzhu/copier v0.3.5
 	github.com/jinzhu/now v1.1.5
@@ -35,7 +36,8 @@ require (
 	github.com/xujiajun/nutsdb v0.9.0
 	github.com/xuri/excelize/v2 v2.6.0
 	go.etcd.io/etcd/client/v3 v3.5.17
-	golang.org/x/crypto v0.28.0
+	golang.org/x/crypto v0.39.0
+	google.golang.org/grpc v1.73.0
 	gopkg.in/go-playground/validator.v8 v8.18.2
 	gopkg.in/natefinch/lumberjack.v2 v2.2.1
 	gopkg.in/yaml.v2 v2.4.0
@@ -57,7 +59,7 @@ require (
 	github.com/beorn7/perks v1.0.1 // indirect
 	github.com/buger/jsonparser v1.1.1 // indirect
 	github.com/bwmarrin/snowflake v0.3.0 // indirect
-	github.com/cespare/xxhash/v2 v2.2.0 // indirect
+	github.com/cespare/xxhash/v2 v2.3.0 // indirect
 	github.com/clbanning/mxj v1.8.4 // indirect
 	github.com/coreos/go-semver v0.3.0 // indirect
 	github.com/coreos/go-systemd/v22 v22.3.2 // indirect
@@ -121,18 +123,16 @@ require (
 	go.uber.org/atomic v1.7.0 // indirect
 	go.uber.org/multierr v1.6.0 // indirect
 	go.uber.org/zap v1.21.0 // indirect
-	golang.org/x/mod v0.17.0 // indirect
-	golang.org/x/net v0.25.0 // indirect
-	golang.org/x/sync v0.8.0 // indirect
-	golang.org/x/sys v0.26.0 // indirect
-	golang.org/x/text v0.19.0 // indirect
+	golang.org/x/mod v0.25.0 // indirect
+	golang.org/x/net v0.41.0 // indirect
+	golang.org/x/sync v0.15.0 // indirect
+	golang.org/x/sys v0.33.0 // indirect
+	golang.org/x/text v0.26.0 // indirect
 	golang.org/x/time v0.7.0 // indirect
-	golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
-	google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect
-	google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect
-	google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect
-	google.golang.org/grpc v1.59.0 // indirect
-	google.golang.org/protobuf v1.33.0 // indirect
+	golang.org/x/tools v0.33.0 // indirect
+	google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463 // indirect
+	google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect
+	google.golang.org/protobuf v1.36.6 // indirect
 	gopkg.in/go-playground/assert.v1 v1.2.1 // indirect
 	gopkg.in/ini.v1 v1.66.4 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
@@ -143,6 +143,9 @@ require (
 	xorm.io/xorm v1.3.9 // indirect
 )
 
-replace leafstalk => ./package/graveserver/leafstalk
+replace (
+	entrance-grpc => D:\project\admin-entrance\server\package\entrance-grpc
+	leafstalk => ./package/graveserver/leafstalk
+)
 
 //replace google.golang.org/grpc => google.golang.org/grpc@v1.26.0

+ 125 - 136
server/internal/admin/api/admin_role.go

@@ -1,138 +1,127 @@
 package api
 
-import (
-	"gadmin/config"
-	"gadmin/internal/admin/forms"
-	"gadmin/internal/admin/service"
-	"gadmin/internal/gorm/model"
-	"gadmin/internal/gorm/query"
-	"gadmin/utility/serializer"
-	"github.com/gin-gonic/gin"
-	"github.com/sirupsen/logrus"
-)
-
-func AdminRoleList(c *gin.Context) {
-	var req forms.AdminRoleListReq
-	if err := c.ShouldBind(&req); err != nil {
-		c.JSON(200, ErrorResponse(err))
-		return
-	}
-	if err := forms.ParseParams(&req); err != nil {
-		c.JSON(200, ErrorResponse(err))
-		return
-	}
-
-	c.JSON(200, service.AdminRole.List(c, req))
-}
-
-func AdminRoleAuthOption(c *gin.Context) {
-	var (
-		//keys  []int
-		lists []*forms.Option
-	)
-	//permissions, err := config.GetAllPermissions()
-	permissions := config.GetAllOptions()
-
-	//if err != nil {
-	//	c.JSON(200, ErrorResponse(err))
-	//	return
-	//}
-
-	//for k, _ := range config.AuthNameMap {
-	//	keys = append(keys, k)
-	//}
-	//
-	//sort.Ints(keys)
-
-	for _, v := range permissions {
-		lists = append(lists, &forms.Option{
-			Value: v.ID,
-			Label: v.Name,
-			Name:  v.Name,
-		})
-	}
-
-	c.JSON(200, serializer.Suc(lists))
-}
-
-func AdminRolePageOption(c *gin.Context) {
-
-	lists := make(map[int32][]*forms.TreeOption)
-
-	menuMap, err := GetAllMenuList(c)
-	if err != nil {
-		c.JSON(200, ErrorResponse(err))
-		return
-	}
-	for systemId, items := range menuMap {
-		for _, item := range items {
-			if item.Meta.IsSuper {
-				continue
-			}
-			menu := &forms.TreeOption{
-				Key:      item.Id,
-				Label:    item.Meta.Title,
-				Children: []*forms.TreeOption{},
-			}
-			if len(item.Children) > 0 {
-				for _, children := range item.Children {
-					if children.Meta.IsSuper {
-						continue
-					}
-					menu.Children = append(menu.Children, &forms.TreeOption{
-						Key:   children.Id,
-						Label: children.Meta.Title,
-					})
-				}
-			}
-			if _, ok := lists[systemId]; !ok {
-				lists[systemId] = []*forms.TreeOption{menu}
-			} else {
-				lists[systemId] = append(lists[systemId], menu)
-			}
-		}
-	}
-
-	c.JSON(200, serializer.Suc(lists))
-}
-
-// AdminRoleOption 角色选项
-func AdminRoleOption(c *gin.Context) {
-	var (
-		q     = query.Use(config.AdminDB).AdminRole
-		m     = q.WithContext(c)
-		lists []*model.AdminRole
-		list  []forms.Option
-		err   error
-	)
-
-	if err = m.Scan(&lists); err != nil {
-		c.JSON(200, ErrorResponse(err))
-		return
-	}
-
-	for _, v := range lists {
-		list = append(list, forms.Option{
-			Value: v.ID,
-			Label: v.Name,
-			Name:  v.Name,
-		})
-	}
-
-	c.JSON(200, serializer.Suc(list))
-}
-
-func AdminRoleEdit(c *gin.Context) {
-	var req forms.AdminRoleEditReq
-	if err := c.ShouldBind(&req); err != nil {
-		logrus.Error(err)
-		c.JSON(200, ErrorResponse(err))
-		return
-	}
-	if err := forms.ParseParams(&req); err != nil {
-		c.JSON(200, ErrorResponse(err))
-		return
-	}
-
-	c.JSON(200, service.AdminRole.Edit(c, req))
-}
+//func AdminRoleList(c *gin.Context) {
+//	var req forms.AdminRoleListReq
+//	if err := c.ShouldBind(&req); err != nil {
+//		c.JSON(200, ErrorResponse(err))
+//		return
+//	}
+//	if err := forms.ParseParams(&req); err != nil {
+//		c.JSON(200, ErrorResponse(err))
+//		return
+//	}
+//
+//	c.JSON(200, service.AdminRole.List(c, req))
+//}
+//
+//func AdminRoleAuthOption(c *gin.Context) {
+//	var (
+//		//keys  []int
+//		lists []*forms.Option
+//	)
+//	//permissions, err := config.GetAllPermissions()
+//	permissions := config.GetAllOptions()
+//
+//	//if err != nil {
+//	//	c.JSON(200, ErrorResponse(err))
+//	//	return
+//	//}
+//
+//	//for k, _ := range config.AuthNameMap {
+//	//	keys = append(keys, k)
+//	//}
+//	//
+//	//sort.Ints(keys)
+//
+//	for _, v := range permissions {
+//		lists = append(lists, &forms.Option{
+//			Value: v.ID,
+//			Label: v.Name,
+//			Name:  v.Name,
+//		})
+//	}
+//
+//	c.JSON(200, serializer.Suc(lists))
+//}
+//
+//func AdminRolePageOption(c *gin.Context) {
+//
+//	lists := make(map[int32][]*forms.TreeOption)
+//
+//	menuMap, err := GetAllMenuList(c)
+//	if err != nil {
+//		c.JSON(200, ErrorResponse(err))
+//		return
+//	}
+//	for systemId, items := range menuMap {
+//		for _, item := range items {
+//			if item.Meta.IsSuper {
+//				continue
+//			}
+//			menu := &forms.TreeOption{
+//				Key:      item.Id,
+//				Label:    item.Meta.Title,
+//				Children: []*forms.TreeOption{},
+//			}
+//			if len(item.Children) > 0 {
+//				for _, children := range item.Children {
+//					if children.Meta.IsSuper {
+//						continue
+//					}
+//					menu.Children = append(menu.Children, &forms.TreeOption{
+//						Key:   children.Id,
+//						Label: children.Meta.Title,
+//					})
+//				}
+//			}
+//			if _, ok := lists[systemId]; !ok {
+//				lists[systemId] = []*forms.TreeOption{menu}
+//			} else {
+//				lists[systemId] = append(lists[systemId], menu)
+//			}
+//		}
+//	}
+//
+//	c.JSON(200, serializer.Suc(lists))
+//}
+//
+//// AdminRoleOption 角色选项
+//func AdminRoleOption(c *gin.Context) {
+//	var (
+//		q     = query.Use(config.AdminDB).AdminRole
+//		m     = q.WithContext(c)
+//		lists []*model.AdminRole
+//		list  []forms.Option
+//		err   error
+//	)
+//
+//	if err = m.Scan(&lists); err != nil {
+//		c.JSON(200, ErrorResponse(err))
+//		return
+//	}
+//
+//	for _, v := range lists {
+//		list = append(list, forms.Option{
+//			Value: v.ID,
+//			Label: v.Name,
+//			Name:  v.Name,
+//		})
+//	}
+//
+//	c.JSON(200, serializer.Suc(list))
+//}
+//
+//func AdminRoleEdit(c *gin.Context) {
+//	var req forms.AdminRoleEditReq
+//	if err := c.ShouldBind(&req); err != nil {
+//		logrus.Error(err)
+//		c.JSON(200, ErrorResponse(err))
+//		return
+//	}
+//	if err := forms.ParseParams(&req); err != nil {
+//		c.JSON(200, ErrorResponse(err))
+//		return
+//	}
+//
+//	c.JSON(200, service.AdminRole.Edit(c, req))
+//}

+ 82 - 82
server/internal/admin/api/admin_user.go

@@ -20,16 +20,16 @@ func UserRegister(c *gin.Context) {
 	}
 }
 
-func UserLogin(c *gin.Context) {
-	ip := c.ClientIP()
-	var req forms.UserLoginReq
-	if err := c.ShouldBind(&req); err == nil {
-		res := service.User.Login(req, ip)
-		c.JSON(200, res)
-	} else {
-		c.JSON(200, ErrorResponse(err))
-	}
-}
+//func UserLogin(c *gin.Context) {
+//	ip := c.ClientIP()
+//	var req forms.UserLoginReq
+//	if err := c.ShouldBind(&req); err == nil {
+//		res := service.User.Login(req, ip)
+//		c.JSON(200, res)
+//	} else {
+//		c.JSON(200, ErrorResponse(err))
+//	}
+//}
 
 func UserMe(c *gin.Context) {
 	var (
@@ -41,12 +41,12 @@ func UserMe(c *gin.Context) {
 		Value: "value",
 	})
 	//获取用户角色权限
-	roleInfo, err := service.AdminRole.GetRole(c, forms.AdminRoleReq{ID: user.RoleId})
-	if err != nil || roleInfo == nil {
-		c.JSON(200, ErrorResponse(err))
-		return
-	}
-	if roleInfo.Key == "super" {
+	//roleInfo, err := service.AdminRole.GetRole(c, forms.AdminRoleReq{ID: user.RoleId})
+	//if err != nil || roleInfo == nil {
+	//	c.JSON(200, ErrorResponse(err))
+	//	return
+	//}
+	if user.RoleId == 1 {
 		for k, _ := range config.AuthMenuMap {
 			permissions = append(permissions, forms.UserLoginPermissions{
 				Label: config.AuthNameMap[k],
@@ -54,9 +54,9 @@ func UserMe(c *gin.Context) {
 			})
 		}
 	} else {
-		rpdb := query.Use(config.AdminDB).AdminRolePermission
+		rpdb := query.Use(config.DB).AdminRolePermission
 		rolePermission := make([]int, 0)
-		err = rpdb.Where(rpdb.SystemID.Eq(user.SystemId)).Pluck(rpdb.PermissionID, &rolePermission)
+		err := rpdb.Where(rpdb.SystemID.Eq(user.SystemId)).Pluck(rpdb.PermissionID, &rolePermission)
 		//err = json.Unmarshal([]byte(roleInfo.Permissions), &rolePermission)
 		if err != nil {
 			c.JSON(200, ErrorResponse(err))
@@ -97,67 +97,67 @@ func UserLogout(c *gin.Context) {
 	c.JSON(200, serializer.Suc(nil, "退出成功"))
 }
 
-func AdminUserList(c *gin.Context) {
-	var req forms.AdminUserListReq
-	if err := c.ShouldBind(&req); err != nil {
-		c.JSON(200, ErrorResponse(err))
-		return
-	}
-	if err := forms.ParseParams(&req); err != nil {
-		c.JSON(200, ErrorResponse(err))
-		return
-	}
-
-	c.JSON(200, service.User.List(c, req))
-}
-
-func AdminUserEdit(c *gin.Context) {
-	var req forms.AdminUserEditReq
-	if err := c.ShouldBind(&req); err != nil {
-		c.JSON(200, ErrorResponse(err))
-		return
-	}
-	if err := forms.ParseParams(&req); err != nil {
-		c.JSON(200, ErrorResponse(err))
-		return
-	}
-
-	c.JSON(200, service.User.Edit(c, req))
-}
-
-func ResetPassword(c *gin.Context) {
-	var req forms.AdminUserResetPasswordReq
-	if err := c.ShouldBind(&req); err != nil {
-		c.JSON(200, ErrorResponse(err))
-		return
-	}
-	if err := forms.ParseParams(&req); err != nil {
-		c.JSON(200, ErrorResponse(err))
-		return
-	}
-
-	c.JSON(200, service.User.ResetPassword(c, req))
-}
-
-func UpdatePassword(c *gin.Context) {
-	var req forms.AdminUserUpdatePasswordReq
-	if err := c.ShouldBind(&req); err != nil {
-		c.JSON(200, ErrorResponse(err))
-		return
-	}
-	if err := forms.ParseParams(&req); err != nil {
-		c.JSON(200, ErrorResponse(err))
-		return
-	}
-
-	c.JSON(200, service.User.UpdatePassword(c, req))
-}
-
-func RolePermission(c *gin.Context) {
-	is, err := service.User.GetUserRolePermission(c)
-	if err != nil {
-		c.JSON(200, ErrorResponse(err))
-		return
-	}
-	c.JSON(200, serializer.Suc(is, "获取成功"))
-}
+//func AdminUserList(c *gin.Context) {
+//	var req forms.AdminUserListReq
+//	if err := c.ShouldBind(&req); err != nil {
+//		c.JSON(200, ErrorResponse(err))
+//		return
+//	}
+//	if err := forms.ParseParams(&req); err != nil {
+//		c.JSON(200, ErrorResponse(err))
+//		return
+//	}
+//
+//	c.JSON(200, service.User.List(c, req))
+//}
+
+//func AdminUserEdit(c *gin.Context) {
+//	var req forms.AdminUserEditReq
+//	if err := c.ShouldBind(&req); err != nil {
+//		c.JSON(200, ErrorResponse(err))
+//		return
+//	}
+//	if err := forms.ParseParams(&req); err != nil {
+//		c.JSON(200, ErrorResponse(err))
+//		return
+//	}
+//
+//	c.JSON(200, service.User.Edit(c, req))
+//}
+
+//func ResetPassword(c *gin.Context) {
+//	var req forms.AdminUserResetPasswordReq
+//	if err := c.ShouldBind(&req); err != nil {
+//		c.JSON(200, ErrorResponse(err))
+//		return
+//	}
+//	if err := forms.ParseParams(&req); err != nil {
+//		c.JSON(200, ErrorResponse(err))
+//		return
+//	}
+//
+//	c.JSON(200, service.User.ResetPassword(c, req))
+//}
+//
+//func UpdatePassword(c *gin.Context) {
+//	var req forms.AdminUserUpdatePasswordReq
+//	if err := c.ShouldBind(&req); err != nil {
+//		c.JSON(200, ErrorResponse(err))
+//		return
+//	}
+//	if err := forms.ParseParams(&req); err != nil {
+//		c.JSON(200, ErrorResponse(err))
+//		return
+//	}
+//
+//	c.JSON(200, service.User.UpdatePassword(c, req))
+//}
+//
+//func RolePermission(c *gin.Context) {
+//	is, err := service.User.GetUserRolePermission(c)
+//	if err != nil {
+//		c.JSON(200, ErrorResponse(err))
+//		return
+//	}
+//	c.JSON(200, serializer.Suc(is, "获取成功"))
+//}

+ 0 - 12
server/internal/admin/api/feishu.go

@@ -1,12 +0,0 @@
-package api
-
-import (
-	"gadmin/internal/admin/service"
-	"github.com/gin-gonic/gin"
-	"net/http"
-)
-
-// FeiShuUserInfoLogin 通过code获取飞书用户信息
-func FeiShuUserInfoLogin(c *gin.Context) {
-	c.JSON(http.StatusOK, service.FeiShu.FeiShuUserLogin(c))
-}

+ 890 - 893
server/internal/admin/api/menu.go

@@ -1,13 +1,10 @@
 package api
 
 import (
-	"gadmin/config"
-	"gadmin/internal/admin/forms"
 	"gadmin/internal/admin/service"
 	"gadmin/utility/serializer"
 	"gadmin/utility/token"
 	"github.com/gin-gonic/gin"
-	"os"
 )
 
 type (
@@ -27,894 +24,894 @@ func MenuDynamic(c *gin.Context) {
 	return
 }
 
-func GetAllMenuList(c *gin.Context) (map[int32][]*forms.Menu, error) {
-	systems, err := service.AdminRole.GetAllSystem()
-	if err != nil {
-		return nil, err
-	}
-	t := c.GetHeader("authorization")
-	roleId, _ := c.Get("admin_role_id")
-
-	systemMap := make(map[int32][]*forms.Menu)
-	for _, sys := range systems {
-		menus, err := service.Menu.GetRoleMenuList(sys.ID, roleId.(int64), t)
-		if err != nil {
-			return nil, err
-		}
-		systemMap[sys.ID] = menus
-	}
-	return systemMap, nil
-}
-
-func GetMenuList(c *gin.Context) []Map {
-	var (
-		lists       []Map
-		localHidden = true // 本地显示的菜单
-	)
-
-	if os.Getenv("ADMIN_IS_LOCAL") == "1" {
-		localHidden = false
-	}
-
-	// 控制台
-	lists = append(lists, Map{
-		"id":        1,
-		"path":      "/dashboard",
-		"name":      "Dashboard",
-		"component": "LAYOUT",
-		"redirect":  "/dashboard/console",
-		"meta": Map{
-			"title": "Dashboard",
-			"icon":  "DashboardOutlined",
-		},
-		"children": []Map{
-			{
-				"id":        1001,
-				"path":      "console",
-				"name":      "dashboard_console",
-				"component": "/dashboard/console/console",
-				"meta": Map{
-					"title": "主控台",
-				},
-			},
-		},
-	})
-
-	// 玩家管理
-	lists = append(lists, Map{
-		"id":        2,
-		"path":      "/account",
-		"name":      "Account",
-		"component": "LAYOUT",
-		"redirect":  "/account/account-list",
-		"meta": Map{
-			"icon":  "UserOutlined",
-			"title": "玩家管理",
-			"sort":  2,
-		},
-		"children": []Map{
-			{
-				"id":        2001,
-				"path":      "account-list",
-				"name":      "account-list",
-				"component": "/account/accountList/index",
-				"meta": Map{
-					"title": "玩家列表",
-				},
-			},
-			{
-				"id":        2002,
-				"path":      "account-info/:id?",
-				"name":      "account-info",
-				"component": "/account/accountList/info",
-				"meta": Map{
-					"title":      "基础详情",
-					"hidden":     true,
-					"activeMenu": "account-list",
-				},
-			},
-			{
-				"id":        2003,
-				"path":      "account-search",
-				"name":      "account-search",
-				"component": "/account/accountList/search",
-				"meta": Map{
-					"title": "全服查找",
-				},
-			},
-			/*{
-				"path":      "account-banLogs",
-				"name":      "account-banLogs",
-				"component": "/account/accountList/banLogs",
-				"meta": Map{
-					"title": "拉黑记录",
-				},
-			},
-			{
-				"path":      "retrofit-list",
-				"name":      "retrofit-list",
-				"component": "/retrofit/index",
-				"meta": Map{
-					"title": "配装模板",
-				},
-			},
-			{
-				"path":      "consumption-details",
-				"name":      "consumption-details",
-				"component": "/recharge/consumption/index",
-				"meta": Map{
-					"title": "消费变动记录",
-				},
-			},
-			{
-				"path":      "consumption-statistics",
-				"name":      "consumption-statistics",
-				"component": "/recharge/consumptionStatistics/index",
-				"meta": Map{
-					"title": "消费统计",
-				},
-			},
-			{
-				"path":      "game-data-alarm",
-				"name":      "game-data-alarm",
-				"component": "/account/gameDataAlarm/index",
-				"meta": Map{
-					"title": "游戏异常",
-				},
-			},
-			{
-				"path":      "game-cheating-alarm",
-				"name":      "game-cheating-alarm",
-				"component": "/account/gameCheatingAlarm/index",
-				"meta": Map{
-					"title": "作弊数据筛选",
-				},
-			},
-			{
-				"path":      "chat-report-list",
-				"name":      "chat-report-list",
-				"component": "/account/chatReportList/index",
-				"meta": Map{
-					"title": "聊天举报记录",
-				},
-			},
-			{
-				"path":      "chat-log-list",
-				"name":      "chat-log-list",
-				"component": "/account/chatLogList/index",
-				"meta": Map{
-					"title": "聊天记录",
-				},
-			},*/
-		},
-	})
-
-	if config.IsSuperRole(service.User.GetUserRoleId(c)) {
-		// 权限管理
-		lists = append(lists, Map{
-			"id":        3,
-			"path":      "/permission",
-			"name":      "Permission",
-			"component": "LAYOUT",
-			"redirect":  "/permission/menu",
-			"meta": Map{
-				"icon":  "SafetyCertificateOutlined",
-				"title": "权限管理",
-				"sort":  1,
-			},
-			"children": []Map{
-				{
-					"id":        3003,
-					"path":      "menu",
-					"name":      "permission_menu",
-					"component": "/permission/menu/menu",
-					"meta": Map{
-						"title": "菜单权限",
-					},
-				},
-				{
-					"id":        3001,
-					"path":      "user",
-					"name":      "permission_user",
-					"component": "/permission/user/user",
-					"meta": Map{
-						"title": "后台用户",
-					},
-				},
-				{
-					"id":        3002,
-					"path":      "role",
-					"name":      "permission_role",
-					"component": "/permission/role/role",
-					"meta": Map{
-						"title": "角色管理",
-					},
-				},
-			},
-		})
-	}
+//func GetAllMenuList(c *gin.Context) (map[int32][]*forms.Menu, error) {
+//	systems, err := service.AdminRole.GetAllSystem()
+//	if err != nil {
+//		return nil, err
+//	}
+//	t := c.GetHeader("authorization")
+//	roleId, _ := c.Get("admin_role_id")
+//
+//	systemMap := make(map[int32][]*forms.Menu)
+//	for _, sys := range systems {
+//		menus, err := service.Menu.GetRoleMenuList(sys.ID, roleId.(int64), t)
+//		if err != nil {
+//			return nil, err
+//		}
+//		systemMap[sys.ID] = menus
+//	}
+//	return systemMap, nil
+//}
 
-	// 充值管理
-	/*lists = append(lists, Map{
-		"id":        4,
-		"path":      "/recharge",
-		"name":      "Recharge",
-		"component": "LAYOUT",
-		"redirect":  "/recharge/recharge-list",
-		"meta": Map{
-			"icon":  "PayCircleOutlined",
-			"title": "充值订单",
-			"sort":  2,
-		},
-		"children": []Map{
-			{
-				"id":        4001,
-				"path":      "recharge-list",
-				"name":      "recharge-list",
-				"component": "/recharge/rechargeList/index",
-				"meta": Map{
-					"title": "订单记录",
-				},
-			},
-			{
-				"id":        4002,
-				"path":      "recharge-dailyStatistics",
-				"name":      "recharge-dailyStatistics",
-				"component": "/recharge/dailyStatistics/index",
-				"meta": Map{
-					"title": "每日统计",
-				},
-			},
-			{
-				"id":        4003,
-				"path":      "recharge-ordersSettle",
-				"name":      "recharge-ordersSettle",
-				"component": "/recharge/ordersSettle/index",
-				"meta": Map{
-					"title":     "余额平账",
-					"keepAlive": true,
-				},
-			},
-			{
-				"id":        4004,
-				"path":      "recharge-abnormalOrder",
-				"name":      "recharge-abnormalOrder",
-				"component": "/recharge/abnormalOrder/index",
-				"meta": Map{
-					"title":     "异常订单",
-					"keepAlive": true,
-				},
-			},
-		},
-	})*/
-
-	// 排行榜
-	/*lists = append(lists, Map{
-		"id":        5,
-		"path":      "/ranking",
-		"name":      "Ranking",
-		"component": "LAYOUT",
-		"redirect":  "/ranking/index",
-		"meta": Map{
-			"icon":  "CellularOutline",
-			"title": "排行榜",
-			"sort":  2,
-		},
-		"children": []Map{
-			{
-				"id":        5001,
-				"path":      "recharge-ranking",
-				"name":      "recharge-ranking",
-				"component": "/ranking/recharge/index",
-				"meta": Map{
-					"title": "充值排行",
-				},
-			},
-			{
-				"id":        5002,
-				"path":      "diamond-ranking",
-				"name":      "diamond-ranking",
-				"component": "/ranking/diamond/index",
-				"meta": Map{
-					"title": "消费排行",
-				},
-			},
-			{
-				"id":        5003,
-				"path":      "level-ranking",
-				"name":      "level-ranking",
-				"component": "/ranking/level/index",
-				"meta": Map{
-					"title": "等级排行",
-				},
-			},
-			{
-				"id":        5004,
-				"path":      "elrank-ranking",
-				"name":      "elrank-ranking",
-				"component": "/ranking/elrank/index",
-				"meta": Map{
-					"title": "无尽排行",
-				},
-			},
-			{
-				"id":        5005,
-				"path":      "duel-ranking",
-				"name":      "duel-ranking",
-				"component": "/ranking/duel/index",
-				"meta": Map{
-					"title": "狭路排行",
-				},
-			},
-			{
-				"id":        5006,
-				"path":      "gudong-ranking",
-				"name":      "gudong-ranking",
-				"component": "/ranking/gudong/index",
-				"meta": Map{
-					"title": "古玩排行",
-				},
-			},
-			{
-				"id":        5007,
-				"path":      "idiom-ranking",
-				"name":      "idiom-ranking",
-				"component": "/ranking/idiom/index",
-				"meta": Map{
-					"title": "金榜题名",
-				},
-			},
-			{
-				"id":        5008,
-				"path":      "boss-ranking",
-				"name":      "boss-ranking",
-				"component": "/ranking/boss/index",
-				"meta": Map{
-					"title": "暗影突袭",
-				},
-			},
-			{
-				"id":        5009,
-				"path":      "adv-ranking",
-				"name":      "adv-ranking",
-				"component": "/ranking/adv/index",
-				"meta": Map{
-					"title": "看广告排行",
-				},
-			},
-			{
-				"id":        5010,
-				"path":      "login-ranking",
-				"name":      "login-ranking",
-				"component": "/ranking/login/index",
-				"meta": Map{
-					"title": "登录排行",
-				},
-			},
-		},
-	})*/
-
-	// 数据统计
-	/*lists = append(lists, Map{
-		"id":        6,
-		"path":      "/echarts",
-		"name":      "Echarts",
-		"component": "LAYOUT",
-		"redirect":  "/echarts/index",
-		"meta": Map{
-			"icon":  "BarChartOutline",
-			"title": "数据统计",
-			"sort":  2,
-		},
-		"children": []Map{
-			{
-				"id":        6001,
-				"path":      "login-echarts",
-				"name":      "login-echarts",
-				"component": "/echarts/login/index",
-				"meta": Map{
-					"title": "登录数据",
-				},
-			},
-			{
-				"id":        6002,
-				"path":      "chapter-echarts",
-				"name":      "chapter-echarts",
-				"component": "/echarts/chapter/index",
-				"meta": Map{
-					"title": "关卡数据",
-				},
-			},
-			{
-				"id":        6003,
-				"path":      "basic-echarts",
-				"name":      "basic-echarts",
-				"component": "/echarts/basic/index",
-				"meta": Map{
-					"title": "基础数据",
-				},
-			},
-			{
-				"id":        6004,
-				"path":      "adv-echarts",
-				"name":      "adv-echarts",
-				"component": "/echarts/adv/index",
-				"meta": Map{
-					"title": "广告数据",
-				},
-			},
-			{
-				"id":        6005,
-				"path":      "echarts-tests",
-				"name":      "echarts-tests",
-				"component": "/echarts/adv/index2",
-				"meta": Map{
-					"hidden": localHidden,
-					"title":  "图表测试",
-				},
-			},
-			{
-				"id":        6006,
-				"path":      "goods-echarts",
-				"name":      "goods-echarts",
-				"component": "/echarts/goods/index",
-				"meta": Map{
-					"title": "商品数据",
-				},
-			},
-			{
-				"id":        6007,
-				"path":      "gudong-echarts",
-				"name":      "gudong-echarts",
-				"component": "/echarts/gudong/index",
-				"meta": Map{
-					"title": "古玩数据",
-				},
-			},
-			{
-				"id":        6008,
-				"path":      "duel-echarts",
-				"name":      "duel-echarts",
-				"component": "/echarts/duel/index",
-				"meta": Map{
-					"title": "狭路对决",
-				},
-			},
-			{
-				"id":        6009,
-				"path":      "expedition-echarts",
-				"name":      "expedition-echarts",
-				"component": "/echarts/expedition/index",
-				"meta": Map{
-					"title": "远征数据",
-				},
-			},
-			{
-				"id":        6010,
-				"path":      "idiom-echarts",
-				"name":      "idiom-echarts",
-				"component": "/echarts/idiom/index",
-				"meta": Map{
-					"title": "金榜题名",
-				},
-			},
-			{
-				"id":        6011,
-				"path":      "boss-echarts",
-				"name":      "boss-echarts",
-				"component": "/echarts/boss/index",
-				"meta": Map{
-					"title": "暗影突袭",
-				},
-			},
-			{
-				"id":        6012,
-				"path":      "seven-echarts",
-				"name":      "seven-echarts",
-				"component": "/echarts/seven/index",
-				"meta": Map{
-					"title": "七日任务",
-				},
-			},
-			{
-				"id":        6013,
-				"path":      "disconnect-echarts",
-				"name":      "disconnect-echarts",
-				"component": "/echarts/disconnect/index",
-				"meta": Map{
-					"title": "重连数据",
-				},
-			},
-			{
-				"id":        6014,
-				"path":      "gem-echarts",
-				"name":      "gem-echarts",
-				"component": "/echarts/gem/index",
-				"meta": Map{
-					"title": "宝石数据",
-				},
-			},
-			{
-				"id":        6015,
-				"path":      "limitgift-echarts",
-				"name":      "limitgift-echarts",
-				"component": "/echarts/limitgift/index",
-				"meta": Map{
-					"title": "限时礼包",
-				},
-			},
-			{
-				"id":        6016,
-				"path":      "treasure-echarts",
-				"name":      "treasure-echarts",
-				"component": "/echarts/treasure/index",
-				"meta": Map{
-					"title": "宝物数据",
-				},
-			},
-			{
-				"id":        6017,
-				"path":      "grandmaster-echarts",
-				"name":      "grandmaster-echarts",
-				"component": "/echarts/grandmaster/index",
-				"meta": Map{
-					"title": "最强王者",
-				},
-			},
-			{
-				"id":        6018,
-				"path":      "gradeDistribution-echarts",
-				"name":      "gradeDistribution-echarts",
-				"component": "/echarts/gradeDistribution/index",
-				"meta": Map{
-					"title": "玩家等级分布",
-				},
-			},
-			{
-				"id":        6019,
-				"path":      "roles-echarts",
-				"name":      "roles-echarts",
-				"component": "/echarts/roles/index",
-				"meta": Map{
-					"title": "玩家拥有角色",
-				},
-			},
-			{
-				"id":        6020,
-				"path":      "heroLevelDistribution-echarts",
-				"name":      "heroLevelDistribution-echarts",
-				"component": "/echarts/heroLevelDistribution/index",
-				"meta": Map{
-					"title": "角色等级分布",
-				},
-			},
-			{
-				"id":        6021,
-				"path":      "levelOutput-echarts",
-				"name":      "levelOutput-echarts",
-				"component": "/echarts/levelOutput/index",
-				"meta": Map{
-					"title": "玩家等级产出",
-				},
-			},
-		},
-	})*/
-
-	gameToolMap := make([]Map, 0)
-	gameToolMap = append(gameToolMap, Map{
-		"id":        7001,
-		"path":      "config",
-		"name":      "system_config",
-		"component": "/system/config/config",
-		"meta": Map{
-			"title": "服务配置",
-		},
-	}, Map{
-		"id":        7002,
-		"path":      "deploy",
-		"name":      "system_deploy",
-		"component": "/deploy/index",
-		"meta": Map{
-			"title": "服务部署",
-		},
-	})
-
-	//// 非正式环境加载工具库
-	//if os.Getenv("GIN_MODE") != "release" && os.Getenv("GIN_MODE") != "" {
-	//	gameToolMap = append(gameToolMap, Map{
-	//		"path":      "reboot",
-	//		"name":      "system_reboot",
-	//		"component": "/system/reboot/index",
-	//		"meta": Map{
-	//			"title": "重启服务",
-	//		}})
-	//}
-
-	/*gameToolMap = append(gameToolMap, Map{
-		"path":      "activity-tool",
-		"name":      "activity-tool",
-		"component": "/tool/activity/index",
-		"meta": Map{
-			"title": "活动查询",
-		},
-	})*/
-
-	// 游戏工具
-	lists = append(lists, Map{
-		"id":        7,
-		"path":      "/tool",
-		"name":      "Tool",
-		"component": "LAYOUT",
-		"redirect":  "/tool/index",
-		"meta": Map{
-			"icon":  "ToolOutlined",
-			"title": "游戏工具",
-			"sort":  5,
-		},
-		"children": gameToolMap,
-	})
-
-	// 邮件通知
-	/*lists = append(lists, Map{
-		"id":        8,
-		"path":      "/email",
-		"name":      "email",
-		"component": "LAYOUT",
-		//"redirect":  "/frame/docs",
-		"meta": Map{
-			"icon":       "MailOutlined",
-			"sort":       10,
-			"isRoot":     true,
-			"activeMenu": "email_index",
-		},
-		"children": []Map{
-			{
-				"id":        8001,
-				"path":      "index",
-				"name":      "email_index",
-				"component": "/email/index",
-				"meta": Map{
-					"title":      "邮件通知",
-					"activeMenu": "email_index",
-				},
-			}},
-	})*/
-
-	// 邮件通知
-	/*lists = append(lists, Map{
-		"id":        9,
-		"path":      "/Mail",
-		"name":      "mail",
-		"component": "LAYOUT",
-		//"redirect":  "/frame/docs",
-		"meta": Map{
-			"icon":       "MailOutlined",
-			"sort":       10,
-			"isRoot":     true,
-			"activeMenu": "mail_index",
-		},
-		"children": []Map{
-			{
-				"id":        9001,
-				"path":      "index",
-				"name":      "mail_index",
-				"component": "/mail/index",
-				"meta": Map{
-					"title":      "邮件通知(旧)",
-					"activeMenu": "mail_index",
-				},
-			}},
-	})*/
-
-	// 广播通知
-	/*lists = append(lists, Map{
-		"id":        10,
-		"path":      "/notice",
-		"name":      "notice",
-		"component": "LAYOUT",
-		//"redirect":  "/frame/docs",
-		"meta": Map{
-			"icon":  "MegaphoneOutline",
-			"sort":  10,
-			"title": "广播管理",
-			//"isRoot": true,
-			//"activeMenu": "noticev2_index",
-		},
-		"children": []Map{
-			{
-				"id":        10001,
-				"path":      "noticev2_index", // ?
-				"name":      "noticev2_index",
-				"component": "/noticev2/index",
-				"meta": Map{
-					"title": "广播通知",
-					//"activeMenu": "noticev2_index",
-				},
-			},
-			//{
-			//	"path":      "index",
-			//	"name":      "notice_index",
-			//	"component": "/notice/index",
-			//	"meta": Map{
-			//		"title": "广播通知(旧)",
-			//		//"activeMenu": "notice_index",
-			//	},
-			//},
-		},
-	})*/
-	// 客服记录
-	/*lists = append(lists, Map{
-		"id":        11,
-		"path":      "/chatLog",
-		"name":      "ChatLog",
-		"component": "LAYOUT",
-		"meta": Map{
-			"icon":        "ChatboxEllipsesOutline",
-			"sort":        10,
-			"title":       "客服记录",
-			"permissions": "ChatLog",
-		},
-		"children": []Map{
-			{
-				"id":        11001,
-				"path":      "chatLog-index",
-				"name":      "chatLog-index",
-				"component": "/chatLog/index",
-				"meta": Map{
-					"title": "客服记录",
-				},
-			},
-		},
-	})*/
-	// 兑换码
-	/*lists = append(lists, Map{
-		"id":        12,
-		"path":      "/cdk",
-		"name":      "cdk",
-		"component": "LAYOUT",
-		//"redirect":  "/frame/docs",
-		"meta": Map{
-			"icon": "TicketOutline",
-			"sort": 10,
-			//"isRoot": true,
-			//"activeMenu": "cdk_index",
-			"title": "兑换码管理",
-		},
-		"children": []Map{
-			{
-				"id":        12001,
-				"path":      "index",
-				"name":      "cdk_index",
-				"component": "/cdk/index",
-				"meta": Map{
-					"title":      "批次列表",
-					"activeMenu": "cdk_index",
-				},
-			},
-			{
-				"id":        12002,
-				"path":      "cdk-redeemCodeList/:sn?",
-				"name":      "cdk-redeemCodeList",
-				"component": "/cdk/redeemCodeList",
-				"meta": Map{
-					"title": "兑换码列表",
-					//"hidden":     true,
-					//"activeMenu": "cdk_index",
-				},
-			},
-		},
-	})*/
-
-	// 设置页面
-	lists = append(lists, Map{
-		"id":        13,
-		"path":      "/setting",
-		"name":      "Setting",
-		"component": "LAYOUT",
-		"redirect":  "/setting/account",
-		"meta": Map{
-			"icon":  "SettingOutlined",
-			"title": "账户设置",
-			"sort":  20,
-		},
-		"hidden": false,
-		"children": []Map{
-			{
-				"id":        13001,
-				"path":      "account",
-				"name":      "setting-account",
-				"component": "/setting/account/account",
-				"meta": Map{
-					"title": "个人信息",
-				},
-			},
-			//{
-			//	"path":      "info",
-			//	"name":      "result-info",
-			//	"component": "/setting/system/system",
-			//	"meta": Map{
-			//		"title": "信息页",
-			//	},
-			//},
-			{
-				"id":        13002,
-				"path":      "log",
-				"name":      "log-index",
-				"component": "/log/index",
-				"meta": Map{
-					"title": "操作日志",
-				},
-			},
-			{
-				"id":        13003,
-				"path":      "log-view/:id?",
-				"name":      "log-view",
-				"component": "/log/view",
-				"meta": Map{
-					"title":      "日志详情",
-					"hidden":     true,
-					"activeMenu": "log-index",
-				},
-			},
-		},
-	})
-	t := c.GetHeader("authorization")
-	// 管理后台切换
-	lists = append(lists, Map{
-		"id":        14,
-		"path":      "/server_select",
-		"name":      "ServerSelect",
-		"component": "LAYOUT",
-		"meta": Map{
-			"icon":  "ServerOutline",
-			"title": "管理后台切换",
-			"sort":  5,
-		},
-		"children": []Map{
-			{
-				"id":        14001,
-				"path":      "/redirect",
-				"name":      "http://101.43.249.6:7004/gadmin/?access-token=%s" + t,
-				"component": "LAYOUT",
-				"meta": Map{
-					"title": "魔君测试服",
-				},
-			},
-			{
-				"id":        14002,
-				"path":      "/redirect",
-				"name":      "http://101.43.249.6:7006/cadmin/?access-token=" + t,
-				"component": "LAYOUT",
-				"meta": Map{
-					"title": "空之契约测试服",
-				},
-			},
-			{
-				"id":        14003,
-				"path":      "/redirect",
-				"name":      "http://192.168.0.186:8253/gadmin/?access-token=" + t,
-				"component": "LAYOUT",
-				"meta": Map{
-					"title": "魔君本地",
-				},
-			},
-		},
-	})
-
-	// 文档
-	if localHidden == false {
-		lists = append(lists, Map{
-			"id":        15,
-			"path":      "/external",
-			"name":      "https://www.naiveui.com",
-			"component": "LAYOUT",
-			"meta": Map{
-				"icon":  "DocumentTextOutline",
-				"title": "NaiveUi文档",
-				"sort":  99,
-			},
-			"children": []Map{},
-		})
-	}
-	return lists
-}
+//func GetMenuList(c *gin.Context) []Map {
+//	var (
+//		lists       []Map
+//		localHidden = true // 本地显示的菜单
+//	)
+//
+//	if os.Getenv("ADMIN_IS_LOCAL") == "1" {
+//		localHidden = false
+//	}
+//
+//	// 控制台
+//	lists = append(lists, Map{
+//		"id":        1,
+//		"path":      "/dashboard",
+//		"name":      "Dashboard",
+//		"component": "LAYOUT",
+//		"redirect":  "/dashboard/console",
+//		"meta": Map{
+//			"title": "Dashboard",
+//			"icon":  "DashboardOutlined",
+//		},
+//		"children": []Map{
+//			{
+//				"id":        1001,
+//				"path":      "console",
+//				"name":      "dashboard_console",
+//				"component": "/dashboard/console/console",
+//				"meta": Map{
+//					"title": "主控台",
+//				},
+//			},
+//		},
+//	})
+//
+//	// 玩家管理
+//	lists = append(lists, Map{
+//		"id":        2,
+//		"path":      "/account",
+//		"name":      "Account",
+//		"component": "LAYOUT",
+//		"redirect":  "/account/account-list",
+//		"meta": Map{
+//			"icon":  "UserOutlined",
+//			"title": "玩家管理",
+//			"sort":  2,
+//		},
+//		"children": []Map{
+//			{
+//				"id":        2001,
+//				"path":      "account-list",
+//				"name":      "account-list",
+//				"component": "/account/accountList/index",
+//				"meta": Map{
+//					"title": "玩家列表",
+//				},
+//			},
+//			{
+//				"id":        2002,
+//				"path":      "account-info/:id?",
+//				"name":      "account-info",
+//				"component": "/account/accountList/info",
+//				"meta": Map{
+//					"title":      "基础详情",
+//					"hidden":     true,
+//					"activeMenu": "account-list",
+//				},
+//			},
+//			{
+//				"id":        2003,
+//				"path":      "account-search",
+//				"name":      "account-search",
+//				"component": "/account/accountList/search",
+//				"meta": Map{
+//					"title": "全服查找",
+//				},
+//			},
+//			/*{
+//				"path":      "account-banLogs",
+//				"name":      "account-banLogs",
+//				"component": "/account/accountList/banLogs",
+//				"meta": Map{
+//					"title": "拉黑记录",
+//				},
+//			},
+//			{
+//				"path":      "retrofit-list",
+//				"name":      "retrofit-list",
+//				"component": "/retrofit/index",
+//				"meta": Map{
+//					"title": "配装模板",
+//				},
+//			},
+//			{
+//				"path":      "consumption-details",
+//				"name":      "consumption-details",
+//				"component": "/recharge/consumption/index",
+//				"meta": Map{
+//					"title": "消费变动记录",
+//				},
+//			},
+//			{
+//				"path":      "consumption-statistics",
+//				"name":      "consumption-statistics",
+//				"component": "/recharge/consumptionStatistics/index",
+//				"meta": Map{
+//					"title": "消费统计",
+//				},
+//			},
+//			{
+//				"path":      "game-data-alarm",
+//				"name":      "game-data-alarm",
+//				"component": "/account/gameDataAlarm/index",
+//				"meta": Map{
+//					"title": "游戏异常",
+//				},
+//			},
+//			{
+//				"path":      "game-cheating-alarm",
+//				"name":      "game-cheating-alarm",
+//				"component": "/account/gameCheatingAlarm/index",
+//				"meta": Map{
+//					"title": "作弊数据筛选",
+//				},
+//			},
+//			{
+//				"path":      "chat-report-list",
+//				"name":      "chat-report-list",
+//				"component": "/account/chatReportList/index",
+//				"meta": Map{
+//					"title": "聊天举报记录",
+//				},
+//			},
+//			{
+//				"path":      "chat-log-list",
+//				"name":      "chat-log-list",
+//				"component": "/account/chatLogList/index",
+//				"meta": Map{
+//					"title": "聊天记录",
+//				},
+//			},*/
+//		},
+//	})
+//
+//	if config.IsSuperRole(service.User.GetUserRoleId(c)) {
+//		// 权限管理
+//		lists = append(lists, Map{
+//			"id":        3,
+//			"path":      "/permission",
+//			"name":      "Permission",
+//			"component": "LAYOUT",
+//			"redirect":  "/permission/menu",
+//			"meta": Map{
+//				"icon":  "SafetyCertificateOutlined",
+//				"title": "权限管理",
+//				"sort":  1,
+//			},
+//			"children": []Map{
+//				{
+//					"id":        3003,
+//					"path":      "menu",
+//					"name":      "permission_menu",
+//					"component": "/permission/menu/menu",
+//					"meta": Map{
+//						"title": "菜单权限",
+//					},
+//				},
+//				{
+//					"id":        3001,
+//					"path":      "user",
+//					"name":      "permission_user",
+//					"component": "/permission/user/user",
+//					"meta": Map{
+//						"title": "后台用户",
+//					},
+//				},
+//				{
+//					"id":        3002,
+//					"path":      "role",
+//					"name":      "permission_role",
+//					"component": "/permission/role/role",
+//					"meta": Map{
+//						"title": "角色管理",
+//					},
+//				},
+//			},
+//		})
+//	}
+//
+//	// 充值管理
+//	/*lists = append(lists, Map{
+//		"id":        4,
+//		"path":      "/recharge",
+//		"name":      "Recharge",
+//		"component": "LAYOUT",
+//		"redirect":  "/recharge/recharge-list",
+//		"meta": Map{
+//			"icon":  "PayCircleOutlined",
+//			"title": "充值订单",
+//			"sort":  2,
+//		},
+//		"children": []Map{
+//			{
+//				"id":        4001,
+//				"path":      "recharge-list",
+//				"name":      "recharge-list",
+//				"component": "/recharge/rechargeList/index",
+//				"meta": Map{
+//					"title": "订单记录",
+//				},
+//			},
+//			{
+//				"id":        4002,
+//				"path":      "recharge-dailyStatistics",
+//				"name":      "recharge-dailyStatistics",
+//				"component": "/recharge/dailyStatistics/index",
+//				"meta": Map{
+//					"title": "每日统计",
+//				},
+//			},
+//			{
+//				"id":        4003,
+//				"path":      "recharge-ordersSettle",
+//				"name":      "recharge-ordersSettle",
+//				"component": "/recharge/ordersSettle/index",
+//				"meta": Map{
+//					"title":     "余额平账",
+//					"keepAlive": true,
+//				},
+//			},
+//			{
+//				"id":        4004,
+//				"path":      "recharge-abnormalOrder",
+//				"name":      "recharge-abnormalOrder",
+//				"component": "/recharge/abnormalOrder/index",
+//				"meta": Map{
+//					"title":     "异常订单",
+//					"keepAlive": true,
+//				},
+//			},
+//		},
+//	})*/
+//
+//	// 排行榜
+//	/*lists = append(lists, Map{
+//		"id":        5,
+//		"path":      "/ranking",
+//		"name":      "Ranking",
+//		"component": "LAYOUT",
+//		"redirect":  "/ranking/index",
+//		"meta": Map{
+//			"icon":  "CellularOutline",
+//			"title": "排行榜",
+//			"sort":  2,
+//		},
+//		"children": []Map{
+//			{
+//				"id":        5001,
+//				"path":      "recharge-ranking",
+//				"name":      "recharge-ranking",
+//				"component": "/ranking/recharge/index",
+//				"meta": Map{
+//					"title": "充值排行",
+//				},
+//			},
+//			{
+//				"id":        5002,
+//				"path":      "diamond-ranking",
+//				"name":      "diamond-ranking",
+//				"component": "/ranking/diamond/index",
+//				"meta": Map{
+//					"title": "消费排行",
+//				},
+//			},
+//			{
+//				"id":        5003,
+//				"path":      "level-ranking",
+//				"name":      "level-ranking",
+//				"component": "/ranking/level/index",
+//				"meta": Map{
+//					"title": "等级排行",
+//				},
+//			},
+//			{
+//				"id":        5004,
+//				"path":      "elrank-ranking",
+//				"name":      "elrank-ranking",
+//				"component": "/ranking/elrank/index",
+//				"meta": Map{
+//					"title": "无尽排行",
+//				},
+//			},
+//			{
+//				"id":        5005,
+//				"path":      "duel-ranking",
+//				"name":      "duel-ranking",
+//				"component": "/ranking/duel/index",
+//				"meta": Map{
+//					"title": "狭路排行",
+//				},
+//			},
+//			{
+//				"id":        5006,
+//				"path":      "gudong-ranking",
+//				"name":      "gudong-ranking",
+//				"component": "/ranking/gudong/index",
+//				"meta": Map{
+//					"title": "古玩排行",
+//				},
+//			},
+//			{
+//				"id":        5007,
+//				"path":      "idiom-ranking",
+//				"name":      "idiom-ranking",
+//				"component": "/ranking/idiom/index",
+//				"meta": Map{
+//					"title": "金榜题名",
+//				},
+//			},
+//			{
+//				"id":        5008,
+//				"path":      "boss-ranking",
+//				"name":      "boss-ranking",
+//				"component": "/ranking/boss/index",
+//				"meta": Map{
+//					"title": "暗影突袭",
+//				},
+//			},
+//			{
+//				"id":        5009,
+//				"path":      "adv-ranking",
+//				"name":      "adv-ranking",
+//				"component": "/ranking/adv/index",
+//				"meta": Map{
+//					"title": "看广告排行",
+//				},
+//			},
+//			{
+//				"id":        5010,
+//				"path":      "login-ranking",
+//				"name":      "login-ranking",
+//				"component": "/ranking/login/index",
+//				"meta": Map{
+//					"title": "登录排行",
+//				},
+//			},
+//		},
+//	})*/
+//
+//	// 数据统计
+//	/*lists = append(lists, Map{
+//		"id":        6,
+//		"path":      "/echarts",
+//		"name":      "Echarts",
+//		"component": "LAYOUT",
+//		"redirect":  "/echarts/index",
+//		"meta": Map{
+//			"icon":  "BarChartOutline",
+//			"title": "数据统计",
+//			"sort":  2,
+//		},
+//		"children": []Map{
+//			{
+//				"id":        6001,
+//				"path":      "login-echarts",
+//				"name":      "login-echarts",
+//				"component": "/echarts/login/index",
+//				"meta": Map{
+//					"title": "登录数据",
+//				},
+//			},
+//			{
+//				"id":        6002,
+//				"path":      "chapter-echarts",
+//				"name":      "chapter-echarts",
+//				"component": "/echarts/chapter/index",
+//				"meta": Map{
+//					"title": "关卡数据",
+//				},
+//			},
+//			{
+//				"id":        6003,
+//				"path":      "basic-echarts",
+//				"name":      "basic-echarts",
+//				"component": "/echarts/basic/index",
+//				"meta": Map{
+//					"title": "基础数据",
+//				},
+//			},
+//			{
+//				"id":        6004,
+//				"path":      "adv-echarts",
+//				"name":      "adv-echarts",
+//				"component": "/echarts/adv/index",
+//				"meta": Map{
+//					"title": "广告数据",
+//				},
+//			},
+//			{
+//				"id":        6005,
+//				"path":      "echarts-tests",
+//				"name":      "echarts-tests",
+//				"component": "/echarts/adv/index2",
+//				"meta": Map{
+//					"hidden": localHidden,
+//					"title":  "图表测试",
+//				},
+//			},
+//			{
+//				"id":        6006,
+//				"path":      "goods-echarts",
+//				"name":      "goods-echarts",
+//				"component": "/echarts/goods/index",
+//				"meta": Map{
+//					"title": "商品数据",
+//				},
+//			},
+//			{
+//				"id":        6007,
+//				"path":      "gudong-echarts",
+//				"name":      "gudong-echarts",
+//				"component": "/echarts/gudong/index",
+//				"meta": Map{
+//					"title": "古玩数据",
+//				},
+//			},
+//			{
+//				"id":        6008,
+//				"path":      "duel-echarts",
+//				"name":      "duel-echarts",
+//				"component": "/echarts/duel/index",
+//				"meta": Map{
+//					"title": "狭路对决",
+//				},
+//			},
+//			{
+//				"id":        6009,
+//				"path":      "expedition-echarts",
+//				"name":      "expedition-echarts",
+//				"component": "/echarts/expedition/index",
+//				"meta": Map{
+//					"title": "远征数据",
+//				},
+//			},
+//			{
+//				"id":        6010,
+//				"path":      "idiom-echarts",
+//				"name":      "idiom-echarts",
+//				"component": "/echarts/idiom/index",
+//				"meta": Map{
+//					"title": "金榜题名",
+//				},
+//			},
+//			{
+//				"id":        6011,
+//				"path":      "boss-echarts",
+//				"name":      "boss-echarts",
+//				"component": "/echarts/boss/index",
+//				"meta": Map{
+//					"title": "暗影突袭",
+//				},
+//			},
+//			{
+//				"id":        6012,
+//				"path":      "seven-echarts",
+//				"name":      "seven-echarts",
+//				"component": "/echarts/seven/index",
+//				"meta": Map{
+//					"title": "七日任务",
+//				},
+//			},
+//			{
+//				"id":        6013,
+//				"path":      "disconnect-echarts",
+//				"name":      "disconnect-echarts",
+//				"component": "/echarts/disconnect/index",
+//				"meta": Map{
+//					"title": "重连数据",
+//				},
+//			},
+//			{
+//				"id":        6014,
+//				"path":      "gem-echarts",
+//				"name":      "gem-echarts",
+//				"component": "/echarts/gem/index",
+//				"meta": Map{
+//					"title": "宝石数据",
+//				},
+//			},
+//			{
+//				"id":        6015,
+//				"path":      "limitgift-echarts",
+//				"name":      "limitgift-echarts",
+//				"component": "/echarts/limitgift/index",
+//				"meta": Map{
+//					"title": "限时礼包",
+//				},
+//			},
+//			{
+//				"id":        6016,
+//				"path":      "treasure-echarts",
+//				"name":      "treasure-echarts",
+//				"component": "/echarts/treasure/index",
+//				"meta": Map{
+//					"title": "宝物数据",
+//				},
+//			},
+//			{
+//				"id":        6017,
+//				"path":      "grandmaster-echarts",
+//				"name":      "grandmaster-echarts",
+//				"component": "/echarts/grandmaster/index",
+//				"meta": Map{
+//					"title": "最强王者",
+//				},
+//			},
+//			{
+//				"id":        6018,
+//				"path":      "gradeDistribution-echarts",
+//				"name":      "gradeDistribution-echarts",
+//				"component": "/echarts/gradeDistribution/index",
+//				"meta": Map{
+//					"title": "玩家等级分布",
+//				},
+//			},
+//			{
+//				"id":        6019,
+//				"path":      "roles-echarts",
+//				"name":      "roles-echarts",
+//				"component": "/echarts/roles/index",
+//				"meta": Map{
+//					"title": "玩家拥有角色",
+//				},
+//			},
+//			{
+//				"id":        6020,
+//				"path":      "heroLevelDistribution-echarts",
+//				"name":      "heroLevelDistribution-echarts",
+//				"component": "/echarts/heroLevelDistribution/index",
+//				"meta": Map{
+//					"title": "角色等级分布",
+//				},
+//			},
+//			{
+//				"id":        6021,
+//				"path":      "levelOutput-echarts",
+//				"name":      "levelOutput-echarts",
+//				"component": "/echarts/levelOutput/index",
+//				"meta": Map{
+//					"title": "玩家等级产出",
+//				},
+//			},
+//		},
+//	})*/
+//
+//	gameToolMap := make([]Map, 0)
+//	gameToolMap = append(gameToolMap, Map{
+//		"id":        7001,
+//		"path":      "config",
+//		"name":      "system_config",
+//		"component": "/system/config/config",
+//		"meta": Map{
+//			"title": "服务配置",
+//		},
+//	}, Map{
+//		"id":        7002,
+//		"path":      "deploy",
+//		"name":      "system_deploy",
+//		"component": "/deploy/index",
+//		"meta": Map{
+//			"title": "服务部署",
+//		},
+//	})
+//
+//	//// 非正式环境加载工具库
+//	//if os.Getenv("GIN_MODE") != "release" && os.Getenv("GIN_MODE") != "" {
+//	//	gameToolMap = append(gameToolMap, Map{
+//	//		"path":      "reboot",
+//	//		"name":      "system_reboot",
+//	//		"component": "/system/reboot/index",
+//	//		"meta": Map{
+//	//			"title": "重启服务",
+//	//		}})
+//	//}
+//
+//	/*gameToolMap = append(gameToolMap, Map{
+//		"path":      "activity-tool",
+//		"name":      "activity-tool",
+//		"component": "/tool/activity/index",
+//		"meta": Map{
+//			"title": "活动查询",
+//		},
+//	})*/
+//
+//	// 游戏工具
+//	lists = append(lists, Map{
+//		"id":        7,
+//		"path":      "/tool",
+//		"name":      "Tool",
+//		"component": "LAYOUT",
+//		"redirect":  "/tool/index",
+//		"meta": Map{
+//			"icon":  "ToolOutlined",
+//			"title": "游戏工具",
+//			"sort":  5,
+//		},
+//		"children": gameToolMap,
+//	})
+//
+//	// 邮件通知
+//	/*lists = append(lists, Map{
+//		"id":        8,
+//		"path":      "/email",
+//		"name":      "email",
+//		"component": "LAYOUT",
+//		//"redirect":  "/frame/docs",
+//		"meta": Map{
+//			"icon":       "MailOutlined",
+//			"sort":       10,
+//			"isRoot":     true,
+//			"activeMenu": "email_index",
+//		},
+//		"children": []Map{
+//			{
+//				"id":        8001,
+//				"path":      "index",
+//				"name":      "email_index",
+//				"component": "/email/index",
+//				"meta": Map{
+//					"title":      "邮件通知",
+//					"activeMenu": "email_index",
+//				},
+//			}},
+//	})*/
+//
+//	// 邮件通知
+//	/*lists = append(lists, Map{
+//		"id":        9,
+//		"path":      "/Mail",
+//		"name":      "mail",
+//		"component": "LAYOUT",
+//		//"redirect":  "/frame/docs",
+//		"meta": Map{
+//			"icon":       "MailOutlined",
+//			"sort":       10,
+//			"isRoot":     true,
+//			"activeMenu": "mail_index",
+//		},
+//		"children": []Map{
+//			{
+//				"id":        9001,
+//				"path":      "index",
+//				"name":      "mail_index",
+//				"component": "/mail/index",
+//				"meta": Map{
+//					"title":      "邮件通知(旧)",
+//					"activeMenu": "mail_index",
+//				},
+//			}},
+//	})*/
+//
+//	// 广播通知
+//	/*lists = append(lists, Map{
+//		"id":        10,
+//		"path":      "/notice",
+//		"name":      "notice",
+//		"component": "LAYOUT",
+//		//"redirect":  "/frame/docs",
+//		"meta": Map{
+//			"icon":  "MegaphoneOutline",
+//			"sort":  10,
+//			"title": "广播管理",
+//			//"isRoot": true,
+//			//"activeMenu": "noticev2_index",
+//		},
+//		"children": []Map{
+//			{
+//				"id":        10001,
+//				"path":      "noticev2_index", // ?
+//				"name":      "noticev2_index",
+//				"component": "/noticev2/index",
+//				"meta": Map{
+//					"title": "广播通知",
+//					//"activeMenu": "noticev2_index",
+//				},
+//			},
+//			//{
+//			//	"path":      "index",
+//			//	"name":      "notice_index",
+//			//	"component": "/notice/index",
+//			//	"meta": Map{
+//			//		"title": "广播通知(旧)",
+//			//		//"activeMenu": "notice_index",
+//			//	},
+//			//},
+//		},
+//	})*/
+//	// 客服记录
+//	/*lists = append(lists, Map{
+//		"id":        11,
+//		"path":      "/chatLog",
+//		"name":      "ChatLog",
+//		"component": "LAYOUT",
+//		"meta": Map{
+//			"icon":        "ChatboxEllipsesOutline",
+//			"sort":        10,
+//			"title":       "客服记录",
+//			"permissions": "ChatLog",
+//		},
+//		"children": []Map{
+//			{
+//				"id":        11001,
+//				"path":      "chatLog-index",
+//				"name":      "chatLog-index",
+//				"component": "/chatLog/index",
+//				"meta": Map{
+//					"title": "客服记录",
+//				},
+//			},
+//		},
+//	})*/
+//	// 兑换码
+//	/*lists = append(lists, Map{
+//		"id":        12,
+//		"path":      "/cdk",
+//		"name":      "cdk",
+//		"component": "LAYOUT",
+//		//"redirect":  "/frame/docs",
+//		"meta": Map{
+//			"icon": "TicketOutline",
+//			"sort": 10,
+//			//"isRoot": true,
+//			//"activeMenu": "cdk_index",
+//			"title": "兑换码管理",
+//		},
+//		"children": []Map{
+//			{
+//				"id":        12001,
+//				"path":      "index",
+//				"name":      "cdk_index",
+//				"component": "/cdk/index",
+//				"meta": Map{
+//					"title":      "批次列表",
+//					"activeMenu": "cdk_index",
+//				},
+//			},
+//			{
+//				"id":        12002,
+//				"path":      "cdk-redeemCodeList/:sn?",
+//				"name":      "cdk-redeemCodeList",
+//				"component": "/cdk/redeemCodeList",
+//				"meta": Map{
+//					"title": "兑换码列表",
+//					//"hidden":     true,
+//					//"activeMenu": "cdk_index",
+//				},
+//			},
+//		},
+//	})*/
+//
+//	// 设置页面
+//	lists = append(lists, Map{
+//		"id":        13,
+//		"path":      "/setting",
+//		"name":      "Setting",
+//		"component": "LAYOUT",
+//		"redirect":  "/setting/account",
+//		"meta": Map{
+//			"icon":  "SettingOutlined",
+//			"title": "账户设置",
+//			"sort":  20,
+//		},
+//		"hidden": false,
+//		"children": []Map{
+//			{
+//				"id":        13001,
+//				"path":      "account",
+//				"name":      "setting-account",
+//				"component": "/setting/account/account",
+//				"meta": Map{
+//					"title": "个人信息",
+//				},
+//			},
+//			//{
+//			//	"path":      "info",
+//			//	"name":      "result-info",
+//			//	"component": "/setting/system/system",
+//			//	"meta": Map{
+//			//		"title": "信息页",
+//			//	},
+//			//},
+//			{
+//				"id":        13002,
+//				"path":      "log",
+//				"name":      "log-index",
+//				"component": "/log/index",
+//				"meta": Map{
+//					"title": "操作日志",
+//				},
+//			},
+//			{
+//				"id":        13003,
+//				"path":      "log-view/:id?",
+//				"name":      "log-view",
+//				"component": "/log/view",
+//				"meta": Map{
+//					"title":      "日志详情",
+//					"hidden":     true,
+//					"activeMenu": "log-index",
+//				},
+//			},
+//		},
+//	})
+//	t := c.GetHeader("authorization")
+//	// 管理后台切换
+//	lists = append(lists, Map{
+//		"id":        14,
+//		"path":      "/server_select",
+//		"name":      "ServerSelect",
+//		"component": "LAYOUT",
+//		"meta": Map{
+//			"icon":  "ServerOutline",
+//			"title": "管理后台切换",
+//			"sort":  5,
+//		},
+//		"children": []Map{
+//			{
+//				"id":        14001,
+//				"path":      "/redirect",
+//				"name":      "http://101.43.249.6:7004/gadmin/?access-token=%s" + t,
+//				"component": "LAYOUT",
+//				"meta": Map{
+//					"title": "魔君测试服",
+//				},
+//			},
+//			{
+//				"id":        14002,
+//				"path":      "/redirect",
+//				"name":      "http://101.43.249.6:7006/cadmin/?access-token=" + t,
+//				"component": "LAYOUT",
+//				"meta": Map{
+//					"title": "空之契约测试服",
+//				},
+//			},
+//			{
+//				"id":        14003,
+//				"path":      "/redirect",
+//				"name":      "http://192.168.0.186:8253/gadmin/?access-token=" + t,
+//				"component": "LAYOUT",
+//				"meta": Map{
+//					"title": "魔君本地",
+//				},
+//			},
+//		},
+//	})
+//
+//	// 文档
+//	if localHidden == false {
+//		lists = append(lists, Map{
+//			"id":        15,
+//			"path":      "/external",
+//			"name":      "https://www.naiveui.com",
+//			"component": "LAYOUT",
+//			"meta": Map{
+//				"icon":  "DocumentTextOutline",
+//				"title": "NaiveUi文档",
+//				"sort":  99,
+//			},
+//			"children": []Map{},
+//		})
+//	}
+//	return lists
+//}

+ 21 - 22
server/internal/admin/middleware/permission.go

@@ -3,7 +3,6 @@ package middleware
 import (
 	"gadmin/config"
 	"gadmin/internal/admin/consts"
-	"gadmin/internal/gorm/query"
 	"gadmin/utility/serializer"
 	"gadmin/utility/token"
 	"github.com/gin-gonic/gin"
@@ -19,36 +18,36 @@ func Permission() gin.HandlerFunc {
 			return
 		}
 		user := cUser.(*token.UserClaims)
-		q := query.Use(config.AdminDB).AdminUser
+		//q := query.Use(config.DB).AdminUser
 
 		c.Set("admin_id", user.ID)
 
-		models, err := q.WithContext(c).Where(q.ID.Eq(user.ID)).First()
-		if err != nil {
-			c.JSON(200, serializer.Err(consts.CodeNoPermission, err.Error(), err))
-			c.Abort()
-			return
-		}
-
-		if models == nil {
-			c.JSON(200, serializer.Err(consts.CodeNoPermission, "用户不存在", nil))
-			c.Abort()
-			return
-		}
-
-		if models.Status != 1 {
-			c.JSON(200, serializer.Err(consts.CodeCheckLogin, "账号已被禁用", nil))
-			c.Abort()
-			return
-		}
+		//models, err := q.WithContext(c).Where(q.ID.Eq(user.ID)).First()
+		//if err != nil {
+		//	c.JSON(200, serializer.Err(consts.CodeNoPermission, err.Error(), err))
+		//	c.Abort()
+		//	return
+		//}
+		//
+		//if models == nil {
+		//	c.JSON(200, serializer.Err(consts.CodeNoPermission, "用户不存在", nil))
+		//	c.Abort()
+		//	return
+		//}
+		//
+		//if models.Status != 1 {
+		//	c.JSON(200, serializer.Err(consts.CodeCheckLogin, "账号已被禁用", nil))
+		//	c.Abort()
+		//	return
+		//}
 		systemId := user.SystemId
 		/*if systemId <= 0 {
 			c.JSON(200, serializer.Err(consts.CodeNoPermission, "登陆失效", nil))
 			c.Abort()
 		}*/
 
-		if models.UserName != "mojun" {
-			if err := config.ValidityAuth(int64(models.RoleID), c.Request.Method, c.Request.URL.Path, systemId); err != nil {
+		if user.UserName != "mojun" {
+			if err := config.ValidityAuth(user.RoleId, c.Request.Method, c.Request.URL.Path, systemId); err != nil {
 				c.JSON(200, serializer.Err(consts.CodeNoPermission, err.Error(), err))
 				c.Abort()
 				return

+ 11 - 11
server/internal/admin/server/router.go

@@ -197,17 +197,17 @@ func NewEngine() *gin.Engine {
 
 			// 管理员操作
 			admin := auth.Group("admin")
-			admin.GET("roleList", api.AdminRoleList)             // 角色列表
-			admin.GET("roleAuthOption", api.AdminRoleAuthOption) // 角色权限选项
-			admin.GET("rolePageOption", api.AdminRolePageOption) // 角色可查看页面选项
-			admin.POST("roleEdit", api.AdminRoleEdit)            // 角色修改/创建
-			admin.GET("roleOption", api.AdminRoleOption)         // 角色选项
-			admin.GET("userList", api.AdminUserList)             // 用户列表
-			admin.POST("userEdit", api.AdminUserEdit)            // 用户修改/创建
-			admin.POST("resetPassword", api.ResetPassword)       // 用户重置密码
-			admin.POST("updatePassword", api.UpdatePassword)     // 用户修改密码
-			admin.GET("logList", api.AdminLogList)               // 操作日志
-			admin.GET("logView", api.AdminLogView)               // 操作日志详情
+			//admin.GET("roleList", api.AdminRoleList)             // 角色列表
+			//admin.GET("roleAuthOption", api.AdminRoleAuthOption) // 角色权限选项
+			//admin.GET("rolePageOption", api.AdminRolePageOption) // 角色可查看页面选项
+			//admin.POST("roleEdit", api.AdminRoleEdit)            // 角色修改/创建
+			//admin.GET("roleOption", api.AdminRoleOption)         // 角色选项
+			//admin.GET("userList", api.AdminUserList)             // 用户列表
+			//admin.POST("userEdit", api.AdminUserEdit)            // 用户修改/创建
+			//admin.POST("resetPassword", api.ResetPassword)       // 用户重置密码
+			//admin.POST("updatePassword", api.UpdatePassword)     // 用户修改密码
+			admin.GET("logList", api.AdminLogList) // 操作日志
+			admin.GET("logView", api.AdminLogView) // 操作日志详情
 
 			// gm更新操作
 			gm := auth.Group("gm")

+ 2 - 0
server/internal/admin/server/start.go

@@ -74,5 +74,7 @@ func after() {
 		logrus.Warnln("SaveToBak err:", err.Error())
 	}
 
+	config.CloseGrpcConn()
+
 	logrus.Infoln("已退出")
 }

+ 14 - 9
server/internal/admin/service/admin_email.go

@@ -1,7 +1,9 @@
 package service
 
 import (
+	"context"
 	"encoding/json"
+	"entrance-grpc/iam"
 	"fmt"
 	"gadmin/config"
 	"gadmin/internal/admin/consts"
@@ -46,7 +48,7 @@ func (s *sAdminEmail) List(ctx *gin.Context, req forms.AdminEmailListReq) serial
 	var (
 		q = query.Use(config.DB).AdminEmail
 		m = q.WithContext(ctx)
-		u = query.Use(config.AdminDB).AdminUser
+		//u = query.Use(config.DB).AdminUser
 
 		offset int64 = 0
 		models forms.UserAccountListRes
@@ -57,9 +59,11 @@ func (s *sAdminEmail) List(ctx *gin.Context, req forms.AdminEmailListReq) serial
 	models.PerPage = req.PerPage
 
 	if req.Sender != "" {
-		first, err := u.WithContext(ctx).Where(u.Nickname.Eq(req.Sender)).First()
-		if err == nil {
-			m = m.Where(q.OperatorID.Eq(first.ID))
+		first, err := config.GetIamClient().GetAdminUserByNickName(ctx, &iam.GetAdminUserByNickNameReq{
+			NickName: req.Sender,
+		})
+		if err == nil && first.Code == 0 {
+			m = m.Where(q.OperatorID.Eq(first.Data.ID))
 		}
 	}
 
@@ -109,16 +113,17 @@ func (s *sAdminEmail) List(ctx *gin.Context, req forms.AdminEmailListReq) serial
 	for uid := range uIdMap {
 		uIds = append(uIds, uid)
 	}
-	users, err := u.WithContext(ctx).Where(u.ID.In(uIds...)).Find()
-	if err != nil {
+	res, err := config.GetIamClient().BatchGetAdminUser(context.Background(), &iam.BatchGetAdminUserReq{UIds: uIds})
+	if err != nil || res.Code != 0 {
 		return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
 	}
-	uMap := make(map[int64]*model.AdminUser)
-	for _, usr := range users {
+
+	uMap := make(map[int64]*iam.AdminUserInfo)
+	for _, usr := range res.Data {
 		uMap[usr.ID] = usr
 	}
 	for _, item := range lists {
-		item.Sender = uMap[item.OperatorID].Nickname
+		item.Sender = uMap[item.OperatorID].NickName
 	}
 
 	models.List = lists

+ 34 - 12
server/internal/admin/service/admin_logs.go

@@ -1,6 +1,7 @@
 package service
 
 import (
+	"entrance-grpc/iam"
 	"gadmin/config"
 	"gadmin/internal/admin/consts"
 	"gadmin/internal/admin/forms"
@@ -18,8 +19,8 @@ type sAdminLog struct{}
 
 func (s *sAdminLog) View(ctx *gin.Context, req forms.AdminLogViewReq) serializer.Response {
 	var (
-		q      = query.Use(config.DB).AdminLog
-		u      = query.Use(config.DB).AdminUser
+		q = query.Use(config.DB).AdminLog
+		//u      = query.Use(config.AdminDB).AdminUser
 		m      = q.WithContext(ctx).Where(q.Environment.Eq(os.Getenv("GIN_MODE")))
 		models *forms.AdminLogViewModel
 	)
@@ -32,27 +33,35 @@ func (s *sAdminLog) View(ctx *gin.Context, req forms.AdminLogViewReq) serializer
 	if models == nil {
 		return serializer.Err(consts.CodeParamErr, "没有找到数据", nil)
 	}
-
 	models.AdminName = "未知"
-	user, _ := u.WithContext(ctx).Where(u.ID.Eq(models.AdminID)).First()
-	if user != nil {
-		models.AdminName = user.UserName
+	res, err := config.GetIamClient().GetAdminUserByID(ctx, &iam.GetAdminUserByIDReq{
+		UID: models.AdminID,
+	})
+	if err != nil && res.Data != nil {
+		models.AdminName = res.Data.UserName
 	}
 
+	//user, _ := u.WithContext(ctx).Where(u.ID.Eq(models.AdminID)).First()
+	//if user != nil {
+	//	models.AdminName = user.UserName
+	//}
+
 	return serializer.Suc(models)
 }
 
 func (s *sAdminLog) List(ctx *gin.Context, req forms.AdminLogListReq) serializer.Response {
 	var (
-		q            = query.Use(config.DB).AdminLog
-		u            = query.Use(config.DB).AdminUser
+		q = query.Use(config.DB).AdminLog
+		//u            = query.Use(config.AdminDB).AdminUser
 		m            = q.WithContext(ctx).Where(q.Environment.Eq(os.Getenv("GIN_MODE")))
 		offset int64 = 0
 		models forms.UserAccountListRes
 		lists  []*forms.AdminLogListModel
 	)
 
-	if !config.IsSuperRole(User.GetUserRoleId(ctx)) {
+	roleId, _ := ctx.Get("admin_role_id")
+
+	if !config.IsSuperRole(roleId.(int64)) {
 		m = m.Where(q.AdminID.Eq(token.GetUID(ctx)))
 	}
 
@@ -89,12 +98,25 @@ func (s *sAdminLog) List(ctx *gin.Context, req forms.AdminLogListReq) serializer
 			return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
 		}
 	}
+	uIds := make([]int64, 0)
+	for _, v := range lists {
+		uIds = append(uIds, v.AdminID)
+	}
 
+	resp, err := config.GetIamClient().BatchGetAdminUser(ctx, &iam.BatchGetAdminUserReq{
+		UIds: uIds,
+	})
+	if err != nil {
+		return serializer.Err(consts.CodeParamErr, "查询出错", err)
+	}
+	uMaps := make(map[int64]*iam.AdminUserInfo)
+	for _, v := range resp.Data {
+		uMaps[v.ID] = v
+	}
 	for _, v := range lists {
 		v.AdminName = "未知"
-		user, _ := u.WithContext(ctx).Where(u.ID.Eq(v.AdminID)).First()
-		if user != nil {
-			v.AdminName = user.UserName
+		if _, ok := uMaps[v.AdminID]; ok {
+			v.AdminName = uMaps[v.AdminID].UserName
 		}
 
 		v.Remark = config.GetMenuName(v.Path)

+ 4 - 4
server/internal/admin/service/admin_menu.go

@@ -22,9 +22,9 @@ func NewAMenu() *aMenu {
 }
 
 func (s *aMenu) GetMenuList(systemId int32) ([]*forms.Menu, error) {
-	q := query.Use(config.AdminDB).AdminMenu
+	q := query.Use(config.DB).AdminMenu
 	m := q.WithContext(context.Background())
-	m = m.Where(q.Disable.Eq(0), q.SystemID.Eq(systemId)).Order(q.Sort)
+	m = m.Where(q.Disable.Eq(0)).Order(q.Sort)
 	if os.Getenv("ADMIN_IS_LOCAL") != "1" {
 		m = m.Where(q.LocalShow.Eq(0))
 	}
@@ -117,9 +117,9 @@ func (s *aMenu) GetRoleMenuList(systemId int32, roleId int64, token string) ([]*
 		return lists, nil
 	}
 	var rolePages []int32
-	rdb := query.Use(config.AdminDB).AdminRoleMenu
+	rdb := query.Use(config.DB).AdminRoleMenu
 	m := rdb.WithContext(context.Background())
-	err = m.Where(rdb.RoleID.Eq(int32(roleId)), rdb.SystemID.Eq(systemId)).Pluck(rdb.PageID, &rolePages)
+	err = m.Where(rdb.RoleID.Eq(int32(roleId))).Pluck(rdb.PageID, &rolePages)
 	if err != nil {
 		logrus.Error("AdminRole... err:%+v", err)
 		return nil, err

+ 210 - 226
server/internal/admin/service/admin_role.go

@@ -1,233 +1,217 @@
 package service
 
-import (
-	"encoding/json"
-	"errors"
-	"gadmin/config"
-	"gadmin/internal/admin/consts"
-	"gadmin/internal/admin/forms"
-	"gadmin/internal/gorm/model"
-	"gadmin/internal/gorm/query"
-	"gadmin/utility/serializer"
-	"github.com/gin-gonic/gin"
-	"github.com/sirupsen/logrus"
-	"github.com/spf13/cast"
-	"gorm.io/gorm"
-	"time"
-)
-
 // AdminRole 后台角色
 var AdminRole = new(sAdminRole)
 
 type sAdminRole struct{}
 
-func (s *sAdminRole) List(ctx *gin.Context, req forms.AdminRoleListReq) serializer.Response {
-	var (
-		q            = query.Use(config.AdminDB).AdminRole
-		m            = q.WithContext(ctx)
-		mq           = query.Use(config.AdminDB).AdminRoleMenu
-		pq           = query.Use(config.AdminDB).AdminRolePermission
-		offset int64 = 0
-		models forms.UserAccountListRes
-		lists  []*forms.AdminRoleListModel
-	)
-
-	m = m.Order(q.Sort).Order(q.ID.Desc())
-
-	req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
-
-	count, err := m.Count()
-	if err != nil {
-		return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
-	}
-
-	if count > 0 {
-		if err = m.Limit(int(req.PerPage)).Offset(int(offset)).Scan(&lists); err != nil {
-			return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
-		}
-	}
-
-	for _, v := range lists {
-		if err := json.Unmarshal([]byte(cast.ToString(v.Systems)), &v.Systems); err != nil {
-			return serializer.Err(consts.CodeParamErr, "格式化出错 Systems", err)
-		}
-
-		permissionsModels, err := pq.Where(pq.RoleID.Eq(int32(v.ID))).Find()
-		if err != nil {
-			return serializer.Err(consts.CodeParamErr, "查询出错 permissionsModels", err)
-		}
-		permissionsMap := make(map[int32][]int32)
-		for _, item := range permissionsModels {
-			if _, ok := permissionsMap[item.SystemID]; ok {
-				permissionsMap[item.SystemID] = append(permissionsMap[item.SystemID], item.PermissionID)
-			} else {
-				permissionsMap[item.SystemID] = []int32{item.PermissionID}
-			}
-		}
-		v.Permissions = permissionsMap
-
-		pagesModels, err := mq.Where(mq.RoleID.Eq(int32(v.ID))).Find()
-		if err != nil {
-			return serializer.Err(consts.CodeParamErr, "查询出错 pagesModels", err)
-		}
-		pagesMap := make(map[int32][]int32)
-		for _, item := range pagesModels {
-			if _, ok := pagesMap[item.SystemID]; ok {
-				pagesMap[item.SystemID] = append(pagesMap[item.SystemID], item.PageID)
-			} else {
-				pagesMap[item.SystemID] = []int32{item.PageID}
-			}
-		}
-		v.Pages = pagesMap
-	}
-
-	models.List = lists
-	models.Page = req.Page
-	models.PerPage = req.PerPage
-	models.PageCount = (count + req.PerPage - 1) / req.PerPage
-
-	return serializer.Suc(models)
-}
-
-func (s *sAdminRole) Edit(ctx *gin.Context, req forms.AdminRoleEditReq) serializer.Response {
-
-	q := query.Use(config.AdminDB).AdminRole
-	mq := query.Use(config.AdminDB).AdminRoleMenu
-	pq := query.Use(config.AdminDB).AdminRolePermission
-	uq := query.Use(config.AdminDB).AdminUser
-
-	logrus.Warnf("req:%+v", req)
-
-	menusModel := make([]*model.AdminRoleMenu, 0)
-	for sysId, menus := range req.Pages {
-		for _, menu := range menus {
-			menusModel = append(menusModel, &model.AdminRoleMenu{
-				SystemID: sysId,
-				RoleID:   int32(req.ID),
-				PageID:   menu,
-			})
-		}
-	}
-	permissionsModel := make([]*model.AdminRolePermission, 0)
-	for sysId, permissions := range req.Permissions {
-		for _, id := range permissions {
-			permissionsModel = append(permissionsModel, &model.AdminRolePermission{
-				SystemID:     sysId,
-				RoleID:       int32(req.ID),
-				PermissionID: id,
-			})
-		}
-	}
-
-	systems, err := json.Marshal(req.Systems)
-	if err != nil {
-		return serializer.Err(consts.CodeParamErr, "格式化出错 Systems:", err)
-	}
-	// 修改
-	if req.ID > 0 {
-		update := &model.AdminRole{
-			Name:      req.Name,
-			Key:       req.Key,
-			Sort:      req.Sort,
-			Remark:    req.Remark,
-			Status:    req.Status,
-			Systems:   string(systems),
-			UpdatedAt: time.Now(),
-		}
-		queryTx := query.Use(config.AdminDB).Begin()
-		_, err := queryTx.AdminRole.Where(q.ID.Eq(req.ID)).Updates(update)
-		if err != nil {
-			queryTx.Rollback()
-			return serializer.Err(consts.CodeDBError, "更新出错", err)
-		}
-		// 删除旧的菜单权限
-		if _, err := queryTx.AdminRoleMenu.Where(mq.RoleID.Eq(int32(req.ID))).Delete(); err != nil {
-			queryTx.Rollback()
-			return serializer.Err(consts.CodeDBError, "更新出错", err)
-		}
-		// 插入新的菜单权限
-		if err := queryTx.AdminRoleMenu.Create(menusModel...); err != nil {
-			queryTx.Rollback()
-			return serializer.Err(consts.CodeDBError, "更新出错", err)
-		}
-		// 删除旧的操作权限
-		if _, err := queryTx.AdminRolePermission.Where(pq.RoleID.Eq(int32(req.ID))).Delete(); err != nil {
-			queryTx.Rollback()
-			return serializer.Err(consts.CodeDBError, "更新出错", err)
-		}
-		// 插入新的操作权限
-		if err := queryTx.AdminRolePermission.Create(permissionsModel...); err != nil {
-			queryTx.Rollback()
-			return serializer.Err(consts.CodeDBError, "更新出错", err)
-		}
-		queryTx.Commit()
-		// 查询该角色下的用户,清空token
-		users, _ := query.Use(config.AdminDB).AdminUser.Where(uq.RoleID.Eq(int32(req.ID))).Find()
-		for _, user := range users {
-			config.TokenRedis.Del(config.GetUserTokenKey(user.ID))
-		}
-		return serializer.Suc(nil)
-	}
-
-	// 新增
-	create := &model.AdminRole{
-		Name:      req.Name,
-		Key:       req.Key,
-		Sort:      req.Sort,
-		Systems:   string(systems),
-		Remark:    req.Remark,
-		Status:    req.Status,
-		UpdatedAt: time.Now(),
-		CreatedAt: time.Now(),
-	}
-	queryTx := query.Use(config.AdminDB).Begin()
-	if err := queryTx.AdminRole.WithContext(ctx).Create(create); err != nil {
-		logrus.Error(err)
-		queryTx.Rollback()
-		return serializer.Err(consts.CodeDBError, "更新出错", err)
-	}
-	// 插入新的菜单权限
-	for _, item := range menusModel {
-		item.RoleID = int32(create.ID)
-	}
-	if err := queryTx.AdminRoleMenu.Create(menusModel...); err != nil {
-		logrus.Error(err)
-		queryTx.Rollback()
-		return serializer.Err(consts.CodeDBError, "更新出错", err)
-	}
-
-	// 插入新的操作权限
-	for _, item := range permissionsModel {
-		item.RoleID = int32(create.ID)
-	}
-	if err := queryTx.AdminRolePermission.Create(permissionsModel...); err != nil {
-		logrus.Error(err)
-		queryTx.Rollback()
-		return serializer.Err(consts.CodeDBError, "更新出错", err)
-	}
-	queryTx.Commit()
-	return serializer.Suc(nil)
-}
-
-func (s *sAdminRole) GetRole(ctx *gin.Context, req forms.AdminRoleReq) (*model.AdminRole, error) {
-	var (
-		q = query.Use(config.AdminDB).AdminRole
-		m = q.WithContext(ctx)
-	)
-	result, err := m.Where(q.ID.Eq(req.ID)).First()
-	if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
-		return nil, err
-	}
-	return result, nil
-}
-
-func (s *sAdminRole) GetAllSystem() ([]*model.AdminSystem, error) {
-	var (
-		q = query.Use(config.AdminDB).AdminSystem
-	)
-	systems, err := q.Find()
-	if err != nil {
-		logrus.Error(err)
-	}
-	return systems, nil
-}
+//func (s *sAdminRole) List(ctx *gin.Context, req forms.AdminRoleListReq) serializer.Response {
+//	var (
+//		q            = query.Use(config.AdminDB).AdminRole
+//		m            = q.WithContext(ctx)
+//		mq           = query.Use(config.AdminDB).AdminRoleMenu
+//		pq           = query.Use(config.AdminDB).AdminRolePermission
+//		offset int64 = 0
+//		models forms.UserAccountListRes
+//		lists  []*forms.AdminRoleListModel
+//	)
+//
+//	m = m.Order(q.Sort).Order(q.ID.Desc())
+//
+//	req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
+//
+//	count, err := m.Count()
+//	if err != nil {
+//		return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
+//	}
+//
+//	if count > 0 {
+//		if err = m.Limit(int(req.PerPage)).Offset(int(offset)).Scan(&lists); err != nil {
+//			return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
+//		}
+//	}
+//
+//	for _, v := range lists {
+//		if err := json.Unmarshal([]byte(cast.ToString(v.Systems)), &v.Systems); err != nil {
+//			return serializer.Err(consts.CodeParamErr, "格式化出错 Systems", err)
+//		}
+//
+//		permissionsModels, err := pq.Where(pq.RoleID.Eq(int32(v.ID))).Find()
+//		if err != nil {
+//			return serializer.Err(consts.CodeParamErr, "查询出错 permissionsModels", err)
+//		}
+//		permissionsMap := make(map[int32][]int32)
+//		for _, item := range permissionsModels {
+//			if _, ok := permissionsMap[item.SystemID]; ok {
+//				permissionsMap[item.SystemID] = append(permissionsMap[item.SystemID], item.PermissionID)
+//			} else {
+//				permissionsMap[item.SystemID] = []int32{item.PermissionID}
+//			}
+//		}
+//		v.Permissions = permissionsMap
+//
+//		pagesModels, err := mq.Where(mq.RoleID.Eq(int32(v.ID))).Find()
+//		if err != nil {
+//			return serializer.Err(consts.CodeParamErr, "查询出错 pagesModels", err)
+//		}
+//		pagesMap := make(map[int32][]int32)
+//		for _, item := range pagesModels {
+//			if _, ok := pagesMap[item.SystemID]; ok {
+//				pagesMap[item.SystemID] = append(pagesMap[item.SystemID], item.PageID)
+//			} else {
+//				pagesMap[item.SystemID] = []int32{item.PageID}
+//			}
+//		}
+//		v.Pages = pagesMap
+//	}
+//
+//	models.List = lists
+//	models.Page = req.Page
+//	models.PerPage = req.PerPage
+//	models.PageCount = (count + req.PerPage - 1) / req.PerPage
+//
+//	return serializer.Suc(models)
+//}
+
+//func (s *sAdminRole) Edit(ctx *gin.Context, req forms.AdminRoleEditReq) serializer.Response {
+//
+//	q := query.Use(config.AdminDB).AdminRole
+//	mq := query.Use(config.AdminDB).AdminRoleMenu
+//	pq := query.Use(config.AdminDB).AdminRolePermission
+//	uq := query.Use(config.AdminDB).AdminUser
+//
+//	logrus.Warnf("req:%+v", req)
+//
+//	menusModel := make([]*model.AdminRoleMenu, 0)
+//	for sysId, menus := range req.Pages {
+//		for _, menu := range menus {
+//			menusModel = append(menusModel, &model.AdminRoleMenu{
+//				SystemID: sysId,
+//				RoleID:   int32(req.ID),
+//				PageID:   menu,
+//			})
+//		}
+//	}
+//	permissionsModel := make([]*model.AdminRolePermission, 0)
+//	for sysId, permissions := range req.Permissions {
+//		for _, id := range permissions {
+//			permissionsModel = append(permissionsModel, &model.AdminRolePermission{
+//				SystemID:     sysId,
+//				RoleID:       int32(req.ID),
+//				PermissionID: id,
+//			})
+//		}
+//	}
+//
+//	systems, err := json.Marshal(req.Systems)
+//	if err != nil {
+//		return serializer.Err(consts.CodeParamErr, "格式化出错 Systems:", err)
+//	}
+//	// 修改
+//	if req.ID > 0 {
+//		update := &model.AdminRole{
+//			Name:      req.Name,
+//			Key:       req.Key,
+//			Sort:      req.Sort,
+//			Remark:    req.Remark,
+//			Status:    req.Status,
+//			Systems:   string(systems),
+//			UpdatedAt: time.Now(),
+//		}
+//		queryTx := query.Use(config.AdminDB).Begin()
+//		_, err := queryTx.AdminRole.Where(q.ID.Eq(req.ID)).Updates(update)
+//		if err != nil {
+//			queryTx.Rollback()
+//			return serializer.Err(consts.CodeDBError, "更新出错", err)
+//		}
+//		// 删除旧的菜单权限
+//		if _, err := queryTx.AdminRoleMenu.Where(mq.RoleID.Eq(int32(req.ID))).Delete(); err != nil {
+//			queryTx.Rollback()
+//			return serializer.Err(consts.CodeDBError, "更新出错", err)
+//		}
+//		// 插入新的菜单权限
+//		if err := queryTx.AdminRoleMenu.Create(menusModel...); err != nil {
+//			queryTx.Rollback()
+//			return serializer.Err(consts.CodeDBError, "更新出错", err)
+//		}
+//		// 删除旧的操作权限
+//		if _, err := queryTx.AdminRolePermission.Where(pq.RoleID.Eq(int32(req.ID))).Delete(); err != nil {
+//			queryTx.Rollback()
+//			return serializer.Err(consts.CodeDBError, "更新出错", err)
+//		}
+//		// 插入新的操作权限
+//		if err := queryTx.AdminRolePermission.Create(permissionsModel...); err != nil {
+//			queryTx.Rollback()
+//			return serializer.Err(consts.CodeDBError, "更新出错", err)
+//		}
+//		queryTx.Commit()
+//		// 查询该角色下的用户,清空token
+//		users, _ := query.Use(config.AdminDB).AdminUser.Where(uq.RoleID.Eq(int32(req.ID))).Find()
+//		for _, user := range users {
+//			config.TokenRedis.Del(config.GetUserTokenKey(user.ID))
+//		}
+//		return serializer.Suc(nil)
+//	}
+//
+//	// 新增
+//	create := &model.AdminRole{
+//		Name:      req.Name,
+//		Key:       req.Key,
+//		Sort:      req.Sort,
+//		Systems:   string(systems),
+//		Remark:    req.Remark,
+//		Status:    req.Status,
+//		UpdatedAt: time.Now(),
+//		CreatedAt: time.Now(),
+//	}
+//	queryTx := query.Use(config.AdminDB).Begin()
+//	if err := queryTx.AdminRole.WithContext(ctx).Create(create); err != nil {
+//		logrus.Error(err)
+//		queryTx.Rollback()
+//		return serializer.Err(consts.CodeDBError, "更新出错", err)
+//	}
+//	// 插入新的菜单权限
+//	for _, item := range menusModel {
+//		item.RoleID = int32(create.ID)
+//	}
+//	if err := queryTx.AdminRoleMenu.Create(menusModel...); err != nil {
+//		logrus.Error(err)
+//		queryTx.Rollback()
+//		return serializer.Err(consts.CodeDBError, "更新出错", err)
+//	}
+//
+//	// 插入新的操作权限
+//	for _, item := range permissionsModel {
+//		item.RoleID = int32(create.ID)
+//	}
+//	if err := queryTx.AdminRolePermission.Create(permissionsModel...); err != nil {
+//		logrus.Error(err)
+//		queryTx.Rollback()
+//		return serializer.Err(consts.CodeDBError, "更新出错", err)
+//	}
+//	queryTx.Commit()
+//	return serializer.Suc(nil)
+//}
+
+//func (s *sAdminRole) GetRole(ctx *gin.Context, req forms.AdminRoleReq) (*model.AdminRole, error) {
+//	var (
+//		q = query.Use(config.AdminDB).AdminRole
+//		m = q.WithContext(ctx)
+//	)
+//	result, err := m.Where(q.ID.Eq(req.ID)).First()
+//	if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
+//		return nil, err
+//	}
+//	return result, nil
+//}
+
+//func (s *sAdminRole) GetAllSystem() ([]*model.AdminSystem, error) {
+//	var (
+//		q = query.Use(config.AdminDB).AdminSystem
+//	)
+//	systems, err := q.Find()
+//	if err != nil {
+//		logrus.Error(err)
+//	}
+//	return systems, nil
+//}

+ 298 - 339
server/internal/admin/service/admin_user.go

@@ -1,19 +1,13 @@
 package service
 
 import (
-	"encoding/base64"
 	"gadmin/config"
 	"gadmin/internal/admin/consts"
 	"gadmin/internal/admin/forms"
 	"gadmin/internal/gorm/model"
-	"gadmin/internal/gorm/query"
 	"gadmin/utility/serializer"
-	"gadmin/utility/token"
-	jsoniter "github.com/json-iterator/go"
 	"time"
 
-	"github.com/gin-gonic/gin"
-	"github.com/sirupsen/logrus"
 	"golang.org/x/crypto/bcrypt"
 )
 
@@ -102,87 +96,87 @@ func (s *sUser) CheckPasswordRight(passwordDigest, password string) bool {
 	return err == nil
 }
 
-func (s *sUser) Login(req forms.UserLoginReq, ip string) serializer.Response {
-	var (
-		u model.AdminUser
-	)
-	if ok := s.CheckLoginAllow(ip); !ok {
-		return serializer.ParamErr("账号已被禁止登录", nil)
-	}
-
-	if err := config.AdminDB.Where("user_name = ?", req.UserName).First(&u).Error; err != nil {
-		s.AddFailNum(ip)
-		logrus.Warnf("sUser %v Login req error %v.", req.UserName, ip)
-		return serializer.ParamErr("账号错误或不存在,请检查", nil)
-	}
-	//p, _ := s.SetPassword(req.Password)
-	//fmt.Println("pass:", p)
-
-	if u.Status != 1 {
-		return serializer.ParamErr("账号已被禁用", nil)
-	}
-
-	if s.CheckPasswordRight(u.PasswordDigest, req.Password) == false {
-		s.AddFailNum(ip)
-		logrus.Warnf("sUser %v Login req error. ip: %v.", req.UserName, ip)
-		return serializer.ParamErr("密码不正确,如忘记了密码请联系管理员!", nil)
-	}
-	s.AddSucessNum(ip)
-
-	//if os.Getenv("GIN_MODE") == "release" && u.UserName == "mojun" {
-	//	return serializer.ParamErr("该账号只允许在测试服登录!", nil)
-	//}
-
-	t := token.GenerateTokenUsingUUID()
-
-	// 记录登录token
-	key := config.GetUserTokenKey(u.ID)
-	config.TokenRedis.HSet(key, t, time.Now().Unix())
-	config.TokenRedis.Expire(key, config.TokenExpireTime)
-
-	tokenKey := config.GetTokenKey(t)
-	user := &token.UserClaims{
-		ID:          u.ID,
-		UserName:    u.UserName,
-		RoleId:      int64(u.RoleID),
-		Avatar:      u.Avatar,
-		Nickname:    u.Nickname,
-		AccessToken: t,
-	}
-	userStr, err := jsoniter.MarshalToString(user)
-	if err != nil {
-		return serializer.Err(1, "", err)
-	}
-	config.TokenRedis.Set(tokenKey, userStr, config.TokenExpireTime)
-
-	return serializer.Suc(forms.UserLoginRes{
-		ID:       u.ID,
-		UserName: u.UserName,
-		Nickname: u.Nickname,
-		Status:   u.Status,
-		Avatar:   u.Avatar,
-		Token:    base64.URLEncoding.EncodeToString([]byte(t)),
-	})
-
-	//t, err := token.GenerateToken(&token.UserClaims{
-	//	ID:       u.ID,
-	//	UserName: u.UserName,
-	//	RoleId:   int64(u.RoleID),
-	//	Avatar:   u.Avatar,
-	//	Nickname: u.Nickname,
-	//})
-	//if err != nil {
-	//	return serializer.ParamErr(err.Error(), nil)
-	//}
-	//return serializer.Suc(forms.UserLoginRes{
-	//	ID:       u.ID,
-	//	UserName: u.UserName,
-	//	Nickname: u.Nickname,
-	//	Status:   u.Status,
-	//	Avatar:   u.Avatar,
-	//	Token:    t,
-	//})
-}
+//func (s *sUser) Login(req forms.UserLoginReq, ip string) serializer.Response {
+//	var (
+//		u model.AdminUser
+//	)
+//	if ok := s.CheckLoginAllow(ip); !ok {
+//		return serializer.ParamErr("账号已被禁止登录", nil)
+//	}
+//
+//	if err := config.AdminDB.Where("user_name = ?", req.UserName).First(&u).Error; err != nil {
+//		s.AddFailNum(ip)
+//		logrus.Warnf("sUser %v Login req error %v.", req.UserName, ip)
+//		return serializer.ParamErr("账号错误或不存在,请检查", nil)
+//	}
+//	//p, _ := s.SetPassword(req.Password)
+//	//fmt.Println("pass:", p)
+//
+//	if u.Status != 1 {
+//		return serializer.ParamErr("账号已被禁用", nil)
+//	}
+//
+//	if s.CheckPasswordRight(u.PasswordDigest, req.Password) == false {
+//		s.AddFailNum(ip)
+//		logrus.Warnf("sUser %v Login req error. ip: %v.", req.UserName, ip)
+//		return serializer.ParamErr("密码不正确,如忘记了密码请联系管理员!", nil)
+//	}
+//	s.AddSucessNum(ip)
+//
+//	//if os.Getenv("GIN_MODE") == "release" && u.UserName == "mojun" {
+//	//	return serializer.ParamErr("该账号只允许在测试服登录!", nil)
+//	//}
+//
+//	t := token.GenerateTokenUsingUUID()
+//
+//	// 记录登录token
+//	key := config.GetUserTokenKey(u.ID)
+//	config.TokenRedis.HSet(key, t, time.Now().Unix())
+//	config.TokenRedis.Expire(key, config.TokenExpireTime)
+//
+//	tokenKey := config.GetTokenKey(t)
+//	user := &token.UserClaims{
+//		ID:          u.ID,
+//		UserName:    u.UserName,
+//		RoleId:      int64(u.RoleID),
+//		Avatar:      u.Avatar,
+//		Nickname:    u.Nickname,
+//		AccessToken: t,
+//	}
+//	userStr, err := jsoniter.MarshalToString(user)
+//	if err != nil {
+//		return serializer.Err(1, "", err)
+//	}
+//	config.TokenRedis.Set(tokenKey, userStr, config.TokenExpireTime)
+//
+//	return serializer.Suc(forms.UserLoginRes{
+//		ID:       u.ID,
+//		UserName: u.UserName,
+//		Nickname: u.Nickname,
+//		Status:   u.Status,
+//		Avatar:   u.Avatar,
+//		Token:    base64.URLEncoding.EncodeToString([]byte(t)),
+//	})
+//
+//	//t, err := token.GenerateToken(&token.UserClaims{
+//	//	ID:       u.ID,
+//	//	UserName: u.UserName,
+//	//	RoleId:   int64(u.RoleID),
+//	//	Avatar:   u.Avatar,
+//	//	Nickname: u.Nickname,
+//	//})
+//	//if err != nil {
+//	//	return serializer.ParamErr(err.Error(), nil)
+//	//}
+//	//return serializer.Suc(forms.UserLoginRes{
+//	//	ID:       u.ID,
+//	//	UserName: u.UserName,
+//	//	Nickname: u.Nickname,
+//	//	Status:   u.Status,
+//	//	Avatar:   u.Avatar,
+//	//	Token:    t,
+//	//})
+//}
 
 func (s *sUser) Register(req forms.UserRegisterReq) serializer.Response {
 	user := model.AdminUser{
@@ -228,255 +222,220 @@ func (s *sUser) Register(req forms.UserRegisterReq) serializer.Response {
 	return serializer.Suc(user)
 }
 
-func (s *sUser) List(ctx *gin.Context, req forms.AdminUserListReq) serializer.Response {
-	var (
-		q            = query.Use(config.AdminDB).AdminUser
-		r            = query.Use(config.AdminDB).AdminRole
-		m            = q.WithContext(ctx)
-		offset int64 = 0
-		models forms.UserAccountListRes
-		lists  []*forms.AdminUserListModel
-	)
-
-	m = m.Order(q.ID.Desc())
-
-	req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
-
-	count, err := m.Count()
-	if err != nil {
-		return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
-	}
-
-	if count > 0 {
-		if err = m.Limit(int(req.PerPage)).Offset(int(offset)).Scan(&lists); err != nil {
-			return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
-		}
-	}
-
-	for _, v := range lists {
-		role, err := r.WithContext(ctx).Where(r.ID.Eq(v.RoleID)).First()
-		v.RoleName = "未绑定角色"
-		if role != nil && err == nil {
-			v.RoleName = role.Name
-		}
-	}
-
-	models.List = lists
-	models.Page = req.Page
-	models.PerPage = req.PerPage
-	models.PageCount = (count + req.PerPage - 1) / req.PerPage
-
-	return serializer.Suc(models)
-}
-
-func (s *sUser) Edit(ctx *gin.Context, req forms.AdminUserEditReq) serializer.Response {
-	q := query.Use(config.AdminDB).AdminUser
-
-	logrus.Warnf("sUser Edit req:%+v", req)
-
-	if req.RoleID <= 0 {
-		return serializer.ParamErr("角色不能为空", nil)
-	}
-
-	if req.UserName == "" {
-		return serializer.ParamErr("用户名不能为空", nil)
-	}
-
-	// 修改
-	if req.ID > 0 {
-		update := &model.AdminUser{
-			UserName:  req.UserName,
-			RoleID:    int32(req.RoleID),
-			Nickname:  req.Nickname,
-			Status:    req.Status,
-			UpdatedAt: time.Now(),
-		}
-		_, err := q.WithContext(ctx).Where(q.ID.Eq(req.ID)).Updates(update)
-		if err != nil {
-			return serializer.Err(consts.CodeParamErr, "更新出错", err)
-		}
-		// 维护redis token
-		config.TokenRedis.Del(config.GetUserTokenKey(req.ID))
-		return serializer.Suc(nil)
-	}
-
-	if req.Password == "" {
-		return serializer.ParamErr("密码不能为空", nil)
-	}
-
-	// 加密密码
-	password, err := s.SetPassword(req.Password)
-	if err != nil {
-		return serializer.Err(
-			consts.CodeEncryptError,
-			"密码加密失败",
-			err,
-		)
-	}
-
-	// 新增
-	create := &model.AdminUser{
-		UserName:       req.UserName,
-		RoleID:         int32(req.RoleID),
-		Nickname:       req.Nickname,
-		PasswordDigest: password,
-		Status:         req.Status,
-		UpdatedAt:      time.Now(),
-		CreatedAt:      time.Now(),
-	}
-
-	if err = query.Use(config.AdminDB).AdminUser.WithContext(ctx).Create(create); err != nil {
-		return serializer.DBErr(err.Error(), err)
-	}
-
-	return serializer.Suc(nil)
-}
-
-func (s *sUser) ResetPassword(ctx *gin.Context, req forms.AdminUserResetPasswordReq) serializer.Response {
-	q := query.Use(config.AdminDB).AdminUser
-
-	logrus.Warnf("sUser ResetPassword req:%+v", req)
-
-	if req.ID <= 0 {
-		return serializer.ParamErr("用于ID不能为空", nil)
-	}
-
-	if req.Password == "" {
-		return serializer.ParamErr("密码不能为空", nil)
-	}
-
-	// 加密密码
-	password, err := s.SetPassword(req.Password)
-	if err != nil {
-		return serializer.Err(
-			consts.CodeEncryptError,
-			"密码加密失败",
-			err,
-		)
-	}
-	update := &model.AdminUser{
-		PasswordDigest: password,
-		UpdatedAt:      time.Now(),
-	}
-
-	_, err = q.WithContext(ctx).Where(q.ID.Eq(req.ID)).Updates(update)
-	if err != nil {
-		return serializer.Err(consts.CodeParamErr, "更新出错", err)
-	}
-	// 维护redis token
-	config.TokenRedis.Del(config.GetUserTokenKey(req.ID))
-	return serializer.Suc(nil)
-}
-
-func (s *sUser) UpdatePassword(ctx *gin.Context, req forms.AdminUserUpdatePasswordReq) serializer.Response {
-	q := query.Use(config.AdminDB).AdminUser
-
-	logrus.Warnf("sUser UpdatePassword req:%+v", req)
-
-	userId := token.GetUID(ctx)
-	if userId <= 0 {
-		return serializer.ParamErr("用户信息获取失败", nil)
-	}
-
-	models, err := q.WithContext(ctx).Where(q.ID.Eq(userId)).First()
-	if err != nil {
-		return serializer.ParamErr(err.Error(), err)
-	}
-
-	if models == nil {
-		return serializer.ParamErr("用户不存在", nil)
-	}
-
-	if !s.CheckPasswordRight(models.PasswordDigest, req.OldPassword) {
-		return serializer.ParamErr("老密码不正确", nil)
-	}
-
-	// 加密密码
-	password, err := s.SetPassword(req.NewPassword)
-	if err != nil {
-		return serializer.Err(
-			consts.CodeEncryptError,
-			"密码加密失败",
-			err,
-		)
-	}
-	update := &model.AdminUser{
-		PasswordDigest: password,
-		UpdatedAt:      time.Now(),
-	}
-
-	_, err = q.WithContext(ctx).Where(q.ID.Eq(userId)).Updates(update)
-	if err != nil {
-		return serializer.Err(consts.CodeParamErr, "更新出错", err)
-	}
-
-	// 修改token状态
-	config.TokenRedis.Del(config.GetUserTokenKey(userId))
-
-	return serializer.Suc(nil)
-}
-
-func (s *sUser) GetUserInfo(c *gin.Context) (*model.AdminUser, error) {
-	q := query.Use(config.AdminDB).AdminUser
-
-	userId := token.GetUID(c)
-	if userId <= 0 {
-		c.JSON(200, serializer.Err(consts.CodeNoPermission, "用户信息获取失败", nil))
-		c.Abort()
-	}
-
-	return q.WithContext(c).Where(q.ID.Eq(userId)).First()
-}
-
-func (s *sUser) GetUserRoleId(c *gin.Context) int64 {
-	info, err := s.GetUserInfo(c)
-	if err != nil {
-		return 0
-	}
-
-	if info == nil {
-		return 0
-	}
-
-	return int64(info.RoleID)
-}
-
-func (s *sUser) GetUserByUnionID(unionID string) (*model.AdminUser, error) {
-	q := query.Use(config.AdminDB).AdminUser
-	return q.Where(q.FeishuUnionID.Eq(unionID)).First()
-}
-
-func (s *sUser) GetUserRolePermission(c *gin.Context) (bool, error) {
-	// 只有超管拥有角色管理权限
-	roleId, _ := c.Get("admin_role_id")
-	return config.IsSuperRole(roleId.(int64)), nil
-
-	//res, ok := c.Get("user")
-	//if !ok {
-	//	c.JSON(200, serializer.CheckLogin())
-	//	c.Abort()
-	//}
-	//user := res.(*token.UserClaims)
-	//if user.RoleId == 1 { // 超管拥有权限
-	//	return true, nil
-	//}
-	//// 查询玩家是否拥有权限管理页面的入口
-	//pageQ := query.Use(config.AdminDB).AdminMenu
-	//pageIds := make([]int32, 0)
-	//err := pageQ.WithContext(c).Where(pageQ.Path.Eq("/permission")).Pluck(pageQ.ID, &pageIds)
-	//if err != nil {
-	//	logrus.WithField("from", "AdminMenu Pluck").Error(err)
-	//	return false, err
-	//}
-	//rmq := query.Use(config.AdminDB).AdminRoleMenu
-	//count, err := rmq.WithContext(c).Where(rmq.RoleID.Eq(int32(user.RoleId)), rmq.PageID.In(pageIds...)).Count()
-	//if err != nil {
-	//	logrus.WithField("from", "AdminRoleMenu Count").Error(err)
-	//	return false, err
-	//}
-	//if count > 0 {
-	//	return true, nil
-	//} else {
-	//	return false, nil
-	//}
-}
+//func (s *sUser) List(ctx *gin.Context, req forms.AdminUserListReq) serializer.Response {
+//	var (
+//		q            = query.Use(config.AdminDB).AdminUser
+//		r            = query.Use(config.AdminDB).AdminRole
+//		m            = q.WithContext(ctx)
+//		offset int64 = 0
+//		models forms.UserAccountListRes
+//		lists  []*forms.AdminUserListModel
+//	)
+//
+//	m = m.Order(q.ID.Desc())
+//
+//	req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
+//
+//	count, err := m.Count()
+//	if err != nil {
+//		return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
+//	}
+//
+//	if count > 0 {
+//		if err = m.Limit(int(req.PerPage)).Offset(int(offset)).Scan(&lists); err != nil {
+//			return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
+//		}
+//	}
+//
+//	for _, v := range lists {
+//		role, err := r.WithContext(ctx).Where(r.ID.Eq(v.RoleID)).First()
+//		v.RoleName = "未绑定角色"
+//		if role != nil && err == nil {
+//			v.RoleName = role.Name
+//		}
+//	}
+//
+//	models.List = lists
+//	models.Page = req.Page
+//	models.PerPage = req.PerPage
+//	models.PageCount = (count + req.PerPage - 1) / req.PerPage
+//
+//	return serializer.Suc(models)
+//}
+
+//func (s *sUser) Edit(ctx *gin.Context, req forms.AdminUserEditReq) serializer.Response {
+//	q := query.Use(config.AdminDB).AdminUser
+//
+//	logrus.Warnf("sUser Edit req:%+v", req)
+//
+//	if req.RoleID <= 0 {
+//		return serializer.ParamErr("角色不能为空", nil)
+//	}
+//
+//	if req.UserName == "" {
+//		return serializer.ParamErr("用户名不能为空", nil)
+//	}
+//
+//	// 修改
+//	if req.ID > 0 {
+//		update := &model.AdminUser{
+//			UserName:  req.UserName,
+//			RoleID:    int32(req.RoleID),
+//			Nickname:  req.Nickname,
+//			Status:    req.Status,
+//			UpdatedAt: time.Now(),
+//		}
+//		_, err := q.WithContext(ctx).Where(q.ID.Eq(req.ID)).Updates(update)
+//		if err != nil {
+//			return serializer.Err(consts.CodeParamErr, "更新出错", err)
+//		}
+//		// 维护redis token
+//		config.TokenRedis.Del(config.GetUserTokenKey(req.ID))
+//		return serializer.Suc(nil)
+//	}
+//
+//	if req.Password == "" {
+//		return serializer.ParamErr("密码不能为空", nil)
+//	}
+//
+//	// 加密密码
+//	password, err := s.SetPassword(req.Password)
+//	if err != nil {
+//		return serializer.Err(
+//			consts.CodeEncryptError,
+//			"密码加密失败",
+//			err,
+//		)
+//	}
+//
+//	// 新增
+//	create := &model.AdminUser{
+//		UserName:       req.UserName,
+//		RoleID:         int32(req.RoleID),
+//		Nickname:       req.Nickname,
+//		PasswordDigest: password,
+//		Status:         req.Status,
+//		UpdatedAt:      time.Now(),
+//		CreatedAt:      time.Now(),
+//	}
+//
+//	if err = query.Use(config.AdminDB).AdminUser.WithContext(ctx).Create(create); err != nil {
+//		return serializer.DBErr(err.Error(), err)
+//	}
+//
+//	return serializer.Suc(nil)
+//}
+
+//func (s *sUser) ResetPassword(ctx *gin.Context, req forms.AdminUserResetPasswordReq) serializer.Response {
+//	q := query.Use(config.AdminDB).AdminUser
+//
+//	logrus.Warnf("sUser ResetPassword req:%+v", req)
+//
+//	if req.ID <= 0 {
+//		return serializer.ParamErr("用于ID不能为空", nil)
+//	}
+//
+//	if req.Password == "" {
+//		return serializer.ParamErr("密码不能为空", nil)
+//	}
+//
+//	// 加密密码
+//	password, err := s.SetPassword(req.Password)
+//	if err != nil {
+//		return serializer.Err(
+//			consts.CodeEncryptError,
+//			"密码加密失败",
+//			err,
+//		)
+//	}
+//	update := &model.AdminUser{
+//		PasswordDigest: password,
+//		UpdatedAt:      time.Now(),
+//	}
+//
+//	_, err = q.WithContext(ctx).Where(q.ID.Eq(req.ID)).Updates(update)
+//	if err != nil {
+//		return serializer.Err(consts.CodeParamErr, "更新出错", err)
+//	}
+//	// 维护redis token
+//	config.TokenRedis.Del(config.GetUserTokenKey(req.ID))
+//	return serializer.Suc(nil)
+//}
+
+//func (s *sUser) UpdatePassword(ctx *gin.Context, req forms.AdminUserUpdatePasswordReq) serializer.Response {
+//	q := query.Use(config.AdminDB).AdminUser
+//
+//	logrus.Warnf("sUser UpdatePassword req:%+v", req)
+//
+//	userId := token.GetUID(ctx)
+//	if userId <= 0 {
+//		return serializer.ParamErr("用户信息获取失败", nil)
+//	}
+//
+//	models, err := q.WithContext(ctx).Where(q.ID.Eq(userId)).First()
+//	if err != nil {
+//		return serializer.ParamErr(err.Error(), err)
+//	}
+//
+//	if models == nil {
+//		return serializer.ParamErr("用户不存在", nil)
+//	}
+//
+//	if !s.CheckPasswordRight(models.PasswordDigest, req.OldPassword) {
+//		return serializer.ParamErr("老密码不正确", nil)
+//	}
+//
+//	// 加密密码
+//	password, err := s.SetPassword(req.NewPassword)
+//	if err != nil {
+//		return serializer.Err(
+//			consts.CodeEncryptError,
+//			"密码加密失败",
+//			err,
+//		)
+//	}
+//	update := &model.AdminUser{
+//		PasswordDigest: password,
+//		UpdatedAt:      time.Now(),
+//	}
+//
+//	_, err = q.WithContext(ctx).Where(q.ID.Eq(userId)).Updates(update)
+//	if err != nil {
+//		return serializer.Err(consts.CodeParamErr, "更新出错", err)
+//	}
+//
+//	// 修改token状态
+//	config.TokenRedis.Del(config.GetUserTokenKey(userId))
+//
+//	return serializer.Suc(nil)
+//}
+
+//func (s *sUser) GetUserInfo(c *gin.Context) (*model.AdminUser, error) {
+//	q := query.Use(config.AdminDB).AdminUser
+//
+//	userId := token.GetUID(c)
+//	if userId <= 0 {
+//		c.JSON(200, serializer.Err(consts.CodeNoPermission, "用户信息获取失败", nil))
+//		c.Abort()
+//	}
+//
+//	return q.WithContext(c).Where(q.ID.Eq(userId)).First()
+//}
+
+//func (s *sUser) GetUserRoleId(c *gin.Context) int64 {
+//	info, err := s.GetUserInfo(c)
+//	if err != nil {
+//		return 0
+//	}
+//
+//	if info == nil {
+//		return 0
+//	}
+//
+//	return int64(info.RoleID)
+//}
+
+//func (s *sUser) GetUserByUnionID(unionID string) (*model.AdminUser, error) {
+//	q := query.Use(config.AdminDB).AdminUser
+//	return q.Where(q.FeishuUnionID.Eq(unionID)).First()
+//}

+ 0 - 219
server/internal/admin/service/feishu.go

@@ -1,219 +0,0 @@
-package service
-
-import (
-	"context"
-	"encoding/base64"
-	"errors"
-	"gadmin/config"
-	"gadmin/internal/admin/forms"
-	"gadmin/internal/admin/library/feishu"
-	"gadmin/internal/gorm/model"
-	"gadmin/internal/gorm/query"
-	"gadmin/utility/serializer"
-	"gadmin/utility/token"
-	"github.com/gin-gonic/gin"
-	jsoniter "github.com/json-iterator/go"
-	"github.com/larksuite/oapi-sdk-go/v3/core"
-	"github.com/larksuite/oapi-sdk-go/v3/service/authen/v1"
-	"github.com/sirupsen/logrus"
-	"gorm.io/gorm"
-	"strconv"
-	"strings"
-	"time"
-)
-
-var FeiShu = new(feishuService)
-
-type feishuService struct{}
-
-func (s *feishuService) FeiShuUserLogin(c *gin.Context) serializer.Response {
-
-	q := query.Use(config.AdminDB).AdminUser
-
-	encodeToken := token.GetAuthorization(c)
-	if encodeToken != "" {
-		bytesT, err := base64.URLEncoding.DecodeString(encodeToken)
-		if err != nil {
-			logrus.Warningf("middleware base64.URLEncoding.DecodeString:%+v", err.Error())
-			return serializer.CheckLogin()
-		}
-		t := string(bytesT)
-		tokenKey := config.GetTokenKey(t)
-		if config.TokenRedis.Exists(tokenKey).Val() == 0 {
-			return serializer.CheckLogin()
-		}
-		userStr := config.TokenRedis.Get(tokenKey).Val()
-
-		claims := new(token.UserClaims)
-		if err := jsoniter.UnmarshalFromString(userStr, claims); err != nil {
-			return serializer.CheckLogin()
-		}
-
-		// 查询登录token是否有效
-		key := config.GetUserTokenKey(claims.ID)
-		tokenCTStr := config.TokenRedis.HGet(key, t).Val()
-		tokenCreateTime, err := strconv.Atoi(tokenCTStr)
-		if err != nil {
-			logrus.Warningf("middleware config.LogRedis.HGet:%+v", err.Error())
-			return serializer.CheckLogin()
-		}
-		tokenCT := time.Unix(int64(tokenCreateTime), 0)
-
-		if tokenCT.Before(time.Now().Add(-config.TokenExpireTime)) {
-			return serializer.CheckLogin()
-		}
-
-		u, err := q.Where(q.ID.Eq(claims.ID)).First()
-		if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
-			return serializer.Err(2, "", err)
-		}
-		if u.Status != 1 {
-			return serializer.ParamErr("账号已被禁用", nil)
-		}
-		user := &token.UserClaims{
-			ID:          u.ID,
-			UserName:    u.UserName,
-			RoleId:      int64(u.RoleID),
-			Avatar:      u.Avatar,
-			Nickname:    u.Nickname,
-			AccessToken: t,
-		}
-		userStr, _ = jsoniter.MarshalToString(user)
-
-		config.TokenRedis.HSet(key, t, time.Now().Unix())
-		config.TokenRedis.Expire(key, config.TokenExpireTime)
-
-		config.TokenRedis.Set(tokenKey, userStr, config.TokenExpireTime)
-
-		return serializer.Suc(forms.UserLoginRes{
-			ID:       u.ID,
-			UserName: u.UserName,
-			Nickname: u.Nickname,
-			Status:   u.Status,
-			Avatar:   u.Avatar,
-			Token:    encodeToken,
-		})
-	}
-
-	code := c.Query("code")
-	if code == "" {
-		return serializer.ParamErr("code is empty", nil)
-	}
-
-	feishuUserInfo, err := s.GetFeiShuUserByCode(code)
-	if err != nil {
-		return serializer.Err(1, "", err)
-	}
-	if feishuUserInfo == nil {
-		return serializer.Err(1, "获取用户信息失败", nil)
-	}
-
-	u, err := q.Where(q.FeishuUnionID.Eq(*feishuUserInfo.UnionId)).First()
-	if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
-		return serializer.Err(2, "", err)
-	}
-	if u == nil {
-		// 不存在,创建
-		u = &model.AdminUser{
-			UserName: *feishuUserInfo.Name,
-			Nickname: *feishuUserInfo.Name,
-			Avatar:   *feishuUserInfo.AvatarUrl,
-			//Mobile:        *feishuUserInfo.Mobile,
-			FeishuUnionID: *feishuUserInfo.UnionId,
-			CreatedAt:     time.Now(),
-		}
-		if err = q.WithContext(context.Background()).Create(u); err != nil {
-			return serializer.DBErr(err.Error(), err)
-		}
-
-		return serializer.Err(9999, "注册成功,请联系管理员分配权限!", nil)
-	}
-	if u.Status != 1 {
-		return serializer.ParamErr("账号已被禁用", nil)
-	}
-	if u.RoleID == 0 {
-		return serializer.Err(9999, "请联系管理员分配权限!", nil)
-	}
-
-	t := token.GenerateTokenUsingUUID()
-
-	// 记录登录token
-	key := config.GetUserTokenKey(u.ID)
-	config.TokenRedis.HSet(key, t, time.Now().Unix())
-	config.TokenRedis.Expire(key, config.TokenExpireTime)
-
-	tokenKey := config.GetTokenKey(t)
-	user := &token.UserClaims{
-		ID:          u.ID,
-		UserName:    u.UserName,
-		RoleId:      int64(u.RoleID),
-		Avatar:      u.Avatar,
-		Nickname:    u.Nickname,
-		AccessToken: t,
-	}
-	userStr, err := jsoniter.MarshalToString(user)
-	if err != nil {
-		return serializer.Err(1, "", err)
-	}
-	config.TokenRedis.Set(tokenKey, userStr, config.TokenExpireTime)
-
-	return serializer.Suc(forms.UserLoginRes{
-		ID:       u.ID,
-		UserName: u.UserName,
-		Nickname: u.Nickname,
-		Status:   u.Status,
-		Avatar:   u.Avatar,
-		Token:    base64.URLEncoding.EncodeToString([]byte(t)),
-	})
-
-}
-
-func (s *feishuService) GetFeiShuUserByCode(code string) (*larkauthen.GetUserInfoRespData, error) {
-	// 使用获取到的 code 获取 token
-	req := larkauthen.NewCreateAccessTokenReqBuilder().Body(
-		larkauthen.NewCreateAccessTokenReqBodyBuilder().
-			GrantType("authorization_code").
-			Code(code).
-			Build(),
-	).Build()
-	resp, err := feishu.LarkClient.Authen.V1.AccessToken.Create(context.Background(), req)
-	if err != nil {
-		logrus.Warnf("GetAccessToken() failed with '%s'\n", err)
-		return nil, err
-	}
-	if !resp.Success() {
-		logrus.Warnf("logId: %s, error response: \n%s", resp.RequestId(), larkcore.Prettify(resp.CodeError))
-		return nil, err
-	}
-
-	userInfoResp, err := feishu.LarkClient.Authen.V1.UserInfo.Get(context.Background(), larkcore.WithUserAccessToken(*resp.Data.AccessToken))
-	// 处理错误
-	if err != nil {
-		logrus.Warnf("GetUserInfo() failed with '%s'\n", err)
-		return nil, err
-	}
-
-	// 服务端错误处理
-	if !userInfoResp.Success() {
-		logrus.Warnf("logId: %s, error response: \n%s", userInfoResp.RequestId(), larkcore.Prettify(userInfoResp.CodeError))
-		return nil, errors.New(larkcore.Prettify(userInfoResp.CodeError))
-	}
-
-	return userInfoResp.Data, nil
-}
-
-// 取出手机号码
-func extractPhoneNumber(phone string) string {
-	// 定义可能的国际前缀列表
-	prefixes := []string{"+86", "86"}
-
-	for _, prefix := range prefixes {
-		if strings.HasPrefix(phone, prefix) {
-			// 如果手机号以该前缀开头,则返回去掉前缀后的部分
-			return strings.TrimPrefix(phone, prefix)
-		}
-	}
-
-	// 如果没有匹配的前缀,直接返回原号码
-	return phone
-}

+ 10 - 39
server/internal/admin/service/service.go

@@ -1,15 +1,12 @@
 package service
 
 import (
-	"encoding/json"
+	"entrance-grpc/iam"
 	"errors"
 	"gadmin/config"
 	"gadmin/internal/admin/forms"
-	"gadmin/internal/gorm/model"
-	"gadmin/internal/gorm/query"
 	"gadmin/utility/token"
 	"github.com/gin-gonic/gin"
-	"github.com/sirupsen/logrus"
 	"time"
 
 	"github.com/patrickmn/go-cache"
@@ -31,49 +28,23 @@ func (s *sService) ServiceList(c *gin.Context) ([]*forms.Service, error) {
 	claims := cUser.(*token.UserClaims)
 	roleId := claims.RoleId
 
-	var (
-		q  = query.Use(config.AdminDB).AdminRole
-		sq = query.Use(config.AdminDB).AdminSystem
-	)
-	systemModels := make([]*model.AdminSystem, 0)
-	if config.IsSuperRole(roleId) {
-		models, err := sq.Find()
-		if err != nil {
-			logrus.Error(err)
-			return nil, err
-		}
-		systemModels = models
-	} else {
-		systems := ""
-		if err := q.Where(q.ID.Eq(roleId)).Pluck(q.Systems, &systems); err != nil {
-			return nil, err
-		}
-		if systems == "" {
-			return []*forms.Service{}, nil
-		}
-		systemIds := make([]int32, 0)
-		if err := json.Unmarshal([]byte(systems), &systemIds); err != nil {
-			return nil, err
-		}
-
-		models, err := sq.Where(sq.ID.In(systemIds...)).Order(sq.ID).Find()
-		if err != nil {
-			logrus.Error(err)
-			return nil, err
-		}
-		systemModels = models
+	res, err := config.GetIamClient().GetRoleSystems(c, &iam.GetRoleSystemsReq{
+		RoleID: roleId,
+	})
+	if err != nil || res.Code != 0 {
+		return nil, err
 	}
 
 	var services []*forms.Service
-	for _, v := range systemModels {
+	for _, v := range res.Data {
 		isSelected := false
-		if v.ID == claims.SystemId {
+		if v.ID == int64(claims.SystemId) {
 			isSelected = true
 		}
 		services = append(services, &forms.Service{
-			Id:         v.ID,
+			Id:         int32(v.ID),
 			Name:       v.Name,
-			Path:       v.URL + "?access-token={access-token}",
+			Path:       v.Url + "?access-token={access-token}",
 			IsSelected: isSelected,
 		})
 	}

+ 1 - 4
server/local.env

@@ -1,8 +1,5 @@
 # 配置改动都需要在这里进行说明
 
-# 管理后台用户数据库
-ADMIN_MYSQL_DSN="root:123456@(127.0.0.1:3306)/dashboard_admin?charset=utf8mb4&parseTime=True&loc=Local"
-
 # 日志服务器的数据库
 MYSQL_DSN="root:123456@(127.0.0.1:3306)/covenant_dashboard?charset=utf8mb4&parseTime=True&loc=Local"
 
@@ -139,5 +136,5 @@ RELEASE_GM_API_TOKEN="grave123"
 APP_ID="cli_a8bc3f675078900c" # 获取方式:开发者后台 -> 基础信息 -> 凭证与基础信息 -> 应用凭证 -> App ID
 APP_SECRET="X9KAelslFuvUr7gxYMAckbEXBKdUturK" # 获取方式:开发者后台 -> 基础信息 -> 凭证与基础信息 -> 应用凭证 -> App Secret
 
-
+ADMIN_GRPC_SERVER="127.0.0.1:7006"