sys_menu.go 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. package models
  2. import (
  3. "fmt"
  4. "log"
  5. "github.com/google/uuid"
  6. "gorm.io/gorm"
  7. )
  8. // SysMenu 菜单权限表
  9. type SysMenu struct {
  10. ID uuid.UUID `gorm:"type:uuid;primary_key;default:gen_random_uuid()" json:"id"`
  11. ParentID *uuid.UUID `gorm:"type:uuid" json:"parentId"`
  12. Name string `gorm:"type:varchar(50)" json:"name"`
  13. Path string `gorm:"type:varchar(200)" json:"path"`
  14. Component string `gorm:"type:varchar(255)" json:"component"`
  15. Perms string `gorm:"type:varchar(100)" json:"perms"` // 权限标识: system:user:list
  16. Icon string `gorm:"type:varchar(100)" json:"icon"`
  17. Type string `gorm:"type:varchar(1)" json:"type"` // M:目录 C:菜单 F:按钮
  18. OrderNum int `gorm:"type:int" json:"orderNum"`
  19. Visible string `gorm:"type:varchar(1);default:'0'" json:"visible"` // 0:显示 1:隐藏
  20. Status string `gorm:"type:varchar(1);default:'0'" json:"status"` // 0:正常 1:停用
  21. Children []*SysMenu `gorm:"-" json:"children"` // 子菜单
  22. }
  23. // SysRoleMenu 角色和菜单关联表
  24. type SysRoleMenu struct {
  25. RoleID uuid.UUID `gorm:"type:uuid;primary_key" json:"roleId"`
  26. MenuID uuid.UUID `gorm:"type:uuid;primary_key" json:"menuId"`
  27. }
  28. func InitSysMenuData(db *gorm.DB) {
  29. var count int64
  30. db.Model(&SysMenu{}).Count(&count)
  31. if count > 0 {
  32. return
  33. }
  34. fmt.Println("Initializing Menu Data...")
  35. menus := []struct {
  36. Name string
  37. Path string
  38. Component string
  39. Icon string
  40. Type string
  41. OrderNum int
  42. Perms string
  43. Children []struct {
  44. Name string
  45. Path string
  46. Component string
  47. Perms string
  48. Type string
  49. OrderNum int
  50. Children []struct {
  51. Name string
  52. Perms string
  53. Type string
  54. OrderNum int
  55. }
  56. }
  57. }{
  58. {
  59. Name: "资源与物联中心",
  60. Path: "/resource",
  61. Component: "Layout",
  62. Type: "M",
  63. Icon: "Connection",
  64. OrderNum: 1,
  65. Children: []struct {
  66. Name string
  67. Path string
  68. Component string
  69. Perms string
  70. Type string
  71. OrderNum int
  72. Children []struct {
  73. Name string
  74. Perms string
  75. Type string
  76. OrderNum int
  77. }
  78. }{
  79. {Name: "数据源配置", Path: "datasource", Component: "resource/DataSource", Perms: "resource:datasource:list", Type: "C", OrderNum: 1, Children: []struct {
  80. Name string
  81. Perms string
  82. Type string
  83. OrderNum int
  84. }{
  85. {Name: "新增", Perms: "resource:datasource:add", Type: "F", OrderNum: 1},
  86. {Name: "修改", Perms: "resource:datasource:edit", Type: "F", OrderNum: 2},
  87. {Name: "删除", Perms: "resource:datasource:remove", Type: "F", OrderNum: 3},
  88. }},
  89. {Name: "设备管理", Path: "import", Component: "resource/ImportClean", Perms: "resource:import:list", Type: "C", OrderNum: 2},
  90. {Name: "空间拓扑管理", Path: "topology", Component: "resource/Topology", Perms: "resource:topology:list", Type: "C", OrderNum: 3},
  91. },
  92. },
  93. {
  94. Name: "监控与控制中心",
  95. Path: "/monitor",
  96. Component: "Layout",
  97. Type: "M",
  98. Icon: "Monitor",
  99. OrderNum: 2,
  100. Children: []struct {
  101. Name string
  102. Path string
  103. Component string
  104. Perms string
  105. Type string
  106. OrderNum int
  107. Children []struct {
  108. Name string
  109. Perms string
  110. Type string
  111. OrderNum int
  112. }
  113. }{
  114. {Name: "综合态势大屏", Path: "dashboard", Component: "monitor/Dashboard", Perms: "monitor:dashboard:list", Type: "C", OrderNum: 1},
  115. {Name: "设备集控视图", Path: "control", Component: "monitor/DeviceControl", Perms: "monitor:control:list", Type: "C", OrderNum: 2},
  116. {Name: "实时告警台", Path: "alarms", Component: "monitor/AlarmConsole", Perms: "monitor:alarms:list", Type: "C", OrderNum: 3},
  117. },
  118. },
  119. {
  120. Name: "能耗分析引擎",
  121. Path: "/analysis",
  122. Component: "Layout",
  123. Type: "M",
  124. Icon: "TrendCharts",
  125. OrderNum: 3,
  126. Children: []struct {
  127. Name string
  128. Path string
  129. Component string
  130. Perms string
  131. Type string
  132. OrderNum int
  133. Children []struct {
  134. Name string
  135. Perms string
  136. Type string
  137. OrderNum int
  138. }
  139. }{
  140. {Name: "统计报表", Path: "report", Component: "analysis/Report", Perms: "analysis:report:list", Type: "C", OrderNum: 1},
  141. {Name: "损耗与能效分析", Path: "loss", Component: "analysis/LossAnalysis", Perms: "analysis:loss:list", Type: "C", OrderNum: 2},
  142. },
  143. },
  144. {
  145. Name: "运维台账与审计",
  146. Path: "/ops",
  147. Component: "Layout",
  148. Type: "M",
  149. Icon: "Notebook",
  150. OrderNum: 4,
  151. Children: []struct {
  152. Name string
  153. Path string
  154. Component string
  155. Perms string
  156. Type string
  157. OrderNum int
  158. Children []struct {
  159. Name string
  160. Perms string
  161. Type string
  162. OrderNum int
  163. }
  164. }{
  165. {Name: "巡检台账", Path: "inspection", Component: "ops/Inspection", Perms: "ops:inspection:list", Type: "C", OrderNum: 1},
  166. {Name: "操作审计日志", Path: "audit", Component: "ops/AuditLog", Perms: "ops:audit:list", Type: "C", OrderNum: 2},
  167. {Name: "同比差异报告", Path: "diff", Component: "ops/DiffReport", Perms: "ops:diff:list", Type: "C", OrderNum: 3},
  168. },
  169. },
  170. {
  171. Name: "系统设置",
  172. Path: "/system",
  173. Component: "Layout",
  174. Type: "M",
  175. Icon: "Setting",
  176. OrderNum: 5,
  177. Children: []struct {
  178. Name string
  179. Path string
  180. Component string
  181. Perms string
  182. Type string
  183. OrderNum int
  184. Children []struct {
  185. Name string
  186. Perms string
  187. Type string
  188. OrderNum int
  189. }
  190. }{
  191. {Name: "用户与角色", Path: "user", Component: "system/UserRole", Perms: "system:user:list", Type: "C", OrderNum: 1, Children: []struct {
  192. Name string
  193. Perms string
  194. Type string
  195. OrderNum int
  196. }{
  197. {Name: "用户新增", Perms: "system:user:add", Type: "F", OrderNum: 1},
  198. {Name: "用户修改", Perms: "system:user:edit", Type: "F", OrderNum: 2},
  199. {Name: "用户删除", Perms: "system:user:remove", Type: "F", OrderNum: 3},
  200. {Name: "角色新增", Perms: "system:role:add", Type: "F", OrderNum: 4},
  201. {Name: "角色修改", Perms: "system:role:edit", Type: "F", OrderNum: 5},
  202. }},
  203. {Name: "字典与参数", Path: "settings", Component: "system/Settings", Perms: "system:settings:list", Type: "C", OrderNum: 2},
  204. },
  205. },
  206. }
  207. tx := db.Begin()
  208. // Find admin role to assign perms
  209. var adminRole SysRole
  210. if err := tx.Where("role_key = ?", "admin").First(&adminRole).Error; err != nil {
  211. tx.Rollback()
  212. log.Printf("Admin role not found when initializing menus: %v", err)
  213. return
  214. }
  215. for _, m := range menus {
  216. menu := SysMenu{
  217. Name: m.Name,
  218. Path: m.Path,
  219. Component: m.Component,
  220. Icon: m.Icon,
  221. Type: m.Type,
  222. OrderNum: m.OrderNum,
  223. Visible: "0",
  224. Status: "0",
  225. }
  226. if err := tx.Create(&menu).Error; err != nil {
  227. tx.Rollback()
  228. log.Printf("Error creating menu %s: %v", m.Name, err)
  229. return
  230. }
  231. // Link to admin
  232. tx.Create(&SysRoleMenu{RoleID: adminRole.ID, MenuID: menu.ID})
  233. for _, c := range m.Children {
  234. child := SysMenu{
  235. ParentID: &menu.ID,
  236. Name: c.Name,
  237. Path: c.Path,
  238. Component: c.Component,
  239. Perms: c.Perms,
  240. Type: c.Type,
  241. OrderNum: c.OrderNum,
  242. Visible: "0",
  243. Status: "0",
  244. }
  245. if err := tx.Create(&child).Error; err != nil {
  246. tx.Rollback()
  247. log.Printf("Error creating menu %s: %v", c.Name, err)
  248. return
  249. }
  250. // Link to admin
  251. tx.Create(&SysRoleMenu{RoleID: adminRole.ID, MenuID: child.ID})
  252. for _, btn := range c.Children {
  253. btnMenu := SysMenu{
  254. ParentID: &child.ID,
  255. Name: btn.Name,
  256. Perms: btn.Perms,
  257. Type: btn.Type,
  258. OrderNum: btn.OrderNum,
  259. Visible: "0",
  260. Status: "0",
  261. }
  262. if err := tx.Create(&btnMenu).Error; err != nil {
  263. tx.Rollback()
  264. log.Printf("Error creating button %s: %v", btn.Name, err)
  265. return
  266. }
  267. // Link to admin
  268. tx.Create(&SysRoleMenu{RoleID: adminRole.ID, MenuID: btnMenu.ID})
  269. }
  270. }
  271. }
  272. tx.Commit()
  273. fmt.Println("Menu Data Initialized")
  274. }