@gadmin2n/schematics 0.0.64 → 0.0.66

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 (198) 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 +170 -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/authProvider.ts +2 -2
  94. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/SqlModal.tsx +419 -0
  95. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/business/index.tsx +1 -1
  96. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/index.tsx +49 -51
  97. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/custom-avatar.tsx +38 -0
  98. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/index.ts +4 -0
  99. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/{header/index.tsx → header.tsx} +22 -31
  100. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/index.ts +3 -1
  101. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/layout.tsx +32 -0
  102. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/logo.tsx +19 -0
  103. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +331 -166
  104. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/title.tsx +61 -0
  105. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/pagination-total.tsx +21 -0
  106. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/tags/index.ts +1 -0
  107. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/tags/role-tag.tsx +44 -0
  108. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/text.tsx +74 -0
  109. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/http.ts +28 -0
  110. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +258 -0
  111. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +16 -0
  112. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/enums/audit-log.enum.ts +13 -0
  113. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/enums/index.ts +1 -0
  114. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/get-name-initials.ts +8 -0
  115. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/get-random-color.ts +27 -0
  116. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/http.ts +87 -0
  117. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/index.tsx +6 -1
  118. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/login.ts +22 -59
  119. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/utils.tsx +5 -0
  120. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +211 -0
  121. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useFetchData.ts +33 -0
  122. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useRoles.ts +30 -0
  123. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useUserPageAccess.ts +339 -0
  124. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/i18n.ts +8 -4
  125. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/index.tsx +3 -11
  126. package/dist/lib/application/files/gadmin2-game-angle-demo/web/{public → src}/locales/en/common.json +1 -1
  127. package/dist/lib/application/files/gadmin2-game-angle-demo/web/{public → src}/locales/zh_CN/common.json +1 -1
  128. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.css +3 -0
  129. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.tsx +134 -0
  130. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/create.tsx +113 -0
  131. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/edit.tsx +122 -0
  132. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.ts +8 -0
  133. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.tsx +6 -0
  134. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/list.tsx +213 -0
  135. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/show.tsx +61 -0
  136. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/AssignRolesModal.tsx +168 -0
  137. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/CreatePageModal.tsx +42 -0
  138. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/EditPageModal.tsx +42 -0
  139. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/PageDetailDrawer.tsx +101 -0
  140. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/PageFormModal.tsx +731 -0
  141. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/hooks/usePageManagement.ts +36 -0
  142. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/index.ts +1 -0
  143. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/list.tsx +1215 -0
  144. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/queries.ts +17 -0
  145. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/types.ts +45 -0
  146. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/permissionReadme/index.tsx +1089 -0
  147. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/CreateModal.tsx +25 -0
  148. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/EditModal.tsx +28 -0
  149. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/ResourceDetailDrawer.tsx +160 -0
  150. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/modal.tsx +202 -0
  151. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/index.ts +2 -0
  152. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/list.tsx +212 -0
  153. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/queries.ts +10 -0
  154. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/types.ts +9 -0
  155. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/CreateModal.tsx +30 -0
  156. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/EditModal.tsx +47 -0
  157. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/RoleDetailDrawer.tsx +56 -0
  158. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/modal.tsx +302 -0
  159. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/hooks/useRolePage.ts +35 -0
  160. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/index.ts +1 -0
  161. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/list.tsx +431 -0
  162. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/queries.ts +8 -0
  163. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/types.ts +8 -0
  164. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/create-modal.tsx +17 -0
  165. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/edit-modal.tsx +19 -0
  166. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/form-modal.tsx +188 -0
  167. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/index.ts +5 -0
  168. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/role-tag.tsx +48 -0
  169. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/show-drawer.tsx +140 -0
  170. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/index.ts +1 -0
  171. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/list.tsx +372 -0
  172. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/queries.ts +14 -0
  173. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd.css +132 -0
  174. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/fc.css +58 -0
  175. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/index.css +128 -0
  176. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-drawer.module.css +18 -0
  177. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-page.module.css +21 -0
  178. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/audit-log.ts +1 -0
  179. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/index.ts +3 -0
  180. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/role.ts +7 -0
  181. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/user.ts +1 -0
  182. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/vite-env.d.ts +1 -0
  183. package/dist/lib/application/files/gadmin2-game-angle-demo/web/tsconfig.json +5 -4
  184. package/dist/lib/application/files/gadmin2-game-angle-demo/web/vite.config.ts +31 -0
  185. package/dist/lib/application/files/gadmin2-game-angle-demo/web/yarn.lock +8321 -0
  186. package/package.json +1 -1
  187. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/sample.prisma +0 -65
  188. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Source.ts +0 -76
  189. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Tasklog.ts +0 -76
  190. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/roles.ts +0 -4
  191. package/dist/lib/application/files/gadmin2-game-angle-demo/web/craco.config.js +0 -27
  192. package/dist/lib/application/files/gadmin2-game-angle-demo/web/public/index.html +0 -53
  193. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/styles.ts +0 -10
  194. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/utils.ts +0 -76
  195. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/react-app-env.d.ts +0 -1
  196. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/reportWebVitals.ts +0 -15
  197. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd.less +0 -79
  198. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/VanillaJSONEditor/{index.js → index.jsx} +0 -0
@@ -0,0 +1,44 @@
1
+ import React from "react";
2
+
3
+ import { Tag } from "antd";
4
+
5
+ // Color mapping for different roles
6
+ const roleColorMap: Record<string, string> = {
7
+ OFFICE: "green",
8
+ CES: "blue",
9
+ INFRA: "purple",
10
+ FIT: "green",
11
+ SECURITY: "green",
12
+ COST: "gold",
13
+ HR: "orange",
14
+ HR_AMER: "coral",
15
+ HR_APAC: "khaki",
16
+ HR_EMEA: "amber",
17
+ HR_MALAYSIA: "pink",
18
+ HR_SINGAPORE: "lightblue",
19
+ OMC: "magenta",
20
+ PRODUCT: "cyan",
21
+ SYSTEM_ADMIN: "red",
22
+ FEATURE_IOA_DEVICE_IP: "green",
23
+ BUSINESS_TRIP: "teal",
24
+ };
25
+
26
+ type Props = {
27
+ role: string;
28
+ };
29
+
30
+ export const RoleStatusTag: React.FC<Props> = ({ role }) => {
31
+ const color = roleColorMap[role] || "blue";
32
+
33
+ return (
34
+ <Tag
35
+ style={{
36
+ textTransform: "capitalize",
37
+ }}
38
+ color={color}
39
+ title={role}
40
+ >
41
+ {role.toLowerCase()}
42
+ </Tag>
43
+ );
44
+ };
@@ -0,0 +1,74 @@
1
+ import React from "react";
2
+
3
+ import { ConfigProvider, Typography } from "antd";
4
+
5
+ export type TextProps = {
6
+ size?:
7
+ | "xs"
8
+ | "sm"
9
+ | "md"
10
+ | "lg"
11
+ | "xl"
12
+ | "xxl"
13
+ | "xxxl"
14
+ | "huge"
15
+ | "xhuge"
16
+ | "xxhuge";
17
+ } & React.ComponentProps<typeof Typography.Text>;
18
+
19
+ const sizes = {
20
+ xs: {
21
+ fontSize: 12,
22
+ lineHeight: 20 / 12,
23
+ },
24
+ sm: {
25
+ fontSize: 14,
26
+ lineHeight: 22 / 14,
27
+ },
28
+ md: {
29
+ fontSize: 16,
30
+ lineHeight: 24 / 16,
31
+ },
32
+ lg: {
33
+ fontSize: 20,
34
+ lineHeight: 28 / 20,
35
+ },
36
+ xl: {
37
+ fontSize: 24,
38
+ lineHeight: 32 / 24,
39
+ },
40
+ xxl: {
41
+ fontSize: 30,
42
+ lineHeight: 38 / 30,
43
+ },
44
+ xxxl: {
45
+ fontSize: 38,
46
+ lineHeight: 46 / 38,
47
+ },
48
+ huge: {
49
+ fontSize: 46,
50
+ lineHeight: 54 / 46,
51
+ },
52
+ xhuge: {
53
+ fontSize: 56,
54
+ lineHeight: 64 / 56,
55
+ },
56
+ xxhuge: {
57
+ fontSize: 68,
58
+ lineHeight: 76 / 68,
59
+ },
60
+ };
61
+
62
+ export const Text: React.FC<TextProps> = ({ size = "sm", children, ...rest }) => {
63
+ return (
64
+ <ConfigProvider
65
+ theme={{
66
+ token: {
67
+ ...sizes[size],
68
+ },
69
+ }}
70
+ >
71
+ <Typography.Text {...rest}>{children}</Typography.Text>
72
+ </ConfigProvider>
73
+ );
74
+ };
@@ -0,0 +1,28 @@
1
+ // ─── URL / 部署配置 ───────────────────────────────────────────────────────────
2
+ /**
3
+ * 读取部署子路径(Vite env: VITE_DEPLOY_NAME)
4
+ * 本地开发不设置时返回空字符串
5
+ */
6
+ export function getUrlBasename(): string {
7
+ if (
8
+ typeof import.meta !== "undefined" &&
9
+ import.meta.env?.VITE_DEPLOY_NAME?.trim()
10
+ ) {
11
+ return `/${import.meta.env.VITE_DEPLOY_NAME.trim()}`;
12
+ }
13
+ return "";
14
+ }
15
+
16
+ /**
17
+ * 读取后端 API 根路径(Vite env: VITE_API_URL 优先)
18
+ * 本地开发时自动将前端 3000 端口映射到后端 8000 端口
19
+ */
20
+ export function getApiUrl(): string {
21
+ if (
22
+ typeof import.meta !== "undefined" &&
23
+ import.meta.env?.VITE_API_URL?.trim()
24
+ ) {
25
+ return import.meta.env.VITE_API_URL.trim();
26
+ }
27
+ return `${window.location.origin.replace("3000", "8000")}${getUrlBasename()}/api`;
28
+ }
@@ -0,0 +1,258 @@
1
+ import React, { lazy, Suspense } from "react";
2
+ import { Outlet, Route } from "react-router-dom";
3
+ import { Spin } from "antd";
4
+ import generatedResources from "generated/resources";
5
+
6
+ // ─── Types ───────────────────────────────────────────────────────────────────
7
+
8
+ type LazyComp = React.LazyExoticComponent<React.ComponentType<any>>;
9
+ // Allow both lazy and eagerly-imported components (generated/resources uses the latter)
10
+ type AnyComp = React.ComponentType<any>;
11
+
12
+ interface RouteEntry {
13
+ path: string;
14
+ component?: LazyComp | AnyComp;
15
+ wrapper?: LazyComp | AnyComp;
16
+ index?: boolean;
17
+ children?: Record<string, RouteEntry>;
18
+ }
19
+
20
+ // ─── Data-Mngt dynamic route helpers ─────────────────────────────────────────
21
+
22
+ /**
23
+ * Resource names already covered by the static registry entries below.
24
+ * These must NOT be auto-registered again under dataMngt.
25
+ */
26
+ const SYSTEM_RESOURCE_NAMES = new Set([
27
+ "user", "role", "page", "resource", "audit",
28
+ "game", "roleResource", "pageResource", "rolePages",
29
+ ]);
30
+
31
+ /** camelCase → PascalCase (reverses toCamelCase in seedDataMngtPages) */
32
+ function toPascalCase(str: string): string {
33
+ return str.charAt(0).toUpperCase() + str.slice(1);
34
+ }
35
+
36
+ /**
37
+ * PascalCase → kebab-case (same algorithm as seedDataMngtPages.ts so the
38
+ * generated route path always matches the page.path stored in the DB).
39
+ * "Event" → "event"
40
+ * "ITActivityDay" → "it-activity-day"
41
+ */
42
+ function toKebabCase(str: string): string {
43
+ return str
44
+ .replace(/([a-z0-9])([A-Z])/g, "$1-$2")
45
+ .replace(/([A-Z]+)([A-Z][a-z])/g, "$1-$2")
46
+ .toLowerCase();
47
+ }
48
+
49
+ /**
50
+ * Build RouteEntry children for the dataMngt segment by scanning
51
+ * generated/resources.tsx (produced by gadmin2 on every `generate:dev`).
52
+ *
53
+ * Each business-model resource becomes:
54
+ * <Route path="<slug>">
55
+ * <Route index element={<List />} />
56
+ * <Route path="show/:id" element={<Show />} />
57
+ * <Route path="edit/:id" element={<Edit />} />
58
+ * <Route path="create" element={<Create />} />
59
+ * </Route>
60
+ */
61
+ function buildDataMngtChildren(): Record<string, RouteEntry> {
62
+ const children: Record<string, RouteEntry> = {};
63
+
64
+ for (const res of generatedResources) {
65
+ if (SYSTEM_RESOURCE_NAMES.has(res.name)) continue;
66
+
67
+ // generated/resources stores components in meta.components
68
+ const { list: ListComp, show: ShowComp, edit: EditComp, create: CreateComp } =
69
+ (res.meta as any).components ?? {};
70
+
71
+ if (!ListComp) continue;
72
+
73
+ // Derive the URL slug from the PascalCase model name so it matches
74
+ // what seedDataMngtPages.ts writes into page.path.
75
+ const slug = toKebabCase(toPascalCase(res.name));
76
+
77
+ children[res.name] = {
78
+ path: slug,
79
+ // No component on the parent — React Router renders <Outlet /> so that
80
+ // the index / show / edit / create children can each occupy the full view.
81
+ children: {
82
+ list: { path: "", index: true, component: ListComp as AnyComp },
83
+ show: { path: "show/:id", component: ShowComp as AnyComp },
84
+ edit: { path: "edit/:id", component: EditComp as AnyComp },
85
+ create: { path: "create", component: CreateComp as AnyComp },
86
+ },
87
+ };
88
+ }
89
+
90
+ return children;
91
+ }
92
+
93
+ // ─── Suspense wrapper ────────────────────────────────────────────────────────
94
+
95
+ const S = ({ children }: { children: React.ReactNode }) => (
96
+ <Suspense fallback={<Spin size="large" />}>{children}</Suspense>
97
+ );
98
+
99
+ // ─── Route Registry ──────────────────────────────────────────────────────────
100
+
101
+ export const routeRegistry: Record<string, RouteEntry> = {
102
+ // ── Administration ─────────────────────────────────────────────────────────
103
+ admin: {
104
+ path: "/admin",
105
+ children: {
106
+ permission: {
107
+ path: "permission",
108
+ children: {
109
+ // 菜单指引 — sortOrder 1020, code: admin.permission.readme
110
+ permission_readme: {
111
+ path: "readme",
112
+ component: lazy(() =>
113
+ import("routes/permissionReadme").then((m) => ({
114
+ default: m.PermissionReadmePage,
115
+ })),
116
+ ),
117
+ },
118
+ // 用户管理 — sortOrder 1030, code: admin.permission.user
119
+ user: {
120
+ path: "user",
121
+ component: lazy(() =>
122
+ import("routes/user").then((m) => ({ default: m.UserListPage })),
123
+ ),
124
+ },
125
+ // 角色管理 — sortOrder 1040, code: admin.permission.role
126
+ role: {
127
+ path: "role-list",
128
+ component: lazy(() =>
129
+ import("routes/role").then((m) => ({
130
+ default: m.RoleManagementListPage,
131
+ })),
132
+ ),
133
+ },
134
+ // 页面管理 — sortOrder 1050, code: admin.permission.page
135
+ page: {
136
+ path: "page-list",
137
+ component: lazy(() =>
138
+ import("routes/page/list").then((m) => ({
139
+ default: m.PageManagementListPage,
140
+ })),
141
+ ),
142
+ },
143
+ // 资源管理 — sortOrder 1060, code: admin.permission.resource
144
+ resource: {
145
+ path: "resource-list",
146
+ component: lazy(() =>
147
+ import("routes/resource").then((m) => ({
148
+ default: m.ResourceManagementListPage,
149
+ })),
150
+ ),
151
+ },
152
+ },
153
+ },
154
+ dataMngt: {
155
+ path: "data-mngt",
156
+ children: buildDataMngtChildren(),
157
+ },
158
+ game: {
159
+ path: "game-list",
160
+ children: {
161
+ list: { path: "", index: true, component: lazy(() => import("routes/game").then((m) => ({ default: m.GameList }))) },
162
+ show: { path: "show/:id", component: lazy(() => import("routes/game").then((m) => ({ default: m.GameShow }))) },
163
+ edit: { path: "edit/:id", component: lazy(() => import("routes/game").then((m) => ({ default: m.GameEdit }))) },
164
+ create: { path: "create", component: lazy(() => import("routes/game").then((m) => ({ default: m.GameCreate }))) },
165
+ },
166
+ },
167
+ // 操作日志 — sortOrder 1070, code: admin.audit
168
+ audits: {
169
+ path: "audit-log-list",
170
+ component: lazy(() =>
171
+ import("routes/audit").then((m) => ({ default: m.AuditLogPage })),
172
+ ),
173
+ },
174
+ },
175
+ },
176
+ };
177
+
178
+ // ─── Path Index (getRoutePath) ────────────────────────────────────────────────
179
+
180
+ function buildPathIndex(
181
+ entries: Record<string, RouteEntry>,
182
+ parentPath = "",
183
+ ): Record<string, string> {
184
+ const result: Record<string, string> = {};
185
+ for (const [key, entry] of Object.entries(entries)) {
186
+ const fullPath = entry.path.startsWith("/")
187
+ ? entry.path
188
+ : entry.path === ""
189
+ ? parentPath
190
+ : entry.path.startsWith("?")
191
+ ? parentPath + entry.path
192
+ : parentPath + "/" + entry.path;
193
+ result[key] = fullPath;
194
+ if (entry.children) {
195
+ Object.assign(result, buildPathIndex(entry.children, fullPath.split("?")[0]));
196
+ }
197
+ }
198
+ return result;
199
+ }
200
+
201
+ const pathIndex = buildPathIndex(routeRegistry);
202
+
203
+ export function getRoutePath(pageCode: string): string | null {
204
+ return pathIndex[pageCode] ?? null;
205
+ }
206
+
207
+ // ─── renderRoutes() ──────────────────────────────────────────────────────────
208
+
209
+ function renderEntry(key: string, entry: RouteEntry): React.ReactElement | null {
210
+ let element: React.ReactNode | undefined;
211
+ if (entry.component) {
212
+ const Comp = entry.component;
213
+ element = (
214
+ <S>
215
+ <Comp />
216
+ </S>
217
+ );
218
+ } else if (entry.wrapper) {
219
+ const W = entry.wrapper;
220
+ element = (
221
+ <S>
222
+ <W>
223
+ <Outlet />
224
+ </W>
225
+ </S>
226
+ );
227
+ }
228
+
229
+ if (entry.index) {
230
+ return <Route key={key} index element={element ?? null} />;
231
+ }
232
+
233
+ const routePath = entry.path.split("?")[0];
234
+
235
+ const childRoutes = Object.entries(entry.children ?? {})
236
+ .map(([k, e]) => renderEntry(k, e))
237
+ .filter(Boolean);
238
+
239
+ // Sidebar-only: no element, no renderable children
240
+ if (!element && childRoutes.length === 0) return null;
241
+
242
+ return childRoutes.length > 0 ? (
243
+ <Route key={key} path={routePath} element={element ?? <Outlet />}>
244
+ {childRoutes}
245
+ </Route>
246
+ ) : (
247
+ <Route key={key} path={routePath} element={element!} />
248
+ );
249
+ }
250
+
251
+ // Memoized at module level — registry is static, routes never change
252
+ const cachedRoutes: React.ReactElement[] = Object.entries(routeRegistry)
253
+ .map(([key, entry]) => renderEntry(key, entry))
254
+ .filter(Boolean) as React.ReactElement[];
255
+
256
+ export function renderRoutes(): React.ReactElement[] {
257
+ return cachedRoutes;
258
+ }
@@ -0,0 +1,16 @@
1
+ /** List / Create 页面顶层组件的内容区样式 */
2
+ export const LIST_CONTENT_PROPS = {
3
+ style: { marginTop: "1rem" },
4
+ } as const;
5
+
6
+ /** Show 页面顶层组件的内容区样式 */
7
+ export const SHOW_CONTENT_PROPS = {
8
+ style: {
9
+ backgroundColor: "#f5f5f5",
10
+ padding: 0,
11
+ marginTop: "1rem",
12
+ },
13
+ bodyStyle: {
14
+ padding: 0,
15
+ },
16
+ } as const;
@@ -0,0 +1,13 @@
1
+ export enum AuditLogActionEnum {
2
+ create = "create",
3
+ update = "update",
4
+ delete = "delete",
5
+ download = "download",
6
+ }
7
+
8
+ export const auditLogActionOptions = [
9
+ { label: "Create", value: AuditLogActionEnum.create },
10
+ { label: "Update", value: AuditLogActionEnum.update },
11
+ { label: "Delete", value: AuditLogActionEnum.delete },
12
+ { label: "Download", value: AuditLogActionEnum.download },
13
+ ];
@@ -0,0 +1 @@
1
+ export * from "./audit-log.enum";
@@ -0,0 +1,8 @@
1
+ export const getNameInitials = (name: string, count = 2) => {
2
+ const initials = name
3
+ .split(" ")
4
+ .map((n) => n[0])
5
+ .join("");
6
+ const filtered = initials.replace(/[^a-zA-Z]/g, "");
7
+ return filtered.slice(0, count).toUpperCase();
8
+ };
@@ -0,0 +1,27 @@
1
+ /*
2
+ * generates random colors from https://ant.design/docs/spec/colors. <color-4> used.
3
+ */
4
+ export const getRandomColorFromString = (text: string) => {
5
+ const colors = [
6
+ "#ff9c6e",
7
+ "#ff7875",
8
+ "#ffc069",
9
+ "#ffd666",
10
+ "#fadb14",
11
+ "#95de64",
12
+ "#5cdbd3",
13
+ "#69c0ff",
14
+ "#85a5ff",
15
+ "#b37feb",
16
+ "#ff85c0",
17
+ ];
18
+
19
+ let hash = 0;
20
+ for (let i = 0; i < text.length; i++) {
21
+ hash = text.charCodeAt(i) + ((hash << 5) - hash);
22
+ hash = hash & hash;
23
+ }
24
+ hash = ((hash % colors.length) + colors.length) % colors.length;
25
+
26
+ return colors[hash];
27
+ };
@@ -0,0 +1,87 @@
1
+ import axios from "axios";
2
+ import {
3
+ GadminCrud as gadminDataProvider,
4
+ applyErrorInterceptor,
5
+ customRequest as baseCustomRequest,
6
+ } from "@gadmin2n/react-common";
7
+ import { login, requestHeaders } from "./login";
8
+ import { getApiUrl } from "config/http";
9
+ // Re-export Prisma helpers from react-common for backward compatibility
10
+ export { convertPrismaDecimal, isPrismaDecimal } from "@gadmin2n/react-common";
11
+
12
+ const apiUrl = getApiUrl();
13
+
14
+ const axiosInstance = axios.create();
15
+
16
+ // 注入 auth header
17
+ axiosInstance.interceptors.request.use(
18
+ (config) => {
19
+ if (config.headers) {
20
+ Object.assign(config.headers, requestHeaders());
21
+ }
22
+ return config;
23
+ },
24
+ (error) => Promise.reject(error)
25
+ );
26
+
27
+ // 处理 401 跳转登录、403 跳权限页(app 层特有逻辑,须在 applyErrorInterceptor 之前注册)
28
+ axiosInstance.interceptors.response.use(
29
+ (response) => response,
30
+ (error) => {
31
+ if (error?.response?.status === 401) {
32
+ console.log("login expired");
33
+ login();
34
+ // 返回pending状态的promise,以免后续代码出错
35
+ return new Promise(() => {});
36
+ }
37
+ if (error?.response?.status === 403) {
38
+ // 已经在 /403 页面则不再跳转,防止死循环
39
+ if (!window.location.pathname.endsWith("/403")) {
40
+ window.location.href = "/403";
41
+ }
42
+ return new Promise(() => {});
43
+ }
44
+ return Promise.reject(error);
45
+ }
46
+ );
47
+
48
+ // 统一错误格式化(复用公共库逻辑,消除重复代码)
49
+ applyErrorInterceptor(axiosInstance);
50
+
51
+
52
+
53
+ export const gadminCrudProvider = gadminDataProvider(apiUrl, axiosInstance);
54
+
55
+ /**
56
+ * 直接用 fetch 发 findMany 请求(绕开 refine DataProvider,适合非 React 上下文)
57
+ */
58
+ export async function findMany<T>(
59
+ resource: string,
60
+ params: Record<string, any>
61
+ ): Promise<T[]> {
62
+ const url = `${apiUrl}/${resource}/findMany`;
63
+ const res = await fetch(url, {
64
+ method: "POST",
65
+ headers: {
66
+ "Content-Type": "application/json",
67
+ ...requestHeaders(),
68
+ },
69
+ body: JSON.stringify(params),
70
+ });
71
+ const data = await res.json();
72
+ return data.data as T[];
73
+ }
74
+
75
+ /**
76
+ * 向后端发送原始 HTTP 请求(绕开 refine DataProvider)。
77
+ * 底层复用公共库的 customRequest,自动携带当前 app 的 auth header 及错误拦截。
78
+ */
79
+ export async function customRequest<T>(
80
+ urlPath: string,
81
+ method: string,
82
+ params?: Record<string, any>
83
+ ) {
84
+ return baseCustomRequest<T>(axiosInstance, apiUrl, urlPath, method, params);
85
+ }
86
+
87
+
@@ -1,3 +1,8 @@
1
1
  export * from './list';
2
2
  export * from './form';
3
- export * from './show';
3
+ export * from './show';
4
+ export * from './login';
5
+ export * from './utils';
6
+ export * from './http';
7
+ export * from './get-name-initials';
8
+ export * from './get-random-color';
@@ -1,68 +1,22 @@
1
- import axios from "axios";
2
- import { GadminCrud as gadminDataProvider } from "@gadmin2n/react-common";
3
- import { HttpError } from "@refinedev/core";
4
- import { getApiUrl, getUrlParams } from "./utils";
5
1
  import Cookies from "js-cookie";
2
+ import { getApiUrl } from "config/http";
6
3
 
7
4
  export const GAdminTokenName = "gadmin-token";
8
5
 
6
+ export function getUrlParams(search = window.location.search) {
7
+ const hashes = search.slice(search.indexOf("?") + 1).split("&");
8
+ return hashes.reduce((acc, hash) => {
9
+ const [key, val] = hash.split("=");
10
+ if (val) acc[key] = decodeURIComponent(val);
11
+ return acc;
12
+ }, {} as Record<string, string>);
13
+ }
14
+
9
15
  type LoginCookie = {
10
16
  gadminToken?: string;
11
17
  };
12
18
 
13
- const axiosInstance = axios.create();
14
-
15
- axiosInstance.interceptors.request.use(
16
- (config) => {
17
- if (config.headers) {
18
- const headers = requestHeaders();
19
- Object.assign(config.headers, headers);
20
- }
21
- return config;
22
- },
23
- (error) => {
24
- return Promise.reject(error);
25
- }
26
- );
27
-
28
- axiosInstance.interceptors.response.use(
29
- (response) => {
30
- return response;
31
- },
32
- (error) => {
33
- if (error?.response?.status === 401) {
34
- console.log("login expired");
35
- login();
36
- // 返回pending状态的promise,以免后续代码出错
37
- return new Promise(() => {});
38
- }
39
- let message = error.response?.data?.message;
40
- if (message) {
41
- if (Array.isArray(message)) {
42
- message = message.join(" AND ");
43
- } else if (typeof message === "string") {
44
- if (message.includes("Unique constraint")) {
45
- message = `Unique constraint ${
46
- message.split("Unique constraint")[1]
47
- }`;
48
- } else {
49
- let strings = message.split(")");
50
- message = strings[strings.length - 1];
51
- }
52
- }
53
- }
54
- const customError: HttpError = {
55
- ...error,
56
- message: `${error?.response?.statusText || ""}: ${message}`,
57
- statusCode: error?.response?.status || 500,
58
- };
59
-
60
- return Promise.reject(customError);
61
- }
62
- );
63
-
64
- const apiUrl = getApiUrl();
65
- export const gadminCrudProvider = gadminDataProvider(apiUrl, axiosInstance);
19
+ // ─── 认证 / 会话 ──────────────────────────────────────────────────────────────
66
20
 
67
21
  export function login() {
68
22
  // woa域名直接刷新页面
@@ -71,6 +25,7 @@ export function login() {
71
25
  return;
72
26
  }
73
27
  clearLoginCookie();
28
+ const apiUrl = getApiUrl();
74
29
  window.location.href = `${apiUrl}/login?redirect_url=${encodeURIComponent(
75
30
  window.location.href
76
31
  )}`;
@@ -78,6 +33,7 @@ export function login() {
78
33
 
79
34
  export function logout() {
80
35
  clearLoginCookie();
36
+ const apiUrl = getApiUrl();
81
37
  window.location.href = `${apiUrl}/logout?redirect_url=${encodeURIComponent(
82
38
  window.location.origin
83
39
  )}`;
@@ -116,9 +72,16 @@ export function clearLoginCookie() {
116
72
 
117
73
  export function requestHeaders() {
118
74
  const gadminToken = Cookies.get(GAdminTokenName);
119
- const headers = {
75
+ const business = JSON.parse(Cookies.get("Business") || "{}");
76
+ return {
120
77
  "X-Requested-With": "XMLHttpRequest",
78
+ // 防止 business.name 含中文等非 ASCII 字符导致 HTTP header 500
79
+ ...(Object.keys(business).length > 0 && {
80
+ "X-Gadmin-Business": JSON.stringify({
81
+ ...business,
82
+ name: encodeURIComponent(business.name),
83
+ }),
84
+ }),
121
85
  ...(gadminToken && { [GAdminTokenName]: gadminToken }),
122
86
  };
123
- return headers;
124
87
  }