From 250426b6a5839b5b385ea882d1d7da40f0d75edc Mon Sep 17 00:00:00 2001 From: yxh Date: Mon, 11 Apr 2022 18:21:16 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/v1/system/sys_dept.go | 10 +++ api/v1/system/sys_user.go | 17 +++++ internal/app/system/controller/sys_dept.go | 16 +++++ internal/app/system/controller/sys_user.go | 16 +++++ internal/app/system/model/sys_dept.go | 15 +++++ internal/app/system/model/sys_user.go | 16 +++++ internal/app/system/service/sys_dept.go | 20 ++++++ internal/app/system/service/sys_post.go | 1 + internal/app/system/service/sys_user.go | 73 ++++++++++++++++++++++ 9 files changed, 184 insertions(+) create mode 100644 internal/app/system/model/sys_dept.go diff --git a/api/v1/system/sys_dept.go b/api/v1/system/sys_dept.go index 05d2617..438bfde 100644 --- a/api/v1/system/sys_dept.go +++ b/api/v1/system/sys_dept.go @@ -9,6 +9,7 @@ package system import ( "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/internal/app/system/model" "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" ) @@ -59,3 +60,12 @@ type DeptDeleteReq struct { type DeptDeleteRes struct { } + +type DeptTreeSelectReq struct { + g.Meta `path:"/dept/treeSelect" tags:"部门管理" method:"get" summary:"获取部门树形菜单"` +} + +type DeptTreeSelectRes struct { + g.Meta `mime:"application/json"` + Deps []*model.SysDeptTreeRes `json:"deps"` +} diff --git a/api/v1/system/sys_user.go b/api/v1/system/sys_user.go index 3c02261..49a9bfe 100644 --- a/api/v1/system/sys_user.go +++ b/api/v1/system/sys_user.go @@ -2,6 +2,7 @@ package system import ( "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" "github.com/tiger1103/gfast/v3/internal/app/system/model" ) @@ -31,3 +32,19 @@ type UserMenusRes struct { MenuList []*model.UserMenus `json:"menuList"` Permissions []string `json:"permissions"` } + +// UserSearchReq 用户搜索请求参数 +type UserSearchReq struct { + g.Meta `path:"/user/list" tags:"用户管理" method:"get" summary:"用户列表"` + DeptIds []int64 //所属部门id数据 + Mobile string `p:"mobile"` + Status string `p:"status"` + KeyWords string `p:"userName"` + commonApi.PageReq +} + +type UserSearchRes struct { + g.Meta `mime:"application/json"` + UserList []*model.SysUserRoleDeptRes `json:"userList"` + commonApi.ListRes +} diff --git a/internal/app/system/controller/sys_dept.go b/internal/app/system/controller/sys_dept.go index b40192c..75e64a6 100644 --- a/internal/app/system/controller/sys_dept.go +++ b/internal/app/system/controller/sys_dept.go @@ -10,6 +10,7 @@ package controller import ( "context" "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" "github.com/tiger1103/gfast/v3/internal/app/system/service" ) @@ -38,7 +39,22 @@ func (c *sysDeptController) Edit(ctx context.Context, req *system.DeptEditReq) ( return } +// Delete 删除部门 func (c *sysDeptController) Delete(ctx context.Context, req *system.DeptDeleteReq) (res *system.DeptDeleteRes, err error) { err = service.Dept().Delete(ctx, req.Id) return } + +// TreeSelect 获取部门数据结构数据 +func (c *sysDeptController) TreeSelect(ctx context.Context, req *system.DeptTreeSelectReq) (res *system.DeptTreeSelectRes, err error) { + var deptList []*entity.SysDept + deptList, err = service.Dept().GetList(ctx, &system.DeptSearchReq{ + Status: "1", //正常状态数据 + }) + if err != nil { + return + } + res = new(system.DeptTreeSelectRes) + res.Deps = service.Dept().GetListTree(0, deptList) + return +} diff --git a/internal/app/system/controller/sys_user.go b/internal/app/system/controller/sys_user.go index 9d16ff2..01d666b 100644 --- a/internal/app/system/controller/sys_user.go +++ b/internal/app/system/controller/sys_user.go @@ -10,6 +10,7 @@ import ( "github.com/tiger1103/gfast/v3/api/v1/system" commonService "github.com/tiger1103/gfast/v3/internal/app/common/service" "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" "github.com/tiger1103/gfast/v3/internal/app/system/service" "github.com/tiger1103/gfast/v3/library/libUtils" ) @@ -102,3 +103,18 @@ func (c *userController) GetUserMenus(ctx context.Context, req *system.UserMenus } return } + +// List 用户列表 +func (c *userController) List(ctx context.Context, req *system.UserSearchReq) (res *system.UserSearchRes, err error) { + var ( + total int + userList []*entity.SysUser + ) + total, userList, err = service.User().List(ctx, req) + if err != nil || total == 0 { + return + } + res = new(system.UserSearchRes) + res.UserList, err = service.User().GetUsersRoleDept(ctx, userList) + return +} diff --git a/internal/app/system/model/sys_dept.go b/internal/app/system/model/sys_dept.go new file mode 100644 index 0000000..d7f5226 --- /dev/null +++ b/internal/app/system/model/sys_dept.go @@ -0,0 +1,15 @@ +/* +* @desc:部门model +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/4/11 9:07 + */ + +package model + +import "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + +type SysDeptTreeRes struct { + *entity.SysDept + Children []*SysDeptTreeRes `json:"children"` +} diff --git a/internal/app/system/model/sys_user.go b/internal/app/system/model/sys_user.go index cb13518..07b3e92 100644 --- a/internal/app/system/model/sys_user.go +++ b/internal/app/system/model/sys_user.go @@ -7,6 +7,8 @@ package model +import "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + // LoginUserRes 登录返回 type LoginUserRes struct { Id uint64 `orm:"id,primary" json:"id"` // @@ -19,3 +21,17 @@ type LoginUserRes struct { Avatar string `orm:"avatar" json:"avatar"` //头像 DeptId uint64 `orm:"dept_id" json:"deptId"` //部门id } + +// SysUserRoleDeptRes 带有部门、角色、岗位信息的用户数据 +type SysUserRoleDeptRes struct { + *entity.SysUser + Dept *entity.SysDept `json:"dept"` + RoleInfo []*struct { + RoleId uint `json:"roleId"` + Name string `json:"name"` + } `json:"roleInfo"` + Post []*struct { + PostId int64 `json:"postId"` + PostName string `json:"postName"` + } `json:"post"` +} diff --git a/internal/app/system/service/sys_dept.go b/internal/app/system/service/sys_dept.go index 48f8ad7..d12213f 100644 --- a/internal/app/system/service/sys_dept.go +++ b/internal/app/system/service/sys_dept.go @@ -15,6 +15,7 @@ import ( "github.com/tiger1103/gfast/v3/api/v1/system" commonService "github.com/tiger1103/gfast/v3/internal/app/common/service" "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/model" "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" "github.com/tiger1103/gfast/v3/internal/app/system/service/internal/dao" "github.com/tiger1103/gfast/v3/internal/app/system/service/internal/do" @@ -27,6 +28,7 @@ type IDept interface { Edit(ctx context.Context, req *system.DeptEditReq) (err error) GetFromCache(ctx context.Context) (list []*entity.SysDept, err error) Delete(ctx context.Context, id int64) (err error) + GetListTree(pid int64, list []*entity.SysDept) (deptTree []*model.SysDeptTreeRes) } var deptService = deptImpl{} @@ -147,3 +149,21 @@ func (s *deptImpl) FindSonByParentId(deptList []*entity.SysDept, deptId int64) [ } return children } + +// GetListTree 部门树形菜单 +func (s *deptImpl) GetListTree(pid int64, list []*entity.SysDept) (deptTree []*model.SysDeptTreeRes) { + deptTree = make([]*model.SysDeptTreeRes, 0, len(list)) + for _, v := range list { + if v.ParentId == pid { + t := &model.SysDeptTreeRes{ + SysDept: v, + } + child := s.GetListTree(v.DeptId, list) + if len(child) > 0 { + t.Children = child + } + deptTree = append(deptTree, t) + } + } + return +} diff --git a/internal/app/system/service/sys_post.go b/internal/app/system/service/sys_post.go index d3d86ff..04bc550 100644 --- a/internal/app/system/service/sys_post.go +++ b/internal/app/system/service/sys_post.go @@ -58,6 +58,7 @@ func (s *postImpl) List(ctx context.Context, req *system.PostSearchReq) (res *sy if req.PageSize == 0 { req.PageSize = consts.PageSize } + res.CurrentPage = req.PageNum err = m.Page(req.PageNum, req.PageSize).Order("post_sort asc,post_id asc").Scan(&res.PostList) liberr.ErrIsNil(ctx, err, "获取岗位失败") }) diff --git a/internal/app/system/service/sys_user.go b/internal/app/system/service/sys_user.go index ac55d5a..2475f49 100644 --- a/internal/app/system/service/sys_user.go +++ b/internal/app/system/service/sys_user.go @@ -19,6 +19,7 @@ import ( "github.com/mssola/user_agent" "github.com/tiger1103/gfast/v3/api/v1/system" "github.com/tiger1103/gfast/v3/internal/app/common/service" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" "github.com/tiger1103/gfast/v3/internal/app/system/model" "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" "github.com/tiger1103/gfast/v3/internal/app/system/service/internal/dao" @@ -33,6 +34,8 @@ type IUser interface { UpdateLoginInfo(ctx context.Context, id uint64, ip string) (err error) NotCheckAuthAdminIds(ctx context.Context) *gset.Set GetAdminRules(ctx context.Context, userId uint64) (menuList []*model.UserMenus, permissions []string, err error) + List(ctx context.Context, req *system.UserSearchReq) (total int, userList []*entity.SysUser, err error) + GetUsersRoleDept(ctx context.Context, userList []*entity.SysUser) (users []*model.SysUserRoleDeptRes, err error) } type userImpl struct{} @@ -300,3 +303,73 @@ func (s *userImpl) GetPermissions(ctx context.Context, roleIds []uint) (userButt }) return } + +// List 用户列表 +func (s *userImpl) List(ctx context.Context, req *system.UserSearchReq) (total int, userList []*entity.SysUser, err error) { + err = g.Try(func() { + m := dao.SysUser.Ctx(ctx) + if req.KeyWords != "" { + keyWords := "%" + req.KeyWords + "%" + m = m.Where("user_name like ? or user_nickname like ?", keyWords, keyWords) + } + if len(req.DeptIds) != 0 { + m = m.Where("dept_id in (?)", req.DeptIds) + } + if req.Status != "" { + m = m.Where("user_status", gconv.Int(req.Status)) + } + if req.Mobile != "" { + m = m.Where("mobile like ?", "%"+req.Mobile+"%") + } + if req.BeginTime != "" { + m = m.Where("created_at >=?", req.BeginTime) + } + if req.EndTime != "" { + m = m.Where("created_at <=?", req.EndTime) + } + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + if req.PageNum == 0 { + req.PageNum = 1 + } + total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取用户数据失败") + err = m.FieldsEx(dao.SysUser.Columns().UserPassword, dao.SysUser.Columns().UserSalt). + Page(req.PageNum, req.PageSize).Order("id asc").Scan(&userList) + liberr.ErrIsNil(ctx, err, "获取用户列表失败") + }) + return +} + +// GetUsersRoleDept 获取多个用户角色 部门信息 +func (s *userImpl) GetUsersRoleDept(ctx context.Context, userList []*entity.SysUser) (users []*model.SysUserRoleDeptRes, err error) { + err = g.Try(func() { + allRoles, e := Role().GetRoleList(ctx) + liberr.ErrIsNil(ctx, e) + depts, e := Dept().GetFromCache(ctx) + liberr.ErrIsNil(ctx, e) + users = make([]*model.SysUserRoleDeptRes, len(userList)) + for k, u := range userList { + var dept *entity.SysDept + users[k] = &model.SysUserRoleDeptRes{ + SysUser: u, + } + for _, d := range depts { + if u.DeptId == uint64(d.DeptId) { + dept = d + } + } + users[k].Dept = dept + roles, e := s.GetAdminRole(ctx, u.Id, allRoles) + liberr.ErrIsNil(ctx, e) + for _, r := range roles { + users[k].RoleInfo = append(users[k].RoleInfo, &struct { + RoleId uint `json:"roleId"` + Name string `json:"name"` + }{RoleId: r.Id, Name: r.Name}) + } + } + }) + return +}