diff --git a/api/controller/menu.go b/api/controller/menu.go index bfed8d0..2d3f478 100644 --- a/api/controller/menu.go +++ b/api/controller/menu.go @@ -81,3 +81,54 @@ func (r *Menu) AddMenu(c *gin.Context) { responses.Ok(c) return } + +// PutMenu 修改菜单 +func (r *Menu) PutMenu(c *gin.Context) { + if err := c.ShouldBindJSON(&MenuRequest.PutMenu); err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 参数验证 + if err := global.Validate.Struct(MenuRequest.PutMenu); err != nil { + responses.FailWithMessage(utils.Translate(err), c) + return + } + + // 处理参数 + if MenuRequest.AddMenu.MenuType == 1 || MenuRequest.AddMenu.MenuType == 2 { + // 模块-菜单 + if MenuRequest.AddMenu.Path == "" { + responses.FailWithMessage("请填写页面地址", c) + return + } + + if MenuRequest.AddMenu.Component == "" { + responses.FailWithMessage("请填写组件名称", c) + return + } + } + + // 非模块无父级 + if MenuRequest.AddMenu.ParentId == 0 && MenuRequest.AddMenu.MenuType != 1 { + responses.FailWithMessage("请选择父节点", c) + return + } + + // 模块存在父级 + if MenuRequest.AddMenu.ParentId != 0 && MenuRequest.AddMenu.MenuType == 1 { + responses.FailWithMessage("顶级菜单,无法添加上级菜单", c) + return + } + + // 业务处理 + MenuService := service.MenuService{} + _, err := MenuService.PutMenu(MenuRequest.PutMenu) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.Ok(c) + return +} diff --git a/api/controller/role.go b/api/controller/role.go index ed571b3..6af49df 100644 --- a/api/controller/role.go +++ b/api/controller/role.go @@ -215,3 +215,26 @@ func (r *Role) PutRole(c *gin.Context) { } responses.Ok(c) } + +// DeleteRole 删除角色-批量 +func (r *Role) DeleteRole(c *gin.Context) { + if err := c.ShouldBindJSON(&RoleRequest.DeleteRole); err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 参数验证 + if err := global.Validate.Struct(RoleRequest.DeleteRole); err != nil { + responses.FailWithMessage(utils.Translate(err), c) + return + } + + // 业务处理 + RoleService := service.RoleService{} + _, err := RoleService.DeleteRole(c, RoleRequest.DeleteRole) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + responses.Ok(c) +} diff --git a/api/dao/adminRole.go b/api/dao/adminRole.go index 60c66e8..5a7aa0d 100644 --- a/api/dao/adminRole.go +++ b/api/dao/adminRole.go @@ -66,3 +66,11 @@ func (r *AdminRoleDao) EditAdminRoleById(tx *gorm.DB, roleId int64, data interfa } return nil } + +// DeleteAdminRoleByRoleId 删除角色 +func (r *AdminRoleDao) DeleteAdminRoleByRoleId(tx *gorm.DB, roleId int64) error { + if err := tx.Delete(&model.AdminRole{}, roleId).Error; err != nil { + return err + } + return nil +} diff --git a/api/dao/adminUser.go b/api/dao/adminUser.go index d0953a3..b8bafe4 100644 --- a/api/dao/adminUser.go +++ b/api/dao/adminUser.go @@ -1,6 +1,7 @@ package dao import ( + "gorm.io/gorm" "hospital-admin-api/api/model" "hospital-admin-api/global" ) @@ -26,3 +27,39 @@ func (r *AdminUserDao) GetAdminUserFirstByAccess(username string) (m *model.Admi } return m, nil } + +// DeleteAdminUser 删除用户 +func (r *AdminUserDao) DeleteAdminUser(tx *gorm.DB, maps interface{}) error { + err := tx.Where(maps).Delete(&model.AdminUser{}).Error + if err != nil { + return err + } + return nil +} + +// EditAdminUser 修改用户 +func (r *AdminUserDao) EditAdminUser(tx *gorm.DB, maps interface{}, data interface{}) error { + err := tx.Model(&model.AdminUser{}).Where(maps).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// EditAdminUserById 修改角色-用户id +func (r *AdminUserDao) EditAdminUserById(tx *gorm.DB, userId int64, data interface{}) error { + err := tx.Model(&model.AdminUser{}).Where("user_id = ?", userId).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetAdminUserList 获取用户列表 +func (r *AdminUserDao) GetAdminUserList(maps interface{}) (m []*model.AdminUser, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/middlewares/auth.go b/api/middlewares/auth.go index d63c097..2d52824 100644 --- a/api/middlewares/auth.go +++ b/api/middlewares/auth.go @@ -50,11 +50,17 @@ func Auth() gin.HandlerFunc { return } + if adminUser.RoleID == 0 { + responses.FailWithMessage("用户角色错误", c) + c.Abort() + return + } + // 获取角色数据 AdminRoleDao := dao.AdminRoleDao{} adminRole, err := AdminRoleDao.GetAdminRoleFirstById(roleId) if err != nil || adminRole == nil { - responses.FailWithMessage("用户数据错误", c) + responses.FailWithMessage("角色错误", c) c.Abort() return } diff --git a/api/requests/menu.go b/api/requests/menu.go index 0e9869f..a91d707 100644 --- a/api/requests/menu.go +++ b/api/requests/menu.go @@ -2,6 +2,7 @@ package requests type MenuRequest struct { AddMenu // 新增菜单 + PutMenu // 修改菜单 } // AddMenu 新增菜单 @@ -18,3 +19,18 @@ type AddMenu struct { Component string `json:"component" form:"component" label:"组件名称"` // 组件名称-按钮不需要 ApiIds []int64 `json:"api_ids" form:"api_ids" label:"接口"` // 接口ids } + +// PutMenu 修改菜单 +type PutMenu struct { + MenuName string `json:"menu_name" form:"menu_name" validate:"required" label:"菜单名称"` + MenuTitle string `json:"menu_title" form:"menu_title" validate:"required" label:"菜单名称"` + ParentId int64 `json:"parent_id" form:"parent_id" validate:"required,numeric" label:"父菜单ID"` // (0表示一级) + MenuStatus int `json:"menu_status" form:"menu_status" validate:"oneof=0 1" label:"菜单状态"` // (0:隐藏 1:正常)此优先级最高 + MenuType int `json:"menu_type" form:"menu_type" validate:"required,oneof=1 2 3" label:"菜单类型"` // 菜单类型(1:模块 2:菜单 3:按钮) + Permission string `json:"permission" form:"permission" label:"标识"` // 标识 + OrderNum int `json:"order_num" form:"order_num" validate:"numeric" label:"显示顺序"` // 显示顺序 + Icon string `json:"icon" form:"icon" label:"图标地址"` // 图标地址 + Path string `json:"path" form:"path" label:"页面地址"` // 页面地址(#表示当前页)-按钮不需要 + Component string `json:"component" form:"component" label:"组件名称"` // 组件名称-按钮不需要 + ApiIds []int64 `json:"api_ids" form:"api_ids" label:"接口"` // 接口ids +} diff --git a/api/requests/role.go b/api/requests/role.go index 2b0b5ef..037159d 100644 --- a/api/requests/role.go +++ b/api/requests/role.go @@ -5,6 +5,7 @@ type RoleRequest struct { PutRoleStatus // 角色禁用/启用 AddRole // 新增角色 PutRole // 修改角色 + DeleteRole // 修改角色 } // GetRoleList 获取角色列表 @@ -32,3 +33,8 @@ type PutRole struct { IsAdmin int `json:"is_admin" form:"is_admin" validate:"oneof=0 1" label:"是否管理员"` // (0:否 1:是) MenuIds []int64 `json:"menu_ids" form:"menu_ids" validate:"required" label:"菜单"` } + +// DeleteRole 删除角色 +type DeleteRole struct { + RoleIds []int64 `json:"role_ids" form:"role_ids" validate:"required" label:"角色id"` +} diff --git a/api/router/router.go b/api/router/router.go index 6cb2510..52ad8fd 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -89,6 +89,9 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 角色修改 roleGroup.PUT("/:role_id", api.Role.PutRole) + + // 删除角色-批量 + roleGroup.DELETE("", api.Role.DeleteRole) } // 菜单 @@ -99,5 +102,8 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 新增菜单 menuGroup.POST("", api.Menu.AddMenu) + + // 修改菜单 + menuGroup.PUT("/:menu_id", api.Menu.PutMenu) } } diff --git a/api/service/menu.go b/api/service/menu.go index fce48b9..5cc1316 100644 --- a/api/service/menu.go +++ b/api/service/menu.go @@ -122,3 +122,73 @@ func (r *MenuService) AddMenu(AddMenuRequest requests.AddMenu) (bool, error) { return true, nil } + +// PutMenu 修改菜单 +func (r *MenuService) PutMenu(PutMenuRequest requests.PutMenu) (bool, error) { + AdminMenuDao := dao.AdminMenuDao{} + AdminMenuApiDao := dao.AdminMenuApiDao{} + AdminApiDao := dao.AdminApiDao{} + + // 判断父级id + if PutMenuRequest.ParentId != 0 { + adminMenu, _ := AdminMenuDao.GetAdminMenuById(PutMenuRequest.ParentId) + if adminMenu == nil { + return false, errors.New("上级菜单错误") + } + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + // 新增菜单 + AdminMenuModel := &model.AdminMenu{ + MenuName: PutMenuRequest.MenuName, + MenuTitle: PutMenuRequest.MenuTitle, + ParentId: PutMenuRequest.ParentId, + MenuStatus: PutMenuRequest.MenuStatus, + MenuType: PutMenuRequest.MenuType, + Permission: PutMenuRequest.Permission, + OrderNum: PutMenuRequest.OrderNum, + Icon: PutMenuRequest.Icon, + Path: PutMenuRequest.Path, + Component: PutMenuRequest.Component, + } + + adminMenu, _ := AdminMenuDao.AddAdminMenu(tx, AdminMenuModel) + if adminMenu == nil { + tx.Rollback() + return false, errors.New("新增失败") + } + + // 新增菜单api + if len(PutMenuRequest.ApiIds) > 0 { + for _, v := range PutMenuRequest.ApiIds { + // 检测api + adminApi, _ := AdminApiDao.GetAdminApiById(v) + if adminApi == nil { + tx.Rollback() + return false, errors.New("接口不存在") + } + + AdminMenuApiModel := &model.AdminMenuApi{ + MenuId: adminMenu.MenuId, + ApiId: v, + } + + adminMenuApi, _ := AdminMenuApiDao.AddAdminMenuApi(tx, AdminMenuApiModel) + if adminMenuApi == nil { + tx.Rollback() + return false, errors.New("新增失败") + } + } + } + + tx.Commit() + + return true, nil +} diff --git a/api/service/role.go b/api/service/role.go index 875aa77..6bce6f4 100644 --- a/api/service/role.go +++ b/api/service/role.go @@ -202,7 +202,7 @@ func (r *RoleService) AddRole(c *gin.Context, AddRoleRequest requests.AddRole) ( } // PutRole 修改角色 -func (r *RoleService) PutRole(c *gin.Context, requestRoleId int64, AddRoleRequest requests.PutRole) (bool, error) { +func (r *RoleService) PutRole(c *gin.Context, requestRoleId int64, PutRoleRequest requests.PutRole) (bool, error) { // 获取当前登陆用户数据 roleId := c.GetInt64("RoleId") if roleId == 0 { @@ -215,14 +215,14 @@ func (r *RoleService) PutRole(c *gin.Context, requestRoleId int64, AddRoleReques return false, errors.New("非法操作") } - if AddRoleRequest.IsAdmin == 1 && adminRole.IsAdmin == 0 { + if PutRoleRequest.IsAdmin == 1 && adminRole.IsAdmin == 0 { return false, errors.New("您当前为普通用户,无法设置管理员") } AdminMenuDao := dao.AdminMenuDao{} // 判断菜单id - for _, menuId := range AddRoleRequest.MenuIds { + for _, menuId := range PutRoleRequest.MenuIds { adminMenu, _ := AdminMenuDao.GetAdminMenuById(menuId) if adminMenu == nil { return false, errors.New("菜单错误") @@ -239,8 +239,8 @@ func (r *RoleService) PutRole(c *gin.Context, requestRoleId int64, AddRoleReques // 修改角色 data := make(map[string]interface{}) - data["role_name"] = AddRoleRequest.RoleName - data["is_admin"] = AddRoleRequest.IsAdmin + data["role_name"] = PutRoleRequest.RoleName + data["is_admin"] = PutRoleRequest.IsAdmin err = AdminRoleDao.EditAdminRoleById(tx, requestRoleId, data) if err != nil { tx.Rollback() @@ -256,7 +256,7 @@ func (r *RoleService) PutRole(c *gin.Context, requestRoleId int64, AddRoleReques } // 新增角色菜单 - for _, menuId := range AddRoleRequest.MenuIds { + for _, menuId := range PutRoleRequest.MenuIds { AdminRoleMenuModel := &model.AdminRoleMenu{ RoleID: requestRoleId, MenuID: menuId, @@ -273,3 +273,82 @@ func (r *RoleService) PutRole(c *gin.Context, requestRoleId int64, AddRoleReques return true, nil } + +// DeleteRole 删除角色-批量 +func (r *RoleService) DeleteRole(c *gin.Context, DeleteRoleRequest requests.DeleteRole) (bool, error) { + // 获取当前登陆用户数据 + roleId := c.GetInt64("RoleId") + if roleId == 0 { + return false, errors.New("数据错误") + } + + AdminUserDao := dao.AdminUserDao{} + AdminRoleMenuDao := dao.AdminRoleMenuDao{} + + AdminRoleDao := dao.AdminRoleDao{} + adminRole, err := AdminRoleDao.GetAdminRoleFirstById(roleId) + if err != nil || adminRole == nil { + return false, errors.New("非法操作") + } + + if adminRole.IsAdmin == 0 { + return false, errors.New("暂无权限,请联系管理员删除") + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + for _, v := range DeleteRoleRequest.RoleIds { + if v == adminRole.RoleId { + tx.Rollback() + return false, errors.New("非法操作,请勿删除自己所属角色") + } + + // 检测角色id + adminRole, err := AdminRoleDao.GetAdminRoleFirstById(v) + if err != nil || adminRole == nil { + tx.Rollback() + return false, errors.New("无法删除不存在的角色") + } + + // 获取绑定该角色的用户 + maps := make(map[string]interface{}) + maps["role_id"] = v + AdminUser, err := AdminUserDao.GetAdminUserList(maps) + if AdminUser != nil { + for _, user := range AdminUser { + // 修改对应用户角色id为0 + data := make(map[string]interface{}) + data["role_id"] = nil + err = AdminUserDao.EditAdminUserById(tx, user.UserID, data) + if err != nil { + tx.Rollback() + return false, errors.New("删除失败") + } + } + } + + // 删除角色关联菜单 + err = AdminRoleMenuDao.DeleteAdminRoleMenuByRoleId(tx, v) + if err != nil { + tx.Rollback() + return false, errors.New("删除失败") + } + + // 删除角色 + err = AdminRoleDao.DeleteAdminRoleByRoleId(tx, v) + if err != nil { + tx.Rollback() + return false, errors.New("删除失败") + } + } + + tx.Commit() + + return true, nil +}