auth.go 10 KB

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