diff --git a/app/admin/apis/sys_menu.go b/app/admin/apis/sys_menu.go index 8d9a4865..9f211b93 100644 --- a/app/admin/apis/sys_menu.go +++ b/app/admin/apis/sys_menu.go @@ -95,7 +95,6 @@ func (e SysMenu) GetSysMenu(c *gin.Context) { e.OK(object, "查看成功") } - // InsertSysMenu 创建菜单 // @Summary 创建菜单 // @Description 获取JSON @@ -114,41 +113,34 @@ func (e SysMenu) GetSysMenu(c *gin.Context) { // @Security Bearer func (e SysMenu) InsertSysMenu(c *gin.Context) { control := new(dto.SysMenuControl) - - e.Context = c - log := e.GetLogger() - - db, err := e.GetOrm() + err := e.MakeContext(c). + MakeLogger(). + MakeOrm(). + Errors if err != nil { - log.Error(err) + e.Error(http.StatusInternalServerError, err, err.Error()) + e.Logger.Error(err) return } - //新增操作 - err = control.Bind(c) + // 绑定数据 + err = e.Bind(control) if err != nil { e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") return } - object, err := control.Generate() - if err != nil { - e.Error(http.StatusInternalServerError, err, "模型生成失败") - return - } + // 设置创建人 - object.SetCreateBy(user.GetUserId(c)) + control.SetCreateBy(user.GetUserId(c)) serviceSysMenu := service.SysMenu{} - serviceSysMenu.Orm = db - serviceSysMenu.Log = log - err = serviceSysMenu.InsertSysMenu(object) + err = serviceSysMenu.MakeLog(e.Logger).MakeOrm(e.Orm).InsertSysMenu(control).Error if err != nil { - log.Error(err) + e.Logger.Error(err) e.Error(http.StatusInternalServerError, err, "创建失败") return } - - e.OK(object.GetId(), "创建成功") + e.OK(control.GetId(), "创建成功") } // UpdateSysMenu 修改菜单 @@ -165,40 +157,37 @@ func (e SysMenu) InsertSysMenu(c *gin.Context) { // @Security Bearer func (e SysMenu) UpdateSysMenu(c *gin.Context) { control := new(dto.SysMenuControl) - - e.Context = c - log := e.GetLogger() - - db, err := e.GetOrm() + err := e.MakeContext(c). + MakeLogger(). + MakeOrm(). + Errors if err != nil { - log.Error(err) + e.Logger.Error(err) return } - //更新操作 - err = control.Bind(c) + // 绑定数据 + err = e.Bind(control) if err != nil { e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") return } - object, err := control.Generate() - if err != nil { - e.Error(http.StatusInternalServerError, err, "模型生成失败") - return - } - object.SetUpdateBy(user.GetUserId(c)) + control.SetUpdateBy(user.GetUserId(c)) serviceSysMenu := service.SysMenu{} - serviceSysMenu.Orm = db - serviceSysMenu.Log = log - err = serviceSysMenu.UpdateSysMenu(object) + err = serviceSysMenu. + MakeOrm(e.Orm). + MakeLog(e.Logger). + UpdateSysMenu(control).Error + if err != nil { - log.Error(err) + e.Logger.Error(err) return } - e.OK(object.GetId(), "更新成功") + e.OK(control.GetId(), "更新成功") } +// DeleteSysMenu 删除菜单 // @Summary 删除菜单 // @Description 删除数据 // @Tags 菜单 @@ -238,6 +227,7 @@ func (e SysMenu) DeleteSysMenu(c *gin.Context) { e.OK(control.GetId(), "删除成功") } +// GetMenuRole 根据角色名称获取菜单列表数据(左菜单使用) // @Summary 根据角色名称获取菜单列表数据(左菜单使用) // @Description 获取JSON // @Tags 菜单 @@ -268,6 +258,7 @@ func (e SysMenu) GetMenuRole(c *gin.Context) { e.OK(result, "") } +// GetMenuIDS 获取角色对应的菜单id数组 // @Summary 获取角色对应的菜单id数组 // @Description 获取JSON // @Tags 菜单 @@ -296,33 +287,7 @@ func (e SysMenu) GetMenuIDS(c *gin.Context) { e.OK(result, "") } -//// GetMenuTreeRoleselect 角色修改中的菜单列表 -//func (e SysMenu) GetMenuTreeRoleselect(c *gin.Context) { -// var Menu models.Menu -// var SysRole models.SysRole -// -// id, err := tools.StringToInt(c.Param("roleId")) -// SysRole.RoleId = id -// //var r *models.SysRole -// r, err := SysRole.Get() -// -// var result *[]models.MenuLable -// menuIds := make([]int, 0) -// if r.RoleKey != "admin" { -// result, err = Menu.SetMenuLabel() -// tools.HasError(err, "抱歉未找到相关信息", -1) -// if id != 0 { -// menuIds, err = SysRole.GetRoleMeunId() -// tools.HasError(err, "抱歉未找到相关信息", -1) -// } -// } -// app.Custum(c, gin.H{ -// "code": 200, -// "menus": result, -// "checkedKeys": menuIds, -// }) -//} - +// GetMenuTreeSelect 获取菜单树 // @Summary 获取菜单树 // @Description 获取JSON // @Tags 菜单 @@ -370,4 +335,4 @@ func (e SysMenu) GetMenuTreeSelect(c *gin.Context) { "menus": result, "checkedKeys": menuIds, }, "获取成功") -} \ No newline at end of file +} diff --git a/app/admin/service/dto/sys_menu.go b/app/admin/service/dto/sys_menu.go index 9823435c..4a0a5fc4 100644 --- a/app/admin/service/dto/sys_menu.go +++ b/app/admin/service/dto/sys_menu.go @@ -2,11 +2,11 @@ package dto import ( "encoding/json" - "go-admin/app/admin/models" - "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" "github.com/go-admin-team/go-admin-core/sdk/api" + "go-admin/app/admin/models" + common "go-admin/common/models" "go-admin/common/dto" ) @@ -58,6 +58,15 @@ type SysMenuControl struct { Sort int `form:"sort" comment:"排序"` //排序 Visible string `form:"visible" comment:"是否显示"` //是否显示 IsFrame string `form:"isFrame" comment:"是否frame"` //是否frame + common.ControlBy +} + +func (s *SysMenuControl) SetCreateBy(id int) { + s.CreateBy = id +} + +func (s *SysMenuControl) SetUpdateBy(id int) { + s.UpdateBy = id } // Bind 映射上下文中的结构体数据 @@ -82,26 +91,30 @@ func (s *SysMenuControl) Bind(ctx *gin.Context) error { } // Generate 结构体数据转化 从 Control 至 model 对应的模型 -func (s *SysMenuControl) Generate() (*models.SysMenu, error) { - return &models.SysMenu{ - MenuId: s.MenuId, - MenuName: s.MenuName, - Title: s.Title, - Icon: s.Icon, - Path: s.Path, - Paths: s.Paths, - MenuType: s.MenuType, - Action: s.Action, - SysApi: s.SysApi, - Permission: s.Permission, - ParentId: s.ParentId, - NoCache: s.NoCache, - Breadcrumb: s.Breadcrumb, - Component: s.Component, - Sort: s.Sort, - Visible: s.Visible, - IsFrame: s.IsFrame, - }, nil +func (s *SysMenuControl) Generate(model *models.SysMenu) { + model.MenuId = s.MenuId + model.MenuName = s.MenuName + model.Title = s.Title + model.Icon = s.Icon + model.Path = s.Path + model.Paths = s.Paths + model.MenuType = s.MenuType + model.Action = s.Action + model.SysApi = s.SysApi + model.Permission = s.Permission + model.ParentId = s.ParentId + model.NoCache = s.NoCache + model.Breadcrumb = s.Breadcrumb + model.Component = s.Component + model.Sort = s.Sort + model.Visible = s.Visible + model.IsFrame = s.IsFrame + if s.CreateBy != 0 { + model.CreateBy = s.CreateBy + } + if s.UpdateBy != 0 { + model.UpdateBy = s.UpdateBy + } } // GetId 获取数据对应的ID @@ -155,4 +168,4 @@ type MenuRole struct { type SelectRole struct { RoleId int `uri:"roleId"` -} \ No newline at end of file +} diff --git a/app/admin/service/sys_menu.go b/app/admin/service/sys_menu.go index 1c802dfe..594d1443 100644 --- a/app/admin/service/sys_menu.go +++ b/app/admin/service/sys_menu.go @@ -2,18 +2,33 @@ package service import ( "errors" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + "github.com/go-admin-team/go-admin-core/sdk/pkg/logger" + "gorm.io/gorm" + "go-admin/app/admin/models" "go-admin/app/admin/service/dto" cDto "go-admin/common/dto" "go-admin/common/service" - "gorm.io/gorm" ) type SysMenu struct { service.Service } +// MakeOrm 设置ORM +func (e *SysMenu) MakeOrm(orm *gorm.DB) *SysMenu { + e.Orm = orm + return e +} + +// MakeLog 设置Log +func (e *SysMenu) MakeLog(l *logger.Logger) *SysMenu { + e.Log = l + return e +} + // GetSysMenuPage 获取SysMenu列表 func (e *SysMenu) GetSysMenuPage(c *dto.SysMenuSearch) (*[]models.SysMenu, error) { var m = make([]models.SysMenu, 0) @@ -73,17 +88,16 @@ func (e *SysMenu) GetSysMenu(d *dto.SysMenuById, model *models.SysMenu) error { } // InsertSysMenu 创建SysMenu对象 -func (e *SysMenu) InsertSysMenu(model *models.SysMenu) error { +func (e *SysMenu) InsertSysMenu(c *dto.SysMenuControl) *SysMenu { var err error var data models.SysMenu - - err = e.Orm.Model(&data). - Create(model).Error + c.Generate(&data) + err = e.Orm.Create(&data).Error if err != nil { e.Log.Errorf("db error:%s", err) - return err + _ = e.AddError(err) } - return nil + return e } func (e *SysMenu) initPaths(menu *models.SysMenu) error { @@ -105,20 +119,23 @@ func (e *SysMenu) initPaths(menu *models.SysMenu) error { } // UpdateSysMenu 修改SysMenu对象 -func (e *SysMenu) UpdateSysMenu(c *models.SysMenu) error { +func (e *SysMenu) UpdateSysMenu(c *dto.SysMenuControl) *SysMenu { var err error - - db := e.Orm.Session(&gorm.Session{FullSaveAssociations: true}).Debug().Save(c) + model := models.SysMenu{} + e.Orm.First(&model, c.GetId()) + c.Generate(&model) + db := e.Orm.Session(&gorm.Session{FullSaveAssociations: true}).Debug().Save(&model) if db.Error != nil { e.Log.Errorf("db error:%s", err) - return err + _ = e.AddError(err) + return e } if db.RowsAffected == 0 { - return errors.New("无权更新该数据") - + e.AddError(errors.New("无权更新该数据")) + return e } - return nil -} + return e +} // RemoveSysMenu 删除SysMenu func (e *SysMenu) RemoveSysMenu(d *dto.SysMenuById) error { @@ -303,4 +320,4 @@ func (e *SysMenu) getByRoleName(roleName string) (Menus []models.SysMenu, err er return } return -} \ No newline at end of file +} diff --git a/common/apis/api.go b/common/apis/api.go index 509d1a75..6d6cf322 100644 --- a/common/apis/api.go +++ b/common/apis/api.go @@ -1,12 +1,13 @@ package apis import ( + "errors" "fmt" - "github.com/go-admin-team/go-admin-core/sdk/api" + "github.com/gin-gonic/gin/binding" "net/http" "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" + "github.com/go-admin-team/go-admin-core/sdk/api" "github.com/go-admin-team/go-admin-core/sdk/pkg" "github.com/go-admin-team/go-admin-core/sdk/pkg/logger" "github.com/go-admin-team/go-admin-core/sdk/pkg/response" @@ -16,13 +17,26 @@ import ( type Api struct { Context *gin.Context Logger *logger.Logger + Orm *gorm.DB + Errors error +} + +func (e *Api) AddError(err error) error { + if e.Errors == nil { + e.Errors = err + } else if err != nil { + e.Logger.Error(err) + e.Errors = fmt.Errorf("%v; %w", e.Error, err) + } + return e.Errors } // MakeContext 设置http上下文 -func (e *Api) MakeContext(c *gin.Context) { +func (e *Api) MakeContext(c *gin.Context) *Api { fmt.Println(&c) e.Context = c fmt.Println(&e.Context) + return e } // GetLogger 获取上下文提供的日志 @@ -32,6 +46,9 @@ func (e Api) GetLogger() *logger.Logger { func (e Api) Bind(d interface{}, bindings ...binding.Binding) error { var err error + if len(bindings) == 0 { + bindings = append(bindings, binding.JSON, nil) + } for i := range bindings { switch bindings[i] { case binding.JSON: @@ -74,6 +91,30 @@ func (e Api) GetOrm() (*gorm.DB, error) { return db, nil } +// MakeLogger 设置上下文提供的日志 +func (e *Api) MakeLogger() *Api { + e.Logger = api.GetRequestLogger(e.Context) + return e +} + +// MakeOrm 设置Orm DB +func (e *Api) MakeOrm() *Api { + var err error + if e.Logger == nil { + err = errors.New("at MakeOrm logger is nil") + //e.Logger.Error(http.StatusInternalServerError, err, "at MakeOrm logger is nil") + _ = e.AddError(err) + return e + } + db, err := pkg.GetOrm(e.Context) + if err != nil { + e.Logger.Error(http.StatusInternalServerError, err, "数据库连接获取失败") + _ = e.AddError(err) + } + e.Orm = db + return e +} + // Error 通常错误数据处理 func (e Api) Error(code int, err error, msg string) { response.Error(e.Context, code, err, msg) @@ -92,4 +133,4 @@ func (e Api) PageOK(result interface{}, count int, pageIndex int, pageSize int, // Custom 兼容函数 func (e Api) Custom(data gin.H) { response.Custum(e.Context, data) -} \ No newline at end of file +} diff --git a/common/service/service.go b/common/service/service.go index 87e0cd66..a748aab6 100644 --- a/common/service/service.go +++ b/common/service/service.go @@ -1,6 +1,7 @@ package service import ( + "fmt" "github.com/go-admin-team/go-admin-core/sdk/pkg/logger" "gorm.io/gorm" ) @@ -10,4 +11,14 @@ type Service struct { Msg string MsgID string Log *logger.Logger + Error error +} + +func (db *Service) AddError(err error) error { + if db.Error == nil { + db.Error = err + } else if err != nil { + db.Error = fmt.Errorf("%v; %w", db.Error, err) + } + return db.Error }