├── .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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------