sys_user.go 20 KB

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