diff --git a/app/http/controllers/plugins/mysql57/mysql57_controller.go b/app/http/controllers/plugins/mysql57/mysql57_controller.go index dfc85c7a..1efc35f8 100644 --- a/app/http/controllers/plugins/mysql57/mysql57_controller.go +++ b/app/http/controllers/plugins/mysql57/mysql57_controller.go @@ -187,7 +187,7 @@ func (c *Mysql57Controller) Load(ctx http.Context) http.Response { return controllers.Error(ctx, http.StatusInternalServerError, "获取MySQL负载失败") } - data := make(map[int]map[string]string) + var data []map[string]string expressions := []struct { regex string name string @@ -212,16 +212,18 @@ func (c *Mysql57Controller) Load(ctx http.Context) http.Response { {`Table_locks_waited\s+\|\s+(\d+)\s+\|`, "锁表次数"}, } - for i, expression := range expressions { + for _, expression := range expressions { re := regexp.MustCompile(expression.regex) matches := re.FindStringSubmatch(raw) if len(matches) > 1 { - data[i] = make(map[string]string) - data[i] = map[string]string{"name": expression.name, "value": matches[1]} + d := make(map[string]string) + d = map[string]string{"name": expression.name, "value": matches[1]} if expression.name == "发送" || expression.name == "接收" { - data[i]["value"] = tools.FormatBytes(cast.ToFloat64(matches[1])) + d["value"] = tools.FormatBytes(cast.ToFloat64(matches[1])) } + + data = append(data, d) } } @@ -527,7 +529,7 @@ func (c *Mysql57Controller) DeleteBackup(ctx http.Context) http.Response { } validator, err := ctx.Request().Validate(map[string]string{ - "name": "required|min_len:1|max_len:255", + "backup": "required|min_len:1|max_len:255", }) if err != nil { return controllers.Error(ctx, http.StatusBadRequest, err.Error()) @@ -537,7 +539,7 @@ func (c *Mysql57Controller) DeleteBackup(ctx http.Context) http.Response { } backupPath := c.setting.Get(models.SettingKeyBackupPath) + "/mysql" - fileName := ctx.Request().Input("name") + fileName := ctx.Request().Input("backup") tools.Remove(backupPath + "/" + fileName) return controllers.Success(ctx, "删除备份成功") @@ -551,7 +553,7 @@ func (c *Mysql57Controller) RestoreBackup(ctx http.Context) http.Response { } validator, err := ctx.Request().Validate(map[string]string{ - "name": "required|min_len:1|max_len:255", + "backup": "required|min_len:1|max_len:255", "database": "required|min_len:1|max_len:255|regex:^[a-zA-Z][a-zA-Z0-9_]+$|not_in:information_schema,mysql,performance_schema,sys", }) if err != nil { @@ -561,7 +563,7 @@ func (c *Mysql57Controller) RestoreBackup(ctx http.Context) http.Response { return controllers.Error(ctx, http.StatusBadRequest, validator.Errors().One()) } - err = c.backup.MysqlRestore(ctx.Request().Input("database"), ctx.Request().Input("name")) + err = c.backup.MysqlRestore(ctx.Request().Input("database"), ctx.Request().Input("backup")) if err != nil { facades.Log().Error("[MYSQL57] 还原失败:" + err.Error()) return controllers.Error(ctx, http.StatusInternalServerError, "还原失败: "+err.Error()) diff --git a/app/http/controllers/plugins/mysql80/mysql80_controller.go b/app/http/controllers/plugins/mysql80/mysql80_controller.go index 1f8e7218..03efbdda 100644 --- a/app/http/controllers/plugins/mysql80/mysql80_controller.go +++ b/app/http/controllers/plugins/mysql80/mysql80_controller.go @@ -187,7 +187,7 @@ func (c *Mysql80Controller) Load(ctx http.Context) http.Response { return controllers.Error(ctx, http.StatusInternalServerError, "获取MySQL负载失败") } - data := make(map[int]map[string]string) + var data []map[string]string expressions := []struct { regex string name string @@ -212,16 +212,18 @@ func (c *Mysql80Controller) Load(ctx http.Context) http.Response { {`Table_locks_waited\s+\|\s+(\d+)\s+\|`, "锁表次数"}, } - for i, expression := range expressions { + for _, expression := range expressions { re := regexp.MustCompile(expression.regex) matches := re.FindStringSubmatch(raw) if len(matches) > 1 { - data[i] = make(map[string]string) - data[i] = map[string]string{"name": expression.name, "value": matches[1]} + d := make(map[string]string) + d = map[string]string{"name": expression.name, "value": matches[1]} if expression.name == "发送" || expression.name == "接收" { - data[i]["value"] = tools.FormatBytes(cast.ToFloat64(matches[1])) + d["value"] = tools.FormatBytes(cast.ToFloat64(matches[1])) } + + data = append(data, d) } } @@ -527,7 +529,7 @@ func (c *Mysql80Controller) DeleteBackup(ctx http.Context) http.Response { } validator, err := ctx.Request().Validate(map[string]string{ - "name": "required|min_len:1|max_len:255", + "backup": "required|min_len:1|max_len:255", }) if err != nil { return controllers.Error(ctx, http.StatusBadRequest, err.Error()) @@ -537,7 +539,7 @@ func (c *Mysql80Controller) DeleteBackup(ctx http.Context) http.Response { } backupPath := c.setting.Get(models.SettingKeyBackupPath) + "/mysql" - fileName := ctx.Request().Input("name") + fileName := ctx.Request().Input("backup") tools.Remove(backupPath + "/" + fileName) return controllers.Success(ctx, "删除备份成功") @@ -551,7 +553,7 @@ func (c *Mysql80Controller) RestoreBackup(ctx http.Context) http.Response { } validator, err := ctx.Request().Validate(map[string]string{ - "name": "required|min_len:1|max_len:255", + "backup": "required|min_len:1|max_len:255", "database": "required|min_len:1|max_len:255|regex:^[a-zA-Z][a-zA-Z0-9_]+$|not_in:information_schema,mysql,performance_schema,sys", }) if err != nil { @@ -561,7 +563,7 @@ func (c *Mysql80Controller) RestoreBackup(ctx http.Context) http.Response { return controllers.Error(ctx, http.StatusBadRequest, validator.Errors().One()) } - err = c.backup.MysqlRestore(ctx.Request().Input("database"), ctx.Request().Input("name")) + err = c.backup.MysqlRestore(ctx.Request().Input("database"), ctx.Request().Input("backup")) if err != nil { facades.Log().Error("[MYSQL80] 还原失败:" + err.Error()) return controllers.Error(ctx, http.StatusInternalServerError, "还原失败: "+err.Error()) diff --git a/app/http/controllers/task_controller.go b/app/http/controllers/task_controller.go index 1b1880d3..6f627cdd 100644 --- a/app/http/controllers/task_controller.go +++ b/app/http/controllers/task_controller.go @@ -34,16 +34,13 @@ func (r *TaskController) Status(ctx http.Context) http.Response { // List 获取任务列表 func (r *TaskController) List(ctx http.Context) http.Response { - status := ctx.Request().Query("status") - if len(status) == 0 { - status = models.TaskStatusWaiting - } - var tasks []models.Task var total int64 - err := facades.Orm().Query().Where("status", status).Paginate(ctx.Request().QueryInt("page"), ctx.Request().QueryInt("limit"), &tasks, &total) + err := facades.Orm().Query().Paginate(ctx.Request().QueryInt("page", 1), ctx.Request().QueryInt("limit", 10), &tasks, &total) if err != nil { - facades.Log().Error("[面板][TaskController] 查询任务列表失败 ", err) + facades.Log().With(map[string]any{ + "error": err.Error(), + }).Error("[面板][TaskController] 查询任务列表失败") return Error(ctx, http.StatusInternalServerError, "系统内部错误") } @@ -58,11 +55,14 @@ func (r *TaskController) Log(ctx http.Context) http.Response { var task models.Task err := facades.Orm().Query().Where("id", ctx.Request().QueryInt("id")).FirstOrFail(&task) if err != nil { - facades.Log().Error("[面板][TaskController] 查询任务失败 ", err) + facades.Log().With(map[string]any{ + "id": ctx.Request().QueryInt("id"), + "error": err.Error(), + }).Error("[面板][TaskController] 查询任务失败") return Error(ctx, http.StatusInternalServerError, "系统内部错误") } - log := tools.Exec("tail -n 30 " + task.Log) + log := tools.Read(task.Log) return Success(ctx, log) } @@ -72,7 +72,10 @@ func (r *TaskController) Delete(ctx http.Context) http.Response { var task models.Task _, err := facades.Orm().Query().Where("id", ctx.Request().Input("id")).Delete(&task) if err != nil { - facades.Log().Error("[面板][TaskController] 删除任务失败 ", err) + facades.Log().With(map[string]any{ + "id": ctx.Request().QueryInt("id"), + "error": err.Error(), + }).Error("[面板][TaskController] 删除任务失败") return Error(ctx, http.StatusInternalServerError, "系统内部错误") } diff --git a/app/http/controllers/website_controller.go b/app/http/controllers/website_controller.go index 37940194..8b2e13f8 100644 --- a/app/http/controllers/website_controller.go +++ b/app/http/controllers/website_controller.go @@ -30,8 +30,8 @@ func NewWebsiteController() *WebsiteController { // List 网站列表 func (c *WebsiteController) List(ctx http.Context) http.Response { - limit := ctx.Request().QueryInt("limit") - page := ctx.Request().QueryInt("page") + limit := ctx.Request().QueryInt("limit", 10) + page := ctx.Request().QueryInt("page", 1) total, websites, err := c.website.List(page, limit) if err != nil { diff --git a/config/panel.go b/config/panel.go index 6a739e1a..a84ef221 100644 --- a/config/panel.go +++ b/config/panel.go @@ -8,6 +8,6 @@ func init() { config := facades.Config() config.Add("panel", map[string]any{ "name": "耗子Linux面板", - "version": "v2.1.1", + "version": "v2.1.3", }) } diff --git a/routes/plugin.go b/routes/plugin.go index 2ea9468b..6a80a8c3 100644 --- a/routes/plugin.go +++ b/routes/plugin.go @@ -54,19 +54,19 @@ func Plugin() { route.Post("clearSlowLog", mysql57Controller.ClearSlowLog) route.Get("rootPassword", mysql57Controller.GetRootPassword) route.Post("rootPassword", mysql57Controller.SetRootPassword) - route.Get("database", mysql57Controller.DatabaseList) - route.Post("addDatabase", mysql57Controller.AddDatabase) - route.Post("deleteDatabase", mysql57Controller.DeleteDatabase) - route.Get("backup", mysql57Controller.BackupList) - route.Post("createBackup", mysql57Controller.CreateBackup) - route.Post("uploadBackup", mysql57Controller.UploadBackup) - route.Post("deleteBackup", mysql57Controller.DeleteBackup) - route.Post("restoreBackup", mysql57Controller.RestoreBackup) - route.Get("user", mysql57Controller.UserList) - route.Post("addUser", mysql57Controller.AddUser) - route.Post("deleteUser", mysql57Controller.DeleteUser) - route.Post("userPassword", mysql57Controller.SetUserPassword) - route.Post("userPrivileges", mysql57Controller.SetUserPrivileges) + route.Get("databases", mysql57Controller.DatabaseList) + route.Post("databases", mysql57Controller.AddDatabase) + route.Delete("databases", mysql57Controller.DeleteDatabase) + route.Get("backups", mysql57Controller.BackupList) + route.Post("backups", mysql57Controller.CreateBackup) + route.Put("backups", mysql57Controller.UploadBackup) + route.Delete("backups", mysql57Controller.DeleteBackup) + route.Post("backups/restore", mysql57Controller.RestoreBackup) + route.Get("users", mysql57Controller.UserList) + route.Post("users", mysql57Controller.AddUser) + route.Delete("users", mysql57Controller.DeleteUser) + route.Post("users/password", mysql57Controller.SetUserPassword) + route.Post("users/privileges", mysql57Controller.SetUserPrivileges) }) facades.Route().Prefix("api/plugins/mysql80").Middleware(middleware.Jwt()).Group(func(route route.Router) { mysql80Controller := mysql80.NewMysql80Controller() @@ -84,19 +84,19 @@ func Plugin() { route.Post("clearSlowLog", mysql80Controller.ClearSlowLog) route.Get("rootPassword", mysql80Controller.GetRootPassword) route.Post("rootPassword", mysql80Controller.SetRootPassword) - route.Get("database", mysql80Controller.DatabaseList) - route.Post("addDatabase", mysql80Controller.AddDatabase) - route.Post("deleteDatabase", mysql80Controller.DeleteDatabase) - route.Get("backup", mysql80Controller.BackupList) - route.Post("createBackup", mysql80Controller.CreateBackup) - route.Post("uploadBackup", mysql80Controller.UploadBackup) - route.Post("deleteBackup", mysql80Controller.DeleteBackup) - route.Post("restoreBackup", mysql80Controller.RestoreBackup) - route.Get("user", mysql80Controller.UserList) - route.Post("addUser", mysql80Controller.AddUser) - route.Post("deleteUser", mysql80Controller.DeleteUser) - route.Post("userPassword", mysql80Controller.SetUserPassword) - route.Post("userPrivileges", mysql80Controller.SetUserPrivileges) + route.Get("databases", mysql80Controller.DatabaseList) + route.Post("databases", mysql80Controller.AddDatabase) + route.Delete("databases", mysql80Controller.DeleteDatabase) + route.Get("backups", mysql80Controller.BackupList) + route.Post("backups", mysql80Controller.CreateBackup) + route.Put("backups", mysql80Controller.UploadBackup) + route.Delete("backups", mysql80Controller.DeleteBackup) + route.Post("backups/restore", mysql80Controller.RestoreBackup) + route.Get("users", mysql80Controller.UserList) + route.Post("users", mysql80Controller.AddUser) + route.Delete("users", mysql80Controller.DeleteUser) + route.Post("users/password", mysql80Controller.SetUserPassword) + route.Post("users/privileges", mysql80Controller.SetUserPrivileges) }) facades.Route().Prefix("api/plugins/postgresql15").Middleware(middleware.Jwt()).Group(func(route route.Router) { postgresql15Controller := postgresql15.NewPostgresql15Controller()