reinit_menus_by_requirements.py 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183
  1. #!/usr/bin/env python3
  2. """
  3. 根据需求/菜单.md重新初始化菜单数据
  4. 严格按照需求文档的菜单结构设计
  5. """
  6. import pymysql
  7. from dotenv import load_dotenv
  8. import os
  9. import uuid
  10. from datetime import datetime
  11. load_dotenv()
  12. def get_db_connection():
  13. """获取数据库连接"""
  14. try:
  15. config = {
  16. 'host': os.getenv('DB_HOST', 'localhost'),
  17. 'port': int(os.getenv('DB_PORT', 3306)),
  18. 'user': os.getenv('DB_USER', 'root'),
  19. 'password': os.getenv('DB_PASSWORD', 'admin'),
  20. 'database': os.getenv('DB_NAME', 'lq_db'),
  21. 'charset': 'utf8mb4',
  22. 'autocommit': True
  23. }
  24. return pymysql.connect(**config)
  25. except Exception as e:
  26. print(f"数据库连接失败: {e}")
  27. return None
  28. def clear_rbac_data(cursor):
  29. """清理现有RBAC数据"""
  30. print("🧹 清理现有RBAC数据...")
  31. # 清理关联表
  32. cursor.execute("DELETE FROM role_permissions")
  33. cursor.execute("DELETE FROM role_menus")
  34. cursor.execute("DELETE FROM user_roles")
  35. # 清理主表
  36. cursor.execute("DELETE FROM permissions")
  37. cursor.execute("DELETE FROM menus")
  38. cursor.execute("DELETE FROM roles")
  39. print(" ✅ 清理完成")
  40. def insert_menus(cursor):
  41. """根据需求文档插入菜单数据"""
  42. print("📋 根据需求文档插入菜单数据...")
  43. menus_data = [
  44. # ==================== 第一级:主菜单 ====================
  45. {
  46. 'id': 'dashboard-main',
  47. 'parent_id': None,
  48. 'name': 'dashboard',
  49. 'title': '仪表盘',
  50. 'path': '/dashboard',
  51. 'component': 'dashboard/Index',
  52. 'icon': 'House',
  53. 'sort_order': 1,
  54. 'menu_type': 'menu',
  55. 'is_hidden': False,
  56. 'description': '系统概览和统计信息'
  57. },
  58. {
  59. 'id': 'profile-main',
  60. 'parent_id': None,
  61. 'name': 'profile',
  62. 'title': '个人资料',
  63. 'path': '/profile',
  64. 'component': 'user/Profile',
  65. 'icon': 'User',
  66. 'sort_order': 2,
  67. 'menu_type': 'menu',
  68. 'is_hidden': False,
  69. 'description': '个人信息管理'
  70. },
  71. {
  72. 'id': 'admin-main',
  73. 'parent_id': None,
  74. 'name': 'admin',
  75. 'title': '系统管理',
  76. 'path': '/admin',
  77. 'component': None,
  78. 'icon': 'Setting',
  79. 'sort_order': 3,
  80. 'menu_type': 'menu',
  81. 'is_hidden': False,
  82. 'description': '系统管理功能'
  83. },
  84. # ==================== 个人资料的按钮权限 ====================
  85. {
  86. 'id': 'profile-save-btn',
  87. 'parent_id': 'profile-main',
  88. 'name': 'profile-save',
  89. 'title': '保存修改',
  90. 'path': None,
  91. 'component': None,
  92. 'icon': 'Check',
  93. 'sort_order': 1,
  94. 'menu_type': 'button',
  95. 'is_hidden': False,
  96. 'description': '保存个人资料修改'
  97. },
  98. {
  99. 'id': 'profile-reset-btn',
  100. 'parent_id': 'profile-main',
  101. 'name': 'profile-reset',
  102. 'title': '重置',
  103. 'path': None,
  104. 'component': None,
  105. 'icon': 'RefreshLeft',
  106. 'sort_order': 2,
  107. 'menu_type': 'button',
  108. 'is_hidden': False,
  109. 'description': '重置个人资料表单'
  110. },
  111. {
  112. 'id': 'profile-change-password-btn',
  113. 'parent_id': 'profile-main',
  114. 'name': 'profile-change-password',
  115. 'title': '修改密码',
  116. 'path': None,
  117. 'component': None,
  118. 'icon': 'Key',
  119. 'sort_order': 3,
  120. 'menu_type': 'button',
  121. 'is_hidden': False,
  122. 'description': '修改登录密码'
  123. },
  124. # ==================== 第二级:系统管理下的功能菜单 ====================
  125. {
  126. 'id': 'admin-dashboard',
  127. 'parent_id': 'admin-main',
  128. 'name': 'admin-dashboard',
  129. 'title': '管理概览',
  130. 'path': '/admin/dashboard',
  131. 'component': 'admin/Dashboard',
  132. 'icon': 'Monitor',
  133. 'sort_order': 1,
  134. 'menu_type': 'menu',
  135. 'is_hidden': False,
  136. 'description': '管理员仪表盘'
  137. },
  138. {
  139. 'id': 'user-management',
  140. 'parent_id': 'admin-main',
  141. 'name': 'user-management',
  142. 'title': '用户管理',
  143. 'path': '/admin/users',
  144. 'component': 'admin/Users',
  145. 'icon': 'UserFilled',
  146. 'sort_order': 2,
  147. 'menu_type': 'menu',
  148. 'is_hidden': False,
  149. 'description': '用户信息管理'
  150. },
  151. {
  152. 'id': 'role-management',
  153. 'parent_id': 'admin-main',
  154. 'name': 'role-management',
  155. 'title': '角色管理',
  156. 'path': '/admin/roles',
  157. 'component': 'admin/Roles',
  158. 'icon': 'Avatar',
  159. 'sort_order': 3,
  160. 'menu_type': 'menu',
  161. 'is_hidden': False,
  162. 'description': '角色权限管理'
  163. },
  164. {
  165. 'id': 'menu-management',
  166. 'parent_id': 'admin-main',
  167. 'name': 'menu-management',
  168. 'title': '菜单管理',
  169. 'path': '/admin/menus',
  170. 'component': 'admin/Menus',
  171. 'icon': 'Menu',
  172. 'sort_order': 4,
  173. 'menu_type': 'menu',
  174. 'is_hidden': False,
  175. 'description': '菜单结构管理'
  176. },
  177. {
  178. 'id': 'permission-management',
  179. 'parent_id': 'admin-main',
  180. 'name': 'permission-management',
  181. 'title': '权限管理',
  182. 'path': '/admin/permissions',
  183. 'component': 'admin/Permissions',
  184. 'icon': 'Key',
  185. 'sort_order': 5,
  186. 'menu_type': 'menu',
  187. 'is_hidden': False,
  188. 'description': '权限配置管理'
  189. },
  190. {
  191. 'id': 'app-management',
  192. 'parent_id': 'admin-main',
  193. 'name': 'app-management',
  194. 'title': '应用管理',
  195. 'path': '/admin/apps',
  196. 'component': 'admin/Apps',
  197. 'icon': 'Grid',
  198. 'sort_order': 6,
  199. 'menu_type': 'menu',
  200. 'is_hidden': False,
  201. 'description': 'OAuth2应用管理'
  202. },
  203. {
  204. 'id': 'log-management',
  205. 'parent_id': 'admin-main',
  206. 'name': 'log-management',
  207. 'title': '系统日志',
  208. 'path': '/admin/logs',
  209. 'component': 'admin/Logs',
  210. 'icon': 'Document',
  211. 'sort_order': 7,
  212. 'menu_type': 'menu',
  213. 'is_hidden': False,
  214. 'description': '系统操作日志'
  215. },
  216. {
  217. 'id': 'system-settings',
  218. 'parent_id': 'admin-main',
  219. 'name': 'system-settings',
  220. 'title': '系统设置',
  221. 'path': '/admin/settings',
  222. 'component': 'admin/Settings',
  223. 'icon': 'Tools',
  224. 'sort_order': 8,
  225. 'menu_type': 'menu',
  226. 'is_hidden': False,
  227. 'description': '系统配置设置'
  228. },
  229. # ==================== 管理概览的按钮权限 ====================
  230. {
  231. 'id': 'admin-dashboard-user-mgmt-btn',
  232. 'parent_id': 'admin-dashboard',
  233. 'name': 'admin-dashboard-user-mgmt',
  234. 'title': '用户管理',
  235. 'path': None,
  236. 'component': None,
  237. 'icon': 'UserFilled',
  238. 'sort_order': 1,
  239. 'menu_type': 'button',
  240. 'is_hidden': False,
  241. 'description': '快速跳转到用户管理'
  242. },
  243. {
  244. 'id': 'admin-dashboard-create-user-btn',
  245. 'parent_id': 'admin-dashboard',
  246. 'name': 'admin-dashboard-create-user',
  247. 'title': '创建用户',
  248. 'path': None,
  249. 'component': None,
  250. 'icon': 'Plus',
  251. 'sort_order': 2,
  252. 'menu_type': 'button',
  253. 'is_hidden': False,
  254. 'description': '快速创建用户'
  255. },
  256. {
  257. 'id': 'admin-dashboard-app-mgmt-btn',
  258. 'parent_id': 'admin-dashboard',
  259. 'name': 'admin-dashboard-app-mgmt',
  260. 'title': '应用管理',
  261. 'path': None,
  262. 'component': None,
  263. 'icon': 'Grid',
  264. 'sort_order': 3,
  265. 'menu_type': 'button',
  266. 'is_hidden': False,
  267. 'description': '快速跳转到应用管理'
  268. },
  269. {
  270. 'id': 'admin-dashboard-create-app-btn',
  271. 'parent_id': 'admin-dashboard',
  272. 'name': 'admin-dashboard-create-app',
  273. 'title': '创建应用',
  274. 'path': None,
  275. 'component': None,
  276. 'icon': 'Plus',
  277. 'sort_order': 4,
  278. 'menu_type': 'button',
  279. 'is_hidden': False,
  280. 'description': '快速创建应用'
  281. },
  282. {
  283. 'id': 'admin-dashboard-view-logs-btn',
  284. 'parent_id': 'admin-dashboard',
  285. 'name': 'admin-dashboard-view-logs',
  286. 'title': '查看日志',
  287. 'path': None,
  288. 'component': None,
  289. 'icon': 'View',
  290. 'sort_order': 5,
  291. 'menu_type': 'button',
  292. 'is_hidden': False,
  293. 'description': '快速查看系统日志'
  294. },
  295. {
  296. 'id': 'admin-dashboard-export-logs-btn',
  297. 'parent_id': 'admin-dashboard',
  298. 'name': 'admin-dashboard-export-logs',
  299. 'title': '导出日志',
  300. 'path': None,
  301. 'component': None,
  302. 'icon': 'Download',
  303. 'sort_order': 6,
  304. 'menu_type': 'button',
  305. 'is_hidden': False,
  306. 'description': '快速导出日志'
  307. },
  308. {
  309. 'id': 'admin-dashboard-settings-btn',
  310. 'parent_id': 'admin-dashboard',
  311. 'name': 'admin-dashboard-settings',
  312. 'title': '系统设置',
  313. 'path': None,
  314. 'component': None,
  315. 'icon': 'Tools',
  316. 'sort_order': 7,
  317. 'menu_type': 'button',
  318. 'is_hidden': False,
  319. 'description': '快速跳转到系统设置'
  320. },
  321. # ==================== 用户管理的按钮权限 ====================
  322. {
  323. 'id': 'user-create-btn',
  324. 'parent_id': 'user-management',
  325. 'name': 'user-create',
  326. 'title': '创建用户',
  327. 'path': None,
  328. 'component': None,
  329. 'icon': 'Plus',
  330. 'sort_order': 1,
  331. 'menu_type': 'button',
  332. 'is_hidden': False,
  333. 'description': '创建新用户'
  334. },
  335. {
  336. 'id': 'user-edit-btn',
  337. 'parent_id': 'user-management',
  338. 'name': 'user-edit',
  339. 'title': '编辑用户',
  340. 'path': None,
  341. 'component': None,
  342. 'icon': 'Edit',
  343. 'sort_order': 2,
  344. 'menu_type': 'button',
  345. 'is_hidden': False,
  346. 'description': '编辑用户信息'
  347. },
  348. {
  349. 'id': 'user-delete-btn',
  350. 'parent_id': 'user-management',
  351. 'name': 'user-delete',
  352. 'title': '删除用户',
  353. 'path': None,
  354. 'component': None,
  355. 'icon': 'Delete',
  356. 'sort_order': 3,
  357. 'menu_type': 'button',
  358. 'is_hidden': False,
  359. 'description': '删除用户'
  360. },
  361. {
  362. 'id': 'user-batch-delete-btn',
  363. 'parent_id': 'user-management',
  364. 'name': 'user-batch-delete',
  365. 'title': '批量删除用户',
  366. 'path': None,
  367. 'component': None,
  368. 'icon': 'DeleteFilled',
  369. 'sort_order': 4,
  370. 'menu_type': 'button',
  371. 'is_hidden': False,
  372. 'description': '批量删除用户'
  373. },
  374. {
  375. 'id': 'user-assign-role-btn',
  376. 'parent_id': 'user-management',
  377. 'name': 'user-assign-role',
  378. 'title': '分配角色',
  379. 'path': None,
  380. 'component': None,
  381. 'icon': 'Avatar',
  382. 'sort_order': 5,
  383. 'menu_type': 'button',
  384. 'is_hidden': False,
  385. 'description': '为用户分配角色'
  386. },
  387. {
  388. 'id': 'user-reset-password-btn',
  389. 'parent_id': 'user-management',
  390. 'name': 'user-reset-password',
  391. 'title': '重置密码',
  392. 'path': None,
  393. 'component': None,
  394. 'icon': 'Key',
  395. 'sort_order': 6,
  396. 'menu_type': 'button',
  397. 'is_hidden': False,
  398. 'description': '重置用户密码'
  399. },
  400. # ==================== 角色管理的按钮权限 ====================
  401. {
  402. 'id': 'role-create-btn',
  403. 'parent_id': 'role-management',
  404. 'name': 'role-create',
  405. 'title': '创建角色',
  406. 'path': None,
  407. 'component': None,
  408. 'icon': 'Plus',
  409. 'sort_order': 1,
  410. 'menu_type': 'button',
  411. 'is_hidden': False,
  412. 'description': '创建新角色'
  413. },
  414. {
  415. 'id': 'role-edit-btn',
  416. 'parent_id': 'role-management',
  417. 'name': 'role-edit',
  418. 'title': '编辑角色',
  419. 'path': None,
  420. 'component': None,
  421. 'icon': 'Edit',
  422. 'sort_order': 2,
  423. 'menu_type': 'button',
  424. 'is_hidden': False,
  425. 'description': '编辑角色信息'
  426. },
  427. {
  428. 'id': 'role-delete-btn',
  429. 'parent_id': 'role-management',
  430. 'name': 'role-delete',
  431. 'title': '删除角色',
  432. 'path': None,
  433. 'component': None,
  434. 'icon': 'Delete',
  435. 'sort_order': 3,
  436. 'menu_type': 'button',
  437. 'is_hidden': False,
  438. 'description': '删除角色'
  439. },
  440. {
  441. 'id': 'role-permission-mgmt-btn',
  442. 'parent_id': 'role-management',
  443. 'name': 'role-permission-mgmt',
  444. 'title': '权限管理',
  445. 'path': None,
  446. 'component': None,
  447. 'icon': 'Key',
  448. 'sort_order': 4,
  449. 'menu_type': 'button',
  450. 'is_hidden': False,
  451. 'description': '管理角色权限'
  452. },
  453. # ==================== 菜单管理的按钮权限 ====================
  454. {
  455. 'id': 'menu-create-btn',
  456. 'parent_id': 'menu-management',
  457. 'name': 'menu-create',
  458. 'title': '创建菜单',
  459. 'path': None,
  460. 'component': None,
  461. 'icon': 'Plus',
  462. 'sort_order': 1,
  463. 'menu_type': 'button',
  464. 'is_hidden': False,
  465. 'description': '创建新菜单'
  466. },
  467. {
  468. 'id': 'menu-edit-btn',
  469. 'parent_id': 'menu-management',
  470. 'name': 'menu-edit',
  471. 'title': '编辑菜单',
  472. 'path': None,
  473. 'component': None,
  474. 'icon': 'Edit',
  475. 'sort_order': 2,
  476. 'menu_type': 'button',
  477. 'is_hidden': False,
  478. 'description': '编辑菜单信息'
  479. },
  480. {
  481. 'id': 'menu-delete-btn',
  482. 'parent_id': 'menu-management',
  483. 'name': 'menu-delete',
  484. 'title': '删除菜单',
  485. 'path': None,
  486. 'component': None,
  487. 'icon': 'Delete',
  488. 'sort_order': 3,
  489. 'menu_type': 'button',
  490. 'is_hidden': False,
  491. 'description': '删除菜单'
  492. },
  493. {
  494. 'id': 'menu-sort-btn',
  495. 'parent_id': 'menu-management',
  496. 'name': 'menu-sort',
  497. 'title': '排序菜单',
  498. 'path': None,
  499. 'component': None,
  500. 'icon': 'Sort',
  501. 'sort_order': 4,
  502. 'menu_type': 'button',
  503. 'is_hidden': False,
  504. 'description': '调整菜单排序'
  505. },
  506. # ==================== 权限管理的按钮权限 ====================
  507. {
  508. 'id': 'permission-create-btn',
  509. 'parent_id': 'permission-management',
  510. 'name': 'permission-create',
  511. 'title': '创建权限',
  512. 'path': None,
  513. 'component': None,
  514. 'icon': 'Plus',
  515. 'sort_order': 1,
  516. 'menu_type': 'button',
  517. 'is_hidden': False,
  518. 'description': '创建新权限'
  519. },
  520. {
  521. 'id': 'permission-edit-btn',
  522. 'parent_id': 'permission-management',
  523. 'name': 'permission-edit',
  524. 'title': '编辑权限',
  525. 'path': None,
  526. 'component': None,
  527. 'icon': 'Edit',
  528. 'sort_order': 2,
  529. 'menu_type': 'button',
  530. 'is_hidden': False,
  531. 'description': '编辑权限信息'
  532. },
  533. {
  534. 'id': 'permission-delete-btn',
  535. 'parent_id': 'permission-management',
  536. 'name': 'permission-delete',
  537. 'title': '删除权限',
  538. 'path': None,
  539. 'component': None,
  540. 'icon': 'Delete',
  541. 'sort_order': 3,
  542. 'menu_type': 'button',
  543. 'is_hidden': False,
  544. 'description': '删除权限'
  545. },
  546. {
  547. 'id': 'permission-view-roles-btn',
  548. 'parent_id': 'permission-management',
  549. 'name': 'permission-view-roles',
  550. 'title': '查看角色',
  551. 'path': None,
  552. 'component': None,
  553. 'icon': 'View',
  554. 'sort_order': 4,
  555. 'menu_type': 'button',
  556. 'is_hidden': False,
  557. 'description': '查看权限关联的角色'
  558. },
  559. # ==================== 应用管理的按钮权限 ====================
  560. {
  561. 'id': 'app-create-btn',
  562. 'parent_id': 'app-management',
  563. 'name': 'app-create',
  564. 'title': '创建应用',
  565. 'path': None,
  566. 'component': None,
  567. 'icon': 'Plus',
  568. 'sort_order': 1,
  569. 'menu_type': 'button',
  570. 'is_hidden': False,
  571. 'description': '创建OAuth2应用'
  572. },
  573. {
  574. 'id': 'app-edit-btn',
  575. 'parent_id': 'app-management',
  576. 'name': 'app-edit',
  577. 'title': '编辑应用',
  578. 'path': None,
  579. 'component': None,
  580. 'icon': 'Edit',
  581. 'sort_order': 2,
  582. 'menu_type': 'button',
  583. 'is_hidden': False,
  584. 'description': '编辑应用信息'
  585. },
  586. {
  587. 'id': 'app-delete-btn',
  588. 'parent_id': 'app-management',
  589. 'name': 'app-delete',
  590. 'title': '删除应用',
  591. 'path': None,
  592. 'component': None,
  593. 'icon': 'Delete',
  594. 'sort_order': 3,
  595. 'menu_type': 'button',
  596. 'is_hidden': False,
  597. 'description': '删除应用'
  598. },
  599. {
  600. 'id': 'app-view-secret-btn',
  601. 'parent_id': 'app-management',
  602. 'name': 'app-view-secret',
  603. 'title': '查看密钥',
  604. 'path': None,
  605. 'component': None,
  606. 'icon': 'View',
  607. 'sort_order': 4,
  608. 'menu_type': 'button',
  609. 'is_hidden': False,
  610. 'description': '查看应用密钥'
  611. },
  612. {
  613. 'id': 'app-reset-secret-btn',
  614. 'parent_id': 'app-management',
  615. 'name': 'app-reset-secret',
  616. 'title': '重置密钥',
  617. 'path': None,
  618. 'component': None,
  619. 'icon': 'RefreshRight',
  620. 'sort_order': 5,
  621. 'menu_type': 'button',
  622. 'is_hidden': False,
  623. 'description': '重置应用密钥'
  624. },
  625. {
  626. 'id': 'app-view-logs-btn',
  627. 'parent_id': 'app-management',
  628. 'name': 'app-view-logs',
  629. 'title': '查看日志',
  630. 'path': None,
  631. 'component': None,
  632. 'icon': 'Document',
  633. 'sort_order': 6,
  634. 'menu_type': 'button',
  635. 'is_hidden': False,
  636. 'description': '查看应用相关日志'
  637. },
  638. # ==================== 系统日志的按钮权限 ====================
  639. {
  640. 'id': 'log-view-btn',
  641. 'parent_id': 'log-management',
  642. 'name': 'log-view',
  643. 'title': '查看日志',
  644. 'path': None,
  645. 'component': None,
  646. 'icon': 'View',
  647. 'sort_order': 1,
  648. 'menu_type': 'button',
  649. 'is_hidden': False,
  650. 'description': '查看系统日志'
  651. },
  652. {
  653. 'id': 'log-export-btn',
  654. 'parent_id': 'log-management',
  655. 'name': 'log-export',
  656. 'title': '导出日志',
  657. 'path': None,
  658. 'component': None,
  659. 'icon': 'Download',
  660. 'sort_order': 2,
  661. 'menu_type': 'button',
  662. 'is_hidden': False,
  663. 'description': '导出系统日志'
  664. },
  665. {
  666. 'id': 'log-clear-btn',
  667. 'parent_id': 'log-management',
  668. 'name': 'log-clear',
  669. 'title': '清理日志',
  670. 'path': None,
  671. 'component': None,
  672. 'icon': 'Delete',
  673. 'sort_order': 3,
  674. 'menu_type': 'button',
  675. 'is_hidden': False,
  676. 'description': '清理历史日志'
  677. },
  678. # ==================== 系统设置的按钮权限 ====================
  679. {
  680. 'id': 'settings-view-btn',
  681. 'parent_id': 'system-settings',
  682. 'name': 'settings-view',
  683. 'title': '查看设置',
  684. 'path': None,
  685. 'component': None,
  686. 'icon': 'View',
  687. 'sort_order': 1,
  688. 'menu_type': 'button',
  689. 'is_hidden': False,
  690. 'description': '查看系统设置'
  691. },
  692. {
  693. 'id': 'settings-edit-btn',
  694. 'parent_id': 'system-settings',
  695. 'name': 'settings-edit',
  696. 'title': '修改设置',
  697. 'path': None,
  698. 'component': None,
  699. 'icon': 'Edit',
  700. 'sort_order': 2,
  701. 'menu_type': 'button',
  702. 'is_hidden': False,
  703. 'description': '修改系统设置'
  704. }
  705. ]
  706. for menu in menus_data:
  707. cursor.execute("""
  708. INSERT INTO menus (id, parent_id, name, title, path, component, icon, sort_order, menu_type, is_hidden, is_active, description, created_at, updated_at)
  709. VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW(), NOW())
  710. """, (
  711. menu['id'], menu['parent_id'], menu['name'], menu['title'],
  712. menu['path'], menu['component'], menu['icon'], menu['sort_order'],
  713. menu['menu_type'], menu['is_hidden'], True, menu['description']
  714. ))
  715. print(f" ✅ 插入了 {len(menus_data)} 个菜单项")
  716. # 统计各级菜单数量
  717. main_menus = len([m for m in menus_data if not m['parent_id']])
  718. function_menus = len([m for m in menus_data if m['parent_id'] and m['menu_type'] == 'menu'])
  719. button_permissions = len([m for m in menus_data if m['menu_type'] == 'button'])
  720. print(f" 📊 菜单结构统计:")
  721. print(f" 📁 主菜单: {main_menus} 个")
  722. print(f" 📄 功能菜单: {function_menus} 个")
  723. print(f" 🔘 按钮权限: {button_permissions} 个")
  724. def insert_roles(cursor):
  725. """插入角色数据"""
  726. print("👥 插入角色数据...")
  727. roles_data = [
  728. {
  729. 'id': str(uuid.uuid4()),
  730. 'name': 'super_admin',
  731. 'display_name': '超级管理员',
  732. 'description': '拥有系统所有权限的超级管理员',
  733. 'is_system': True
  734. },
  735. {
  736. 'id': str(uuid.uuid4()),
  737. 'name': 'admin',
  738. 'display_name': '管理员',
  739. 'description': '系统管理员,拥有大部分管理权限',
  740. 'is_system': True
  741. },
  742. {
  743. 'id': str(uuid.uuid4()),
  744. 'name': 'user_manager',
  745. 'display_name': '用户管理员',
  746. 'description': '负责用户和角色管理的管理员',
  747. 'is_system': True
  748. },
  749. {
  750. 'id': str(uuid.uuid4()),
  751. 'name': 'app_manager',
  752. 'display_name': '应用管理员',
  753. 'description': '负责应用管理的管理员',
  754. 'is_system': True
  755. },
  756. {
  757. 'id': str(uuid.uuid4()),
  758. 'name': 'user',
  759. 'display_name': '普通用户',
  760. 'description': '系统普通用户',
  761. 'is_system': True
  762. }
  763. ]
  764. role_ids = {}
  765. for role in roles_data:
  766. cursor.execute("""
  767. INSERT INTO roles (id, name, display_name, description, is_active, is_system, created_at, updated_at)
  768. VALUES (%s, %s, %s, %s, %s, %s, NOW(), NOW())
  769. """, (role['id'], role['name'], role['display_name'], role['description'], True, role['is_system']))
  770. role_ids[role['name']] = role['id']
  771. print(f" ✅ 插入了 {len(roles_data)} 个角色")
  772. return role_ids
  773. def insert_permissions(cursor):
  774. """插入权限数据"""
  775. print("🔐 插入权限数据...")
  776. permissions_data = [
  777. # 个人资料权限
  778. {'name': 'profile.save', 'display_name': '保存个人资料', 'resource': 'profile', 'action': 'save', 'description': '保存个人资料修改'},
  779. {'name': 'profile.reset', 'display_name': '重置个人资料', 'resource': 'profile', 'action': 'reset', 'description': '重置个人资料表单'},
  780. {'name': 'profile.change_password', 'display_name': '修改密码', 'resource': 'profile', 'action': 'change_password', 'description': '修改登录密码'},
  781. # 管理概览权限
  782. {'name': 'admin.dashboard', 'display_name': '管理概览', 'resource': 'admin', 'action': 'dashboard', 'description': '查看管理概览'},
  783. {'name': 'admin.quick_user_mgmt', 'display_name': '快速用户管理', 'resource': 'admin', 'action': 'quick_user_mgmt', 'description': '快速跳转到用户管理'},
  784. {'name': 'admin.quick_create_user', 'display_name': '快速创建用户', 'resource': 'admin', 'action': 'quick_create_user', 'description': '快速创建用户'},
  785. {'name': 'admin.quick_app_mgmt', 'display_name': '快速应用管理', 'resource': 'admin', 'action': 'quick_app_mgmt', 'description': '快速跳转到应用管理'},
  786. {'name': 'admin.quick_create_app', 'display_name': '快速创建应用', 'resource': 'admin', 'action': 'quick_create_app', 'description': '快速创建应用'},
  787. {'name': 'admin.quick_view_logs', 'display_name': '快速查看日志', 'resource': 'admin', 'action': 'quick_view_logs', 'description': '快速查看系统日志'},
  788. {'name': 'admin.quick_export_logs', 'display_name': '快速导出日志', 'resource': 'admin', 'action': 'quick_export_logs', 'description': '快速导出日志'},
  789. {'name': 'admin.quick_settings', 'display_name': '快速系统设置', 'resource': 'admin', 'action': 'quick_settings', 'description': '快速跳转到系统设置'},
  790. # 用户管理权限
  791. {'name': 'user.view', 'display_name': '查看用户', 'resource': 'user', 'action': 'view', 'description': '查看用户列表和详情'},
  792. {'name': 'user.create', 'display_name': '创建用户', 'resource': 'user', 'action': 'create', 'description': '创建新用户'},
  793. {'name': 'user.edit', 'display_name': '编辑用户', 'resource': 'user', 'action': 'edit', 'description': '编辑用户信息'},
  794. {'name': 'user.delete', 'display_name': '删除用户', 'resource': 'user', 'action': 'delete', 'description': '删除用户'},
  795. {'name': 'user.batch_delete', 'display_name': '批量删除用户', 'resource': 'user', 'action': 'batch_delete', 'description': '批量删除用户'},
  796. {'name': 'user.assign_role', 'display_name': '分配用户角色', 'resource': 'user', 'action': 'assign_role', 'description': '为用户分配角色'},
  797. {'name': 'user.reset_password', 'display_name': '重置用户密码', 'resource': 'user', 'action': 'reset_password', 'description': '重置用户密码'},
  798. # 角色管理权限
  799. {'name': 'role.view', 'display_name': '查看角色', 'resource': 'role', 'action': 'view', 'description': '查看角色列表和详情'},
  800. {'name': 'role.create', 'display_name': '创建角色', 'resource': 'role', 'action': 'create', 'description': '创建新角色'},
  801. {'name': 'role.edit', 'display_name': '编辑角色', 'resource': 'role', 'action': 'edit', 'description': '编辑角色信息'},
  802. {'name': 'role.delete', 'display_name': '删除角色', 'resource': 'role', 'action': 'delete', 'description': '删除角色'},
  803. {'name': 'role.permission_mgmt', 'display_name': '角色权限管理', 'resource': 'role', 'action': 'permission_mgmt', 'description': '管理角色权限'},
  804. # 菜单管理权限
  805. {'name': 'menu.view', 'display_name': '查看菜单', 'resource': 'menu', 'action': 'view', 'description': '查看菜单列表和详情'},
  806. {'name': 'menu.create', 'display_name': '创建菜单', 'resource': 'menu', 'action': 'create', 'description': '创建新菜单'},
  807. {'name': 'menu.edit', 'display_name': '编辑菜单', 'resource': 'menu', 'action': 'edit', 'description': '编辑菜单信息'},
  808. {'name': 'menu.delete', 'display_name': '删除菜单', 'resource': 'menu', 'action': 'delete', 'description': '删除菜单'},
  809. {'name': 'menu.sort', 'display_name': '排序菜单', 'resource': 'menu', 'action': 'sort', 'description': '调整菜单排序'},
  810. # 权限管理权限
  811. {'name': 'permission.view', 'display_name': '查看权限', 'resource': 'permission', 'action': 'view', 'description': '查看权限列表和详情'},
  812. {'name': 'permission.create', 'display_name': '创建权限', 'resource': 'permission', 'action': 'create', 'description': '创建新权限'},
  813. {'name': 'permission.edit', 'display_name': '编辑权限', 'resource': 'permission', 'action': 'edit', 'description': '编辑权限信息'},
  814. {'name': 'permission.delete', 'display_name': '删除权限', 'resource': 'permission', 'action': 'delete', 'description': '删除权限'},
  815. {'name': 'permission.view_roles', 'display_name': '查看权限角色', 'resource': 'permission', 'action': 'view_roles', 'description': '查看权限关联的角色'},
  816. # 应用管理权限
  817. {'name': 'app.view', 'display_name': '查看应用', 'resource': 'app', 'action': 'view', 'description': '查看应用列表和详情'},
  818. {'name': 'app.create', 'display_name': '创建应用', 'resource': 'app', 'action': 'create', 'description': '创建OAuth2应用'},
  819. {'name': 'app.edit', 'display_name': '编辑应用', 'resource': 'app', 'action': 'edit', 'description': '编辑应用信息'},
  820. {'name': 'app.delete', 'display_name': '删除应用', 'resource': 'app', 'action': 'delete', 'description': '删除应用'},
  821. {'name': 'app.view_secret', 'display_name': '查看应用密钥', 'resource': 'app', 'action': 'view_secret', 'description': '查看应用密钥'},
  822. {'name': 'app.reset_secret', 'display_name': '重置应用密钥', 'resource': 'app', 'action': 'reset_secret', 'description': '重置应用密钥'},
  823. {'name': 'app.view_logs', 'display_name': '查看应用日志', 'resource': 'app', 'action': 'view_logs', 'description': '查看应用相关日志'},
  824. # 系统日志权限
  825. {'name': 'log.view', 'display_name': '查看系统日志', 'resource': 'log', 'action': 'view', 'description': '查看系统操作日志'},
  826. {'name': 'log.export', 'display_name': '导出系统日志', 'resource': 'log', 'action': 'export', 'description': '导出系统日志'},
  827. {'name': 'log.clear', 'display_name': '清理系统日志', 'resource': 'log', 'action': 'clear', 'description': '清理历史日志'},
  828. # 系统设置权限
  829. {'name': 'settings.view', 'display_name': '查看系统设置', 'resource': 'settings', 'action': 'view', 'description': '查看系统配置'},
  830. {'name': 'settings.edit', 'display_name': '修改系统设置', 'resource': 'settings', 'action': 'edit', 'description': '修改系统配置'},
  831. ]
  832. permission_ids = {}
  833. for perm in permissions_data:
  834. perm_id = str(uuid.uuid4())
  835. cursor.execute("""
  836. INSERT INTO permissions (id, name, display_name, resource, action, description, is_active, created_at, updated_at)
  837. VALUES (%s, %s, %s, %s, %s, %s, %s, NOW(), NOW())
  838. """, (perm_id, perm['name'], perm['display_name'], perm['resource'], perm['action'], perm['description'], True))
  839. permission_ids[perm['name']] = perm_id
  840. print(f" ✅ 插入了 {len(permissions_data)} 个权限")
  841. return permission_ids
  842. def assign_role_permissions(cursor, role_ids, permission_ids):
  843. """分配角色权限"""
  844. print("🔗 分配角色权限...")
  845. # 超级管理员拥有所有权限
  846. super_admin_id = role_ids['super_admin']
  847. for perm_name, perm_id in permission_ids.items():
  848. cursor.execute("""
  849. INSERT INTO role_permissions (role_id, permission_id, created_at)
  850. VALUES (%s, %s, NOW())
  851. """, (super_admin_id, perm_id))
  852. # 管理员拥有大部分权限(除了系统设置修改)
  853. admin_id = role_ids['admin']
  854. admin_permissions = [perm for perm in permission_ids.keys() if not perm.startswith('settings.edit')]
  855. for perm_name in admin_permissions:
  856. cursor.execute("""
  857. INSERT INTO role_permissions (role_id, permission_id, created_at)
  858. VALUES (%s, %s, NOW())
  859. """, (admin_id, permission_ids[perm_name]))
  860. # 用户管理员只有用户和角色相关权限
  861. user_manager_id = role_ids['user_manager']
  862. user_permissions = [perm for perm in permission_ids.keys() if perm.startswith(('user.', 'role.', 'admin.dashboard', 'admin.quick_user', 'profile.'))]
  863. for perm_name in user_permissions:
  864. cursor.execute("""
  865. INSERT INTO role_permissions (role_id, permission_id, created_at)
  866. VALUES (%s, %s, NOW())
  867. """, (user_manager_id, permission_ids[perm_name]))
  868. # 应用管理员只有应用相关权限
  869. app_manager_id = role_ids['app_manager']
  870. app_permissions = [perm for perm in permission_ids.keys() if perm.startswith(('app.', 'admin.dashboard', 'admin.quick_app', 'profile.'))]
  871. for perm_name in app_permissions:
  872. cursor.execute("""
  873. INSERT INTO role_permissions (role_id, permission_id, created_at)
  874. VALUES (%s, %s, NOW())
  875. """, (app_manager_id, permission_ids[perm_name]))
  876. # 普通用户只有基础权限
  877. user_id = role_ids['user']
  878. user_permissions = [perm for perm in permission_ids.keys() if perm.startswith('profile.')]
  879. for perm_name in user_permissions:
  880. cursor.execute("""
  881. INSERT INTO role_permissions (role_id, permission_id, created_at)
  882. VALUES (%s, %s, NOW())
  883. """, (user_id, permission_ids[perm_name]))
  884. print(" ✅ 角色权限分配完成")
  885. def assign_role_menus(cursor, role_ids):
  886. """分配角色菜单"""
  887. print("🔗 分配角色菜单...")
  888. # 获取所有菜单ID
  889. cursor.execute("SELECT id, parent_id, menu_type FROM menus")
  890. all_menus = cursor.fetchall()
  891. menu_ids = [menu[0] for menu in all_menus]
  892. # 超级管理员和管理员拥有所有菜单
  893. for role_name in ['super_admin', 'admin']:
  894. role_id = role_ids[role_name]
  895. for menu_id in menu_ids:
  896. cursor.execute("""
  897. INSERT INTO role_menus (role_id, menu_id, created_at)
  898. VALUES (%s, %s, NOW())
  899. """, (role_id, menu_id))
  900. # 用户管理员只有基础菜单和用户管理相关菜单
  901. user_manager_id = role_ids['user_manager']
  902. user_manager_menus = [
  903. 'dashboard-main', 'profile-main', 'admin-main', 'admin-dashboard',
  904. 'user-management', 'role-management'
  905. ]
  906. # 添加相关的按钮权限
  907. cursor.execute("SELECT id FROM menus WHERE parent_id IN ('profile-main', 'admin-dashboard', 'user-management', 'role-management')")
  908. user_buttons = cursor.fetchall()
  909. user_manager_menus.extend([btn[0] for btn in user_buttons])
  910. for menu_id in user_manager_menus:
  911. cursor.execute("""
  912. INSERT INTO role_menus (role_id, menu_id, created_at)
  913. VALUES (%s, %s, NOW())
  914. """, (user_manager_id, menu_id))
  915. # 应用管理员只有基础菜单和应用管理相关菜单
  916. app_manager_id = role_ids['app_manager']
  917. app_manager_menus = [
  918. 'dashboard-main', 'profile-main', 'admin-main', 'admin-dashboard',
  919. 'app-management'
  920. ]
  921. # 添加相关的按钮权限
  922. cursor.execute("SELECT id FROM menus WHERE parent_id IN ('profile-main', 'admin-dashboard', 'app-management')")
  923. app_buttons = cursor.fetchall()
  924. app_manager_menus.extend([btn[0] for btn in app_buttons])
  925. for menu_id in app_manager_menus:
  926. cursor.execute("""
  927. INSERT INTO role_menus (role_id, menu_id, created_at)
  928. VALUES (%s, %s, NOW())
  929. """, (app_manager_id, menu_id))
  930. # 普通用户只有基础菜单
  931. user_id = role_ids['user']
  932. user_menus = ['dashboard-main', 'profile-main']
  933. # 添加个人资料的按钮权限
  934. cursor.execute("SELECT id FROM menus WHERE parent_id = 'profile-main'")
  935. profile_buttons = cursor.fetchall()
  936. user_menus.extend([btn[0] for btn in profile_buttons])
  937. for menu_id in user_menus:
  938. cursor.execute("""
  939. INSERT INTO role_menus (role_id, menu_id, created_at)
  940. VALUES (%s, %s, NOW())
  941. """, (user_id, menu_id))
  942. print(" ✅ 角色菜单分配完成")
  943. def assign_user_roles(cursor, role_ids):
  944. """为现有用户分配角色"""
  945. print("👤 为用户分配角色...")
  946. # 获取admin用户
  947. cursor.execute("SELECT id FROM users WHERE username = 'admin'")
  948. admin_user = cursor.fetchone()
  949. if admin_user:
  950. admin_user_id = admin_user[0]
  951. # 为admin用户分配超级管理员角色
  952. cursor.execute("""
  953. INSERT INTO user_roles (user_id, role_id, is_active, created_at)
  954. VALUES (%s, %s, %s, NOW())
  955. """, (admin_user_id, role_ids['super_admin'], True))
  956. print(f" ✅ 为admin用户分配了超级管理员角色")
  957. # 获取其他用户并分配普通用户角色
  958. cursor.execute("SELECT id, username FROM users WHERE username != 'admin'")
  959. other_users = cursor.fetchall()
  960. for user in other_users:
  961. user_id, username = user
  962. cursor.execute("""
  963. INSERT INTO user_roles (user_id, role_id, is_active, created_at)
  964. VALUES (%s, %s, %s, NOW())
  965. """, (user_id, role_ids['user'], True))
  966. print(f" ✅ 为用户 {username} 分配了普通用户角色")
  967. def print_menu_structure(cursor):
  968. """打印菜单结构验证"""
  969. print("\n🌳 根据需求文档的菜单结构:")
  970. print("=" * 60)
  971. # 获取所有菜单
  972. cursor.execute("""
  973. SELECT id, parent_id, title, menu_type, sort_order
  974. FROM menus
  975. ORDER BY
  976. CASE WHEN parent_id IS NULL THEN 0 ELSE 1 END,
  977. sort_order,
  978. CASE WHEN menu_type = 'menu' THEN 0 ELSE 1 END
  979. """)
  980. all_menus = cursor.fetchall()
  981. # 构建菜单树
  982. menu_dict = {}
  983. for menu in all_menus:
  984. menu_id, parent_id, title, menu_type, sort_order = menu
  985. menu_dict[menu_id] = {
  986. 'id': menu_id,
  987. 'parent_id': parent_id,
  988. 'title': title,
  989. 'menu_type': menu_type,
  990. 'sort_order': sort_order,
  991. 'children': []
  992. }
  993. # 建立父子关系
  994. root_menus = []
  995. for menu_id, menu_data in menu_dict.items():
  996. if menu_data['parent_id']:
  997. if menu_data['parent_id'] in menu_dict:
  998. menu_dict[menu_data['parent_id']]['children'].append(menu_data)
  999. else:
  1000. root_menus.append(menu_data)
  1001. # 打印树形结构
  1002. def print_menu_tree(menus, level=0):
  1003. for menu in sorted(menus, key=lambda x: x['sort_order']):
  1004. indent = " " * level
  1005. if menu['menu_type'] == 'menu' and level == 0:
  1006. icon = "📄" if menu['title'] == '仪表盘' else "📁"
  1007. elif menu['menu_type'] == 'menu':
  1008. icon = "📄"
  1009. else:
  1010. icon = "🔘"
  1011. print(f"{indent}{icon} {menu['title']} ({menu['menu_type']})")
  1012. if menu['children']:
  1013. # 先显示菜单类型的子项,再显示按钮类型的子项
  1014. menu_children = [c for c in menu['children'] if c['menu_type'] == 'menu']
  1015. button_children = [c for c in menu['children'] if c['menu_type'] == 'button']
  1016. print_menu_tree(menu_children, level + 1)
  1017. print_menu_tree(button_children, level + 1)
  1018. print_menu_tree(root_menus)
  1019. def reinit_menus_by_requirements():
  1020. """根据需求文档重新初始化菜单数据"""
  1021. print("🚀 根据需求/菜单.md重新初始化RBAC数据")
  1022. print("=" * 60)
  1023. conn = get_db_connection()
  1024. if not conn:
  1025. print("❌ 数据库连接失败")
  1026. return False
  1027. cursor = conn.cursor()
  1028. try:
  1029. # 1. 清理现有数据
  1030. clear_rbac_data(cursor)
  1031. # 2. 根据需求文档插入菜单数据
  1032. insert_menus(cursor)
  1033. # 3. 插入角色数据
  1034. role_ids = insert_roles(cursor)
  1035. # 4. 插入权限数据
  1036. permission_ids = insert_permissions(cursor)
  1037. # 5. 分配角色权限
  1038. assign_role_permissions(cursor, role_ids, permission_ids)
  1039. # 6. 分配角色菜单
  1040. assign_role_menus(cursor, role_ids)
  1041. # 7. 为用户分配角色
  1042. assign_user_roles(cursor, role_ids)
  1043. # 8. 打印菜单结构验证
  1044. print_menu_structure(cursor)
  1045. conn.commit()
  1046. print("\n" + "=" * 60)
  1047. print("🎉 根据需求文档的RBAC数据初始化完成!")
  1048. print("=" * 60)
  1049. print("📊 数据统计:")
  1050. # 统计数据
  1051. cursor.execute("SELECT COUNT(*) FROM menus")
  1052. menu_count = cursor.fetchone()[0]
  1053. cursor.execute("SELECT COUNT(*) FROM menus WHERE menu_type = 'menu' AND parent_id IS NULL")
  1054. main_menu_count = cursor.fetchone()[0]
  1055. cursor.execute("SELECT COUNT(*) FROM menus WHERE menu_type = 'menu' AND parent_id IS NOT NULL")
  1056. function_menu_count = cursor.fetchone()[0]
  1057. cursor.execute("SELECT COUNT(*) FROM menus WHERE menu_type = 'button'")
  1058. button_count = cursor.fetchone()[0]
  1059. cursor.execute("SELECT COUNT(*) FROM roles")
  1060. role_count = cursor.fetchone()[0]
  1061. cursor.execute("SELECT COUNT(*) FROM permissions")
  1062. permission_count = cursor.fetchone()[0]
  1063. print(f" 📁 主菜单: {main_menu_count} 个")
  1064. print(f" 📄 功能菜单: {function_menu_count} 个")
  1065. print(f" 🔘 按钮权限: {button_count} 个")
  1066. print(f" 📋 菜单总数: {menu_count} 个")
  1067. print(f" 👥 角色数量: {role_count} 个")
  1068. print(f" 🔐 权限数量: {permission_count} 个")
  1069. print("=" * 60)
  1070. return True
  1071. except Exception as e:
  1072. print(f"❌ 初始化失败: {e}")
  1073. conn.rollback()
  1074. return False
  1075. finally:
  1076. cursor.close()
  1077. conn.close()
  1078. def main():
  1079. """主函数"""
  1080. success = reinit_menus_by_requirements()
  1081. if success:
  1082. print("\n🎯 根据需求文档的菜单初始化成功!")
  1083. print("💡 建议重启前端服务以刷新菜单缓存。")
  1084. print("\n🌐 访问地址:")
  1085. print(" 前端: http://localhost:3000")
  1086. print(" 菜单管理: http://localhost:3000/admin/menus")
  1087. print("\n🔑 登录信息:")
  1088. print(" 用户名: admin")
  1089. print(" 密码: Admin123456")
  1090. print("\n📋 需求文档对应:")
  1091. print(" - 严格按照 OAuth2_system/需求/菜单.md 的结构设计")
  1092. print(" - 包含个人资料的按钮权限(保存修改、重置、修改密码)")
  1093. print(" - 管理概览包含快速操作按钮")
  1094. print(" - 所有功能菜单都有对应的按钮权限")
  1095. else:
  1096. print("\n❌ 根据需求文档的菜单初始化失败!")
  1097. if __name__ == "__main__":
  1098. main()