sys_user.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638
  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. // GetUserById 通过用户名获取用户信息
  78. func (s *sSysUser) GetUserById(ctx context.Context, id uint64) (user *model.LoginUserRes, err error) {
  79. err = g.Try(ctx, func(ctx context.Context) {
  80. user = &model.LoginUserRes{}
  81. err = dao.SysUser.Ctx(ctx).Fields(user).WherePri(id).Scan(user)
  82. liberr.ErrIsNil(ctx, err, "获取用户信息失败")
  83. })
  84. return
  85. }
  86. // LoginLog 记录登录日志
  87. func (s *sSysUser) LoginLog(ctx context.Context, params *model.LoginLogParams) {
  88. ua := user_agent.New(params.UserAgent)
  89. browser, _ := ua.Browser()
  90. loginData := &do.SysLoginLog{
  91. LoginName: params.Username,
  92. Ipaddr: params.Ip,
  93. LoginLocation: libUtils.GetCityByIp(params.Ip),
  94. Browser: browser,
  95. Os: ua.OS(),
  96. Status: params.Status,
  97. Msg: params.Msg,
  98. LoginTime: gtime.Now(),
  99. Module: params.Module,
  100. }
  101. _, err := dao.SysLoginLog.Ctx(ctx).Insert(loginData)
  102. if err != nil {
  103. g.Log().Error(ctx, err)
  104. }
  105. }
  106. func (s *sSysUser) UpdateLoginInfo(ctx context.Context, id uint64, ip string) (err error) {
  107. g.Try(ctx, func(ctx context.Context) {
  108. _, err = dao.SysUser.Ctx(ctx).WherePri(id).Unscoped().Update(g.Map{
  109. dao.SysUser.Columns().LastLoginIp: ip,
  110. dao.SysUser.Columns().LastLoginTime: gtime.Now(),
  111. })
  112. liberr.ErrIsNil(ctx, err, "更新用户登录信息失败")
  113. })
  114. return
  115. }
  116. // GetAdminRules 获取用户菜单数据
  117. func (s *sSysUser) GetAdminRules(ctx context.Context, userId uint64) (menuList []*model.UserMenus, permissions []string, err error) {
  118. err = g.Try(ctx, func(ctx context.Context) {
  119. //是否超管
  120. isSuperAdmin := false
  121. //获取无需验证权限的用户id
  122. s.NotCheckAuthAdminIds(ctx).Iterator(func(v interface{}) bool {
  123. if gconv.Uint64(v) == userId {
  124. isSuperAdmin = true
  125. return false
  126. }
  127. return true
  128. })
  129. //获取用户菜单数据
  130. allRoles, err := service.SysRole().GetRoleList(ctx)
  131. liberr.ErrIsNil(ctx, err)
  132. roles, err := s.GetAdminRole(ctx, userId, allRoles)
  133. liberr.ErrIsNil(ctx, err)
  134. name := make([]string, len(roles))
  135. roleIds := make([]uint, len(roles))
  136. for k, v := range roles {
  137. name[k] = v.Name
  138. roleIds[k] = v.Id
  139. }
  140. //获取菜单信息
  141. if isSuperAdmin {
  142. //超管获取所有菜单
  143. permissions = []string{"*/*/*"}
  144. menuList, err = s.GetAllMenus(ctx)
  145. liberr.ErrIsNil(ctx, err)
  146. } else {
  147. menuList, err = s.GetAdminMenusByRoleIds(ctx, roleIds)
  148. liberr.ErrIsNil(ctx, err)
  149. permissions, err = s.GetPermissions(ctx, roleIds)
  150. liberr.ErrIsNil(ctx, err)
  151. }
  152. })
  153. return
  154. }
  155. // GetAdminRole 获取用户角色
  156. func (s *sSysUser) GetAdminRole(ctx context.Context, userId uint64, allRoleList []*entity.SysRole) (roles []*entity.SysRole, err error) {
  157. var roleIds []uint
  158. roleIds, err = s.GetAdminRoleIds(ctx, userId)
  159. if err != nil {
  160. return
  161. }
  162. roles = make([]*entity.SysRole, 0, len(allRoleList))
  163. for _, v := range allRoleList {
  164. for _, id := range roleIds {
  165. if id == v.Id {
  166. roles = append(roles, v)
  167. }
  168. }
  169. if len(roles) == len(roleIds) {
  170. break
  171. }
  172. }
  173. return
  174. }
  175. // GetAdminRoleIds 获取用户角色ids
  176. func (s *sSysUser) GetAdminRoleIds(ctx context.Context, userId uint64) (roleIds []uint, err error) {
  177. enforcer, e := commonService.CasbinEnforcer(ctx)
  178. if e != nil {
  179. err = e
  180. return
  181. }
  182. //查询关联角色规则
  183. groupPolicy := enforcer.GetFilteredGroupingPolicy(0, fmt.Sprintf("%s%d", s.casBinUserPrefix, userId))
  184. if len(groupPolicy) > 0 {
  185. roleIds = make([]uint, len(groupPolicy))
  186. //得到角色id的切片
  187. for k, v := range groupPolicy {
  188. roleIds[k] = gconv.Uint(v[1])
  189. }
  190. }
  191. return
  192. }
  193. func (s *sSysUser) GetAllMenus(ctx context.Context) (menus []*model.UserMenus, err error) {
  194. //获取所有开启的菜单
  195. var allMenus []*model.SysAuthRuleInfoRes
  196. allMenus, err = service.SysAuthRule().GetIsMenuList(ctx)
  197. if err != nil {
  198. return
  199. }
  200. menus = make([]*model.UserMenus, len(allMenus))
  201. for k, v := range allMenus {
  202. var menu *model.UserMenu
  203. menu = s.setMenuData(menu, v)
  204. menus[k] = &model.UserMenus{UserMenu: menu}
  205. }
  206. menus = s.GetMenusTree(menus, 0)
  207. return
  208. }
  209. func (s *sSysUser) GetAdminMenusByRoleIds(ctx context.Context, roleIds []uint) (menus []*model.UserMenus, err error) {
  210. //获取角色对应的菜单id
  211. err = g.Try(ctx, func(ctx context.Context) {
  212. enforcer, e := commonService.CasbinEnforcer(ctx)
  213. liberr.ErrIsNil(ctx, e)
  214. menuIds := map[int64]int64{}
  215. for _, roleId := range roleIds {
  216. //查询当前权限
  217. gp := enforcer.GetFilteredPolicy(0, gconv.String(roleId))
  218. for _, p := range gp {
  219. mid := gconv.Int64(p[1])
  220. menuIds[mid] = mid
  221. }
  222. }
  223. //获取所有开启的菜单
  224. allMenus, err := service.SysAuthRule().GetIsMenuList(ctx)
  225. liberr.ErrIsNil(ctx, err)
  226. menus = make([]*model.UserMenus, 0, len(allMenus))
  227. for _, v := range allMenus {
  228. if _, ok := menuIds[gconv.Int64(v.Id)]; gstr.Equal(v.Condition, "nocheck") || ok {
  229. var roleMenu *model.UserMenu
  230. roleMenu = s.setMenuData(roleMenu, v)
  231. menus = append(menus, &model.UserMenus{UserMenu: roleMenu})
  232. }
  233. }
  234. menus = s.GetMenusTree(menus, 0)
  235. })
  236. return
  237. }
  238. func (s *sSysUser) GetMenusTree(menus []*model.UserMenus, pid uint) []*model.UserMenus {
  239. returnList := make([]*model.UserMenus, 0, len(menus))
  240. for _, menu := range menus {
  241. if menu.Pid == pid {
  242. menu.Children = s.GetMenusTree(menus, menu.Id)
  243. returnList = append(returnList, menu)
  244. }
  245. }
  246. return returnList
  247. }
  248. func (s *sSysUser) setMenuData(menu *model.UserMenu, entity *model.SysAuthRuleInfoRes) *model.UserMenu {
  249. menu = &model.UserMenu{
  250. Id: entity.Id,
  251. Pid: entity.Pid,
  252. Name: gstr.CaseCamelLower(gstr.Replace(entity.Name, "/", "_")),
  253. Component: entity.Component,
  254. Path: entity.Path,
  255. MenuMeta: &model.MenuMeta{
  256. Icon: entity.Icon,
  257. Title: entity.Title,
  258. IsLink: "",
  259. IsHide: entity.IsHide == 1,
  260. IsKeepAlive: entity.IsCached == 1,
  261. IsAffix: entity.IsAffix == 1,
  262. IsIframe: entity.IsIframe == 1,
  263. },
  264. }
  265. if menu.MenuMeta.IsIframe || entity.IsLink == 1 {
  266. menu.MenuMeta.IsLink = entity.LinkUrl
  267. }
  268. return menu
  269. }
  270. func (s *sSysUser) GetPermissions(ctx context.Context, roleIds []uint) (userButtons []string, err error) {
  271. err = g.Try(ctx, func(ctx context.Context) {
  272. //获取角色对应的菜单id
  273. enforcer, err := commonService.CasbinEnforcer(ctx)
  274. liberr.ErrIsNil(ctx, err)
  275. menuIds := map[int64]int64{}
  276. for _, roleId := range roleIds {
  277. //查询当前权限
  278. gp := enforcer.GetFilteredPolicy(0, gconv.String(roleId))
  279. for _, p := range gp {
  280. mid := gconv.Int64(p[1])
  281. menuIds[mid] = mid
  282. }
  283. }
  284. //获取所有开启的按钮
  285. allButtons, err := service.SysAuthRule().GetIsButtonList(ctx)
  286. liberr.ErrIsNil(ctx, err)
  287. userButtons = make([]string, 0, len(allButtons))
  288. for _, button := range allButtons {
  289. if _, ok := menuIds[gconv.Int64(button.Id)]; gstr.Equal(button.Condition, "nocheck") || ok {
  290. userButtons = append(userButtons, button.Name)
  291. }
  292. }
  293. })
  294. return
  295. }
  296. // List 用户列表
  297. func (s *sSysUser) List(ctx context.Context, req *system.UserSearchReq) (total interface{}, userList []*entity.SysUser, err error) {
  298. err = g.Try(ctx, func(ctx context.Context) {
  299. m := dao.SysUser.Ctx(ctx)
  300. if req.KeyWords != "" {
  301. keyWords := "%" + req.KeyWords + "%"
  302. m = m.Where("user_name like ? or user_nickname like ?", keyWords, keyWords)
  303. }
  304. if req.DeptId != "" {
  305. deptIds, e := s.getSearchDeptIds(ctx, gconv.Uint64(req.DeptId))
  306. liberr.ErrIsNil(ctx, e)
  307. m = m.Where("dept_id in (?)", deptIds)
  308. }
  309. if req.Status != "" {
  310. m = m.Where("user_status", gconv.Int(req.Status))
  311. }
  312. if req.Mobile != "" {
  313. m = m.Where("mobile like ?", "%"+req.Mobile+"%")
  314. }
  315. if len(req.DateRange) > 0 {
  316. m = m.Where("created_at >=? AND created_at <=?", req.DateRange[0], req.DateRange[1])
  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 *sSysUser) GetUsersRoleDept(ctx context.Context, userList []*entity.SysUser) (users []*model.SysUserRoleDeptRes, err error) {
  334. err = g.Try(ctx, func(ctx context.Context) {
  335. allRoles, e := service.SysRole().GetRoleList(ctx)
  336. liberr.ErrIsNil(ctx, e)
  337. depts, e := service.SysDept().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 *sSysUser) getSearchDeptIds(ctx context.Context, deptId uint64) (deptIds []uint64, err error) {
  361. err = g.Try(ctx, func(ctx context.Context) {
  362. deptAll, e := service.SysDept().GetFromCache(ctx)
  363. liberr.ErrIsNil(ctx, e)
  364. deptWithChildren := service.SysDept().FindSonByParentId(deptAll, deptId)
  365. deptIds = make([]uint64, 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 *sSysUser) 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(ctx, func(ctx context.Context) {
  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 *sSysUser) 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(ctx, func(ctx context.Context) {
  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 *sSysUser) AddUserPost(ctx context.Context, tx gdb.TX, postIds []int64, userId int64) (err error) {
  435. err = g.Try(ctx, func(ctx context.Context) {
  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 *sSysUser) addUserRole(ctx context.Context, roleIds []int64, userId int64) (err error) {
  457. err = g.Try(ctx, func(ctx context.Context) {
  458. enforcer, e := commonService.CasbinEnforcer(ctx)
  459. liberr.ErrIsNil(ctx, e)
  460. for _, v := range roleIds {
  461. _, e = enforcer.AddGroupingPolicy(fmt.Sprintf("%s%d", s.casBinUserPrefix, userId), gconv.String(v))
  462. liberr.ErrIsNil(ctx, e)
  463. }
  464. })
  465. return
  466. }
  467. // EditUserRole 修改用户角色信息
  468. func (s *sSysUser) EditUserRole(ctx context.Context, roleIds []int64, userId int64) (err error) {
  469. err = g.Try(ctx, func(ctx context.Context) {
  470. enforcer, e := commonService.CasbinEnforcer(ctx)
  471. liberr.ErrIsNil(ctx, e)
  472. //删除用户旧角色信息
  473. enforcer.RemoveFilteredGroupingPolicy(0, fmt.Sprintf("%s%d", s.casBinUserPrefix, userId))
  474. for _, v := range roleIds {
  475. _, err = enforcer.AddGroupingPolicy(fmt.Sprintf("%s%d", s.casBinUserPrefix, userId), gconv.String(v))
  476. liberr.ErrIsNil(ctx, err)
  477. }
  478. })
  479. return
  480. }
  481. func (s *sSysUser) UserNameOrMobileExists(ctx context.Context, userName, mobile string, id ...int64) error {
  482. user := (*entity.SysUser)(nil)
  483. err := g.Try(ctx, func(ctx context.Context) {
  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 *sSysUser) GetEditUser(ctx context.Context, id uint64) (res *system.UserGetEditRes, err error) {
  509. res = new(system.UserGetEditRes)
  510. err = g.Try(ctx, func(ctx context.Context) {
  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 *sSysUser) GetUserInfoById(ctx context.Context, id uint64, withPwd ...bool) (user *entity.SysUser, err error) {
  524. err = g.Try(ctx, func(ctx context.Context) {
  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 *sSysUser) GetUserPostIds(ctx context.Context, userId uint64) (postIds []int64, err error) {
  539. err = g.Try(ctx, func(ctx context.Context) {
  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 *sSysUser) 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(ctx, func(ctx context.Context) {
  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. }
  563. func (s *sSysUser) ChangeUserStatus(ctx context.Context, req *system.UserStatusReq) (err error) {
  564. err = g.Try(ctx, func(ctx context.Context) {
  565. _, err = dao.SysUser.Ctx(ctx).WherePri(req.Id).Update(do.SysUser{UserStatus: req.UserStatus})
  566. liberr.ErrIsNil(ctx, err, "设置用户状态失败")
  567. })
  568. return
  569. }
  570. // Delete 删除用户
  571. func (s *sSysUser) Delete(ctx context.Context, ids []int) (err error) {
  572. err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
  573. err = g.Try(ctx, func(ctx context.Context) {
  574. _, err = dao.SysUser.Ctx(ctx).TX(tx).Where(dao.SysUser.Columns().Id+" in(?)", ids).Delete()
  575. liberr.ErrIsNil(ctx, err, "删除用户失败")
  576. //删除对应权限
  577. enforcer, e := commonService.CasbinEnforcer(ctx)
  578. liberr.ErrIsNil(ctx, e)
  579. for _, v := range ids {
  580. enforcer.RemoveFilteredGroupingPolicy(0, fmt.Sprintf("%s%d", s.casBinUserPrefix, v))
  581. }
  582. //删除用户对应的岗位
  583. _, err = dao.SysUserPost.Ctx(ctx).TX(tx).Delete(dao.SysUserPost.Columns().UserId+" in (?)", ids)
  584. liberr.ErrIsNil(ctx, err, "删除用户的岗位失败")
  585. })
  586. return err
  587. })
  588. return
  589. }
  590. // GetUsers 通过用户ids查询多个用户信息
  591. func (s *sSysUser) GetUsers(ctx context.Context, ids []int) (users []*model.SysUserSimpleRes, err error) {
  592. if len(ids) == 0 {
  593. return
  594. }
  595. idsSet := gset.NewIntSetFrom(ids).Slice()
  596. err = g.Try(ctx, func(ctx context.Context) {
  597. err = dao.SysUser.Ctx(ctx).Where(dao.SysUser.Columns().Id+" in(?)", idsSet).
  598. Order(dao.SysUser.Columns().Id + " ASC").Scan(&users)
  599. })
  600. return
  601. }