openxiangda 1.0.264 → 2.0.0-alpha.2
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/README.md +11 -666
- package/bin/run.js +11 -0
- package/dist/browser/AuthoritativeSelector.d.ts +37 -0
- package/dist/browser/AuthoritativeSelector.d.ts.map +1 -0
- package/dist/browser/AuthoritativeSelector.js +357 -0
- package/dist/browser/AuthoritativeSelector.js.map +1 -0
- package/dist/browser/FilePreviewPage.d.ts +2 -0
- package/dist/browser/FilePreviewPage.d.ts.map +1 -0
- package/dist/browser/FilePreviewPage.js +191 -0
- package/dist/browser/FilePreviewPage.js.map +1 -0
- package/dist/browser/Shell.d.ts +6 -0
- package/dist/browser/Shell.d.ts.map +1 -0
- package/dist/browser/Shell.js +198 -0
- package/dist/browser/Shell.js.map +1 -0
- package/dist/browser/appearance.d.ts +12 -0
- package/dist/browser/appearance.d.ts.map +1 -0
- package/dist/browser/appearance.js +100 -0
- package/dist/browser/appearance.js.map +1 -0
- package/dist/browser/application.d.ts +8 -0
- package/dist/browser/application.d.ts.map +1 -0
- package/dist/browser/application.js +42 -0
- package/dist/browser/application.js.map +1 -0
- package/dist/browser/components/platform-fields/AddressField.d.ts +12 -0
- package/dist/browser/components/platform-fields/AddressField.d.ts.map +1 -0
- package/dist/browser/components/platform-fields/AddressField.js +179 -0
- package/dist/browser/components/platform-fields/AddressField.js.map +1 -0
- package/dist/browser/components/platform-fields/AttachmentFileList.d.ts +9 -0
- package/dist/browser/components/platform-fields/AttachmentFileList.d.ts.map +1 -0
- package/dist/browser/components/platform-fields/AttachmentFileList.js +164 -0
- package/dist/browser/components/platform-fields/AttachmentFileList.js.map +1 -0
- package/dist/browser/components/platform-fields/CascadeField.d.ts +13 -0
- package/dist/browser/components/platform-fields/CascadeField.d.ts.map +1 -0
- package/dist/browser/components/platform-fields/CascadeField.js +14 -0
- package/dist/browser/components/platform-fields/CascadeField.js.map +1 -0
- package/dist/browser/components/platform-fields/DateTimeField.d.ts +16 -0
- package/dist/browser/components/platform-fields/DateTimeField.d.ts.map +1 -0
- package/dist/browser/components/platform-fields/DateTimeField.js +51 -0
- package/dist/browser/components/platform-fields/DateTimeField.js.map +1 -0
- package/dist/browser/components/platform-fields/JsonField.d.ts +11 -0
- package/dist/browser/components/platform-fields/JsonField.d.ts.map +1 -0
- package/dist/browser/components/platform-fields/JsonField.js +40 -0
- package/dist/browser/components/platform-fields/JsonField.js.map +1 -0
- package/dist/browser/components/platform-fields/LocationField.d.ts +11 -0
- package/dist/browser/components/platform-fields/LocationField.d.ts.map +1 -0
- package/dist/browser/components/platform-fields/LocationField.js +73 -0
- package/dist/browser/components/platform-fields/LocationField.js.map +1 -0
- package/dist/browser/components/platform-fields/PlatformDirectoryPicker.d.ts +12 -0
- package/dist/browser/components/platform-fields/PlatformDirectoryPicker.d.ts.map +1 -0
- package/dist/browser/components/platform-fields/PlatformDirectoryPicker.js +269 -0
- package/dist/browser/components/platform-fields/PlatformDirectoryPicker.js.map +1 -0
- package/dist/browser/components/platform-fields/ResourceReferenceField.d.ts +12 -0
- package/dist/browser/components/platform-fields/ResourceReferenceField.d.ts.map +1 -0
- package/dist/browser/components/platform-fields/ResourceReferenceField.js +22 -0
- package/dist/browser/components/platform-fields/ResourceReferenceField.js.map +1 -0
- package/dist/browser/components/platform-fields/RichTextField.d.ts +14 -0
- package/dist/browser/components/platform-fields/RichTextField.d.ts.map +1 -0
- package/dist/browser/components/platform-fields/RichTextField.js +214 -0
- package/dist/browser/components/platform-fields/RichTextField.js.map +1 -0
- package/dist/browser/components/platform-fields/SignatureField.d.ts +15 -0
- package/dist/browser/components/platform-fields/SignatureField.d.ts.map +1 -0
- package/dist/browser/components/platform-fields/SignatureField.js +179 -0
- package/dist/browser/components/platform-fields/SignatureField.js.map +1 -0
- package/dist/browser/components/platform-fields/SubtableField.d.ts +18 -0
- package/dist/browser/components/platform-fields/SubtableField.d.ts.map +1 -0
- package/dist/browser/components/platform-fields/SubtableField.js +236 -0
- package/dist/browser/components/platform-fields/SubtableField.js.map +1 -0
- package/dist/browser/components/platform-fields/address-value.d.ts +13 -0
- package/dist/browser/components/platform-fields/address-value.d.ts.map +1 -0
- package/dist/browser/components/platform-fields/address-value.js +70 -0
- package/dist/browser/components/platform-fields/address-value.js.map +1 -0
- package/dist/browser/components/platform-fields/cascade-value.d.ts +6 -0
- package/dist/browser/components/platform-fields/cascade-value.d.ts.map +1 -0
- package/dist/browser/components/platform-fields/cascade-value.js +47 -0
- package/dist/browser/components/platform-fields/cascade-value.js.map +1 -0
- package/dist/browser/components/platform-fields/directory-value.d.ts +7 -0
- package/dist/browser/components/platform-fields/directory-value.d.ts.map +1 -0
- package/dist/browser/components/platform-fields/directory-value.js +35 -0
- package/dist/browser/components/platform-fields/directory-value.js.map +1 -0
- package/dist/browser/components/platform-fields/field-form-codec.d.ts +10 -0
- package/dist/browser/components/platform-fields/field-form-codec.d.ts.map +1 -0
- package/dist/browser/components/platform-fields/field-form-codec.js +82 -0
- package/dist/browser/components/platform-fields/field-form-codec.js.map +1 -0
- package/dist/browser/components/platform-fields/location-value.d.ts +20 -0
- package/dist/browser/components/platform-fields/location-value.d.ts.map +1 -0
- package/dist/browser/components/platform-fields/location-value.js +57 -0
- package/dist/browser/components/platform-fields/location-value.js.map +1 -0
- package/dist/browser/components/platform-fields/resource-query.d.ts +14 -0
- package/dist/browser/components/platform-fields/resource-query.d.ts.map +1 -0
- package/dist/browser/components/platform-fields/resource-query.js +102 -0
- package/dist/browser/components/platform-fields/resource-query.js.map +1 -0
- package/dist/browser/components/platform-fields/rich-text-value.d.ts +12 -0
- package/dist/browser/components/platform-fields/rich-text-value.d.ts.map +1 -0
- package/dist/browser/components/platform-fields/rich-text-value.js +83 -0
- package/dist/browser/components/platform-fields/rich-text-value.js.map +1 -0
- package/dist/browser/components/platform-fields/subtable-value.d.ts +31 -0
- package/dist/browser/components/platform-fields/subtable-value.d.ts.map +1 -0
- package/dist/browser/components/platform-fields/subtable-value.js +120 -0
- package/dist/browser/components/platform-fields/subtable-value.js.map +1 -0
- package/dist/browser/components/resource/GeneratedResourceCrud.d.ts +8 -0
- package/dist/browser/components/resource/GeneratedResourceCrud.d.ts.map +1 -0
- package/dist/browser/components/resource/GeneratedResourceCrud.js +580 -0
- package/dist/browser/components/resource/GeneratedResourceCrud.js.map +1 -0
- package/dist/browser/components/resource/ResourceBatchActions.d.ts +25 -0
- package/dist/browser/components/resource/ResourceBatchActions.d.ts.map +1 -0
- package/dist/browser/components/resource/ResourceBatchActions.js +168 -0
- package/dist/browser/components/resource/ResourceBatchActions.js.map +1 -0
- package/dist/browser/components/resource/StandardResourcePages.d.ts +57 -0
- package/dist/browser/components/resource/StandardResourcePages.d.ts.map +1 -0
- package/dist/browser/components/resource/StandardResourcePages.js +89 -0
- package/dist/browser/components/resource/StandardResourcePages.js.map +1 -0
- package/dist/browser/components/resource/SurfaceFields.d.ts +88 -0
- package/dist/browser/components/resource/SurfaceFields.d.ts.map +1 -0
- package/dist/browser/components/resource/SurfaceFields.js +497 -0
- package/dist/browser/components/resource/SurfaceFields.js.map +1 -0
- package/dist/browser/components/resource/generated-resource-definition.d.ts +19 -0
- package/dist/browser/components/resource/generated-resource-definition.d.ts.map +1 -0
- package/dist/browser/components/resource/generated-resource-definition.js +2 -0
- package/dist/browser/components/resource/generated-resource-definition.js.map +1 -0
- package/dist/browser/components/resource/resource-import.d.ts +15 -0
- package/dist/browser/components/resource/resource-import.d.ts.map +1 -0
- package/dist/browser/components/resource/resource-import.js +197 -0
- package/dist/browser/components/resource/resource-import.js.map +1 -0
- package/dist/browser/data-provider.d.ts +4 -0
- package/dist/browser/data-provider.d.ts.map +1 -0
- package/dist/browser/data-provider.js +45 -0
- package/dist/browser/data-provider.js.map +1 -0
- package/dist/browser/platform-client.d.ts +81 -0
- package/dist/browser/platform-client.d.ts.map +1 -0
- package/dist/browser/platform-client.js +422 -0
- package/dist/browser/platform-client.js.map +1 -0
- package/dist/browser/resource-definitions.d.ts +8 -0
- package/dist/browser/resource-definitions.d.ts.map +1 -0
- package/dist/browser/resource-definitions.js +14 -0
- package/dist/browser/resource-definitions.js.map +1 -0
- package/dist/browser/runtime-meta.d.ts +22 -0
- package/dist/browser/runtime-meta.d.ts.map +1 -0
- package/dist/browser/runtime-meta.js +79 -0
- package/dist/browser/runtime-meta.js.map +1 -0
- package/dist/browser/runtime.d.ts +13 -0
- package/dist/browser/runtime.d.ts.map +1 -0
- package/dist/browser/runtime.js +47 -0
- package/dist/browser/runtime.js.map +1 -0
- package/dist/browser/styles.css +1941 -0
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -0
- package/dist/core.d.ts +6 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +4 -0
- package/dist/core.js.map +1 -0
- package/dist/field-kit.d.ts +22 -0
- package/dist/field-kit.d.ts.map +1 -0
- package/dist/field-kit.js +22 -0
- package/dist/field-kit.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/nest.d.ts +10 -0
- package/dist/nest.d.ts.map +1 -0
- package/dist/nest.js +9 -0
- package/dist/nest.js.map +1 -0
- package/dist/react.d.ts +12 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +11 -0
- package/dist/react.js.map +1 -0
- package/dist/testing.d.ts +4 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +4 -0
- package/dist/testing.js.map +1 -0
- package/package.json +95 -200
- package/skills/manifest.json +10 -0
- package/skills/openxiangda-v2/SKILL.md +55 -0
- package/skills/openxiangda-v2/references/architecture.md +7 -0
- package/skills/openxiangda-v2/references/backend.md +116 -0
- package/skills/openxiangda-v2/references/data-authz.md +93 -0
- package/skills/openxiangda-v2/references/delivery.md +11 -0
- package/skills/openxiangda-v2/references/discovery.md +15 -0
- package/skills/openxiangda-v2/references/frontend.md +10 -0
- package/skills/openxiangda-v2/references/testing.md +16 -0
- package/skills/openxiangda-v2/references/workflow-notification.md +69 -0
- package/skills/openxiangda-v2/references/workspace.md +21 -0
- package/bin/openxiangda.js +0 -26
- package/lib/app-function-invoke.js +0 -28
- package/lib/application-environments.js +0 -1134
- package/lib/change-baseline.js +0 -1359
- package/lib/cli.js +0 -31084
- package/lib/config.js +0 -450
- package/lib/content-cache.js +0 -97
- package/lib/delivery-v2-cli.js +0 -329
- package/lib/delivery-v2-executor.js +0 -1703
- package/lib/delivery-v2-package.js +0 -1176
- package/lib/dependency-capsule.js +0 -246
- package/lib/design-gates.js +0 -668
- package/lib/design-review.js +0 -220
- package/lib/developer-center.js +0 -160
- package/lib/form-field-contract.js +0 -79
- package/lib/form-schema-loader.js +0 -181
- package/lib/git-remote-identity.js +0 -89
- package/lib/http.js +0 -196
- package/lib/integration-bundle.js +0 -225
- package/lib/js-code-build.js +0 -175
- package/lib/open-api.js +0 -256
- package/lib/policy.js +0 -137
- package/lib/publish-context.js +0 -98
- package/lib/publish-lease-heartbeat.js +0 -182
- package/lib/publish-lease.js +0 -221
- package/lib/release-error-classification.js +0 -41
- package/lib/release-explain.js +0 -75
- package/lib/release-mainline.js +0 -654
- package/lib/release-plan.js +0 -550
- package/lib/release-telemetry.js +0 -182
- package/lib/resource-binding-contract.js +0 -210
- package/lib/role-resolution.js +0 -57
- package/lib/runtime-lineage.js +0 -326
- package/lib/sdd.js +0 -3306
- package/lib/skills.js +0 -453
- package/lib/source-dependencies.js +0 -921
- package/lib/task-status.js +0 -330
- package/lib/utils.js +0 -178
- package/lib/workspace-bootstrap.js +0 -268
- package/lib/workspace-init.js +0 -202
- package/lib/worktree-cleanup.js +0 -631
- package/lib/worktree-owner.js +0 -354
- package/openxiangda-skills/SKILL.md +0 -226
- package/openxiangda-skills/references/architecture-design.md +0 -409
- package/openxiangda-skills/references/architecture-patterns.md +0 -264
- package/openxiangda-skills/references/automation-v3.md +0 -349
- package/openxiangda-skills/references/best-practices.md +0 -272
- package/openxiangda-skills/references/component-guide.md +0 -287
- package/openxiangda-skills/references/connector-resources.md +0 -80
- package/openxiangda-skills/references/data-views.md +0 -360
- package/openxiangda-skills/references/forms/component-registry.md +0 -90
- package/openxiangda-skills/references/forms/form-schema.md +0 -146
- package/openxiangda-skills/references/forms/layout-and-rules.md +0 -24
- package/openxiangda-skills/references/notifications.md +0 -227
- package/openxiangda-skills/references/openxiangda-api.md +0 -971
- package/openxiangda-skills/references/pages/app-shell.md +0 -66
- package/openxiangda-skills/references/pages/page-sdk.md +0 -401
- package/openxiangda-skills/references/pages/publish-flow.md +0 -84
- package/openxiangda-skills/references/pages/workspace-structure.md +0 -41
- package/openxiangda-skills/references/permission-design-patterns.md +0 -313
- package/openxiangda-skills/references/permissions-settings.md +0 -468
- package/openxiangda-skills/references/platform-data-model.md +0 -340
- package/openxiangda-skills/references/resource-manifest-cheatsheet.md +0 -936
- package/openxiangda-skills/references/school-contact-relations.md +0 -224
- package/openxiangda-skills/references/style-system.md +0 -218
- package/openxiangda-skills/references/troubleshooting.md +0 -271
- package/openxiangda-skills/references/workflow-v3.md +0 -441
- package/openxiangda-skills/references/workspace-state.md +0 -115
- package/openxiangda-skills/skills/openxiangda-app/SKILL.md +0 -118
- package/openxiangda-skills/skills/openxiangda-architecture-design/SKILL.md +0 -137
- package/openxiangda-skills/skills/openxiangda-core/SKILL.md +0 -222
- package/openxiangda-skills/skills/openxiangda-form/SKILL.md +0 -184
- package/openxiangda-skills/skills/openxiangda-inspect/SKILL.md +0 -63
- package/openxiangda-skills/skills/openxiangda-open-api/SKILL.md +0 -57
- package/openxiangda-skills/skills/openxiangda-open-api/agents/openai.yaml +0 -4
- package/openxiangda-skills/skills/openxiangda-open-api/references/backend-authentication.md +0 -63
- package/openxiangda-skills/skills/openxiangda-open-api/references/dingtalk-api.openapi.json +0 -15653
- package/openxiangda-skills/skills/openxiangda-page/SKILL.md +0 -154
- package/openxiangda-skills/skills/openxiangda-permission-settings/SKILL.md +0 -209
- package/openxiangda-skills/skills/openxiangda-workflow-automation/SKILL.md +0 -201
- package/packages/sdk/bin/lowcode-workspace.mjs +0 -4
- package/packages/sdk/dist/ProcessPreview-DSUIJi5V.d.mts +0 -1292
- package/packages/sdk/dist/ProcessPreview-DSUIJi5V.d.ts +0 -1292
- package/packages/sdk/dist/build/index.cjs +0 -1
- package/packages/sdk/dist/build/index.d.mts +0 -60
- package/packages/sdk/dist/build/index.d.ts +0 -60
- package/packages/sdk/dist/build/index.mjs +0 -1
- package/packages/sdk/dist/components/index.cjs +0 -148
- package/packages/sdk/dist/components/index.d.mts +0 -970
- package/packages/sdk/dist/components/index.d.ts +0 -970
- package/packages/sdk/dist/components/index.mjs +0 -148
- package/packages/sdk/dist/dataManagementApi-Ro9itwm8.d.ts +0 -142
- package/packages/sdk/dist/dataManagementApi-p_HOhQnA.d.mts +0 -142
- package/packages/sdk/dist/runtime/index.cjs +0 -148
- package/packages/sdk/dist/runtime/index.d.mts +0 -171
- package/packages/sdk/dist/runtime/index.d.ts +0 -171
- package/packages/sdk/dist/runtime/index.mjs +0 -148
- package/packages/sdk/dist/runtime/react.cjs +0 -148
- package/packages/sdk/dist/runtime/react.d.mts +0 -3202
- package/packages/sdk/dist/runtime/react.d.ts +0 -3202
- package/packages/sdk/dist/runtime/react.mjs +0 -148
- package/packages/sdk/dist/styles/antd-theme.cjs +0 -1
- package/packages/sdk/dist/styles/antd-theme.d.mts +0 -6
- package/packages/sdk/dist/styles/antd-theme.d.ts +0 -6
- package/packages/sdk/dist/styles/antd-theme.mjs +0 -1
- package/packages/sdk/dist/styles/tailwind-preset.cjs +0 -1
- package/packages/sdk/dist/styles/tailwind-preset.d.mts +0 -74
- package/packages/sdk/dist/styles/tailwind-preset.d.ts +0 -74
- package/packages/sdk/dist/styles/tailwind-preset.mjs +0 -1
- package/packages/sdk/dist/styles/tokens.css +0 -74
- package/packages/sdk/dist/workflow/index.cjs +0 -3
- package/packages/sdk/dist/workflow/index.d.mts +0 -291
- package/packages/sdk/dist/workflow/index.d.ts +0 -291
- package/packages/sdk/dist/workflow/index.mjs +0 -3
- package/packages/sdk/source/admin-list/AdminList.tsx +0 -1734
- package/packages/sdk/source/admin-list/README.md +0 -12
- package/packages/sdk/source/admin-list/dataSources.ts +0 -345
- package/packages/sdk/source/admin-list/index.ts +0 -42
- package/packages/sdk/source/admin-list/preferences.ts +0 -174
- package/packages/sdk/source/admin-list/types.ts +0 -273
- package/packages/sdk/src/build-source/README.md +0 -9
- package/packages/sdk/src/build-source/bin/lowcode-workspace.mjs +0 -7
- package/packages/sdk/src/build-source/package.json +0 -34
- package/packages/sdk/src/build-source/scripts/build-forms.mjs +0 -1129
- package/packages/sdk/src/build-source/scripts/build-pages.mjs +0 -897
- package/packages/sdk/src/build-source/scripts/build-workspace.mjs +0 -89
- package/packages/sdk/src/build-source/scripts/publish-all.mjs +0 -190
- package/packages/sdk/src/build-source/scripts/publish-oss.mjs +0 -144
- package/packages/sdk/src/build-source/scripts/register-bundle.mjs +0 -1
- package/packages/sdk/src/build-source/scripts/register.mjs +0 -362
- package/packages/sdk/src/build-source/scripts/sync-schema.mjs +0 -381
- package/packages/sdk/src/build-source/scripts/utils/form-api.mjs +0 -1058
- package/packages/sdk/src/build-source/scripts/utils/form-runtime-assets.mjs +0 -57
- package/packages/sdk/src/build-source/scripts/utils/incremental.mjs +0 -348
- package/packages/sdk/src/build-source/scripts/utils/load-config.mjs +0 -331
- package/packages/sdk/src/build-source/scripts/utils/mime-types.mjs +0 -70
- package/packages/sdk/src/build-source/scripts/utils/namespace-css.mjs +0 -77
- package/packages/sdk/src/build-source/scripts/utils/oss-client.mjs +0 -128
- package/packages/sdk/src/build-source/scripts/utils/pages.mjs +0 -150
- package/packages/sdk/src/build-source/scripts/utils/progress.mjs +0 -57
- package/packages/sdk/src/build-source/scripts/utils/publish-oss-patterns.mjs +0 -20
- package/packages/sdk/src/build-source/scripts/utils/register-payload.mjs +0 -90
- package/packages/sdk/src/build-source/scripts/utils/runtime-css-check.mjs +0 -44
- package/packages/sdk/src/build-source/scripts/utils/schema-transform.mjs +0 -142
- package/packages/sdk/src/build-source/scripts/utils/static-assets.mjs +0 -165
- package/packages/sdk/src/build-source/scripts/utils/tailwind-config.mjs +0 -283
- package/packages/sdk/src/build-source/scripts/utils/tailwind-token-warnings.mjs +0 -146
- package/packages/sdk/src/build-source/scripts/utils/workspace-style-entry.mjs +0 -29
- package/packages/sdk/src/build-source/src/cli.mjs +0 -735
- package/policy/openxiangda-policy.json +0 -72
- package/templates/openxiangda-react-spa/.cursor/rules/openxiangda-form.mdc +0 -24
- package/templates/openxiangda-react-spa/.cursor/rules/openxiangda-page.mdc +0 -25
- package/templates/openxiangda-react-spa/.cursor/rules/openxiangda-resources.mdc +0 -32
- package/templates/openxiangda-react-spa/.cursor/rules/openxiangda-workflow-automation.mdc +0 -26
- package/templates/openxiangda-react-spa/.cursor/rules/openxiangda.mdc +0 -68
- package/templates/openxiangda-react-spa/.env.example +0 -4
- package/templates/openxiangda-react-spa/.qoder/rules/openxiangda-form.md +0 -37
- package/templates/openxiangda-react-spa/.qoder/rules/openxiangda-page.md +0 -29
- package/templates/openxiangda-react-spa/.qoder/rules/openxiangda-resources.md +0 -32
- package/templates/openxiangda-react-spa/.qoder/rules/openxiangda-workflow-automation.md +0 -34
- package/templates/openxiangda-react-spa/.qoder/rules/openxiangda.md +0 -66
- package/templates/openxiangda-react-spa/AGENTS.md +0 -192
- package/templates/openxiangda-react-spa/DELIVERY.md +0 -43
- package/templates/openxiangda-react-spa/app-workspace.config.ts +0 -50
- package/templates/openxiangda-react-spa/index.html +0 -12
- package/templates/openxiangda-react-spa/package.json +0 -53
- package/templates/openxiangda-react-spa/postcss.config.cjs +0 -6
- package/templates/openxiangda-react-spa/scripts/build-js-code.mjs +0 -600
- package/templates/openxiangda-react-spa/scripts/deploy.mjs +0 -18
- package/templates/openxiangda-react-spa/scripts/guard-publish.mjs +0 -21
- package/templates/openxiangda-react-spa/src/app/navigation.ts +0 -73
- package/templates/openxiangda-react-spa/src/app/router.tsx +0 -146
- package/templates/openxiangda-react-spa/src/app/starter-content.ts +0 -144
- package/templates/openxiangda-react-spa/src/forms/.gitkeep +0 -1
- package/templates/openxiangda-react-spa/src/layouts/AdminShell.tsx +0 -570
- package/templates/openxiangda-react-spa/src/main.tsx +0 -21
- package/templates/openxiangda-react-spa/src/pages/admin/AdminDashboardPage.tsx +0 -170
- package/templates/openxiangda-react-spa/src/pages/admin/LoginLogPage.tsx +0 -425
- package/templates/openxiangda-react-spa/src/pages/defaults/DataRoutePage.tsx +0 -36
- package/templates/openxiangda-react-spa/src/pages/defaults/FilePreviewRoutePage.tsx +0 -65
- package/templates/openxiangda-react-spa/src/pages/defaults/FormRoutePage.tsx +0 -235
- package/templates/openxiangda-react-spa/src/pages/public/PublicRegisterPage.tsx +0 -15
- package/templates/openxiangda-react-spa/src/pages/states/NotFoundPage.tsx +0 -31
- package/templates/openxiangda-react-spa/src/resources/menus/menus.json +0 -22
- package/templates/openxiangda-react-spa/src/resources/permissions/page-groups/app-admin.json +0 -8
- package/templates/openxiangda-react-spa/src/resources/permissions/page-groups/public-visitor.json +0 -8
- package/templates/openxiangda-react-spa/src/resources/public-access/public-register.json +0 -14
- package/templates/openxiangda-react-spa/src/resources/roles/roles.json +0 -15
- package/templates/openxiangda-react-spa/src/resources/routes/public-register.json +0 -8
- package/templates/openxiangda-react-spa/src/runtime/default-page-overrides.tsx +0 -35
- package/templates/openxiangda-react-spa/src/runtime/default-routes.ts +0 -16
- package/templates/openxiangda-react-spa/src/shared/form-schema.ts +0 -135
- package/templates/openxiangda-react-spa/src/shared/mac-admin.tsx +0 -651
- package/templates/openxiangda-react-spa/src/shared/ui.tsx +0 -22
- package/templates/openxiangda-react-spa/src/styles/index.css +0 -105
- package/templates/openxiangda-react-spa/tailwind.config.cjs +0 -37
- package/templates/openxiangda-react-spa/tsconfig.app.json +0 -36
- package/templates/openxiangda-react-spa/tsconfig.js-code-nodes.json +0 -19
- package/templates/openxiangda-react-spa/tsconfig.json +0 -7
- package/templates/openxiangda-react-spa/tsconfig.node.json +0 -10
- package/templates/openxiangda-react-spa/vite.config.ts +0 -209
- package/templates/sy-lowcode-app-workspace/.cursor/rules/openxiangda-form.mdc +0 -24
- package/templates/sy-lowcode-app-workspace/.cursor/rules/openxiangda-page.mdc +0 -21
- package/templates/sy-lowcode-app-workspace/.cursor/rules/openxiangda-resources.mdc +0 -40
- package/templates/sy-lowcode-app-workspace/.cursor/rules/openxiangda-workflow-automation.mdc +0 -21
- package/templates/sy-lowcode-app-workspace/.cursor/rules/openxiangda.mdc +0 -81
- package/templates/sy-lowcode-app-workspace/.qoder/rules/openxiangda-form.md +0 -38
- package/templates/sy-lowcode-app-workspace/.qoder/rules/openxiangda-page.md +0 -39
- package/templates/sy-lowcode-app-workspace/.qoder/rules/openxiangda-resources.md +0 -59
- package/templates/sy-lowcode-app-workspace/.qoder/rules/openxiangda-workflow-automation.md +0 -46
- package/templates/sy-lowcode-app-workspace/.qoder/rules/openxiangda.md +0 -82
- package/templates/sy-lowcode-app-workspace/AGENTS.md +0 -158
- package/templates/sy-lowcode-app-workspace/DELIVERY.md +0 -43
- package/templates/sy-lowcode-app-workspace/app-workspace.config.ts +0 -51
- package/templates/sy-lowcode-app-workspace/examples/best-practices/README.md +0 -43
- package/templates/sy-lowcode-app-workspace/examples/best-practices/access-governance.md +0 -239
- package/templates/sy-lowcode-app-workspace/examples/best-practices/catalog.json +0 -99
- package/templates/sy-lowcode-app-workspace/examples/best-practices/decision-guide.md +0 -94
- package/templates/sy-lowcode-app-workspace/examples/best-practices/design-style.md +0 -91
- package/templates/sy-lowcode-app-workspace/examples/best-practices/module-structure.md +0 -48
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/role-governance/index.ts +0 -2
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/role-governance/permissions.test.ts +0 -52
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/role-governance/permissions.ts +0 -37
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/role-governance/types.ts +0 -19
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/service-ticket/index.ts +0 -4
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/service-ticket/permissions.test.ts +0 -42
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/service-ticket/permissions.ts +0 -25
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/service-ticket/state-machine.test.ts +0 -63
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/service-ticket/state-machine.ts +0 -73
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/service-ticket/ticket-query.test.ts +0 -34
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/service-ticket/ticket-query.ts +0 -73
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/service-ticket/types.ts +0 -66
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/forms/app-role/page.tsx +0 -1
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/forms/app-role/schema.ts +0 -109
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/forms/customer-profile/page.tsx +0 -1
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/forms/customer-profile/schema.ts +0 -92
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/forms/service-ticket/page.tsx +0 -1
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/forms/service-ticket/schema.ts +0 -153
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/forms/ticket-action-log/page.tsx +0 -1
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/forms/ticket-action-log/schema.ts +0 -65
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/js-code-nodes/daily_ticket_digest/index.ts +0 -44
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/js-code-nodes/sync_roles_to_platform/index.ts +0 -33
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/glass-home-dashboard/App.tsx +0 -8
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/glass-home-dashboard/GlassHomeDashboard.tsx +0 -232
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/glass-home-dashboard/index.tsx +0 -10
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/glass-home-dashboard/page.config.ts +0 -14
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/glass-home-dashboard/styles.css +0 -196
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/interactive-workbench/App.tsx +0 -7
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/interactive-workbench/WorkbenchPage.tsx +0 -36
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/interactive-workbench/components/ConfigPanel.tsx +0 -34
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/interactive-workbench/components/PreviewPanel.tsx +0 -17
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/interactive-workbench/index.tsx +0 -10
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/interactive-workbench/page.config.ts +0 -9
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/interactive-workbench/reducer.ts +0 -29
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/interactive-workbench/styles.css +0 -24
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mint-analytics-dashboard/App.tsx +0 -8
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mint-analytics-dashboard/MintAnalyticsDashboard.tsx +0 -279
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mint-analytics-dashboard/index.tsx +0 -10
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mint-analytics-dashboard/page.config.ts +0 -14
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mint-analytics-dashboard/styles.css +0 -163
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mobile-portal-shell/App.tsx +0 -7
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mobile-portal-shell/MobilePortalShell.tsx +0 -31
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mobile-portal-shell/index.tsx +0 -10
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mobile-portal-shell/modules/MobileHome.tsx +0 -13
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mobile-portal-shell/page.config.ts +0 -14
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mobile-portal-shell/routes.ts +0 -13
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mobile-portal-shell/styles.css +0 -11
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/ops-monitor-dashboard/App.tsx +0 -8
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/ops-monitor-dashboard/OpsMonitorDashboard.tsx +0 -306
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/ops-monitor-dashboard/index.tsx +0 -10
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/ops-monitor-dashboard/page.config.ts +0 -14
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/ops-monitor-dashboard/styles.css +0 -248
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/pc-portal-shell/App.tsx +0 -7
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/pc-portal-shell/PcPortalShell.tsx +0 -35
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/pc-portal-shell/components/PortalMetric.tsx +0 -11
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/pc-portal-shell/index.tsx +0 -10
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/pc-portal-shell/modules/HomeModule.tsx +0 -25
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/pc-portal-shell/modules/TicketsModule.tsx +0 -14
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/pc-portal-shell/page.config.ts +0 -14
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/pc-portal-shell/routes.ts +0 -19
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/pc-portal-shell/styles.css +0 -35
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/service-ticket-ops/App.tsx +0 -7
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/service-ticket-ops/TicketOpsPage.tsx +0 -105
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/service-ticket-ops/components/TicketActionTimeline.tsx +0 -22
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/service-ticket-ops/components/TicketDetailDrawer.tsx +0 -44
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/service-ticket-ops/components/TicketTableActions.tsx +0 -57
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/service-ticket-ops/index.tsx +0 -10
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/service-ticket-ops/page.config.ts +0 -9
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/service-ticket-ops/styles.css +0 -35
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/work-order-list-drawer/App.tsx +0 -8
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/work-order-list-drawer/WorkOrderListDrawerPage.tsx +0 -371
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/work-order-list-drawer/index.tsx +0 -10
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/work-order-list-drawer/page.config.ts +0 -14
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/work-order-list-drawer/styles.css +0 -182
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/resources/automations/daily-ticket-digest/automation.json +0 -25
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/resources/automations/daily-ticket-digest/trigger.json +0 -9
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/resources/notifications/daily-ticket-digest.json +0 -24
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/resources/permissions/form-groups/service-ticket-college.json +0 -21
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/resources/permissions/roles.json +0 -17
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/resources/workflows/expense-approval-workflow.json +0 -48
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/shared/components/ConfirmAction.tsx +0 -22
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/shared/components/QueryState.tsx +0 -37
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/shared/components/StatusTag.tsx +0 -20
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/shared/components/admin-ui-templates/DashboardPrimitives.tsx +0 -832
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/shared/components/admin-ui-templates/chartOptions.ts +0 -140
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/shared/components/admin-ui-templates/sampleData.ts +0 -466
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/shared/components/admin-ui-templates/styles.css +0 -874
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/shared/components/admin-ui-templates/types.ts +0 -150
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/shared/hooks/useTicketOps.ts +0 -96
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/shared/services/role-governance.ts +0 -48
- package/templates/sy-lowcode-app-workspace/examples/best-practices/src/shared/services/service-ticket.ts +0 -113
- package/templates/sy-lowcode-app-workspace/examples/forms/customer/page.tsx +0 -1
- package/templates/sy-lowcode-app-workspace/examples/forms/customer/schema.ts +0 -36
- package/templates/sy-lowcode-app-workspace/index.html +0 -12
- package/templates/sy-lowcode-app-workspace/package.json +0 -58
- package/templates/sy-lowcode-app-workspace/postcss.config.cjs +0 -9
- package/templates/sy-lowcode-app-workspace/scripts/build-js-code.mjs +0 -600
- package/templates/sy-lowcode-app-workspace/scripts/guard-publish.mjs +0 -29
- package/templates/sy-lowcode-app-workspace/src/dev/App.tsx +0 -820
- package/templates/sy-lowcode-app-workspace/src/forms/.gitkeep +0 -1
- package/templates/sy-lowcode-app-workspace/src/forms/README.md +0 -52
- package/templates/sy-lowcode-app-workspace/src/index.css +0 -26
- package/templates/sy-lowcode-app-workspace/src/js-code-nodes/.gitkeep +0 -1
- package/templates/sy-lowcode-app-workspace/src/js-code-nodes/types.d.ts +0 -3
- package/templates/sy-lowcode-app-workspace/src/main.tsx +0 -29
- package/templates/sy-lowcode-app-workspace/src/pages/.gitkeep +0 -1
- package/templates/sy-lowcode-app-workspace/src/runtime/builtin-overrides.tsx +0 -8
- package/templates/sy-lowcode-app-workspace/src/shared/form-schema.ts +0 -135
- package/templates/sy-lowcode-app-workspace/src/types/app-workspace.types.ts +0 -88
- package/templates/sy-lowcode-app-workspace/tailwind.config.cjs +0 -31
- package/templates/sy-lowcode-app-workspace/tsconfig.app.json +0 -40
- package/templates/sy-lowcode-app-workspace/tsconfig.examples.json +0 -24
- package/templates/sy-lowcode-app-workspace/tsconfig.js-code-nodes.json +0 -19
- package/templates/sy-lowcode-app-workspace/tsconfig.json +0 -7
- package/templates/sy-lowcode-app-workspace/tsconfig.node.json +0 -10
- package/templates/sy-lowcode-app-workspace/vite.config.ts +0 -85
- package/v2/README.md +0 -35
- package/v2/skills/manifest.json +0 -45
- package/v2/skills/openxiangda-v1-maintenance/SKILL.md +0 -21
- package/v2/skills/openxiangda-v1-maintenance/agents/openai.yaml +0 -4
- package/v2/skills/openxiangda-v2/SKILL.md +0 -38
- package/v2/skills/openxiangda-v2-architecture/SKILL.md +0 -29
- package/v2/skills/openxiangda-v2-architecture/agents/openai.yaml +0 -4
- package/v2/skills/openxiangda-v2-backend/SKILL.md +0 -28
- package/v2/skills/openxiangda-v2-backend/agents/openai.yaml +0 -4
- package/v2/skills/openxiangda-v2-data-authz/SKILL.md +0 -28
- package/v2/skills/openxiangda-v2-data-authz/agents/openai.yaml +0 -4
- package/v2/skills/openxiangda-v2-delivery/SKILL.md +0 -30
- package/v2/skills/openxiangda-v2-delivery/agents/openai.yaml +0 -4
- package/v2/skills/openxiangda-v2-frontend/SKILL.md +0 -21
- package/v2/skills/openxiangda-v2-frontend/agents/openai.yaml +0 -4
- package/v2/skills/openxiangda-v2-workflow-events/SKILL.md +0 -28
- package/v2/skills/openxiangda-v2-workflow-events/agents/openai.yaml +0 -4
- /package/{v2/skills → skills}/openxiangda-v2/agents/openai.yaml +0 -0
|
@@ -1,239 +0,0 @@
|
|
|
1
|
-
# Access Governance Pattern
|
|
2
|
-
|
|
3
|
-
This example is a generic account and permission governance skeleton. Copy only
|
|
4
|
-
the parts required by the selected permission mode. Do not publish this example
|
|
5
|
-
directly without changing codes, names, roles, and data scopes.
|
|
6
|
-
|
|
7
|
-
Start with:
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
openxiangda design gates --topic permissions --json
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
Choose one mode:
|
|
14
|
-
|
|
15
|
-
- `managed-platform-account`: app creates/maintains platform departments,
|
|
16
|
-
accounts, and role members.
|
|
17
|
-
- `existing-platform-user-assignment`: app assigns existing platform users to
|
|
18
|
-
app roles and business scopes.
|
|
19
|
-
- `static-role-permission`: fixed roles and permission groups only.
|
|
20
|
-
- `query-param-context`: query parameters are only context, filters, or ticket
|
|
21
|
-
input; they do not grant sensitive data access.
|
|
22
|
-
|
|
23
|
-
## Resource Closure
|
|
24
|
-
|
|
25
|
-
```text
|
|
26
|
-
src/forms/organization_unit/schema.ts
|
|
27
|
-
src/forms/system_account/schema.ts
|
|
28
|
-
src/forms/role_assignment/schema.ts
|
|
29
|
-
src/functions/sync_access_governance/index.ts
|
|
30
|
-
src/resources/roles/access-roles.json
|
|
31
|
-
src/resources/permissions/page-groups/access-admin-pages.json
|
|
32
|
-
src/resources/permissions/form-groups/role_assignment/access-admin.json
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
## Form Skeletons
|
|
36
|
-
|
|
37
|
-
`organization_unit` stores business organization units and the platform
|
|
38
|
-
department sync result:
|
|
39
|
-
|
|
40
|
-
```ts
|
|
41
|
-
export const organizationUnitFields = [
|
|
42
|
-
{ fieldId: "unitName", label: "组织名称", componentName: "TextField", placeholder: "请输入组织名称" },
|
|
43
|
-
{ fieldId: "unitCode", label: "组织编码", componentName: "TextField", placeholder: "请输入稳定组织编码" },
|
|
44
|
-
{ fieldId: "parentUnit", label: "上级组织", componentName: "SelectField", placeholder: "请选择上级组织", options: [] },
|
|
45
|
-
{ fieldId: "manager", label: "负责人", componentName: "UserSelectField", placeholder: "请选择负责人" },
|
|
46
|
-
{ fieldId: "platformDeptId", label: "平台部门ID", componentName: "TextField", behavior: "HIDDEN" },
|
|
47
|
-
{
|
|
48
|
-
fieldId: "syncStatus",
|
|
49
|
-
label: "同步状态",
|
|
50
|
-
componentName: "SelectField",
|
|
51
|
-
behavior: "HIDDEN",
|
|
52
|
-
options: [
|
|
53
|
-
{ label: "待同步", value: "pending" },
|
|
54
|
-
{ label: "已同步", value: "synced" },
|
|
55
|
-
{ label: "同步失败", value: "failed" },
|
|
56
|
-
],
|
|
57
|
-
},
|
|
58
|
-
{ fieldId: "syncMessage", label: "同步说明", componentName: "TextAreaField", behavior: "HIDDEN" },
|
|
59
|
-
{ fieldId: "lastSyncedAt", label: "最后同步时间", componentName: "DateField", behavior: "HIDDEN" },
|
|
60
|
-
];
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
`system_account` stores the app-owned account record and the platform user sync
|
|
64
|
-
result:
|
|
65
|
-
|
|
66
|
-
```ts
|
|
67
|
-
export const systemAccountFields = [
|
|
68
|
-
{ fieldId: "displayName", label: "姓名", componentName: "TextField", placeholder: "请输入姓名" },
|
|
69
|
-
{ fieldId: "loginName", label: "登录名", componentName: "TextField", placeholder: "请输入登录名" },
|
|
70
|
-
{ fieldId: "phone", label: "手机号", componentName: "TextField", placeholder: "请输入手机号" },
|
|
71
|
-
{ fieldId: "unitCode", label: "所属组织", componentName: "SelectField", placeholder: "请选择所属组织", options: [] },
|
|
72
|
-
{
|
|
73
|
-
fieldId: "enabled",
|
|
74
|
-
label: "账号状态",
|
|
75
|
-
componentName: "RadioField",
|
|
76
|
-
placeholder: "请选择账号状态",
|
|
77
|
-
options: [
|
|
78
|
-
{ label: "启用", value: "enabled" },
|
|
79
|
-
{ label: "停用", value: "disabled" },
|
|
80
|
-
],
|
|
81
|
-
},
|
|
82
|
-
{ fieldId: "platformUserId", label: "平台用户ID", componentName: "TextField", behavior: "HIDDEN" },
|
|
83
|
-
{ fieldId: "platformDeptId", label: "平台部门ID", componentName: "TextField", behavior: "HIDDEN" },
|
|
84
|
-
{
|
|
85
|
-
fieldId: "syncStatus",
|
|
86
|
-
label: "同步状态",
|
|
87
|
-
componentName: "SelectField",
|
|
88
|
-
behavior: "HIDDEN",
|
|
89
|
-
options: [
|
|
90
|
-
{ label: "待同步", value: "pending" },
|
|
91
|
-
{ label: "已同步", value: "synced" },
|
|
92
|
-
{ label: "同步失败", value: "failed" },
|
|
93
|
-
],
|
|
94
|
-
},
|
|
95
|
-
{ fieldId: "lastSyncedAt", label: "最后同步时间", componentName: "DateField", behavior: "HIDDEN" },
|
|
96
|
-
];
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
`role_assignment` maps accounts or existing platform users to roles and business
|
|
100
|
-
scope keys:
|
|
101
|
-
|
|
102
|
-
```ts
|
|
103
|
-
export const roleAssignmentFields = [
|
|
104
|
-
{ fieldId: "account", label: "账号", componentName: "SelectField", placeholder: "请选择账号", options: [] },
|
|
105
|
-
{ fieldId: "platformUser", label: "平台用户", componentName: "UserSelectField", placeholder: "请选择平台用户" },
|
|
106
|
-
{
|
|
107
|
-
fieldId: "roleCodes",
|
|
108
|
-
label: "角色",
|
|
109
|
-
componentName: "CheckboxField",
|
|
110
|
-
placeholder: "请选择角色",
|
|
111
|
-
options: [
|
|
112
|
-
{ label: "权限管理员", value: "access_admin" },
|
|
113
|
-
{ label: "范围内经办人", value: "scope_operator" },
|
|
114
|
-
],
|
|
115
|
-
},
|
|
116
|
-
{ fieldId: "businessUnit", label: "业务组织", componentName: "SelectField", placeholder: "请选择业务组织", options: [] },
|
|
117
|
-
{ fieldId: "businessScopeKey", label: "业务范围键", componentName: "TextField", behavior: "HIDDEN" },
|
|
118
|
-
{
|
|
119
|
-
fieldId: "syncStatus",
|
|
120
|
-
label: "同步状态",
|
|
121
|
-
componentName: "SelectField",
|
|
122
|
-
behavior: "HIDDEN",
|
|
123
|
-
options: [
|
|
124
|
-
{ label: "待同步", value: "pending" },
|
|
125
|
-
{ label: "已同步", value: "synced" },
|
|
126
|
-
{ label: "同步失败", value: "failed" },
|
|
127
|
-
],
|
|
128
|
-
},
|
|
129
|
-
{ fieldId: "syncMessage", label: "同步说明", componentName: "TextAreaField", behavior: "HIDDEN" },
|
|
130
|
-
];
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
## Sync App Function Skeleton
|
|
134
|
-
|
|
135
|
-
```ts
|
|
136
|
-
export default async function syncAccessGovernance(ctx, input) {
|
|
137
|
-
const roleCodes = ctx.operator?.roleCodes || [];
|
|
138
|
-
if (!roleCodes.includes("access_admin") && !ctx.operator?.hasFullAccess) {
|
|
139
|
-
throw new Error("ACCESS_DENIED");
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
if (input.action === "syncAccount") {
|
|
143
|
-
if (!ctx.organization?.accounts) throw new Error("ORGANIZATION_API_UNAVAILABLE");
|
|
144
|
-
// Current operator must have app:organization:manage.
|
|
145
|
-
return ctx.organization.accounts.create({
|
|
146
|
-
name: input.displayName,
|
|
147
|
-
loginName: input.loginName,
|
|
148
|
-
phone: input.phone,
|
|
149
|
-
departmentId: input.platformDeptId,
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
if (input.action === "syncRoleMembers") {
|
|
154
|
-
// Read role_assignment records, resolve platformUserId values, and update
|
|
155
|
-
// app role members through the platform role API exposed by OpenXiangda.
|
|
156
|
-
return { ok: true };
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
throw new Error("UNKNOWN_ACTION");
|
|
160
|
-
}
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
## Role Resource
|
|
164
|
-
|
|
165
|
-
```json
|
|
166
|
-
[
|
|
167
|
-
{
|
|
168
|
-
"code": "access_admin",
|
|
169
|
-
"name": "权限管理员",
|
|
170
|
-
"description": "维护组织、账号、角色和权限资源",
|
|
171
|
-
"apiPermissionMode": "merge",
|
|
172
|
-
"apiPermissionCodes": [
|
|
173
|
-
"app:role:manage",
|
|
174
|
-
"app:page-permission-group:manage",
|
|
175
|
-
"app:form-permission-group:manage",
|
|
176
|
-
"app:organization:manage"
|
|
177
|
-
]
|
|
178
|
-
},
|
|
179
|
-
{
|
|
180
|
-
"code": "scope_operator",
|
|
181
|
-
"name": "范围内经办人",
|
|
182
|
-
"description": "只能访问授权业务范围内的数据"
|
|
183
|
-
}
|
|
184
|
-
]
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
The initial grant of `access_admin` is normally done by a platform administrator
|
|
188
|
-
or an existing app administrator. If `access_admin` creates another role that
|
|
189
|
-
also manages accounts, roles, or permission groups, publish that new role with
|
|
190
|
-
its own `apiPermissionCodes`; management power is not inherited from the
|
|
191
|
-
creator.
|
|
192
|
-
|
|
193
|
-
## Page Permission Group
|
|
194
|
-
|
|
195
|
-
```json
|
|
196
|
-
{
|
|
197
|
-
"code": "access_admin_pages",
|
|
198
|
-
"name": "权限管理员页面",
|
|
199
|
-
"roles": ["access_admin"],
|
|
200
|
-
"menuCodes": ["access_governance"],
|
|
201
|
-
"routeCodes": ["access.governance"],
|
|
202
|
-
"pathPatterns": ["/view/:appType/admin/access/*"]
|
|
203
|
-
}
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
## Form Permission Group
|
|
207
|
-
|
|
208
|
-
```json
|
|
209
|
-
{
|
|
210
|
-
"code": "role_assignment_admin",
|
|
211
|
-
"formCode": "role_assignment",
|
|
212
|
-
"name": "角色分配管理员",
|
|
213
|
-
"type": "view",
|
|
214
|
-
"roles": ["access_admin"],
|
|
215
|
-
"operations": ["view", "edit", "delete"],
|
|
216
|
-
"dataScope": [{ "type": "all" }],
|
|
217
|
-
"fieldAccessPolicy": {
|
|
218
|
-
"defaultAccess": "edit",
|
|
219
|
-
"fields": [
|
|
220
|
-
{ "fieldId": "syncMessage", "access": "readonly" }
|
|
221
|
-
]
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
For `scope_operator`, use condition data permission against hidden scalar keys,
|
|
227
|
-
for example `businessScopeKey = ${CURRENT_USER_SCOPE}`. Do not fetch all rows
|
|
228
|
-
and filter them in the page.
|
|
229
|
-
|
|
230
|
-
## Acceptance
|
|
231
|
-
|
|
232
|
-
- Permission mode and matrix are written in the SDD change or design document.
|
|
233
|
-
- `openxiangda permission audit --json` has no high-risk gaps.
|
|
234
|
-
- Allowed and denied role paths are both tested.
|
|
235
|
-
- Query parameter tampering does not expand sensitive access.
|
|
236
|
-
- Managed account writes are executed only by a user with
|
|
237
|
-
`app:organization:manage`.
|
|
238
|
-
- Roles that create roles, assign members, or maintain permission groups include
|
|
239
|
-
`apiPermissionCodes` such as `app:role:manage`.
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 1,
|
|
3
|
-
"publishedByDefault": false,
|
|
4
|
-
"copyInto": "src/",
|
|
5
|
-
"templates": [
|
|
6
|
-
{
|
|
7
|
-
"code": "glass-home-dashboard",
|
|
8
|
-
"type": "page-ui-template",
|
|
9
|
-
"path": "src/pages/glass-home-dashboard",
|
|
10
|
-
"uiTemplate": "glass-home-dashboard",
|
|
11
|
-
"recommendedFor": ["经营首页", "管理驾驶舱", "轻量门户首页"],
|
|
12
|
-
"description": "Default light-blue glass dashboard shell with sidebar, top search, welcome banner, quick actions, KPI cards, charts, ranking, activity feed, query states, and drawer form actions."
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
"code": "mint-analytics-dashboard",
|
|
16
|
-
"type": "page-ui-template",
|
|
17
|
-
"path": "src/pages/mint-analytics-dashboard",
|
|
18
|
-
"uiTemplate": "mint-analytics-dashboard",
|
|
19
|
-
"recommendedFor": ["数据分析", "BI 概览", "经营日报"],
|
|
20
|
-
"description": "Mint analytics dashboard with high-density metrics, line/bar/donut charts, notices, todos, business summary, system health, query states, and drawer form actions."
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
"code": "ops-monitor-dashboard",
|
|
24
|
-
"type": "page-ui-template",
|
|
25
|
-
"path": "src/pages/ops-monitor-dashboard",
|
|
26
|
-
"uiTemplate": "ops-monitor-dashboard",
|
|
27
|
-
"recommendedFor": ["运营监控", "任务中心", "系统健康度", "告警中心"],
|
|
28
|
-
"description": "Blue-purple operations monitor with realtime trends, animated metric cards, task progress, health score, device status, alerts, quick actions, query states, and drawer form actions."
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"code": "work-order-list-drawer",
|
|
32
|
-
"type": "page-ui-template",
|
|
33
|
-
"path": "src/pages/work-order-list-drawer",
|
|
34
|
-
"uiTemplate": "work-order-list-drawer",
|
|
35
|
-
"recommendedFor": ["CRUD 列表", "工单管理", "审批处理", "数据管理页"],
|
|
36
|
-
"description": "Default restrained admin list template with filters, toolbar, status stats, table, loading/empty/error branches, and right-side overlay drawers for detail, create, edit, and process forms."
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
"code": "customer-profile",
|
|
40
|
-
"type": "form",
|
|
41
|
-
"path": "src/forms/customer-profile",
|
|
42
|
-
"description": "Standard form schema covering field types, validation, users, departments, attachments, and subforms."
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
"code": "service-ticket-lifecycle",
|
|
46
|
-
"type": "state-flow",
|
|
47
|
-
"path": "src/domain/service-ticket",
|
|
48
|
-
"description": "Lifecycle state machine with ticket and action-log forms. Does not use workflow."
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
"code": "service-ticket-ops",
|
|
52
|
-
"type": "page",
|
|
53
|
-
"path": "src/pages/service-ticket-ops",
|
|
54
|
-
"description": "DataManagementList-based ops page with modular actions, drawer, timeline, hook, and service."
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
"code": "access-governance",
|
|
58
|
-
"type": "permissions",
|
|
59
|
-
"path": "access-governance.md",
|
|
60
|
-
"description": "Generic account/role permission mode decision with organization, account, role assignment, sync function, role resource, page group, and form group skeletons."
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
"code": "role-governance",
|
|
64
|
-
"type": "permissions",
|
|
65
|
-
"path": "src/domain/role-governance",
|
|
66
|
-
"description": "Dynamic role maintenance, role sync, maintainable scope fields, hidden permission keys, and permission-group resource examples."
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
"code": "pc-portal-shell",
|
|
70
|
-
"type": "app-shell-page",
|
|
71
|
-
"path": "src/pages/pc-portal-shell",
|
|
72
|
-
"description": "PC app-shell entry with routes, modules, shared domain usage, and no hardcoded view URLs."
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
"code": "mobile-portal-shell",
|
|
76
|
-
"type": "app-shell-page",
|
|
77
|
-
"path": "src/pages/mobile-portal-shell",
|
|
78
|
-
"description": "Mobile app-shell entry sharing domain/service logic with the PC portal."
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
"code": "interactive-workbench",
|
|
82
|
-
"type": "page",
|
|
83
|
-
"path": "src/pages/interactive-workbench",
|
|
84
|
-
"description": "Pure interaction workbench with reducer state, modular panels, and unified query states."
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
"code": "expense-approval-workflow",
|
|
88
|
-
"type": "workflow",
|
|
89
|
-
"path": "src/resources/workflows/expense-approval-workflow.json",
|
|
90
|
-
"description": "True approval workflow example. Use only when approval tasks are required."
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
"code": "daily-ticket-digest",
|
|
94
|
-
"type": "automation",
|
|
95
|
-
"path": "src/resources/automations/daily-ticket-digest",
|
|
96
|
-
"description": "Scheduled JS_CODE automation that queries paginated data and sends notification resources."
|
|
97
|
-
}
|
|
98
|
-
]
|
|
99
|
-
}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
# Decision Guide
|
|
2
|
-
|
|
3
|
-
## Page And Data Shape
|
|
4
|
-
|
|
5
|
-
Use a form when you need a data table. Each form schema defines fields,
|
|
6
|
-
validation, storage shape, and generated platform data APIs.
|
|
7
|
-
|
|
8
|
-
Use a code page when you need a workbench, portal, dashboard, cross-form
|
|
9
|
-
composition, custom list actions, or complex interaction.
|
|
10
|
-
|
|
11
|
-
Use `DataManagementList` for list/search/export/batch-management pages. Extend
|
|
12
|
-
it with row actions, custom renderers, and drawers instead of rebuilding
|
|
13
|
-
pagination, export, and filters from scratch.
|
|
14
|
-
|
|
15
|
-
## Default Admin UI Templates
|
|
16
|
-
|
|
17
|
-
The UI templates are recommended starting points, not mandatory styles. Choose
|
|
18
|
-
one based on the page's primary job:
|
|
19
|
-
|
|
20
|
-
- `work-order-list-drawer`: default for CRUD, approval handling, work orders,
|
|
21
|
-
ticket lists, and data-management pages. Detail, create, edit, and process
|
|
22
|
-
forms use right-side overlay drawers; do not reserve a permanent right detail
|
|
23
|
-
column that squeezes the table.
|
|
24
|
-
- `glass-home-dashboard`: default for a friendly PC admin home page, management
|
|
25
|
-
portal, or first-screen business overview.
|
|
26
|
-
- `mint-analytics-dashboard`: default for analysis-heavy dashboards, weekly
|
|
27
|
-
business reviews, BI-like reports, and data-summary pages.
|
|
28
|
-
- `ops-monitor-dashboard`: default for realtime operations, task execution,
|
|
29
|
-
alerts, system health, and monitoring centers.
|
|
30
|
-
|
|
31
|
-
When a page combines list management and a dashboard, start from
|
|
32
|
-
`work-order-list-drawer` if users spend most time operating rows. Start from a
|
|
33
|
-
dashboard template only when the main job is reading metrics.
|
|
34
|
-
|
|
35
|
-
## State Flow Is Not Workflow
|
|
36
|
-
|
|
37
|
-
Most business "processes" are lifecycle state changes:
|
|
38
|
-
|
|
39
|
-
- work tickets: new -> accepted -> processing -> resolved -> closed
|
|
40
|
-
- orders: draft -> submitted -> paid -> fulfilled -> completed
|
|
41
|
-
- assets: available -> reserved -> in_use -> maintenance -> retired
|
|
42
|
-
|
|
43
|
-
Use a normal form with a `status` field, maintainable ownership/scope fields,
|
|
44
|
-
and an operation-log form. Define allowed transitions in
|
|
45
|
-
`domain/<feature>/state-machine.ts`, and execute changes through a service
|
|
46
|
-
method that updates state and writes logs.
|
|
47
|
-
|
|
48
|
-
Use workflow only when the platform must create approval tasks with approvers,
|
|
49
|
-
approval comments, agree/reject actions, copy nodes, node field permissions, and
|
|
50
|
-
approval history.
|
|
51
|
-
|
|
52
|
-
## Automation And JS_CODE
|
|
53
|
-
|
|
54
|
-
Use automation or workflow JS_CODE when logic must run on the backend after a
|
|
55
|
-
trigger: scheduled scans, cross-form synchronization, notification fan-out,
|
|
56
|
-
external HTTP calls, or platform role synchronization.
|
|
57
|
-
|
|
58
|
-
Frontend code must not be responsible for data isolation or background jobs.
|
|
59
|
-
|
|
60
|
-
## Permissions
|
|
61
|
-
|
|
62
|
-
Run `openxiangda design gates --topic permissions --json` before implementing
|
|
63
|
-
account, role, RBAC, organization-account, data-scope, or query-param
|
|
64
|
-
authorization requirements.
|
|
65
|
-
|
|
66
|
-
Choose one pattern:
|
|
67
|
-
|
|
68
|
-
- `managed-platform-account`: app creates and maintains platform departments,
|
|
69
|
-
accounts, and role members. Start from `access-governance.md`.
|
|
70
|
-
- `existing-platform-user-assignment`: app selects existing platform users and
|
|
71
|
-
assigns roles/business scopes. Use a role assignment form with
|
|
72
|
-
`UserSelectField`.
|
|
73
|
-
- `static-role-permission`: fixed roles and permission groups only.
|
|
74
|
-
- `query-param-context`: query parameters are context, filters, or ticket input
|
|
75
|
-
only; they cannot grant sensitive access.
|
|
76
|
-
|
|
77
|
-
For dynamic multi-role apps, create a business role table and synchronize it to
|
|
78
|
-
platform app roles. User-facing scope fields should be maintainable controls:
|
|
79
|
-
personnel/department fields for people and orgs, enum fields for fixed option
|
|
80
|
-
sets, and SDK-backed `SelectField` dropdowns for classes, colleges, projects,
|
|
81
|
-
customers, and other records maintained by forms. Use `remoteSearch: true` when
|
|
82
|
-
the source form can have many records. If the platform permission condition
|
|
83
|
-
needs a scalar value, derive a hidden scope key such as `collegeScopeKey` or
|
|
84
|
-
`ownerDeptScopeKey`. Use form permission groups with condition-style data
|
|
85
|
-
permissions and App Function role/scope checks to enforce data isolation.
|
|
86
|
-
|
|
87
|
-
When an app role is expected to create roles, assign role members, grant role
|
|
88
|
-
API permissions, maintain permission groups, or manage organization accounts,
|
|
89
|
-
declare the matching `apiPermissionCodes` on that role. `app:role:manage` is
|
|
90
|
-
required for app role creation and member assignment; page/form permission group
|
|
91
|
-
maintenance and organization account management use their own permission codes.
|
|
92
|
-
|
|
93
|
-
Frontend hiding and query parameters are not authorization. They must not be the
|
|
94
|
-
only barrier for sensitive data or write actions.
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
# Design Style
|
|
2
|
-
|
|
3
|
-
OpenXiangda business apps should feel like focused operational tools.
|
|
4
|
-
|
|
5
|
-
## Default Admin UI Templates
|
|
6
|
-
|
|
7
|
-
These templates are polished defaults for B-end admin pages. They are optional
|
|
8
|
-
starting points, not hard product constraints.
|
|
9
|
-
|
|
10
|
-
### `glass-home-dashboard`
|
|
11
|
-
|
|
12
|
-
- Use for PC admin home pages, management portals, and general business
|
|
13
|
-
dashboards.
|
|
14
|
-
- Visual direction: light blue glass surface, soft sidebar, translucent panels,
|
|
15
|
-
welcoming banner, KPI cards with small trends, quick actions, chart blocks,
|
|
16
|
-
ranking, activity feed, and target progress.
|
|
17
|
-
- Keep density medium. The first viewport should make the platform identity,
|
|
18
|
-
navigation, search, and key metrics obvious.
|
|
19
|
-
|
|
20
|
-
### `mint-analytics-dashboard`
|
|
21
|
-
|
|
22
|
-
- Use for BI-style analysis, business reviews, operational reports, and weekly
|
|
23
|
-
summary pages.
|
|
24
|
-
- Visual direction: low-saturation mint green, tighter metric cards, structured
|
|
25
|
-
chart grid, notification and todo panels, business summary, and health score.
|
|
26
|
-
- Keep labels short and chart containers stable. Favor comparison, trend, and
|
|
27
|
-
distribution charts over decorative widgets.
|
|
28
|
-
|
|
29
|
-
### `ops-monitor-dashboard`
|
|
30
|
-
|
|
31
|
-
- Use for realtime monitoring, operations centers, task execution, system
|
|
32
|
-
health, and alert pages.
|
|
33
|
-
- Visual direction: blue-purple accent, stronger status hierarchy, realtime
|
|
34
|
-
traffic chart, task progress bars, system rings, device state, alert list, and
|
|
35
|
-
subtle CSS motion.
|
|
36
|
-
- Do not add GSAP or other animation dependencies by default. Use lightweight
|
|
37
|
-
CSS transitions unless a product requirement needs a true timeline engine.
|
|
38
|
-
|
|
39
|
-
### `work-order-list-drawer`
|
|
40
|
-
|
|
41
|
-
- Use as the default CRUD/data-management template for tickets, approvals,
|
|
42
|
-
orders, assets, and record operations.
|
|
43
|
-
- Layout: fixed app shell, compact filters, toolbar, status stat cards, dense
|
|
44
|
-
table, pagination, and right-side overlay drawer.
|
|
45
|
-
- Detail, create, edit, approve, reject, and process forms open in `Drawer` or
|
|
46
|
-
`Modal`. Do not put a permanent form/detail column beside the table, because
|
|
47
|
-
it narrows the main working area and makes table operations less stable.
|
|
48
|
-
|
|
49
|
-
## Interaction Defaults
|
|
50
|
-
|
|
51
|
-
- Every async page has loading, refreshing, empty, error, and submit-pending
|
|
52
|
-
states.
|
|
53
|
-
- List refresh should keep existing rows visible and show a small refresh state.
|
|
54
|
-
- Mutating actions need confirmation, pending feedback, success feedback, and a
|
|
55
|
-
failure refresh or rollback path.
|
|
56
|
-
- Detail, create, edit, approval, and processing workflows should use an overlay
|
|
57
|
-
`Drawer` or `Modal` with fixed header, scrollable body, and footer actions.
|
|
58
|
-
- Mobile actions should use a bottom action area, drawer, or action sheet; do
|
|
59
|
-
not copy a dense PC table toolbar to mobile.
|
|
60
|
-
|
|
61
|
-
## Layout Defaults
|
|
62
|
-
|
|
63
|
-
- Use dense but readable workbench layouts for admin and ops pages.
|
|
64
|
-
- Put high-value filters near the list, not in hidden configuration pages.
|
|
65
|
-
- Use status tags, responsibility fields, and latest action summaries for
|
|
66
|
-
lifecycle data.
|
|
67
|
-
- Do not build marketing-style hero pages for business tools.
|
|
68
|
-
- Do not nest cards inside cards. Use panels for page regions, and use cards
|
|
69
|
-
only for repeated items, modals/drawers, or genuinely framed controls.
|
|
70
|
-
|
|
71
|
-
## Styling Rules
|
|
72
|
-
|
|
73
|
-
- Use Tailwind native utilities and arbitrary values as the default styling
|
|
74
|
-
vocabulary, plus Ant Design and antd-mobile for mature controls.
|
|
75
|
-
- Platform token classes are compatibility helpers for platform components and
|
|
76
|
-
theme overrides. Do not make them the main pattern for business pages.
|
|
77
|
-
- Prefer concrete Tailwind classes such as `bg-white`, `border`,
|
|
78
|
-
`border-slate-200`, `text-slate-600`, `shadow-sm`, and
|
|
79
|
-
`grid-cols-[240px_1fr]`. Do not use shadcn token classes such as `bg-card`,
|
|
80
|
-
`text-muted-foreground`, or `text-foreground` unless the workspace explicitly
|
|
81
|
-
configures them.
|
|
82
|
-
- Use mature packages for mature interactions: antd controls instead of native
|
|
83
|
-
inputs, ECharts for charts, GSAP for complex animation timelines, and
|
|
84
|
-
maintained drag/drop or virtual-list libraries when those behaviors are
|
|
85
|
-
required.
|
|
86
|
-
- Research package docs and current maintenance before adding a new dependency;
|
|
87
|
-
write business adapters instead of copying library internals.
|
|
88
|
-
- Keep page styles in `styles.css`; avoid large inline style objects.
|
|
89
|
-
- Keep reusable visual states in shared components: status tags, query states,
|
|
90
|
-
confirmation triggers, and operation timelines.
|
|
91
|
-
- Do not override private Ant Design class names.
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
# Module Structure
|
|
2
|
-
|
|
3
|
-
Use this structure for substantial features:
|
|
4
|
-
|
|
5
|
-
```text
|
|
6
|
-
src/
|
|
7
|
-
domain/<feature>/
|
|
8
|
-
types.ts
|
|
9
|
-
state-machine.ts
|
|
10
|
-
permissions.ts
|
|
11
|
-
query.ts
|
|
12
|
-
index.ts
|
|
13
|
-
shared/
|
|
14
|
-
services/<feature>.ts
|
|
15
|
-
hooks/use<Feature>.ts
|
|
16
|
-
components/
|
|
17
|
-
QueryState.tsx
|
|
18
|
-
StatusTag.tsx
|
|
19
|
-
pages/<feature>/
|
|
20
|
-
page.config.ts
|
|
21
|
-
index.tsx
|
|
22
|
-
App.tsx
|
|
23
|
-
styles.css
|
|
24
|
-
components/
|
|
25
|
-
forms/<feature>/
|
|
26
|
-
schema.ts
|
|
27
|
-
page.tsx
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## Dependency Direction
|
|
31
|
-
|
|
32
|
-
```text
|
|
33
|
-
pages -> shared/hooks -> shared/services -> domain
|
|
34
|
-
forms -> shared -> domain
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
- `domain/` has no React, Ant Design, SDK, or page imports.
|
|
38
|
-
- `shared/` does not import from `pages/`.
|
|
39
|
-
- `pages/` compose modules and call hooks; they do not build complex query
|
|
40
|
-
payloads inline.
|
|
41
|
-
- PC and mobile views can have different components and styles, but they reuse
|
|
42
|
-
the same domain and service logic.
|
|
43
|
-
|
|
44
|
-
## File Size
|
|
45
|
-
|
|
46
|
-
Avoid large single-file pages. If a page grows beyond roughly 250 lines, split
|
|
47
|
-
table actions, drawers, timelines, query builders, hooks, and styles into
|
|
48
|
-
separate files.
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import assert from "node:assert/strict";
|
|
2
|
-
import { describe, it } from "node:test";
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
buildConditionDataPermission,
|
|
6
|
-
buildRoleCode,
|
|
7
|
-
deriveRoleScopeKeys,
|
|
8
|
-
} from "./permissions";
|
|
9
|
-
|
|
10
|
-
describe("role-governance permission helpers", () => {
|
|
11
|
-
it("normalizes dynamic role codes", () => {
|
|
12
|
-
assert.equal(buildRoleCode({ roleCode: " College Admin " }), "college_admin");
|
|
13
|
-
assert.equal(buildRoleCode({ roleCode: "class advisor" }), "class_advisor");
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
it("derives hidden scope keys from maintainable select values", () => {
|
|
17
|
-
assert.deepEqual(
|
|
18
|
-
deriveRoleScopeKeys({
|
|
19
|
-
collegeScope: { label: "理学院", value: "college_science" },
|
|
20
|
-
classScope: { label: "2026 级一班", value: "class_2026_01" },
|
|
21
|
-
}),
|
|
22
|
-
{
|
|
23
|
-
collegeScopeKey: "college_science",
|
|
24
|
-
classScopeKey: "class_2026_01",
|
|
25
|
-
},
|
|
26
|
-
);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it("builds condition-based data permissions from hidden scope keys", () => {
|
|
30
|
-
const permission = buildConditionDataPermission({
|
|
31
|
-
collegeScopeKey: "college_science",
|
|
32
|
-
classScopeKey: "",
|
|
33
|
-
ownerDeptScopeKey: "dept_lab",
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
assert.equal(permission.type, "condition");
|
|
37
|
-
assert.deepEqual(permission.condition.rules, [
|
|
38
|
-
{
|
|
39
|
-
field: "collegeScopeKey",
|
|
40
|
-
componentType: "Text",
|
|
41
|
-
op: "=",
|
|
42
|
-
value: "college_science",
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
field: "ownerDeptScopeKey",
|
|
46
|
-
componentType: "Text",
|
|
47
|
-
op: "=",
|
|
48
|
-
value: "dept_lab",
|
|
49
|
-
},
|
|
50
|
-
]);
|
|
51
|
-
});
|
|
52
|
-
});
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import type { AppRoleRecord, DataOwnershipFields } from "./types";
|
|
2
|
-
|
|
3
|
-
export function buildRoleCode(role: Pick<AppRoleRecord, "roleCode">) {
|
|
4
|
-
return role.roleCode.trim().replace(/\s+/g, "_").toLowerCase();
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
function scopeKey(value: { value?: string | number } | undefined) {
|
|
8
|
-
return value?.value === undefined || value.value === null ? "" : String(value.value);
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function deriveRoleScopeKeys(
|
|
12
|
-
role: Pick<AppRoleRecord, "collegeScope" | "classScope">,
|
|
13
|
-
) {
|
|
14
|
-
return {
|
|
15
|
-
collegeScopeKey: scopeKey(role.collegeScope),
|
|
16
|
-
classScopeKey: scopeKey(role.classScope),
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function buildConditionDataPermission(scope: DataOwnershipFields) {
|
|
21
|
-
const rules = Object.entries(scope)
|
|
22
|
-
.filter(([, value]) => Boolean(value))
|
|
23
|
-
.map(([field, value]) => ({
|
|
24
|
-
field,
|
|
25
|
-
componentType: "Text",
|
|
26
|
-
op: "=",
|
|
27
|
-
value,
|
|
28
|
-
}));
|
|
29
|
-
|
|
30
|
-
return {
|
|
31
|
-
type: "condition" as const,
|
|
32
|
-
condition: {
|
|
33
|
-
logic: "AND" as const,
|
|
34
|
-
rules,
|
|
35
|
-
},
|
|
36
|
-
};
|
|
37
|
-
}
|