@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.
- package/dist/lib/application/files/gadmin2-game-angle-demo/.dockerignore +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/Dockerfile +40 -26
- package/dist/lib/application/files/gadmin2-game-angle-demo/Jenkinsfile +30 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/example.prisma +33 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/system.prisma +163 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Event.ts +70 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Game.ts +6 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/ITActivityDay.ts +70 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Log.ts +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Role.ts +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/.env +20 -9
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/.env.local +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/.eslintrc.js +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/.prettierignore +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/README.md +2 -18
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/gadmin-cli.json +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/migrate-between-pg-schemas.js +1232 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +65 -38
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/prisma/.generator.prisma +4 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/prisma.config.ts +16 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/games.ts +1 -71
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/index.ts +17 -21
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/permissions.ts +278 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/seedDataMngtPages.ts +258 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/users.ts +7 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/alias.config.ts +7 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/app.controller.ts +151 -11
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/app.module.ts +29 -13
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/app.service.ts +151 -12
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/auth.guard.ts +87 -41
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/http-cache.interceptor.ts +21 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/logger.ts +19 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/safe-log.util.ts +176 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/{yufuid.ts → taihu.ts} +49 -34
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/tracing.ts +174 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/trim.pipe.ts +51 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/utils.ts +91 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/woaAuth.ts +25 -12
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/main.ts +22 -12
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.controller.spec.ts +20 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.controller.ts +190 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.module.ts +10 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.service.spec.ts +338 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.service.ts +83 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.controller.spec.ts +20 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.controller.ts +188 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.module.ts +10 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.service.spec.ts +18 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.service.ts +83 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.controller.spec.ts +20 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.controller.ts +250 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.module.ts +10 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.service.spec.ts +18 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.service.ts +1051 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.controller.spec.ts +20 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.controller.ts +196 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.module.ts +13 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.service.spec.ts +18 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.service.ts +219 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.controller.spec.ts +20 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.controller.ts +196 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.module.ts +10 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.service.spec.ts +18 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.service.ts +199 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.controller.spec.ts +20 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.controller.ts +210 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.module.ts +12 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.service.spec.ts +18 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.service.ts +849 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/roles-refresher.service.ts +133 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.controller.spec.ts +20 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.controller.ts +196 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.module.ts +10 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.service.spec.ts +18 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.service.ts +201 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.controller.spec.ts +20 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.controller.ts +196 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.module.ts +10 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.service.spec.ts +18 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.service.ts +216 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.controller.spec.ts +20 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.controller.ts +198 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.module.ts +10 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.service.spec.ts +18 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.service.ts +104 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/start-prod.sh +130 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/tsconfig.json +18 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/index.html +19 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +34 -42
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/postcss.config.cjs +6 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/App.tsx +111 -185
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/auditLogProvider.ts +5 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/index.tsx +49 -51
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/custom-avatar.tsx +38 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/index.ts +4 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/{header/index.tsx → header.tsx} +22 -31
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/index.ts +3 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/layout.tsx +32 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/logo.tsx +19 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +331 -166
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/title.tsx +61 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/pagination-total.tsx +21 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/tags/index.ts +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/tags/role-tag.tsx +44 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/text.tsx +74 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +258 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +16 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/enums/audit-log.enum.ts +13 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/enums/index.ts +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/form.tsx +2 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/login.ts +22 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +211 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useFetchData.ts +33 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useRoles.ts +30 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useUserPageAccess.ts +339 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/i18n.ts +8 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/index.tsx +3 -11
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/{public → src}/locales/en/common.json +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/{public → src}/locales/zh_CN/common.json +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.css +3 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.tsx +134 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/create.tsx +113 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/edit.tsx +122 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.ts +8 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.tsx +6 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/list.tsx +213 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/show.tsx +61 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/AssignRolesModal.tsx +168 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/CreatePageModal.tsx +42 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/EditPageModal.tsx +42 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/PageDetailDrawer.tsx +101 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/PageFormModal.tsx +731 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/create.tsx +113 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/edit.tsx +122 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/hooks/usePageManagement.ts +36 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/index.ts +8 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/index.tsx +6 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/list.tsx +1113 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/queries.ts +17 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/show.tsx +61 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/types.ts +44 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/pageResource/create.tsx +113 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/pageResource/edit.tsx +122 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/pageResource/index.tsx +6 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/pageResource/list.tsx +243 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/pageResource/show.tsx +61 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/permission-readme/index.tsx +1088 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/CreateModal.tsx +25 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/EditModal.tsx +28 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/ResourceDetailDrawer.tsx +160 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/modal.tsx +202 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/create.tsx +113 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/edit.tsx +122 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/index.ts +9 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/index.tsx +6 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/list.tsx +184 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/queries.ts +10 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/show.tsx +61 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/types.ts +9 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/CreateModal.tsx +30 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/EditModal.tsx +47 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/RoleDetailDrawer.tsx +56 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/modal.tsx +302 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/create.tsx +113 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/edit.tsx +122 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/hooks/useRolePage.ts +35 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/index.ts +8 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/index.tsx +6 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/list.tsx +382 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/queries.ts +8 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/show.tsx +61 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/types.ts +8 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/rolePages/create.tsx +113 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/rolePages/edit.tsx +122 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/rolePages/index.tsx +6 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/rolePages/list.tsx +243 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/rolePages/show.tsx +61 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/roleResource/create.tsx +113 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/roleResource/edit.tsx +122 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/roleResource/index.tsx +6 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/roleResource/list.tsx +243 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/roleResource/show.tsx +61 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/create-modal.tsx +17 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/edit-modal.tsx +19 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/form-modal.tsx +188 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/index.ts +5 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/role-tag.tsx +48 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/show-drawer.tsx +140 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/create.tsx +113 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/edit.tsx +122 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/index.ts +8 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/index.tsx +6 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/list.tsx +342 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/queries.ts +14 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/show.tsx +61 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd.css +132 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/fc.css +58 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/index.css +128 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-drawer.module.css +18 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-page.module.css +21 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/audit-log.ts +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/index.ts +3 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/role.ts +7 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/user.ts +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/utilities/get-name-initials.ts +8 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/utilities/get-random-color.ts +27 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/utilities/index.ts +2 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/utilities/utils.tsx +5 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/vite-env.d.ts +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/tsconfig.json +3 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/vite.config.ts +31 -0
- package/package.json +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/sample.prisma +0 -65
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Source.ts +0 -76
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Tasklog.ts +0 -76
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/roles.ts +0 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/craco.config.js +0 -27
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/public/index.html +0 -53
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/styles.ts +0 -10
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/react-app-env.d.ts +0 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/reportWebVitals.ts +0 -15
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd.less +0 -79
- /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/VanillaJSONEditor/{index.js → index.jsx} +0 -0
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { PrismaClient } from '@prisma/client';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
|
|
5
|
+
const FULL_ACTIONS = ['createAny', 'readAny', 'updateAny', 'deleteAny'];
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Path to config/prisma/ — two levels up from server/seed/
|
|
9
|
+
* (project-root/config/prisma/)
|
|
10
|
+
*/
|
|
11
|
+
const PRISMA_CONFIG_DIR = path.resolve(__dirname, '..', '..', 'config', 'prisma');
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Prisma files that define system/permission models and must NOT be scanned.
|
|
15
|
+
* These are already handled by seedPermissions().
|
|
16
|
+
*/
|
|
17
|
+
const EXCLUDED_FILES = new Set(['system.prisma']);
|
|
18
|
+
|
|
19
|
+
// ─── Name Converters ──────────────────────────────────────────────────────────
|
|
20
|
+
|
|
21
|
+
/** PascalCase → camelCase (e.g. "Event" → "event", "ITActivityDay" → "iTActivityDay") */
|
|
22
|
+
function toCamelCase(str: string): string {
|
|
23
|
+
return str.charAt(0).toLowerCase() + str.slice(1);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* PascalCase → kebab-case
|
|
28
|
+
* "Event" → "event"
|
|
29
|
+
* "ITActivityDay" → "it-activity-day"
|
|
30
|
+
* "GameList" → "game-list"
|
|
31
|
+
*/
|
|
32
|
+
function toKebabCase(str: string): string {
|
|
33
|
+
return str
|
|
34
|
+
// Insert hyphen between a lowercase/digit and an uppercase letter
|
|
35
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1-$2')
|
|
36
|
+
// Insert hyphen between a run of uppercase letters and an uppercase+lowercase pair
|
|
37
|
+
.replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2')
|
|
38
|
+
.toLowerCase();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// ─── Prisma File Parser ───────────────────────────────────────────────────────
|
|
42
|
+
|
|
43
|
+
interface ModelInfo {
|
|
44
|
+
/** PascalCase — original model name, e.g. "Event" */
|
|
45
|
+
name: string;
|
|
46
|
+
/** camelCase — used as page.code / resource.code, e.g. "event" */
|
|
47
|
+
code: string;
|
|
48
|
+
/** kebab-case — used in URL path segment, e.g. "event" */
|
|
49
|
+
slug: string;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Extract model names from a single .prisma file content.
|
|
54
|
+
* Skips models annotated with `/// @IgnoreReactCode`.
|
|
55
|
+
*/
|
|
56
|
+
function extractModels(content: string): ModelInfo[] {
|
|
57
|
+
const models: ModelInfo[] = [];
|
|
58
|
+
const lines = content.split('\n');
|
|
59
|
+
|
|
60
|
+
for (let i = 0; i < lines.length; i++) {
|
|
61
|
+
const modelMatch = lines[i].match(/^model\s+(\w+)\s*\{/);
|
|
62
|
+
if (!modelMatch) continue;
|
|
63
|
+
|
|
64
|
+
const modelName = modelMatch[1];
|
|
65
|
+
|
|
66
|
+
// Collect consecutive `///` comment lines immediately above this model declaration
|
|
67
|
+
const annotations: string[] = [];
|
|
68
|
+
let j = i - 1;
|
|
69
|
+
while (j >= 0 && lines[j].trim().startsWith('///')) {
|
|
70
|
+
annotations.push(lines[j]);
|
|
71
|
+
j--;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Skip models that explicitly opt out of frontend code generation
|
|
75
|
+
if (annotations.some((a) => a.includes('@IgnoreReactCode'))) {
|
|
76
|
+
console.log(`[seedDataMngtPages] Skipping ${modelName} (@IgnoreReactCode)`);
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
models.push({
|
|
81
|
+
name: modelName,
|
|
82
|
+
code: toCamelCase(modelName),
|
|
83
|
+
slug: toKebabCase(modelName),
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return models;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Scan all non-excluded .prisma files and collect model definitions.
|
|
92
|
+
*/
|
|
93
|
+
function readPrismaModels(): ModelInfo[] {
|
|
94
|
+
if (!fs.existsSync(PRISMA_CONFIG_DIR)) {
|
|
95
|
+
console.warn(`[seedDataMngtPages] Prisma config directory not found: ${PRISMA_CONFIG_DIR}`);
|
|
96
|
+
return [];
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const files = fs
|
|
100
|
+
.readdirSync(PRISMA_CONFIG_DIR)
|
|
101
|
+
.filter((f) => f.endsWith('.prisma') && !EXCLUDED_FILES.has(f))
|
|
102
|
+
.sort(); // deterministic order across runs
|
|
103
|
+
|
|
104
|
+
const allModels: ModelInfo[] = [];
|
|
105
|
+
for (const file of files) {
|
|
106
|
+
const content = fs.readFileSync(path.join(PRISMA_CONFIG_DIR, file), 'utf-8');
|
|
107
|
+
const models = extractModels(content);
|
|
108
|
+
allModels.push(...models);
|
|
109
|
+
console.log(
|
|
110
|
+
`[seedDataMngtPages] Scanned ${file}: models=[${models.map((m) => m.name).join(', ') || '(none)'}]`,
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return allModels;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// ─── Main Seed Function ───────────────────────────────────────────────────────
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* For every non-system Prisma model found in config/prisma/ (excluding system.prisma):
|
|
121
|
+
*
|
|
122
|
+
* 1. Upsert a Resource record (resource.code = camelCase model name)
|
|
123
|
+
* 2. Upsert a Page record (parent = dataMngt, path = /admin/data-mngt/<slug>)
|
|
124
|
+
* 3. Upsert a PageResource link (page ↔ resource, full actions)
|
|
125
|
+
* 4. Upsert a RolePages record (SYSTEM_ADMIN → page)
|
|
126
|
+
* 5. Upsert a RoleResource record (SYSTEM_ADMIN → resource, full actions)
|
|
127
|
+
*
|
|
128
|
+
* Safe to re-run — every write uses upsert / skipDuplicates.
|
|
129
|
+
* Depends on seedPermissions() having already created SYSTEM_ADMIN role and dataMngt page.
|
|
130
|
+
*/
|
|
131
|
+
export async function seedDataMngtPages(prisma: PrismaClient): Promise<void> {
|
|
132
|
+
const models = readPrismaModels();
|
|
133
|
+
|
|
134
|
+
if (models.length === 0) {
|
|
135
|
+
console.log('[seedDataMngtPages] No non-system models found — nothing to seed.');
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// ── Anchors ────────────────────────────────────────────────────────────────
|
|
140
|
+
// Auto-bootstrap: if seed/index.ts has never been run (e.g. fresh DB),
|
|
141
|
+
// run the full seed pipeline now (users + permissions + pages).
|
|
142
|
+
const existingRole = await prisma.role.findUnique({ where: { name: 'SYSTEM_ADMIN' } });
|
|
143
|
+
if (!existingRole) {
|
|
144
|
+
console.log('[seedDataMngtPages] SYSTEM_ADMIN not found — running full seed (index.ts) first…');
|
|
145
|
+
const { main } = await import('./index');
|
|
146
|
+
await main();
|
|
147
|
+
// main() already calls seedDataMngtPages, so we're done.
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const systemAdminRole = existingRole;
|
|
152
|
+
|
|
153
|
+
const dataMngtPage = await prisma.page.findUnique({ where: { code: 'dataMngt' } });
|
|
154
|
+
if (!dataMngtPage) {
|
|
155
|
+
console.error('[seedDataMngtPages] dataMngt page still missing after seed. Aborting.');
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// ── Process models ─────────────────────────────────────────────────────────
|
|
160
|
+
for (const [index, model] of models.entries()) {
|
|
161
|
+
console.log(`[seedDataMngtPages] ── ${model.name} ──`);
|
|
162
|
+
|
|
163
|
+
// 1. Resource
|
|
164
|
+
const resource = await prisma.resource.upsert({
|
|
165
|
+
where: { code: model.code },
|
|
166
|
+
update: {}, // preserve manual edits (name / description)
|
|
167
|
+
create: {
|
|
168
|
+
code: model.code,
|
|
169
|
+
name: model.code,
|
|
170
|
+
description: `${model.name} resource (auto-generated by seedDataMngtPages)`,
|
|
171
|
+
isCommonResource: false,
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
console.log(`[seedDataMngtPages] Resource upserted: ${resource.code} (id=${resource.id})`);
|
|
175
|
+
|
|
176
|
+
// 2. Page (child of dataMngt)
|
|
177
|
+
const pagePath = `/admin/data-mngt/${model.slug}`;
|
|
178
|
+
const page = await prisma.page.upsert({
|
|
179
|
+
where: { code: model.code },
|
|
180
|
+
update: {
|
|
181
|
+
// Only sync the route path — must stay in step with the model name.
|
|
182
|
+
// Everything else (name, sortOrder, parentId) is left for the user to manage.
|
|
183
|
+
path: pagePath,
|
|
184
|
+
},
|
|
185
|
+
create: {
|
|
186
|
+
code: model.code,
|
|
187
|
+
name: model.name,
|
|
188
|
+
zhName: model.name,
|
|
189
|
+
enName: model.name,
|
|
190
|
+
path: pagePath,
|
|
191
|
+
isVirtual: false,
|
|
192
|
+
sortOrder: 2000 + index * 10,
|
|
193
|
+
parentId: dataMngtPage.id,
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
console.log(
|
|
197
|
+
`[seedDataMngtPages] Page upserted: ${page.code} → ${pagePath} (id=${page.id})`,
|
|
198
|
+
);
|
|
199
|
+
|
|
200
|
+
// 3. PageResource
|
|
201
|
+
await prisma.pageResource.upsert({
|
|
202
|
+
where: {
|
|
203
|
+
pageId_resourceId: { pageId: page.id, resourceId: resource.id },
|
|
204
|
+
},
|
|
205
|
+
update: { actions: FULL_ACTIONS },
|
|
206
|
+
create: {
|
|
207
|
+
pageId: page.id,
|
|
208
|
+
resourceId: resource.id,
|
|
209
|
+
actions: FULL_ACTIONS,
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
console.log(
|
|
213
|
+
`[seedDataMngtPages] PageResource upserted: page(${page.id}) ↔ resource(${resource.id})`,
|
|
214
|
+
);
|
|
215
|
+
|
|
216
|
+
// 4. RolePages — SYSTEM_ADMIN can see this page in the menu
|
|
217
|
+
await prisma.rolePages.upsert({
|
|
218
|
+
where: {
|
|
219
|
+
roleId_pageId: { roleId: systemAdminRole.id, pageId: page.id },
|
|
220
|
+
},
|
|
221
|
+
update: {},
|
|
222
|
+
create: { roleId: systemAdminRole.id, pageId: page.id },
|
|
223
|
+
});
|
|
224
|
+
console.log(`[seedDataMngtPages] RolePages upserted: SYSTEM_ADMIN → ${page.code}`);
|
|
225
|
+
|
|
226
|
+
// 5. RoleResource — SYSTEM_ADMIN has full API access to this resource
|
|
227
|
+
await prisma.roleResource.upsert({
|
|
228
|
+
where: {
|
|
229
|
+
roleId_resourceId: { roleId: systemAdminRole.id, resourceId: resource.id },
|
|
230
|
+
},
|
|
231
|
+
update: {},
|
|
232
|
+
create: {
|
|
233
|
+
roleId: systemAdminRole.id,
|
|
234
|
+
resourceId: resource.id,
|
|
235
|
+
actions: FULL_ACTIONS,
|
|
236
|
+
},
|
|
237
|
+
});
|
|
238
|
+
console.log(`[seedDataMngtPages] RoleResource upserted: SYSTEM_ADMIN → ${resource.code}`);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
console.log(
|
|
242
|
+
`[seedDataMngtPages] ✅ Done. Seeded ${models.length} model(s) under /admin/data-mngt.`,
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// ─── Standalone Entry Point ───────────────────────────────────────────────────
|
|
247
|
+
// Called directly by `postgenerate:dev` (via ts-node), NOT by seed/index.ts.
|
|
248
|
+
|
|
249
|
+
if (require.main === module) {
|
|
250
|
+
const prisma = new PrismaClient();
|
|
251
|
+
|
|
252
|
+
seedDataMngtPages(prisma)
|
|
253
|
+
.catch((e) => {
|
|
254
|
+
console.error('[seedDataMngtPages] Fatal error:', e);
|
|
255
|
+
process.exit(1);
|
|
256
|
+
})
|
|
257
|
+
.finally(() => prisma.$disconnect());
|
|
258
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export default [
|
|
2
|
+
{ userid: 'junrujrwang', username: 'junrujrwang', roles: '["SYSTEM_ADMIN"]' },
|
|
3
|
+
{ userid: 'kavenma', username: 'kavenma', roles: '["SYSTEM_ADMIN"]' },
|
|
4
|
+
{ userid: 'jasonlan', username: 'jasonlan', roles: '["SYSTEM_ADMIN"]' },
|
|
5
|
+
{ userid: 'davywang', username: 'davywang', roles: '["SYSTEM_ADMIN"]' },
|
|
6
|
+
{ userid: 'ypengxu', username: 'ypengxu', roles: '["SYSTEM_ADMIN"]' },
|
|
7
|
+
];
|
|
@@ -1,7 +1,30 @@
|
|
|
1
1
|
import { UserType } from '@gadmin2n/nest-common';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
2
|
+
import { CacheInterceptor, CacheTTL } from '@nestjs/cache-manager';
|
|
3
|
+
import {
|
|
4
|
+
BadRequestException,
|
|
5
|
+
Body,
|
|
6
|
+
Controller,
|
|
7
|
+
Get,
|
|
8
|
+
Inject,
|
|
9
|
+
Post,
|
|
10
|
+
Query,
|
|
11
|
+
Req,
|
|
12
|
+
Res,
|
|
13
|
+
UseInterceptors,
|
|
14
|
+
} from '@nestjs/common';
|
|
15
|
+
import {
|
|
16
|
+
ApiOkResponse,
|
|
17
|
+
ApiOperation,
|
|
18
|
+
ApiProperty,
|
|
19
|
+
ApiQuery,
|
|
20
|
+
} from '@nestjs/swagger';
|
|
21
|
+
import { trace } from '@opentelemetry/api';
|
|
22
|
+
import { Request, Response } from 'express';
|
|
23
|
+
import { UseRoles } from 'nest-access-control';
|
|
24
|
+
import { WINSTON_MODULE_PROVIDER } from 'nest-winston';
|
|
25
|
+
import { PrismaService } from 'nestjs-prisma';
|
|
26
|
+
import * as path from 'path';
|
|
27
|
+
import { Logger } from 'winston';
|
|
5
28
|
import { AppService } from './app.service';
|
|
6
29
|
import { AllowUnauthorizedRequest } from './lib/auth.guard';
|
|
7
30
|
|
|
@@ -14,25 +37,77 @@ class UserInfo {
|
|
|
14
37
|
}
|
|
15
38
|
@Controller()
|
|
16
39
|
export class AppController {
|
|
17
|
-
constructor(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
40
|
+
constructor(
|
|
41
|
+
private readonly appService: AppService,
|
|
42
|
+
private readonly prisma: PrismaService,
|
|
43
|
+
@Inject(WINSTON_MODULE_PROVIDER) private readonly logger: Logger,
|
|
44
|
+
) {
|
|
45
|
+
this.logger = this.logger.child({
|
|
46
|
+
file: path.basename(__filename),
|
|
47
|
+
});
|
|
22
48
|
}
|
|
23
49
|
|
|
24
|
-
@Get('
|
|
50
|
+
@Get('userinfo')
|
|
25
51
|
@ApiOkResponse({ type: UserInfo })
|
|
26
52
|
userInfo(@Req() request: Request & { user: UserType }) {
|
|
27
53
|
return request?.user || { userid: '', username: '' };
|
|
28
54
|
}
|
|
29
55
|
|
|
30
|
-
@Get('
|
|
56
|
+
@Get('hello')
|
|
31
57
|
hello(): string {
|
|
58
|
+
this.logger.info('hello');
|
|
32
59
|
return this.appService.getHello();
|
|
33
60
|
}
|
|
34
61
|
|
|
35
|
-
|
|
62
|
+
/**
|
|
63
|
+
* 调试端点:验证 Prisma OpenTelemetry tracing 是否正常工作
|
|
64
|
+
* 调用后查看 APM 中是否有 prisma:client:* 和 prisma:engine:* spans
|
|
65
|
+
*/
|
|
66
|
+
@Get('debug/tracing')
|
|
67
|
+
@AllowUnauthorizedRequest()
|
|
68
|
+
@ApiOperation({ summary: '调试 Prisma tracing' })
|
|
69
|
+
async debugTracing() {
|
|
70
|
+
const globalAny = global as any;
|
|
71
|
+
const currentSpan = trace.getActiveSpan();
|
|
72
|
+
const spanContext = currentSpan?.spanContext();
|
|
73
|
+
|
|
74
|
+
// 执行一个简单的 Prisma 查询来触发 tracing
|
|
75
|
+
const userCount = await this.prisma.user.count();
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
message: 'Prisma tracing debug endpoint',
|
|
79
|
+
tracerProvider: trace.getTracerProvider()?.constructor?.name,
|
|
80
|
+
currentSpan: {
|
|
81
|
+
traceId: spanContext?.traceId,
|
|
82
|
+
spanId: spanContext?.spanId,
|
|
83
|
+
traceFlags: spanContext?.traceFlags,
|
|
84
|
+
sampled: spanContext?.traceFlags === 1,
|
|
85
|
+
},
|
|
86
|
+
prismaInstrumentation: {
|
|
87
|
+
PRISMA_INSTRUMENTATION: !!globalAny.PRISMA_INSTRUMENTATION,
|
|
88
|
+
V6_PRISMA_INSTRUMENTATION: !!globalAny.V6_PRISMA_INSTRUMENTATION,
|
|
89
|
+
helperEnabled:
|
|
90
|
+
globalAny.PRISMA_INSTRUMENTATION?.helper?.isEnabled() ?? false,
|
|
91
|
+
},
|
|
92
|
+
testQuery: {
|
|
93
|
+
userCount,
|
|
94
|
+
},
|
|
95
|
+
env: {
|
|
96
|
+
OTEL_SERVICE_NAME: process.env.OTEL_SERVICE_NAME,
|
|
97
|
+
OTEL_EXPORTER_OTLP_ENDPOINT: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
@UseInterceptors(CacheInterceptor)
|
|
103
|
+
@CacheTTL(10 * 1000) //10 seconds
|
|
104
|
+
@Get('get-number')
|
|
105
|
+
getNumber(): number {
|
|
106
|
+
// 随机生成一个0-100之间的数字
|
|
107
|
+
return Math.floor(Math.random() * 100);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
@Get('login-callback')
|
|
36
111
|
@AllowUnauthorizedRequest()
|
|
37
112
|
loginCallback(@Req() request: Request, @Res() res) {
|
|
38
113
|
return this.appService.loginCallback(request, res);
|
|
@@ -49,4 +124,69 @@ export class AppController {
|
|
|
49
124
|
logout(@Req() request: Request, @Res() res) {
|
|
50
125
|
return this.appService.logout(request, res);
|
|
51
126
|
}
|
|
127
|
+
|
|
128
|
+
// ============ External Page 路由 ============
|
|
129
|
+
|
|
130
|
+
@Get('gtdr-page/sign-url')
|
|
131
|
+
@UseRoles({
|
|
132
|
+
resource: 'gtdrReport',
|
|
133
|
+
action: 'create',
|
|
134
|
+
possession: 'any',
|
|
135
|
+
})
|
|
136
|
+
@ApiOperation({ summary: '获取带签名的外部页面访问URL,302重定向' })
|
|
137
|
+
@ApiQuery({ name: 'domain', required: true, description: 'Domain 编码' })
|
|
138
|
+
@ApiQuery({ name: 'pageCode', required: true, description: '页面编码' })
|
|
139
|
+
getExternalPageSignedUrl(
|
|
140
|
+
@Query('domain') domain: string,
|
|
141
|
+
@Query('pageCode') pageCode: string,
|
|
142
|
+
@Req() req: Request & { user?: UserType },
|
|
143
|
+
@Res() res: Response,
|
|
144
|
+
): void {
|
|
145
|
+
if (!domain) {
|
|
146
|
+
throw new BadRequestException('domain is required');
|
|
147
|
+
}
|
|
148
|
+
if (!pageCode) {
|
|
149
|
+
throw new BadRequestException('pageCode is required');
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const userid = req.user?.userid || 'anonymous';
|
|
153
|
+
|
|
154
|
+
this.logger.info(
|
|
155
|
+
`external_page_sign_url_request - 请求签名URL - userid: ${userid}, domain: ${domain}, pageCode: ${pageCode}`,
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
const { url } = this.appService.generateExternalPageSignedUrl(
|
|
159
|
+
domain,
|
|
160
|
+
pageCode,
|
|
161
|
+
userid,
|
|
162
|
+
);
|
|
163
|
+
res.redirect(302, url);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
@Post('external-page/verify')
|
|
167
|
+
@ApiOperation({ summary: '验证外部页面签名(用于测试)' })
|
|
168
|
+
verifyExternalPageSignature(
|
|
169
|
+
@Body()
|
|
170
|
+
body: {
|
|
171
|
+
domain: string;
|
|
172
|
+
pageCode: string;
|
|
173
|
+
userid: string;
|
|
174
|
+
timestamp: string;
|
|
175
|
+
signature: string;
|
|
176
|
+
},
|
|
177
|
+
): { valid: boolean; reason?: string } {
|
|
178
|
+
const { domain, pageCode, userid, timestamp, signature } = body;
|
|
179
|
+
|
|
180
|
+
if (!domain || !pageCode || !userid || !timestamp || !signature) {
|
|
181
|
+
throw new BadRequestException('Missing required parameters');
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
return this.appService.verifyExternalPageSignature(
|
|
185
|
+
domain,
|
|
186
|
+
pageCode,
|
|
187
|
+
userid,
|
|
188
|
+
timestamp,
|
|
189
|
+
signature,
|
|
190
|
+
);
|
|
191
|
+
}
|
|
52
192
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Module } from '@nestjs/common';
|
|
2
2
|
import { ConfigModule, ConfigService } from '@nestjs/config';
|
|
3
3
|
// import { ScheduleModule } from '@nestjs/schedule';
|
|
4
|
+
import { CacheModule } from '@nestjs/cache-manager';
|
|
4
5
|
import { AccessControlModule } from 'nest-access-control';
|
|
5
6
|
import {
|
|
6
7
|
// utilities as nestWinstonModuleUtilities,
|
|
@@ -9,17 +10,21 @@ import {
|
|
|
9
10
|
import { PrismaModule } from 'nestjs-prisma';
|
|
10
11
|
import * as winston from 'winston';
|
|
11
12
|
import config from '../config';
|
|
12
|
-
import { roles as appRoles } from '../config/ac.config';
|
|
13
13
|
import { AppController } from './app.controller';
|
|
14
14
|
import { AppService } from './app.service';
|
|
15
15
|
import modules from './modules';
|
|
16
16
|
|
|
17
|
+
import { ScheduleModule } from '@nestjs/schedule';
|
|
17
18
|
import { ServeStaticModule } from '@nestjs/serve-static';
|
|
18
19
|
import { join } from 'path';
|
|
20
|
+
import { LogFormat } from './lib/logger';
|
|
21
|
+
import { RoleModule } from './modules/role/role.module';
|
|
22
|
+
import { RoleService } from './modules/role/role.service';
|
|
23
|
+
import { RolesRefresherService } from './modules/role/roles-refresher.service';
|
|
19
24
|
|
|
20
25
|
@Module({
|
|
21
26
|
imports: [
|
|
22
|
-
|
|
27
|
+
ScheduleModule.forRoot(),
|
|
23
28
|
|
|
24
29
|
ServeStaticModule.forRoot({
|
|
25
30
|
rootPath: join(__dirname, '..', 'www'),
|
|
@@ -28,7 +33,17 @@ import { join } from 'path';
|
|
|
28
33
|
|
|
29
34
|
ConfigModule.forRoot({ isGlobal: true, load: [config] }),
|
|
30
35
|
|
|
31
|
-
AccessControlModule.
|
|
36
|
+
AccessControlModule.forRootAsync({
|
|
37
|
+
imports: [
|
|
38
|
+
/* Any modules providing RoleService */
|
|
39
|
+
RoleModule,
|
|
40
|
+
],
|
|
41
|
+
inject: [RoleService],
|
|
42
|
+
useFactory: async (roleService: RoleService) => {
|
|
43
|
+
const rolesData = await roleService.getBuilder(); // Fetch roles from DB
|
|
44
|
+
return rolesData;
|
|
45
|
+
},
|
|
46
|
+
}),
|
|
32
47
|
|
|
33
48
|
WinstonModule.forRootAsync({
|
|
34
49
|
useFactory: (configService: ConfigService) => {
|
|
@@ -37,14 +52,7 @@ import { join } from 'path';
|
|
|
37
52
|
level: loggerConfig.level,
|
|
38
53
|
transports: [
|
|
39
54
|
new winston.transports.Console({
|
|
40
|
-
format:
|
|
41
|
-
// nestWinstonModuleUtilities.format.nestLike(),
|
|
42
|
-
winston.format.splat(),
|
|
43
|
-
winston.format.timestamp(),
|
|
44
|
-
// winston.format.ms(),
|
|
45
|
-
winston.format.json(),
|
|
46
|
-
// nestWinstonModuleUtilities.format.nestLike('MyApp', { prettyPrint: true }),
|
|
47
|
-
),
|
|
55
|
+
format: LogFormat,
|
|
48
56
|
}),
|
|
49
57
|
],
|
|
50
58
|
};
|
|
@@ -58,7 +66,10 @@ import { join } from 'path';
|
|
|
58
66
|
const prismaConfig = configService.get('prisma');
|
|
59
67
|
return {
|
|
60
68
|
prismaOptions: {
|
|
61
|
-
log:
|
|
69
|
+
log:
|
|
70
|
+
process.env.NODE_ENV === 'development'
|
|
71
|
+
? prismaConfig.log
|
|
72
|
+
: ['warn', 'error'],
|
|
62
73
|
},
|
|
63
74
|
explicitConnect: prismaConfig.explicit,
|
|
64
75
|
};
|
|
@@ -66,10 +77,15 @@ import { join } from 'path';
|
|
|
66
77
|
inject: [ConfigService],
|
|
67
78
|
}),
|
|
68
79
|
|
|
80
|
+
CacheModule.register({
|
|
81
|
+
isGlobal: true,
|
|
82
|
+
ttl: 5 * 60 * 1000, // 5 minutes
|
|
83
|
+
}),
|
|
84
|
+
|
|
69
85
|
...modules,
|
|
70
86
|
],
|
|
71
87
|
|
|
72
88
|
controllers: [AppController],
|
|
73
|
-
providers: [AppService],
|
|
89
|
+
providers: [AppService, RoleService, RolesRefresherService],
|
|
74
90
|
})
|
|
75
91
|
export class AppModule {}
|