auth.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609
  1. package admin
  2. import (
  3. "fmt"
  4. "gfast/app/model/admin/auth_rule"
  5. "gfast/app/model/admin/role"
  6. "gfast/app/model/admin/sys_dept"
  7. "gfast/app/model/admin/user"
  8. "gfast/app/model/admin/user_post"
  9. "gfast/app/service/admin/auth_service"
  10. "gfast/app/service/admin/dept_service"
  11. "gfast/app/service/admin/dict_service"
  12. "gfast/app/service/admin/post_service"
  13. "gfast/app/service/admin/user_service"
  14. "gfast/app/service/cache_service"
  15. "gfast/app/service/casbin_adapter_service"
  16. "gfast/library/response"
  17. "gfast/library/utils"
  18. "github.com/gogf/gf/frame/g"
  19. "github.com/gogf/gf/net/ghttp"
  20. "github.com/gogf/gf/text/gstr"
  21. "github.com/gogf/gf/util/gconv"
  22. "github.com/gogf/gf/util/gvalid"
  23. )
  24. //菜单用户组用户管理
  25. type Auth struct{}
  26. //菜单列表
  27. func (c *Auth) MenuList(r *ghttp.Request) {
  28. var req *auth_rule.ReqSearch
  29. //获取参数
  30. if err := r.Parse(&req); err != nil {
  31. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  32. }
  33. var listEntities []*auth_rule.Entity
  34. var err error
  35. if req != nil {
  36. listEntities, err = auth_service.GetMenuListSearch(req)
  37. } else {
  38. //获取菜单信息
  39. listEntities, err = auth_service.GetMenuList()
  40. }
  41. if err != nil {
  42. g.Log().Error(err)
  43. response.FailJson(true, r, "获取数据失败")
  44. }
  45. list := gconv.SliceMap(listEntities)
  46. if req != nil {
  47. for k := range list {
  48. list[k]["children"] = nil
  49. }
  50. } else {
  51. list = utils.PushSonToParent(list, 0, "pid", "id", "children", "", nil, true)
  52. }
  53. //菜单显示状态
  54. visibleOptions, err := dict_service.GetDictWithDataByType("sys_show_hide", "", "")
  55. if err != nil {
  56. response.FailJson(true, r, err.Error())
  57. }
  58. //菜单正常or停用状态
  59. statusOptions, err := dict_service.GetDictWithDataByType("sys_normal_disable", "", "")
  60. if err != nil {
  61. response.FailJson(true, r, err.Error())
  62. }
  63. response.SusJson(true, r, "成功", g.Map{
  64. "list": list,
  65. "visibleOptions": visibleOptions,
  66. "statusOptions": statusOptions,
  67. })
  68. }
  69. //菜单排序
  70. func (c *Auth) MenuSort(r *ghttp.Request) {
  71. sorts := r.Get("sorts")
  72. s := gconv.Map(sorts)
  73. if s == nil {
  74. response.FailJson(true, r, "排序失败")
  75. }
  76. for k, v := range s {
  77. auth_rule.Model.Where("id=?", k).Data("weigh", v).Update()
  78. }
  79. cache_service.New().RemoveByTag(cache_service.AdminAuthTag)
  80. response.SusJson(true, r, "排序成功")
  81. }
  82. //添加菜单
  83. func (c *Auth) AddMenu(r *ghttp.Request) {
  84. if r.Method == "POST" {
  85. menu := new(auth_rule.MenuReq)
  86. if err := r.Parse(menu); err != nil {
  87. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  88. }
  89. //判断菜单规则是否存在
  90. if !auth_service.CheckMenuNameUnique(menu.Name, 0) {
  91. response.FailJson(true, r, "菜单规则名称已经存在")
  92. }
  93. //判断路由是否已经存在
  94. if !auth_service.CheckMenuPathUnique(menu.Path, 0) {
  95. response.FailJson(true, r, "路由地址已经存在")
  96. }
  97. //保存到数据库
  98. err, _ := auth_service.AddMenu(menu)
  99. if err != nil {
  100. g.Log().Error(err)
  101. response.FailJson(true, r, "添加菜单失败")
  102. }
  103. //清除TAG缓存
  104. cache_service.New().RemoveByTag(cache_service.AdminAuthTag)
  105. response.SusJson(true, r, "添加菜单成功")
  106. }
  107. //获取父级菜单信息
  108. listEntities, err := auth_service.GetIsMenuList()
  109. if err != nil {
  110. response.FailJson(true, r, "获取数据失败")
  111. }
  112. response.SusJson(true, r, "成功", g.Map{"parentList": listEntities})
  113. }
  114. //修改菜单
  115. func (c *Auth) EditMenu(r *ghttp.Request) {
  116. id := r.GetInt("menuId")
  117. if r.Method == "POST" {
  118. menu := new(auth_rule.MenuReq)
  119. if err := r.Parse(menu); err != nil {
  120. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  121. }
  122. //判断菜单规则是否存在
  123. if !auth_service.CheckMenuNameUnique(menu.Name, id) {
  124. response.FailJson(true, r, "菜单规则名称已经存在")
  125. }
  126. //判断路由是否已经存在
  127. if !auth_service.CheckMenuPathUnique(menu.Path, id) {
  128. response.FailJson(true, r, "路由地址已经存在")
  129. }
  130. //保存到数据库
  131. err, _ := auth_service.EditMenu(menu, id)
  132. if err != nil {
  133. g.Log().Error(err)
  134. response.FailJson(true, r, "修改菜单失败")
  135. }
  136. //清除TAG缓存
  137. cache_service.New().RemoveByTag(cache_service.AdminAuthTag)
  138. response.SusJson(true, r, "修改菜单成功")
  139. }
  140. menuEntity, err := auth_rule.Model.Where("id=?", id).One()
  141. if err != nil {
  142. g.Log().Error(err)
  143. response.FailJson(true, r, "获取数据失败")
  144. }
  145. //获取父级菜单信息
  146. listEntities, err := auth_service.GetIsMenuList()
  147. if err != nil {
  148. response.FailJson(true, r, "获取数据失败")
  149. }
  150. list := gconv.SliceMap(listEntities)
  151. list = utils.ParentSonSort(list)
  152. response.SusJson(true, r, "成功", g.Map{
  153. "parentList": list,
  154. "menu": menuEntity,
  155. })
  156. }
  157. //删除菜单
  158. func (c *Auth) DeleteMenu(r *ghttp.Request) {
  159. ids := r.GetInts("ids")
  160. if len(ids) == 0 {
  161. response.FailJson(true, r, "删除失败,参数错误")
  162. }
  163. err := auth_service.DeleteMenuByIds(ids)
  164. if err != nil {
  165. g.Log().Error(err)
  166. response.FailJson(true, r, "删除失败")
  167. }
  168. //清除TAG缓存
  169. cache_service.New().RemoveByTag(cache_service.AdminAuthTag)
  170. response.SusJson(true, r, "删除成功")
  171. }
  172. //角色列表
  173. func (c *Auth) RoleList(r *ghttp.Request) {
  174. var req *role.SelectPageReq
  175. //获取参数
  176. if err := r.Parse(&req); err != nil {
  177. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  178. }
  179. //获取角色列表
  180. total, page, list, err := auth_service.GetRoleListSearch(req)
  181. if err != nil {
  182. g.Log().Error(err)
  183. response.FailJson(true, r, "获取数据失败")
  184. }
  185. //菜单正常or停用状态
  186. statusOptions, err := dict_service.GetDictWithDataByType("sys_normal_disable", "", "")
  187. if err != nil {
  188. response.FailJson(true, r, err.Error())
  189. }
  190. response.SusJson(true, r, "成功", g.Map{
  191. "currentPage": page,
  192. "total": total,
  193. "list": list,
  194. "searchTypes": statusOptions,
  195. })
  196. }
  197. //添加角色
  198. func (c *Auth) AddRole(r *ghttp.Request) {
  199. //添加操作
  200. if r.Method == "POST" {
  201. //获取表单提交的数据
  202. res := r.GetFormMap()
  203. tx, err := g.DB("default").Begin() //开启事务
  204. if err != nil {
  205. g.Log().Error(err)
  206. response.FailJson(true, r, "事务处理失败")
  207. }
  208. //插入角色
  209. //添加角色获取添加的id
  210. insertId, err := auth_service.AddRole(tx, res)
  211. if err != nil {
  212. tx.Rollback() //回滚
  213. response.FailJson(true, r, err.Error())
  214. }
  215. //添加角色权限
  216. err = auth_service.AddRoleRule(res["menuIds"], insertId)
  217. if err != nil {
  218. tx.Rollback() //回滚
  219. g.Log().Error(err.Error())
  220. response.FailJson(true, r, "添加角色失败")
  221. }
  222. tx.Commit()
  223. //清除TAG缓存
  224. cache_service.New().RemoveByTag(cache_service.AdminAuthTag)
  225. response.SusJson(true, r, "添加角色成功")
  226. }
  227. //获取菜单信息
  228. mListEntities, err := auth_service.GetMenuList()
  229. if err != nil {
  230. g.Log().Error(err)
  231. response.FailJson(true, r, "获取菜单数据失败")
  232. }
  233. var mList g.ListStrAny
  234. for _, entity := range mListEntities {
  235. m := g.Map{
  236. "id": entity.Id,
  237. "pid": entity.Pid,
  238. "label": entity.Title,
  239. }
  240. mList = append(mList, m)
  241. }
  242. mList = utils.PushSonToParent(mList)
  243. res := g.Map{
  244. "menuList": mList,
  245. }
  246. response.SusJson(true, r, "成功", res)
  247. }
  248. //修改角色
  249. func (c *Auth) EditRole(r *ghttp.Request) {
  250. id := r.GetRequestInt64("roleId")
  251. if r.Method == "POST" {
  252. //获取表单提交的数据
  253. res := r.GetFormMap()
  254. tx, err := g.DB("default").Begin() //开启事务
  255. if err != nil {
  256. g.Log().Error(err)
  257. response.FailJson(true, r, "事务处理失败")
  258. }
  259. //修改角色信息
  260. err = auth_service.EditRole(tx, res)
  261. if err != nil {
  262. tx.Rollback() //回滚
  263. response.FailJson(true, r, err.Error())
  264. }
  265. //添加角色权限
  266. err = auth_service.EditRoleRule(res["menuIds"], id)
  267. if err != nil {
  268. tx.Rollback() //回滚
  269. g.Log().Error(err.Error())
  270. response.FailJson(true, r, "添加用户组失败")
  271. }
  272. tx.Commit()
  273. //清除TAG缓存
  274. cache_service.New().RemoveByTag(cache_service.AdminAuthTag)
  275. response.SusJson(true, r, "修改用户组成功")
  276. }
  277. //获取角色信息
  278. role, err := role.Model.Where("id=?", id).One()
  279. if err != nil {
  280. response.FailJson(true, r, "获取角色数据失败")
  281. }
  282. //获取菜单信息
  283. mListEntities, err := auth_service.GetMenuList()
  284. if err != nil {
  285. g.Log().Error(err)
  286. response.FailJson(true, r, "获取菜单数据失败")
  287. }
  288. //获取角色关联的菜单规则
  289. enforcer, err := casbin_adapter_service.GetEnforcer()
  290. if err != nil {
  291. g.Log().Error(err)
  292. response.FailJson(true, r, "获取权限处理器失败")
  293. }
  294. gp := enforcer.GetFilteredNamedPolicy("p", 0, fmt.Sprintf("g_%d", id))
  295. gpSlice := make([]int, len(gp))
  296. for k, v := range gp {
  297. gpSlice[k] = gconv.Int(gstr.SubStr(v[1], 2))
  298. }
  299. var mList g.ListStrAny
  300. for _, entity := range mListEntities {
  301. m := g.Map{
  302. "id": entity.Id,
  303. "pid": entity.Pid,
  304. "label": entity.Title,
  305. }
  306. mList = append(mList, m)
  307. }
  308. mList = utils.PushSonToParent(mList)
  309. res := g.Map{
  310. "menuList": mList,
  311. "role": role,
  312. "checkedRules": gpSlice,
  313. }
  314. response.SusJson(true, r, "成功", res)
  315. }
  316. //删除角色
  317. func (c *Auth) DeleteRole(r *ghttp.Request) {
  318. ids := r.GetInts("ids")
  319. if len(ids) == 0 {
  320. response.FailJson(true, r, "删除失败,参数错误")
  321. }
  322. err := auth_service.DeleteRoleByIds(ids)
  323. if err != nil {
  324. response.FailJson(true, r, "删除失败,"+err.Error())
  325. }
  326. //清除TAG缓存
  327. cache_service.New().RemoveByTag(cache_service.AdminAuthTag)
  328. response.SusJson(true, r, "删除成功")
  329. }
  330. //添加管理员
  331. func (c *Auth) AddUser(r *ghttp.Request) {
  332. if r.Method == "POST" {
  333. var req *user.AddUserReq
  334. if err := r.Parse(&req); err != nil {
  335. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  336. }
  337. InsertId, err := auth_service.AddUser(req)
  338. if err != nil {
  339. response.FailJson(true, r, err.Error())
  340. }
  341. //设置用户所属角色信息
  342. err = auth_service.AddUserRole(req.PostIds, InsertId)
  343. if err != nil {
  344. g.Log().Error(err)
  345. response.FailJson(true, r, "设置用户权限失败")
  346. }
  347. //设置用户岗位
  348. err = auth_service.AddUserPost(req.PostIds, InsertId)
  349. if err != nil {
  350. g.Log().Error(err)
  351. response.FailJson(true, r, "设置用户岗位信息失败")
  352. }
  353. response.SusJson(true, r, "添加管理员成功")
  354. }
  355. //获取角色信息
  356. roleListEntities, err := auth_service.GetRoleList()
  357. if err != nil {
  358. g.Log().Error(err)
  359. response.FailJson(true, r, "获取角色数据失败")
  360. }
  361. //获取岗位信息
  362. posts, err := post_service.GetUsedPost()
  363. if err != nil {
  364. response.FailJson(true, r, err.Error())
  365. }
  366. res := g.Map{
  367. "roleList": roleListEntities,
  368. "posts": posts,
  369. }
  370. response.SusJson(true, r, "成功", res)
  371. }
  372. //修改管理员
  373. func (c *Auth) EditUser(r *ghttp.Request) {
  374. if r.Method == "POST" {
  375. var req *user.EditUserReq
  376. if err := r.Parse(&req); err != nil {
  377. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  378. }
  379. err := auth_service.EditUser(req)
  380. if err != nil {
  381. response.FailJson(true, r, err.Error())
  382. }
  383. //设置用户所属角色信息
  384. err = auth_service.EditUserRole(req.RoleIds, req.UserId)
  385. if err != nil {
  386. g.Log().Error(err)
  387. response.FailJson(true, r, "设置用户权限失败")
  388. }
  389. //设置用户岗位数据
  390. err = auth_service.AddUserPost(req.PostIds, gconv.Int64(req.UserId))
  391. if err != nil {
  392. g.Log().Error(err)
  393. response.FailJson(true, r, "设置用户岗位信息失败")
  394. }
  395. response.SusJson(true, r, "修改管理员成功")
  396. }
  397. id := r.GetRequestInt("id")
  398. //用户用户信息
  399. userEntity, err := user.Model.Where("id=?", id).One()
  400. if err != nil {
  401. g.Log().Error(err)
  402. response.FailJson(true, r, "获取用户数据失败")
  403. }
  404. //获取角色信息
  405. roleListEntities, err := auth_service.GetRoleList()
  406. if err != nil {
  407. g.Log().Error(err)
  408. response.FailJson(true, r, "获取角色数据失败")
  409. }
  410. //获取已选择的角色信息
  411. checkedRoleIds, err := user_service.GetAdminRoleIds(id)
  412. if err != nil {
  413. g.Log().Error(err)
  414. response.FailJson(true, r, "获取用户角色数据失败")
  415. }
  416. if checkedRoleIds == nil {
  417. checkedRoleIds = g.SliceInt{}
  418. }
  419. //获取岗位信息
  420. posts, err := post_service.GetUsedPost()
  421. if err != nil {
  422. response.FailJson(true, r, err.Error())
  423. }
  424. checkedPosts, err := user_service.GetAdminPosts(id)
  425. if err != nil {
  426. response.FailJson(true, r, err.Error())
  427. }
  428. if checkedPosts == nil {
  429. checkedPosts = []int64{}
  430. }
  431. res := g.Map{
  432. "roleList": roleListEntities,
  433. "userInfo": userEntity,
  434. "checkedRoleIds": checkedRoleIds,
  435. "posts": posts,
  436. "checkedPosts": checkedPosts,
  437. }
  438. response.SusJson(true, r, "成功", res)
  439. }
  440. //用户列表
  441. func (c *Auth) UserList(r *ghttp.Request) {
  442. var req *user.SearchReq
  443. //获取参数
  444. if err := r.Parse(&req); err != nil {
  445. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  446. }
  447. total, page, userList, err := user_service.GetAdminList(req)
  448. if err != nil {
  449. g.Log().Error(err)
  450. response.FailJson(true, r, "获取用户列表数据失败")
  451. }
  452. users := make([]g.Map, len(userList))
  453. //获取所有角色信息
  454. allRoles, err := auth_service.GetRoleList()
  455. if err != nil {
  456. g.Log().Error(err)
  457. response.FailJson(true, r, "获取用户角色数据失败")
  458. }
  459. //获取所有部门信息
  460. depts, err := dept_service.GetList(&sys_dept.SearchParams{})
  461. if err != nil {
  462. g.Log().Error(err)
  463. response.FailJson(true, r, "获取部门数据失败")
  464. }
  465. for k, u := range userList {
  466. var dept *sys_dept.Dept
  467. users[k] = gconv.Map(u)
  468. for _, d := range depts {
  469. if u.DeptId == d.DeptID {
  470. dept = d
  471. }
  472. }
  473. users[k]["dept"] = dept
  474. roles, err := user_service.GetAdminRole(u.Id, allRoles)
  475. if err != nil {
  476. g.Log().Error(err)
  477. response.FailJson(true, r, "获取用户角色数据失败")
  478. }
  479. roleInfo := make([]g.Map, 0, len(roles))
  480. for _, r := range roles {
  481. roleInfo = append(roleInfo, g.Map{"roleId": r.Id, "name": r.Name})
  482. }
  483. users[k]["user_status"] = gconv.String(u.UserStatus)
  484. users[k]["roleInfo"] = roleInfo
  485. }
  486. //用户状态
  487. statusOptions, err := dict_service.GetDictWithDataByType("sys_normal_disable", "", "")
  488. if err != nil {
  489. response.FailJson(true, r, err.Error())
  490. }
  491. //用户性别
  492. userGender, err := dict_service.GetDictWithDataByType("sys_user_sex", "", "")
  493. if err != nil {
  494. response.FailJson(true, r, err.Error())
  495. }
  496. res := g.Map{
  497. "total": total,
  498. "currentPage": page,
  499. "userList": users,
  500. "statusOptions": statusOptions,
  501. "userGender": userGender,
  502. }
  503. response.SusJson(true, r, "成功", res)
  504. }
  505. //删除管理员
  506. func (c *Auth) DeleteAdmin(r *ghttp.Request) {
  507. ids := r.GetInts("ids")
  508. if len(ids) > 0 {
  509. _, err := user.Model.Where("id in(?)", ids).Delete()
  510. if err != nil {
  511. g.Log().Error(err)
  512. response.FailJson(true, r, "删除失败")
  513. }
  514. } else {
  515. response.FailJson(true, r, "删除失败,参数错误")
  516. }
  517. //删除对应权限
  518. enforcer, err := casbin_adapter_service.GetEnforcer()
  519. if err == nil {
  520. for _, v := range ids {
  521. enforcer.RemoveFilteredGroupingPolicy(0, fmt.Sprintf("u_%d", v))
  522. }
  523. }
  524. //删除用户对应的岗位
  525. _, err = user_post.Delete(user_post.Columns.UserId+" in (?)", ids)
  526. if err != nil {
  527. g.Log().Error(err)
  528. }
  529. response.SusJson(true, r, "删除成功")
  530. }
  531. //设置角色状态
  532. func (c *Auth) StatusSetRole(r *ghttp.Request) {
  533. var req *role.StatusSetReq
  534. //获取参数
  535. if err := r.Parse(&req); err != nil {
  536. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  537. }
  538. err := auth_service.StatusSetRole(req)
  539. if err != nil {
  540. response.FailJson(true, r, err.Error())
  541. }
  542. response.SusJson(true, r, "状态设置成功")
  543. }
  544. //角色数据权限分配
  545. func (c *Auth) RoleDataScope(r *ghttp.Request) {
  546. var req *role.DataScopeReq
  547. //获取参数
  548. if err := r.Parse(&req); err != nil {
  549. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  550. }
  551. err := auth_service.RoleDataScope(req)
  552. if err != nil {
  553. response.FailJson(true, r, err.Error())
  554. }
  555. response.SusJson(true, r, "数据权限设置成功", req)
  556. }
  557. //修改用户状态
  558. func (c *Auth) ChangeUserStatus(r *ghttp.Request) {
  559. var req *user.StatusReq
  560. //获取参数
  561. if err := r.Parse(&req); err != nil {
  562. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  563. }
  564. if err := user_service.ChangeUserStatus(req); err != nil {
  565. response.FailJson(true, r, err.Error())
  566. } else {
  567. response.SusJson(true, r, "用户状态设置成功")
  568. }
  569. }
  570. //重置用户密码
  571. func (c *Auth) ResetUserPwd(r *ghttp.Request) {
  572. var req *user.ResetPwdReq
  573. //获取参数
  574. if err := r.Parse(&req); err != nil {
  575. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  576. }
  577. if err := user_service.ResetUserPwd(req); err != nil {
  578. response.FailJson(true, r, err.Error())
  579. } else {
  580. response.SusJson(true, r, "用户密码重置成功")
  581. }
  582. }