reinit_rbac_data.py 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852
  1. #!/usr/bin/env python3
  2. """
  3. 重新初始化RBAC数据 - 包含完整的树形菜单结构
  4. """
  5. import pymysql
  6. from dotenv import load_dotenv
  7. import os
  8. import uuid
  9. from datetime import datetime
  10. load_dotenv()
  11. def get_db_connection():
  12. """获取数据库连接"""
  13. try:
  14. config = {
  15. 'host': os.getenv('DB_HOST', 'localhost'),
  16. 'port': int(os.getenv('DB_PORT', 3306)),
  17. 'user': os.getenv('DB_USER', 'root'),
  18. 'password': os.getenv('DB_PASSWORD', 'admin'),
  19. 'database': os.getenv('DB_NAME', 'lq_db'),
  20. 'charset': 'utf8mb4',
  21. 'autocommit': True
  22. }
  23. return pymysql.connect(**config)
  24. except Exception as e:
  25. print(f"数据库连接失败: {e}")
  26. return None
  27. def clear_rbac_data(cursor):
  28. """清理现有RBAC数据"""
  29. print("🧹 清理现有RBAC数据...")
  30. # 清理关联表
  31. cursor.execute("DELETE FROM role_permissions")
  32. cursor.execute("DELETE FROM role_menus")
  33. cursor.execute("DELETE FROM user_roles")
  34. # 清理主表
  35. cursor.execute("DELETE FROM permissions")
  36. cursor.execute("DELETE FROM menus")
  37. cursor.execute("DELETE FROM roles")
  38. print(" ✅ 清理完成")
  39. def insert_menus(cursor):
  40. """插入菜单数据"""
  41. print("📋 插入菜单数据...")
  42. menus_data = [
  43. # 主菜单
  44. {
  45. 'id': 'dashboard-menu',
  46. 'parent_id': None,
  47. 'name': 'dashboard',
  48. 'title': '仪表盘',
  49. 'path': '/dashboard',
  50. 'component': 'dashboard/Index',
  51. 'icon': 'House',
  52. 'sort_order': 1,
  53. 'menu_type': 'menu',
  54. 'is_hidden': False,
  55. 'description': '系统概览和统计信息'
  56. },
  57. {
  58. 'id': 'profile-menu',
  59. 'parent_id': None,
  60. 'name': 'profile',
  61. 'title': '个人资料',
  62. 'path': '/profile',
  63. 'component': 'user/Profile',
  64. 'icon': 'User',
  65. 'sort_order': 2,
  66. 'menu_type': 'menu',
  67. 'is_hidden': False,
  68. 'description': '个人信息管理'
  69. },
  70. {
  71. 'id': 'admin-menu',
  72. 'parent_id': None,
  73. 'name': 'admin',
  74. 'title': '系统管理',
  75. 'path': '/admin',
  76. 'component': None,
  77. 'icon': 'Setting',
  78. 'sort_order': 3,
  79. 'menu_type': 'menu',
  80. 'is_hidden': False,
  81. 'description': '系统管理功能'
  82. },
  83. # 系统管理子菜单
  84. {
  85. 'id': 'admin-dashboard-menu',
  86. 'parent_id': 'admin-menu',
  87. 'name': 'admin-dashboard',
  88. 'title': '管理概览',
  89. 'path': '/admin/dashboard',
  90. 'component': 'admin/Dashboard',
  91. 'icon': 'Monitor',
  92. 'sort_order': 1,
  93. 'menu_type': 'menu',
  94. 'is_hidden': False,
  95. 'description': '管理员仪表盘'
  96. },
  97. {
  98. 'id': 'admin-users-menu',
  99. 'parent_id': 'admin-menu',
  100. 'name': 'admin-users',
  101. 'title': '用户管理',
  102. 'path': '/admin/users',
  103. 'component': 'admin/Users',
  104. 'icon': 'UserFilled',
  105. 'sort_order': 2,
  106. 'menu_type': 'menu',
  107. 'is_hidden': False,
  108. 'description': '用户信息管理'
  109. },
  110. {
  111. 'id': 'admin-roles-menu',
  112. 'parent_id': 'admin-menu',
  113. 'name': 'admin-roles',
  114. 'title': '角色管理',
  115. 'path': '/admin/roles',
  116. 'component': 'admin/Roles',
  117. 'icon': 'Avatar',
  118. 'sort_order': 3,
  119. 'menu_type': 'menu',
  120. 'is_hidden': False,
  121. 'description': '角色权限管理'
  122. },
  123. {
  124. 'id': 'admin-menus-menu',
  125. 'parent_id': 'admin-menu',
  126. 'name': 'admin-menus',
  127. 'title': '菜单管理',
  128. 'path': '/admin/menus',
  129. 'component': 'admin/Menus',
  130. 'icon': 'Menu',
  131. 'sort_order': 4,
  132. 'menu_type': 'menu',
  133. 'is_hidden': False,
  134. 'description': '菜单结构管理'
  135. },
  136. {
  137. 'id': 'admin-permissions-menu',
  138. 'parent_id': 'admin-menu',
  139. 'name': 'admin-permissions',
  140. 'title': '权限管理',
  141. 'path': '/admin/permissions',
  142. 'component': 'admin/Permissions',
  143. 'icon': 'Key',
  144. 'sort_order': 5,
  145. 'menu_type': 'menu',
  146. 'is_hidden': False,
  147. 'description': '权限配置管理'
  148. },
  149. {
  150. 'id': 'admin-apps-menu',
  151. 'parent_id': 'admin-menu',
  152. 'name': 'admin-apps',
  153. 'title': '应用管理',
  154. 'path': '/admin/apps',
  155. 'component': 'admin/Apps',
  156. 'icon': 'Grid',
  157. 'sort_order': 6,
  158. 'menu_type': 'menu',
  159. 'is_hidden': False,
  160. 'description': 'OAuth2应用管理'
  161. },
  162. {
  163. 'id': 'admin-logs-menu',
  164. 'parent_id': 'admin-menu',
  165. 'name': 'admin-logs',
  166. 'title': '系统日志',
  167. 'path': '/admin/logs',
  168. 'component': 'admin/Logs',
  169. 'icon': 'Document',
  170. 'sort_order': 7,
  171. 'menu_type': 'menu',
  172. 'is_hidden': False,
  173. 'description': '系统操作日志'
  174. },
  175. {
  176. 'id': 'admin-settings-menu',
  177. 'parent_id': 'admin-menu',
  178. 'name': 'admin-settings',
  179. 'title': '系统设置',
  180. 'path': '/admin/settings',
  181. 'component': 'admin/Settings',
  182. 'icon': 'Tools',
  183. 'sort_order': 8,
  184. 'menu_type': 'menu',
  185. 'is_hidden': False,
  186. 'description': '系统配置设置'
  187. },
  188. # 用户管理按钮权限
  189. {
  190. 'id': 'users-create-btn',
  191. 'parent_id': 'admin-users-menu',
  192. 'name': 'users-create',
  193. 'title': '创建用户',
  194. 'path': None,
  195. 'component': None,
  196. 'icon': 'Plus',
  197. 'sort_order': 1,
  198. 'menu_type': 'button',
  199. 'is_hidden': False,
  200. 'description': '创建新用户'
  201. },
  202. {
  203. 'id': 'users-edit-btn',
  204. 'parent_id': 'admin-users-menu',
  205. 'name': 'users-edit',
  206. 'title': '编辑用户',
  207. 'path': None,
  208. 'component': None,
  209. 'icon': 'Edit',
  210. 'sort_order': 2,
  211. 'menu_type': 'button',
  212. 'is_hidden': False,
  213. 'description': '编辑用户信息'
  214. },
  215. {
  216. 'id': 'users-delete-btn',
  217. 'parent_id': 'admin-users-menu',
  218. 'name': 'users-delete',
  219. 'title': '删除用户',
  220. 'path': None,
  221. 'component': None,
  222. 'icon': 'Delete',
  223. 'sort_order': 3,
  224. 'menu_type': 'button',
  225. 'is_hidden': False,
  226. 'description': '删除用户'
  227. },
  228. {
  229. 'id': 'users-batch-delete-btn',
  230. 'parent_id': 'admin-users-menu',
  231. 'name': 'users-batch-delete',
  232. 'title': '批量删除',
  233. 'path': None,
  234. 'component': None,
  235. 'icon': 'DeleteFilled',
  236. 'sort_order': 4,
  237. 'menu_type': 'button',
  238. 'is_hidden': False,
  239. 'description': '批量删除用户'
  240. },
  241. {
  242. 'id': 'users-assign-role-btn',
  243. 'parent_id': 'admin-users-menu',
  244. 'name': 'users-assign-role',
  245. 'title': '分配角色',
  246. 'path': None,
  247. 'component': None,
  248. 'icon': 'Avatar',
  249. 'sort_order': 5,
  250. 'menu_type': 'button',
  251. 'is_hidden': False,
  252. 'description': '为用户分配角色'
  253. },
  254. {
  255. 'id': 'users-reset-password-btn',
  256. 'parent_id': 'admin-users-menu',
  257. 'name': 'users-reset-password',
  258. 'title': '重置密码',
  259. 'path': None,
  260. 'component': None,
  261. 'icon': 'Key',
  262. 'sort_order': 6,
  263. 'menu_type': 'button',
  264. 'is_hidden': False,
  265. 'description': '重置用户密码'
  266. },
  267. # 角色管理按钮权限
  268. {
  269. 'id': 'roles-create-btn',
  270. 'parent_id': 'admin-roles-menu',
  271. 'name': 'roles-create',
  272. 'title': '创建角色',
  273. 'path': None,
  274. 'component': None,
  275. 'icon': 'Plus',
  276. 'sort_order': 1,
  277. 'menu_type': 'button',
  278. 'is_hidden': False,
  279. 'description': '创建新角色'
  280. },
  281. {
  282. 'id': 'roles-edit-btn',
  283. 'parent_id': 'admin-roles-menu',
  284. 'name': 'roles-edit',
  285. 'title': '编辑角色',
  286. 'path': None,
  287. 'component': None,
  288. 'icon': 'Edit',
  289. 'sort_order': 2,
  290. 'menu_type': 'button',
  291. 'is_hidden': False,
  292. 'description': '编辑角色信息'
  293. },
  294. {
  295. 'id': 'roles-delete-btn',
  296. 'parent_id': 'admin-roles-menu',
  297. 'name': 'roles-delete',
  298. 'title': '删除角色',
  299. 'path': None,
  300. 'component': None,
  301. 'icon': 'Delete',
  302. 'sort_order': 3,
  303. 'menu_type': 'button',
  304. 'is_hidden': False,
  305. 'description': '删除角色'
  306. },
  307. {
  308. 'id': 'roles-assign-permission-btn',
  309. 'parent_id': 'admin-roles-menu',
  310. 'name': 'roles-assign-permission',
  311. 'title': '分配权限',
  312. 'path': None,
  313. 'component': None,
  314. 'icon': 'Key',
  315. 'sort_order': 4,
  316. 'menu_type': 'button',
  317. 'is_hidden': False,
  318. 'description': '为角色分配权限'
  319. },
  320. {
  321. 'id': 'roles-assign-menu-btn',
  322. 'parent_id': 'admin-roles-menu',
  323. 'name': 'roles-assign-menu',
  324. 'title': '分配菜单',
  325. 'path': None,
  326. 'component': None,
  327. 'icon': 'Menu',
  328. 'sort_order': 5,
  329. 'menu_type': 'button',
  330. 'is_hidden': False,
  331. 'description': '为角色分配菜单'
  332. },
  333. # 菜单管理按钮权限
  334. {
  335. 'id': 'menus-create-btn',
  336. 'parent_id': 'admin-menus-menu',
  337. 'name': 'menus-create',
  338. 'title': '创建菜单',
  339. 'path': None,
  340. 'component': None,
  341. 'icon': 'Plus',
  342. 'sort_order': 1,
  343. 'menu_type': 'button',
  344. 'is_hidden': False,
  345. 'description': '创建新菜单'
  346. },
  347. {
  348. 'id': 'menus-edit-btn',
  349. 'parent_id': 'admin-menus-menu',
  350. 'name': 'menus-edit',
  351. 'title': '编辑菜单',
  352. 'path': None,
  353. 'component': None,
  354. 'icon': 'Edit',
  355. 'sort_order': 2,
  356. 'menu_type': 'button',
  357. 'is_hidden': False,
  358. 'description': '编辑菜单信息'
  359. },
  360. {
  361. 'id': 'menus-delete-btn',
  362. 'parent_id': 'admin-menus-menu',
  363. 'name': 'menus-delete',
  364. 'title': '删除菜单',
  365. 'path': None,
  366. 'component': None,
  367. 'icon': 'Delete',
  368. 'sort_order': 3,
  369. 'menu_type': 'button',
  370. 'is_hidden': False,
  371. 'description': '删除菜单'
  372. },
  373. {
  374. 'id': 'menus-sort-btn',
  375. 'parent_id': 'admin-menus-menu',
  376. 'name': 'menus-sort',
  377. 'title': '排序菜单',
  378. 'path': None,
  379. 'component': None,
  380. 'icon': 'Sort',
  381. 'sort_order': 4,
  382. 'menu_type': 'button',
  383. 'is_hidden': False,
  384. 'description': '调整菜单排序'
  385. },
  386. # 权限管理按钮权限
  387. {
  388. 'id': 'permissions-create-btn',
  389. 'parent_id': 'admin-permissions-menu',
  390. 'name': 'permissions-create',
  391. 'title': '创建权限',
  392. 'path': None,
  393. 'component': None,
  394. 'icon': 'Plus',
  395. 'sort_order': 1,
  396. 'menu_type': 'button',
  397. 'is_hidden': False,
  398. 'description': '创建新权限'
  399. },
  400. {
  401. 'id': 'permissions-edit-btn',
  402. 'parent_id': 'admin-permissions-menu',
  403. 'name': 'permissions-edit',
  404. 'title': '编辑权限',
  405. 'path': None,
  406. 'component': None,
  407. 'icon': 'Edit',
  408. 'sort_order': 2,
  409. 'menu_type': 'button',
  410. 'is_hidden': False,
  411. 'description': '编辑权限信息'
  412. },
  413. {
  414. 'id': 'permissions-delete-btn',
  415. 'parent_id': 'admin-permissions-menu',
  416. 'name': 'permissions-delete',
  417. 'title': '删除权限',
  418. 'path': None,
  419. 'component': None,
  420. 'icon': 'Delete',
  421. 'sort_order': 3,
  422. 'menu_type': 'button',
  423. 'is_hidden': False,
  424. 'description': '删除权限'
  425. },
  426. # 应用管理按钮权限
  427. {
  428. 'id': 'apps-create-btn',
  429. 'parent_id': 'admin-apps-menu',
  430. 'name': 'apps-create',
  431. 'title': '创建应用',
  432. 'path': None,
  433. 'component': None,
  434. 'icon': 'Plus',
  435. 'sort_order': 1,
  436. 'menu_type': 'button',
  437. 'is_hidden': False,
  438. 'description': '创建OAuth2应用'
  439. },
  440. {
  441. 'id': 'apps-edit-btn',
  442. 'parent_id': 'admin-apps-menu',
  443. 'name': 'apps-edit',
  444. 'title': '编辑应用',
  445. 'path': None,
  446. 'component': None,
  447. 'icon': 'Edit',
  448. 'sort_order': 2,
  449. 'menu_type': 'button',
  450. 'is_hidden': False,
  451. 'description': '编辑应用信息'
  452. },
  453. {
  454. 'id': 'apps-delete-btn',
  455. 'parent_id': 'admin-apps-menu',
  456. 'name': 'apps-delete',
  457. 'title': '删除应用',
  458. 'path': None,
  459. 'component': None,
  460. 'icon': 'Delete',
  461. 'sort_order': 3,
  462. 'menu_type': 'button',
  463. 'is_hidden': False,
  464. 'description': '删除应用'
  465. },
  466. {
  467. 'id': 'apps-secret-btn',
  468. 'parent_id': 'admin-apps-menu',
  469. 'name': 'apps-secret',
  470. 'title': '查看密钥',
  471. 'path': None,
  472. 'component': None,
  473. 'icon': 'Key',
  474. 'sort_order': 4,
  475. 'menu_type': 'button',
  476. 'is_hidden': False,
  477. 'description': '查看应用密钥'
  478. },
  479. {
  480. 'id': 'apps-reset-secret-btn',
  481. 'parent_id': 'admin-apps-menu',
  482. 'name': 'apps-reset-secret',
  483. 'title': '重置密钥',
  484. 'path': None,
  485. 'component': None,
  486. 'icon': 'RefreshRight',
  487. 'sort_order': 5,
  488. 'menu_type': 'button',
  489. 'is_hidden': False,
  490. 'description': '重置应用密钥'
  491. }
  492. ]
  493. for menu in menus_data:
  494. cursor.execute("""
  495. INSERT INTO menus (id, parent_id, name, title, path, component, icon, sort_order, menu_type, is_hidden, is_active, description, created_at, updated_at)
  496. VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW(), NOW())
  497. """, (
  498. menu['id'], menu['parent_id'], menu['name'], menu['title'],
  499. menu['path'], menu['component'], menu['icon'], menu['sort_order'],
  500. menu['menu_type'], menu['is_hidden'], True, menu['description']
  501. ))
  502. print(f" ✅ 插入了 {len(menus_data)} 个菜单项")
  503. def insert_roles(cursor):
  504. """插入角色数据"""
  505. print("👥 插入角色数据...")
  506. roles_data = [
  507. {
  508. 'id': str(uuid.uuid4()),
  509. 'name': 'super_admin',
  510. 'display_name': '超级管理员',
  511. 'description': '拥有系统所有权限的超级管理员',
  512. 'is_system': True
  513. },
  514. {
  515. 'id': str(uuid.uuid4()),
  516. 'name': 'admin',
  517. 'display_name': '管理员',
  518. 'description': '系统管理员,拥有大部分管理权限',
  519. 'is_system': True
  520. },
  521. {
  522. 'id': str(uuid.uuid4()),
  523. 'name': 'user_manager',
  524. 'display_name': '用户管理员',
  525. 'description': '负责用户管理的管理员',
  526. 'is_system': True
  527. },
  528. {
  529. 'id': str(uuid.uuid4()),
  530. 'name': 'app_manager',
  531. 'display_name': '应用管理员',
  532. 'description': '负责应用管理的管理员',
  533. 'is_system': True
  534. },
  535. {
  536. 'id': str(uuid.uuid4()),
  537. 'name': 'user',
  538. 'display_name': '普通用户',
  539. 'description': '系统普通用户',
  540. 'is_system': True
  541. }
  542. ]
  543. role_ids = {}
  544. for role in roles_data:
  545. cursor.execute("""
  546. INSERT INTO roles (id, name, display_name, description, is_active, is_system, created_at, updated_at)
  547. VALUES (%s, %s, %s, %s, %s, %s, NOW(), NOW())
  548. """, (role['id'], role['name'], role['display_name'], role['description'], True, role['is_system']))
  549. role_ids[role['name']] = role['id']
  550. print(f" ✅ 插入了 {len(roles_data)} 个角色")
  551. return role_ids
  552. def insert_permissions(cursor):
  553. """插入权限数据"""
  554. print("🔐 插入权限数据...")
  555. permissions_data = [
  556. # 用户管理权限
  557. {'name': 'user.view', 'display_name': '查看用户', 'resource': 'user', 'action': 'view', 'description': '查看用户列表和详情'},
  558. {'name': 'user.create', 'display_name': '创建用户', 'resource': 'user', 'action': 'create', 'description': '创建新用户'},
  559. {'name': 'user.edit', 'display_name': '编辑用户', 'resource': 'user', 'action': 'edit', 'description': '编辑用户信息'},
  560. {'name': 'user.delete', 'display_name': '删除用户', 'resource': 'user', 'action': 'delete', 'description': '删除用户'},
  561. {'name': 'user.batch_delete', 'display_name': '批量删除用户', 'resource': 'user', 'action': 'batch_delete', 'description': '批量删除用户'},
  562. {'name': 'user.assign_role', 'display_name': '分配用户角色', 'resource': 'user', 'action': 'assign_role', 'description': '为用户分配角色'},
  563. {'name': 'user.reset_password', 'display_name': '重置用户密码', 'resource': 'user', 'action': 'reset_password', 'description': '重置用户密码'},
  564. # 角色管理权限
  565. {'name': 'role.view', 'display_name': '查看角色', 'resource': 'role', 'action': 'view', 'description': '查看角色列表和详情'},
  566. {'name': 'role.create', 'display_name': '创建角色', 'resource': 'role', 'action': 'create', 'description': '创建新角色'},
  567. {'name': 'role.edit', 'display_name': '编辑角色', 'resource': 'role', 'action': 'edit', 'description': '编辑角色信息'},
  568. {'name': 'role.delete', 'display_name': '删除角色', 'resource': 'role', 'action': 'delete', 'description': '删除角色'},
  569. {'name': 'role.assign_permission', 'display_name': '分配角色权限', 'resource': 'role', 'action': 'assign_permission', 'description': '为角色分配权限'},
  570. {'name': 'role.assign_menu', 'display_name': '分配角色菜单', 'resource': 'role', 'action': 'assign_menu', 'description': '为角色分配菜单'},
  571. # 菜单管理权限
  572. {'name': 'menu.view', 'display_name': '查看菜单', 'resource': 'menu', 'action': 'view', 'description': '查看菜单列表和详情'},
  573. {'name': 'menu.create', 'display_name': '创建菜单', 'resource': 'menu', 'action': 'create', 'description': '创建新菜单'},
  574. {'name': 'menu.edit', 'display_name': '编辑菜单', 'resource': 'menu', 'action': 'edit', 'description': '编辑菜单信息'},
  575. {'name': 'menu.delete', 'display_name': '删除菜单', 'resource': 'menu', 'action': 'delete', 'description': '删除菜单'},
  576. {'name': 'menu.sort', 'display_name': '排序菜单', 'resource': 'menu', 'action': 'sort', 'description': '调整菜单排序'},
  577. # 权限管理权限
  578. {'name': 'permission.view', 'display_name': '查看权限', 'resource': 'permission', 'action': 'view', 'description': '查看权限列表和详情'},
  579. {'name': 'permission.create', 'display_name': '创建权限', 'resource': 'permission', 'action': 'create', 'description': '创建新权限'},
  580. {'name': 'permission.edit', 'display_name': '编辑权限', 'resource': 'permission', 'action': 'edit', 'description': '编辑权限信息'},
  581. {'name': 'permission.delete', 'display_name': '删除权限', 'resource': 'permission', 'action': 'delete', 'description': '删除权限'},
  582. # 应用管理权限
  583. {'name': 'app.view', 'display_name': '查看应用', 'resource': 'app', 'action': 'view', 'description': '查看应用列表和详情'},
  584. {'name': 'app.create', 'display_name': '创建应用', 'resource': 'app', 'action': 'create', 'description': '创建OAuth2应用'},
  585. {'name': 'app.edit', 'display_name': '编辑应用', 'resource': 'app', 'action': 'edit', 'description': '编辑应用信息'},
  586. {'name': 'app.delete', 'display_name': '删除应用', 'resource': 'app', 'action': 'delete', 'description': '删除应用'},
  587. {'name': 'app.secret', 'display_name': '查看应用密钥', 'resource': 'app', 'action': 'secret', 'description': '查看应用密钥'},
  588. {'name': 'app.reset_secret', 'display_name': '重置应用密钥', 'resource': 'app', 'action': 'reset_secret', 'description': '重置应用密钥'},
  589. # 系统管理权限
  590. {'name': 'system.view', 'display_name': '查看系统信息', 'resource': 'system', 'action': 'view', 'description': '查看系统信息和统计'},
  591. {'name': 'system.config', 'display_name': '系统配置', 'resource': 'system', 'action': 'config', 'description': '修改系统配置'},
  592. {'name': 'system.log', 'display_name': '查看系统日志', 'resource': 'system', 'action': 'log', 'description': '查看系统操作日志'},
  593. ]
  594. permission_ids = {}
  595. for perm in permissions_data:
  596. perm_id = str(uuid.uuid4())
  597. cursor.execute("""
  598. INSERT INTO permissions (id, name, display_name, resource, action, description, is_active, created_at, updated_at)
  599. VALUES (%s, %s, %s, %s, %s, %s, %s, NOW(), NOW())
  600. """, (perm_id, perm['name'], perm['display_name'], perm['resource'], perm['action'], perm['description'], True))
  601. permission_ids[perm['name']] = perm_id
  602. print(f" ✅ 插入了 {len(permissions_data)} 个权限")
  603. return permission_ids
  604. def assign_role_permissions(cursor, role_ids, permission_ids):
  605. """分配角色权限"""
  606. print("🔗 分配角色权限...")
  607. # 超级管理员拥有所有权限
  608. super_admin_id = role_ids['super_admin']
  609. for perm_name, perm_id in permission_ids.items():
  610. cursor.execute("""
  611. INSERT INTO role_permissions (role_id, permission_id, created_at)
  612. VALUES (%s, %s, NOW())
  613. """, (super_admin_id, perm_id))
  614. # 管理员拥有大部分权限(除了系统配置)
  615. admin_id = role_ids['admin']
  616. admin_permissions = [perm for perm in permission_ids.keys() if not perm.startswith('system.config')]
  617. for perm_name in admin_permissions:
  618. cursor.execute("""
  619. INSERT INTO role_permissions (role_id, permission_id, created_at)
  620. VALUES (%s, %s, NOW())
  621. """, (admin_id, permission_ids[perm_name]))
  622. # 用户管理员只有用户相关权限
  623. user_manager_id = role_ids['user_manager']
  624. user_permissions = [perm for perm in permission_ids.keys() if perm.startswith('user.') or perm.startswith('role.')]
  625. for perm_name in user_permissions:
  626. cursor.execute("""
  627. INSERT INTO role_permissions (role_id, permission_id, created_at)
  628. VALUES (%s, %s, NOW())
  629. """, (user_manager_id, permission_ids[perm_name]))
  630. # 应用管理员只有应用相关权限
  631. app_manager_id = role_ids['app_manager']
  632. app_permissions = [perm for perm in permission_ids.keys() if perm.startswith('app.')]
  633. for perm_name in app_permissions:
  634. cursor.execute("""
  635. INSERT INTO role_permissions (role_id, permission_id, created_at)
  636. VALUES (%s, %s, NOW())
  637. """, (app_manager_id, permission_ids[perm_name]))
  638. print(" ✅ 角色权限分配完成")
  639. def assign_role_menus(cursor, role_ids):
  640. """分配角色菜单"""
  641. print("🔗 分配角色菜单...")
  642. # 获取所有菜单ID
  643. cursor.execute("SELECT id, parent_id FROM menus")
  644. all_menus = cursor.fetchall()
  645. menu_ids = [menu[0] for menu in all_menus]
  646. # 超级管理员和管理员拥有所有菜单
  647. for role_name in ['super_admin', 'admin']:
  648. role_id = role_ids[role_name]
  649. for menu_id in menu_ids:
  650. cursor.execute("""
  651. INSERT INTO role_menus (role_id, menu_id, created_at)
  652. VALUES (%s, %s, NOW())
  653. """, (role_id, menu_id))
  654. # 用户管理员只有基础菜单和用户管理相关菜单
  655. user_manager_id = role_ids['user_manager']
  656. user_manager_menus = [
  657. 'dashboard-menu', 'profile-menu', 'admin-menu', 'admin-dashboard-menu',
  658. 'admin-users-menu', 'admin-roles-menu'
  659. ]
  660. # 添加用户管理相关的按钮权限
  661. cursor.execute("SELECT id FROM menus WHERE parent_id IN ('admin-users-menu', 'admin-roles-menu')")
  662. user_buttons = cursor.fetchall()
  663. user_manager_menus.extend([btn[0] for btn in user_buttons])
  664. for menu_id in user_manager_menus:
  665. cursor.execute("""
  666. INSERT INTO role_menus (role_id, menu_id, created_at)
  667. VALUES (%s, %s, NOW())
  668. """, (user_manager_id, menu_id))
  669. # 应用管理员只有基础菜单和应用管理相关菜单
  670. app_manager_id = role_ids['app_manager']
  671. app_manager_menus = [
  672. 'dashboard-menu', 'profile-menu', 'admin-menu', 'admin-dashboard-menu',
  673. 'admin-apps-menu'
  674. ]
  675. # 添加应用管理相关的按钮权限
  676. cursor.execute("SELECT id FROM menus WHERE parent_id = 'admin-apps-menu'")
  677. app_buttons = cursor.fetchall()
  678. app_manager_menus.extend([btn[0] for btn in app_buttons])
  679. for menu_id in app_manager_menus:
  680. cursor.execute("""
  681. INSERT INTO role_menus (role_id, menu_id, created_at)
  682. VALUES (%s, %s, NOW())
  683. """, (app_manager_id, menu_id))
  684. # 普通用户只有基础菜单
  685. user_id = role_ids['user']
  686. user_menus = ['dashboard-menu', 'profile-menu']
  687. for menu_id in user_menus:
  688. cursor.execute("""
  689. INSERT INTO role_menus (role_id, menu_id, created_at)
  690. VALUES (%s, %s, NOW())
  691. """, (user_id, menu_id))
  692. print(" ✅ 角色菜单分配完成")
  693. def assign_user_roles(cursor, role_ids):
  694. """为现有用户分配角色"""
  695. print("👤 为用户分配角色...")
  696. # 获取admin用户
  697. cursor.execute("SELECT id FROM users WHERE username = 'admin'")
  698. admin_user = cursor.fetchone()
  699. if admin_user:
  700. admin_user_id = admin_user[0]
  701. # 为admin用户分配超级管理员角色
  702. cursor.execute("""
  703. INSERT INTO user_roles (user_id, role_id, is_active, created_at)
  704. VALUES (%s, %s, %s, NOW())
  705. """, (admin_user_id, role_ids['super_admin'], True))
  706. print(f" ✅ 为admin用户分配了超级管理员角色")
  707. # 获取其他用户并分配普通用户角色
  708. cursor.execute("SELECT id, username FROM users WHERE username != 'admin'")
  709. other_users = cursor.fetchall()
  710. for user in other_users:
  711. user_id, username = user
  712. cursor.execute("""
  713. INSERT INTO user_roles (user_id, role_id, is_active, created_at)
  714. VALUES (%s, %s, %s, NOW())
  715. """, (user_id, role_ids['user'], True))
  716. print(f" ✅ 为用户 {username} 分配了普通用户角色")
  717. def reinit_rbac_data():
  718. """重新初始化RBAC数据"""
  719. print("🚀 开始重新初始化RBAC数据")
  720. print("=" * 60)
  721. conn = get_db_connection()
  722. if not conn:
  723. print("❌ 数据库连接失败")
  724. return False
  725. cursor = conn.cursor()
  726. try:
  727. # 1. 清理现有数据
  728. clear_rbac_data(cursor)
  729. # 2. 插入菜单数据
  730. insert_menus(cursor)
  731. # 3. 插入角色数据
  732. role_ids = insert_roles(cursor)
  733. # 4. 插入权限数据
  734. permission_ids = insert_permissions(cursor)
  735. # 5. 分配角色权限
  736. assign_role_permissions(cursor, role_ids, permission_ids)
  737. # 6. 分配角色菜单
  738. assign_role_menus(cursor, role_ids)
  739. # 7. 为用户分配角色
  740. assign_user_roles(cursor, role_ids)
  741. conn.commit()
  742. print("\n" + "=" * 60)
  743. print("🎉 RBAC数据重新初始化完成!")
  744. print("=" * 60)
  745. print("📊 数据统计:")
  746. # 统计数据
  747. cursor.execute("SELECT COUNT(*) FROM menus")
  748. menu_count = cursor.fetchone()[0]
  749. cursor.execute("SELECT COUNT(*) FROM menus WHERE menu_type = 'menu'")
  750. menu_menu_count = cursor.fetchone()[0]
  751. cursor.execute("SELECT COUNT(*) FROM menus WHERE menu_type = 'button'")
  752. button_count = cursor.fetchone()[0]
  753. cursor.execute("SELECT COUNT(*) FROM roles")
  754. role_count = cursor.fetchone()[0]
  755. cursor.execute("SELECT COUNT(*) FROM permissions")
  756. permission_count = cursor.fetchone()[0]
  757. cursor.execute("SELECT COUNT(*) FROM role_permissions")
  758. role_permission_count = cursor.fetchone()[0]
  759. cursor.execute("SELECT COUNT(*) FROM role_menus")
  760. role_menu_count = cursor.fetchone()[0]
  761. cursor.execute("SELECT COUNT(*) FROM user_roles")
  762. user_role_count = cursor.fetchone()[0]
  763. print(f" 📋 菜单总数: {menu_count} (菜单: {menu_menu_count}, 按钮: {button_count})")
  764. print(f" 👥 角色数量: {role_count}")
  765. print(f" 🔐 权限数量: {permission_count}")
  766. print(f" 🔗 角色权限关联: {role_permission_count}")
  767. print(f" 🔗 角色菜单关联: {role_menu_count}")
  768. print(f" 👤 用户角色关联: {user_role_count}")
  769. print("=" * 60)
  770. return True
  771. except Exception as e:
  772. print(f"❌ 初始化失败: {e}")
  773. conn.rollback()
  774. return False
  775. finally:
  776. cursor.close()
  777. conn.close()
  778. def main():
  779. """主函数"""
  780. success = reinit_rbac_data()
  781. if success:
  782. print("\n🎯 重新初始化成功!现在可以测试完整的树形菜单结构了。")
  783. print("💡 建议重启前端服务以刷新菜单缓存。")
  784. else:
  785. print("\n❌ 重新初始化失败!")
  786. if __name__ == "__main__":
  787. main()