sys_user.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626
  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 req.BeginTime != "" {
  315. m = m.Where("created_at >=?", req.BeginTime)
  316. }
  317. if req.EndTime != "" {
  318. m = m.Where("created_at <=?", req.EndTime)
  319. }
  320. if req.PageSize == 0 {
  321. req.PageSize = consts.PageSize
  322. }
  323. if req.PageNum == 0 {
  324. req.PageNum = 1
  325. }
  326. total, err = m.Count()
  327. liberr.ErrIsNil(ctx, err, "获取用户数据失败")
  328. err = m.FieldsEx(dao.SysUser.Columns().UserPassword, dao.SysUser.Columns().UserSalt).
  329. Page(req.PageNum, req.PageSize).Order("id asc").Scan(&userList)
  330. liberr.ErrIsNil(ctx, err, "获取用户列表失败")
  331. })
  332. return
  333. }
  334. // GetUsersRoleDept 获取多个用户角色 部门信息
  335. func (s *userImpl) GetUsersRoleDept(ctx context.Context, userList []*entity.SysUser) (users []*model.SysUserRoleDeptRes, err error) {
  336. err = g.Try(func() {
  337. allRoles, e := Role().GetRoleList(ctx)
  338. liberr.ErrIsNil(ctx, e)
  339. depts, e := Dept().GetFromCache(ctx)
  340. liberr.ErrIsNil(ctx, e)
  341. users = make([]*model.SysUserRoleDeptRes, len(userList))
  342. for k, u := range userList {
  343. var dept *entity.SysDept
  344. users[k] = &model.SysUserRoleDeptRes{
  345. SysUser: u,
  346. }
  347. for _, d := range depts {
  348. if u.DeptId == uint64(d.DeptId) {
  349. dept = d
  350. }
  351. }
  352. users[k].Dept = dept
  353. roles, e := s.GetAdminRole(ctx, u.Id, allRoles)
  354. liberr.ErrIsNil(ctx, e)
  355. for _, r := range roles {
  356. users[k].RoleInfo = append(users[k].RoleInfo, &model.SysUserRoleInfoRes{RoleId: r.Id, Name: r.Name})
  357. }
  358. }
  359. })
  360. return
  361. }
  362. func (s *userImpl) getSearchDeptIds(ctx context.Context, deptId int64) (deptIds []int64, err error) {
  363. err = g.Try(func() {
  364. deptAll, e := Dept().GetFromCache(ctx)
  365. liberr.ErrIsNil(ctx, e)
  366. deptWithChildren := Dept().FindSonByParentId(deptAll, gconv.Int64(deptId))
  367. deptIds = make([]int64, len(deptWithChildren))
  368. for k, v := range deptWithChildren {
  369. deptIds[k] = v.DeptId
  370. }
  371. deptIds = append(deptIds, deptId)
  372. })
  373. return
  374. }
  375. func (s *userImpl) Add(ctx context.Context, req *system.UserAddReq) (err error) {
  376. err = s.userNameOrMobileExists(ctx, req.UserName, req.Mobile)
  377. if err != nil {
  378. return
  379. }
  380. req.UserSalt = grand.S(10)
  381. req.Password = libUtils.EncryptPassword(req.Password, req.UserSalt)
  382. err = g.DB().Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
  383. err = g.Try(func() {
  384. userId, e := dao.SysUser.Ctx(ctx).TX(tx).InsertAndGetId(do.SysUser{
  385. UserName: req.UserName,
  386. Mobile: req.Mobile,
  387. UserNickname: req.NickName,
  388. UserPassword: req.Password,
  389. UserSalt: req.UserSalt,
  390. UserStatus: req.Status,
  391. UserEmail: req.Email,
  392. Sex: req.Sex,
  393. DeptId: req.DeptId,
  394. Remark: req.Remark,
  395. IsAdmin: req.IsAdmin,
  396. })
  397. liberr.ErrIsNil(ctx, e, "添加用户失败")
  398. e = s.addUserRole(ctx, req.RoleIds, userId)
  399. liberr.ErrIsNil(ctx, e, "设置用户权限失败")
  400. e = s.AddUserPost(ctx, tx, req.PostIds, userId)
  401. liberr.ErrIsNil(ctx, e)
  402. })
  403. return err
  404. })
  405. return
  406. }
  407. func (s *userImpl) Edit(ctx context.Context, req *system.UserEditReq) (err error) {
  408. err = s.userNameOrMobileExists(ctx, "", req.Mobile, req.UserId)
  409. if err != nil {
  410. return
  411. }
  412. err = g.DB().Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
  413. err = g.Try(func() {
  414. _, err = dao.SysUser.Ctx(ctx).TX(tx).WherePri(req.UserId).Update(do.SysUser{
  415. Mobile: req.Mobile,
  416. UserNickname: req.NickName,
  417. UserStatus: req.Status,
  418. UserEmail: req.Email,
  419. Sex: req.Sex,
  420. DeptId: req.DeptId,
  421. Remark: req.Remark,
  422. IsAdmin: req.IsAdmin,
  423. })
  424. liberr.ErrIsNil(ctx, err, "修改用户信息失败")
  425. //设置用户所属角色信息
  426. err = s.EditUserRole(ctx, req.RoleIds, req.UserId)
  427. liberr.ErrIsNil(ctx, err, "设置用户权限失败")
  428. err = s.AddUserPost(ctx, tx, req.PostIds, req.UserId)
  429. liberr.ErrIsNil(ctx, err)
  430. })
  431. return err
  432. })
  433. return
  434. }
  435. // AddUserPost 添加用户岗位信息
  436. func (s *userImpl) AddUserPost(ctx context.Context, tx *gdb.TX, postIds []int64, userId int64) (err error) {
  437. err = g.Try(func() {
  438. //删除旧岗位信息
  439. _, err = dao.SysUserPost.Ctx(ctx).TX(tx).Where(dao.SysUserPost.Columns().UserId, userId).Delete()
  440. liberr.ErrIsNil(ctx, err, "设置用户岗位失败")
  441. if len(postIds) == 0 {
  442. return
  443. }
  444. //添加用户岗位信息
  445. data := g.List{}
  446. for _, v := range postIds {
  447. data = append(data, g.Map{
  448. dao.SysUserPost.Columns().UserId: userId,
  449. dao.SysUserPost.Columns().PostId: v,
  450. })
  451. }
  452. _, err = dao.SysUserPost.Ctx(ctx).TX(tx).Data(data).Insert()
  453. liberr.ErrIsNil(ctx, err, "设置用户岗位失败")
  454. })
  455. return
  456. }
  457. // AddUserRole 添加用户角色信息
  458. func (s *userImpl) addUserRole(ctx context.Context, roleIds []int64, userId int64) (err error) {
  459. err = g.Try(func() {
  460. enforcer, e := commonService.CasbinEnforcer(ctx)
  461. liberr.ErrIsNil(ctx, e)
  462. for _, v := range roleIds {
  463. _, e = enforcer.AddGroupingPolicy(gconv.String(userId), gconv.String(v))
  464. liberr.ErrIsNil(ctx, e)
  465. }
  466. })
  467. return
  468. }
  469. // EditUserRole 修改用户角色信息
  470. func (s *userImpl) EditUserRole(ctx context.Context, roleIds []int64, userId int64) (err error) {
  471. err = g.Try(func() {
  472. enforcer, e := commonService.CasbinEnforcer(ctx)
  473. liberr.ErrIsNil(ctx, e)
  474. //删除用户旧角色信息
  475. enforcer.RemoveFilteredGroupingPolicy(0, gconv.String(userId))
  476. for _, v := range roleIds {
  477. _, err = enforcer.AddGroupingPolicy(gconv.String(userId), gconv.String(v))
  478. liberr.ErrIsNil(ctx, err)
  479. }
  480. })
  481. return
  482. }
  483. func (s *userImpl) userNameOrMobileExists(ctx context.Context, userName, mobile string, id ...int64) error {
  484. user := (*entity.SysUser)(nil)
  485. err := g.Try(func() {
  486. m := dao.SysUser.Ctx(ctx)
  487. if len(id) > 0 {
  488. m = m.Where(dao.SysUser.Columns().Id+" != ", id)
  489. }
  490. m = m.Where(fmt.Sprintf("%s='%s' OR %s='%s'",
  491. dao.SysUser.Columns().UserName,
  492. userName,
  493. dao.SysUser.Columns().Mobile,
  494. mobile))
  495. err := m.Limit(1).Scan(&user)
  496. liberr.ErrIsNil(ctx, err, "获取用户信息失败")
  497. if user == nil {
  498. return
  499. }
  500. if user.UserName == userName {
  501. liberr.ErrIsNil(ctx, gerror.New("用户名已存在"))
  502. }
  503. if user.Mobile == mobile {
  504. liberr.ErrIsNil(ctx, gerror.New("手机号已存在"))
  505. }
  506. })
  507. return err
  508. }
  509. // GetEditUser 获取编辑用户信息
  510. func (s *userImpl) GetEditUser(ctx context.Context, id uint64) (res *system.UserGetEditRes, err error) {
  511. res = new(system.UserGetEditRes)
  512. err = g.Try(func() {
  513. //获取用户信息
  514. res.User, err = s.GetUserInfoById(ctx, id)
  515. liberr.ErrIsNil(ctx, err)
  516. //获取已选择的角色信息
  517. res.CheckedRoleIds, err = s.GetAdminRoleIds(ctx, id)
  518. liberr.ErrIsNil(ctx, err)
  519. res.CheckedPosts, err = s.GetUserPostIds(ctx, id)
  520. liberr.ErrIsNil(ctx, err)
  521. })
  522. return
  523. }
  524. // GetUserInfoById 通过Id获取用户信息
  525. func (s *userImpl) GetUserInfoById(ctx context.Context, id uint64, withPwd ...bool) (user *entity.SysUser, err error) {
  526. err = g.Try(func() {
  527. if len(withPwd) > 0 && withPwd[0] {
  528. //用户用户信息
  529. err = dao.SysUser.Ctx(ctx).Where(dao.SysUser.Columns().Id, id).Scan(&user)
  530. } else {
  531. //用户用户信息
  532. err = dao.SysUser.Ctx(ctx).Where(dao.SysUser.Columns().Id, id).
  533. FieldsEx(dao.SysUser.Columns().UserPassword, dao.SysUser.Columns().UserSalt).Scan(&user)
  534. }
  535. liberr.ErrIsNil(ctx, err, "获取用户数据失败")
  536. })
  537. return
  538. }
  539. // GetUserPostIds 获取用户岗位
  540. func (s *userImpl) GetUserPostIds(ctx context.Context, userId uint64) (postIds []int64, err error) {
  541. err = g.Try(func() {
  542. var list []*entity.SysUserPost
  543. err = dao.SysUserPost.Ctx(ctx).Where(dao.SysUserPost.Columns().UserId, userId).Scan(&list)
  544. liberr.ErrIsNil(ctx, err, "获取用户岗位信息失败")
  545. postIds = make([]int64, 0)
  546. for _, entity := range list {
  547. postIds = append(postIds, entity.PostId)
  548. }
  549. })
  550. return
  551. }
  552. // ResetUserPwd 重置用户密码
  553. func (s *userImpl) ResetUserPwd(ctx context.Context, req *system.UserResetPwdReq) (err error) {
  554. salt := grand.S(10)
  555. password := libUtils.EncryptPassword(req.Password, salt)
  556. err = g.Try(func() {
  557. _, err = dao.SysUser.Ctx(ctx).WherePri(req.Id).Update(g.Map{
  558. dao.SysUser.Columns().UserSalt: salt,
  559. dao.SysUser.Columns().UserPassword: password,
  560. })
  561. liberr.ErrIsNil(ctx, err, "重置用户密码失败")
  562. })
  563. return
  564. }
  565. func (s *userImpl) ChangeUserStatus(ctx context.Context, req *system.UserStatusReq) (err error) {
  566. err = g.Try(func() {
  567. _, err = dao.SysUser.Ctx(ctx).WherePri(req.Id).Update(do.SysUser{UserStatus: req.UserStatus})
  568. liberr.ErrIsNil(ctx, err, "设置用户状态失败")
  569. })
  570. return
  571. }
  572. // Delete 删除用户
  573. func (s *userImpl) Delete(ctx context.Context, ids []int) (err error) {
  574. err = g.DB().Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
  575. err = g.Try(func() {
  576. _, err = dao.SysUser.Ctx(ctx).TX(tx).Where(dao.SysUser.Columns().Id+" in(?)", ids).Delete()
  577. liberr.ErrIsNil(ctx, err, "删除用户失败")
  578. //删除对应权限
  579. enforcer, e := commonService.CasbinEnforcer(ctx)
  580. liberr.ErrIsNil(ctx, e)
  581. for _, v := range ids {
  582. enforcer.RemoveFilteredGroupingPolicy(0, gconv.String(v))
  583. }
  584. //删除用户对应的岗位
  585. _, err = dao.SysUserPost.Ctx(ctx).TX(tx).Delete(dao.SysUserPost.Columns().UserId+" in (?)", ids)
  586. liberr.ErrIsNil(ctx, err, "删除用户的岗位失败")
  587. })
  588. return err
  589. })
  590. return
  591. }