sys_user.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850
  1. package service
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. comModel "gfast/app/common/model"
  7. "gfast/app/common/service"
  8. "gfast/app/system/dao"
  9. "gfast/app/system/model"
  10. "gfast/library"
  11. "github.com/gogf/gf/container/gset"
  12. "github.com/gogf/gf/database/gdb"
  13. "github.com/gogf/gf/errors/gerror"
  14. "github.com/gogf/gf/frame/g"
  15. "github.com/gogf/gf/os/gtime"
  16. "github.com/gogf/gf/text/gstr"
  17. "github.com/gogf/gf/util/gconv"
  18. "github.com/gogf/gf/util/grand"
  19. "github.com/mssola/user_agent"
  20. "reflect"
  21. )
  22. type sysUser struct {
  23. NotCheckAuthAdminIds *gset.Set //无需验证权限的用户id
  24. }
  25. type UserMenu struct {
  26. *model.SysAuthRuleInfoRes
  27. Index string `json:"index"`
  28. Name string `json:"name"`
  29. MenuName string `json:"menuName"`
  30. Component string `json:"component"`
  31. Path string `json:"path"`
  32. Meta struct {
  33. Icon string `json:"icon"`
  34. Title string `json:"title"`
  35. } `json:"meta"`
  36. Hidden bool `json:"hidden"`
  37. AlwaysShow bool `json:"alwaysShow"`
  38. }
  39. type UserMenus struct {
  40. UserMenu
  41. Children []UserMenus `json:"children"`
  42. }
  43. var (
  44. notCheckAuthAdminIds = g.Cfg().GetInterfaces("system.notCheckAuthAdminIds")
  45. SysUser = &sysUser{
  46. NotCheckAuthAdminIds: gset.NewFrom(notCheckAuthAdminIds),
  47. }
  48. )
  49. // GetAdminUserByUsernamePassword 后台登陆验证
  50. func (s *sysUser) GetAdminUserByUsernamePassword(ctx context.Context, req *model.LoginParamsReq) (user *model.LoginUserRes, err error) {
  51. user, err = s.GetUserByUsernamePassword(ctx, req)
  52. if err != nil {
  53. return
  54. }
  55. //判断是否后台用户
  56. if user.IsAdmin != 1 {
  57. return nil, gerror.New("抱歉!您不属于后台管理员!")
  58. }
  59. return
  60. }
  61. // GetUserByUsernamePassword 登陆验证
  62. func (s *sysUser) GetUserByUsernamePassword(ctx context.Context, req *model.LoginParamsReq) (user *model.LoginUserRes, err error) {
  63. user, err = s.GetUserByUsername(ctx, req.Username)
  64. if err != nil {
  65. return
  66. }
  67. if user == nil {
  68. return nil, gerror.New("账号密码错误")
  69. }
  70. //验证密码
  71. if library.EncryptPassword(req.Password, user.UserSalt) != user.UserPassword {
  72. return nil, gerror.New("账号密码错误")
  73. }
  74. //账号状态
  75. if user.UserStatus == 0 {
  76. return nil, gerror.New("账号已被冻结")
  77. }
  78. return
  79. }
  80. // GetUserByUsername 通过用户名获取用户信息
  81. func (s *sysUser) GetUserByUsername(ctx context.Context, userName string) (user *model.LoginUserRes, err error) {
  82. return dao.SysUser.FindByUsername(ctx, userName)
  83. }
  84. // UpdateLoginInfo 更新用户登录信息 保存登录日志
  85. func (s *sysUser) UpdateLoginInfo(id uint64, username, ip, userAgent, msg, module string) {
  86. status := 0 //登录状态 0失败 1成功
  87. if id != 0 {
  88. //说明登录成功更新登录信息
  89. status = 1
  90. dao.SysUser.UpLoginInfo(id, ip)
  91. }
  92. //保存登录日志(异步)
  93. SysLoginLog.Invoke(&model.LoginLogParams{
  94. Status: status,
  95. Username: username,
  96. Ip: ip,
  97. UserAgent: userAgent,
  98. Msg: msg,
  99. Module: module,
  100. })
  101. }
  102. // LoginLog 记录登录日志
  103. func (s *sysUser) LoginLog(params *model.LoginLogParams) {
  104. ua := user_agent.New(params.UserAgent)
  105. browser, _ := ua.Browser()
  106. loginData := &model.SysLoginLog{
  107. LoginName: params.Username,
  108. Ipaddr: params.Ip,
  109. LoginLocation: library.GetCityByIp(params.Ip),
  110. Browser: browser,
  111. Os: ua.OS(),
  112. Status: params.Status,
  113. Msg: params.Msg,
  114. LoginTime: gtime.Now(),
  115. Module: params.Module,
  116. }
  117. dao.SysLoginLog.SaveLog(loginData)
  118. }
  119. // SaveOnline 保存用户登录在线状态信息
  120. func (s *sysUser) SaveOnline(params *model.SysUserOnline) {
  121. dao.SysUserOnline.SaveOnline(params)
  122. }
  123. // GetAdminRole 获取用户角色
  124. func (s *sysUser) GetAdminRole(userId uint64, allRoleList []*model.SysRole) (roles []*model.SysRole, err error) {
  125. var roleIds []uint
  126. roleIds, err = s.GetAdminRoleIds(userId)
  127. if err != nil {
  128. return
  129. }
  130. roles = make([]*model.SysRole, 0, len(allRoleList))
  131. for _, v := range allRoleList {
  132. for _, id := range roleIds {
  133. if id == v.Id {
  134. roles = append(roles, v)
  135. }
  136. }
  137. if len(roles) == len(roleIds) {
  138. break
  139. }
  140. }
  141. return
  142. }
  143. // GetAdminRoleIds 获取用户角色ids
  144. func (s *sysUser) GetAdminRoleIds(userId uint64) (roleIds []uint, err error) {
  145. enforcer, e := service.Casbin.GetEnforcer()
  146. if e != nil {
  147. err = e
  148. return
  149. }
  150. //查询关联角色规则
  151. groupPolicy := enforcer.GetFilteredGroupingPolicy(0, gconv.String(userId))
  152. if len(groupPolicy) > 0 {
  153. roleIds = make([]uint, len(groupPolicy))
  154. //得到角色id的切片
  155. for k, v := range groupPolicy {
  156. roleIds[k] = gconv.Uint(v[1])
  157. }
  158. }
  159. return
  160. }
  161. func (s *sysUser) GetPermissions(roleIds []uint) ([]string, error) {
  162. //获取角色对应的菜单id
  163. enforcer, err := service.Casbin.GetEnforcer()
  164. if err != nil {
  165. return nil, err
  166. }
  167. menuIds := map[int64]int64{}
  168. for _, roleId := range roleIds {
  169. //查询当前权限
  170. gp := enforcer.GetFilteredPolicy(0, gconv.String(roleId))
  171. for _, p := range gp {
  172. mid := gconv.Int64(p[1])
  173. menuIds[mid] = mid
  174. }
  175. }
  176. //获取所有开启的按钮
  177. allButtons, err := Rule.GetIsButtonStatusList()
  178. userButtons := make([]string, 0, len(allButtons))
  179. for _, button := range allButtons {
  180. if _, ok := menuIds[gconv.Int64(button.Id)]; gstr.Equal(button.Condition, "nocheck") || ok {
  181. userButtons = append(userButtons, button.Name)
  182. }
  183. }
  184. return userButtons, nil
  185. }
  186. func (s *sysUser) GetAllMenus() (menus []UserMenus, err error) {
  187. //获取所有开启的菜单
  188. var allMenus []*model.SysAuthRuleInfoRes
  189. allMenus, err = Rule.GetIsMenuStatusList()
  190. if err != nil {
  191. return
  192. }
  193. menus = make([]UserMenus, len(allMenus))
  194. for k, v := range allMenus {
  195. var menu UserMenu
  196. menu = s.setMenuData(menu, v)
  197. menus[k] = UserMenus{UserMenu: menu}
  198. }
  199. menus = s.GetMenusTree(menus, 0)
  200. return
  201. }
  202. func (s *sysUser) GetAdminMenusByRoleIds(roleIds []uint) (menus []UserMenus, err error) {
  203. //获取角色对应的菜单id
  204. enforcer, e := service.Casbin.GetEnforcer()
  205. if e != nil {
  206. err = e
  207. return
  208. }
  209. menuIds := map[int64]int64{}
  210. for _, roleId := range roleIds {
  211. //查询当前权限
  212. gp := enforcer.GetFilteredPolicy(0, fmt.Sprintf("%d", roleId))
  213. for _, p := range gp {
  214. mid := gconv.Int64(p[1])
  215. menuIds[mid] = mid
  216. }
  217. }
  218. //获取所有开启的菜单
  219. allMenus, err := Rule.GetIsMenuStatusList()
  220. if err != nil {
  221. return
  222. }
  223. menus = make([]UserMenus, 0, len(allMenus))
  224. for _, v := range allMenus {
  225. if _, ok := menuIds[gconv.Int64(v.Id)]; gstr.Equal(v.Condition, "nocheck") || ok {
  226. var roleMenu UserMenu
  227. roleMenu = s.setMenuData(roleMenu, v)
  228. menus = append(menus, UserMenus{UserMenu: roleMenu})
  229. }
  230. }
  231. menus = s.GetMenusTree(menus, 0)
  232. return
  233. }
  234. func (s *sysUser) GetMenusTree(menus []UserMenus, pid uint) []UserMenus {
  235. returnList := make([]UserMenus, 0, len(menus))
  236. for _, menu := range menus {
  237. if menu.Pid == pid {
  238. menu.Children = s.GetMenusTree(menus, menu.Id)
  239. returnList = append(returnList, menu)
  240. }
  241. }
  242. return returnList
  243. }
  244. func (s *sysUser) setMenuData(menu UserMenu, entity *model.SysAuthRuleInfoRes) UserMenu {
  245. menu = UserMenu{
  246. SysAuthRuleInfoRes: entity,
  247. Index: entity.Name,
  248. Name: gstr.UcFirst(entity.Path),
  249. MenuName: entity.Title,
  250. Meta: struct {
  251. Icon string `json:"icon"`
  252. Title string `json:"title"`
  253. }(struct {
  254. Icon string
  255. Title string
  256. }{Icon: entity.Icon, Title: entity.Title}),
  257. }
  258. if entity.MenuType != 0 {
  259. menu.Component = entity.Component
  260. menu.Path = entity.Path
  261. } else {
  262. menu.Component = "Layout"
  263. menu.Path = "/" + entity.Path
  264. }
  265. if entity.AlwaysShow == 1 {
  266. menu.Hidden = false
  267. } else {
  268. menu.Hidden = true
  269. }
  270. if entity.AlwaysShow == 1 && entity.MenuType == 0 {
  271. menu.AlwaysShow = true
  272. } else {
  273. menu.AlwaysShow = false
  274. }
  275. return menu
  276. }
  277. func (s *sysUser) WriteDeptIdsOfSearchReq(req *model.SysUserSearchReq) error {
  278. if req.DeptId == "" {
  279. return nil
  280. }
  281. depts, e := Dept.GetList(&dao.SysDeptSearchParams{
  282. Status: "1",
  283. })
  284. if e != nil {
  285. return e
  286. }
  287. deptId := gconv.Int64(req.DeptId)
  288. req.DeptIds = append(req.DeptIds, deptId)
  289. children := Dept.FindSonByParentId(depts, deptId)
  290. for _, d := range children {
  291. req.DeptIds = append(req.DeptIds, d.DeptId)
  292. }
  293. return nil
  294. }
  295. // GetUsersRoleDept 获取多个用户角色 部门信息
  296. func (s *sysUser) GetUsersRoleDept(userList []*model.SysUser) ([]*model.SysUserRoleDeptRes, error) {
  297. allRoles, err := SysRole.GetRoleList()
  298. if err != nil {
  299. g.Log().Error(err)
  300. return nil, err
  301. }
  302. depts, err := Dept.GetList(&dao.SysDeptSearchParams{})
  303. if err != nil {
  304. g.Log().Error(err)
  305. return nil, err
  306. }
  307. users := make([]*model.SysUserRoleDeptRes, len(userList))
  308. for k, u := range userList {
  309. var dept *model.SysDept
  310. users[k] = &model.SysUserRoleDeptRes{
  311. SysUser: u,
  312. }
  313. for _, d := range depts {
  314. if u.DeptId == uint64(d.DeptId) {
  315. dept = d
  316. }
  317. }
  318. users[k].Dept = dept
  319. roles, err := s.GetAdminRole(u.Id, allRoles)
  320. if err != nil {
  321. g.Log().Error(err)
  322. return nil, err
  323. }
  324. for _, r := range roles {
  325. users[k].RoleInfo = append(users[k].RoleInfo, &struct {
  326. RoleId uint `json:"roleId"`
  327. Name string `json:"name"`
  328. }{RoleId: r.Id, Name: r.Name})
  329. }
  330. }
  331. return users, nil
  332. }
  333. // GetUserRoleDeptPost 获取某个用户对应的部门、岗位、角色信息
  334. func (s *sysUser) GetUserRoleDeptPost(user *model.SysUser) (*model.SysUserRoleDeptRes, error) {
  335. allRoles, err := SysRole.GetRoleList()
  336. if err != nil {
  337. g.Log().Error(err)
  338. return nil, err
  339. }
  340. //部门
  341. depts, err := Dept.GetList(&dao.SysDeptSearchParams{})
  342. if err != nil {
  343. g.Log().Error(err)
  344. return nil, err
  345. }
  346. userData := &model.SysUserRoleDeptRes{
  347. SysUser: user,
  348. }
  349. for _, d := range depts {
  350. if user.DeptId == uint64(d.DeptId) {
  351. userData.Dept = d
  352. }
  353. }
  354. //角色
  355. roles, err := s.GetAdminRole(user.Id, allRoles)
  356. if err != nil {
  357. g.Log().Error(err)
  358. return nil, err
  359. }
  360. for _, r := range roles {
  361. userData.RoleInfo = append(userData.RoleInfo, &struct {
  362. RoleId uint `json:"roleId"`
  363. Name string `json:"name"`
  364. }{RoleId: r.Id, Name: r.Name})
  365. }
  366. //岗位
  367. posts, err := s.GetPostsByUserId(user.Id)
  368. if err != nil {
  369. return nil, err
  370. }
  371. for _, v := range posts {
  372. userData.Post = append(userData.Post, &struct {
  373. PostId int64 `json:"postId"`
  374. PostName string `json:"postName"`
  375. }{PostId: v.PostId, PostName: v.PostName})
  376. }
  377. return userData, nil
  378. }
  379. func (s *sysUser) GetUserList(req *model.SysUserSearchReq) (total, page int, userList []*model.SysUser, err error) {
  380. if req.PageSize == 0 {
  381. req.PageSize = comModel.PageSize
  382. }
  383. userModel := dao.SysUser.M
  384. if req.KeyWords != "" {
  385. keyWords := "%" + req.KeyWords + "%"
  386. userModel = userModel.Where("user_name like ? or user_nickname like ?", keyWords, keyWords)
  387. }
  388. if len(req.DeptIds) != 0 {
  389. userModel = userModel.Where("dept_id in (?)", req.DeptIds)
  390. }
  391. if req.Status != "" {
  392. userModel = userModel.Where("user_status", gconv.Int(req.Status))
  393. }
  394. if req.Phonenumber != "" {
  395. userModel = userModel.Where("mobile like ?", "%"+req.Phonenumber+"%")
  396. }
  397. if req.BeginTime != "" {
  398. userModel = userModel.Where("created_at >=?", req.BeginTime)
  399. }
  400. if req.EndTime != "" {
  401. userModel = userModel.Where("created_at <=?", req.EndTime)
  402. }
  403. total, err = userModel.Count()
  404. if err != nil {
  405. g.Log().Error(err)
  406. err = gerror.New("获取总行数失败")
  407. return
  408. }
  409. if req.PageNum == 0 {
  410. req.PageNum = 1
  411. }
  412. page = req.PageNum
  413. err = userModel.FieldsEx(dao.SysUser.Columns.UserPassword, dao.SysUser.Columns.UserSalt).
  414. Page(page, req.PageSize).Order("id asc").Scan(&userList)
  415. return
  416. }
  417. func (s *sysUser) AddUser(req *model.AddUserReq) (err error) {
  418. req.UserSalt = grand.S(10)
  419. req.Password = library.EncryptPassword(req.Password, req.UserSalt)
  420. var tx *gdb.TX
  421. tx, err = g.DB().Begin()
  422. if err != nil {
  423. err = gerror.New("事务开启失败")
  424. return
  425. }
  426. Model := dao.SysUser.TX(tx)
  427. if i, _ := Model.Where("user_name=?", req.UserName).Count(); i != 0 {
  428. err = gerror.New("用户名已经存在")
  429. tx.Rollback()
  430. return
  431. }
  432. if i, _ := Model.Where("mobile=?", req.Phonenumber).Count(); i != 0 {
  433. err = gerror.New("手机号已经存在")
  434. tx.Rollback()
  435. return
  436. }
  437. userData := new(model.SysUser)
  438. userData.UserName = req.UserName
  439. userData.DeptId = req.DeptId
  440. userData.UserStatus = req.Status
  441. userData.Mobile = req.Phonenumber
  442. userData.Sex = req.Sex
  443. userData.UserEmail = req.Email
  444. userData.UserNickname = req.NickName
  445. userData.UserSalt = req.UserSalt
  446. userData.UserPassword = req.Password
  447. userData.Remark = req.Remark
  448. userData.IsAdmin = req.IsAdmin
  449. res, err := Model.Insert(userData)
  450. if err != nil {
  451. tx.Rollback()
  452. return
  453. }
  454. InsertId, _ := res.LastInsertId()
  455. err = s.AddUserRole(req.RoleIds, InsertId)
  456. if err != nil {
  457. g.Log().Error(err)
  458. err = gerror.New("设置用户权限失败")
  459. tx.Rollback()
  460. return
  461. }
  462. err = s.AddUserPost(req.PostIds, InsertId, tx)
  463. if err != nil {
  464. g.Log().Error(err)
  465. err = gerror.New("设置用户岗位信息失败")
  466. tx.Rollback()
  467. return
  468. }
  469. tx.Commit()
  470. return
  471. }
  472. // AddUserRole 添加用户角色信息
  473. func (s *sysUser) AddUserRole(roleIds interface{}, userId int64) (err error) {
  474. enforcer, e := service.Casbin.GetEnforcer()
  475. if e != nil {
  476. err = e
  477. return
  478. }
  479. rule := gconv.Ints(roleIds)
  480. for _, v := range rule {
  481. _, err = enforcer.AddGroupingPolicy(fmt.Sprintf("%d", userId), fmt.Sprintf("%d", v))
  482. if err != nil {
  483. return
  484. }
  485. }
  486. return
  487. }
  488. // AddUserPost 添加用户岗位信息
  489. func (s *sysUser) AddUserPost(postIds []int64, userId int64, tx *gdb.TX) (err error) {
  490. //删除旧岗位信息
  491. _, err = dao.SysUserPost.TX(tx).Where(dao.SysUserPost.Columns.UserId, userId).Delete()
  492. if err != nil {
  493. g.Log().Error(err)
  494. return
  495. }
  496. if len(postIds) == 0 {
  497. return
  498. }
  499. //添加用户岗位信息
  500. data := g.List{}
  501. for _, v := range postIds {
  502. data = append(data, g.Map{
  503. dao.SysUserPost.Columns.UserId: userId,
  504. dao.SysUserPost.Columns.PostId: v,
  505. })
  506. }
  507. _, err = dao.SysUserPost.TX(tx).Data(data).Insert()
  508. if err != nil {
  509. g.Log().Error(err)
  510. return
  511. }
  512. return
  513. }
  514. // GetUserInfoById 通过Id获取用户信息
  515. func (s *sysUser) GetUserInfoById(id uint64, withPwd ...bool) (user *model.SysUser, err error) {
  516. if len(withPwd) > 0 && withPwd[0] {
  517. //用户用户信息
  518. err = dao.SysUser.Where(dao.SysUser.Columns.Id, id).Scan(&user)
  519. } else {
  520. //用户用户信息
  521. err = dao.SysUser.Where(dao.SysUser.Columns.Id, id).
  522. FieldsEx(dao.SysUser.Columns.UserPassword, dao.SysUser.Columns.UserSalt).Scan(&user)
  523. }
  524. if err != nil {
  525. g.Log().Error(err)
  526. return nil, errors.New("获取用户数据失败")
  527. }
  528. return
  529. }
  530. // GetEditUser 获取要修改的用户信息
  531. func (s *sysUser) GetEditUser(id uint64) (g.Map, error) {
  532. userData, err := s.GetUserInfoById(id)
  533. //获取角色信息
  534. roleList, err := SysRole.GetRoleList()
  535. if err != nil {
  536. g.Log().Error(err)
  537. return nil, errors.New("获取角色数据失败")
  538. }
  539. //获取已选择的角色信息
  540. checkedRoleIds, err := SysUser.GetAdminRoleIds(id)
  541. if err != nil {
  542. g.Log().Error(err)
  543. return nil, errors.New("获取用户角色数据失败")
  544. }
  545. if checkedRoleIds == nil {
  546. checkedRoleIds = []uint{}
  547. }
  548. //获取岗位信息
  549. posts, err := s.GetUsedPost()
  550. if err != nil {
  551. return nil, err
  552. }
  553. checkedPosts, err := s.GetUserPostIds(id)
  554. if err != nil {
  555. return nil, err
  556. }
  557. if checkedPosts == nil {
  558. checkedPosts = []int64{}
  559. }
  560. res := g.Map{
  561. "roleList": roleList,
  562. "userInfo": userData,
  563. "checkedRoleIds": checkedRoleIds,
  564. "posts": posts,
  565. "checkedPosts": checkedPosts,
  566. }
  567. return res, nil
  568. }
  569. // GetUsedPost 获取正常状态的岗位
  570. func (s *sysUser) GetUsedPost() (list []*model.SysPost, err error) {
  571. err = dao.SysPost.Where(dao.SysPost.C.Status, 1).
  572. Order(dao.SysPost.C.PostSort + " ASC, " + dao.SysPost.C.PostId + " ASC ").Scan(&list)
  573. if err != nil {
  574. g.Log().Error(err)
  575. err = gerror.New("获取岗位数据失败")
  576. }
  577. return
  578. }
  579. // GetUserPostIds 获取用户岗位
  580. func (s *sysUser) GetUserPostIds(userId uint64) (postIds []int64, err error) {
  581. var list []*model.SysUserPost
  582. err = dao.SysUserPost.Where(dao.SysUserPost.Columns.UserId, userId).Scan(&list)
  583. if err != nil {
  584. g.Log().Error(err)
  585. return nil, gerror.New("获取用户岗位信息失败")
  586. }
  587. postIds = make([]int64, 0)
  588. for _, entity := range list {
  589. postIds = append(postIds, entity.PostId)
  590. }
  591. return
  592. }
  593. // GetPostsByUserId 根据用户id获取岗位信息详情
  594. func (s *sysUser) GetPostsByUserId(userId uint64) ([]*model.SysPost, error) {
  595. postIds, err := s.GetUserPostIds(userId)
  596. if err != nil {
  597. return nil, err
  598. }
  599. var posts []*model.SysPost
  600. err = dao.SysPost.Where(dao.SysPost.C.PostId+" in (?)", postIds).Scan(&posts)
  601. return posts, err
  602. }
  603. // EditUser 修改用户
  604. func (s *sysUser) EditUser(req *model.EditUserReq) (err error) {
  605. if i, _ := dao.SysUser.Where("id!=? and mobile=?", req.UserId, req.Phonenumber).Count(); i != 0 {
  606. err = gerror.New("手机号已经存在")
  607. return
  608. }
  609. var tx *gdb.TX
  610. tx, err = g.DB().Begin()
  611. //保存管理员信息
  612. var userData *model.SysUser
  613. err = dao.SysUser.Where("id", req.UserId).Scan(&userData)
  614. if err != nil || userData == nil {
  615. g.Log().Error(err)
  616. err = gerror.New("获取用户信息失败")
  617. return
  618. }
  619. userData.DeptId = req.DeptId
  620. userData.UserStatus = req.Status
  621. userData.Mobile = req.Phonenumber
  622. userData.Sex = req.Sex
  623. userData.UserEmail = req.Email
  624. userData.UserNickname = req.NickName
  625. userData.Remark = req.Remark
  626. userData.IsAdmin = req.IsAdmin
  627. _, err = dao.SysUser.TX(tx).FieldsEx(dao.SysUser.Columns.Id, dao.SysUser.Columns.CreatedAt,
  628. dao.SysUser.Columns.DeletedAt, dao.SysUser.Columns.LastLoginTime).
  629. WherePri(userData.Id).Update(userData)
  630. if err != nil {
  631. g.Log().Error(err)
  632. err = gerror.New("修改用户信息失败")
  633. tx.Rollback()
  634. return
  635. }
  636. //设置用户所属角色信息
  637. err = s.EditUserRole(req.RoleIds, req.UserId)
  638. if err != nil {
  639. g.Log().Error(err)
  640. err = gerror.New("设置用户权限失败")
  641. tx.Rollback()
  642. return
  643. }
  644. //设置用户岗位数据
  645. err = s.AddUserPost(req.PostIds, gconv.Int64(req.UserId), tx)
  646. if err != nil {
  647. g.Log().Error(err)
  648. err = gerror.New("设置用户岗位信息失败")
  649. tx.Rollback()
  650. return
  651. }
  652. tx.Commit()
  653. return
  654. }
  655. // EditUserRole 修改用户角色信息
  656. func (s *sysUser) EditUserRole(roleIds interface{}, userId int) (err error) {
  657. enforcer, e := service.Casbin.GetEnforcer()
  658. if e != nil {
  659. err = e
  660. return
  661. }
  662. rule := gconv.Ints(roleIds)
  663. //删除用户旧角色信息
  664. enforcer.RemoveFilteredGroupingPolicy(0, fmt.Sprintf("%d", userId))
  665. for _, v := range rule {
  666. _, err = enforcer.AddGroupingPolicy(fmt.Sprintf("%d", userId), fmt.Sprintf("%d", v))
  667. if err != nil {
  668. return
  669. }
  670. }
  671. return
  672. }
  673. // ResetUserPwd 重置用户密码
  674. func (s *sysUser) ResetUserPwd(req *model.SysUserResetPwdReq) error {
  675. salt := grand.S(10)
  676. password := library.EncryptPassword(req.Password, salt)
  677. _, err := dao.SysUser.WherePri(req.Id).Update(g.Map{
  678. dao.SysUser.Columns.UserSalt: salt,
  679. dao.SysUser.Columns.UserPassword: password,
  680. })
  681. return err
  682. }
  683. func (s *sysUser) ChangeUserStatus(req *model.SysUserStatusReq) error {
  684. _, err := dao.SysUser.WherePri(req.Id).Update(g.Map{
  685. dao.SysUser.Columns.UserStatus: req.UserStatus,
  686. })
  687. return err
  688. }
  689. // DeleteUser 删除用户信息
  690. func (s *sysUser) DeleteUser(ctx context.Context, ids []int) error {
  691. return g.DB().Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
  692. _, err := dao.SysUser.Ctx(ctx).TX(tx).Where(dao.SysUser.Columns.Id+" in(?)", ids).Delete()
  693. //删除对应权限
  694. enforcer, err := service.Casbin.GetEnforcer()
  695. if err == nil {
  696. for _, v := range ids {
  697. enforcer.RemoveFilteredGroupingPolicy(0, fmt.Sprintf("%d", v))
  698. }
  699. }
  700. //删除用户对应的岗位
  701. _, err = dao.SysUserPost.Ctx(ctx).TX(tx).Delete(dao.SysUserPost.Columns.UserId+" in (?)", ids)
  702. return err
  703. })
  704. }
  705. // SetAvatar 修改用户头像
  706. func (s *sysUser) SetAvatar(userId uint64, avatarUrl string) error {
  707. _, err := dao.SysUser.WherePri(userId).Unscoped().Update(g.Map{
  708. dao.SysUser.Columns.Avatar: avatarUrl,
  709. })
  710. return err
  711. }
  712. // ProfileEdit 修改个人资料
  713. func (s *sysUser) ProfileEdit(req *model.ProfileUpReq) error {
  714. _, err := dao.SysUser.WherePri(req.UserId).Unscoped().Update(req)
  715. return err
  716. }
  717. // ProfileUpdatePwd 修改个人密码
  718. func (s *sysUser) ProfileUpdatePwd(req *model.ProfileUpdatePwdReq) error {
  719. userInfo, err := s.GetUserInfoById(req.UserId, true)
  720. if err != nil {
  721. return err
  722. }
  723. oldPassword := library.EncryptPassword(req.OldPassword, userInfo.UserSalt)
  724. if oldPassword != userInfo.UserPassword {
  725. return errors.New("原始密码错误!")
  726. }
  727. salt := grand.S(10)
  728. newPassword := library.EncryptPassword(req.NewPassword, salt)
  729. _, err = dao.SysUser.WherePri(req.UserId).Unscoped().Update(g.Map{
  730. dao.SysUser.Columns.UserSalt: salt,
  731. dao.SysUser.Columns.UserPassword: newPassword,
  732. })
  733. return err
  734. }
  735. // GetDataWhere 获取数据权限判断条件
  736. func (s *sysUser) GetDataWhere(userInfo *dao.CtxUser, entity interface{}) (where g.Map, err error) {
  737. t := reflect.TypeOf(entity)
  738. for i := 0; i < t.Elem().NumField(); i++ {
  739. if t.Elem().Field(i).Name == "CreatedBy" {
  740. //若存在用户id的字段,则生成判断数据权限的条件
  741. //1、获取当前用户所属角色
  742. allRoles := ([]*model.SysRole)(nil)
  743. allRoles, err = SysRole.GetRoleList()
  744. if err != nil {
  745. return nil, err
  746. }
  747. roles := ([]*model.SysRole)(nil)
  748. roles, err = s.GetAdminRole(userInfo.Id, allRoles)
  749. if err != nil {
  750. return nil, err
  751. }
  752. //2获取角色对应数据权限
  753. deptIdArr := gset.New()
  754. for _, role := range roles {
  755. switch role.DataScope {
  756. case 1: //全部数据权限
  757. return
  758. case 2: //自定数据权限
  759. var deptIds []int64
  760. deptIds, err = Dept.GetRoleDepts(gconv.Int64(role.Id))
  761. if err != nil {
  762. return
  763. }
  764. deptIdArr.Add(gconv.Interfaces(deptIds)...)
  765. case 3: //本部门数据权限
  766. deptIdArr.Add(gconv.Int64(userInfo.DeptId))
  767. case 4: //本部门及以下数据权限
  768. deptIdArr.Add(gconv.Int64(userInfo.DeptId))
  769. //获取正常状态部门数据
  770. depts := ([]*model.SysDept)(nil)
  771. depts, err = Dept.GetList(&dao.SysDeptSearchParams{Status: "1"})
  772. if err != nil {
  773. return
  774. }
  775. var dList g.List
  776. for _, d := range depts {
  777. m := g.Map{
  778. "id": d.DeptId,
  779. "pid": d.ParentId,
  780. "label": d.DeptName,
  781. }
  782. dList = append(dList, m)
  783. }
  784. l := library.FindSonByParentId(dList, gconv.Int(userInfo.DeptId), "pid", "id")
  785. for _, li := range l {
  786. deptIdArr.Add(gconv.Int64(li["id"]))
  787. }
  788. }
  789. }
  790. if deptIdArr.Size() > 0 {
  791. where = g.Map{"user.dept_id": deptIdArr.Slice()}
  792. }
  793. }
  794. }
  795. return
  796. }
  797. // GetUsers 通过用户ids查询多个用户信息
  798. func (s *sysUser) GetUsers(ids []int) (users []*model.SysUserRes, err error) {
  799. if len(ids) == 0 {
  800. return
  801. }
  802. idsSet := gset.NewIntSetFrom(ids).Slice()
  803. err = dao.SysUser.Where(dao.SysUser.Columns.Id+" in(?)", idsSet).Fields(model.SysUserRes{}).
  804. Order(dao.SysUser.Columns.Id + " ASC").Scan(&users)
  805. return
  806. }