@gadmin2n/schematics 0.0.68 → 0.0.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/canvas.prisma +45 -0
  2. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/example.prisma +24 -23
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/system.prisma +93 -90
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Audit.ts +70 -0
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Event.ts +3 -3
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Page.ts +70 -0
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/PageResource.ts +70 -0
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Resource.ts +70 -0
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/RolePages.ts +70 -0
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/RoleResource.ts +70 -0
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/SavedQuery.ts +70 -0
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/User.ts +70 -0
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/readme.md +95 -2
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.eslintrc.js +4 -2
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.prettierignore +7 -1
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/config/index.ts +1 -3
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/gadmin-cli.json +2 -2
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +6 -5
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/lib/page-helpers.ts +157 -0
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/page-manage.ts +290 -0
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/permission-manage.ts +184 -0
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/prismaModels.ts +143 -0
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/sync-resources.ts +100 -0
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/syncDataMngtPages.ts +119 -0
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/index.ts +1 -3
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/permissions.ts +109 -143
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/main.ts +5 -2
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.controller.spec.ts +20 -0
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.controller.ts +81 -0
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.dto.ts +49 -0
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.module.ts +11 -0
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.service.spec.ts +334 -0
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.service.ts +249 -0
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/index.ts +2 -1
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.service.ts +2 -2
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.service.ts +17 -4
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/yarn.lock +7737 -0
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/web/.env +1 -0
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/web/.eslintrc.json +38 -0
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/web/.prettierignore +2 -0
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/web/dev-shell-entry.html +49 -0
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +13 -2
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/App.tsx +137 -111
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/auditLogProvider.ts +46 -44
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/authProvider.ts +32 -12
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/BulkActions.tsx +74 -23
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/ListPageHeader.tsx +9 -9
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/RowActions.tsx +57 -31
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/SearchBar.tsx +53 -24
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/SqlModal.tsx +148 -72
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/AgentContext.tsx +190 -16
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/ElementInspector.tsx +914 -63
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/agentAttributes.ts +17 -8
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/index.ts +0 -10
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/inspectorActions.ts +969 -46
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/pagePathUtils.ts +66 -0
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/promptGenerator.ts +85 -25
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/propPatcher.ts +84 -0
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/eventList/index.tsx +16 -20
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/index.ts +4 -4
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logButton/index.tsx +13 -13
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logList/index.tsx +15 -16
  63. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/modalDiffViewer/index.tsx +15 -15
  64. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/index.tsx +2 -2
  65. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/BarChart/index.tsx +896 -0
  66. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/ChartSwitcher/index.tsx +219 -0
  67. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/ChartViewer/index.tsx +159 -0
  68. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Filter/index.tsx +192 -0
  69. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/LineChart/index.tsx +1034 -0
  70. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumCard/NumCard.module.css +8 -0
  71. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumCard/index.tsx +509 -0
  72. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumLineCard/index.tsx +66 -0
  73. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/PieChart/index.tsx +552 -0
  74. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/RadarChart/index.tsx +263 -0
  75. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Section/index.tsx +35 -0
  76. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Table/index.tsx +207 -0
  77. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/TreemapChart/index.tsx +382 -0
  78. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/WorldMap/index.tsx +135 -0
  79. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/chart-constants.ts +53 -0
  80. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/icon/InfoIcon.tsx +8 -0
  81. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/icon/index.ts +1 -0
  82. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/config.ts +31 -0
  83. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/nameMap.json +9 -0
  84. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/world.geo.json +39349 -0
  85. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/metric-info-tooltip/index.tsx +19 -0
  86. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/business/index.tsx +12 -12
  87. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/index.tsx +22 -26
  88. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/custom-avatar.tsx +13 -9
  89. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/index.ts +4 -4
  90. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +22 -37
  91. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/index.ts +4 -4
  92. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/layout.tsx +10 -10
  93. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/logo.tsx +1 -1
  94. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +113 -65
  95. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/title.tsx +14 -14
  96. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/offLayoutArea/index.tsx +1 -1
  97. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/pagination-total.tsx +2 -2
  98. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/tags/index.ts +1 -1
  99. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/tags/role-tag.tsx +21 -21
  100. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/text.tsx +17 -13
  101. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/http.ts +26 -5
  102. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +221 -51
  103. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +3 -3
  104. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddDataModal.tsx +199 -0
  105. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddPageModal.tsx +335 -0
  106. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DeleteDataConfirm.tsx +56 -0
  107. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +401 -0
  108. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/EditDataModal.tsx +129 -0
  109. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/SkillMenu.tsx +202 -0
  110. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/UndoConfirm.tsx +36 -0
  111. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/index.tsx +8 -0
  112. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/style.css +835 -0
  113. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/enums/audit-log.enum.ts +8 -8
  114. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/enums/index.ts +1 -1
  115. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/form.tsx +120 -70
  116. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/get-name-initials.ts +3 -3
  117. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/get-random-color.ts +11 -11
  118. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/http.ts +16 -19
  119. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/index.tsx +1 -1
  120. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +99 -73
  121. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/login.ts +22 -27
  122. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/page-tree.ts +74 -0
  123. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/show.tsx +95 -51
  124. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/utils.tsx +7 -3
  125. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/types.ts +15 -15
  126. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchDelete.ts +10 -10
  127. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchOperations.ts +8 -7
  128. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchOperationsCore.ts +10 -10
  129. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchUpdate.ts +10 -10
  130. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +36 -27
  131. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useECharts.tsx +144 -0
  132. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useFetchData.ts +4 -4
  133. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useListPageState.ts +34 -34
  134. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useRoles.ts +8 -4
  135. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useRowSelection.ts +1 -1
  136. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useUserPageAccess.ts +55 -41
  137. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/i18n.ts +8 -8
  138. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/index.tsx +9 -2
  139. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +193 -0
  140. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +194 -0
  141. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +81 -0
  142. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.tsx +37 -37
  143. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/create.tsx +23 -31
  144. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/edit.tsx +34 -35
  145. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.ts +1 -1
  146. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.tsx +4 -6
  147. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/list.tsx +41 -34
  148. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/show.tsx +33 -20
  149. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasCell.tsx +87 -0
  150. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasEditPage.tsx +192 -0
  151. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +409 -0
  152. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +1372 -0
  153. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasToolbar.tsx +384 -0
  154. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CodeFloatWindow.tsx +476 -0
  155. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/ComponentThumbnail.tsx +135 -0
  156. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/IsolatedLivePreview.tsx +101 -0
  157. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/LivePreview.tsx +236 -0
  158. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/PublishModal.tsx +200 -0
  159. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasApi.ts +92 -0
  160. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasConfigRegistry.tsx +25 -0
  161. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasContextMenuRegistry.tsx +875 -0
  162. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasDefaults.ts +126 -0
  163. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasI18n.ts +11 -0
  164. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/BarChartDataSourceModal.tsx +115 -0
  165. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/ChartViewerConfigModal.tsx +217 -0
  166. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/LineChartDataSourceModal.tsx +153 -0
  167. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/NumCardDataSourceModal.tsx +211 -0
  168. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/PromptModal.tsx +90 -0
  169. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/RadarChartDataSourceModal.tsx +87 -0
  170. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableDataSourceModal.tsx +204 -0
  171. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/demos.ts +1153 -0
  172. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/index.tsx +2 -0
  173. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/sectionCompactor.ts +45 -0
  174. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/types.ts +45 -0
  175. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas-page/index.tsx +108 -0
  176. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/create.tsx +105 -0
  177. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/edit.tsx +121 -0
  178. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/index.tsx +4 -0
  179. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/list.tsx +237 -0
  180. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/show.tsx +74 -0
  181. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/AssignRolesModal.tsx +29 -20
  182. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/CreatePageModal.tsx +3 -3
  183. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/EditPageModal.tsx +7 -3
  184. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/PageDetailDrawer.tsx +58 -23
  185. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/PageFormModal.tsx +206 -122
  186. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/hooks/usePageManagement.ts +8 -4
  187. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/index.ts +1 -1
  188. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/list.tsx +345 -190
  189. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/types.ts +1 -1
  190. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/permissionReadme/index.tsx +341 -340
  191. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/CreateModal.tsx +2 -2
  192. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/EditModal.tsx +2 -2
  193. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/ResourceDetailDrawer.tsx +41 -24
  194. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/modal.tsx +64 -36
  195. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/index.ts +2 -2
  196. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/list.tsx +78 -40
  197. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/CreateModal.tsx +3 -3
  198. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/EditModal.tsx +4 -4
  199. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/RoleDetailDrawer.tsx +19 -9
  200. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/modal.tsx +45 -47
  201. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/hooks/useRolePage.ts +4 -4
  202. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/index.ts +1 -1
  203. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/list.tsx +121 -147
  204. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/types.ts +1 -1
  205. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/create-modal.tsx +2 -2
  206. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/edit-modal.tsx +2 -2
  207. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/form-modal.tsx +25 -19
  208. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/index.ts +5 -5
  209. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/role-tag.tsx +10 -10
  210. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/show-drawer.tsx +31 -26
  211. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/index.ts +1 -1
  212. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/list.tsx +76 -71
  213. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/setupTests.ts +1 -1
  214. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/audit-log.ts +1 -1
  215. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/index.ts +3 -3
  216. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/role.ts +1 -1
  217. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/user.ts +1 -1
  218. package/dist/lib/application/files/gadmin2-game-angle-demo/web/vite.config.ts +42 -25
  219. package/dist/lib/application/files/gadmin2-game-angle-demo/web/yarn.lock +1193 -32
  220. package/package.json +1 -1
  221. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/seedDataMngtPages.ts +0 -258
  222. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/AgentPanel.tsx +0 -497
  223. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/skills.ts +0 -464
@@ -0,0 +1,100 @@
1
+ /**
2
+ * sync-resources.ts
3
+ *
4
+ * Syncs all non-system Prisma business models as Resource records into the
5
+ * `t_resource` table.
6
+ * - Reads business models from config/prisma/ via readPrismaModels() (excludes
7
+ * system.prisma and models annotated with @IgnoreReactCode).
8
+ * - Uses `upsert` (where: { code }) so it is idempotent and safe to re-run.
9
+ * - Only inserts when the resource does not yet exist; existing records are left
10
+ * untouched (update: {}) to preserve any manual edits.
11
+ *
12
+ * Invoked automatically by `postgenerate:dev` in server/package.json after
13
+ * `generate:dev` (migrate + prisma generate) completes.
14
+ */
15
+
16
+ import { PrismaClient } from '@prisma/client';
17
+ import { readPrismaModels } from './prismaModels';
18
+
19
+ const prisma = new PrismaClient();
20
+
21
+ async function main() {
22
+ const businessModels = readPrismaModels();
23
+
24
+ console.log(
25
+ `[sync-resources] Found ${
26
+ businessModels.length
27
+ } business model(s) to sync: [${businessModels
28
+ .map((m) => m.name)
29
+ .join(', ')}]`,
30
+ );
31
+
32
+ let inserted = 0;
33
+ let skipped = 0;
34
+
35
+ for (const model of businessModels) {
36
+ const code = model.code;
37
+ const modelName = model.name;
38
+
39
+ const result = await prisma.resource.upsert({
40
+ where: { code },
41
+ // Already exists → leave it as-is (preserve any manual name / description edits)
42
+ update: {},
43
+ create: {
44
+ code,
45
+ name: code,
46
+ description: `${modelName} resource (auto-synced by sync-resources)`,
47
+ isCommonResource: false,
48
+ },
49
+ });
50
+
51
+ // Detect whether the record was just created or already existed.
52
+ // upsert does not expose a "created" flag, so we compare timestamps.
53
+ const wasCreated =
54
+ Math.abs(result.createdAt.getTime() - result.updatedAt.getTime()) < 1000;
55
+
56
+ if (wasCreated) {
57
+ inserted++;
58
+ console.log(
59
+ `[sync-resources] ✚ Created Resource: ${code} (id=${result.id})`,
60
+ );
61
+
62
+ // Write audit log for newly created resources; failure must not abort the main flow.
63
+ try {
64
+ await prisma.audit.create({
65
+ data: {
66
+ creator: 'system',
67
+ authorId: 'system',
68
+ authorName: 'sync-resources',
69
+ action: 'create',
70
+ resource: code,
71
+ resourceId: String(result.id),
72
+ data: JSON.stringify({ code, name: code }),
73
+ previousData: null,
74
+ },
75
+ });
76
+ } catch (auditErr) {
77
+ console.warn(
78
+ `[sync-resources] ⚠ Failed to write audit log for Resource "${code}":`,
79
+ auditErr,
80
+ );
81
+ }
82
+ } else {
83
+ skipped++;
84
+ console.log(
85
+ `[sync-resources] · Exists Resource: ${code} (id=${result.id}) — skipped`,
86
+ );
87
+ }
88
+ }
89
+
90
+ console.log(
91
+ `[sync-resources] ✅ Done. inserted=${inserted}, already-existed=${skipped} (total=${businessModels.length})`,
92
+ );
93
+ }
94
+
95
+ main()
96
+ .catch((e) => {
97
+ console.error('[sync-resources] Fatal error:', e);
98
+ process.exit(1);
99
+ })
100
+ .finally(() => prisma.$disconnect());
@@ -0,0 +1,119 @@
1
+ import { PrismaClient } from '@prisma/client';
2
+ import {
3
+ bindResourceToPage,
4
+ getPageResourceIds,
5
+ grantRoleAccess,
6
+ upsertPage,
7
+ } from './lib/page-helpers';
8
+ import { readPrismaModels } from './prismaModels';
9
+
10
+ // ─── Main Seed Function ───────────────────────────────────────────────────────
11
+
12
+ /**
13
+ * For every non-system Prisma model found in config/prisma/ (excluding system.prisma):
14
+ *
15
+ * 1. Upsert a Resource record (resource.code = camelCase model name)
16
+ * 2. Upsert a Page record (parent = dataMngt, path = /admin/data-mngt/<slug>)
17
+ * 3. Upsert a PageResource link (page ↔ resource, full actions)
18
+ * 4. Upsert a RolePages record (SYSTEM_ADMIN → page)
19
+ * 5. Upsert a RoleResource record (SYSTEM_ADMIN → resource, full actions)
20
+ *
21
+ * Safe to re-run — every write uses upsert / skipDuplicates.
22
+ * Depends on seedPermissions() having already created SYSTEM_ADMIN role and dataMngt page.
23
+ */
24
+ export async function seedDataMngtPages(prisma: PrismaClient): Promise<void> {
25
+ const models = readPrismaModels();
26
+
27
+ if (models.length === 0) {
28
+ console.log(
29
+ '[seedDataMngtPages] No non-system models found — nothing to seed.',
30
+ );
31
+ return;
32
+ }
33
+
34
+ // ── Anchors ────────────────────────────────────────────────────────────────
35
+ // Auto-bootstrap: if seed/index.ts has never been run (e.g. fresh DB),
36
+ // run the full seed pipeline now (users + permissions + pages).
37
+ const existingRole = await prisma.role.findUnique({
38
+ where: { name: 'SYSTEM_ADMIN' },
39
+ });
40
+ if (!existingRole) {
41
+ console.log(
42
+ '[seedDataMngtPages] SYSTEM_ADMIN not found — running full seed (index.ts) first…',
43
+ );
44
+ const { main } = await import('../seed/index');
45
+ await main();
46
+ // main() already calls seedDataMngtPages, so we're done.
47
+ return;
48
+ }
49
+
50
+ const systemAdminRole = existingRole;
51
+
52
+ const dataMngtPage = await prisma.page.findUnique({
53
+ where: { code: 'dataMngt' },
54
+ });
55
+ if (!dataMngtPage) {
56
+ console.error(
57
+ '[seedDataMngtPages] dataMngt page still missing after seed. Aborting.',
58
+ );
59
+ return;
60
+ }
61
+
62
+ // ── Process models ─────────────────────────────────────────────────────────
63
+ for (const [index, model] of models.entries()) {
64
+ console.log(`[seedDataMngtPages] ── ${model.name} ──`);
65
+
66
+ const pagePath = `/admin/data-mngt/${model.slug}`;
67
+
68
+ // 1 + 2 + 3: Upsert page, resource, and PageResource link
69
+ const page = await upsertPage(
70
+ prisma,
71
+ {
72
+ code: model.code,
73
+ name: model.name,
74
+ sortOrder: 2000 + index * 10,
75
+ parentId: dataMngtPage.id,
76
+ path: pagePath,
77
+ },
78
+ { path: pagePath }, // keep path in sync with model name on update
79
+ );
80
+ console.log(
81
+ `[seedDataMngtPages] Page upserted: ${page.code} → ${pagePath} (id=${page.id})`,
82
+ );
83
+
84
+ const resource = await bindResourceToPage(
85
+ prisma,
86
+ page.id,
87
+ model.code,
88
+ `${model.name} resource (auto-generated by seedDataMngtPages)`,
89
+ );
90
+ console.log(
91
+ `[seedDataMngtPages] Resource + PageResource upserted: ${resource.code} (id=${resource.id})`,
92
+ );
93
+
94
+ // 4 + 5: Grant SYSTEM_ADMIN access to this page and resource
95
+ const resourceIds = await getPageResourceIds(prisma, page.id);
96
+ await grantRoleAccess(prisma, systemAdminRole.id, page.id, resourceIds);
97
+ console.log(
98
+ `[seedDataMngtPages] RolePages + RoleResource upserted: SYSTEM_ADMIN → ${page.code}`,
99
+ );
100
+ }
101
+
102
+ console.log(
103
+ `[seedDataMngtPages] ✅ Done. Seeded ${models.length} model(s) under /admin/data-mngt.`,
104
+ );
105
+ }
106
+
107
+ // ─── Standalone Entry Point ───────────────────────────────────────────────────
108
+ // Called directly by `postgenerate:dev` (via ts-node), NOT by seed/index.ts.
109
+
110
+ if (require.main === module) {
111
+ const prisma = new PrismaClient();
112
+
113
+ seedDataMngtPages(prisma)
114
+ .catch((e) => {
115
+ console.error('[seedDataMngtPages] Fatal error:', e);
116
+ process.exit(1);
117
+ })
118
+ .finally(() => prisma.$disconnect());
119
+ }
@@ -1,14 +1,12 @@
1
1
  import { PrismaClient } from '@prisma/client';
2
- import users from './users';
3
2
  import { seedPermissions } from './permissions';
4
- import { seedDataMngtPages } from './seedDataMngtPages';
3
+ import users from './users';
5
4
 
6
5
  const prisma = new PrismaClient();
7
6
 
8
7
  export async function main() {
9
8
  await prisma.user.createMany({ data: users, skipDuplicates: true });
10
9
  await seedPermissions(prisma);
11
- await seedDataMngtPages(prisma);
12
10
  }
13
11
 
14
12
  if (require.main === module) {
@@ -1,6 +1,10 @@
1
1
  import { PrismaClient } from '@prisma/client';
2
-
3
- const FULL_ACTIONS = ['createAny', 'readAny', 'updateAny', 'deleteAny'];
2
+ import {
3
+ bindResourceToPage,
4
+ FULL_ACTIONS,
5
+ upsertPage,
6
+ upsertResource,
7
+ } from '../scripts/lib/page-helpers';
4
8
 
5
9
  /**
6
10
  * Seed permission-related tables so that the SYSTEM_ADMIN role is recognised
@@ -11,6 +15,13 @@ const FULL_ACTIONS = ['createAny', 'readAny', 'updateAny', 'deleteAny'];
11
15
  * - config/prisma/page.prisma → role, page, resource resources
12
16
  *
13
17
  * Safe to re-run: every write uses upsert / createMany + skipDuplicates.
18
+ *
19
+ * Data model (single source of truth):
20
+ * resourceDefs[].pageCode — which page "owns" this resource.
21
+ * • undefined → pure system resource, no page binding (currently unused)
22
+ * • string → creates a t_page_resource row linking the resource to that page
23
+ * Multiple resources can share the same pageCode (e.g. rolePages + roleResource
24
+ * both belong to the 'role' page because that page's UI calls both APIs).
14
25
  */
15
26
  export async function seedPermissions(prisma: PrismaClient) {
16
27
  // ------------------------------------------------------------------ Role --
@@ -25,74 +36,89 @@ export async function seedPermissions(prisma: PrismaClient) {
25
36
  console.log(`[seed] Role: SYSTEM_ADMIN (id=${systemAdminRole.id})`);
26
37
 
27
38
  // --------------------------------------------------------------- Resources -
28
- // Resource.name is used as the resource identifier in @UseRoles({ resource: '...' })
29
- // Resource.code is a unique slug (same value used here)
30
- const resourceDefs = [
31
- // from default-schema.prisma
32
- { code: 'user', name: 'user', description: 'User management' },
33
- { code: 'audit', name: 'audit', description: 'Audit logs' },
34
- // from page.prisma
35
- { code: 'role', name: 'role', description: 'Role management' },
36
- { code: 'page', name: 'page', description: 'Page / menu management' },
37
- { code: 'resource', name: 'resource', description: 'Resource management' },
38
- // junction-table modules (page.prisma)
39
- { code: 'rolePages', name: 'rolePages', description: 'Role-page assignments' },
40
- { code: 'roleResource', name: 'roleResource', description: 'Role-resource grants' },
41
- { code: 'pageResource', name: 'pageResource', description: 'Page-resource configuration' },
42
- // business
43
- { code: 'game', name: 'game', description: 'Business / Game management' },
39
+ // pageCode: which leaf page "owns" this resource (drives t_page_resource rows).
40
+ const resourceDefs: {
41
+ code: string;
42
+ description: string;
43
+ pageCode?: string;
44
+ }[] = [
45
+ // ── permission module ────────────────────────────────────────────────────
46
+ { code: 'user', description: 'User management', pageCode: 'user' },
47
+ { code: 'role', description: 'Role management', pageCode: 'role' },
48
+ {
49
+ code: 'rolePages',
50
+ description: 'Role-page assignments',
51
+ pageCode: 'role',
52
+ },
53
+ {
54
+ code: 'roleResource',
55
+ description: 'Role-resource grants',
56
+ pageCode: 'role',
57
+ },
58
+ { code: 'page', description: 'Page / menu management', pageCode: 'page' },
59
+ {
60
+ code: 'pageResource',
61
+ description: 'Page-resource configuration',
62
+ pageCode: 'page',
63
+ },
64
+ {
65
+ code: 'resource',
66
+ description: 'Resource management',
67
+ pageCode: 'resource',
68
+ },
69
+ { code: 'audit', description: 'Audit logs', pageCode: 'audits' },
70
+ // ── business module ──────────────────────────────────────────────────────
71
+ {
72
+ code: 'game',
73
+ description: 'Business / Game management',
74
+ pageCode: 'game',
75
+ },
76
+ { code: 'canvas', description: 'Canvas management', pageCode: 'canvas' },
44
77
  ];
45
78
 
46
- const resources: { id: number; name: string }[] = [];
79
+ const resources: { id: number; code: string }[] = [];
47
80
  for (const def of resourceDefs) {
48
- const r = await prisma.resource.upsert({
49
- where: { code: def.code },
50
- update: {},
51
- create: {
52
- code: def.code,
53
- name: def.name,
54
- description: def.description,
55
- isCommonResource: false,
56
- },
57
- });
58
- resources.push({ id: r.id, name: r.name });
59
- console.log(`[seed] Resource: ${r.name} (id=${r.id})`);
81
+ const r = await upsertResource(prisma, def.code, def.description);
82
+ resources.push({ id: r.id, code: r.code });
83
+ console.log(`[seed] Resource: ${r.code} (id=${r.id})`);
60
84
  }
61
85
 
62
86
  // ------------------------------------------------------------------ Pages --
63
- // Pages are created in order (parent first) so that parentId can be resolved.
87
+ // Created in order (parent first) so that parentId can be resolved.
64
88
 
65
89
  const pages: { id: number; code: string }[] = [];
66
90
 
67
91
  // Level 1: top-level group (系统管理)
68
- const adminPage = await prisma.page.upsert({
69
- where: { code: 'admin' },
70
- update: {}, // preserve user edits (name, sortOrder, etc.)
71
- create: {
72
- code: 'admin',
73
- name: '系统管理',
74
- zhName: '系统管理',
75
- enName: 'System Management',
76
- isVirtual: false,
77
- sortOrder: 1000,
78
- },
92
+ const adminPage = await upsertPage(prisma, {
93
+ code: 'admin',
94
+ name: 'admin',
95
+ zhName: '系统管理',
96
+ enName: 'System Mgnt',
97
+ sortOrder: 1000,
79
98
  });
80
99
  pages.push({ id: adminPage.id, code: adminPage.code });
81
100
  console.log(`[seed] Page: ${adminPage.code} (id=${adminPage.id})`);
82
101
 
102
+ // Level 2: 数据管理 — child of admin
103
+ const dataMngt = await upsertPage(prisma, {
104
+ code: 'dataMngt',
105
+ name: '数据管理',
106
+ zhName: '数据管理',
107
+ enName: 'Data Management',
108
+ sortOrder: 1000,
109
+ parentId: adminPage.id,
110
+ });
111
+ pages.push({ id: dataMngt.id, code: dataMngt.code });
112
+ console.log(`[seed] Page: ${dataMngt.code} (id=${dataMngt.id})`);
113
+
83
114
  // Level 2: permission group (权限管理) — child of admin
84
- const permissionPage = await prisma.page.upsert({
85
- where: { code: 'permission' },
86
- update: {}, // preserve user edits
87
- create: {
88
- code: 'permission',
89
- name: '权限管理',
90
- zhName: '权限管理',
91
- enName: 'Permission Management',
92
- isVirtual: false,
93
- sortOrder: 1000,
94
- parentId: adminPage.id,
95
- },
115
+ const permissionPage = await upsertPage(prisma, {
116
+ code: 'permission',
117
+ name: 'permission',
118
+ zhName: '权限管理',
119
+ enName: 'Permission Mgnt',
120
+ sortOrder: 1010,
121
+ parentId: adminPage.id,
96
122
  });
97
123
  pages.push({ id: permissionPage.id, code: permissionPage.code });
98
124
  console.log(`[seed] Page: ${permissionPage.code} (id=${permissionPage.id})`);
@@ -101,35 +127,35 @@ export async function seedPermissions(prisma: PrismaClient) {
101
127
  const permissionChildDefs = [
102
128
  {
103
129
  code: 'permission_readme',
104
- name: '菜单指引',
130
+ name: 'permission_readme',
105
131
  zhName: '菜单指引',
106
132
  enName: 'Menu Guide',
107
133
  sortOrder: 1005,
108
134
  },
109
135
  {
110
136
  code: 'user',
111
- name: '用户管理',
137
+ name: 'user',
112
138
  zhName: '用户管理',
113
- enName: 'User Management',
139
+ enName: 'User Mgnt',
114
140
  sortOrder: 1010,
115
141
  },
116
142
  {
117
143
  code: 'role',
118
- name: '角色管理',
144
+ name: 'role',
119
145
  zhName: '角色管理',
120
- enName: 'Role Management',
146
+ enName: 'Role Mgnt',
121
147
  sortOrder: 1020,
122
148
  },
123
149
  {
124
150
  code: 'page',
125
- name: '页面管理',
151
+ name: 'page',
126
152
  zhName: '页面管理',
127
- enName: 'Page Management',
153
+ enName: 'Page Mgnt',
128
154
  sortOrder: 1030,
129
155
  },
130
156
  {
131
157
  code: 'resource',
132
- name: '资源管理',
158
+ name: 'resource',
133
159
  zhName: '资源管理',
134
160
  enName: 'Resource Management',
135
161
  sortOrder: 1040,
@@ -137,117 +163,57 @@ export async function seedPermissions(prisma: PrismaClient) {
137
163
  ];
138
164
 
139
165
  for (const def of permissionChildDefs) {
140
- const p = await prisma.page.upsert({
141
- where: { code: def.code },
142
- update: {}, // preserve user edits (name, sortOrder, parentId)
143
- create: {
144
- code: def.code,
145
- name: def.name,
146
- zhName: def.zhName,
147
- enName: def.enName,
148
- isVirtual: false,
149
- sortOrder: def.sortOrder,
150
- parentId: permissionPage.id,
151
- },
152
- });
166
+ const p = await upsertPage(prisma, { ...def, parentId: permissionPage.id });
153
167
  pages.push({ id: p.id, code: p.code });
154
168
  console.log(`[seed] Page: ${p.code} (id=${p.id})`);
155
169
  }
156
170
 
157
- // Level 2: 数据管理 — child of admin
158
- const dataMngt = await prisma.page.upsert({
159
- where: { code: 'dataMngt' },
160
- update: {}, // preserve user edits
161
- create: {
162
- code: 'dataMngt',
163
- name: '数据管理',
164
- zhName: '数据管理',
165
- enName: 'Data Management',
166
- isVirtual: false,
167
- sortOrder: 1010,
168
- parentId: adminPage.id,
169
- },
170
- });
171
- pages.push({ id: dataMngt.id, code: dataMngt.code });
172
- console.log(`[seed] Page: ${dataMngt.code} (id=${dataMngt.id})`);
173
-
174
171
  // Level 2: other top-level children of admin (业务、审计日志)
175
172
  const adminChildDefs = [
173
+ {
174
+ code: 'canvas',
175
+ name: 'canvas',
176
+ zhName: 'Canvas',
177
+ enName: 'Canvas',
178
+ sortOrder: 1005,
179
+ },
176
180
  {
177
181
  code: 'game',
178
- name: '业务',
179
- zhName: '业务',
180
- enName: 'Business',
181
- isVirtual: false,
182
+ name: 'game',
183
+ zhName: '业务管理',
184
+ enName: 'Business Mgnt',
182
185
  sortOrder: 1050,
183
186
  },
184
187
  {
185
188
  code: 'audits',
186
- name: '审计日志',
189
+ name: 'audits',
187
190
  zhName: '审计日志',
188
191
  enName: 'Audit Log',
189
- isVirtual: false,
190
192
  sortOrder: 1060,
191
193
  },
192
194
  ];
193
195
 
194
196
  for (const def of adminChildDefs) {
195
- const p = await prisma.page.upsert({
196
- where: { code: def.code },
197
- update: {}, // preserve user edits (name, sortOrder, parentId)
198
- create: {
199
- code: def.code,
200
- name: def.name,
201
- zhName: def.zhName,
202
- enName: def.enName,
203
- isVirtual: def.isVirtual,
204
- sortOrder: def.sortOrder,
205
- parentId: adminPage.id,
206
- },
207
- });
197
+ const p = await upsertPage(prisma, { ...def, parentId: adminPage.id });
208
198
  pages.push({ id: p.id, code: p.code });
209
199
  console.log(`[seed] Page: ${p.code} (id=${p.id})`);
210
200
  }
211
201
 
212
202
  // ------------------------------------------------------- PageResource links -
213
- // Each leaf page that directly corresponds to a resource must have a
214
- // PageResource record so that the permission-sync mechanism works correctly
215
- // (Role → Page → PageResource → Resource).
216
- //
217
- // Mapping: page.code → resource.code (same value where they match)
218
- const pageResourceMappings: { pageCode: string; resourceCode: string }[] = [
219
- { pageCode: 'user', resourceCode: 'user' },
220
- { pageCode: 'role', resourceCode: 'role' },
221
- { pageCode: 'page', resourceCode: 'page' },
222
- { pageCode: 'resource', resourceCode: 'resource' },
223
- { pageCode: 'audits', resourceCode: 'audit' },
224
- { pageCode: 'game', resourceCode: 'game' },
225
- ];
226
-
227
- for (const mapping of pageResourceMappings) {
228
- const targetPage = pages.find((p) => p.code === mapping.pageCode);
229
- const targetResource = resources.find((r) => r.name === mapping.resourceCode);
203
+ for (const def of resourceDefs) {
204
+ if (!def.pageCode) continue;
230
205
 
231
- if (!targetPage || !targetResource) {
206
+ const targetPage = pages.find((p) => p.code === def.pageCode);
207
+ if (!targetPage) {
232
208
  console.warn(
233
- `[seed] PageResource: skipping ${mapping.pageCode} ${mapping.resourceCode} (not found)`,
209
+ `[seed] PageResource: page "${def.pageCode}" not found — skipping ${def.code}`,
234
210
  );
235
211
  continue;
236
212
  }
237
213
 
238
- await prisma.pageResource.upsert({
239
- where: {
240
- pageId_resourceId: { pageId: targetPage.id, resourceId: targetResource.id },
241
- },
242
- update: { actions: FULL_ACTIONS },
243
- create: {
244
- pageId: targetPage.id,
245
- resourceId: targetResource.id,
246
- actions: FULL_ACTIONS,
247
- },
248
- });
214
+ await bindResourceToPage(prisma, targetPage.id, def.code, def.description);
249
215
  console.log(
250
- `[seed] PageResource: page(${targetPage.code}) ↔ resource(${targetResource.name})`,
216
+ `[seed] PageResource: page(${def.pageCode}) ↔ resource(${def.code})`,
251
217
  );
252
218
  }
253
219
 
@@ -1,8 +1,11 @@
1
- // eslint-disable-next-line import/order
2
1
  import './lib/tracing'; // OpenTelemetry Prisma instrumentation - 必须第一个导入
3
2
 
4
3
  import { AllExceptionsFilter, UserType } from '@gadmin2n/nest-common';
5
- import { ClassSerializerInterceptor, UnauthorizedException, ValidationPipe } from '@nestjs/common';
4
+ import {
5
+ ClassSerializerInterceptor,
6
+ UnauthorizedException,
7
+ ValidationPipe,
8
+ } from '@nestjs/common';
6
9
  import './alias.config';
7
10
 
8
11
  import { ConfigService } from '@nestjs/config';
@@ -0,0 +1,20 @@
1
+ import { Test, TestingModule } from '@nestjs/testing';
2
+ import { CanvasController } from './canvas.controller';
3
+ import { CanvasService } from './canvas.service';
4
+
5
+ describe('CanvasController', () => {
6
+ let controller: CanvasController;
7
+
8
+ beforeEach(async () => {
9
+ const module: TestingModule = await Test.createTestingModule({
10
+ controllers: [CanvasController],
11
+ providers: [CanvasService],
12
+ }).compile();
13
+
14
+ controller = module.get<CanvasController>(CanvasController);
15
+ });
16
+
17
+ it('should be defined', () => {
18
+ expect(controller).toBeDefined();
19
+ });
20
+ });