sys_user.go 20 KB

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