auth.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  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/user"
  7. "gfast/app/service/admin/auth_service"
  8. "gfast/app/service/admin/user_service"
  9. "gfast/app/service/cache_service"
  10. "gfast/app/service/casbin_adapter_service"
  11. "gfast/library/response"
  12. "gfast/library/utils"
  13. "github.com/gogf/gf/frame/g"
  14. "github.com/gogf/gf/net/ghttp"
  15. "github.com/gogf/gf/text/gstr"
  16. "github.com/gogf/gf/util/gconv"
  17. "github.com/gogf/gf/util/gvalid"
  18. )
  19. //菜单用户组用户管理
  20. type Auth struct{}
  21. //菜单列表
  22. func (c *Auth) MenuList(r *ghttp.Request) {
  23. //获取菜单信息
  24. listEntities, err := auth_service.GetMenuList()
  25. if err != nil {
  26. g.Log().Error(err)
  27. response.FailJson(true, r, "获取数据失败")
  28. }
  29. list := gconv.SliceMap(listEntities)
  30. list = utils.PushSonToParent(list)
  31. response.SusJson(true, r, "成功", g.Map{
  32. "list": list,
  33. })
  34. }
  35. //菜单排序
  36. func (c *Auth) MenuSort(r *ghttp.Request) {
  37. sorts := r.Get("sorts")
  38. s := gconv.Map(sorts)
  39. if s == nil {
  40. response.FailJson(true, r, "排序失败")
  41. }
  42. for k, v := range s {
  43. auth_rule.Model.Where("id=?", k).Data("weigh", v).Update()
  44. }
  45. response.SusJson(true, r, "排序成功")
  46. }
  47. //添加菜单
  48. func (c *Auth) AddMenu(r *ghttp.Request) {
  49. if r.Method == "POST" {
  50. menu := new(auth_rule.MenuReq)
  51. if err := r.Parse(menu); err != nil {
  52. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  53. }
  54. //判断菜单规则是否存在
  55. if !auth_service.CheckMenuNameUnique(menu.Name, 0) {
  56. response.FailJson(true, r, "菜单规则名称已经存在")
  57. }
  58. //保存到数据库
  59. err, _ := auth_service.AddMenu(menu)
  60. if err != nil {
  61. g.Log().Error(err)
  62. response.FailJson(true, r, "添加菜单失败")
  63. }
  64. //清除TAG缓存
  65. cache_service.New().RemoveByTag(cache_service.AdminAuthTag)
  66. response.SusJson(true, r, "添加菜单成功")
  67. }
  68. //获取父级菜单信息
  69. listEntities, err := auth_service.GetIsMenuList()
  70. if err != nil {
  71. response.FailJson(true, r, "获取数据失败")
  72. }
  73. list := gconv.SliceMap(listEntities)
  74. list = utils.ParentSonSort(list)
  75. response.SusJson(true, r, "成功", g.Map{"parentList": list})
  76. }
  77. //修改菜单
  78. func (c *Auth) EditMenu(r *ghttp.Request) {
  79. id := r.GetInt("id")
  80. if r.Method == "POST" {
  81. menu := new(auth_rule.MenuReq)
  82. if err := r.Parse(menu); err != nil {
  83. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  84. }
  85. //判断菜单规则是否存在
  86. if !auth_service.CheckMenuNameUnique(menu.Name, id) {
  87. response.FailJson(true, r, "菜单规则名称已经存在")
  88. }
  89. //保存到数据库
  90. err, _ := auth_service.EditMenu(menu, id)
  91. if err != nil {
  92. g.Log().Error(err)
  93. response.FailJson(true, r, "修改菜单失败")
  94. }
  95. //清除TAG缓存
  96. cache_service.New().RemoveByTag(cache_service.AdminAuthTag)
  97. response.SusJson(true, r, "修改菜单成功")
  98. }
  99. menuEntity, err := auth_rule.Model.Where("id=?", id).One()
  100. if err != nil {
  101. g.Log().Error(err)
  102. response.FailJson(true, r, "获取数据失败")
  103. }
  104. //获取父级菜单信息
  105. listEntities, err := auth_service.GetIsMenuList()
  106. if err != nil {
  107. response.FailJson(true, r, "获取数据失败")
  108. }
  109. list := gconv.SliceMap(listEntities)
  110. list = utils.ParentSonSort(list)
  111. response.SusJson(true, r, "成功", g.Map{
  112. "parentList": list,
  113. "menu": menuEntity,
  114. })
  115. }
  116. //删除菜单
  117. func (c *Auth) DeleteMenu(r *ghttp.Request) {
  118. ids := r.GetInts("ids")
  119. if len(ids) == 0 {
  120. response.FailJson(true, r, "删除失败,参数错误")
  121. }
  122. _, err := auth_rule.Model.Where("id in(?)", ids).Delete()
  123. if err != nil {
  124. g.Log().Error(err)
  125. response.FailJson(true, r, "删除失败")
  126. }
  127. //清除TAG缓存
  128. cache_service.New().RemoveByTag(cache_service.AdminAuthTag)
  129. response.SusJson(true, r, "删除成功")
  130. }
  131. //角色列表
  132. func (c *Auth) RoleList(r *ghttp.Request) {
  133. //获取角色列表
  134. listEntities, err := auth_service.GetRoleList()
  135. if err != nil {
  136. g.Log().Error(err)
  137. response.FailJson(true, r, "获取数据失败")
  138. }
  139. list := gconv.SliceMap(listEntities)
  140. list = utils.PushSonToParent(list, 0, "parent_id", "id", "children", "", nil, false)
  141. response.SusJson(true, r, "成功", g.Map{
  142. "list": list,
  143. })
  144. }
  145. //添加角色
  146. func (c *Auth) AddRole(r *ghttp.Request) {
  147. //添加操作
  148. if r.Method == "POST" {
  149. //获取表单提交的数据
  150. res := r.GetFormMap()
  151. tx, err := g.DB("default").Begin() //开启事务
  152. if err != nil {
  153. g.Log().Error(err)
  154. response.FailJson(true, r, "事务处理失败")
  155. }
  156. //插入角色
  157. //添加角色获取添加的id
  158. insertId, err := auth_service.AddRole(tx, res)
  159. if err != nil {
  160. tx.Rollback() //回滚
  161. response.FailJson(true, r, err.Error())
  162. }
  163. //添加角色权限
  164. err = auth_service.AddRoleRule(res["rule"], insertId)
  165. if err != nil {
  166. tx.Rollback() //回滚
  167. g.Log().Error(err.Error())
  168. response.FailJson(true, r, "添加用户组失败")
  169. }
  170. tx.Commit()
  171. //清除TAG缓存
  172. cache_service.New().RemoveByTag(cache_service.AdminAuthTag)
  173. response.SusJson(true, r, "添加用户组成功")
  174. }
  175. //获取父级组
  176. pListEntities, err := auth_service.GetRoleList()
  177. if err != nil {
  178. g.Log().Error(err)
  179. response.FailJson(true, r, "获取父级数据失败")
  180. }
  181. pList := gconv.SliceMap(pListEntities)
  182. pList = utils.ParentSonSort(pList, 0, 0, "parent_id", "id", "flg", "name")
  183. //获取菜单信息
  184. mListEntities, err := auth_service.GetMenuList()
  185. if err != nil {
  186. g.Log().Error(err)
  187. response.FailJson(true, r, "获取菜单数据失败")
  188. }
  189. mList := gconv.SliceMap(mListEntities)
  190. mList = utils.PushSonToParent(mList)
  191. res := g.Map{
  192. "parentList": pList,
  193. "menuList": mList,
  194. }
  195. response.SusJson(true, r, "成功", res)
  196. }
  197. //修改角色
  198. func (c *Auth) EditRole(r *ghttp.Request) {
  199. id := r.GetRequestInt64("id")
  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. err = auth_service.EditRole(tx, res)
  210. if err != nil {
  211. tx.Rollback() //回滚
  212. response.FailJson(true, r, err.Error())
  213. }
  214. //添加角色权限
  215. err = auth_service.EditRoleRule(res["rule"], id)
  216. if err != nil {
  217. tx.Rollback() //回滚
  218. g.Log().Error(err.Error())
  219. response.FailJson(true, r, "添加用户组失败")
  220. }
  221. tx.Commit()
  222. //清除TAG缓存
  223. cache_service.New().RemoveByTag(cache_service.AdminAuthTag)
  224. response.SusJson(true, r, "修改用户组成功")
  225. }
  226. //获取角色信息
  227. role, err := role.Model.Where("id=?", id).One()
  228. if err != nil {
  229. response.FailJson(true, r, "获取角色数据失败")
  230. }
  231. //获取父级组
  232. pListEntities, err := auth_service.GetRoleList()
  233. if err != nil {
  234. g.Log().Error(err)
  235. response.FailJson(true, r, "获取父级数据失败")
  236. }
  237. pList := gconv.SliceMap(pListEntities)
  238. pList = utils.ParentSonSort(pList, 0, 0, "parent_id", "id", "flg", "name")
  239. //获取菜单信息
  240. mListEntities, err := auth_service.GetMenuList()
  241. if err != nil {
  242. g.Log().Error(err)
  243. response.FailJson(true, r, "获取菜单数据失败")
  244. }
  245. //获取角色关联的菜单规则
  246. enforcer, err := casbin_adapter_service.GetEnforcer()
  247. if err != nil {
  248. g.Log().Error(err)
  249. response.FailJson(true, r, "获取权限处理器失败")
  250. }
  251. gp := enforcer.GetFilteredNamedPolicy("p", 0, fmt.Sprintf("g_%d", id))
  252. gpSlice := make([]int, len(gp))
  253. for k, v := range gp {
  254. gpSlice[k] = gconv.Int(gstr.SubStr(v[1], 2))
  255. }
  256. mList := gconv.SliceMap(mListEntities)
  257. mList = utils.PushSonToParent(mList)
  258. res := g.Map{
  259. "parentList": pList,
  260. "menuList": mList,
  261. "role": role,
  262. "checkedRules": gpSlice,
  263. }
  264. response.SusJson(true, r, "成功", res)
  265. }
  266. //删除角色
  267. func (c *Auth) DeleteRole(r *ghttp.Request) {
  268. ids := r.GetRequestArray("ids")
  269. if len(ids) == 0 {
  270. response.FailJson(true, r, "删除失败,参数错误")
  271. }
  272. tx, err := g.DB("default").Begin() //开启事务
  273. if err != nil {
  274. g.Log().Error(err)
  275. response.FailJson(true, r, "事务处理失败")
  276. }
  277. _, err = tx.Table(role.Table).Where("id in(?)", ids).Delete()
  278. if err != nil {
  279. g.Log().Error(err)
  280. tx.Rollback()
  281. response.FailJson(true, r, "删除失败")
  282. }
  283. //删除角色的权限
  284. for _, v := range ids {
  285. err = auth_service.DeleteRoleRule(gconv.Int64(v))
  286. if err != nil {
  287. g.Log().Error(err)
  288. tx.Rollback()
  289. response.FailJson(true, r, "删除失败")
  290. }
  291. }
  292. tx.Commit()
  293. //清除TAG缓存
  294. cache_service.New().RemoveByTag(cache_service.AdminAuthTag)
  295. response.SusJson(true, r, "删除成功")
  296. }
  297. //添加管理员
  298. func (c *Auth) AddUser(r *ghttp.Request) {
  299. if r.Method == "POST" {
  300. requestData := r.GetFormMap()
  301. InsertId, err := auth_service.AddUser(requestData)
  302. if err != nil {
  303. response.FailJson(true, r, err.Error())
  304. }
  305. //设置用户所属角色信息
  306. err = auth_service.AddUserRole(requestData["role_id"], InsertId)
  307. if err != nil {
  308. g.Log().Error(err)
  309. response.FailJson(true, r, "设置用户权限失败")
  310. }
  311. response.SusJson(true, r, "添加管理员成功")
  312. }
  313. //获取角色信息
  314. roleListEntities, err := auth_service.GetRoleList()
  315. if err != nil {
  316. g.Log().Error(err)
  317. response.FailJson(true, r, "获取角色数据失败")
  318. }
  319. roleList := gconv.SliceMap(roleListEntities)
  320. roleList = utils.ParentSonSort(roleList, 0, 0, "parent_id", "id", "flg", "name")
  321. res := g.Map{
  322. "roleList": roleList,
  323. }
  324. response.SusJson(true, r, "成功", res)
  325. }
  326. //修改管理员
  327. func (c *Auth) EditUser(r *ghttp.Request) {
  328. id := r.GetRequestInt("id")
  329. if r.Method == "POST" {
  330. requestData := r.GetFormMap()
  331. err := auth_service.EditUser(requestData)
  332. if err != nil {
  333. response.FailJson(true, r, err.Error())
  334. }
  335. //设置用户所属角色信息
  336. err = auth_service.EditUserRole(requestData["role_id"], id)
  337. if err != nil {
  338. g.Log().Error(err)
  339. response.FailJson(true, r, "设置用户权限失败")
  340. }
  341. response.SusJson(true, r, "修改管理员成功")
  342. }
  343. //用户用户信息
  344. userEntity, err := user.Model.Where("id=?", id).One()
  345. if err != nil {
  346. g.Log().Error(err)
  347. response.FailJson(true, r, "获取用户数据失败")
  348. }
  349. //获取角色信息
  350. roleListEntities, err := auth_service.GetRoleList()
  351. if err != nil {
  352. g.Log().Error(err)
  353. response.FailJson(true, r, "获取角色数据失败")
  354. }
  355. roleList := gconv.SliceMap(roleListEntities)
  356. roleList = utils.ParentSonSort(roleList, 0, 0, "parent_id", "id", "flg", "name")
  357. //获取已选择的角色信息
  358. checkedRoleIds, err := user_service.GetAdminRoleIds(id)
  359. if err != nil {
  360. g.Log().Error(err)
  361. response.FailJson(true, r, "获取用户角色数据失败")
  362. }
  363. res := g.Map{
  364. "roleList": roleList,
  365. "userInfo": userEntity,
  366. "checkedRoleIds": checkedRoleIds,
  367. }
  368. response.SusJson(true, r, "成功", res)
  369. }
  370. //用户列表
  371. func (c *Auth) UserList(r *ghttp.Request) {
  372. keyWords := r.GetString("keywords")
  373. page := r.GetInt("page")
  374. if page == 0 {
  375. page = 1
  376. }
  377. var where = map[string]interface{}{}
  378. if keyWords != "" {
  379. where["keyWords"] = keyWords
  380. }
  381. total, userList, err := user_service.GetAdminList(where, page)
  382. if err != nil {
  383. g.Log().Error(err)
  384. response.FailJson(true, r, "获取用户列表数据失败")
  385. }
  386. users := make([]g.Map, len(userList))
  387. //获取所有角色信息
  388. allRoles, err := auth_service.GetRoleList()
  389. if err != nil {
  390. g.Log().Error(err)
  391. response.FailJson(true, r, "获取用户角色数据失败")
  392. }
  393. for k, u := range userList {
  394. users[k] = gconv.Map(u)
  395. roles, err := user_service.GetAdminRole(u.Id, allRoles)
  396. if err != nil {
  397. g.Log().Error(err)
  398. response.FailJson(true, r, "获取用户角色数据失败")
  399. }
  400. roleInfo := make(map[int]string, len(roles))
  401. for _, r := range roles {
  402. roleInfo[r.Id] = r.Name
  403. }
  404. users[k]["roleInfo"] = roleInfo
  405. }
  406. //获取用户对应角色
  407. res := g.Map{
  408. "total": total,
  409. "currentPage": page,
  410. "userList": users,
  411. }
  412. response.SusJson(true, r, "成功", res)
  413. }
  414. //删除管理员
  415. func (c *Auth) DeleteAdmin(r *ghttp.Request) {
  416. ids := r.GetInts("ids")
  417. if len(ids) > 0 {
  418. _, err := user.Model.Where("id in(?)", ids).Delete()
  419. if err != nil {
  420. g.Log().Error(err)
  421. response.FailJson(true, r, "删除失败")
  422. }
  423. } else {
  424. response.FailJson(true, r, "删除失败,参数错误")
  425. }
  426. //删除对应权限
  427. enforcer, err := casbin_adapter_service.GetEnforcer()
  428. if err == nil {
  429. for _, v := range ids {
  430. enforcer.RemoveFilteredGroupingPolicy(0, fmt.Sprintf("u_%d", v))
  431. }
  432. }
  433. response.SusJson(true, r, "删除成功")
  434. }