diff --git a/api/controller/dept.go b/api/controller/dept.go index 789f184..cb8cd32 100644 --- a/api/controller/dept.go +++ b/api/controller/dept.go @@ -2,8 +2,14 @@ package controller import ( "github.com/gin-gonic/gin" + "hospital-admin-api/api/dao" + "hospital-admin-api/api/requests" "hospital-admin-api/api/responses" + "hospital-admin-api/api/responses/deptResponse" "hospital-admin-api/api/service" + "hospital-admin-api/global" + "hospital-admin-api/utils" + "strconv" ) type Dept struct{} @@ -27,116 +33,154 @@ func (r *Dept) GetDeptList(c *gin.Context) { } // AddDept 新增部门 -// func (r *Dept) AddDept(c *gin.Context) { -// deptRequest := requests.DeptRequest{} -// if err := c.ShouldBind(&deptRequest.AddDept); err != nil { -// responses.FailWithMessage(err.Error(), c) -// return -// } -// -// // 参数验证 -// if err := global.Validate.Struct(deptRequest.AddDept); err != nil { -// responses.FailWithMessage(utils.Translate(err), c) -// return -// } -// -// // 业务处理 -// deptService := service.DeptService{} -// _, err := deptService.AddDept(deptRequest.AddDept) -// if err != nil { -// responses.FailWithMessage(err.Error(), c) -// return -// } -// responses.Ok(c) -// } +func (r *Dept) AddDept(c *gin.Context) { + deptRequest := requests.DeptRequest{} + if err := c.ShouldBind(&deptRequest.AddDept); err != nil { + responses.FailWithMessage(err.Error(), c) + return + } -// -// // GetDept 部门详情 -// func (r *Dept) GetDept(c *gin.Context) { -// id := c.Param("dept_id") -// if id == "" { -// responses.FailWithMessage("缺少参数", c) -// return -// } -// -// // 将 id 转换为 int64 类型 -// deptId, err := strconv.ParseInt(id, 10, 64) -// if err != nil { -// responses.Fail(c) -// return -// } -// -// // 获取部门详情 -// adminDeptDao := dao.AdminDeptDao{} -// adminDept, err := adminDeptDao.GetAdminDeptById(deptId) -// if err != nil || adminDept == nil { -// responses.FailWithMessage("部门数据错误", c) -// return -// } -// -// // 处理返回值 -// getDeptResponses := apiResponse.GetDeptResponse(adminDept) -// -// responses.OkWithData(getDeptResponses, c) -// } -// -// // DeleteDept 删除部门-批量 -// func (r *Dept) DeleteDept(c *gin.Context) { -// deptRequest := requests.DeptRequest{} -// if err := c.ShouldBindJSON(&deptRequest.DeleteDept); err != nil { -// responses.FailWithMessage(err.Error(), c) -// return -// } -// -// // 参数验证 -// if err := global.Validate.Struct(deptRequest.DeleteDept); err != nil { -// responses.FailWithMessage(utils.Translate(err), c) -// return -// } -// -// // 业务处理 -// apiService := service.DeptService{} -// _, err := apiService.DeleteDept(c, deptRequest.DeleteDept) -// if err != nil { -// responses.FailWithMessage(err.Error(), c) -// return -// } -// responses.Ok(c) -// } -// -// // PutDept 修改部门 -// func (r *Dept) PutDept(c *gin.Context) { -// deptRequest := requests.DeptRequest{} -// if err := c.ShouldBind(&deptRequest.PutDept); err != nil { -// responses.FailWithMessage(err.Error(), c) -// return -// } -// -// // 参数验证 -// if err := global.Validate.Struct(deptRequest.PutDept); err != nil { -// responses.FailWithMessage(utils.Translate(err), c) -// return -// } -// -// id := c.Param("dept_id") -// if id == "" { -// responses.FailWithMessage("缺少参数", c) -// return -// } -// -// // 将 id 转换为 int64 类型 -// deptId, err := strconv.ParseInt(id, 10, 64) -// if err != nil { -// responses.Fail(c) -// return -// } -// -// // 业务处理 -// apiService := service.DeptService{} -// _, err = apiService.PutDept(c, deptId, deptRequest.PutDept) -// if err != nil { -// responses.FailWithMessage(err.Error(), c) -// return -// } -// responses.Ok(c) -// } + // 参数验证 + if err := global.Validate.Struct(deptRequest.AddDept); err != nil { + responses.FailWithMessage(utils.Translate(err), c) + return + } + + // 获取角色身份 + roleService := service.RoleService{} + isAdmin, err := roleService.GetRoleIden(c) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + if !isAdmin { + responses.FailWithMessage("非管理员,无法添加部门", c) + return + } + + // 业务处理 + deptService := service.DeptService{} + _, err = deptService.AddDept(deptRequest.AddDept) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + responses.Ok(c) +} + +// GetDept 部门详情 +func (r *Dept) GetDept(c *gin.Context) { + id := c.Param("dept_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + deptId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 获取部门详情 + adminDeptDao := dao.AdminDeptDao{} + adminDept, err := adminDeptDao.GetAdminDeptById(deptId) + if err != nil || adminDept == nil { + responses.FailWithMessage("部门数据错误", c) + return + } + + // 处理返回值 + getDeptResponses := deptResponse.GetDeptResponse(adminDept) + + responses.OkWithData(getDeptResponses, c) +} + +// DeleteDept 删除部门-批量 +func (r *Dept) DeleteDept(c *gin.Context) { + deptRequest := requests.DeptRequest{} + if err := c.ShouldBindJSON(&deptRequest.DeleteDept); err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 参数验证 + if err := global.Validate.Struct(deptRequest.DeleteDept); err != nil { + responses.FailWithMessage(utils.Translate(err), c) + return + } + + // 获取角色身份 + roleService := service.RoleService{} + isAdmin, err := roleService.GetRoleIden(c) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + if !isAdmin { + responses.FailWithMessage("非管理员,无法添加部门", c) + return + } + + // 业务处理 + apiService := service.DeptService{} + _, err = apiService.DeleteDept(deptRequest.DeleteDept) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + responses.Ok(c) +} + +// PutDept 修改部门 +func (r *Dept) PutDept(c *gin.Context) { + deptRequest := requests.DeptRequest{} + if err := c.ShouldBind(&deptRequest.PutDept); err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 参数验证 + if err := global.Validate.Struct(deptRequest.PutDept); err != nil { + responses.FailWithMessage(utils.Translate(err), c) + return + } + + id := c.Param("dept_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + deptId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 获取角色身份 + roleService := service.RoleService{} + isAdmin, err := roleService.GetRoleIden(c) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + if !isAdmin { + responses.FailWithMessage("非管理员,无法添加部门", c) + return + } + + // 业务处理 + apiService := service.DeptService{} + _, err = apiService.PutDept(deptId, deptRequest.PutDept) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + responses.Ok(c) +} diff --git a/api/dao/adminDept.go b/api/dao/adminDept.go index 20d912c..6ec7ab7 100644 --- a/api/dao/adminDept.go +++ b/api/dao/adminDept.go @@ -19,18 +19,35 @@ func (r *AdminDeptDao) GetAdminDeptById(deptId int64) (m *model.AdminDept, err e } // GetAdminDeptList 获取部门列表 -func (r *AdminDeptDao) GetAdminDeptList() (m []*model.AdminDept, err error) { - err = global.Db.Find(&m).Error +func (r *AdminDeptDao) GetAdminDeptList(maps interface{}) (m []*model.AdminDept, err error) { + err = global.Db.Where(maps).Find(&m).Error if err != nil { return nil, err } return m, nil } -// AddAdminDept 新增接口 -func (r *AdminApiDao) AddAdminDept(tx *gorm.DB, model *model.AdminAPI) (*model.AdminAPI, error) { +// AddAdminDept 新增部门 +func (r *AdminDeptDao) AddAdminDept(tx *gorm.DB, model *model.AdminDept) (*model.AdminDept, error) { if err := tx.Create(model).Error; err != nil { return nil, err } return model, nil } + +// DeleteAdminDeptById 删除部门-部门id +func (r *AdminDeptDao) DeleteAdminDeptById(tx *gorm.DB, deptId int64) error { + if err := tx.Delete(&model.AdminDept{}, deptId).Error; err != nil { + return err + } + return nil +} + +// EditAdminDeptById 修改部门-部门id +func (r *AdminDeptDao) EditAdminDeptById(tx *gorm.DB, deptId int64, data interface{}) error { + err := tx.Model(&model.AdminDept{}).Where("dept_id = ?", deptId).Updates(data).Error + if err != nil { + return err + } + return nil +} diff --git a/api/middlewares/auth.go b/api/middlewares/auth.go index 2d52824..cc1ab38 100644 --- a/api/middlewares/auth.go +++ b/api/middlewares/auth.go @@ -30,8 +30,8 @@ func Auth() gin.HandlerFunc { } // 获取用户数据 - AdminUserDao := dao.AdminUserDao{} - adminUser, err := AdminUserDao.GetAdminUserFirstById(userId) + adminUserDao := dao.AdminUserDao{} + adminUser, err := adminUserDao.GetAdminUserFirstById(userId) if err != nil || adminUser == nil { responses.FailWithMessage("用户数据错误", c) c.Abort() @@ -78,6 +78,23 @@ func Auth() gin.HandlerFunc { return } + // 获取用户部门数据 + if adminUser.PostID != 0 { + adminDeptDao := dao.AdminDeptDao{} + adminDept, err := adminDeptDao.GetAdminDeptById(adminUser.PostID) + if err != nil || adminDept == nil { + responses.FailWithMessage("用户部门数据错误", c) + c.Abort() + return + } + + if adminDept.DeptStatus == 2 { + responses.FailWithMessage("您所在的部门已被删除,请联系管理员修改", c) + c.Abort() + return + } + } + // 获取角色菜单id AdminRoleMenuDao := dao.AdminRoleMenuDao{} adminRoleMenu, _ := AdminRoleMenuDao.GetAdminRoleMenuListByRoleId(roleId) @@ -94,9 +111,9 @@ func Auth() gin.HandlerFunc { var apiPermissions = make(map[string]bool) // 获取菜单对应api - AdminMenuApiDao := dao.AdminMenuApiDao{} + adminMenuApiDao := dao.AdminMenuApiDao{} for _, v := range adminRoleMenu { - AdminMenuApi, _ := AdminMenuApiDao.GetAdminMenuApiListByMenuID(v.MenuID) + AdminMenuApi, _ := adminMenuApiDao.GetAdminMenuApiListByMenuID(v.MenuID) if AdminMenuApi == nil { // 菜单无需权限 c.Next() diff --git a/api/requests/dept.go b/api/requests/dept.go index 53ded77..cada3bd 100644 --- a/api/requests/dept.go +++ b/api/requests/dept.go @@ -8,9 +8,8 @@ type DeptRequest struct { // AddDept 新增部门 type AddDept struct { - ParentId string `json:"parent_id" form:"parent_id" validate:"required" label:"上级部门"` // 本表父级id - DeptName string `json:"dept_name" form:"dept_name" validate:"required" label:"部门名称"` - DeptStatus int `json:"dept_status" form:"dept_status" validate:"required,oneof=1 2" label:"部门状态"` // (1:正常 2:删除) + ParentId string `json:"parent_id" form:"parent_id" validate:"required" label:"上级部门"` // 本表父级id + DeptName string `json:"dept_name" form:"dept_name" validate:"required" label:"部门名称"` } // DeleteDept 删除部门-批量 @@ -20,7 +19,7 @@ type DeleteDept struct { // PutDept 修改部门 type PutDept struct { - ParentId int64 `json:"parent_id" form:"parent_id" validate:"required" label:"上级部门"` // 本表父级id + ParentId string `json:"parent_id" form:"parent_id" validate:"required" label:"上级部门"` // 本表父级id DeptName string `json:"dept_name" form:"dept_name" validate:"required" label:"部门名称"` DeptStatus int `json:"dept_status" form:"dept_status" validate:"required,oneof=1 2" label:"部门状态"` // (1:正常 2:删除) } diff --git a/api/responses/deptResponse/dept.go b/api/responses/deptResponse/dept.go index aff4baa..8a78e1e 100644 --- a/api/responses/deptResponse/dept.go +++ b/api/responses/deptResponse/dept.go @@ -1,6 +1,9 @@ package deptResponse -import "hospital-admin-api/api/model" +import ( + "hospital-admin-api/api/model" + "strconv" +) // GetDeptList 获取部门列表 type GetDeptList struct { @@ -12,3 +15,25 @@ type GetDeptList struct { UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 Children []*GetDeptList `json:"children"` // 下级页面 } + +// GetDept 部门详情 +type getDept struct { + DeptId string `json:"dept_id"` + ParentId string `json:"parent_id"` // 父菜单ID(0表示一级) + DeptName string `json:"dept_name"` // 部门名称 + DeptStatus int `json:"dept_status"` // 部门状态(1:正常 2:删除) + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 +} + +// GetDeptResponse 部门详情 +func GetDeptResponse(adminDept *model.AdminDept) *getDept { + return &getDept{ + DeptId: strconv.Itoa(int(adminDept.DeptId)), + ParentId: strconv.Itoa(int(adminDept.ParentId)), + DeptName: adminDept.DeptName, + DeptStatus: adminDept.DeptStatus, + CreatedAt: adminDept.CreatedAt, + UpdatedAt: adminDept.UpdatedAt, + } +} diff --git a/api/router/router.go b/api/router/router.go index 3cf25ca..79f1500 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -158,15 +158,15 @@ func privateRouter(r *gin.Engine, api controller.Api) { deptGroup.GET("", api.Dept.GetDeptList) // 新增部门 - deptGroup.POST("", api.Dept.GetDeptList) + deptGroup.POST("", api.Dept.AddDept) // 部门详情 - deptGroup.GET("/:api_id", api.Dept.GetDeptList) + deptGroup.GET("/:dept_id", api.Dept.GetDept) // 删除部门-批量 - deptGroup.DELETE("", api.Dept.GetDeptList) + deptGroup.DELETE("", api.Dept.DeleteDept) // 修改部门 - deptGroup.PUT("/:api_id", api.Dept.GetDeptList) + deptGroup.PUT("/:dept_id", api.Dept.PutDept) } } diff --git a/api/service/api.go b/api/service/api.go index cfe102d..2896f7e 100644 --- a/api/service/api.go +++ b/api/service/api.go @@ -110,6 +110,7 @@ func (r *ApiService) DeleteApi(c *gin.Context, deleteApiRequest requests.DeleteA // 将字符串转换为int64类型 v, err := strconv.ParseInt(v, 10, 64) if err != nil { + tx.Rollback() return false, errors.New("菜单错误") } @@ -189,7 +190,7 @@ func (r *ApiService) PutApi(c *gin.Context, requestApiId int64, putApiRequest re } }() - // 修改角色 + // 修改接口 data := make(map[string]interface{}) data["api_name"] = putApiRequest.ApiName data["api_path"] = putApiRequest.ApiPath diff --git a/api/service/dept.go b/api/service/dept.go index bcc5daf..fbaceb4 100644 --- a/api/service/dept.go +++ b/api/service/dept.go @@ -1,8 +1,12 @@ package service import ( + "errors" "hospital-admin-api/api/dao" + "hospital-admin-api/api/model" + "hospital-admin-api/api/requests" "hospital-admin-api/api/responses/deptResponse" + "hospital-admin-api/global" "strconv" ) @@ -13,7 +17,10 @@ type DeptService struct { func (r *DeptService) GetDeptList() ([]*deptResponse.GetDeptList, error) { // 获取全部部门 adminDeptDao := dao.AdminDeptDao{} - adminDept, _ := adminDeptDao.GetAdminDeptList() + + maps := make(map[string]interface{}) + maps["dept_status"] = 1 + adminDept, _ := adminDeptDao.GetAdminDeptList(maps) if adminDept == nil { return nil, nil } @@ -50,81 +57,133 @@ func (r *DeptService) GetDeptList() ([]*deptResponse.GetDeptList, error) { } // AddDept 新增部门 -// func (r *DeptService) AddDept(addDeptRequest requests.AddDept) (bool, error) { -// adminDeptDao := dao.AdminDeptDao{} -// -// parentId, err := strconv.ParseInt(addDeptRequest.ParentId, 10, 64) -// if err != nil { -// return false, errors.New("新增失败") -// } -// -// // 判断父级id -// if parentId != 0 { -// adminDept, _ := adminDeptDao.GetAdminDeptById(parentId) -// if adminDept == nil { -// return false, errors.New("上级部门错误") -// } -// } -// -// // 开始事务 -// tx := global.Db.Begin() -// defer func() { -// if r := recover(); r != nil { -// tx.Rollback() -// } -// }() -// -// // 新增菜单 -// AdminMenuModel := &model.AdminMenu{ -// MenuName: AddMenuRequest.MenuName, -// MenuTitle: AddMenuRequest.MenuTitle, -// ParentId: ParentId, -// MenuStatus: AddMenuRequest.MenuStatus, -// MenuType: AddMenuRequest.MenuType, -// Permission: AddMenuRequest.Permission, -// OrderNum: AddMenuRequest.OrderNum, -// Icon: AddMenuRequest.Icon, -// Path: AddMenuRequest.Path, -// Component: AddMenuRequest.Component, -// } -// -// adminMenu, _ := AdminMenuDao.AddAdminMenu(tx, AdminMenuModel) -// if adminMenu == nil { -// tx.Rollback() -// return false, errors.New("新增失败") -// } -// -// // 新增菜单api -// if len(AddMenuRequest.ApiIds) > 0 { -// for _, v := range AddMenuRequest.ApiIds { -// // 将字符串转换为int64类型 -// v, err := strconv.ParseInt(v, 10, 64) -// if err != nil { -// tx.Rollback() -// return false, errors.New("新增失败") -// } -// -// // 检测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 -// } +func (r *DeptService) AddDept(addDeptRequest requests.AddDept) (bool, error) { + adminDeptDao := dao.AdminDeptDao{} + + parentId, err := strconv.ParseInt(addDeptRequest.ParentId, 10, 64) + if err != nil { + return false, errors.New("新增失败") + } + + // 判断父级id + if parentId != 0 { + adminDept, _ := adminDeptDao.GetAdminDeptById(parentId) + if adminDept == nil { + return false, errors.New("上级部门错误") + } + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + // 新增菜单 + adminDeptModel := &model.AdminDept{ + ParentId: parentId, + DeptName: addDeptRequest.DeptName, + DeptStatus: 1, + } + + adminMenu, _ := adminDeptDao.AddAdminDept(tx, adminDeptModel) + if adminMenu == nil { + tx.Rollback() + return false, errors.New("新增失败") + } + + tx.Commit() + + return true, nil +} + +// DeleteDept 删除部门-批量 +func (r *DeptService) DeleteDept(deleteDeptRequest requests.DeleteDept) (bool, error) { + adminDeptDao := dao.AdminDeptDao{} + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + for _, v := range deleteDeptRequest.DeptIds { + // 将字符串转换为int64类型 + v, err := strconv.ParseInt(v, 10, 64) + if err != nil { + tx.Rollback() + return false, errors.New("菜单错误") + } + + // 检测删除部门 + adminDept, err := adminDeptDao.GetAdminDeptById(v) + if err != nil || adminDept == nil { + tx.Rollback() + return false, errors.New("删除失败") + } + + // 修改部门为删除 + data := make(map[string]interface{}) + data["dept_status"] = 2 + err = adminDeptDao.EditAdminDeptById(tx, v, data) + if err != nil { + tx.Rollback() + return false, errors.New("删除失败") + } + } + + tx.Commit() + + return true, nil +} + +// PutDept 修改部门 +func (r *DeptService) PutDept(requestDeptId int64, putDeptRequest requests.PutDept) (bool, error) { + adminDeptDao := dao.AdminDeptDao{} + + // 获取需修改部门数据 + adminDept, err := adminDeptDao.GetAdminDeptById(requestDeptId) + if err != nil || adminDept == nil { + return false, errors.New("部门数据错误") + } + + // 判断父级id + parentId, err := strconv.ParseInt(putDeptRequest.ParentId, 10, 64) + if err != nil { + return false, errors.New("新增失败") + } + + if parentId != 0 { + adminDept, _ := adminDeptDao.GetAdminDeptById(parentId) + if adminDept == nil { + return false, errors.New("上级部门错误") + } + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + // 修改部门 + data := make(map[string]interface{}) + data["parent_id"] = parentId + data["dept_name"] = putDeptRequest.DeptName + data["dept_status"] = putDeptRequest.DeptStatus + err = adminDeptDao.EditAdminDeptById(tx, requestDeptId, data) + if err != 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 54b28a0..7b57bad 100644 --- a/api/service/role.go +++ b/api/service/role.go @@ -40,17 +40,17 @@ func (r *RoleService) GetRoleMenuList(roleId int64, isAdmin bool) ([]*roleRespon return []*roleResponse.GetRoleMenuList{}, nil } - var menuTree []*roleResponse.GetRoleMenuList + var getRoleMenuListResponse []*roleResponse.GetRoleMenuList if len(menuIDs) > 0 { // 构建菜单树 - menuTree = buildMenuTree(menuIDs, adminMenu) - if menuTree == nil { + getRoleMenuListResponse = buildMenuTree(menuIDs, adminMenu) + if getRoleMenuListResponse == nil { return nil, nil } } - return menuTree, nil + return getRoleMenuListResponse, nil } // 获取角色菜单-构建菜单树 @@ -359,9 +359,9 @@ func (r *RoleService) DeleteRole(c *gin.Context, DeleteRoleRequest requests.Dele // 获取绑定该角色的用户 maps := make(map[string]interface{}) maps["role_id"] = v - AdminUser, err := AdminUserDao.GetAdminUserList(maps) - if AdminUser != nil { - for _, user := range AdminUser { + adminUser, err := AdminUserDao.GetAdminUserList(maps) + if adminUser != nil { + for _, user := range adminUser { // 修改对应用户角色id为0 data := make(map[string]interface{}) data["role_id"] = nil diff --git a/api/service/user.go b/api/service/user.go index 92d91ad..9db5b7a 100644 --- a/api/service/user.go +++ b/api/service/user.go @@ -175,6 +175,7 @@ func (r *UserService) DeleteUser(c *gin.Context, DeleteUserRequest requests.Dele // 将字符串转换为int64类型 v, err := strconv.ParseInt(v, 10, 64) if err != nil { + tx.Rollback() return false, errors.New("菜单错误") }