user.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. package user_service
  2. import (
  3. "database/sql"
  4. "errors"
  5. "fmt"
  6. "gfast/app/model/admin/auth_rule"
  7. "gfast/app/model/admin/role"
  8. "gfast/app/model/admin/sys_dept"
  9. "gfast/app/model/admin/sys_post"
  10. "gfast/app/model/admin/user"
  11. "gfast/app/model/admin/user_post"
  12. "gfast/app/service/admin/auth_service"
  13. "gfast/app/service/admin/dept_service"
  14. "gfast/app/service/casbin_adapter_service"
  15. "gfast/boot"
  16. "gfast/library/service"
  17. "gfast/library/utils"
  18. "github.com/gogf/gf/container/garray"
  19. "reflect"
  20. "github.com/gogf/gf/errors/gerror"
  21. "github.com/gogf/gf/frame/g"
  22. "github.com/gogf/gf/net/ghttp"
  23. "github.com/gogf/gf/text/gstr"
  24. "github.com/gogf/gf/util/gconv"
  25. )
  26. type EditParams struct {
  27. Id int `p:"id" v:"required#用户id不能为空"`
  28. UserNickname string `p:"user_nickname" v:"required#用户昵称不能为空" orm:"user_nickname"` // 用户昵称
  29. Mobile string `p:"mobile" v:"required|phone#手机号不能为空|手机号格式错误" orm:"mobile,unique"`
  30. UserEmail string `p:"user_email" v:"email#邮箱格式错误" orm:"user_email"`
  31. Sex int `p:"sex" orm:"sex"`
  32. }
  33. type UpdatePwdReq struct {
  34. OldPassword string `p:"oldPassword" v:"required#旧密码不能为空"`
  35. NewPassword string `p:"newPassword" v:"required#新密码不能为空"`
  36. }
  37. /**
  38. 修改密码
  39. */
  40. func UpdatePwd(r *ghttp.Request, data *UpdatePwdReq) error {
  41. currentUser, err := GetCurrentUserInfo(r)
  42. if err != nil {
  43. return err
  44. }
  45. OldPassword := service.EncryptData(data.OldPassword)
  46. if OldPassword != currentUser["user_password"].(string) {
  47. return errors.New("原始密码错误!")
  48. }
  49. return ResetUserPwd(&user.ResetPwdReq{
  50. Id: gconv.Uint64(currentUser["id"]),
  51. Password: data.NewPassword,
  52. })
  53. }
  54. /**
  55. 用户中心修改用户信息
  56. */
  57. func Edit(info *EditParams) (sql.Result, error) {
  58. return user.Model.Where("id", info.Id).Data(info).Update()
  59. }
  60. // 获取单前登录用户的信息
  61. func GetCurrentUserInfo(r *ghttp.Request) (map[string]interface{}, error) {
  62. id := GetLoginID(r)
  63. userEntity, err := user.GetUserById(id)
  64. if err != nil {
  65. return nil, err
  66. }
  67. userInfo := gconv.Map(userEntity)
  68. //delete(userInfo, "user_password")
  69. userInfo["roles"] = make([]string, 0)
  70. userInfo["posts"] = new([]*user_post.Entity)
  71. userInfo["dept_info"] = nil
  72. allRoles, err := auth_service.GetRoleList()
  73. if err != nil {
  74. return nil, err
  75. }
  76. roles, err := GetAdminRole(userEntity.Id, allRoles)
  77. if err != nil {
  78. return nil, err
  79. }
  80. //角色
  81. userInfo["roles"] = roles
  82. //岗位
  83. posts, err := GetPostsByUserId(userEntity.Id)
  84. if err != nil {
  85. return nil, err
  86. }
  87. userInfo["posts"] = posts
  88. //部门
  89. if dept_info, err := sys_dept.GetDeptById(userEntity.DeptId); err != nil {
  90. return nil, err
  91. } else {
  92. userInfo["dept_info"] = dept_info
  93. }
  94. return userInfo, nil
  95. }
  96. func GetPostsByUserId(id uint64) ([]*sys_post.Entity, error) {
  97. return user_post.GetPostsByUserId(id)
  98. }
  99. //获取登陆用户ID
  100. func GetLoginID(r *ghttp.Request) (userId uint64) {
  101. userInfo := GetLoginAdminInfo(r)
  102. if userInfo != nil {
  103. userId = userInfo.Id
  104. }
  105. return
  106. }
  107. //获取缓存的用户信息
  108. func GetLoginAdminInfo(r *ghttp.Request) (userInfo *user.Entity) {
  109. resp := boot.AdminGfToken.GetTokenData(r)
  110. gconv.Struct(resp.Get("data"), &userInfo)
  111. return
  112. }
  113. //获取当前登录用户信息,直接从数据库获取
  114. func GetCurrentUser(r *ghttp.Request) (userInfo *user.Entity, err error) {
  115. id := GetLoginID(r)
  116. userInfo, err = user.GetUserById(id)
  117. return
  118. }
  119. //获取管理员列表
  120. func GetAdminList(req *user.SearchReq) (total, page int, userList []*user.Entity, err error) {
  121. if req.PageSize == 0 {
  122. req.PageSize = service.AdminPageNum
  123. }
  124. var depts []*sys_dept.Dept
  125. if req.DeptId != "" {
  126. depts, err = sys_dept.GetList(&sys_dept.SearchParams{Status: "1"})
  127. if err != nil {
  128. g.Log().Error(err)
  129. err = gerror.New("获取部门信息失败")
  130. return
  131. }
  132. mDepts := gconv.SliceMap(depts)
  133. deptId := gconv.Int(req.DeptId)
  134. req.DeptIds = append(req.DeptIds, deptId)
  135. childrenIds := utils.FindSonByParentId(mDepts, deptId, "parentId", "deptId")
  136. for _, d := range childrenIds {
  137. req.DeptIds = append(req.DeptIds, gconv.Int(d["deptId"]))
  138. }
  139. }
  140. return user.GetAdminList(req)
  141. }
  142. //获取管理员的角色信息
  143. func GetAdminRole(userId uint64, allRoleList []*role.Entity) (roles []*role.Entity, err error) {
  144. roleIds, err := GetAdminRoleIds(userId)
  145. if err != nil {
  146. return
  147. }
  148. roles = make([]*role.Entity, 0, len(allRoleList))
  149. for _, v := range allRoleList {
  150. for _, id := range roleIds {
  151. if id == v.Id {
  152. roles = append(roles, v)
  153. }
  154. }
  155. if len(roles) == len(roleIds) {
  156. break
  157. }
  158. }
  159. return
  160. }
  161. //获取管理员对应的角色ids
  162. func GetAdminRoleIds(userId uint64) (roleIds []uint, err error) {
  163. enforcer, e := casbin_adapter_service.GetEnforcer()
  164. if e != nil {
  165. err = e
  166. return
  167. }
  168. //查询关联角色规则
  169. groupPolicy := enforcer.GetFilteredGroupingPolicy(0, fmt.Sprintf("u_%d", userId))
  170. if len(groupPolicy) > 0 {
  171. roleIds = make([]uint, len(groupPolicy))
  172. //得到角色id的切片
  173. for k, v := range groupPolicy {
  174. roleIds[k] = gconv.Uint(gstr.SubStr(v[1], 2))
  175. }
  176. }
  177. return
  178. }
  179. func GetAdminPosts(userId uint64) (postIds []int64, err error) {
  180. return user_post.GetAdminPosts(userId)
  181. }
  182. //获取菜单
  183. func GetAllMenus() (menus g.List, err error) {
  184. //获取所有开启的菜单
  185. allMenus, err := auth_service.GetIsMenuStatusList()
  186. if err != nil {
  187. return
  188. }
  189. menus = make(g.List, len(allMenus))
  190. for k, v := range allMenus {
  191. menu := gconv.Map(v)
  192. menu = setMenuMap(menu, v)
  193. menus[k] = menu
  194. }
  195. menus = utils.PushSonToParent(menus, 0, "pid", "id", "children", "", nil, true)
  196. return
  197. }
  198. //获取管理员所属角色菜单
  199. func GetAdminMenusByRoleIds(roleIds []uint) (menus g.List, err error) {
  200. //获取角色对应的菜单id
  201. enforcer, e := casbin_adapter_service.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("g_%d", roleId))
  210. for _, p := range gp {
  211. mid := gconv.Int64(gstr.SubStr(p[1], 2))
  212. menuIds[mid] = mid
  213. }
  214. }
  215. //获取所有开启的菜单
  216. allMenus, err := auth_service.GetIsMenuStatusList()
  217. if err != nil {
  218. return
  219. }
  220. roleMenus := make(g.List, 0, len(allMenus))
  221. for _, v := range allMenus {
  222. if _, ok := menuIds[gconv.Int64(v.Id)]; gstr.Equal(v.Condition, "nocheck") || ok {
  223. roleMenu := gconv.Map(v)
  224. roleMenu = setMenuMap(roleMenu, v)
  225. roleMenus = append(roleMenus, roleMenu)
  226. }
  227. }
  228. menus = utils.PushSonToParent(roleMenus, 0, "pid", "id", "children", "", nil, true)
  229. return
  230. }
  231. //组合返回menu前端数据
  232. func setMenuMap(menu g.Map, entity *auth_rule.Entity) g.Map {
  233. menu["index"] = entity.Name
  234. menu["name"] = gstr.UcFirst(entity.Path)
  235. menu["menuName"] = entity.Title
  236. if entity.MenuType != 0 {
  237. menu["component"] = entity.Component
  238. menu["path"] = entity.Path
  239. } else {
  240. menu["path"] = "/" + entity.Path
  241. menu["component"] = "Layout"
  242. }
  243. menu["meta"] = g.MapStrStr{
  244. "icon": entity.Icon,
  245. "title": entity.Title,
  246. }
  247. if entity.AlwaysShow == 1 {
  248. menu["hidden"] = false
  249. } else {
  250. menu["hidden"] = true
  251. }
  252. if entity.AlwaysShow == 1 && entity.MenuType == 0 {
  253. menu["alwaysShow"] = true
  254. } else {
  255. menu["alwaysShow"] = false
  256. }
  257. return menu
  258. }
  259. func ChangeUserStatus(req *user.StatusReq) error {
  260. return user.ChangeUserStatus(req)
  261. }
  262. func ResetUserPwd(req *user.ResetPwdReq) error {
  263. //密码加密
  264. req.Password = service.EncryptData(req.Password)
  265. return user.ResetUserPwd(req)
  266. }
  267. func GetPermissions(roleIds []uint) ([]string, error) {
  268. //获取角色对应的菜单id
  269. enforcer, err := casbin_adapter_service.GetEnforcer()
  270. if err != nil {
  271. return nil, err
  272. }
  273. menuIds := map[int64]int64{}
  274. for _, roleId := range roleIds {
  275. //查询当前权限
  276. gp := enforcer.GetFilteredPolicy(0, fmt.Sprintf("g_%d", roleId))
  277. for _, p := range gp {
  278. mid := gconv.Int64(gstr.SubStr(p[1], 2))
  279. menuIds[mid] = mid
  280. }
  281. }
  282. //获取所有开启的按钮
  283. allButtons, err := auth_service.GetIsButtonStatusList()
  284. userButtons := make([]string, 0, len(allButtons))
  285. for _, button := range allButtons {
  286. if _, ok := menuIds[gconv.Int64(button.Id)]; gstr.Equal(button.Condition, "nocheck") || ok {
  287. userButtons = append(userButtons, button.Name)
  288. }
  289. }
  290. return userButtons, nil
  291. }
  292. //获取数据权限判断条件
  293. func GetDataWhere(userInfo *user.Entity, entity interface{}) (where g.Map, err error) {
  294. t := reflect.TypeOf(entity)
  295. for i := 0; i < t.Elem().NumField(); i++ {
  296. if t.Elem().Field(i).Name == "UserId" {
  297. //若存在用户id的字段,则生成判断数据权限的条件
  298. //1、获取当前用户所属角色
  299. allRoles := ([]*role.Entity)(nil)
  300. allRoles, err = auth_service.GetRoleList()
  301. if err != nil {
  302. return nil, err
  303. }
  304. roles := ([]*role.Entity)(nil)
  305. roles, err = GetAdminRole(userInfo.Id, allRoles)
  306. if err != nil {
  307. return nil, err
  308. }
  309. //2获取角色对应数据权限
  310. deptIdArr := make([]interface{}, 0, 100)
  311. for _, role := range roles {
  312. switch role.DataScope {
  313. case 1: //全部数据权限
  314. return
  315. case 2: //自定数据权限
  316. var deptIds []int64
  317. deptIds, err = dept_service.GetRoleDepts(gconv.Int64(role.Id))
  318. if err != nil {
  319. return
  320. }
  321. deptIdArr = append(deptIdArr, gconv.Interfaces(deptIds)...)
  322. case 3: //本部门数据权限
  323. deptIdArr = append(deptIdArr, gconv.Int64(userInfo.DeptId))
  324. case 4: //本部门及以下数据权限
  325. deptIdArr = append(deptIdArr, gconv.Int64(userInfo.DeptId))
  326. //获取正常状态部门数据
  327. depts := ([]*sys_dept.Dept)(nil)
  328. depts, err = dept_service.GetList(&sys_dept.SearchParams{Status: "1"})
  329. if err != nil {
  330. return
  331. }
  332. var dList g.ListStrAny
  333. for _, entity := range depts {
  334. m := g.Map{
  335. "id": entity.DeptID,
  336. "pid": entity.ParentID,
  337. "label": entity.DeptName,
  338. }
  339. dList = append(dList, m)
  340. }
  341. l := utils.FindSonByParentId(dList, gconv.Int(userInfo.DeptId), "pid", "id")
  342. for _, li := range l {
  343. deptIdArr = append(deptIdArr, gconv.Int64(li["id"]))
  344. }
  345. }
  346. }
  347. if len(deptIdArr) > 0 {
  348. arr := garray.NewArrayFrom(deptIdArr)
  349. arr = arr.Unique()
  350. where = g.Map{"user.dept_id": arr.Slice()}
  351. }
  352. }
  353. }
  354. return
  355. }