auth.go 11 KB

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