├── .dockerignore ├── .github └── workflows │ └── docker.yml ├── .gitignore ├── .htaccess ├── Dockerfile ├── LICENSE ├── README.md ├── app.json ├── app.lock ├── app ├── Cloud │ ├── Admin │ │ └── Apps.php │ ├── App.php │ ├── Docs │ │ ├── CHANGELOG.md │ │ └── README.md │ ├── Langs │ │ ├── manage.en-US.yaml │ │ ├── manage.ja-JP.yaml │ │ ├── manage.ko-KR.yaml │ │ ├── manage.ru-RU.yaml │ │ ├── manage.zh-CN.yaml │ │ └── manage.zh-TW.yaml │ └── app.json ├── Cms │ ├── Admin │ │ ├── Setting.php │ │ ├── Stats.php │ │ └── Template.php │ ├── App.php │ ├── Docs │ │ ├── CHANGELOG.md │ │ └── README.md │ ├── Langs │ │ ├── manage.en-US.yaml │ │ ├── manage.ja-JP.yaml │ │ ├── manage.ko-KR.yaml │ │ ├── manage.ru-RU.yaml │ │ ├── manage.zh-CN.yaml │ │ └── manage.zh-TW.yaml │ ├── Service │ │ └── Translator.php │ ├── Web │ │ └── Index.php │ └── app.json ├── Content │ ├── Admin │ │ ├── Article.php │ │ ├── Attr.php │ │ ├── Category.php │ │ ├── Menu.php │ │ ├── MenuData.php │ │ ├── Page.php │ │ ├── Recommend.php │ │ ├── Replace.php │ │ ├── Setting.php │ │ ├── Source.php │ │ └── Tags.php │ ├── Api │ │ ├── Article.php │ │ └── Category.php │ ├── App.php │ ├── Docs │ │ ├── CHANGELOG.md │ │ └── README.md │ ├── Event │ │ └── QrcodeEvent.php │ ├── Langs │ │ ├── manage.en-US.yaml │ │ ├── manage.ja-JP.yaml │ │ ├── manage.ko-KR.yaml │ │ ├── manage.ru-RU.yaml │ │ ├── manage.zh-CN.yaml │ │ └── manage.zh-TW.yaml │ ├── Listener │ │ ├── BackupListener.php │ │ └── MemberListener.php │ ├── Models │ │ ├── Article.php │ │ ├── ArticleAttr.php │ │ ├── ArticleAttrHas.php │ │ ├── ArticleClass.php │ │ ├── ArticleRecommend.php │ │ ├── ArticleRecommendHas.php │ │ ├── ArticleReplace.php │ │ ├── ArticleSource.php │ │ ├── ArticleTags.php │ │ ├── ArticleTagsHas.php │ │ ├── ArticleTagsTrait.php │ │ ├── Menu.php │ │ ├── MenuData.php │ │ └── Page.php │ ├── Service │ │ ├── Article.php │ │ ├── Category.php │ │ ├── Menu.php │ │ ├── Page.php │ │ ├── Source.php │ │ └── Tags.php │ └── app.json ├── ContentExtend │ ├── Admin │ │ └── Spider.php │ ├── App.php │ ├── Docs │ │ ├── CHANGELOG.md │ │ └── README.md │ ├── Langs │ │ ├── manage.en-US.yaml │ │ ├── manage.ja-JP.yaml │ │ ├── manage.ko-KR.yaml │ │ ├── manage.ru-RU.yaml │ │ ├── manage.zh-CN.yaml │ │ └── manage.zh-TW.yaml │ └── app.json ├── Install │ ├── App.php │ ├── Docs │ │ ├── CHANGELOG.md │ │ └── README.md │ ├── Views │ │ └── Web │ │ │ └── install.html │ ├── Web │ │ └── Install.php │ └── app.json ├── Poster │ ├── Admin │ │ └── Poster.php │ ├── App.php │ ├── Docs │ │ ├── CHANGELOG.md │ │ └── README.md │ ├── Langs │ │ ├── manage.en-US.yaml │ │ ├── manage.ja-JP.yaml │ │ ├── manage.ko-KR.yaml │ │ ├── manage.ru-RU.yaml │ │ ├── manage.zh-CN.yaml │ │ └── manage.zh-TW.yaml │ ├── Models │ │ └── Poster.php │ ├── Service │ │ └── Poster.php │ └── app.json ├── System │ ├── Admin │ │ ├── Api.php │ │ ├── Auth.php │ │ ├── Operate.php │ │ ├── Role.php │ │ ├── Total.php │ │ └── User.php │ ├── App.php │ ├── Docs │ │ ├── CHANGELOG.md │ │ └── README.md │ ├── Enum │ │ └── PlatformEnum.php │ ├── Langs │ │ ├── manage.en-US.yaml │ │ ├── manage.ja-JP.yaml │ │ ├── manage.ko-KR.yaml │ │ ├── manage.ru-RU.yaml │ │ ├── manage.zh-CN.yaml │ │ └── manage.zh-TW.yaml │ ├── Middleware │ │ ├── ApiStatsMiddleware.php │ │ ├── OperateMiddleware.php │ │ └── VisitorMiddleware.php │ ├── Models │ │ ├── Config.php │ │ ├── LogApi.php │ │ ├── LogLogin.php │ │ ├── LogOperate.php │ │ ├── LogVisit.php │ │ ├── LogVisitData.php │ │ ├── LogVisitSpider.php │ │ ├── LogVisitUv.php │ │ ├── SystemApi.php │ │ ├── SystemRole.php │ │ ├── SystemUser.php │ │ └── SystemUserRole.php │ ├── Service │ │ ├── Config.php │ │ ├── Stats.php │ │ ├── System.php │ │ └── Visitor.php │ ├── Traits │ │ └── Visitor.php │ ├── Views │ │ └── Web │ │ │ └── manage.html │ ├── Web │ │ └── Manage.php │ └── app.json └── Tools │ ├── Admin │ ├── Area.php │ ├── Backup.php │ ├── File.php │ ├── FileDir.php │ ├── Magic.php │ ├── MagicData.php │ ├── MagicGroup.php │ ├── MagicPage.php │ └── MagicSource.php │ ├── Api │ └── Magic.php │ ├── App.php │ ├── Config │ ├── Menu.php │ └── Permission.php │ ├── Docs │ ├── CHANGELOG.md │ └── README.md │ ├── Event │ ├── BackupEvent.php │ └── SourceEvent.php │ ├── Func │ └── Common.php │ ├── Handlers │ ├── Download.php │ └── Upload.php │ ├── Langs │ ├── manage.en-US.yaml │ ├── manage.ja-JP.yaml │ ├── manage.ko-KR.yaml │ ├── manage.ru-RU.yaml │ ├── manage.zh-CN.yaml │ └── manage.zh-TW.yaml │ ├── Listener │ └── SourceListener.php │ ├── Models │ ├── ToolsArea.php │ ├── ToolsBackup.php │ ├── ToolsDownload.php │ ├── ToolsFile.php │ ├── ToolsFileDir.php │ ├── ToolsMagic.php │ ├── ToolsMagicData.php │ ├── ToolsMagicGroup.php │ └── ToolsMagicSource.php │ ├── Scheduler │ └── Test.php │ ├── Service │ ├── Content.php │ ├── Data.php │ ├── Download.php │ ├── Magic.php │ ├── Qrcode.php │ └── Source.php │ ├── Static │ └── content.css │ └── app.json ├── auto_install.json ├── composer.json ├── composer.lock ├── config ├── app.yaml ├── cache.yaml ├── command.yaml ├── database.yaml ├── font │ └── AlibabaPuHuiTi-3-55-Regular.ttf ├── geo.yaml ├── queue.yaml ├── storage.yaml └── use.yaml ├── console └── TestCommand.php ├── docker ├── Caddyfile ├── run.sh └── supervisord.conf ├── dux ├── iis.rewrite ├── nginx.rewrite ├── public ├── index.php ├── maps │ └── china.json └── web │ ├── .vite │ └── manifest.json │ ├── assets │ ├── KaTeX_AMS-Regular-BQhdFMY1.woff2 │ ├── KaTeX_AMS-Regular-DMm9YOAa.woff │ ├── KaTeX_AMS-Regular-DRggAlZN.ttf │ ├── KaTeX_Caligraphic-Bold-ATXxdsX0.ttf │ ├── KaTeX_Caligraphic-Bold-BEiXGLvX.woff │ ├── KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 │ ├── KaTeX_Caligraphic-Regular-CTRA-rTL.woff │ ├── KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 │ ├── KaTeX_Caligraphic-Regular-wX97UBjC.ttf │ ├── KaTeX_Fraktur-Bold-BdnERNNW.ttf │ ├── KaTeX_Fraktur-Bold-BsDP51OF.woff │ ├── KaTeX_Fraktur-Bold-CL6g_b3V.woff2 │ ├── KaTeX_Fraktur-Regular-CB_wures.ttf │ ├── KaTeX_Fraktur-Regular-CTYiF6lA.woff2 │ ├── KaTeX_Fraktur-Regular-Dxdc4cR9.woff │ ├── KaTeX_Main-Bold-Cx986IdX.woff2 │ ├── KaTeX_Main-Bold-Jm3AIy58.woff │ ├── KaTeX_Main-Bold-waoOVXN0.ttf │ ├── KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 │ ├── KaTeX_Main-BoldItalic-DzxPMmG6.ttf │ ├── KaTeX_Main-BoldItalic-SpSLRI95.woff │ ├── KaTeX_Main-Italic-3WenGoN9.ttf │ ├── KaTeX_Main-Italic-BMLOBm91.woff │ ├── KaTeX_Main-Italic-NWA7e6Wa.woff2 │ ├── KaTeX_Main-Regular-B22Nviop.woff2 │ ├── KaTeX_Main-Regular-Dr94JaBh.woff │ ├── KaTeX_Main-Regular-ypZvNtVU.ttf │ ├── KaTeX_Math-BoldItalic-B3XSjfu4.ttf │ ├── KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 │ ├── KaTeX_Math-BoldItalic-iY-2wyZ7.woff │ ├── KaTeX_Math-Italic-DA0__PXp.woff │ ├── KaTeX_Math-Italic-flOr_0UB.ttf │ ├── KaTeX_Math-Italic-t53AETM-.woff2 │ ├── KaTeX_SansSerif-Bold-CFMepnvq.ttf │ ├── KaTeX_SansSerif-Bold-D1sUS0GD.woff2 │ ├── KaTeX_SansSerif-Bold-DbIhKOiC.woff │ ├── KaTeX_SansSerif-Italic-C3H0VqGB.woff2 │ ├── KaTeX_SansSerif-Italic-DN2j7dab.woff │ ├── KaTeX_SansSerif-Italic-YYjJ1zSn.ttf │ ├── KaTeX_SansSerif-Regular-BNo7hRIc.ttf │ ├── KaTeX_SansSerif-Regular-CS6fqUqJ.woff │ ├── KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 │ ├── KaTeX_Script-Regular-C5JkGWo-.ttf │ ├── KaTeX_Script-Regular-D3wIWfF6.woff2 │ ├── KaTeX_Script-Regular-D5yQViql.woff │ ├── KaTeX_Size1-Regular-C195tn64.woff │ ├── KaTeX_Size1-Regular-Dbsnue_I.ttf │ ├── KaTeX_Size1-Regular-mCD8mA8B.woff2 │ ├── KaTeX_Size2-Regular-B7gKUWhC.ttf │ ├── KaTeX_Size2-Regular-Dy4dx90m.woff2 │ ├── KaTeX_Size2-Regular-oD1tc_U0.woff │ ├── KaTeX_Size3-Regular-CTq5MqoE.woff │ ├── KaTeX_Size3-Regular-DgpXs0kz.ttf │ ├── KaTeX_Size4-Regular-BF-4gkZK.woff │ ├── KaTeX_Size4-Regular-DWFBv043.ttf │ ├── KaTeX_Size4-Regular-Dl5lxZxV.woff2 │ ├── KaTeX_Typewriter-Regular-C0xS9mPB.woff │ ├── KaTeX_Typewriter-Regular-CO6r4hn1.woff2 │ ├── KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf │ ├── action-CcBf9P9h.js │ ├── apl-B4CMkyY2.js │ ├── asciiarmor-Df11BRmG.js │ ├── asn1-CGOzndHr.js │ ├── asterisk-B-8jnY81.js │ ├── background-DLLzPY35.svg │ ├── blockDiagram-9f4a6865-Dkzzqngh.js │ ├── brainfuck-C4LP7Hcl.js │ ├── button-VrESTZal.js │ ├── c4Diagram-ae766693-11kSgZBn.js │ ├── cascader-C1UbdXvF.js │ ├── classDiagram-fb54d2a0-Cc6tobLc.js │ ├── classDiagram-v2-a2b738ad-CiTgAhHN.js │ ├── clike-DWq2Y8ae.js │ ├── clojure-BMjYHr_A.js │ ├── clone-BCa8eBeC.js │ ├── cmake-BQqOBYOt.js │ ├── cobol-XrqhtCFE.js │ ├── coffeescript-S37ZYGWr.js │ ├── commonlisp-5jcOZwOE.js │ ├── createText-ca0c5216-S7G96NDK.js │ ├── crystal-SjHAIU92.js │ ├── css-BnMrqG3P.js │ ├── cypher-C_CwsFkJ.js │ ├── d-pRatUO7H.js │ ├── diff-DbItnlRl.js │ ├── dockerfile-BuNIbK2j.js │ ├── dtd-DF_7sFjM.js │ ├── dylan-DwRh75JA.js │ ├── ebnf-CDyGwa7X.js │ ├── ecl-Cabwm37j.js │ ├── edges-066a5561-C2YdgO4I.js │ ├── editor-3FTnDpaY.js │ ├── editor-CvkLeIgN.js │ ├── eiffel-CnydiIhH.js │ ├── elm-vLlmbW-K.js │ ├── erDiagram-09d1c15f-BI-Biqb9.js │ ├── erlang-BNw1qcRV.js │ ├── export-C_hm8dOW.js │ ├── factor-D8pE9siL.js │ ├── fcl-Kvtd6kyn.js │ ├── filterSider-C3MmrzQw.js │ ├── firefox-D0nloSrv.svg │ ├── flowDb-c1833063-e5syNCBr.js │ ├── flowDiagram-b222e15a-R3DbhQ5i.js │ ├── flowDiagram-v2-13329dc7-BECrujz7.js │ ├── flowchart-elk-definition-ae0efee6-C4BP5lgM.js │ ├── form-Cq0eFcsN.js │ ├── forth-Ffai-XNe.js │ ├── fortran-DYz_wnZ1.js │ ├── ganttDiagram-b62c793e-BcDH8JsN.js │ ├── gas-Bneqetm1.js │ ├── gherkin-heZmZLOM.js │ ├── gitGraphDiagram-942e62fe-DJcLvCjf.js │ ├── graph-CPgAh_uX.js │ ├── groovy-DKLxxR9y.js │ ├── group-88LBRa_Z.js │ ├── group-ClRIeId8.js │ ├── group-kr8G464a.js │ ├── haskell-BWDZoCOh.js │ ├── haxe-pv4rovob.js │ ├── http-DBlCnlav.js │ ├── idl-BEugSyMb.js │ ├── import-DjPaXtMe.js │ ├── import-_U0v6FNI.js │ ├── index-01f381cb-CIqwIHrn.js │ ├── index-BFYwjrL4.js │ ├── index-BMYDViak.js │ ├── index-BSYHRsc2.js │ ├── index-BZwNPwkq.js │ ├── index-BjDlVZyQ.js │ ├── index-BqVoZDAN.js │ ├── index-BvKTTDD6.js │ ├── index-BwHjqFQ0.js │ ├── index-CA6HuA5O.js │ ├── index-CExbqywX.js │ ├── index-CNjPCdI4.js │ ├── index-CsRn_cYo.js │ ├── index-D9fFBLKH.js │ ├── index-DDecZjgR.js │ ├── index-DFh8UtBS.js │ ├── index-DWzSL70G.js │ ├── index-DZJecSlx.js │ ├── index-DhJnVc-Y.js │ ├── index-Fi8XNhwS.js │ ├── index-UMLq3bt2.js │ ├── index-cSqOq9Nd.js │ ├── index-rqwIXW5z.js │ ├── infoDiagram-94cd232f-odWz1Vgs.js │ ├── install-BetdnPXa.js │ ├── install-Cdq1iQOk.js │ ├── javascript-iSgyE4tI.js │ ├── jinja2-C4DGRd-O.js │ ├── journeyDiagram-6625b456-DuueWXeL.js │ ├── julia-DuME0IfC.js │ ├── katex-TTlFrSdt.js │ ├── layout-BMDjMi5M.js │ ├── link-NY0bYu7g.js │ ├── list-51xO9Ngs.js │ ├── list-BGRHcnYS.js │ ├── list-BX-sGLiq.js │ ├── list-B_s1R7er.js │ ├── list-BhEzzQL6.js │ ├── list-BkoXZCLX.js │ ├── list-Bzd0H3lP.js │ ├── list-CAZlFx92.js │ ├── list-CRS4czHB.js │ ├── list-CVEIVAPJ.js │ ├── list-Ccmvmnv7.js │ ├── list-Cf2-dAuM.js │ ├── list-CnA-V7xs.js │ ├── list-CwGt1e3x.js │ ├── list-DhetBPoR.js │ ├── list-DjCDq12M.js │ ├── list-DnMTDqAY.js │ ├── list-DnRUwV8H.js │ ├── list-Dn_S8S0V.js │ ├── list-SlRaa41l.js │ ├── list-_tzEAI5i.js │ ├── list-b0Lb9g3J.js │ ├── listSelect-DNdVXM0a.js │ ├── livescript-k3uCVVjK.js │ ├── login-giTfM73U.js │ ├── loginBanner-_i40ttQy.svg │ ├── lua-BgMRiT3U.js │ ├── manage-bOx1Sh-_.js │ ├── mathematica-DTrFuWx2.js │ ├── mbox-CNhZ1qSd.js │ ├── mindmap-definition-307c710a-CNwL5w55.js │ ├── mirc-CjQqDB4T.js │ ├── mllike-C_8OmSiT.js │ ├── modal-DHgax9GV.js │ ├── modelica-Dc1JOy9r.js │ ├── modulepreload-polyfill-D6ThnDFs.js │ ├── mscgen-BA5vi2Kp.js │ ├── mumps-BT43cFF4.js │ ├── nginx-DdIZxoE0.js │ ├── notFound-2yhReDom.svg │ ├── nsis-CEAdamBV.js │ ├── ntriples-BfvgReVJ.js │ ├── octave-Ck1zUtKM.js │ ├── other-D5d1xaxp.svg │ ├── oz-BzwKVEFT.js │ ├── page-BDoLOl6q.js │ ├── page-BWKgt5FN.js │ ├── page-BpnTqTZy.js │ ├── page-Bsrne62d.js │ ├── page-DFOq6yfF.js │ ├── page-DFXqGzgj.js │ ├── page-Dbq1p8Nv.js │ ├── page-ECbxBwLm.js │ ├── page-kfV-k68A.js │ ├── pascal-B1wCu0_E.js │ ├── perl-CdXCOZ3F.js │ ├── pieDiagram-bb1d19e5-D_i5XKqS.js │ ├── pig-CevX1Tat.js │ ├── powershell-CFHJl5sT.js │ ├── properties-C78fOPTZ.js │ ├── protobuf-ChK-085T.js │ ├── pug-BmUsPMDj.js │ ├── puppet-DMA9R1ak.js │ ├── python-BuPzkPfP.js │ ├── q-ZnEupP5q.js │ ├── quadrantDiagram-c759a472-_obDMYVB.js │ ├── r-DUYO_cvP.js │ ├── requirementDiagram-87253d64-HkBBopJf.js │ ├── rpm-CTu-6PCP.js │ ├── ruby-B2Rjki9n.js │ ├── safari-DkpbD7z_.svg │ ├── sankeyDiagram-707fac0f-CQbf2n6Y.js │ ├── sas-B4kiWyti.js │ ├── save--B9CB6UV.js │ ├── save-B_6yjLca.js │ ├── save-Bjyi5ZpO.js │ ├── save-Cdrqc7RQ.js │ ├── save-CprYS7Tw.js │ ├── save-D79KL6ey.js │ ├── save-EJaUoZRy.js │ ├── save-EXr0bvE8.js │ ├── save-b-zqZpAv.js │ ├── save-xYkImboQ.js │ ├── scheme-C41bIUwD.js │ ├── select-aCzHF-Sz.js │ ├── sequenceDiagram-6894f283-7Soa3oyP.js │ ├── shell-CjFT_Tl9.js │ ├── show-CIGnOjU6.js │ ├── show-kxJIh2VS.js │ ├── sieve-C3Gn_uJK.js │ ├── simple-mode-C4Nsj8zu.js │ ├── smalltalk-CnHTOXQT.js │ ├── solr-DehyRSwq.js │ ├── sparql-DkYu6x3z.js │ ├── speed-MGQahTS-.js │ ├── spreadsheet-BCZA_wO0.js │ ├── sql-C4g8LzGK.js │ ├── stateDiagram-5dee940d-BMpcfLxO.js │ ├── stateDiagram-v2-1992cada-CannM1_v.js │ ├── stex-C3f8Ysf7.js │ ├── style-C6dsLDwY.css │ ├── styles-0784dbeb-BWv5_cWg.js │ ├── styles-483fbfea-BKhIfVL_.js │ ├── styles-b83b31c9-C0dKoyxn.js │ ├── stylus-q6zbLY83.js │ ├── svgDrawCommon-5e1cfd1d-Dq77TEEp.js │ ├── swift-BzpIVaGY.js │ ├── tcl-DVfN8rqt.js │ ├── textile-CnDTJFAw.js │ ├── tiddlywiki-DO-Gjzrf.js │ ├── tiki-DGYXhP31.js │ ├── timeline-definition-bf702344-B6ToS9Hm.js │ ├── tinymce-BiIqtVCw.js │ ├── toml-BXUEaScT.js │ ├── top-D7nt8p1k.js │ ├── troff-wAsdV37c.js │ ├── ttcn-CiGrtVSZ.js │ ├── ttcn-cfg-BIkV9KBc.js │ ├── turtle-B1tBg_DP.js │ ├── unauthorized-DBepViDK.svg │ ├── uninstall-DP4dILkh.js │ ├── update-DNF2Sdzn.js │ ├── upload-Bg3SAr9E.js │ ├── uploadFile-DJwHGSth.js │ ├── uploadImageManage-HbmYZfmq.js │ ├── useSelect-BorzI4ID.js │ ├── useUpload-BsrPC7ib.js │ ├── vb-CmGdzxic.js │ ├── vbscript-BuJXcnF6.js │ ├── velocity-D8B20fx6.js │ ├── vendor-echarts-JHGMnnew.js │ ├── vendor-lib-CKVa3D7Q.js │ ├── vendor-map-DjDVTs0N.js │ ├── vendor-markdown-CL7ixDl-.js │ ├── vendor-react-BlTfyhut.js │ ├── vendor-refine-BK41FXO6.js │ ├── vendor-tdesign-BxQoi5Mo.js │ ├── vendor-tinymce-lUkVC9Da.js │ ├── verilog-C6RDOZhf.js │ ├── vhdl-lSbBsy5d.js │ ├── webidl-ZXfAyPTL.js │ ├── xquery-WRlm2TX8.js │ ├── xychartDiagram-f11f50a6-D_7iMsIY.js │ ├── yacas-BJ4BC0dw.js │ └── z80-Hz9HOZM7.js │ ├── favicon.ico │ └── images │ ├── common │ └── logo.svg │ ├── flags │ ├── de.svg │ └── en.svg │ └── login │ └── banner.svg ├── theme └── default │ ├── about.latte │ ├── article-index.latte │ ├── article-info.latte │ ├── article-list.latte │ ├── article.latte │ ├── build │ ├── config.json │ ├── css │ └── style.css │ ├── images.latte │ ├── images │ ├── banner.jpg │ └── logo.svg │ ├── index.latte │ ├── js │ └── view-image.min.js │ ├── langs │ ├── en-US.yaml │ ├── ja-JP.yaml │ ├── ko-KR.yaml │ ├── ru-RU.yaml │ ├── zh-CN.yaml │ └── zh-TW.yaml │ ├── layout.latte │ ├── package.json │ ├── paginate.latte │ ├── search.latte │ ├── src │ └── main.css │ ├── tags.latte │ ├── tailwind.config.js │ ├── topic.jpg │ ├── widgets │ ├── article-rec.latte │ ├── article-show.latte │ └── not-fund.latte │ └── yarn.lock └── web ├── .eslintrc.cjs ├── .gitignore ├── index.html ├── install.html ├── package.json ├── public ├── favicon.ico └── images │ ├── common │ └── logo.svg │ ├── flags │ ├── de.svg │ └── en.svg │ └── login │ └── banner.svg ├── src ├── config │ ├── app.ts │ └── index.ts ├── global.d.ts ├── index.tsx ├── install.tsx ├── pages │ ├── cloud │ │ ├── admin │ │ │ └── apps │ │ │ │ ├── install.tsx │ │ │ │ ├── list.tsx │ │ │ │ ├── login.tsx │ │ │ │ ├── uninstall.tsx │ │ │ │ └── update.tsx │ │ ├── config │ │ │ └── resources.tsx │ │ ├── index.ts │ │ └── locales │ │ │ ├── en-US │ │ │ └── common.json │ │ │ ├── ja-JP │ │ │ └── common.json │ │ │ ├── ko-KR │ │ │ └── common.json │ │ │ ├── ru-RU │ │ │ └── common.json │ │ │ ├── zh-CN │ │ │ └── common.json │ │ │ └── zh-TW │ │ │ └── common.json │ ├── cms │ │ ├── admin │ │ │ ├── home │ │ │ │ └── index.tsx │ │ │ ├── setting │ │ │ │ └── page.tsx │ │ │ └── theme │ │ │ │ ├── list.tsx │ │ │ │ └── save.tsx │ │ ├── components │ │ │ └── editor.tsx │ │ ├── config │ │ │ └── resources.tsx │ │ ├── index.ts │ │ └── locales │ │ │ ├── en-US.json │ │ │ ├── ja-JP.json │ │ │ ├── ko-KR.json │ │ │ ├── ru-RU.json │ │ │ ├── zh-CN.json │ │ │ └── zh-TW.json │ ├── content │ │ ├── admin │ │ │ ├── article │ │ │ │ ├── list.tsx │ │ │ │ └── page.tsx │ │ │ ├── attr │ │ │ │ ├── list.tsx │ │ │ │ └── save.tsx │ │ │ ├── category │ │ │ │ ├── list.tsx │ │ │ │ ├── save.tsx │ │ │ │ └── top.tsx │ │ │ ├── menu │ │ │ │ ├── group.tsx │ │ │ │ ├── list.tsx │ │ │ │ └── save.tsx │ │ │ ├── page │ │ │ │ ├── list.tsx │ │ │ │ └── page.tsx │ │ │ ├── recommend │ │ │ │ ├── list.tsx │ │ │ │ └── page.tsx │ │ │ ├── replace │ │ │ │ ├── list.tsx │ │ │ │ └── save.tsx │ │ │ ├── setting │ │ │ │ └── page.tsx │ │ │ ├── source │ │ │ │ ├── list.tsx │ │ │ │ └── save.tsx │ │ │ └── tags │ │ │ │ └── list.tsx │ │ ├── config │ │ │ └── resources.tsx │ │ ├── index.ts │ │ └── locales │ │ │ ├── en-US.json │ │ │ ├── ja-JP.json │ │ │ ├── ko-KR.json │ │ │ ├── ru-RU.json │ │ │ ├── zh-CN.json │ │ │ └── zh-TW.json │ ├── contentExtend │ │ ├── hook │ │ │ └── index.tsx │ │ ├── index.ts │ │ └── locales │ │ │ ├── en-US.json │ │ │ ├── ja-JP.json │ │ │ ├── ko-KR.json │ │ │ ├── ru-RU.json │ │ │ ├── zh-CN.json │ │ │ └── zh-TW.json │ ├── poster │ │ ├── admin │ │ │ └── design │ │ │ │ ├── list.tsx │ │ │ │ ├── page.tsx │ │ │ │ └── style.scss │ │ ├── config │ │ │ └── resources.tsx │ │ ├── index.ts │ │ └── locales │ │ │ ├── en-US.json │ │ │ ├── ja-JP.json │ │ │ ├── ko-KR.json │ │ │ ├── ru-RU.json │ │ │ ├── zh-CN.json │ │ │ └── zh-TW.json │ ├── system │ │ ├── admin │ │ │ ├── api │ │ │ │ ├── list.tsx │ │ │ │ └── save.tsx │ │ │ ├── operate │ │ │ │ ├── list.tsx │ │ │ │ └── show.tsx │ │ │ ├── role │ │ │ │ ├── list.tsx │ │ │ │ └── save.tsx │ │ │ ├── total │ │ │ │ ├── index.tsx │ │ │ │ └── speed.tsx │ │ │ └── user │ │ │ │ ├── list.tsx │ │ │ │ └── save.tsx │ │ ├── config │ │ │ ├── resources.tsx │ │ │ └── router.tsx │ │ ├── index.ts │ │ └── locales │ │ │ ├── en-US.json │ │ │ ├── ja-JP.json │ │ │ ├── ko-KR.json │ │ │ ├── ru-RU.json │ │ │ ├── zh-CN.json │ │ │ └── zh-TW.json │ └── tools │ │ ├── admin │ │ ├── area │ │ │ ├── import.tsx │ │ │ └── list.tsx │ │ ├── backup │ │ │ ├── export.tsx │ │ │ ├── import.tsx │ │ │ └── list.tsx │ │ ├── data │ │ │ ├── list.tsx │ │ │ ├── modal.tsx │ │ │ ├── page.tsx │ │ │ └── show.tsx │ │ ├── file │ │ │ ├── group.tsx │ │ │ ├── list.tsx │ │ │ └── upload.tsx │ │ ├── magic │ │ │ ├── group.tsx │ │ │ ├── list.tsx │ │ │ └── page.tsx │ │ └── magicSource │ │ │ ├── list.tsx │ │ │ └── save.tsx │ │ ├── config │ │ └── resources.tsx │ │ ├── index.ts │ │ └── locales │ │ ├── en-US.json │ │ ├── ja-JP.json │ │ ├── ko-KR.json │ │ ├── ru-RU.json │ │ ├── zh-CN.json │ │ └── zh-TW.json ├── static │ └── browsers │ │ ├── chrome.svg │ │ ├── edge.svg │ │ ├── firefox.svg │ │ ├── ie.svg │ │ ├── opera.svg │ │ ├── other.svg │ │ └── safari.svg └── vite-env.d.ts ├── tsconfig.json ├── uno.config.js ├── vite.config.mts └── yarn.lock /.dockerignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | /logs 3 | /data 4 | /public/uploads 5 | /config/geo 6 | /public/theme 7 | /tmp 8 | 9 | # duxweb 10 | dist 11 | node_modules 12 | config/*.dev.yaml 13 | 14 | # Logs 15 | logs 16 | *.log 17 | npm-debug.log* 18 | pnpm-debug.log* 19 | yarn-debug.log* 20 | yarn-error.log* 21 | lerna-debug.log* 22 | 23 | # OS 24 | .DS_Store 25 | 26 | # Tests 27 | /coverage 28 | /.nyc_output 29 | 30 | # IDEs and editors 31 | .idea 32 | .project 33 | .classpath 34 | .c9/ 35 | *.launch 36 | .settings/ 37 | *.sublime-workspace 38 | 39 | # IDE - VSCode 40 | .vscode/* 41 | !.vscode/settings.json 42 | !.vscode/tasks.json 43 | !.vscode/launch.json 44 | !.vscode/extensions.json -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | /logs 3 | /data 4 | /public/uploads 5 | /config/geo 6 | /public/theme 7 | /tmp 8 | /vendor 9 | 10 | # duxweb 11 | dist 12 | node_modules 13 | config/*.dev.yaml 14 | 15 | # Logs 16 | logs 17 | *.log 18 | npm-debug.log* 19 | pnpm-debug.log* 20 | yarn-debug.log* 21 | yarn-error.log* 22 | lerna-debug.log* 23 | 24 | # OS 25 | .DS_Store 26 | 27 | # Tests 28 | /coverage 29 | /.nyc_output 30 | 31 | # IDEs and editors 32 | .idea 33 | .project 34 | .classpath 35 | .c9/ 36 | *.launch 37 | .settings/ 38 | *.sublime-workspace 39 | 40 | # IDE - VSCode 41 | .vscode/* 42 | !.vscode/settings.json 43 | !.vscode/tasks.json 44 | !.vscode/launch.json 45 | !.vscode/extensions.json -------------------------------------------------------------------------------- /.htaccess: -------------------------------------------------------------------------------- 1 | RewriteEngine On 2 | RewriteCond %{REQUEST_FILENAME} !-f 3 | RewriteCond %{REQUEST_FILENAME} !-d 4 | RewriteRule ^ index.php [QSA,L] -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM joseluisq/php-fpm:8.2 2 | 3 | ENV SITE_PATH /var/www/html 4 | 5 | RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ 6 | && echo "Asia/Shanghai" > /etc/timezone \ 7 | && apk del tzdata 8 | 9 | RUN apk add \ 10 | caddy \ 11 | supervisor \ 12 | nodejs \ 13 | yarn \ 14 | && rm -rf /var/cache/apk/* 15 | 16 | RUN rm -f /usr/local/etc/php/conf.d/docker-php-ext-swoole.ini \ 17 | /usr/local/etc/php/conf.d/docker-php-ext-phalcon.ini \ 18 | /usr/local/etc/php/conf.d/docker-php-ext-psr.ini \ 19 | /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini 20 | 21 | ENV ENV_SUBSTITUTION_ENABLE true 22 | ENV PHP_MEMORY_LIMIT 512M 23 | ENV PHP_FPM_LISTEN 9000 24 | 25 | WORKDIR ${SITE_PATH} 26 | COPY --chown=www-data:www-data . ${SITE_PATH} 27 | COPY ./docker/Caddyfile /etc/caddy/Caddyfile 28 | COPY ./docker/supervisord.conf /etc/supervisord.conf 29 | 30 | RUN mkdir -p ./tmp/config && chmod +x ${SITE_PATH}/docker/run.sh 31 | COPY ./config ./tmp/config 32 | 33 | VOLUME ["${SITE_PATH}/data", "${SITE_PATH}/config"] 34 | EXPOSE 80 35 | 36 | ENTRYPOINT ["/var/www/html/docker/run.sh"] 37 | 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 duxweb 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "project", 3 | "description": "This is the dux application dependency configuration", 4 | "dependencies": { 5 | "duxweb/cms": "0.2.6", 6 | "duxweb/content": "0.3.3", 7 | "duxweb/install": "0.0.5", 8 | "duxweb/base": "0.8.4", 9 | "duxweb/tools": "0.3.6", 10 | "duxweb/cloud": "0.0.4", 11 | "duxweb/contentExtend": "0.0.1", 12 | "duxweb/poster": "0.0.4" 13 | }, 14 | "apps": { 15 | "dux/cms": 1722908122, 16 | "dux/base": 1722909317, 17 | "dux/contentExtend": 1712583383, 18 | "dux/poster": 1721139228 19 | } 20 | } -------------------------------------------------------------------------------- /app/Cloud/App.php: -------------------------------------------------------------------------------- 1 | $item->id, 22 | "name" => $item->name, 23 | ]; 24 | } 25 | 26 | public function validator(array $data, ServerRequestInterface $request, array $args): array 27 | { 28 | return [ 29 | "name" => ["required", __('content.attr.validator.name', 'manage')], 30 | ]; 31 | } 32 | 33 | public function format(Data $data, ServerRequestInterface $request, array $args): array 34 | { 35 | return [ 36 | "name" => $data->name, 37 | ]; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/Content/Admin/Menu.php: -------------------------------------------------------------------------------- 1 | $item->id, 21 | "name" => $item->name, 22 | "title" => $item->title, 23 | ]; 24 | } 25 | 26 | public function validator(array $data, ServerRequestInterface $request, array $args): array 27 | { 28 | return [ 29 | "name" => ["required", __('content.menu.validator.name', 'manage')], 30 | "title" => ["required", __('content.menu.validator.title', 'manage')], 31 | ]; 32 | } 33 | 34 | public function format(Data $data, ServerRequestInterface $request, array $args): array 35 | { 36 | return [ 37 | "name" => $data->name, 38 | "title" => $data->title, 39 | ]; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/Content/Admin/Replace.php: -------------------------------------------------------------------------------- 1 | $item->id, 22 | "from" => $item->from, 23 | "to" => $item->to, 24 | ]; 25 | } 26 | 27 | public function validator(array $data, ServerRequestInterface $request, array $args): array 28 | { 29 | return [ 30 | "from" => ["required", __('content.replace.validator.from', 'manage')], 31 | "to" => ["required", __('content.replace.validator.to', 'manage')], 32 | ]; 33 | } 34 | 35 | public function format(Data $data, ServerRequestInterface $request, array $args): array 36 | { 37 | return [ 38 | "from" => $data->from, 39 | "to" => $data->to, 40 | ]; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/Content/Admin/Setting.php: -------------------------------------------------------------------------------- 1 | getParsedBody(); 27 | Config::setValue("content", $data); 28 | return send($response, "保存配置成功"); 29 | } 30 | } -------------------------------------------------------------------------------- /app/Content/Admin/Source.php: -------------------------------------------------------------------------------- 1 | $item->id, 21 | "name" => $item->name, 22 | "avatar" => $item->avatar, 23 | 'created_at' => $item->created_at->format('Y-m-d H:i'), 24 | ]; 25 | } 26 | 27 | public function validator(array $data, ServerRequestInterface $request, array $args): array 28 | { 29 | return [ 30 | "name" => ["required", __('content.source.validator.name', 'manage')], 31 | ]; 32 | } 33 | 34 | public function format(Data $data, ServerRequestInterface $request, array $args): array 35 | { 36 | return [ 37 | "name" => $data->name, 38 | "avatar" => $data->avatar, 39 | ]; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/Content/Admin/Tags.php: -------------------------------------------------------------------------------- 1 | $item->id, 21 | "name" => $item->name, 22 | "count" => $item->count, 23 | "view" => $item->view, 24 | "created_at" => $item->created_at->format('Y-m-d H:i'), 25 | ]; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/Content/Api/Category.php: -------------------------------------------------------------------------------- 1 | getQueryParams(); 20 | $query = \App\Content\Models\ArticleClass::query(); 21 | if ($params['class']) { 22 | $query->where('parent_id', $params['class']); 23 | } 24 | $list = $query->get()->toTree(); 25 | return send($response, 'ok', [ 26 | 'list' => $list->toArray() ?: [], 27 | ]); 28 | } 29 | 30 | 31 | } -------------------------------------------------------------------------------- /app/Content/App.php: -------------------------------------------------------------------------------- 1 | 'article' 15 | ]; 16 | 17 | public function __construct(public mixed $info, public int $userId) 18 | { 19 | } 20 | 21 | public function getParams(): array 22 | { 23 | return $this->params; 24 | } 25 | 26 | public function setParams($params): void 27 | { 28 | $this->params = [...$this->params, $params]; 29 | } 30 | 31 | } -------------------------------------------------------------------------------- /app/Content/Langs/manage.en-US.yaml: -------------------------------------------------------------------------------- 1 | content: 2 | name: Article Management 3 | article: 4 | name: Article content 5 | validator: 6 | title: Please enter a title 7 | class_id: Please select a category 8 | source: Please enter the author 9 | category: 10 | name: Article classification 11 | validator: 12 | name: Please enter a name 13 | article: Please delete articles under this category first 14 | magic: 15 | name: Rubik's cube data 16 | top: 17 | name: Top data 18 | topSave: 19 | name: Top saving 20 | source: 21 | name: Article source 22 | validator: 23 | name: Please enter a name 24 | page: 25 | name: Page content 26 | validator: 27 | title: Please enter a title 28 | name: Please enter the call name 29 | menu: 30 | name: Menu management 31 | validator: 32 | title: Please enter a title 33 | name: Please enter the call name 34 | menuData: 35 | name: Menu Group Management 36 | validator: 37 | title: Please enter the group title 38 | attr: 39 | name: Article attributes 40 | validator: 41 | name: Please enter a name 42 | replace: 43 | name: Content replacement 44 | tags: 45 | name: Article tags 46 | comment: 47 | name: Article comments 48 | recommend: 49 | name: Article recommendation -------------------------------------------------------------------------------- /app/Content/Langs/manage.ja-JP.yaml: -------------------------------------------------------------------------------- 1 | content: 2 | name: 記事の管理 3 | article: 4 | name: 記事の内容 5 | validator: 6 | title: タイトルを入力してください 7 | class_id: 分類を選択してください 8 | source: 作者を入力してください 9 | category: 10 | name: 記事の分類 11 | validator: 12 | name: 名前を入力してください 13 | article: まずこの分類の下の記事を削除してください 14 | magic: 15 | name: キューブデータ 16 | top: 17 | name: セットトップデータ 18 | topSave: 19 | name: セットトップ保存 20 | source: 21 | name: 記事のソース 22 | validator: 23 | name: 名前を入力してください 24 | page: 25 | name: ページの内容 26 | validator: 27 | title: タイトルを入力してください 28 | name: 呼び出し名を入力してください 29 | menu: 30 | name: メニュー管理 31 | validator: 32 | title: タイトルを入力してください 33 | name: 呼び出し名を入力してください 34 | menuData: 35 | name: メニューグループ管理 36 | validator: 37 | title: グループ化タイトルを入力してください 38 | attr: 39 | name: 記事のプロパティ 40 | validator: 41 | name: 名前を入力してください 42 | replace: 43 | name: コンテンツ置換 44 | tags: 45 | name: 記事のラベル 46 | comment: 47 | name: 記事のコメント 48 | recommend: 49 | name: 記事のおすすめ -------------------------------------------------------------------------------- /app/Content/Langs/manage.ko-KR.yaml: -------------------------------------------------------------------------------- 1 | content: 2 | name: 문서 관리 3 | article: 4 | name: 기사 내용 5 | validator: 6 | title: 제목을 입력하십시오. 7 | class_id: 분류를 선택하십시오. 8 | source: 작성자를 입력하십시오. 9 | category: 10 | name: 문장 분류 11 | validator: 12 | name: 이름을 입력하십시오. 13 | article: 먼저 이 분류 아래 글을 삭제하십시오 14 | magic: 15 | name: 큐브 데이터 16 | top: 17 | name: 상단 데이터 18 | topSave: 19 | name: 위쪽 설정 저장 20 | source: 21 | name: 기사 출처 22 | validator: 23 | name: 이름을 입력하십시오. 24 | page: 25 | name: 페이지 내용 26 | validator: 27 | title: 제목을 입력하십시오. 28 | name: 호출 이름을 입력하십시오. 29 | menu: 30 | name: 메뉴 관리 31 | validator: 32 | title: 제목을 입력하십시오. 33 | name: 호출 이름을 입력하십시오. 34 | menuData: 35 | name: 메뉴 그룹 관리 36 | validator: 37 | title: 그룹 제목을 입력하십시오. 38 | attr: 39 | name: 기사 등록 정보 40 | validator: 41 | name: 이름을 입력하십시오. 42 | replace: 43 | name: 컨텐트 교체 44 | tags: 45 | name: 기사 태그 46 | comment: 47 | name: 기사 리뷰 48 | recommend: 49 | name: 기사 추천 -------------------------------------------------------------------------------- /app/Content/Langs/manage.ru-RU.yaml: -------------------------------------------------------------------------------- 1 | content: 2 | name: Управление статьями 3 | article: 4 | name: Статьи 5 | validator: 6 | title: Введите заголовок 7 | class_id: Выберите классификацию 8 | source: Введите автора 9 | category: 10 | name: Классификация статей 11 | validator: 12 | name: Введите имя 13 | article: Пожалуйста, удалите статью из этой категории. 14 | magic: 15 | name: Данные кубика Рубика 16 | top: 17 | name: Данные о потолке 18 | topSave: 19 | name: Сохранить сверху 20 | source: 21 | name: Источник статьи 22 | validator: 23 | name: Введите имя 24 | page: 25 | name: Содержание страницы 26 | validator: 27 | title: Введите заголовок 28 | name: Введите имя вызова 29 | menu: 30 | name: Меню Управление 31 | validator: 32 | title: Введите заголовок 33 | name: Введите имя вызова 34 | menuData: 35 | name: Управление группами меню 36 | validator: 37 | title: Введите заголовок группы 38 | attr: 39 | name: Свойства статьи 40 | validator: 41 | name: Введите имя 42 | replace: 43 | name: Замена содержимого 44 | tags: 45 | name: Теги статей 46 | comment: 47 | name: Статьи 48 | recommend: 49 | name: Статья рекомендует -------------------------------------------------------------------------------- /app/Content/Langs/manage.zh-CN.yaml: -------------------------------------------------------------------------------- 1 | content: 2 | name: 文章管理 3 | article: 4 | name: 文章内容 5 | validator: 6 | title: 请输入标题 7 | class_id: 请选择分类 8 | source: 请输入作者 9 | category: 10 | name: 文章分类 11 | validator: 12 | name: 请输入名称 13 | article: 请先删除该分类下文章 14 | magic: 15 | name: 魔方数据 16 | top: 17 | name: 置顶数据 18 | topSave: 19 | name: 置顶保存 20 | source: 21 | name: 文章来源 22 | validator: 23 | name: 请输入名称 24 | page: 25 | name: 页面内容 26 | validator: 27 | title: 请输入标题 28 | name: 请输入调用名 29 | menu: 30 | name: 菜单管理 31 | validator: 32 | title: 请输入标题 33 | name: 请输入调用名 34 | menuData: 35 | name: 菜单组管理 36 | validator: 37 | title: 请输入分组标题 38 | attr: 39 | name: 文章属性 40 | validator: 41 | name: 请输入名称 42 | replace: 43 | name: 内容替换 44 | tags: 45 | name: 文章标签 46 | comment: 47 | name: 文章评论 48 | recommend: 49 | name: 文章推荐 -------------------------------------------------------------------------------- /app/Content/Langs/manage.zh-TW.yaml: -------------------------------------------------------------------------------- 1 | content: 2 | name: 文章管理 3 | article: 4 | name: 文章內容 5 | validator: 6 | title: 請輸入標題 7 | class_id: 請選擇分類 8 | source: 請輸入作者 9 | category: 10 | name: 文章分類 11 | validator: 12 | name: 請輸入名稱 13 | article: 請先删除該分類下文章 14 | magic: 15 | name: 魔方數據 16 | top: 17 | name: 置頂數據 18 | topSave: 19 | name: 置頂保存 20 | source: 21 | name: 文章來源 22 | validator: 23 | name: 請輸入名稱 24 | page: 25 | name: 頁面內容 26 | validator: 27 | title: 請輸入標題 28 | name: 請輸入調用名 29 | menu: 30 | name: 選單管理 31 | validator: 32 | title: 請輸入標題 33 | name: 請輸入調用名 34 | menuData: 35 | name: 選單組管理 36 | validator: 37 | title: 請輸入分組標題 38 | attr: 39 | name: 文章内容 40 | validator: 41 | name: 請輸入名稱 42 | replace: 43 | name: 內容替換 44 | tags: 45 | name: 文章標籤 46 | comment: 47 | name: 文章評論 48 | recommend: 49 | name: 文章推薦 -------------------------------------------------------------------------------- /app/Content/Listener/MemberListener.php: -------------------------------------------------------------------------------- 1 | setMap('文章', 'article', Article::class, function ($item) { 19 | return [ 20 | 'images' => $item->hastable->images, 21 | 'description' => $item->hastable->descriptions, 22 | 'view' => $item->view + $item->virtual_view 23 | ]; 24 | }); 25 | } 26 | 27 | #[Listener(name: 'member.comment')] 28 | public function comment(CommentEvent $event): void 29 | { 30 | $event->setMap('文章', 'article', Article::class); 31 | } 32 | 33 | #[Listener(name: 'member.praise')] 34 | public function praise(PraiseEvent $event): void 35 | { 36 | $event->setMap('文章', 'article', Article::class); 37 | } 38 | 39 | } -------------------------------------------------------------------------------- /app/Content/Models/ArticleAttr.php: -------------------------------------------------------------------------------- 1 | id(); 19 | $table->timestamps(); 20 | $table->string('name')->comment('属性'); 21 | } 22 | 23 | public function seed(Connection $db) { 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Content/Models/ArticleAttrHas.php: -------------------------------------------------------------------------------- 1 | bigInteger('attr_id')->index(); 21 | $table->bigInteger('article_id')->index(); 22 | } 23 | 24 | public function seed(Connection $db) { 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/Content/Models/ArticleClass.php: -------------------------------------------------------------------------------- 1 | id(); 23 | $table->bigInteger('magic_id')->nullable(); 24 | $table->string('name'); 25 | $table->string('image')->nullable(); 26 | $table->json('tops')->nullable(); 27 | NestedSet::columns($table); 28 | $table->timestamps(); 29 | } 30 | 31 | public function seed(Connection $db) 32 | { 33 | } 34 | 35 | protected $casts = [ 36 | 'tops' => 'array' 37 | ]; 38 | 39 | } 40 | -------------------------------------------------------------------------------- /app/Content/Models/ArticleRecommend.php: -------------------------------------------------------------------------------- 1 | id(); 20 | $table->string('name')->index(); 21 | $table->timestamps(); 22 | } 23 | 24 | 25 | public function seed(Connection $db) 26 | { 27 | } 28 | 29 | public function articles(): BelongsToMany { 30 | return $this->belongsToMany(Article::class, 'article_recommend_has', 'recommend_id', 'article_id')->withPivot('sort')->orderBy('pivot_sort'); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /app/Content/Models/ArticleRecommendHas.php: -------------------------------------------------------------------------------- 1 | bigInteger('article_id')->index(); 23 | $table->bigInteger('recommend_id')->index(); 24 | $table->bigInteger('sort')->index(); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /app/Content/Models/ArticleReplace.php: -------------------------------------------------------------------------------- 1 | id(); 20 | $table->string('from')->index(); 21 | $table->string('to')->index(); 22 | $table->timestamps(); 23 | } 24 | 25 | public function seed(Connection $db) 26 | { 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Content/Models/ArticleSource.php: -------------------------------------------------------------------------------- 1 | id(); 21 | $table->string('name')->index(); 22 | $table->string('avatar')->nullable(); 23 | $table->timestamps(); 24 | } 25 | 26 | 27 | public function seed(Connection $db) 28 | { 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /app/Content/Models/ArticleTags.php: -------------------------------------------------------------------------------- 1 | id(); 21 | $table->string('name')->index(); 22 | $table->bigInteger('count')->index(); 23 | $table->bigInteger('view')->index(); 24 | $table->timestamps(); 25 | } 26 | 27 | public function articles(): BelongsToMany { 28 | return $this->belongsToMany(Article::class, 'article_tags_has', 'tag_id', 'article_id'); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/Content/Models/ArticleTagsHas.php: -------------------------------------------------------------------------------- 1 | bigInteger('article_id')->index(); 23 | $table->bigInteger('tag_id')->index(); 24 | } 25 | 26 | 27 | } 28 | -------------------------------------------------------------------------------- /app/Content/Models/Menu.php: -------------------------------------------------------------------------------- 1 | id(); 21 | $table->string('name')->comment('调用名'); 22 | $table->string('title')->comment('菜单描述'); 23 | $table->timestamps(); 24 | } 25 | 26 | public function seed(Connection $db) 27 | { 28 | } 29 | 30 | protected static function boot(): void 31 | { 32 | parent::boot(); 33 | static::deleting(function($modal) { 34 | $modal->data()->delete(); 35 | }); 36 | } 37 | 38 | public function data(): \Illuminate\Database\Eloquent\Relations\HasMany 39 | { 40 | return $this->hasMany(MenuData::class, 'menu_id', 'id'); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/Content/Models/MenuData.php: -------------------------------------------------------------------------------- 1 | id(); 28 | $table->bigInteger('menu_id')->comment('菜单ID'); 29 | $table->string('title')->comment('菜单标题'); 30 | $table->string('subtitle')->nullable()->comment('菜单子标题'); 31 | $table->string('image')->nullable()->comment('菜单描述'); 32 | $table->string('url')->nullable()->comment('菜单链接'); 33 | NestedSet::columns($table); 34 | $table->timestamps(); 35 | } 36 | 37 | 38 | public function seed(Connection $db) 39 | { 40 | } 41 | 42 | public function menu(): \Illuminate\Database\Eloquent\Relations\HasOne 43 | { 44 | return $this->hasOne(Menu::class, 'id', 'menu_id'); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/Content/Models/Page.php: -------------------------------------------------------------------------------- 1 | id(); 19 | $table->string('name')->comment('页面名'); 20 | $table->string('title')->comment('页面标题'); 21 | $table->string('subtitle')->nullable()->comment('页面副标题'); 22 | $table->string('image')->nullable()->comment('页面封面图'); 23 | $table->longText('content')->nullable()->comment('页面内容'); 24 | $table->bigInteger('virtual_view')->default(0)->comment('虚拟访问量'); 25 | $table->bigInteger('view')->default(0)->comment('访问量'); 26 | $table->boolean('status')->default(true)->comment('状态'); 27 | $table->string('keywords')->comment('关键词')->nullable(); 28 | $table->string('descriptions')->comment('描述')->nullable(); 29 | $table->timestamps(); 30 | } 31 | 32 | public function seed(Connection $db) 33 | { 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/Content/Service/Category.php: -------------------------------------------------------------------------------- 1 | where($where); 14 | } 15 | 16 | public static function lists(array $where = []) 17 | { 18 | return self::query($where)->get(); 19 | } 20 | 21 | public static function tree(array $where = []) 22 | { 23 | return self::query($where)->get()->toTree(); 24 | } 25 | 26 | public static function info(int $id, array $where = []): object 27 | { 28 | $info = self::query($where)->find($id); 29 | if (!$info) { 30 | throw new ExceptionNotFound(); 31 | } 32 | return $info; 33 | } 34 | 35 | public static function breadcrumb(int $id) 36 | { 37 | return \App\Content\Models\ArticleClass::query()->ancestorsAndSelf($id); 38 | } 39 | 40 | } -------------------------------------------------------------------------------- /app/Content/Service/Menu.php: -------------------------------------------------------------------------------- 1 | where($where); 14 | if ($name) { 15 | $query->whereHas('menu', function ($query) use ($name) { 16 | $query->where('name', $name); 17 | }); 18 | } 19 | return $query; 20 | } 21 | 22 | public static function lists(string $name = '', array $where = [], ?string $path = '') 23 | { 24 | return self::query($name, $where)->get()->toTree()->map(function ($item) use ($path) { 25 | $item->active = false; 26 | if ($item->url == '/') { 27 | if ($path == $item->url) { 28 | $item->active = true; 29 | } 30 | }else { 31 | if (str_contains($path, $item->url)) { 32 | $item->active = true; 33 | } 34 | } 35 | return $item; 36 | }); 37 | } 38 | 39 | } -------------------------------------------------------------------------------- /app/Content/Service/Page.php: -------------------------------------------------------------------------------- 1 | where($where); 14 | } 15 | 16 | public static function info(string $name, array $where = []): object 17 | { 18 | $where['name'] = $name; 19 | $info = self::query($where)->first(); 20 | if (!$info) { 21 | throw new ExceptionNotFound(); 22 | } 23 | return $info; 24 | } 25 | 26 | } -------------------------------------------------------------------------------- /app/Content/Service/Source.php: -------------------------------------------------------------------------------- 1 | where('name', $name)->exists()) { 19 | ArticleSource::query()->create([ 20 | 'name' => $name 21 | ]); 22 | } 23 | } 24 | 25 | } -------------------------------------------------------------------------------- /app/Content/Service/Tags.php: -------------------------------------------------------------------------------- 1 | where($where); 15 | } 16 | 17 | // 列表 18 | public static function lists(array $where = [], int $limit = 20, $order = 'count desc') 19 | { 20 | return self::query($where)->limit($limit)->orderByRaw($order)->get(); 21 | } 22 | 23 | // 分页 24 | public static function page(array $where = [], int $limit = 20, $order = 'count desc'): \Illuminate\Contracts\Pagination\LengthAwarePaginator 25 | { 26 | return self::query($where)->orderByRaw($order)->paginate($limit); 27 | } 28 | 29 | } -------------------------------------------------------------------------------- /app/Content/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "duxweb/content", 3 | "description": "Content Management Applications", 4 | "version": "0.3.3", 5 | "phpDependencies": { 6 | "pelago/emogrifier": "^7.1" 7 | } 8 | } -------------------------------------------------------------------------------- /app/ContentExtend/App.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {$title} 9 | {if !$vite['dev']} 10 | 11 | 12 | {else} 13 | 20 | 21 | {/if} 22 | 23 | 24 | 25 |
26 | 27 | {if $vite['dev']} 28 | 29 | {/if} 30 | 31 | -------------------------------------------------------------------------------- /app/Install/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "duxweb/install", 3 | "description": "Installation Wizard Applications", 4 | "version": "0.0.5" 5 | } -------------------------------------------------------------------------------- /app/Poster/Admin/Poster.php: -------------------------------------------------------------------------------- 1 | $item->id, 21 | "title" => $item->title, 22 | "data" => $item->data, 23 | ]; 24 | } 25 | 26 | 27 | public function validator(array $data, ServerRequestInterface $request, array $args): array 28 | { 29 | return [ 30 | "title" => ["required", __('tools.poster.validator.title', 'manage')], 31 | ]; 32 | } 33 | 34 | public function format(Data $data, ServerRequestInterface $request, array $args): array 35 | { 36 | return [ 37 | "title" => $data->title, 38 | "data" => $data->data 39 | ]; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/Poster/App.php: -------------------------------------------------------------------------------- 1 | id(); 20 | $table->string("title")->comment('海报标题'); 21 | $table->json('data')->comment('海报数据')->nullable(); 22 | $table->timestamps(); 23 | } 24 | 25 | protected $casts = [ 26 | 'data' => 'array' 27 | ]; 28 | 29 | 30 | public function seed(Connection $db) 31 | { 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/Poster/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "duxweb/poster", 3 | "description": "Poster Designer", 4 | "version": "0.0.4" 5 | } -------------------------------------------------------------------------------- /app/System/Docs/README.md: -------------------------------------------------------------------------------- 1 | # 系统模块 2 | 3 | - 提供基础 admin 后台端 4 | - 提供基础 api 鉴权路由 5 | - 提供基础 web 路由 6 | - 提供后台管理操作记录 7 | -------------------------------------------------------------------------------- /app/System/Enum/PlatformEnum.php: -------------------------------------------------------------------------------- 1 | '电脑端', 24 | self::WAP => 'H5手机端', 25 | self::APP => 'APP', 26 | self::WECHAT => '微信公众号', 27 | self::WEAPP => '微信小程序', 28 | }; 29 | } 30 | 31 | 32 | public static function list(): array 33 | { 34 | return array_map( 35 | fn(PlatformEnum $item) => $item->value, 36 | PlatformEnum::cases() 37 | ); 38 | } 39 | 40 | /** 41 | * 请求地址 42 | * @return string|null 43 | * @throws \DI\DependencyException 44 | * @throws \DI\NotFoundException 45 | */ 46 | public function url(): ?string 47 | { 48 | return match ($this) { 49 | self::WEB, self::WAP, self::APP, self::WECHAT => App::config('use')->get('domain.web'), 50 | default => null 51 | }; 52 | } 53 | 54 | 55 | } -------------------------------------------------------------------------------- /app/System/Langs/manage.ja-JP.yaml: -------------------------------------------------------------------------------- 1 | system: 2 | name: システム 3 | auth: 4 | validator: 5 | username: アカウントを入力してください 6 | password: パスワードを入力してください 7 | error: 8 | login: アカウントまたはパスワードが間違っている 9 | passwordCheck: 3回のログインパスワードエラー、1分待ち 10 | user: 11 | name: 管理者管理 12 | validator: 13 | nickname: ニックネームを入力してください 14 | username: ユーザー名を入力してください 15 | usernameExists: ユーザーはすでに存在します 16 | password: パスワードを入力してください 17 | roles: 役割を選択してください 18 | role: 19 | name: 管理者ロール 20 | validator: 21 | name: 名前を入力してください 22 | permission: 23 | name: アクセス権 24 | operate: 25 | name: オペレーションレコード 26 | total: 27 | name: システム統計 28 | stats: 29 | name: 運転状態 30 | hardware: 31 | name: ハードウェアデータ 32 | speedNode: 33 | name: そくどそくていノード 34 | speedTest: 35 | name: サイト速度測定 36 | validator: 37 | node: 使用可能な速度測定ノードがありません 38 | line: 速度測定回路を選択してください 39 | token: 速度測定トークンに記入してください 40 | api: 41 | name: インタフェース認証 42 | validator: 43 | name: 名前を入力してください 44 | 45 | -------------------------------------------------------------------------------- /app/System/Langs/manage.ko-KR.yaml: -------------------------------------------------------------------------------- 1 | system: 2 | name: 시스템 3 | auth: 4 | validator: 5 | username: 계정을 입력하세요 6 | password: 암호를 입력하십시오. 7 | error: 8 | login: 아이디나 비밀번호 오류 9 | passwordCheck: 로그인 암호 오류 세 번, 1분 대기 10 | user: 11 | name: 관리자 관리 12 | validator: 13 | nickname: 닉네임을 입력하십시오. 14 | username: 사용자 이름을 입력하십시오. 15 | usernameExists: 사용자가 이미 있습니다. 16 | password: 암호를 입력하십시오. 17 | roles: 역할을 선택하십시오. 18 | role: 19 | name: 관리자 역할 20 | validator: 21 | name: 이름을 입력하십시오. 22 | permission: 23 | name: 권한 24 | operate: 25 | name: 작업 레코드 26 | total: 27 | name: 시스템 통계 28 | stats: 29 | name: 실행 상태 30 | hardware: 31 | name: 하드웨어 데이터 32 | speedNode: 33 | name: 속도 측정 노드 34 | speedTest: 35 | name: 사이트 속도 측정 36 | validator: 37 | node: 사용 가능한 속도 측정 노드 없음 38 | line: 속도 측정 회선을 선택하십시오. 39 | token: 속도 측정 토큰을 기입해 주십시오. 40 | api: 41 | name: 인터페이스 인증 42 | validator: 43 | name: 이름을 입력하십시오. 44 | 45 | -------------------------------------------------------------------------------- /app/System/Langs/manage.ru-RU.yaml: -------------------------------------------------------------------------------- 1 | system: 2 | name: Системы 3 | auth: 4 | validator: 5 | username: Введите номер счета. 6 | password: Введите пароль. 7 | error: 8 | login: Ошибка аккаунта или пароля. 9 | passwordCheck: Три ошибки в пароле входа, одна минута ожидания 10 | user: 11 | name: Управление администраторами 12 | validator: 13 | nickname: Введите псевдоним 14 | username: Введите имя пользователя 15 | usernameExists: Этот пользователь уже существует 16 | password: Введите пароль. 17 | roles: Выберите роль 18 | role: 19 | name: Роль администратора 20 | validator: 21 | name: Введите имя 22 | permission: 23 | name: Полномочия 24 | operate: 25 | name: Записи операций 26 | total: 27 | name: Системная статистика 28 | stats: 29 | name: Режим работы 30 | hardware: 31 | name: Аппаратные данные 32 | speedNode: 33 | name: Узлы измерения скорости 34 | speedTest: 35 | name: станционное измерение скорости 36 | validator: 37 | node: Нет доступных узлов измерения скорости 38 | line: Выберите линию измерения скорости. 39 | token: Заполните тахометр. 40 | api: 41 | name: Разрешение интерфейса 42 | validator: 43 | name: Введите имя 44 | 45 | -------------------------------------------------------------------------------- /app/System/Langs/manage.zh-CN.yaml: -------------------------------------------------------------------------------- 1 | system: 2 | name: 系统 3 | auth: 4 | validator: 5 | username: 请输入账号 6 | password: 请输入密码 7 | error: 8 | login: 账号或者密码错误 9 | passwordCheck: 三次登录密码错误,等待一分钟 10 | user: 11 | name: 管理员管理 12 | validator: 13 | nickname: 请输入昵称 14 | username: 请输入用户名 15 | usernameExists: 该用户已存在 16 | password: 请输入密码 17 | roles: 请选择角色 18 | role: 19 | name: 管理员角色 20 | validator: 21 | name: 请输入名称 22 | permission: 23 | name: 权限 24 | operate: 25 | name: 操作记录 26 | total: 27 | name: 系统统计 28 | stats: 29 | name: 运行状态 30 | hardware: 31 | name: 硬件数据 32 | speedNode: 33 | name: 测速节点 34 | speedTest: 35 | name: 站点测速 36 | validator: 37 | node: 暂无可用测速节点 38 | line: 请选择测速线路 39 | token: 请填写测速 token 40 | api: 41 | name: 接口授权 42 | validator: 43 | name: 请输入名称 44 | 45 | -------------------------------------------------------------------------------- /app/System/Langs/manage.zh-TW.yaml: -------------------------------------------------------------------------------- 1 | system: 2 | name: 系統 3 | auth: 4 | validator: 5 | username: 請輸入帳號 6 | password: 請輸入密碼 7 | error: 8 | login: 帳號或者密碼錯誤 9 | passwordCheck: 三次登入密碼錯誤,等待一分鐘 10 | user: 11 | name: 管理員管理 12 | validator: 13 | nickname: 請輸入昵稱 14 | username: 請輸入用戶名 15 | usernameExists: 該用戶已存在 16 | password: 請輸入密碼 17 | roles: 請選擇角色 18 | role: 19 | name: 管理員角色 20 | validator: 21 | name: 請輸入名稱 22 | permission: 23 | name: 權限 24 | operate: 25 | name: 操作記錄 26 | total: 27 | name: 系統統計 28 | stats: 29 | name: 運行狀態 30 | hardware: 31 | name: 硬體數據 32 | speedNode: 33 | name: 測速節點 34 | speedTest: 35 | name: 網站測速 36 | validator: 37 | node: 暫無可用測速節點 38 | line: 請選擇測速線路 39 | token: 請填寫測速token 40 | api: 41 | name: 介面授權 42 | validator: 43 | name: 請輸入名稱 44 | 45 | -------------------------------------------------------------------------------- /app/System/Models/Config.php: -------------------------------------------------------------------------------- 1 | string("name")->comment("配置名称"); 17 | $table->longText("value")->comment("配置值")->nullable(); 18 | } 19 | 20 | } -------------------------------------------------------------------------------- /app/System/Models/LogApi.php: -------------------------------------------------------------------------------- 1 | id(); 17 | $table->string('has_type')->comment("关联类型"); 18 | $table->string('method')->comment("请求方法"); 19 | $table->string('name')->comment("路由名")->nullable(); 20 | $table->string('title')->comment("路由标题")->nullable(); 21 | $table->date('date')->comment("日期"); 22 | $table->integer('pv')->comment("访问量")->default(1); 23 | $table->integer('uv')->comment("访客量")->default(1); 24 | $table->decimal('max_time', 11, 3)->comment("最大时间"); 25 | $table->decimal('min_time', 11, 3)->comment("最小时间"); 26 | $table->timestamps(); 27 | } 28 | 29 | public function user(): \Illuminate\Database\Eloquent\Relations\MorphTo { 30 | return $this->morphTo(); 31 | } 32 | 33 | } -------------------------------------------------------------------------------- /app/System/Models/LogLogin.php: -------------------------------------------------------------------------------- 1 | id(); 20 | $table->string('user_type')->comment("关联类型"); 21 | $table->string('user_id')->comment("关联id"); 22 | $table->string('browser')->nullable(); 23 | $table->string('ip')->nullable(); 24 | $table->string('platform')->nullable(); 25 | $table->boolean('status')->default(true); 26 | $table->timestamps(); 27 | } 28 | 29 | } -------------------------------------------------------------------------------- /app/System/Models/LogVisit.php: -------------------------------------------------------------------------------- 1 | id(); 17 | $table->string('has_type')->comment("关联类型"); 18 | $table->string('has_id')->comment("关联id")->nullable(); 19 | $table->integer('pv')->comment("访问量")->default(1); 20 | $table->integer('uv')->comment("访客量")->default(1); 21 | $table->timestamps(); 22 | } 23 | 24 | public function user(): \Illuminate\Database\Eloquent\Relations\MorphTo { 25 | return $this->morphTo(); 26 | } 27 | 28 | } -------------------------------------------------------------------------------- /app/System/Models/LogVisitData.php: -------------------------------------------------------------------------------- 1 | id(); 17 | $table->date('date')->comment("日期"); 18 | $table->string('has_type')->comment("关联类型"); 19 | $table->string('has_id')->comment("关联id")->nullable(); 20 | $table->string('driver')->comment("设备")->nullable(); 21 | $table->integer('pv')->comment("访问量")->default(1); 22 | $table->integer('uv')->comment("访客量")->default(1); 23 | $table->timestamps(); 24 | } 25 | 26 | public function user(): \Illuminate\Database\Eloquent\Relations\MorphTo { 27 | return $this->morphTo(); 28 | } 29 | 30 | } -------------------------------------------------------------------------------- /app/System/Models/LogVisitSpider.php: -------------------------------------------------------------------------------- 1 | id(); 17 | $table->date('date')->comment("日期"); 18 | $table->string('has_type')->comment("关联类型"); 19 | $table->string('has_id')->comment("关联id")->nullable(); 20 | $table->string('name')->comment("蜘蛛名称")->nullable(); 21 | $table->string('path')->comment("页面路径")->nullable(); 22 | $table->integer('num')->comment("数量")->default(0); 23 | $table->timestamps(); 24 | } 25 | 26 | public function user(): \Illuminate\Database\Eloquent\Relations\MorphTo { 27 | return $this->morphTo(); 28 | } 29 | 30 | } -------------------------------------------------------------------------------- /app/System/Models/LogVisitUv.php: -------------------------------------------------------------------------------- 1 | id(); 17 | $table->date('date')->comment("日期"); 18 | $table->string('has_type')->comment("关联类型"); 19 | $table->string('has_id')->comment("关联id")->nullable(); 20 | $table->string('uuid')->comment("唯一标识")->nullable(); 21 | $table->string('driver')->comment("设备")->nullable(); 22 | $table->string('ip')->comment("ip")->nullable(); 23 | $table->string('country')->comment("国家")->nullable(); 24 | $table->string('province')->comment("省份")->nullable(); 25 | $table->string('city')->comment("城市")->nullable(); 26 | $table->integer('num')->comment("数量")->default(0); 27 | $table->string('browser')->comment("浏览器")->nullable(); 28 | $table->timestamps(); 29 | } 30 | 31 | public function user(): \Illuminate\Database\Eloquent\Relations\MorphTo { 32 | return $this->morphTo(); 33 | } 34 | 35 | } -------------------------------------------------------------------------------- /app/System/Models/SystemApi.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->char('name')->comment('名称'); 19 | $table->char('secret_id')->comment('api id'); 20 | $table->string('secret_key')->comment('api key'); 21 | $table->boolean('status')->default(true); 22 | $table->timestamps(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/System/Models/SystemRole.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name'); 19 | $table->json('permission')->nullable(); 20 | $table->timestamps(); 21 | } 22 | 23 | protected $casts = [ 24 | 'permission' => 'array' 25 | ]; 26 | 27 | public function seed(Connection $db) { 28 | $db->table($this->table)->insert([ 29 | 'name' => 'Admins', 30 | 'created_at' => now(), 31 | 'updated_at' => now(), 32 | ]); 33 | } 34 | 35 | public function users(): BelongsToMany { 36 | return $this->belongsToMany(SystemUser::class, 'system_user_role', 'role_id', 'user_id'); 37 | } 38 | 39 | } -------------------------------------------------------------------------------- /app/System/Models/SystemUserRole.php: -------------------------------------------------------------------------------- 1 | integer('role_id'); 20 | $table->integer('user_id'); 21 | } 22 | 23 | public function seed(Connection $db) { 24 | $db->table($this->table)->insert([ 25 | 'role_id' => 1, 26 | 'user_id' => 1, 27 | ]); 28 | } 29 | 30 | } -------------------------------------------------------------------------------- /app/System/Service/Stats.php: -------------------------------------------------------------------------------- 1 | getMenu()->get("admin"), $app); 18 | \App\Tools\Config\Permission::Admin($app->getPermission()->get("admin"), $app); 19 | } 20 | 21 | 22 | } 23 | -------------------------------------------------------------------------------- /app/Tools/Config/Permission.php: -------------------------------------------------------------------------------- 1 | group("tools.magicData"); 19 | self::magicPermissionGen($data, $group); 20 | } 21 | 22 | static function magicPermissionGen( ?array $data, \Dux\Permission\Permission|PermissionGroup $permission): void 23 | { 24 | foreach ($data as $vo) { 25 | if (!isset($vo['children'])) { 26 | $permission->add("tools.data." . $vo['name'], false)->label($vo['label']); 27 | } else { 28 | self::magicPermissionGen($vo['children'], $permission); 29 | } 30 | } 31 | 32 | } 33 | 34 | } -------------------------------------------------------------------------------- /app/Tools/Docs/README.md: -------------------------------------------------------------------------------- 1 | # 工具模块 2 | 3 | - 提供地区数据导入 4 | - 提供基础下载服务调用 5 | - 提供文件管理器数据 6 | - 提供数据魔方功能,满足 90% 的基础数据需求 7 | -------------------------------------------------------------------------------- /app/Tools/Event/BackupEvent.php: -------------------------------------------------------------------------------- 1 | data[$name] = [ 19 | 'name' => $name, 20 | 'model' => $model, 21 | ]; 22 | } 23 | 24 | public function get(): array 25 | { 26 | return $this->data; 27 | } 28 | 29 | } -------------------------------------------------------------------------------- /app/Tools/Event/SourceEvent.php: -------------------------------------------------------------------------------- 1 | data[$name] = [ 19 | 'name' => $name, 20 | 'label' => $label, 21 | 'route' => $route, 22 | 'data' => $data, 23 | 'format' => $format 24 | ]; 25 | } 26 | 27 | public function get(): array 28 | { 29 | return $this->data; 30 | } 31 | 32 | } -------------------------------------------------------------------------------- /app/Tools/Func/Common.php: -------------------------------------------------------------------------------- 1 | $date2) { 13 | $startTime = strtotime($date1); 14 | $endTime = strtotime($date2); 15 | } else { 16 | $startTime = strtotime($date2); 17 | $endTime = strtotime($date1); 18 | } 19 | $diff = $startTime - $endTime; 20 | $day = $diff / 86400; 21 | return intval($day); 22 | } 23 | 24 | /** 25 | * 昨日今日占比 26 | * @param float $today 27 | * @param float $yesterday 28 | * @param int $precision 29 | * @return float 30 | */ 31 | function change_percent(float $today, float $yesterday, int $precision = 2): float 32 | { 33 | if($yesterday == 0){ 34 | return min($today, 100); 35 | } 36 | return round(($today - $yesterday) / $yesterday * 100, $precision); 37 | } -------------------------------------------------------------------------------- /app/Tools/Handlers/Download.php: -------------------------------------------------------------------------------- 1 | getAttribute('app'); 15 | $auth = $request->getAttribute('auth'); 16 | $list = ToolsDownload::query()->where('has_user', $app)->where('has_id', $auth['id'])->paginate(10); 17 | 18 | $data = format_data($list, function ($item) { 19 | return [ 20 | 'id' => $item->id, 21 | 'title' => $item->title, 22 | 'url' => $item->url, 23 | 'time' => $item->created_at->format('Y-m-d H:i:s'), 24 | ]; 25 | }); 26 | return send($response, 'ok', $data); 27 | } 28 | 29 | } -------------------------------------------------------------------------------- /app/Tools/Langs/manage.zh-CN.yaml: -------------------------------------------------------------------------------- 1 | tools: 2 | name: 工具 3 | area: 4 | name: 地区数据 5 | import: 6 | name: 导入 7 | cascade: 8 | name: 选择 9 | magicData: 10 | name: 魔方数据 11 | magicGroup: 12 | name: 数据分组 13 | validator: 14 | name: 请输入名称 15 | label: 请输入标签 16 | icon: 请输入图标名 17 | magic: 18 | name: 数据魔方 19 | validator: 20 | name: 数据名只能为英文数字和下划线 21 | group: 请选择数据分组 22 | label: 请输入数据标签 23 | fields: 请配置数据字段 24 | fieldsFull: 字段配置不完整 25 | fieldsFormat: 字段名只能为英文数字和下划线 26 | data: 数据不存在 27 | source: 28 | name: 数据源 29 | config: 30 | name: 配置 31 | sourceData: 32 | name: 数据 33 | magicSource: 34 | name: 数据源 35 | validator: 36 | name: 请输入名称 37 | data: 数据格式不正确 38 | file: 39 | name: 附件管理 40 | fileDir: 41 | name: 附件目录 42 | validator: 43 | name: 请输入目录名 44 | backup: 45 | name: 备份恢复 46 | validator: 47 | table: 请选择导出表 48 | title: 请填写描述 49 | notFound: 没有找到数据 50 | message: 51 | export: 导出数据成功 52 | import: 导入数据成功 53 | import: 54 | name: 导入 55 | export: 56 | name: 导出 57 | download: 58 | name: 下载 59 | poster: 60 | name: 海报 61 | validator: 62 | title: 请填写标题 63 | extend: 64 | name: 扩展 65 | magic: 66 | name: 数据魔方 -------------------------------------------------------------------------------- /app/Tools/Langs/manage.zh-TW.yaml: -------------------------------------------------------------------------------- 1 | tools: 2 | name: 工具 3 | area: 4 | name: 地區數據 5 | import: 6 | name: 導入 7 | cascade: 8 | name: 選擇 9 | magicData: 10 | name: 魔方數據 11 | magicGroup: 12 | name: 數據分組 13 | validator: 14 | name: 請輸入名稱 15 | label: 請輸入標籤 16 | icon: 請輸入圖標名 17 | magic: 18 | name: 數據魔方 19 | validator: 20 | name: 數據名只能為英文數位和底線 21 | group: 請選擇數據分組 22 | label: 請輸入數據標籤 23 | fields: 請配寘數據欄位 24 | fieldsFull: 欄位配寘不完整 25 | fieldsFormat: 欄位名只能為英文數位和底線 26 | data: 數據不存在 27 | source: 28 | name: 資料來源 29 | config: 30 | name: 配寘 31 | sourceData: 32 | name: 數據 33 | magicSource: 34 | name: 資料來源 35 | validator: 36 | name: 請輸入名稱 37 | data: 數據格式不正確 38 | file: 39 | name: 附件管理 40 | fileDir: 41 | name: 附件目錄 42 | validator: 43 | name: 請輸入目錄名 44 | backup: 45 | name: 備份恢復 46 | validator: 47 | table: 請選擇匯出錶 48 | title: 請填寫描述 49 | notFound: 沒有找到數據 50 | message: 51 | export: 匯出數據成功 52 | import: 導入數據成功 53 | import: 54 | name: 導入 55 | export: 56 | name: 匯出 57 | download: 58 | name: 下載 59 | poster: 60 | name: 海報 61 | validator: 62 | title: 請填寫標題 63 | extend: 64 | name: 擴展 65 | magic: 66 | name: 數據魔方 -------------------------------------------------------------------------------- /app/Tools/Models/ToolsArea.php: -------------------------------------------------------------------------------- 1 | id(); 21 | $table->char("parent_code")->default(0); 22 | $table->char("code")->default(0); 23 | $table->string("name"); 24 | $table->integer("level"); 25 | $table->boolean("leaf")->default(true); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/Tools/Models/ToolsBackup.php: -------------------------------------------------------------------------------- 1 | id(); 20 | $table->string("name")->comment('文件名称'); 21 | $table->string('url')->comment('下载链接'); 22 | $table->timestamps(); 23 | } 24 | 25 | 26 | public function seed(Connection $db) 27 | { 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/Tools/Models/ToolsDownload.php: -------------------------------------------------------------------------------- 1 | id(); 20 | $table->string("user_type")->comment('关联类型')->index(); 21 | $table->bigInteger("user_id")->comment('关联用户')->index(); 22 | $table->string("name")->comment('文件名称'); 23 | $table->string('url')->comment('下载链接'); 24 | $table->timestamps(); 25 | } 26 | 27 | 28 | public function seed(Connection $db) 29 | { 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/Tools/Models/ToolsFile.php: -------------------------------------------------------------------------------- 1 | id(); 19 | $table->bigInteger('dir_id')->nullable(); 20 | $table->char('has_type'); 21 | $table->char('driver'); 22 | $table->string('url'); 23 | $table->string('path'); 24 | $table->string('name'); 25 | $table->char('ext'); 26 | $table->integer('size')->default(0); 27 | $table->string('mime')->nullable(); 28 | $table->timestamps(); 29 | } 30 | 31 | public function dir(): \Illuminate\Database\Eloquent\Relations\HasOne 32 | { 33 | return $this->hasOne(ToolsFileDir::class, 'id', 'dir_id'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/Tools/Models/ToolsFileDir.php: -------------------------------------------------------------------------------- 1 | id(); 19 | $table->char('name'); 20 | $table->char('has_type'); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Tools/Models/ToolsMagicData.php: -------------------------------------------------------------------------------- 1 | id(); 28 | $table->bigInteger("magic_id")->comment('关联id')->index(); 29 | $table->json("data")->comment('数据')->nullable(); 30 | NestedSet::columns($table); 31 | $table->timestamps(); 32 | } 33 | 34 | public function seed(Connection $db) 35 | { 36 | } 37 | 38 | protected $casts = [ 39 | 'data' => 'array', 40 | ]; 41 | 42 | public function magic(): \Illuminate\Database\Eloquent\Relations\HasOne 43 | { 44 | return $this->hasOne(ToolsMagic::class, 'id', 'magic_id'); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/Tools/Models/ToolsMagicGroup.php: -------------------------------------------------------------------------------- 1 | id(); 25 | $table->string("label")->comment('分类标签')->nullable(); 26 | $table->string("name")->comment('分类名')->nullable(); 27 | $table->string("icon")->comment('图标')->nullable(); 28 | $table->string("res")->comment('资源名')->nullable(); 29 | $table->integer("sort")->comment('顺序')->nullable(); 30 | NestedSet::columns($table); 31 | $table->timestamps(); 32 | } 33 | 34 | public function seed(Connection $db) 35 | { 36 | } 37 | 38 | public function magics(): \Illuminate\Database\Eloquent\Relations\HasMany 39 | { 40 | return $this->hasMany(ToolsMagic::class, 'group_id', 'id'); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/Tools/Models/ToolsMagicSource.php: -------------------------------------------------------------------------------- 1 | id(); 20 | $table->string("name")->comment('名称')->nullable(); 21 | $table->string("type")->comment('类型 data数组 url远程数据源 source内部数据源')->nullable(); 22 | $table->json("data")->comment('数据')->nullable(); 23 | $table->timestamps(); 24 | } 25 | 26 | protected $casts = [ 27 | 'data' => 'array' 28 | ]; 29 | 30 | public function seed(Connection $db) 31 | { 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/Tools/Scheduler/Test.php: -------------------------------------------------------------------------------- 1 | info('test'); 10 | } 11 | } -------------------------------------------------------------------------------- /app/Tools/Service/Content.php: -------------------------------------------------------------------------------- 1 | '.$content.'')->inlineCss($css)->renderBodyContent(); 13 | } 14 | 15 | } -------------------------------------------------------------------------------- /app/Tools/Service/Download.php: -------------------------------------------------------------------------------- 1 | create([ 21 | 'user_type' => $userType, 22 | 'user_id' => $userId, 23 | 'title' => $title, 24 | 'url' => $url 25 | ]); 26 | } 27 | 28 | } -------------------------------------------------------------------------------- /app/Tools/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "duxweb/tools", 3 | "description": "System Tools Applications", 4 | "version": "0.3.6", 5 | "phpDependencies": { 6 | "chillerlan/php-qrcode": "^4.3", 7 | "pelago/emogrifier": "^7.1" 8 | } 9 | } -------------------------------------------------------------------------------- /auto_install.json: -------------------------------------------------------------------------------- 1 | { 2 | "php_ext":"fileinfo,imagemagick", 3 | "chmod":[ 4 | {"mode":755,"path":"/data"} 5 | ], 6 | "success_url":"/", 7 | "php_versions":"82", 8 | "db_config":"", 9 | "admin_username":"", 10 | "admin_password":"", 11 | "run_path":"/public", 12 | "remove_file":["/auto_install.json"], 13 | "enable_functions":["symlink","readlink", "exec", "system", "putenv", "pcntl_signal", "proc_open"] 14 | } -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "duxweb/duxcms", 3 | "type": "project", 4 | "description": "Lightweight project development system", 5 | "keywords": [ 6 | "duxphp", 7 | "slimphp" 8 | ], 9 | "minimum-stability": "dev", 10 | "prefer-stable": true, 11 | "require": { 12 | "duxweb/dux-lite": "^1.0", 13 | "pelago/emogrifier": "^7.1", 14 | "erusev/parsedown": "^1.7", 15 | "benjaminhoegh/parsedown-toc": "^1.5", 16 | "chillerlan/php-qrcode": "^4.3" 17 | }, 18 | "autoload": { 19 | "psr-4": { 20 | "App\\": "app/", 21 | "Console\\": "console/" 22 | } 23 | }, 24 | "license": "MIT" 25 | } -------------------------------------------------------------------------------- /config/app.yaml: -------------------------------------------------------------------------------- 1 | registers: 2 | - \App\Cloud\App 3 | - \App\Cms\App 4 | - \App\Content\App 5 | - \App\System\App 6 | - \App\Tools\App 7 | - \App\Install\App 8 | - \App\ContentExtend\App 9 | - \App\Poster\App 10 | -------------------------------------------------------------------------------- /config/cache.yaml: -------------------------------------------------------------------------------- 1 | type: files 2 | driver: default 3 | -------------------------------------------------------------------------------- /config/command.yaml: -------------------------------------------------------------------------------- 1 | registers: 2 | - \Console\TestCommand 3 | -------------------------------------------------------------------------------- /config/database.yaml: -------------------------------------------------------------------------------- 1 | db: 2 | drivers: { default: { driver: mysql, host: localhost, database: duxcms, username: root, password: root, port: '3306', prefix: app_ } } 3 | redis: 4 | drivers: { default: { host: 127.0.0.1, port: 6379, timeout: 2.5, auth: null } } 5 | -------------------------------------------------------------------------------- /config/font/AlibabaPuHuiTi-3-55-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/config/font/AlibabaPuHuiTi-3-55-Regular.ttf -------------------------------------------------------------------------------- /config/geo.yaml: -------------------------------------------------------------------------------- 1 | db: %config_path%/geo/ip2region.xdb -------------------------------------------------------------------------------- /config/queue.yaml: -------------------------------------------------------------------------------- 1 | type: redis 2 | driver: default 3 | retry: 3 -------------------------------------------------------------------------------- /config/storage.yaml: -------------------------------------------------------------------------------- 1 | type: local 2 | ext: 3 | - jpg 4 | - jpeg 5 | - png 6 | - bmp 7 | - webp 8 | - mp4 9 | - xls 10 | - xlsx 11 | - doc 12 | - docx 13 | drivers: 14 | local: { type: local, public_url: 'http://localhost/uploads/', path: public/uploads } 15 | -------------------------------------------------------------------------------- /config/use.yaml: -------------------------------------------------------------------------------- 1 | app: 2 | name: Dux 3 | debug: true 4 | cache: false 5 | secret: a9dfda61e965d5101dfbf31e959fe096 6 | domain: 'http://duxcms.test' 7 | clock: false 8 | lang: zh-CN 9 | vite: 10 | dev: false 11 | port: 5173 12 | manage: 13 | indexName: cms 14 | baiduMap: 15 | -------------------------------------------------------------------------------- /console/TestCommand.php: -------------------------------------------------------------------------------- 1 | run(); -------------------------------------------------------------------------------- /iis.rewrite: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /nginx.rewrite: -------------------------------------------------------------------------------- 1 | location / { 2 | try_files $uri $uri/ /index.php$is_args$query_string; 3 | } -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | Composer.'); 6 | } 7 | 8 | require $file; 9 | 10 | // 运行框架 11 | $app = \Dux\App::create(dirname(__DIR__)); 12 | $app->run(); -------------------------------------------------------------------------------- /public/web/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 -------------------------------------------------------------------------------- /public/web/assets/KaTeX_AMS-Regular-DMm9YOAa.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_AMS-Regular-DMm9YOAa.woff -------------------------------------------------------------------------------- /public/web/assets/KaTeX_AMS-Regular-DRggAlZN.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_AMS-Regular-DRggAlZN.ttf -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Fraktur-Regular-CB_wures.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Fraktur-Regular-CB_wures.ttf -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Main-Bold-Cx986IdX.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Main-Bold-Cx986IdX.woff2 -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Main-Bold-Jm3AIy58.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Main-Bold-Jm3AIy58.woff -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Main-Bold-waoOVXN0.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Main-Bold-waoOVXN0.ttf -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Main-Italic-3WenGoN9.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Main-Italic-3WenGoN9.ttf -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Main-Italic-BMLOBm91.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Main-Italic-BMLOBm91.woff -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Main-Regular-B22Nviop.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Main-Regular-B22Nviop.woff2 -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Main-Regular-Dr94JaBh.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Main-Regular-Dr94JaBh.woff -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Main-Regular-ypZvNtVU.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Main-Regular-ypZvNtVU.ttf -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Math-Italic-DA0__PXp.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Math-Italic-DA0__PXp.woff -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Math-Italic-flOr_0UB.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Math-Italic-flOr_0UB.ttf -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Math-Italic-t53AETM-.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Math-Italic-t53AETM-.woff2 -------------------------------------------------------------------------------- /public/web/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf -------------------------------------------------------------------------------- /public/web/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 -------------------------------------------------------------------------------- /public/web/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff -------------------------------------------------------------------------------- /public/web/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 -------------------------------------------------------------------------------- /public/web/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff -------------------------------------------------------------------------------- /public/web/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf -------------------------------------------------------------------------------- /public/web/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf -------------------------------------------------------------------------------- /public/web/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff -------------------------------------------------------------------------------- /public/web/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Script-Regular-C5JkGWo-.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Script-Regular-C5JkGWo-.ttf -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Script-Regular-D3wIWfF6.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Script-Regular-D5yQViql.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Script-Regular-D5yQViql.woff -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Size1-Regular-C195tn64.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Size1-Regular-C195tn64.woff -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Size2-Regular-oD1tc_U0.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Size2-Regular-oD1tc_U0.woff -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Size3-Regular-CTq5MqoE.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Size3-Regular-CTq5MqoE.woff -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Size4-Regular-BF-4gkZK.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Size4-Regular-BF-4gkZK.woff -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Size4-Regular-DWFBv043.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Size4-Regular-DWFBv043.ttf -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 -------------------------------------------------------------------------------- /public/web/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/public/web/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf -------------------------------------------------------------------------------- /public/web/assets/asciiarmor-Df11BRmG.js: -------------------------------------------------------------------------------- 1 | function t(e){var r=e.match(/^\s*\S/);return e.skipToEnd(),r?"error":null}const i={name:"asciiarmor",token:function(e,r){var n;if(r.state=="top")return e.sol()&&(n=e.match(/^-----BEGIN (.*)?-----\s*$/))?(r.state="headers",r.type=n[1],"tag"):t(e);if(r.state=="headers"){if(e.sol()&&e.match(/^\w+:/))return r.state="header","atom";var o=t(e);return o&&(r.state="body"),o}else{if(r.state=="header")return e.skipToEnd(),r.state="headers","string";if(r.state=="body")return e.sol()&&(n=e.match(/^-----END (.*)?-----\s*$/))?n[1]!=r.type?"error":(r.state="end","tag"):e.eatWhile(/[A-Za-z0-9+\/=]/)?null:(e.next(),"error");if(r.state=="end")return t(e)}},blankLine:function(e){e.state=="headers"&&(e.state="body")},startState:function(){return{state:"top",type:null}}};export{i as asciiArmor}; 2 | -------------------------------------------------------------------------------- /public/web/assets/brainfuck-C4LP7Hcl.js: -------------------------------------------------------------------------------- 1 | var f="><+-.,[]".split("");const r={name:"brainfuck",startState:function(){return{commentLine:!1,left:0,right:0,commentLoop:!1}},token:function(i,n){if(i.eatSpace())return null;i.sol()&&(n.commentLine=!1);var e=i.next().toString();if(f.indexOf(e)!==-1){if(n.commentLine===!0)return i.eol()&&(n.commentLine=!1),"comment";if(e==="]"||e==="[")return e==="["?n.left++:n.right++,"bracket";if(e==="+"||e==="-")return"keyword";if(e==="<"||e===">")return"atom";if(e==="."||e===",")return"def"}else return n.commentLine=!0,i.eol()&&(n.commentLine=!1),"comment";i.eol()&&(n.commentLine=!1)}};export{r as brainfuck}; 2 | -------------------------------------------------------------------------------- /public/web/assets/button-VrESTZal.js: -------------------------------------------------------------------------------- 1 | import{j as o}from"./vendor-map-DjDVTs0N.js";import{C as n,a,D as e,A as r,b as i,E as c,c as u}from"./action-CcBf9P9h.js";import{B as s}from"./vendor-tdesign-BxQoi5Mo.js";const x=({...t})=>o.jsx(n,{Cp:s,icon:o.jsx("div",{className:"t-icon i-tabler:plus"}),...t}),j=({...t})=>o.jsx(a,{Cp:s,...t}),m=({...t})=>o.jsx(u,{Cp:s,...t}),d=({...t})=>o.jsx(e,{Cp:s,...t}),B=({...t})=>o.jsx(r,{Cp:s,...t}),A=({...t})=>o.jsx(i,{Cp:s,icon:o.jsx("div",{className:"t-icon i-tabler:plus"}),...t}),M=({...t})=>o.jsx(c,{Cp:s,...t});export{B,j as C,d as D,M as E,x as a,A as b,m as c}; 2 | -------------------------------------------------------------------------------- /public/web/assets/cascader-C1UbdXvF.js: -------------------------------------------------------------------------------- 1 | import{j as r}from"./vendor-map-DjDVTs0N.js";import{aq as d}from"./vendor-refine-BK41FXO6.js";import{ae as t}from"./vendor-tdesign-BxQoi5Mo.js";const u=({url:o,query:a,defaultValue:i,value:n,format:s,...p})=>{const{data:e,isLoading:c}=d({resource:o,meta:{params:a},pagination:{mode:"off"}});return r.jsx(t,{options:(e==null?void 0:e.data)||[],defaultValue:(s==null?void 0:s(i))||i,value:(s==null?void 0:s(n))||n,loading:c,...p})};export{u as C}; 2 | -------------------------------------------------------------------------------- /public/web/assets/clone-BCa8eBeC.js: -------------------------------------------------------------------------------- 1 | import{b as r}from"./graph-CPgAh_uX.js";var e=4;function a(o){return r(o,e)}export{a as c}; 2 | -------------------------------------------------------------------------------- /public/web/assets/cmake-BQqOBYOt.js: -------------------------------------------------------------------------------- 1 | var c=/({)?[a-zA-Z0-9_]+(})?/;function t(n,i){for(var e,r,u=!1;!n.eol()&&(e=n.next())!=i.pending;){if(e==="$"&&r!="\\"&&i.pending=='"'){u=!0;break}r=e}return u&&n.backUp(1),e==i.pending?i.continueString=!1:i.continueString=!0,"string"}function f(n,i){var e=n.next();return e==="$"?n.match(c)?"variableName.special":"variable":i.continueString?(n.backUp(1),t(n,i)):n.match(/(\s+)?\w+\(/)||n.match(/(\s+)?\w+\ \(/)?(n.backUp(1),"def"):e=="#"?(n.skipToEnd(),"comment"):e=="'"||e=='"'?(i.pending=e,t(n,i)):e=="("||e==")"?"bracket":e.match(/[0-9]/)?"number":(n.eatWhile(/[\w-]/),null)}const a={name:"cmake",startState:function(){var n={};return n.inDefinition=!1,n.inInclude=!1,n.continueString=!1,n.pending=!1,n},token:function(n,i){return n.eatSpace()?null:f(n,i)}};export{a as cmake}; 2 | -------------------------------------------------------------------------------- /public/web/assets/diff-DbItnlRl.js: -------------------------------------------------------------------------------- 1 | var o={"+":"inserted","-":"deleted","@":"meta"};const r={name:"diff",token:function(n){var e=n.string.search(/[\t ]+?$/);if(!n.sol()||e===0)return n.skipToEnd(),("error "+(o[n.string.charAt(0)]||"")).replace(/ $/,"");var i=o[n.peek()]||n.skipToEnd();return e===-1?n.skipToEnd():n.pos=e,i}};export{r as diff}; 2 | -------------------------------------------------------------------------------- /public/web/assets/editor-3FTnDpaY.js: -------------------------------------------------------------------------------- 1 | import{j as t}from"./vendor-map-DjDVTs0N.js";import{X as e}from"./modulepreload-polyfill-D6ThnDFs.js";import"./vendor-react-BlTfyhut.js";import{ay as a}from"./vendor-refine-BK41FXO6.js";import"./vendor-echarts-JHGMnnew.js";import"./vendor-tdesign-BxQoi5Mo.js";import{E as d}from"./tinymce-BiIqtVCw.js";import"./vendor-lib-CKVa3D7Q.js";const j=({...o})=>{var i,m;const{data:r}=a({resource:"cms.setting",queryOptions:{enabled:!0}}),s=((m=(i=r==null?void 0:r.data)==null?void 0:i.cms)==null?void 0:m.editor)||"default";return t.jsxs("div",{className:"w-full",children:[s=="default"&&t.jsx(d,{...o}),s=="markdown"&&t.jsx(e,{...o})]})};export{j as E}; 2 | -------------------------------------------------------------------------------- /public/web/assets/editor-CvkLeIgN.js: -------------------------------------------------------------------------------- 1 | import{j as s}from"./vendor-map-DjDVTs0N.js";import{_ as l}from"./vendor-lib-CKVa3D7Q.js";import{w as u,m as p}from"./modulepreload-polyfill-D6ThnDFs.js";const x=({onChange:o,value:e,defaultValue:t,type:m="json",className:d,...a})=>{const i=u(r=>r.dark);return s.jsx("div",{className:p(["border border-component w-full rounded-sm",d]),children:s.jsx(l,{defaultValue:t,value:e||"",width:"100%",fontSize:"14px",theme:i?"tomorrow_night":"tomorrow",mode:m,onChange:r=>o==null?void 0:o(r),className:"rounded-sm",setOptions:{useWorker:!1},...a})})};export{x as C}; 2 | -------------------------------------------------------------------------------- /public/web/assets/export-C_hm8dOW.js: -------------------------------------------------------------------------------- 1 | import{j as o}from"./vendor-map-DjDVTs0N.js";import{a2 as l}from"./modulepreload-polyfill-D6ThnDFs.js";import"./vendor-react-BlTfyhut.js";import{G as i,N as m}from"./vendor-refine-BK41FXO6.js";import"./vendor-echarts-JHGMnnew.js";import{F as a,I as n,ap as p}from"./vendor-tdesign-BxQoi5Mo.js";import"./vendor-tinymce-lUkVC9Da.js";import"./vendor-lib-CKVa3D7Q.js";import{u as c}from"./useSelect-BorzI4ID.js";import"./vendor-markdown-CL7ixDl-.js";const g=()=>{const{options:e}=c({resource:"tools/backup/export",optionLabel:"label",optionValue:"value"}),t=i(),r=m(),s=()=>{r({resource:"tools.backup",invalidates:["all"]})};return o.jsxs(l,{resource:"tools/backup/export",onSubmit:s,children:[o.jsx(a.FormItem,{name:"name",label:t("tools.backup.fields.name"),children:o.jsx(n,{})}),o.jsx(a.FormItem,{name:"data",label:t("tools.backup.fields.data"),children:o.jsx(p,{data:e,direction:"both",showCheckAll:!0,targetSort:"original"})})]})};export{g as default}; 2 | -------------------------------------------------------------------------------- /public/web/assets/flowDiagram-v2-13329dc7-BECrujz7.js: -------------------------------------------------------------------------------- 1 | import{p as e,f as o}from"./flowDb-c1833063-e5syNCBr.js";import{f as t,g as a}from"./styles-483fbfea-BKhIfVL_.js";import{C as s}from"./vendor-markdown-CL7ixDl-.js";import"./graph-CPgAh_uX.js";import"./layout-BMDjMi5M.js";import"./vendor-tdesign-BxQoi5Mo.js";import"./index-01f381cb-CIqwIHrn.js";import"./clone-BCa8eBeC.js";import"./edges-066a5561-C2YdgO4I.js";import"./createText-ca0c5216-S7G96NDK.js";import"./vendor-refine-BK41FXO6.js";import"./vendor-react-BlTfyhut.js";const A={parser:e,db:o,renderer:t,styles:a,init:r=>{r.flowchart||(r.flowchart={}),r.flowchart.arrowMarkerAbsolute=r.arrowMarkerAbsolute,s({flowchart:{arrowMarkerAbsolute:r.arrowMarkerAbsolute}}),t.setConf(r.flowchart),o.clear(),o.setGen("gen-2")}};export{A as diagram}; 2 | -------------------------------------------------------------------------------- /public/web/assets/form-Cq0eFcsN.js: -------------------------------------------------------------------------------- 1 | import{j as c}from"./vendor-map-DjDVTs0N.js";import{u as i,a as x}from"./index-BvKTTDD6.js";import{r as y}from"./vendor-react-BlTfyhut.js";const h=({fields:e,prefix:n})=>{const{itemsIndex:u}=i(),r=x();return y.useMemo(()=>e==null?void 0:e.map(({name:s,...a},p)=>{var o;const m=u[a.type];if(m){let t=typeof(r==null?void 0:r.name)<"u"?[...Array.isArray(r.name)?r.name:[r.name],s]:s;return n&&(t=[n,...Array.isArray(t)?t:[t]]),c.jsx(m.FormRender,{name:t,...a,children:!!((o=a.child)!=null&&o.length)&&c.jsx(h,{fields:a.child,prefix:n})},p)}else return}),[e])};export{h as M}; 2 | -------------------------------------------------------------------------------- /public/web/assets/group-88LBRa_Z.js: -------------------------------------------------------------------------------- 1 | import{j as o}from"./vendor-map-DjDVTs0N.js";import{G as m}from"./vendor-refine-BK41FXO6.js";import{a2 as i}from"./modulepreload-polyfill-D6ThnDFs.js";import"./vendor-react-BlTfyhut.js";import"./vendor-echarts-JHGMnnew.js";import{F as e,I as a}from"./vendor-tdesign-BxQoi5Mo.js";import"./vendor-tinymce-lUkVC9Da.js";import"./vendor-lib-CKVa3D7Q.js";import"./vendor-markdown-CL7ixDl-.js";const p=r=>{const t=m();return o.jsx(i,{id:r==null?void 0:r.id,resource:"tools.fileDir",children:o.jsx(e.FormItem,{label:t("tools.file.fields.dirName"),name:"name",children:o.jsx(a,{})})})};export{p as default}; 2 | -------------------------------------------------------------------------------- /public/web/assets/group-ClRIeId8.js: -------------------------------------------------------------------------------- 1 | import{j as t}from"./vendor-map-DjDVTs0N.js";import{G as n}from"./vendor-refine-BK41FXO6.js";import{a2 as i}from"./modulepreload-polyfill-D6ThnDFs.js";import"./vendor-react-BlTfyhut.js";import"./vendor-echarts-JHGMnnew.js";import{F as r,I as o}from"./vendor-tdesign-BxQoi5Mo.js";import"./vendor-tinymce-lUkVC9Da.js";import"./vendor-lib-CKVa3D7Q.js";import"./vendor-markdown-CL7ixDl-.js";const p=e=>{const m=n();return t.jsxs(i,{id:e==null?void 0:e.id,resource:"content.menu",children:[t.jsx(r.FormItem,{label:m("content.menu.fields.groupName"),name:"name",children:t.jsx(o,{})}),t.jsx(r.FormItem,{label:m("content.menu.fields.groupTitle"),name:"title",children:t.jsx(o,{})})]})};export{p as default}; 2 | -------------------------------------------------------------------------------- /public/web/assets/http-DBlCnlav.js: -------------------------------------------------------------------------------- 1 | function u(r,n){return r.skipToEnd(),n.cur=t,"error"}function i(r,n){return r.match(/^HTTP\/\d\.\d/)?(n.cur=f,"keyword"):r.match(/^[A-Z]+/)&&/[ \t]/.test(r.peek())?(n.cur=d,"keyword"):u(r,n)}function f(r,n){var e=r.match(/^\d+/);if(!e)return u(r,n);n.cur=l;var o=Number(e[0]);return o>=100&&o<400?"atom":"error"}function l(r,n){return r.skipToEnd(),n.cur=t,null}function d(r,n){return r.eatWhile(/\S/),n.cur=s,"string.special"}function s(r,n){return r.match(/^HTTP\/\d\.\d$/)?(n.cur=t,"keyword"):u(r,n)}function t(r){return r.sol()&&!r.eat(/[ \t]/)?r.match(/^.*?:/)?"atom":(r.skipToEnd(),"error"):(r.skipToEnd(),"string")}function c(r){return r.skipToEnd(),null}const p={name:"http",token:function(r,n){var e=n.cur;return e!=t&&e!=c&&r.eatSpace()?null:e(r,n)},blankLine:function(r){r.cur=c},startState:function(){return{cur:i}}};export{p as http}; 2 | -------------------------------------------------------------------------------- /public/web/assets/import-DjPaXtMe.js: -------------------------------------------------------------------------------- 1 | import{j as r}from"./vendor-map-DjDVTs0N.js";import{a2 as t}from"./modulepreload-polyfill-D6ThnDFs.js";import"./vendor-react-BlTfyhut.js";import{G as a}from"./vendor-refine-BK41FXO6.js";import"./vendor-echarts-JHGMnnew.js";import{F as m,w as s,V as l}from"./vendor-tdesign-BxQoi5Mo.js";import{u as i}from"./useUpload-BsrPC7ib.js";import"./vendor-tinymce-lUkVC9Da.js";import"./vendor-lib-CKVa3D7Q.js";import"./vendor-markdown-CL7ixDl-.js";const F=()=>{const e=i(),o=a();return r.jsx(t,{children:r.jsx(m.FormItem,{name:"file",help:r.jsx(r.Fragment,{children:r.jsx(s,{target:"_blank",size:"small",href:"http://lbsyun.baidu.com/index.php?title=open/dev-res",children:o("tools.area.help.import")})}),children:r.jsx(l,{...e,theme:"file",draggable:!0,className:"w-full"})})})};export{F as default}; 2 | -------------------------------------------------------------------------------- /public/web/assets/import-_U0v6FNI.js: -------------------------------------------------------------------------------- 1 | import{j as o}from"./vendor-map-DjDVTs0N.js";import{a2 as m}from"./modulepreload-polyfill-D6ThnDFs.js";import"./vendor-react-BlTfyhut.js";import{N as e}from"./vendor-refine-BK41FXO6.js";import"./vendor-echarts-JHGMnnew.js";import{F as s,V as i}from"./vendor-tdesign-BxQoi5Mo.js";import{u as l}from"./useUpload-BsrPC7ib.js";import"./vendor-tinymce-lUkVC9Da.js";import"./vendor-lib-CKVa3D7Q.js";import"./vendor-markdown-CL7ixDl-.js";const g=()=>{const r=l(),a=e(),t=()=>{a({resource:"tools.backup",invalidates:["all"]})};return o.jsx(m,{resource:"tools/backup/import",onSubmit:t,children:o.jsx(s.FormItem,{name:"file",children:o.jsx(i,{...r,theme:"file",draggable:!0,className:"w-full"})})})};export{g as default}; 2 | -------------------------------------------------------------------------------- /public/web/assets/link-NY0bYu7g.js: -------------------------------------------------------------------------------- 1 | import{j as o}from"./vendor-map-DjDVTs0N.js";import{d as n,c as i,S as r,E as a}from"./action-CcBf9P9h.js";import{w as s}from"./vendor-tdesign-BxQoi5Mo.js";const p=({...t})=>o.jsx(n,{Cp:s,...t}),m=({...t})=>o.jsx(i,{Cp:s,...t}),x=({...t})=>o.jsx(r,{Cp:s,...t}),E=({...t})=>o.jsx(a,{Cp:s,...t});export{m as D,p as E,x as S,E as a}; 2 | -------------------------------------------------------------------------------- /public/web/assets/list-BGRHcnYS.js: -------------------------------------------------------------------------------- 1 | import{j as r}from"./vendor-map-DjDVTs0N.js";import{R as o}from"./vendor-react-BlTfyhut.js";import{G as s}from"./vendor-refine-BK41FXO6.js";import{T as a}from"./modulepreload-polyfill-D6ThnDFs.js";import"./vendor-echarts-JHGMnnew.js";import"./vendor-tdesign-BxQoi5Mo.js";import{a as n}from"./button-VrESTZal.js";import{E as m,D as c}from"./link-NY0bYu7g.js";import"./vendor-tinymce-lUkVC9Da.js";import"./vendor-lib-CKVa3D7Q.js";import"./vendor-markdown-CL7ixDl-.js";import"./action-CcBf9P9h.js";const k=()=>{const e=s(),l=o.useMemo(()=>[{colKey:"id",sorter:!0,sortType:"all",title:"ID",width:100},{colKey:"name",title:e("content.recommend.fields.name"),ellipsis:!0},{colKey:"articles",title:e("content.recommend.fields.articles"),ellipsis:!0,cell:({row:t})=>{var i;return(i=t==null?void 0:t.articles)==null?void 0:i.length}},{colKey:"created_at",title:e("content.recommend.fields.createdAt"),sorter:!0,sortType:"all",width:200},{colKey:"link",title:e("table.actions"),fixed:"right",align:"center",width:120,cell:({row:t})=>r.jsxs("div",{className:"flex justify-center gap-4",children:[r.jsx(m,{rowId:t.id}),r.jsx(c,{rowId:t.id})]})}],[e]);return r.jsx(a,{columns:l,actionRender:()=>r.jsx(n,{})})};export{k as default}; 2 | -------------------------------------------------------------------------------- /public/web/assets/list-Dn_S8S0V.js: -------------------------------------------------------------------------------- 1 | import{j as e}from"./vendor-map-DjDVTs0N.js";import{R as r}from"./vendor-react-BlTfyhut.js";import{G as l}from"./vendor-refine-BK41FXO6.js";import{T as s}from"./modulepreload-polyfill-D6ThnDFs.js";import"./vendor-echarts-JHGMnnew.js";import"./vendor-tdesign-BxQoi5Mo.js";import{D as a}from"./link-NY0bYu7g.js";import"./vendor-tinymce-lUkVC9Da.js";import"./vendor-lib-CKVa3D7Q.js";import"./vendor-markdown-CL7ixDl-.js";import"./action-CcBf9P9h.js";const w=()=>{const t=l(),i=r.useMemo(()=>[{colKey:"id",sorter:!0,sortType:"all",title:"ID",width:100},{colKey:"name",title:t("content.tags.fields.name"),ellipsis:!0},{colKey:"view",title:t("content.tags.fields.view"),ellipsis:!0},{colKey:"count",title:t("content.tags.fields.count"),ellipsis:!0},{colKey:"created_at",title:t("content.tags.fields.createdAt"),sorter:!0,sortType:"all",width:200},{colKey:"link",title:t("table.actions"),fixed:"right",align:"center",width:120,cell:({row:o})=>e.jsx("div",{className:"flex justify-center gap-4",children:e.jsx(a,{rowId:o.id})})}],[t]);return e.jsx(s,{columns:i})};export{w as default}; 2 | -------------------------------------------------------------------------------- /public/web/assets/login-giTfM73U.js: -------------------------------------------------------------------------------- 1 | import{j as r}from"./vendor-map-DjDVTs0N.js";import{G as m}from"./vendor-refine-BK41FXO6.js";import{a2 as o}from"./modulepreload-polyfill-D6ThnDFs.js";import"./vendor-react-BlTfyhut.js";import"./vendor-echarts-JHGMnnew.js";import{F as t,I as a,w as i}from"./vendor-tdesign-BxQoi5Mo.js";import"./vendor-tinymce-lUkVC9Da.js";import"./vendor-lib-CKVa3D7Q.js";import"./vendor-markdown-CL7ixDl-.js";const h=e=>{const s=m();return r.jsxs(o,{id:e==null?void 0:e.id,children:[r.jsx(t.FormItem,{label:s("cloud.apps.fields.username"),name:"username",children:r.jsx(a,{})}),r.jsx(t.FormItem,{label:s("cloud.apps.fields.password"),name:"password",children:r.jsx(a,{type:"password"})}),r.jsxs(t.FormItem,{children:[s("cloud.apps.tips.login"),r.jsx(i,{href:"https://www.dux.cn",theme:"primary",target:"_black",children:s("cloud.apps.tips.register")})]})]})};export{h as default}; 2 | -------------------------------------------------------------------------------- /public/web/assets/page-DFXqGzgj.js: -------------------------------------------------------------------------------- 1 | import{j as r}from"./vendor-map-DjDVTs0N.js";import{G as i,aA as e}from"./vendor-refine-BK41FXO6.js";import"./modulepreload-polyfill-D6ThnDFs.js";import"./vendor-react-BlTfyhut.js";import"./vendor-echarts-JHGMnnew.js";import{I as p}from"./vendor-tdesign-BxQoi5Mo.js";import{F as s,a as t}from"./page-BDoLOl6q.js";import"./vendor-tinymce-lUkVC9Da.js";import"./vendor-lib-CKVa3D7Q.js";import{P as a}from"./index-BvKTTDD6.js";import"./vendor-markdown-CL7ixDl-.js";import"./editor-CvkLeIgN.js";import"./select-aCzHF-Sz.js";import"./useSelect-BorzI4ID.js";import"./cascader-C1UbdXvF.js";import"./uploadFile-DJwHGSth.js";import"./useUpload-BsrPC7ib.js";import"./tinymce-BiIqtVCw.js";import"./manage-bOx1Sh-_.js";const E=()=>{const o=i(),{id:m}=e();return r.jsxs(s,{formProps:{labelAlign:"top"},back:!0,useFormProps:{queryOptions:{cacheTime:0}},id:m,children:[r.jsx(t,{name:"title",children:r.jsx(p,{placeholder:o("poster.design.validate.title")})}),r.jsx(t,{name:"data",children:r.jsx(a,{})})]})};export{E as default}; 2 | -------------------------------------------------------------------------------- /public/web/assets/page-ECbxBwLm.js: -------------------------------------------------------------------------------- 1 | import{j as e}from"./vendor-map-DjDVTs0N.js";import{G as t}from"./vendor-refine-BK41FXO6.js";import"./modulepreload-polyfill-D6ThnDFs.js";import"./vendor-react-BlTfyhut.js";import"./vendor-echarts-JHGMnnew.js";import{ag as r}from"./vendor-tdesign-BxQoi5Mo.js";import{F as o,a}from"./page-BDoLOl6q.js";import"./vendor-tinymce-lUkVC9Da.js";import"./vendor-lib-CKVa3D7Q.js";import{S as i}from"./select-aCzHF-Sz.js";import"./vendor-markdown-CL7ixDl-.js";import"./useSelect-BorzI4ID.js";const g=()=>(t(),e.jsx(o,{rest:!0,className:"app-card-tabs",action:"edit",id:0,useFormProps:{meta:{mode:"page"}},children:e.jsx(r,{defaultValue:0,children:e.jsx(r.TabPanel,{value:0,label:"基本设置",destroyOnHide:!1,children:e.jsx(a,{label:"文章海报",name:"article_poster",help:"文章分享推广海报",children:e.jsx(i,{url:"poster/design",optionLabel:"title",optionValue:"id"})})})})}));export{g as default}; 2 | -------------------------------------------------------------------------------- /public/web/assets/properties-C78fOPTZ.js: -------------------------------------------------------------------------------- 1 | const f={name:"properties",token:function(e,i){var o=e.sol()||i.afterSection,l=e.eol();if(i.afterSection=!1,o&&(i.nextMultiline?(i.inMultiline=!0,i.nextMultiline=!1):i.position="def"),l&&!i.nextMultiline&&(i.inMultiline=!1,i.position="def"),o)for(;e.eatSpace(););var n=e.next();return o&&(n==="#"||n==="!"||n===";")?(i.position="comment",e.skipToEnd(),"comment"):o&&n==="["?(i.afterSection=!0,e.skipTo("]"),e.eat("]"),"header"):n==="="||n===":"?(i.position="quote",null):(n==="\\"&&i.position==="quote"&&e.eol()&&(i.nextMultiline=!0),i.position)},startState:function(){return{position:"def",nextMultiline:!1,inMultiline:!1,afterSection:!1}}};export{f as properties}; 2 | -------------------------------------------------------------------------------- /public/web/assets/protobuf-ChK-085T.js: -------------------------------------------------------------------------------- 1 | function t(e){return new RegExp("^(("+e.join(")|(")+"))\\b","i")}var n=["package","message","import","syntax","required","optional","repeated","reserved","default","extensions","packed","bool","bytes","double","enum","float","string","int32","int64","uint32","uint64","sint32","sint64","fixed32","fixed64","sfixed32","sfixed64","option","service","rpc","returns"],r=t(n),i=new RegExp("^[_A-Za-z¡-￿][_A-Za-z0-9¡-￿]*");function f(e){return e.eatSpace()?null:e.match("//")?(e.skipToEnd(),"comment"):e.match(/^[0-9\.+-]/,!1)&&(e.match(/^[+-]?0x[0-9a-fA-F]+/)||e.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?/)||e.match(/^[+-]?\d+([EeDd][+-]?\d+)?/))?"number":e.match(/^"([^"]|(""))*"/)||e.match(/^'([^']|(''))*'/)?"string":e.match(r)?"keyword":e.match(i)?"variable":(e.next(),null)}const u={name:"protobuf",token:f,languageData:{autocomplete:n}};export{u as protobuf}; 2 | -------------------------------------------------------------------------------- /public/web/assets/save-B_6yjLca.js: -------------------------------------------------------------------------------- 1 | import{j as e}from"./vendor-map-DjDVTs0N.js";import{G as s,aq as c}from"./vendor-refine-BK41FXO6.js";import{a2 as d}from"./modulepreload-polyfill-D6ThnDFs.js";import"./vendor-react-BlTfyhut.js";import"./vendor-echarts-JHGMnnew.js";import{F as t,ae as g,I as p,S as u}from"./vendor-tdesign-BxQoi5Mo.js";import{U as x}from"./uploadImageManage-HbmYZfmq.js";import"./vendor-tinymce-lUkVC9Da.js";import"./vendor-lib-CKVa3D7Q.js";import{u as f}from"./useSelect-BorzI4ID.js";import"./vendor-markdown-CL7ixDl-.js";import"./manage-bOx1Sh-_.js";import"./useUpload-BsrPC7ib.js";const _=o=>{const a=s(),{data:r,isLoading:i}=c({resource:"content.category"}),m=(r==null?void 0:r.data)||[],{options:n,queryResult:l}=f({resource:"tools.magic",meta:{params:{inline:1}},optionLabel:"label",optionValue:"id"});return e.jsxs(d,{id:o==null?void 0:o.id,children:[e.jsx(t.FormItem,{label:a("content.category.fields.parent"),name:"parent_id",children:e.jsx(g,{checkStrictly:!0,loading:i,options:m,keys:{label:"name",value:"id"},clearable:!0})}),e.jsx(t.FormItem,{label:a("content.category.fields.name"),name:"name",children:e.jsx(p,{})}),e.jsx(t.FormItem,{label:a("content.category.fields.image"),name:"image",children:e.jsx(x,{})}),e.jsx(t.FormItem,{label:a("content.category.fields.magic"),name:"magic_id",children:e.jsx(u,{loading:l.isLoading,options:n,clearable:!0})})]})};export{_ as default}; 2 | -------------------------------------------------------------------------------- /public/web/assets/save-Bjyi5ZpO.js: -------------------------------------------------------------------------------- 1 | import{j as r}from"./vendor-map-DjDVTs0N.js";import{G as m}from"./vendor-refine-BK41FXO6.js";import{a2 as o}from"./modulepreload-polyfill-D6ThnDFs.js";import"./vendor-react-BlTfyhut.js";import"./vendor-echarts-JHGMnnew.js";import{F as e,I as i}from"./vendor-tdesign-BxQoi5Mo.js";import{U as n}from"./uploadImageManage-HbmYZfmq.js";import"./vendor-tinymce-lUkVC9Da.js";import"./vendor-lib-CKVa3D7Q.js";import"./vendor-markdown-CL7ixDl-.js";import"./manage-bOx1Sh-_.js";import"./useUpload-BsrPC7ib.js";const h=t=>{const a=m();return r.jsxs(o,{id:t==null?void 0:t.id,children:[r.jsx(e.FormItem,{label:a("content.source.fields.name"),name:"name",requiredMark:!0,children:r.jsx(i,{})}),r.jsx(e.FormItem,{label:a("content.source.fields.avatar"),name:"avatar",children:r.jsx(n,{accept:"image/*"})})]})};export{h as default}; 2 | -------------------------------------------------------------------------------- /public/web/assets/save-Cdrqc7RQ.js: -------------------------------------------------------------------------------- 1 | import{j as t}from"./vendor-map-DjDVTs0N.js";import{G as a}from"./vendor-refine-BK41FXO6.js";import{a2 as i}from"./modulepreload-polyfill-D6ThnDFs.js";import"./vendor-react-BlTfyhut.js";import"./vendor-echarts-JHGMnnew.js";import{F as o,I as e}from"./vendor-tdesign-BxQoi5Mo.js";import"./vendor-tinymce-lUkVC9Da.js";import"./vendor-lib-CKVa3D7Q.js";import"./vendor-markdown-CL7ixDl-.js";const F=r=>{const m=a();return t.jsxs(i,{id:r==null?void 0:r.id,children:[t.jsx(o.FormItem,{label:m("content.replace.fields.from"),name:"from",children:t.jsx(e,{})}),t.jsx(o.FormItem,{label:m("content.replace.fields.to"),name:"to",children:t.jsx(e,{})})]})};export{F as default}; 2 | -------------------------------------------------------------------------------- /public/web/assets/save-CprYS7Tw.js: -------------------------------------------------------------------------------- 1 | import{j as m}from"./vendor-map-DjDVTs0N.js";import{G as o}from"./vendor-refine-BK41FXO6.js";import{a2 as a}from"./modulepreload-polyfill-D6ThnDFs.js";import"./vendor-react-BlTfyhut.js";import"./vendor-echarts-JHGMnnew.js";import{F as e,I as i}from"./vendor-tdesign-BxQoi5Mo.js";import"./vendor-tinymce-lUkVC9Da.js";import"./vendor-lib-CKVa3D7Q.js";import"./vendor-markdown-CL7ixDl-.js";const u=t=>{const r=o();return m.jsx(a,{id:t==null?void 0:t.id,children:m.jsx(e.FormItem,{label:r("content.attr.fields.name"),name:"name",children:m.jsx(i,{})})})};export{u as default}; 2 | -------------------------------------------------------------------------------- /public/web/assets/save-EJaUoZRy.js: -------------------------------------------------------------------------------- 1 | import{j as e}from"./vendor-map-DjDVTs0N.js";import{G as d,aq as c}from"./vendor-refine-BK41FXO6.js";import{a2 as u}from"./modulepreload-polyfill-D6ThnDFs.js";import"./vendor-react-BlTfyhut.js";import"./vendor-echarts-JHGMnnew.js";import{F as m,ae as x,I as i}from"./vendor-tdesign-BxQoi5Mo.js";import{U as j}from"./uploadImageManage-HbmYZfmq.js";import"./vendor-tinymce-lUkVC9Da.js";import"./vendor-lib-CKVa3D7Q.js";import"./vendor-markdown-CL7ixDl-.js";import"./manage-bOx1Sh-_.js";import"./useUpload-BsrPC7ib.js";const M=a=>{const t=d(),n=a.menu_id,{data:r,isLoading:l}=c({resource:"content.menuData",meta:{params:{menu_id:n}}}),o=(r==null?void 0:r.data)||[];return e.jsxs(u,{id:a==null?void 0:a.id,saveFormat:s=>({...s,menu_id:n}),queryParams:{menu_id:n},children:[e.jsx(m.FormItem,{label:t("content.menu.fields.parent"),name:"parent_id",children:e.jsx(x,{checkStrictly:!0,loading:l,options:o,keys:{label:"title",value:"id"},clearable:!0})}),e.jsx(m.FormItem,{label:t("content.menu.fields.title"),name:"title",children:e.jsx(i,{})}),e.jsx(m.FormItem,{label:t("content.menu.fields.subtitle"),name:"subtitle",children:e.jsx(i,{})}),e.jsx(m.FormItem,{label:t("content.menu.fields.url"),name:"url",children:e.jsx(i,{})}),e.jsx(m.FormItem,{label:t("content.menu.fields.image"),name:"image",children:e.jsx(j,{accept:"image/*"})})]})};export{M as default}; 2 | -------------------------------------------------------------------------------- /public/web/assets/save-EXr0bvE8.js: -------------------------------------------------------------------------------- 1 | import{j as t}from"./vendor-map-DjDVTs0N.js";import{G as o}from"./vendor-refine-BK41FXO6.js";import{a2 as a}from"./modulepreload-polyfill-D6ThnDFs.js";import"./vendor-react-BlTfyhut.js";import"./vendor-echarts-JHGMnnew.js";import{F as i,I as e}from"./vendor-tdesign-BxQoi5Mo.js";import"./vendor-tinymce-lUkVC9Da.js";import"./vendor-lib-CKVa3D7Q.js";import"./vendor-markdown-CL7ixDl-.js";const u=m=>{const r=o();return t.jsx(a,{id:m==null?void 0:m.id,children:t.jsx(i.FormItem,{label:r("system.api.fields.name"),name:"name",children:t.jsx(e,{})})})};export{u as default}; 2 | -------------------------------------------------------------------------------- /public/web/assets/save-xYkImboQ.js: -------------------------------------------------------------------------------- 1 | import{j as e}from"./vendor-map-DjDVTs0N.js";import{G as o,ap as i}from"./vendor-refine-BK41FXO6.js";import{a2 as l}from"./modulepreload-polyfill-D6ThnDFs.js";import"./vendor-react-BlTfyhut.js";import"./vendor-echarts-JHGMnnew.js";import{F as r,I as n,ao as d}from"./vendor-tdesign-BxQoi5Mo.js";import"./vendor-tinymce-lUkVC9Da.js";import"./vendor-lib-CKVa3D7Q.js";import"./vendor-markdown-CL7ixDl-.js";const y=m=>{const a=o(),{data:s}=i({method:"get",url:"system/role/permission"}),t=s==null?void 0:s.data;return e.jsxs(l,{id:m==null?void 0:m.id,children:[e.jsx(r.FormItem,{label:a("system.role.fields.name"),name:"name",children:e.jsx(n,{})}),e.jsx(r.FormItem,{label:a("system.role.fields.permission"),name:"permission",children:e.jsx(d,{keys:{value:"name",label:"label"},checkable:!0,data:t})})]})};export{y as default}; 2 | -------------------------------------------------------------------------------- /public/web/assets/show-kxJIh2VS.js: -------------------------------------------------------------------------------- 1 | import{j as t}from"./vendor-map-DjDVTs0N.js";import{G as d,ay as c}from"./vendor-refine-BK41FXO6.js";import{a3 as s}from"./modulepreload-polyfill-D6ThnDFs.js";import"./vendor-react-BlTfyhut.js";import"./vendor-echarts-JHGMnnew.js";import"./vendor-tdesign-BxQoi5Mo.js";import"./vendor-tinymce-lUkVC9Da.js";import"./vendor-lib-CKVa3D7Q.js";import"./vendor-markdown-CL7ixDl-.js";const _=a=>{const m=a==null?void 0:a.id,r=d(),{data:l,isLoading:i}=c({id:m}),e=(l==null?void 0:l.data)||{};return t.jsx("div",{className:"p-4",children:t.jsxs(s,{direction:"vertical",loading:i,children:[t.jsx(s.Item,{label:r("system.operate.fields.requestMethod"),children:e==null?void 0:e.request_method}),t.jsx(s.Item,{label:r("system.operate.fields.requestUrl"),children:e==null?void 0:e.request_url}),t.jsx(s.Item,{label:r("system.operate.fields.requestTime"),children:e==null?void 0:e.request_time}),t.jsx(s.Item,{label:r("system.operate.fields.requestParams"),children:t.jsx("div",{className:"app-code",children:e!=null&&e.request_params?JSON.stringify(e==null?void 0:e.request_params,null," "):""})})]})})};export{_ as default}; 2 | -------------------------------------------------------------------------------- /public/web/assets/solr-DehyRSwq.js: -------------------------------------------------------------------------------- 1 | var u=/[^\s\|\!\+\-\*\?\~\^\&\:\(\)\[\]\{\}\"\\]/,f=/[\|\!\+\-\*\?\~\^\&]/,l=/^(OR|AND|NOT|TO)$/;function k(n){return parseFloat(n).toString()===n}function a(n){return function(e,r){for(var t=!1,o;(o=e.next())!=null&&!(o==n&&!t);)t=!t&&o=="\\";return t||(r.tokenize=i),"string"}}function c(n){return function(e,r){return n=="|"?e.eat(/\|/):n=="&"&&e.eat(/\&/),r.tokenize=i,"operator"}}function s(n){return function(e,r){for(var t=n;(n=e.peek())&&n.match(u)!=null;)t+=e.next();return r.tokenize=i,l.test(t)?"operator":k(t)?"number":e.peek()==":"?"propertyName":"string"}}function i(n,e){var r=n.next();return r=='"'?e.tokenize=a(r):f.test(r)?e.tokenize=c(r):u.test(r)&&(e.tokenize=s(r)),e.tokenize!=i?e.tokenize(n,e):null}const p={name:"solr",startState:function(){return{tokenize:i}},token:function(n,e){return n.eatSpace()?null:e.tokenize(n,e)}};export{p as solr}; 2 | -------------------------------------------------------------------------------- /public/web/assets/spreadsheet-BCZA_wO0.js: -------------------------------------------------------------------------------- 1 | const i={name:"spreadsheet",startState:function(){return{stringType:null,stack:[]}},token:function(e,n){if(e){switch(n.stack.length===0&&(e.peek()=='"'||e.peek()=="'")&&(n.stringType=e.peek(),e.next(),n.stack.unshift("string")),n.stack[0]){case"string":for(;n.stack[0]==="string"&&!e.eol();)e.peek()===n.stringType?(e.next(),n.stack.shift()):e.peek()==="\\"?(e.next(),e.next()):e.match(/^.[^\\\"\']*/);return"string";case"characterClass":for(;n.stack[0]==="characterClass"&&!e.eol();)e.match(/^[^\]\\]+/)||e.match(/^\\./)||n.stack.shift();return"operator"}var c=e.peek();switch(c){case"[":return e.next(),n.stack.unshift("characterClass"),"bracket";case":":return e.next(),"operator";case"\\":return e.match(/\\[a-z]+/)?"string.special":(e.next(),"atom");case".":case",":case";":case"*":case"-":case"+":case"^":case"<":case"/":case"=":return e.next(),"atom";case"$":return e.next(),"builtin"}return e.match(/\d+/)?e.match(/^\w+/)?"error":"number":e.match(/^[a-zA-Z_]\w*/)?e.match(/(?=[\(.])/,!1)?"keyword":"variable":["[","]","(",")","{","}"].indexOf(c)!=-1?(e.next(),"bracket"):(e.eatSpace()||e.next(),null)}}};export{i as spreadsheet}; 2 | -------------------------------------------------------------------------------- /public/web/assets/svgDrawCommon-5e1cfd1d-Dq77TEEp.js: -------------------------------------------------------------------------------- 1 | import{au as o,o as i}from"./vendor-markdown-CL7ixDl-.js";const l=(s,t)=>{const e=s.append("rect");if(e.attr("x",t.x),e.attr("y",t.y),e.attr("fill",t.fill),e.attr("stroke",t.stroke),e.attr("width",t.width),e.attr("height",t.height),t.name&&e.attr("name",t.name),t.rx!==void 0&&e.attr("rx",t.rx),t.ry!==void 0&&e.attr("ry",t.ry),t.attrs!==void 0)for(const r in t.attrs)e.attr(r,t.attrs[r]);return t.class!==void 0&&e.attr("class",t.class),e},x=(s,t)=>{const e={x:t.startx,y:t.starty,width:t.stopx-t.startx,height:t.stopy-t.starty,fill:t.fill,stroke:t.stroke,class:"rect"};l(s,e).lower()},d=(s,t)=>{const e=t.text.replace(o," "),r=s.append("text");r.attr("x",t.x),r.attr("y",t.y),r.attr("class","legend"),r.style("text-anchor",t.anchor),t.class!==void 0&&r.attr("class",t.class);const n=r.append("tspan");return n.attr("x",t.x+t.textMargin*2),n.text(e),r},h=(s,t,e,r)=>{const n=s.append("image");n.attr("x",t),n.attr("y",e);const a=i.sanitizeUrl(r);n.attr("xlink:href",a)},y=(s,t,e,r)=>{const n=s.append("use");n.attr("x",t),n.attr("y",e);const a=i.sanitizeUrl(r);n.attr("xlink:href",`#${a}`)},g=()=>({x:0,y:0,width:100,height:100,fill:"#EDF2AE",stroke:"#666",anchor:"start",rx:0,ry:0}),p=()=>({x:0,y:0,width:100,height:100,"text-anchor":"start",style:"#666",textMargin:0,rx:0,ry:0,tspan:!0});export{x as a,p as b,y as c,l as d,h as e,d as f,g}; 2 | -------------------------------------------------------------------------------- /public/web/assets/toml-BXUEaScT.js: -------------------------------------------------------------------------------- 1 | const l={name:"toml",startState:function(){return{inString:!1,stringType:"",lhs:!0,inArray:0}},token:function(n,e){if(!e.inString&&(n.peek()=='"'||n.peek()=="'")&&(e.stringType=n.peek(),n.next(),e.inString=!0),n.sol()&&e.inArray===0&&(e.lhs=!0),e.inString){for(;e.inString&&!n.eol();)n.peek()===e.stringType?(n.next(),e.inString=!1):n.peek()==="\\"?(n.next(),n.next()):n.match(/^.[^\\\"\']*/);return e.lhs?"property":"string"}else{if(e.inArray&&n.peek()==="]")return n.next(),e.inArray--,"bracket";if(e.lhs&&n.peek()==="["&&n.skipTo("]"))return n.next(),n.peek()==="]"&&n.next(),"atom";if(n.peek()==="#")return n.skipToEnd(),"comment";if(n.eatSpace())return null;if(e.lhs&&n.eatWhile(function(i){return i!="="&&i!=" "}))return"property";if(e.lhs&&n.peek()==="=")return n.next(),e.lhs=!1,null;if(!e.lhs&&n.match(/^\d\d\d\d[\d\-\:\.T]*Z/))return"atom";if(!e.lhs&&(n.match("true")||n.match("false")))return"atom";if(!e.lhs&&n.peek()==="[")return e.inArray++,n.next(),"bracket";if(!e.lhs&&n.match(/^\-?\d+(?:\.\d+)?/))return"number";n.eatSpace()||n.next()}return null},languageData:{commentTokens:{line:"#"}}};export{l as toml}; 2 | -------------------------------------------------------------------------------- /public/web/assets/troff-wAsdV37c.js: -------------------------------------------------------------------------------- 1 | var h={};function u(n){if(n.eatSpace())return null;var t=n.sol(),c=n.next();if(c==="\\")return n.match("fB")||n.match("fR")||n.match("fI")||n.match("u")||n.match("d")||n.match("%")||n.match("&")?"string":n.match("m[")?(n.skipTo("]"),n.next(),"string"):n.match("s+")||n.match("s-")?(n.eatWhile(/[\d-]/),"string"):((n.match("(")||n.match("*("))&&n.eatWhile(/[\w-]/),"string");if(t&&(c==="."||c==="'")&&n.eat("\\")&&n.eat('"'))return n.skipToEnd(),"comment";if(t&&c==="."){if(n.match("B ")||n.match("I ")||n.match("R "))return"attribute";if(n.match("TH ")||n.match("SH ")||n.match("SS ")||n.match("HP "))return n.skipToEnd(),"quote";if(n.match(/[A-Z]/)&&n.match(/[A-Z]/)||n.match(/[a-z]/)&&n.match(/[a-z]/))return"attribute"}n.eatWhile(/[\w-]/);var i=n.current();return h.hasOwnProperty(i)?h[i]:null}function f(n,t){return(t.tokens[0]||u)(n,t)}const o={name:"troff",startState:function(){return{tokens:[]}},token:function(n,t){return f(n,t)}};export{o as troff}; 2 | -------------------------------------------------------------------------------- /public/web/assets/upload-Bg3SAr9E.js: -------------------------------------------------------------------------------- 1 | import{j as r}from"./vendor-map-DjDVTs0N.js";import{N as a}from"./vendor-refine-BK41FXO6.js";import{a1 as m,a3 as t}from"./modulepreload-polyfill-D6ThnDFs.js";import"./vendor-react-BlTfyhut.js";import"./vendor-echarts-JHGMnnew.js";import"./vendor-tdesign-BxQoi5Mo.js";import{U as l}from"./uploadFile-DJwHGSth.js";import"./vendor-tinymce-lUkVC9Da.js";import"./vendor-lib-CKVa3D7Q.js";import"./vendor-markdown-CL7ixDl-.js";import"./useUpload-BsrPC7ib.js";const N=({id:e})=>{const s=a(),{onClose:i}=m();return r.jsx("div",{className:"p-4",children:r.jsx(t,{direction:"vertical",children:r.jsx(t.Item,{children:r.jsx(l,{draggable:!0,theme:"file",className:"w-full",onSuccess:()=>{s({resource:"tools.file",invalidates:["list"]}),i==null||i()},hookProps:{formatRequest:o=>(o.dir_id=e,o)}})})})})};export{N as default}; 2 | -------------------------------------------------------------------------------- /public/web/assets/useSelect-BorzI4ID.js: -------------------------------------------------------------------------------- 1 | import{at as o}from"./vendor-refine-BK41FXO6.js";const a=e=>o({onSearch:r=>[{field:"keyword",operator:"eq",value:r}],...e});export{a as u}; 2 | -------------------------------------------------------------------------------- /public/web/assets/useUpload-BsrPC7ib.js: -------------------------------------------------------------------------------- 1 | import{$ as l,as as B}from"./vendor-refine-BK41FXO6.js";import{E as d}from"./modulepreload-polyfill-D6ThnDFs.js";import"./vendor-react-BlTfyhut.js";import"./vendor-map-DjDVTs0N.js";import"./vendor-echarts-JHGMnnew.js";import"./vendor-tdesign-BxQoi5Mo.js";import"./vendor-tinymce-lUkVC9Da.js";import"./vendor-lib-CKVa3D7Q.js";const E=a=>{const{name:p,config:n}=d(),{data:o}=l();return{action:`${B()}/${p}/${n.apiPath.upload}`,headers:{Accept:"application/json",Authorization:(o==null?void 0:o.token)||""},formatResponse:t=>{var u,e,r,m,c,s;const h=t.XMLHttpRequest;if(h.status!=200){let i={};try{i=JSON.parse(h.response)}catch{}t.error=(i==null?void 0:i.message)||t.statusText}else t.url=(e=(u=t==null?void 0:t.data)==null?void 0:u[0])==null?void 0:e.url,t.name=(m=(r=t==null?void 0:t.data)==null?void 0:r[0])==null?void 0:m.name,t.size=(s=(c=t==null?void 0:t.data)==null?void 0:c[0])==null?void 0:s.size;return t},...a}},F=a=>{if(Math.abs(a)<1024)return a+" B";const n=["KB","MB","GB","TB","PB","EB","ZB","YB"];let o=-1;do a/=1024,++o;while(Math.abs(a)>=1024&&o -------------------------------------------------------------------------------- /public/web/images/flags/en.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /theme/default/article.latte: -------------------------------------------------------------------------------- 1 | {layout 'layout.latte'} 2 | 3 | 4 | {block content} 5 | 6 | {if $id} 7 | {include 'article-list.latte', id: $id} 8 | {else} 9 | {include 'article-index.latte'} 10 | {/if} 11 | 12 | {/block} -------------------------------------------------------------------------------- /theme/default/build: -------------------------------------------------------------------------------- 1 | npx tailwindcss -i ./src/main.css -o ./css/style.css --watch -------------------------------------------------------------------------------- /theme/default/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "theme": { 3 | "name": "Dux 默认", 4 | "help": "这是 duxcms 的默认主题" 5 | }, 6 | "page": { 7 | "label": "全局", 8 | "fields": { 9 | "title": { 10 | "label": "标题", 11 | "type": "text" 12 | }, 13 | "keywords": { 14 | "label": "关键词", 15 | "type": "text" 16 | }, 17 | "description": { 18 | "label": "描述", 19 | "type": "text" 20 | } 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /theme/default/images/banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/theme/default/images/banner.jpg -------------------------------------------------------------------------------- /theme/default/images/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /theme/default/langs/en-US.yaml: -------------------------------------------------------------------------------- 1 | info: You can customize your own theme by following these steps 2 | step1: Create your own theme in the directory 3 | step2: Use the _code_ template engine for data retrieval 4 | step3: Include _code_ custom template parameters 5 | description: DuxCMS is a management system based on the Headless CMS concept, and it can fulfill your usage needs through various data retrievals. 6 | tips: Want to delve deeper into template development? 7 | doc: Read Docs -------------------------------------------------------------------------------- /theme/default/langs/ja-JP.yaml: -------------------------------------------------------------------------------- 1 | info: 以下の手順に従って、独自のテーマをカスタマイズできます 2 | step1: ディレクトリに独自のテーマを作成します 3 | step2: データ呼び出しに _code_ テンプレートエンジンを使用します 4 | step3: _code_ カスタムテンプレートパラメータを追加します 5 | description: DuxCMSは、Headless CMSコンセプトに基づいた管理システムで、さまざまなデータ呼び出しを通じて使用要件を実現できます。 6 | tips: テンプレート開発に詳しくなりたいですか? 7 | doc: ドキュメンテーションを読む -------------------------------------------------------------------------------- /theme/default/langs/ko-KR.yaml: -------------------------------------------------------------------------------- 1 | info: 다음 단계를 따라 자신만의 테마를 사용자 정의할 수 있습니다. 2 | step1: 디렉토리에서 자신의 테마를 만듭니다. 3 | step2: 데이터 호출에 _code_ 템플릿 엔진을 사용합니다. 4 | step3: _code_ 사용자 정의 템플릿 매개변수를 추가합니다. 5 | description: DuxCMS는 Headless CMS 이념을 기반으로 한 관리 시스템으로, 다양한 데이터 호출을 통해 사용 요구 사항을 충족시킬 수 있습니다. 6 | tips: 템플릿 개발에 대해 자세히 알아보려면? 7 | doc: 문서를 읽으세요. -------------------------------------------------------------------------------- /theme/default/langs/ru-RU.yaml: -------------------------------------------------------------------------------- 1 | info: Вы можете настроить свою собственную тему, следуя этим шагам 2 | step1: Создайте свою собственную тему в каталоге. 3 | step2: Используйте шаблонный движок _code_ для вызова данных. 4 | step3: Добавьте параметры настройки шаблона _code_. 5 | description: DuxCMS - это система управления, основанная на принципах Headless CMS, которая позволяет удовлетворить ваши потребности в использовании с помощью различных вызовов данных. 6 | tips: Хотите узнать больше о разработке шаблонов? 7 | doc: Прочитайте документацию. -------------------------------------------------------------------------------- /theme/default/langs/zh-CN.yaml: -------------------------------------------------------------------------------- 1 | home: 首页 2 | recommend: 推荐 3 | more: 更多 4 | welcome: 欢迎使用 5 | info: Dux是一款强大、灵活且自由的内容管理框架 6 | site: 官方网站 7 | docs: 开发手册 8 | article: 文章 9 | publish: 发布 10 | source: 来源 11 | tags: 标签 12 | prev: 上一篇 13 | next: 下一篇 14 | top: 置顶 15 | class: 分类 16 | images: 图集 17 | link: 友情链接 18 | dux_site: Dux官方 19 | dux_store: Dux商店 20 | facebook: 建议和反馈 21 | facebook_help: 如果您对该产品有什么建议或者想法您可以采用以下方式跟我们进行沟通 22 | search: 搜索 -------------------------------------------------------------------------------- /theme/default/langs/zh-TW.yaml: -------------------------------------------------------------------------------- 1 | info: 你可以按照以下步驟客製化你的主題 2 | step1: 在目錄中建立你自己的主題 3 | step2: 使用 _code_ 模板引擎進行資料呼叫 4 | step3: 加入 _code_ 客製化模板參數 5 | description: DuxCMS 是一個基於 Headless CMS 理念的管理系統,透過不同的資料呼叫,可以實現您的使用需求。 6 | tips: 深入瞭解模板開發? 7 | doc: 閱讀文件 -------------------------------------------------------------------------------- /theme/default/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "dev": "npx tailwindcss -i ./src/main.css -o ./css/style.css --watch", 4 | "build": "npx tailwindcss -i ./src/main.css -o ./css/style.css" 5 | }, 6 | "devDependencies": { 7 | "@tailwindcss/typography": "^0.5.10", 8 | "tailwindcss": "^3.4.1" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /theme/default/src/main.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; -------------------------------------------------------------------------------- /theme/default/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: ["./**/*.latte"], 4 | theme: { 5 | extend: { 6 | typography: (theme) => ({ 7 | DEFAULT: { 8 | css: { 9 | a: { 10 | '&:hover': { 11 | color: theme('colors.blue.600'), 12 | }, 13 | }, 14 | }, 15 | }, 16 | }), 17 | }, 18 | }, 19 | plugins: [ 20 | require('@tailwindcss/typography') 21 | ], 22 | } -------------------------------------------------------------------------------- /theme/default/topic.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/theme/default/topic.jpg -------------------------------------------------------------------------------- /theme/default/widgets/article-rec.latte: -------------------------------------------------------------------------------- 1 |
2 | 4 | 6 | {$item->title} 7 | 8 |
{$item->descriptions}
9 |
10 | 12 | 14 | 16 | 17 |
{$item->view}
18 |
19 |
-------------------------------------------------------------------------------- /web/.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | browser: true, 4 | es2020: true, 5 | }, 6 | extends: [ 7 | 'eslint:recommended', 8 | 'plugin:@typescript-eslint/recommended', 9 | 'plugin:react/recommended', 10 | 'plugin:react-hooks/recommended', 11 | '@unocss', 12 | 'prettier', 13 | ], 14 | parser: '@typescript-eslint/parser', 15 | parserOptions: { 16 | ecmaVersion: 'latest', 17 | sourceType: 'module', 18 | }, 19 | overrides: [ 20 | { 21 | files: '*.mdx', 22 | extends: 'plugin:mdx/recommended', 23 | }, 24 | ], 25 | plugins: ['prettier'], 26 | rules: { 27 | 'prettier/prettier': [ 28 | 'error', 29 | { 30 | singleQuote: true, 31 | semi: false, 32 | printWidth: 100, 33 | jsxSingleQuote: true, 34 | endOfLine: 'auto', 35 | indent: 2, 36 | tabWidth: 2, 37 | }, 38 | ], 39 | 'no-undef': 'off', 40 | 'no-unused-vars': 'off', 41 | '@typescript-eslint/no-explicit-any': ['off'], 42 | 'react/react-in-jsx-scope': 'off', 43 | 'react/prop-types': 0, 44 | }, 45 | globals: { 46 | MockDatabase: 'writable', 47 | }, 48 | } 49 | -------------------------------------------------------------------------------- /web/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | storybook-static 14 | *.local 15 | 16 | # Editor directories and files 17 | .vscode/* 18 | !.vscode/extensions.json 19 | .idea 20 | .DS_Store 21 | *.suo 22 | *.ntvs* 23 | *.njsproj 24 | *.sln 25 | *.sw? 26 | 27 | 28 | .yalc 29 | yalc.lock -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | DuxWeb Dev 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /web/install.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | DuxWeb Dev 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /web/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duxweb/duxcms/9f9d4ba7ba1eda000c9d9740282c63fab8dab83f/web/public/favicon.ico -------------------------------------------------------------------------------- /web/public/images/flags/de.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/public/images/flags/en.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/config/app.ts: -------------------------------------------------------------------------------- 1 | import { appConfig } from '@duxweb/dux-refine' 2 | import Cloud from '../pages/cloud' 3 | import Cms from '../pages/cms' 4 | import Content from '../pages/content' 5 | import ContentExtend from '../pages/contentExtend' 6 | import Poster from '../pages/poster' 7 | import System from '../pages/system' 8 | import Tools from '../pages/tools' 9 | 10 | const app: appConfig[] = [Cloud, Cms, Content, ContentExtend, Poster, System, Tools] 11 | 12 | export default app 13 | -------------------------------------------------------------------------------- /web/src/config/index.ts: -------------------------------------------------------------------------------- 1 | import { Config } from '@duxweb/dux-refine' 2 | 3 | const config: Config = { 4 | projectId: '', 5 | apiUrl: '', 6 | apiPath: { 7 | login: 'login', 8 | check: 'check', 9 | register: 'register', 10 | forgotPassword: 'forgot-password', 11 | updatePassword: 'update-password', 12 | upload: 'upload', 13 | menu: 'menu', 14 | }, 15 | defaultApp: 'admin', 16 | indexName: window?.manage?.indexName || 'system', 17 | title: window?.manage?.title, 18 | copyright: window?.manage?.copyright, 19 | resourcesPrefix: true, 20 | moduleApp: { 21 | admin: { 22 | register: false, 23 | forgotPassword: false, 24 | }, 25 | }, 26 | sideType: window?.manage?.sideType || 'level', 27 | lang: window?.lang, 28 | baiduMap: window?.manage?.baiduMap || '', 29 | appLogo: window?.manage?.appLogo, 30 | appDarkLogo: window?.manage?.appDarkLogo, 31 | } 32 | export default config 33 | -------------------------------------------------------------------------------- /web/src/global.d.ts: -------------------------------------------------------------------------------- 1 | import { lang, siderType } from '@duxweb/dux-refine' 2 | 3 | declare global { 4 | interface Manage { 5 | sideType?: siderType 6 | indexName?: string 7 | baiduMap?: string 8 | [key: string]: any 9 | } 10 | interface Window { 11 | lang?: lang 12 | baiduMap?: string 13 | manage?: Manage 14 | } 15 | } 16 | 17 | declare module '*.svg' { 18 | const content: any 19 | export default content 20 | } 21 | -------------------------------------------------------------------------------- /web/src/index.tsx: -------------------------------------------------------------------------------- 1 | import { createRoot } from 'react-dom/client' 2 | import { AppProvider, DuxApp } from '@duxweb/dux-refine' 3 | 4 | import '@unocss/reset/tailwind-compat.css' 5 | import 'virtual:uno.css' 6 | 7 | import app from './config/app' 8 | import config from './config' 9 | 10 | import 'vite/modulepreload-polyfill' 11 | 12 | const container = document.getElementById('root') as HTMLElement 13 | const root = createRoot(container) 14 | 15 | root.render( 16 | 17 | 18 | , 19 | ) 20 | -------------------------------------------------------------------------------- /web/src/install.tsx: -------------------------------------------------------------------------------- 1 | import { createRoot } from 'react-dom/client' 2 | import { DuxApp, DuxLogo } from '@duxweb/dux-refine' 3 | import { InstallApp } from '@duxweb/dux-extend' 4 | 5 | import '@unocss/reset/tailwind-compat.css' 6 | import 'virtual:uno.css' 7 | 8 | import config from './config' 9 | 10 | import 'vite/modulepreload-polyfill' 11 | 12 | const container = document.getElementById('root') as HTMLElement 13 | const root = createRoot(container) 14 | 15 | root.render( 16 | 17 | } 23 | /> 24 | 25 | ) 26 | -------------------------------------------------------------------------------- /web/src/pages/cloud/admin/apps/login.tsx: -------------------------------------------------------------------------------- 1 | import { useTranslate } from '@refinedev/core' 2 | import { FormModal } from '@duxweb/dux-refine' 3 | import { Form, Input, Link } from 'tdesign-react/esm' 4 | 5 | const Page = (props: Record) => { 6 | const translate = useTranslate() 7 | 8 | return ( 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | {translate('cloud.apps.tips.login')} 18 | 19 | {translate('cloud.apps.tips.register')} 20 | 21 | 22 | 23 | ) 24 | } 25 | 26 | export default Page 27 | -------------------------------------------------------------------------------- /web/src/pages/cloud/config/resources.tsx: -------------------------------------------------------------------------------- 1 | import { App, lazyComponent } from '@duxweb/dux-refine' 2 | 3 | export const adminResources = (app: App) => { 4 | app.addResources([ 5 | { 6 | name: 'cloud.apps', 7 | list: 'cloud/apps', 8 | listElenemt: lazyComponent(() => import('../admin/apps/list')), 9 | meta: { 10 | icon: 'app', 11 | label: 'cloud.apps', 12 | parent: 'system', 13 | sort: 1000, 14 | }, 15 | }, 16 | ]) 17 | } 18 | -------------------------------------------------------------------------------- /web/src/pages/cloud/index.ts: -------------------------------------------------------------------------------- 1 | import { appConfig, appContext } from '@duxweb/dux-refine' 2 | import { adminResources } from './config/resources' 3 | import enUSLang from './locales/en-US/common.json' 4 | import zhCNLang from './locales/zh-CN/common.json' 5 | import zhTWLang from './locales/zh-TW/common.json' 6 | import jaJPLang from './locales/ja-JP/common.json' 7 | import koKRLang from './locales/ko-KR/common.json' 8 | import ruRULang from './locales/ru-RU/common.json' 9 | 10 | const init = (context: appContext) => { 11 | context.addI18n('en-US', 'common', enUSLang) 12 | context.addI18n('zh-CN', 'common', zhCNLang) 13 | context.addI18n('zh-TW', 'common', zhTWLang) 14 | context.addI18n('ja-JP', 'common', jaJPLang) 15 | context.addI18n('ko-KR', 'common', koKRLang) 16 | context.addI18n('ru-RU', 'common', ruRULang) 17 | } 18 | 19 | const register = (context: appContext) => { 20 | const admin = context.getApp('admin') 21 | adminResources(admin) 22 | } 23 | 24 | const config: appConfig = { 25 | init: init, 26 | register: register, 27 | } 28 | 29 | export default config 30 | -------------------------------------------------------------------------------- /web/src/pages/cloud/locales/en-US/common.json: -------------------------------------------------------------------------------- 1 | { 2 | "cloud": { 3 | "name": "Cloud platform", 4 | "apps": { 5 | "name": "Application Center", 6 | "action": { 7 | "login": "Login", 8 | "install": "install", 9 | "uninstall": "uninstall", 10 | "update": "update", 11 | "close": "cancel" 12 | }, 13 | "fields": { 14 | "name": "application", 15 | "time": "version", 16 | "update": "update", 17 | "username": "user name", 18 | "password": "password" 19 | }, 20 | "tips": { 21 | "uninstall": "Uninstalling this application is not recoverable and requires verifying the user password. Please proceed with caution", 22 | "update": "Discovered a new version, do you need to update it?", 23 | "loading": "Processing, please check the log later" 24 | }, 25 | "validator": { 26 | "url": "Please enter the installation address" 27 | } 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /web/src/pages/cloud/locales/ja-JP/common.json: -------------------------------------------------------------------------------- 1 | { 2 | "cloud": { 3 | "name": "クラウドプラットフォーム", 4 | "apps": { 5 | "name": "アプリケーションセンター", 6 | "action": { 7 | "login": "ログイン#ログイン#", 8 | "install": "インストール", 9 | "uninstall": "アンインストール", 10 | "update": "更新", 11 | "close": "キャンセル" 12 | }, 13 | "fields": { 14 | "name": "適用#テキヨウ#", 15 | "time": "バージョン", 16 | "update": "更新", 17 | "username": "ユーザー名", 18 | "password": "パスワード" 19 | }, 20 | "tips": { 21 | "uninstall": "アプリケーションをアンインストールするにはリカバリできません。ユーザーパスワードを検証する必要があります。注意してください", 22 | "update": "新しいバージョンが見つかりました。更新が必要ですか?", 23 | "loading": "処理中、後でログを表示してください" 24 | }, 25 | "validator": { 26 | "url": "インストール先住所を入力してください" 27 | } 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /web/src/pages/cloud/locales/ko-KR/common.json: -------------------------------------------------------------------------------- 1 | { 2 | "cloud": { 3 | "name": "클라우드 플랫폼", 4 | "apps": { 5 | "name": "응용 센터", 6 | "action": { 7 | "login": "로그인", 8 | "install": "설치", 9 | "uninstall": "제거", 10 | "update": "업데이트", 11 | "close": "취소" 12 | }, 13 | "fields": { 14 | "name": "적용", 15 | "time": "버전", 16 | "update": "업데이트", 17 | "username": "사용자 이름", 18 | "password": "암호" 19 | }, 20 | "tips": { 21 | "uninstall": "애플리케이션을 제거해도 복구할 수 없습니다. 사용자 암호를 확인해야 합니다. 조심하십시오.", 22 | "update": "새 버전이 발견되었습니다. 업데이트해야 합니까?", 23 | "loading": "처리 중, 로그를 나중에 확인하십시오." 24 | }, 25 | "validator": { 26 | "url": "설치 주소를 입력하십시오." 27 | } 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /web/src/pages/cloud/locales/ru-RU/common.json: -------------------------------------------------------------------------------- 1 | { 2 | "cloud": { 3 | "name": "Облачная платформа", 4 | "apps": { 5 | "name": "Центр прикладного применения", 6 | "action": { 7 | "login": "Регистрация", 8 | "install": "Монтаж", 9 | "uninstall": "Удалить", 10 | "update": "Обновление", 11 | "close": "Отменить" 12 | }, 13 | "fields": { 14 | "name": "Применение", 15 | "time": "Версия", 16 | "update": "Обновление", 17 | "username": "Имя пользователя", 18 | "password": "Пароль" 19 | }, 20 | "tips": { 21 | "uninstall": "Удаление приложения не может быть восстановлено, необходимо проверить пароль пользователя, будьте осторожны", 22 | "update": "Обнаружена новая версия, требуется ли обновление?", 23 | "loading": "В процессе обработки, пожалуйста, проверьте журнал позже" 24 | }, 25 | "validator": { 26 | "url": "Введите адрес установки" 27 | } 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /web/src/pages/cloud/locales/zh-CN/common.json: -------------------------------------------------------------------------------- 1 | { 2 | "cloud": { 3 | "name": "云平台", 4 | "apps": { 5 | "name": "应用中心", 6 | "action": { 7 | "login": "登录", 8 | "install": "安装", 9 | "uninstall": "卸载", 10 | "update": "更新", 11 | "close": "取消" 12 | }, 13 | "fields": { 14 | "name": "应用", 15 | "time": "版本", 16 | "update": "更新", 17 | "username": "用户名", 18 | "password": "密码", 19 | "verCur": "当前版本:", 20 | "verTarget": "最新版本:" 21 | }, 22 | "tips": { 23 | "uninstall": "卸载该应用不可恢复,需验证用户密码,请谨慎操作", 24 | "update": "发现新版本,是否需要更新?", 25 | "loading": "处理中,请稍后查看日志", 26 | "login": "没有账号?", 27 | "register": "注册应用平台" 28 | }, 29 | "validator": { 30 | "url": "安装地址", 31 | "build": "编译界面" 32 | }, 33 | "help": { 34 | "build": "编译前端请确保服务器环境可执行 yarn 命令" 35 | } 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /web/src/pages/cloud/locales/zh-TW/common.json: -------------------------------------------------------------------------------- 1 | { 2 | "cloud": { 3 | "name": "雲平臺", 4 | "apps": { 5 | "name": "應用中心", 6 | "action": { 7 | "login": "登入", 8 | "install": "安裝", 9 | "uninstall": "卸載", 10 | "update": "更新", 11 | "close": "取消" 12 | }, 13 | "fields": { 14 | "name": "應用", 15 | "time": "版本", 16 | "update": "更新", 17 | "username": "用戶名", 18 | "password": "密碼" 19 | }, 20 | "tips": { 21 | "uninstall": "卸載該應用不可恢復,需驗證使用者密碼,請謹慎操作", 22 | "update": "發現新版本,是否需要更新?", 23 | "loading": "處理中,請稍後查看日誌" 24 | }, 25 | "validator": { 26 | "url": "請輸入安裝的地址" 27 | } 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /web/src/pages/cms/components/editor.tsx: -------------------------------------------------------------------------------- 1 | import { MarkdownEditor, Editor as Timymce } from '@duxweb/dux-refine' 2 | import { useOne } from '@refinedev/core' 3 | 4 | interface EditorProps { 5 | defaultValue?: string 6 | value?: string 7 | onChange?: (value: unknown) => void 8 | } 9 | 10 | export const Editor = ({ ...props }: EditorProps) => { 11 | const { data } = useOne({ 12 | resource: 'cms.setting', 13 | queryOptions: { 14 | enabled: true, 15 | }, 16 | }) 17 | 18 | const editor = data?.data?.cms?.editor || 'default' 19 | 20 | return ( 21 |
22 | {editor == 'default' && } 23 | {editor == 'markdown' && } 24 |
25 | ) 26 | } 27 | -------------------------------------------------------------------------------- /web/src/pages/cms/config/resources.tsx: -------------------------------------------------------------------------------- 1 | import { App, lazyComponent } from '@duxweb/dux-refine' 2 | 3 | export const adminResources = (app: App) => { 4 | app.addResources([ 5 | { 6 | name: 'cms', 7 | meta: { 8 | label: 'cms', 9 | icon: 'i-tabler:sitemap', 10 | parent: 'system', 11 | sort: 50, 12 | }, 13 | }, 14 | { 15 | name: 'cms.theme', 16 | list: 'cms/theme', 17 | listElenemt: lazyComponent(() => import('../admin/theme/list')), 18 | meta: { 19 | label: 'cms.theme', 20 | parent: 'cms', 21 | }, 22 | }, 23 | { 24 | name: 'cms.setting', 25 | list: 'cms/setting', 26 | listElenemt: lazyComponent(() => import('../admin/setting/page')), 27 | meta: { 28 | label: 'cms.setting', 29 | parent: 'cms', 30 | }, 31 | }, 32 | ]) 33 | } 34 | -------------------------------------------------------------------------------- /web/src/pages/cms/index.ts: -------------------------------------------------------------------------------- 1 | import { appConfig, appContext, lazyComponent } from '@duxweb/dux-refine' 2 | import { adminResources } from './config/resources' 3 | 4 | const init = (context: appContext) => { 5 | const data = import.meta.glob('./locales/*.json', { eager: true }) 6 | context.addI18ns(data) 7 | } 8 | 9 | const register = (context: appContext) => { 10 | const admin = context.getApp('admin') 11 | 12 | admin.addIndexs([ 13 | { 14 | name: 'cms', 15 | component: lazyComponent(() => import('./admin/home/index')), 16 | }, 17 | ]) 18 | 19 | if (context.config.indexName != 'cms') { 20 | admin.addResources([ 21 | { 22 | name: 'cms.dashboard', 23 | list: 'cms/dashboard', 24 | listElenemt: lazyComponent(() => import('./admin/home/index')), 25 | meta: { 26 | label: 'cms.dashboard', 27 | icon: 'i-tabler:home', 28 | parent: 'content', 29 | sort: 0, 30 | }, 31 | }, 32 | ]) 33 | } 34 | adminResources(admin) 35 | } 36 | 37 | const config: appConfig = { 38 | init: init, 39 | register: register, 40 | } 41 | 42 | export default config 43 | -------------------------------------------------------------------------------- /web/src/pages/content/admin/attr/save.tsx: -------------------------------------------------------------------------------- 1 | import { useTranslate } from '@refinedev/core' 2 | import { FormModal } from '@duxweb/dux-refine' 3 | import { Form, Input } from 'tdesign-react/esm' 4 | 5 | const Page = (props: Record) => { 6 | const translate = useTranslate() 7 | 8 | return ( 9 | 10 | 11 | 12 | 13 | 14 | ) 15 | } 16 | 17 | export default Page 18 | -------------------------------------------------------------------------------- /web/src/pages/content/admin/menu/group.tsx: -------------------------------------------------------------------------------- 1 | import { useTranslate } from '@refinedev/core' 2 | import { FormModal } from '@duxweb/dux-refine' 3 | import { Form, Input } from 'tdesign-react/esm' 4 | 5 | const Page = (props: Record) => { 6 | const translate = useTranslate() 7 | 8 | return ( 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | ) 18 | } 19 | 20 | export default Page 21 | -------------------------------------------------------------------------------- /web/src/pages/content/admin/replace/save.tsx: -------------------------------------------------------------------------------- 1 | import { useTranslate } from '@refinedev/core' 2 | import { FormModal } from '@duxweb/dux-refine' 3 | import { Form, Input } from 'tdesign-react/esm' 4 | 5 | const Page = (props: Record) => { 6 | const translate = useTranslate() 7 | 8 | return ( 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | ) 18 | } 19 | 20 | export default Page 21 | -------------------------------------------------------------------------------- /web/src/pages/content/admin/setting/page.tsx: -------------------------------------------------------------------------------- 1 | import { useTranslate } from '@refinedev/core' 2 | import { FormPage, FormPageItem, SelectAsync } from '@duxweb/dux-refine' 3 | import { Tabs } from 'tdesign-react/esm' 4 | 5 | const Index = () => { 6 | const translate = useTranslate() 7 | 8 | return ( 9 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | ) 29 | } 30 | 31 | export default Index 32 | -------------------------------------------------------------------------------- /web/src/pages/content/admin/source/save.tsx: -------------------------------------------------------------------------------- 1 | import { useTranslate } from '@refinedev/core' 2 | import { FormModal, UploadImageManage } from '@duxweb/dux-refine' 3 | import { Form, Input } from 'tdesign-react/esm' 4 | 5 | const Page = (props: Record) => { 6 | const translate = useTranslate() 7 | 8 | return ( 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | ) 18 | } 19 | 20 | export default Page 21 | -------------------------------------------------------------------------------- /web/src/pages/content/index.ts: -------------------------------------------------------------------------------- 1 | import { appConfig, appContext } from '@duxweb/dux-refine' 2 | 3 | import { adminResources } from './config/resources' 4 | 5 | const init = (context: appContext) => { 6 | const data = import.meta.glob('./locales/*.json', { eager: true }) 7 | context.addI18ns(data) 8 | } 9 | 10 | const register = (context: appContext) => { 11 | const admin = context.getApp('admin') 12 | adminResources(admin) 13 | } 14 | 15 | const config: appConfig = { 16 | init: init, 17 | register: register, 18 | } 19 | 20 | export default config 21 | -------------------------------------------------------------------------------- /web/src/pages/contentExtend/index.ts: -------------------------------------------------------------------------------- 1 | import { appConfig, appContext } from '@duxweb/dux-refine' 2 | import './hook' 3 | 4 | const init = (context: appContext) => { 5 | const data = import.meta.glob('./locales/*.json', { eager: true }) 6 | context.addI18ns(data) 7 | } 8 | 9 | const config: appConfig = { 10 | init: init, 11 | } 12 | 13 | export default config 14 | -------------------------------------------------------------------------------- /web/src/pages/contentExtend/locales/en-US.json: -------------------------------------------------------------------------------- 1 | { 2 | "contentExtend": { 3 | "name": "Content extension", 4 | "spider": { 5 | "name": "Collection Assistant", 6 | "fields": { 7 | "extract": "extract" 8 | }, 9 | "validates": { 10 | "uri": "Please enter the content page address" 11 | }, 12 | "helps": { 13 | "extract": " Only supports content extraction for static web pages, currently does not support JS rendering content extraction" 14 | } 15 | } 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /web/src/pages/contentExtend/locales/ja-JP.json: -------------------------------------------------------------------------------- 1 | { 2 | "contentExtend": { 3 | "name": "コンテンツ拡張", 4 | "spider": { 5 | "name": "収集アシスタント", 6 | "fields": { 7 | "extract": "ちゅうしゅつ" 8 | }, 9 | "validates": { 10 | "uri": "コンテンツページアドレスを入力してください" 11 | }, 12 | "helps": { 13 | "extract": " 静的Webページのコンテンツ抽出のみがサポートされ、jsレンダリングコンテンツ抽出はサポートされていません" 14 | } 15 | } 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /web/src/pages/contentExtend/locales/ko-KR.json: -------------------------------------------------------------------------------- 1 | { 2 | "contentExtend": { 3 | "name": "컨텐츠 확장", 4 | "spider": { 5 | "name": "채집 도우미", 6 | "fields": { 7 | "extract": "추출" 8 | }, 9 | "validates": { 10 | "uri": "컨텐츠 페이지 주소를 입력하십시오." 11 | }, 12 | "helps": { 13 | "extract": " 정적 웹 페이지의 컨텐츠 추출만 지원되며 js 렌더링 컨텐츠 추출은 일시적으로 지원되지 않음" 14 | } 15 | } 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /web/src/pages/contentExtend/locales/ru-RU.json: -------------------------------------------------------------------------------- 1 | { 2 | "contentExtend": { 3 | "name": "Расширение содержания", 4 | "spider": { 5 | "name": "Помощник по сбору", 6 | "fields": { 7 | "extract": "Извлечение" 8 | }, 9 | "validates": { 10 | "uri": "Введите адрес страницы содержимого" 11 | }, 12 | "helps": { 13 | "extract": " Поддерживается только извлечение содержимого из статических веб - страниц, временно не поддерживается извлечение содержимого из JS - рендеринга" 14 | } 15 | } 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /web/src/pages/contentExtend/locales/zh-CN.json: -------------------------------------------------------------------------------- 1 | { 2 | "contentExtend": { 3 | "name": "内容扩展", 4 | "spider": { 5 | "name": "采集助手", 6 | "fields": { 7 | "extract": "提取" 8 | }, 9 | "validates": { 10 | "uri": "请输入内容页面地址" 11 | }, 12 | "helps": { 13 | "extract": " 仅支持静态网页的内容提取,暂不支持 js 渲染内容提取" 14 | } 15 | } 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /web/src/pages/contentExtend/locales/zh-TW.json: -------------------------------------------------------------------------------- 1 | { 2 | "contentExtend": { 3 | "name": "內容擴展", 4 | "spider": { 5 | "name": "採集助手", 6 | "fields": { 7 | "extract": "提取" 8 | }, 9 | "validates": { 10 | "uri": "請輸入內容頁面地址" 11 | }, 12 | "helps": { 13 | "extract": " 僅支持靜態網頁的內容選取,暫不支持js渲染內容選取" 14 | } 15 | } 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /web/src/pages/poster/admin/design/page.tsx: -------------------------------------------------------------------------------- 1 | import { useTranslate, useResourceParams } from '@refinedev/core' 2 | import { FormPage, FormPageItem } from '@duxweb/dux-refine' 3 | import { Input } from 'tdesign-react/esm' 4 | import { Poster } from '@duxweb/dux-extend' 5 | 6 | const Page = () => { 7 | const translate = useTranslate() 8 | const { id } = useResourceParams() 9 | 10 | return ( 11 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | ) 32 | } 33 | 34 | export default Page 35 | -------------------------------------------------------------------------------- /web/src/pages/poster/admin/design/style.scss: -------------------------------------------------------------------------------- 1 | .canvas-container { 2 | @apply bg-container; 3 | } -------------------------------------------------------------------------------- /web/src/pages/poster/config/resources.tsx: -------------------------------------------------------------------------------- 1 | import { App, lazyComponent } from '@duxweb/dux-refine' 2 | 3 | export const adminResources = (app: App) => { 4 | app.addResources([ 5 | { 6 | name: 'poster.design', 7 | list: 'poster/design', 8 | create: 'poster/design/page', 9 | edit: 'poster/design/page/:id', 10 | listElenemt: lazyComponent(() => import('../admin/design/list')), 11 | createElenemt: lazyComponent(() => import('../admin/design/page')), 12 | editElenemt: lazyComponent(() => import('../admin/design/page')), 13 | meta: { 14 | label: 'poster.design', 15 | icon: 'i-tabler:photo', 16 | parent: 'tools', 17 | sort: 100, 18 | }, 19 | }, 20 | ]) 21 | } 22 | -------------------------------------------------------------------------------- /web/src/pages/poster/index.ts: -------------------------------------------------------------------------------- 1 | import { appConfig, appContext } from '@duxweb/dux-refine' 2 | import { adminResources } from './config/resources' 3 | 4 | const init = (context: appContext) => { 5 | const data = import.meta.glob('./locales/*.json', { eager: true }) 6 | context.addI18ns(data) 7 | } 8 | 9 | const register = (context: appContext) => { 10 | const admin = context.getApp('admin') 11 | adminResources(admin) 12 | } 13 | 14 | const config: appConfig = { 15 | init: init, 16 | register: register, 17 | } 18 | 19 | export default config 20 | -------------------------------------------------------------------------------- /web/src/pages/poster/locales/en-US.json: -------------------------------------------------------------------------------- 1 | { 2 | "poster": { 3 | "name": "poster", 4 | 5 | "design": { 6 | "name": "Poster template", 7 | "fields": { 8 | "title": "title", 9 | "data": "Poster Design " 10 | }, 11 | "validate": { 12 | "title": "Please enter the poster title" 13 | } 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /web/src/pages/poster/locales/ja-JP.json: -------------------------------------------------------------------------------- 1 | { 2 | "poster": { 3 | "name": "ポスター枚", 4 | 5 | "design": { 6 | "name": "ポスターテンプレート", 7 | "fields": { 8 | "title": "タイトル", 9 | "data": "ポスターデザイン" 10 | }, 11 | "validate": { 12 | "title": "ポスターのタイトルを入力してください" 13 | } 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /web/src/pages/poster/locales/ko-KR.json: -------------------------------------------------------------------------------- 1 | { 2 | "poster": { 3 | "name": "포스터", 4 | 5 | "design": { 6 | "name": "포스터 템플릿", 7 | "fields": { 8 | "title": "제목", 9 | "data": "포스터 디자인" 10 | }, 11 | "validate": { 12 | "title": "포스터 제목을 입력하세요" 13 | } 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /web/src/pages/poster/locales/ru-RU.json: -------------------------------------------------------------------------------- 1 | { 2 | "poster": { 3 | "name": "Плакаты", 4 | 5 | "design": { 6 | "name": "Шаблоны: плакаты", 7 | "fields": { 8 | "title": "Заголовок", 9 | "data": "Дизайн плакатов" 10 | }, 11 | "validate": { 12 | "title": "Введите заголовок плаката." 13 | } 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /web/src/pages/poster/locales/zh-CN.json: -------------------------------------------------------------------------------- 1 | { 2 | "poster": { 3 | "name": "海报", 4 | 5 | "design": { 6 | "name": "海报模板", 7 | "fields": { 8 | "title": "标题", 9 | "data": "海报设计" 10 | }, 11 | "validate": { 12 | "title": "请输入海报标题" 13 | } 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /web/src/pages/poster/locales/zh-TW.json: -------------------------------------------------------------------------------- 1 | { 2 | "poster": { 3 | "name": "海報", 4 | 5 | "design": { 6 | "name": "海報範本", 7 | "fields": { 8 | "title": "標題", 9 | "data": "海報設計" 10 | }, 11 | "validate": { 12 | "title": "請輸入海報標題" 13 | } 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /web/src/pages/system/admin/api/save.tsx: -------------------------------------------------------------------------------- 1 | import { useTranslate } from '@refinedev/core' 2 | import { FormModal } from '@duxweb/dux-refine' 3 | import { Form, Input } from 'tdesign-react/esm' 4 | 5 | const Page = (props: Record) => { 6 | const translate = useTranslate() 7 | 8 | return ( 9 | 10 | 11 | 12 | 13 | 14 | ) 15 | } 16 | 17 | export default Page 18 | -------------------------------------------------------------------------------- /web/src/pages/system/admin/operate/show.tsx: -------------------------------------------------------------------------------- 1 | import { useOne, useTranslate } from '@refinedev/core' 2 | import { Descriptions } from '@duxweb/dux-refine' 3 | 4 | const Page = (props: Record) => { 5 | const id = props?.id 6 | const translate = useTranslate() 7 | 8 | const { data, isLoading } = useOne({ 9 | id: id, 10 | }) 11 | 12 | const info = data?.data || {} 13 | 14 | return ( 15 |
16 | 17 | 18 | {info?.request_method} 19 | 20 | 21 | {info?.request_url} 22 | 23 | 24 | {info?.request_time} 25 | 26 | 27 |
28 | {info?.request_params ? JSON.stringify(info?.request_params, null, '\t') : ''} 29 |
30 |
31 |
32 |
33 | ) 34 | } 35 | 36 | export default Page 37 | -------------------------------------------------------------------------------- /web/src/pages/system/admin/role/save.tsx: -------------------------------------------------------------------------------- 1 | import { useTranslate, useCustom } from '@refinedev/core' 2 | import { FormModal } from '@duxweb/dux-refine' 3 | import { Form, Input, Tree } from 'tdesign-react/esm' 4 | 5 | const Page = (props: Record) => { 6 | const translate = useTranslate() 7 | 8 | const { data } = useCustom({ 9 | method: 'get', 10 | url: 'system/role/permission', 11 | }) 12 | 13 | const permissionData = data?.data as Array | undefined 14 | 15 | return ( 16 | 17 | 18 | 19 | 20 | 21 | 29 | 30 | 31 | ) 32 | } 33 | 34 | export default Page 35 | -------------------------------------------------------------------------------- /web/src/pages/system/config/router.tsx: -------------------------------------------------------------------------------- 1 | import { App } from '@duxweb/dux-refine' 2 | 3 | import { Navigate } from 'react-router-dom' 4 | 5 | export const adminRouter = (app: App) => { 6 | app.addRouter([ 7 | { 8 | index: true, 9 | element: , 10 | }, 11 | ]) 12 | } 13 | -------------------------------------------------------------------------------- /web/src/pages/tools/admin/area/import.tsx: -------------------------------------------------------------------------------- 1 | import { FormModal, useUpload } from '@duxweb/dux-refine' 2 | import { useTranslate } from '@refinedev/core' 3 | import { Form, Upload, Link } from 'tdesign-react/esm' 4 | 5 | const Page = () => { 6 | const uploadParams = useUpload() 7 | const translate = useTranslate() 8 | 9 | return ( 10 | 11 | 15 | 20 | {translate('tools.area.help.import')} 21 | 22 | 23 | } 24 | > 25 | 26 | 27 | 28 | ) 29 | } 30 | 31 | export default Page 32 | -------------------------------------------------------------------------------- /web/src/pages/tools/admin/backup/export.tsx: -------------------------------------------------------------------------------- 1 | import { FormModal, useSelect } from '@duxweb/dux-refine' 2 | import { useTranslate, useInvalidate } from '@refinedev/core' 3 | import { Form, Transfer, Input } from 'tdesign-react/esm' 4 | 5 | const Page = () => { 6 | const { options } = useSelect({ 7 | resource: 'tools/backup/export', 8 | optionLabel: 'label', 9 | optionValue: 'value', 10 | }) 11 | const translate = useTranslate() 12 | 13 | const invalidate = useInvalidate() 14 | 15 | const onClear = () => { 16 | invalidate({ 17 | resource: 'tools.backup', 18 | invalidates: ['all'], 19 | }) 20 | } 21 | return ( 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | ) 31 | } 32 | 33 | export default Page 34 | -------------------------------------------------------------------------------- /web/src/pages/tools/admin/backup/import.tsx: -------------------------------------------------------------------------------- 1 | import { FormModal, useUpload } from '@duxweb/dux-refine' 2 | import { useInvalidate } from '@refinedev/core' 3 | import { Form, Upload } from 'tdesign-react/esm' 4 | 5 | const Page = () => { 6 | const uploadParams = useUpload() 7 | 8 | const invalidate = useInvalidate() 9 | 10 | const onClear = () => { 11 | invalidate({ 12 | resource: 'tools.backup', 13 | invalidates: ['all'], 14 | }) 15 | } 16 | return ( 17 | 18 | 19 | 20 | 21 | 22 | ) 23 | } 24 | 25 | export default Page 26 | -------------------------------------------------------------------------------- /web/src/pages/tools/admin/data/show.tsx: -------------------------------------------------------------------------------- 1 | import { useCustom, useShow } from '@refinedev/core' 2 | import { Descriptions } from '@duxweb/dux-refine' 3 | import { MagicShowRender } from '@duxweb/dux-extend' 4 | 5 | const Page = (props: Record) => { 6 | const { data: magic } = useCustom>({ 7 | url: 'tools/magic/config', 8 | method: 'get', 9 | meta: { 10 | params: { 11 | magic: props.magic, 12 | }, 13 | }, 14 | }) 15 | 16 | const { queryResult } = useShow({ 17 | resource: 'tools.data', 18 | id: props?.id, 19 | meta: { 20 | params: { 21 | magic: props.magic, 22 | action: 'show', 23 | }, 24 | }, 25 | }) 26 | 27 | const info = queryResult.data?.data 28 | 29 | return ( 30 |
31 | 32 | {magic?.data?.fields && } 33 | 34 |
35 | ) 36 | } 37 | 38 | export default Page 39 | -------------------------------------------------------------------------------- /web/src/pages/tools/admin/file/group.tsx: -------------------------------------------------------------------------------- 1 | import { useTranslate } from '@refinedev/core' 2 | import { FormModal } from '@duxweb/dux-refine' 3 | import { Form, Input } from 'tdesign-react/esm' 4 | 5 | const Page = (props: Record) => { 6 | const translate = useTranslate() 7 | 8 | return ( 9 | 10 | 11 | 12 | 13 | 14 | ) 15 | } 16 | 17 | export default Page 18 | -------------------------------------------------------------------------------- /web/src/pages/tools/admin/file/upload.tsx: -------------------------------------------------------------------------------- 1 | import { useInvalidate } from '@refinedev/core' 2 | import { Descriptions, UploadFile, useModal } from '@duxweb/dux-refine' 3 | 4 | const Page = ({ id }: Record) => { 5 | const invalidate = useInvalidate() 6 | const { onClose } = useModal() 7 | return ( 8 |
9 | 10 | 11 | { 16 | invalidate({ 17 | resource: 'tools.file', 18 | invalidates: ['list'], 19 | }) 20 | onClose?.() 21 | }} 22 | hookProps={{ 23 | formatRequest: (requestData) => { 24 | requestData.dir_id = id 25 | return requestData 26 | }, 27 | }} 28 | /> 29 | 30 | 31 |
32 | ) 33 | } 34 | 35 | export default Page 36 | -------------------------------------------------------------------------------- /web/src/pages/tools/index.ts: -------------------------------------------------------------------------------- 1 | import { appConfig, appContext } from '@duxweb/dux-refine' 2 | import { adminResources } from './config/resources' 3 | 4 | const init = (context: appContext) => { 5 | const data = import.meta.glob('./locales/*.json', { eager: true }) 6 | context.addI18ns(data) 7 | 8 | const dataExtend = import.meta.glob('@/../node_modules/@duxweb/dux-extend/dist/locales/*.json', { 9 | eager: true, 10 | }) 11 | context.addI18ns(dataExtend) 12 | } 13 | 14 | const register = (context: appContext) => { 15 | const admin = context.getApp('admin') 16 | adminResources(admin) 17 | } 18 | 19 | const config: appConfig = { 20 | init: init, 21 | register: register, 22 | } 23 | 24 | export default config 25 | -------------------------------------------------------------------------------- /web/src/static/browsers/chrome.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/static/browsers/ie.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/static/browsers/opera.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /web/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "lib": ["DOM", "DOM.Iterable", "ESNext"], 6 | "allowJs": false, 7 | "skipLibCheck": true, 8 | "esModuleInterop": false, 9 | "allowSyntheticDefaultImports": true, 10 | "strict": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "module": "ESNext", 13 | "moduleResolution": "Bundler", 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "noEmit": true, 17 | "jsx": "react-jsx", 18 | "baseUrl": "./", 19 | "paths": { 20 | "@/*": ["src/*"] 21 | } 22 | }, 23 | "include": ["src", "mock"] 24 | } 25 | --------------------------------------------------------------------------------