sys_user.go 18 KB

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