auth.go 10 KB

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