auth.go 12 KB

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