sys_user.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623
  1. /*
  2. * @desc:用户处理
  3. * @company:云南奇讯科技有限公司
  4. * @Author: yixiaohu
  5. * @Date: 2022/3/7 9:50
  6. */
  7. package service
  8. import (
  9. "context"
  10. "fmt"
  11. "github.com/gogf/gf/v2/container/gset"
  12. "github.com/gogf/gf/v2/database/gdb"
  13. "github.com/gogf/gf/v2/errors/gerror"
  14. "github.com/gogf/gf/v2/frame/g"
  15. "github.com/gogf/gf/v2/os/gtime"
  16. "github.com/gogf/gf/v2/text/gstr"
  17. "github.com/gogf/gf/v2/util/gconv"
  18. "github.com/gogf/gf/v2/util/grand"
  19. "github.com/mssola/user_agent"
  20. "github.com/tiger1103/gfast/v3/api/v1/system"
  21. commonService "github.com/tiger1103/gfast/v3/internal/app/common/service"
  22. "github.com/tiger1103/gfast/v3/internal/app/system/consts"
  23. "github.com/tiger1103/gfast/v3/internal/app/system/model"
  24. "github.com/tiger1103/gfast/v3/internal/app/system/model/entity"
  25. "github.com/tiger1103/gfast/v3/internal/app/system/service/internal/dao"
  26. "github.com/tiger1103/gfast/v3/internal/app/system/service/internal/do"
  27. "github.com/tiger1103/gfast/v3/library/libUtils"
  28. "github.com/tiger1103/gfast/v3/library/liberr"
  29. )
  30. type IUser interface {
  31. GetAdminUserByUsernamePassword(ctx context.Context, req *system.UserLoginReq) (user *model.LoginUserRes, err error)
  32. LoginLog(ctx context.Context, params *model.LoginLogParams)
  33. UpdateLoginInfo(ctx context.Context, id uint64, ip string) (err error)
  34. NotCheckAuthAdminIds(ctx context.Context) *gset.Set
  35. GetAdminRules(ctx context.Context, userId uint64) (menuList []*model.UserMenus, permissions []string, err error)
  36. List(ctx context.Context, req *system.UserSearchReq) (total int, userList []*entity.SysUser, err error)
  37. GetUsersRoleDept(ctx context.Context, userList []*entity.SysUser) (users []*model.SysUserRoleDeptRes, err error)
  38. Add(ctx context.Context, req *system.UserAddReq) (err error)
  39. GetEditUser(ctx context.Context, id uint64) (res *system.UserGetEditRes, err error)
  40. Edit(ctx context.Context, req *system.UserEditReq) (err error)
  41. ResetUserPwd(ctx context.Context, req *system.UserResetPwdReq) (err error)
  42. ChangeUserStatus(ctx context.Context, req *system.UserStatusReq) (err error)
  43. Delete(ctx context.Context, ids []int) (err error)
  44. }
  45. type userImpl struct{}
  46. var (
  47. notCheckAuthAdminIds *gset.Set //无需验证权限的用户id
  48. userService = userImpl{}
  49. )
  50. func User() IUser {
  51. return IUser(&userService)
  52. }
  53. func (s *userImpl) NotCheckAuthAdminIds(ctx context.Context) *gset.Set {
  54. ids := g.Cfg().MustGet(ctx, "system.notCheckAuthAdminIds")
  55. if !g.IsNil(ids) {
  56. notCheckAuthAdminIds = gset.NewFrom(ids)
  57. }
  58. return notCheckAuthAdminIds
  59. }
  60. func (s *userImpl) GetAdminUserByUsernamePassword(ctx context.Context, req *system.UserLoginReq) (user *model.LoginUserRes, err error) {
  61. err = g.Try(func() {
  62. user, err = s.GetUserByUsername(ctx, req.Username)
  63. liberr.ErrIsNil(ctx, err)
  64. liberr.ValueIsNil(user, "账号密码错误")
  65. //验证密码
  66. if libUtils.EncryptPassword(req.Password, user.UserSalt) != user.UserPassword {
  67. liberr.ErrIsNil(ctx, gerror.New("账号密码错误"))
  68. }
  69. //账号状态
  70. if user.UserStatus == 0 {
  71. liberr.ErrIsNil(ctx, gerror.New("账号已被冻结"))
  72. }
  73. })
  74. return
  75. }
  76. // GetUserByUsername 通过用户名获取用户信息
  77. func (s *userImpl) GetUserByUsername(ctx context.Context, userName string) (user *model.LoginUserRes, err error) {
  78. err = g.Try(func() {
  79. user = &model.LoginUserRes{}
  80. err = dao.SysUser.Ctx(ctx).Fields(user).Where(dao.SysUser.Columns().UserName, userName).Scan(user)
  81. liberr.ErrIsNil(ctx, err, "账号密码错误")
  82. })
  83. return
  84. }
  85. // LoginLog 记录登录日志
  86. func (s *userImpl) LoginLog(ctx context.Context, params *model.LoginLogParams) {
  87. ua := user_agent.New(params.UserAgent)
  88. browser, _ := ua.Browser()
  89. loginData := &do.SysLoginLog{
  90. LoginName: params.Username,
  91. Ipaddr: params.Ip,
  92. LoginLocation: libUtils.GetCityByIp(params.Ip),
  93. Browser: browser,
  94. Os: ua.OS(),
  95. Status: params.Status,
  96. Msg: params.Msg,
  97. LoginTime: gtime.Now(),
  98. Module: params.Module,
  99. }
  100. _, err := dao.SysLoginLog.Ctx(ctx).Insert(loginData)
  101. if err != nil {
  102. g.Log().Error(ctx, err)
  103. }
  104. }
  105. func (s *userImpl) UpdateLoginInfo(ctx context.Context, id uint64, ip string) (err error) {
  106. g.Try(func() {
  107. _, err = dao.SysUser.Ctx(ctx).WherePri(id).Update(g.Map{
  108. dao.SysUser.Columns().LastLoginIp: ip,
  109. dao.SysUser.Columns().LastLoginTime: gtime.Now(),
  110. })
  111. liberr.ErrIsNil(ctx, err, "更新用户登录信息失败")
  112. })
  113. return
  114. }
  115. // GetAdminRules 获取用户菜单数据
  116. func (s *userImpl) GetAdminRules(ctx context.Context, userId uint64) (menuList []*model.UserMenus, permissions []string, err error) {
  117. err = g.Try(func() {
  118. //是否超管
  119. isSuperAdmin := false
  120. //获取无需验证权限的用户id
  121. s.NotCheckAuthAdminIds(ctx).Iterator(func(v interface{}) bool {
  122. if gconv.Uint64(v) == userId {
  123. isSuperAdmin = true
  124. return false
  125. }
  126. return true
  127. })
  128. //获取用户菜单数据
  129. allRoles, err := Role().GetRoleList(ctx)
  130. liberr.ErrIsNil(ctx, err)
  131. roles, err := s.GetAdminRole(ctx, userId, allRoles)
  132. liberr.ErrIsNil(ctx, err)
  133. name := make([]string, len(roles))
  134. roleIds := make([]uint, len(roles))
  135. for k, v := range roles {
  136. name[k] = v.Name
  137. roleIds[k] = v.Id
  138. }
  139. //获取菜单信息
  140. if isSuperAdmin {
  141. //超管获取所有菜单
  142. permissions = []string{"*/*/*"}
  143. menuList, err = s.GetAllMenus(ctx)
  144. liberr.ErrIsNil(ctx, err)
  145. } else {
  146. menuList, err = s.GetAdminMenusByRoleIds(ctx, roleIds)
  147. liberr.ErrIsNil(ctx, err)
  148. permissions, err = s.GetPermissions(ctx, roleIds)
  149. liberr.ErrIsNil(ctx, err)
  150. }
  151. })
  152. return
  153. }
  154. // GetAdminRole 获取用户角色
  155. func (s *userImpl) GetAdminRole(ctx context.Context, userId uint64, allRoleList []*entity.SysRole) (roles []*entity.SysRole, err error) {
  156. var roleIds []uint
  157. roleIds, err = s.GetAdminRoleIds(ctx, userId)
  158. if err != nil {
  159. return
  160. }
  161. roles = make([]*entity.SysRole, 0, len(allRoleList))
  162. for _, v := range allRoleList {
  163. for _, id := range roleIds {
  164. if id == v.Id {
  165. roles = append(roles, v)
  166. }
  167. }
  168. if len(roles) == len(roleIds) {
  169. break
  170. }
  171. }
  172. return
  173. }
  174. // GetAdminRoleIds 获取用户角色ids
  175. func (s *userImpl) GetAdminRoleIds(ctx context.Context, userId uint64) (roleIds []uint, err error) {
  176. enforcer, e := commonService.CasbinEnforcer(ctx)
  177. if e != nil {
  178. err = e
  179. return
  180. }
  181. //查询关联角色规则
  182. groupPolicy := enforcer.GetFilteredGroupingPolicy(0, gconv.String(userId))
  183. if len(groupPolicy) > 0 {
  184. roleIds = make([]uint, len(groupPolicy))
  185. //得到角色id的切片
  186. for k, v := range groupPolicy {
  187. roleIds[k] = gconv.Uint(v[1])
  188. }
  189. }
  190. return
  191. }
  192. func (s *userImpl) GetAllMenus(ctx context.Context) (menus []*model.UserMenus, err error) {
  193. //获取所有开启的菜单
  194. var allMenus []*model.SysAuthRuleInfoRes
  195. allMenus, err = Rule().GetIsMenuList(ctx)
  196. if err != nil {
  197. return
  198. }
  199. menus = make([]*model.UserMenus, len(allMenus))
  200. for k, v := range allMenus {
  201. var menu *model.UserMenu
  202. menu = s.setMenuData(menu, v)
  203. menus[k] = &model.UserMenus{UserMenu: menu}
  204. }
  205. menus = s.GetMenusTree(menus, 0)
  206. return
  207. }
  208. func (s *userImpl) GetAdminMenusByRoleIds(ctx context.Context, roleIds []uint) (menus []*model.UserMenus, err error) {
  209. //获取角色对应的菜单id
  210. err = g.Try(func() {
  211. enforcer, e := commonService.CasbinEnforcer(ctx)
  212. liberr.ErrIsNil(ctx, e)
  213. menuIds := map[int64]int64{}
  214. for _, roleId := range roleIds {
  215. //查询当前权限
  216. gp := enforcer.GetFilteredPolicy(0, fmt.Sprintf("%d", roleId))
  217. for _, p := range gp {
  218. mid := gconv.Int64(p[1])
  219. menuIds[mid] = mid
  220. }
  221. }
  222. //获取所有开启的菜单
  223. allMenus, err := Rule().GetIsMenuList(ctx)
  224. liberr.ErrIsNil(ctx, err)
  225. menus = make([]*model.UserMenus, 0, len(allMenus))
  226. for _, v := range allMenus {
  227. if _, ok := menuIds[gconv.Int64(v.Id)]; gstr.Equal(v.Condition, "nocheck") || ok {
  228. var roleMenu *model.UserMenu
  229. roleMenu = s.setMenuData(roleMenu, v)
  230. menus = append(menus, &model.UserMenus{UserMenu: roleMenu})
  231. }
  232. }
  233. menus = s.GetMenusTree(menus, 0)
  234. })
  235. return
  236. }
  237. func (s *userImpl) GetMenusTree(menus []*model.UserMenus, pid uint) []*model.UserMenus {
  238. returnList := make([]*model.UserMenus, 0, len(menus))
  239. for _, menu := range menus {
  240. if menu.Pid == pid {
  241. menu.Children = s.GetMenusTree(menus, menu.Id)
  242. returnList = append(returnList, menu)
  243. }
  244. }
  245. return returnList
  246. }
  247. func (s *userImpl) setMenuData(menu *model.UserMenu, entity *model.SysAuthRuleInfoRes) *model.UserMenu {
  248. menu = &model.UserMenu{
  249. Id: entity.Id,
  250. Pid: entity.Pid,
  251. Name: gstr.CaseCamelLower(gstr.Replace(entity.Name, "/", "_")),
  252. Component: entity.Component,
  253. Path: entity.Path,
  254. MenuMeta: &model.MenuMeta{
  255. Icon: entity.Icon,
  256. Title: entity.Title,
  257. IsLink: "",
  258. IsHide: entity.IsHide == 1,
  259. IsKeepAlive: entity.IsCached == 1,
  260. IsAffix: entity.IsAffix == 1,
  261. IsIframe: entity.IsIframe == 1,
  262. },
  263. }
  264. if menu.MenuMeta.IsIframe || entity.IsLink == 1 {
  265. menu.MenuMeta.IsLink = entity.LinkUrl
  266. }
  267. return menu
  268. }
  269. func (s *userImpl) GetPermissions(ctx context.Context, roleIds []uint) (userButtons []string, err error) {
  270. err = g.Try(func() {
  271. //获取角色对应的菜单id
  272. enforcer, err := commonService.CasbinEnforcer(ctx)
  273. liberr.ErrIsNil(ctx, err)
  274. menuIds := map[int64]int64{}
  275. for _, roleId := range roleIds {
  276. //查询当前权限
  277. gp := enforcer.GetFilteredPolicy(0, gconv.String(roleId))
  278. for _, p := range gp {
  279. mid := gconv.Int64(p[1])
  280. menuIds[mid] = mid
  281. }
  282. }
  283. //获取所有开启的按钮
  284. allButtons, err := Rule().GetIsButtonList(ctx)
  285. liberr.ErrIsNil(ctx, err)
  286. userButtons = make([]string, 0, len(allButtons))
  287. for _, button := range allButtons {
  288. if _, ok := menuIds[gconv.Int64(button.Id)]; gstr.Equal(button.Condition, "nocheck") || ok {
  289. userButtons = append(userButtons, button.Name)
  290. }
  291. }
  292. })
  293. return
  294. }
  295. // List 用户列表
  296. func (s *userImpl) List(ctx context.Context, req *system.UserSearchReq) (total int, userList []*entity.SysUser, err error) {
  297. err = g.Try(func() {
  298. m := dao.SysUser.Ctx(ctx)
  299. if req.KeyWords != "" {
  300. keyWords := "%" + req.KeyWords + "%"
  301. m = m.Where("user_name like ? or user_nickname like ?", keyWords, keyWords)
  302. }
  303. if req.DeptId != "" {
  304. deptIds, e := s.getSearchDeptIds(ctx, gconv.Int64(req.DeptId))
  305. liberr.ErrIsNil(ctx, e)
  306. m = m.Where("dept_id in (?)", deptIds)
  307. }
  308. if req.Status != "" {
  309. m = m.Where("user_status", gconv.Int(req.Status))
  310. }
  311. if req.Mobile != "" {
  312. m = m.Where("mobile like ?", "%"+req.Mobile+"%")
  313. }
  314. if len(req.DateRange) > 0 {
  315. m = m.Where("created_at >=? AND created_at <=?", req.DateRange[0], req.DateRange[1])
  316. }
  317. if req.PageSize == 0 {
  318. req.PageSize = consts.PageSize
  319. }
  320. if req.PageNum == 0 {
  321. req.PageNum = 1
  322. }
  323. total, err = m.Count()
  324. liberr.ErrIsNil(ctx, err, "获取用户数据失败")
  325. err = m.FieldsEx(dao.SysUser.Columns().UserPassword, dao.SysUser.Columns().UserSalt).
  326. Page(req.PageNum, req.PageSize).Order("id asc").Scan(&userList)
  327. liberr.ErrIsNil(ctx, err, "获取用户列表失败")
  328. })
  329. return
  330. }
  331. // GetUsersRoleDept 获取多个用户角色 部门信息
  332. func (s *userImpl) GetUsersRoleDept(ctx context.Context, userList []*entity.SysUser) (users []*model.SysUserRoleDeptRes, err error) {
  333. err = g.Try(func() {
  334. allRoles, e := Role().GetRoleList(ctx)
  335. liberr.ErrIsNil(ctx, e)
  336. depts, e := Dept().GetFromCache(ctx)
  337. liberr.ErrIsNil(ctx, e)
  338. users = make([]*model.SysUserRoleDeptRes, len(userList))
  339. for k, u := range userList {
  340. var dept *entity.SysDept
  341. users[k] = &model.SysUserRoleDeptRes{
  342. SysUser: u,
  343. }
  344. for _, d := range depts {
  345. if u.DeptId == uint64(d.DeptId) {
  346. dept = d
  347. }
  348. }
  349. users[k].Dept = dept
  350. roles, e := s.GetAdminRole(ctx, u.Id, allRoles)
  351. liberr.ErrIsNil(ctx, e)
  352. for _, r := range roles {
  353. users[k].RoleInfo = append(users[k].RoleInfo, &model.SysUserRoleInfoRes{RoleId: r.Id, Name: r.Name})
  354. }
  355. }
  356. })
  357. return
  358. }
  359. func (s *userImpl) getSearchDeptIds(ctx context.Context, deptId int64) (deptIds []int64, err error) {
  360. err = g.Try(func() {
  361. deptAll, e := Dept().GetFromCache(ctx)
  362. liberr.ErrIsNil(ctx, e)
  363. deptWithChildren := Dept().FindSonByParentId(deptAll, gconv.Int64(deptId))
  364. deptIds = make([]int64, len(deptWithChildren))
  365. for k, v := range deptWithChildren {
  366. deptIds[k] = v.DeptId
  367. }
  368. deptIds = append(deptIds, deptId)
  369. })
  370. return
  371. }
  372. func (s *userImpl) Add(ctx context.Context, req *system.UserAddReq) (err error) {
  373. err = s.userNameOrMobileExists(ctx, req.UserName, req.Mobile)
  374. if err != nil {
  375. return
  376. }
  377. req.UserSalt = grand.S(10)
  378. req.Password = libUtils.EncryptPassword(req.Password, req.UserSalt)
  379. err = g.DB().Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
  380. err = g.Try(func() {
  381. userId, e := dao.SysUser.Ctx(ctx).TX(tx).InsertAndGetId(do.SysUser{
  382. UserName: req.UserName,
  383. Mobile: req.Mobile,
  384. UserNickname: req.NickName,
  385. UserPassword: req.Password,
  386. UserSalt: req.UserSalt,
  387. UserStatus: req.Status,
  388. UserEmail: req.Email,
  389. Sex: req.Sex,
  390. DeptId: req.DeptId,
  391. Remark: req.Remark,
  392. IsAdmin: req.IsAdmin,
  393. })
  394. liberr.ErrIsNil(ctx, e, "添加用户失败")
  395. e = s.addUserRole(ctx, req.RoleIds, userId)
  396. liberr.ErrIsNil(ctx, e, "设置用户权限失败")
  397. e = s.AddUserPost(ctx, tx, req.PostIds, userId)
  398. liberr.ErrIsNil(ctx, e)
  399. })
  400. return err
  401. })
  402. return
  403. }
  404. func (s *userImpl) Edit(ctx context.Context, req *system.UserEditReq) (err error) {
  405. err = s.userNameOrMobileExists(ctx, "", req.Mobile, req.UserId)
  406. if err != nil {
  407. return
  408. }
  409. err = g.DB().Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
  410. err = g.Try(func() {
  411. _, err = dao.SysUser.Ctx(ctx).TX(tx).WherePri(req.UserId).Update(do.SysUser{
  412. Mobile: req.Mobile,
  413. UserNickname: req.NickName,
  414. UserStatus: req.Status,
  415. UserEmail: req.Email,
  416. Sex: req.Sex,
  417. DeptId: req.DeptId,
  418. Remark: req.Remark,
  419. IsAdmin: req.IsAdmin,
  420. })
  421. liberr.ErrIsNil(ctx, err, "修改用户信息失败")
  422. //设置用户所属角色信息
  423. err = s.EditUserRole(ctx, req.RoleIds, req.UserId)
  424. liberr.ErrIsNil(ctx, err, "设置用户权限失败")
  425. err = s.AddUserPost(ctx, tx, req.PostIds, req.UserId)
  426. liberr.ErrIsNil(ctx, err)
  427. })
  428. return err
  429. })
  430. return
  431. }
  432. // AddUserPost 添加用户岗位信息
  433. func (s *userImpl) AddUserPost(ctx context.Context, tx *gdb.TX, postIds []int64, userId int64) (err error) {
  434. err = g.Try(func() {
  435. //删除旧岗位信息
  436. _, err = dao.SysUserPost.Ctx(ctx).TX(tx).Where(dao.SysUserPost.Columns().UserId, userId).Delete()
  437. liberr.ErrIsNil(ctx, err, "设置用户岗位失败")
  438. if len(postIds) == 0 {
  439. return
  440. }
  441. //添加用户岗位信息
  442. data := g.List{}
  443. for _, v := range postIds {
  444. data = append(data, g.Map{
  445. dao.SysUserPost.Columns().UserId: userId,
  446. dao.SysUserPost.Columns().PostId: v,
  447. })
  448. }
  449. _, err = dao.SysUserPost.Ctx(ctx).TX(tx).Data(data).Insert()
  450. liberr.ErrIsNil(ctx, err, "设置用户岗位失败")
  451. })
  452. return
  453. }
  454. // AddUserRole 添加用户角色信息
  455. func (s *userImpl) addUserRole(ctx context.Context, roleIds []int64, userId int64) (err error) {
  456. err = g.Try(func() {
  457. enforcer, e := commonService.CasbinEnforcer(ctx)
  458. liberr.ErrIsNil(ctx, e)
  459. for _, v := range roleIds {
  460. _, e = enforcer.AddGroupingPolicy(gconv.String(userId), gconv.String(v))
  461. liberr.ErrIsNil(ctx, e)
  462. }
  463. })
  464. return
  465. }
  466. // EditUserRole 修改用户角色信息
  467. func (s *userImpl) EditUserRole(ctx context.Context, roleIds []int64, userId int64) (err error) {
  468. err = g.Try(func() {
  469. enforcer, e := commonService.CasbinEnforcer(ctx)
  470. liberr.ErrIsNil(ctx, e)
  471. //删除用户旧角色信息
  472. enforcer.RemoveFilteredGroupingPolicy(0, gconv.String(userId))
  473. for _, v := range roleIds {
  474. _, err = enforcer.AddGroupingPolicy(gconv.String(userId), gconv.String(v))
  475. liberr.ErrIsNil(ctx, err)
  476. }
  477. })
  478. return
  479. }
  480. func (s *userImpl) userNameOrMobileExists(ctx context.Context, userName, mobile string, id ...int64) error {
  481. user := (*entity.SysUser)(nil)
  482. err := g.Try(func() {
  483. m := dao.SysUser.Ctx(ctx)
  484. if len(id) > 0 {
  485. m = m.Where(dao.SysUser.Columns().Id+" != ", id)
  486. }
  487. m = m.Where(fmt.Sprintf("%s='%s' OR %s='%s'",
  488. dao.SysUser.Columns().UserName,
  489. userName,
  490. dao.SysUser.Columns().Mobile,
  491. mobile))
  492. err := m.Limit(1).Scan(&user)
  493. liberr.ErrIsNil(ctx, err, "获取用户信息失败")
  494. if user == nil {
  495. return
  496. }
  497. if user.UserName == userName {
  498. liberr.ErrIsNil(ctx, gerror.New("用户名已存在"))
  499. }
  500. if user.Mobile == mobile {
  501. liberr.ErrIsNil(ctx, gerror.New("手机号已存在"))
  502. }
  503. })
  504. return err
  505. }
  506. // GetEditUser 获取编辑用户信息
  507. func (s *userImpl) GetEditUser(ctx context.Context, id uint64) (res *system.UserGetEditRes, err error) {
  508. res = new(system.UserGetEditRes)
  509. err = g.Try(func() {
  510. //获取用户信息
  511. res.User, err = s.GetUserInfoById(ctx, id)
  512. liberr.ErrIsNil(ctx, err)
  513. //获取已选择的角色信息
  514. res.CheckedRoleIds, err = s.GetAdminRoleIds(ctx, id)
  515. liberr.ErrIsNil(ctx, err)
  516. res.CheckedPosts, err = s.GetUserPostIds(ctx, id)
  517. liberr.ErrIsNil(ctx, err)
  518. })
  519. return
  520. }
  521. // GetUserInfoById 通过Id获取用户信息
  522. func (s *userImpl) GetUserInfoById(ctx context.Context, id uint64, withPwd ...bool) (user *entity.SysUser, err error) {
  523. err = g.Try(func() {
  524. if len(withPwd) > 0 && withPwd[0] {
  525. //用户用户信息
  526. err = dao.SysUser.Ctx(ctx).Where(dao.SysUser.Columns().Id, id).Scan(&user)
  527. } else {
  528. //用户用户信息
  529. err = dao.SysUser.Ctx(ctx).Where(dao.SysUser.Columns().Id, id).
  530. FieldsEx(dao.SysUser.Columns().UserPassword, dao.SysUser.Columns().UserSalt).Scan(&user)
  531. }
  532. liberr.ErrIsNil(ctx, err, "获取用户数据失败")
  533. })
  534. return
  535. }
  536. // GetUserPostIds 获取用户岗位
  537. func (s *userImpl) GetUserPostIds(ctx context.Context, userId uint64) (postIds []int64, err error) {
  538. err = g.Try(func() {
  539. var list []*entity.SysUserPost
  540. err = dao.SysUserPost.Ctx(ctx).Where(dao.SysUserPost.Columns().UserId, userId).Scan(&list)
  541. liberr.ErrIsNil(ctx, err, "获取用户岗位信息失败")
  542. postIds = make([]int64, 0)
  543. for _, entity := range list {
  544. postIds = append(postIds, entity.PostId)
  545. }
  546. })
  547. return
  548. }
  549. // ResetUserPwd 重置用户密码
  550. func (s *userImpl) ResetUserPwd(ctx context.Context, req *system.UserResetPwdReq) (err error) {
  551. salt := grand.S(10)
  552. password := libUtils.EncryptPassword(req.Password, salt)
  553. err = g.Try(func() {
  554. _, err = dao.SysUser.Ctx(ctx).WherePri(req.Id).Update(g.Map{
  555. dao.SysUser.Columns().UserSalt: salt,
  556. dao.SysUser.Columns().UserPassword: password,
  557. })
  558. liberr.ErrIsNil(ctx, err, "重置用户密码失败")
  559. })
  560. return
  561. }
  562. func (s *userImpl) ChangeUserStatus(ctx context.Context, req *system.UserStatusReq) (err error) {
  563. err = g.Try(func() {
  564. _, err = dao.SysUser.Ctx(ctx).WherePri(req.Id).Update(do.SysUser{UserStatus: req.UserStatus})
  565. liberr.ErrIsNil(ctx, err, "设置用户状态失败")
  566. })
  567. return
  568. }
  569. // Delete 删除用户
  570. func (s *userImpl) Delete(ctx context.Context, ids []int) (err error) {
  571. err = g.DB().Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
  572. err = g.Try(func() {
  573. _, err = dao.SysUser.Ctx(ctx).TX(tx).Where(dao.SysUser.Columns().Id+" in(?)", ids).Delete()
  574. liberr.ErrIsNil(ctx, err, "删除用户失败")
  575. //删除对应权限
  576. enforcer, e := commonService.CasbinEnforcer(ctx)
  577. liberr.ErrIsNil(ctx, e)
  578. for _, v := range ids {
  579. enforcer.RemoveFilteredGroupingPolicy(0, gconv.String(v))
  580. }
  581. //删除用户对应的岗位
  582. _, err = dao.SysUserPost.Ctx(ctx).TX(tx).Delete(dao.SysUserPost.Columns().UserId+" in (?)", ids)
  583. liberr.ErrIsNil(ctx, err, "删除用户的岗位失败")
  584. })
  585. return err
  586. })
  587. return
  588. }