From 9468ec58732d38c7a8aa6c4c565360b57e8a8e3d Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 29 Apr 2026 10:35:36 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=9D=83=E9=99=90=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Copilot --- common/yaml.go | 34 ++- controller/operation.go | 4 +- controller/permission.go | 366 +++++++++++++++++++++++ db/admin_permission_rbac.sql | 212 ++++++++++++++ log/backend.log | 515 ++++++++++++++++++++++++++++----- main.go | 21 ++ model/admin.go | 50 +++- model/mail.go | 2 +- model/permission.go | 543 +++++++++++++++++++++++++++++++++++ monitor/Monitor.go | 4 +- 10 files changed, 1661 insertions(+), 90 deletions(-) create mode 100644 controller/permission.go create mode 100644 db/admin_permission_rbac.sql create mode 100644 model/permission.go diff --git a/common/yaml.go b/common/yaml.go index d9c15fa..8202e51 100644 --- a/common/yaml.go +++ b/common/yaml.go @@ -4,6 +4,8 @@ import ( "fmt" "log" "os" + "regexp" + "strings" "gitea.bywaystudios.com/pet_home/nacos" @@ -67,6 +69,27 @@ type LanguageLimit struct { var config *Config var tranlaterConfig *TranlaterConfig +var launchEnvRegexp = regexp.MustCompile(`"ENV"\s*:\s*"([^"]+)"`) + +func currentRuntimeEnv() string { + if env, ok := os.LookupEnv("ENV"); ok { + env = strings.TrimSpace(env) + if env != "" { + return env + } + } + + content, err := os.ReadFile(".vscode/launch.json") + if err != nil { + return "" + } + matches := launchEnvRegexp.FindStringSubmatch(string(content)) + if len(matches) != 2 { + return "" + } + return strings.TrimSpace(matches[1]) +} + func Init() error { err := loadConfig() if err != nil { @@ -92,11 +115,15 @@ func loadConfig() error { if err != nil { return fmt.Errorf("get nacos client: %w", err) } - err = nacosClient.GetYAML("web-backend-env-conf", "web", &config) + configfile := "web-backend-env-conf" + if currentRuntimeEnv() == "dev" { + configfile = "web-backend-env-conf-dev" + } + err = nacosClient.GetYAML(configfile, "web", &config) if err != nil { return fmt.Errorf("get nacos config: %w", err) } - nacosClient.Listen("web-backend-env-conf", "web", func(event nacos.ChangeEvent) { + nacosClient.Listen(configfile, "web", func(event nacos.ChangeEvent) { var newConfig Config if err := yaml.Unmarshal([]byte(event.Content), &newConfig); err != nil { log.Printf("解析 Nacos 配置变更失败: %v", err) @@ -163,6 +190,9 @@ func GetSsh() bool { } func GetEnv() string { + if config == nil || strings.TrimSpace(config.System.Env) == "" { + return currentRuntimeEnv() + } return config.System.Env } diff --git a/controller/operation.go b/controller/operation.go index 5a4b9ec..e4a6ce7 100644 --- a/controller/operation.go +++ b/controller/operation.go @@ -98,9 +98,7 @@ func CopyUserOperation(srcAppID, dstAppID, srcUid, dstUid int) error { if err != nil { return err } - if dstAppID == 1 { - dstTableName = fmt.Sprintf("t_player_mod_%02d", newUid%100) - } + dstTableName = fmt.Sprintf("t_player_mod_%02d", newUid%100) _, err = DstDb.Exec(fmt.Sprintf("INSERT INTO %s (dwUin, mData, updateTime) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE mData = VALUES(mData), updateTime = VALUES(updateTime)", dstTableName), newUid, srcData.MData, srcData.UpdateTime) if err != nil { return err diff --git a/controller/permission.go b/controller/permission.go new file mode 100644 index 0000000..963131e --- /dev/null +++ b/controller/permission.go @@ -0,0 +1,366 @@ +package controller + +import ( + "backend/model" + "backend/util" + + "github.com/gin-gonic/gin" +) + +type permissionIDRequest struct { + ID int `json:"id" binding:"required"` +} + +type groupRoleSetRequest struct { + GroupID int `json:"group_id" binding:"required"` + RoleIDs []int `json:"role_ids"` +} + +type groupRoleListRequest struct { + GroupID int `json:"group_id" binding:"required"` +} + +type rolePermissionSetRequest struct { + RoleID int `json:"role_id" binding:"required"` + PermissionIDs []int `json:"permission_ids"` +} + +type rolePermissionListRequest struct { + RoleID int `json:"role_id" binding:"required"` +} + +type userGroupListRequest struct { + AdminID int `json:"admin_id" binding:"required"` +} + +type userGroupSetRequest struct { + AdminID int `json:"admin_id" binding:"required"` + GroupIDs []int `json:"group_ids"` +} + +type userPermissionSetRequest struct { + AdminID int `json:"admin_id" binding:"required"` + Permissions []model.UserPermissionItem `json:"permissions"` +} + +type userAdminIDRequest struct { + AdminID int `json:"admin_id" binding:"required"` +} + +func PermissionUserGroupList(c *gin.Context) { + var req model.PermissionUserGroupListParams + if err := c.ShouldBindJSON(&req); err != nil { + failed(c, "Invalid input: "+err.Error()) + return + } + items, total, err := model.ListPermissionUserGroups(req) + if err != nil { + failed(c, "Failed to list user groups: "+err.Error()) + return + } + success(c, gin.H{"items": items, "total": total}) +} + +func PermissionUserGroupAdd(c *gin.Context) { + var req model.PermissionUserGroup + if err := c.ShouldBindJSON(&req); err != nil { + failed(c, "Invalid input: "+err.Error()) + return + } + if req.GroupCode == "" || req.GroupName == "" { + failed(c, "group_code and group_name are required") + return + } + if err := model.CreatePermissionUserGroup(&req, c.GetString("admin")); err != nil { + failed(c, "Failed to add user group: "+err.Error()) + return + } + util.AddAdminLog(c, "新增权限用户组", req) + success(c, req) +} + +func PermissionUserGroupEdit(c *gin.Context) { + var req model.PermissionUserGroup + if err := c.ShouldBindJSON(&req); err != nil { + failed(c, "Invalid input: "+err.Error()) + return + } + if req.ID <= 0 { + failed(c, "id is required") + return + } + if err := model.UpdatePermissionUserGroup(&req, c.GetString("admin")); err != nil { + failed(c, "Failed to edit user group: "+err.Error()) + return + } + util.AddAdminLog(c, "编辑权限用户组", req) + success(c, req) +} + +func PermissionUserGroupDelete(c *gin.Context) { + var req permissionIDRequest + if err := c.ShouldBindJSON(&req); err != nil { + failed(c, "Invalid input: "+err.Error()) + return + } + if err := model.DeletePermissionUserGroup(req.ID); err != nil { + failed(c, "Failed to delete user group: "+err.Error()) + return + } + util.AddAdminLog(c, "删除权限用户组", req) + success(c, gin.H{"id": req.ID}) +} + +func PermissionRoleList(c *gin.Context) { + var req model.PermissionRoleListParams + if err := c.ShouldBindJSON(&req); err != nil { + failed(c, "Invalid input: "+err.Error()) + return + } + items, total, err := model.ListPermissionRoles(req) + if err != nil { + failed(c, "Failed to list roles: "+err.Error()) + return + } + success(c, gin.H{"items": items, "total": total}) +} + +func PermissionRoleAdd(c *gin.Context) { + var req model.PermissionRole + if err := c.ShouldBindJSON(&req); err != nil { + failed(c, "Invalid input: "+err.Error()) + return + } + if req.RoleCode == "" || req.RoleName == "" { + failed(c, "role_code and role_name are required") + return + } + if err := model.CreatePermissionRole(&req, c.GetString("admin")); err != nil { + failed(c, "Failed to add role: "+err.Error()) + return + } + util.AddAdminLog(c, "新增权限角色", req) + success(c, req) +} + +func PermissionRoleEdit(c *gin.Context) { + var req model.PermissionRole + if err := c.ShouldBindJSON(&req); err != nil { + failed(c, "Invalid input: "+err.Error()) + return + } + if req.ID <= 0 { + failed(c, "id is required") + return + } + if err := model.UpdatePermissionRole(&req, c.GetString("admin")); err != nil { + failed(c, "Failed to edit role: "+err.Error()) + return + } + util.AddAdminLog(c, "编辑权限角色", req) + success(c, req) +} + +func PermissionRoleDelete(c *gin.Context) { + var req permissionIDRequest + if err := c.ShouldBindJSON(&req); err != nil { + failed(c, "Invalid input: "+err.Error()) + return + } + if err := model.DeletePermissionRole(req.ID); err != nil { + failed(c, "Failed to delete role: "+err.Error()) + return + } + util.AddAdminLog(c, "删除权限角色", req) + success(c, gin.H{"id": req.ID}) +} + +func PermissionGroupRoleSet(c *gin.Context) { + var req groupRoleSetRequest + if err := c.ShouldBindJSON(&req); err != nil { + failed(c, "Invalid input: "+err.Error()) + return + } + if err := model.SetGroupRoles(req.GroupID, req.RoleIDs, c.GetString("admin")); err != nil { + failed(c, "Failed to set group roles: "+err.Error()) + return + } + util.AddAdminLog(c, "设置用户组角色", req) + success(c, gin.H{"group_id": req.GroupID, "role_ids": req.RoleIDs}) +} + +func PermissionGroupRoleList(c *gin.Context) { + var req groupRoleListRequest + if err := c.ShouldBindJSON(&req); err != nil { + failed(c, "Invalid input: "+err.Error()) + return + } + roles, err := model.ListGroupRoles(req.GroupID) + if err != nil { + failed(c, "Failed to list group roles: "+err.Error()) + return + } + success(c, roles) +} + +func PermissionPointList(c *gin.Context) { + var req model.PermissionPointListParams + if err := c.ShouldBindJSON(&req); err != nil { + failed(c, "Invalid input: "+err.Error()) + return + } + items, total, err := model.ListPermissionPoints(req) + if err != nil { + failed(c, "Failed to list permissions: "+err.Error()) + return + } + success(c, gin.H{"items": items, "total": total}) +} + +func PermissionPointAdd(c *gin.Context) { + var req model.PermissionPoint + if err := c.ShouldBindJSON(&req); err != nil { + failed(c, "Invalid input: "+err.Error()) + return + } + if req.PermissionCode == "" || req.PermissionName == "" { + failed(c, "permission_code and permission_name are required") + return + } + if err := model.CreatePermissionPoint(&req, c.GetString("admin")); err != nil { + failed(c, "Failed to add permission: "+err.Error()) + return + } + util.AddAdminLog(c, "新增单点权限", req) + success(c, req) +} + +func PermissionPointEdit(c *gin.Context) { + var req model.PermissionPoint + if err := c.ShouldBindJSON(&req); err != nil { + failed(c, "Invalid input: "+err.Error()) + return + } + if req.ID <= 0 { + failed(c, "id is required") + return + } + if err := model.UpdatePermissionPoint(&req, c.GetString("admin")); err != nil { + failed(c, "Failed to edit permission: "+err.Error()) + return + } + util.AddAdminLog(c, "编辑单点权限", req) + success(c, req) +} + +func PermissionPointDelete(c *gin.Context) { + var req permissionIDRequest + if err := c.ShouldBindJSON(&req); err != nil { + failed(c, "Invalid input: "+err.Error()) + return + } + if err := model.DeletePermissionPoint(req.ID); err != nil { + failed(c, "Failed to delete permission: "+err.Error()) + return + } + util.AddAdminLog(c, "删除单点权限", req) + success(c, gin.H{"id": req.ID}) +} + +func PermissionRolePermissionSet(c *gin.Context) { + var req rolePermissionSetRequest + if err := c.ShouldBindJSON(&req); err != nil { + failed(c, "Invalid input: "+err.Error()) + return + } + if err := model.SetRolePermissions(req.RoleID, req.PermissionIDs, c.GetString("admin")); err != nil { + failed(c, "Failed to set role permissions: "+err.Error()) + return + } + util.AddAdminLog(c, "设置角色权限", req) + success(c, gin.H{"role_id": req.RoleID, "permission_ids": req.PermissionIDs}) +} + +func PermissionRolePermissionList(c *gin.Context) { + var req rolePermissionListRequest + if err := c.ShouldBindJSON(&req); err != nil { + failed(c, "Invalid input: "+err.Error()) + return + } + permissions, err := model.ListRolePermissions(req.RoleID) + if err != nil { + failed(c, "Failed to list role permissions: "+err.Error()) + return + } + success(c, permissions) +} + +func PermissionUserGroupRelList(c *gin.Context) { + var req userGroupListRequest + if err := c.ShouldBindJSON(&req); err != nil { + failed(c, "Invalid input: "+err.Error()) + return + } + groups, err := model.ListUserGroups(req.AdminID) + if err != nil { + failed(c, "Failed to list user groups: "+err.Error()) + return + } + success(c, groups) +} + +func PermissionUserGroupRelSet(c *gin.Context) { + var req userGroupSetRequest + if err := c.ShouldBindJSON(&req); err != nil { + failed(c, "Invalid input: "+err.Error()) + return + } + if err := model.SetUserGroups(req.AdminID, req.GroupIDs, c.GetString("admin")); err != nil { + failed(c, "Failed to set user groups: "+err.Error()) + return + } + util.AddAdminLog(c, "设置管理员用户组", req) + success(c, gin.H{"admin_id": req.AdminID, "group_ids": req.GroupIDs}) +} + +func PermissionUserPermissionList(c *gin.Context) { + var req userAdminIDRequest + if err := c.ShouldBindJSON(&req); err != nil { + failed(c, "Invalid input: "+err.Error()) + return + } + items, err := model.ListUserPermissions(req.AdminID) + if err != nil { + failed(c, "Failed to list user permissions: "+err.Error()) + return + } + success(c, items) +} + +func PermissionUserPermissionSet(c *gin.Context) { + var req userPermissionSetRequest + if err := c.ShouldBindJSON(&req); err != nil { + failed(c, "Invalid input: "+err.Error()) + return + } + if err := model.SetUserPermissions(req.AdminID, req.Permissions, c.GetString("admin")); err != nil { + failed(c, "Failed to set user permissions: "+err.Error()) + return + } + util.AddAdminLog(c, "设置管理员单点权限", req) + success(c, gin.H{"admin_id": req.AdminID, "permissions": req.Permissions}) +} + +func PermissionUserRoleList(c *gin.Context) { + var req userAdminIDRequest + if err := c.ShouldBindJSON(&req); err != nil { + failed(c, "Invalid input: "+err.Error()) + return + } + roles, err := model.ListUserRoles(req.AdminID) + if err != nil { + failed(c, "Failed to list user roles: "+err.Error()) + return + } + success(c, roles) +} diff --git a/db/admin_permission_rbac.sql b/db/admin_permission_rbac.sql new file mode 100644 index 0000000..9c41073 --- /dev/null +++ b/db/admin_permission_rbac.sql @@ -0,0 +1,212 @@ +USE game; + +-- 后台权限管理增量表设计 +-- 兼容现有 admin 表,不重建 admin,仅通过 admin.id 建立关联。 +-- 保留 admin.group / admin.role 旧字段,便于平滑迁移;新权限体系以 RBAC 关系表为准。 +CREATE TABLE IF NOT EXISTS `admin` ( + `id` int NOT NULL AUTO_INCREMENT, + `username` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名', + `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '密码', + `real_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '真实姓名', + `nickname` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '显示名称', + `phone` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '手机号', + `email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '邮箱', + `token` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '令牌', + `group` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '旧用户组字段,兼容历史逻辑', + `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1启用 0停用', + `expires` int DEFAULT 0 COMMENT '过期时间', + `role` int DEFAULT NULL COMMENT '旧角色字段,兼容历史逻辑', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `lastLoginTime` int NOT NULL DEFAULT 0 COMMENT '最近登录时间', + `lastLoginIp` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '最近登录IP', + `createTime` int NOT NULL DEFAULT 0 COMMENT '创建时间', + `updateTime` int NOT NULL DEFAULT 0 COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `user_unique` (`username`), + KEY `idx_admin_status` (`status`), + KEY `idx_admin_phone` (`phone`), + KEY `idx_admin_email` (`email`) +) ENGINE = InnoDB AUTO_INCREMENT = 16 DEFAULT CHARSET = utf8mb4; + +-- 对已有 admin 表做增量补齐,避免与现网库冲突。 +ALTER TABLE `admin` + ADD COLUMN IF NOT EXISTS `real_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '真实姓名' AFTER `password`, + ADD COLUMN IF NOT EXISTS `nickname` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '显示名称' AFTER `real_name`, + ADD COLUMN IF NOT EXISTS `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注' AFTER `role`, + ADD COLUMN IF NOT EXISTS `lastLoginTime` int NOT NULL DEFAULT 0 COMMENT '最近登录时间' AFTER `remark`, + ADD COLUMN IF NOT EXISTS `lastLoginIp` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '最近登录IP' AFTER `lastLoginTime`; + +CREATE TABLE IF NOT EXISTS `admin_user_group` ( + `id` int NOT NULL AUTO_INCREMENT, + `group_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户组编码,例如 G_OP', + `group_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户组名称', + `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1启用 0停用', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `create_admin` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + `update_admin` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人', + `createTime` int NOT NULL DEFAULT 0 COMMENT '创建时间,秒级时间戳', + `updateTime` int NOT NULL DEFAULT 0 COMMENT '更新时间,秒级时间戳', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_admin_user_group_code` (`group_code`), + KEY `idx_admin_user_group_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='后台用户组表'; + +CREATE TABLE IF NOT EXISTS `admin_role` ( + `id` int NOT NULL AUTO_INCREMENT, + `role_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色编码,例如 R_SUPER', + `role_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色名称', + `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1启用 0停用', + `is_system` tinyint NOT NULL DEFAULT 0 COMMENT '是否系统内置:1是 0否', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `create_admin` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + `update_admin` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人', + `createTime` int NOT NULL DEFAULT 0 COMMENT '创建时间,秒级时间戳', + `updateTime` int NOT NULL DEFAULT 0 COMMENT '更新时间,秒级时间戳', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_admin_role_code` (`role_code`), + KEY `idx_admin_role_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='后台角色表'; + +CREATE TABLE IF NOT EXISTS `admin_permission` ( + `id` int NOT NULL AUTO_INCREMENT, + `permission_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '单点权限编码,例如 AC0004', + `permission_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '权限名称', + `permission_group` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '权限分组,例如 activity/config/user', + `api_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '接口路径,例如 /api/activity/edit', + `http_method` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '请求方法,例如 GET/POST/PUT/DELETE', + `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1启用 0停用', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `create_admin` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + `update_admin` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人', + `createTime` int NOT NULL DEFAULT 0 COMMENT '创建时间,秒级时间戳', + `updateTime` int NOT NULL DEFAULT 0 COMMENT '更新时间,秒级时间戳', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_admin_permission_code` (`permission_code`), + KEY `idx_admin_permission_group` (`permission_group`), + KEY `idx_admin_permission_path_method` (`api_path`, `http_method`), + KEY `idx_admin_permission_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='后台单点权限表'; + +CREATE TABLE IF NOT EXISTS `admin_user_group_rel` ( + `id` int NOT NULL AUTO_INCREMENT, + `admin_id` int NOT NULL COMMENT 'admin.id', + `group_id` int NOT NULL COMMENT 'admin_user_group.id', + `create_admin` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + `createTime` int NOT NULL DEFAULT 0 COMMENT '创建时间,秒级时间戳', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_admin_user_group_rel` (`admin_id`, `group_id`), + KEY `idx_admin_user_group_rel_group_id` (`group_id`), + CONSTRAINT `fk_admin_user_group_rel_admin_id` FOREIGN KEY (`admin_id`) REFERENCES `admin` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `fk_admin_user_group_rel_group_id` FOREIGN KEY (`group_id`) REFERENCES `admin_user_group` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员与用户组关联表'; + +CREATE TABLE IF NOT EXISTS `admin_group_role_rel` ( + `id` int NOT NULL AUTO_INCREMENT, + `group_id` int NOT NULL COMMENT 'admin_user_group.id', + `role_id` int NOT NULL COMMENT 'admin_role.id', + `create_admin` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + `createTime` int NOT NULL DEFAULT 0 COMMENT '创建时间,秒级时间戳', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_admin_group_role_rel` (`group_id`, `role_id`), + KEY `idx_admin_group_role_rel_role_id` (`role_id`), + CONSTRAINT `fk_admin_group_role_rel_group_id` FOREIGN KEY (`group_id`) REFERENCES `admin_user_group` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `fk_admin_group_role_rel_role_id` FOREIGN KEY (`role_id`) REFERENCES `admin_role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户组与角色关联表'; + +CREATE TABLE IF NOT EXISTS `admin_role_permission_rel` ( + `id` int NOT NULL AUTO_INCREMENT, + `role_id` int NOT NULL COMMENT 'admin_role.id', + `permission_id` int NOT NULL COMMENT 'admin_permission.id', + `create_admin` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + `createTime` int NOT NULL DEFAULT 0 COMMENT '创建时间,秒级时间戳', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_admin_role_permission_rel` (`role_id`, `permission_id`), + KEY `idx_admin_role_permission_rel_permission_id` (`permission_id`), + CONSTRAINT `fk_admin_role_permission_rel_role_id` FOREIGN KEY (`role_id`) REFERENCES `admin_role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `fk_admin_role_permission_rel_permission_id` FOREIGN KEY (`permission_id`) REFERENCES `admin_permission` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色与单点权限关联表'; + +CREATE TABLE IF NOT EXISTS `admin_user_permission_rel` ( + `id` int NOT NULL AUTO_INCREMENT, + `admin_id` int NOT NULL COMMENT 'admin.id', + `permission_id` int NOT NULL COMMENT 'admin_permission.id', + `grant_type` tinyint NOT NULL DEFAULT 1 COMMENT '授权类型:1允许 2拒绝,支持单点覆盖角色权限', + `create_admin` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + `createTime` int NOT NULL DEFAULT 0 COMMENT '创建时间,秒级时间戳', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_admin_user_permission_rel` (`admin_id`, `permission_id`), + KEY `idx_admin_user_permission_rel_permission_id` (`permission_id`), + KEY `idx_admin_user_permission_rel_grant_type` (`grant_type`), + CONSTRAINT `fk_admin_user_permission_rel_admin_id` FOREIGN KEY (`admin_id`) REFERENCES `admin` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `fk_admin_user_permission_rel_permission_id` FOREIGN KEY (`permission_id`) REFERENCES `admin_permission` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员单点权限关联表'; + +-- 初始化示例数据 +INSERT INTO `admin_user_group` (`group_code`, `group_name`, `status`, `remark`, `create_admin`, `update_admin`, `createTime`, `updateTime`) +VALUES + ('G_SUPER', '超级管理员组', 1, '系统初始化用户组', 'system', 'system', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), + ('G_OP', '运营组', 1, '运营后台使用', 'system', 'system', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), + ('G_CS', '客服组', 1, '客服后台使用', 'system', 'system', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()) +ON DUPLICATE KEY UPDATE + `group_name` = VALUES(`group_name`), + `status` = VALUES(`status`), + `remark` = VALUES(`remark`), + `update_admin` = VALUES(`update_admin`), + `updateTime` = VALUES(`updateTime`); + +INSERT INTO `admin_role` (`role_code`, `role_name`, `status`, `is_system`, `remark`, `create_admin`, `update_admin`, `createTime`, `updateTime`) +VALUES + ('R_SUPER', '超级管理员', 1, 1, '默认拥有全量权限', 'system', 'system', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), + ('R_ACTIVITY', '活动管理员', 1, 1, '管理活动与配置', 'system', 'system', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), + ('R_NOTIFICATION', '通知管理员', 1, 1, '管理客户端通知配置', 'system', 'system', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()) +ON DUPLICATE KEY UPDATE + `role_name` = VALUES(`role_name`), + `status` = VALUES(`status`), + `remark` = VALUES(`remark`), + `update_admin` = VALUES(`update_admin`), + `updateTime` = VALUES(`updateTime`); + +INSERT INTO `admin_permission` (`permission_code`, `permission_name`, `permission_group`, `api_path`, `http_method`, `status`, `remark`, `create_admin`, `update_admin`, `createTime`, `updateTime`) +VALUES + ('AC0001', '管理员列表查询', 'admin', '/api/admin/list', 'POST', 1, '查看管理员列表', 'system', 'system', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), + ('AC0002', '管理员新增', 'admin', '/api/admin/add', 'POST', 1, '新增后台管理员', 'system', 'system', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), + ('AC0003', '客户端通知查询', 'notification', '/api/client/notification', 'GET', 1, '查看客户端 notification 配置', 'system', 'system', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), + ('AC0004', '客户端通知修改', 'notification', '/api/client/notification', 'PUT', 1, '单点权限标签示例:AC0004', 'system', 'system', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), + ('AC0005', '活动编辑', 'activity', '/api/activity/edit', 'POST', 1, '编辑活动配置', 'system', 'system', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()) +ON DUPLICATE KEY UPDATE + `permission_name` = VALUES(`permission_name`), + `permission_group` = VALUES(`permission_group`), + `api_path` = VALUES(`api_path`), + `http_method` = VALUES(`http_method`), + `status` = VALUES(`status`), + `remark` = VALUES(`remark`), + `update_admin` = VALUES(`update_admin`), + `updateTime` = VALUES(`updateTime`); + +-- 初始化关联关系示例 +INSERT INTO `admin_group_role_rel` (`group_id`, `role_id`, `create_admin`, `createTime`) +SELECT g.id, r.id, 'system', UNIX_TIMESTAMP() +FROM `admin_user_group` g +JOIN `admin_role` r +WHERE (g.group_code = 'G_SUPER' AND r.role_code = 'R_SUPER') + OR (g.group_code = 'G_OP' AND r.role_code = 'R_ACTIVITY') + OR (g.group_code = 'G_OP' AND r.role_code = 'R_NOTIFICATION') +ON DUPLICATE KEY UPDATE + `create_admin` = VALUES(`create_admin`); + +INSERT INTO `admin_role_permission_rel` (`role_id`, `permission_id`, `create_admin`, `createTime`) +SELECT r.id, p.id, 'system', UNIX_TIMESTAMP() +FROM `admin_role` r +JOIN `admin_permission` p +WHERE (r.role_code = 'R_SUPER') + OR (r.role_code = 'R_ACTIVITY' AND p.permission_code IN ('AC0005')) + OR (r.role_code = 'R_NOTIFICATION' AND p.permission_code IN ('AC0003', 'AC0004')) +ON DUPLICATE KEY UPDATE + `create_admin` = VALUES(`create_admin`); + +-- 可选:把现有管理员挂到默认用户组,请按实际用户名替换。 +-- INSERT INTO `admin_user_group_rel` (`admin_id`, `group_id`, `create_admin`, `createTime`) +-- SELECT a.id, g.id, 'system', UNIX_TIMESTAMP() +-- FROM `admin` a +-- JOIN `admin_user_group` g ON g.group_code = 'G_SUPER' +-- WHERE a.username IN ('admin'); diff --git a/log/backend.log b/log/backend.log index 1768d3c..cdb935b 100644 --- a/log/backend.log +++ b/log/backend.log @@ -20,12 +20,48 @@ [GIN-debug] POST /api/alibaba/zabbix/recovery --> backend/controller.AlibabaRecovery (3 handlers) [GIN-debug] POST /api/alibaba/game/notify --> backend/controller.AlibabaGameNotify (3 handlers) [GIN-debug] POST /api/alibaba/notify/order --> backend/controller.AlibabaNotifyOrder (3 handlers) +[GIN-debug] GET /api/v1/experiments --> backend/controller.ExperimentList (4 handlers) +[GIN-debug] POST /api/v1/experiments --> backend/controller.ExperimentCreate (4 handlers) +[GIN-debug] PUT /api/v1/experiments/:id --> backend/controller.ExperimentUpdate (4 handlers) +[GIN-debug] DELETE /api/v1/experiments/:id --> backend/controller.ExperimentDelete (4 handlers) +[GIN-debug] GET /api/v1/experiments/:id/variants --> backend/controller.ExperimentVariantList (4 handlers) +[GIN-debug] POST /api/v1/experiments/:id/variants --> backend/controller.ExperimentVariantCreate (4 handlers) +[GIN-debug] PUT /api/v1/experiments/:id/variants/:variantId --> backend/controller.ExperimentVariantUpdate (4 handlers) +[GIN-debug] DELETE /api/v1/experiments/:id/variants/:variantId --> backend/controller.ExperimentVariantDelete (4 handlers) +[GIN-debug] GET /api/v1/experiments/:id/whitelist --> backend/controller.ExperimentWhitelistList (4 handlers) +[GIN-debug] POST /api/v1/experiments/:id/whitelist --> backend/controller.ExperimentWhitelistCreate (4 handlers) +[GIN-debug] POST /api/v1/experiments/:id/whitelist/batch --> backend/controller.ExperimentWhitelistBatchCreate (4 handlers) +[GIN-debug] DELETE /api/v1/experiments/:id/whitelist/:userId --> backend/controller.ExperimentWhitelistDelete (4 handlers) +[GIN-debug] GET /api/v1/experiments/:id/results --> backend/controller.ExperimentResult (4 handlers) +[GIN-debug] GET /api/v1/users/:userId/groups --> backend/controller.UserExperimentGroups (4 handlers) [GIN-debug] POST /api/admin/list --> backend/controller.AdminList (4 handlers) [GIN-debug] POST /api/admin/add --> backend/controller.AdminAdd (4 handlers) [GIN-debug] POST /api/admin/log/list --> backend/controller.AdminLogList (4 handlers) +[GIN-debug] POST /api/admin/config/list --> backend/controller.AdminConfigList (4 handlers) +[GIN-debug] POST /api/admin/config/add --> backend/controller.AdminConfigAdd (4 handlers) +[GIN-debug] POST /api/admin/config/edit --> backend/controller.AdminConfigEdit (4 handlers) +[GIN-debug] POST /api/admin/usergroup/list --> backend/controller.PermissionUserGroupList (4 handlers) +[GIN-debug] POST /api/admin/usergroup/add --> backend/controller.PermissionUserGroupAdd (4 handlers) +[GIN-debug] POST /api/admin/usergroup/edit --> backend/controller.PermissionUserGroupEdit (4 handlers) +[GIN-debug] POST /api/admin/usergroup/delete --> backend/controller.PermissionUserGroupDelete (4 handlers) +[GIN-debug] POST /api/admin/usergroup/role/set --> backend/controller.PermissionGroupRoleSet (4 handlers) +[GIN-debug] POST /api/admin/usergroup/role/list --> backend/controller.PermissionGroupRoleList (4 handlers) +[GIN-debug] POST /api/admin/role/list --> backend/controller.PermissionRoleList (4 handlers) +[GIN-debug] POST /api/admin/role/add --> backend/controller.PermissionRoleAdd (4 handlers) +[GIN-debug] POST /api/admin/role/edit --> backend/controller.PermissionRoleEdit (4 handlers) +[GIN-debug] POST /api/admin/role/delete --> backend/controller.PermissionRoleDelete (4 handlers) +[GIN-debug] POST /api/admin/role/permission/set --> backend/controller.PermissionRolePermissionSet (4 handlers) +[GIN-debug] POST /api/admin/role/permission/list --> backend/controller.PermissionRolePermissionList (4 handlers) +[GIN-debug] POST /api/admin/permission/list --> backend/controller.PermissionPointList (4 handlers) +[GIN-debug] POST /api/admin/permission/add --> backend/controller.PermissionPointAdd (4 handlers) +[GIN-debug] POST /api/admin/permission/edit --> backend/controller.PermissionPointEdit (4 handlers) +[GIN-debug] POST /api/admin/permission/delete --> backend/controller.PermissionPointDelete (4 handlers) +[GIN-debug] POST /api/admin/user/group/list --> backend/controller.PermissionUserGroupRelList (4 handlers) +[GIN-debug] POST /api/admin/user/group/set --> backend/controller.PermissionUserGroupRelSet (4 handlers) [GIN-debug] POST /api/log/user --> backend/controller.UserDetail (4 handlers) [GIN-debug] POST /api/log/asset --> backend/controller.Asset (4 handlers) [GIN-debug] POST /api/log/event --> backend/controller.Event (4 handlers) +[GIN-debug] POST /api/log/loginCountByMonth --> backend/controller.LoginCountByMonth (4 handlers) [GIN-debug] POST /api/log/order --> backend/controller.Order (4 handlers) [GIN-debug] POST /api/user/list --> backend/controller.UserList (4 handlers) [GIN-debug] GET /api/user/info --> backend/controller.UserInfo (4 handlers) @@ -46,6 +82,11 @@ [GIN-debug] POST /api/statistics/order --> backend/controller.StatisticsOrder (4 handlers) [GIN-debug] POST /api/statistics/info --> backend/controller.StatisticsInfo (4 handlers) [GIN-debug] POST /api/statistics/heat --> backend/controller.StatisticsHeat (4 handlers) +[GIN-debug] POST /api/activity/list --> backend/controller.ActivityList (4 handlers) +[GIN-debug] POST /api/activity/edit --> backend/controller.ActivityEdit (4 handlers) +[GIN-debug] POST /api/activity/add --> backend/controller.ActivityAdd (4 handlers) +[GIN-debug] POST /api/activity/delete --> backend/controller.ActivityDelete (4 handlers) +[GIN-debug] POST /api/activity/sync --> backend/controller.ActivitySync (4 handlers) [GIN-debug] POST /api/mail/send --> backend/controller.SendMail (4 handlers) [GIN-debug] POST /api/mail/list --> backend/controller.MailList (4 handlers) [GIN-debug] POST /api/mail/delete --> backend/controller.MailDelete (4 handlers) @@ -55,76 +96,412 @@ [GIN-debug] POST /api/language/save --> backend/controller.LanguageSave (4 handlers) [GIN-debug] POST /api/language/add --> backend/controller.LanguageAdd (4 handlers) [GIN-debug] POST /api/language/delete --> backend/controller.LanguageDelete (4 handlers) +[GIN-debug] GET /api/config/notification --> backend/controller.NotificationConfigGet (4 handlers) +[GIN-debug] PUT /api/config/notification/update --> backend/controller.NotificationConfigSave (4 handlers) [GIN-debug] POST /api/scripts/copywriting --> backend/controller.Copywriting (4 handlers) [GIN-debug] POST /api/scripts/copyonline --> backend/controller.CopyOnline (4 handlers) +[GIN-debug] POST /api/scripts/clientImageGitPull --> backend/controller.ClientImageGitPull (4 handlers) [GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value. -Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details. +Please check https://github.com/gin-gonic/gin/blob/master/docs/doc.md#dont-trust-all-proxies for details. [GIN-debug] Listening and serving HTTP on :5320 -[GIN] 2026/02/06 - 11:08:08 | 200 | 283.9437ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:22:59 | 200 | 274.4469ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:24:05 | 200 | 348.2504ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:24:17 | 200 | 329.7512ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:24:27 | 200 | 345.4986ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:24:44 | 200 | 300.8164ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:35:02 | 200 | 337.9567ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:36:33 | 200 | 259.11ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:36:46 | 200 | 284.573ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:36:47 | 200 | 249.2991ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:36:59 | 200 | 67.1611ms | ::1 | GET "/api/user/info" -[GIN] 2026/02/06 - 11:37:01 | 200 | 431.8827ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:40:34 | 200 | 309.7846ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:40:51 | 200 | 275.6383ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:41:00 | 200 | 85.64ms | ::1 | GET "/api/user/info" -[GIN] 2026/02/06 - 11:41:01 | 200 | 499.9881ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:42:36 | 200 | 281.8592ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:45:03 | 200 | 246.0534ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:46:58 | 200 | 261.62ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:48:04 | 200 | 256.2543ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:48:54 | 200 | 330.0666ms | ::1 | POST "/api/language/save" -[GIN] 2026/02/06 - 11:49:20 | 200 | 25.5684635s | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:49:20 | 200 | 6.9455357s | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:49:23 | 200 | 525.4629ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:51:09 | 200 | 310.4069ms | ::1 | POST "/api/language/save" -[GIN] 2026/02/06 - 11:51:09 | 200 | 263.907ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:51:24 | 200 | 1.4492901s | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:51:28 | 200 | 412.4035ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:51:58 | 200 | 324.8691ms | ::1 | POST "/api/language/save" -[GIN] 2026/02/06 - 11:51:59 | 200 | 294.4355ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:52:13 | 200 | 393.9931ms | ::1 | POST "/api/language/save" -[GIN] 2026/02/06 - 11:52:13 | 200 | 326.9202ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:54:49 | 200 | 305.8447ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:55:49 | 200 | 278.9384ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:58:55 | 200 | 330.0915ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 11:59:21 | 200 | 313.4674ms | ::1 | POST "/api/language/add" -[GIN] 2026/02/06 - 11:59:55 | 200 | 297.1654ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 12:00:10 | 200 | 263.8051ms | ::1 | POST "/api/language/save" -[GIN] 2026/02/06 - 12:00:10 | 200 | 236.9732ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 12:04:51 | 200 | 269.5796ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 12:08:14 | 200 | 275.6644ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 12:10:04 | 200 | 264.1296ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 12:10:12 | 200 | 319.581ms | ::1 | POST "/api/language/save" -[GIN] 2026/02/06 - 12:10:12 | 200 | 281.59ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 12:15:14 | 200 | 280.0912ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 12:15:29 | 200 | 273.8402ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 12:15:33 | 200 | 314.1021ms | ::1 | POST "/api/language/save" -[GIN] 2026/02/06 - 12:15:34 | 200 | 282.8297ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 14:06:30 | 200 | 5.3565745s | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 14:06:39 | 200 | 527.9859ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 14:21:48 | 200 | 313.4629ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 14:21:50 | 200 | 331.8064ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 14:34:21 | 200 | 367.3705ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 14:40:44 | 200 | 297.3901ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 14:41:56 | 200 | 267.249ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 14:42:09 | 200 | 319.4952ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 14:47:51 | 200 | 270.7758ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 14:48:44 | 200 | 278.511ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 14:48:45 | 200 | 297.4667ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 14:48:49 | 200 | 1.3174404s | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 14:48:57 | 200 | 1.4807982s | ::1 | POST "/api/language/save" -[GIN] 2026/02/06 - 14:48:59 | 200 | 2.670194s | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 14:49:06 | 200 | 1.2162725s | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 14:51:47 | 200 | 606.2702ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 14:56:03 | 200 | 294.684ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 14:56:56 | 200 | 306.1023ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 15:01:34 | 200 | 275.0238ms | ::1 | POST "/api/language/list" -[GIN] 2026/02/06 - 15:18:28 | 200 | 399.0769ms | ::1 | POST "/api/language/list" +2026/04/28 15:27:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +[GIN] 2026/04/28 - 15:27:43 | 401 | 0s | ::1 | POST "/api/server/list" +[GIN] 2026/04/28 - 15:27:43 | 401 | 0s | ::1 | POST "/api/mail/list" +[GIN] 2026/04/28 - 15:27:43 | 404 | 0s | ::1 | POST "/api/auth/logout" +[GIN] 2026/04/28 - 15:27:43 | 404 | 0s | ::1 | POST "/api/auth/logout" +[GIN] 2026/04/28 - 15:27:51 | 200 | 81.32ms | ::1 | POST "/api/auth/login" +[GIN] 2026/04/28 - 15:27:51 | 200 | 533.1µs | ::1 | GET "/api/auth/Codes" +[GIN] 2026/04/28 - 15:27:51 | 200 | 58.65ms | ::1 | GET "/api/user/info" +[GIN] 2026/04/28 - 15:27:52 | 200 | 199.04ms | ::1 | POST "/api/server/list" +[GIN] 2026/04/28 - 15:27:52 | 200 | 298.53ms | ::1 | POST "/api/mail/list" +2026/04/28 15:28:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +[GIN] 2026/04/28 - 15:28:29 | 200 | 325.47ms | ::1 | POST "/api/mail/send" +2026/04/28 15:28:29 failed to send admin message: ReloadMail failed: rpc error: code = Unimplemented desc = unknown method ReloadMail for service tutorial.Backend +2026/04/28 15:28:29 sent reload mail message to server 0 +2026/04/28 15:28:29 sent reload mail message to server 2 +2026/04/28 15:28:29 sent reload mail message to server 1 +[GIN] 2026/04/28 - 15:28:30 | 200 | 197.42ms | ::1 | POST "/api/mail/list" +2026/04/28 15:28:32 failed to send admin message: ReloadMail failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:28:32 sent reload mail message to server 3 +2026/04/28 15:29:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:30:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:31:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:32:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:33:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:34:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:35:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:36:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:37:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:38:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:39:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:40:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:41:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:42:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:43:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:44:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:45:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:46:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:47:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:48:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:49:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:50:04 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:51:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:52:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:53:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:54:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:55:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:56:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:57:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:58:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 15:59:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:00:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:01:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:02:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:03:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:04:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:05:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:06:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:07:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:08:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:09:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:10:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:11:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:12:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:13:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:14:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:15:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:16:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:17:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:18:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:19:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:20:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:21:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:22:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:23:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:24:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:25:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:26:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:27:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:28:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:29:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:30:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:31:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:32:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:33:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:34:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:35:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:36:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:37:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:38:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:39:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:40:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:41:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:42:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:43:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:44:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:45:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:46:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:47:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:48:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:49:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:50:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:51:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:52:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:53:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:54:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:55:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:56:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:57:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:58:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 16:59:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:00:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:01:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:02:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:03:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:04:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:05:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:06:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:07:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:08:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:09:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:10:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:11:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:12:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:13:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:14:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:15:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:16:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:17:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:18:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:19:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:20:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:21:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:22:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:23:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:24:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:25:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:26:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:27:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:28:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:29:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:30:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:31:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:32:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:33:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:34:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:35:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:36:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:37:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:38:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:39:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:40:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:41:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:42:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:43:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:44:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:45:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:46:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:47:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:48:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:49:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:50:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:51:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:52:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:53:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:54:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:55:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:56:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:57:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:58:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 17:59:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:00:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:01:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:02:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:03:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:04:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:05:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:06:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:07:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:08:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:09:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:10:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:11:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:12:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:13:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:14:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:15:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:16:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:17:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:18:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:19:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:20:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:21:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:22:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:23:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:24:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:25:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:26:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:27:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:28:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:29:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:30:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:31:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:32:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:33:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:34:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:35:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:36:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:37:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:38:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:39:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:40:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:41:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:42:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:43:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:44:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:45:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:46:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:47:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:48:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:49:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:50:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:51:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:52:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:53:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:54:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:55:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:56:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:57:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:58:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 18:59:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:00:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:01:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:02:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:03:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:04:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:05:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:06:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:07:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:08:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:09:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:10:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:11:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:12:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:13:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:14:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:15:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:16:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:17:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:18:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:19:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:20:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:21:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:22:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:23:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:24:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:25:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:26:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:27:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:28:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:29:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:30:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:31:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:32:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:33:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:34:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:35:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:36:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:37:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:38:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:39:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:40:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:41:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:42:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:43:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:44:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:45:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:46:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:47:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:48:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:49:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:50:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:51:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:52:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:53:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:54:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:55:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:56:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:57:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:58:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 19:59:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:00:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:01:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:02:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:03:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:04:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:05:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:06:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:07:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:08:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:09:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:10:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:11:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:12:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:13:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:14:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:15:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:16:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:17:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:18:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:19:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:20:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:21:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:22:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:23:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:24:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:25:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:26:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:27:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:28:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:29:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:30:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:31:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:32:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:33:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:34:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:35:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:36:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:37:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:38:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:39:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:40:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:41:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:42:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:43:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:44:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:45:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:46:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:47:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:48:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:49:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:50:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:51:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:52:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:53:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:54:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:55:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:56:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:57:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:58:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 20:59:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:00:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:01:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:02:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:03:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:04:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:05:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:06:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:07:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:08:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:09:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:10:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:11:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:12:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:13:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:14:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:15:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:16:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:17:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:18:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:19:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:20:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:21:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:22:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:23:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:24:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:25:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:26:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:27:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:28:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:29:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:30:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:31:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:32:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:33:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:34:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:35:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:36:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:37:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:38:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:39:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:40:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:41:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:42:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:43:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:44:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:45:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:46:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:47:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:48:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:49:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded +2026/04/28 21:50:03 Failed to get server info for AppId=1, ServerId=3: ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded diff --git a/main.go b/main.go index f94afa8..d9d0040 100644 --- a/main.go +++ b/main.go @@ -135,6 +135,27 @@ func main() { api.POST("/admin/config/list", controller.AdminConfigList) api.POST("/admin/config/add", controller.AdminConfigAdd) api.POST("/admin/config/edit", controller.AdminConfigEdit) + api.POST("/admin/usergroup/list", controller.PermissionUserGroupList) + api.POST("/admin/usergroup/add", controller.PermissionUserGroupAdd) + api.POST("/admin/usergroup/edit", controller.PermissionUserGroupEdit) + api.POST("/admin/usergroup/delete", controller.PermissionUserGroupDelete) + api.POST("/admin/usergroup/role/set", controller.PermissionGroupRoleSet) + api.POST("/admin/usergroup/role/list", controller.PermissionGroupRoleList) + api.POST("/admin/role/list", controller.PermissionRoleList) + api.POST("/admin/role/add", controller.PermissionRoleAdd) + api.POST("/admin/role/edit", controller.PermissionRoleEdit) + api.POST("/admin/role/delete", controller.PermissionRoleDelete) + api.POST("/admin/role/permission/set", controller.PermissionRolePermissionSet) + api.POST("/admin/role/permission/list", controller.PermissionRolePermissionList) + api.POST("/admin/permission/list", controller.PermissionPointList) + api.POST("/admin/permission/add", controller.PermissionPointAdd) + api.POST("/admin/permission/edit", controller.PermissionPointEdit) + api.POST("/admin/permission/delete", controller.PermissionPointDelete) + api.POST("/admin/user/group/list", controller.PermissionUserGroupRelList) + api.POST("/admin/user/group/set", controller.PermissionUserGroupRelSet) + api.POST("/admin/user/permission/list", controller.PermissionUserPermissionList) + api.POST("/admin/user/permission/set", controller.PermissionUserPermissionSet) + api.POST("/admin/user/role/list", controller.PermissionUserRoleList) // 玩家日志 api.POST("/log/user", controller.UserDetail) api.POST("/log/asset", controller.Asset) diff --git a/model/admin.go b/model/admin.go index c70be36..62e43ad 100644 --- a/model/admin.go +++ b/model/admin.go @@ -9,19 +9,23 @@ import ( ) type Admin struct { - ID int `json:"id" db:"id"` - Username string `json:"username" db:"username"` - Password string `json:"password" db:"password"` - Phone string `json:"phone" db:"phone"` - Email string `json:"email" db:"email"` - Token string `json:"token" db:"token"` - Group string `json:"group" db:"group"` - Status int `json:"status" db:"status"` - Expires int `json:"expires" db:"expires"` - Role int `json:"role" db:"role"` - CreateTime int `json:"createTime" db:"createTime"` - UpdateTime int `json:"updateTime" db:"updateTime"` - Remark string `json:"remark" db:"remark"` + ID int `json:"id" db:"id"` + Username string `json:"username" db:"username"` + Password string `json:"password" db:"password"` + RealName string `json:"real_name" db:"real_name"` + Nickname string `json:"nickname" db:"nickname"` + Phone string `json:"phone" db:"phone"` + Email string `json:"email" db:"email"` + Token string `json:"token" db:"token"` + Group string `json:"group" db:"group"` + Status int `json:"status" db:"status"` + Expires int `json:"expires" db:"expires"` + Role int `json:"role" db:"role"` + LastLoginTime int `json:"lastLoginTime" db:"lastLoginTime"` + LastLoginIP string `json:"lastLoginIp" db:"lastLoginIp"` + CreateTime int `json:"createTime" db:"createTime"` + UpdateTime int `json:"updateTime" db:"updateTime"` + Remark string `json:"remark" db:"remark"` } type AdminLog struct { @@ -157,7 +161,7 @@ func (a *Admin) GetAdmin(username string) error { if db == nil { return fmt.Errorf("failed to get database connection") } - return db.Get(a, "SELECT * FROM admin WHERE username = ?", username) + return db.Get(a, "SELECT `username`, `role`, `password`, `token`, `group`, `remark` FROM admin WHERE username = ?", username) } func InitToken() { @@ -197,6 +201,24 @@ var PermissionList = map[string][]string{ "/api/admin/list": {"super", "admin"}, "/api/admin/add": {"super"}, "/api/admin/log/list": {"super", "admin"}, + "/api/admin/usergroup/list": {"super", "admin"}, + "/api/admin/usergroup/add": {"super", "admin"}, + "/api/admin/usergroup/edit": {"super", "admin"}, + "/api/admin/usergroup/delete": {"super", "admin"}, + "/api/admin/usergroup/role/set": {"super", "admin"}, + "/api/admin/usergroup/role/list": {"super", "admin"}, + "/api/admin/role/list": {"super", "admin"}, + "/api/admin/role/add": {"super", "admin"}, + "/api/admin/role/edit": {"super", "admin"}, + "/api/admin/role/delete": {"super", "admin"}, + "/api/admin/role/permission/set": {"super", "admin"}, + "/api/admin/role/permission/list": {"super", "admin"}, + "/api/admin/permission/list": {"super", "admin"}, + "/api/admin/permission/add": {"super", "admin"}, + "/api/admin/permission/edit": {"super", "admin"}, + "/api/admin/permission/delete": {"super", "admin"}, + "/api/admin/user/group/list": {"super", "admin"}, + "/api/admin/user/group/set": {"super", "admin"}, "/api/log/user": {"super", "admin", "user"}, "/api/log/asset": {"super", "admin", "user"}, "/api/log/event": {"super", "admin", "user"}, diff --git a/model/mail.go b/model/mail.go index 2b7a098..f45d586 100644 --- a/model/mail.go +++ b/model/mail.go @@ -90,7 +90,7 @@ func (m *Mail) SendMail() error { } defer Db.Close() m.CreateTime = util.Now() - _, err = Db.Exec("INSERT INTO system_mail_info (`title`, `content`, `title_en`, `content_en`, `start_time`, `end_time`, `items`, `register_time`, `mail_type`, `send_type`, `to_uids`, `create_time`, `subTitle`, `subTitle_en`, `title_ptbr`,`content_ptbr`,`subTitle_ptbr`, `title_es_latam`, `subTitle_es_latam`, `content_es_latam`, `level`, `create_time`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.Title, m.Content, m.TitleEn, m.ContentEn, m.StartTime, m.EndTime, m.Items, m.RegisterTime, m.MailType, m.SendType, m.ToUids, m.CreateTime, m.SubTitle, m.SubTitleEn, m.TitlePtBr, m.ContentPtBr, m.SubTitlePtBr, m.TitleEsLatam, m.SubTitleEsLatam, m.ContentEsLatam, m.MinLevel, m.CreateTime) + _, err = Db.Exec("INSERT INTO system_mail_info (`title`, `content`, `title_en`, `content_en`, `start_time`, `end_time`, `items`, `register_time`, `mail_type`, `send_type`, `to_uids`, `create_time`, `subTitle`, `subTitle_en`, `title_ptbr`,`content_ptbr`,`subTitle_ptbr`, `title_es_latam`, `subTitle_es_latam`, `content_es_latam`, `level`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.Title, m.Content, m.TitleEn, m.ContentEn, m.StartTime, m.EndTime, m.Items, m.RegisterTime, m.MailType, m.SendType, m.ToUids, m.CreateTime, m.SubTitle, m.SubTitleEn, m.TitlePtBr, m.ContentPtBr, m.SubTitlePtBr, m.TitleEsLatam, m.SubTitleEsLatam, m.ContentEsLatam, m.MinLevel) if err != nil { return fmt.Errorf("failed to insert mail: %v", err) } diff --git a/model/permission.go b/model/permission.go new file mode 100644 index 0000000..eee1e95 --- /dev/null +++ b/model/permission.go @@ -0,0 +1,543 @@ +package model + +import ( + "backend/util" + "fmt" + "strings" +) + +type PermissionUserGroup struct { + ID int `json:"id" db:"id"` + GroupCode string `json:"group_code" db:"group_code"` + GroupName string `json:"group_name" db:"group_name"` + Status int `json:"status" db:"status"` + Remark string `json:"remark" db:"remark"` + CreateTime int `json:"createTime" db:"createTime"` + UpdateTime int `json:"updateTime" db:"updateTime"` +} + +type PermissionRole struct { + ID int `json:"id" db:"id"` + RoleCode string `json:"role_code" db:"role_code"` + RoleName string `json:"role_name" db:"role_name"` + Status int `json:"status" db:"status"` + IsSystem int `json:"is_system" db:"is_system"` + Remark string `json:"remark" db:"remark"` + CreateTime int `json:"createTime" db:"createTime"` + UpdateTime int `json:"updateTime" db:"updateTime"` +} + +type PermissionPoint struct { + ID int `json:"id" db:"id"` + PermissionCode string `json:"permission_code" db:"permission_code"` + PermissionName string `json:"permission_name" db:"permission_name"` + PermissionGroup string `json:"permission_group" db:"permission_group"` + APIPath string `json:"api_path" db:"api_path"` + HTTPMethod string `json:"http_method" db:"http_method"` + Status int `json:"status" db:"status"` + Remark string `json:"remark" db:"remark"` + CreateTime int `json:"createTime" db:"createTime"` + UpdateTime int `json:"updateTime" db:"updateTime"` +} + +type PermissionUserGroupListParams struct { + Page int `json:"page"` + PageSize int `json:"pageSize"` + GroupCode string `json:"group_code"` + GroupName string `json:"group_name"` +} + +type PermissionRoleListParams struct { + Page int `json:"page"` + PageSize int `json:"pageSize"` + RoleCode string `json:"role_code"` + RoleName string `json:"role_name"` +} + +type PermissionPointListParams struct { + Page int `json:"page"` + PageSize int `json:"pageSize"` + PermissionCode string `json:"permission_code"` + PermissionName string `json:"permission_name"` + PermissionGroup string `json:"permission_group"` +} + +func normalizePage(page, pageSize int) (int, int) { + if page <= 0 { + page = 1 + } + if pageSize <= 0 { + pageSize = 20 + } + return page, pageSize +} + +func ListPermissionUserGroups(params PermissionUserGroupListParams) ([]PermissionUserGroup, int, error) { + page, pageSize := normalizePage(params.Page, params.PageSize) + db := util.MPool.GetGameDB() + defer db.Close() + if db == nil { + return nil, 0, fmt.Errorf("failed to get database connection") + } + + whereParts := []string{"1=1"} + args := []interface{}{} + if params.GroupCode != "" { + whereParts = append(whereParts, "group_code LIKE ?") + args = append(args, "%"+params.GroupCode+"%") + } + if params.GroupName != "" { + whereParts = append(whereParts, "group_name LIKE ?") + args = append(args, "%"+params.GroupName+"%") + } + where := strings.Join(whereParts, " AND ") + + var total int + countArgs := append([]interface{}{}, args...) + if err := db.Get(&total, "SELECT COUNT(*) FROM admin_user_group WHERE "+where, countArgs...); err != nil { + return nil, 0, err + } + + list := []PermissionUserGroup{} + listArgs := append(args, pageSize, (page-1)*pageSize) + query := "SELECT id, group_code, group_name, status, remark, createTime, updateTime FROM admin_user_group WHERE " + where + " ORDER BY id DESC LIMIT ? OFFSET ?" + if err := db.Select(&list, query, listArgs...); err != nil { + return nil, 0, err + } + return list, total, nil +} + +func CreatePermissionUserGroup(item *PermissionUserGroup, admin string) error { + db := util.MPool.GetGameDB() + defer db.Close() + if db == nil { + return fmt.Errorf("failed to get database connection") + } + now := int(util.Now()) + item.CreateTime = now + item.UpdateTime = now + result, err := db.NamedExec("INSERT INTO admin_user_group (group_code, group_name, status, remark, create_admin, update_admin, createTime, updateTime) VALUES (:group_code, :group_name, :status, :remark, :create_admin, :update_admin, :createTime, :updateTime)", map[string]interface{}{ + "group_code": item.GroupCode, + "group_name": item.GroupName, + "status": item.Status, + "remark": item.Remark, + "create_admin": admin, + "update_admin": admin, + "createTime": item.CreateTime, + "updateTime": item.UpdateTime, + }) + if err != nil { + return err + } + id, err := result.LastInsertId() + if err == nil { + item.ID = int(id) + } + return nil +} + +func UpdatePermissionUserGroup(item *PermissionUserGroup, admin string) error { + db := util.MPool.GetGameDB() + defer db.Close() + if db == nil { + return fmt.Errorf("failed to get database connection") + } + item.UpdateTime = int(util.Now()) + _, err := db.NamedExec("UPDATE admin_user_group SET group_code = :group_code, group_name = :group_name, status = :status, remark = :remark, update_admin = :update_admin, updateTime = :updateTime WHERE id = :id", map[string]interface{}{ + "id": item.ID, + "group_code": item.GroupCode, + "group_name": item.GroupName, + "status": item.Status, + "remark": item.Remark, + "update_admin": admin, + "updateTime": item.UpdateTime, + }) + return err +} + +func DeletePermissionUserGroup(id int) error { + db := util.MPool.GetGameDB() + defer db.Close() + if db == nil { + return fmt.Errorf("failed to get database connection") + } + _, err := db.Exec("DELETE FROM admin_user_group WHERE id = ?", id) + return err +} + +func ListPermissionRoles(params PermissionRoleListParams) ([]PermissionRole, int, error) { + page, pageSize := normalizePage(params.Page, params.PageSize) + db := util.MPool.GetGameDB() + defer db.Close() + if db == nil { + return nil, 0, fmt.Errorf("failed to get database connection") + } + + whereParts := []string{"1=1"} + args := []interface{}{} + if params.RoleCode != "" { + whereParts = append(whereParts, "role_code LIKE ?") + args = append(args, "%"+params.RoleCode+"%") + } + if params.RoleName != "" { + whereParts = append(whereParts, "role_name LIKE ?") + args = append(args, "%"+params.RoleName+"%") + } + where := strings.Join(whereParts, " AND ") + + var total int + if err := db.Get(&total, "SELECT COUNT(*) FROM admin_role WHERE "+where, args...); err != nil { + return nil, 0, err + } + + list := []PermissionRole{} + listArgs := append(args, pageSize, (page-1)*pageSize) + query := "SELECT id, role_code, role_name, status, is_system, remark, createTime, updateTime FROM admin_role WHERE " + where + " ORDER BY id DESC LIMIT ? OFFSET ?" + if err := db.Select(&list, query, listArgs...); err != nil { + return nil, 0, err + } + return list, total, nil +} + +func CreatePermissionRole(item *PermissionRole, admin string) error { + db := util.MPool.GetGameDB() + defer db.Close() + if db == nil { + return fmt.Errorf("failed to get database connection") + } + now := int(util.Now()) + item.CreateTime = now + item.UpdateTime = now + result, err := db.NamedExec("INSERT INTO admin_role (role_code, role_name, status, is_system, remark, create_admin, update_admin, createTime, updateTime) VALUES (:role_code, :role_name, :status, :is_system, :remark, :create_admin, :update_admin, :createTime, :updateTime)", map[string]interface{}{ + "role_code": item.RoleCode, + "role_name": item.RoleName, + "status": item.Status, + "is_system": item.IsSystem, + "remark": item.Remark, + "create_admin": admin, + "update_admin": admin, + "createTime": item.CreateTime, + "updateTime": item.UpdateTime, + }) + if err != nil { + return err + } + id, err := result.LastInsertId() + if err == nil { + item.ID = int(id) + } + return nil +} + +func UpdatePermissionRole(item *PermissionRole, admin string) error { + db := util.MPool.GetGameDB() + defer db.Close() + if db == nil { + return fmt.Errorf("failed to get database connection") + } + item.UpdateTime = int(util.Now()) + _, err := db.NamedExec("UPDATE admin_role SET role_code = :role_code, role_name = :role_name, status = :status, is_system = :is_system, remark = :remark, update_admin = :update_admin, updateTime = :updateTime WHERE id = :id", map[string]interface{}{ + "id": item.ID, + "role_code": item.RoleCode, + "role_name": item.RoleName, + "status": item.Status, + "is_system": item.IsSystem, + "remark": item.Remark, + "update_admin": admin, + "updateTime": item.UpdateTime, + }) + return err +} + +func DeletePermissionRole(id int) error { + db := util.MPool.GetGameDB() + defer db.Close() + if db == nil { + return fmt.Errorf("failed to get database connection") + } + var isSystem int + if err := db.Get(&isSystem, "SELECT is_system FROM admin_role WHERE id = ?", id); err != nil { + return err + } + if isSystem == 1 { + return fmt.Errorf("system role cannot be deleted") + } + _, err := db.Exec("DELETE FROM admin_role WHERE id = ?", id) + return err +} + +func ListPermissionPoints(params PermissionPointListParams) ([]PermissionPoint, int, error) { + page, pageSize := normalizePage(params.Page, params.PageSize) + db := util.MPool.GetGameDB() + defer db.Close() + if db == nil { + return nil, 0, fmt.Errorf("failed to get database connection") + } + + whereParts := []string{"1=1"} + args := []interface{}{} + if params.PermissionCode != "" { + whereParts = append(whereParts, "permission_code LIKE ?") + args = append(args, "%"+params.PermissionCode+"%") + } + if params.PermissionName != "" { + whereParts = append(whereParts, "permission_name LIKE ?") + args = append(args, "%"+params.PermissionName+"%") + } + if params.PermissionGroup != "" { + whereParts = append(whereParts, "permission_group LIKE ?") + args = append(args, "%"+params.PermissionGroup+"%") + } + where := strings.Join(whereParts, " AND ") + + var total int + if err := db.Get(&total, "SELECT COUNT(*) FROM admin_permission WHERE "+where, args...); err != nil { + return nil, 0, err + } + + list := []PermissionPoint{} + listArgs := append(args, pageSize, (page-1)*pageSize) + query := "SELECT id, permission_code, permission_name, permission_group, api_path, http_method, status, remark, createTime, updateTime FROM admin_permission WHERE " + where + " ORDER BY id DESC LIMIT ? OFFSET ?" + if err := db.Select(&list, query, listArgs...); err != nil { + return nil, 0, err + } + return list, total, nil +} + +func CreatePermissionPoint(item *PermissionPoint, admin string) error { + db := util.MPool.GetGameDB() + defer db.Close() + if db == nil { + return fmt.Errorf("failed to get database connection") + } + now := int(util.Now()) + item.CreateTime = now + item.UpdateTime = now + result, err := db.NamedExec("INSERT INTO admin_permission (permission_code, permission_name, permission_group, api_path, http_method, status, remark, create_admin, update_admin, createTime, updateTime) VALUES (:permission_code, :permission_name, :permission_group, :api_path, :http_method, :status, :remark, :create_admin, :update_admin, :createTime, :updateTime)", map[string]interface{}{ + "permission_code": item.PermissionCode, + "permission_name": item.PermissionName, + "permission_group": item.PermissionGroup, + "api_path": item.APIPath, + "http_method": item.HTTPMethod, + "status": item.Status, + "remark": item.Remark, + "create_admin": admin, + "update_admin": admin, + "createTime": item.CreateTime, + "updateTime": item.UpdateTime, + }) + if err != nil { + return err + } + id, err := result.LastInsertId() + if err == nil { + item.ID = int(id) + } + return nil +} + +func UpdatePermissionPoint(item *PermissionPoint, admin string) error { + db := util.MPool.GetGameDB() + defer db.Close() + if db == nil { + return fmt.Errorf("failed to get database connection") + } + item.UpdateTime = int(util.Now()) + _, err := db.NamedExec("UPDATE admin_permission SET permission_code = :permission_code, permission_name = :permission_name, permission_group = :permission_group, api_path = :api_path, http_method = :http_method, status = :status, remark = :remark, update_admin = :update_admin, updateTime = :updateTime WHERE id = :id", map[string]interface{}{ + "id": item.ID, + "permission_code": item.PermissionCode, + "permission_name": item.PermissionName, + "permission_group": item.PermissionGroup, + "api_path": item.APIPath, + "http_method": item.HTTPMethod, + "status": item.Status, + "remark": item.Remark, + "update_admin": admin, + "updateTime": item.UpdateTime, + }) + return err +} + +func DeletePermissionPoint(id int) error { + db := util.MPool.GetGameDB() + defer db.Close() + if db == nil { + return fmt.Errorf("failed to get database connection") + } + _, err := db.Exec("DELETE FROM admin_permission WHERE id = ?", id) + return err +} + +func SetGroupRoles(groupID int, roleIDs []int, admin string) error { + db := util.MPool.GetGameDB() + defer db.Close() + if db == nil { + return fmt.Errorf("failed to get database connection") + } + tx, err := db.Begin() + if err != nil { + return err + } + defer tx.Rollback() + if _, err = tx.Exec("DELETE FROM admin_group_role_rel WHERE group_id = ?", groupID); err != nil { + return err + } + now := int(util.Now()) + for _, roleID := range roleIDs { + if _, err = tx.Exec("INSERT INTO admin_group_role_rel (group_id, role_id, create_admin, createTime) VALUES (?, ?, ?, ?)", groupID, roleID, admin, now); err != nil { + return err + } + } + return tx.Commit() +} + +func ListGroupRoles(groupID int) ([]PermissionRole, error) { + db := util.MPool.GetGameDB() + defer db.Close() + if db == nil { + return nil, fmt.Errorf("failed to get database connection") + } + list := []PermissionRole{} + query := "SELECT r.id, r.role_code, r.role_name, r.status, r.is_system, r.remark, r.createTime, r.updateTime FROM admin_role r INNER JOIN admin_group_role_rel rel ON rel.role_id = r.id WHERE rel.group_id = ? ORDER BY r.id DESC" + if err := db.Select(&list, query, groupID); err != nil { + return nil, err + } + return list, nil +} + +func SetRolePermissions(roleID int, permissionIDs []int, admin string) error { + db := util.MPool.GetGameDB() + defer db.Close() + if db == nil { + return fmt.Errorf("failed to get database connection") + } + tx, err := db.Begin() + if err != nil { + return err + } + defer tx.Rollback() + if _, err = tx.Exec("DELETE FROM admin_role_permission_rel WHERE role_id = ?", roleID); err != nil { + return err + } + now := int(util.Now()) + for _, permissionID := range permissionIDs { + if _, err = tx.Exec("INSERT INTO admin_role_permission_rel (role_id, permission_id, create_admin, createTime) VALUES (?, ?, ?, ?)", roleID, permissionID, admin, now); err != nil { + return err + } + } + return tx.Commit() +} + +func ListRolePermissions(roleID int) ([]PermissionPoint, error) { + db := util.MPool.GetGameDB() + defer db.Close() + if db == nil { + return nil, fmt.Errorf("failed to get database connection") + } + list := []PermissionPoint{} + query := "SELECT p.id, p.permission_code, p.permission_name, p.permission_group, p.api_path, p.http_method, p.status, p.remark, p.createTime, p.updateTime FROM admin_permission p INNER JOIN admin_role_permission_rel rel ON rel.permission_id = p.id WHERE rel.role_id = ? ORDER BY p.id DESC" + if err := db.Select(&list, query, roleID); err != nil { + return nil, err + } + return list, nil +} + +func SetUserGroups(adminID int, groupIDs []int, operator string) error { + db := util.MPool.GetGameDB() + defer db.Close() + if db == nil { + return fmt.Errorf("failed to get database connection") + } + tx, err := db.Begin() + if err != nil { + return err + } + defer tx.Rollback() + if _, err = tx.Exec("DELETE FROM admin_user_group_rel WHERE admin_id = ?", adminID); err != nil { + return err + } + now := int(util.Now()) + for _, groupID := range groupIDs { + if _, err = tx.Exec("INSERT INTO admin_user_group_rel (admin_id, group_id, create_admin, createTime) VALUES (?, ?, ?, ?)", adminID, groupID, operator, now); err != nil { + return err + } + } + return tx.Commit() +} + +func ListUserGroups(adminID int) ([]PermissionUserGroup, error) { + db := util.MPool.GetGameDB() + defer db.Close() + if db == nil { + return nil, fmt.Errorf("failed to get database connection") + } + list := []PermissionUserGroup{} + query := "SELECT g.id, g.group_code, g.group_name, g.status, g.remark, g.createTime, g.updateTime FROM admin_user_group g INNER JOIN admin_user_group_rel rel ON rel.group_id = g.id WHERE rel.admin_id = ? ORDER BY g.id DESC" + if err := db.Select(&list, query, adminID); err != nil { + return nil, err + } + return list, nil +} + +// UserPermissionItem 用户直接单点权限条目 +type UserPermissionItem struct { + PermissionID int `json:"permission_id" db:"permission_id"` + GrantType int `json:"grant_type" db:"grant_type"` // 1=允许 2=拒绝 +} + +func ListUserPermissions(adminID int) ([]UserPermissionItem, error) { + db := util.MPool.GetGameDB() + defer db.Close() + if db == nil { + return nil, fmt.Errorf("failed to get database connection") + } + list := []UserPermissionItem{} + query := "SELECT permission_id, grant_type FROM admin_user_permission_rel WHERE admin_id = ? ORDER BY permission_id ASC" + if err := db.Select(&list, query, adminID); err != nil { + return nil, err + } + return list, nil +} + +func SetUserPermissions(adminID int, permissions []UserPermissionItem, operator string) error { + db := util.MPool.GetGameDB() + defer db.Close() + if db == nil { + return fmt.Errorf("failed to get database connection") + } + tx, err := db.Begin() + if err != nil { + return err + } + defer tx.Rollback() + if _, err = tx.Exec("DELETE FROM admin_user_permission_rel WHERE admin_id = ?", adminID); err != nil { + return err + } + now := int(util.Now()) + for _, p := range permissions { + if _, err = tx.Exec("INSERT INTO admin_user_permission_rel (admin_id, permission_id, grant_type, create_admin, createTime) VALUES (?, ?, ?, ?, ?)", adminID, p.PermissionID, p.GrantType, operator, now); err != nil { + return err + } + } + return tx.Commit() +} + +// ListUserRoles 返回用户通过用户组继承的所有角色(去重) +func ListUserRoles(adminID int) ([]PermissionRole, error) { + db := util.MPool.GetGameDB() + defer db.Close() + if db == nil { + return nil, fmt.Errorf("failed to get database connection") + } + list := []PermissionRole{} + query := `SELECT DISTINCT r.id, r.role_code, r.role_name, r.status, r.is_system, r.remark, r.createTime, r.updateTime + FROM admin_role r + INNER JOIN admin_group_role_rel grr ON grr.role_id = r.id + INNER JOIN admin_user_group_rel ugr ON ugr.group_id = grr.group_id + WHERE ugr.admin_id = ? + ORDER BY r.id DESC` + if err := db.Select(&list, query, adminID); err != nil { + return nil, err + } + return list, nil +} diff --git a/monitor/Monitor.go b/monitor/Monitor.go index 5ff157a..1171587 100644 --- a/monitor/Monitor.go +++ b/monitor/Monitor.go @@ -8,6 +8,7 @@ import ( "backend/msg" "backend/util" "fmt" + "log" "net" "time" @@ -69,10 +70,11 @@ func monitorServerInfo() { if v.Status == 2 || v.Status == 3 { // 维护中或停用跳过 continue } - if v.AppId == 1 { + if v.AppId == 1 || v.AppId == 2 { // example condition, adjust as needed go func(v *Type.ServerInfo) { resp, err := client.GetServerInfo(v.AppId, v.ServerId, &msg.ReqServerInfo{}) if err != nil { + log.Printf("Failed to get server info for AppId=%d, ServerId=%d: %v", v.AppId, v.ServerId, err) return } tmpDb := util.MPool.GetGameDB()