@gadmin2n/schematics 0.0.70 → 0.0.71

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 (474) hide show
  1. package/dist/lib/application/files/gadmin2-game-angle-demo/web/.npmrc +1 -0
  2. package/package.json +1 -1
  3. package/src/lib/application/application.schema.d.ts +59 -0
  4. package/src/lib/application/files/gadmin2-game-angle-demo/.dockerignore +33 -0
  5. package/src/lib/application/files/gadmin2-game-angle-demo/.gitignore +46 -0
  6. package/src/lib/application/files/gadmin2-game-angle-demo/.husky/_/.gitignore +1 -0
  7. package/src/lib/application/files/gadmin2-game-angle-demo/.husky/_/husky.sh +36 -0
  8. package/src/lib/application/files/gadmin2-game-angle-demo/.husky/pre-commit +10 -0
  9. package/src/lib/application/files/gadmin2-game-angle-demo/Dockerfile +63 -0
  10. package/src/lib/application/files/gadmin2-game-angle-demo/Jenkinsfile +70 -0
  11. package/src/lib/application/files/gadmin2-game-angle-demo/config/.types.d.ts +143 -0
  12. package/src/lib/application/files/gadmin2-game-angle-demo/config/prisma/canvas.prisma +45 -0
  13. package/src/lib/application/files/gadmin2-game-angle-demo/config/prisma/example.prisma +34 -0
  14. package/src/lib/application/files/gadmin2-game-angle-demo/config/prisma/system.prisma +173 -0
  15. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/Audit.ts +70 -0
  16. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/Event.ts +70 -0
  17. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/Game.ts +58 -0
  18. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/ITActivityDay.ts +70 -0
  19. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/Log.ts +56 -0
  20. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/Page.ts +70 -0
  21. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/PageResource.ts +70 -0
  22. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/Resource.ts +70 -0
  23. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/Role.ts +58 -0
  24. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/RolePages.ts +70 -0
  25. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/RoleResource.ts +70 -0
  26. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/SavedQuery.ts +70 -0
  27. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/User.ts +70 -0
  28. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/_common.ts +16 -0
  29. package/src/lib/application/files/gadmin2-game-angle-demo/readme.md +142 -0
  30. package/src/lib/application/files/gadmin2-game-angle-demo/server/.env +31 -0
  31. package/src/lib/application/files/gadmin2-game-angle-demo/server/.env.local +1 -0
  32. package/src/lib/application/files/gadmin2-game-angle-demo/server/.eslintrc.js +28 -0
  33. package/src/lib/application/files/gadmin2-game-angle-demo/server/.prettierignore +7 -0
  34. package/src/lib/application/files/gadmin2-game-angle-demo/server/.prettierrc +4 -0
  35. package/src/lib/application/files/gadmin2-game-angle-demo/server/README.md +55 -0
  36. package/src/lib/application/files/gadmin2-game-angle-demo/server/config/ac.config.ts +24 -0
  37. package/src/lib/application/files/gadmin2-game-angle-demo/server/config/index.ts +58 -0
  38. package/src/lib/application/files/gadmin2-game-angle-demo/server/gadmin-cli.json +25 -0
  39. package/src/lib/application/files/gadmin2-game-angle-demo/server/migrate-between-pg-schemas.js +1232 -0
  40. package/src/lib/application/files/gadmin2-game-angle-demo/server/package.json +143 -0
  41. package/src/lib/application/files/gadmin2-game-angle-demo/server/prisma/.generator.prisma +34 -0
  42. package/src/lib/application/files/gadmin2-game-angle-demo/server/prisma.config.ts +16 -0
  43. package/src/lib/application/files/gadmin2-game-angle-demo/server/scripts/lib/page-helpers.ts +157 -0
  44. package/src/lib/application/files/gadmin2-game-angle-demo/server/scripts/page-manage.ts +290 -0
  45. package/src/lib/application/files/gadmin2-game-angle-demo/server/scripts/permission-manage.ts +184 -0
  46. package/src/lib/application/files/gadmin2-game-angle-demo/server/scripts/prismaModels.ts +143 -0
  47. package/src/lib/application/files/gadmin2-game-angle-demo/server/scripts/sync-resources.ts +100 -0
  48. package/src/lib/application/files/gadmin2-game-angle-demo/server/scripts/syncDataMngtPages.ts +119 -0
  49. package/src/lib/application/files/gadmin2-game-angle-demo/server/seed/games.ts +1 -0
  50. package/src/lib/application/files/gadmin2-game-angle-demo/server/seed/index.ts +21 -0
  51. package/src/lib/application/files/gadmin2-game-angle-demo/server/seed/permissions.ts +244 -0
  52. package/src/lib/application/files/gadmin2-game-angle-demo/server/seed/users.ts +7 -0
  53. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/alias.config.ts +7 -0
  54. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/app.controller.spec.ts +22 -0
  55. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/app.controller.ts +192 -0
  56. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/app.module.ts +91 -0
  57. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/app.service.ts +189 -0
  58. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/lib/auth.guard.ts +154 -0
  59. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/lib/http-cache.interceptor.ts +21 -0
  60. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/lib/logger.ts +19 -0
  61. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/lib/roles.guard.ts +47 -0
  62. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/lib/safe-log.util.ts +176 -0
  63. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/lib/taihu.ts +175 -0
  64. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/lib/tracing.ts +174 -0
  65. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/lib/trim.pipe.ts +51 -0
  66. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/lib/utils.ts +145 -0
  67. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/lib/woaAuth.ts +95 -0
  68. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/main.ts +132 -0
  69. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.controller.spec.ts +20 -0
  70. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.controller.ts +190 -0
  71. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.module.ts +10 -0
  72. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.service.spec.ts +338 -0
  73. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.service.ts +83 -0
  74. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.controller.spec.ts +20 -0
  75. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.controller.ts +81 -0
  76. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.dto.ts +49 -0
  77. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.module.ts +11 -0
  78. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.service.spec.ts +334 -0
  79. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.service.ts +249 -0
  80. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.controller.spec.ts +20 -0
  81. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.controller.ts +188 -0
  82. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.module.ts +10 -0
  83. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.service.spec.ts +18 -0
  84. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.service.ts +83 -0
  85. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/index.ts +4 -0
  86. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.controller.spec.ts +20 -0
  87. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.controller.ts +250 -0
  88. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.module.ts +10 -0
  89. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.service.spec.ts +18 -0
  90. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.service.ts +1051 -0
  91. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.controller.spec.ts +20 -0
  92. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.controller.ts +196 -0
  93. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.module.ts +13 -0
  94. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.service.spec.ts +18 -0
  95. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.service.ts +219 -0
  96. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.controller.spec.ts +20 -0
  97. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.controller.ts +196 -0
  98. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.module.ts +10 -0
  99. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.service.spec.ts +18 -0
  100. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.service.ts +199 -0
  101. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.controller.spec.ts +20 -0
  102. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.controller.ts +210 -0
  103. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.module.ts +12 -0
  104. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.service.spec.ts +18 -0
  105. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.service.ts +862 -0
  106. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/roles-refresher.service.ts +133 -0
  107. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.controller.spec.ts +20 -0
  108. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.controller.ts +196 -0
  109. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.module.ts +10 -0
  110. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.service.spec.ts +18 -0
  111. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.service.ts +201 -0
  112. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.controller.spec.ts +20 -0
  113. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.controller.ts +196 -0
  114. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.module.ts +10 -0
  115. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.service.spec.ts +18 -0
  116. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.service.ts +216 -0
  117. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.controller.spec.ts +20 -0
  118. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.controller.ts +198 -0
  119. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.module.ts +10 -0
  120. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.service.spec.ts +18 -0
  121. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.service.ts +104 -0
  122. package/src/lib/application/files/gadmin2-game-angle-demo/server/start-prod.sh +130 -0
  123. package/src/lib/application/files/gadmin2-game-angle-demo/server/test/app.e2e-spec.ts +24 -0
  124. package/src/lib/application/files/gadmin2-game-angle-demo/server/test/jest-e2e.json +9 -0
  125. package/src/lib/application/files/gadmin2-game-angle-demo/server/tsconfig.build.json +4 -0
  126. package/src/lib/application/files/gadmin2-game-angle-demo/server/tsconfig.json +36 -0
  127. package/src/lib/application/files/gadmin2-game-angle-demo/server/yarn.lock +7737 -0
  128. package/src/lib/application/files/gadmin2-game-angle-demo/web/.env +2 -0
  129. package/src/lib/application/files/gadmin2-game-angle-demo/web/.eslintrc.json +38 -0
  130. package/src/lib/application/files/gadmin2-game-angle-demo/web/.npmrc +1 -0
  131. package/src/lib/application/files/gadmin2-game-angle-demo/web/.prettierignore +2 -0
  132. package/src/lib/application/files/gadmin2-game-angle-demo/web/.prettierrc +4 -0
  133. package/src/lib/application/files/gadmin2-game-angle-demo/web/README.MD +48 -0
  134. package/src/lib/application/files/gadmin2-game-angle-demo/web/dev-shell-entry.html +49 -0
  135. package/src/lib/application/files/gadmin2-game-angle-demo/web/index.html +19 -0
  136. package/src/lib/application/files/gadmin2-game-angle-demo/web/package.json +92 -0
  137. package/src/lib/application/files/gadmin2-game-angle-demo/web/postcss.config.cjs +6 -0
  138. package/src/lib/application/files/gadmin2-game-angle-demo/web/public/favicon.ico +0 -0
  139. package/src/lib/application/files/gadmin2-game-angle-demo/web/public/images/flags/en.svg +1 -0
  140. package/src/lib/application/files/gadmin2-game-angle-demo/web/public/images/flags/zh_CN.svg +11 -0
  141. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/App.tsx +137 -0
  142. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/auditLogProvider.ts +89 -0
  143. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/authProvider.ts +144 -0
  144. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/BulkActions.tsx +287 -0
  145. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/ListPageHeader.tsx +56 -0
  146. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/RowActions.tsx +318 -0
  147. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/SearchBar.tsx +323 -0
  148. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/SqlModal.tsx +495 -0
  149. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/VanillaJSONEditor/index.css +10 -0
  150. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/VanillaJSONEditor/index.jsx +53 -0
  151. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/AgentContext.tsx +375 -0
  152. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/ElementInspector.tsx +1133 -0
  153. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/agentAttributes.ts +70 -0
  154. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/index.ts +8 -0
  155. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/inspectorActions.ts +1034 -0
  156. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/pagePathUtils.ts +66 -0
  157. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/promptGenerator.ts +135 -0
  158. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/propPatcher.ts +84 -0
  159. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/eventList/index.tsx +58 -0
  160. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/index.ts +4 -0
  161. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logButton/index.tsx +96 -0
  162. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logList/index.tsx +72 -0
  163. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/modalDiffViewer/index.tsx +104 -0
  164. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/index.tsx +2 -0
  165. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/BarChart/index.tsx +896 -0
  166. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/ChartSwitcher/index.tsx +219 -0
  167. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/ChartViewer/index.tsx +159 -0
  168. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Filter/index.tsx +192 -0
  169. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/LineChart/index.tsx +1034 -0
  170. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumCard/NumCard.module.css +8 -0
  171. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumCard/index.tsx +509 -0
  172. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumLineCard/index.tsx +66 -0
  173. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/PieChart/index.tsx +552 -0
  174. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/RadarChart/index.tsx +263 -0
  175. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Section/index.tsx +35 -0
  176. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Table/index.tsx +207 -0
  177. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/TreemapChart/index.tsx +382 -0
  178. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/WorldMap/index.tsx +135 -0
  179. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/chart-constants.ts +53 -0
  180. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/icon/InfoIcon.tsx +8 -0
  181. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/icon/index.ts +1 -0
  182. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/config.ts +31 -0
  183. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/nameMap.json +9 -0
  184. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/world.geo.json +39349 -0
  185. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/metric-info-tooltip/index.tsx +19 -0
  186. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/business/index.tsx +65 -0
  187. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/index.tsx +54 -0
  188. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/custom-avatar.tsx +42 -0
  189. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/index.ts +8 -0
  190. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +106 -0
  191. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/index.ts +4 -0
  192. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/layout.tsx +32 -0
  193. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/logo.tsx +19 -0
  194. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +431 -0
  195. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/title.tsx +61 -0
  196. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/offLayoutArea/index.tsx +5 -0
  197. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/pagination-total.tsx +21 -0
  198. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/tags/index.ts +1 -0
  199. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/tags/role-tag.tsx +44 -0
  200. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/text.tsx +78 -0
  201. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/config/http.ts +49 -0
  202. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +428 -0
  203. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +16 -0
  204. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddDataModal.tsx +199 -0
  205. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddPageModal.tsx +335 -0
  206. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DeleteDataConfirm.tsx +56 -0
  207. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +401 -0
  208. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/EditDataModal.tsx +129 -0
  209. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/SkillMenu.tsx +202 -0
  210. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/UndoConfirm.tsx +36 -0
  211. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/index.tsx +8 -0
  212. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/style.css +835 -0
  213. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/enums/audit-log.enum.ts +13 -0
  214. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/enums/index.ts +1 -0
  215. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/form.tsx +471 -0
  216. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/get-name-initials.ts +8 -0
  217. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/get-random-color.ts +27 -0
  218. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/http.ts +84 -0
  219. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/index.tsx +8 -0
  220. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +491 -0
  221. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/login.ts +82 -0
  222. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/page-tree.ts +74 -0
  223. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/show.tsx +226 -0
  224. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/utils.tsx +9 -0
  225. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/index.ts +7 -0
  226. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/types.ts +138 -0
  227. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchDelete.ts +191 -0
  228. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchOperations.ts +153 -0
  229. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchOperationsCore.ts +193 -0
  230. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchUpdate.ts +182 -0
  231. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +220 -0
  232. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useECharts.tsx +144 -0
  233. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useFetchData.ts +33 -0
  234. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useListPageState.ts +303 -0
  235. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useRoles.ts +34 -0
  236. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useRowSelection.ts +38 -0
  237. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useUserPageAccess.ts +353 -0
  238. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/i18n.ts +23 -0
  239. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/index.tsx +27 -0
  240. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +321 -0
  241. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +324 -0
  242. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/meta.json +4 -0
  243. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +81 -0
  244. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.css +3 -0
  245. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.tsx +134 -0
  246. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/create.tsx +105 -0
  247. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/edit.tsx +121 -0
  248. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.ts +8 -0
  249. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.tsx +4 -0
  250. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/list.tsx +220 -0
  251. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/show.tsx +74 -0
  252. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasCell.tsx +87 -0
  253. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasEditPage.tsx +192 -0
  254. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +409 -0
  255. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +1372 -0
  256. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasToolbar.tsx +384 -0
  257. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CodeFloatWindow.tsx +476 -0
  258. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/ComponentThumbnail.tsx +137 -0
  259. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/IsolatedLivePreview.tsx +101 -0
  260. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/LivePreview.tsx +236 -0
  261. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/PublishModal.tsx +200 -0
  262. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasApi.ts +92 -0
  263. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasConfigRegistry.tsx +25 -0
  264. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasContextMenuRegistry.tsx +875 -0
  265. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasDefaults.ts +126 -0
  266. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasI18n.ts +11 -0
  267. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/BarChartDataSourceModal.tsx +115 -0
  268. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/ChartViewerConfigModal.tsx +217 -0
  269. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/LineChartDataSourceModal.tsx +153 -0
  270. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/NumCardDataSourceModal.tsx +211 -0
  271. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/PromptModal.tsx +90 -0
  272. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/RadarChartDataSourceModal.tsx +87 -0
  273. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableDataSourceModal.tsx +204 -0
  274. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/demos.ts +1153 -0
  275. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/index.tsx +2 -0
  276. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/sectionCompactor.ts +45 -0
  277. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/types.ts +45 -0
  278. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas-page/index.tsx +108 -0
  279. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/create.tsx +105 -0
  280. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/edit.tsx +121 -0
  281. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/index.tsx +4 -0
  282. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/list.tsx +237 -0
  283. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/show.tsx +74 -0
  284. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/AssignRolesModal.tsx +177 -0
  285. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/CreatePageModal.tsx +42 -0
  286. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/EditPageModal.tsx +46 -0
  287. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/PageDetailDrawer.tsx +136 -0
  288. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/PageFormModal.tsx +815 -0
  289. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/hooks/usePageManagement.ts +40 -0
  290. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/index.ts +1 -0
  291. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/list.tsx +1370 -0
  292. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/queries.ts +17 -0
  293. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/types.ts +45 -0
  294. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/permissionReadme/index.tsx +1090 -0
  295. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/CreateModal.tsx +25 -0
  296. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/EditModal.tsx +28 -0
  297. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/ResourceDetailDrawer.tsx +177 -0
  298. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/modal.tsx +230 -0
  299. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/index.ts +2 -0
  300. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/list.tsx +250 -0
  301. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/queries.ts +10 -0
  302. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/types.ts +9 -0
  303. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/CreateModal.tsx +30 -0
  304. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/EditModal.tsx +47 -0
  305. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/RoleDetailDrawer.tsx +66 -0
  306. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/modal.tsx +300 -0
  307. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/hooks/useRolePage.ts +35 -0
  308. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/index.ts +1 -0
  309. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/list.tsx +405 -0
  310. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/queries.ts +8 -0
  311. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/types.ts +8 -0
  312. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/create-modal.tsx +17 -0
  313. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/edit-modal.tsx +19 -0
  314. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/form-modal.tsx +194 -0
  315. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/index.ts +5 -0
  316. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/role-tag.tsx +48 -0
  317. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/show-drawer.tsx +145 -0
  318. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/index.ts +1 -0
  319. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/list.tsx +377 -0
  320. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/queries.ts +14 -0
  321. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/setupTests.ts +5 -0
  322. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd.css +132 -0
  323. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/styles/fc.css +58 -0
  324. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/styles/index.css +128 -0
  325. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-drawer.module.css +18 -0
  326. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-page.module.css +21 -0
  327. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/types/audit-log.ts +1 -0
  328. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/types/index.ts +3 -0
  329. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/types/role.ts +7 -0
  330. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/types/user.ts +1 -0
  331. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/vite-env.d.ts +13 -0
  332. package/src/lib/application/files/gadmin2-game-angle-demo/web/tsconfig.json +28 -0
  333. package/src/lib/application/files/gadmin2-game-angle-demo/web/vite.config.ts +48 -0
  334. package/src/lib/application/files/gadmin2-game-angle-demo/web/yarn.lock +9482 -0
  335. package/src/lib/class/class.schema.d.ts +32 -0
  336. package/src/lib/class/files/js/__name__.js +1 -0
  337. package/src/lib/class/files/js/__name__.spec.js +7 -0
  338. package/src/lib/class/files/ts/__name__.spec.ts +7 -0
  339. package/src/lib/class/files/ts/__name__.ts +1 -0
  340. package/src/lib/client-app/angular/angular.schema.d.ts +32 -0
  341. package/src/lib/client-app/angular/files/angular.constants.ts +4 -0
  342. package/src/lib/client-app/angular/files/angular.module.ts +41 -0
  343. package/src/lib/client-app/angular/files/angular.providers.ts +27 -0
  344. package/src/lib/client-app/angular/files/angular.utils.ts +19 -0
  345. package/src/lib/client-app/angular/files/interfaces/angular-options.interface.ts +87 -0
  346. package/src/lib/client-app/angular/files/loaders/abstract.loader.ts +16 -0
  347. package/src/lib/client-app/angular/files/loaders/express.loader.ts +25 -0
  348. package/src/lib/client-app/angular/files/loaders/fastify.loader.ts +34 -0
  349. package/src/lib/client-app/angular/files/loaders/noop.loader.ts +12 -0
  350. package/src/lib/configuration/configuration.schema.d.ts +18 -0
  351. package/src/lib/configuration/files/js/nest-cli.json +6 -0
  352. package/src/lib/configuration/files/ts/nest-cli.json +5 -0
  353. package/src/lib/controller/controller.schema.d.ts +45 -0
  354. package/src/lib/controller/files/js/__name__.controller.js +4 -0
  355. package/src/lib/controller/files/js/__name__.controller.spec.js +18 -0
  356. package/src/lib/controller/files/ts/__name__.controller.spec.ts +18 -0
  357. package/src/lib/controller/files/ts/__name__.controller.ts +137 -0
  358. package/src/lib/decorator/decorator.schema.d.ts +24 -0
  359. package/src/lib/decorator/files/js/__name__.decorator.js +3 -0
  360. package/src/lib/decorator/files/ts/__name__.decorator.ts +3 -0
  361. package/src/lib/filter/files/js/__name__.filter.js +6 -0
  362. package/src/lib/filter/files/js/__name__.filter.spec.js +7 -0
  363. package/src/lib/filter/files/ts/__name__.filter.spec.ts +7 -0
  364. package/src/lib/filter/files/ts/__name__.filter.ts +6 -0
  365. package/src/lib/filter/filter.schema.d.ts +28 -0
  366. package/src/lib/gateway/files/js/__name__.gateway.js +9 -0
  367. package/src/lib/gateway/files/js/__name__.gateway.spec.js +18 -0
  368. package/src/lib/gateway/files/ts/__name__.gateway.spec.ts +18 -0
  369. package/src/lib/gateway/files/ts/__name__.gateway.ts +9 -0
  370. package/src/lib/gateway/gateway.schema.d.ts +36 -0
  371. package/src/lib/guard/files/js/__name__.guard.js +8 -0
  372. package/src/lib/guard/files/js/__name__.guard.spec.js +7 -0
  373. package/src/lib/guard/files/ts/__name__.guard.spec.ts +7 -0
  374. package/src/lib/guard/files/ts/__name__.guard.ts +11 -0
  375. package/src/lib/guard/guard.schema.d.ts +28 -0
  376. package/src/lib/interceptor/files/js/__name__.interceptor.js +8 -0
  377. package/src/lib/interceptor/files/js/__name__.interceptor.spec.js +7 -0
  378. package/src/lib/interceptor/files/ts/default/__name__.interceptor.spec.ts +7 -0
  379. package/src/lib/interceptor/files/ts/default/__name__.interceptor.ts +9 -0
  380. package/src/lib/interceptor/files/ts/generated/__name__.interceptor.spec.ts +7 -0
  381. package/src/lib/interceptor/files/ts/generated/__name__.interceptor.ts +13 -0
  382. package/src/lib/interceptor/interceptor.schema.d.ts +35 -0
  383. package/src/lib/interface/files/__name__.interface.ts +1 -0
  384. package/src/lib/interface/interface.schema.d.ts +20 -0
  385. package/src/lib/library/files/js/.babelrc +4 -0
  386. package/src/lib/library/files/js/jsconfig.json +9 -0
  387. package/src/lib/library/files/js/src/__name__.module.js +8 -0
  388. package/src/lib/library/files/js/src/__name__.service.js +4 -0
  389. package/src/lib/library/files/js/src/__name__.service.spec.js +18 -0
  390. package/src/lib/library/files/js/src/index.js +2 -0
  391. package/src/lib/library/files/ts/src/__name__.module.ts +8 -0
  392. package/src/lib/library/files/ts/src/__name__.service.spec.ts +18 -0
  393. package/src/lib/library/files/ts/src/__name__.service.ts +4 -0
  394. package/src/lib/library/files/ts/src/index.ts +2 -0
  395. package/src/lib/library/files/ts/tsconfig.lib.json +9 -0
  396. package/src/lib/library/library.schema.d.ts +24 -0
  397. package/src/lib/middleware/files/js/__name__.middleware.js +8 -0
  398. package/src/lib/middleware/files/js/__name__.middleware.spec.js +7 -0
  399. package/src/lib/middleware/files/ts/__name__.middleware.spec.ts +7 -0
  400. package/src/lib/middleware/files/ts/__name__.middleware.ts +8 -0
  401. package/src/lib/middleware/middleware.schema.d.ts +28 -0
  402. package/src/lib/module/files/js/__name__.module.js +4 -0
  403. package/src/lib/module/files/ts/__name__.module.ts +4 -0
  404. package/src/lib/module/module.schema.d.ts +40 -0
  405. package/src/lib/pipe/files/js/__name__.pipe.js +8 -0
  406. package/src/lib/pipe/files/js/__name__.pipe.spec.js +7 -0
  407. package/src/lib/pipe/files/ts/__name__.pipe.spec.ts +7 -0
  408. package/src/lib/pipe/files/ts/__name__.pipe.ts +8 -0
  409. package/src/lib/pipe/pipe.schema.d.ts +28 -0
  410. package/src/lib/prisma-resource/files/ts/__name__.controller.spec.ts +20 -0
  411. package/src/lib/prisma-resource/files/ts/__name__.controller.ts +63 -0
  412. package/src/lib/prisma-resource/files/ts/__name__.module.ts +9 -0
  413. package/src/lib/prisma-resource/files/ts/__name__.service.spec.ts +18 -0
  414. package/src/lib/prisma-resource/files/ts/__name__.service.ts +28 -0
  415. package/src/lib/prisma-resource/files/ts/dto/create-__name@singular__.dto.ts +1 -0
  416. package/src/lib/prisma-resource/files/ts/dto/create-__name@singular__.input.ts +7 -0
  417. package/src/lib/prisma-resource/files/ts/dto/update-__name@singular__.dto.ts +6 -0
  418. package/src/lib/prisma-resource/files/ts/dto/update-__name@singular__.input.ts +13 -0
  419. package/src/lib/prisma-resource/files/ts/entities/__name@singular@ent__.ts +7 -0
  420. package/src/lib/prisma-resource/prisma-resource.schema.d.ts +57 -0
  421. package/src/lib/provider/files/js/__name__.js +4 -0
  422. package/src/lib/provider/files/js/__name__.spec.js +18 -0
  423. package/src/lib/provider/files/ts/__name__.spec.ts +18 -0
  424. package/src/lib/provider/files/ts/__name__.ts +4 -0
  425. package/src/lib/provider/provider.schema.d.ts +48 -0
  426. package/src/lib/resolver/files/js/__name__.resolver.js +4 -0
  427. package/src/lib/resolver/files/js/__name__.resolver.spec.js +18 -0
  428. package/src/lib/resolver/files/ts/__name__.resolver.spec.ts +18 -0
  429. package/src/lib/resolver/files/ts/__name__.resolver.ts +4 -0
  430. package/src/lib/resolver/resolver.schema.d.ts +36 -0
  431. package/src/lib/resource/files/ts/__name__.controller.spec.ts +20 -0
  432. package/src/lib/resource/files/ts/__name__.controller.ts +63 -0
  433. package/src/lib/resource/files/ts/__name__.gateway.spec.ts +19 -0
  434. package/src/lib/resource/files/ts/__name__.gateway.ts +34 -0
  435. package/src/lib/resource/files/ts/__name__.graphql +24 -0
  436. package/src/lib/resource/files/ts/__name__.module.ts +9 -0
  437. package/src/lib/resource/files/ts/__name__.resolver.spec.ts +19 -0
  438. package/src/lib/resource/files/ts/__name__.resolver.ts +60 -0
  439. package/src/lib/resource/files/ts/__name__.service.spec.ts +18 -0
  440. package/src/lib/resource/files/ts/__name__.service.ts +28 -0
  441. package/src/lib/resource/files/ts/dto/create-__name@singular__.dto.ts +1 -0
  442. package/src/lib/resource/files/ts/dto/create-__name@singular__.input.ts +7 -0
  443. package/src/lib/resource/files/ts/dto/update-__name@singular__.dto.ts +6 -0
  444. package/src/lib/resource/files/ts/dto/update-__name@singular__.input.ts +13 -0
  445. package/src/lib/resource/files/ts/entities/__name@singular@ent__.ts +7 -0
  446. package/src/lib/resource/resource.schema.d.ts +57 -0
  447. package/src/lib/service/files/js/__name__.service.js +4 -0
  448. package/src/lib/service/files/js/__name__.service.spec.js +18 -0
  449. package/src/lib/service/files/ts/__name__.service.spec.ts +18 -0
  450. package/src/lib/service/files/ts/__name__.service.ts +4 -0
  451. package/src/lib/service/service.schema.d.ts +44 -0
  452. package/src/lib/sub-app/files/js/.babelrc +4 -0
  453. package/src/lib/sub-app/files/js/index.js +2 -0
  454. package/src/lib/sub-app/files/js/jsconfig.json +10 -0
  455. package/src/lib/sub-app/files/js/src/app.controller.js +15 -0
  456. package/src/lib/sub-app/files/js/src/app.controller.spec.js +22 -0
  457. package/src/lib/sub-app/files/js/src/app.module.js +10 -0
  458. package/src/lib/sub-app/files/js/src/app.service.js +8 -0
  459. package/src/lib/sub-app/files/js/src/main.js +8 -0
  460. package/src/lib/sub-app/files/js/test/app.e2e-spec.js +23 -0
  461. package/src/lib/sub-app/files/js/test/jest-e2e.json +5 -0
  462. package/src/lib/sub-app/files/ts/src/__name__.controller.spec.ts +22 -0
  463. package/src/lib/sub-app/files/ts/src/__name__.controller.ts +12 -0
  464. package/src/lib/sub-app/files/ts/src/__name__.module.ts +10 -0
  465. package/src/lib/sub-app/files/ts/src/__name__.service.ts +8 -0
  466. package/src/lib/sub-app/files/ts/src/main.ts +8 -0
  467. package/src/lib/sub-app/files/ts/test/app.e2e-spec.ts +24 -0
  468. package/src/lib/sub-app/files/ts/test/jest-e2e.json +9 -0
  469. package/src/lib/sub-app/files/ts/tsconfig.app.json +9 -0
  470. package/src/lib/sub-app/sub-app.schema.d.ts +21 -0
  471. package/src/lib/sub-app/workspace/js/.babelrc +4 -0
  472. package/src/lib/sub-app/workspace/js/index.js +2 -0
  473. package/src/lib/sub-app/workspace/js/jsconfig.json +10 -0
  474. package/src/lib/sub-app/workspace/ts/tsconfig.app.json +9 -0
@@ -0,0 +1,1090 @@
1
+ import { Alert, Card, Collapse, Divider, Table, Tabs, Typography } from 'antd';
2
+
3
+ const { Title, Paragraph, Text } = Typography;
4
+
5
+ // ─── 核心概念 ────────────────────────────────────────────────────────────────
6
+
7
+ const coreConceptColumns = [
8
+ { title: '概念', dataIndex: 'concept', key: 'concept', width: 160 },
9
+ { title: '数据库表', dataIndex: 'table', key: 'table', width: 140 },
10
+ { title: '说明', dataIndex: 'description', key: 'description' },
11
+ ];
12
+
13
+ const coreConceptData = [
14
+ {
15
+ key: 'page',
16
+ concept: 'Page(页面/菜单)',
17
+ table: 't_page',
18
+ description:
19
+ '定义系统中的所有菜单项,支持树形结构(parentId)。每个 Page 有唯一的 code,对应前端路由注册表中的 key。',
20
+ },
21
+ {
22
+ key: 'resource',
23
+ concept: 'Resource(资源)',
24
+ table: 't_resource',
25
+ description:
26
+ '定义后端 API 资源,每个资源对应一组 CRUD 权限(readAny, createAny, updateAny, deleteAny)。',
27
+ },
28
+ {
29
+ key: 'role',
30
+ concept: 'Role(角色)',
31
+ table: 't_role',
32
+ description:
33
+ '角色是权限分配的基本单位。一个用户拥有一个角色,角色决定了可见菜单和 API 权限。',
34
+ },
35
+ {
36
+ key: 'role_pages',
37
+ concept: 'RolePages(角色-页面)',
38
+ table: 't_role_pages',
39
+ description: '角色与页面的关联表,决定角色可以看到哪些菜单项。',
40
+ },
41
+ {
42
+ key: 'role_resource',
43
+ concept: 'RoleResource(角色-资源)',
44
+ table: 't_role_resource',
45
+ description:
46
+ '角色与资源的关联表,定义角色对每个资源的具体权限(读/写/改/删)。',
47
+ },
48
+ {
49
+ key: 'page_resource',
50
+ concept: 'PageResource(页面-资源)',
51
+ table: 't_page_resource',
52
+ description:
53
+ '页面与资源的关联表,记录每个页面需要哪些 API 资源。用于批量为角色分配权限。',
54
+ },
55
+ ];
56
+
57
+ // ─── t_page 字段说明 ─────────────────────────────────────────────────────────
58
+
59
+ const pageFieldColumns = [
60
+ { title: '字段', dataIndex: 'field', key: 'field', width: 180 },
61
+ { title: '说明', dataIndex: 'description', key: 'description' },
62
+ { title: '示例', dataIndex: 'example', key: 'example', width: 260 },
63
+ ];
64
+
65
+ const pageFieldData = [
66
+ {
67
+ key: 'code',
68
+ field: 'code',
69
+ description: '页面唯一标识,原生页面必须与 routeRegistry 的 key 一致',
70
+ example: 'software_dashboard',
71
+ },
72
+ {
73
+ key: 'zhName',
74
+ field: 'zhName / enName',
75
+ description: '菜单显示的中英文名称',
76
+ example: '软件看板 / Software Dashboard',
77
+ },
78
+ {
79
+ key: 'path',
80
+ field: 'path',
81
+ description:
82
+ 'URL 完整路径。原生页面会被 routeRegistry 覆盖,iframe/外部链接页面以此作为菜单跳转路径',
83
+ example: '/office/software-dashboard',
84
+ },
85
+ {
86
+ key: 'parentId',
87
+ field: 'parentId',
88
+ description: '父菜单 ID,用于构建树形菜单结构',
89
+ example: 'office 页面的 ID',
90
+ },
91
+ {
92
+ key: 'sortOrder',
93
+ field: 'sortOrder',
94
+ description: '同级菜单的排序权重,数字越小越靠前',
95
+ example: '10',
96
+ },
97
+ {
98
+ key: 'iframeUrl',
99
+ field: 'iframeUrl',
100
+ description:
101
+ 'iframe 嵌入地址。设置后页面以 iframe 方式渲染,支持 {{locale}} 模板变量',
102
+ example: 'https://analytics.example.com?lang={{locale}}',
103
+ },
104
+ {
105
+ key: 'externalRedirectUrl',
106
+ field: 'externalRedirectUrl',
107
+ description:
108
+ '外部跳转地址。设置后点击菜单在新窗口打开目标 URL,支持 {{locale}} 模板变量',
109
+ example: 'https://wiki.example.com/page',
110
+ },
111
+ {
112
+ key: 'isVirtual',
113
+ field: 'isVirtual',
114
+ description: '虚拟页面标记,设为 true 时不在侧边栏显示菜单项',
115
+ example: 'false',
116
+ },
117
+ ];
118
+
119
+ // ─── 常见问题 ────────────────────────────────────────────────────────────────
120
+
121
+ const faqItems = [
122
+ {
123
+ key: '1',
124
+ label: '菜单不显示?',
125
+ children: (
126
+ <ol>
127
+ <li>
128
+ 检查 <Text code>routeRegistry.tsx</Text> 中是否注册了路由,且 key 与
129
+ t_page 的 code 一致
130
+ </li>
131
+ <li>
132
+ 检查 <Text code>t_page</Text> 表中是否创建了记录(进入 Page Management
133
+ 查看)
134
+ </li>
135
+ <li>检查当前用户的角色是否分配了该页面(进入 Role Management 查看)</li>
136
+ <li>
137
+ 检查 <Text code>parentId</Text>{' '}
138
+ 是否正确——父级页面也需要分配给角色,否则整个子树不可见
139
+ </li>
140
+ </ol>
141
+ ),
142
+ },
143
+ {
144
+ key: '2',
145
+ label: '页面显示空白?',
146
+ children: (
147
+ <ol>
148
+ <li>
149
+ 检查 <Text code>routeRegistry.tsx</Text> 中的{' '}
150
+ <Text code>component</Text> 是否正确导入
151
+ </li>
152
+ <li>确认页面组件文件已正确导出(export 名称是否与 import 一致)</li>
153
+ <li>打开浏览器 DevTools Console 查看是否有 JS 加载错误</li>
154
+ </ol>
155
+ ),
156
+ },
157
+ {
158
+ key: '3',
159
+ label: 'API 返回 403?',
160
+ children: (
161
+ <Paragraph>
162
+ 后端权限由 <Text code>t_role_resource</Text> 控制。进入 Role
163
+ Management,检查角色是否分配了对应资源的权限(readAny / createAny /
164
+ updateAny / deleteAny)。注意:前端菜单可见不代表有 API
165
+ 权限,两者独立配置。
166
+ </Paragraph>
167
+ ),
168
+ },
169
+ {
170
+ key: '4',
171
+ label: 'iframe 页面加载失败?',
172
+ children: (
173
+ <ol>
174
+ <li>
175
+ 检查目标网站是否允许被 iframe 嵌入(X-Frame-Options /
176
+ Content-Security-Policy 头)
177
+ </li>
178
+ <li>
179
+ 确认 <Text code>iframeUrl</Text> 与{' '}
180
+ <Text code>externalRedirectUrl</Text> 未同时填写(两者互斥)
181
+ </li>
182
+ <li>
183
+ 如果目标网站禁止 iframe 嵌入,改用{' '}
184
+ <Text code>externalRedirectUrl</Text> 以新窗口方式打开
185
+ </li>
186
+ </ol>
187
+ ),
188
+ },
189
+ {
190
+ key: '5',
191
+ label: '如何添加子菜单?',
192
+ children: (
193
+ <Paragraph>
194
+ 在 <Text code>t_page</Text> 中创建记录时将 <Text code>parentId</Text>{' '}
195
+ 设为父菜单的 ID。如果是原生页面,在 <Text code>routeRegistry.tsx</Text>{' '}
196
+ 中也需要将路由放入父路由的 <Text code>children</Text> 对象中。
197
+ </Paragraph>
198
+ ),
199
+ },
200
+ {
201
+ key: '6',
202
+ label: '{{locale}} 模板变量怎么用?',
203
+ children: (
204
+ <Paragraph>
205
+ 在 <Text code>iframeUrl</Text> 或 <Text code>externalRedirectUrl</Text>{' '}
206
+ 中使用 <Text code>{'{{locale}}'}</Text>
207
+ ,系统会在运行时自动替换为当前语言(
208
+ <Text code>en</Text> 或 <Text code>zh_CN</Text>)。例如:
209
+ <Text code>
210
+ https://example.com/docs?lang=zh_CN https://example.com/docs?lang=en
211
+ </Text>
212
+ </Paragraph>
213
+ ),
214
+ },
215
+ ];
216
+
217
+ // ─── 原生页面注册步骤 ────────────────────────────────────────────────────────
218
+
219
+ const nativeStepColumns = [
220
+ { title: '步骤', dataIndex: 'step', key: 'step', width: 80 },
221
+ { title: '操作', dataIndex: 'action', key: 'action', width: 200 },
222
+ { title: '说明', dataIndex: 'detail', key: 'detail' },
223
+ ];
224
+
225
+ const nativeStepData = [
226
+ {
227
+ key: '1',
228
+ step: '1',
229
+ action: '创建页面组件',
230
+ detail:
231
+ '在 src/routes/ 下创建页面组件文件,如 src/routes/office/my-feature/index.tsx,导出页面组件。',
232
+ },
233
+ {
234
+ key: '2',
235
+ step: '2',
236
+ action: '在 routeRegistry 注册路由',
237
+ detail:
238
+ '在 src/config/routeRegistry.tsx 中添加路由条目。key 即为 page code,配置 path(相对路径)和 component(lazy import)。如有子路由放入 children。',
239
+ },
240
+ {
241
+ key: '3',
242
+ step: '3',
243
+ action: '在 Page Management 创建记录',
244
+ detail:
245
+ '进入 /admin/permission/page-list,新建页面。code 必须与 routeRegistry 中的 key 完全一致,设置 parentId 为父菜单 ID。',
246
+ },
247
+ {
248
+ key: '4',
249
+ step: '4',
250
+ action: '关联资源(可选)',
251
+ detail:
252
+ '如果页面需要 API 权限控制,在页面记录中关联对应的 Resource,用于后续批量分配权限。',
253
+ },
254
+ {
255
+ key: '5',
256
+ step: '5',
257
+ action: '为角色分配页面',
258
+ detail:
259
+ '进入 /admin/permission/role-list,编辑目标角色,勾选新添加的页面。',
260
+ },
261
+ ];
262
+
263
+ // ─── 对比表 ──────────────────────────────────────────────────────────────────
264
+
265
+ const comparisonColumns = [
266
+ { title: '', dataIndex: 'item', key: 'item', width: 160 },
267
+ { title: '原生页面', dataIndex: 'native', key: 'native' },
268
+ { title: '外部链接', dataIndex: 'external', key: 'external' },
269
+ { title: 'iframe 嵌入', dataIndex: 'iframe', key: 'iframe' },
270
+ { title: '动态菜单', dataIndex: 'dynamic', key: 'dynamic' },
271
+ ];
272
+
273
+ const comparisonData = [
274
+ {
275
+ key: 'scene',
276
+ item: '适用场景',
277
+ native: '内部开发的完整功能页面',
278
+ external: '跳转到外部系统(Wiki、文档等)',
279
+ iframe: '在应用内嵌入外部页面(报表等)',
280
+ dynamic: '同一组件多实例(如工作室列表)',
281
+ },
282
+ {
283
+ key: 'registry',
284
+ item: '需要修改前端页面',
285
+ native: '是(config/routeRegistry.tsx)',
286
+ external: '否',
287
+ iframe: '否',
288
+ dynamic: '是(config/dynamicMenus.ts 配置)',
289
+ },
290
+ {
291
+ key: 'component',
292
+ item: '需要写页面组件',
293
+ native: '是',
294
+ external: '否',
295
+ iframe: '否',
296
+ dynamic: '是(共享组件)',
297
+ },
298
+ {
299
+ key: 'tpage',
300
+ item: '需要 t_page 记录',
301
+ native: '是(code = routeRegistry key)',
302
+ external: '是(填 externalRedirectUrl)',
303
+ iframe: '是(填 iframeUrl)',
304
+ dynamic: '是(父级目录)',
305
+ },
306
+ {
307
+ key: 'url',
308
+ item: '关键 t_page 字段',
309
+ native: 'code, path, parentId',
310
+ external: 'externalRedirectUrl',
311
+ iframe: 'iframeUrl',
312
+ dynamic: 'code(如 invested / native)',
313
+ },
314
+ {
315
+ key: 'behavior',
316
+ item: '用户体验',
317
+ native: '应用内完整渲染',
318
+ external: '新窗口打开 + 自动返回',
319
+ iframe: '应用框架内嵌入',
320
+ dynamic: '应用内完整渲染',
321
+ },
322
+ {
323
+ key: 'template',
324
+ item: '支持 {{locale}}',
325
+ native: '—',
326
+ external: '是',
327
+ iframe: '是',
328
+ dynamic: '—',
329
+ },
330
+ ];
331
+
332
+ // ─── 组件 ────────────────────────────────────────────────────────────────────
333
+
334
+ export const PermissionReadmePage = () => {
335
+ return (
336
+ <div>
337
+ <Typography>
338
+ <Title level={2}>菜单管理说明</Title>
339
+ <Paragraph>
340
+ 本页面介绍系统的菜单、路由与权限管理机制,帮助管理员理解如何添加和配置不同类型的菜单项。
341
+ </Paragraph>
342
+ </Typography>
343
+
344
+ {/* ── 架构概览 ──────────────────────────────────────────────── */}
345
+ <Card title="菜单系统架构" style={{ marginBottom: 24 }}>
346
+ <Paragraph>
347
+ 系统的菜单管理涉及<Text strong>前端路由注册</Text>和
348
+ <Text strong>数据库页面配置</Text>两个部分的协作。 未匹配到
349
+ routeRegistry 的路由会进入 <Text code>WildcardPage</Text> 通配组件,
350
+ 由它根据 t_page 的配置决定渲染 iframe、打开外部链接或显示 404。
351
+ </Paragraph>
352
+ <Alert
353
+ type="info"
354
+ showIcon
355
+ message="数据流"
356
+ description={
357
+ <div>
358
+ <Text code>routeRegistry.tsx</Text>(前端路由定义:Route
359
+ Path、React组件) + <Text code>t_page</Text>(数据库菜单配置) →{' '}
360
+ <Text code>侧边栏菜单渲染</Text> + <Text code>路由匹配</Text>
361
+ <br />
362
+ <br />
363
+ 路由匹配优先级:<Text code>routeRegistry</Text> 原生路由 &gt;{' '}
364
+ <Text code>WildcardPage (/*)</Text> 通配路由
365
+ <br />
366
+ <br />
367
+ WildcardPage 处理:查询 t_page → 有 <Text code>iframeUrl</Text> →
368
+ 渲染 iframe | 有 <Text code>externalRedirectUrl</Text> →
369
+ 新窗口打开 | 否则 → 404
370
+ </div>
371
+ }
372
+ style={{ marginBottom: 16 }}
373
+ />
374
+ </Card>
375
+
376
+ {/* ── 核心概念 ──────────────────────────────────────────────── */}
377
+ <Card title="核心概念" style={{ marginBottom: 24 }}>
378
+ <Table
379
+ columns={coreConceptColumns}
380
+ dataSource={coreConceptData}
381
+ pagination={false}
382
+ size="small"
383
+ bordered
384
+ />
385
+ <Divider />
386
+ <Title level={5}>t_page 关键字段</Title>
387
+ <Table
388
+ columns={pageFieldColumns}
389
+ dataSource={pageFieldData}
390
+ pagination={false}
391
+ size="small"
392
+ bordered
393
+ />
394
+ </Card>
395
+
396
+ {/* ── 四种注册方式 ──────────────────────────────────────────── */}
397
+ <Card title="菜单注册方式" style={{ marginBottom: 24 }}>
398
+ <Alert
399
+ type="info"
400
+ showIcon
401
+ message="四种方式对比"
402
+ style={{ marginBottom: 16 }}
403
+ description={
404
+ <Table
405
+ columns={comparisonColumns}
406
+ dataSource={comparisonData}
407
+ pagination={false}
408
+ size="small"
409
+ bordered
410
+ scroll={{ x: 800 }}
411
+ />
412
+ }
413
+ />
414
+
415
+ <Tabs
416
+ items={[
417
+ {
418
+ key: 'native',
419
+ label: '原生页面',
420
+ children: (
421
+ <>
422
+ <Paragraph>
423
+ 原生页面是最常见的方式——编写 React 组件,在{' '}
424
+ <Text code>routeRegistry.tsx</Text> 中注册路由,再在 t_page
425
+ 中创建对应记录。
426
+ </Paragraph>
427
+ <Alert
428
+ type="warning"
429
+ showIcon
430
+ message="关键约束"
431
+ description={
432
+ <>
433
+ routeRegistry 中的 key(如{' '}
434
+ <Text code>software_dashboard</Text>)必须与 t_page 的{' '}
435
+ <Text code>code</Text>{' '}
436
+ 字段完全一致,否则菜单无法正常显示。
437
+ </>
438
+ }
439
+ style={{ marginBottom: 16 }}
440
+ />
441
+ <Title level={5}>注册步骤</Title>
442
+ <Table
443
+ columns={nativeStepColumns}
444
+ dataSource={nativeStepData}
445
+ pagination={false}
446
+ size="small"
447
+ bordered
448
+ />
449
+ <Divider />
450
+ <Title level={5}>routeRegistry 示例</Title>
451
+ <pre
452
+ style={{
453
+ background: '#f5f5f5',
454
+ padding: 16,
455
+ borderRadius: 6,
456
+ overflow: 'auto',
457
+ fontSize: 13,
458
+ lineHeight: 1.6,
459
+ }}
460
+ >{`// src/config/routeRegistry.tsx
461
+ office: {
462
+ path: "/office",
463
+ children: {
464
+ // key "my_feature" 即为 t_page 中的 code
465
+ my_feature: {
466
+ path: "my-feature-dashboard",
467
+ component: lazy(() => import("@/routes/office/my-feature")),
468
+ },
469
+ },
470
+ },`}</pre>
471
+
472
+ <Divider />
473
+ <Title level={5}>下划线前缀(_ 开头)的子路由</Title>
474
+ <Paragraph>
475
+ routeRegistry 中以 <Text code>_</Text> 开头的 key 是
476
+ <Text strong>内部子路由</Text>,
477
+ <Text strong>无需在 t_page 中注册</Text>。 它们由父级页面的
478
+ code 统一管理权限,属于同一个页面模块的不同视图。
479
+ </Paragraph>
480
+
481
+ <Title level={5}>CRUD 子路由</Title>
482
+ <Paragraph>
483
+ 最常见的 <Text code>_</Text> 前缀子路由,
484
+ 用于同一模块的列表/新建/编辑/详情视图,不出现在侧边栏中:
485
+ </Paragraph>
486
+ <Table
487
+ columns={[
488
+ {
489
+ title: 'Key',
490
+ dataIndex: 'key',
491
+ key: 'key',
492
+ width: 100,
493
+ },
494
+ {
495
+ title: '典型 path',
496
+ dataIndex: 'path',
497
+ key: 'path',
498
+ width: 140,
499
+ },
500
+ { title: '用途', dataIndex: 'usage', key: 'usage' },
501
+ ]}
502
+ dataSource={[
503
+ {
504
+ key: '_list',
505
+ path: '""(index: true)',
506
+ usage:
507
+ '列表页,作为父路由的默认子路由(index route),访问父路径时自动渲染',
508
+ },
509
+ {
510
+ key: '_create',
511
+ path: '"create"',
512
+ usage: '新建页,如 /admin/staff/create',
513
+ },
514
+ {
515
+ key: '_edit',
516
+ path: '"edit/:id"',
517
+ usage: '编辑页,如 /admin/staff/edit/123',
518
+ },
519
+ {
520
+ key: '_show',
521
+ path: '"show/:id"',
522
+ usage: '详情页,如 /admin/staff/show/123',
523
+ },
524
+ {
525
+ key: '_index',
526
+ path: '""(index: true)',
527
+ usage: '与 _list 类似,用于非 CRUD 场景的默认子路由',
528
+ },
529
+ ]}
530
+ pagination={false}
531
+ size="small"
532
+ bordered
533
+ />
534
+
535
+ <Divider />
536
+ <Title level={5}>动态参数路由 + Sidebar-only 菜单条目</Title>
537
+ <Paragraph>
538
+ 当多个菜单项共享同一个页面组件、只通过 URL
539
+ 参数区分内容时,使用{' '}
540
+ <Text strong>动态参数路由 + Sidebar-only 条目</Text>
541
+ 的组合模式:
542
+ </Paragraph>
543
+ <ul>
544
+ <li>
545
+ 动态参数路由(如 <Text code>_tab</Text> /{' '}
546
+ <Text code>_region</Text>) - 负责实际渲染,
547
+ <Text strong>不注册 t_page</Text>
548
+ </li>
549
+ <li>
550
+ Sidebar-only 条目(如 <Text code>apac</Text>、
551
+ <Text code>security_event</Text>
552
+ )— 只有 path、没有 component,
553
+ <Text strong>需要注册 t_page</Text>,
554
+ 出现在侧边栏菜单中。用户点击后 URL
555
+ 匹配到动态参数路由,由共享组件渲染。
556
+ </li>
557
+ </ul>
558
+ <pre
559
+ style={{
560
+ background: '#f5f5f5',
561
+ padding: 16,
562
+ borderRadius: 6,
563
+ overflow: 'auto',
564
+ fontSize: 13,
565
+ lineHeight: 1.6,
566
+ }}
567
+ >{`// 示例:RTO 看板按区域分子菜单
568
+ // t_page 需注册:overview, apac, amer, emea
569
+ // _index 和 _region 无需注册
570
+
571
+ overview: {
572
+ path: "rto-dashboard",
573
+ children: {
574
+ _index: { // 默认视图,无需注册 t_page
575
+ path: "",
576
+ index: true,
577
+ component: lazy(() => import("@/routes/office/rto")),
578
+ },
579
+ _region: { // 动态参数路由,无需注册 t_page
580
+ path: ":region", // 匹配 /office/rto-dashboard/apac 等
581
+ component: lazy(() => import("@/routes/office/rto")),
582
+ },
583
+ // Sidebar-only 条目:需注册 t_page,出现在侧边栏菜单
584
+ apac: { path: "apac" }, // 无 component,点击后由 _region 渲染
585
+ amer: { path: "amer" },
586
+ emea: { path: "emea" },
587
+ },
588
+ },`}</pre>
589
+
590
+ <Alert
591
+ type="info"
592
+ showIcon
593
+ message="命名约定总结"
594
+ description={
595
+ <ul style={{ margin: 0, paddingLeft: 20 }}>
596
+ <li>
597
+ <Text strong>不以 _ 开头</Text>的 key → 页面
598
+ code,需在 t_page 中注册。有 component
599
+ 的是原生页面,无 component 的是 sidebar-only 菜单条目
600
+ </li>
601
+ <li>
602
+ <Text strong>以 _ 开头</Text>的 key →
603
+ 内部子路由,不注册
604
+ t_page,不出现在侧边栏,权限跟随父级页面
605
+ </li>
606
+ </ul>
607
+ }
608
+ style={{ marginTop: 16, marginBottom: 16 }}
609
+ />
610
+
611
+ <Title level={5}>CRUD 模块完整示例</Title>
612
+ <pre
613
+ style={{
614
+ background: '#f5f5f5',
615
+ padding: 16,
616
+ borderRadius: 6,
617
+ overflow: 'auto',
618
+ fontSize: 13,
619
+ lineHeight: 1.6,
620
+ }}
621
+ >{`// 只需在 t_page 中注册 "staff"(code="staff"),
622
+ // 下面 4 个 _ 开头的子路由无需注册,自动跟随 staff 的权限。
623
+ staff: {
624
+ path: "staff",
625
+ children: {
626
+ _list: {
627
+ path: "",
628
+ index: true, // 访问 /admin/staff 时渲染列表页
629
+ component: lazy(() => import("@/routes/administration/staff")
630
+ .then((m) => ({ default: m.StaffListPage }))),
631
+ },
632
+ _create: {
633
+ path: "create", // /admin/staff/create
634
+ component: lazy(() => import("@/routes/administration/staff")
635
+ .then((m) => ({ default: m.StaffCreatePage }))),
636
+ },
637
+ _edit: {
638
+ path: "edit/:id", // /admin/staff/edit/123
639
+ component: lazy(() => import("@/routes/administration/staff")
640
+ .then((m) => ({ default: m.StaffEditPage }))),
641
+ },
642
+ _show: {
643
+ path: "show/:id", // /admin/staff/show/123
644
+ component: lazy(() => import("@/routes/administration/staff")
645
+ .then((m) => ({ default: m.StaffShowPage }))),
646
+ },
647
+ },
648
+ },`}</pre>
649
+ </>
650
+ ),
651
+ },
652
+ {
653
+ key: 'external',
654
+ label: '外部链接',
655
+ children: (
656
+ <>
657
+ <Paragraph>
658
+ 外部链接方式<Text strong>无需编写任何前端代码</Text>
659
+ ,只需在 Page Management 中创建一条 t_page 记录,并填写{' '}
660
+ <Text code>externalRedirectUrl</Text> 字段即可。
661
+ 点击菜单时系统会在新窗口打开目标 URL,并自动返回前一个页面。
662
+ </Paragraph>
663
+ <Title level={5}>注册步骤</Title>
664
+ <ol>
665
+ <li>
666
+ 进入 <Text code>/admin/permission/page-list</Text>
667
+ ,新建页面记录
668
+ </li>
669
+ <li>
670
+ 填写 <Text code>code</Text>、<Text code>zhName</Text>、
671
+ <Text code>path</Text>(任意唯一路径即可)、
672
+ <Text code>parentId</Text>
673
+ </li>
674
+ <li>
675
+ 在 <Text code>External Redirect URL</Text>{' '}
676
+ 字段填入目标地址
677
+ </li>
678
+ <li>为角色分配该页面</li>
679
+ </ol>
680
+ <Alert
681
+ type="info"
682
+ showIcon
683
+ message="模板变量"
684
+ description={
685
+ <>
686
+ URL 中可使用 <Text code>{'{{locale}}'}</Text>{' '}
687
+ 模板变量,运行时会替换为当前语言(en / zh)。例如:
688
+ <br />
689
+ <Text code>
690
+ https://wiki.example.com/page?lang={'{{locale}}'}
691
+ </Text>
692
+ </>
693
+ }
694
+ style={{ marginTop: 16 }}
695
+ />
696
+ <Divider />
697
+ <Title level={5}>工作流程</Title>
698
+ <pre
699
+ style={{
700
+ background: '#f5f5f5',
701
+ padding: 16,
702
+ borderRadius: 6,
703
+ overflow: 'auto',
704
+ fontSize: 13,
705
+ lineHeight: 1.6,
706
+ }}
707
+ >{`用户点击菜单
708
+ → 前端路由跳转到 page.path
709
+ → 未匹配到 routeRegistry,进入 WildcardPage
710
+ → WildcardPage 查询 t_page,发现 externalRedirectUrl
711
+ → window.open(url, "_blank") 新窗口打开
712
+ → window.history.back() 自动返回`}</pre>
713
+ </>
714
+ ),
715
+ },
716
+ {
717
+ key: 'iframe',
718
+ label: 'iframe 嵌入',
719
+ children: (
720
+ <>
721
+ <Paragraph>
722
+ iframe 方式同样<Text strong>无需编写前端代码</Text>
723
+ ,在 Page Management 中填写 <Text code>iframeUrl</Text>{' '}
724
+ 字段即可。页面会在应用框架(侧边栏、顶栏)内以 iframe
725
+ 全屏嵌入目标网页。
726
+ </Paragraph>
727
+ <Title level={5}>注册步骤</Title>
728
+ <ol>
729
+ <li>
730
+ 进入 <Text code>/admin/permission/page-list</Text>
731
+ ,新建页面记录
732
+ </li>
733
+ <li>
734
+ 填写 <Text code>code</Text>、<Text code>zhName</Text>、
735
+ <Text code>path</Text>(任意唯一路径即可)、
736
+ <Text code>parentId</Text>
737
+ </li>
738
+ <li>
739
+ 在 <Text code>Iframe URL</Text> 字段填入目标地址
740
+ </li>
741
+ <li>为角色分配该页面</li>
742
+ </ol>
743
+ <Alert
744
+ type="warning"
745
+ showIcon
746
+ message="注意事项"
747
+ description={
748
+ <ul style={{ margin: 0, paddingLeft: 20 }}>
749
+ <li>
750
+ <Text code>iframeUrl</Text> 和{' '}
751
+ <Text code>externalRedirectUrl</Text>{' '}
752
+ 不能同时填写,两者互斥
753
+ </li>
754
+ <li>
755
+ 目标网站必须允许被 iframe 嵌入(未设置{' '}
756
+ <Text code>X-Frame-Options: DENY</Text> 或{' '}
757
+ <Text code>
758
+ Content-Security-Policy: frame-ancestors 'none'
759
+ </Text>
760
+
761
+ </li>
762
+ <li>如果目标网站禁止 iframe,请改用外部链接方式</li>
763
+ <li>
764
+ 同样支持 <Text code>{'{{locale}}'}</Text> 模板变量
765
+ </li>
766
+ </ul>
767
+ }
768
+ style={{ marginTop: 16 }}
769
+ />
770
+ </>
771
+ ),
772
+ },
773
+ {
774
+ key: 'dynamic',
775
+ label: '动态菜单',
776
+ children: (
777
+ <>
778
+ <Paragraph>
779
+ 动态菜单适用于
780
+ <Text strong>同一个页面组件需要生成多个菜单项</Text>
781
+ 的场景。通过 <Text code>
782
+ src/config/dynamicMenus.ts
783
+ </Text>{' '}
784
+ 的配置驱动方案,开发者只需添加一条配置即可新增动态菜单组。
785
+ </Paragraph>
786
+
787
+ <Title level={5}>配置方式</Title>
788
+ <Paragraph>
789
+ 在 <Text code>src/config/dynamicMenus.ts</Text> 中的{' '}
790
+ <Text code>dynamicMenuGroups</Text> 数组中添加一条配置:
791
+ </Paragraph>
792
+ <pre
793
+ style={{
794
+ background: '#f5f5f5',
795
+ padding: 16,
796
+ borderRadius: 6,
797
+ overflow: 'auto',
798
+ fontSize: 13,
799
+ lineHeight: 1.6,
800
+ }}
801
+ >{`// src/config/dynamicMenus.ts
802
+ interface DynamicMenuGroup {
803
+ parentCode: string; // 父级 page code(需在 t_page 注册)
804
+ routePrefix: string; // 路由前缀,如 "/rd/invested"
805
+ items: string[]; // 子项列表,每项生成一个菜单项和路由
806
+ component: LazyExoticComponent<ComponentType<any>>; // 共享组件
807
+ }
808
+
809
+ // 示例:RD 工作室
810
+ {
811
+ parentCode: "invested",
812
+ routePrefix: "/rd/invested",
813
+ items: studioMap.investedStudios,
814
+ component: lazy(() => import("@/routes/rd/rdec")),
815
+ }`}</pre>
816
+
817
+ <Alert
818
+ type="info"
819
+ showIcon
820
+ message="权限控制"
821
+ description={
822
+ <>
823
+ 动态菜单的权限以 <Text code>parentCode</Text>{' '}
824
+ 为单位控制。例如为角色分配 <Text code>invested</Text>{' '}
825
+ 页面后,该角色可以看到该组下所有子菜单项。无需为每个子项单独配置权限。
826
+ </>
827
+ }
828
+ style={{ marginTop: 16 }}
829
+ />
830
+
831
+ <Divider />
832
+ <Title level={5}>添加新动态菜单组的步骤</Title>
833
+ <ol>
834
+ <li>
835
+ 在 <Text code>t_page</Text> 中注册父级页面(设置{' '}
836
+ <Text code>code</Text>、<Text code>parentId</Text>)
837
+ </li>
838
+ <li>
839
+ 在 <Text code>src/config/dynamicMenus.ts</Text> 的{' '}
840
+ <Text code>dynamicMenuGroups</Text> 数组中添加一条配置
841
+ </li>
842
+ <li>
843
+ 路由和菜单项会自动生成,无需修改{' '}
844
+ <Text code>routeRegistry.tsx</Text>、
845
+ <Text code>App.tsx</Text> 或{' '}
846
+ <Text code>useDynamicResources.tsx</Text>
847
+ </li>
848
+ </ol>
849
+
850
+ <Divider />
851
+ <Title level={5}>现有示例:RD 工作室</Title>
852
+ <Paragraph>
853
+ 当前系统中 RD 模块的 invested(投资工作室)和
854
+ native(自研工作室)使用动态菜单:
855
+ </Paragraph>
856
+ <ul>
857
+ <li>
858
+ 工作室列表定义在 <Text code>src/config/studio.ts</Text> 的{' '}
859
+ <Text code>studioMap</Text> 中
860
+ </li>
861
+ <li>
862
+ 所有工作室路由共享同一个 <Text code>RDEC</Text>{' '}
863
+ 组件,组件内从 URL 提取工作室名称
864
+ </li>
865
+ <li>
866
+ 添加新工作室只需在 <Text code>studio.ts</Text> 的{' '}
867
+ <Text code>StudioEnum</Text> 和{' '}
868
+ <Text code>studioMap</Text> 中添加条目即可
869
+ </li>
870
+ </ul>
871
+ </>
872
+ ),
873
+ },
874
+ ]}
875
+ />
876
+ </Card>
877
+
878
+ {/* ── 权限层级关系 ────────────────────────────────────────────── */}
879
+ <Card title="权限层级关系" style={{ marginBottom: 24 }}>
880
+ <Title level={5}>实体关系总览</Title>
881
+ <pre
882
+ style={{
883
+ background: '#f5f5f5',
884
+ padding: 16,
885
+ borderRadius: 6,
886
+ overflow: 'auto',
887
+ fontSize: 13,
888
+ lineHeight: 1.8,
889
+ }}
890
+ >{`User (t_admin_user_role)
891
+ └─ roles: ["PRODUCT", "SYSTEM_ADMIN"] ← 用户可拥有多个角色(JSON 数组)
892
+
893
+
894
+ Role (t_role)
895
+ ├─ RolePages (t_role_pages) ← 控制菜单可见性(前端)
896
+ │ └─ Page (t_page)
897
+ │ └─ PageResource (t_page_resource) ← 页面声明需要的资源权限
898
+
899
+ └─ RoleResource (t_role_resource) ← 控制 API 访问权限(后端)
900
+ └─ Resource (t_resource)
901
+ └─ actions: ["readAny", "createAny", "updateAny", "deleteAny"]`}</pre>
902
+
903
+ <Divider />
904
+ <Title level={5}>双层权限防御</Title>
905
+ <Paragraph>系统在前端和后端分别进行权限检查,两层独立运作:</Paragraph>
906
+
907
+ <Table
908
+ columns={[
909
+ { title: '', dataIndex: 'item', key: 'item', width: 140 },
910
+ {
911
+ title: '前端:菜单可见性',
912
+ dataIndex: 'frontend',
913
+ key: 'frontend',
914
+ },
915
+ {
916
+ title: '后端:API 访问权限',
917
+ dataIndex: 'backend',
918
+ key: 'backend',
919
+ },
920
+ ]}
921
+ dataSource={[
922
+ {
923
+ key: 'table',
924
+ item: '关联表',
925
+ frontend: 't_role_pages(角色 → 页面)',
926
+ backend: 't_role_resource(角色 → 资源)',
927
+ },
928
+ {
929
+ key: 'what',
930
+ item: '控制什么',
931
+ frontend: '侧边栏菜单项是否显示',
932
+ backend: 'API 请求是否允许执行',
933
+ },
934
+ {
935
+ key: 'fail',
936
+ item: '无权限表现',
937
+ frontend: '菜单不可见',
938
+ backend: '返回 HTTP 403',
939
+ },
940
+ {
941
+ key: 'check',
942
+ item: '检查机制',
943
+ frontend: 'useUserPageAccess() Hook 过滤菜单树',
944
+ backend: 'AuthGuard → RolesGuard → @UseRoles() 装饰器',
945
+ },
946
+ ]}
947
+ pagination={false}
948
+ size="small"
949
+ bordered
950
+ />
951
+
952
+ <Divider />
953
+ <Title level={5}>权限检查完整流程</Title>
954
+ <pre
955
+ style={{
956
+ background: '#f5f5f5',
957
+ padding: 16,
958
+ borderRadius: 6,
959
+ overflow: 'auto',
960
+ fontSize: 13,
961
+ lineHeight: 1.8,
962
+ }}
963
+ >{`┌─ 前端菜单加载 ─────────────────────────────────────────────────────┐
964
+ │ │
965
+ │ 1. GET /userinfo → 获取用户角色列表 (如 ["PRODUCT"]) │
966
+ │ 2. POST /role/findMany → 查询角色 ID │
967
+ │ 3. POST /rolePages/findMany → 查询角色关联的页面 ID │
968
+ │ 4. POST /page/findMany → 获取所有页面定义 │
969
+ │ 5. 构建可访问页面集合(包含分配页面 + 递归添加祖先页面) │
970
+ │ 6. 生成侧边栏菜单树 │
971
+ │ │
972
+ └─────────────────────────────────────────────────────────────────────┘
973
+
974
+ ┌─ 后端 API 权限检查 ────────────────────────────────────────────────┐
975
+ │ │
976
+ │ 请求到达 → AuthGuard(验证身份,提取 userid) │
977
+ │ → RolesGuard(查询 t_admin_user_role,获取角色列表) │
978
+ │ → @UseRoles({ resource: "xxx", action: "read" }) │
979
+ │ → RolesBuilder 检查该角色对该资源是否有对应权限 │
980
+ │ → 通过 ✓ 执行 / 拒绝 ✗ 返回 403 │
981
+ │ │
982
+ └─────────────────────────────────────────────────────────────────────┘`}</pre>
983
+
984
+ <Divider />
985
+ <Title level={5}>PageResource 的作用</Title>
986
+ <Paragraph>
987
+ <Text code>t_page_resource</Text> 定义了每个页面需要哪些 API
988
+ 资源及权限。当管理员在 Role Management 中为角色勾选页面时,系统会
989
+ <Text strong>自动从 PageResource 中提取资源权限</Text>,同步写入{' '}
990
+ <Text code>t_role_resource</Text>。
991
+ </Paragraph>
992
+ <pre
993
+ style={{
994
+ background: '#f5f5f5',
995
+ padding: 16,
996
+ borderRadius: 6,
997
+ overflow: 'auto',
998
+ fontSize: 13,
999
+ lineHeight: 1.8,
1000
+ }}
1001
+ >{`管理员勾选页面 A(关联了 Resource X [readAny] 和 Resource Y [readAny, createAny])
1002
+
1003
+ 系统自动执行:
1004
+ 1. 写入 t_role_pages:角色 → 页面 A
1005
+ 2. 查询 t_page_resource:页面 A 需要 X(readAny)、Y(readAny, createAny)
1006
+ 3. 合并写入 t_role_resource:角色 → X(readAny)、Y(readAny, createAny)
1007
+
1008
+ 管理员取消勾选页面 A:
1009
+ 1. 删除 t_role_pages 中的关联
1010
+ 2. 如果 Resource X/Y 不被其他页面引用,同步删除 t_role_resource 中的关联`}</pre>
1011
+
1012
+ <Divider />
1013
+ <Title level={5}>API 权限类型</Title>
1014
+ <Table
1015
+ columns={[
1016
+ { title: '权限', dataIndex: 'action', key: 'action', width: 140 },
1017
+ { title: '含义', dataIndex: 'meaning', key: 'meaning' },
1018
+ {
1019
+ title: '对应 HTTP 操作',
1020
+ dataIndex: 'http',
1021
+ key: 'http',
1022
+ width: 200,
1023
+ },
1024
+ ]}
1025
+ dataSource={[
1026
+ {
1027
+ key: 'read',
1028
+ action: 'readAny',
1029
+ meaning: '读取任意记录',
1030
+ http: 'GET / POST findMany',
1031
+ },
1032
+ {
1033
+ key: 'create',
1034
+ action: 'createAny',
1035
+ meaning: '创建新记录',
1036
+ http: 'POST createOne',
1037
+ },
1038
+ {
1039
+ key: 'update',
1040
+ action: 'updateAny',
1041
+ meaning: '修改任意记录',
1042
+ http: 'PATCH / PUT updateOne',
1043
+ },
1044
+ {
1045
+ key: 'delete',
1046
+ action: 'deleteAny',
1047
+ meaning: '删除任意记录',
1048
+ http: 'DELETE deleteOne',
1049
+ },
1050
+ ]}
1051
+ pagination={false}
1052
+ size="small"
1053
+ bordered
1054
+ />
1055
+
1056
+ <Divider />
1057
+ <Title level={5}>通用资源(Common Resource)</Title>
1058
+ <Paragraph>
1059
+ <Text code>t_resource</Text> 中标记为{' '}
1060
+ <Text code>isCommonResource = true</Text> 的资源会自动为所有角色授予{' '}
1061
+ <Text code>readAny</Text>{' '}
1062
+ 权限,无需在页面或角色中单独配置。适用于全局公共数据(如枚举列表、配置项等)。
1063
+ </Paragraph>
1064
+
1065
+ <Divider />
1066
+ <Title level={5}>系统管理员</Title>
1067
+ <Alert
1068
+ type="info"
1069
+ showIcon
1070
+ message="硬编码管理员"
1071
+ description={
1072
+ <>
1073
+ 以下用户在后端硬编码为 SYSTEM_ADMIN 角色,即使不在{' '}
1074
+ <Text code>t_admin_user_role</Text> 表中也会自动获得管理员权限:
1075
+ <Text code>kavenma</Text>、<Text code>jasonlan</Text>、
1076
+ <Text code>gc_lvhenan</Text>。
1077
+ </>
1078
+ }
1079
+ />
1080
+ </Card>
1081
+
1082
+ {/* ── 常见问题 ──────────────────────────────────────────────── */}
1083
+ <Card title="常见问题">
1084
+ <Collapse items={faqItems} />
1085
+ </Card>
1086
+ </div>
1087
+ );
1088
+ };
1089
+
1090
+ export default PermissionReadmePage;