sys_role.go 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. package service
  2. import (
  3. "errors"
  4. "IotAdmin/core/sdk/config"
  5. "gorm.io/gorm/clause"
  6. "github.com/casbin/casbin/v2"
  7. "IotAdmin/core/sdk/service"
  8. "gorm.io/gorm"
  9. "IotAdmin/app/system/models"
  10. "IotAdmin/app/system/service/dto"
  11. cDto "IotAdmin/common/dto"
  12. )
  13. type SysRoleService struct {
  14. service.Service
  15. }
  16. // GetPage 获取SysRole列表
  17. func (e *SysRoleService) GetPage(c *dto.SysRoleGetPageReq, list *[]models.SysRole, count *int64) error {
  18. var err error
  19. var data models.SysRole
  20. err = e.Orm.Model(&data).
  21. Scopes(
  22. cDto.MakeCondition(c.GetNeedSearch()),
  23. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  24. ).
  25. Find(list).Limit(-1).Offset(-1).
  26. Count(count).Error
  27. if err != nil {
  28. e.Log.Errorf("db error:%s", err)
  29. return err
  30. }
  31. return nil
  32. }
  33. // Get 获取SysRole对象
  34. func (e *SysRoleService) Get(d *dto.SysRoleGetReq, model *models.SysRole) error {
  35. var err error
  36. db := e.Orm.First(model, d.GetId())
  37. err = db.Error
  38. if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
  39. err = errors.New("查看对象不存在或无权查看")
  40. e.Log.Errorf("db error:%s", err)
  41. return err
  42. }
  43. if err != nil {
  44. e.Log.Errorf("db error:%s", err)
  45. return err
  46. }
  47. model.MenuIds, err = e.GetRoleMenuId(model.RoleId)
  48. if err != nil {
  49. e.Log.Errorf("get menuIds error, %s", err.Error())
  50. return err
  51. }
  52. return nil
  53. }
  54. // Insert 创建SysRole对象
  55. func (e *SysRoleService) Insert(c *dto.SysRoleInsertReq, cb *casbin.SyncedEnforcer) error {
  56. var err error
  57. var data models.SysRole
  58. var dataMenu []models.SysMenu
  59. err = e.Orm.Preload("SysApi").Where("menu_id in ?", c.MenuIds).Find(&dataMenu).Error
  60. if err != nil {
  61. e.Log.Errorf("db error:%s", err)
  62. return err
  63. }
  64. c.Menus = dataMenu
  65. c.Generate(&data)
  66. tx := e.Orm
  67. if config.DatabaseConfig.Driver != "sqlite3" {
  68. tx := e.Orm.Begin()
  69. defer func() {
  70. if err != nil {
  71. tx.Rollback()
  72. } else {
  73. tx.Commit()
  74. }
  75. }()
  76. }
  77. var count int64
  78. err = tx.Model(&data).Where("role_key = ?", c.RoleKey).Count(&count).Error
  79. if err != nil {
  80. e.Log.Errorf("db error:%s", err)
  81. return err
  82. }
  83. if count > 0 {
  84. err = errors.New("roleKey已存在,需更换在提交!")
  85. e.Log.Errorf("db error:%s", err)
  86. return err
  87. }
  88. err = tx.Create(&data).Error
  89. if err != nil {
  90. e.Log.Errorf("db error:%s", err)
  91. return err
  92. }
  93. mp := make(map[string]interface{}, 0)
  94. polices := make([][]string, 0)
  95. for _, menu := range dataMenu {
  96. for _, api := range menu.SysApi {
  97. if mp[data.RoleKey+"-"+api.Path+"-"+api.Action] != "" {
  98. mp[data.RoleKey+"-"+api.Path+"-"+api.Action] = ""
  99. polices = append(polices, []string{data.RoleKey, api.Path, api.Action})
  100. }
  101. }
  102. }
  103. if len(polices) <= 0 {
  104. return nil
  105. }
  106. // 写入 sys_casbin_rule 权限表里 当前角色数据的记录
  107. _, err = cb.AddNamedPolicies("p", polices)
  108. if err != nil {
  109. return err
  110. }
  111. return nil
  112. }
  113. // Update 修改SysRole对象
  114. func (e *SysRoleService) Update(c *dto.SysRoleUpdateReq, cb *casbin.SyncedEnforcer, roleKey string) error {
  115. var err error
  116. tx := e.Orm
  117. if config.DatabaseConfig.Driver != "sqlite3" {
  118. tx := e.Orm.Begin()
  119. defer func() {
  120. if err != nil {
  121. tx.Rollback()
  122. } else {
  123. tx.Commit()
  124. }
  125. }()
  126. }
  127. var model = models.SysRole{}
  128. var mList = make([]models.SysMenu, 0)
  129. tx.Preload("Menus").First(&model, c.GetId())
  130. if err = checkRoleAllowed(model, roleKey); err != nil {
  131. return err
  132. }
  133. tx.Preload("SysApi").Where("menu_id in ?", c.MenuIds).Find(&mList)
  134. err = tx.Model(&model).Association("Menus").Delete(model.Menus)
  135. if err != nil {
  136. e.Log.Errorf("delete policy error:%s", err)
  137. return err
  138. }
  139. c.Generate(&model)
  140. model.Menus = &mList
  141. // 更新关联的数据,使用 FullSaveAssociations 模式
  142. db := tx.Session(&gorm.Session{FullSaveAssociations: true}).Debug().Save(&model)
  143. if err = db.Error; err != nil {
  144. e.Log.Errorf("db error:%s", err)
  145. return err
  146. }
  147. if db.RowsAffected == 0 {
  148. return errors.New("无权更新该数据")
  149. }
  150. // 清除 sys_casbin_rule 权限表里 当前角色的所有记录
  151. _, err = cb.RemoveFilteredPolicy(0, model.RoleKey)
  152. if err != nil {
  153. e.Log.Errorf("delete policy error:%s", err)
  154. return err
  155. }
  156. mp := make(map[string]interface{}, 0)
  157. polices := make([][]string, 0)
  158. for _, menu := range mList {
  159. for _, api := range menu.SysApi {
  160. if mp[model.RoleKey+"-"+api.Path+"-"+api.Action] != "" {
  161. mp[model.RoleKey+"-"+api.Path+"-"+api.Action] = ""
  162. //_, err = cb.AddNamedPolicy("p", model.RoleKey, api.Path, api.Action)
  163. polices = append(polices, []string{model.RoleKey, api.Path, api.Action})
  164. }
  165. }
  166. }
  167. if len(polices) <= 0 {
  168. return nil
  169. }
  170. // 写入 sys_casbin_rule 权限表里 当前角色数据的记录
  171. _, err = cb.AddNamedPolicies("p", polices)
  172. if err != nil {
  173. return err
  174. }
  175. return nil
  176. }
  177. // Remove 删除SysRole
  178. func (e *SysRoleService) Remove(c *dto.SysRoleDeleteReq, cb *casbin.SyncedEnforcer, roleKey string) error {
  179. var err error
  180. tx := e.Orm
  181. if config.DatabaseConfig.Driver != "sqlite3" {
  182. tx := e.Orm.Begin()
  183. defer func() {
  184. if err != nil {
  185. tx.Rollback()
  186. } else {
  187. tx.Commit()
  188. }
  189. }()
  190. }
  191. var model = models.SysRole{}
  192. tx.Preload("Menus").Preload("Orgs").First(&model, c.GetId())
  193. if err = checkRoleAllowed(model, roleKey); err != nil {
  194. return err
  195. }
  196. //删除 SysRoleService 时,同时删除角色所有 关联其它表 记录 (Menus 和 Orgs)
  197. db := tx.Select(clause.Associations).Delete(&model)
  198. if err = db.Error; err != nil {
  199. e.Log.Errorf("db error:%s", err)
  200. return err
  201. }
  202. if db.RowsAffected == 0 {
  203. return errors.New("无权更新该数据")
  204. }
  205. // 清除 sys_casbin_rule 权限表里 当前角色的所有记录
  206. _, _ = cb.RemoveFilteredPolicy(0, model.RoleKey)
  207. return nil
  208. }
  209. // 检查是否可以操作role
  210. func checkRoleAllowed(role models.SysRole, roleKey string) error {
  211. if role.RoleKey == "admin" {
  212. return errors.New("不能修改删除admin角色")
  213. }
  214. if role.Flag == "static" && roleKey != "admin" {
  215. return errors.New("内置角色不能修改删除")
  216. }
  217. return nil
  218. }
  219. // GetRoleMenuId 获取角色对应的菜单ids
  220. func (e *SysRoleService) GetRoleMenuId(roleId int) ([]int, error) {
  221. menuIds := make([]int, 0)
  222. model := models.SysRole{}
  223. model.RoleId = roleId
  224. if err := e.Orm.Model(&model).Preload("Menus").First(&model).Error; err != nil {
  225. return nil, err
  226. }
  227. l := *model.Menus
  228. for i := 0; i < len(l); i++ {
  229. menuIds = append(menuIds, l[i].MenuId)
  230. }
  231. return menuIds, nil
  232. }
  233. func (e *SysRoleService) UpdateDataScope(c *dto.RoleDataScopeReq) *SysRoleService {
  234. var err error
  235. tx := e.Orm
  236. if config.DatabaseConfig.Driver != "sqlite3" {
  237. tx := e.Orm.Begin()
  238. defer func() {
  239. if err != nil {
  240. tx.Rollback()
  241. } else {
  242. tx.Commit()
  243. }
  244. }()
  245. }
  246. var dList = make([]models.SysOrg, 0)
  247. var model = models.SysRole{}
  248. tx.Preload("Orgs").First(&model, c.RoleId)
  249. tx.Where("org_id in ?", c.OrgIds).Find(&dList)
  250. // 删除SysRole 和 SysOrgService 的关联关系
  251. err = tx.Model(&model).Association("Orgs").Delete(model.Orgs)
  252. if err != nil {
  253. e.Log.Errorf("delete Orgs error:%s", err)
  254. _ = e.AddError(err)
  255. return e
  256. }
  257. c.Generate(&model)
  258. model.Orgs = &dList
  259. // 更新关联的数据,使用 FullSaveAssociations 模式
  260. db := tx.Model(&model).Session(&gorm.Session{FullSaveAssociations: true}).Debug().Save(&model)
  261. if err = db.Error; err != nil {
  262. e.Log.Errorf("db error:%s", err)
  263. _ = e.AddError(err)
  264. return e
  265. }
  266. if db.RowsAffected == 0 {
  267. _ = e.AddError(errors.New("无权更新该数据"))
  268. return e
  269. }
  270. return e
  271. }
  272. // UpdateStatus 修改SysRole对象status
  273. func (e *SysRoleService) UpdateStatus(c *dto.UpdateStatusReq) error {
  274. var err error
  275. tx := e.Orm
  276. if config.DatabaseConfig.Driver != "sqlite3" {
  277. tx := e.Orm.Begin()
  278. defer func() {
  279. if err != nil {
  280. tx.Rollback()
  281. } else {
  282. tx.Commit()
  283. }
  284. }()
  285. }
  286. var model = models.SysRole{}
  287. tx.First(&model, c.GetId())
  288. c.Generate(&model)
  289. // 更新关联的数据,使用 FullSaveAssociations 模式
  290. db := tx.Session(&gorm.Session{FullSaveAssociations: true}).Debug().Save(&model)
  291. if err = db.Error; err != nil {
  292. e.Log.Errorf("db error:%s", err)
  293. return err
  294. }
  295. if db.RowsAffected == 0 {
  296. return errors.New("无权更新该数据")
  297. }
  298. return nil
  299. }
  300. // GetWithName 获取SysRole对象
  301. func (e *SysRoleService) GetWithName(d *dto.SysRoleByName, model *models.SysRole) *SysRoleService {
  302. var err error
  303. db := e.Orm.Where("role_name = ?", d.RoleName).First(model)
  304. err = db.Error
  305. if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
  306. err = errors.New("查看对象不存在或无权查看")
  307. e.Log.Errorf("db error:%s", err)
  308. _ = e.AddError(err)
  309. return e
  310. }
  311. if err != nil {
  312. e.Log.Errorf("db error:%s", err)
  313. _ = e.AddError(err)
  314. return e
  315. }
  316. model.MenuIds, err = e.GetRoleMenuId(model.RoleId)
  317. if err != nil {
  318. e.Log.Errorf("get menuIds error, %s", err.Error())
  319. _ = e.AddError(err)
  320. return e
  321. }
  322. return e
  323. }
  324. // GetById 获取SysRole对象
  325. func (e *SysRoleService) GetById(roleId int) ([]string, error) {
  326. permissions := make([]string, 0)
  327. model := models.SysRole{}
  328. model.RoleId = roleId
  329. if err := e.Orm.Model(&model).Preload("Menus").First(&model).Error; err != nil {
  330. return nil, err
  331. }
  332. l := *model.Menus
  333. for i := 0; i < len(l); i++ {
  334. if l[i].Permission != "" {
  335. permissions = append(permissions, l[i].Permission)
  336. }
  337. }
  338. return permissions, nil
  339. }