@gadmin2n/schematics 0.0.63 → 0.0.65

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/.dockerignore +2 -2
  2. package/dist/lib/application/files/gadmin2-game-angle-demo/Dockerfile +40 -26
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/Jenkinsfile +30 -4
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/example.prisma +33 -0
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/system.prisma +163 -0
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Event.ts +70 -0
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Game.ts +6 -6
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/ITActivityDay.ts +70 -0
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Log.ts +2 -2
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Role.ts +2 -2
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.env +20 -9
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.env.local +1 -0
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.eslintrc.js +1 -0
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.prettierignore +1 -0
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/README.md +2 -18
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/gadmin-cli.json +1 -1
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/migrate-between-pg-schemas.js +1232 -0
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +65 -38
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/prisma/.generator.prisma +4 -3
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/prisma.config.ts +16 -0
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/games.ts +1 -71
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/index.ts +17 -21
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/permissions.ts +278 -0
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/seedDataMngtPages.ts +258 -0
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/users.ts +7 -0
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/alias.config.ts +7 -0
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/app.controller.ts +151 -11
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/app.module.ts +29 -13
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/app.service.ts +151 -12
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/auth.guard.ts +87 -41
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/http-cache.interceptor.ts +21 -0
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/logger.ts +19 -0
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/safe-log.util.ts +176 -0
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/{yufuid.ts → taihu.ts} +49 -34
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/tracing.ts +174 -0
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/trim.pipe.ts +51 -0
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/utils.ts +91 -0
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/woaAuth.ts +25 -12
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/main.ts +22 -12
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.controller.spec.ts +20 -0
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.controller.ts +190 -0
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.module.ts +10 -0
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.service.spec.ts +338 -0
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.service.ts +83 -0
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.controller.spec.ts +20 -0
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.controller.ts +188 -0
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.module.ts +10 -0
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.service.spec.ts +18 -0
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.service.ts +83 -0
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.controller.spec.ts +20 -0
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.controller.ts +250 -0
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.module.ts +10 -0
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.service.spec.ts +18 -0
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.service.ts +1051 -0
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.controller.spec.ts +20 -0
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.controller.ts +196 -0
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.module.ts +13 -0
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.service.spec.ts +18 -0
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.service.ts +219 -0
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.controller.spec.ts +20 -0
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.controller.ts +196 -0
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.module.ts +10 -0
  63. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.service.spec.ts +18 -0
  64. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.service.ts +199 -0
  65. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.controller.spec.ts +20 -0
  66. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.controller.ts +210 -0
  67. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.module.ts +12 -0
  68. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.service.spec.ts +18 -0
  69. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.service.ts +849 -0
  70. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/roles-refresher.service.ts +133 -0
  71. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.controller.spec.ts +20 -0
  72. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.controller.ts +196 -0
  73. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.module.ts +10 -0
  74. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.service.spec.ts +18 -0
  75. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.service.ts +201 -0
  76. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.controller.spec.ts +20 -0
  77. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.controller.ts +196 -0
  78. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.module.ts +10 -0
  79. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.service.spec.ts +18 -0
  80. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.service.ts +216 -0
  81. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.controller.spec.ts +20 -0
  82. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.controller.ts +198 -0
  83. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.module.ts +10 -0
  84. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.service.spec.ts +18 -0
  85. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.service.ts +104 -0
  86. package/dist/lib/application/files/gadmin2-game-angle-demo/server/start-prod.sh +130 -0
  87. package/dist/lib/application/files/gadmin2-game-angle-demo/server/tsconfig.json +18 -3
  88. package/dist/lib/application/files/gadmin2-game-angle-demo/web/index.html +19 -0
  89. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +34 -42
  90. package/dist/lib/application/files/gadmin2-game-angle-demo/web/postcss.config.cjs +6 -0
  91. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/App.tsx +111 -185
  92. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/auditLogProvider.ts +5 -5
  93. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/index.tsx +49 -51
  94. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/custom-avatar.tsx +38 -0
  95. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/index.ts +4 -0
  96. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/{header/index.tsx → header.tsx} +22 -31
  97. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/index.ts +3 -1
  98. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/layout.tsx +32 -0
  99. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/logo.tsx +19 -0
  100. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +331 -166
  101. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/title.tsx +61 -0
  102. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/pagination-total.tsx +21 -0
  103. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/tags/index.ts +1 -0
  104. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/tags/role-tag.tsx +44 -0
  105. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/text.tsx +74 -0
  106. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +258 -0
  107. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +16 -0
  108. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/enums/audit-log.enum.ts +13 -0
  109. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/enums/index.ts +1 -0
  110. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/form.tsx +2 -0
  111. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/login.ts +22 -4
  112. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +211 -0
  113. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useFetchData.ts +33 -0
  114. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useRoles.ts +30 -0
  115. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useUserPageAccess.ts +339 -0
  116. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/i18n.ts +8 -4
  117. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/index.tsx +3 -11
  118. package/dist/lib/application/files/gadmin2-game-angle-demo/web/{public → src}/locales/en/common.json +1 -1
  119. package/dist/lib/application/files/gadmin2-game-angle-demo/web/{public → src}/locales/zh_CN/common.json +1 -1
  120. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.css +3 -0
  121. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.tsx +134 -0
  122. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/create.tsx +113 -0
  123. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/edit.tsx +122 -0
  124. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.ts +8 -0
  125. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.tsx +6 -0
  126. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/list.tsx +213 -0
  127. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/show.tsx +61 -0
  128. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/AssignRolesModal.tsx +168 -0
  129. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/CreatePageModal.tsx +42 -0
  130. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/EditPageModal.tsx +42 -0
  131. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/PageDetailDrawer.tsx +101 -0
  132. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/PageFormModal.tsx +731 -0
  133. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/create.tsx +113 -0
  134. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/edit.tsx +122 -0
  135. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/hooks/usePageManagement.ts +36 -0
  136. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/index.ts +8 -0
  137. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/index.tsx +6 -0
  138. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/list.tsx +1113 -0
  139. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/queries.ts +17 -0
  140. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/show.tsx +61 -0
  141. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/types.ts +44 -0
  142. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/pageResource/create.tsx +113 -0
  143. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/pageResource/edit.tsx +122 -0
  144. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/pageResource/index.tsx +6 -0
  145. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/pageResource/list.tsx +243 -0
  146. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/pageResource/show.tsx +61 -0
  147. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/permission-readme/index.tsx +1088 -0
  148. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/CreateModal.tsx +25 -0
  149. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/EditModal.tsx +28 -0
  150. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/ResourceDetailDrawer.tsx +160 -0
  151. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/modal.tsx +202 -0
  152. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/create.tsx +113 -0
  153. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/edit.tsx +122 -0
  154. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/index.ts +9 -0
  155. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/index.tsx +6 -0
  156. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/list.tsx +184 -0
  157. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/queries.ts +10 -0
  158. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/show.tsx +61 -0
  159. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/types.ts +9 -0
  160. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/CreateModal.tsx +30 -0
  161. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/EditModal.tsx +47 -0
  162. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/RoleDetailDrawer.tsx +56 -0
  163. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/modal.tsx +302 -0
  164. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/create.tsx +113 -0
  165. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/edit.tsx +122 -0
  166. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/hooks/useRolePage.ts +35 -0
  167. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/index.ts +8 -0
  168. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/index.tsx +6 -0
  169. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/list.tsx +382 -0
  170. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/queries.ts +8 -0
  171. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/show.tsx +61 -0
  172. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/types.ts +8 -0
  173. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/rolePages/create.tsx +113 -0
  174. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/rolePages/edit.tsx +122 -0
  175. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/rolePages/index.tsx +6 -0
  176. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/rolePages/list.tsx +243 -0
  177. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/rolePages/show.tsx +61 -0
  178. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/roleResource/create.tsx +113 -0
  179. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/roleResource/edit.tsx +122 -0
  180. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/roleResource/index.tsx +6 -0
  181. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/roleResource/list.tsx +243 -0
  182. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/roleResource/show.tsx +61 -0
  183. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/create-modal.tsx +17 -0
  184. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/edit-modal.tsx +19 -0
  185. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/form-modal.tsx +188 -0
  186. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/index.ts +5 -0
  187. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/role-tag.tsx +48 -0
  188. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/show-drawer.tsx +140 -0
  189. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/create.tsx +113 -0
  190. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/edit.tsx +122 -0
  191. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/index.ts +8 -0
  192. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/index.tsx +6 -0
  193. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/list.tsx +342 -0
  194. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/queries.ts +14 -0
  195. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/show.tsx +61 -0
  196. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd.css +132 -0
  197. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/fc.css +58 -0
  198. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/index.css +128 -0
  199. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-drawer.module.css +18 -0
  200. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-page.module.css +21 -0
  201. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/audit-log.ts +1 -0
  202. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/index.ts +3 -0
  203. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/role.ts +7 -0
  204. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/user.ts +1 -0
  205. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/utilities/get-name-initials.ts +8 -0
  206. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/utilities/get-random-color.ts +27 -0
  207. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/utilities/index.ts +2 -0
  208. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/utilities/utils.tsx +5 -0
  209. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/vite-env.d.ts +1 -0
  210. package/dist/lib/application/files/gadmin2-game-angle-demo/web/tsconfig.json +3 -3
  211. package/dist/lib/application/files/gadmin2-game-angle-demo/web/vite.config.ts +31 -0
  212. package/package.json +1 -1
  213. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/sample.prisma +0 -65
  214. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Source.ts +0 -76
  215. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Tasklog.ts +0 -76
  216. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/roles.ts +0 -4
  217. package/dist/lib/application/files/gadmin2-game-angle-demo/web/craco.config.js +0 -27
  218. package/dist/lib/application/files/gadmin2-game-angle-demo/web/public/index.html +0 -53
  219. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/styles.ts +0 -10
  220. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/react-app-env.d.ts +0 -1
  221. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/reportWebVitals.ts +0 -15
  222. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd.less +0 -79
  223. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/VanillaJSONEditor/{index.js → index.jsx} +0 -0
@@ -0,0 +1,849 @@
1
+ import { Inject, Injectable } from '@nestjs/common';
2
+ import { Prisma, Role } from '@prisma/client';
3
+ import { WINSTON_MODULE_PROVIDER } from 'nest-winston';
4
+ import { PrismaService } from 'nestjs-prisma';
5
+ import { Logger } from 'winston';
6
+
7
+ import { RolesBuilder } from 'nest-access-control';
8
+ import { createSafeLogData } from '../../lib/safe-log.util';
9
+
10
+ @Injectable()
11
+ export class RoleService {
12
+ // 单例 RolesBuilder 引用 — 其他代码通过 DI 或导出此实例读取
13
+ private rolesBuilder: RolesBuilder = new RolesBuilder();
14
+
15
+ constructor(
16
+ private prisma: PrismaService,
17
+ @Inject(WINSTON_MODULE_PROVIDER) private readonly logger: Logger,
18
+ ) {}
19
+
20
+ get rolesBuilderRef() {
21
+ return this.rolesBuilder;
22
+ }
23
+
24
+ async getBuilder(): Promise<RolesBuilder> {
25
+ // console.log('[__ROLE_PAGE_RESOURCE__] Getting roles from DB...');
26
+ const newBuilder = new RolesBuilder();
27
+
28
+ // 查询所有通用资源
29
+ const commonResources = await this.prisma.resource.findMany({
30
+ where: { isCommonResource: true },
31
+ select: { id: true, name: true },
32
+ });
33
+
34
+ const rows = await this.prisma.role.findMany({
35
+ include: {
36
+ roleResources: {
37
+ include: {
38
+ resource: true,
39
+ },
40
+ },
41
+ },
42
+ });
43
+
44
+ for (const role of rows) {
45
+ const roleName = role.name;
46
+
47
+ let grant = newBuilder.grant(roleName);
48
+
49
+ // 记录该角色已配置的资源 ID,用于判断是否需要添加通用资源的默认权限
50
+ const configuredResourceIds = new Set<number>();
51
+
52
+ // 处理新的数据结构:通过 roleResources 关联表获取权限
53
+ if (role.roleResources && role.roleResources.length > 0) {
54
+ for (const roleResource of role.roleResources) {
55
+ const resourceName = roleResource.resource?.name;
56
+ const resourceId = roleResource.resource?.id;
57
+ const actions = roleResource.actions;
58
+
59
+ if (resourceId) {
60
+ configuredResourceIds.add(resourceId);
61
+ }
62
+
63
+ if (resourceName && actions) {
64
+ // actions 现在是 JsonValue 类型,需要处理
65
+ let actionsArray: string[] = [];
66
+ if (typeof actions === 'string') {
67
+ actionsArray = actions.split(',');
68
+ } else if (Array.isArray(actions)) {
69
+ actionsArray = actions.map(String);
70
+ } else if (actions && typeof actions === 'object') {
71
+ // 如果是对象,尝试提取数组或转换为字符串数组
72
+ actionsArray = Object.values(actions).map(String);
73
+ }
74
+ for (const action of actionsArray) {
75
+ grant[action](resourceName, ['*']);
76
+ }
77
+ }
78
+ }
79
+ }
80
+
81
+ // 为所有角色添加通用资源的 readAny 权限(如果该角色没有配置该资源)
82
+ for (const commonResource of commonResources) {
83
+ if (!configuredResourceIds.has(commonResource.id)) {
84
+ grant.readAny(commonResource.name, ['*']);
85
+ }
86
+ }
87
+ }
88
+
89
+ this.rolesBuilder = newBuilder;
90
+ // console.log(
91
+ // `[__ROLE_PAGE_RESOURCE__] Roles built successfully with ${commonResources.length} common resources.`,
92
+ // );
93
+ return newBuilder;
94
+ }
95
+
96
+ async createOne(roleCreateArgs: Prisma.RoleCreateArgs) {
97
+ this.logger.info(
98
+ '[Role] Creating role',
99
+ createSafeLogData({
100
+ operation: 'CREATE',
101
+ table: 'role',
102
+ data: roleCreateArgs.data,
103
+ }),
104
+ );
105
+ const result = await this.prisma.role.create(roleCreateArgs);
106
+ this.logger.info(
107
+ '[Role] Role created successfully',
108
+ createSafeLogData({
109
+ operation: 'CREATE',
110
+ table: 'role',
111
+ result: result,
112
+ }),
113
+ );
114
+ return result;
115
+ }
116
+
117
+ /**
118
+ * 根据 pageIds 准备 roleResources 数据(从 pageResources 查询并合并 actions)
119
+ * @param pageIds 页面 ID 数组
120
+ * @returns roleResources 数据数组(不包含 roleId)
121
+ */
122
+ private async prepareRoleResourcesFromPages(
123
+ pageIds: number[],
124
+ ): Promise<Omit<Prisma.RoleResourceCreateManyInput, 'roleId'>[]> {
125
+ if (!pageIds || pageIds.length === 0) {
126
+ return [];
127
+ }
128
+
129
+ // 查询 pageResources 数据(在事务外查询是安全的,因为 pageResource 是相对静态的配置数据)
130
+ const pageResources = await this.prisma.pageResource.findMany({
131
+ where: {
132
+ pageId: { in: pageIds },
133
+ },
134
+ select: {
135
+ resourceId: true,
136
+ actions: true,
137
+ },
138
+ });
139
+
140
+ if (pageResources.length === 0) {
141
+ return [];
142
+ }
143
+
144
+ // 合并 actions(同一个 resource 可能在多个 page 中,需要取并集)
145
+ const resourceActionsMap = new Map<number, Set<string>>();
146
+
147
+ for (const pr of pageResources) {
148
+ const resourceId = pr.resourceId;
149
+ let actionsSet = resourceActionsMap.get(resourceId);
150
+
151
+ if (!actionsSet) {
152
+ actionsSet = new Set<string>();
153
+ resourceActionsMap.set(resourceId, actionsSet);
154
+ }
155
+
156
+ // 解析 actions(JSON 数组格式,如 ["readAny", "deleteAny"])
157
+ const actions = this.parseActions(pr.actions);
158
+ actions.forEach((action) => actionsSet.add(action));
159
+ }
160
+
161
+ return Array.from(resourceActionsMap.entries()).map(
162
+ ([resourceId, actionsSet]) => ({
163
+ resourceId,
164
+ actions: Array.from(actionsSet) as Prisma.InputJsonValue,
165
+ }),
166
+ );
167
+ }
168
+
169
+ /**
170
+ * 同步角色的页面权限和资源权限(用于事务数组)
171
+ * @param roleId 角色 ID
172
+ * @param pageIds 页面 ID 数组
173
+ * @param roleResourcesTemplate 资源权限模板数据(不包含 roleId)
174
+ * @returns 事务操作数组
175
+ */
176
+ private async syncRolePagesAndResources(
177
+ roleId: number,
178
+ pageIds: number[],
179
+ roleResourcesTemplate: Omit<Prisma.RoleResourceCreateManyInput, 'roleId'>[],
180
+ ): Promise<any[]> {
181
+ const operations: any[] = [];
182
+
183
+ // 查询当前角色的旧页面权限
184
+ const oldRolePages = await this.prisma.rolePages.findMany({
185
+ where: { roleId },
186
+ include: {
187
+ page: {
188
+ select: {
189
+ id: true,
190
+ name: true,
191
+ },
192
+ },
193
+ },
194
+ });
195
+
196
+ // 查询当前角色的旧资源权限
197
+ const oldRoleResources = await this.prisma.roleResource.findMany({
198
+ where: { roleId },
199
+ include: {
200
+ resource: {
201
+ select: {
202
+ id: true,
203
+ name: true,
204
+ isCommonResource: true,
205
+ },
206
+ },
207
+ },
208
+ });
209
+
210
+ const oldPageIds = oldRolePages.map((rp) => rp.pageId);
211
+ const newPageIds = pageIds;
212
+
213
+ // 计算页面变化
214
+ const pagesToDelete = oldRolePages.filter(
215
+ (rp) => !newPageIds.includes(rp.pageId),
216
+ );
217
+ const pagesToAdd = newPageIds.filter(
218
+ (pageId) => !oldPageIds.includes(pageId),
219
+ );
220
+
221
+ // 计算资源变化
222
+ const oldResourceMap = new Map(
223
+ oldRoleResources.map((rr) => [
224
+ rr.resourceId,
225
+ {
226
+ actions: rr.actions,
227
+ resourceName: rr.resource.name,
228
+ },
229
+ ]),
230
+ );
231
+
232
+ const newResourceMap = new Map(
233
+ roleResourcesTemplate.map((template) => [
234
+ template.resourceId,
235
+ {
236
+ actions: template.actions,
237
+ },
238
+ ]),
239
+ );
240
+
241
+ // 只删除那些:1) 不在新资源列表中,且 2) 不是通用资源的资源
242
+ // 通用资源(isCommonResource=true)不受页面变更影响,应该保留
243
+ const resourcesToDelete = oldRoleResources.filter(
244
+ (rr) =>
245
+ !newResourceMap.has(rr.resourceId) && !rr.resource.isCommonResource,
246
+ );
247
+
248
+ const resourcesToAdd = roleResourcesTemplate.filter(
249
+ (template) => !oldResourceMap.has(template.resourceId),
250
+ );
251
+
252
+ const resourcesToUpdate = roleResourcesTemplate.filter((template) => {
253
+ const oldResource = oldResourceMap.get(template.resourceId);
254
+ if (!oldResource) return false;
255
+ // 比较 actions 是否有变化(排序后再比较,避免顺序不同导致误判)
256
+ const oldActions = Array.isArray(oldResource.actions)
257
+ ? [...(oldResource.actions as string[])].sort()
258
+ : [];
259
+ const newActions = Array.isArray(template.actions)
260
+ ? [...(template.actions as string[])].sort()
261
+ : [];
262
+ return JSON.stringify(oldActions) !== JSON.stringify(newActions);
263
+ });
264
+
265
+ // 打印对比结果
266
+ console.log(
267
+ '\n[__ROLE_PAGE_RESOURCE__] ========== 角色权限变更对比 ==========',
268
+ );
269
+ console.log(`[__ROLE_PAGE_RESOURCE__] 角色 ID: ${roleId}`);
270
+ console.log('[__ROLE_PAGE_RESOURCE__] 【页面权限变化】');
271
+ console.log(
272
+ `[__ROLE_PAGE_RESOURCE__] 删除的页面 (${pagesToDelete.length}):`,
273
+ );
274
+ pagesToDelete.forEach((rp) => {
275
+ console.log(
276
+ `[__ROLE_PAGE_RESOURCE__] - [${rp.pageId}] ${rp.page.name}`,
277
+ );
278
+ });
279
+ console.log(`[__ROLE_PAGE_RESOURCE__] 新增的页面 (${pagesToAdd.length}):`);
280
+ for (const pageId of pagesToAdd) {
281
+ const page = await this.prisma.page.findUnique({
282
+ where: { id: pageId },
283
+ select: { id: true, name: true },
284
+ });
285
+ if (page) {
286
+ console.log(`[__ROLE_PAGE_RESOURCE__] + [${page.id}] ${page.name}`);
287
+ }
288
+ }
289
+
290
+ console.log('[__ROLE_PAGE_RESOURCE__] 【资源权限变化】');
291
+ console.log(
292
+ `[__ROLE_PAGE_RESOURCE__] 删除的资源 (${resourcesToDelete.length}):`,
293
+ );
294
+ resourcesToDelete.forEach((rr) => {
295
+ console.log(
296
+ `[__ROLE_PAGE_RESOURCE__] - [${rr.resourceId}] ${
297
+ rr.resource.name
298
+ } - actions: ${JSON.stringify(rr.actions)}`,
299
+ );
300
+ });
301
+
302
+ console.log(
303
+ `[__ROLE_PAGE_RESOURCE__] 新增的资源 (${resourcesToAdd.length}):`,
304
+ );
305
+ for (const template of resourcesToAdd) {
306
+ const resource = await this.prisma.resource.findUnique({
307
+ where: { id: template.resourceId },
308
+ select: { id: true, name: true },
309
+ });
310
+ if (resource) {
311
+ console.log(
312
+ `[__ROLE_PAGE_RESOURCE__] + [${resource.id}] ${
313
+ resource.name
314
+ } - actions: ${JSON.stringify(template.actions)}`,
315
+ );
316
+ }
317
+ }
318
+
319
+ console.log(
320
+ `[__ROLE_PAGE_RESOURCE__] 更新的资源 (${resourcesToUpdate.length}):`,
321
+ );
322
+ for (const template of resourcesToUpdate) {
323
+ const resource = await this.prisma.resource.findUnique({
324
+ where: { id: template.resourceId },
325
+ select: { id: true, name: true },
326
+ });
327
+ const oldResource = oldResourceMap.get(template.resourceId);
328
+ if (resource && oldResource) {
329
+ console.log(
330
+ `[__ROLE_PAGE_RESOURCE__] ~ [${resource.id}] ${resource.name}`,
331
+ );
332
+ console.log(
333
+ `[__ROLE_PAGE_RESOURCE__] 旧 actions: ${JSON.stringify(
334
+ oldResource.actions,
335
+ )}`,
336
+ );
337
+ console.log(
338
+ `[__ROLE_PAGE_RESOURCE__] 新 actions: ${JSON.stringify(
339
+ template.actions,
340
+ )}`,
341
+ );
342
+ }
343
+ }
344
+ // 1. 增量更新 rolePages:只删除需要删除的,只添加需要添加的
345
+ const pageIdsToDelete = pagesToDelete.map((rp) => rp.pageId);
346
+
347
+ if (pageIdsToDelete.length > 0) {
348
+ this.logger.info(
349
+ '[RolePages] Deleting role pages',
350
+ createSafeLogData({
351
+ operation: 'DELETE_MANY',
352
+ table: 'rolePages',
353
+ roleId: roleId,
354
+ pageIds: pageIdsToDelete,
355
+ }),
356
+ );
357
+ operations.push(
358
+ this.prisma.rolePages.deleteMany({
359
+ where: {
360
+ roleId,
361
+ pageId: { in: pageIdsToDelete },
362
+ },
363
+ }),
364
+ );
365
+ }
366
+
367
+ // 2. 如果有新的 pageIds,批量插入
368
+ if (pagesToAdd.length > 0) {
369
+ const rolePagesData = pagesToAdd.map((pageId) => ({
370
+ roleId,
371
+ pageId,
372
+ }));
373
+
374
+ this.logger.info(
375
+ '[RolePages] Creating role pages',
376
+ createSafeLogData({
377
+ operation: 'CREATE_MANY',
378
+ table: 'rolePages',
379
+ roleId: roleId,
380
+ data: rolePagesData,
381
+ }),
382
+ );
383
+ operations.push(
384
+ this.prisma.rolePages.createMany({
385
+ data: rolePagesData,
386
+ skipDuplicates: true,
387
+ }),
388
+ );
389
+ }
390
+
391
+ // 3. 只删除那些需要删除的资源(不是全部删除)
392
+ if (resourcesToDelete.length > 0) {
393
+ const resourceIdsToDelete = resourcesToDelete.map((rr) => rr.resourceId);
394
+ this.logger.info(
395
+ '[RoleResource] Deleting role resources',
396
+ createSafeLogData({
397
+ operation: 'DELETE_MANY',
398
+ table: 'roleResource',
399
+ roleId: roleId,
400
+ resourceIds: resourceIdsToDelete,
401
+ oldData: resourcesToDelete,
402
+ }),
403
+ );
404
+ operations.push(
405
+ this.prisma.roleResource.deleteMany({
406
+ where: {
407
+ roleId,
408
+ resourceId: {
409
+ in: resourceIdsToDelete,
410
+ },
411
+ },
412
+ }),
413
+ );
414
+ }
415
+
416
+ // 4. 插入新的资源权限
417
+ if (resourcesToAdd.length > 0) {
418
+ const roleResourcesData = resourcesToAdd.map((template) => ({
419
+ ...template,
420
+ roleId,
421
+ }));
422
+
423
+ this.logger.info(
424
+ '[RoleResource] Creating role resources',
425
+ createSafeLogData({
426
+ operation: 'CREATE_MANY',
427
+ table: 'roleResource',
428
+ roleId: roleId,
429
+ data: roleResourcesData,
430
+ }),
431
+ );
432
+ operations.push(
433
+ this.prisma.roleResource.createMany({
434
+ data: roleResourcesData,
435
+ skipDuplicates: true,
436
+ }),
437
+ );
438
+ }
439
+
440
+ // 5. 更新已存在但 actions 有变化的资源
441
+ if (resourcesToUpdate.length > 0) {
442
+ for (const template of resourcesToUpdate) {
443
+ const oldResource = oldResourceMap.get(template.resourceId);
444
+ this.logger.info(
445
+ '[RoleResource] Updating role resource',
446
+ createSafeLogData({
447
+ operation: 'UPDATE_MANY',
448
+ table: 'roleResource',
449
+ roleId: roleId,
450
+ resourceId: template.resourceId,
451
+ oldActions: oldResource?.actions,
452
+ newActions: template.actions,
453
+ }),
454
+ );
455
+ operations.push(
456
+ this.prisma.roleResource.updateMany({
457
+ where: {
458
+ roleId,
459
+ resourceId: template.resourceId,
460
+ },
461
+ data: {
462
+ actions: template.actions,
463
+ },
464
+ }),
465
+ );
466
+ }
467
+ }
468
+
469
+ return operations;
470
+ }
471
+
472
+ /**
473
+ * 刷新指定角色的所有资源权限
474
+ * 当页面的资源配置发生变化时,需要调用此方法重新计算角色的 RoleResource
475
+ */
476
+ async refreshRolePermissions(roleId: number) {
477
+ // 1. 获取角色当前关联的所有页面
478
+ const rolePages = await this.prisma.rolePages.findMany({
479
+ where: { roleId },
480
+ select: { pageId: true },
481
+ });
482
+ const pageIds = rolePages.map((rp) => rp.pageId);
483
+
484
+ // 2. 根据页面重新计算资源权限模板
485
+ const roleResourcesTemplate =
486
+ pageIds.length > 0
487
+ ? await this.prepareRoleResourcesFromPages(pageIds)
488
+ : [];
489
+
490
+ // 3. 生成同步操作
491
+ const operations = await this.syncRolePagesAndResources(
492
+ roleId,
493
+ pageIds,
494
+ roleResourcesTemplate,
495
+ );
496
+
497
+ // 4. 执行事务
498
+ if (operations.length > 0) {
499
+ this.logger.info(
500
+ `[RoleService] Refreshing permissions for role ${roleId}`,
501
+ );
502
+ await this.prisma.$transaction(operations);
503
+ }
504
+ }
505
+
506
+ /**
507
+ * 刷新所有关联了指定页面的角色的权限
508
+ * 当页面资源发生变更(新增/修改/删除)时调用
509
+ */
510
+ async refreshRolesWithPage(pageId: number) {
511
+ const rolePages = await this.prisma.rolePages.findMany({
512
+ where: { pageId },
513
+ select: { roleId: true },
514
+ });
515
+
516
+ this.logger.info(
517
+ `[RoleService] Found ${rolePages.length} roles associated with page ${pageId}, starting refresh...`,
518
+ );
519
+
520
+ for (const rp of rolePages) {
521
+ await this.refreshRolePermissions(rp.roleId);
522
+ }
523
+ }
524
+
525
+ /**
526
+ * 在事务中创建角色及其页面权限,确保原子性
527
+ * @param roleData 角色创建数据
528
+ * @param pageIds 页面 ID 数组(可选)
529
+ */
530
+ async createRoleWithPages(
531
+ roleData: Prisma.RoleCreateInput,
532
+ pageIds?: number[],
533
+ ) {
534
+ // 先准备 roleResources 数据模板
535
+ const roleResourcesTemplate =
536
+ pageIds && pageIds.length > 0
537
+ ? await this.prepareRoleResourcesFromPages(pageIds)
538
+ : [];
539
+
540
+ // 使用 Prisma 的嵌套创建语法,一次性完成所有操作
541
+ // 这样可以使用事务数组形式而非回调形式
542
+ const createData: Prisma.RoleCreateInput = {
543
+ ...roleData,
544
+ };
545
+
546
+ // 如果有 pageIds,添加嵌套创建
547
+ if (pageIds && pageIds.length > 0) {
548
+ createData.rolePages = {
549
+ create: pageIds.map((pageId) => ({ pageId })),
550
+ };
551
+
552
+ if (roleResourcesTemplate.length > 0) {
553
+ createData.roleResources = {
554
+ create: roleResourcesTemplate.map((template) => ({
555
+ resourceId: template.resourceId,
556
+ actions: template.actions,
557
+ })),
558
+ };
559
+ }
560
+ }
561
+
562
+ // 使用事务数组形式(而非回调形式)
563
+ this.logger.info(
564
+ '[Role] Creating role with pages in transaction',
565
+ createSafeLogData({
566
+ operation: 'CREATE_WITH_PAGES',
567
+ table: 'role',
568
+ roleData: roleData,
569
+ pageIds: pageIds,
570
+ roleResourcesTemplate: roleResourcesTemplate,
571
+ }),
572
+ );
573
+ const operations = [
574
+ this.prisma.role.create({
575
+ data: createData,
576
+ }),
577
+ ];
578
+
579
+ const results = await this.prisma.$transaction(operations);
580
+ this.logger.info(
581
+ '[Role] Role with pages created successfully',
582
+ createSafeLogData({
583
+ operation: 'CREATE_WITH_PAGES',
584
+ table: 'role',
585
+ result: results[0],
586
+ }),
587
+ );
588
+ return results[0];
589
+ }
590
+
591
+ /**
592
+ * 解析 actions 字段(支持多种格式)
593
+ * JSON 数组格式如: ["readAny", "deleteAny"]
594
+ */
595
+ private parseActions(actions: any): string[] {
596
+ if (!actions) return [];
597
+
598
+ // 如果已经是数组,直接返回
599
+ if (Array.isArray(actions)) {
600
+ return actions.map(String).filter(Boolean);
601
+ }
602
+
603
+ // 如果是字符串,尝试解析为 JSON
604
+ if (typeof actions === 'string') {
605
+ try {
606
+ const parsed = JSON.parse(actions);
607
+ if (Array.isArray(parsed)) {
608
+ return parsed.map(String).filter(Boolean);
609
+ }
610
+ // 如果不是数组,按逗号分隔
611
+ return actions
612
+ .split(',')
613
+ .map((s) => s.trim())
614
+ .filter(Boolean);
615
+ } catch {
616
+ // JSON 解析失败,按逗号分隔
617
+ return actions
618
+ .split(',')
619
+ .map((s) => s.trim())
620
+ .filter(Boolean);
621
+ }
622
+ }
623
+
624
+ return [];
625
+ }
626
+
627
+ async createMany(data: Prisma.RoleCreateManyArgs['data']) {
628
+ this.logger.info(
629
+ '[Role] Creating multiple roles',
630
+ createSafeLogData({
631
+ operation: 'CREATE_MANY',
632
+ table: 'role',
633
+ count: Array.isArray(data) ? data.length : 1,
634
+ data: data,
635
+ }),
636
+ );
637
+ const result = await this.prisma.role.createMany({
638
+ data,
639
+ skipDuplicates: true,
640
+ });
641
+ this.logger.info(
642
+ '[Role] Multiple roles created successfully',
643
+ createSafeLogData({
644
+ operation: 'CREATE_MANY',
645
+ table: 'role',
646
+ count: result.count,
647
+ }),
648
+ );
649
+ return result;
650
+ }
651
+
652
+ async findMany(
653
+ roleFindManyArgs: Prisma.RoleFindManyArgs,
654
+ ): Promise<{ itemCount: number; entities: Role[] }> {
655
+ const itemCount = await this.prisma.role.count({
656
+ where: roleFindManyArgs.where,
657
+ });
658
+ const entities = await this.prisma.role.findMany(roleFindManyArgs);
659
+ return { itemCount, entities };
660
+ }
661
+
662
+ async findUnique(id: number, select: Prisma.RoleFindUniqueArgs['select']) {
663
+ return await this.prisma.role.findUnique({
664
+ where: { id: id },
665
+ select,
666
+ });
667
+ }
668
+
669
+ async updateMany(roleUpdateManyArgs: Prisma.RoleUpdateManyArgs) {
670
+ this.logger.info(
671
+ '[Role] Updating multiple roles',
672
+ createSafeLogData({
673
+ operation: 'UPDATE_MANY',
674
+ table: 'role',
675
+ where: roleUpdateManyArgs.where,
676
+ data: roleUpdateManyArgs.data,
677
+ }),
678
+ );
679
+ const result = await this.prisma.role.updateMany(roleUpdateManyArgs);
680
+ this.logger.info(
681
+ '[Role] Multiple roles updated successfully',
682
+ createSafeLogData({
683
+ operation: 'UPDATE_MANY',
684
+ table: 'role',
685
+ count: result.count,
686
+ }),
687
+ );
688
+ return result;
689
+ }
690
+
691
+ async updateUnique(id: number, data: Prisma.RoleUpdateManyArgs['data']) {
692
+ const oldData = await this.prisma.role.findUnique({ where: { id } });
693
+ this.logger.info(
694
+ '[Role] Updating role',
695
+ createSafeLogData({
696
+ operation: 'UPDATE',
697
+ table: 'role',
698
+ id: id,
699
+ oldData: oldData,
700
+ newData: data,
701
+ }),
702
+ );
703
+ const result = await this.prisma.role.update({
704
+ where: { id: id },
705
+ data,
706
+ });
707
+ this.logger.info(
708
+ '[Role] Role updated successfully',
709
+ createSafeLogData({
710
+ operation: 'UPDATE',
711
+ table: 'role',
712
+ id: id,
713
+ result: result,
714
+ }),
715
+ );
716
+ return result;
717
+ }
718
+
719
+ /**
720
+ * 在事务中更新角色及其页面权限,确保原子性
721
+ * @param id 角色 ID
722
+ * @param roleData 角色更新数据
723
+ * @param pageIds 页面 ID 数组(可选)
724
+ */
725
+ async updateRoleWithPages(
726
+ id: number,
727
+ roleData: Prisma.RoleUpdateManyArgs['data'],
728
+ pageIds?: number[],
729
+ ) {
730
+ // 先准备 roleResources 数据模板
731
+ const roleResourcesTemplate =
732
+ pageIds && pageIds.length > 0
733
+ ? await this.prepareRoleResourcesFromPages(pageIds)
734
+ : [];
735
+
736
+ // 构建事务操作数组
737
+ const oldRole = await this.prisma.role.findUnique({ where: { id } });
738
+ this.logger.info(
739
+ '[Role] Updating role with pages in transaction',
740
+ createSafeLogData({
741
+ operation: 'UPDATE_WITH_PAGES',
742
+ table: 'role',
743
+ id: id,
744
+ oldData: oldRole,
745
+ newRoleData: roleData,
746
+ pageIds: pageIds,
747
+ roleResourcesTemplate: roleResourcesTemplate,
748
+ }),
749
+ );
750
+ const operations: any[] = [
751
+ // 1. 更新角色基本信息
752
+ this.prisma.role.update({
753
+ where: { id },
754
+ data: roleData,
755
+ }),
756
+ ];
757
+
758
+ // 2. 处理页面权限和资源权限更新
759
+ if (pageIds !== undefined && pageIds !== null) {
760
+ const syncOperations = await this.syncRolePagesAndResources(
761
+ id,
762
+ pageIds,
763
+ roleResourcesTemplate,
764
+ );
765
+ operations.push(...syncOperations);
766
+ }
767
+
768
+ // 执行事务,返回第一个操作的结果(更新后的角色)
769
+ const results = await this.prisma.$transaction(operations);
770
+ this.logger.info(
771
+ '[Role] Role with pages updated successfully',
772
+ createSafeLogData({
773
+ operation: 'UPDATE_WITH_PAGES',
774
+ table: 'role',
775
+ id: id,
776
+ result: results[0],
777
+ }),
778
+ );
779
+ return results[0];
780
+
781
+ // 暂时注释掉事务执行,仅返回更新后的角色信息
782
+ // console.log('⚠️ 数据库事务已被注释,不会实际执行更新操作');
783
+ // return await this.prisma.role.findUnique({
784
+ // where: { id },
785
+ // });
786
+ }
787
+
788
+ async deleteMany(roleDeleteManyArgs: Prisma.RoleDeleteManyArgs) {
789
+ const oldData = await this.prisma.role.findMany({
790
+ where: roleDeleteManyArgs.where,
791
+ });
792
+ this.logger.info(
793
+ '[Role] Deleting multiple roles',
794
+ createSafeLogData({
795
+ operation: 'DELETE_MANY',
796
+ table: 'role',
797
+ where: roleDeleteManyArgs.where,
798
+ oldData: oldData,
799
+ }),
800
+ );
801
+ const result = await this.prisma.role.deleteMany(roleDeleteManyArgs);
802
+ this.logger.info(
803
+ '[Role] Multiple roles deleted successfully',
804
+ createSafeLogData({
805
+ operation: 'DELETE_MANY',
806
+ table: 'role',
807
+ count: result.count,
808
+ }),
809
+ );
810
+ return result;
811
+ }
812
+
813
+ async deleteUnique(id: number) {
814
+ const oldData = await this.prisma.role.findUnique({ where: { id } });
815
+ this.logger.info(
816
+ '[Role] Deleting role',
817
+ createSafeLogData({
818
+ operation: 'DELETE',
819
+ table: 'role',
820
+ id: id,
821
+ oldData: oldData,
822
+ }),
823
+ );
824
+ await this.prisma.role.delete({
825
+ where: { id: id },
826
+ });
827
+ this.logger.info(
828
+ '[Role] Role deleted successfully',
829
+ createSafeLogData({
830
+ operation: 'DELETE',
831
+ table: 'role',
832
+ id: id,
833
+ }),
834
+ );
835
+ return { count: 1 };
836
+ }
837
+
838
+ async count(roleCountArgs?: Prisma.RoleCountArgs) {
839
+ return await this.prisma.role.count(roleCountArgs);
840
+ }
841
+
842
+ async groupBy(roleGroupByArgs: Prisma.RoleGroupByArgs) {
843
+ return await this.prisma.role.groupBy(roleGroupByArgs as any);
844
+ }
845
+
846
+ async aggregate(roleAggregateArgs: Prisma.RoleAggregateArgs) {
847
+ return await this.prisma.role.aggregate(roleAggregateArgs);
848
+ }
849
+ }