auth.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  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. gpSlice := make([]int, len(gp))
  235. for k, v := range gp {
  236. gpSlice[k] = gconv.Int(gstr.SubStr(v[1], 2))
  237. }
  238. mList = utils.PushSonToParent(mList)
  239. res := g.Map{
  240. "parentList": pList,
  241. "menuList": mList,
  242. "role": role,
  243. "checkedRules": gpSlice,
  244. }
  245. response.SusJson(true, r, "成功", res)
  246. }
  247. //删除角色
  248. func (c *Auth) DeleteRole(r *ghttp.Request) {
  249. ids := r.GetRequestArray("ids")
  250. if len(ids) == 0 {
  251. response.FailJson(true, r, "删除失败,参数错误")
  252. }
  253. tx, err := g.DB("default").Begin() //开启事务
  254. if err != nil {
  255. g.Log().Error(err)
  256. response.FailJson(true, r, "事务处理失败")
  257. }
  258. _, err = tx.Table(role.Table).Where("id in(?)", ids).Delete()
  259. if err != nil {
  260. g.Log().Error(err)
  261. tx.Rollback()
  262. response.FailJson(true, r, "删除失败")
  263. }
  264. //删除角色的权限
  265. for _, v := range ids {
  266. err = auth_service.DeleteRoleRule(gconv.Int64(v))
  267. if err != nil {
  268. g.Log().Error(err)
  269. tx.Rollback()
  270. response.FailJson(true, r, "删除失败")
  271. }
  272. }
  273. tx.Commit()
  274. response.SusJson(true, r, "删除成功")
  275. }
  276. //添加管理员
  277. func (c *Auth) AddUser(r *ghttp.Request) {
  278. if r.Method == "POST" {
  279. requestData := r.GetFormMap()
  280. InsertId, err := auth_service.AddUser(requestData)
  281. if err != nil {
  282. response.FailJson(true, r, err.Error())
  283. }
  284. //设置用户所属角色信息
  285. err = auth_service.AddUserRole(requestData["role_id"], InsertId)
  286. if err != nil {
  287. g.Log().Error(err)
  288. response.FailJson(true, r, "设置用户权限失败")
  289. }
  290. response.SusJson(true, r, "添加管理员成功")
  291. }
  292. //获取角色信息
  293. err, roleList := auth_service.GetRoleList("")
  294. if err != nil {
  295. g.Log().Error(err)
  296. response.FailJson(true, r, "获取角色数据失败")
  297. }
  298. roleList = utils.ParentSonSort(roleList, 0, 0, "parent_id", "id", "flg", "name")
  299. res := g.Map{
  300. "roleList": roleList,
  301. }
  302. response.SusJson(true, r, "成功", res)
  303. }
  304. //修改管理员
  305. func (c *Auth) EditUser(r *ghttp.Request) {
  306. id := r.GetRequestInt("id")
  307. if r.Method == "POST" {
  308. requestData := r.GetFormMap()
  309. err := auth_service.EditUser(requestData)
  310. if err != nil {
  311. response.FailJson(true, r, err.Error())
  312. }
  313. //设置用户所属角色信息
  314. err = auth_service.EditUserRole(requestData["role_id"], id)
  315. if err != nil {
  316. g.Log().Error(err)
  317. response.FailJson(true, r, "设置用户权限失败")
  318. }
  319. response.SusJson(true, r, "修改管理员成功")
  320. }
  321. //用户用户信息
  322. userEntity, err := user.Model.Where("id=?", id).One()
  323. if err != nil {
  324. g.Log().Error(err)
  325. response.FailJson(true, r, "获取用户数据失败")
  326. }
  327. //获取角色信息
  328. err, roleList := auth_service.GetRoleList("")
  329. if err != nil {
  330. g.Log().Error(err)
  331. response.FailJson(true, r, "获取角色数据失败")
  332. }
  333. roleList = utils.ParentSonSort(roleList, 0, 0, "parent_id", "id", "flg", "name")
  334. //获取已选择的角色信息
  335. checkedRoleIds, err := user_service.GetAdminRoleIds(id)
  336. if err != nil {
  337. g.Log().Error(err)
  338. response.FailJson(true, r, "获取用户角色数据失败")
  339. }
  340. res := g.Map{
  341. "roleList": roleList,
  342. "userInfo": userEntity,
  343. "checkedRoleIds": checkedRoleIds,
  344. }
  345. response.SusJson(true, r, "成功", res)
  346. }
  347. //用户列表
  348. func (c *Auth) UserList(r *ghttp.Request) {
  349. keyWords := r.GetString("keywords")
  350. page := r.GetInt("page")
  351. if page == 0 {
  352. page = 1
  353. }
  354. var where = map[string]interface{}{}
  355. if keyWords != "" {
  356. where["keyWords"] = keyWords
  357. }
  358. total, userList, err := user_service.GetAdminList(where, page)
  359. if err != nil {
  360. g.Log().Error(err)
  361. response.FailJson(true, r, "获取用户列表数据失败")
  362. }
  363. users := make([]g.Map, len(userList))
  364. for k, u := range userList {
  365. users[k] = gconv.Map(u)
  366. roles, err := user_service.GetAdminRole(u.Id)
  367. if err != nil {
  368. g.Log().Error(err)
  369. response.FailJson(true, r, "获取用户角色数据失败")
  370. }
  371. roleInfo := make(map[int]string, len(roles))
  372. for _, r := range roles {
  373. roleInfo[r.Id] = r.Name
  374. }
  375. users[k]["roleInfo"] = roleInfo
  376. }
  377. //获取用户对应角色
  378. res := g.Map{
  379. "total": total,
  380. "currentPage": page,
  381. "userList": users,
  382. }
  383. response.SusJson(true, r, "成功", res)
  384. }
  385. //删除管理员
  386. func (c *Auth) DeleteAdmin(r *ghttp.Request) {
  387. ids := r.GetInts("ids")
  388. if len(ids) > 0 {
  389. _, err := user.Model.Where("id in(?)", ids).Delete()
  390. if err != nil {
  391. g.Log().Error(err)
  392. response.FailJson(true, r, "删除失败")
  393. }
  394. } else {
  395. response.FailJson(true, r, "删除失败,参数错误")
  396. }
  397. //删除对应权限
  398. enforcer, err := casbin_adapter_service.GetEnforcer()
  399. if err == nil {
  400. for _, v := range ids {
  401. enforcer.RemoveFilteredGroupingPolicy(0, fmt.Sprintf("u_%d", v))
  402. }
  403. }
  404. response.SusJson(true, r, "删除成功")
  405. }