sys_user.go 23 KB

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