├── config ├── .gitignore └── config.example.yaml ├── internal ├── models │ ├── .gitkeep │ ├── token.go │ └── base.go ├── app │ ├── api │ │ ├── bootstrap.go │ │ ├── handlers │ │ │ └── index.go │ │ └── routes.go │ ├── admin │ │ ├── bootstrap.go │ │ ├── models │ │ │ ├── admin_setting.go │ │ │ ├── admin_page.go │ │ │ ├── admin_role.go │ │ │ ├── admin_permission.go │ │ │ └── admin_user.go │ │ ├── handlers │ │ │ └── base.go │ │ ├── services │ │ │ ├── auth.go │ │ │ ├── base.go │ │ │ └── admin_setting.go │ │ ├── types │ │ │ └── system.go │ │ └── middleware │ │ │ ├── permission.go │ │ │ └── auth.go │ └── bootstrap.go └── pkg │ ├── config │ └── config.go │ ├── cache │ └── drivers │ │ ├── memory.go │ │ └── redis.go │ ├── db │ ├── migrations.go │ └── db.go │ └── response │ └── response.go ├── web ├── .gitignore ├── src │ ├── service │ │ ├── api │ │ │ ├── index.ts │ │ │ ├── auth.ts │ │ │ └── base.ts │ │ └── request │ │ │ ├── index.ts │ │ │ └── config.ts │ ├── components │ │ ├── AmisEditor │ │ │ └── style │ │ │ │ └── index.less │ │ └── AmisRender │ │ │ └── CustomComponents │ │ │ ├── components │ │ │ ├── SvgIcon │ │ │ │ └── index.tsx │ │ │ └── Watermark │ │ │ │ └── index.tsx │ │ │ └── index.tsx │ ├── pages │ │ ├── 404 │ │ │ └── index.tsx │ │ ├── login │ │ │ ├── AmisLogin │ │ │ │ └── index.tsx │ │ │ └── DefaultLogin │ │ │ │ └── bg │ │ │ │ └── style │ │ │ │ └── index.module.css │ │ └── editor │ │ │ └── index.tsx │ ├── hooks │ │ ├── useSmallScreen.ts │ │ ├── useStore.ts │ │ ├── useSetting.ts │ │ └── useLang.ts │ ├── context.tsx │ ├── utils │ │ ├── lazyload.tsx │ │ ├── proxy.ts │ │ ├── clipboard.ts │ │ ├── dynamicAssets.ts │ │ └── useStorage.ts │ ├── layouts │ │ ├── components │ │ │ ├── IconButton │ │ │ │ └── index.tsx │ │ │ ├── LayoutFooter │ │ │ │ └── index.tsx │ │ │ ├── LayoutTopBar │ │ │ │ └── components │ │ │ │ │ ├── FullscreenButton │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SettingButton │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── RefreshButton │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── DarkThemeButton │ │ │ │ │ └── index.tsx │ │ │ │ │ └── LocaleButton │ │ │ │ │ └── index.tsx │ │ │ ├── CollapseTrigger │ │ │ │ └── index.tsx │ │ │ └── LayoutLogo │ │ │ │ └── index.tsx │ │ ├── TopLayout │ │ │ └── index.tsx │ │ └── SmLayout │ │ │ └── index.tsx │ ├── typeings.d.ts │ ├── global.css │ └── routes │ │ └── helpers.ts ├── dist │ ├── assets │ │ ├── __vite-browser-external-BIHI7g3E.js │ │ ├── r-BIFz-_sK.js.gz │ │ ├── App-BxNPK1v-.js.gz │ │ ├── CRUD-9-ml23y8.js.gz │ │ ├── Code-kZ2KImVI.js.gz │ │ ├── Date-DBialqU2.js.gz │ │ ├── Each-D8GNHHxx.js.gz │ │ ├── Flex-jSIofxsK.js.gz │ │ ├── Icon-BAwkSKpW.js.gz │ │ ├── Json-DIco0TVq.js.gz │ │ ├── Link-BoJnsR-S.js.gz │ │ ├── Log-Dy9Bw0Vi.js.gz │ │ ├── Nav-C7BsDYMv.js.gz │ │ ├── Page-i3kBg0Bs.js.gz │ │ ├── Tabs-DniQwVM9.js.gz │ │ ├── Tag-DCOfh0_q.js.gz │ │ ├── Tpl-ZrxYuRxO.js.gz │ │ ├── abap-CRCWOmpq.js.gz │ │ ├── apex-BL_CmIl-.js.gz │ │ ├── bat-DPkNLes8.js.gz │ │ ├── bmap-aUnw2Cn1.js.gz │ │ ├── cpp-RmZVvII3.js.gz │ │ ├── csp-C46ZqvIl.js.gz │ │ ├── css-yEtxmcUf.js.gz │ │ ├── dart-D8lhlL1r.js.gz │ │ ├── doc-Db9K7GCP.js.gz │ │ ├── ecl-BO6FnfXk.js.gz │ │ ├── empty-t2YotbAe.png │ │ ├── go-O9LJTZXk.js.gz │ │ ├── hcl-DxDQ3s82.js.gz │ │ ├── hls-CpUaC8DX.js.gz │ │ ├── html-OfuRSyFH.js.gz │ │ ├── java-SYsfObOQ.js.gz │ │ ├── less-B86-qBTk.js.gz │ │ ├── lua-D28Ae8-K.js.gz │ │ ├── m3-DPitgjJI.js.gz │ │ ├── main-J7gxNU6f.js.gz │ │ ├── mips-CdjsipkG.js.gz │ │ ├── perl-DlYyT36c.js.gz │ │ ├── php-120yhfDK.js.gz │ │ ├── pla-CjnFlu4u.js.gz │ │ ├── pug-kFxLfcjb.js.gz │ │ ├── ruby-CYWGW-b1.js.gz │ │ ├── rust-DMDD0SHb.js.gz │ │ ├── sb-BYAiYHFx.js.gz │ │ ├── scss-CdQcnAnq.js.gz │ │ ├── sql-BdTr02Mf.js.gz │ │ ├── st-C8kzSboH.js.gz │ │ ├── tcl-PloMZuKG.js.gz │ │ ├── twig-bne2BnKZ.js.gz │ │ ├── vb-BwAE3J76.js.gz │ │ ├── xlsx-B6sNpj_1.js.gz │ │ ├── xml-Dc1mB8je.js.gz │ │ ├── yaml-A89blxgn.js.gz │ │ ├── Audio-C2jYWks9.js.gz │ │ ├── Avatar-DtwG1n0l.js.gz │ │ ├── CRUD2-J5afPA5Q.js.gz │ │ ├── Card2-CdJviqzH.js.gz │ │ ├── Cards-DMxyFqmi.js.gz │ │ ├── Chart-BV8Xebvc.js.gz │ │ ├── CityDB-BE15Pmsw.js.gz │ │ ├── Combo-Cgj305mq.js.gz │ │ ├── Custom-AcqNF2et.js.gz │ │ ├── Dialog-uOi4pnHr.js.gz │ │ ├── Drawer-B2ULXWNv.js.gz │ │ ├── Grid2D-cbA2QjFi.js.gz │ │ ├── Group-2WLcDFDH.js.gz │ │ ├── IFrame-C6ayqMkE.js.gz │ │ ├── Images-Bo68OLHp.js.gz │ │ ├── Number-z8I2a9tf.js.gz │ │ ├── Panel-l2yuMY56.js.gz │ │ ├── Picker-BRmSfRlm.js.gz │ │ ├── Plain-CXH7djtw.js.gz │ │ ├── QRCode-B3LLtk0K.js.gz │ │ ├── Radio-Yv7K9C5f.js.gz │ │ ├── Radios-C_X4LTMs.js.gz │ │ ├── Select-A_Ef6gQa.js.gz │ │ ├── Status-B7Ps0qQU.js.gz │ │ ├── Steps-DCfnoXF1.js.gz │ │ ├── Switch-BxXQ3QWH.js.gz │ │ ├── Tasks-C6ml_rrW.js.gz │ │ ├── Video-ClPw6_2t.js.gz │ │ ├── Wizard-DccxeT3J.js.gz │ │ ├── Words-CjsHbJbT.js.gz │ │ ├── bicep-DLNwh9K6.js.gz │ │ ├── codicon-B_ROkMI2.ttf │ │ ├── coffee-B7EJu28W.js.gz │ │ ├── csharp-BoL64M5l.js.gz │ │ ├── elixir-B9GXSzSz.js.gz │ │ ├── flow9-Cac8vKd7.js.gz │ │ ├── fsharp-fd1GTHhf.js.gz │ │ ├── iconfont-D1vFA1JF.ttf │ │ ├── iconfont-cDH2QQwA.eot │ │ ├── index-B3kDxmqH.js.gz │ │ ├── index-BnATMMdj.js.gz │ │ ├── index-BoXa88rh.js.gz │ │ ├── index-C9DuXPTk.js.gz │ │ ├── index-ClpG0Ix7.js.gz │ │ ├── index-CwXmTqSP.js.gz │ │ ├── index-D1xUauFQ.css.gz │ │ ├── index-DVK099C8.js.gz │ │ ├── index-kaOtWJ_i.js.gz │ │ ├── julia-DQXNmw_w.js.gz │ │ ├── kotlin-qQ0MG-9I.js.gz │ │ ├── lexon-Canl7DCW.js.gz │ │ ├── liquid-jc4zNy3U.js.gz │ │ ├── mpegts-C3eX2_j5.js.gz │ │ ├── msdax-CYqgjx_P.js.gz │ │ ├── mysql-uE-sL1AK.js.gz │ │ ├── nav-mode-CYcEcVvH.png │ │ ├── pascal-BhNW15KB.js.gz │ │ ├── pgsql-DYSgOGm2.js.gz │ │ ├── python-ltAraXjR.js.gz │ │ ├── qsharp-BhgV_cYv.js.gz │ │ ├── razor-CnVsSW82.js.gz │ │ ├── redis-CHOsPHWR.js.gz │ │ ├── scala-Bqvq8jcR.js.gz │ │ ├── scheme-Dhb-2j9p.js.gz │ │ ├── shell-CmmbcNmB.js.gz │ │ ├── simple-GU7E5kPw.js.gz │ │ ├── sophia-RYC1BQQz.js.gz │ │ ├── sparql-KEyrF7De.js.gz │ │ ├── swift-vE6e-x0J.js.gz │ │ ├── tsMode-7ep92n2d.js.gz │ │ ├── AnchorNav-DpJx_Pe7.js.gz │ │ ├── BarCode-BkfPUGz7.js.gz │ │ ├── Carousel-Sa3-gzBb.js.gz │ │ ├── Container-D4uz6wNJ.js.gz │ │ ├── Divider-Dv3VlEvb.js.gz │ │ ├── Formula-D1pgvgqw.js.gz │ │ ├── GridNav-Cbu6k5KJ.js.gz │ │ ├── InputCity-DxL-OIku.js.gz │ │ ├── InputDate-M2uOQkal.js.gz │ │ ├── InputTag-CRu_5fh7.js.gz │ │ ├── InputText-p8MsUFRs.js.gz │ │ ├── InputTree-DEeKmy5x.js.gz │ │ ├── Mapping-BPa7t3DZ.js.gz │ │ ├── Markdown-BkEWz84u.js.gz │ │ ├── Markdown-tyIr7GBT.js.gz │ │ ├── PdfViewer-BxPrKbvx.js.gz │ │ ├── PdfViewer-D3BZkHIk.js.gz │ │ ├── Portlet-Cl52ALZ4.js.gz │ │ ├── Progress-D1BWPPh0.js.gz │ │ ├── Property-S_ErfHQT.js.gz │ │ ├── RichText-BHFZXTzk.js.gz │ │ ├── SearchBox-CsdZutV-.js.gz │ │ ├── Service-CGIbYc4m.js.gz │ │ ├── TableView-Bq_bOEvn.js.gz │ │ ├── Textarea-M4x5zbM9.js.gz │ │ ├── Timeline-nOrwXgl3.js.gz │ │ ├── Tinymce-BMyza4nv.js.gz │ │ ├── Transfer-z-_FaTS8.js.gz │ │ ├── cameligo-CGrWLZr3.js.gz │ │ ├── clojure-D9WOWImG.js.gz │ │ ├── cssMode-LWW_F0Xd.js.gz │ │ ├── editor-CyKfGYs7.css.gz │ │ ├── graphql-LQdxqEYJ.js.gz │ │ ├── htmlMode-BaOEwIda.js.gz │ │ ├── htmlmixed-BvX3evU2.js.gz │ │ ├── iconfont-DbOOEIpE.woff │ │ ├── jsonMode-DOm8azF4.js.gz │ │ ├── markdown-XFFkuszK.js.gz │ │ ├── multiplex-CK4zNWIr.js.gz │ │ ├── pascaligo-5jv8CcQD.js.gz │ │ ├── postiats-CQpG440k.js.gz │ │ ├── protobuf-UZVfc1EA.js.gz │ │ ├── redshift-w2XKkDvD.js.gz │ │ ├── solidity-CME5AdoB.js.gz │ │ ├── ChartRadios-CdV7VFGj.js.gz │ │ ├── Checkboxes-C69pDqT-.js.gz │ │ ├── ColorPicker-BbURB391.js.gz │ │ ├── DiffEditor-DFXNeQAQ.js.gz │ │ ├── IconPicker-XM4C3my0.js.gz │ │ ├── IconSelect-ohUB9PVN.js.gz │ │ ├── InputColor-CWWh1zgO.js.gz │ │ ├── InputExcel-Bz0YFLVi.js.gz │ │ ├── InputGroup-ykc9rxIk.js.gz │ │ ├── InputNumber-mS4C2eWo.js.gz │ │ ├── InputRange-CLNr_tP0.js.gz │ │ ├── InputRating-DTlQJUpN.js.gz │ │ ├── InputRepeat-6fPH3Xav.js.gz │ │ ├── InputTable-BHpzBD5O.js.gz │ │ ├── ListSelect-DLlUWBb9.js.gz │ │ ├── Pagination-Huoc9U1q.js.gz │ │ ├── TreeSelect-BxZ1vUGs.js.gz │ │ ├── UserSelect-DDcV9Iy2.js.gz │ │ ├── codemirror-HtGfXQbb.js.gz │ │ ├── dockerfile-DLk6rpji.js.gz │ │ ├── editor.main-BLuVey-E.js.gz │ │ ├── exceljs.min-D9iIy2YD.js.gz │ │ ├── fa-brands-400-DtZKBM2a.ttf │ │ ├── fa-solid-900-DM0teJdg.ttf │ │ ├── handlebars-02A1QgEp.js.gz │ │ ├── javascript-CkwCnGvG.js.gz │ │ ├── objective-c-B1aVtJYH.js.gz │ │ ├── placeholder-qGZvC0bW.js.gz │ │ ├── powerquery-DdJtto1Z.js.gz │ │ ├── powershell-Bu_VLpJB.js.gz │ │ ├── typescript-B-NkIoeC.js.gz │ │ ├── ChainedSelect-BLLxyVtP.js.gz │ │ ├── CollapseGroup-C1ijJOOd.js.gz │ │ ├── ColumnToggler-C9FLAmQQ.js.gz │ │ ├── DropDownButton-DRlnrVJI.js.gz │ │ ├── InputDateRange-BZtgtncR.js.gz │ │ ├── InputFormula-DEdG7mtV.js.gz │ │ ├── InputSignature-Dn4bC9Mi.js.gz │ │ ├── InputSubForm-j6b_9Jvg.js.gz │ │ ├── InputYearRange-B5h5BtYP.js.gz │ │ ├── LocationPicker-DiTM0CRY.js.gz │ │ ├── NestedSelect-CZHjLIro.js.gz │ │ ├── OfficeViewer-CRB7LfL0.js.gz │ │ ├── TabsTransfer-B_tj3enk.js.gz │ │ ├── TooltipWrapper-Ds7bHD-C.js.gz │ │ ├── TransferPicker-DnNpG8Sc.js.gz │ │ ├── fa-brands-400-C99Yv4gD.woff2 │ │ ├── fa-regular-400-BMFokQJ2.ttf │ │ ├── fa-regular-400-OOsPf1xj.woff2 │ │ ├── fa-solid-900-DAI24fNt.woff2 │ │ ├── papaparse.min-CHMaRRpY.js.gz │ │ ├── systemverilog-DgMryOEJ.js.gz │ │ ├── ConditionBuilder-BW9Jv4yD.js.gz │ │ ├── InputMonthRange-BGY4lN2M.js.gz │ │ ├── JSONSchemaEditor-I6IC2yHC.js.gz │ │ ├── MatrixCheckboxes-CiUMGr6m.js.gz │ │ ├── SwitchContainer-D43LpHMT.js.gz │ │ ├── fa-v4compatibility-F0dlVTLQ.ttf │ │ ├── react-cropper.es-7lbVZat4.js.gz │ │ ├── restructuredtext-CghPJEOS.js.gz │ │ ├── InputQuarterRange-U7yCLGPa.js.gz │ │ ├── PaginationWrapper-B6Jna3bw.js.gz │ │ ├── TabsTransferPicker-Bb-FBvV3.js.gz │ │ ├── echarts-wordcloud-DNnhfpzT.js.gz │ │ ├── fa-v4compatibility-aR9vOKaP.woff2 │ │ ├── InputVerificationCode-Cf2jnK1M.js.gz │ │ ├── ButtonGroup-CkQh6AzK.js │ │ ├── Calendar-Cg4eDWcB.js │ │ ├── Hidden-CF2ahV2w.js │ │ ├── AMIS-D99dGYNU.js │ │ ├── omitBy-DH95mLuo.js │ │ ├── codemirror-C2xuxki3.js │ │ ├── MultilineText-B-vvth-B.js │ │ ├── UUID-DxcR7z0O.js │ │ ├── Spinner-DE3CgDWw.js │ │ ├── Alert-E2m5gcKr.js │ │ ├── WebComponent-BLsrO6dx.js │ │ ├── azcli-1IWB1ccx.js │ │ ├── Color-C43aflJA.js │ │ ├── index-CLGLLzNQ.js │ │ ├── ButtonToolbar-DisX2Rgp.js │ │ ├── Control-k5noxsqH.js │ │ ├── javascript-DhytsO-o.js │ │ ├── Operation-B8-fMcZX.js │ │ ├── index-CKX5HEDS.js │ │ ├── InputArray-zK0xvRpF.js │ │ ├── Breadcrumb-BnOqC5Oj.js │ │ ├── Wrapper-CZKJAzhY.js │ │ ├── BarCode-C1UZQEkF.js │ │ ├── VBox-DxZho49x.js │ │ ├── ini-BvajGCUy.js │ │ ├── JSONSchema-Bdf_juFZ.js │ │ ├── SparkLine-BTfKEk6X.js │ │ ├── Password-B2S2n_ZX.js │ │ ├── DateRange-BIkbxrx-.js │ │ ├── InputSignature-Dn4bC9Mi.js │ │ ├── Link-BoJnsR-S.js │ │ ├── GridNav-Cbu6k5KJ.js │ │ ├── PaginationWrapper-B6Jna3bw.js │ │ ├── csp-C46ZqvIl.js │ │ ├── InputColor-CWWh1zgO.js │ │ ├── Number-z8I2a9tf.js │ │ ├── JSONSchemaEditor-I6IC2yHC.js │ │ ├── Pagination-Huoc9U1q.js │ │ ├── InputVerificationCode-Cf2jnK1M.js │ │ ├── pla-CjnFlu4u.js │ │ ├── Steps-DCfnoXF1.js │ │ ├── scheme-Dhb-2j9p.js │ │ ├── Plain-CXH7djtw.js │ │ ├── InputMonthRange-BGY4lN2M.js │ │ ├── InputYearRange-B5h5BtYP.js │ │ ├── flow9-Cac8vKd7.js │ │ ├── sb-BYAiYHFx.js │ │ ├── InputQuarterRange-U7yCLGPa.js │ │ ├── Icon-BAwkSKpW.js │ │ ├── bat-DPkNLes8.js │ │ ├── Avatar-DtwG1n0l.js │ │ ├── CollapseGroup-C1ijJOOd.js │ │ ├── dockerfile-DLk6rpji.js │ │ ├── ColumnToggler-C9FLAmQQ.js │ │ ├── Markdown-BkEWz84u.js │ │ ├── Card2-CdJviqzH.js │ │ ├── Divider-Dv3VlEvb.js │ │ ├── Grid2D-cbA2QjFi.js │ │ ├── InputFormula-DEdG7mtV.js │ │ ├── Each-D8GNHHxx.js │ │ ├── pascaligo-5jv8CcQD.js │ │ ├── Property-S_ErfHQT.js │ │ ├── xml-Dc1mB8je.js │ │ ├── lua-D28Ae8-K.js │ │ ├── Formula-D1pgvgqw.js │ │ └── TooltipWrapper-Ds7bHD-C.js │ ├── logo.png │ ├── default-avatar.png │ ├── scripts │ │ ├── loading.js.gz │ │ └── loading.js │ └── index.html ├── public │ ├── logo.png │ ├── default-avatar.png │ └── scripts │ │ └── loading.js ├── postcss.config.js ├── README.md ├── install-amis.sh ├── .env ├── tailwind.config.js ├── index.html ├── tsconfig.json └── vite.config.ts ├── .gitignore ├── cmd └── amis-base │ ├── main.go │ └── cmd │ ├── migrate.go │ ├── root.go │ ├── reset.go │ └── server.go ├── docker-compose.yml ├── README.md └── Dockerfile /config/.gitignore: -------------------------------------------------------------------------------- 1 | config.yaml -------------------------------------------------------------------------------- /internal/models/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | vendor 3 | assets/uploads -------------------------------------------------------------------------------- /web/src/service/api/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./base" 2 | export * from "./auth" -------------------------------------------------------------------------------- /web/dist/assets/__vite-browser-external-BIHI7g3E.js: -------------------------------------------------------------------------------- 1 | const e={};export{e as default}; 2 | -------------------------------------------------------------------------------- /web/dist/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/logo.png -------------------------------------------------------------------------------- /web/public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/public/logo.png -------------------------------------------------------------------------------- /web/dist/default-avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/default-avatar.png -------------------------------------------------------------------------------- /web/dist/scripts/loading.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/scripts/loading.js.gz -------------------------------------------------------------------------------- /web/public/default-avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/public/default-avatar.png -------------------------------------------------------------------------------- /web/dist/assets/r-BIFz-_sK.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/r-BIFz-_sK.js.gz -------------------------------------------------------------------------------- /web/dist/assets/App-BxNPK1v-.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/App-BxNPK1v-.js.gz -------------------------------------------------------------------------------- /web/dist/assets/CRUD-9-ml23y8.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/CRUD-9-ml23y8.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Code-kZ2KImVI.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Code-kZ2KImVI.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Date-DBialqU2.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Date-DBialqU2.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Each-D8GNHHxx.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Each-D8GNHHxx.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Flex-jSIofxsK.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Flex-jSIofxsK.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Icon-BAwkSKpW.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Icon-BAwkSKpW.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Json-DIco0TVq.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Json-DIco0TVq.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Link-BoJnsR-S.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Link-BoJnsR-S.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Log-Dy9Bw0Vi.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Log-Dy9Bw0Vi.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Nav-C7BsDYMv.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Nav-C7BsDYMv.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Page-i3kBg0Bs.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Page-i3kBg0Bs.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Tabs-DniQwVM9.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Tabs-DniQwVM9.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Tag-DCOfh0_q.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Tag-DCOfh0_q.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Tpl-ZrxYuRxO.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Tpl-ZrxYuRxO.js.gz -------------------------------------------------------------------------------- /web/dist/assets/abap-CRCWOmpq.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/abap-CRCWOmpq.js.gz -------------------------------------------------------------------------------- /web/dist/assets/apex-BL_CmIl-.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/apex-BL_CmIl-.js.gz -------------------------------------------------------------------------------- /web/dist/assets/bat-DPkNLes8.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/bat-DPkNLes8.js.gz -------------------------------------------------------------------------------- /web/dist/assets/bmap-aUnw2Cn1.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/bmap-aUnw2Cn1.js.gz -------------------------------------------------------------------------------- /web/dist/assets/cpp-RmZVvII3.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/cpp-RmZVvII3.js.gz -------------------------------------------------------------------------------- /web/dist/assets/csp-C46ZqvIl.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/csp-C46ZqvIl.js.gz -------------------------------------------------------------------------------- /web/dist/assets/css-yEtxmcUf.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/css-yEtxmcUf.js.gz -------------------------------------------------------------------------------- /web/dist/assets/dart-D8lhlL1r.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/dart-D8lhlL1r.js.gz -------------------------------------------------------------------------------- /web/dist/assets/doc-Db9K7GCP.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/doc-Db9K7GCP.js.gz -------------------------------------------------------------------------------- /web/dist/assets/ecl-BO6FnfXk.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/ecl-BO6FnfXk.js.gz -------------------------------------------------------------------------------- /web/dist/assets/empty-t2YotbAe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/empty-t2YotbAe.png -------------------------------------------------------------------------------- /web/dist/assets/go-O9LJTZXk.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/go-O9LJTZXk.js.gz -------------------------------------------------------------------------------- /web/dist/assets/hcl-DxDQ3s82.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/hcl-DxDQ3s82.js.gz -------------------------------------------------------------------------------- /web/dist/assets/hls-CpUaC8DX.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/hls-CpUaC8DX.js.gz -------------------------------------------------------------------------------- /web/dist/assets/html-OfuRSyFH.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/html-OfuRSyFH.js.gz -------------------------------------------------------------------------------- /web/dist/assets/java-SYsfObOQ.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/java-SYsfObOQ.js.gz -------------------------------------------------------------------------------- /web/dist/assets/less-B86-qBTk.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/less-B86-qBTk.js.gz -------------------------------------------------------------------------------- /web/dist/assets/lua-D28Ae8-K.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/lua-D28Ae8-K.js.gz -------------------------------------------------------------------------------- /web/dist/assets/m3-DPitgjJI.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/m3-DPitgjJI.js.gz -------------------------------------------------------------------------------- /web/dist/assets/main-J7gxNU6f.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/main-J7gxNU6f.js.gz -------------------------------------------------------------------------------- /web/dist/assets/mips-CdjsipkG.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/mips-CdjsipkG.js.gz -------------------------------------------------------------------------------- /web/dist/assets/perl-DlYyT36c.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/perl-DlYyT36c.js.gz -------------------------------------------------------------------------------- /web/dist/assets/php-120yhfDK.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/php-120yhfDK.js.gz -------------------------------------------------------------------------------- /web/dist/assets/pla-CjnFlu4u.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/pla-CjnFlu4u.js.gz -------------------------------------------------------------------------------- /web/dist/assets/pug-kFxLfcjb.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/pug-kFxLfcjb.js.gz -------------------------------------------------------------------------------- /web/dist/assets/ruby-CYWGW-b1.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/ruby-CYWGW-b1.js.gz -------------------------------------------------------------------------------- /web/dist/assets/rust-DMDD0SHb.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/rust-DMDD0SHb.js.gz -------------------------------------------------------------------------------- /web/dist/assets/sb-BYAiYHFx.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/sb-BYAiYHFx.js.gz -------------------------------------------------------------------------------- /web/dist/assets/scss-CdQcnAnq.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/scss-CdQcnAnq.js.gz -------------------------------------------------------------------------------- /web/dist/assets/sql-BdTr02Mf.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/sql-BdTr02Mf.js.gz -------------------------------------------------------------------------------- /web/dist/assets/st-C8kzSboH.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/st-C8kzSboH.js.gz -------------------------------------------------------------------------------- /web/dist/assets/tcl-PloMZuKG.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/tcl-PloMZuKG.js.gz -------------------------------------------------------------------------------- /web/dist/assets/twig-bne2BnKZ.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/twig-bne2BnKZ.js.gz -------------------------------------------------------------------------------- /web/dist/assets/vb-BwAE3J76.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/vb-BwAE3J76.js.gz -------------------------------------------------------------------------------- /web/dist/assets/xlsx-B6sNpj_1.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/xlsx-B6sNpj_1.js.gz -------------------------------------------------------------------------------- /web/dist/assets/xml-Dc1mB8je.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/xml-Dc1mB8je.js.gz -------------------------------------------------------------------------------- /web/dist/assets/yaml-A89blxgn.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/yaml-A89blxgn.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Audio-C2jYWks9.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Audio-C2jYWks9.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Avatar-DtwG1n0l.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Avatar-DtwG1n0l.js.gz -------------------------------------------------------------------------------- /web/dist/assets/CRUD2-J5afPA5Q.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/CRUD2-J5afPA5Q.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Card2-CdJviqzH.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Card2-CdJviqzH.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Cards-DMxyFqmi.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Cards-DMxyFqmi.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Chart-BV8Xebvc.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Chart-BV8Xebvc.js.gz -------------------------------------------------------------------------------- /web/dist/assets/CityDB-BE15Pmsw.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/CityDB-BE15Pmsw.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Combo-Cgj305mq.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Combo-Cgj305mq.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Custom-AcqNF2et.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Custom-AcqNF2et.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Dialog-uOi4pnHr.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Dialog-uOi4pnHr.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Drawer-B2ULXWNv.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Drawer-B2ULXWNv.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Grid2D-cbA2QjFi.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Grid2D-cbA2QjFi.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Group-2WLcDFDH.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Group-2WLcDFDH.js.gz -------------------------------------------------------------------------------- /web/dist/assets/IFrame-C6ayqMkE.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/IFrame-C6ayqMkE.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Images-Bo68OLHp.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Images-Bo68OLHp.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Number-z8I2a9tf.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Number-z8I2a9tf.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Panel-l2yuMY56.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Panel-l2yuMY56.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Picker-BRmSfRlm.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Picker-BRmSfRlm.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Plain-CXH7djtw.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Plain-CXH7djtw.js.gz -------------------------------------------------------------------------------- /web/dist/assets/QRCode-B3LLtk0K.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/QRCode-B3LLtk0K.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Radio-Yv7K9C5f.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Radio-Yv7K9C5f.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Radios-C_X4LTMs.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Radios-C_X4LTMs.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Select-A_Ef6gQa.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Select-A_Ef6gQa.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Status-B7Ps0qQU.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Status-B7Ps0qQU.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Steps-DCfnoXF1.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Steps-DCfnoXF1.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Switch-BxXQ3QWH.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Switch-BxXQ3QWH.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Tasks-C6ml_rrW.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Tasks-C6ml_rrW.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Video-ClPw6_2t.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Video-ClPw6_2t.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Wizard-DccxeT3J.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Wizard-DccxeT3J.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Words-CjsHbJbT.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Words-CjsHbJbT.js.gz -------------------------------------------------------------------------------- /web/dist/assets/bicep-DLNwh9K6.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/bicep-DLNwh9K6.js.gz -------------------------------------------------------------------------------- /web/dist/assets/codicon-B_ROkMI2.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/codicon-B_ROkMI2.ttf -------------------------------------------------------------------------------- /web/dist/assets/coffee-B7EJu28W.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/coffee-B7EJu28W.js.gz -------------------------------------------------------------------------------- /web/dist/assets/csharp-BoL64M5l.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/csharp-BoL64M5l.js.gz -------------------------------------------------------------------------------- /web/dist/assets/elixir-B9GXSzSz.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/elixir-B9GXSzSz.js.gz -------------------------------------------------------------------------------- /web/dist/assets/flow9-Cac8vKd7.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/flow9-Cac8vKd7.js.gz -------------------------------------------------------------------------------- /web/dist/assets/fsharp-fd1GTHhf.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/fsharp-fd1GTHhf.js.gz -------------------------------------------------------------------------------- /web/dist/assets/iconfont-D1vFA1JF.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/iconfont-D1vFA1JF.ttf -------------------------------------------------------------------------------- /web/dist/assets/iconfont-cDH2QQwA.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/iconfont-cDH2QQwA.eot -------------------------------------------------------------------------------- /web/dist/assets/index-B3kDxmqH.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/index-B3kDxmqH.js.gz -------------------------------------------------------------------------------- /web/dist/assets/index-BnATMMdj.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/index-BnATMMdj.js.gz -------------------------------------------------------------------------------- /web/dist/assets/index-BoXa88rh.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/index-BoXa88rh.js.gz -------------------------------------------------------------------------------- /web/dist/assets/index-C9DuXPTk.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/index-C9DuXPTk.js.gz -------------------------------------------------------------------------------- /web/dist/assets/index-ClpG0Ix7.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/index-ClpG0Ix7.js.gz -------------------------------------------------------------------------------- /web/dist/assets/index-CwXmTqSP.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/index-CwXmTqSP.js.gz -------------------------------------------------------------------------------- /web/dist/assets/index-D1xUauFQ.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/index-D1xUauFQ.css.gz -------------------------------------------------------------------------------- /web/dist/assets/index-DVK099C8.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/index-DVK099C8.js.gz -------------------------------------------------------------------------------- /web/dist/assets/index-kaOtWJ_i.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/index-kaOtWJ_i.js.gz -------------------------------------------------------------------------------- /web/dist/assets/julia-DQXNmw_w.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/julia-DQXNmw_w.js.gz -------------------------------------------------------------------------------- /web/dist/assets/kotlin-qQ0MG-9I.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/kotlin-qQ0MG-9I.js.gz -------------------------------------------------------------------------------- /web/dist/assets/lexon-Canl7DCW.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/lexon-Canl7DCW.js.gz -------------------------------------------------------------------------------- /web/dist/assets/liquid-jc4zNy3U.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/liquid-jc4zNy3U.js.gz -------------------------------------------------------------------------------- /web/dist/assets/mpegts-C3eX2_j5.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/mpegts-C3eX2_j5.js.gz -------------------------------------------------------------------------------- /web/dist/assets/msdax-CYqgjx_P.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/msdax-CYqgjx_P.js.gz -------------------------------------------------------------------------------- /web/dist/assets/mysql-uE-sL1AK.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/mysql-uE-sL1AK.js.gz -------------------------------------------------------------------------------- /web/dist/assets/nav-mode-CYcEcVvH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/nav-mode-CYcEcVvH.png -------------------------------------------------------------------------------- /web/dist/assets/pascal-BhNW15KB.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/pascal-BhNW15KB.js.gz -------------------------------------------------------------------------------- /web/dist/assets/pgsql-DYSgOGm2.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/pgsql-DYSgOGm2.js.gz -------------------------------------------------------------------------------- /web/dist/assets/python-ltAraXjR.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/python-ltAraXjR.js.gz -------------------------------------------------------------------------------- /web/dist/assets/qsharp-BhgV_cYv.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/qsharp-BhgV_cYv.js.gz -------------------------------------------------------------------------------- /web/dist/assets/razor-CnVsSW82.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/razor-CnVsSW82.js.gz -------------------------------------------------------------------------------- /web/dist/assets/redis-CHOsPHWR.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/redis-CHOsPHWR.js.gz -------------------------------------------------------------------------------- /web/dist/assets/scala-Bqvq8jcR.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/scala-Bqvq8jcR.js.gz -------------------------------------------------------------------------------- /web/dist/assets/scheme-Dhb-2j9p.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/scheme-Dhb-2j9p.js.gz -------------------------------------------------------------------------------- /web/dist/assets/shell-CmmbcNmB.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/shell-CmmbcNmB.js.gz -------------------------------------------------------------------------------- /web/dist/assets/simple-GU7E5kPw.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/simple-GU7E5kPw.js.gz -------------------------------------------------------------------------------- /web/dist/assets/sophia-RYC1BQQz.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/sophia-RYC1BQQz.js.gz -------------------------------------------------------------------------------- /web/dist/assets/sparql-KEyrF7De.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/sparql-KEyrF7De.js.gz -------------------------------------------------------------------------------- /web/dist/assets/swift-vE6e-x0J.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/swift-vE6e-x0J.js.gz -------------------------------------------------------------------------------- /web/dist/assets/tsMode-7ep92n2d.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/tsMode-7ep92n2d.js.gz -------------------------------------------------------------------------------- /web/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /web/dist/assets/AnchorNav-DpJx_Pe7.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/AnchorNav-DpJx_Pe7.js.gz -------------------------------------------------------------------------------- /web/dist/assets/BarCode-BkfPUGz7.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/BarCode-BkfPUGz7.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Carousel-Sa3-gzBb.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Carousel-Sa3-gzBb.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Container-D4uz6wNJ.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Container-D4uz6wNJ.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Divider-Dv3VlEvb.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Divider-Dv3VlEvb.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Formula-D1pgvgqw.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Formula-D1pgvgqw.js.gz -------------------------------------------------------------------------------- /web/dist/assets/GridNav-Cbu6k5KJ.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/GridNav-Cbu6k5KJ.js.gz -------------------------------------------------------------------------------- /web/dist/assets/InputCity-DxL-OIku.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/InputCity-DxL-OIku.js.gz -------------------------------------------------------------------------------- /web/dist/assets/InputDate-M2uOQkal.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/InputDate-M2uOQkal.js.gz -------------------------------------------------------------------------------- /web/dist/assets/InputTag-CRu_5fh7.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/InputTag-CRu_5fh7.js.gz -------------------------------------------------------------------------------- /web/dist/assets/InputText-p8MsUFRs.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/InputText-p8MsUFRs.js.gz -------------------------------------------------------------------------------- /web/dist/assets/InputTree-DEeKmy5x.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/InputTree-DEeKmy5x.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Mapping-BPa7t3DZ.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Mapping-BPa7t3DZ.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Markdown-BkEWz84u.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Markdown-BkEWz84u.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Markdown-tyIr7GBT.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Markdown-tyIr7GBT.js.gz -------------------------------------------------------------------------------- /web/dist/assets/PdfViewer-BxPrKbvx.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/PdfViewer-BxPrKbvx.js.gz -------------------------------------------------------------------------------- /web/dist/assets/PdfViewer-D3BZkHIk.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/PdfViewer-D3BZkHIk.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Portlet-Cl52ALZ4.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Portlet-Cl52ALZ4.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Progress-D1BWPPh0.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Progress-D1BWPPh0.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Property-S_ErfHQT.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Property-S_ErfHQT.js.gz -------------------------------------------------------------------------------- /web/dist/assets/RichText-BHFZXTzk.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/RichText-BHFZXTzk.js.gz -------------------------------------------------------------------------------- /web/dist/assets/SearchBox-CsdZutV-.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/SearchBox-CsdZutV-.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Service-CGIbYc4m.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Service-CGIbYc4m.js.gz -------------------------------------------------------------------------------- /web/dist/assets/TableView-Bq_bOEvn.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/TableView-Bq_bOEvn.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Textarea-M4x5zbM9.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Textarea-M4x5zbM9.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Timeline-nOrwXgl3.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Timeline-nOrwXgl3.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Tinymce-BMyza4nv.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Tinymce-BMyza4nv.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Transfer-z-_FaTS8.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Transfer-z-_FaTS8.js.gz -------------------------------------------------------------------------------- /web/dist/assets/cameligo-CGrWLZr3.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/cameligo-CGrWLZr3.js.gz -------------------------------------------------------------------------------- /web/dist/assets/clojure-D9WOWImG.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/clojure-D9WOWImG.js.gz -------------------------------------------------------------------------------- /web/dist/assets/cssMode-LWW_F0Xd.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/cssMode-LWW_F0Xd.js.gz -------------------------------------------------------------------------------- /web/dist/assets/editor-CyKfGYs7.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/editor-CyKfGYs7.css.gz -------------------------------------------------------------------------------- /web/dist/assets/graphql-LQdxqEYJ.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/graphql-LQdxqEYJ.js.gz -------------------------------------------------------------------------------- /web/dist/assets/htmlMode-BaOEwIda.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/htmlMode-BaOEwIda.js.gz -------------------------------------------------------------------------------- /web/dist/assets/htmlmixed-BvX3evU2.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/htmlmixed-BvX3evU2.js.gz -------------------------------------------------------------------------------- /web/dist/assets/iconfont-DbOOEIpE.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/iconfont-DbOOEIpE.woff -------------------------------------------------------------------------------- /web/dist/assets/jsonMode-DOm8azF4.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/jsonMode-DOm8azF4.js.gz -------------------------------------------------------------------------------- /web/dist/assets/markdown-XFFkuszK.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/markdown-XFFkuszK.js.gz -------------------------------------------------------------------------------- /web/dist/assets/multiplex-CK4zNWIr.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/multiplex-CK4zNWIr.js.gz -------------------------------------------------------------------------------- /web/dist/assets/pascaligo-5jv8CcQD.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/pascaligo-5jv8CcQD.js.gz -------------------------------------------------------------------------------- /web/dist/assets/postiats-CQpG440k.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/postiats-CQpG440k.js.gz -------------------------------------------------------------------------------- /web/dist/assets/protobuf-UZVfc1EA.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/protobuf-UZVfc1EA.js.gz -------------------------------------------------------------------------------- /web/dist/assets/redshift-w2XKkDvD.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/redshift-w2XKkDvD.js.gz -------------------------------------------------------------------------------- /web/dist/assets/solidity-CME5AdoB.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/solidity-CME5AdoB.js.gz -------------------------------------------------------------------------------- /web/README.md: -------------------------------------------------------------------------------- 1 | 2 | ``` 3 | // 初始化项目 4 | pnpm install 5 | 6 | // 开发模式 7 | pnpm run dev 8 | 9 | // 构建 10 | pnpm run build 11 | -------------------------------------------------------------------------------- /web/dist/assets/ChartRadios-CdV7VFGj.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/ChartRadios-CdV7VFGj.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Checkboxes-C69pDqT-.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Checkboxes-C69pDqT-.js.gz -------------------------------------------------------------------------------- /web/dist/assets/ColorPicker-BbURB391.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/ColorPicker-BbURB391.js.gz -------------------------------------------------------------------------------- /web/dist/assets/DiffEditor-DFXNeQAQ.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/DiffEditor-DFXNeQAQ.js.gz -------------------------------------------------------------------------------- /web/dist/assets/IconPicker-XM4C3my0.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/IconPicker-XM4C3my0.js.gz -------------------------------------------------------------------------------- /web/dist/assets/IconSelect-ohUB9PVN.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/IconSelect-ohUB9PVN.js.gz -------------------------------------------------------------------------------- /web/dist/assets/InputColor-CWWh1zgO.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/InputColor-CWWh1zgO.js.gz -------------------------------------------------------------------------------- /web/dist/assets/InputExcel-Bz0YFLVi.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/InputExcel-Bz0YFLVi.js.gz -------------------------------------------------------------------------------- /web/dist/assets/InputGroup-ykc9rxIk.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/InputGroup-ykc9rxIk.js.gz -------------------------------------------------------------------------------- /web/dist/assets/InputNumber-mS4C2eWo.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/InputNumber-mS4C2eWo.js.gz -------------------------------------------------------------------------------- /web/dist/assets/InputRange-CLNr_tP0.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/InputRange-CLNr_tP0.js.gz -------------------------------------------------------------------------------- /web/dist/assets/InputRating-DTlQJUpN.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/InputRating-DTlQJUpN.js.gz -------------------------------------------------------------------------------- /web/dist/assets/InputRepeat-6fPH3Xav.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/InputRepeat-6fPH3Xav.js.gz -------------------------------------------------------------------------------- /web/dist/assets/InputTable-BHpzBD5O.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/InputTable-BHpzBD5O.js.gz -------------------------------------------------------------------------------- /web/dist/assets/ListSelect-DLlUWBb9.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/ListSelect-DLlUWBb9.js.gz -------------------------------------------------------------------------------- /web/dist/assets/Pagination-Huoc9U1q.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/Pagination-Huoc9U1q.js.gz -------------------------------------------------------------------------------- /web/dist/assets/TreeSelect-BxZ1vUGs.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/TreeSelect-BxZ1vUGs.js.gz -------------------------------------------------------------------------------- /web/dist/assets/UserSelect-DDcV9Iy2.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/UserSelect-DDcV9Iy2.js.gz -------------------------------------------------------------------------------- /web/dist/assets/codemirror-HtGfXQbb.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/codemirror-HtGfXQbb.js.gz -------------------------------------------------------------------------------- /web/dist/assets/dockerfile-DLk6rpji.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/dockerfile-DLk6rpji.js.gz -------------------------------------------------------------------------------- /web/dist/assets/editor.main-BLuVey-E.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/editor.main-BLuVey-E.js.gz -------------------------------------------------------------------------------- /web/dist/assets/exceljs.min-D9iIy2YD.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/exceljs.min-D9iIy2YD.js.gz -------------------------------------------------------------------------------- /web/dist/assets/fa-brands-400-DtZKBM2a.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/fa-brands-400-DtZKBM2a.ttf -------------------------------------------------------------------------------- /web/dist/assets/fa-solid-900-DM0teJdg.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/fa-solid-900-DM0teJdg.ttf -------------------------------------------------------------------------------- /web/dist/assets/handlebars-02A1QgEp.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/handlebars-02A1QgEp.js.gz -------------------------------------------------------------------------------- /web/dist/assets/javascript-CkwCnGvG.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/javascript-CkwCnGvG.js.gz -------------------------------------------------------------------------------- /web/dist/assets/objective-c-B1aVtJYH.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/objective-c-B1aVtJYH.js.gz -------------------------------------------------------------------------------- /web/dist/assets/placeholder-qGZvC0bW.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/placeholder-qGZvC0bW.js.gz -------------------------------------------------------------------------------- /web/dist/assets/powerquery-DdJtto1Z.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/powerquery-DdJtto1Z.js.gz -------------------------------------------------------------------------------- /web/dist/assets/powershell-Bu_VLpJB.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/powershell-Bu_VLpJB.js.gz -------------------------------------------------------------------------------- /web/dist/assets/typescript-B-NkIoeC.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/typescript-B-NkIoeC.js.gz -------------------------------------------------------------------------------- /web/src/components/AmisEditor/style/index.less: -------------------------------------------------------------------------------- 1 | .ae-Editor { 2 | border-radius: var(--borderRadius); 3 | height: 100%; 4 | } 5 | -------------------------------------------------------------------------------- /web/dist/assets/ChainedSelect-BLLxyVtP.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/ChainedSelect-BLLxyVtP.js.gz -------------------------------------------------------------------------------- /web/dist/assets/CollapseGroup-C1ijJOOd.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/CollapseGroup-C1ijJOOd.js.gz -------------------------------------------------------------------------------- /web/dist/assets/ColumnToggler-C9FLAmQQ.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/ColumnToggler-C9FLAmQQ.js.gz -------------------------------------------------------------------------------- /web/dist/assets/DropDownButton-DRlnrVJI.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/DropDownButton-DRlnrVJI.js.gz -------------------------------------------------------------------------------- /web/dist/assets/InputDateRange-BZtgtncR.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/InputDateRange-BZtgtncR.js.gz -------------------------------------------------------------------------------- /web/dist/assets/InputFormula-DEdG7mtV.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/InputFormula-DEdG7mtV.js.gz -------------------------------------------------------------------------------- /web/dist/assets/InputSignature-Dn4bC9Mi.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/InputSignature-Dn4bC9Mi.js.gz -------------------------------------------------------------------------------- /web/dist/assets/InputSubForm-j6b_9Jvg.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/InputSubForm-j6b_9Jvg.js.gz -------------------------------------------------------------------------------- /web/dist/assets/InputYearRange-B5h5BtYP.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/InputYearRange-B5h5BtYP.js.gz -------------------------------------------------------------------------------- /web/dist/assets/LocationPicker-DiTM0CRY.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/LocationPicker-DiTM0CRY.js.gz -------------------------------------------------------------------------------- /web/dist/assets/NestedSelect-CZHjLIro.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/NestedSelect-CZHjLIro.js.gz -------------------------------------------------------------------------------- /web/dist/assets/OfficeViewer-CRB7LfL0.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/OfficeViewer-CRB7LfL0.js.gz -------------------------------------------------------------------------------- /web/dist/assets/TabsTransfer-B_tj3enk.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/TabsTransfer-B_tj3enk.js.gz -------------------------------------------------------------------------------- /web/dist/assets/TooltipWrapper-Ds7bHD-C.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/TooltipWrapper-Ds7bHD-C.js.gz -------------------------------------------------------------------------------- /web/dist/assets/TransferPicker-DnNpG8Sc.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/TransferPicker-DnNpG8Sc.js.gz -------------------------------------------------------------------------------- /web/dist/assets/fa-brands-400-C99Yv4gD.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/fa-brands-400-C99Yv4gD.woff2 -------------------------------------------------------------------------------- /web/dist/assets/fa-regular-400-BMFokQJ2.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/fa-regular-400-BMFokQJ2.ttf -------------------------------------------------------------------------------- /web/dist/assets/fa-regular-400-OOsPf1xj.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/fa-regular-400-OOsPf1xj.woff2 -------------------------------------------------------------------------------- /web/dist/assets/fa-solid-900-DAI24fNt.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/fa-solid-900-DAI24fNt.woff2 -------------------------------------------------------------------------------- /web/dist/assets/papaparse.min-CHMaRRpY.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/papaparse.min-CHMaRRpY.js.gz -------------------------------------------------------------------------------- /web/dist/assets/systemverilog-DgMryOEJ.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/systemverilog-DgMryOEJ.js.gz -------------------------------------------------------------------------------- /web/dist/assets/ConditionBuilder-BW9Jv4yD.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/ConditionBuilder-BW9Jv4yD.js.gz -------------------------------------------------------------------------------- /web/dist/assets/InputMonthRange-BGY4lN2M.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/InputMonthRange-BGY4lN2M.js.gz -------------------------------------------------------------------------------- /web/dist/assets/JSONSchemaEditor-I6IC2yHC.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/JSONSchemaEditor-I6IC2yHC.js.gz -------------------------------------------------------------------------------- /web/dist/assets/MatrixCheckboxes-CiUMGr6m.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/MatrixCheckboxes-CiUMGr6m.js.gz -------------------------------------------------------------------------------- /web/dist/assets/SwitchContainer-D43LpHMT.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/SwitchContainer-D43LpHMT.js.gz -------------------------------------------------------------------------------- /web/dist/assets/fa-v4compatibility-F0dlVTLQ.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/fa-v4compatibility-F0dlVTLQ.ttf -------------------------------------------------------------------------------- /web/dist/assets/react-cropper.es-7lbVZat4.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/react-cropper.es-7lbVZat4.js.gz -------------------------------------------------------------------------------- /web/dist/assets/restructuredtext-CghPJEOS.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/restructuredtext-CghPJEOS.js.gz -------------------------------------------------------------------------------- /web/dist/assets/InputQuarterRange-U7yCLGPa.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/InputQuarterRange-U7yCLGPa.js.gz -------------------------------------------------------------------------------- /web/dist/assets/PaginationWrapper-B6Jna3bw.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/PaginationWrapper-B6Jna3bw.js.gz -------------------------------------------------------------------------------- /web/dist/assets/TabsTransferPicker-Bb-FBvV3.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/TabsTransferPicker-Bb-FBvV3.js.gz -------------------------------------------------------------------------------- /web/dist/assets/echarts-wordcloud-DNnhfpzT.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/echarts-wordcloud-DNnhfpzT.js.gz -------------------------------------------------------------------------------- /web/dist/assets/fa-v4compatibility-aR9vOKaP.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/fa-v4compatibility-aR9vOKaP.woff2 -------------------------------------------------------------------------------- /web/dist/assets/InputVerificationCode-Cf2jnK1M.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slowlyo/amis-base/HEAD/web/dist/assets/InputVerificationCode-Cf2jnK1M.js.gz -------------------------------------------------------------------------------- /internal/app/api/bootstrap.go: -------------------------------------------------------------------------------- 1 | package api 2 | 3 | import "github.com/gofiber/fiber/v2" 4 | 5 | func Bootstrap(app *fiber.App) { 6 | // 注册路由 7 | BootRoutes(app) 8 | } 9 | -------------------------------------------------------------------------------- /internal/app/admin/bootstrap.go: -------------------------------------------------------------------------------- 1 | package admin 2 | 3 | import "github.com/gofiber/fiber/v2" 4 | 5 | func Bootstrap(app *fiber.App) { 6 | // 注册路由 7 | BootRoutes(app) 8 | } 9 | -------------------------------------------------------------------------------- /web/src/pages/login/AmisLogin/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import AmisPage from '@/pages/amis' 3 | 4 | const AmisLogin = () => 5 | 6 | export default AmisLogin 7 | -------------------------------------------------------------------------------- /web/install-amis.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ -z "$1" ]; then 4 | echo "Usage: $0 " 5 | exit 1 6 | fi 7 | 8 | pnpm install amis@$1 amis-core@$1 amis-editor@$1 amis-editor-core@$1 amis-ui@$1 -------------------------------------------------------------------------------- /web/src/service/request/index.ts: -------------------------------------------------------------------------------- 1 | import CustomAxiosInstance from "@/service/request/instance" 2 | import config from "./config" 3 | 4 | export const request = new CustomAxiosInstance(config).instance 5 | -------------------------------------------------------------------------------- /cmd/amis-base/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "amis-base/cmd/amis-base/cmd" 5 | "amis-base/internal/app" 6 | ) 7 | 8 | func main() { 9 | app.Bootstrap() 10 | 11 | cmd.Execute() 12 | } 13 | -------------------------------------------------------------------------------- /web/.env: -------------------------------------------------------------------------------- 1 | # 公共基础路径 2 | VITE_BASE_URL=/ 3 | # 接口前缀 (默认) 4 | VITE_API_PREFIX=/admin-api 5 | # 代理地址, mode != production 时生效 6 | VITE_PROXY_URL=http://127.0.0.1:8080 7 | # 代理地址是否更改origin 8 | VITE_PROXY_CHANGE_ORIGIN=Y 9 | -------------------------------------------------------------------------------- /web/src/hooks/useSmallScreen.ts: -------------------------------------------------------------------------------- 1 | import {useSize} from 'ahooks' 2 | 3 | // 处理小屏幕 4 | const useSmallScreen = () => { 5 | return useSize(document.body)?.width < 768 6 | } 7 | 8 | export default useSmallScreen 9 | -------------------------------------------------------------------------------- /web/dist/assets/ButtonGroup-CkQh6AzK.js: -------------------------------------------------------------------------------- 1 | import{s as e,z as n,D as o,a0 as u}from"./index-BnATMMdj.js";var s=function(r){e(t,r);function t(){return r!==null&&r.apply(this,arguments)||this}return t=n([o({type:"button-group"})],t),t}(u);export{s as ButtonGroupRenderer,u as default}; 2 | -------------------------------------------------------------------------------- /web/src/components/AmisRender/CustomComponents/components/SvgIcon/index.tsx: -------------------------------------------------------------------------------- 1 | import React, {forwardRef} from "react" 2 | import {Icon} from "@iconify/react" 3 | 4 | const SvgIcon = forwardRef((props: any, ref) => ) 5 | 6 | export default SvgIcon 7 | -------------------------------------------------------------------------------- /internal/app/api/handlers/index.go: -------------------------------------------------------------------------------- 1 | package handlers 2 | 3 | import ( 4 | "amis-base/internal/pkg/response" 5 | "github.com/gofiber/fiber/v2" 6 | ) 7 | 8 | type Index struct { 9 | } 10 | 11 | func (i *Index) Hello(ctx *fiber.Ctx) error { 12 | return response.Ok(ctx, "hello AmisBase~") 13 | } 14 | -------------------------------------------------------------------------------- /internal/app/api/routes.go: -------------------------------------------------------------------------------- 1 | package api 2 | 3 | import ( 4 | "amis-base/internal/app/api/handlers" 5 | "github.com/gofiber/fiber/v2" 6 | ) 7 | 8 | func BootRoutes(app *fiber.App) { 9 | api := app.Group("/api") 10 | 11 | index := handlers.Index{} 12 | api.Get("/hello", index.Hello) 13 | } 14 | -------------------------------------------------------------------------------- /internal/app/admin/models/admin_setting.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import base "amis-base/internal/models" 4 | 5 | type AdminSetting struct { 6 | base.BaseModel 7 | 8 | Key string `gorm:"type:varchar(255);not null;unique_index" json:"key"` 9 | Value string `gorm:"type:mediumtext" json:"value"` 10 | } 11 | -------------------------------------------------------------------------------- /web/src/context.tsx: -------------------------------------------------------------------------------- 1 | import {createContext} from 'react' 2 | 3 | export const GlobalContext = createContext<{ 4 | lang?: string; 5 | setLang?: (value: string) => void; 6 | theme?: string; 7 | setTheme?: (value: string) => void; 8 | antdToken?: {}; 9 | setAntdToken?: (value: any) => void; 10 | }>({}) 11 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | 3 | services: 4 | amis-base: 5 | build: 6 | context: . 7 | dockerfile: Dockerfile 8 | container_name: amis-base 9 | ports: 10 | - "8080:8080" 11 | restart: always 12 | volumes: 13 | - ./assets:/app/assets 14 | - ./config/config.yaml:/app/config.yaml 15 | -------------------------------------------------------------------------------- /web/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | export default { 3 | content : [ 4 | './index.html', 5 | './src/**/*.{js,ts,jsx,tsx}', 6 | ], 7 | theme : { 8 | extend: {}, 9 | }, 10 | plugins : [], 11 | corePlugins: { 12 | preflight: false, 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /web/dist/assets/Calendar-Cg4eDWcB.js: -------------------------------------------------------------------------------- 1 | import{s as t,y as a,z as d,D as o}from"./index-BnATMMdj.js";import{DateControlRenderer as n}from"./InputDate-M2uOQkal.js";var i=function(r){t(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.defaultProps=a(a({},n.defaultProps),{embed:!0}),e=d([o({type:"calendar"})],e),e}(n);export{i as CalendarRenderer}; 2 | -------------------------------------------------------------------------------- /cmd/amis-base/cmd/migrate.go: -------------------------------------------------------------------------------- 1 | package cmd 2 | 3 | import ( 4 | "amis-base/internal/pkg/db" 5 | "github.com/spf13/cobra" 6 | ) 7 | 8 | func init() { 9 | registerCmd(migrateCmd) 10 | } 11 | 12 | var migrateCmd = &cobra.Command{ 13 | Use: "migrate", 14 | Short: "运行数据库迁移", 15 | Run: func(cmd *cobra.Command, args []string) { 16 | db.Migration() 17 | }, 18 | } 19 | -------------------------------------------------------------------------------- /web/src/utils/lazyload.tsx: -------------------------------------------------------------------------------- 1 | import loadable from "@loadable/component" 2 | 3 | // https://github.com/gregberge/loadable-components/pull/226 4 | function load(fn, options) { 5 | const Component = loadable(fn, options) 6 | 7 | Component.preload = fn.requireAsync || fn 8 | 9 | return Component 10 | } 11 | 12 | export default (loader) => load(loader, {}); 13 | -------------------------------------------------------------------------------- /internal/models/token.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import "time" 4 | 5 | type Token struct { 6 | BaseModel 7 | 8 | TableName string `gorm:"type:varchar(255);not null"` 9 | UserId uint `gorm:"type:int(11);not null;default:0;index"` 10 | Token string `gorm:"type:varchar(64);not null"` 11 | LastUsedAt time.Time `gorm:"type:datetime;not null"` 12 | } 13 | -------------------------------------------------------------------------------- /web/src/hooks/useStore.ts: -------------------------------------------------------------------------------- 1 | import {useSelector, useDispatch} from 'react-redux' 2 | 3 | const useStore = () => { 4 | const state: any = useSelector((state: GlobalState) => state) 5 | const dispatch = useDispatch() 6 | const getState = () => state 7 | 8 | return { 9 | state, 10 | getState, 11 | dispatch 12 | } 13 | } 14 | 15 | export default useStore 16 | -------------------------------------------------------------------------------- /web/src/components/AmisRender/CustomComponents/components/Watermark/index.tsx: -------------------------------------------------------------------------------- 1 | import React, {forwardRef} from 'react' 2 | import {WatermarkProps} from 'antd' 3 | import {Watermark as AntdWatermark} from 'antd' 4 | 5 | const Watermark = forwardRef((props: WatermarkProps | any, ref) => 6 | {props.body ? props.render('body', props.body, {}) : null}) 7 | 8 | export default Watermark 9 | -------------------------------------------------------------------------------- /internal/pkg/config/config.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | import ( 4 | "fmt" 5 | "github.com/spf13/viper" 6 | ) 7 | 8 | func Bootstrap() { 9 | viper.SetConfigName("config") 10 | viper.SetConfigType("yaml") 11 | 12 | viper.AddConfigPath(".") 13 | viper.AddConfigPath("config") 14 | 15 | err := viper.ReadInConfig() 16 | if err != nil { 17 | panic(fmt.Errorf("Fatal error config file: %s \n", err)) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /web/dist/assets/Hidden-CF2ahV2w.js: -------------------------------------------------------------------------------- 1 | import{s as e,f as r,z as o,a1 as a}from"./index-BnATMMdj.js";var d=function(t){e(n,t);function n(){return t!==null&&t.apply(this,arguments)||this}return n.prototype.render=function(){return null},n}(r.Component),i=function(t){e(n,t);function n(){return t!==null&&t.apply(this,arguments)||this}return n=o([a({type:"hidden",wrap:!1,sizeMutable:!1})],n),n}(d);export{i as HiddenControlRenderer,d as default}; 2 | -------------------------------------------------------------------------------- /internal/app/admin/models/admin_page.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | base "amis-base/internal/models" 5 | "encoding/json" 6 | ) 7 | 8 | type AdminPage struct { 9 | base.BaseModel 10 | 11 | Name string `gorm:"type:varchar(255);not null;unique" json:"name"` 12 | Sign string `gorm:"type:varchar(255);not null;unique" json:"sign"` 13 | Schema json.RawMessage `gorm:"type:longtext" json:"schema"` 14 | } 15 | -------------------------------------------------------------------------------- /internal/pkg/cache/drivers/memory.go: -------------------------------------------------------------------------------- 1 | package drivers 2 | 3 | import ( 4 | "github.com/gofiber/fiber/v2" 5 | "github.com/gofiber/storage/memory/v2" 6 | "github.com/spf13/viper" 7 | "time" 8 | ) 9 | 10 | // NewMemory 内存 11 | func NewMemory() fiber.Storage { 12 | interval := viper.GetInt64("cache.options.memory.gc_interval") 13 | 14 | return memory.New(memory.Config{ 15 | GCInterval: time.Duration(interval) * time.Second, 16 | }) 17 | } 18 | -------------------------------------------------------------------------------- /cmd/amis-base/cmd/root.go: -------------------------------------------------------------------------------- 1 | package cmd 2 | 3 | import ( 4 | "fmt" 5 | "github.com/spf13/cobra" 6 | "os" 7 | ) 8 | 9 | var rootCmd = &cobra.Command{ 10 | Use: "amisBase", 11 | Short: "使用 GoFiber 和 amis 构建你的数据面板", 12 | } 13 | 14 | func registerCmd(command *cobra.Command) { 15 | rootCmd.AddCommand(command) 16 | } 17 | 18 | func Execute() { 19 | if err := rootCmd.Execute(); err != nil { 20 | fmt.Println(err) 21 | os.Exit(1) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /internal/models/base.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "gorm.io/gorm" 5 | "time" 6 | ) 7 | 8 | type BaseModel struct { 9 | ID uint `gorm:"primary_key" json:"id"` 10 | CreatedAt time.Time `gorm:"type:datetime;not null;<-:create" json:"created_at"` 11 | UpdatedAt time.Time `gorm:"type:datetime;not null" json:"updated_at"` 12 | } 13 | 14 | type BaseModelWithDeletedAt struct { 15 | BaseModel 16 | DeletedAt gorm.DeletedAt `gorm:"index" json:"-"` 17 | } 18 | -------------------------------------------------------------------------------- /web/dist/assets/AMIS-D99dGYNU.js: -------------------------------------------------------------------------------- 1 | import{s as i,ai as u,z as c,D as l,f as m}from"./index-BnATMMdj.js";var f=function(t){i(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.render=function(){var a=this.props,n=a.render,s=a.props,o=a.schema,r=u(this.props)||o;if(typeof r=="string")try{r=JSON.parse(r)}catch(p){console.warn("amis value must be json string",p),r=null}return n("amis",r,s)},e=c([l({type:"amis"})],e),e}(m.Component);export{f as AMISRenderer}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/omitBy-DH95mLuo.js: -------------------------------------------------------------------------------- 1 | import{p as a,aT as e,aU as n}from"./index-BnATMMdj.js";var s="Expected a function";function o(r){if(typeof r!="function")throw new TypeError(s);return function(){var t=arguments;switch(t.length){case 0:return!r.call(this);case 1:return!r.call(this,t[0]);case 2:return!r.call(this,t[0],t[1]);case 3:return!r.call(this,t[0],t[1],t[2])}return!r.apply(this,t)}}var u=o,c=e,i=u,l=n;function f(r,t){return l(r,i(c(t)))}var h=f;const g=a(h);export{g as o}; 2 | -------------------------------------------------------------------------------- /internal/app/admin/models/admin_role.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import base "amis-base/internal/models" 4 | 5 | type AdminRole struct { 6 | base.BaseModel 7 | 8 | Name string `gorm:"type:varchar(255);not null;unique" json:"name"` 9 | Sign string `gorm:"type:varchar(255);not null;unique" json:"sign"` 10 | 11 | Users []AdminUser `gorm:"many2many:admin_user_role;" json:"-"` 12 | Permissions []AdminPermission `gorm:"many2many:admin_role_permission;" json:"-"` 13 | } 14 | -------------------------------------------------------------------------------- /web/src/service/request/config.ts: -------------------------------------------------------------------------------- 1 | import {AxiosRequestConfig} from "axios" 2 | 3 | interface RequestConfig extends AxiosRequestConfig { 4 | // 代理路径 5 | proxyURL: string, 6 | // 是否跨域 7 | changeOrigin: boolean, 8 | } 9 | 10 | export default { 11 | // @ts-ignore 12 | baseURL: window.$adminApiPrefix || import.meta.env.VITE_API_PREFIX, 13 | proxyURL: import.meta.env.VITE_PROXY_URL, 14 | changeOrigin: import.meta.env.VITE_PROXY_CHANGE_ORIGIN === "Y", 15 | } 16 | -------------------------------------------------------------------------------- /web/src/hooks/useSetting.ts: -------------------------------------------------------------------------------- 1 | import {useSelector} from 'react-redux' 2 | import {arrayGet} from '@/utils/common' 3 | 4 | // 设置 5 | const useSetting = () => { 6 | // 从 redux 中获取设置 7 | const settings: any = useSelector((state: GlobalState) => state.settings) 8 | 9 | // 获取设置 10 | const getSetting = (key = '', def = '') => { 11 | return key ? arrayGet(settings, key, def) : settings 12 | } 13 | 14 | return {settings, getSetting} 15 | } 16 | 17 | export default useSetting 18 | -------------------------------------------------------------------------------- /web/src/layouts/components/IconButton/index.tsx: -------------------------------------------------------------------------------- 1 | import {Icon} from '@iconify/react' 2 | 3 | // 图标按钮 4 | const IconButton = ({onClick, icon = null, children = null, iconClassName = ''}) => { 5 | return ( 6 |
8 | {children ? children : } 9 |
10 | ) 11 | } 12 | export default IconButton 13 | -------------------------------------------------------------------------------- /internal/app/admin/handlers/base.go: -------------------------------------------------------------------------------- 1 | package handlers 2 | 3 | import "github.com/gofiber/fiber/v2" 4 | 5 | // BaseHandler 控制器的默认实现 6 | type baseHandler struct { 7 | } 8 | 9 | type idsReq struct { 10 | Ids string `json:"ids"` 11 | } 12 | 13 | func (h baseHandler) ParseParams(ctx *fiber.Ctx) fiber.Map { 14 | return fiber.Map{ 15 | "page": ctx.QueryInt("page", 1), 16 | "perPage": ctx.QueryInt("perPage", 20), 17 | "orderBy": ctx.Query("orderBy"), 18 | "orderDir": ctx.Query("orderDir", "asc"), 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /web/src/utils/proxy.ts: -------------------------------------------------------------------------------- 1 | import type {ProxyOptions} from "vite" 2 | 3 | /** 4 | * 设置网络代理 5 | */ 6 | export function createViteProxy(env) { 7 | if (env.PROD) return undefined 8 | if (env.VITE_PROXY_CHANGE_ORIGIN !== "Y") return undefined 9 | 10 | const proxy: Record = { 11 | [env.VITE_API_PREFIX]: { 12 | target: env.VITE_PROXY_URL, 13 | changeOrigin: env.VITE_PROXY_CHANGE_ORIGIN === "Y", 14 | }, 15 | } 16 | 17 | return proxy 18 | } 19 | -------------------------------------------------------------------------------- /web/dist/assets/codemirror-C2xuxki3.js: -------------------------------------------------------------------------------- 1 | import{p as a}from"./index-BnATMMdj.js";import{r as f}from"./codemirror-HtGfXQbb.js";function s(o,c){for(var t=0;tr[e]})}}}return Object.freeze(Object.defineProperty(o,Symbol.toStringTag,{value:"Module"}))}var n=f();const p=a(n),d=s({__proto__:null,default:p},[n]);export{d as c}; 2 | -------------------------------------------------------------------------------- /web/src/hooks/useLang.ts: -------------------------------------------------------------------------------- 1 | import zh_CN from '@/lang/zh_CN' 2 | import en from '@/lang/en' 3 | import useSetting from '@/hooks/useSetting' 4 | import {arrayGet} from '@/utils/common' 5 | 6 | // 多语言 7 | export const useLang = () => { 8 | const {getSetting} = useSetting() 9 | const lang = {zh_CN, en} 10 | 11 | const t = (key: string) => { 12 | const locale = getSetting('locale', 'zh_CN') 13 | 14 | return arrayGet(lang[locale], key, key) 15 | } 16 | 17 | return { 18 | t 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /web/src/pages/404/index.tsx: -------------------------------------------------------------------------------- 1 | import {Button, Result} from 'antd' 2 | import {useLang} from '@/hooks/useLang' 3 | import {useHistory} from 'react-router' 4 | 5 | const NotFound = () => { 6 | const {t} = useLang() 7 | const history = useHistory() 8 | 9 | return ( history.replace('/')}>{t('not_found.back_home')}} 14 | />) 15 | } 16 | 17 | export default NotFound 18 | -------------------------------------------------------------------------------- /web/src/layouts/components/LayoutFooter/index.tsx: -------------------------------------------------------------------------------- 1 | import useSettings from '@/hooks/useSetting' 2 | 3 | // 页脚 4 | const LayoutFooter = () => { 5 | const {getSetting} = useSettings() 6 | 7 | if(!getSetting('theme.footer')){ 8 | return null 9 | } 10 | 11 | return ( 12 |
13 |
14 |
15 | ) 16 | } 17 | 18 | export default LayoutFooter 19 | -------------------------------------------------------------------------------- /web/src/layouts/components/LayoutTopBar/components/FullscreenButton/index.tsx: -------------------------------------------------------------------------------- 1 | import {useFullscreen} from 'ahooks' 2 | import IconButton from '@/layouts/components/IconButton' 3 | 4 | const FullscreenButton = () => { 5 | const [isFullscreen, {toggleFullscreen}] = useFullscreen(document.getElementById('root')) 6 | 7 | return ( 8 | toggleFullscreen()}/> 10 | ) 11 | } 12 | 13 | export default FullscreenButton 14 | -------------------------------------------------------------------------------- /cmd/amis-base/cmd/reset.go: -------------------------------------------------------------------------------- 1 | package cmd 2 | 3 | import ( 4 | "amis-base/internal/pkg/db" 5 | "fmt" 6 | "github.com/spf13/cobra" 7 | ) 8 | 9 | func init() { 10 | registerCmd(resetCmd) 11 | } 12 | 13 | var resetCmd = &cobra.Command{ 14 | Use: "reset", 15 | Short: "重置数据", 16 | Run: func(cmd *cobra.Command, args []string) { 17 | for _, item := range args { 18 | switch item { 19 | case "pages": 20 | db.ResetPages() 21 | 22 | fmt.Println("pages 重置成功") 23 | break 24 | default: 25 | fmt.Println("不支持的参数: " + item) 26 | } 27 | } 28 | }, 29 | } 30 | -------------------------------------------------------------------------------- /web/dist/assets/MultilineText-B-vvth-B.js: -------------------------------------------------------------------------------- 1 | import{s as r,ai as a,f as i,ee as u,y as s,z as o,D as d,K as x}from"./index-BnATMMdj.js";var f=function(t){r(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.render=function(){var l=a(this.props,function(n){return n.text?x(n.text,n.data,"| raw"):void 0});return i.createElement(u,s({},this.props,{text:l}))},e}(i.Component),m=function(t){r(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e=o([d({type:"multiline-text"})],e),e}(f);export{f as MultilineTextField,m as MultilineTextFieldRenderer}; 2 | -------------------------------------------------------------------------------- /internal/pkg/db/migrations.go: -------------------------------------------------------------------------------- 1 | package db 2 | 3 | import ( 4 | "amis-base/internal/app/admin/models" 5 | baseModel "amis-base/internal/models" 6 | "github.com/gofiber/fiber/v2/log" 7 | ) 8 | 9 | func Migration() { 10 | err := db.AutoMigrate( 11 | models.AdminRole{}, 12 | models.AdminUser{}, 13 | models.AdminPermission{}, 14 | models.AdminMenu{}, 15 | models.AdminPage{}, 16 | models.AdminSetting{}, 17 | baseModel.Token{}, 18 | ) 19 | 20 | if err != nil { 21 | log.Fatal("Failed to migrate database: " + err.Error()) 22 | } 23 | 24 | // 填充数据 25 | Seed() 26 | } 27 | -------------------------------------------------------------------------------- /web/src/service/api/auth.ts: -------------------------------------------------------------------------------- 1 | import {request} from '../request'; 2 | 3 | /** 4 | * 登录 5 | * @param data - 登录数据 6 | */ 7 | export const fetchLogin = (data: any) => request.post('/login', data); 8 | 9 | /** 10 | * 获取用户信息 11 | */ 12 | export const fetchUserInfo = () => request.get('/user'); 13 | 14 | /** 15 | * 获取用户路由数据 16 | */ 17 | export const fetchUserRoutes = () => request.get('/menus') 18 | 19 | /** 20 | * 登出 21 | */ 22 | export const fetchLogout = () => request.get('/logout') 23 | 24 | /** 25 | * 获取验证码 26 | */ 27 | export const fetchCaptcha = () => request.get('/captcha'); 28 | -------------------------------------------------------------------------------- /web/src/layouts/components/LayoutTopBar/components/SettingButton/index.tsx: -------------------------------------------------------------------------------- 1 | import IconButton from '@/layouts/components/IconButton' 2 | import useStore from '@/hooks/useStore' 3 | 4 | const SettingButton = () => { 5 | const {state, dispatch} = useStore() 6 | const toggle = () => { 7 | dispatch({ 8 | type: 'update-open-setting', 9 | payload: {openSetting: !state.openSetting} 10 | }) 11 | } 12 | 13 | return ( 14 | 15 | ) 16 | } 17 | 18 | export default SettingButton 19 | -------------------------------------------------------------------------------- /cmd/amis-base/cmd/server.go: -------------------------------------------------------------------------------- 1 | package cmd 2 | 3 | import ( 4 | "amis-base/internal/app" 5 | "github.com/spf13/cobra" 6 | "github.com/spf13/viper" 7 | ) 8 | 9 | var serverCmdArgs struct { 10 | Port string 11 | } 12 | 13 | func init() { 14 | serverCmd.Flags().StringVarP(&serverCmdArgs.Port, "port", "p", "", "指定服务端口") 15 | 16 | registerCmd(serverCmd) 17 | } 18 | 19 | var serverCmd = &cobra.Command{ 20 | Use: "server", 21 | Short: "启动服务", 22 | Run: func(cmd *cobra.Command, args []string) { 23 | if serverCmdArgs.Port != "" { 24 | viper.Set("app.port", serverCmdArgs.Port) 25 | } 26 | 27 | app.Start() 28 | }, 29 | } 30 | -------------------------------------------------------------------------------- /web/dist/assets/UUID-DxcR7z0O.js: -------------------------------------------------------------------------------- 1 | import{s as a,ca as o,f as u,z as i,a1 as l}from"./index-BnATMMdj.js";var s=function(n){a(t,n);function t(e){var r=n.call(this,e)||this;return e.value||r.setValue(),r}return t.prototype.componentDidUpdate=function(e){!e.value&&e.formInited!==!1&&this.setValue()},t.prototype.setValue=function(){var e=this.props,r=o();e.length&&(r=r.substring(0,e.length)),e.onChange(r)},t.prototype.render=function(){return null},t}(u.Component),d=function(n){a(t,n);function t(){return n!==null&&n.apply(this,arguments)||this}return t=i([l({type:"uuid",wrap:!1,sizeMutable:!1})],t),t}(s);export{d as UUIDControlRenderer,s as default}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/Spinner-DE3CgDWw.js: -------------------------------------------------------------------------------- 1 | import{s as l,t as c,f as a,O as p,y as d,z as m,D as y}from"./index-BnATMMdj.js";var _=function(s){l(r,s);function r(){return s!==null&&s.apply(this,arguments)||this}return r.prototype.renderBody=function(){var e=this.props,n=e.body,t=e.render;return n?t("body",n):null},r.prototype.render=function(){var e=this.props,n=e.classnames,t=e.spinnerWrapClassName,i=e.body,o=c(e,["classnames","spinnerWrapClassName","body"]);return i?a.createElement("div",{className:n("Spinner-wrap",t)},a.createElement(p,d({},o)),this.renderBody()):a.createElement(p,d({},o))},r=m([y({type:"spinner"})],r),r}(a.Component);export{_ as SpinnerRenderer}; 2 | -------------------------------------------------------------------------------- /web/src/layouts/components/LayoutTopBar/components/RefreshButton/index.tsx: -------------------------------------------------------------------------------- 1 | import {useState} from 'react' 2 | import IconButton from '@/layouts/components/IconButton' 3 | 4 | const RefreshButton = () => { 5 | const [refreshing, setRefreshing] = useState(false) 6 | 7 | return ( 8 | { 9 | setRefreshing(true) 10 | window.$owl.refreshAmisPage().then(() => { 11 | setTimeout(() => setRefreshing(false), 500) 12 | }) 13 | }}/> 14 | ) 15 | } 16 | export default RefreshButton 17 | -------------------------------------------------------------------------------- /web/dist/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /web/dist/assets/Alert-E2m5gcKr.js: -------------------------------------------------------------------------------- 1 | import{s as u,t as v,v as i,w as l,f as c,x as _,y,z as m,D as b}from"./index-BnATMMdj.js";var A=function(s){u(r,s);function r(){return s!==null&&s.apply(this,arguments)||this}return r.prototype.render=function(){var e=this.props,d=e.render,p=e.body,t=e.level,n=e.icon,a=e.showIcon,o=e.actions,h=v(e,["render","body","level","icon","showIcon","actions"]);i(t)&&(t=l(t,this.props.data)),i(n)&&(n=l(n,this.props.data)),i(a)&&(a=l(a,this.props.data));var f=o?c.isValidElement(o)?o:d("alert-actions",o):null;return c.createElement(_,y({},h,{level:t,icon:n,showIcon:a,actions:f}),d("body",p))},r=m([b({type:"alert"})],r),r}(c.Component);export{A as AlertRenderer}; 2 | -------------------------------------------------------------------------------- /web/src/layouts/components/CollapseTrigger/index.tsx: -------------------------------------------------------------------------------- 1 | import {Icon} from '@iconify/react' 2 | import IconButton from '@/layouts/components/IconButton' 3 | 4 | // 折叠切换按钮 5 | const CollapseTrigger = ({collapsed, toggle}) => { 6 | return ( 7 | toggle(!collapsed)}> 8 |
9 | {collapsed && } 10 | {collapsed || } 11 |
12 |
13 | ) 14 | } 15 | 16 | export default CollapseTrigger 17 | -------------------------------------------------------------------------------- /web/dist/assets/WebComponent-BLsrO6dx.js: -------------------------------------------------------------------------------- 1 | import{s as p,d9 as y,w as f,f as s,y as m,z as c,D as b}from"./index-BnATMMdj.js";var v=function(t){p(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.renderBody=function(){var n=this.props,r=n.body,a=n.render;return r?a("body",r):null},e.prototype.render=function(){var n=this.props,r=n.tag,a=n.props,d=n.data,i=n.style,l=y(a,function(o){return typeof o=="string"&&f(o,d,"| raw")||o}),u=r||"div";return s.createElement(u,m({},l,{style:i}),this.renderBody())},e}(s.Component),g=function(t){p(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e=c([b({type:"web-component"})],e),e}(v);export{g as WebComponentRenderer,v as default}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/azcli-1IWB1ccx.js: -------------------------------------------------------------------------------- 1 | var e={comments:{lineComment:"#"}},t={defaultToken:"keyword",ignoreCase:!0,tokenPostfix:".azcli",str:/[^#\s]/,tokenizer:{root:[{include:"@comment"},[/\s-+@str*\s*/,{cases:{"@eos":{token:"key.identifier",next:"@popall"},"@default":{token:"key.identifier",next:"@type"}}}],[/^-+@str*\s*/,{cases:{"@eos":{token:"key.identifier",next:"@popall"},"@default":{token:"key.identifier",next:"@type"}}}]],type:[{include:"@comment"},[/-+@str*\s*/,{cases:{"@eos":{token:"key.identifier",next:"@popall"},"@default":"key.identifier"}}],[/@str+\s*/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}]],comment:[[/#.*$/,{cases:{"@eos":{token:"comment",next:"@popall"}}}]]}};export{e as conf,t as language}; 2 | -------------------------------------------------------------------------------- /internal/pkg/cache/drivers/redis.go: -------------------------------------------------------------------------------- 1 | package drivers 2 | 3 | import ( 4 | "github.com/gofiber/fiber/v2" 5 | "github.com/gofiber/storage/redis/v3" 6 | "github.com/spf13/viper" 7 | ) 8 | 9 | // NewRedis redis 10 | func NewRedis() fiber.Storage { 11 | return redis.New(redis.Config{ 12 | Host: viper.GetString("cache.options.redis.host"), 13 | Port: viper.GetInt("cache.options.redis.port"), 14 | Username: viper.GetString("cache.options.redis.username"), 15 | Password: viper.GetString("cache.options.redis.password"), 16 | Database: viper.GetInt("cache.options.redis.database"), 17 | Reset: viper.GetBool("cache.options.redis.reset"), 18 | PoolSize: viper.GetInt("cache.options.redis.pool_size"), 19 | }) 20 | } 21 | -------------------------------------------------------------------------------- /web/src/components/AmisRender/CustomComponents/index.tsx: -------------------------------------------------------------------------------- 1 | import {FormItem, Renderer} from 'amis' 2 | import SvgIcon from './components/SvgIcon' 3 | import WangEditor from './components/WangEditor' 4 | import Watermark from './components/Watermark' 5 | import SchemaEditor from './components/SchemaEditor' 6 | 7 | export const registerCustomComponents = () => { 8 | // 图标 iconify 9 | Renderer({type: 'custom-svg-icon', autoVar: true})(SvgIcon) 10 | // 富文本编辑器 wangEditor 11 | FormItem({type: 'custom-wang-editor', autoVar: true})(WangEditor) 12 | // 水印 Watermark 13 | Renderer({type: 'custom-watermark', autoVar: true})(Watermark) 14 | // editor 15 | FormItem({type: 'custom-amis-editor', autoVar: true})(SchemaEditor) 16 | } 17 | -------------------------------------------------------------------------------- /internal/app/admin/models/admin_permission.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import base "amis-base/internal/models" 4 | 5 | type AdminPermission struct { 6 | base.BaseModel 7 | 8 | ParentId uint `gorm:"type:int(11);not null;default:0" json:"parent_id"` 9 | Name string `gorm:"type:varchar(255);not null" json:"name"` 10 | Sign string `gorm:"type:varchar(255);not null;unique" json:"sign"` 11 | Api string `gorm:"type:text" json:"api"` 12 | Sort uint `gorm:"type:int(11);not null;default:0" json:"sort"` 13 | 14 | Roles []AdminRole `gorm:"many2many:admin_role_permission;" json:"roles"` 15 | Menus []AdminMenu `gorm:"many2many:admin_menu_permission;" json:"menus"` 16 | Children []AdminPermission `gorm:"-" json:"children"` 17 | } 18 | -------------------------------------------------------------------------------- /web/dist/assets/Color-C43aflJA.js: -------------------------------------------------------------------------------- 1 | import{s,ai as d,f as r,z as m,D as p}from"./index-BnATMMdj.js";var f=function(l){s(e,l);function e(){return l!==null&&l.apply(this,arguments)||this}return e.prototype.render=function(){var o=this.props,n=o.className,i=o.style,a=o.classnames,u=o.defaultColor,c=o.showValue,t=d(this.props)||u;return r.createElement("div",{className:a("ColorField",n),style:i},r.createElement("i",{className:a("ColorField-previewIcon"),style:{backgroundColor:t}}),c&&t?r.createElement("span",{className:a("ColorField-value")},t):null)},e.defaultProps={className:"",defaultColor:"",showValue:!0},e}(r.Component),h=function(l){s(e,l);function e(){return l!==null&&l.apply(this,arguments)||this}return e=m([p({type:"color"})],e),e}(f);export{f as ColorField,h as ColorFieldRenderer}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/index-CLGLLzNQ.js: -------------------------------------------------------------------------------- 1 | import{r as n,j as t,F as f,n as c}from"./index-BnATMMdj.js";function h({currentRoute:o}){const[a,s]=n.useState(!0),r=n.useRef(null),d=()=>{var i;const e=((i=document.querySelector(".ant-layout-content.overflow-hidden"))==null?void 0:i.offsetTop)||65;return`${window.innerHeight-e}px`},l=()=>{r.current.src=o.iframe_url};return n.useEffect(()=>{l();const e=()=>{r.current.style.height=d()};return window.addEventListener("resize",e),e(),()=>{window.removeEventListener("resize",e)}},[o.iframe_url]),t(f,{children:t(c,{spinning:a,style:{minHeight:a?"500px":""},children:t("iframe",{className:"owl-iframe",ref:r,title:"Iframe Page",width:"100%",style:{border:"none",order:0,boxSizing:"border-box",overflow:"hidden",minHeight:"500px"},onLoad:()=>{s(!1)}})})})}export{h as default}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/ButtonToolbar-DisX2Rgp.js: -------------------------------------------------------------------------------- 1 | import{s as u,f as s,z as c,a1 as i}from"./index-BnATMMdj.js";var p=function(n){u(t,n);function t(){return n!==null&&n.apply(this,arguments)||this}return t.prototype.renderButtons=function(){var r=this.props,o=r.render;r.classPrefix;var e=r.buttons;return Array.isArray(e)?e.map(function(l,a){return o("button/".concat(a),l,{key:a})}):null},t.prototype.render=function(){var r=this.props;r.buttons;var o=r.className,e=r.classnames;return r.render,r.style,s.createElement("div",{className:e("ButtonToolbar",o)},this.renderButtons())},t.propsList=["buttons","className"],t}(s.Component),m=function(n){u(t,n);function t(){return n!==null&&n.apply(this,arguments)||this}return t=c([i({type:"button-toolbar",strictMode:!1})],t),t}(p);export{m as ButtonToolbarRenderer,p as default}; 2 | -------------------------------------------------------------------------------- /web/src/service/api/base.ts: -------------------------------------------------------------------------------- 1 | import {request} from '../request' 2 | 3 | /** 4 | * 初始化页面结构 5 | * @param path 6 | * @param pageSign 7 | */ 8 | export const initPageSchema = (path: string, pageSign?: string) => { 9 | if (pageSign) { 10 | return request.get('/page_schema?sign=' + pageSign) 11 | } 12 | 13 | return request.get(path) 14 | } 15 | 16 | /** 17 | * amis请求 18 | * @param url 19 | * @param method 20 | * @param data 21 | */ 22 | export const amisRequest = (url, method, data) => request[method](url, data) 23 | 24 | /** 25 | * 获取设置 26 | */ 27 | export const fetchSettings = () => request.get('/settings') 28 | 29 | /** 30 | * 保存设置 31 | * @param data 格式:{key1: value1, key2: value2, ...} 32 | */ 33 | export const saveSettings = (data: any) => request.post('/settings', data) 34 | -------------------------------------------------------------------------------- /internal/app/admin/services/auth.go: -------------------------------------------------------------------------------- 1 | package services 2 | 3 | import ( 4 | "amis-base/internal/app/admin/models" 5 | "amis-base/internal/pkg/db" 6 | ) 7 | 8 | type Auth struct{} 9 | 10 | // GetUserByUsername 根据用户名获取用户 11 | func (a *Auth) GetUserByUsername(username string) (models.AdminUser, error) { 12 | var user models.AdminUser 13 | 14 | return user, db.Query().Where("username = ?", username).First(&user).Error 15 | } 16 | 17 | // GetUserById 根据用户id获取用户 18 | func (a *Auth) GetUserById(id uint) (models.AdminUser, error) { 19 | var user models.AdminUser 20 | 21 | return user, db.Query().Preload("Roles.Permissions").Where("enabled = ?", 1).First(&user, id).Error 22 | } 23 | 24 | // SaveUser 保存用户 25 | func (a *Auth) SaveUser(user models.AdminUser) error { 26 | return db.Query().Save(&user).Error 27 | } 28 | -------------------------------------------------------------------------------- /web/src/layouts/components/LayoutTopBar/components/DarkThemeButton/index.tsx: -------------------------------------------------------------------------------- 1 | import IconButton from '@/layouts/components/IconButton' 2 | import useSetting from '@/hooks/useSetting' 3 | import useTheme from '@/hooks/useTheme' 4 | 5 | const DarkThemeButton = () => { 6 | const {getSetting} = useSetting() 7 | const {setDarkTheme} = useTheme() 8 | 9 | const toggleDarkTheme = () => { 10 | setDarkTheme(!getSetting('theme.darkTheme')) 11 | } 12 | 13 | if (getSetting('theme.followSystemTheme')) { 14 | return null 15 | } 16 | 17 | return ( 18 | toggleDarkTheme()}/> 20 | ) 21 | } 22 | 23 | export default DarkThemeButton 24 | -------------------------------------------------------------------------------- /web/dist/assets/Control-k5noxsqH.js: -------------------------------------------------------------------------------- 1 | import{s as p,bd as u,t as m,f as l,be as _,y as b,z as i,P as f,Q as s,D as y}from"./index-BnATMMdj.js";var v=function(o){p(r,o);function r(){return o!==null&&o.apply(this,arguments)||this}return r.prototype.renderInput=function(){var e=this.props,n=e.render,d=e.body,a=e.name,t=e.data;return n("inner",d,{value:typeof a=="string"?u(a,t):void 0})},r.prototype.render=function(){var e,n=this.props,d=n.render,a=n.label;n.control;var t=m(n,["render","label","control"]);return l.createElement(_,b({},t,{formMode:(e=t.mode)!==null&&e!==void 0?e:t.formMode,render:d,sizeMutable:!1,label:a,renderControl:this.renderInput}))},i([f,s("design:type",Function),s("design:paramtypes",[]),s("design:returntype",void 0)],r.prototype,"renderInput",null),r=i([y({type:"control"})],r),r}(l.Component);export{v as ControlRenderer}; 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Amis Base (Alpha) 2 | 3 | 使用 GoFiber 和 amis 构建你的数据面板~ 4 | 5 | > ⚠️ 当前处于测试阶段, 不适用于生产环境~ 6 | 7 | ### 运行 8 | 9 | 首先, 你需要复制一个配置文件到 `config/config.yaml`, 并配置数据库信息 10 | 11 | ```shell 12 | cp config/config.example.yaml config/config.yaml 13 | ``` 14 | 15 | #### 使用 Docker Compose 16 | 17 | ```shell 18 | docker-compose up 19 | ``` 20 | 21 | #### 使用 Docker 22 | 23 | ```shell 24 | # 构建 25 | docker build -t amis-base . 26 | # 运行 27 | docker run -d \ 28 | --name amis-base \ 29 | -p 8080:8080 \ 30 | -v $(pwd)/config/config.yaml:/app/config.yaml \ 31 | -v $(pwd)/assets:/app/assets \ 32 | amis-base 33 | ``` 34 | 35 | #### 手动运行 36 | 37 | ```shell 38 | # install 39 | go mod download 40 | go mod tidy 41 | 42 | # vendor (可选) 43 | # go mod vendor 44 | 45 | # 运行 46 | go run cmd/amis-base/main.go server 47 | ``` 48 | -------------------------------------------------------------------------------- /web/dist/assets/javascript-DhytsO-o.js: -------------------------------------------------------------------------------- 1 | import{conf as t,language as e}from"./typescript-B-NkIoeC.js";import"./editor.main-BLuVey-E.js";import"./index-BnATMMdj.js";var r=t,a={defaultToken:"invalid",tokenPostfix:".js",keywords:["break","case","catch","class","continue","const","constructor","debugger","default","delete","do","else","export","extends","false","finally","for","from","function","get","if","import","in","instanceof","let","new","null","return","set","super","switch","symbol","this","throw","true","try","typeof","undefined","var","void","while","with","yield","async","await","of"],typeKeywords:[],operators:e.operators,symbols:e.symbols,escapes:e.escapes,digits:e.digits,octaldigits:e.octaldigits,binarydigits:e.binarydigits,hexdigits:e.hexdigits,regexpctl:e.regexpctl,regexpesc:e.regexpesc,tokenizer:e.tokenizer};export{r as conf,a as language}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/Operation-B8-fMcZX.js: -------------------------------------------------------------------------------- 1 | import{s as o,f as i,y as m,z as y,D as f}from"./index-BnATMMdj.js";var v=function(t){o(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.render=function(){var n=this.props,d=n.className,c=n.style,l=n.buttons,p=n.render,u=n.classnames,a=n.testIdBuilder;return i.createElement("div",{className:u("OperationField",d),style:c},Array.isArray(l)?l.map(function(r,s){return p("".concat(s),m({type:"button",size:r.size||"sm",level:r.level||(r.icon&&!r.label?"link":"")},r),{key:s,testIdBuilder:a==null?void 0:a.getChild("button-".concat(r.testid||r.id||s))})}):null)},e.propsList=["buttons","label"],e.defaultProps={},e}(i.Component),F=function(t){o(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e=y([f({type:"operation"})],e),e}(v);export{v as OperationField,F as OperationFieldRenderer}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/index-CKX5HEDS.js: -------------------------------------------------------------------------------- 1 | import{d as r,f as t,h as i,j as e,i as n,S as h,A as m,k as p,l as u}from"./index-BnATMMdj.js";const v=()=>{const{t:a}=r(),[s,l]=t.useState(!1),[d,o]=t.useState({}),c={type:"button",label:a("amis_editor.get_php_code"),level:"success",actionType:"ajax",api:{method:"post",url:"/dev_tools/editor_parse",data:{schema:d}},feedback:{title:"PHP Schema",size:"lg",body:{type:"editor",language:"php",name:"schema"}}};return i("div",{className:"h-screen",children:[e(n,{className:"h-full",title:a("amis_editor.editor"),bodyStyle:{padding:0,height:"calc(100% - 55px)"},extra:i(h,{children:[e(m,{schema:c}),e(p,{level:"primary",onClick:()=>l(!s),children:a(s?"amis_editor.edit":"amis_editor.preview")})]}),children:e("div",{className:"w-full h-full overflow-x-auto",children:e(u,{onChange:o,preview:s})})}),e("div",{className:"h-5"})]})};export{v as default}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/InputArray-zK0xvRpF.js: -------------------------------------------------------------------------------- 1 | import{s as a,t as c,f as n,y as f,z as m,a1 as u,ci as p}from"./index-BnATMMdj.js";import d from"./Combo-Cgj305mq.js";var y=function(o){a(r,o);function r(e){var t=o.call(this,e)||this;return t.comboRef=t.comboRef.bind(t),t}return r.prototype.comboRef=function(e){this.comboInstance=e},r.prototype.validate=function(e){return this.comboInstance?this.comboInstance.validate():null},r.prototype.render=function(){var e=this.props,t=e.items,s=e.scaffold,i=c(e,["items","scaffold"]),l=Array.isArray(t)?t.length>1?t.slice(0,1):t:t!=null?[t]:[];return n.createElement(d,f({},i,{scaffold:s,items:l,flat:!0,multiple:!0,multiLine:!1,ref:this.comboRef}))},r}(n.Component),_=function(o){a(r,o);function r(){return o!==null&&o.apply(this,arguments)||this}return r=m([u({type:"input-array",storeType:p.name})],r),r}(y);export{_ as ArrayControlRenderer,y as default}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/Breadcrumb-BnOqC5Oj.js: -------------------------------------------------------------------------------- 1 | import{s as d,t as v,w as u,K as o,f as c,a2 as p,y as _,z as m,D as y}from"./index-BnATMMdj.js";var B=function(a){d(e,a);function e(){return a!==null&&a.apply(this,arguments)||this}return e.prototype.render=function(){var t=this.props,f=t.items,b=t.source,l=t.data,i=t.env,h=v(t,["items","source","data","env"]),s=f||u(b,l,"| raw");return s&&(s=s.map(function(r){return r.label&&(r.label=o(r.label,l)),r.href&&(r.href=u(r.href,l,"| raw")),r.dropdown&&(r.dropdown=r.dropdown.map(function(n){return n.label&&(n.label=o(n.label,l)),n.href&&(n.href=u(n.href,l,"| raw")),n})),r})),c.createElement(p,_({items:s,tooltipContainer:i==null?void 0:i.getModalContainer},h))},e}(c.Component),g=function(a){d(e,a);function e(){return a!==null&&a.apply(this,arguments)||this}return e=m([y({type:"breadcrumb"})],e),e}(B);export{B as BreadcrumbField,g as BreadcrumbFieldRenderer}; 2 | -------------------------------------------------------------------------------- /internal/app/admin/types/system.go: -------------------------------------------------------------------------------- 1 | package types 2 | 3 | // SuperAdminSign 超级管理员标识 4 | var SuperAdminSign = "administrator" 5 | 6 | // AdminRouteMeta 后台路由元信息 7 | type AdminRouteMeta struct { 8 | Title string `json:"title"` 9 | Icon string `json:"icon"` 10 | Hide bool `json:"hide"` 11 | Sort int `json:"sort"` 12 | } 13 | 14 | // AdminRoutes 后台路由 15 | type AdminRoutes struct { 16 | Name string `json:"name"` 17 | Path string `json:"path"` 18 | PageSign string `json:"pageSign"` 19 | IsFull int `json:"isFull"` 20 | IsHome int `json:"isHome"` 21 | Component string `json:"component"` 22 | Meta AdminRouteMeta `json:"meta"` 23 | Children *[]AdminRoutes `json:"children"` 24 | } 25 | 26 | // Options 下拉框 27 | type Options struct { 28 | Label string `json:"label"` 29 | Value string `json:"value"` 30 | } 31 | -------------------------------------------------------------------------------- /web/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "esModuleInterop": true, 12 | "allowSyntheticDefaultImports": true, 13 | "strict": false, 14 | "forceConsistentCasingInFileNames": true, 15 | "noFallthroughCasesInSwitch": true, 16 | "module": "esnext", 17 | "moduleResolution": "node", 18 | "resolveJsonModule": true, 19 | "isolatedModules": true, 20 | "noEmit": true, 21 | "jsx": "react-jsx", 22 | "baseUrl": ".", 23 | "paths": { 24 | "@/*": [ 25 | "src/*" 26 | ] 27 | } 28 | }, 29 | "include": [ 30 | "src" 31 | ] 32 | } 33 | -------------------------------------------------------------------------------- /web/dist/assets/Wrapper-CZKJAzhY.js: -------------------------------------------------------------------------------- 1 | import{s as p,f as i,b2 as u,z as y,D as f}from"./index-BnATMMdj.js";var m=function(a){p(r,a);function r(){return a!==null&&a.apply(this,arguments)||this}return r.prototype.renderBody=function(){var e=this.props,t=e.children,n=e.body,s=e.render,d=e.disabled;return t?typeof t=="function"?t(this.props):t:n?s("body",n,{disabled:d}):null},r.prototype.render=function(){var e=this.props,t=e.className,n=e.size,s=e.classnames,d=e.style,o=e.data,l=e.wrap,c=e.id;return l===!1?this.renderBody():i.createElement("div",{className:s("Wrapper",n&&n!=="none"?"Wrapper--".concat(n):"",t),style:u(d,o),"data-id":c},this.renderBody())},r.propsList=["body","className","children","size"],r.defaultProps={className:"",size:"md"},r}(i.Component),b=function(a){p(r,a);function r(){return a!==null&&a.apply(this,arguments)||this}return r=y([f({type:"wrapper"})],r),r}(m);export{b as WrapperRenderer,m as default}; 2 | -------------------------------------------------------------------------------- /web/src/typeings.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | interface Window { 4 | $adminApiPrefix: string; 5 | $owl: { 6 | logout: () => void, 7 | refreshRoutes: () => Promise, 8 | appLoader: () => void, 9 | afterLoginSuccess: (params: any, token: string) => void, 10 | refreshAmisPage: () => Promise, 11 | closeTabByPath: (path: string) => void, 12 | } 13 | } 14 | 15 | declare module "*.css" { 16 | const classes: { [className: string]: string } 17 | export default classes 18 | } 19 | 20 | interface GlobalState { 21 | settings?: any; 22 | userInfo?: { 23 | name?: string; 24 | avatar?: string; 25 | }; 26 | userLoading?: boolean; 27 | // 面包屑 28 | breadcrumb?: [], 29 | routes?: any[]; 30 | // 初始化完成 31 | inited?: boolean; 32 | openSetting?: boolean; 33 | antdToken?: any; 34 | } 35 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # 构建 2 | FROM golang:1.23.5 AS builder 3 | 4 | # 设置环境变量 (禁用CGO, 才能在 alpine 中运行) 5 | ENV GO111MODULE=on \ 6 | CGO_ENABLED=0 \ 7 | GOPROXY=https://goproxy.cn,direct 8 | 9 | # 设置工作目录 10 | WORKDIR /app 11 | 12 | # 复制代码到容器中 13 | COPY . . 14 | 15 | # 下载依赖并编译 16 | RUN go mod download && \ 17 | go mod tidy && \ 18 | go mod vendor && \ 19 | go build -v -o amis-base cmd/amis-base/main.go 20 | 21 | # 运行 22 | FROM alpine:latest 23 | 24 | # 设置工作目录 25 | WORKDIR /app 26 | 27 | # 从构建阶段复制编译好的二进制文件 28 | COPY --from=builder /app/amis-base . 29 | # 复制前端 30 | COPY --from=builder /app/web/dist ./web/dist 31 | 32 | # 设置时区为上海, 给文件添加权限 33 | RUN apk add --no-cache tzdata && \ 34 | cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ 35 | chmod +x ./amis-base 36 | 37 | # 暴露端口 38 | EXPOSE 8080 39 | 40 | # 设置启动命令 41 | ENTRYPOINT ["./amis-base", "server"] 42 | -------------------------------------------------------------------------------- /internal/app/admin/services/base.go: -------------------------------------------------------------------------------- 1 | package services 2 | 3 | import ( 4 | "github.com/gofiber/fiber/v2" 5 | "gorm.io/gorm" 6 | ) 7 | 8 | type baseService struct{} 9 | 10 | func (s baseService) ListPaginate(query *gorm.DB, filters fiber.Map) *gorm.DB { 11 | // 分页 12 | query = query.Offset((filters["page"].(int) - 1) * filters["perPage"].(int)).Limit(filters["perPage"].(int)) 13 | 14 | // 排序 15 | query = s.Sortable(query, filters) 16 | 17 | return query 18 | } 19 | 20 | func (s baseService) ListGet(query *gorm.DB, filters fiber.Map) *gorm.DB { 21 | // 排序 22 | query = s.Sortable(query, filters) 23 | 24 | return query 25 | } 26 | 27 | func (s baseService) Sortable(query *gorm.DB, filters fiber.Map) *gorm.DB { 28 | orderBy := filters["orderBy"].(string) 29 | orderDir := filters["orderDir"].(string) 30 | 31 | if orderBy != "" { 32 | query.Order(orderBy + " " + orderDir) 33 | } 34 | 35 | return query 36 | } 37 | -------------------------------------------------------------------------------- /web/dist/assets/BarCode-C1UZQEkF.js: -------------------------------------------------------------------------------- 1 | const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/BarCode-BkfPUGz7.js","assets/index-BnATMMdj.js","assets/index-D1xUauFQ.css"])))=>i.map(i=>d[i]); 2 | import{f as n,o as u,s as o,ai as p,j as t,r as h,z as v,D as f}from"./index-BnATMMdj.js";var m=n.lazy(function(){return u(()=>import("./BarCode-BkfPUGz7.js"),__vite__mapDeps([0,1,2]))}),_=function(a){o(e,a);function e(){return a!==null&&a.apply(this,arguments)||this}return e.prototype.render=function(){var r=this.props,s=r.className,i=r.style;r.width,r.height;var d=r.classnames,l=r.options,c=p(this.props);return t(h.Suspense,{fallback:t("div",{children:"..."}),children:t("div",{"data-testid":"barcode",className:d("BarCode",s),style:i,children:t(m,{value:c,options:l})})})},e}(n.Component),C=function(a){o(e,a);function e(){return a!==null&&a.apply(this,arguments)||this}return e=v([f({type:"barcode"})],e),e}(_);export{_ as BarCodeField,C as BarCodeFieldRenderer}; 3 | -------------------------------------------------------------------------------- /web/dist/assets/VBox-DxZho49x.js: -------------------------------------------------------------------------------- 1 | import{s as d,f as a,ag as o,z as m,D as f}from"./index-BnATMMdj.js";var h=function(t){d(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.renderChild=function(n,r){var s=this.props.render;return s(n,r)},e.prototype.renderCell=function(n,r){var s=this.props.classPrefix;return a.createElement("div",{className:o("".concat(s,"Vbox-cell"),n.cellClassName)},this.renderChild("row/".concat(r),n))},e.prototype.render=function(){var n=this,r=this.props,s=r.className,p=r.style,l=r.rows,u=r.classPrefix;return a.createElement("div",{className:o("".concat(u,"Vbox"),s),style:p},Array.isArray(l)?l.map(function(c,i){return a.createElement("div",{className:o("row-row",c.rowClassName),key:i},n.renderCell(c,i))}):null)},e.propsList=["rows"],e.defaultProps={},e}(a.Component),y=function(t){d(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e=m([f({type:"vbox"})],e),e}(h);export{y as VBoxRenderer,h as default}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/ini-BvajGCUy.js: -------------------------------------------------------------------------------- 1 | var e={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},n={defaultToken:"",tokenPostfix:".ini",escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/^\[[^\]]*\]/,"metatag"],[/(^\w+)(\s*)(\=)/,["key","","delimiter"]],{include:"@whitespace"},[/\d+/,"number"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string",'@string."'],[/'/,"string","@string.'"]],whitespace:[[/[ \t\r\n]+/,""],[/^\s*[#;].*$/,"comment"]],string:[[/[^\\"']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/["']/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}]]}};export{e as conf,n as language}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/JSONSchema-Bdf_juFZ.js: -------------------------------------------------------------------------------- 1 | import{bP as s,bQ as c,s as r,t as l,f as o,y as u,z as i,P as d,Q as a,a1 as p}from"./index-BnATMMdj.js";var h=s({sourceField:"schema",injectedPropsFilter:function(n,t){return{schema:n.config,loading:n.loading}}})(c),m=function(n){r(t,n);function t(){return n!==null&&n.apply(this,arguments)||this}return t.prototype.controlRef=function(e){for(;e!=null&&e.getWrappedInstance;)e=e.getWrappedInstance();this.control=e},t.prototype.validate=function(){var e;return(e=this.control)===null||e===void 0?void 0:e.validate()},t.prototype.render=function(){var e=l(this.props,[]);return o.createElement(h,u({},e,{ref:this.controlRef}))},i([d,a("design:type",Function),a("design:paramtypes",[Object]),a("design:returntype",void 0)],t.prototype,"controlRef",null),t}(o.PureComponent),g=function(n){r(t,n);function t(){return n!==null&&n.apply(this,arguments)||this}return t=i([p({type:"json-schema",strictMode:!1})],t),t}(m);export{g as JSONSchemaRenderer,m as default}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/SparkLine-BTfKEk6X.js: -------------------------------------------------------------------------------- 1 | import{s as m,a3 as y,ai as h,f as r,dy as v,y as d,ae as C,z as u,P as k,Q as c,D as f}from"./index-BnATMMdj.js";var g=function(l){m(t,l);function t(){return l!==null&&l.apply(this,arguments)||this}return t.prototype.handleClick=function(e,i){var a=this.props,p=a.disabled,n=a.onAction,s=a.clickAction,o=a.data;e.defaultPrevented||!s||p||n==null||n(null,s,i?y(o,i):o)},t.prototype.render=function(){var e=this.props;e.value,e.name;var i=e.clickAction,a=e.id,p=e.wrapperCustomStyle,n=e.env,s=e.themeCss,o=h(this.props)||[1,1];return r.createElement(r.Fragment,null,r.createElement(v,d({onClick:i?this.handleClick:void 0},this.props,{value:o})),r.createElement(C,d({},this.props,{config:{wrapperCustomStyle:p,id:a,themeCss:s,classNames:[{key:"baseControlClassName"}]},env:n})))},u([k,c("design:type",Function),c("design:paramtypes",[Object,Object]),c("design:returntype",void 0)],t.prototype,"handleClick",null),t=u([f({type:"sparkline"})],t),t}(r.Component);export{g as SparkLineRenderer}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/Password-B2S2n_ZX.js: -------------------------------------------------------------------------------- 1 | import{s as o,f as i,L as l,z as r,P as v,Q as a,D as g}from"./index-BnATMMdj.js";var b=function(s){o(e,s);function e(){var t=s!==null&&s.apply(this,arguments)||this;return t.state={visible:!1},t}return e.prototype.toggleVisible=function(){this.setState({visible:!this.state.visible})},e.prototype.render=function(){var t=this.props,c=t.classnames,d=t.className,m=t.style,n=t.mosaicText,p=n===void 0?"********":n,u=t.value;return i.createElement("span",{className:c("Password-field",d),style:m},this.state.visible?u:p,this.state.visible?i.createElement(l,{icon:"view",className:"icon",onClick:this.toggleVisible}):i.createElement(l,{icon:"invisible",className:"icon",onClick:this.toggleVisible}))},r([v,a("design:type",Function),a("design:paramtypes",[]),a("design:returntype",void 0)],e.prototype,"toggleVisible",null),e}(i.Component),y=function(s){o(e,s);function e(){return s!==null&&s.apply(this,arguments)||this}return e=r([g({type:"password"})],e),e}(b);export{b as PasswordField,y as PasswordFieldRenderer}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/DateRange-BIkbxrx-.js: -------------------------------------------------------------------------------- 1 | import{s as _,aI as h,aX as o,f as D,z as M,D as x}from"./index-BnATMMdj.js";var N=function(r){_(t,r);function t(){return r!==null&&r.apply(this,arguments)||this}return t.prototype.render=function(){var n=this.props,s=n.delimiter,g=s===void 0?",":s,d=n.connector,y=d===void 0?"~":d,i=n.value,l=n.valueFormat,m=n.format,c=m===void 0?"YYYY-MM-DD":m,u=n.displayFormat,F=n.classnames,R=n.className,Y=n.style;if(!i)return null;typeof i=="string"&&(i=i.split(g));var f=h(i,2),v=f[0],e=v===void 0?"":v,p=f[1],a=p===void 0?"":p;return l?(e=o(e,l),a=o(a,l)):(e=o(e*1e3),a=o(a*1e3)),e=e!=null&&e.isValid()?e.format(u||c):"",a=a!=null&&a.isValid()?a.format(u||c):"",D.createElement("span",{className:F("DateRangeField",R),style:Y},[e,a].join(" ".concat(y," ")))},t.defaultProps={format:"YYYY-MM-DD",valueFormat:"X",connector:"~"},t}(D.Component),T=function(r){_(t,r);function t(){return r!==null&&r.apply(this,arguments)||this}return t=M([x({type:"date-range"})],t),t}(N);export{N as DateRangeField,T as DateRangeFieldRenderer}; 2 | -------------------------------------------------------------------------------- /internal/app/bootstrap.go: -------------------------------------------------------------------------------- 1 | package app 2 | 3 | import ( 4 | "amis-base/internal/app/admin" 5 | "amis-base/internal/app/api" 6 | "amis-base/internal/pkg/cache" 7 | "amis-base/internal/pkg/config" 8 | "amis-base/internal/pkg/db" 9 | "github.com/gofiber/fiber/v2" 10 | "github.com/gofiber/fiber/v2/log" 11 | "github.com/spf13/viper" 12 | ) 13 | 14 | // Bootstrap 初始化 15 | func Bootstrap() { 16 | // 加载配置 17 | config.Bootstrap() 18 | 19 | // 数据库 20 | db.Bootstrap() 21 | 22 | // 缓存 23 | cache.Bootstrap() 24 | } 25 | 26 | // Start 启动服务 27 | func Start() { 28 | // 初始化 fiber 29 | app := fiber.New(fiber.Config{ 30 | AppName: viper.GetString("app.name"), 31 | CaseSensitive: true, 32 | EnablePrintRoutes: viper.GetBool("app.dev"), 33 | }) 34 | 35 | // 加载 admin 模块 36 | admin.Bootstrap(app) 37 | // 加载 api 模块 38 | api.Bootstrap(app) 39 | 40 | // 前端 41 | app.Static("/", "./web/dist") 42 | 43 | // 文件上传目录 44 | app.Static("/uploads", "./assets/uploads") 45 | 46 | // 启动服务 47 | log.Fatal(app.Listen(":" + viper.GetString("app.port"))) 48 | } 49 | -------------------------------------------------------------------------------- /web/dist/assets/InputSignature-Dn4bC9Mi.js: -------------------------------------------------------------------------------- 1 | import{s as c,az as l,f as s,c$ as m,y as p,T as u,z as d,a1 as b,Q as g}from"./index-BnATMMdj.js";var h=function(t){c(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.render=function(){var n=this.props,a=n.classnames,o=n.className,r=n.onChange,i=l(this.props,["value","width","height","mobileUI","embed","color","bgColor","clearBtnLabel","clearBtnIcon","undoBtnLabel","undoBtnIcon","confirmBtnLabel","confirmBtnIcon","embedConfirmLabel","embedConfirmIcon","ebmedCancelLabel","ebmedCancelIcon","embedBtnIcon","embedBtnLabel"]);return s.createElement(m,p({classnames:a,className:o,onChange:r},i))},e}(s.Component),C=function(t){c(e,t);function e(n,a){var o=t.call(this,n)||this,r=a;return r.registerComponent(o),o}return e.prototype.componentWillUnmount=function(){var n;(n=t.prototype.componentWillUnmount)===null||n===void 0||n.call(this);var a=this.context;a.unRegisterComponent(this)},e.contextType=u,e=d([b({type:"input-signature",sizeMutable:!1}),g("design:paramtypes",[Object,Object])],e),e}(h);export{C as InputSignatureRenderer,h as default}; 2 | -------------------------------------------------------------------------------- /internal/app/admin/middleware/permission.go: -------------------------------------------------------------------------------- 1 | package middleware 2 | 3 | import ( 4 | "amis-base/internal/app/admin/models" 5 | "amis-base/internal/pkg/helper" 6 | "amis-base/internal/pkg/response" 7 | "github.com/gofiber/fiber/v2" 8 | "github.com/spf13/viper" 9 | ) 10 | 11 | // Permission 鉴权中间件 12 | func Permission(ctx *fiber.Ctx) error { 13 | if !viper.GetBool("admin.permission.enabled") { 14 | return ctx.Next() 15 | } 16 | 17 | // 白名单 18 | exclude := viper.GetStringSlice("admin.permission.exclude") 19 | if len(exclude) > 0 { 20 | for _, v := range exclude { 21 | if helper.IsAllowRequest(v, ctx.Method(), ctx.OriginalURL()) { 22 | return ctx.Next() 23 | } 24 | } 25 | } 26 | 27 | // 未获取到用户信息, 无法鉴权 28 | if ctx.Locals("user") == nil { 29 | return response.Forbidden(ctx) 30 | } 31 | 32 | user := ctx.Locals("user").(models.AdminUser) 33 | 34 | // 超级管理员 35 | if user.IsSuperAdmin() { 36 | return ctx.Next() 37 | } 38 | 39 | // 检查权限 40 | rules := user.PermissionApiRules() 41 | for _, rule := range rules { 42 | if helper.IsAllowRequest(rule, ctx.Method(), ctx.Path()) { 43 | return ctx.Next() 44 | } 45 | } 46 | 47 | // 无权限 48 | return response.Forbidden(ctx) 49 | } 50 | -------------------------------------------------------------------------------- /internal/app/admin/services/admin_setting.go: -------------------------------------------------------------------------------- 1 | package services 2 | 3 | import ( 4 | "amis-base/internal/app/admin/models" 5 | "amis-base/internal/pkg/cache" 6 | "amis-base/internal/pkg/db" 7 | "amis-base/internal/pkg/helper" 8 | ) 9 | 10 | type AdminSetting struct { 11 | } 12 | 13 | func (s AdminSetting) Set(key string, value any) error { 14 | var record models.AdminSetting 15 | 16 | result := db.Query().Where("`key` = ?", key).Find(&record) 17 | 18 | record.Key = key 19 | record.Value = helper.JsonEncode(value) 20 | 21 | _ = cache.Delete(cache.BuildKey("setting:" + key)) 22 | 23 | if result.RowsAffected == 0 { 24 | return db.Query().Create(&record).Error 25 | } 26 | 27 | return db.Query().Save(&record).Error 28 | } 29 | 30 | func (s AdminSetting) Get(key string) any { 31 | value, err := cache.RememberForever[any](cache.BuildKey("setting:"+key), func() (any, error) { 32 | var record models.AdminSetting 33 | 34 | result := db.Query().Where("`key` = ?", key).First(&record) 35 | 36 | if result.RowsAffected == 0 { 37 | return "", nil 38 | } 39 | 40 | return helper.JsonDecode[any](record.Value), nil 41 | }) 42 | 43 | if err != nil { 44 | return "" 45 | } 46 | 47 | return value 48 | } 49 | -------------------------------------------------------------------------------- /web/dist/assets/Link-BoJnsR-S.js: -------------------------------------------------------------------------------- 1 | import{s as c,K as _,ai as C,f as p,dm as L,z as h,P as T,Q as o,D as R,$ as F}from"./index-BnATMMdj.js";var I=function(a){c(t,a);function t(){return a!==null&&a.apply(this,arguments)||this}return t.prototype.handleClick=function(e){var n=this.props,r=n.env,i=n.href,l=n.blank,s=n.body;r==null||r.tracker({eventType:"url",eventData:{url:i,blank:l,label:s}},this.props)},t.prototype.getHref=function(){},t.prototype.render=function(){var e=this.props,n=e.className,r=e.style,i=e.body,l=e.href;e.classnames;var s=e.blank,u=e.disabled,f=e.htmlTarget,y=e.data,b=e.render,k=e.translate,m=e.title,g=e.icon,v=e.rightIcon,d=(typeof l=="string"&&l?_(l,y,"| raw"):void 0)||C(this.props);return p.createElement(L,{className:n,style:r,href:d,disabled:u,title:m,htmlTarget:f||(s?"_blank":"_self"),icon:g,rightIcon:v,onClick:this.handleClick},i?b("body",i):d||k("link"))},t.defaultProps={blank:!0,disabled:!1,htmlTarget:""},h([T,o("design:type",Function),o("design:paramtypes",[Object]),o("design:returntype",void 0)],t.prototype,"handleClick",null),t}(p.Component),P=function(a){c(t,a);function t(){return a!==null&&a.apply(this,arguments)||this}return t=h([R({type:"link"}),F],t),t}(I);export{I as LinkCmpt,P as LinkFieldRenderer}; 2 | -------------------------------------------------------------------------------- /web/src/utils/clipboard.ts: -------------------------------------------------------------------------------- 1 | // https://github.com/feross/clipboard-copy/blob/master/index.js 2 | 3 | export default function clipboard(text) { 4 | if (navigator.clipboard) { 5 | return navigator.clipboard.writeText(text).catch(function (err) { 6 | throw err !== undefined 7 | ? err 8 | : new DOMException('The request is not allowed', 'NotAllowedError'); 9 | }); 10 | } 11 | 12 | const span = document.createElement('span'); 13 | span.textContent = text; 14 | 15 | span.style.whiteSpace = 'pre'; 16 | 17 | document.body.appendChild(span); 18 | 19 | const selection = window.getSelection(); 20 | const range = window.document.createRange(); 21 | selection.removeAllRanges(); 22 | range.selectNode(span); 23 | selection.addRange(range); 24 | 25 | let success = false; 26 | try { 27 | success = window.document.execCommand('copy'); 28 | } catch (err) { 29 | // eslint-disable-next-line 30 | console.log('error', err); 31 | } 32 | 33 | selection.removeAllRanges(); 34 | window.document.body.removeChild(span); 35 | 36 | return success 37 | ? Promise.resolve() 38 | : Promise.reject( 39 | new DOMException('The request is not allowed', 'NotAllowedError') 40 | ); 41 | } 42 | -------------------------------------------------------------------------------- /web/dist/assets/GridNav-Cbu6k5KJ.js: -------------------------------------------------------------------------------- 1 | import{s as h,d_ as g,d$ as b,ai as _,v as m,w as A,f as c,e0 as C,y as N,e1 as x,z as v,P,Q as d,D as V}from"./index-BnATMMdj.js";var E=function(i){h(s,i);function s(){return i!==null&&i.apply(this,arguments)||this}return s.prototype.handleClick=function(e){var n=this;return function(l){var r;e.link?r=g.isUrl({},e.link)?{type:"button",actionType:"url",url:e.link,blank:e.blank}:{type:"button",actionType:"link",link:e.link}:r=e.clickAction,b(l,r,n.props,e)}},s.prototype.render=function(){var e=this,n=this.props,l=n.itemClassName;n.style;var r=n.contentClassName,o=n.source,u=n.data,p=n.options,y=n.classnames,f=_(this.props),a=[];return typeof o=="string"&&m(o)?a=A(o,u,"| raw")||void 0:Array.isArray(f)?a=f:Array.isArray(p)&&(a=p),a&&!Array.isArray(a)&&(a=[a]),a!=null&&a.length?c.createElement(C,N({},this.props),a.map(function(t,k){return c.createElement(x,{key:k,onClick:t.clickAction||t.link?e.handleClick(t):void 0,className:l,contentClassName:r,text:t.text,icon:t.icon,classnames:y,badge:t.badge?{badge:t.badge,data:u,classnames:y}:void 0})})):null},v([P,d("design:type",Function),d("design:paramtypes",[Object]),d("design:returntype",void 0)],s.prototype,"handleClick",null),s=v([V({type:"grid-nav"})],s),s}(c.Component);export{E as default}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/PaginationWrapper-B6Jna3bw.js: -------------------------------------------------------------------------------- 1 | import{s as l,f as o,z as m,D as P,d6 as c}from"./index-BnATMMdj.js";var y=function(r){l(a,r);function a(e){var t=r.call(this,e)||this;return e.store.syncProps(e,void 0,["perPage","mode","ellipsisPageGap","inputName","outputName"]),t}return a.prototype.componentDidUpdate=function(e){var t=this.props.store;t.syncProps(this.props,e,["perPage","mode","ellipsisPageGap","inputName","outputName"])},a.prototype.render=function(){var e=this.props,t=e.position,p=e.render,n=e.store,g=e.classnames,u=e.style,i=e.body,d=e.translate,s=t!=="none"?p("pager",{type:"pagination"},{activePage:n.page,lastPage:n.lastPage,mode:n.mode,ellipsisPageGap:n.ellipsisPageGap,onPageChange:n.switchTo,perPage:n.perPage,className:"PaginationWrapper-pager"}):null;return o.createElement("div",{className:g("PaginationWrapper"),style:u},t==="top"?s:null,i?p("body",i,{data:n.locals}):o.createElement("span",null,d("PaginationWrapper.placeholder")),t==="bottom"?s:null)},a.defaultProps={inputName:"items",outputName:"items",perPage:10,position:"top"},a}(o.Component),h=function(r){l(a,r);function a(){return r!==null&&r.apply(this,arguments)||this}return a=m([P({type:"pagination-wrapper",storeType:c.name})],a),a}(y);export{y as PaginationWrapper,h as PaginationWrapperRenderer}; 2 | -------------------------------------------------------------------------------- /web/src/utils/dynamicAssets.ts: -------------------------------------------------------------------------------- 1 | export function dynamicAssetsHandler({js = [], css = [], styles = [], scripts = []}) { 2 | const appendToHead = (element: any) => document.getElementsByTagName('head')[0].appendChild(element) 3 | 4 | const loadJS = (src: string) => { 5 | const script = document.createElement('script') 6 | script.src = src 7 | script.type = 'text/javascript' 8 | appendToHead(script) 9 | } 10 | 11 | const loadCSS = (href: string) => { 12 | const link = document.createElement('link') 13 | link.href = href 14 | link.rel = 'stylesheet' 15 | appendToHead(link) 16 | } 17 | 18 | const loadScripts = (js: string) => { 19 | const script = document.createElement('script') 20 | script.innerHTML = js 21 | script.type = 'text/javascript' 22 | appendToHead(script) 23 | } 24 | 25 | const loadStyles = (css: string) => { 26 | const style = document.createElement('style') 27 | style.innerHTML = css 28 | appendToHead(style) 29 | } 30 | 31 | js?.forEach(js => loadJS(js)) 32 | css?.forEach(css => loadCSS(css)) 33 | scripts?.forEach(val => loadScripts(val)) 34 | styles?.forEach(val => loadStyles(val)) 35 | } 36 | -------------------------------------------------------------------------------- /web/dist/assets/csp-C46ZqvIl.js: -------------------------------------------------------------------------------- 1 | var t={brackets:[],autoClosingPairs:[],surroundingPairs:[]},r={keywords:[],typeKeywords:[],tokenPostfix:".csp",operators:[],symbols:/[=> div { 41 | margin-bottom: 0 !important; 42 | overflow-x: hidden !important; 43 | } 44 | 45 | .ant-menu-item-icon { 46 | vertical-align: -0.225rem !important; 47 | } 48 | 49 | .iframe:has(.owl-iframe) { 50 | padding: 0; 51 | } 52 | 53 | .custom-scrollbar > :first-child { 54 | scrollbar-width: none; 55 | margin-right: 0 !important; 56 | margin-bottom: 0 !important; 57 | } 58 | -------------------------------------------------------------------------------- /web/src/utils/useStorage.ts: -------------------------------------------------------------------------------- 1 | // https://stackoverflow.com/questions/68424114/next-js-how-to-fetch-localstorage-data-before-client-side-rendering 2 | // 解决 nextJS 无法获取初始localstorage问题 3 | 4 | import { useEffect, useState } from 'react'; 5 | import {isSSR} from '@/utils/common' 6 | 7 | const getDefaultStorage = (key) => { 8 | if (!isSSR) { 9 | return localStorage.getItem(key); 10 | } else { 11 | return undefined; 12 | } 13 | }; 14 | 15 | function useStorage( 16 | key: string, 17 | defaultValue?: string 18 | ): [string, (string) => void, () => void] { 19 | const [storedValue, setStoredValue] = useState( 20 | getDefaultStorage(key) || defaultValue 21 | ); 22 | 23 | const setStorageValue = (value: string) => { 24 | if (!isSSR) { 25 | localStorage.setItem(key, value); 26 | if (value !== storedValue) { 27 | setStoredValue(value); 28 | } 29 | } 30 | }; 31 | 32 | const removeStorage = () => { 33 | if (!isSSR) { 34 | localStorage.removeItem(key); 35 | } 36 | }; 37 | 38 | useEffect(() => { 39 | const storageValue = localStorage.getItem(key); 40 | if (storageValue) { 41 | setStoredValue(storageValue); 42 | } 43 | }, []); 44 | 45 | return [storedValue, setStorageValue, removeStorage]; 46 | } 47 | 48 | export default useStorage; 49 | -------------------------------------------------------------------------------- /web/vite.config.ts: -------------------------------------------------------------------------------- 1 | import {defineConfig, loadEnv} from 'vite' 2 | import react from '@vitejs/plugin-react' 3 | import compression from 'vite-plugin-compression' 4 | import {createViteProxy} from './src/utils/proxy' 5 | 6 | // https://vitejs.dev/config/ 7 | export default defineConfig(configEnv => { 8 | const viteEnv = loadEnv(configEnv.mode, process.cwd()) 9 | 10 | return { 11 | base: viteEnv.VITE_BASE_URL, 12 | resolve: { 13 | alias: [ 14 | {find: '@', replacement: '/src'}, 15 | {find: 'moment/locale/zh-cn', replacement: 'moment/dist/locale/zh-cn'}, 16 | ], 17 | }, 18 | plugins: [ 19 | react(), 20 | compression(), 21 | ], 22 | css: { 23 | preprocessorOptions: { 24 | less: { 25 | javascriptEnabled: true, 26 | }, 27 | }, 28 | }, 29 | server: { 30 | host: '0.0.0.0', 31 | port: 3200, 32 | open: true, 33 | proxy: createViteProxy(viteEnv), 34 | }, 35 | build: { 36 | sourcemap: false, 37 | reportCompressedSize: false, 38 | rollupOptions: { 39 | onwarn() { 40 | }, 41 | }, 42 | }, 43 | } 44 | }) 45 | -------------------------------------------------------------------------------- /web/dist/assets/InputColor-CWWh1zgO.js: -------------------------------------------------------------------------------- 1 | const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ColorPicker-BbURB391.js","assets/index-BnATMMdj.js","assets/index-D1xUauFQ.css"])))=>i.map(i=>d[i]); 2 | import{f as c,o as m,s as u,t as f,j as o,ag as _,r as C,y,z as p,aZ as h,Q as n,a1 as g}from"./index-BnATMMdj.js";var x=c.lazy(function(){return m(()=>import("./ColorPicker-BbURB391.js"),__vite__mapDeps([0,1,2]))}),P=function(r){u(t,r);function t(){var e=r!==null&&r.apply(this,arguments)||this;return e.state={open:!1},e}return t.prototype.render=function(){var e=this.props,d=e.className;e.style;var s=e.classPrefix,v=e.value,a=e.env;e.static;var l=e.mobileUI,i=f(e,["className","style","classPrefix","value","env","static","mobileUI"]);return o("div",{className:_("".concat(s,"ColorControl"),d),children:o(C.Suspense,{fallback:o("div",{children:"..."}),children:o(x,{...y({classPrefix:s},i,{mobileUI:l,popOverContainer:l?a==null?void 0:a.getModalContainer:i.popOverContainer||a.getModalContainer,value:v||""})})})})},t.defaultProps={format:"hex",clearable:!0},p([h(),n("design:type",Function),n("design:paramtypes",[]),n("design:returntype",void 0)],t.prototype,"render",null),t}(c.PureComponent),I=function(r){u(t,r);function t(){return r!==null&&r.apply(this,arguments)||this}return t=p([g({type:"input-color"})],t),t}(P);export{I as ColorControlRenderer,x as ColorPicker,P as default}; 3 | -------------------------------------------------------------------------------- /web/dist/assets/Number-z8I2a9tf.js: -------------------------------------------------------------------------------- 1 | import{s as d,f as a,ai as R,bw as k,cf as w,by as M,dM as O,bA as S,z,D as P}from"./index-BnATMMdj.js";var V=function(n){d(r,n);function r(){return n!==null&&n.apply(this,arguments)||this}return r.prototype.render=function(){var t=this.props,b=t.placeholder,v=t.kilobitSeparator,s=t.precision,y=t.prefix,o=t.affix,N=t.suffix,u=t.percent,p=t.unitOptions,h=t.className,x=t.style,F=t.classnames,g=t.translate,i=a.createElement("span",{className:"text-muted"},b),e=R(this.props),l="";if(typeof e=="string"&&p&&p.length){var E=k(p).map(function(f){return f.value});l=E.find(function(f){return e.endsWith(f)})||"",l&&(e=e.replace(l,""))}if(typeof e=="number"||typeof e=="string")if(typeof e=="string"&&s&&(e=w(parseFloat(e))),isNaN(e))i=!1;else if(u){e=parseFloat(e)||0;var m=typeof u=="number"?u:0,_=e*100,c=Math.pow(10,m);e=(Math.round(_*c)/c).toFixed(m)+"%",i=a.createElement("span",null,e)}else typeof e=="number"&&s&&(e=M(O(e),".",s)),v&&(e=S(e,s)),i=a.createElement("span",null,e);return i=i?a.createElement(a.Fragment,null,y,i,l,o??N):a.createElement("span",{className:"text-danger"},g("Number.invalid")),a.createElement("span",{className:F("NumberField",h),style:x},i)},r.defaultProps={placeholder:"-",kilobitSeparator:!0},r}(a.Component),C=function(n){d(r,n);function r(){return n!==null&&n.apply(this,arguments)||this}return r=z([P({type:"number"})],r),r}(V);export{V as NumberField,C as NumberFieldRenderer}; 2 | -------------------------------------------------------------------------------- /web/src/pages/login/DefaultLogin/bg/style/index.module.css: -------------------------------------------------------------------------------- 1 | .bg { 2 | width: 100%; 3 | height: 100vh; 4 | display: flex; 5 | align-items: center; 6 | justify-content: center; 7 | position: relative; 8 | } 9 | 10 | .waves { 11 | position: absolute; 12 | width: 100%; 13 | height: 15vh; 14 | min-height: 100px; 15 | max-height: 150px; 16 | bottom: 20vh; 17 | } 18 | 19 | .bottom-block { 20 | position: absolute; 21 | width: 100%; 22 | height: 20vh; 23 | bottom: 0; 24 | } 25 | 26 | .parallax > use { 27 | animation: move-forever 25s cubic-bezier(0.55, 0.5, 0.45, 0.5) infinite; 28 | } 29 | 30 | .parallax > use:nth-child(1) { 31 | animation-delay: -2s; 32 | animation-duration: 7s; 33 | } 34 | 35 | .parallax > use:nth-child(2) { 36 | animation-delay: -3s; 37 | animation-duration: 10s; 38 | } 39 | 40 | .parallax > use:nth-child(3) { 41 | animation-delay: -4s; 42 | animation-duration: 13s; 43 | } 44 | 45 | .parallax > use:nth-child(4) { 46 | animation-delay: -5s; 47 | animation-duration: 20s; 48 | } 49 | 50 | @keyframes move-forever { 51 | 0% { 52 | transform: translate3d(-90px, 0, 0); 53 | } 54 | 100% { 55 | transform: translate3d(85px, 0, 0); 56 | } 57 | } 58 | 59 | @media (max-width: 768px) { 60 | .waves { 61 | height: 40px; 62 | min-height: 40px; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /internal/app/admin/middleware/auth.go: -------------------------------------------------------------------------------- 1 | package middleware 2 | 3 | import ( 4 | "amis-base/internal/app/admin/services" 5 | "amis-base/internal/pkg/auth" 6 | "amis-base/internal/pkg/helper" 7 | "amis-base/internal/pkg/response" 8 | "github.com/gofiber/fiber/v2" 9 | "github.com/spf13/viper" 10 | "strings" 11 | ) 12 | 13 | var authService services.Auth 14 | 15 | // Auth 认证中间件 16 | func Auth(ctx *fiber.Ctx) error { 17 | if !viper.GetBool("admin.auth.enabled") { 18 | return ctx.Next() 19 | } 20 | 21 | // 白名单 22 | exclude := viper.GetStringSlice("admin.auth.exclude") 23 | if len(exclude) > 0 { 24 | for _, v := range exclude { 25 | if helper.IsAllowRequest(v, ctx.Method(), ctx.OriginalURL()) { 26 | return ctx.Next() 27 | } 28 | } 29 | } 30 | 31 | // 获取 token 32 | token := strings.Replace(ctx.Get("authorization"), "Bearer ", "", -1) 33 | if token == "" { 34 | return response.UnAuthorized(ctx) 35 | } 36 | 37 | // 查询 token 信息 38 | tokenModel := auth.QueryToken("admin_users", token) 39 | if tokenModel == nil { 40 | return response.UnAuthorized(ctx) 41 | } 42 | 43 | // 查询用户信息 44 | user, err := authService.GetUserById(tokenModel.UserId) 45 | if err != nil { 46 | return response.UnAuthorized(ctx) 47 | } 48 | 49 | // 存储用户信息 50 | ctx.Locals("user", user) 51 | ctx.Locals("token", token) 52 | 53 | // 清除过期 token 54 | go auth.CleanExpiredToken() 55 | 56 | return ctx.Next() 57 | } 58 | -------------------------------------------------------------------------------- /web/dist/assets/JSONSchemaEditor-I6IC2yHC.js: -------------------------------------------------------------------------------- 1 | import{s as c,ao as v,y as i,bR as l,az as f,t as S,f as p,bS as b,z as u,P as g,Q as s,a1 as y}from"./index-BnATMMdj.js";var P=function(n){c(e,n);function e(){return n!==null&&n.apply(this,arguments)||this}return e.prototype.normalizePlaceholder=function(){var t=this.props.placeholder;return v(t)?i(i({},l),f(t,["key","title","description","default","empty"])):l},e.prototype.renderModalProps=function(t,d){var o=this.props,r=o.render,a=o.advancedSettings,m=(a==null?void 0:a[t==null?void 0:t.type])||[];return r("modal",{type:"form",wrapWithPanel:!1,body:m,submitOnChange:!0},{data:t,onSubmit:function(h){return d(h)}})},e.prototype.render=function(){var t=this.props,d=t.enableAdvancedSetting,o=t.mobileUI,r=t.env,a=S(t,["enableAdvancedSetting","mobileUI","env"]);return p.createElement(b,i({},a,{mobileUI:o,placeholder:this.normalizePlaceholder(),enableAdvancedSetting:d,renderModalProps:this.renderModalProps,popOverContainer:o?r==null?void 0:r.getModalContainer:a.popOverContainer||r.getModalContainer}))},e.defaultProps={enableAdvancedSetting:!1,placeholder:l},u([g,s("design:type",Function),s("design:paramtypes",[Object,Function]),s("design:returntype",void 0)],e.prototype,"renderModalProps",null),e}(p.PureComponent),_=function(n){c(e,n);function e(){return n!==null&&n.apply(this,arguments)||this}return e=u([y({type:"json-schema-editor"})],e),e}(P);export{_ as JSONSchemaEditorRenderer,P as default}; 2 | -------------------------------------------------------------------------------- /web/src/routes/helpers.ts: -------------------------------------------------------------------------------- 1 | import lazyload from "@/utils/lazyload" 2 | import {isArray, isString} from '@/utils/common' 3 | 4 | // 路由懒加载 5 | export const componentMount = (routes) => { 6 | const mod = import.meta.glob("../pages/**/[a-z[]*.tsx") 7 | 8 | const travel = (_routes, parents = []) => { 9 | return _routes.map((route) => { 10 | if (route.path && !route.children) { 11 | if (isString(route.component)) { 12 | route.component = lazyload(mod[`../pages/${route.component}/index.tsx`]) 13 | } 14 | } else if (isArray(route.children) && route.children.length) { 15 | route.children = travel(route.children, [...parents, route]) 16 | } 17 | 18 | // 保存父级路由 19 | route.meta.parents = parents 20 | 21 | return route 22 | }) 23 | } 24 | 25 | return travel(routes) 26 | } 27 | 28 | // 获取所有路由 29 | export const getFlattenRoutes = (routes) => { 30 | const flattenRoutes = [] 31 | 32 | const stack = [...routes] 33 | while (stack.length) { 34 | const route = stack.pop() 35 | if (route.path && !route.children) { 36 | flattenRoutes.push(route) 37 | } else if (isArray(route.children) && route.children.length) { 38 | stack.push(...route.children) 39 | } 40 | } 41 | 42 | return flattenRoutes 43 | } 44 | -------------------------------------------------------------------------------- /web/dist/assets/Pagination-Huoc9U1q.js: -------------------------------------------------------------------------------- 1 | import{s as f,v as c,w as v,E as P,G as m,f as l,a_ as y,y as b,z as h,P as _,Q as g,D as N,a3 as C}from"./index-BnATMMdj.js";var x=function(n){f(t,n);function t(){return n!==null&&n.apply(this,arguments)||this}return t.prototype.formatNumber=function(e,r){var a=void 0;return typeof e=="string"?(e=c(e)?v(e,this.props.data):e,a=typeof e=="string"?parseInt(e,10):e):typeof e=="number"&&(a=e),typeof a=="number"&&!isNaN(a)?a:r},t.prototype.onPageChange=function(e,r,a){return P(this,void 0,void 0,function(){var i,o,s,u,p;return m(this,function(d){switch(d.label){case 0:return i=this.props,o=i.onPageChange,s=i.dispatchEvent,u=i.data,[4,s==null?void 0:s("change",C(u,{page:e,perPage:r}))];case 1:return p=d.sent(),p!=null&&p.prevented?[2]:(o==null||o(e,r,a),[2])}})})},t.prototype.render=function(){var e=this.props,r=e.maxButtons,a=e.activePage,i=e.total,o=e.perPage;return l.createElement(y,b({},this.props,{onPageChange:this.onPageChange,maxButtons:this.formatNumber(r),activePage:this.formatNumber(a),total:this.formatNumber(i),perPage:this.formatNumber(o)}))},h([_,g("design:type",Function),g("design:paramtypes",[Number,Number,String]),g("design:returntype",Promise)],t.prototype,"onPageChange",null),t}(l.Component),R=function(n){f(t,n);function t(){return n!==null&&n.apply(this,arguments)||this}return t=h([N({type:"pagination",alias:["pager"],name:"pagination"})],t),t}(x);export{R as PaginationRenderer,x as default}; 2 | -------------------------------------------------------------------------------- /web/src/layouts/TopLayout/index.tsx: -------------------------------------------------------------------------------- 1 | import {Layout} from 'antd' 2 | import LayoutLogo from '@/layouts/components/LayoutLogo' 3 | import LayoutContent from '@/layouts/components/LayoutContent' 4 | import LayoutTopBar from '@/layouts/components/LayoutTopBar' 5 | import useSetting from '@/hooks/useSetting' 6 | import LayoutTopMenu from '@/layouts/components/LayoutMenu/top' 7 | 8 | const {Header, Content} = Layout 9 | 10 | // 顶部布局 11 | const TopLayout = () => { 12 | const {getSetting} = useSetting() 13 | 14 | const darkTop = () => { 15 | return getSetting('theme.topTheme') == 'dark' && !getSetting('theme.darkTheme') 16 | } 17 | 18 | const border = darkTop() ? '' : 'border-b' 19 | 20 | return ( 21 | 22 |
23 |
24 | 25 |
26 | 27 |
28 |
29 | 30 |
31 | 32 | 33 | 34 |
35 | ) 36 | } 37 | 38 | export default TopLayout 39 | -------------------------------------------------------------------------------- /web/dist/assets/InputVerificationCode-Cf2jnK1M.js: -------------------------------------------------------------------------------- 1 | import{s as g,E as h,G as l,f,d0 as y,y as u,w as C,z as p,P as v,Q as s,a1 as m}from"./index-BnATMMdj.js";var _=function(e){g(n,e);function n(){return e!==null&&e.apply(this,arguments)||this}return n.prototype.onFinish=function(r){return h(this,void 0,void 0,function(){var t,i,d,o;return l(this,function(a){switch(a.label){case 0:return t=this.props,i=t.dispatchEvent,d=t.data,[4,i("finish",u(u({},d),{value:r}),this)];case 1:return o=a.sent(),o!=null&&o.prevented?[2]:[2]}})})},n.prototype.onChange=function(r){return h(this,void 0,void 0,function(){var t,i,d,o,a;return l(this,function(c){switch(c.label){case 0:return t=this.props,i=t.onChange,d=t.data,o=t.dispatchEvent,[4,o("change",u(u({},d),{value:r}))];case 1:return a=c.sent(),a!=null&&a.prevented?[2]:(i==null||i(r),[2])}})})},n.prototype.render=function(){var r=this.props.separator;return f.createElement(y,u({},this.props,{separator:typeof r=="string"?function(t){return C(r,t)}:function(){},onFinish:this.onFinish,onChange:this.onChange}))},p([v,s("design:type",Function),s("design:paramtypes",[String]),s("design:returntype",Promise)],n.prototype,"onFinish",null),p([v,s("design:type",Function),s("design:paramtypes",[String]),s("design:returntype",Promise)],n.prototype,"onChange",null),n}(f.Component),F=function(e){g(n,e);function n(){return e!==null&&e.apply(this,arguments)||this}return n=p([m({type:"input-verification-code"})],n),n}(_);export{F as VerificationCodeControlRenderer,_ as default}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/pla-CjnFlu4u.js: -------------------------------------------------------------------------------- 1 | var e={comments:{lineComment:"#"},brackets:[["[","]"],["<",">"],["(",")"]],autoClosingPairs:[{open:"[",close:"]"},{open:"<",close:">"},{open:"(",close:")"}],surroundingPairs:[{open:"[",close:"]"},{open:"<",close:">"},{open:"(",close:")"}]},o={defaultToken:"",tokenPostfix:".pla",brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"<",close:">",token:"delimiter.angle"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:[".i",".o",".mv",".ilb",".ob",".label",".type",".phase",".pair",".symbolic",".symbolic-output",".kiss",".p",".e",".end"],comment:/#.*$/,identifier:/[a-zA-Z]+[a-zA-Z0-9_\-]*/,plaContent:/[01\-~\|]+/,tokenizer:{root:[{include:"@whitespace"},[/@comment/,"comment"],[/\.([a-zA-Z_\-]+)/,{cases:{"@eos":{token:"keyword.$1"},"@keywords":{cases:{".type":{token:"keyword.$1",next:"@type"},"@default":{token:"keyword.$1",next:"@keywordArg"}}},"@default":{token:"keyword.$1"}}}],[/@identifier/,"identifier"],[/@plaContent/,"string"]],whitespace:[[/[ \t\r\n]+/,""]],type:[{include:"@whitespace"},[/\w+/,{token:"type",next:"@pop"}]],keywordArg:[[/[ \t\r\n]+/,{cases:{"@eos":{token:"",next:"@pop"},"@default":""}}],[/@comment/,"comment","@pop"],[/[<>()\[\]]/,{cases:{"@eos":{token:"@brackets",next:"@pop"},"@default":"@brackets"}}],[/\-?\d+/,{cases:{"@eos":{token:"number",next:"@pop"},"@default":"number"}}],[/@identifier/,{cases:{"@eos":{token:"identifier",next:"@pop"},"@default":"identifier"}}],[/[;=]/,{cases:{"@eos":{token:"delimiter",next:"@pop"},"@default":"delimiter"}}]]}};export{e as conf,o as language}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/Steps-DCfnoXF1.js: -------------------------------------------------------------------------------- 1 | import{w as R,v as E,ai as U,bd as j,y as d,dX as F,f as l,dq as L,bP as T,s as _,t as q,aF as z,z as K,D as O,K as W}from"./index-BnATMMdj.js";function X(e){var a,r=e.className,u=e.style,f=e.steps,n=e.status,h=e.mode,C=e.iconPosition,V=e.labelPlacement,w=e.progressDot,c=e.data,I=e.source,N=e.render,x=e.mobileUI,b=R(I,c,"| raw"),p=(Array.isArray(b)?b:void 0)||f||[],s=E(n)?R(n,c,"| raw"):n,v=function(t){return typeof t=="string"?W(t,c):t&&N("inner",t)},i=(a=U(e))!==null&&a!==void 0?a:0,y=typeof i=="string"&&isNaN(+i)?j(i,c)||i:+i,S=p.findIndex(function(t){return t.value&&t.value===y}),P=S!==-1?S:y,D=p.map(function(t,m){var o=A(t,m);return d(d({},t),{status:o,title:v(t.title),subTitle:v(t.subTitle),description:v(t.description)})});function A(t,m){var o;if(typeof s=="string")m===P&&(o=s||n||F.process);else if(typeof s=="object"){var g=t.value;g&&s[g]&&(o=s[g])}return o}return l.createElement(L,{current:P,steps:D,className:r,style:u,status:s,mode:h,iconPosition:C,progressDot:w,labelPlacement:V,mobileUI:x})}var $=T()(function(e){_(a,e);function a(){return e!==null&&e.apply(this,arguments)||this}return a.prototype.render=function(){var r=this.props,u=r.config;r.deferLoad,r.loading,r.updateConfig;var f=q(r,["config","deferLoad","loading","updateConfig"]),n=z(u)?u:null;return l.createElement(X,d({},f,n))},a}(l.Component)),G=function(e){_(a,e);function a(){return e!==null&&e.apply(this,arguments)||this}return a.prototype.render=function(){return l.createElement($,d({},this.props))},a=K([O({type:"steps"})],a),a}(l.Component);export{X as StepsCmpt,G as StepsRenderer}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/scheme-Dhb-2j9p.js: -------------------------------------------------------------------------------- 1 | var e={comments:{lineComment:";",blockComment:["#|","|#"]},brackets:[["(",")"],["{","}"],["[","]"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}]},o={defaultToken:"",ignoreCase:!0,tokenPostfix:".scheme",brackets:[{open:"(",close:")",token:"delimiter.parenthesis"},{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"}],keywords:["case","do","let","loop","if","else","when","cons","car","cdr","cond","lambda","lambda*","syntax-rules","format","set!","quote","eval","append","list","list?","member?","load"],constants:["#t","#f"],operators:["eq?","eqv?","equal?","and","or","not","null?"],tokenizer:{root:[[/#[xXoObB][0-9a-fA-F]+/,"number.hex"],[/[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?/,"number.float"],[/(?:\b(?:(define|define-syntax|define-macro))\b)(\s+)((?:\w|\-|\!|\?)*)/,["keyword","white","variable"]],{include:"@whitespace"},{include:"@strings"},[/[a-zA-Z_#][a-zA-Z0-9_\-\?\!\*]*/,{cases:{"@keywords":"keyword","@constants":"constant","@operators":"operators","@default":"identifier"}}]],comment:[[/[^\|#]+/,"comment"],[/#\|/,"comment","@push"],[/\|#/,"comment","@pop"],[/[\|#]/,"comment"]],whitespace:[[/[ \t\r\n]+/,"white"],[/#\|/,"comment","@comment"],[/;.*$/,"comment"]],strings:[[/"$/,"string","@popall"],[/"(?=.)/,"string","@multiLineString"]],multiLineString:[[/[^\\"]+$/,"string","@popall"],[/[^\\"]+/,"string"],[/\\./,"string.escape"],[/"/,"string","@popall"],[/\\$/,"string"]]}};export{e as conf,o as language}; 2 | -------------------------------------------------------------------------------- /web/src/layouts/components/LayoutLogo/index.tsx: -------------------------------------------------------------------------------- 1 | import {Image} from 'antd' 2 | import useSettings from '@/hooks/useSetting' 3 | 4 | // Logo 5 | const LayoutLogo = ({onlyLogo = false}) => { 6 | const {getSetting} = useSettings() 7 | 8 | // Logo 宽度 9 | const width = onlyLogo ? ' w-full' : ' w-[220px]' 10 | 11 | // 文字颜色 12 | const textColor = () => { 13 | if (getSetting('theme.darkTheme')) { 14 | return 'text-[var(--colors-neutral-text-1)]' 15 | } 16 | 17 | if (getSetting('theme.topTheme') === 'dark' && getSetting('theme.layoutMode') == 'top-mix') { 18 | return 'text-white' 19 | } 20 | 21 | if (getSetting('theme.topTheme') === 'dark' && getSetting('theme.layoutMode') == 'top') { 22 | return 'text-white' 23 | } 24 | 25 | if (getSetting('theme.siderTheme') === 'dark' && getSetting('theme.layoutMode') == 'default') { 26 | return 'text-white' 27 | } 28 | 29 | return 'text-[var(--colors-neutral-text-1)]' 30 | } 31 | 32 | return ( 33 |
34 | {getSetting('logo') && 35 |
36 | 37 |
38 | } 39 | {onlyLogo || 40 |
{getSetting('appName')}
} 41 |
42 | ) 43 | } 44 | 45 | export default LayoutLogo 46 | -------------------------------------------------------------------------------- /internal/app/admin/models/admin_user.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "amis-base/internal/app/admin/types" 5 | base "amis-base/internal/models" 6 | "amis-base/internal/pkg/helper" 7 | "github.com/duke-git/lancet/v2/slice" 8 | ) 9 | 10 | type AdminUser struct { 11 | base.BaseModel 12 | 13 | Username string `gorm:"unique;type:varchar(255);not null" json:"username"` 14 | Password string `gorm:"type:varchar(255);not null;" json:"-"` 15 | Name string `gorm:"type:varchar(255);not null" json:"name"` 16 | Avatar string `gorm:"type:varchar(255);not null" json:"avatar"` 17 | Enabled int `gorm:"type:tinyint(1);default:1;not null" json:"enabled"` 18 | Roles []AdminRole `gorm:"many2many:admin_user_role;" json:"roles"` 19 | } 20 | 21 | // IsSuperAdmin 判断是否是超级管理员 22 | func (u *AdminUser) IsSuperAdmin() bool { 23 | return slice.Some(u.Roles, func(index int, item AdminRole) bool { 24 | return item.Sign == types.SuperAdminSign 25 | }) 26 | } 27 | 28 | // Permissions 获取用户权限 29 | func (u *AdminUser) Permissions() []AdminPermission { 30 | result := make([]AdminPermission, 0) 31 | for _, role := range u.Roles { 32 | for _, permission := range role.Permissions { 33 | result = append(result, permission) 34 | } 35 | } 36 | 37 | return result 38 | } 39 | 40 | // PermissionApiRules 获取用户权限的 api 规则 41 | func (u *AdminUser) PermissionApiRules() []string { 42 | result := make([]string, 0) 43 | permissions := u.Permissions() 44 | for _, permission := range permissions { 45 | result = append(result, helper.JsonDecode[[]string](permission.Api)...) 46 | } 47 | 48 | return result 49 | } 50 | -------------------------------------------------------------------------------- /web/dist/assets/Plain-CXH7djtw.js: -------------------------------------------------------------------------------- 1 | import{s as v,a3 as l,ai as C,f as d,K as M,z as o,P as c,Q as a,D as P}from"./index-BnATMMdj.js";var _=function(i){v(t,i);function t(){return i!==null&&i.apply(this,arguments)||this}return t.prototype.handleClick=function(e){var n=this.props,r=n.dispatchEvent,s=n.data;r("click",l(s,{nativeEvent:e}))},t.prototype.handleMouseEnter=function(e){var n=this.props,r=n.dispatchEvent,s=n.data;r(e,l(s,{nativeEvent:e}))},t.prototype.handleMouseLeave=function(e){var n=this.props,r=n.dispatchEvent,s=n.data;r(e,l(s,{nativeEvent:e}))},t.prototype.render=function(){var e=this.props,n=e.className,r=e.style,s=e.wrapperComponent,u=e.text,y=e.data,h=e.tpl,m=e.inline,f=e.placeholder,E=e.classnames,p=C(this.props),g=s||(m?"span":"div");return d.createElement(g,{className:E("PlainField",n),style:r,onClick:this.handleClick,onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave},h||u?M(h||u,y):typeof p>"u"||p===""||p===null?d.createElement("span",{className:"text-muted"},f):String(p))},t.defaultProps={wrapperComponent:"",inline:!0,placeholder:"-"},o([c,a("design:type",Function),a("design:paramtypes",[Object]),a("design:returntype",void 0)],t.prototype,"handleClick",null),o([c,a("design:type",Function),a("design:paramtypes",[Object]),a("design:returntype",void 0)],t.prototype,"handleMouseEnter",null),o([c,a("design:type",Function),a("design:paramtypes",[Object]),a("design:returntype",void 0)],t.prototype,"handleMouseLeave",null),t}(d.Component),b=function(i){v(t,i);function t(){return i!==null&&i.apply(this,arguments)||this}return t=o([P({type:"plain",alias:["text"],name:"plain"})],t),t}(_);export{_ as Plain,b as PlainRenderer}; 2 | -------------------------------------------------------------------------------- /config/config.example.yaml: -------------------------------------------------------------------------------- 1 | app: 2 | # 应用名称 3 | name: "amisBase" 4 | # logo 5 | logo: "/logo.png" 6 | # 端口 7 | port: 8080 8 | # 开发模式 9 | dev: true 10 | 11 | # 数据库配置 12 | database: 13 | driver: "mysql" 14 | dsn: "root:root@tcp(127.0.0.1:3306)/amis_base?charset=utf8mb4&parseTime=True&loc=Local" 15 | # 是否自动迁移 16 | migrate: true 17 | 18 | # 缓存配置 19 | cache: 20 | driver: "memory" 21 | prefix: "amisbase:" 22 | # 配置 23 | options: 24 | # 内存 25 | memory: 26 | # 缓存过期时间 27 | gc_interval: 10 28 | # redis 29 | redis: 30 | host: "127.0.0.1" 31 | port: 6379 32 | username: "" 33 | password: "" 34 | database: 0 35 | reset: false 36 | pool_size: 10 37 | 38 | # 面板配置 39 | admin: 40 | # api 前缀 41 | api_prefix: "/admin-api" 42 | # 认证配置 43 | auth: 44 | # 是否启用 45 | enabled: true 46 | # 单点登录 47 | single_sign_on: false 48 | # token 过期时间 (秒) 为 0 时不生成永不过期 49 | token_expire: 86400 50 | # 白名单: 请求方式 + 注册时的路由(支持正则) 51 | # [请求方式] : [接口路径] 52 | exclude: 53 | # 示例: 54 | # /system/users (任意请求方式) 55 | # get:/system/permmission 56 | # post:/system/menus 57 | # 使用正则匹配: 58 | # ^post:/system/menus 59 | - "get:/login" 60 | - "post:/login" 61 | - "get:/settings" 62 | # 鉴权 63 | permission: 64 | # 是否启用 65 | enabled: true 66 | # 白名单 67 | exclude: 68 | - "get:/user" 69 | - "get:/menus" 70 | - "get:/login" 71 | - "post:/login" 72 | - "get:/logout" 73 | - "get:/settings" 74 | - "get:/page_schema" 75 | - "get:/permissions" 76 | -------------------------------------------------------------------------------- /internal/pkg/db/db.go: -------------------------------------------------------------------------------- 1 | package db 2 | 3 | import ( 4 | "github.com/spf13/viper" 5 | "gorm.io/driver/mysql" 6 | "gorm.io/gorm" 7 | "gorm.io/gorm/logger" 8 | "log" 9 | "os" 10 | "sync" 11 | "time" 12 | ) 13 | 14 | var ( 15 | db *gorm.DB 16 | once sync.Once 17 | ) 18 | 19 | func Bootstrap() { 20 | Connect() 21 | 22 | if viper.GetBool("database.migrate") { 23 | Migration() 24 | } 25 | } 26 | 27 | func Connect() { 28 | once.Do(func() { 29 | var err error 30 | 31 | driver := viper.GetString("database.driver") 32 | 33 | switch driver { 34 | case "mysql": 35 | db, err = gorm.Open(mysql.Open(viper.GetString("database.dsn")), &gorm.Config{ 36 | DisableForeignKeyConstraintWhenMigrating: true, 37 | Logger: getLogger(), 38 | }) 39 | default: 40 | log.Fatal("Unsupported database driver: " + driver) 41 | } 42 | 43 | if err != nil { 44 | log.Fatal("Failed to connect to database: " + err.Error()) 45 | } 46 | }) 47 | } 48 | 49 | func Query() *gorm.DB { 50 | if db == nil { 51 | log.Fatal("Database connection not initialized") 52 | } 53 | 54 | return db 55 | } 56 | 57 | func getLogger() logger.Interface { 58 | logLevel := logger.Silent 59 | 60 | // 开发时打印所有 SQL 61 | if viper.GetBool("app.dev") { 62 | logLevel = logger.Info 63 | } 64 | 65 | return logger.New( 66 | log.New(os.Stdout, "\r\n", log.Flags()), 67 | logger.Config{ 68 | SlowThreshold: 5 * time.Second, 69 | Colorful: true, 70 | IgnoreRecordNotFoundError: true, 71 | ParameterizedQueries: false, 72 | LogLevel: logLevel, 73 | }, 74 | ) 75 | } 76 | -------------------------------------------------------------------------------- /web/dist/assets/InputMonthRange-BGY4lN2M.js: -------------------------------------------------------------------------------- 1 | import{s as D,t as R,f as h,ag as M,c1 as _,y as I,aV as v,c2 as g,z as y,aZ as P,Q as m,a1 as b}from"./index-BnATMMdj.js";import E from"./InputDateRange-BZtgtncR.js";var N=function(e){D(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.render=function(){var a=this.props,F=a.className;a.style;var l=a.classPrefix,u=a.minDate,d=a.maxDate,p=a.minDuration,c=a.maxDuration,o=a.data,r=a.format,f=a.mobileUI,i=a.valueFormat,x=a.inputFormat,C=a.displayFormat,n=a.env,s=R(a,["className","style","classPrefix","minDate","maxDate","minDuration","maxDuration","data","format","mobileUI","valueFormat","inputFormat","displayFormat","env"]);return h.createElement("div",{className:M("".concat(l,"DateRangeControl"),F)},h.createElement(_,I({viewMode:"months",mobileUI:f,valueFormat:i||r,displayFormat:C||x,classPrefix:l,popOverContainer:f?n==null?void 0:n.getModalContainer:s.popOverContainer||n.getModalContainer,popOverContainerSelector:s.popOverContainerSelector,onRef:this.getRef,data:o},s,{minDate:u?v(u,o,i||r):void 0,maxDate:d?v(d,o,i||r):void 0,minDuration:p?g(p):void 0,maxDuration:c?g(c):void 0,onChange:this.handleChange,onFocus:this.dispatchEvent,onBlur:this.dispatchEvent})))},y([P(),m("design:type",Function),m("design:paramtypes",[]),m("design:returntype",void 0)],t.prototype,"render",null),t}(E),Y=function(e){D(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.defaultProps={format:"X",inputFormat:"YYYY-MM",joinValues:!0,delimiter:",",ranges:"",shortcuts:"thismonth,prevmonth",animation:!0},t=y([b({type:"input-month-range"})],t),t}(N);export{Y as MonthRangeControlRenderer,N as default}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/InputYearRange-B5h5BtYP.js: -------------------------------------------------------------------------------- 1 | import{s as D,t as R,f as v,ag as _,c1 as Y,y as I,aV as g,c2 as y,z as h,aZ as P,Q as m,a1 as b}from"./index-BnATMMdj.js";import E from"./InputDateRange-BZtgtncR.js";var N=function(t){D(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.render=function(){var a=this.props,F=a.className;a.style;var l=a.classPrefix,u=a.minDate,d=a.maxDate,p=a.minDuration,c=a.maxDuration,r=a.data,o=a.format,f=a.mobileUI,i=a.valueFormat,x=a.inputFormat,C=a.displayFormat,n=a.env,s=R(a,["className","style","classPrefix","minDate","maxDate","minDuration","maxDuration","data","format","mobileUI","valueFormat","inputFormat","displayFormat","env"]);return v.createElement("div",{className:_("".concat(l,"DateRangeControl"),F)},v.createElement(Y,I({viewMode:"years",mobileUI:f,valueFormat:i||o,displayFormat:C||x,classPrefix:l,popOverContainer:f?n==null?void 0:n.getModalContainer:s.popOverContainer||n.getModalContainer,popOverContainerSelector:s.popOverContainerSelector,onRef:this.getRef,data:r},s,{minDate:u?g(u,r,i||o):void 0,maxDate:d?g(d,r,i||o):void 0,minDuration:p?y(p):void 0,maxDuration:c?y(c):void 0,onChange:this.handleChange,onFocus:this.dispatchEvent,onBlur:this.dispatchEvent})))},h([P(),m("design:type",Function),m("design:paramtypes",[]),m("design:returntype",void 0)],e.prototype,"render",null),e}(E),M=function(t){D(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.defaultProps={format:"X",inputFormat:"YYYY",joinValues:!0,delimiter:",",ranges:"thisyear,prevyear",shortcuts:"thisyear,prevyear",animation:!0},e=h([b({type:"input-year-range"})],e),e}(N);export{M as YearRangeControlRenderer,N as default}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/flow9-Cac8vKd7.js: -------------------------------------------------------------------------------- 1 | var e={comments:{blockComment:["/*","*/"],lineComment:"//"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string"]},{open:"[",close:"]",notIn:["string"]},{open:"(",close:")",notIn:["string"]},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}]},o={defaultToken:"",tokenPostfix:".flow",keywords:["import","require","export","forbid","native","if","else","cast","unsafe","switch","default"],types:["io","mutable","bool","int","double","string","flow","void","ref","true","false","with"],operators:["=",">","<","<=",">=","==","!","!=",":=","::=","&&","||","+","-","*","/","@","&","%",":","->","\\","$","??","^"],symbols:/[@$=>](?!@symbols)/,"delimiter"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]]}};export{e as conf,o as language}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/sb-BYAiYHFx.js: -------------------------------------------------------------------------------- 1 | var e={comments:{lineComment:"'"},brackets:[["(",")"],["[","]"],["If","EndIf"],["While","EndWhile"],["For","EndFor"],["Sub","EndSub"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]}]},o={defaultToken:"",tokenPostfix:".sb",ignoreCase:!0,brackets:[{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"keyword.tag-if",open:"If",close:"EndIf"},{token:"keyword.tag-while",open:"While",close:"EndWhile"},{token:"keyword.tag-for",open:"For",close:"EndFor"},{token:"keyword.tag-sub",open:"Sub",close:"EndSub"}],keywords:["Else","ElseIf","EndFor","EndIf","EndSub","EndWhile","For","Goto","If","Step","Sub","Then","To","While"],tagwords:["If","Sub","While","For"],operators:[">","<","<>","<=",">=","And","Or","+","-","*","/","="],identifier:/[a-zA-Z_][\w]*/,symbols:/[=><:+\-*\/%\.,]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[{include:"@whitespace"},[/(@identifier)(?=[.])/,"type"],[/@identifier/,{cases:{"@keywords":{token:"keyword.$0"},"@operators":"operator","@default":"variable.name"}}],[/([.])(@identifier)/,{cases:{$2:["delimiter","type.member"],"@default":""}}],[/\d*\.\d+/,"number.float"],[/\d+/,"number"],[/[()\[\]]/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":"delimiter"}}],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"]],whitespace:[[/[ \t\r\n]+/,""],[/(\').*$/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"C?/,"string","@pop"]]}};export{e as conf,o as language}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/InputQuarterRange-U7yCLGPa.js: -------------------------------------------------------------------------------- 1 | import{s as h,t as R,f as v,ag as _,c1 as Q,y as q,aV as g,c2 as D,z as y,aZ as I,Q as u,a1 as P}from"./index-BnATMMdj.js";import b from"./InputDateRange-BZtgtncR.js";var E=function(e){h(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.render=function(){var a=this.props,F=a.className;a.style;var m=a.classPrefix,l=a.minDate,d=a.maxDate,p=a.minDuration,c=a.maxDuration,n=a.data,o=a.format,i=a.valueFormat,x=a.inputFormat,C=a.displayFormat,r=a.env,f=a.mobileUI,s=R(a,["className","style","classPrefix","minDate","maxDate","minDuration","maxDuration","data","format","valueFormat","inputFormat","displayFormat","env","mobileUI"]);return v.createElement("div",{className:_("".concat(m,"DateRangeControl"),F)},v.createElement(Q,q({viewMode:"quarters",mobileUI:f,valueFormat:i||o,displayFormat:C||x,classPrefix:m,popOverContainer:f?r==null?void 0:r.getModalContainer:s.popOverContainer||r.getModalContainer,popOverContainerSelector:s.popOverContainerSelector,onRef:this.getRef,data:n},s,{minDate:l?g(l,n,i||o):void 0,maxDate:d?g(d,n,i||o):void 0,minDuration:p?D(p):void 0,maxDuration:c?D(c):void 0,onChange:this.handleChange,onFocus:this.dispatchEvent,onBlur:this.dispatchEvent})))},y([I(),u("design:type",Function),u("design:paramtypes",[]),u("design:returntype",void 0)],t.prototype,"render",null),t}(b),U=function(e){h(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.defaultProps={format:"X",inputFormat:"YYYY-[Q]Q",joinValues:!0,delimiter:",",ranges:"thisquarter,prevquarter",shortcuts:"thisquarter,prevquarter",animation:!0},t=y([P({type:"input-quarter-range"})],t),t}(E);export{U as QuarterRangeControlRenderer,E as default}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/Icon-BAwkSKpW.js: -------------------------------------------------------------------------------- 1 | import{s as y,K as g,f as p,L as C,y as i,ad as m,ae as E,z as d,P as h,Q as n,D as _,$ as M}from"./index-BnATMMdj.js";var N=function(s){y(e,s);function e(){return s!==null&&s.apply(this,arguments)||this}return e.prototype.handleClick=function(t){var a=this.props,o=a.dispatchEvent,r=a.data;o(t,r)},e.prototype.handleMouseEnter=function(t){var a=this.props,o=a.dispatchEvent,r=a.data;o(t,r)},e.prototype.handleMouseLeave=function(t){var a=this.props,o=a.dispatchEvent,r=a.data;o(t,r)},e.prototype.render=function(){var t=this.props,a=t.classnames,o=t.className,r=t.data,c=t.id,u=t.themeCss,v=t.env,f=t.wrapperCustomStyle,l=this.props.icon;return typeof l=="string"&&(l=g(this.props.icon,r)),p.createElement(p.Fragment,null,p.createElement(C,i({},this.props,{icon:l,onClick:this.handleClick,onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave,className:a(o,m(i(i({},this.props),{name:"className",id:c,themeCss:u})),m(i(i({},this.props),{name:"wrapperCustomStyle",id:c,themeCss:f})))})),p.createElement(E,i({},this.props,{config:{themeCss:u,classNames:[{key:"className"}],id:c},env:v})))},e.defaultProps={icon:"",vendor:"fa"},d([h,n("design:type",Function),n("design:paramtypes",[Object]),n("design:returntype",void 0)],e.prototype,"handleClick",null),d([h,n("design:type",Function),n("design:paramtypes",[Object]),n("design:returntype",void 0)],e.prototype,"handleMouseEnter",null),d([h,n("design:type",Function),n("design:paramtypes",[Object]),n("design:returntype",void 0)],e.prototype,"handleMouseLeave",null),e}(p.Component),I=function(s){y(e,s);function e(){return s!==null&&s.apply(this,arguments)||this}return e=d([_({type:"icon"}),M],e),e}(N);export{N as Icon,I as IconRenderer}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/bat-DPkNLes8.js: -------------------------------------------------------------------------------- 1 | var e={comments:{lineComment:"REM"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],surroundingPairs:[{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],folding:{markers:{start:new RegExp("^\\s*(::\\s*|REM\\s+)#region"),end:new RegExp("^\\s*(::\\s*|REM\\s+)#endregion")}}},s={defaultToken:"",ignoreCase:!0,tokenPostfix:".bat",brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"}],keywords:/call|defined|echo|errorlevel|exist|for|goto|if|pause|set|shift|start|title|not|pushd|popd/,symbols:/[=>i.map(i=>d[i]); 2 | import{s as h,ai as l,v as u,w as f,V as m,E as v,G as _,f as p,ds as w,z as y,D as C,o as k,X as E}from"./index-BnATMMdj.js";function g(){return k(()=>import("./Markdown-tyIr7GBT.js"),__vite__mapDeps([0,1,2])).then(function(o){return o.default})}var M=function(o){h(n,o);function n(e){var t=o.call(this,e)||this,a=t.props,r=a.name,i=a.data,s=a.src;if(s)t.state={content:""},t.updateContent();else{var c=l(t.props)||(r&&u(r)?f(r,i,"| raw"):null);t.state={content:c}}return t}return n.prototype.componentDidUpdate=function(e){var t=this.props;t.src?m(e.src,t.src,e.data,t.data)&&this.updateContent():this.updateContent()},n.prototype.updateContent=function(){return v(this,void 0,void 0,function(){var e,t,a,r,i,s,c;return _(this,function(d){switch(d.label){case 0:return e=this.props,t=e.name,a=e.data,r=e.src,i=e.env,r&&E(r,a)?[4,i.fetcher(r,a)]:[3,2];case 1:return s=d.sent(),typeof s=="string"?this.setState({content:s}):typeof s=="object"&&s.data?this.setState({content:s.data}):console.error("markdown response error",s),[3,3];case 2:c=l(this.props)||(t&&u(t)?f(t,a,"| raw"):null),c!==this.state.content&&this.setState({content:c}),d.label=3;case 3:return[2]}})})},n.prototype.render=function(){var e=this.props,t=e.className,a=e.style,r=e.classnames,i=e.options;return p.createElement("div",{className:r("Markdown",t),style:a},p.createElement(w,{getComponent:g,content:this.state.content||"",options:i}))},n}(p.Component),V=function(o){h(n,o);function n(){return o!==null&&o.apply(this,arguments)||this}return n=y([C({type:"markdown"})],n),n}(M);export{M as Markdown,V as MarkdownRenderer}; 3 | -------------------------------------------------------------------------------- /web/dist/assets/Card2-CdJviqzH.js: -------------------------------------------------------------------------------- 1 | import{s as k,f as d,b4 as u,t as y,b2 as b,z as m,P as C,Q as c,D as f}from"./index-BnATMMdj.js";var v=function(n){k(t,n);function t(){return n!==null&&n.apply(this,arguments)||this}return t.prototype.handleClick=function(e){var a=this.props,s=a.checkOnItemClick,r=a.selectable;s&&r&&this.handleCheck()},t.prototype.handleCheck=function(){var e,a;(a=(e=this.props).onCheck)===null||a===void 0||a.call(e)},t.prototype.renderCheckbox=function(){var e=this.props,a=e.selectable,s=e.classnames,r=e.multiple,l=e.disabled,o=e.selected,i=e.hideCheckToggler,p=e.checkOnItemClick,h=e.checkboxClassname;return!a||p&&i?null:d.createElement(u,{className:s("Card2-checkbox",h),type:r?"checkbox":"radio",disabled:l,checked:o,onChange:this.handleCheck})},t.prototype.renderBody=function(){var e=this.props,a=e.body,s=e.render,r=e.classnames,l=e.bodyClassName,o=y(e,["body","render","classnames","bodyClassName"]);return d.createElement("div",{className:r("Card2-body",l),onClick:this.handleClick},a?s("body",a,o):null)},t.prototype.render=function(){var e=this.props,a=e.className,s=e.wrapperComponent,r=e.classnames,l=e.style,o=e.item,i=e.selected,p=e.checkOnItemClick,h=s||"div";return d.createElement(h,{className:r("Card2",a,{checkOnItem:p,"is-checked":i}),style:b(l,o)},this.renderBody(),this.renderCheckbox())},t.propsList=["body","className"],t.defaultProps={className:""},m([C,c("design:type",Function),c("design:paramtypes",[Object]),c("design:returntype",void 0)],t.prototype,"handleClick",null),m([C,c("design:type",Function),c("design:paramtypes",[]),c("design:returntype",void 0)],t.prototype,"handleCheck",null),t}(d.Component),x=function(n){k(t,n);function t(){return n!==null&&n.apply(this,arguments)||this}return t=m([f({type:"card2"})],t),t}(v);export{x as Card2Renderer,v as default}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/Divider-Dv3VlEvb.js: -------------------------------------------------------------------------------- 1 | import{s as y,v as P,w as R,ad as N,y as i,f as o,ae as S,z as k,D as E}from"./index-BnATMMdj.js";var W=function(r){y(t,r);function t(){return r!==null&&r.apply(this,arguments)||this}return t.prototype.render=function(){var e=this.props,D=e.render,f=e.classnames,g=e.className,u=e.style,n=u===void 0?{}:u,p=e.lineStyle,l=e.direction,s=e.color,C=e.rotate,a=e.title,x=e.titleClassName,d=e.titlePosition,c=e.id,m=e.themeCss,b=e.env,w=e.data,v={};s&&(~(s==null?void 0:s.indexOf("linear-gradient"))?v.borderImage=s+" 10":v.borderColor=s);var h=(n==null?void 0:n.transform)||"";C&&(h+=" rotate(".concat(C,"deg)")),P(a)&&(a=R(a,w));var _=f("Divider",p?"Divider--".concat(p):"",l==="vertical"?"Divider--vertical":"Divider--horizontal",a&&l!=="vertical"?"Divider--with-text":"",a&&l!=="vertical"&&d?"Divider--with-text-".concat(d):"",a&&l!=="vertical"?N(i(i({},this.props),{name:"titleWrapperControlClassName",id:c,themeCss:m})):"",g);return o.createElement("div",{className:_,style:i(i(i({},n),v),{transform:h})},a&&l!=="vertical"?o.createElement("span",{className:f("Divider-text Divider-text-".concat(d," ").concat(x),N(i(i({},this.props),{name:"titleControlClassName",id:c,themeCss:m})))},D("title",a)):null,o.createElement(S,i({},this.props,{config:{themeCss:m,classNames:[{key:"titleWrapperControlClassName",weights:{default:{suf:"::before",important:!0}}},{key:"titleWrapperControlClassName",weights:{default:{suf:"::after",important:!0}}},{key:"titleControlClassName",weights:{default:{important:!0}}}],id:c},env:b})))},t.defaultProps={className:"",lineStyle:"solid",titleClassName:"",titlePosition:"center"},t}(o.Component),V=function(r){y(t,r);function t(){return r!==null&&r.apply(this,arguments)||this}return t=k([E({type:"divider"})],t),t}(W);export{V as DividerRenderer,W as default}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/Grid2D-cbA2QjFi.js: -------------------------------------------------------------------------------- 1 | import{s as w,a5 as R,f,y as m,z as G,D as x}from"./index-BnATMMdj.js";var _={left:"start",right:"end",center:"center",auto:"stretch"},C={top:"start",bottom:"end",middle:"center",auto:"stretch"},b=function(o){w(e,o);function e(t){return o.call(this,t)||this}return e.prototype.renderChild=function(t,a){var i=this.props,n=i.render,s=i.disabled;return n(t,a,{disabled:s})},e.prototype.renderGrid=function(t,a,i){var n=this.props,s=n.itemRender,l=n.data;if(!R(t,l))return null;var d={gridColumnStart:t.x,gridColumnEnd:t.x+t.w,gridRowStart:t.y,gridRowEnd:t.y+t.h,justifySelf:t.align?_[t.align]:"stretch",alignSelf:t.valign?C[t.valign]:"stretch"};return f.createElement("div",{key:a,style:d,className:t.gridClassName},s?s(t,a,i,this.props):this.renderChild("grid2d/".concat(a),t))},e.prototype.renderGrids=function(){var t=this,a=this.props.grids;return a.map(function(i,n){return t.renderGrid(i,n,a.length)})},e.prototype.render=function(){var t=this.props,a=t.grids,i=t.cols,n=t.gap,s=t.gapRow,l=t.width,d=t.rowHeight,y=t.style,v=t.id,h=new Array(i);h.fill("1fr");var p=0;a.forEach(function(r,S){var c=r.y+r.h-1;c>p&&(p=c)});var u=new Array(p);u.fill(d),a.forEach(function(r){r.width&&(h[r.x-1]=Number.isInteger(r.width)?r.width+"px":r.width),r.height&&(u[r.y-1]=Number.isInteger(r.height)?r.height+"px":r.height)});var g=m(m({},y),{display:"grid",columnGap:n,rowGap:typeof s>"u"?n:s,width:l,gridTemplateColumns:h.join(" "),gridTemplateRows:u.join(" ")});return f.createElement("div",{style:g,"data-id":v},this.renderGrids())},e.propsList=["grids"],e.defaultProps={cols:12,width:"auto",gap:0,rowHeight:"3.125rem"},e}(f.Component),D=function(o){w(e,o);function e(){return o!==null&&o.apply(this,arguments)||this}return e=G([x({type:"grid-2d"})],e),e}(b);export{D as Grid2DRenderer,b as default}; 2 | -------------------------------------------------------------------------------- /web/dist/scripts/loading.js: -------------------------------------------------------------------------------- 1 | window.$owl = window.$owl || {} 2 | 3 | window.$owl.appLoader = () => { 4 | const value = localStorage.getItem(window.$adminApiPrefix.replace(/^\//, '') + '-settings') 5 | const settings = JSON.parse(value == 'undefined' ? '{}' : value) 6 | const color = settings?.theme?.themeColor || '#1C1C1C' 7 | const bgColor = settings?.theme?.darkTheme ? '#1f1f1f' : '#FFFFFF' 8 | 9 | const loader = ` 10 |
11 | 20 |
21 | 22 |
23 |
24 | ` 25 | 26 | document.body.children.item(0).insertAdjacentHTML('afterend', loader) 27 | } 28 | 29 | window.$owl.appLoader() 30 | -------------------------------------------------------------------------------- /web/public/scripts/loading.js: -------------------------------------------------------------------------------- 1 | window.$owl = window.$owl || {} 2 | 3 | window.$owl.appLoader = () => { 4 | const value = localStorage.getItem(window.$adminApiPrefix.replace(/^\//, '') + '-settings') 5 | const settings = JSON.parse(value == 'undefined' ? '{}' : value) 6 | const color = settings?.theme?.themeColor || '#1C1C1C' 7 | const bgColor = settings?.theme?.darkTheme ? '#1f1f1f' : '#FFFFFF' 8 | 9 | const loader = ` 10 |
11 | 20 |
21 | 22 |
23 |
24 | ` 25 | 26 | document.body.children.item(0).insertAdjacentHTML('afterend', loader) 27 | } 28 | 29 | window.$owl.appLoader() 30 | -------------------------------------------------------------------------------- /web/dist/assets/InputFormula-DEdG7mtV.js: -------------------------------------------------------------------------------- 1 | import{s as E,v as u,w as v,f as b,c3 as W,z as c,P as j,Q as d,a1 as A}from"./index-BnATMMdj.js";var Q=function(o){E(a,o);function a(){return o!==null&&o.apply(this,arguments)||this}return a.prototype.formulaRef=function(e){if(e){for(;e&&e.getWrappedInstance;)e=e.getWrappedInstance();this.ref=e}else this.ref=void 0},a.prototype.validate=function(){var e,t=this.props,s=t.translate,l=t.value;if(!((e=this.ref)===null||e===void 0)&&e.validate&&l){var r=this.ref.validate(l);if(r!==!0)return s("FormulaEditor.invalidData",{err:r})}},a.prototype.render=function(){var e=this.props;e.selectedOptions;var t=e.disabled,s=e.onChange,l=e.evalMode,r=e.mixedMode,m=e.variableMode,f=e.header,h=e.label,M=e.value,g=e.clearable,C=e.className;e.style,e.classPrefix,e.classnames,e.allowInput;var N=e.borderMode,_=e.placeholder,y=e.inputMode,I=e.btnLabel,P=e.level,F=e.btnSize,O=e.icon,x=e.title,R=e.variableClassName,S=e.functionClassName,w=e.data,V=e.onPickerOpen,k=e.selfVariableName;e.popOverContainer;var z=e.env,L=e.inputSettings,U=e.mobileUI,p=this.props,i=p.variables,n=p.functions;return u(i)&&(i=v(i,this.props.data,"| raw")),u(n)&&(n=v(n,this.props.data,"| raw")),b.createElement(W,{popOverContainer:z.getModalContainer,ref:this.formulaRef,className:C,value:M,disabled:t,onChange:s,evalMode:l,variables:i,variableMode:m,functions:n,header:f||h||"",borderMode:N,placeholder:_,mode:y,inputSettings:L,btnLabel:I,level:P,btnSize:F,icon:O,title:x,clearable:g,variableClassName:R,functionClassName:S,data:w,onPickerOpen:V,selfVariableName:k,mixedMode:r,mobileUI:U})},a.defaultProps={inputMode:"input-button",borderMode:"full",evalMode:!0},c([j,d("design:type",Function),d("design:paramtypes",[Object]),d("design:returntype",void 0)],a.prototype,"formulaRef",null),a=c([A({type:"input-formula"})],a),a}(b.Component);export{Q as InputFormulaRenderer}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/Each-D8GNHHxx.js: -------------------------------------------------------------------------------- 1 | import{s as b,ai as S,ao as K,v as R,w as E,f as c,ad as j,y as i,b2 as k,ae as O,z as P,D as V,a3 as D}from"./index-BnATMMdj.js";function z(a){var t=a.render,h=a.data,e=a.items,r=a.item,u=a.name,m=a.index,y=a.itemKeyName,p=a.indexKeyName,v=c.useMemo(function(){var d,l;return D(h,i(i({},K(r)?i({index:m},r):(d={},d[u]=r,d)),(l={},l[y||"item"]=r,l[p||"index"]=m,l)))},[r,h,u,m,y,p]);return t("item/".concat(m),e,{data:v})}var F=function(a){b(t,a);function t(){return a!==null&&a.apply(this,arguments)||this}return t.prototype.render=function(){var h=this,e=this.props,r=e.data,u=e.name,m=e.className,y=e.style,p=e.render,v=e.items,d=e.itemKeyName,l=e.indexKeyName,_=e.placeholder,f=e.classnames,A=e.translate,w=e.env,x=e.id,L=e.wrapperCustomStyle,C=e.themeCss,o=S(this.props,function(s){return s.source?E(s.source,s.data,"| raw"):void 0}),n=K(o)?Object.keys(o).map(function(s){return{key:s,value:o[s]}}):Array.isArray(o)?o:[],N=R(this.props.maxLength)?E(this.props.maxLength,this.props.data)||0:this.props.maxLength;return Array.isArray(n)&&N>=1&&n.length>N&&(n=n.slice(0,N)),c.createElement("div",{className:f("Each",m,j(i(i({},this.props),{name:"baseControlClassName",id:x,themeCss:C}))),style:k(y,r)},Array.isArray(n)&&n.length&&v?n.map(function(s,g){return c.createElement(z,i({},h.props,{items:v,key:g,index:g,data:r,item:s,name:u,itemKeyName:d,indexKeyName:l}))}):c.createElement("div",{className:f("Each-placeholder")},p("placeholder",A(_))),c.createElement(O,i({},this.props,{config:{wrapperCustomStyle:L,id:x,themeCss:C,classNames:[{key:"baseControlClassName"}]},env:w})))},t.propsList=["name","items","value"],t.defaultProps={className:"",placeholder:"placeholder.noData"},t}(c.Component),M=function(a){b(t,a);function t(){return a!==null&&a.apply(this,arguments)||this}return t=P([V({type:"each"})],t),t}(F);export{M as EachRenderer,F as default}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/pascaligo-5jv8CcQD.js: -------------------------------------------------------------------------------- 1 | var e={comments:{lineComment:"//",blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"}]},o={defaultToken:"",tokenPostfix:".pascaligo",ignoreCase:!0,brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],keywords:["begin","block","case","const","else","end","fail","for","from","function","if","is","nil","of","remove","return","skip","then","type","var","while","with","option","None","transaction"],typeKeywords:["bool","int","list","map","nat","record","string","unit","address","map","mtz","xtz"],operators:["=",">","<","<=",">=","<>",":",":=","and","mod","or","+","-","*","/","@","&","^","%"],symbols:/[=><:@\^&|+\-*\/\^%]+/,tokenizer:{root:[[/[a-zA-Z_][\w]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/\$[0-9a-fA-F]{1,16}/,"number.hex"],[/\d+/,"number"],[/[;,.]/,"delimiter"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/'/,"string","@string"],[/'[^\\']'/,"string"],[/'/,"string.invalid"],[/\#\d+/,"string"]],comment:[[/[^\(\*]+/,"comment"],[/\*\)/,"comment","@pop"],[/\(\*/,"comment"]],string:[[/[^\\']+/,"string"],[/\\./,"string.escape.invalid"],[/'/,{token:"string.quote",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,"white"],[/\(\*/,"comment","@comment"],[/\/\/.*$/,"comment"]]}};export{e as conf,o as language}; 2 | -------------------------------------------------------------------------------- /internal/pkg/response/response.go: -------------------------------------------------------------------------------- 1 | package response 2 | 3 | import "github.com/gofiber/fiber/v2" 4 | 5 | // Success 响应成功 6 | func Success(ctx *fiber.Ctx, data any) error { 7 | return ctx.JSON(fiber.Map{ 8 | "status": 0, 9 | "code": 200, 10 | "msg": "ok", 11 | "doNotDisplayToast": 1, 12 | "data": data, 13 | }) 14 | } 15 | 16 | // Ok 响应成功消息 17 | func Ok(ctx *fiber.Ctx, msg string) error { 18 | data := fiber.Map{ 19 | "status": 0, 20 | "code": 200, 21 | "msg": msg, 22 | "doNotDisplayToast": 0, 23 | "data": fiber.Map{}, 24 | } 25 | 26 | return ctx.JSON(data) 27 | } 28 | 29 | // Fail 响应失败 30 | func Fail(ctx *fiber.Ctx, data any) error { 31 | return ctx.JSON(fiber.Map{ 32 | "status": 1, 33 | "code": 500, 34 | "msg": "fail", 35 | "doNotDisplayToast": 0, 36 | "data": data, 37 | }) 38 | } 39 | 40 | // Error 响应失败消息 41 | func Error(ctx *fiber.Ctx, msg string) error { 42 | data := fiber.Map{ 43 | "status": 1, 44 | "code": 500, 45 | "msg": msg, 46 | "doNotDisplayToast": 0, 47 | "data": fiber.Map{}, 48 | } 49 | 50 | return ctx.JSON(data) 51 | } 52 | 53 | // UnAuthorized 未登录 54 | func UnAuthorized(ctx *fiber.Ctx) error { 55 | return ctx.JSON(fiber.Map{ 56 | "status": 1, 57 | "code": 401, 58 | "msg": "请先登录", 59 | "doNotDisplayToast": 0, 60 | "data": fiber.Map{}, 61 | }) 62 | } 63 | 64 | // Forbidden 无权访问 65 | func Forbidden(ctx *fiber.Ctx) error { 66 | return ctx.JSON(fiber.Map{ 67 | "status": 1, 68 | "code": 403, 69 | "msg": "无权访问", 70 | "doNotDisplayToast": 0, 71 | "data": fiber.Map{}, 72 | }) 73 | } 74 | -------------------------------------------------------------------------------- /web/src/layouts/SmLayout/index.tsx: -------------------------------------------------------------------------------- 1 | import {Drawer, Layout} from 'antd' 2 | import LayoutTopBar from '@/layouts/components/LayoutTopBar' 3 | import LayoutContent from '@/layouts/components/LayoutContent' 4 | import {useState} from 'react' 5 | import CollapseTrigger from '@/layouts/components/CollapseTrigger' 6 | import LayoutMenu from '@/layouts/components/LayoutMenu' 7 | import LayoutLogo from '@/layouts/components/LayoutLogo' 8 | import useSetting from '@/hooks/useSetting' 9 | 10 | const {Header, Content} = Layout 11 | 12 | // 小屏布局 13 | const SmLayout = () => { 14 | const {getSetting} = useSetting() 15 | const [closed, setClosed] = useState(true) 16 | 17 | return ( 18 | 19 |
20 |
21 | 22 |
23 | 24 |
25 | 26 | 27 | 28 | setClosed(true)} 34 | closeIcon={false} 35 | headerStyle={{padding: 0, height: '65px'}} 36 | title={}> 37 | 38 | 39 |
40 | ) 41 | } 42 | 43 | export default SmLayout 44 | -------------------------------------------------------------------------------- /web/src/layouts/components/LayoutTopBar/components/LocaleButton/index.tsx: -------------------------------------------------------------------------------- 1 | import IconButton from '@/layouts/components/IconButton' 2 | import {Dropdown} from 'antd' 3 | import useSetting from '@/hooks/useSetting' 4 | import {useRequest} from 'ahooks' 5 | import {saveSettings} from '@/service/api' 6 | import {getCacheKey} from '@/utils/common' 7 | import {useState} from 'react' 8 | 9 | const LocaleButton = () => { 10 | const {getSetting} = useSetting() 11 | const items = getSetting('locale_options') 12 | const currentLocale = getSetting('locale') 13 | const [locale, setLocale] = useState(currentLocale) 14 | 15 | // 保存设置 16 | const save = useRequest(saveSettings, { 17 | manual: true, 18 | onBefore: () => { 19 | window.$owl.appLoader() 20 | }, 21 | onSuccess: () => { 22 | localStorage.setItem(getCacheKey('locale'), locale) 23 | location.reload() 24 | } 25 | }) 26 | 27 | const onClick = ({key}) => { 28 | if (key == currentLocale) { 29 | return 30 | } 31 | 32 | setLocale(key) 33 | 34 | save.run({key: 'admin_locale', value: key}) 35 | } 36 | 37 | return ( 38 | { 42 | i.key = i.value 43 | return i 44 | }), 45 | onClick, 46 | selectable: true, 47 | defaultSelectedKeys: [currentLocale], 48 | }}> 49 |
50 | e.preventDefault()}/> 51 |
52 |
53 | ) 54 | } 55 | 56 | export default LocaleButton 57 | -------------------------------------------------------------------------------- /web/src/pages/editor/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import AmisEditor from '@/components/AmisEditor' 3 | import {Card, Space} from 'antd' 4 | import {Button as AmisBtn} from 'amis-ui' 5 | import AmisRender from '@/components/AmisRender' 6 | import {useLang} from '@/hooks/useLang' 7 | 8 | const Editor = () => { 9 | const {t} = useLang() 10 | const [preview, setPreview] = React.useState(false) 11 | const [schema, setSchema] = React.useState({} as any) 12 | 13 | const btnSchema = { 14 | type: 'button', 15 | label: t('amis_editor.get_php_code'), 16 | level: 'success', 17 | actionType: 'ajax', 18 | api: { 19 | method: 'post', 20 | url: '/dev_tools/editor_parse', 21 | data: {schema} 22 | }, 23 | feedback: { 24 | title: 'PHP Schema', 25 | size: 'lg', 26 | body: { 27 | type: 'editor', 28 | language: 'php', 29 | name: 'schema', 30 | } 31 | } 32 | } 33 | 34 | return ( 35 |
36 | 38 | 39 | setPreview(!preview)}> 40 | {preview ? t('amis_editor.edit') : t('amis_editor.preview')} 41 | 42 | 43 | )}> 44 |
45 | 46 |
47 |
48 |
49 |
50 | ) 51 | } 52 | 53 | export default Editor 54 | -------------------------------------------------------------------------------- /web/dist/assets/Property-S_ErfHQT.js: -------------------------------------------------------------------------------- 1 | import{s as P,d8 as x,bz as g,f as t,b2 as v,z as k,D as N}from"./index-BnATMMdj.js";var z=function(y){P(o,y);function o(e){return y.call(this,e)||this}return o.prototype.prepareRows=function(){var e,n,a=this.props,u=a.column,c=u===void 0?3:u,p=a.items,b=a.source,d=a.data,m=p||b||[],r=[],s=[],i=c,l=0,h=x(m,d);try{for(var E=g(h),f=E.next();!f.done;f=E.next()){var S=f.value;l=l+1;var R=Math.min(S.span||1,c);i=i-R;var w={label:S.label,content:S.content,span:R};i>=0?s.push(w):(r.push(s),i=c-R,s=[w]),l===h.length&&r.push(s)}}catch(_){e={error:_}}finally{try{f&&!f.done&&(n=E.return)&&n.call(E)}finally{if(e)throw e.error}}return r},o.prototype.renderRow=function(e){var n=this.props,a=n.render,u=n.contentStyle,c=n.labelStyle,p=n.separator,b=p===void 0?": ":p,d=n.mode,m=d===void 0?"table":d,r=n.data;return e.map(function(s,i){return t.createElement("tr",{key:i},s.map(function(l,h){return m==="table"?t.createElement(t.Fragment,{key:"item-".concat(h)},t.createElement("th",{style:v(c,r)},a("label",l.label)),t.createElement("td",{colSpan:l.span+l.span-1,style:v(u,r)},a("content",l.content))):t.createElement("td",{colSpan:l.span,style:v(u,r),key:"item-".concat(h)},t.createElement("span",{style:v(c,r)},a("label",l.label)),b,a("content",l.content))}))})},o.prototype.render=function(){var e=this.props,n=e.style,a=e.title,u=e.column,c=u===void 0?3:u,p=e.classnames,b=e.className,d=e.titleStyle,m=e.data,r=e.mode,s=r===void 0?"table":r,i=this.prepareRows();return t.createElement("div",{className:p("Property","Property--".concat(s),b),style:v(n,m)},t.createElement("table",null,a?t.createElement("thead",null,t.createElement("tr",null,t.createElement("th",{colSpan:s==="table"?c+c:c,style:v(d,m)},a))):null,t.createElement("tbody",null,this.renderRow(i))))},o}(t.Component),C=function(y){P(o,y);function o(){return y!==null&&y.apply(this,arguments)||this}return o=k([N({type:"property",autoVar:!0})],o),o}(z);export{C as PropertyRenderer,z as default}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/xml-Dc1mB8je.js: -------------------------------------------------------------------------------- 1 | import{l as e}from"./editor.main-BLuVey-E.js";import"./index-BnATMMdj.js";var a={comments:{blockComment:[""]},brackets:[["<",">"]],autoClosingPairs:[{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}],surroundingPairs:[{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}],onEnterRules:[{beforeText:new RegExp("<([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$","i"),afterText:/^<\/([_:\w][_:\w-.\d]*)\s*>$/i,action:{indentAction:e.IndentAction.IndentOutdent}},{beforeText:new RegExp("<(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$","i"),action:{indentAction:e.IndentAction.Indent}}]},i={defaultToken:"",tokenPostfix:".xml",ignoreCase:!0,qualifiedName:/(?:[\w\.\-]+:)?[\w\.\-]+/,tokenizer:{root:[[/[^<&]+/,""],{include:"@whitespace"},[/(<)(@qualifiedName)/,[{token:"delimiter"},{token:"tag",next:"@tag"}]],[/(<\/)(@qualifiedName)(\s*)(>)/,[{token:"delimiter"},{token:"tag"},"",{token:"delimiter"}]],[/(<\?)(@qualifiedName)/,[{token:"delimiter"},{token:"metatag",next:"@tag"}]],[/(<\!)(@qualifiedName)/,[{token:"delimiter"},{token:"metatag",next:"@tag"}]],[/<\!\[CDATA\[/,{token:"delimiter.cdata",next:"@cdata"}],[/&\w+;/,"string.escape"]],cdata:[[/[^\]]+/,""],[/\]\]>/,{token:"delimiter.cdata",next:"@pop"}],[/\]/,""]],tag:[[/[ \t\r\n]+/,""],[/(@qualifiedName)(\s*=\s*)("[^"]*"|'[^']*')/,["attribute.name","","attribute.value"]],[/(@qualifiedName)(\s*=\s*)("[^">?\/]*|'[^'>?\/]*)(?=[\?\/]\>)/,["attribute.name","","attribute.value"]],[/(@qualifiedName)(\s*=\s*)("[^">]*|'[^'>]*)/,["attribute.name","","attribute.value"]],[/@qualifiedName/,"attribute.name"],[/\?>/,{token:"delimiter",next:"@pop"}],[/(\/)(>)/,[{token:"tag"},{token:"delimiter",next:"@pop"}]],[/>/,{token:"delimiter",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,""],[//,{token:"comment",next:"@pop"}],[/