@oj-module/cli 0.2.64 → 0.2.67
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/bin/.oj-version +1 -0
- package/bin/oj +4 -0
- package/devkit/README.md +18 -4
- package/devkit/SKILL.md +35 -3
- package/devkit/framework-dev.md +22 -11
- package/devkit/manual.md +161 -68
- package/devkit/menu-rules.md +4 -1
- package/devkit/publish-walkthrough.md +110 -37
- package/devkit/wecom-internal-app.md +7 -2
- package/devkit/wecom-multi-corp-links.md +163 -0
- package/package.json +3 -2
- package/shell-dist/assets/ahooks.2l850ymmh0.js +18 -0
- package/shell-dist/assets/antd-es-locale-zh_CN.1gjjsvxbf0.js +1 -0
- package/shell-dist/assets/antd-img-crop.196rkty480.js +99 -0
- package/shell-dist/assets/antd-locale-en_US.561tozx860.js +1 -0
- package/shell-dist/assets/antd-locale-zh_CN.1cmpmgzh70.js +1 -0
- package/shell-dist/assets/antd.uw1coq15l0.js +348 -0
- package/shell-dist/assets/clsx.jotilrt2e0.js +1 -0
- package/shell-dist/assets/contract-errors.2o17vz9u50.js +1 -0
- package/shell-dist/assets/contract.3h327o3mj0.js +57 -0
- package/shell-dist/assets/cssinjs.atgmhan7m0.js +3 -0
- package/shell-dist/assets/dayjs-plugin-advancedFormat.3vsyd2eis0.js +1 -0
- package/shell-dist/assets/dayjs-plugin-customParseFormat.13xhghv1d0.js +1 -0
- package/shell-dist/assets/dayjs-plugin-isoWeek.1fn1tw82p0.js +1 -0
- package/shell-dist/assets/dayjs-plugin-localeData.2rwbjp9nk0.js +1 -0
- package/shell-dist/assets/dayjs-plugin-quarterOfYear.2oqo1lcx80.js +1 -0
- package/shell-dist/assets/dayjs-plugin-relativeTime.2pqs3et4y0.js +1 -0
- package/shell-dist/assets/dayjs-plugin-weekOfYear.gvn9iph080.js +1 -0
- package/shell-dist/assets/dayjs-plugin-weekYear.2u78l3ex10.js +1 -0
- package/shell-dist/assets/dayjs-plugin-weekday.2d56a4tml0.js +1 -0
- package/shell-dist/assets/dayjs.pa60l6wjo0.js +1 -0
- package/shell-dist/assets/dnd-kit-core.1xyreig6r0.js +5 -0
- package/shell-dist/assets/dnd-kit-sortable.s94qciuft0.js +1 -0
- package/shell-dist/assets/dnd-kit-utilities.1umw4xphb0.js +1 -0
- package/shell-dist/assets/i18next.33zqofapj0.js +1 -0
- package/shell-dist/assets/icons-es-components-Context.365qmflwg0.js +1 -0
- package/shell-dist/assets/icons.159wjwals0.js +57 -0
- package/shell-dist/assets/{index-xZhmujjM.js → index.6alqyx6ae0.js} +21 -1
- package/shell-dist/assets/jsx-dev-runtime.3uibuc82f0.js +14 -0
- package/shell-dist/assets/jsx-runtime.h40xu4o5b0.js +14 -0
- package/shell-dist/assets/keepalive-for-react.xenu5vam70.js +1 -0
- package/shell-dist/assets/kit.37kr8ui390.js +1 -0
- package/shell-dist/assets/ky.1cgch7gu60.js +6 -0
- package/shell-dist/assets/motion-react.pjsxytvjs0.js +12 -0
- package/shell-dist/assets/motion.21tciqutg0.js +4 -0
- package/shell-dist/assets/nprogress.2nz76n9ny0.js +7 -0
- package/shell-dist/assets/ojm-dayjs-locale-zh-cn.3vr3beiyp0.js +9 -0
- package/shell-dist/assets/pinyin-pro.3v0mnxczn0.js +1 -0
- package/shell-dist/assets/pro-components.2kyot1vcl0.js +83 -0
- package/shell-dist/assets/react-countup.2x8idnr8y0.js +10 -0
- package/shell-dist/assets/react-dom-client.ick0v05ob0.js +43 -0
- package/shell-dist/assets/react-dom.2so9uxg3f0.js +22 -0
- package/shell-dist/assets/react-error-boundary.2dncdfj3b0.js +1 -0
- package/shell-dist/assets/react-i18next.auhvjhqv00.js +1 -0
- package/shell-dist/assets/react-jss.1ei6dr9e00.js +29 -0
- package/shell-dist/assets/react-query.3rln45ow00.js +1 -0
- package/shell-dist/assets/react-router-dom.3c6zld8h40.js +44 -0
- package/shell-dist/assets/react-router.2h9rebcv50.js +56 -0
- package/shell-dist/assets/react.1ew63mwts0.js +14 -0
- package/shell-dist/assets/runtime.2dgstpjsu0.js +21702 -0
- package/shell-dist/assets/simplebar-react.2g739uvai0.js +1 -0
- package/shell-dist/assets/spin-delay.yjeyj6iwp0.js +9 -0
- package/shell-dist/assets/tailwind-merge.125ehiqjw0.js +1 -0
- package/shell-dist/assets/use-sync-external-store-shim.1nz1pi9bb0.js +22 -0
- package/shell-dist/assets/zustand-middleware.1xaxjueme0.js +6 -0
- package/shell-dist/assets/zustand-react-shallow.pybayv1hx0.js +1 -0
- package/shell-dist/assets/zustand-react.9fsl9brxy0.js +1 -0
- package/shell-dist/assets/zustand-shallow.6cz0yyv9x0.js +1 -0
- package/shell-dist/assets/zustand-vanilla-shallow.3424monv50.js +1 -0
- package/shell-dist/assets/zustand-vanilla.1mo3ka3g30.js +1 -0
- package/shell-dist/assets/zustand.3gjgzlnqo0.js +1 -0
- package/shell-dist/index.html +67 -118
- package/shell-dist/versions.json +3 -3
- package/src/__tests__/publish-keygen.test.ts +157 -0
- package/src/__tests__/templates-migration-schema-parity.test.ts +540 -0
- package/src/__tests__/templates-schema-columns.test.ts +15 -2
- package/src/__tests__/templates-tenant-scope.test.ts +6 -2
- package/src/bundle.ts +8 -3
- package/src/cli.ts +17 -5
- package/src/dev.ts +15 -10
- package/src/esm-exports.ts +152 -70
- package/src/install.ts +11 -4
- package/src/keygen.ts +54 -0
- package/src/lifecycle/__tests__/bundle.test.ts +21 -3
- package/src/lifecycle/__tests__/fixtures/fixture-valid/api/src/demo-solution/manifest.yaml +1 -1
- package/src/lifecycle/__tests__/fixtures/fixture-valid/api/src/demo-solution/migrations/0001__init.sql +2 -2
- package/src/lifecycle/__tests__/fixtures/fixture-valid/api/src/demo-solution/schema.yaml +5 -2
- package/src/lifecycle/__tests__/fixtures/fixture-valid/manifest.yaml +1 -1
- package/src/lifecycle/__tests__/manifest-contract.test.ts +75 -3
- package/src/lifecycle/__tests__/smoke.test.ts +2 -2
- package/src/manifest-contract.ts +91 -8
- package/src/market/bootstrap.ts +26 -2
- package/src/market/command.ts +1 -0
- package/src/market/publish.ts +5 -1
- package/src/market/walkthrough.ts +24 -8
- package/src/shared-deps.ts +69 -19
- package/src/site-base.ts +4 -0
- package/src/site.ts +2 -0
- package/src/usage.ts +8 -4
- package/src/vendor.ts +5 -1
- package/templates/config.yaml +4 -2
- package/templates/init.include.yaml +8 -3
- package/templates/openapi.json +460 -1
- package/templates/src/app/api/_platform/_lifecycle/compensate.ts +136 -0
- package/templates/src/app/api/_platform/_lifecycle/installer.ts +71 -22
- package/templates/src/app/api/_platform/_lifecycle/lock.ts +23 -0
- package/templates/src/app/api/_platform/_lifecycle/steps/deploy-web.ts +28 -0
- package/templates/src/app/api/_platform/_lifecycle/steps/preflight.ts +46 -0
- package/templates/src/app/api/_platform/_lifecycle/steps/reload.ts +100 -36
- package/templates/src/app/api/_platform/_lifecycle/steps/smoke.ts +7 -15
- package/templates/src/app/api/_platform/_lifecycle/text-edit.ts +71 -19
- package/templates/src/app/api/_platform/_lifecycle/types.ts +26 -2
- package/templates/src/app/api/_platform/_lifecycle/uninstall.ts +93 -14
- package/templates/src/app/api/_platform/_shared/service/domain/settings.ts +8 -4
- package/templates/src/app/api/_platform/manifest.yaml +1 -0
- package/templates/src/app/api/_platform/market/api.ts +235 -10
- package/templates/src/app/api/_platform/migrations/0001__baseline.mysql.sql +178 -0
- package/templates/src/app/api/_platform/migrations/0001__baseline.pg.sql +173 -0
- package/templates/src/app/api/_platform/migrations/0001__baseline.sql +188 -0
- package/templates/src/app/api/_platform/migrations/0002__market_release.mysql.sql +17 -0
- package/templates/src/app/api/_platform/migrations/0002__market_release.pg.sql +16 -0
- package/templates/src/app/api/_platform/migrations/0002__market_release.sql +33 -0
- package/templates/src/app/api/_platform/schema.yaml +18 -0
- package/templates/src/app/api/_platform/seed.mysql.sql +10 -0
- package/templates/src/app/api/_platform/seed.pg.sql +10 -0
- package/templates/src/app/api/auth/_shared/wecom/client.ts +24 -4
- package/templates/src/app/api/home/migrations/0001__create_home_tables.mysql.sql +14 -0
- package/templates/src/app/api/home/migrations/0001__create_home_tables.pg.sql +14 -0
- package/templates/src/app/api/home/migrations/0002__tenant.pg.sql +4 -0
- package/templates/src/app/api/home/seed.mysql.sql +71 -0
- package/templates/src/app/api/home/seed.pg.sql +71 -0
- package/templates/src/app/api/notification/_shared/notify.ts +6 -6
- package/templates/src/app/api/notification/migrations/0001__create_notifications.mysql.sql +11 -0
- package/templates/src/app/api/notification/migrations/0001__create_notifications.pg.sql +11 -0
- package/templates/src/app/api/notification/migrations/0002__notifications_user.mysql.sql +8 -0
- package/templates/src/app/api/notification/migrations/0003__notifications_broadcast.mysql.sql +21 -0
- package/templates/src/app/api/notification/migrations/0003__notifications_broadcast.pg.sql +22 -0
- package/templates/src/app/api/notification/migrations/0004__notifications_broadcast_hidden.mysql.sql +10 -0
- package/templates/src/app/api/notification/migrations/0004__notifications_broadcast_hidden.pg.sql +11 -0
- package/templates/src/app/api/notification/migrations/0005__tenant.pg.sql +6 -0
- package/templates/src/app/api/notification/seed.mysql.sql +8 -0
- package/templates/src/app/api/notification/seed.pg.sql +11 -0
- package/templates/src/app/api/publish/_shared/identity.ts +69 -0
- package/templates/src/app/api/publish/api.ts +349 -0
- package/templates/src/app/api/publish/manifest.yaml +8 -0
- package/templates/src/app/api/publish/migrations/0001__publish_credential.mysql.sql +23 -0
- package/templates/src/app/api/publish/migrations/0001__publish_credential.pg.sql +23 -0
- package/templates/src/app/api/publish/migrations/0001__publish_credential.sql +39 -0
- package/templates/src/app/api/publish/schema.yaml +33 -0
- package/templates/src/app/api/system/login-methods/api.ts +2 -1
- package/templates/src/app/web/_platform/__client/api.schemas.ts +15 -0
- package/templates/src/app/web/_platform/__client/index.ts +25 -1
- package/templates/src/app/web/entry.ts +9 -5
- package/templates/src/app/web/home/pages/components/bar-chart.tsx +5 -3
- package/templates/src/app/web/home/pages/components/echarts-setup.ts +30 -0
- package/templates/src/app/web/home/pages/components/line-chart.tsx +5 -3
- package/templates/src/app/web/home/pages/components/pie-chart.tsx +6 -3
- package/templates/src/app/web/home/pages/index.tsx +3 -2
- package/templates/src/app/web/home/routes.ts +8 -2
- package/templates/src/app/web/login/locales/en-US.json +7 -1
- package/templates/src/app/web/login/locales/zh-CN.json +7 -1
- package/templates/src/app/web/login/pages/login.tsx +79 -86
- package/templates/src/app/web/login/routes.ts +54 -1
- package/templates/src/app/web/personal-center/locales/en-US.json +1 -0
- package/templates/src/app/web/personal-center/locales/zh-CN.json +1 -0
- package/templates/src/app/web/personal-center/pages/my-profile/index.tsx +5 -0
- package/templates/src/app/web/system/__client/api.schemas.ts +2 -1
- package/templates/src/app/web/system/locales/en-US.json +1 -8
- package/templates/src/app/web/system/locales/zh-CN.json +1 -8
- package/templates/src/app/web/system/pages/settings/index.tsx +17 -4
- package/templates/src/app/web/system/routes.ts +0 -6
- package/templates/src/oj-market/web/__tests__/CardGrid.test.tsx +33 -0
- package/templates/src/oj-market/web/__tests__/DetailDrawer.test.tsx +69 -0
- package/templates/src/oj-market/web/__tests__/marketClient.fake.ts +7 -1
- package/templates/src/oj-market/web/api/client.ts +3 -0
- package/templates/src/oj-market/web/api/defaultClient.ts +5 -0
- package/templates/src/oj-market/web/components/CardItem.tsx +44 -1
- package/templates/src/oj-market/web/components/DetailDrawer.tsx +17 -1
- package/templates/src/oj-market/web/entry.ts +31 -2
- package/templates/src/oj-market/web/locales/en-US.json +5 -1
- package/templates/src/oj-market/web/locales/zh-CN.json +5 -1
- package/templates/src/oj-market/web/publish/__client/api.schemas.ts +61 -0
- package/templates/src/oj-market/web/publish/__client/index.ts +164 -0
- package/templates/src/oj-market/web/publish/locales/en-US.json +80 -0
- package/templates/src/oj-market/web/publish/locales/zh-CN.json +80 -0
- package/templates/src/oj-market/web/publish/pages/history.tsx +112 -0
- package/templates/src/oj-market/web/publish/pages/index.tsx +196 -0
- package/templates/src/oj-market/web/publish/pages/model.ts +52 -0
- package/templates/src/oj-market/web/publish/pages/token-modal.tsx +82 -0
- package/templates/src/oj-market/web/publish/routes.ts +41 -0
- package/templates/src/oj-market/web/types.ts +30 -0
- package/templates/tests/lifecycle/compensate.spec.ts +207 -0
- package/templates/tests/lifecycle/deploy-smoke.spec.ts +38 -14
- package/templates/tests/lifecycle/installer.spec.ts +28 -9
- package/templates/tests/lifecycle/market-api.spec.ts +164 -12
- package/templates/tests/lifecycle/preflight.spec.ts +68 -0
- package/templates/tests/lifecycle/role-title-translate.spec.ts +2 -32
- package/templates/tests/lifecycle/text-edit.spec.ts +45 -27
- package/templates/tests/lifecycle/uninstall.spec.ts +36 -0
- package/templates/tests/publish-credential.spec.ts +354 -0
- package/templates/tests/publish-identity.spec.ts +44 -0
- package/templates/tests/wecom-client-timeout.spec.ts +33 -3
- package/templates/tests/wecom-landing.spec.ts +63 -1
- package/templates/tsconfig.paths.json +1 -0
- package/templates/web.config.ts +6 -4
- package/vendor/host-versions.json +3 -3
- package/shell-dist/assets/ahooks.js +0 -6909
- package/shell-dist/assets/antd-es-locale-zh_CN.js +0 -257
- package/shell-dist/assets/antd-img-crop.js +0 -1495
- package/shell-dist/assets/antd-locale-en_US.js +0 -374
- package/shell-dist/assets/antd-locale-zh_CN.js +0 -379
- package/shell-dist/assets/antd.js +0 -106874
- package/shell-dist/assets/clsx.js +0 -33
- package/shell-dist/assets/contract-errors.js +0 -30
- package/shell-dist/assets/contract.js +0 -18900
- package/shell-dist/assets/cssinjs.js +0 -2595
- package/shell-dist/assets/dayjs-plugin-advancedFormat.js +0 -98
- package/shell-dist/assets/dayjs-plugin-customParseFormat.js +0 -173
- package/shell-dist/assets/dayjs-plugin-isoWeek.js +0 -77
- package/shell-dist/assets/dayjs-plugin-localeData.js +0 -126
- package/shell-dist/assets/dayjs-plugin-quarterOfYear.js +0 -77
- package/shell-dist/assets/dayjs-plugin-relativeTime.js +0 -92
- package/shell-dist/assets/dayjs-plugin-weekOfYear.js +0 -73
- package/shell-dist/assets/dayjs-plugin-weekYear.js +0 -63
- package/shell-dist/assets/dayjs-plugin-weekday.js +0 -63
- package/shell-dist/assets/dayjs.js +0 -326
- package/shell-dist/assets/dnd-kit-core.js +0 -3601
- package/shell-dist/assets/dnd-kit-sortable.js +0 -717
- package/shell-dist/assets/dnd-kit-utilities.js +0 -340
- package/shell-dist/assets/i18next.js +0 -2321
- package/shell-dist/assets/icons-es-components-Context.js +0 -20
- package/shell-dist/assets/icons.js +0 -34961
- package/shell-dist/assets/jsx-dev-runtime.js +0 -75
- package/shell-dist/assets/jsx-runtime.js +0 -97
- package/shell-dist/assets/keepalive-for-react.js +0 -283
- package/shell-dist/assets/kit.js +0 -151
- package/shell-dist/assets/ky.js +0 -1427
- package/shell-dist/assets/motion-react.js +0 -13589
- package/shell-dist/assets/motion.js +0 -9959
- package/shell-dist/assets/nprogress.js +0 -314
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-BarsOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-CalendarOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-CaretDownFilled.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-CaretDownOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-CaretUpOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-CheckCircleFilled.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-CheckOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-ClockCircleOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-CloseCircleFilled.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-CloseOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-CopyOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-DeleteOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-DoubleLeftOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-DoubleRightOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-DownOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-DownloadOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-EditOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-EllipsisOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-EnterOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-ExclamationCircleFilled.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-EyeInvisibleOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-EyeOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-FileOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-FileTextOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-FilterFilled.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-FolderOpenOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-FolderOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-HolderOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-InfoCircleFilled.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-LeftOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-LoadingOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-MinusOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-MinusSquareOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-PaperClipOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-PictureOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-PlusOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-PlusSquareOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-QuestionCircleOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-ReloadOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-RightOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-RotateLeftOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-RotateRightOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-SearchOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-StarFilled.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-SwapOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-SwapRightOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-UpOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-VerticalAlignTopOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-WarningFilled.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-ZoomInOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-ZoomOutOutlined.js +0 -7
- package/shell-dist/assets/ojm-dayjs-locale-zh-cn.js +0 -81
- package/shell-dist/assets/pinyin-pro.js +0 -25175
- package/shell-dist/assets/pro-components.js +0 -44627
- package/shell-dist/assets/react-countup.js +0 -525
- package/shell-dist/assets/react-dom-client.js +0 -12134
- package/shell-dist/assets/react-dom.js +0 -266
- package/shell-dist/assets/react-error-boundary.js +0 -141
- package/shell-dist/assets/react-i18next.js +0 -1773
- package/shell-dist/assets/react-jss.js +0 -4089
- package/shell-dist/assets/react-query.js +0 -3072
- package/shell-dist/assets/react-router-dom.js +0 -9927
- package/shell-dist/assets/react-router.js +0 -14584
- package/shell-dist/assets/react.js +0 -590
- package/shell-dist/assets/runtime.js +0 -28311
- package/shell-dist/assets/simplebar-react.js +0 -1119
- package/shell-dist/assets/spin-delay.js +0 -111
- package/shell-dist/assets/tailwind-merge.js +0 -3364
- package/shell-dist/assets/use-sync-external-store-shim.js +0 -130
- package/shell-dist/assets/zustand-middleware.js +0 -513
- package/shell-dist/assets/zustand-react-shallow.js +0 -27
- package/shell-dist/assets/zustand-react.js +0 -39
- package/shell-dist/assets/zustand-shallow.js +0 -22
- package/shell-dist/assets/zustand-vanilla-shallow.js +0 -71
- package/shell-dist/assets/zustand-vanilla.js +0 -40
- package/shell-dist/assets/zustand.js +0 -32
- package/templates/seed.mysql.sql +0 -6
- package/templates/seed.pg.sql +0 -6
- package/templates/src/app/api/_platform/migrations/0001__create_users.mysql.sql +0 -9
- package/templates/src/app/api/_platform/migrations/0001__create_users.pg.sql +0 -9
- package/templates/src/app/api/_platform/migrations/0001__create_users.sql +0 -7
- package/templates/src/app/api/_platform/migrations/0002__add_users_avatar_base64.mysql.sql +0 -3
- package/templates/src/app/api/_platform/migrations/0002__add_users_avatar_base64.sql +0 -2
- package/templates/src/app/api/_platform/migrations/0003__users_source_display_name.mysql.sql +0 -5
- package/templates/src/app/api/_platform/migrations/0003__users_source_display_name.sql +0 -5
- package/templates/src/app/api/_platform/migrations/0004__sys_rbac.mysql.sql +0 -70
- package/templates/src/app/api/_platform/migrations/0004__sys_rbac.pg.sql +0 -67
- package/templates/src/app/api/_platform/migrations/0004__sys_rbac.sql +0 -67
- package/templates/src/app/api/_platform/migrations/0005__users_must_change.mysql.sql +0 -3
- package/templates/src/app/api/_platform/migrations/0005__users_must_change.sql +0 -2
- package/templates/src/app/api/_platform/migrations/0006__users_is_forbidden.mysql.sql +0 -3
- package/templates/src/app/api/_platform/migrations/0006__users_is_forbidden.sql +0 -3
- package/templates/src/app/api/_platform/migrations/0007__users_email.sql +0 -3
- package/templates/src/app/api/_platform/migrations/0008__sys_refresh_token.mysql.sql +0 -10
- package/templates/src/app/api/_platform/migrations/0008__sys_refresh_token.pg.sql +0 -10
- package/templates/src/app/api/_platform/migrations/0008__sys_refresh_token.sql +0 -11
- package/templates/src/app/api/_platform/migrations/0009__sys_throttle.mysql.sql +0 -12
- package/templates/src/app/api/_platform/migrations/0009__sys_throttle.pg.sql +0 -12
- package/templates/src/app/api/_platform/migrations/0009__sys_throttle.sql +0 -13
- package/templates/src/app/api/_platform/migrations/0010__sys_solution_route.mysql.sql +0 -17
- package/templates/src/app/api/_platform/migrations/0010__sys_solution_route.pg.sql +0 -16
- package/templates/src/app/api/_platform/migrations/0010__sys_solution_route.sql +0 -18
- package/templates/src/app/api/_platform/migrations/0011__sys_setting_group_label.mysql.sql +0 -2
- package/templates/src/app/api/_platform/migrations/0011__sys_setting_group_label.sql +0 -4
- package/templates/src/app/api/_platform/migrations/0012__market_history.mysql.sql +0 -13
- package/templates/src/app/api/_platform/migrations/0012__market_history.pg.sql +0 -12
- package/templates/src/app/api/_platform/migrations/0012__market_history.sql +0 -14
- package/templates/src/app/api/_platform/migrations/0013__users_profile.sql +0 -4
- package/templates/src/app/api/_platform/migrations/0014__reg_source_seq.mysql.sql +0 -9
- package/templates/src/app/api/_platform/migrations/0014__reg_source_seq.pg.sql +0 -7
- package/templates/src/app/api/_platform/migrations/0014__reg_source_seq.sql +0 -8
- package/templates/src/app/api/_platform/migrations/0015__tenant.mysql.sql +0 -12
- package/templates/src/app/api/_platform/migrations/0015__tenant.pg.sql +0 -11
- package/templates/src/app/api/_platform/migrations/0015__tenant.sql +0 -44
- package/templates/src/app/api/_platform/migrations/0016__org.mysql.sql +0 -41
- package/templates/src/app/api/_platform/migrations/0016__org.pg.sql +0 -40
- package/templates/src/app/api/_platform/migrations/0016__org.sql +0 -62
- package/templates/src/app/api/_platform/migrations/0017__users_employee_no.mysql.sql +0 -7
- package/templates/src/app/api/_platform/migrations/0017__users_employee_no.pg.sql +0 -4
- package/templates/src/app/api/_platform/migrations/0017__users_employee_no.sql +0 -8
- package/templates/src/app/api/_platform/migrations/0018__sys_role_title_key.mysql.sql +0 -3
- package/templates/src/app/api/_platform/migrations/0018__sys_role_title_key.pg.sql +0 -3
- package/templates/src/app/api/_platform/migrations/0018__sys_role_title_key.sql +0 -8
- package/templates/src/app/web/system/pages/login-methods/index.tsx +0 -30
- /package/shell-dist/assets/{nprogress-css.js → nprogress-css.1cq2pzkre0.js} +0 -0
- /package/shell-dist/assets/{ojm-antd-es-button.js → ojm-antd-es-button.2uriphio50.js} +0 -0
- /package/shell-dist/assets/{ojm-antd-es-modal.js → ojm-antd-es-modal.bf3tgdh8v0.js} +0 -0
- /package/shell-dist/assets/{ojm-antd-es-slider.js → ojm-antd-es-slider.xyvptuhid0.js} +0 -0
- /package/shell-dist/assets/{ojm-antd-es-upload.js → ojm-antd-es-upload.13gx45e0g0.js} +0 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
-- 0001__baseline(postgres 方言):_platform 全部表结构基线。压平口径见 0001__baseline.sql 头注释。
|
|
2
|
+
--
|
|
3
|
+
-- 方言差异(沿用历史迁移的既有惯例):
|
|
4
|
+
-- · AUTOINCREMENT → BIGSERIAL(SERIAL 系允许 seed 显式写 id,GENERATED ALWAYS 系不允许);
|
|
5
|
+
-- · TEXT 在 pg 合法,键列与文本列一律保留 TEXT,无需收窄;
|
|
6
|
+
-- · 秒级 / 毫秒级 epoch 的整型一律取 BIGINT(int4 上限 2.1e9,毫秒时间戳 1.7e12 直接溢出);
|
|
7
|
+
-- · 部分唯一索引 pg 原生支持(工号「有值才唯一」与 sqlite 同语法)。
|
|
8
|
+
|
|
9
|
+
CREATE TABLE IF NOT EXISTS users (
|
|
10
|
+
id BIGSERIAL PRIMARY KEY,
|
|
11
|
+
tenant_id TEXT NOT NULL DEFAULT 'default',
|
|
12
|
+
corp_id TEXT,
|
|
13
|
+
username TEXT NOT NULL,
|
|
14
|
+
password_hash TEXT NOT NULL,
|
|
15
|
+
avatar_base64 TEXT NOT NULL DEFAULT '',
|
|
16
|
+
source TEXT NOT NULL DEFAULT 'local',
|
|
17
|
+
display_name TEXT,
|
|
18
|
+
must_change INTEGER NOT NULL DEFAULT 0,
|
|
19
|
+
is_forbidden INTEGER NOT NULL DEFAULT 0,
|
|
20
|
+
email TEXT,
|
|
21
|
+
phone_number TEXT,
|
|
22
|
+
description TEXT,
|
|
23
|
+
activated INTEGER NOT NULL DEFAULT 0,
|
|
24
|
+
position TEXT,
|
|
25
|
+
external_status INTEGER,
|
|
26
|
+
employee_no TEXT,
|
|
27
|
+
UNIQUE (tenant_id, username)
|
|
28
|
+
);
|
|
29
|
+
CREATE UNIQUE INDEX IF NOT EXISTS uk_users_employee_no
|
|
30
|
+
ON users (tenant_id, employee_no) WHERE employee_no IS NOT NULL;
|
|
31
|
+
|
|
32
|
+
CREATE TABLE IF NOT EXISTS sys_setting (
|
|
33
|
+
key TEXT PRIMARY KEY,
|
|
34
|
+
module TEXT NOT NULL,
|
|
35
|
+
"group" TEXT NOT NULL,
|
|
36
|
+
type TEXT NOT NULL DEFAULT 'string',
|
|
37
|
+
value TEXT,
|
|
38
|
+
default_value TEXT,
|
|
39
|
+
label_key TEXT,
|
|
40
|
+
options TEXT,
|
|
41
|
+
secret INTEGER NOT NULL DEFAULT 0,
|
|
42
|
+
update_time BIGINT NOT NULL DEFAULT 0,
|
|
43
|
+
deprecated INTEGER NOT NULL DEFAULT 0,
|
|
44
|
+
group_label_key TEXT
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
CREATE TABLE IF NOT EXISTS sys_oplog (
|
|
48
|
+
id BIGSERIAL PRIMARY KEY,
|
|
49
|
+
create_time BIGINT NOT NULL,
|
|
50
|
+
user_id BIGINT NOT NULL DEFAULT 0,
|
|
51
|
+
username TEXT NOT NULL DEFAULT 'system',
|
|
52
|
+
action TEXT NOT NULL,
|
|
53
|
+
module TEXT NOT NULL DEFAULT 'framework',
|
|
54
|
+
version TEXT,
|
|
55
|
+
target TEXT,
|
|
56
|
+
detail TEXT,
|
|
57
|
+
level INTEGER NOT NULL DEFAULT 6,
|
|
58
|
+
tenant_id TEXT NOT NULL DEFAULT 'default'
|
|
59
|
+
);
|
|
60
|
+
CREATE INDEX IF NOT EXISTS idx_sys_oplog_time ON sys_oplog (create_time, id);
|
|
61
|
+
|
|
62
|
+
CREATE TABLE IF NOT EXISTS sys_solution_route (
|
|
63
|
+
path TEXT PRIMARY KEY,
|
|
64
|
+
module TEXT NOT NULL,
|
|
65
|
+
category TEXT NOT NULL,
|
|
66
|
+
"order" INTEGER NOT NULL DEFAULT 0,
|
|
67
|
+
title_key TEXT,
|
|
68
|
+
required_permission TEXT,
|
|
69
|
+
deprecated INTEGER NOT NULL DEFAULT 0,
|
|
70
|
+
enabled INTEGER NOT NULL DEFAULT 1
|
|
71
|
+
);
|
|
72
|
+
CREATE INDEX IF NOT EXISTS idx_sys_solution_route_module ON sys_solution_route (module);
|
|
73
|
+
|
|
74
|
+
CREATE TABLE IF NOT EXISTS sys_role (
|
|
75
|
+
name TEXT PRIMARY KEY,
|
|
76
|
+
module TEXT NOT NULL,
|
|
77
|
+
title TEXT,
|
|
78
|
+
description TEXT,
|
|
79
|
+
builtin INTEGER NOT NULL DEFAULT 0,
|
|
80
|
+
deprecated INTEGER NOT NULL DEFAULT 0,
|
|
81
|
+
title_key TEXT
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
CREATE TABLE IF NOT EXISTS sys_permission (
|
|
85
|
+
code TEXT PRIMARY KEY,
|
|
86
|
+
module TEXT NOT NULL,
|
|
87
|
+
title_key TEXT,
|
|
88
|
+
deprecated INTEGER NOT NULL DEFAULT 0
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
CREATE TABLE IF NOT EXISTS sys_role_permission (
|
|
92
|
+
role_name TEXT NOT NULL,
|
|
93
|
+
permission_code TEXT NOT NULL,
|
|
94
|
+
PRIMARY KEY (role_name, permission_code)
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
CREATE TABLE IF NOT EXISTS sys_user_role (
|
|
98
|
+
user_id BIGINT NOT NULL,
|
|
99
|
+
role_name TEXT NOT NULL,
|
|
100
|
+
tenant_id TEXT NOT NULL DEFAULT 'default',
|
|
101
|
+
PRIMARY KEY (user_id, role_name)
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
CREATE TABLE IF NOT EXISTS sys_refresh_token (
|
|
105
|
+
token_hash TEXT PRIMARY KEY,
|
|
106
|
+
user_id BIGINT NOT NULL,
|
|
107
|
+
expires_at BIGINT NOT NULL,
|
|
108
|
+
revoked INTEGER NOT NULL DEFAULT 0,
|
|
109
|
+
created_at BIGINT NOT NULL,
|
|
110
|
+
tenant_id TEXT NOT NULL DEFAULT 'default'
|
|
111
|
+
);
|
|
112
|
+
CREATE INDEX IF NOT EXISTS idx_sys_refresh_token_user ON sys_refresh_token (user_id);
|
|
113
|
+
|
|
114
|
+
CREATE TABLE IF NOT EXISTS sys_rate_window (
|
|
115
|
+
rate_key TEXT PRIMARY KEY,
|
|
116
|
+
window_start BIGINT NOT NULL,
|
|
117
|
+
count INTEGER NOT NULL
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
CREATE TABLE IF NOT EXISTS sys_login_throttle (
|
|
121
|
+
pair_key TEXT PRIMARY KEY,
|
|
122
|
+
fail_count INTEGER NOT NULL,
|
|
123
|
+
blocked_until BIGINT NOT NULL DEFAULT 0
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
CREATE TABLE IF NOT EXISTS market_history (
|
|
127
|
+
id BIGSERIAL PRIMARY KEY,
|
|
128
|
+
solution TEXT NOT NULL,
|
|
129
|
+
version TEXT NOT NULL,
|
|
130
|
+
action TEXT NOT NULL,
|
|
131
|
+
status TEXT NOT NULL,
|
|
132
|
+
operator TEXT,
|
|
133
|
+
message TEXT,
|
|
134
|
+
created_at BIGINT NOT NULL
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
CREATE TABLE IF NOT EXISTS reg_source_seq (
|
|
138
|
+
source_url TEXT NOT NULL PRIMARY KEY,
|
|
139
|
+
max_seq BIGINT NOT NULL,
|
|
140
|
+
updated_at BIGINT NOT NULL
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
CREATE TABLE IF NOT EXISTS sys_department (
|
|
144
|
+
id BIGSERIAL PRIMARY KEY,
|
|
145
|
+
tenant_id TEXT NOT NULL,
|
|
146
|
+
origin TEXT NOT NULL DEFAULT 'local',
|
|
147
|
+
origin_id TEXT NOT NULL,
|
|
148
|
+
parent_id BIGINT,
|
|
149
|
+
name TEXT,
|
|
150
|
+
name_en TEXT,
|
|
151
|
+
order_no INTEGER NOT NULL DEFAULT 0,
|
|
152
|
+
sync_visible INTEGER NOT NULL DEFAULT 1,
|
|
153
|
+
deleted INTEGER NOT NULL DEFAULT 0,
|
|
154
|
+
seen_job_id BIGINT,
|
|
155
|
+
update_time BIGINT NOT NULL,
|
|
156
|
+
UNIQUE (tenant_id, origin, origin_id)
|
|
157
|
+
);
|
|
158
|
+
CREATE INDEX IF NOT EXISTS idx_sys_department_parent
|
|
159
|
+
ON sys_department (tenant_id, parent_id, deleted, order_no);
|
|
160
|
+
|
|
161
|
+
CREATE TABLE IF NOT EXISTS sys_dept_member (
|
|
162
|
+
id BIGSERIAL PRIMARY KEY,
|
|
163
|
+
tenant_id TEXT NOT NULL,
|
|
164
|
+
user_id BIGINT NOT NULL,
|
|
165
|
+
dept_id BIGINT NOT NULL,
|
|
166
|
+
order_no INTEGER NOT NULL DEFAULT 0,
|
|
167
|
+
is_leader INTEGER NOT NULL DEFAULT 0,
|
|
168
|
+
is_main INTEGER NOT NULL DEFAULT 0,
|
|
169
|
+
update_time BIGINT NOT NULL,
|
|
170
|
+
UNIQUE (tenant_id, user_id, dept_id)
|
|
171
|
+
);
|
|
172
|
+
CREATE INDEX IF NOT EXISTS idx_sys_dept_member_dept ON sys_dept_member (tenant_id, dept_id, order_no);
|
|
173
|
+
CREATE INDEX IF NOT EXISTS idx_sys_dept_member_user ON sys_dept_member (tenant_id, user_id, is_main);
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
-- 0001__baseline(sqlite 方言):_platform 全部表结构基线
|
|
2
|
+
--
|
|
3
|
+
-- 为什么是一条基线:本产品正式发版前,0001–0018 共 45 个迁移文件只是演进过程的中间态。
|
|
4
|
+
-- 压平后一个模块只有一条迁移(迁移账本按 [module, version] 记账,序列不允许空洞,
|
|
5
|
+
-- 故必须仍从 0001 开始)。**升级既有开发库不受支持**:老库账本已记 0001–0018,
|
|
6
|
+
-- 新基线会被视为「已应用」而跳过 —— 删掉本地 sqlite 重启即按本文件重建(见 devkit manual)。
|
|
7
|
+
--
|
|
8
|
+
-- 压平口径:与「顺序执行 0001–0018 后的最终结构」逐列、逐索引等价;
|
|
9
|
+
-- 同时补齐了此前只有 sqlite 版、没有 mysql/pg 版的 7 条迁移(0002/0003/0005/0006/0007/0011/0013)。
|
|
10
|
+
-- 与 schema.yaml 的一致性由 templates-migration-schema-parity.test.ts 双向守着。
|
|
11
|
+
|
|
12
|
+
-- ── users(租户表 A 组:tenant_id 是真实列,唯一性收敛到租户内)─────────────────
|
|
13
|
+
CREATE TABLE IF NOT EXISTS users (
|
|
14
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
15
|
+
tenant_id TEXT NOT NULL DEFAULT 'default',
|
|
16
|
+
corp_id TEXT,
|
|
17
|
+
username TEXT NOT NULL,
|
|
18
|
+
password_hash TEXT NOT NULL,
|
|
19
|
+
avatar_base64 TEXT NOT NULL DEFAULT '',
|
|
20
|
+
source TEXT NOT NULL DEFAULT 'local',
|
|
21
|
+
display_name TEXT,
|
|
22
|
+
must_change INTEGER NOT NULL DEFAULT 0,
|
|
23
|
+
is_forbidden INTEGER NOT NULL DEFAULT 0,
|
|
24
|
+
email TEXT,
|
|
25
|
+
phone_number TEXT,
|
|
26
|
+
description TEXT,
|
|
27
|
+
activated INTEGER NOT NULL DEFAULT 0,
|
|
28
|
+
position TEXT,
|
|
29
|
+
external_status INTEGER,
|
|
30
|
+
employee_no TEXT,
|
|
31
|
+
UNIQUE (tenant_id, username)
|
|
32
|
+
);
|
|
33
|
+
-- 工号租户内唯一。可空是必需的:存量本地账号与部分外部账号没有工号,
|
|
34
|
+
-- 唯一性只在有值时成立 → 部分索引(sqlite/pg 同语法;mysql 靠 NULL 可重复等效)。
|
|
35
|
+
CREATE UNIQUE INDEX IF NOT EXISTS uk_users_employee_no
|
|
36
|
+
ON users (tenant_id, employee_no) WHERE employee_no IS NOT NULL;
|
|
37
|
+
|
|
38
|
+
-- ── sys_setting(共享表 B 组:登录方式发现是未登录端点,此刻无租户上下文)────────
|
|
39
|
+
CREATE TABLE IF NOT EXISTS sys_setting (
|
|
40
|
+
key TEXT PRIMARY KEY,
|
|
41
|
+
module TEXT NOT NULL,
|
|
42
|
+
"group" TEXT NOT NULL,
|
|
43
|
+
type TEXT NOT NULL DEFAULT 'string',
|
|
44
|
+
value TEXT,
|
|
45
|
+
default_value TEXT,
|
|
46
|
+
label_key TEXT,
|
|
47
|
+
options TEXT,
|
|
48
|
+
secret INTEGER NOT NULL DEFAULT 0,
|
|
49
|
+
update_time INTEGER NOT NULL DEFAULT 0,
|
|
50
|
+
deprecated INTEGER NOT NULL DEFAULT 0,
|
|
51
|
+
group_label_key TEXT
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
-- ── sys_oplog(租户表 A 组)──────────────────────────────────────────────────
|
|
55
|
+
CREATE TABLE IF NOT EXISTS sys_oplog (
|
|
56
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
57
|
+
create_time INTEGER NOT NULL,
|
|
58
|
+
user_id INTEGER NOT NULL DEFAULT 0,
|
|
59
|
+
username TEXT NOT NULL DEFAULT 'system',
|
|
60
|
+
action TEXT NOT NULL,
|
|
61
|
+
module TEXT NOT NULL DEFAULT 'framework',
|
|
62
|
+
version TEXT,
|
|
63
|
+
target TEXT,
|
|
64
|
+
detail TEXT,
|
|
65
|
+
level INTEGER NOT NULL DEFAULT 6,
|
|
66
|
+
tenant_id TEXT NOT NULL DEFAULT 'default'
|
|
67
|
+
);
|
|
68
|
+
CREATE INDEX IF NOT EXISTS idx_sys_oplog_time ON sys_oplog (create_time, id);
|
|
69
|
+
|
|
70
|
+
-- ── sys_solution_route(共享表 B 组:站点级路由注册,path 唯一)────────────────
|
|
71
|
+
CREATE TABLE IF NOT EXISTS sys_solution_route (
|
|
72
|
+
path TEXT PRIMARY KEY,
|
|
73
|
+
module TEXT NOT NULL,
|
|
74
|
+
category TEXT NOT NULL,
|
|
75
|
+
"order" INTEGER NOT NULL DEFAULT 0,
|
|
76
|
+
title_key TEXT,
|
|
77
|
+
required_permission TEXT,
|
|
78
|
+
deprecated INTEGER NOT NULL DEFAULT 0,
|
|
79
|
+
enabled INTEGER NOT NULL DEFAULT 1
|
|
80
|
+
);
|
|
81
|
+
CREATE INDEX IF NOT EXISTS idx_sys_solution_route_module ON sys_solution_route (module);
|
|
82
|
+
|
|
83
|
+
-- ── RBAC 目录(共享表 B 组:角色/权限码是框架目录,分配关系在 A 组 sys_user_role)──
|
|
84
|
+
CREATE TABLE IF NOT EXISTS sys_role (
|
|
85
|
+
name TEXT PRIMARY KEY,
|
|
86
|
+
module TEXT NOT NULL,
|
|
87
|
+
title TEXT,
|
|
88
|
+
description TEXT,
|
|
89
|
+
builtin INTEGER NOT NULL DEFAULT 0,
|
|
90
|
+
deprecated INTEGER NOT NULL DEFAULT 0,
|
|
91
|
+
-- title = 安装期解析文本;title_key = 原始 i18n key(UI 实时翻译锚,与 sys_permission.title_key 同形)
|
|
92
|
+
title_key TEXT
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
CREATE TABLE IF NOT EXISTS sys_permission (
|
|
96
|
+
code TEXT PRIMARY KEY,
|
|
97
|
+
module TEXT NOT NULL,
|
|
98
|
+
title_key TEXT,
|
|
99
|
+
deprecated INTEGER NOT NULL DEFAULT 0
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
CREATE TABLE IF NOT EXISTS sys_role_permission (
|
|
103
|
+
role_name TEXT NOT NULL,
|
|
104
|
+
permission_code TEXT NOT NULL,
|
|
105
|
+
PRIMARY KEY (role_name, permission_code)
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
CREATE TABLE IF NOT EXISTS sys_user_role (
|
|
109
|
+
user_id INTEGER NOT NULL,
|
|
110
|
+
role_name TEXT NOT NULL,
|
|
111
|
+
tenant_id TEXT NOT NULL DEFAULT 'default',
|
|
112
|
+
PRIMARY KEY (user_id, role_name)
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
-- ── sys_refresh_token(租户表 A 组)──────────────────────────────────────────
|
|
116
|
+
CREATE TABLE IF NOT EXISTS sys_refresh_token (
|
|
117
|
+
token_hash TEXT PRIMARY KEY,
|
|
118
|
+
user_id INTEGER NOT NULL,
|
|
119
|
+
expires_at INTEGER NOT NULL,
|
|
120
|
+
revoked INTEGER NOT NULL DEFAULT 0,
|
|
121
|
+
created_at INTEGER NOT NULL,
|
|
122
|
+
tenant_id TEXT NOT NULL DEFAULT 'default'
|
|
123
|
+
);
|
|
124
|
+
CREATE INDEX IF NOT EXISTS idx_sys_refresh_token_user ON sys_refresh_token (user_id);
|
|
125
|
+
|
|
126
|
+
-- ── 限速/登录节流(共享表 B 组:登录前就要用,无租户上下文)─────────────────────
|
|
127
|
+
CREATE TABLE IF NOT EXISTS sys_rate_window (
|
|
128
|
+
rate_key TEXT PRIMARY KEY,
|
|
129
|
+
window_start INTEGER NOT NULL,
|
|
130
|
+
count INTEGER NOT NULL
|
|
131
|
+
);
|
|
132
|
+
CREATE TABLE IF NOT EXISTS sys_login_throttle (
|
|
133
|
+
pair_key TEXT PRIMARY KEY,
|
|
134
|
+
fail_count INTEGER NOT NULL,
|
|
135
|
+
blocked_until INTEGER NOT NULL DEFAULT 0
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
-- ── 市场操作留痕(共享表 B 组:安装/升级/回滚是站点级动作)──────────────────────
|
|
139
|
+
CREATE TABLE IF NOT EXISTS market_history (
|
|
140
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
141
|
+
solution TEXT NOT NULL,
|
|
142
|
+
version TEXT NOT NULL,
|
|
143
|
+
action TEXT NOT NULL,
|
|
144
|
+
status TEXT NOT NULL,
|
|
145
|
+
operator TEXT,
|
|
146
|
+
message TEXT,
|
|
147
|
+
created_at INTEGER NOT NULL
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
-- ── 索引新鲜度水位(共享表 B 组:受害者是站点,记录点就在站点)────────────────────
|
|
151
|
+
CREATE TABLE IF NOT EXISTS reg_source_seq (
|
|
152
|
+
source_url TEXT NOT NULL PRIMARY KEY,
|
|
153
|
+
max_seq INTEGER NOT NULL,
|
|
154
|
+
updated_at INTEGER NOT NULL
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
-- ── 组织架构(租户表 A 组:tenant_id 前缀索引,不进 shared_allow)────────────────
|
|
158
|
+
CREATE TABLE IF NOT EXISTS sys_department (
|
|
159
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
160
|
+
tenant_id TEXT NOT NULL,
|
|
161
|
+
origin TEXT NOT NULL DEFAULT 'local',
|
|
162
|
+
origin_id TEXT NOT NULL,
|
|
163
|
+
parent_id INTEGER,
|
|
164
|
+
name TEXT,
|
|
165
|
+
name_en TEXT,
|
|
166
|
+
order_no INTEGER NOT NULL DEFAULT 0,
|
|
167
|
+
sync_visible INTEGER NOT NULL DEFAULT 1,
|
|
168
|
+
deleted INTEGER NOT NULL DEFAULT 0,
|
|
169
|
+
seen_job_id INTEGER,
|
|
170
|
+
update_time INTEGER NOT NULL,
|
|
171
|
+
UNIQUE (tenant_id, origin, origin_id)
|
|
172
|
+
);
|
|
173
|
+
CREATE INDEX IF NOT EXISTS idx_sys_department_parent
|
|
174
|
+
ON sys_department (tenant_id, parent_id, deleted, order_no);
|
|
175
|
+
|
|
176
|
+
CREATE TABLE IF NOT EXISTS sys_dept_member (
|
|
177
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
178
|
+
tenant_id TEXT NOT NULL,
|
|
179
|
+
user_id INTEGER NOT NULL,
|
|
180
|
+
dept_id INTEGER NOT NULL,
|
|
181
|
+
order_no INTEGER NOT NULL DEFAULT 0,
|
|
182
|
+
is_leader INTEGER NOT NULL DEFAULT 0,
|
|
183
|
+
is_main INTEGER NOT NULL DEFAULT 0,
|
|
184
|
+
update_time INTEGER NOT NULL,
|
|
185
|
+
UNIQUE (tenant_id, user_id, dept_id)
|
|
186
|
+
);
|
|
187
|
+
CREATE INDEX IF NOT EXISTS idx_sys_dept_member_dept ON sys_dept_member (tenant_id, dept_id, order_no);
|
|
188
|
+
CREATE INDEX IF NOT EXISTS idx_sys_dept_member_user ON sys_dept_member (tenant_id, user_id, is_main);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
-- 0002__market_release(mysql 方言):列语义同 0002__market_release.sql 头注释。
|
|
2
|
+
-- 差异(沿用 _platform 基线的既有惯例):键列/短文本收窄为 VARCHAR;秒级 epoch 取 BIGINT;
|
|
3
|
+
-- 索引写在 CREATE TABLE 内(mysql 无 CREATE INDEX IF NOT EXISTS)。
|
|
4
|
+
CREATE TABLE IF NOT EXISTS market_release (
|
|
5
|
+
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|
6
|
+
product VARCHAR(255) NOT NULL,
|
|
7
|
+
version VARCHAR(255) NOT NULL,
|
|
8
|
+
key_id VARCHAR(255),
|
|
9
|
+
sha256 VARCHAR(64),
|
|
10
|
+
size BIGINT,
|
|
11
|
+
published_at BIGINT NOT NULL,
|
|
12
|
+
published_at_source VARCHAR(16) NOT NULL,
|
|
13
|
+
yanked BIGINT NOT NULL DEFAULT 0,
|
|
14
|
+
first_seen_at BIGINT NOT NULL,
|
|
15
|
+
UNIQUE KEY uk_market_release_version (product, version),
|
|
16
|
+
KEY idx_market_release_published (published_at)
|
|
17
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
-- 0002__market_release(postgres 方言):列语义同 0002__market_release.sql 头注释。
|
|
2
|
+
-- 差异(沿用 _platform 基线的既有惯例):TEXT 全保留,秒级 epoch 取 BIGINT。
|
|
3
|
+
CREATE TABLE IF NOT EXISTS market_release (
|
|
4
|
+
id BIGSERIAL PRIMARY KEY,
|
|
5
|
+
product TEXT NOT NULL,
|
|
6
|
+
version TEXT NOT NULL,
|
|
7
|
+
key_id TEXT,
|
|
8
|
+
sha256 TEXT,
|
|
9
|
+
size BIGINT,
|
|
10
|
+
published_at BIGINT NOT NULL,
|
|
11
|
+
published_at_source TEXT NOT NULL,
|
|
12
|
+
yanked INTEGER NOT NULL DEFAULT 0,
|
|
13
|
+
first_seen_at BIGINT NOT NULL
|
|
14
|
+
);
|
|
15
|
+
CREATE UNIQUE INDEX IF NOT EXISTS uk_market_release_version ON market_release (product, version);
|
|
16
|
+
CREATE INDEX IF NOT EXISTS idx_market_release_published ON market_release (published_at);
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
-- 0002__market_release(sqlite 方言):发布历史表。
|
|
2
|
+
--
|
|
3
|
+
-- 定性:**共享表**(schema.yaml `tenant: false` + config.yaml `tenant.shared_allow` 双声明)。
|
|
4
|
+
-- 理由:发布历史描述的是「这个 CDN 上出现过哪些包、谁发的」,CDN 本身就是站点级的;
|
|
5
|
+
-- 按租户隔离会把同一份市场索引割裂成互不可见的碎片。
|
|
6
|
+
--
|
|
7
|
+
-- 数据来源是**签名索引**(market/api.ts syncReleases):站点每次读发布历史时把索引里出现过的
|
|
8
|
+
-- product@version 补进来。为什么不在 CLI 发版时上报:`ojm market publish` 是纯本地操作
|
|
9
|
+
-- (可离线、无登录态),签名索引本身就是发版事实,再开一条上报链路只会多一套授权面与漂移源。
|
|
10
|
+
--
|
|
11
|
+
-- 语义:
|
|
12
|
+
-- · 一行 = 一个 product@version(唯一键),history 是 append-only:published_at 首次写定后不改
|
|
13
|
+
-- · published_at 优先取分发包的 Last-Modified(真正的落 CDN 时刻),取不到回落索引 issued_at,
|
|
14
|
+
-- 由 published_at_source 标明来源(file / index)
|
|
15
|
+
-- · yanked 跟随索引(0 在架 / 1 已下线)——下线是当前状态,不是历史事实的改写
|
|
16
|
+
CREATE TABLE IF NOT EXISTS market_release (
|
|
17
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
18
|
+
product TEXT NOT NULL,
|
|
19
|
+
version TEXT NOT NULL,
|
|
20
|
+
key_id TEXT,
|
|
21
|
+
sha256 TEXT,
|
|
22
|
+
size INTEGER,
|
|
23
|
+
published_at INTEGER NOT NULL,
|
|
24
|
+
published_at_source TEXT NOT NULL,
|
|
25
|
+
yanked INTEGER NOT NULL DEFAULT 0,
|
|
26
|
+
first_seen_at INTEGER NOT NULL
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
-- 同步幂等:同一 product@version 只落一行(并发同步撞键由插入侧吞掉)
|
|
30
|
+
CREATE UNIQUE INDEX IF NOT EXISTS uk_market_release_version ON market_release (product, version);
|
|
31
|
+
|
|
32
|
+
-- 发布历史页主查询:按发布时间倒序分页
|
|
33
|
+
CREATE INDEX IF NOT EXISTS idx_market_release_published ON market_release (published_at);
|
|
@@ -167,6 +167,24 @@ tables:
|
|
|
167
167
|
operator: {type: text}
|
|
168
168
|
message: {type: text}
|
|
169
169
|
created_at: {type: integer, null: false}
|
|
170
|
+
# 发布历史(2026-11-05):签名索引里出现过的每个 product@version 一行。
|
|
171
|
+
# 站点读发布历史时从索引同步(只补新行),published_at 首次写定后不改。
|
|
172
|
+
market_release:
|
|
173
|
+
# 共享表(B 组):CDN 是站点级的,按租户隔离会把同一份市场索引割裂成互不可见的碎片。
|
|
174
|
+
tenant: false
|
|
175
|
+
pk: id
|
|
176
|
+
columns:
|
|
177
|
+
id: {type: integer, autoincrement: true}
|
|
178
|
+
product: {type: text, null: false}
|
|
179
|
+
version: {type: text, null: false}
|
|
180
|
+
key_id: {type: text}
|
|
181
|
+
sha256: {type: text}
|
|
182
|
+
size: {type: integer}
|
|
183
|
+
published_at: {type: integer, null: false}
|
|
184
|
+
# file = 分发包 Last-Modified(真正的落 CDN 时刻);index = 索引 issued_at 兜底
|
|
185
|
+
published_at_source: {type: text, null: false}
|
|
186
|
+
yanked: {type: integer, null: false}
|
|
187
|
+
first_seen_at: {type: integer, null: false}
|
|
170
188
|
# REG-CS2 索引新鲜度:站点按源记住见过的最大 seq(防回放/降级,回退即拒)。
|
|
171
189
|
# 读写由 _lifecycle/source-seq.ts 落到本表;source_url 为业务主键(无自增 id)。
|
|
172
190
|
reg_source_seq:
|
|
@@ -19,3 +19,13 @@ INSERT IGNORE INTO sys_permission (code, module, title_key, deprecated) VALUES (
|
|
|
19
19
|
-- 企微组织架构同步(B2):触发同步是打上游的动作,挂权限点;admin/superadmin 天然通过,
|
|
20
20
|
-- 只有自定义角色需要显式绑定(与 platform.org.read.all 同一条纪律:不落库就永远绑不上)。
|
|
21
21
|
INSERT IGNORE INTO sys_permission (code, module, title_key, deprecated) VALUES ('auth.wecom.sync', 'auth', 'system:perm.auth_wecom_sync', 0);
|
|
22
|
+
|
|
23
|
+
-- 系统设置默认值(与基础 seed 逐条对应):方言文件不得漏段,漏了会让设置页/登录方式发现静默缺默认值。
|
|
24
|
+
INSERT IGNORE INTO sys_setting (`key`, module, `group`, type, value, default_value, label_key, secret, update_time) VALUES ('framework.site_title', 'framework', 'general', 'string', 'React Antd Admin', 'React Antd Admin', 'system:setting.site_title', 0, 0);
|
|
25
|
+
INSERT IGNORE INTO sys_setting (`key`, module, `group`, type, value, default_value, label_key, secret, update_time) VALUES ('framework.market_cdn_url', 'framework', 'security', 'string', '/cdn', '/cdn', 'system:setting.market_cdn_url', 0, 0);
|
|
26
|
+
INSERT IGNORE INTO sys_setting (`key`, module, `group`, type, value, default_value, label_key, secret, update_time) VALUES ('ldap.enabled', 'ldap', 'login', 'bool', '0', '0', 'system:setting.ldap_enabled', 0, 0);
|
|
27
|
+
INSERT IGNORE INTO sys_setting (`key`, module, `group`, type, value, default_value, label_key, secret, update_time) VALUES ('sso.enabled', 'sso', 'login', 'bool', '0', '0', 'system:setting.sso_enabled', 0, 0);
|
|
28
|
+
INSERT IGNORE INTO sys_setting (`key`, module, `group`, type, value, default_value, label_key, secret, update_time) VALUES ('wecom.enabled', 'wecom', 'login', 'bool', '0', '0', 'system:setting.wecom_enabled', 0, 0);
|
|
29
|
+
INSERT IGNORE INTO sys_setting (`key`, module, `group`, type, value, default_value, label_key, secret, update_time) VALUES ('ldap_base_dn', 'ldap', 'ldap', 'string', '', '', 'system:setting.ldap_base_dn', 0, 0);
|
|
30
|
+
INSERT IGNORE INTO sys_setting (`key`, module, `group`, type, value, default_value, label_key, secret, update_time) VALUES ('ldap_uid_attr', 'ldap', 'ldap', 'string', 'uid', 'uid', 'system:setting.ldap_uid_attr', 0, 0);
|
|
31
|
+
INSERT IGNORE INTO sys_setting (`key`, module, `group`, type, value, default_value, label_key, secret, update_time) VALUES ('ldap_email_attr', 'ldap', 'ldap', 'string', 'mail', 'mail', 'system:setting.ldap_email_attr', 0, 0);
|
|
@@ -19,3 +19,13 @@ INSERT INTO sys_permission (code, module, title_key, deprecated) VALUES ('platfo
|
|
|
19
19
|
-- 企微组织架构同步(B2):触发同步是打上游的动作,挂权限点;admin/superadmin 天然通过,
|
|
20
20
|
-- 只有自定义角色需要显式绑定(与 platform.org.read.all 同一条纪律:不落库就永远绑不上)。
|
|
21
21
|
INSERT INTO sys_permission (code, module, title_key, deprecated) VALUES ('auth.wecom.sync', 'auth', 'system:perm.auth_wecom_sync', 0) ON CONFLICT DO NOTHING;
|
|
22
|
+
|
|
23
|
+
-- 系统设置默认值(与基础 seed 逐条对应):方言文件不得漏段,漏了会让设置页/登录方式发现静默缺默认值。
|
|
24
|
+
INSERT INTO sys_setting (key, module, "group", type, value, default_value, label_key, secret, update_time) VALUES ('framework.site_title', 'framework', 'general', 'string', 'React Antd Admin', 'React Antd Admin', 'system:setting.site_title', 0, 0) ON CONFLICT DO NOTHING;
|
|
25
|
+
INSERT INTO sys_setting (key, module, "group", type, value, default_value, label_key, secret, update_time) VALUES ('framework.market_cdn_url', 'framework', 'security', 'string', '/cdn', '/cdn', 'system:setting.market_cdn_url', 0, 0) ON CONFLICT DO NOTHING;
|
|
26
|
+
INSERT INTO sys_setting (key, module, "group", type, value, default_value, label_key, secret, update_time) VALUES ('ldap.enabled', 'ldap', 'login', 'bool', '0', '0', 'system:setting.ldap_enabled', 0, 0) ON CONFLICT DO NOTHING;
|
|
27
|
+
INSERT INTO sys_setting (key, module, "group", type, value, default_value, label_key, secret, update_time) VALUES ('sso.enabled', 'sso', 'login', 'bool', '0', '0', 'system:setting.sso_enabled', 0, 0) ON CONFLICT DO NOTHING;
|
|
28
|
+
INSERT INTO sys_setting (key, module, "group", type, value, default_value, label_key, secret, update_time) VALUES ('wecom.enabled', 'wecom', 'login', 'bool', '0', '0', 'system:setting.wecom_enabled', 0, 0) ON CONFLICT DO NOTHING;
|
|
29
|
+
INSERT INTO sys_setting (key, module, "group", type, value, default_value, label_key, secret, update_time) VALUES ('ldap_base_dn', 'ldap', 'ldap', 'string', '', '', 'system:setting.ldap_base_dn', 0, 0) ON CONFLICT DO NOTHING;
|
|
30
|
+
INSERT INTO sys_setting (key, module, "group", type, value, default_value, label_key, secret, update_time) VALUES ('ldap_uid_attr', 'ldap', 'ldap', 'string', 'uid', 'uid', 'system:setting.ldap_uid_attr', 0, 0) ON CONFLICT DO NOTHING;
|
|
31
|
+
INSERT INTO sys_setting (key, module, "group", type, value, default_value, label_key, secret, update_time) VALUES ('ldap_email_attr', 'ldap', 'ldap', 'string', 'mail', 'mail', 'system:setting.ldap_email_attr', 0, 0) ON CONFLICT DO NOTHING;
|
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
|
|
16
16
|
const API_BASE = "https://qyapi.weixin.qq.com";
|
|
17
17
|
const TIMEOUT_MS = 5000;
|
|
18
|
+
/** 软超时的检查步长:主链路一结束,最坏再挂一个步长就收尾 */
|
|
19
|
+
const TIMEOUT_STEP_MS = 50;
|
|
18
20
|
const TOKEN_SKEW_SECS = 300;
|
|
19
21
|
|
|
20
22
|
export interface WecomHttp {
|
|
@@ -37,6 +39,14 @@ export interface WecomClientDeps {
|
|
|
37
39
|
* 软超时:服务端 isolate 无 `setTimeout` / `AbortSignal` 全局,不能用 `AbortSignal.timeout`。
|
|
38
40
|
* 这里用运行时注入的 `tasks.sleep(ms)` 起一个「到点就 reject」的竞态;fetch 不被真正 abort,
|
|
39
41
|
* 只是不再等它(后台连接最终由 OS/池回收)。`tasks` 不可用时降级为原 promise(无超时)。
|
|
42
|
+
*
|
|
43
|
+
* **必须短步长**:oj 运行时要等请求上下文里所有未完成的异步任务(含 `tasks.sleep`)
|
|
44
|
+
* 结束才 flush 响应。早期实现挂一条 `sleep(5000)` 做竞态,上游 100ms 就返回时那条
|
|
45
|
+
* sleep 仍在飞,于是每个调企微接口的请求都被白拖到 5s 才发得出响应——登录回调
|
|
46
|
+
* `/api/auth/wecom/callback` 实测恒定 5011ms,正是企微工作台进入 5-6s 白屏的来源。
|
|
47
|
+
* 改成按 `TIMEOUT_STEP_MS` 逐段 sleep 并检查 settled 后,主链路一结束、最多再挂
|
|
48
|
+
* 一个步长即收尾(<=50ms),超时语义不变。
|
|
49
|
+
*
|
|
40
50
|
* 输家 promise 在 race 结束后仍可能 reject,挂 `.catch` 防 unhandled rejection。
|
|
41
51
|
*/
|
|
42
52
|
function withSoftTimeout<T>(p: Promise<T>, ms: number): Promise<T> {
|
|
@@ -44,11 +54,21 @@ function withSoftTimeout<T>(p: Promise<T>, ms: number): Promise<T> {
|
|
|
44
54
|
const sleep = g.tasks?.sleep;
|
|
45
55
|
if (typeof sleep !== "function")
|
|
46
56
|
return p;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
57
|
+
let settled = false;
|
|
58
|
+
const deadline = Date.now() + ms;
|
|
59
|
+
const timeout = (async () => {
|
|
60
|
+
for (;;) {
|
|
61
|
+
const left = deadline - Date.now();
|
|
62
|
+
if (settled || left <= 0)
|
|
63
|
+
break;
|
|
64
|
+
await sleep(Math.min(left, TIMEOUT_STEP_MS));
|
|
65
|
+
}
|
|
66
|
+
if (!settled)
|
|
67
|
+
throw new Error(`超时 ${ms}ms`);
|
|
68
|
+
return undefined as never;
|
|
69
|
+
})();
|
|
51
70
|
return Promise.race([p, timeout]).finally(() => {
|
|
71
|
+
settled = true;
|
|
52
72
|
// 输家 promise 在 race 结束后仍可能 reject,挂 catch 防 unhandled rejection
|
|
53
73
|
timeout.catch(() => {});
|
|
54
74
|
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
-- 0001(mysql 方言):home 两表建表。口径同基础件。
|
|
2
|
+
-- 方言差异:AUTOINCREMENT → BIGINT AUTO_INCREMENT;TEXT 不能带字面默认值 → 收窄 VARCHAR(255)。
|
|
3
|
+
CREATE TABLE IF NOT EXISTS home_pie (
|
|
4
|
+
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|
5
|
+
category VARCHAR(255) NOT NULL DEFAULT '',
|
|
6
|
+
value INTEGER NOT NULL DEFAULT 0
|
|
7
|
+
);
|
|
8
|
+
|
|
9
|
+
CREATE TABLE IF NOT EXISTS home_line (
|
|
10
|
+
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|
11
|
+
day INTEGER NOT NULL DEFAULT 0,
|
|
12
|
+
value INTEGER NOT NULL DEFAULT 0
|
|
13
|
+
);
|
|
14
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
-- 0001(postgres 方言):home 两表建表。口径同基础件。
|
|
2
|
+
-- 方言差异:AUTOINCREMENT → BIGSERIAL(SERIAL 系允许 seed 显式写 id);TEXT 在 pg 合法且可带默认值。
|
|
3
|
+
CREATE TABLE IF NOT EXISTS home_pie (
|
|
4
|
+
id BIGSERIAL PRIMARY KEY,
|
|
5
|
+
category TEXT NOT NULL DEFAULT '',
|
|
6
|
+
value INTEGER NOT NULL DEFAULT 0
|
|
7
|
+
);
|
|
8
|
+
|
|
9
|
+
CREATE TABLE IF NOT EXISTS home_line (
|
|
10
|
+
id BIGSERIAL PRIMARY KEY,
|
|
11
|
+
day INTEGER NOT NULL DEFAULT 0,
|
|
12
|
+
value INTEGER NOT NULL DEFAULT 0
|
|
13
|
+
);
|
|
14
|
+
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
-- 方言覆盖(mysql):INSERT OR IGNORE → INSERT IGNORE,语句与基础件逐条对应。
|
|
2
|
+
-- home 模块种子(P4-1)。按分号朴素切分(S006)。
|
|
3
|
+
-- home_pie:五分类(code 对齐前端 DATA_KEY),幂等 INSERT OR IGNORE。
|
|
4
|
+
INSERT IGNORE INTO home_pie (category, value) VALUES ('electronics', 320);
|
|
5
|
+
INSERT IGNORE INTO home_pie (category, value) VALUES ('home_goods', 210);
|
|
6
|
+
INSERT IGNORE INTO home_pie (category, value) VALUES ('apparel_accessories', 180);
|
|
7
|
+
INSERT IGNORE INTO home_pie (category, value) VALUES ('food_beverages', 150);
|
|
8
|
+
INSERT IGNORE INTO home_pie (category, value) VALUES ('beauty_skincare', 95);
|
|
9
|
+
|
|
10
|
+
-- home_line:日窗口序列(day = epoch-day,种子围绕"当前日期"生成,约 60 天窗口)。
|
|
11
|
+
-- 刻意缺 today-30 / today-12 两天,演示"缺哪天补哪天"——handler 在窗口内对缺失日补 0;
|
|
12
|
+
-- 若整个窗口无 seed(seed 随时间变旧),handler 回落确定式趋势兜底(懒补数)。
|
|
13
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20640, 181);
|
|
14
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20641, 190);
|
|
15
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20642, 199);
|
|
16
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20643, 208);
|
|
17
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20644, 217);
|
|
18
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20645, 226);
|
|
19
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20646, 235);
|
|
20
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20647, 244);
|
|
21
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20648, 253);
|
|
22
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20649, 262);
|
|
23
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20650, 271);
|
|
24
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20651, 280);
|
|
25
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20652, 289);
|
|
26
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20653, 298);
|
|
27
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20654, 100);
|
|
28
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20655, 109);
|
|
29
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20656, 118);
|
|
30
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20657, 127);
|
|
31
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20658, 136);
|
|
32
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20659, 145);
|
|
33
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20660, 154);
|
|
34
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20661, 163);
|
|
35
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20662, 172);
|
|
36
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20663, 181);
|
|
37
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20664, 190);
|
|
38
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20665, 199);
|
|
39
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20666, 208);
|
|
40
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20667, 217);
|
|
41
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20668, 226);
|
|
42
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20669, 235);
|
|
43
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20671, 253);
|
|
44
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20672, 262);
|
|
45
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20673, 271);
|
|
46
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20674, 280);
|
|
47
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20675, 289);
|
|
48
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20676, 298);
|
|
49
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20677, 100);
|
|
50
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20678, 109);
|
|
51
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20679, 118);
|
|
52
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20680, 127);
|
|
53
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20681, 136);
|
|
54
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20682, 145);
|
|
55
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20683, 154);
|
|
56
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20684, 163);
|
|
57
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20685, 172);
|
|
58
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20686, 181);
|
|
59
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20687, 190);
|
|
60
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20689, 208);
|
|
61
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20690, 217);
|
|
62
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20691, 226);
|
|
63
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20692, 235);
|
|
64
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20693, 244);
|
|
65
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20694, 253);
|
|
66
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20695, 262);
|
|
67
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20696, 271);
|
|
68
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20697, 280);
|
|
69
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20698, 289);
|
|
70
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20699, 298);
|
|
71
|
+
INSERT IGNORE INTO home_line (day, value) VALUES (20700, 100);
|