From 1cfb517fc9ca3a61bffbfdd4c6ddb76e8b04b83b Mon Sep 17 00:00:00 2001 From: junleea <354425203@qq.com> Date: Thu, 21 Aug 2025 21:46:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=88=A0=E9=99=A4=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E4=BF=AE=E6=94=B9=E8=BF=90=E8=A1=8Csql?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dao/dbm.go | 37 +++++++++++++++++++++++++- handler/dbm.go | 58 +++++++++++++++++++++++++++++++++++++---- proto/dbm.go | 23 +++++++++++++++-- proto/status.go | 10 +++++--- service/dbmService.go | 60 ++++++++++++++++++++++++++++++++++++++++--- 5 files changed, 173 insertions(+), 15 deletions(-) diff --git a/dao/dbm.go b/dao/dbm.go index f25bde3..d7649df 100644 --- a/dao/dbm.go +++ b/dao/dbm.go @@ -111,6 +111,17 @@ func DeleteDBManageByID(id uint) error { return res.Error } +func DeleteDBManageByUserID(id uint) error { + var db2 *gorm.DB + if proto.Config.SERVER_SQL_LOG { + db2 = DB.Debug() + } else { + db2 = DB + } + res := db2.Where("user_id = ?", id).Delete(&proto.DBManage{}) + return res.Error +} + func FindDBRunHistoryByID(id uint) (proto.SQLRunHistory, error) { var history proto.SQLRunHistory var db2 *gorm.DB @@ -141,6 +152,28 @@ func FindDBRunHistoryByAuthID(auth_id int) ([]proto.SQLRunHistory, error) { return histories, nil } +func DelSQLRunHistoryByID(id uint) error { + var db2 *gorm.DB + if proto.Config.SERVER_SQL_LOG { + db2 = DB.Debug() + } else { + db2 = DB + } + res := db2.Where("id = ?", id).Delete(&proto.SQLRunHistory{}) + return res.Error +} + +func DelSQLRunHistoryByAuthID(auth_id int) error { + var db2 *gorm.DB + if proto.Config.SERVER_SQL_LOG { + db2 = DB.Debug() + } else { + db2 = DB + } + res := db2.Where("user_id = ?", auth_id).Delete(&proto.SQLRunHistory{}) + return res.Error +} + func FindAllSQLRunHistory() ([]proto.SQLRunHistory, error) { var histories []proto.SQLRunHistory var db2 *gorm.DB @@ -177,7 +210,9 @@ func RunSQLWithOrder(sql string, db_ *gorm.DB) (result proto.SQLResult, err erro if err != nil { return result, err } - result.Columns = columns // 保存列名顺序 + for _, col := range columns { + result.Columns = append(result.Columns, proto.SQLResultColumnsValue{Value: col}) + } // 遍历每行数据 for rows.Next() { diff --git a/handler/dbm.go b/handler/dbm.go index edac578..01c372a 100644 --- a/handler/dbm.go +++ b/handler/dbm.go @@ -10,12 +10,60 @@ import ( func SetDBManageGroup(router *gin.Engine) { dbm := router.Group("/dbm") - dbm.POST("/run_sql", RunSQLHandler) // 运行SQL语句 - dbm.POST("/create_db_manage", CreateDBManageHandler) // 创建数据库管理 - dbm.POST("/get_db_manage", GetDBManageHandler) // 获取数据库管理信息 - dbm.POST("/get_sql_history", GetSQLRunHistoryHandler) // 获取SQL运行历史 - dbm.POST("/update_db_manage", UpdateDBManageHandler) // 更新数据库管理信息 + dbm.POST("/run_sql", RunSQLHandler) // 运行SQL语句 + dbm.POST("/create_db_manage", CreateDBManageHandler) // 创建数据库管理 + dbm.POST("/get_db_manage", GetDBManageHandler) // 获取数据库管理信息 + dbm.POST("/get_sql_history", GetSQLRunHistoryHandler) // 获取SQL运行历史 + dbm.POST("/update_db_manage", UpdateDBManageHandler) // 更新数据库管理信息 + dbm.POST("/del_db_manage", DeleteDBManageHandler) // 删除数据库管理信息 + dbm.POST("/del_dbm_sql_history", DeleteSQLRunHistoryHandler) // 删除SQL运行历史 } + +func DeleteSQLRunHistoryHandler(c *gin.Context) { + id, _ := c.Get("id") + userID := int(id.(float64)) + + var req proto.DeleteDBManageSQLHistoryReq + var resp proto.GeneralResp + if err := c.ShouldBind(&req); err != nil { + resp.Code = proto.ParameterError + resp.Message = "请求参数解析错误" + } else { + err2 := service.DeleteSQLRunHistory(&req, userID) + if err2 != nil { + resp.Code = proto.SQLRunHistoryDeleteFailed + resp.Message = "删除SQL运行历史失败: " + err2.Error() + } else { + resp.Code = proto.SuccessCode + resp.Message = "删除SQL运行历史成功" + } + } + c.JSON(http.StatusOK, resp) + +} + +func DeleteDBManageHandler(c *gin.Context) { + id, _ := c.Get("id") + userID := int(id.(float64)) + + var req proto.DeleteDBManageReq + var resp proto.GeneralResp + if err := c.ShouldBind(&req); err != nil { + resp.Code = proto.ParameterError + resp.Message = "请求参数解析错误" + } else { + err2 := service.DeleteDBManage(&req, userID) + if err2 != nil { + resp.Code = proto.DBMDeleteFailed + resp.Message = "删除数据库管理失败: " + err2.Error() + } else { + resp.Code = proto.SuccessCode + resp.Message = "删除数据库管理成功" + } + } + c.JSON(http.StatusOK, resp) +} + func UpdateDBManageHandler(c *gin.Context) { id, _ := c.Get("id") userID := int(id.(float64)) diff --git a/proto/dbm.go b/proto/dbm.go index 744d245..5401de6 100644 --- a/proto/dbm.go +++ b/proto/dbm.go @@ -1,6 +1,8 @@ package proto -import "gorm.io/gorm" +import ( + "gorm.io/gorm" +) const ( DB_TYPE_MYSQL = 0 // DBTypeMySQL MySQL数据库 @@ -70,6 +72,23 @@ type GetSQLRunHistoryReq struct { // SQLResult 包含查询结果的列名顺序和对应数据 type SQLResult struct { - Columns []string // 列名顺序(与 SQL 查询的列顺序一致) + Columns []SQLResultColumnsValue // 列名顺序(与 SQL 查询的列顺序一致) Rows []map[string]interface{} // 每行数据(map 便于按列名访问) } + +type SQLResultColumnsValue struct { + Value string `json:"value"` +} + +type DeleteDBManageReq struct { + DB_ID uint `json:"db_id" form:"db_id"` // 数据库ID + Del_Type uint `json:"del_type" form:"del_type"` // 删除类型: 0为删除单条,1为所有 + UserID uint `json:"user_id" form:"user_id"` // 用户ID +} + +type DeleteDBManageSQLHistoryReq struct { + DB_ID uint `json:"db_id" form:"db_id"` // 数据库ID + Del_Type uint `json:"del_type" form:"del_type"` // 删除类型: 0为删除单条,1为所有 + History_ID uint `json:"history_id" form:"history_id"` // SQL执行历史ID,如果为0则删除所有 + UserID uint `json:"user_id" form:"user_id"` // 用户ID +} diff --git a/proto/status.go b/proto/status.go index b210bce..43c81ff 100644 --- a/proto/status.go +++ b/proto/status.go @@ -81,8 +81,10 @@ const ( SigningKeyVersionIsTooOld = 200 //下面是数据库管理工具-错误状态码 100x - DBMRunSQLFailed = 1001 // 执行SQL失败 - DBMCreateFailed = 1002 // 创建数据库管理失败 - DBMGetFailed = 1003 // 获取数据库管理信息失败` - DBMUpdateFailed = 1004 // 更新数据库管理信息失败 + DBMRunSQLFailed = 1001 // 执行SQL失败 + DBMCreateFailed = 1002 // 创建数据库管理失败 + DBMGetFailed = 1003 // 获取数据库管理信息失败` + DBMUpdateFailed = 1004 // 更新数据库管理信息失败 + DBMDeleteFailed = 1005 // 删除数据库管理信息失败 + DBMRunSQLHistoryDeleteFailed = 1006 // 删除SQL运行历史失败 ) diff --git a/service/dbmService.go b/service/dbmService.go index 7615af5..e1412ef 100644 --- a/service/dbmService.go +++ b/service/dbmService.go @@ -10,7 +10,7 @@ import ( "videoplayer/proto" ) -func RunSQL(req *proto.RunSQLRequest) ([]map[string]interface{}, error) { +func RunSQL(req *proto.RunSQLRequest) (*proto.SQLResult, error) { dbmInfo, err := dao.FindDBManageByID(req.DB_ID) if err != nil { @@ -23,7 +23,7 @@ func RunSQL(req *proto.RunSQLRequest) ([]map[string]interface{}, error) { if err != nil { return nil, err } - res, err := dao.RunSQL(req.SQL, db_) + res, err := dao.RunSQLWithOrder(req.SQL, db_) if err != nil { return nil, err } @@ -33,7 +33,7 @@ func RunSQL(req *proto.RunSQLRequest) ([]map[string]interface{}, error) { if err != nil { return nil, err } - return res, nil + return &res, nil } func GetGORMDBObject(dbmInfo *proto.DBManage) (db_ *gorm.DB, err error) { @@ -140,3 +140,57 @@ func UpdateDBManage(req *proto.UpdateDBManageReq, userID int) (proto.DBManage, e } return dbmInfo, nil } + +func DeleteDBManage(req *proto.DeleteDBManageReq, userId int) error { + user := GetUserByIDFromUserCenter(userId) + if req.Del_Type == 0 && req.DB_ID > 0 { + dbmInfo, err := dao.FindDBManageByID(req.DB_ID) + if err != nil { + return err + } + if dbmInfo.UserID != uint(req.UserID) && user.Role != "admin" { + return errors.New("unauthorized access to the database management system") + } + err = dao.DeleteDBManageByID(req.DB_ID) + if err != nil { + return err + } + } else if req.Del_Type == 1 && req.UserID > 0 { + if req.UserID != userId && user.Role != "admin" { + return errors.New("unauthorized access to delete all database management systems") + } + err := dao.DeleteDBManageByUserID(req.UserID) + if err != nil { + return err + } + } else { + return errors.New("invalid delete type or parameters") + } + return nil +} + +func DeleteSQLRunHistory(req *proto.DeleteDBManageSQLHistoryReq, userId int) error { + user := GetUserByIDFromUserCenter(userId) + if req.Del_Type == 0 && req.History_ID > 0 { + history, err := dao.FindDBRunHistoryByID(req.History_ID) + if err != nil { + return err + } + if history.UserID != uint(req.UserID) && user.Role != "admin" { + return errors.New("unauthorized access to the SQL run history") + } + err = dao.DelSQLRunHistoryByID(req.History_ID) + if err != nil { + return err + } + } else if Del_Type == 1 && req.UserID > 0 { + if req.UserID != userId && user.Role != "admin" { + return errors.New("unauthorized access to delete all SQL run history") + } + err := dao.DelSQLRunHistoryByAuthID(req.UserID) + return err + } else { + return errors.New("invalid delete type or parameters") + } + return nil +}