menu.go 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. package models
  2. import (
  3. "errors"
  4. "fmt"
  5. orm "device-manage/common/global"
  6. "device-manage/tools"
  7. )
  8. //XHRPOSThttp://127.0.0.1:8000/api/v1/menu
  9. //[HTTP/1.1 200 OK 15ms]
  10. //
  11. //
  12. // action "PUT"
  13. // isFrame "1"
  14. // menuType "A"
  15. // parentId 523
  16. // path "/test/ccc"
  17. // sort 0
  18. // title "assssss"
  19. // visible "0"
  20. //
  21. // 1
  22. //
  23. // {"parentId":523,"menuType":"A","sort":0,"action":"PUT","isFrame":"1","visible":"0","title":"assssss","path":"/test/ccc"}
  24. type Menu struct {
  25. MenuId int `json:"menuId" gorm:"primary_key;AUTO_INCREMENT"`
  26. MenuName string `json:"menuName" gorm:"size:128;"`
  27. Title string `json:"title" gorm:"size:128;"`
  28. Icon string `json:"icon" gorm:"size:128;"`
  29. Path string `json:"path" gorm:"size:128;"`
  30. Paths string `json:"paths" gorm:"size:128;"`
  31. MenuType string `json:"menuType" gorm:"size:1;"`
  32. Action string `json:"action" gorm:"size:16;"`
  33. Permission string `json:"permission" gorm:"size:255;"`
  34. ParentId int `json:"parentId" gorm:"size:11;"`
  35. NoCache bool `json:"noCache" gorm:"size:8;"`
  36. Breadcrumb string `json:"breadcrumb" gorm:"size:255;"`
  37. Component string `json:"component" gorm:"size:255;"`
  38. Sort int `json:"sort" gorm:"size:4;"`
  39. Visible string `json:"visible" gorm:"size:1;"`
  40. CreateBy string `json:"createBy" gorm:"size:128;"`
  41. UpdateBy string `json:"updateBy" gorm:"size:128;"`
  42. IsFrame string `json:"isFrame" gorm:"size:1;DEFAULT:0;"`
  43. DataScope string `json:"dataScope" gorm:"-"`
  44. Params string `json:"params" gorm:"-"`
  45. RoleId int `gorm:"-"`
  46. Children []Menu `json:"children" gorm:"-"`
  47. IsSelect bool `json:"is_select" gorm:"-"`
  48. BaseModel
  49. }
  50. func (Menu) TableName() string {
  51. return "sys_menu"
  52. }
  53. type MenuLable struct {
  54. Id int `json:"id" gorm:"-"`
  55. Label string `json:"label" gorm:"-"`
  56. Children []MenuLable `json:"children" gorm:"-"`
  57. }
  58. type Menus struct {
  59. MenuId int `json:"menuId" gorm:"column:menu_id;primary_key;"`
  60. MenuName string `json:"menuName" gorm:"column:menu_name"`
  61. Title string `json:"title" gorm:"column:title"`
  62. Icon string `json:"icon" gorm:"column:icon"`
  63. Path string `json:"path" gorm:"column:path"`
  64. MenuType string `json:"menuType" gorm:"column:menu_type"`
  65. Action string `json:"action" gorm:"column:action"`
  66. Permission string `json:"permission" gorm:"column:permission"`
  67. ParentId int `json:"parentId" gorm:"column:parent_id"`
  68. NoCache bool `json:"noCache" gorm:"column:no_cache"`
  69. Breadcrumb string `json:"breadcrumb" gorm:"column:breadcrumb"`
  70. Component string `json:"component" gorm:"column:component"`
  71. Sort int `json:"sort" gorm:"column:sort"`
  72. Visible string `json:"visible" gorm:"column:visible"`
  73. Children []Menu `json:"children" gorm:"-"`
  74. CreateBy string `json:"createBy" gorm:"column:create_by"`
  75. UpdateBy string `json:"updateBy" gorm:"column:update_by"`
  76. DataScope string `json:"dataScope" gorm:"-"`
  77. Params string `json:"params" gorm:"-"`
  78. BaseModel
  79. }
  80. func (Menus) TableName() string {
  81. return "sys_menu"
  82. }
  83. type MenuRole struct {
  84. Menus
  85. IsSelect bool `json:"is_select" gorm:"-"`
  86. }
  87. type MS []Menu
  88. func (e *Menu) GetByMenuId() (Menu Menu, err error) {
  89. table := orm.Eloquent.Table(e.TableName())
  90. table = table.Where("menu_id = ?", e.MenuId)
  91. if err = table.Find(&Menu).Error; err != nil {
  92. return
  93. }
  94. return
  95. }
  96. func (e *Menu) SetMenu() (m []Menu, err error) {
  97. menulist, err := e.GetPage()
  98. m = make([]Menu, 0)
  99. for i := 0; i < len(menulist); i++ {
  100. if menulist[i].ParentId != 0 {
  101. continue
  102. }
  103. menusInfo := DiguiMenu(&menulist, menulist[i])
  104. m = append(m, menusInfo)
  105. }
  106. return
  107. }
  108. func DiguiMenu(menulist *[]Menu, menu Menu) Menu {
  109. list := *menulist
  110. min := make([]Menu, 0)
  111. for j := 0; j < len(list); j++ {
  112. if menu.MenuId != list[j].ParentId {
  113. continue
  114. }
  115. mi := Menu{}
  116. mi.MenuId = list[j].MenuId
  117. mi.MenuName = list[j].MenuName
  118. mi.Title = list[j].Title
  119. mi.Icon = list[j].Icon
  120. mi.Path = list[j].Path
  121. mi.MenuType = list[j].MenuType
  122. mi.Action = list[j].Action
  123. mi.Permission = list[j].Permission
  124. mi.ParentId = list[j].ParentId
  125. mi.NoCache = list[j].NoCache
  126. mi.Breadcrumb = list[j].Breadcrumb
  127. mi.Component = list[j].Component
  128. mi.Sort = list[j].Sort
  129. mi.Visible = list[j].Visible
  130. mi.CreatedAt = list[j].CreatedAt
  131. mi.Children = []Menu{}
  132. if mi.MenuType != "F" {
  133. ms := DiguiMenu(menulist, mi)
  134. min = append(min, ms)
  135. } else {
  136. min = append(min, mi)
  137. }
  138. }
  139. menu.Children = min
  140. return menu
  141. }
  142. func (e *Menu) SetMenuLable() (m []MenuLable, err error) {
  143. menulist, err := e.Get()
  144. m = make([]MenuLable, 0)
  145. for i := 0; i < len(menulist); i++ {
  146. if menulist[i].ParentId != 0 {
  147. continue
  148. }
  149. e := MenuLable{}
  150. e.Id = menulist[i].MenuId
  151. e.Label = menulist[i].Title
  152. menusInfo := DiguiMenuLable(&menulist, e)
  153. m = append(m, menusInfo)
  154. }
  155. return
  156. }
  157. func DiguiMenuLable(menulist *[]Menu, menu MenuLable) MenuLable {
  158. list := *menulist
  159. min := make([]MenuLable, 0)
  160. for j := 0; j < len(list); j++ {
  161. if menu.Id != list[j].ParentId {
  162. continue
  163. }
  164. mi := MenuLable{}
  165. mi.Id = list[j].MenuId
  166. mi.Label = list[j].Title
  167. mi.Children = []MenuLable{}
  168. if list[j].MenuType != "F" {
  169. ms := DiguiMenuLable(menulist, mi)
  170. min = append(min, ms)
  171. } else {
  172. min = append(min, mi)
  173. }
  174. }
  175. menu.Children = min
  176. return menu
  177. }
  178. func (e *Menu) SetMenuRole(rolename string) (m []Menu, err error) {
  179. menulist, err := e.GetByRoleName(rolename)
  180. fmt.Println(menulist)
  181. m = make([]Menu, 0)
  182. for i := 0; i < len(menulist); i++ {
  183. if menulist[i].ParentId != 0 {
  184. continue
  185. }
  186. //use menu_id, parent_id 递归找到所有子 menu, 组合成新的menu
  187. menusInfo := DiguiMenu(&menulist, menulist[i])
  188. m = append(m, menusInfo)
  189. }
  190. return
  191. }
  192. func (e *MenuRole) Get() (Menus []MenuRole, err error) {
  193. table := orm.Eloquent.Table(e.TableName())
  194. if e.MenuName != "" {
  195. table = table.Where("menu_name = ?", e.MenuName)
  196. }
  197. if err = table.Order("sort").Find(&Menus).Error; err != nil {
  198. return
  199. }
  200. return
  201. }
  202. func (e *Menu) GetByRoleName(rolename string) (Menus []Menu, err error) {
  203. table := orm.Eloquent.Table(e.TableName()).Select("sys_menu.*").Joins("left join sys_role_menu on sys_role_menu.menu_id=sys_menu.menu_id")
  204. table = table.Where("sys_role_menu.role_name=? and menu_type in ('M','C')", rolename)
  205. if err = table.Order("sort").Find(&Menus).Error; err != nil {
  206. return
  207. }
  208. return
  209. }
  210. func (e *Menu) Get() (Menus []Menu, err error) {
  211. table := orm.Eloquent.Table(e.TableName())
  212. if e.MenuName != "" {
  213. table = table.Where("menu_name = ?", e.MenuName)
  214. }
  215. if e.Path != "" {
  216. table = table.Where("path = ?", e.Path)
  217. }
  218. if e.Action != "" {
  219. table = table.Where("action = ?", e.Action)
  220. }
  221. if e.MenuType != "" {
  222. table = table.Where("menu_type = ?", e.MenuType)
  223. }
  224. if err = table.Order("sort").Find(&Menus).Error; err != nil {
  225. return
  226. }
  227. return
  228. }
  229. func (e *Menu) GetPage() (Menus []Menu, err error) {
  230. table := orm.Eloquent.Table(e.TableName())
  231. if e.MenuName != "" {
  232. table = table.Where("menu_name = ?", e.MenuName)
  233. }
  234. if e.Title != "" {
  235. table = table.Where("title = ?", e.Title)
  236. }
  237. if e.Visible != "" {
  238. table = table.Where("visible = ?", e.Visible)
  239. }
  240. if e.MenuType != "" {
  241. table = table.Where("menu_type = ?", e.MenuType)
  242. }
  243. // 数据权限控制
  244. dataPermission := new(DataPermission)
  245. dataPermission.UserId, _ = tools.StringToInt(e.DataScope)
  246. table, err = dataPermission.GetDataScope("sys_menu", table)
  247. if err != nil {
  248. return nil, err
  249. }
  250. if err = table.Order("sort").Find(&Menus).Error; err != nil {
  251. return
  252. }
  253. return
  254. }
  255. func (e *Menu) Create() (id int, err error) {
  256. result := orm.Eloquent.Table(e.TableName()).Create(&e)
  257. if result.Error != nil {
  258. err = result.Error
  259. return
  260. }
  261. err = InitPaths(e)
  262. if err != nil {
  263. return
  264. }
  265. id = e.MenuId
  266. return
  267. }
  268. func InitPaths(menu *Menu) (err error) {
  269. parentMenu := new(Menu)
  270. if int(menu.ParentId) != 0 {
  271. orm.Eloquent.Table("sys_menu").Where("menu_id = ?", menu.ParentId).First(parentMenu)
  272. if parentMenu.Paths == "" {
  273. err = errors.New("父级paths异常,请尝试对当前节点父级菜单进行更新操作!")
  274. return
  275. }
  276. menu.Paths = parentMenu.Paths + "/" + tools.IntToString(menu.MenuId)
  277. } else {
  278. menu.Paths = "/0/" + tools.IntToString(menu.MenuId)
  279. }
  280. orm.Eloquent.Table("sys_menu").Where("menu_id = ?", menu.MenuId).Update("paths", menu.Paths)
  281. return
  282. }
  283. func (e *Menu) Update(id int) (update Menu, err error) {
  284. if err = orm.Eloquent.Table(e.TableName()).First(&update, id).Error; err != nil {
  285. return
  286. }
  287. //参数1:是要修改的数据
  288. //参数2:是修改的数据
  289. if err = orm.Eloquent.Table(e.TableName()).Model(&update).Updates(&e).Error; err != nil {
  290. return
  291. }
  292. err = InitPaths(e)
  293. if err != nil {
  294. return
  295. }
  296. return
  297. }
  298. func (e *Menu) Delete(id int) (success bool, err error) {
  299. if err = orm.Eloquent.Table(e.TableName()).Where("menu_id = ?", id).Delete(&Menu{}).Error; err != nil {
  300. success = false
  301. return
  302. }
  303. success = true
  304. return
  305. }