sys_user.go 20 KB

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