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