sys_menu.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  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. // 增量检查: AI监控分析是否存在,如果不存在则添加
  33. addAIMenu(db)
  34. return
  35. }
  36. fmt.Println("Initializing Menu Data...")
  37. menus := []struct {
  38. Name string
  39. Path string
  40. Component string
  41. Icon string
  42. Type string
  43. OrderNum int
  44. Perms string
  45. Children []struct {
  46. Name string
  47. Path string
  48. Component string
  49. Perms string
  50. Type string
  51. OrderNum int
  52. Children []struct {
  53. Name string
  54. Perms string
  55. Type string
  56. OrderNum int
  57. }
  58. }
  59. }{
  60. {
  61. Name: "资源与物联中心",
  62. Path: "/resource",
  63. Component: "Layout",
  64. Type: "M",
  65. Icon: "Connection",
  66. OrderNum: 1,
  67. Children: []struct {
  68. Name string
  69. Path string
  70. Component string
  71. Perms string
  72. Type string
  73. OrderNum int
  74. Children []struct {
  75. Name string
  76. Perms string
  77. Type string
  78. OrderNum int
  79. }
  80. }{
  81. {Name: "数据源配置", Path: "datasource", Component: "resource/DataSource", Perms: "resource:datasource:list", Type: "C", OrderNum: 1, Children: []struct {
  82. Name string
  83. Perms string
  84. Type string
  85. OrderNum int
  86. }{
  87. {Name: "新增", Perms: "resource:datasource:add", Type: "F", OrderNum: 1},
  88. {Name: "修改", Perms: "resource:datasource:edit", Type: "F", OrderNum: 2},
  89. {Name: "删除", Perms: "resource:datasource:remove", Type: "F", OrderNum: 3},
  90. }},
  91. {Name: "设备管理", Path: "import", Component: "DeviceList", Perms: "resource:import:list", Type: "C", OrderNum: 2},
  92. {Name: "清洗公式模板", Path: "cleaning-template", Component: "resource/CleaningTemplate", Perms: "resource:cleaning-template:list", Type: "C", OrderNum: 3},
  93. {Name: "空间拓扑管理", Path: "topology", Component: "resource/Topology", Perms: "resource:topology:list", Type: "C", OrderNum: 4},
  94. },
  95. },
  96. {
  97. Name: "监控与控制中心",
  98. Path: "/monitor",
  99. Component: "Layout",
  100. Type: "M",
  101. Icon: "Monitor",
  102. OrderNum: 2,
  103. Children: []struct {
  104. Name string
  105. Path string
  106. Component string
  107. Perms string
  108. Type string
  109. OrderNum int
  110. Children []struct {
  111. Name string
  112. Perms string
  113. Type string
  114. OrderNum int
  115. }
  116. }{
  117. {Name: "综合态势大屏", Path: "dashboard", Component: "monitor/Dashboard", Perms: "monitor:dashboard:list", Type: "C", OrderNum: 1},
  118. {Name: "告警规则配置", Path: "alarm-config", Component: "monitor/AlarmConfig", Perms: "monitor:alarm-config:list", Type: "C", OrderNum: 2},
  119. {Name: "实时告警台", Path: "alarms", Component: "monitor/AlarmConsole", Perms: "monitor:alarms:list", Type: "C", OrderNum: 3},
  120. {Name: "AI监控分析", Path: "ai-analysis", Component: "monitor/AIAnalysis", Perms: "monitor:ai-analysis:list", Type: "C", OrderNum: 4},
  121. },
  122. },
  123. {
  124. Name: "能耗分析引擎",
  125. Path: "/analysis",
  126. Component: "Layout",
  127. Type: "M",
  128. Icon: "TrendCharts",
  129. OrderNum: 3,
  130. Children: []struct {
  131. Name string
  132. Path string
  133. Component string
  134. Perms string
  135. Type string
  136. OrderNum int
  137. Children []struct {
  138. Name string
  139. Perms string
  140. Type string
  141. OrderNum int
  142. }
  143. }{
  144. {Name: "统计报表", Path: "report", Component: "analysis/Report", Perms: "analysis:report:list", Type: "C", OrderNum: 1},
  145. {Name: "损耗与能效分析", Path: "loss", Component: "analysis/LossAnalysis", Perms: "analysis:loss:list", Type: "C", OrderNum: 2},
  146. },
  147. },
  148. {
  149. Name: "运维管理",
  150. Path: "/ops",
  151. Component: "Layout",
  152. Type: "M",
  153. Icon: "Notebook",
  154. OrderNum: 4,
  155. Children: []struct {
  156. Name string
  157. Path string
  158. Component string
  159. Perms string
  160. Type string
  161. OrderNum int
  162. Children []struct {
  163. Name string
  164. Perms string
  165. Type string
  166. OrderNum int
  167. }
  168. }{
  169. {Name: "巡检台账", Path: "inspection", Component: "ops/Inspection", Perms: "ops:inspection:list", Type: "C", OrderNum: 1},
  170. {Name: "操作审计日志", Path: "audit", Component: "ops/AuditLog", Perms: "ops:audit:list", Type: "C", OrderNum: 2},
  171. {Name: "数据备份", Path: "backup", Component: "ops/DataBackup", Perms: "ops:backup:list", Type: "C", OrderNum: 3},
  172. {Name: "系统日志", Path: "logs", Component: "ops/LogViewer", Perms: "ops:logs:list", Type: "C", OrderNum: 4},
  173. },
  174. },
  175. {
  176. Name: "系统设置",
  177. Path: "/system",
  178. Component: "Layout",
  179. Type: "M",
  180. Icon: "Setting",
  181. OrderNum: 5,
  182. Children: []struct {
  183. Name string
  184. Path string
  185. Component string
  186. Perms string
  187. Type string
  188. OrderNum int
  189. Children []struct {
  190. Name string
  191. Perms string
  192. Type string
  193. OrderNum int
  194. }
  195. }{
  196. {Name: "用户管理", Path: "user", Component: "system/UserList", Perms: "system:user:list", Type: "C", OrderNum: 1, Children: []struct {
  197. Name string
  198. Perms string
  199. Type string
  200. OrderNum int
  201. }{
  202. {Name: "用户新增", Perms: "system:user:add", Type: "F", OrderNum: 1},
  203. {Name: "用户修改", Perms: "system:user:edit", Type: "F", OrderNum: 2},
  204. {Name: "用户删除", Perms: "system:user:remove", Type: "F", OrderNum: 3},
  205. }},
  206. {Name: "角色管理", Path: "role", Component: "system/RoleList", Perms: "system:role:list", Type: "C", OrderNum: 2, Children: []struct {
  207. Name string
  208. Perms string
  209. Type string
  210. OrderNum int
  211. }{
  212. {Name: "角色新增", Perms: "system:role:add", Type: "F", OrderNum: 1},
  213. {Name: "角色修改", Perms: "system:role:edit", Type: "F", OrderNum: 2},
  214. {Name: "角色删除", Perms: "system:role:remove", Type: "F", OrderNum: 3},
  215. }},
  216. {Name: "字典与参数", Path: "settings", Component: "system/Settings", Perms: "system:settings:list", Type: "C", OrderNum: 3},
  217. },
  218. },
  219. }
  220. tx := db.Begin()
  221. // Find admin role to assign perms
  222. var adminRole SysRole
  223. if err := tx.Where("role_key = ?", "admin").First(&adminRole).Error; err != nil {
  224. tx.Rollback()
  225. log.Printf("Admin role not found when initializing menus: %v", err)
  226. return
  227. }
  228. for _, m := range menus {
  229. menu := SysMenu{
  230. Name: m.Name,
  231. Path: m.Path,
  232. Component: m.Component,
  233. Icon: m.Icon,
  234. Type: m.Type,
  235. OrderNum: m.OrderNum,
  236. Visible: "0",
  237. Status: "0",
  238. }
  239. if err := tx.Create(&menu).Error; err != nil {
  240. tx.Rollback()
  241. log.Printf("Error creating menu %s: %v", m.Name, err)
  242. return
  243. }
  244. // Link to admin
  245. tx.Create(&SysRoleMenu{RoleID: adminRole.ID, MenuID: menu.ID})
  246. for _, c := range m.Children {
  247. child := SysMenu{
  248. ParentID: &menu.ID,
  249. Name: c.Name,
  250. Path: c.Path,
  251. Component: c.Component,
  252. Perms: c.Perms,
  253. Type: c.Type,
  254. OrderNum: c.OrderNum,
  255. Visible: "0",
  256. Status: "0",
  257. }
  258. if err := tx.Create(&child).Error; err != nil {
  259. tx.Rollback()
  260. log.Printf("Error creating menu %s: %v", c.Name, err)
  261. return
  262. }
  263. // Link to admin
  264. tx.Create(&SysRoleMenu{RoleID: adminRole.ID, MenuID: child.ID})
  265. for _, btn := range c.Children {
  266. btnMenu := SysMenu{
  267. ParentID: &child.ID,
  268. Name: btn.Name,
  269. Perms: btn.Perms,
  270. Type: btn.Type,
  271. OrderNum: btn.OrderNum,
  272. Visible: "0",
  273. Status: "0",
  274. }
  275. if err := tx.Create(&btnMenu).Error; err != nil {
  276. tx.Rollback()
  277. log.Printf("Error creating button %s: %v", btn.Name, err)
  278. return
  279. }
  280. // Link to admin
  281. tx.Create(&SysRoleMenu{RoleID: adminRole.ID, MenuID: btnMenu.ID})
  282. }
  283. }
  284. }
  285. tx.Commit()
  286. fmt.Println("Menu Data Initialized")
  287. }
  288. func addAIMenu(db *gorm.DB) {
  289. // 1. Check if menu exists
  290. var count int64
  291. db.Model(&SysMenu{}).Where("path = ?", "ai-analysis").Count(&count)
  292. if count > 0 {
  293. return
  294. }
  295. fmt.Println("Adding missing AI Analysis menu...")
  296. // 2. Find Parent "监控与控制中心" (path='/monitor')
  297. var parent SysMenu
  298. if err := db.Where("path = ?", "/monitor").First(&parent).Error; err != nil {
  299. fmt.Printf("Parent menu not found: %v\n", err)
  300. return
  301. }
  302. // 3. Create Menu
  303. menu := SysMenu{
  304. ParentID: &parent.ID,
  305. Name: "AI监控分析",
  306. Path: "ai-analysis",
  307. Component: "monitor/AIAnalysis",
  308. Perms: "monitor:ai-analysis:list",
  309. Type: "C",
  310. OrderNum: 4,
  311. Visible: "0",
  312. Status: "0",
  313. }
  314. if err := db.Create(&menu).Error; err != nil {
  315. fmt.Printf("Failed to create AI menu: %v\n", err)
  316. return
  317. }
  318. // 4. Assign to Admin
  319. var adminRole SysRole
  320. if err := db.Where("role_key = ?", "admin").First(&adminRole).Error; err == nil {
  321. db.Create(&SysRoleMenu{RoleID: adminRole.ID, MenuID: menu.ID})
  322. fmt.Println("AI Analysis menu added and assigned to admin.")
  323. }
  324. }